diff options
author | Paul Gilbert | 2011-05-18 20:32:40 +1000 |
---|---|---|
committer | Paul Gilbert | 2011-05-24 21:27:18 +1000 |
commit | 52fbf6709aaa84574d96b98aedc99b1c611da1e6 (patch) | |
tree | ef830f4dae7e1081c8942642fb8d3936b8053c75 /engines/tsage/sound.cpp | |
parent | b3fb2b5db8aa73703dc86fdcd06be0d7d0c1b0b6 (diff) | |
download | scummvm-rg350-52fbf6709aaa84574d96b98aedc99b1c611da1e6.tar.gz scummvm-rg350-52fbf6709aaa84574d96b98aedc99b1c611da1e6.tar.bz2 scummvm-rg350-52fbf6709aaa84574d96b98aedc99b1c611da1e6.zip |
TSAGE: Further sound driver installation logic
Diffstat (limited to 'engines/tsage/sound.cpp')
-rw-r--r-- | engines/tsage/sound.cpp | 238 |
1 files changed, 217 insertions, 21 deletions
diff --git a/engines/tsage/sound.cpp b/engines/tsage/sound.cpp index 6082537766..73355a69e3 100644 --- a/engines/tsage/sound.cpp +++ b/engines/tsage/sound.cpp @@ -20,6 +20,7 @@ * */ +#include "common/config-manager.h" #include "tsage/core.h" #include "tsage/globals.h" #include "tsage/debugger.h" @@ -38,6 +39,7 @@ SoundManager::SoundManager() { _groupList[i] = 0; _fieldE9[i] = 0; _field109[i] = 0; + _voiceStructPtrs[i] = NULL; } _groupMask = 0; @@ -46,6 +48,7 @@ SoundManager::SoundManager() { _disableCtr = 0; _suspendedCount = 0; _driversDetected = false; + _needToRethink = false; } SoundManager::~SoundManager() { @@ -53,9 +56,9 @@ SoundManager::~SoundManager() { for (Common::List<Sound *>::iterator i = _soundList.begin(); i != _soundList.end(); ++i) (*i)->stop(); for (Common::List<SoundDriver *>::iterator i = _installedDrivers.begin(); i != _installedDrivers.end(); ) { - int driverNum = (*i)->_driverNum; + SoundDriver *driver = *i; ++i; - unInstallDriver(driverNum); + delete driver; } _sfTerminate(); } @@ -70,6 +73,43 @@ void SoundManager::postInit() { } } +/** + * Loops through all the loaded sounds, and stops any that have been flagged for stopping + */ +void SoundManager::dispatch() { + Common::List<Sound *>::iterator i = _soundList.begin(); + while (i != _soundList.end()) { + Sound *sound = *i; + ++i; + + // If the sound is flagged for stopping, then stop it + if (sound->_stopFlag) { + sound->stop(); + } + } +} + +void SoundManager::syncSounds() { + bool mute = false; + if (ConfMan.hasKey("mute")) + mute = ConfMan.getBool("mute"); + + bool music_mute = mute; + bool sfx_mute = mute; + + if (!mute) { + music_mute = ConfMan.getBool("music_mute"); + sfx_mute = ConfMan.getBool("sfx_mute"); + } + + // Get the new music and sfx volumes + int musicVolume = music_mute ? 0 : MIN(255, ConfMan.getInt("music_volume")); + int sfxVolume = sfx_mute ? 0 : MIN(255, ConfMan.getInt("sfx_volume")); + + warning("Set volume music=%d sfx=%d", musicVolume, sfxVolume); + this->setMasterVol(musicVolume / 2); +} + Common::List<SoundDriverEntry> &SoundManager::buildDriverList(bool detectFlag) { assert(__sndmgrReady); _availableDrivers.clear(); @@ -89,7 +129,9 @@ Common::List<SoundDriverEntry> &SoundManager::buildDriverList(bool detectFlag) { } void SoundManager::installConfigDrivers() { +#ifdef TSAGE_SOUND installDriver(ADLIB_DRIVER_NUM); +#endif } Common::List<SoundDriverEntry> &SoundManager::getDriverList(bool detectFlag) { @@ -299,6 +341,34 @@ void SoundManager::rethinkVoiceTypes() { _sfRethinkVoiceTypes(); } +void SoundManager::_sfSoundServer() { + if (!sfManager()._disableCtr && !sfManager()._suspendCtr) + return; + + if (sfManager()._needToRethink) { + _sfRethinkVoiceTypes(); + sfManager()._needToRethink = false; + } else { + _sfDereferenceAll(); + } + + // Handle any fading if necessary + do { + _sfProcessFading(); + } while (sfManager()._suspendCtr > 0); + sfManager()._suspendCtr = 0; + + // Poll all sound drivers in case they need it + for (Common::List<SoundDriver *>::iterator i = sfManager()._installedDrivers.begin(); + i != sfManager()._installedDrivers.end(); ++i) { + (*i)->poll(); + } +} + +void SoundManager::_sfProcessFading() { + //TODO +} + /*--------------------------------------------------------------------------*/ void SoundManager::saveNotifier(bool postFlag) { @@ -348,7 +418,7 @@ int SoundManager::_sfDetermineGroup(const byte *soundData) { void SoundManager::_sfAddToPlayList(Sound *sound) { ++sfManager()._suspendCtr; _sfDoAddToPlayList(sound); - sound->_field6 = 0; + sound->_stopFlag = false; _sfRethinkVoiceTypes(); --sfManager()._suspendCtr; } @@ -369,7 +439,121 @@ bool SoundManager::_sfIsOnPlayList(Sound *sound) { } void SoundManager::_sfRethinkSoundDrivers() { - + // Free any existing entries + for (int idx = 0; idx < SOUND_ARR_SIZE; ++idx) { + if (sfManager()._voiceStructPtrs[idx]) { + delete sfManager()._voiceStructPtrs[idx]; + sfManager()._voiceStructPtrs[idx] = NULL; + } + } + + for (int idx = 0; idx < SOUND_ARR_SIZE; ++idx) { + byte flag = 0xff; + int total = 0; + + // Loop through the sound drivers + for (Common::List<SoundDriver *>::iterator i = sfManager()._installedDrivers.begin(); + i != sfManager()._installedDrivers.end(); ++i) { + // Process the group data for each sound driver + SoundDriver *driver = *i; + const byte *groupData = driver->_groupOffset->pData; + + while (*groupData != 0xff) { + byte byteVal = *groupData++; + + if (byteVal == idx) { + byte byteVal2 = *groupData++; + if (flag == 0xff) + flag = byteVal2; + else { + assert(flag == byteVal2); + } + + if (!flag) { + while (*groupData++ != 0xff) + ++total; + } else { + total += *groupData; + groupData += 2; + } + } else if (*groupData++ == 0) { + while (*groupData != 0xff) + ++groupData; + ++groupData; + } else { + groupData += 2; + } + } + } + + if (total) { + int dataSize = !flag ? total * 28 + 30 : total * 26 + 30; + debugC(9, ktSageSound, "data Size = %d\n", dataSize); + + VoiceStruct *vs = new VoiceStruct(); + sfManager()._voiceStructPtrs[idx] = vs; + + if (!flag) { + vs->_field0 = 0; + vs->_field1 = total; +// offset = 2; + } else { + vs->_field0 = 1; + vs->_field1 = vs->_field2 = total; +// offset = 4; + } + + for (Common::List<SoundDriver *>::iterator i = sfManager()._installedDrivers.begin(); + i != sfManager()._installedDrivers.end(); ++i) { + // Process the group data for each sound driver + SoundDriver *driver = *i; + const byte *groupData = driver->_groupOffset->pData; + + while (*groupData != 0xff) { + byte byteVal = *groupData++; + + if (byteVal == idx) { + if (!flag) { + while ((byteVal = *groupData++) != 0xff) { + VoiceStructEntry ve; + ve._field1 = (byteVal & 0x80) ? 0 : 1; + ve._driver = driver; + ve._field4 = 0; + ve._field6 = 0; + ve._field8 = 0; + ve._field9 = 0; + ve._fieldA = 0; + + vs->_entries.push_back(ve); + } + } else { + byteVal = *groupData; + groupData += 2; + + for (int idx = 0; idx < byteVal; ++idx) { + VoiceStructEntry ve; + ve._field0 = idx; + ve._driver = driver; + ve._field4 = 0xff; + ve._field6 = 0; + ve._field8 = 0; + ve._fieldA = 0; + ve._fieldC = 0; + ve._fieldD = 0; + + vs->_entries.push_back(ve); + } + } + } else { + if (*groupData++ != 0) { + while (*groupData != 0xff) + ++groupData; + } + } + } + } + } + } } void SoundManager::_sfRethinkVoiceTypes() { @@ -467,8 +651,8 @@ bool SoundManager::_sfInstallDriver(SoundDriver *driver) { return false; sfManager()._installedDrivers.push_back(driver); - uint32 *maskList = driver->getGroupMaskList(); - driver->_groupMask = *maskList; + driver->_groupOffset = driver->getGroupData(); + driver->_groupMask = READ_LE_UINT32(driver->_groupOffset); _sfExtractGroupMask(); _sfRethinkSoundDrivers(); @@ -479,6 +663,7 @@ bool SoundManager::_sfInstallDriver(SoundDriver *driver) { void SoundManager::_sfUnInstallDriver(SoundDriver *driver) { sfManager()._installedDrivers.remove(driver); + delete driver; _sfExtractGroupMask(); _sfRethinkSoundDrivers(); @@ -525,10 +710,11 @@ void SoundManager::_sfDoUpdateVolume(Sound *sound) { ++_globals->_soundManager._suspendCtr; for (int idx = 0; idx < 16; ++idx) { + /* Sound *snd = sfManager()._voiceStructPtrs[idx]; if (!snd) continue; - +*/ // TODO: More stuff } @@ -538,7 +724,7 @@ void SoundManager::_sfDoUpdateVolume(Sound *sound) { /*--------------------------------------------------------------------------*/ Sound::Sound() { - _field6 = 0; + _stopFlag = false; _soundNum = 0; _groupNum = 0; _soundPriority = 0; @@ -550,7 +736,7 @@ Sound::Sound() { _loopFlag = false; _pauseCtr = 0; _muteCtr = 0; - _holdAt = false; + _holdAt = 0xff; _cueValue = -1; _volume1 = -1; _volume3 = 0; @@ -637,7 +823,7 @@ void Sound::_unPrime() { _globals->_soundManager.removeFromSoundList(this); _primed = false; - _field6 = 0; + _stopFlag = false; } } @@ -807,29 +993,30 @@ void Sound::release() { ASound::ASound(): EventHandler() { _action = NULL; - _cueFlag = false; + _cueValue = -1; } void ASound::synchronize(Serializer &s) { EventHandler::synchronize(s); SYNC_POINTER(_action); - s.syncAsByte(_cueFlag); + s.syncAsByte(_cueValue); } void ASound::dispatch() { EventHandler::dispatch(); - if (!_sound.getCueValue()) { - _cueFlag = false; - _sound.setCueValue(1); + int cueValue = _sound.getCueValue(); + if (cueValue != -1) { + _cueValue = cueValue; + _sound.setCueValue(-1); if (_action) _action->signal(); } - if (!_cueFlag) { + if (_cueValue != -1) { if (!_sound.isPrimed()) { - _cueFlag = true; + _cueValue = -1; if (_action) { _action->signal(); _action = NULL; @@ -840,7 +1027,7 @@ void ASound::dispatch() { void ASound::play(int soundNum, Action *action, int volume) { _action = action; - _cueFlag = false; + _cueValue = 0; setVol(volume); _sound.play(soundNum); @@ -853,7 +1040,7 @@ void ASound::stop() { void ASound::prime(int soundNum, Action *action) { _action = action; - _cueFlag = false; + _cueValue = 0; _sound.prime(soundNum); } @@ -875,9 +1062,18 @@ void ASound::fade(int v1, int v2, int v3, int v4, Action *action) { SoundDriver::SoundDriver() { _driverNum = 0; _minVersion = _maxVersion = 0; - _groupMaskList = NULL; - _groupMask = 0; } +/*--------------------------------------------------------------------------*/ + +const byte adlib_group_data[] = { 1, 1, 9, 1, 0xff }; + +AdlibSoundDriver::AdlibSoundDriver() { + _groupData.groupMask = 1; + _groupData.v1 = 0x46; + _groupData.v2 = 0; + _groupData.pData = &adlib_group_data[0]; +} + } // End of namespace tSage |