diff options
author | Paweł Kołodziejski | 2004-03-27 20:26:25 +0000 |
---|---|---|
committer | Paweł Kołodziejski | 2004-03-27 20:26:25 +0000 |
commit | 7041ba35686ccc9c5db01c5243a847dffb7e52fa (patch) | |
tree | ce84b76631348e1749b0c946f089165422ed909f /scumm | |
parent | ab64ef93ec638cd094ac8f8811ec54dd16ad2346 (diff) | |
download | scummvm-rg350-7041ba35686ccc9c5db01c5243a847dffb7e52fa.tar.gz scummvm-rg350-7041ba35686ccc9c5db01c5243a847dffb7e52fa.tar.bz2 scummvm-rg350-7041ba35686ccc9c5db01c5243a847dffb7e52fa.zip |
implemented priorites for imuse sounds
svn-id: r13392
Diffstat (limited to 'scumm')
-rw-r--r-- | scumm/imuse_digi/dimuse.cpp | 59 | ||||
-rw-r--r-- | scumm/imuse_digi/dimuse.h | 18 | ||||
-rw-r--r-- | scumm/insane/insane.cpp | 7 |
3 files changed, 70 insertions, 14 deletions
diff --git a/scumm/imuse_digi/dimuse.cpp b/scumm/imuse_digi/dimuse.cpp index 7864a9a5e5..331b6bc9a1 100644 --- a/scumm/imuse_digi/dimuse.cpp +++ b/scumm/imuse_digi/dimuse.cpp @@ -226,10 +226,46 @@ void IMuseDigital::switchToNextRegion(int track) { _track[track].regionOffset = 0; } -void IMuseDigital::startSound(int soundId, const char *soundName, int soundType, int soundGroup, AudioStream *input, int hookId, int volume) { +void IMuseDigital::startSound(int soundId, const char *soundName, int soundType, int soundGroup, AudioStream *input, int hookId, int volume, int priority) { Common::StackLock lock(_mutex, g_system, "IMuseDigital::startSound()"); debug(5, "IMuseDigital::startSound(%d)", soundId); int l; + int lower_priority = 127; + bool found_free = false; + + for (l = 0; l < MAX_DIGITAL_TRACKS; l++) { + if (!_track[l].used && !_track[l].handle.isActive()) + found_free = true; + } + + if (!found_free) { + warning("IMuseDigital::startSound(): All slots are full"); + for (l = 0; l < MAX_DIGITAL_TRACKS; l++) { + if (_track[l].used && _track[l].handle.isActive() && + (lower_priority > _track[l].priority) && (!_track[l].stream2)) + lower_priority = _track[l].priority; + } + if (lower_priority <= priority) { + int track_id = -1; + for (l = 0; l < MAX_DIGITAL_TRACKS; l++) { + if (_track[l].used && _track[l].handle.isActive() && + (lower_priority == _track[l].priority) && (!_track[l].stream2)) { + track_id = l; + } + } + assert(track_id != -1); + _track[track_id].stream->finish(); + _track[track_id].stream = NULL; + _vm->_mixer->stopHandle(_track[track_id].handle); + _sound->closeSound(_track[track_id].soundHandle); + _track[track_id].used = false; + assert(!_track[track_id].handle.isActive()); + warning("IMuseDigital::startSound(): Removed sound %d from track %d", _track[track_id].soundId, track_id); + } else { + warning("IMuseDigital::startSound(): Priority sound too low"); + return; + } + } for (l = 0; l < MAX_DIGITAL_TRACKS; l++) { if (!_track[l].used && !_track[l].handle.isActive()) { @@ -243,6 +279,7 @@ void IMuseDigital::startSound(int soundId, const char *soundName, int soundType, _track[l].started = false; _track[l].soundGroup = soundGroup; _track[l].curHookId = hookId; + _track[l].priority = priority; _track[l].curRegion = -1; _track[l].dataOffset = 0; _track[l].regionOffset = 0; @@ -315,7 +352,9 @@ void IMuseDigital::startSound(int soundId, const char *soundName, int soundType, return; } } - warning("IMuseDigital::startSound(): All slots are full"); + + warning("it should not happen"); + assert(0); } void IMuseDigital::stopSound(int soundId) { @@ -332,6 +371,19 @@ void IMuseDigital::stopSound(int soundId) { } } +void IMuseDigital::setPriority(int soundId, int priority) { + Common::StackLock lock(_mutex, g_system, "IMuseDigital::setPriority()"); + debug(5, "IMuseDigital::setPrioritySound(%d, %d)", soundId, priority); + + assert ((priority >= 0) && (priority <= 127)); + + for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) { + if ((_track[l].soundId == soundId) && _track[l].used) { + _track[l].priority = priority; + } + } +} + void IMuseDigital::setVolume(int soundId, int volume) { Common::StackLock lock(_mutex, g_system, "IMuseDigital::setVolume()"); debug(5, "IMuseDigital::setVolumeSound(%d, %d)", soundId, volume); @@ -448,7 +500,8 @@ void IMuseDigital::parseScriptCmds(int a, int b, int c, int d, int e, int f, int case 0x400: // set group volume debug(5, "set group volume (0x400), soundId(%d), group volume(%d)", soundId, d); break; - case 0x500: // set priority - could be ignored + case 0x500: // set priority + setPriority(soundId, d); break; case 0x600: // set volume setVolume(soundId, d); diff --git a/scumm/imuse_digi/dimuse.h b/scumm/imuse_digi/dimuse.h index 16a9c92e11..8f3c86b81c 100644 --- a/scumm/imuse_digi/dimuse.h +++ b/scumm/imuse_digi/dimuse.h @@ -33,7 +33,7 @@ namespace Scumm { -#define MAX_DIGITAL_TRACKS 16 +#define MAX_DIGITAL_TRACKS 8 struct imuseDigTable; struct imuseComiTable; @@ -53,6 +53,7 @@ private: bool used; bool toBeRemoved; bool started; + int priority; int32 regionOffset; int32 trackOffset; int32 dataOffset; @@ -87,7 +88,7 @@ private: static void timer_handler(void *refConf); void callback(); void switchToNextRegion(int track); - void startSound(int soundId, const char *soundName, int soundType, int soundGroup, AudioStream *input, int hookId, int volume); + void startSound(int soundId, const char *soundName, int soundType, int soundGroup, AudioStream *input, int hookId, int volume, int priority); int32 getPosInMs(int soundId); void getLipSync(int soundId, int syncId, int32 msPos, int32 &width, int32 &height); @@ -113,15 +114,15 @@ public: virtual ~IMuseDigital(); void startVoice(int soundId, AudioStream *input) - { debug(5, "startVoiceStream(%d)", soundId); startSound(soundId, NULL, 0, IMUSE_VOICE, input, 0, 127); } + { debug(5, "startVoiceStream(%d)", soundId); startSound(soundId, NULL, 0, IMUSE_VOICE, input, 0, 127, 127); } void startVoice(int soundId, const char *soundName) - { debug(5, "startVoiceBundle(%s)", soundName); startSound(soundId, soundName, IMUSE_BUNDLE, IMUSE_VOICE, NULL, 0, 127); } + { debug(5, "startVoiceBundle(%s)", soundName); startSound(soundId, soundName, IMUSE_BUNDLE, IMUSE_VOICE, NULL, 0, 127, 127); } void startMusic(int soundId, int volume) - { debug(5, "startMusicResource(%d)", soundId); startSound(soundId, NULL, IMUSE_RESOURCE, IMUSE_MUSIC, NULL, 0, volume); } + { debug(5, "startMusicResource(%d)", soundId); startSound(soundId, NULL, IMUSE_RESOURCE, IMUSE_MUSIC, NULL, 0, volume, 126); } void startMusic(const char *soundName, int soundId, int hookId, int volume) - { debug(5, "startMusicBundle(%s)", soundName); startSound(soundId, soundName, IMUSE_BUNDLE, IMUSE_MUSIC, NULL, hookId, volume); } - void startSfx(int soundId) - { debug(5, "startSfx(%d)", soundId); startSound(soundId, NULL, IMUSE_RESOURCE, IMUSE_SFX, NULL, 0, 127); } + { debug(5, "startMusicBundle(%s)", soundName); startSound(soundId, soundName, IMUSE_BUNDLE, IMUSE_MUSIC, NULL, hookId, volume, 126); } + void startSfx(int soundId, int priority) + { debug(5, "startSfx(%d)", soundId); startSound(soundId, NULL, IMUSE_RESOURCE, IMUSE_SFX, NULL, 0, 127, priority); } void startSound(int soundId) { error("MusicEngine::startSound() Should be never called"); } void resetState() { @@ -132,6 +133,7 @@ public: _curSeqAtribPos = 0; } + void setPriority(int soundId, int priority); void setVolume(int soundId, int volume); void setPan(int soundId, int pan); void setFade(int soundId, int destVolume, int delay60HzTicks); diff --git a/scumm/insane/insane.cpp b/scumm/insane/insane.cpp index c7f1c18aa6..34f05f6131 100644 --- a/scumm/insane/insane.cpp +++ b/scumm/insane/insane.cpp @@ -1194,7 +1194,7 @@ bool Insane::smlayer_isSoundRunning(int32 sound) { bool Insane::smlayer_startSfx(int32 sound) { if (smlayer_loadSound(sound, 0, 2)) { - _vm->_imuseDigital->startSfx(readArray(sound)); + _vm->_imuseDigital->startSfx(readArray(sound), 40); return true; } else return false; @@ -1202,7 +1202,7 @@ bool Insane::smlayer_startSfx(int32 sound) { bool Insane::smlayer_startVoice(int32 sound) { if (smlayer_loadSound(sound, 0, 2)) { - _vm->_imuseDigital->startSfx(readArray(sound)); + _vm->_imuseDigital->startSfx(readArray(sound), 126); return true; } else return false; @@ -1212,7 +1212,8 @@ void Insane::smlayer_soundSetPan(int32 soundId, int32 pan) { _vm->_imuseDigital->setPan(soundId, pan); } -void Insane::smlayer_soundSetPriority(int32 sound, int32 priority) { +void Insane::smlayer_soundSetPriority(int32 soundId, int32 priority) { + _vm->_imuseDigital->setPriority(soundId, priority); } void Insane::smlayer_drawSomething(byte *renderBitmap, int32 codecparam, |