aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/titanic/sound/qmixer.cpp13
-rw-r--r--engines/titanic/sound/qmixer.h3
-rw-r--r--engines/titanic/sound/sound.cpp1
-rw-r--r--engines/titanic/sound/sound_manager.cpp8
-rw-r--r--engines/titanic/sound/wave_file.cpp24
-rw-r--r--engines/titanic/sound/wave_file.h19
6 files changed, 39 insertions, 29 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..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();
@@ -80,11 +87,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);
@@ -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