Codebase list pangzero / run/8202af58-61e3-48fb-a335-07bd7aed8abb/main lib / Games / PangZero / Music.pm
run/8202af58-61e3-48fb-a335-07bd7aed8abb/main

Tree @run/8202af58-61e3-48fb-a335-07bd7aed8abb/main (Download .tar.gz)

Music.pm @run/8202af58-61e3-48fb-a335-07bd7aed8abb/mainraw · history · blame

package Games::PangZero::Music;

use SDL::Mixer ':init';
use SDL::Mixer::Samples;
use SDL::Mixer::Channels;
use SDL::Mixer::Music;
use SDL::Mixer::MixChunk;
use SDL::Mixer::MixMusic;

sub LoadMusic {
  my ($filename) = @_;
  
  return undef unless -f $filename;
  return SDL::Mixer::Music::load_MUS($filename);
}

sub LoadSounds {
  my $init_flags = SDL::Mixer::init( MIX_INIT_MP3 | MIX_INIT_OGG);

  $Mixer = SDL::Mixer::open_audio( 22050, AUDIO_S16, 2, 1024 ) + 1;
  unless($Mixer) {
    warn SDL::get_error();
    return 0;
  }

  my ($soundName, $fileName);
  while (($soundName, $fileName) = each %Games::PangZero::Sounds) {
    $Sounds{$soundName} = SDL::Mixer::Samples::load_WAV("$Games::PangZero::DataDir/$fileName");
  }

  if (-f "$Games::PangZero::DataDir/UPiPang.mp3" && ($init_flags & MIX_INIT_MP3)) {
      $Games::PangZero::music = LoadMusic("$Games::PangZero::DataDir/UPiPang.mp3");
  } elsif (-f "$Games::PangZero::DataDir/UPiPang.ogg" && ($init_flags & MIX_INIT_OGG)) {
      $Games::PangZero::music = LoadMusic("$Games::PangZero::DataDir/UPiPang.ogg");
  } else {
      $Games::PangZero::music = LoadMusic("$Games::PangZero::DataDir/UPiPang.mid");
  }
  SetMusicEnabled($Games::PangZero::MusicEnabled);
}

sub PlaySound {
  return unless $Games::PangZero::SoundEnabled;
  my $sound = shift;
  $Mixer and $Sounds{$sound} and SDL::Mixer::Channels::play_channel( -1, $Sounds{$sound}, 0 );
}

sub SetMusicEnabled {
  return $Games::PangZero::MusicEnabled = 0 unless $Games::PangZero::music;
  my $musicEnabled = shift;

  $Games::PangZero::MusicEnabled = $musicEnabled ? 1 : 0;
  if ( (not $musicEnabled) and SDL::Mixer::Music::playing_music() ) {
    SDL::Mixer::Music::halt_music();
  }
  if ($musicEnabled and not SDL::Mixer::Music::playing_music()) {
    SDL::Mixer::Music::play_music($Games::PangZero::music, -1);
  }
}

1;