diff options
author | Paweł Kołodziejski | 2004-04-05 18:24:36 +0000 |
---|---|---|
committer | Paweł Kołodziejski | 2004-04-05 18:24:36 +0000 |
commit | f141ad488b1fd4d96214cb35e0ab4034173efb81 (patch) | |
tree | 88bc5d0055ef63fc6afa9180620c3a35c5e661f4 /scumm/imuse_digi/dimuse.cpp | |
parent | 781809ee2be3c1ad15e3e9a62296f27241ac9cd0 (diff) | |
download | scummvm-rg350-f141ad488b1fd4d96214cb35e0ab4034173efb81.tar.gz scummvm-rg350-f141ad488b1fd4d96214cb35e0ab4034173efb81.tar.bz2 scummvm-rg350-f141ad488b1fd4d96214cb35e0ab4034173efb81.zip |
added voice group volume to scumm engine for imuse digital and implemeted volume groups control
svn-id: r13468
Diffstat (limited to 'scumm/imuse_digi/dimuse.cpp')
-rw-r--r-- | scumm/imuse_digi/dimuse.cpp | 81 |
1 files changed, 63 insertions, 18 deletions
diff --git a/scumm/imuse_digi/dimuse.cpp b/scumm/imuse_digi/dimuse.cpp index a4869b712e..1c5721f33b 100644 --- a/scumm/imuse_digi/dimuse.cpp +++ b/scumm/imuse_digi/dimuse.cpp @@ -20,6 +20,7 @@ #include "stdafx.h" #include "common/timer.h" +#include "common/config-manager.h" #include "scumm/actor.h" #include "scumm/scumm.h" @@ -46,6 +47,9 @@ IMuseDigital::IMuseDigital(ScummEngine *scumm) _mutex = g_system->createMutex(); _pause = false; _sound = new ImuseDigiSndMgr(_vm); + _volVoice = 0; + _volSfx = 0; + _volMusic = 0; resetState(); _vm->_timer->installTimerProc(timer_handler, 1000000 / 25, this); } @@ -60,6 +64,28 @@ IMuseDigital::~IMuseDigital() { g_system->deleteMutex(_mutex); } +void IMuseDigital::resetState() { + _curMusicState = 0; + _curMusicSeq = 0; + _curMusicCue = 0; + memset(_attributes, 0, sizeof(_attributes)); + _curSeqAtribPos = 0; +} + +static const Common::String &kTransientDomain = Common::ConfigManager::kTransientDomain; + +void IMuseDigital::setGroupVoiceVolume(int volume) { + _volVoice = volume; +} + +void IMuseDigital::setGroupMusicVolume(int volume) { + _volMusic = volume; +} + +void IMuseDigital::setGroupSfxVolume(int volume) { + _volSfx = volume; +} + void IMuseDigital::callback() { Common::StackLock lock(_mutex, "IMuseDigital::callback()"); int l = 0; @@ -113,14 +139,22 @@ void IMuseDigital::callback() { } int pan = (_track[l].pan != 64) ? 2 * _track[l].pan - 127 : 0; + int vol = _track[l].vol / 1000; + + if (_track[l].soundGroup == 1) + vol = (vol * _volVoice) / 128; + if (_track[l].soundGroup == 2) + vol = (vol * _volSfx) / 128; + if (_track[l].soundGroup == 3) + vol = (vol * _volMusic) / 128; if (_vm->_mixer->isReady()) { if (_track[l].stream2) { if (!_track[l].started) { _track[l].started = true; - _vm->_mixer->playInputStream(&_track[l].handle, _track[l].stream2, true, _track[l].vol / 1000, _track[l].pan, -1, false); + _vm->_mixer->playInputStream(&_track[l].handle, _track[l].stream2, false, _track[l].vol / 1000, _track[l].pan, -1, false); } else { - _vm->_mixer->setChannelVolume(_track[l].handle, _track[l].vol / 1000); + _vm->_mixer->setChannelVolume(_track[l].handle, vol); _vm->_mixer->setChannelBalance(_track[l].handle, pan); } continue; @@ -174,7 +208,7 @@ void IMuseDigital::callback() { result = mixer_size; if (_vm->_mixer->isReady()) { - _vm->_mixer->setChannelVolume(_track[l].handle, _track[l].vol / 1000); + _vm->_mixer->setChannelVolume(_track[l].handle, vol); _vm->_mixer->setChannelBalance(_track[l].handle, pan); _track[l].stream->append(data, result); _track[l].regionOffset += result; @@ -345,7 +379,7 @@ void IMuseDigital::startSound(int soundId, const char *soundName, int soundType, } else { _track[l].stream2 = NULL; _track[l].stream = makeAppendableAudioStream(freq, mixerFlags, 100000); - _vm->_mixer->playInputStream(&_track[l].handle, _track[l].stream, true, _track[l].vol / 1000, _track[l].pan, -1); + _vm->_mixer->playInputStream(&_track[l].handle, _track[l].stream, false, _track[l].vol / 1000, _track[l].pan, -1); } _track[l].used = true; @@ -373,7 +407,7 @@ void IMuseDigital::stopSound(int soundId) { void IMuseDigital::setPriority(int soundId, int priority) { Common::StackLock lock(_mutex, "IMuseDigital::setPriority()"); - debug(5, "IMuseDigital::setPrioritySound(%d, %d)", soundId, priority); + debug(5, "IMuseDigital::setPriority(%d, %d)", soundId, priority); assert ((priority >= 0) && (priority <= 127)); @@ -386,7 +420,7 @@ void IMuseDigital::setPriority(int soundId, int priority) { void IMuseDigital::setVolume(int soundId, int volume) { Common::StackLock lock(_mutex, "IMuseDigital::setVolume()"); - debug(5, "IMuseDigital::setVolumeSound(%d, %d)", soundId, volume); + debug(5, "IMuseDigital::setVolume(%d, %d)", soundId, volume); for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) { if ((_track[l].soundId == soundId) && _track[l].used) { _track[l].vol = volume * 1000; @@ -396,7 +430,7 @@ void IMuseDigital::setVolume(int soundId, int volume) { void IMuseDigital::setPan(int soundId, int pan) { Common::StackLock lock(_mutex, "IMuseDigital::setPan()"); - debug(5, "IMuseDigital::setVolumeSound(%d, %d)", soundId, pan); + debug(5, "IMuseDigital::setPan(%d, %d)", soundId, pan); for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) { if ((_track[l].soundId == soundId) && _track[l].used) { _track[l].pan = pan; @@ -404,6 +438,17 @@ void IMuseDigital::setPan(int soundId, int pan) { } } +void IMuseDigital::selectGroupVolume(int soundId, int groupId) { + Common::StackLock lock(_mutex, "IMuseDigital::setGroupVolume()"); + debug(5, "IMuseDigital::setGroupVolume(%d, %d)", soundId, groupId); + assert((groupId >= 1) && (groupId <= 3)); + for (int l = 0; l < MAX_DIGITAL_TRACKS; l++) { + if ((_track[l].soundId == soundId) && _track[l].used) { + _track[l].soundGroup = groupId; + } + } +} + void IMuseDigital::setFade(int soundId, int destVolume, int delay60HzTicks) { Common::StackLock lock(_mutex, "IMuseDigital::setFade()"); debug(5, "IMuseDigital::setFade(%d, %d, %d)", soundId, destVolume, delay60HzTicks); @@ -497,8 +542,8 @@ void IMuseDigital::parseScriptCmds(int a, int b, int c, int d, int e, int f, int break; case 12: // ImuseSetParam switch (sub_cmd) { - case 0x400: // set group volume - debug(5, "set group volume (0x400), soundId(%d), group volume(%d)", soundId, d); + case 0x400: // select group volume + selectGroupVolume(soundId, d); break; case 0x500: // set priority setPriority(soundId, d); @@ -593,17 +638,17 @@ void IMuseDigital::parseScriptCmds(int a, int b, int c, int d, int e, int f, int _attributes[b] = c; } break; - case 0x2000: // ImuseSetMasterSFXVolume - debug(5, "ImuseSetMasterSFXVolume (%d)", b); - // TODO + case 0x2000: // ImuseSetGroupSfxVolume + debug(5, "ImuseSetGroupSFXVolume (%d)", b); +// setGroupSfxVolume(b); break; - case 0x2001: // ImuseSetMasterVoiceVolume - debug(5, "ImuseSetMasterVoiceVolume (%d)", b); - // TODO + case 0x2001: // ImuseSetGroupVoiceVolume + debug(5, "ImuseSetGroupVoiceVolume (%d)", b); +// setGroupVoiceVolume(b); break; - case 0x2002: // ImuseSetMasterMusicVolume - debug(5, "ImuseSetMasterMusicVolume (%d)", b); - // TODO + case 0x2002: // ImuseSetGroupMusicVolume + debug(5, "ImuseSetGroupMusicVolume (%d)", b); +// setGroupMusicVolume(b); break; default: warning("IMuseDigital::doCommand DEFAULT command %d", cmd); |