[Scummvm-git-logs] scummvm master -> 1f4b97ac7c2350dac7f4edf6976d62879a763546
dreammaster
dreammaster at scummvm.org
Fri Aug 4 04:42:20 CEST 2017
This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
4649bbfce2 TITANIC: Shifting wave file playback into CWaveFile class
1f4b97ac7c TITANIC: Create a new audio stream each time a wave file is played
Commit: 4649bbfce286b51ffd822dfb50d90e5709fade97
https://github.com/scummvm/scummvm/commit/4649bbfce286b51ffd822dfb50d90e5709fade97
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2017-08-03T22:24:00-04:00
Commit Message:
TITANIC: Shifting wave file playback into CWaveFile class
Changed paths:
engines/titanic/sound/qmixer.cpp
engines/titanic/sound/qmixer.h
engines/titanic/sound/sound.cpp
engines/titanic/sound/sound_manager.cpp
engines/titanic/sound/wave_file.cpp
engines/titanic/sound/wave_file.h
diff --git a/engines/titanic/sound/qmixer.cpp b/engines/titanic/sound/qmixer.cpp
index b33601d..5c511c3 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 b8c7f6d..17ca441 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 c288231..fb8cc29 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 df9183b..5146187 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 e623220..66da116 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 6bd1898..a70ab5c 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
Commit: 1f4b97ac7c2350dac7f4edf6976d62879a763546
https://github.com/scummvm/scummvm/commit/1f4b97ac7c2350dac7f4edf6976d62879a763546
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2017-08-03T22:41:00-04:00
Commit Message:
TITANIC: Create a new audio stream each time a wave file is played
This fixes the problem with the 2nd Class floors, where the same
music played in the lift doesn't have time to fade out before
the same music is loaded to be faded in for the floor. Now, each
gets it's own separate audio stream, preventing the two clashing
Changed paths:
engines/titanic/sound/wave_file.cpp
engines/titanic/sound/wave_file.h
diff --git a/engines/titanic/sound/wave_file.cpp b/engines/titanic/sound/wave_file.cpp
index 66da116..90367b0 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(Audio::Mixer *mixer) : _mixer(mixer), _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,23 +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(
+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);
}
- return _audioStream;
+ _rate = stream->getRate();
+ return stream;
}
-uint CWaveFile::getFrequency() {
- return audioStream()->getRate();
-}
-
const int16 *CWaveFile::lock() {
enum { kWaveFormatPCM = 1 };
@@ -216,16 +211,12 @@ void CWaveFile::unlock(const int16 *ptr) {
}
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,
+ Audio::SeekableAudioStream *stream = createAudioStream();
+ Audio::SoundHandle handle;
+
+ _mixer->playStream(_soundType, &handle, stream, -1,
volume, 0, DisposeAfterUse::NO);
- return _soundHandle;
+ return handle;
}
} // End of namespace Titanic
diff --git a/engines/titanic/sound/wave_file.h b/engines/titanic/sound/wave_file.h
index a70ab5c..c41d2a8 100644
--- a/engines/titanic/sound/wave_file.h
+++ b/engines/titanic/sound/wave_file.h
@@ -45,8 +45,7 @@ private:
int _rate;
byte _flags;
uint16 _wavType;
- Audio::SeekableAudioStream *_audioStream;
- Audio::SoundHandle _soundHandle;
+ Audio::SeekableAudioStream *_pendingAudioStream;
private:
/**
* Handles setup of fields shared by the constructors
@@ -61,7 +60,7 @@ private:
/**
* Returns a ScummVM Audio Stream for playback purposes
*/
- Audio::SeekableAudioStream *audioStream();
+ Audio::SeekableAudioStream *createAudioStream();
public:
Audio::Mixer::SoundType _soundType;
@@ -110,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
More information about the Scummvm-git-logs
mailing list