diff options
Diffstat (limited to 'engines/titanic/sound/sound.cpp')
-rw-r--r-- | engines/titanic/sound/sound.cpp | 114 |
1 files changed, 85 insertions, 29 deletions
diff --git a/engines/titanic/sound/sound.cpp b/engines/titanic/sound/sound.cpp index 7968a088da..e8084d79e0 100644 --- a/engines/titanic/sound/sound.cpp +++ b/engines/titanic/sound/sound.cpp @@ -71,12 +71,39 @@ void CSound::fn3(int handle, int val2, int val3) { warning("TODO: CSound::fn3"); } -int CSound::playSpeech(CDialogueFile *dialogueFile, int speechId, const CProximity &prox) { - warning("TODO: CSound::playSpeech"); - return 0; +void CSound::fn4(WaveFile *waveFile, int val) { + // TODO } -uint CSound::loadSound(const CString &name) { +void CSound::checkSounds() { + for (CSoundItemList::iterator i = _sounds.begin(); i != _sounds.end(); ++i) { + CSoundItem *soundItem = *i; + if (soundItem->_field24 && soundItem->_field28) { + if (_soundManager.isActive(soundItem->_waveFile)) { + _sounds.remove(soundItem); + delete soundItem; + } + } + } +} + +void CSound::removeOldest() { + for (CSoundItemList::iterator i = _sounds.reverse_begin(); + i != _sounds.end(); --i) { + CSoundItem *soundItem = *i; + if (soundItem->_field28 && !_soundManager.isActive(soundItem->_waveFile)) { + _sounds.remove(soundItem); + delete soundItem; + break; + } + } +} + +WaveFile *CSound::getTrueTalkSound(CDialogueFile *dialogueFile, int index) { + return loadSpeech(dialogueFile, index); +} + +WaveFile *CSound::loadSound(const CString &name) { checkSounds(); // Check whether an entry for the given name is already active @@ -86,16 +113,16 @@ uint CSound::loadSound(const CString &name) { // Found it, so move it to the front of the list and return _sounds.remove(soundItem); _sounds.push_front(soundItem); - return soundItem->_soundHandle; + return soundItem->_waveFile; } } // Create new sound item CSoundItem *soundItem = new CSoundItem(name); - soundItem->_soundHandle = _soundManager.loadSound(name); + soundItem->_waveFile = _soundManager.loadSound(name); - if (!soundItem->_soundHandle) { - // Could load sound, so destroy new item and return + if (!soundItem->_waveFile) { + // Couldn't load sound, so destroy new item and return delete soundItem; return 0; } @@ -108,36 +135,65 @@ uint CSound::loadSound(const CString &name) { if (_sounds.size() > 10) removeOldest(); - return soundItem->_soundHandle; + return soundItem->_waveFile; } -void CSound::checkSounds() { - for (CSoundItemList::iterator i = _sounds.begin(); i != _sounds.end(); ++i) { - CSoundItem *soundItem = *i; - if (soundItem->_field24 && soundItem->_field28) { - if (_soundManager.isActive(soundItem->_soundHandle)) { - _sounds.remove(soundItem); - delete soundItem; - } - } - } +int CSound::playSound(const CString &name, CProximity &prox) { + WaveFile *waveFile = loadSound(name); + if (!waveFile) + return -1; + + prox._field6C = waveFile->fn1(); + fn4(waveFile, prox._field60); + + return _soundManager.playSound(*waveFile, prox); } -void CSound::removeOldest() { - for (CSoundItemList::iterator i = _sounds.reverse_begin(); - i != _sounds.end(); --i) { +WaveFile *CSound::loadSpeech(CDialogueFile *dialogueFile, int speechId) { + checkSounds(); + + // Check whether an entry for the given name is already active + for (CSoundItemList::iterator i = _sounds.begin(); i != _sounds.end(); ++i) { CSoundItem *soundItem = *i; - if (soundItem->_field28 && !_soundManager.isActive(soundItem->_soundHandle)) { + if (soundItem->_dialogueFileHandle == dialogueFile->getFile() + && soundItem->_speechId == speechId) { + // Found it, so move it to the front of the list and return _sounds.remove(soundItem); - delete soundItem; - break; + _sounds.push_front(soundItem); + return soundItem->_waveFile; } } + + // Create new sound item + CSoundItem *soundItem = new CSoundItem(dialogueFile->getFile(), speechId); + soundItem->_waveFile = _soundManager.loadSpeech(dialogueFile, speechId); + + if (!soundItem->_waveFile) { + // Couldn't load speech, so destroy new item and return + delete soundItem; + return 0; + } + + // Add the item to the list of sounds + _sounds.push_front(soundItem); + + // If there are more than 10 sounds loaded, remove the last one, + // which is the least recently used of all of them + if (_sounds.size() > 10) + removeOldest(); + + return soundItem->_waveFile; } -CSoundItem *CSound::getTrueTalkSound(CDialogueFile *dialogueFile, int index) { - warning("TODO: CSound::getTrueTalkSound"); - return nullptr; +int CSound::playSpeech(CDialogueFile *dialogueFile, int speechId, CProximity &prox) { + WaveFile *waveFile = loadSpeech(dialogueFile, speechId); + if (!waveFile) + return -1; + + prox._field6C = waveFile->fn1(); + fn4(waveFile, prox._field60); + + return _soundManager.playSound(*waveFile, prox); } -} // End of namespace Titanic z +} // End of namespace Titanic |