diff options
author | Nicola Mettifogo | 2009-03-14 15:09:31 +0000 |
---|---|---|
committer | Nicola Mettifogo | 2009-03-14 15:09:31 +0000 |
commit | 8723afd6f4a6c5d7163d509b0fa22cd562de3233 (patch) | |
tree | de78120028822db888e83e373c9a7e1d830608d6 /engines | |
parent | 7fe0592f0facda5444124a9171cd2d95de4c0755 (diff) | |
download | scummvm-rg350-8723afd6f4a6c5d7163d509b0fa22cd562de3233.tar.gz scummvm-rg350-8723afd6f4a6c5d7163d509b0fa22cd562de3233.tar.bz2 scummvm-rg350-8723afd6f4a6c5d7163d509b0fa22cd562de3233.zip |
* Added a generic sound manager that hides engine-specific managers and allows accessing them through a simplified command/parameter interface.
* Updated client code to use the new manager.
* Moved Nippon Safes sound code from sound.cpp to sound_ns.cpp.
svn-id: r39394
Diffstat (limited to 'engines')
-rw-r--r-- | engines/parallaction/callables_ns.cpp | 20 | ||||
-rw-r--r-- | engines/parallaction/gui_ns.cpp | 12 | ||||
-rw-r--r-- | engines/parallaction/module.mk | 2 | ||||
-rw-r--r-- | engines/parallaction/parallaction.cpp | 13 | ||||
-rw-r--r-- | engines/parallaction/parallaction.h | 7 | ||||
-rw-r--r-- | engines/parallaction/parallaction_br.cpp | 8 | ||||
-rw-r--r-- | engines/parallaction/parallaction_ns.cpp | 24 | ||||
-rw-r--r-- | engines/parallaction/parser_ns.cpp | 2 | ||||
-rw-r--r-- | engines/parallaction/sound.h | 90 | ||||
-rw-r--r-- | engines/parallaction/sound_ns.cpp (renamed from engines/parallaction/sound.cpp) | 104 |
10 files changed, 184 insertions, 98 deletions
diff --git a/engines/parallaction/callables_ns.cpp b/engines/parallaction/callables_ns.cpp index c3e8c8e6a4..c31d49a259 100644 --- a/engines/parallaction/callables_ns.cpp +++ b/engines/parallaction/callables_ns.cpp @@ -151,8 +151,8 @@ void Parallaction_ns::_c_play_boogie(void *parm) { return; flag = 0; - _soundMan->setMusicFile("boogie2"); - _soundMan->playMusic(); + _soundManI->setMusicFile("boogie2"); + _soundManI->playMusic(); return; } @@ -418,18 +418,18 @@ void Parallaction_ns::_c_testResult(void *parm) { } void Parallaction_ns::_c_offSound(void*) { - _soundMan->stopSfx(0); - _soundMan->stopSfx(1); - _soundMan->stopSfx(2); - _soundMan->stopSfx(3); + _soundManI->stopSfx(0); + _soundManI->stopSfx(1); + _soundManI->stopSfx(2); + _soundManI->stopSfx(3); } void Parallaction_ns::_c_startMusic(void*) { - _soundMan->playMusic(); + _soundManI->playMusic(); } void Parallaction_ns::_c_closeMusic(void*) { - _soundMan->stopMusic(); + _soundManI->stopMusic(); } /* @@ -440,8 +440,8 @@ void Parallaction_ns::_c_startIntro(void *parm) { _rightHandAnim = _location.findAnimation("righthand"); if (getPlatform() == Common::kPlatformPC) { - _soundMan->setMusicFile("intro"); - _soundMan->playMusic(); + _soundManI->setMusicFile("intro"); + _soundManI->playMusic(); } _input->setMouseState(MOUSE_DISABLED); diff --git a/engines/parallaction/gui_ns.cpp b/engines/parallaction/gui_ns.cpp index dd46e04317..efa1c40309 100644 --- a/engines/parallaction/gui_ns.cpp +++ b/engines/parallaction/gui_ns.cpp @@ -371,7 +371,7 @@ class SelectCharacterInputState_NS : public MenuInputState { static const Common::Rect codeSelectBlocks[9]; static const Common::Rect codeTrueBlocks[9]; - Parallaction *_vm; + Parallaction_ns *_vm; int guiGetSelectedBlock(const Common::Point &p) { @@ -424,7 +424,7 @@ class SelectCharacterInputState_NS : public MenuInputState { public: - SelectCharacterInputState_NS(Parallaction *vm, MenuInputHelper *helper) : MenuInputState("selectcharacter", helper), _vm(vm) { + SelectCharacterInputState_NS(Parallaction_ns *vm, MenuInputHelper *helper) : MenuInputState("selectcharacter", helper), _vm(vm) { _keys = (_vm->getPlatform() == Common::kPlatformAmiga && (_vm->getFeatures() & GF_LANG_MULT)) ? _amigaKeys : _pcKeys; _block.create(BLOCK_WIDTH, BLOCK_HEIGHT, 1); } @@ -541,7 +541,7 @@ public: } virtual void enter() { - _vm->_soundMan->stopMusic(); + _vm->_soundManI->stopMusic(); _vm->showSlide("password"); _emptySlots.create(BLOCK_WIDTH * 8, BLOCK_HEIGHT, 1); @@ -683,11 +683,11 @@ const ShowCreditsInputState_NS::Credit ShowCreditsInputState_NS::_credits[6] = { }; class EndIntroInputState_NS : public MenuInputState { - Parallaction *_vm; + Parallaction_ns *_vm; bool _isDemo; public: - EndIntroInputState_NS(Parallaction *vm, MenuInputHelper *helper) : MenuInputState("endintro", helper), _vm(vm) { + EndIntroInputState_NS(Parallaction_ns *vm, MenuInputHelper *helper) : MenuInputState("endintro", helper), _vm(vm) { _isDemo = (_vm->getFeatures() & GF_DEMO) != 0; } @@ -711,7 +711,7 @@ public: _vm->_input->setMouseState(MOUSE_DISABLED); if (!_isDemo) { - _vm->_soundMan->stopMusic(); + _vm->_soundManI->stopMusic(); int label = _vm->_gfx->createLabel(_vm->_menuFont, "CLICK MOUSE BUTTON TO START", 1); _vm->_gfx->showLabel(label, CENTER_LABEL_HORIZONTAL, 80); } diff --git a/engines/parallaction/module.mk b/engines/parallaction/module.mk index 1cca5856e1..29e4863fec 100644 --- a/engines/parallaction/module.mk +++ b/engines/parallaction/module.mk @@ -28,7 +28,7 @@ MODULE_OBJS := \ parser_br.o \ parser_ns.o \ saveload.o \ - sound.o \ + sound_ns.o \ staticres.o \ walk.o diff --git a/engines/parallaction/parallaction.cpp b/engines/parallaction/parallaction.cpp index 16a29044dc..a295aa950e 100644 --- a/engines/parallaction/parallaction.cpp +++ b/engines/parallaction/parallaction.cpp @@ -142,7 +142,7 @@ Common::Error Parallaction::init() { void Parallaction::pauseEngineIntern(bool pause) { if (_soundMan) { - _soundMan->pause(pause); + _soundMan->execute(SC_PAUSE, (SoundManCommandParameter)pause); } } @@ -635,7 +635,10 @@ void Parallaction::runZone(ZonePtr z) { break; case kZoneHear: - _soundMan->playSfx(z->u.hear->_name, z->u.hear->_channel, (z->_flags & kFlagsLooping) == kFlagsLooping, 60); + _soundMan->execute(SC_SETSFXCHANNEL, (SoundManCommandParameter)z->u.hear->_channel); + _soundMan->execute(SC_SETSFXLOOPING, (SoundManCommandParameter)((z->_flags & kFlagsLooping) == kFlagsLooping)); + _soundMan->execute(SC_SETSFXVOLUME, (SoundManCommandParameter)60); + _soundMan->execute(SC_PLAYSFX, (SoundManCommandParameter)z->u.hear->_name); break; case kZoneSpeak: @@ -980,9 +983,11 @@ bool CharacterName::dummy() const { return _dummy; } - void Parallaction::beep() { - _soundMan->playSfx("beep", 3, false); + _soundMan->execute(SC_SETSFXCHANNEL, (SoundManCommandParameter)3); + _soundMan->execute(SC_SETSFXVOLUME, (SoundManCommandParameter)127); + _soundMan->execute(SC_SETSFXLOOPING, (SoundManCommandParameter)false); + _soundMan->execute(SC_PLAYSFX, (SoundManCommandParameter)"beep"); } void Parallaction::scheduleLocationSwitch(const char *location) { diff --git a/engines/parallaction/parallaction.h b/engines/parallaction/parallaction.h index 9bfd633a8b..4aaa3dd0c6 100644 --- a/engines/parallaction/parallaction.h +++ b/engines/parallaction/parallaction.h @@ -116,7 +116,6 @@ extern const char *_minidrkiName; class Debugger; class Gfx; -class SoundMan; class Input; class DialogueManager; class MenuInputHelper; @@ -124,6 +123,8 @@ class PathWalker_NS; class PathWalker_BR; class CommandExec; class ProgramExec; +class SoundMan; +class SoundMan_ns; struct Location { @@ -273,11 +274,11 @@ public: Gfx *_gfx; Disk *_disk; Input *_input; - SoundMan *_soundMan; Debugger *_debugger; SaveLoad *_saveLoad; MenuInputHelper *_menuHelper; Common::RandomSource _rnd; + SoundMan *_soundMan; // fonts Font *_labelFont; @@ -392,6 +393,8 @@ public: virtual Common::Error init(); virtual Common::Error go(); + SoundMan_ns* _soundManI; + public: virtual void parseLocation(const char *filename); virtual void changeLocation(); diff --git a/engines/parallaction/parallaction_br.cpp b/engines/parallaction/parallaction_br.cpp index 24fbc1018e..5f2ced4d1f 100644 --- a/engines/parallaction/parallaction_br.cpp +++ b/engines/parallaction/parallaction_br.cpp @@ -53,6 +53,8 @@ Common::Error Parallaction_br::init() { _screenWidth = 640; _screenHeight = 400; + SoundManImpl* _soundManI = 0; + if (getPlatform() == Common::kPlatformPC) { if (getFeatures() & GF_DEMO) { _disk = new DosDemoDisk_br(this); @@ -60,15 +62,15 @@ Common::Error Parallaction_br::init() { _disk = new DosDisk_br(this); } _disk->setLanguage(2); // NOTE: language is now hardcoded to English. Original used command-line parameters. - _soundMan = new DummySoundMan(this); + _soundManI = new DummySoundMan(); } else { _disk = new AmigaDisk_br(this); _disk->setLanguage(2); // NOTE: language is now hardcoded to English. Original used command-line parameters. - _soundMan = new AmigaSoundMan(this); + _soundManI = new DummySoundMan(); } _disk->init(); - + _soundMan = new SoundMan(_soundManI); initResources(); initFonts(); diff --git a/engines/parallaction/parallaction_ns.cpp b/engines/parallaction/parallaction_ns.cpp index 8d0317f1f2..211f6e573c 100644 --- a/engines/parallaction/parallaction_ns.cpp +++ b/engines/parallaction/parallaction_ns.cpp @@ -168,11 +168,13 @@ Common::Error Parallaction_ns::init() { if (getPlatform() == Common::kPlatformPC) { int midiDriver = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); MidiDriver *driver = MidiDriver::createMidi(midiDriver); - _soundMan = new DosSoundMan(this, driver); - _soundMan->setMusicVolume(ConfMan.getInt("music_volume")); + _soundManI = new DosSoundMan_ns(this, driver); + _soundManI->setMusicVolume(ConfMan.getInt("music_volume")); } else { - _soundMan = new AmigaSoundMan(this); + _soundManI = new AmigaSoundMan_ns(this); } + + _soundMan = new SoundMan(_soundManI); initResources(); initFonts(); @@ -302,7 +304,7 @@ void Parallaction_ns::changeLocation() { MouseTriState oldMouseState = _input->getMouseState(); _input->setMouseState(MOUSE_DISABLED); - _soundMan->playLocationMusic(location); + _soundManI->playLocationMusic(location); _input->stopHovering(); _gfx->freeLabels(); @@ -369,7 +371,7 @@ void Parallaction_ns::changeLocation() { _cmdExec->run(_location._aCommands); if (_location._hasSound) - _soundMan->playSfx(_location._soundFile, 0, true); + _soundManI->playSfx(_location._soundFile, 0, true); if (!_intro) { _input->setMouseState(oldMouseState); @@ -428,7 +430,7 @@ void Parallaction_ns::changeCharacter(const char *name) { _objects = _disk->loadObjects(_char.getBaseName()); _objectsNames = _disk->loadTable(_char.getBaseName()); - _soundMan->playCharacterMusic(_char.getBaseName()); + _soundManI->playCharacterMusic(_char.getBaseName()); // The original engine used to reload 'common' only on loadgames. We are reloading here since 'common' // contains character specific stuff. This causes crashes like bug #1816899, because parseLocation tries @@ -466,10 +468,10 @@ void Parallaction_ns::freeCharacter() { void Parallaction_ns::freeLocation(bool removeAll) { debugC(2, kDebugExec, "freeLocation"); - _soundMan->stopSfx(0); - _soundMan->stopSfx(1); - _soundMan->stopSfx(2); - _soundMan->stopSfx(3); + _soundManI->stopSfx(0); + _soundManI->stopSfx(1); + _soundManI->stopSfx(2); + _soundManI->stopSfx(3); _localFlagNames->clear(); @@ -481,7 +483,7 @@ void Parallaction_ns::freeLocation(bool removeAll) { } void Parallaction_ns::cleanupGame() { - _soundMan->stopMusic(); + _soundManI->stopMusic(); _inTestResult = false; _engineFlags &= ~kEngineTransformedDonna; diff --git a/engines/parallaction/parser_ns.cpp b/engines/parallaction/parser_ns.cpp index a84c821e24..b08de2e31a 100644 --- a/engines/parallaction/parser_ns.cpp +++ b/engines/parallaction/parser_ns.cpp @@ -1089,7 +1089,7 @@ DECLARE_LOCATION_PARSER(music) { debugC(7, kDebugParser, "LOCATION_PARSER(music) "); if (_vm->getPlatform() == Common::kPlatformAmiga) - _vm->_soundMan->setMusicFile(_tokens[1]); + _vm->_soundMan->execute(SC_SETMUSICFILE, (SoundManCommandParameter)_tokens[1]); } void LocationParser_ns::parse(Script *script) { diff --git a/engines/parallaction/sound.h b/engines/parallaction/sound.h index 2baa9aaa63..e3eac1ccff 100644 --- a/engines/parallaction/sound.h +++ b/engines/parallaction/sound.h @@ -40,21 +40,69 @@ class MidiParser; namespace Parallaction { -class Parallaction; +class Parallaction_ns; class MidiPlayer; +typedef void* SoundManCommandParameter; + +class SoundManImpl { +public: + virtual void execute(int command, SoundManCommandParameter parm) = 0; + virtual ~SoundManImpl() { } +}; + class SoundMan { + SoundManImpl *_impl; +public: + SoundMan(SoundManImpl *impl) : _impl(impl) { } + virtual ~SoundMan() { delete _impl; } + void execute(int command, SoundManCommandParameter parm = 0) { + if (_impl) { + _impl->execute(command, parm); + } + } +}; + +enum { + // soundMan commands + SC_PLAYMUSIC, + SC_STOPMUSIC, + SC_SETMUSICTYPE, + SC_SETMUSICFILE, + SC_PLAYSFX, + SC_STOPSFX, + SC_SETSFXCHANNEL, + SC_SETSFXLOOPING, + SC_SETSFXVOLUME, + SC_SETSFXRATE, + SC_PAUSE +}; + +class SoundMan_ns : public SoundManImpl { +public: + enum { + MUSIC_ANY, + MUSIC_CHARACTER, + MUSIC_LOCATION + }; protected: - Parallaction *_vm; + Parallaction_ns *_vm; Audio::Mixer *_mixer; char _musicFile[PATH_LEN]; + bool _sfxLooping; + int _sfxVolume; + int _sfxRate; + uint _sfxChannel; + + int _musicType; + public: - SoundMan(Parallaction *vm); - virtual ~SoundMan() {} + SoundMan_ns(Parallaction_ns *vm); + virtual ~SoundMan_ns() {} - virtual void playSfx(const char *filename, uint channel, bool looping, int volume = -1, int rate = -1) { } + virtual void playSfx(const char *filename, uint channel, bool looping, int volume = -1) { } virtual void stopSfx(uint channel) { } void setMusicFile(const char *filename); @@ -63,11 +111,12 @@ public: virtual void playCharacterMusic(const char *character) = 0; virtual void playLocationMusic(const char *location) = 0; virtual void pause(bool p) { } + virtual void execute(int command, SoundManCommandParameter parm = 0); void setMusicVolume(int value); }; -class DosSoundMan : public SoundMan { +class DosSoundMan_ns : public SoundMan_ns { MidiPlayer *_midiPlayer; int _musicData1; @@ -75,8 +124,8 @@ class DosSoundMan : public SoundMan { bool isLocationSilent(const char *locationName); public: - DosSoundMan(Parallaction *vm, MidiDriver *midiDriver); - ~DosSoundMan(); + DosSoundMan_ns(Parallaction_ns *vm, MidiDriver *midiDriver); + ~DosSoundMan_ns(); void playMusic(); void stopMusic(); @@ -88,7 +137,7 @@ public: #define NUM_AMIGA_CHANNELS 4 -class AmigaSoundMan : public SoundMan { +class AmigaSoundMan_ns : public SoundMan_ns { Audio::AudioStream *_musicStream; Audio::SoundHandle _musicHandle; @@ -105,32 +154,21 @@ class AmigaSoundMan : public SoundMan { void loadChannelData(const char *filename, Channel *ch); public: - AmigaSoundMan(Parallaction *vm); - ~AmigaSoundMan(); + AmigaSoundMan_ns(Parallaction_ns *vm); + ~AmigaSoundMan_ns(); void playMusic(); void stopMusic(); - void playSfx(const char *filename, uint channel, bool looping, int volume, int rate); + void playSfx(const char *filename, uint channel, bool looping, int volume); void stopSfx(uint channel); void playCharacterMusic(const char *character); void playLocationMusic(const char *location); }; -class DummySoundMan : public SoundMan { - -public: - DummySoundMan(Parallaction *vm) : SoundMan(vm) { } - ~DummySoundMan() { } - void playMusic() { } - void stopMusic() { } - - void playSfx(const char *filename, uint channel, bool looping, int volume, int rate) { } - void stopSfx(uint channel) { } - - void playCharacterMusic(const char *character) { } - void playLocationMusic(const char *location) { } - +class DummySoundMan : public SoundManImpl { +public: + void execute(int command, SoundManCommandParameter parm) { } }; } // namespace Parallaction diff --git a/engines/parallaction/sound.cpp b/engines/parallaction/sound_ns.cpp index 503f8b3303..20dc7dcd25 100644 --- a/engines/parallaction/sound.cpp +++ b/engines/parallaction/sound_ns.cpp @@ -235,17 +235,17 @@ void MidiPlayer::timerCallback(void *p) { player->updateTimer(); } -DosSoundMan::DosSoundMan(Parallaction *vm, MidiDriver *midiDriver) : SoundMan(vm), _musicData1(0) { +DosSoundMan_ns::DosSoundMan_ns(Parallaction_ns *vm, MidiDriver *midiDriver) : SoundMan_ns(vm), _musicData1(0) { _midiPlayer = new MidiPlayer(midiDriver); } -DosSoundMan::~DosSoundMan() { - debugC(1, kDebugAudio, "DosSoundMan::playMusic()"); +DosSoundMan_ns::~DosSoundMan_ns() { + debugC(1, kDebugAudio, "DosSoundMan_ns_ns::playMusic()"); delete _midiPlayer; } -bool DosSoundMan::isLocationSilent(const char *locationName) { +bool DosSoundMan_ns::isLocationSilent(const char *locationName) { // these are the prefixes for location names with no background midi music const char *noMusicPrefix[] = { "museo", "intgrottadopo", "caveau", "estgrotta", "plaza1", "endtgz", "common", 0 }; @@ -260,8 +260,8 @@ bool DosSoundMan::isLocationSilent(const char *locationName) { return false; } -void DosSoundMan::playMusic() { - debugC(1, kDebugAudio, "DosSoundMan::playMusic()"); +void DosSoundMan_ns::playMusic() { + debugC(1, kDebugAudio, "DosSoundMan_ns_ns::playMusic()"); if (isLocationSilent(_vm->_location._name)) { // just stop the music if this location is silent @@ -274,16 +274,16 @@ void DosSoundMan::playMusic() { _midiPlayer->setVolume(255); } -void DosSoundMan::stopMusic() { +void DosSoundMan_ns::stopMusic() { _midiPlayer->stop(); } -void DosSoundMan::pause(bool p) { - SoundMan::pause(p); +void DosSoundMan_ns::pause(bool p) { + SoundMan_ns::pause(p); _midiPlayer->pause(p); } -void DosSoundMan::playCharacterMusic(const char *character) { +void DosSoundMan_ns::playCharacterMusic(const char *character) { if (character == NULL) { return; } @@ -304,14 +304,14 @@ void DosSoundMan::playCharacterMusic(const char *character) { if (!scumm_stricmp(name, _doughName)) { setMusicFile("nuts"); } else { - warning("unknown character '%s' in DosSoundMan::playCharacterMusic", character); + warning("unknown character '%s' in DosSoundMan_ns_ns::playCharacterMusic", character); return; } playMusic(); } -void DosSoundMan::playLocationMusic(const char *location) { +void DosSoundMan_ns::playLocationMusic(const char *location) { if (_musicData1 != 0) { playCharacterMusic(_vm->_char.getBaseName()); _musicData1 = 0; @@ -333,7 +333,7 @@ void DosSoundMan::playLocationMusic(const char *location) { } } -AmigaSoundMan::AmigaSoundMan(Parallaction *vm) : SoundMan(vm) { +AmigaSoundMan_ns::AmigaSoundMan_ns(Parallaction_ns *vm) : SoundMan_ns(vm) { _musicStream = 0; _channels[0].data = 0; _channels[0].dispose = false; @@ -345,7 +345,7 @@ AmigaSoundMan::AmigaSoundMan(Parallaction *vm) : SoundMan(vm) { _channels[3].dispose = false; } -AmigaSoundMan::~AmigaSoundMan() { +AmigaSoundMan_ns::~AmigaSoundMan_ns() { stopMusic(); stopSfx(0); stopSfx(1); @@ -361,7 +361,7 @@ static int8 res_amigaBeep[AMIGABEEP_SIZE] = { }; -void AmigaSoundMan::loadChannelData(const char *filename, Channel *ch) { +void AmigaSoundMan_ns::loadChannelData(const char *filename, Channel *ch) { if (!scumm_stricmp("beep", filename)) { ch->header.oneShotHiSamples = 0; ch->header.repeatHiSamples = 0; @@ -386,7 +386,7 @@ void AmigaSoundMan::loadChannelData(const char *filename, Channel *ch) { delete stream; } -void AmigaSoundMan::playSfx(const char *filename, uint channel, bool looping, int volume, int rate) { +void AmigaSoundMan_ns::playSfx(const char *filename, uint channel, bool looping, int volume) { if (channel >= NUM_AMIGA_CHANNELS) { warning("unknown sfx channel"); return; @@ -394,7 +394,7 @@ void AmigaSoundMan::playSfx(const char *filename, uint channel, bool looping, in stopSfx(channel); - debugC(1, kDebugAudio, "AmigaSoundMan::playSfx(%s, %i)", filename, channel); + debugC(1, kDebugAudio, "AmigaSoundMan_ns::playSfx(%s, %i)", filename, channel); Channel *ch = &_channels[channel]; loadChannelData(filename, ch); @@ -416,43 +416,40 @@ void AmigaSoundMan::playSfx(const char *filename, uint channel, bool looping, in volume = ch->header.volume; } - if (rate == -1) { - rate = ch->header.samplesPerSec; - } - - _mixer->playRaw(Audio::Mixer::kSFXSoundType, &ch->handle, ch->data, ch->dataSize, rate, flags, -1, volume, 0, loopStart, loopEnd); + _mixer->playRaw(Audio::Mixer::kSFXSoundType, &ch->handle, ch->data, ch->dataSize, + ch->header.samplesPerSec, flags, -1, volume, 0, loopStart, loopEnd); } -void AmigaSoundMan::stopSfx(uint channel) { +void AmigaSoundMan_ns::stopSfx(uint channel) { if (channel >= NUM_AMIGA_CHANNELS) { warning("unknown sfx channel"); return; } if (_channels[channel].dispose) { - debugC(1, kDebugAudio, "AmigaSoundMan::stopSfx(%i)", channel); + debugC(1, kDebugAudio, "AmigaSoundMan_ns::stopSfx(%i)", channel); _mixer->stopHandle(_channels[channel].handle); free(_channels[channel].data); _channels[channel].data = 0; } } -void AmigaSoundMan::playMusic() { +void AmigaSoundMan_ns::playMusic() { stopMusic(); - debugC(1, kDebugAudio, "AmigaSoundMan::playMusic()"); + debugC(1, kDebugAudio, "AmigaSoundMan_ns::playMusic()"); Common::SeekableReadStream *stream = _vm->_disk->loadMusic(_musicFile); _musicStream = Audio::makeProtrackerStream(stream); delete stream; - debugC(3, kDebugAudio, "AmigaSoundMan::playMusic(): created new music stream"); + debugC(3, kDebugAudio, "AmigaSoundMan_ns::playMusic(): created new music stream"); _mixer->playInputStream(Audio::Mixer::kMusicSoundType, &_musicHandle, _musicStream, -1, 255, 0, false, false); } -void AmigaSoundMan::stopMusic() { - debugC(1, kDebugAudio, "AmigaSoundMan::stopMusic()"); +void AmigaSoundMan_ns::stopMusic() { + debugC(1, kDebugAudio, "AmigaSoundMan_ns::stopMusic()"); if (_mixer->isSoundHandleActive(_musicHandle)) { _mixer->stopHandle(_musicHandle); @@ -461,24 +458,63 @@ void AmigaSoundMan::stopMusic() { } } -void AmigaSoundMan::playCharacterMusic(const char *character) { +void AmigaSoundMan_ns::playCharacterMusic(const char *character) { } -void AmigaSoundMan::playLocationMusic(const char *location) { +void AmigaSoundMan_ns::playLocationMusic(const char *location) { } -SoundMan::SoundMan(Parallaction *vm) : _vm(vm) { +SoundMan_ns::SoundMan_ns(Parallaction_ns *vm) : _vm(vm) { _mixer = _vm->_mixer; } -void SoundMan::setMusicVolume(int value) { +void SoundMan_ns::setMusicVolume(int value) { _mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, value); } -void SoundMan::setMusicFile(const char *filename) { +void SoundMan_ns::setMusicFile(const char *filename) { strcpy(_musicFile, filename); } +void SoundMan_ns::execute(int command, SoundManCommandParameter parm) { + switch (command) { + case SC_PLAYMUSIC: + if (_musicType == MUSIC_CHARACTER) playCharacterMusic((const char*)parm); + else if (_musicType == MUSIC_LOCATION) playLocationMusic((const char*)parm); + else playMusic(); + break; + case SC_STOPMUSIC: + stopMusic(); + break; + case SC_SETMUSICTYPE: + _musicType = (int)parm; + break; + case SC_SETMUSICFILE: + setMusicFile((const char*)parm); + break; + + case SC_PLAYSFX: + playSfx((const char*)parm, _sfxChannel, _sfxLooping, _sfxVolume); + break; + case SC_STOPSFX: + stopSfx((int)parm); + break; + + case SC_SETSFXCHANNEL: + _sfxChannel = (uint)parm; + break; + case SC_SETSFXLOOPING: + _sfxLooping = (bool)parm; + break; + case SC_SETSFXVOLUME: + _sfxVolume = (int)parm; + break; + + case SC_PAUSE: + pause((bool)parm); + break; + } +} } // namespace Parallaction |