aboutsummaryrefslogtreecommitdiff
path: root/engines/titanic
diff options
context:
space:
mode:
Diffstat (limited to 'engines/titanic')
-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.cpp59
-rw-r--r--engines/titanic/sound/wave_file.h29
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