aboutsummaryrefslogtreecommitdiff
path: root/engines/titanic/sound/wave_file.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/titanic/sound/wave_file.cpp')
-rw-r--r--engines/titanic/sound/wave_file.cpp86
1 files changed, 63 insertions, 23 deletions
diff --git a/engines/titanic/sound/wave_file.cpp b/engines/titanic/sound/wave_file.cpp
index e49c44d76d..a4cd9d3e3f 100644
--- a/engines/titanic/sound/wave_file.cpp
+++ b/engines/titanic/sound/wave_file.cpp
@@ -29,22 +29,56 @@
namespace Titanic {
-CWaveFile::CWaveFile() : _soundManager(nullptr), _audioStream(nullptr),
+/**
+ * This creates a ScummVM audio stream around a CAudioBuffer buffer,
+ * allowing for streaming audio output for the music room music
+ */
+class AudioBufferStream : public Audio::SeekableAudioStream {
+private:
+ CAudioBuffer *_audioBuffer;
+public:
+ AudioBufferStream(CAudioBuffer *audioBuffer) : _audioBuffer(audioBuffer) {}
+
+ virtual int readBuffer(int16 *buffer, const int numSamples);
+ virtual bool isStereo() const { return false; }
+ virtual bool endOfData() const;
+ virtual int getRate() const { return 22050; }
+ virtual Audio::Timestamp getLength() const { return Audio::Timestamp(); }
+ virtual bool seek(const Audio::Timestamp &where) { return false; }
+};
+
+int AudioBufferStream::readBuffer(int16 *buffer, const int numSamples) {
+ _audioBuffer->enterCriticalSection();
+ int samplesToRead = MIN((const int)numSamples, (const int)(_audioBuffer->getBytesToRead() / sizeof(uint16)));
+
+ const int16 *src = _audioBuffer->getReadPtr();
+ Common::copy(src, src + samplesToRead, buffer);
+ _audioBuffer->advanceRead(samplesToRead * 2);
+
+ _audioBuffer->leaveCriticalSection();
+ return samplesToRead;
+}
+
+bool AudioBufferStream::endOfData() const {
+ return _audioBuffer->_disabled;
+}
+
+/*------------------------------------------------------------------------*/
+
+CWaveFile::CWaveFile() : _audioStream(nullptr),
_waveData(nullptr), _waveSize(0), _dataSize(0), _headerSize(0),
- _rate(0), _flags(0), _soundType(Audio::Mixer::kPlainSoundType) {
+ _rate(0), _flags(0), _wavType(0), _soundType(Audio::Mixer::kPlainSoundType) {
setup();
}
-CWaveFile::CWaveFile(QSoundManager *owner) : _soundManager(owner), _audioStream(nullptr),
+CWaveFile::CWaveFile(QSoundManager *owner) : _audioStream(nullptr),
_waveData(nullptr), _waveSize(0), _dataSize(0), _headerSize(0),
- _rate(0), _flags(0), _soundType(Audio::Mixer::kPlainSoundType) {
+ _rate(0), _flags(0), _wavType(0), _soundType(Audio::Mixer::kPlainSoundType) {
setup();
}
void CWaveFile::setup() {
_loadMode = LOADMODE_SCUMMVM;
- _field4 = 0;
- _field14 = 1;
_dataSize = 0;
_audioBuffer = nullptr;
_disposeAudioBuffer = DisposeAfterUse::NO;
@@ -53,7 +87,7 @@ void CWaveFile::setup() {
CWaveFile::~CWaveFile() {
if (_audioStream) {
- _soundManager->soundFreed(_soundHandle);
+ //_soundManager->soundFreed(_soundHandle);
delete _audioStream;
}
@@ -83,11 +117,11 @@ bool CWaveFile::loadSound(const CString &name) {
return false;
Common::SeekableReadStream *stream = file.readStream();
- uint size = stream->size();
- byte *data = new byte[size];
- stream->read(data, size);
+ uint wavSize = stream->size();
+ byte *data = new byte[wavSize];
+ stream->read(data, wavSize);
- load(data, size);
+ load(data, wavSize);
_soundType = Audio::Mixer::kSFXSoundType;
return true;
}
@@ -113,12 +147,12 @@ bool CWaveFile::loadMusic(const CString &name) {
return false;
Common::SeekableReadStream *stream = file.readStream();
- uint size = stream->size();
- byte *data = new byte[size];
- stream->read(data, size);
+ uint wavSize = stream->size();
+ byte *data = new byte[wavSize];
+ stream->read(data, wavSize);
delete stream;
- load(data, size);
+ load(data, wavSize);
_soundType = Audio::Mixer::kMusicSoundType;
return true;
}
@@ -127,18 +161,18 @@ bool CWaveFile::loadMusic(CAudioBuffer *buffer, DisposeAfterUse::Flag disposeAft
_audioBuffer = buffer;
_disposeAudioBuffer = disposeAfterUse;
_loadMode = LOADMODE_AUDIO_BUFFER;
- _field14 = 0;
+ _audioStream = new AudioBufferStream(_audioBuffer);
return true;
}
-void CWaveFile::load(byte *data, uint size) {
+void CWaveFile::load(byte *data, uint dataSize) {
_waveData = data;
- _waveSize = size;
+ _waveSize = dataSize;
// Parse the wave header
- Common::MemoryReadStream wavStream(data, size, DisposeAfterUse::NO);
- Audio::loadWAVFromStream(wavStream, _dataSize, _rate, _flags);
+ Common::MemoryReadStream wavStream(data, dataSize, DisposeAfterUse::NO);
+ Audio::loadWAVFromStream(wavStream, _dataSize, _rate, _flags, &_wavType);
_headerSize = wavStream.pos();
}
@@ -164,19 +198,25 @@ void CWaveFile::reset() {
audioStream()->rewind();
}
-const uint16 *CWaveFile::lock() {
+const int16 *CWaveFile::lock() {
+ enum { kWaveFormatPCM = 1 };
+
switch (_loadMode) {
case LOADMODE_SCUMMVM:
+ // Sanity checking that only raw 16-bit LE 22Khz waves can be locked
assert(_waveData && _rate == 22050);
assert(_flags == (Audio::FLAG_LITTLE_ENDIAN | Audio::FLAG_16BITS));
- return (uint16 *)(_waveData + _headerSize);
+ assert(_wavType == kWaveFormatPCM);
+
+ // Return a pointer to the data section of the wave file
+ return (const int16 *)(_waveData + _headerSize);
default:
return nullptr;
}
}
-void CWaveFile::unlock(const uint16 *ptr) {
+void CWaveFile::unlock(const int16 *ptr) {
// No implementation needed in ScummVM
}