aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorNicola Mettifogo2009-03-14 15:09:31 +0000
committerNicola Mettifogo2009-03-14 15:09:31 +0000
commit8723afd6f4a6c5d7163d509b0fa22cd562de3233 (patch)
treede78120028822db888e83e373c9a7e1d830608d6 /engines
parent7fe0592f0facda5444124a9171cd2d95de4c0755 (diff)
downloadscummvm-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.cpp20
-rw-r--r--engines/parallaction/gui_ns.cpp12
-rw-r--r--engines/parallaction/module.mk2
-rw-r--r--engines/parallaction/parallaction.cpp13
-rw-r--r--engines/parallaction/parallaction.h7
-rw-r--r--engines/parallaction/parallaction_br.cpp8
-rw-r--r--engines/parallaction/parallaction_ns.cpp24
-rw-r--r--engines/parallaction/parser_ns.cpp2
-rw-r--r--engines/parallaction/sound.h90
-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