diff options
-rw-r--r-- | engines/scumm/actor.cpp | 6 | ||||
-rw-r--r-- | engines/scumm/he/resource_he.cpp | 4 | ||||
-rw-r--r-- | engines/scumm/he/script_v100he.cpp | 4 | ||||
-rw-r--r-- | engines/scumm/he/script_v60he.cpp | 4 | ||||
-rw-r--r-- | engines/scumm/he/script_v70he.cpp | 4 | ||||
-rw-r--r-- | engines/scumm/he/script_v72he.cpp | 4 | ||||
-rw-r--r-- | engines/scumm/he/script_v80he.cpp | 4 | ||||
-rw-r--r-- | engines/scumm/he/sound_he.cpp | 146 | ||||
-rw-r--r-- | engines/scumm/he/sound_he.h | 74 | ||||
-rw-r--r-- | engines/scumm/scumm.cpp | 8 | ||||
-rw-r--r-- | engines/scumm/sound.cpp | 100 | ||||
-rw-r--r-- | engines/scumm/sound.h | 51 | ||||
-rw-r--r-- | engines/scumm/string.cpp | 8 |
13 files changed, 250 insertions, 167 deletions
diff --git a/engines/scumm/actor.cpp b/engines/scumm/actor.cpp index 8319c61a80..a741b9bbad 100644 --- a/engines/scumm/actor.cpp +++ b/engines/scumm/actor.cpp @@ -33,7 +33,7 @@ #include "scumm/object.h" #include "scumm/resource.h" #include "scumm/saveload.h" -#include "scumm/sound.h" +#include "scumm/he/sound_he.h" #include "scumm/he/sprite_he.h" #include "scumm/usage_bits.h" #include "scumm/util.h" @@ -1154,8 +1154,8 @@ void Actor::drawActorCostume(bool hitTestMode) { if (_vm->getTalkingActor() == _number && !_vm->_string[0].no_talk_anim) { int talkState = 0; - if (_vm->_sound->isSoundCodeUsed(1)) - talkState = _vm->_sound->getSoundVar(1, 19); + if (((SoundHE *)_vm->_sound)->isSoundCodeUsed(1)) + talkState = ((SoundHE *)_vm->_sound)->getSoundVar(1, 19); if (talkState == 0) talkState = _vm->_rnd.getRandomNumberRng(1, 10); diff --git a/engines/scumm/he/resource_he.cpp b/engines/scumm/he/resource_he.cpp index 13d78c5517..11f25991e7 100644 --- a/engines/scumm/he/resource_he.cpp +++ b/engines/scumm/he/resource_he.cpp @@ -30,7 +30,7 @@ #include "scumm/he/intern_he.h" #include "scumm/resource.h" #include "scumm/he/resource_he.h" -#include "scumm/sound.h" +#include "scumm/he/sound_he.h" #include "sound/wave.h" @@ -1762,7 +1762,7 @@ int ScummEngine_v72he::getSoundResourceSize(int id) { int offs, size; if (id > _numSounds) { - if (!_sound->getHEMusicDetails(id, offs, size)) { + if (!((SoundHE *)_sound)->getHEMusicDetails(id, offs, size)) { debug(0, "getSoundResourceSize: musicID %d not found", id); return 0; } diff --git a/engines/scumm/he/script_v100he.cpp b/engines/scumm/he/script_v100he.cpp index 1e27977e0a..1551eca420 100644 --- a/engines/scumm/he/script_v100he.cpp +++ b/engines/scumm/he/script_v100he.cpp @@ -32,7 +32,7 @@ #include "scumm/resource.h" #include "scumm/he/resource_he.h" #include "scumm/scumm.h" -#include "scumm/sound.h" +#include "scumm/he/sound_he.h" #include "scumm/he/sprite_he.h" #include "scumm/util.h" @@ -1714,7 +1714,7 @@ void ScummEngine_v100he::o100_startSound() { value = pop(); var = pop(); _heSndSoundId = pop(); - _sound->setSoundVar(_heSndSoundId, var, value); + ((SoundHE *)_sound)->setSoundVar(_heSndSoundId, var, value); break; case 92: _sound->addSoundToQueue(_heSndSoundId, _heSndOffset, _heSndChannel, _heSndFlags); diff --git a/engines/scumm/he/script_v60he.cpp b/engines/scumm/he/script_v60he.cpp index 6d562cc163..d3748abb85 100644 --- a/engines/scumm/he/script_v60he.cpp +++ b/engines/scumm/he/script_v60he.cpp @@ -31,7 +31,7 @@ #include "scumm/object.h" #include "scumm/resource.h" #include "scumm/scumm.h" -#include "scumm/sound.h" +#include "scumm/he/sound_he.h" #include "scumm/usage_bits.h" #include "scumm/util.h" #include "scumm/verbs.h" @@ -1151,7 +1151,7 @@ void ScummEngine_v60he::o60_soundOps() { // Fatty Bear's Birthday surprise uses this when playing the // piano, but only when using one of the digitized instruments. // See also o6_startSound(). - _sound->setOverrideFreq(arg); + ((SoundHE *)_sound)->setOverrideFreq(arg); break; default: error("o60_soundOps: default case 0x%x", subOp); diff --git a/engines/scumm/he/script_v70he.cpp b/engines/scumm/he/script_v70he.cpp index 15536fe895..bbbc218fde 100644 --- a/engines/scumm/he/script_v70he.cpp +++ b/engines/scumm/he/script_v70he.cpp @@ -33,7 +33,7 @@ #include "scumm/resource.h" #include "scumm/he/resource_he.h" #include "scumm/scumm.h" -#include "scumm/sound.h" +#include "scumm/he/sound_he.h" #include "scumm/verbs.h" namespace Scumm { @@ -438,7 +438,7 @@ void ScummEngine_v70he::o70_startSound() { value = pop(); var = pop(); _heSndSoundId = pop(); - _sound->setSoundVar(_heSndSoundId, var, value); + ((SoundHE *)_sound)->setSoundVar(_heSndSoundId, var, value); break; case 25: value = pop(); diff --git a/engines/scumm/he/script_v72he.cpp b/engines/scumm/he/script_v72he.cpp index dea6e6a9ed..7f61a4fcbc 100644 --- a/engines/scumm/he/script_v72he.cpp +++ b/engines/scumm/he/script_v72he.cpp @@ -35,7 +35,7 @@ #include "scumm/resource.h" #include "scumm/he/resource_he.h" #include "scumm/scumm.h" -#include "scumm/sound.h" +#include "scumm/he/sound_he.h" #include "scumm/util.h" #include "scumm/verbs.h" @@ -847,7 +847,7 @@ void ScummEngine_v72he::o72_setTimer() { void ScummEngine_v72he::o72_getSoundPosition() { int snd = pop(); - push(_sound->getSoundPos(snd)); + push(((SoundHE *)_sound)->getSoundPos(snd)); } void ScummEngine_v72he::o72_startScript() { diff --git a/engines/scumm/he/script_v80he.cpp b/engines/scumm/he/script_v80he.cpp index cfcac4299a..8735e920c7 100644 --- a/engines/scumm/he/script_v80he.cpp +++ b/engines/scumm/he/script_v80he.cpp @@ -34,7 +34,7 @@ #include "scumm/resource.h" #include "scumm/he/resource_he.h" #include "scumm/scumm.h" -#include "scumm/sound.h" +#include "scumm/he/sound_he.h" namespace Scumm { @@ -432,7 +432,7 @@ void ScummEngine_v80he::o80_stringToInt() { void ScummEngine_v80he::o80_getSoundVar() { int var = pop(); int snd = pop(); - push(_sound->getSoundVar(snd, var)); + push(((SoundHE *)_sound)->getSoundVar(snd, var)); } void ScummEngine_v80he::o80_localizeArrayToRoom() { diff --git a/engines/scumm/he/sound_he.cpp b/engines/scumm/he/sound_he.cpp index 86221aea88..e1bb5095c4 100644 --- a/engines/scumm/he/sound_he.cpp +++ b/engines/scumm/he/sound_he.cpp @@ -26,7 +26,7 @@ #include "scumm/file.h" #include "scumm/imuse/imuse.h" #include "scumm/scumm.h" -#include "scumm/sound.h" +#include "scumm/he/sound_he.h" #include "scumm/util.h" #include "common/config-manager.h" @@ -45,7 +45,125 @@ namespace Scumm { -void Sound::stopSoundChannel(int chan) { +SoundHE::SoundHE(ScummEngine *parent) + : + Sound(parent), + _heMusic(0), + _heMusicTracks(0) { + + memset(_heChannel, 0, sizeof(_heChannel)); +} + +SoundHE::~SoundHE() { + free(_heMusic); +} + +void SoundHE::addSoundToQueue(int sound, int heOffset, int heChannel, int heFlags) { + if (_vm->VAR_LAST_SOUND != 0xFF) + _vm->VAR(_vm->VAR_LAST_SOUND) = sound; + + if (heFlags & 16) { + playHESound(sound, heOffset, heChannel, heFlags); + return; + } + + Sound::addSoundToQueue(sound, heOffset, heChannel, heFlags); +} + +void SoundHE::addSoundToQueue2(int sound, int heOffset, int heChannel, int heFlags) { + int i = _soundQue2Pos; + while (i--) { + if (_soundQue2[i].sound == sound && !(heFlags & 2)) + return; + } + + Sound::addSoundToQueue2(sound, heOffset, heChannel, heFlags); +} + +void SoundHE::processSoundQueues() { + int snd, heOffset, heChannel, heFlags; + + if (_vm->_game.heversion >= 72) { + for (int i = 0; i <_soundQue2Pos; i++) { + snd = _soundQue2[i].sound; + heOffset = _soundQue2[i].offset; + heChannel = _soundQue2[i].channel; + heFlags = _soundQue2[i].flags; + if (snd) + playHESound(snd, heOffset, heChannel, heFlags); + } + _soundQue2Pos = 0; + } else { + while (_soundQue2Pos) { + _soundQue2Pos--; + snd = _soundQue2[_soundQue2Pos].sound; + heOffset = _soundQue2[_soundQue2Pos].offset; + heChannel = _soundQue2[_soundQue2Pos].channel; + heFlags = _soundQue2[_soundQue2Pos].flags; + if (snd) + playHESound(snd, heOffset, heChannel, heFlags); + } + } + + Sound::processSoundQueues(); +} + +int SoundHE::isSoundRunning(int sound) const { + if (_vm->_game.heversion >= 70) { + if (sound >= 10000) { + return _vm->_mixer->getSoundID(_heSoundChannels[sound - 10000]); + } + } else if (_vm->_game.heversion >= 60) { + if (sound == -2) { + sound = _heChannel[0].sound; + } else if (sound == -1) { + sound = _currentMusic; + } + } + + return Sound::isSoundRunning(sound); +} + +void SoundHE::stopSound(int sound) { + if (_vm->_game.heversion >= 70) { + if ( sound >= 10000) { + stopSoundChannel(sound - 10000); + } + } else if (_vm->_game.heversion >= 60) { + if (sound == -2) { + sound = _heChannel[0].sound; + } else if (sound == -1) { + sound = _currentMusic; + } + } + + Sound::stopSound(sound); + + for (int i = 0; i < ARRAYSIZE(_heChannel); i++) { + if (_heChannel[i].sound == sound) { + _heChannel[i].sound = 0; + _heChannel[i].priority = 0; + _heChannel[i].sbngBlock = 0; + _heChannel[i].codeOffs = 0; + memset(_heChannel[i].soundVars, 0, sizeof(_heChannel[i].soundVars)); + } + } + + if (_vm->_game.heversion >= 70 && sound == 1) { + _vm->_haveMsg = 3; + _vm->_talkDelay = 0; + } +} + +void SoundHE::setupSound() { + Sound::setupSound(); + + if (_vm->_game.heversion >= 70) { + setupHEMusicFile(); + } +} + +void SoundHE::stopSoundChannel(int chan) { if (_heChannel[chan].sound == 1) { _vm->_haveMsg = 3; _vm->_talkDelay = 0; @@ -69,7 +187,7 @@ void Sound::stopSoundChannel(int chan) { } } -int Sound::findFreeSoundChannel() { +int SoundHE::findFreeSoundChannel() { int chan, min; min = _vm->VAR(_vm->VAR_RESERVED_SOUND_CHANNELS); @@ -90,7 +208,7 @@ int Sound::findFreeSoundChannel() { return min; } -int Sound::isSoundCodeUsed(int sound) { +int SoundHE::isSoundCodeUsed(int sound) { int chan = -1; for (int i = 0; i < ARRAYSIZE(_heChannel); i ++) { if (_heChannel[i].sound == sound) @@ -104,7 +222,7 @@ int Sound::isSoundCodeUsed(int sound) { } } -int Sound::getSoundPos(int sound) { +int SoundHE::getSoundPos(int sound) { int chan = -1; for (int i = 0; i < ARRAYSIZE(_heChannel); i ++) { if (_heChannel[i].sound == sound) @@ -119,7 +237,7 @@ int Sound::getSoundPos(int sound) { } } -int Sound::getSoundVar(int sound, int var) { +int SoundHE::getSoundVar(int sound, int var) { if (_vm->_game.heversion >= 90 && var == 26) { return isSoundCodeUsed(sound); } @@ -140,7 +258,7 @@ int Sound::getSoundVar(int sound, int var) { } } -void Sound::setSoundVar(int sound, int var, int val) { +void SoundHE::setSoundVar(int sound, int var, int val) { checkRange(25, 0, var, "Illegal sound variable %d"); int chan = -1; @@ -155,11 +273,11 @@ void Sound::setSoundVar(int sound, int var, int val) { } } -void Sound::setOverrideFreq(int freq) { +void SoundHE::setOverrideFreq(int freq) { _overrideFreq = freq; } -void Sound::setupHEMusicFile() { +void SoundHE::setupHEMusicFile() { int i, total_size; Common::File musicFile; Common::String buf(_vm->generateFilename(4)); @@ -191,7 +309,7 @@ void Sound::setupHEMusicFile() { } } -bool Sound::getHEMusicDetails(int id, int &musicOffs, int &musicSize) { +bool SoundHE::getHEMusicDetails(int id, int &musicOffs, int &musicSize) { int i; for (i = 0; i < _heMusicTracks; i++) { @@ -205,7 +323,7 @@ bool Sound::getHEMusicDetails(int id, int &musicOffs, int &musicSize) { return 0; } -void Sound::processSoundCode() { +void SoundHE::processSoundCode() { byte *codePtr; int chan, tmr, size, time; @@ -252,7 +370,7 @@ void Sound::processSoundCode() { } } -void Sound::processSoundOpcodes(int sound, byte *codePtr, int *soundVars) { +void SoundHE::processSoundOpcodes(int sound, byte *codePtr, int *soundVars) { int arg, opcode, var, val; while(READ_LE_UINT16(codePtr) != 0) { @@ -329,7 +447,7 @@ void Sound::processSoundOpcodes(int sound, byte *codePtr, int *soundVars) { } } -void Sound::playHESound(int soundID, int heOffset, int heChannel, int heFlags) { +void SoundHE::playHESound(int soundID, int heOffset, int heChannel, int heFlags) { byte *ptr, *spoolPtr; int size = -1; int priority, rate; @@ -507,7 +625,7 @@ void Sound::playHESound(int soundID, int heOffset, int heChannel, int heFlags) { } } -void Sound::startHETalkSound(uint32 offset) { +void SoundHE::startHETalkSound(uint32 offset) { byte *ptr; int32 size; diff --git a/engines/scumm/he/sound_he.h b/engines/scumm/he/sound_he.h new file mode 100644 index 0000000000..033637590d --- /dev/null +++ b/engines/scumm/he/sound_he.h @@ -0,0 +1,74 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2002-2006 The ScummVM project + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * $URL$ + * $Id$ + */ + +#ifndef SCUMM_HE_SOUND_HE_H +#define SCUMM_HE_SOUND_HE_H + +#include "common/scummsys.h" +#include "scumm/sound.h" + +namespace Scumm { + +class SoundHE : public Sound { +protected: + struct HEMusic{ + int32 id; + int32 offset; + int32 size; + }; + HEMusic *_heMusic; + int16 _heMusicTracks; + + Audio::SoundHandle _heSoundChannels[8]; + +public: + SoundHE(ScummEngine *parent); + ~SoundHE(); + + virtual void addSoundToQueue(int sound, int heOffset = 0, int heChannel = 0, int heFlags = 0); + virtual void addSoundToQueue2(int sound, int heOffset = 0, int heChannel = 0, int heFlags = 0); + + virtual int isSoundRunning(int sound) const; + virtual void stopSound(int sound); + virtual void setupSound(); + + bool getHEMusicDetails(int id, int &musicOffs, int &musicSize); + int findFreeSoundChannel(); + int isSoundCodeUsed(int sound); + int getSoundPos(int sound); + int getSoundVar(int sound, int var); + void setSoundVar(int sound, int var, int val); + void playHESound(int soundID, int heOffset, int heChannel, int heFlags); + void processSoundCode(); + void processSoundOpcodes(int sound, byte *codePtr, int *soundVars); + void setOverrideFreq(int freq); + void setupHEMusicFile(); + void startHETalkSound(uint32 offset); + void stopSoundChannel(int chan); + +protected: + virtual void processSoundQueues(); +}; + + +} // End of namespace Scumm + +#endif diff --git a/engines/scumm/scumm.cpp b/engines/scumm/scumm.cpp index b3b586ad91..a8adf73a49 100644 --- a/engines/scumm/scumm.cpp +++ b/engines/scumm/scumm.cpp @@ -45,6 +45,7 @@ #include "scumm/intern.h" #include "scumm/he/intern_he.h" #include "scumm/he/logic_he.h" +#include "scumm/he/sound_he.h" #include "scumm/player_nes.h" #include "scumm/player_v1.h" #include "scumm/player_v2.h" @@ -944,7 +945,10 @@ int ScummEngine::init() { _system->openCD(cd_num); // Create the sound manager - _sound = new Sound(this); + if (_game.heversion > 0) + _sound = new SoundHE(this); + else + _sound = new Sound(this); // Setup the music engine setupMusic(_game.midi); @@ -1762,7 +1766,7 @@ load_game: } if (_game.heversion >= 80) { - _sound->processSoundCode(); + ((SoundHE *)_sound)->processSoundCode(); } runAllScripts(); checkExecVerbs(); diff --git a/engines/scumm/sound.cpp b/engines/scumm/sound.cpp index 2e92798b92..f18d5a49e1 100644 --- a/engines/scumm/sound.cpp +++ b/engines/scumm/sound.cpp @@ -78,11 +78,8 @@ Sound::Sound(ScummEngine *parent) _currentCDSound(0), _currentMusic(0), _soundsPaused(false), - _sfxMode(0), - _heMusic(0), - _heMusicTracks(0) { + _sfxMode(0) { - memset(_heChannel, 0, sizeof(_heChannel)); memset(_soundQue, 0, sizeof(_soundQue)); memset(_soundQue2, 0, sizeof(_soundQue2)); memset(_mouthSyncTimes, 0, sizeof(_mouthSyncTimes)); @@ -91,20 +88,12 @@ Sound::Sound(ScummEngine *parent) Sound::~Sound() { stopCDTimer(); delete _sfxFile; - - // HE Specific - free(_heMusic); } void Sound::addSoundToQueue(int sound, int heOffset, int heChannel, int heFlags) { if (_vm->VAR_LAST_SOUND != 0xFF) _vm->VAR(_vm->VAR_LAST_SOUND) = sound; - if (heFlags & 16) { - playHESound(sound, heOffset, heChannel, heFlags); - return; - } - // HE music resources are in separate file if (sound <= _vm->_numSounds) _vm->ensureResourceLoaded(rtSound, sound); @@ -113,14 +102,6 @@ void Sound::addSoundToQueue(int sound, int heOffset, int heChannel, int heFlags) } void Sound::addSoundToQueue2(int sound, int heOffset, int heChannel, int heFlags) { - if (_vm->_game.heversion >= 60 && _soundQue2Pos) { - int i = _soundQue2Pos; - while (i--) { - if (_soundQue2[i].sound == sound && !(heFlags & 2)) - return; - } - } - assert(_soundQue2Pos < ARRAYSIZE(_soundQue2)); _soundQue2[_soundQue2Pos].sound = sound; _soundQue2[_soundQue2Pos].offset = heOffset; @@ -144,37 +125,14 @@ void Sound::processSound() { void Sound::processSoundQueues() { int i = 0, num; - int snd, heOffset, heChannel, heFlags; + int snd; int data[16]; - if (_vm->_game.heversion >= 72) { - for (i = 0; i <_soundQue2Pos; i++) { - snd = _soundQue2[i].sound; - heOffset = _soundQue2[i].offset; - heChannel = _soundQue2[i].channel; - heFlags = _soundQue2[i].flags; - if (snd) { - if (_vm->_game.heversion>= 60) - playHESound(snd, heOffset, heChannel, heFlags); - else - playSound(snd); - } - } - _soundQue2Pos = 0; - } else { - while (_soundQue2Pos) { - _soundQue2Pos--; - snd = _soundQue2[_soundQue2Pos].sound; - heOffset = _soundQue2[_soundQue2Pos].offset; - heChannel = _soundQue2[_soundQue2Pos].channel; - heFlags = _soundQue2[_soundQue2Pos].flags; - if (snd) { - if (_vm->_game.heversion>= 60) - playHESound(snd, heOffset, heChannel, heFlags); - else - playSound(snd); - } - } + while (_soundQue2Pos) { + _soundQue2Pos--; + snd = _soundQue2[_soundQue2Pos].sound; + if (snd) + playSound(snd); } while (i < _soundQuePos) { @@ -726,18 +684,6 @@ int Sound::isSoundRunning(int sound) const { if (sound == _currentCDSound) return pollCD(); - if (_vm->_game.heversion >= 70) { - if (sound >= 10000) { - return _vm->_mixer->getSoundID(_heSoundChannels[sound - 10000]); - } - } else if (_vm->_game.heversion >= 60) { - if (sound == -2) { - sound = _heChannel[0].sound; - } else if (sound == -1) { - sound = _currentMusic; - } - } - if (_vm->_mixer->isSoundIDActive(sound)) return 1; @@ -814,18 +760,6 @@ bool Sound::isSoundInQueue(int sound) const { void Sound::stopSound(int sound) { int i; - if (_vm->_game.heversion >= 70) { - if ( sound >= 10000) { - stopSoundChannel(sound - 10000); - } - } else if (_vm->_game.heversion >= 60) { - if (sound == -2) { - sound = _heChannel[0].sound; - } else if (sound == -1) { - sound = _currentMusic; - } - } - if (sound != 0 && sound == _currentCDSound) { _currentCDSound = 0; stopCD(); @@ -838,16 +772,6 @@ void Sound::stopSound(int sound) { if (_vm->_musicEngine) _vm->_musicEngine->stopSound(sound); - for (i = 0; i < ARRAYSIZE(_heChannel); i++) { - if (_heChannel[i].sound == sound) { - _heChannel[i].sound = 0; - _heChannel[i].priority = 0; - _heChannel[i].sbngBlock = 0; - _heChannel[i].codeOffs = 0; - memset(_heChannel[i].soundVars, 0, sizeof(_heChannel[i].soundVars)); - } - } - for (i = 0; i < ARRAYSIZE(_soundQue2); i++) { if (_soundQue2[i].sound == sound) { _soundQue2[i].sound = 0; @@ -856,12 +780,6 @@ void Sound::stopSound(int sound) { _soundQue2[i].flags = 0; } } - - if (_vm->_game.heversion >= 70 && sound == 1) { - _vm->_haveMsg = 3; - _vm->_talkDelay = 0; - } - } void Sound::stopAllSounds() { @@ -938,10 +856,6 @@ void Sound::setupSound() { _sfxFile = openSfxFile(); - if (_vm->_game.heversion >= 70) { - setupHEMusicFile(); - } - if (_vm->_game.id == GID_FT) { _vm->VAR(_vm->VAR_VOICE_BUNDLE_LOADED) = _sfxFile->isOpen(); } diff --git a/engines/scumm/sound.h b/engines/scumm/sound.h index 70268051b4..4966bfb7a3 100644 --- a/engines/scumm/sound.h +++ b/engines/scumm/sound.h @@ -19,8 +19,8 @@ * $Id$ */ -#ifndef SOUND_H -#define SOUND_H +#ifndef SCUMM_SOUND_H +#define SCUMM_SOUND_H #include "common/scummsys.h" #include "sound/audiostream.h" @@ -43,12 +43,10 @@ enum { kTalkSoundID = 10000 }; +// TODO: Consider splitting Sound into even more subclasses. +// E.g. for v1-v4, v5, v6+, ... class Sound : public Serializable { -#ifdef PALMOS_MODE public: -#else -protected: -#endif enum SoundMode { kVOCMode, kMP3Mode, @@ -56,9 +54,7 @@ protected: kFlacMode }; -#ifdef PALMOS_MODE protected: -#endif ScummEngine *_vm; int16 _soundQuePos, _soundQue[0x100]; @@ -88,14 +84,6 @@ protected: int16 _currentCDSound; int16 _currentMusic; - struct HEMusic{ - int32 id; - int32 offset; - int32 size; - }; - HEMusic *_heMusic; - int16 _heMusicTracks; - public: // Used by createSound() struct { int sound; @@ -107,30 +95,28 @@ public: // Used by createSound() public: Audio::SoundHandle _talkChannelHandle; // Handle of mixer channel actor is talking on - Audio::SoundHandle _heSoundChannels[8]; bool _soundsPaused; byte _sfxMode; public: Sound(ScummEngine *parent); - ~Sound(); - void addSoundToQueue(int sound, int heOffset = 0, int heChannel = 0, int heFlags = 0); - void addSoundToQueue2(int sound, int heOffset = 0, int heChannel = 0, int heFlags = 0); + virtual ~Sound(); + virtual void addSoundToQueue(int sound, int heOffset = 0, int heChannel = 0, int heFlags = 0); + virtual void addSoundToQueue2(int sound, int heOffset = 0, int heChannel = 0, int heFlags = 0); void processSound(); - void processSoundQueues(); void playSound(int soundID); void startTalkSound(uint32 offset, uint32 b, int mode, Audio::SoundHandle *handle = NULL); void stopTalkSound(); bool isMouthSyncOff(uint pos); - int isSoundRunning(int sound) const; + virtual int isSoundRunning(int sound) const; bool isSoundInUse(int sound) const; - void stopSound(int sound); + virtual void stopSound(int sound); void stopAllSounds(); void soundKludge(int *list, int num); void talkSound(uint32 a, uint32 b, int mode, int channel = 0); - void setupSound(); + virtual void setupSound(); void pauseSounds(bool pause); void startCDTimer(); @@ -142,21 +128,6 @@ public: void updateCD(); int getCurrentCDSound() const { return _currentCDSound; } - // HE specific - bool getHEMusicDetails(int id, int &musicOffs, int &musicSize); - int findFreeSoundChannel(); - int isSoundCodeUsed(int sound); - int getSoundPos(int sound); - int getSoundVar(int sound, int var); - void setSoundVar(int sound, int var, int val); - void playHESound(int soundID, int heOffset, int heChannel, int heFlags); - void processSoundCode(); - void processSoundOpcodes(int sound, byte *codePtr, int *soundVars); - void setOverrideFreq(int freq); - void setupHEMusicFile(); - void startHETalkSound(uint32 offset); - void stopSoundChannel(int chan); - // Used by the save/load system: void saveLoadWithSerializer(Serializer *ser); @@ -166,6 +137,8 @@ protected: void processSfxQueues(); bool isSoundInQueue(int sound) const; + + virtual void processSoundQueues(); }; /** diff --git a/engines/scumm/string.cpp b/engines/scumm/string.cpp index 518a683639..62e1ed6829 100644 --- a/engines/scumm/string.cpp +++ b/engines/scumm/string.cpp @@ -36,7 +36,7 @@ #include "scumm/he/intern_he.h" #endif #include "scumm/verbs.h" -#include "scumm/sound.h" +#include "scumm/he/sound_he.h" namespace Scumm { @@ -288,7 +288,7 @@ bool ScummEngine::handleNextCharsetCode(Actor *a, int *code) { talk_sound_b = buffer[8] | (buffer[9] << 8) | (buffer[12] << 16) | (buffer[13] << 24); buffer += 14; if (_game.heversion >= 60) { - _sound->startHETalkSound(talk_sound_a); + ((SoundHE *)_sound)->startHETalkSound(talk_sound_a); } else { _sound->talkSound(talk_sound_a, talk_sound_b, 2); } @@ -358,7 +358,7 @@ bool ScummEngine_v72he::handleNextCharsetCode(Actor *a, int *code) { } value[i] = 0; talk_sound_b = atoi(value); - _sound->startHETalkSound(talk_sound_a); + ((SoundHE *)_sound)->startHETalkSound(talk_sound_a); break; case 104: _haveMsg = 0; @@ -381,7 +381,7 @@ bool ScummEngine_v72he::handleNextCharsetCode(Actor *a, int *code) { value[i] = 0; talk_sound_a = atoi(value); talk_sound_b = 0; - _sound->startHETalkSound(talk_sound_a); + ((SoundHE *)_sound)->startHETalkSound(talk_sound_a); break; case 119: _haveMsg = 0xFF; |