diff options
Diffstat (limited to 'engines/titanic')
-rw-r--r-- | engines/titanic/sound/qmixer.cpp | 13 | ||||
-rw-r--r-- | engines/titanic/sound/qmixer.h | 3 | ||||
-rw-r--r-- | engines/titanic/sound/sound.cpp | 1 | ||||
-rw-r--r-- | engines/titanic/sound/sound_manager.cpp | 8 | ||||
-rw-r--r-- | engines/titanic/sound/wave_file.cpp | 59 | ||||
-rw-r--r-- | engines/titanic/sound/wave_file.h | 29 |
6 files changed, 54 insertions, 59 deletions
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<ChannelEntry> _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..90367b00a8 100644 --- a/engines/titanic/sound/wave_file.cpp +++ b/engines/titanic/sound/wave_file.cpp @@ -64,13 +64,13 @@ bool AudioBufferStream::endOfData() const { /*------------------------------------------------------------------------*/ -CWaveFile::CWaveFile() : _audioStream(nullptr), +CWaveFile::CWaveFile(Audio::Mixer *mixer) : _mixer(mixer), _pendingAudioStream(nullptr), _waveData(nullptr), _waveSize(0), _dataSize(0), _headerSize(0), _rate(0), _flags(0), _wavType(0), _soundType(Audio::Mixer::kPlainSoundType) { setup(); } -CWaveFile::CWaveFile(QSoundManager *owner) : _audioStream(nullptr), +CWaveFile::CWaveFile(QSoundManager *owner) : _pendingAudioStream(nullptr), _waveData(nullptr), _waveSize(0), _dataSize(0), _headerSize(0), _rate(0), _flags(0), _wavType(0), _soundType(Audio::Mixer::kPlainSoundType) { setup(); @@ -85,10 +85,8 @@ void CWaveFile::setup() { } CWaveFile::~CWaveFile() { - if (_audioStream) { - //_soundManager->soundFreed(_soundHandle); - delete _audioStream; - } + // Delete any pending audio stream if it wasn't used + delete _pendingAudioStream; if (_disposeAudioBuffer == DisposeAfterUse::YES && _audioBuffer) delete _audioBuffer; @@ -97,7 +95,7 @@ CWaveFile::~CWaveFile() { } uint CWaveFile::getDurationTicks() const { - if (!_audioStream) + if (!_rate) return 0; // FIXME: The original uses acmStreamSize to calculate @@ -105,12 +103,10 @@ uint CWaveFile::getDurationTicks() const { // method works, for now I'm using a simple ratio of a // sample output to input value double newSize = (double)_dataSize * (1475712.0 / 199836.0); - return (uint)(newSize * 1000.0 / _audioStream->getRate()); + return (uint)(newSize * 1000.0 / _rate); } bool CWaveFile::loadSound(const CString &name) { - assert(!_audioStream); - StdCWadFile file; if (!file.open(name)) return false; @@ -139,8 +135,6 @@ bool CWaveFile::loadSpeech(CDialogueFile *dialogueFile, int speechIndex) { } bool CWaveFile::loadMusic(const CString &name) { - assert(!_audioStream); - StdCWadFile file; if (!file.open(name)) return false; @@ -161,7 +155,7 @@ bool CWaveFile::loadMusic(CAudioBuffer *buffer, DisposeAfterUse::Flag disposeAft _disposeAudioBuffer = disposeAfterUse; _loadMode = LOADMODE_AUDIO_BUFFER; - _audioStream = new AudioBufferStream(_audioBuffer); + _pendingAudioStream = new AudioBufferStream(_audioBuffer); return true; } @@ -176,28 +170,24 @@ void CWaveFile::load(byte *data, uint dataSize) { _headerSize = wavStream.pos(); } -Audio::SeekableAudioStream *CWaveFile::audioStream() { - if (!_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), +Audio::SeekableAudioStream *CWaveFile::createAudioStream() { + Audio::SeekableAudioStream *stream; + + if (_pendingAudioStream) { + stream = _pendingAudioStream; + _pendingAudioStream = nullptr; + } else { + // Create a new ScummVM audio stream for the wave file data + stream = Audio::makeWAVStream( + new Common::MemoryReadStream(_waveData, _waveSize, DisposeAfterUse::NO), DisposeAfterUse::YES); - _waveData = nullptr; } - return _audioStream; + _rate = stream->getRate(); + return stream; } -uint CWaveFile::getFrequency() { - return audioStream()->getRate(); -} - -void CWaveFile::reset() { - audioStream()->rewind(); -} - const int16 *CWaveFile::lock() { enum { kWaveFormatPCM = 1 }; @@ -220,4 +210,13 @@ void CWaveFile::unlock(const int16 *ptr) { // No implementation needed in ScummVM } -} // End of namespace Titanic z +Audio::SoundHandle CWaveFile::play(byte volume) { + Audio::SeekableAudioStream *stream = createAudioStream(); + Audio::SoundHandle handle; + + _mixer->playStream(_soundType, &handle, stream, -1, + volume, 0, DisposeAfterUse::NO); + return handle; +} + +} // End of namespace Titanic diff --git a/engines/titanic/sound/wave_file.h b/engines/titanic/sound/wave_file.h index 6bd18989b9..c41d2a8fdc 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; @@ -44,7 +45,7 @@ private: int _rate; byte _flags; uint16 _wavType; - Audio::SeekableAudioStream *_audioStream; + Audio::SeekableAudioStream *_pendingAudioStream; private: /** * Handles setup of fields shared by the constructors @@ -55,6 +56,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 *createAudioStream(); public: Audio::Mixer::SoundType _soundType; @@ -63,7 +69,7 @@ public: DisposeAfterUse::Flag _disposeAudioBuffer; int _channel; public: - CWaveFile(); + CWaveFile(Audio::Mixer *mixer); CWaveFile(QSoundManager *owner); ~CWaveFile(); @@ -80,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 */ bool loadSound(const CString &name); @@ -108,18 +109,13 @@ public: * Returns true if the wave file has data loaded */ bool isLoaded() const { - return _audioStream != nullptr || _waveData != nullptr; + return _waveData != nullptr; } /** * Return the frequency of the loaded wave file */ - uint getFrequency(); - - /** - * Resets the music stream - */ - void reset(); + uint getFrequency() const { return _rate; } /** * Lock sound data for access @@ -130,6 +126,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 |