From 4649bbfce286b51ffd822dfb50d90e5709fade97 Mon Sep 17 00:00:00 2001 From: Paul Gilbert Date: Thu, 3 Aug 2017 22:24:00 -0400 Subject: TITANIC: Shifting wave file playback into CWaveFile class --- engines/titanic/sound/qmixer.cpp | 13 ++++--------- engines/titanic/sound/qmixer.h | 3 ++- engines/titanic/sound/sound.cpp | 1 - engines/titanic/sound/sound_manager.cpp | 8 ++++---- engines/titanic/sound/wave_file.cpp | 24 ++++++++++++++++-------- engines/titanic/sound/wave_file.h | 19 +++++++++++++------ 6 files changed, 39 insertions(+), 29 deletions(-) (limited to 'engines') diff --git a/engines/titanic/sound/qmixer.cpp b/engines/titanic/sound/qmixer.cpp index b33601d82e..5c511c3cae 100644 --- a/engines/titanic/sound/qmixer.cpp +++ b/engines/titanic/sound/qmixer.cpp @@ -209,11 +209,8 @@ void QMixer::qsWaveMixPump() { SoundEntry &sound = channel._sounds.front(); if (sound._started && !_mixer->isSoundHandleActive(sound._soundHandle)) { if (sound._loops == -1 || sound._loops-- > 0) { - // Need to loop the sound again - sound._waveFile->audioStream()->rewind(); - _mixer->playStream(sound._waveFile->_soundType, - &sound._soundHandle, sound._waveFile->audioStream(), - -1, channel.getRawVolume(), 0, DisposeAfterUse::NO); + // Need to loop (replay) the sound again + sound._soundHandle = sound._waveFile->play(channel.getRawVolume()); } else { // Sound is finished if (sound._callback) @@ -234,10 +231,8 @@ void QMixer::qsWaveMixPump() { if (channel._resetDistance) channel._distance = 0.0; - // Calculate an effective volume based on distance of source - _mixer->playStream(sound._waveFile->_soundType, - &sound._soundHandle, sound._waveFile->audioStream(), - -1, channel.getRawVolume(), 0, DisposeAfterUse::NO); + // Play the wave + sound._soundHandle = sound._waveFile->play(channel.getRawVolume()); sound._started = true; } } diff --git a/engines/titanic/sound/qmixer.h b/engines/titanic/sound/qmixer.h index b8c7f6dae2..17ca441e83 100644 --- a/engines/titanic/sound/qmixer.h +++ b/engines/titanic/sound/qmixer.h @@ -212,8 +212,9 @@ class QMixer { byte getRawVolume() const; }; private: - Audio::Mixer *_mixer; Common::Array _channels; +protected: + Audio::Mixer *_mixer; public: QMixer(Audio::Mixer *mixer); virtual ~QMixer() {} diff --git a/engines/titanic/sound/sound.cpp b/engines/titanic/sound/sound.cpp index c28823148e..fb8cc299df 100644 --- a/engines/titanic/sound/sound.cpp +++ b/engines/titanic/sound/sound.cpp @@ -129,7 +129,6 @@ CWaveFile *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); - soundItem->_waveFile->reset(); return soundItem->_waveFile; } } diff --git a/engines/titanic/sound/sound_manager.cpp b/engines/titanic/sound/sound_manager.cpp index df9183b9d8..514618783b 100644 --- a/engines/titanic/sound/sound_manager.cpp +++ b/engines/titanic/sound/sound_manager.cpp @@ -120,7 +120,7 @@ QSoundManager::~QSoundManager() { } CWaveFile *QSoundManager::loadSound(const CString &name) { - CWaveFile *waveFile = new CWaveFile(); + CWaveFile *waveFile = new CWaveFile(_mixer); // Try to load the specified sound if (!waveFile->loadSound(name)) { @@ -132,7 +132,7 @@ CWaveFile *QSoundManager::loadSound(const CString &name) { } CWaveFile *QSoundManager::loadSpeech(CDialogueFile *dialogueFile, int speechId) { - CWaveFile *waveFile = new CWaveFile(); + CWaveFile *waveFile = new CWaveFile(_mixer); // Try to load the specified sound if (!waveFile->loadSpeech(dialogueFile, speechId)) { @@ -144,7 +144,7 @@ CWaveFile *QSoundManager::loadSpeech(CDialogueFile *dialogueFile, int speechId) } CWaveFile *QSoundManager::loadMusic(const CString &name) { - CWaveFile *waveFile = new CWaveFile(); + CWaveFile *waveFile = new CWaveFile(_mixer); // Try to load the specified sound if (!waveFile->loadMusic(name)) { @@ -156,7 +156,7 @@ CWaveFile *QSoundManager::loadMusic(const CString &name) { } CWaveFile *QSoundManager::loadMusic(CAudioBuffer *buffer, DisposeAfterUse::Flag disposeAfterUse) { - CWaveFile *waveFile = new CWaveFile(); + CWaveFile *waveFile = new CWaveFile(_mixer); // Try to load the specified audio buffer if (!waveFile->loadMusic(buffer, disposeAfterUse)) { diff --git a/engines/titanic/sound/wave_file.cpp b/engines/titanic/sound/wave_file.cpp index e6232204e7..66da1160a5 100644 --- a/engines/titanic/sound/wave_file.cpp +++ b/engines/titanic/sound/wave_file.cpp @@ -64,7 +64,7 @@ bool AudioBufferStream::endOfData() const { /*------------------------------------------------------------------------*/ -CWaveFile::CWaveFile() : _audioStream(nullptr), +CWaveFile::CWaveFile(Audio::Mixer *mixer) : _mixer(mixer), _audioStream(nullptr), _waveData(nullptr), _waveSize(0), _dataSize(0), _headerSize(0), _rate(0), _flags(0), _wavType(0), _soundType(Audio::Mixer::kPlainSoundType) { setup(); @@ -181,9 +181,8 @@ Audio::SeekableAudioStream *CWaveFile::audioStream() { // No stream yet, so create one and give it control of the raw wave data assert(_waveData); _audioStream = Audio::makeWAVStream( - new Common::MemoryReadStream(_waveData, _waveSize, DisposeAfterUse::YES), + new Common::MemoryReadStream(_waveData, _waveSize, DisposeAfterUse::NO), DisposeAfterUse::YES); - _waveData = nullptr; } return _audioStream; @@ -194,10 +193,6 @@ uint CWaveFile::getFrequency() { return audioStream()->getRate(); } -void CWaveFile::reset() { - audioStream()->rewind(); -} - const int16 *CWaveFile::lock() { enum { kWaveFormatPCM = 1 }; @@ -220,4 +215,17 @@ void CWaveFile::unlock(const int16 *ptr) { // No implementation needed in ScummVM } -} // End of namespace Titanic z +Audio::SoundHandle CWaveFile::play(byte volume) { + // If there's a previous instance of the sound being played, + // stop in and free the old audio stream + if (_mixer->isSoundHandleActive(_soundHandle)) + _mixer->stopHandle(_soundHandle); + + Audio::SeekableAudioStream *stream = audioStream(); + stream->rewind(); + _mixer->playStream(_soundType, &_soundHandle, stream, -1, + volume, 0, DisposeAfterUse::NO); + return _soundHandle; +} + +} // End of namespace Titanic diff --git a/engines/titanic/sound/wave_file.h b/engines/titanic/sound/wave_file.h index 6bd18989b9..a70ab5c679 100644 --- a/engines/titanic/sound/wave_file.h +++ b/engines/titanic/sound/wave_file.h @@ -37,6 +37,7 @@ class QSoundManager; class CWaveFile { private: + Audio::Mixer *_mixer; byte *_waveData; int _waveSize; int _dataSize; @@ -45,6 +46,7 @@ private: byte _flags; uint16 _wavType; Audio::SeekableAudioStream *_audioStream; + Audio::SoundHandle _soundHandle; private: /** * Handles setup of fields shared by the constructors @@ -55,6 +57,11 @@ private: * Gets passed the raw data for the wave file */ void load(byte *data, uint dataSize); + + /** + * Returns a ScummVM Audio Stream for playback purposes + */ + Audio::SeekableAudioStream *audioStream(); public: Audio::Mixer::SoundType _soundType; @@ -63,7 +70,7 @@ public: DisposeAfterUse::Flag _disposeAudioBuffer; int _channel; public: - CWaveFile(); + CWaveFile(Audio::Mixer *mixer); CWaveFile(QSoundManager *owner); ~CWaveFile(); @@ -79,11 +86,6 @@ public: */ uint size() const { return _dataSize; } - /** - * Returns a ScummVM Audio Stream for playback purposes - */ - Audio::SeekableAudioStream *audioStream(); - /** * Tries to load the specified wave file sound */ @@ -130,6 +132,11 @@ public: * Unlock sound data after a prior call to lock */ void unlock(const int16 *ptr); + + /** + * Plays the wave file + */ + Audio::SoundHandle play(byte volume); }; } // End of namespace Titanic -- cgit v1.2.3