diff options
Diffstat (limited to 'engines/titanic/sound/wave_file.cpp')
-rw-r--r-- | engines/titanic/sound/wave_file.cpp | 86 |
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 } |