diff options
author | Thomas Fach-Pedersen | 2015-02-10 17:51:16 +0100 |
---|---|---|
committer | Eugene Sandulenko | 2016-09-29 22:33:38 +0200 |
commit | 35ea84935ff3259aaa09946f0447a75e9b617086 (patch) | |
tree | 99498b9e6842bd38fb67aef9e27195cc1485d6ad /engines/bladerunner | |
parent | 2d8f421597d3bd31f76695f322c2c324774c567a (diff) | |
download | scummvm-rg350-35ea84935ff3259aaa09946f0447a75e9b617086.tar.gz scummvm-rg350-35ea84935ff3259aaa09946f0447a75e9b617086.tar.bz2 scummvm-rg350-35ea84935ff3259aaa09946f0447a75e9b617086.zip |
BLADERUNNER: Split aud_decoder into aud_stream and adpcm_decoder
Diffstat (limited to 'engines/bladerunner')
-rw-r--r-- | engines/bladerunner/adpcm_decoder.cpp (renamed from engines/bladerunner/aud_decoder.cpp) | 2 | ||||
-rw-r--r-- | engines/bladerunner/adpcm_decoder.h (renamed from engines/bladerunner/aud_decoder.h) | 6 | ||||
-rw-r--r-- | engines/bladerunner/aud_stream.cpp | 110 | ||||
-rw-r--r-- | engines/bladerunner/aud_stream.h | 63 | ||||
-rw-r--r-- | engines/bladerunner/audio_player.cpp | 124 | ||||
-rw-r--r-- | engines/bladerunner/audio_player.h | 37 | ||||
-rw-r--r-- | engines/bladerunner/module.mk | 3 | ||||
-rw-r--r-- | engines/bladerunner/vqa_decoder.h | 2 |
8 files changed, 218 insertions, 129 deletions
diff --git a/engines/bladerunner/aud_decoder.cpp b/engines/bladerunner/adpcm_decoder.cpp index 3123ddddb7..e262da6430 100644 --- a/engines/bladerunner/aud_decoder.cpp +++ b/engines/bladerunner/adpcm_decoder.cpp @@ -20,7 +20,7 @@ * */ -#include "bladerunner/aud_decoder.h" +#include "bladerunner/adpcm_decoder.h" #include "common/util.h" diff --git a/engines/bladerunner/aud_decoder.h b/engines/bladerunner/adpcm_decoder.h index c09b5fad64..fd174aef42 100644 --- a/engines/bladerunner/aud_decoder.h +++ b/engines/bladerunner/adpcm_decoder.h @@ -20,8 +20,8 @@ * */ -#ifndef BLADERUNNER_AUD_DECODER_H -#define BLADERUNNER_AUD_DECODER_H +#ifndef BLADERUNNER_ADPCM_DECODER_H +#define BLADERUNNER_ADPCM_DECODER_H #include "common/types.h" @@ -45,6 +45,6 @@ public: void decode(uint8 *in, size_t size, int16 *out); }; -} +} // End of namespace BladeRunner #endif diff --git a/engines/bladerunner/aud_stream.cpp b/engines/bladerunner/aud_stream.cpp new file mode 100644 index 0000000000..28f85313a4 --- /dev/null +++ b/engines/bladerunner/aud_stream.cpp @@ -0,0 +1,110 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#include "bladerunner/aud_stream.h" + +#include "bladerunner/audio_player.h" + +#include "common/util.h" + +namespace BladeRunner { + +AudStream::AudStream(byte *data) + : _cache(nullptr) +{ + init(data); +} + +AudStream::AudStream(AudioCache *cache, int32 hash) + : _cache(cache), _hash(hash) +{ + _cache->incRef(_hash); + + init(_cache->findByHash(_hash)); +} + +void AudStream::init(byte *data) +{ + _data = data; + _end = _data + READ_LE_UINT32(_data + 2) + 12; + assert(_end - _data >= 12); + + _compressionType = *(_data + 11); + + _deafBlockRemain = 0; + _p = _data + 12; +} + +AudStream::~AudStream() { + if (_cache) + _cache->decRef(_hash); +} + +int AudStream::readBuffer(int16 *buffer, const int numSamples) { + int samplesRead = 0; + + assert(numSamples % 2 == 0); + + if (_compressionType == 99) { + while (samplesRead < numSamples) { + if (_deafBlockRemain == 0) { + if (_end - _p == 0) + break; + + assert(_end - _p >= 6); + + uint16 blockSize = READ_LE_UINT16(_p); + uint16 blockOutSize = READ_LE_UINT16(_p + 2); + uint32 sig = READ_LE_UINT32(_p + 4); + _p += 8; + + assert(sig == 0xdeaf); + assert(_end - _p >= blockSize); + assert(blockOutSize = 4 * blockSize); + + _deafBlockRemain = blockSize; + } + + assert(_end - _p >= _deafBlockRemain); + + int bytesConsumed = MIN<int>(_deafBlockRemain, (numSamples - samplesRead) / 2); + + _decoder.decode(_p, bytesConsumed, buffer + samplesRead); + _p += bytesConsumed; + _deafBlockRemain -= bytesConsumed; + + samplesRead += 2 * bytesConsumed; + } + } else { + assert(0 && "readBuffer: Unimplemented"); + } + + return samplesRead; +} + +bool AudStream::rewind() { + _p = _data + 12; + _decoder.setParameters(0, 0); + return true; +} + +} // End of namespace BladeRunner diff --git a/engines/bladerunner/aud_stream.h b/engines/bladerunner/aud_stream.h new file mode 100644 index 0000000000..3279bdada3 --- /dev/null +++ b/engines/bladerunner/aud_stream.h @@ -0,0 +1,63 @@ +/* ScummVM - Graphic Adventure Engine + * + * ScummVM is the legal property of its developers, whose names + * are too numerous to list here. Please refer to the COPYRIGHT + * file distributed with this source distribution. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + */ + +#ifndef BLADERUNNER_AUD_STREAM_H +#define BLADERUNNER_AUD_STREAM_H + +#include "bladerunner/adpcm_decoder.h" + +#include "audio/audiostream.h" +#include "common/endian.h" +#include "common/types.h" + +namespace BladeRunner { + +class AudioCache; + +class AudStream : public Audio::RewindableAudioStream { + byte *_data; + byte *_p; + byte *_end; + AudioCache *_cache; + int32 _hash; + byte _compressionType; + uint16 _deafBlockRemain; + + ADPCMWestwoodDecoder _decoder; + + void init(byte *data); + +public: + AudStream(byte *data); + AudStream(AudioCache *cache, int32 hash); + ~AudStream(); + + int readBuffer(int16 *buffer, const int numSamples); + bool isStereo() const { return false; } + int getRate() const { return READ_LE_UINT16(_data); }; + bool endOfData() const { return _p == _end; } + bool rewind(); +}; + +} // End of namespace BladeRunner + +#endif diff --git a/engines/bladerunner/audio_player.cpp b/engines/bladerunner/audio_player.cpp index 293fc56fb7..ecfc95aaa7 100644 --- a/engines/bladerunner/audio_player.cpp +++ b/engines/bladerunner/audio_player.cpp @@ -23,16 +23,14 @@ #include "audio_player.h" #include "bladerunner/archive.h" -#include "bladerunner/aud_decoder.h" +#include "bladerunner/aud_stream.h" #include "bladerunner/bladerunner.h" #include "audio/audiostream.h" #include "audio/mixer.h" -#include "common/array.h" #include "common/debug.h" -#include "common/mutex.h" #include "common/stream.h" namespace Common { @@ -41,41 +39,6 @@ namespace Common { namespace BladeRunner { -/* - * This is a poor imitation of Bladerunner's resource cache - */ -class AudioCache { - struct cacheItem { - int32 hash; - int refs; - uint lastAccess; - byte *data; - uint32 size; - }; - - Common::Mutex _mutex; - Common::Array<cacheItem> _cacheItems; - - uint32 _totalSize; - uint32 _maxSize; - uint32 _accessCounter; -public: - AudioCache() : - _totalSize(0), - _maxSize(2457600), - _accessCounter(0) - {} - ~AudioCache(); - - bool canAllocate(uint32 size); - bool dropOldest(); - byte *findByHash(int32 hash); - void storeByHash(int32 hash, Common::SeekableReadStream *stream); - - void incRef(int32 hash); - void decRef(int32 hash); -}; - AudioCache::~AudioCache() { for (uint i = 0; i != _cacheItems.size(); ++i) { free(_cacheItems[i].data); @@ -163,91 +126,6 @@ void AudioCache::decRef(int32 hash) { assert(0 && "AudioCache::decRef: hash not found"); } -class AudStream : public Audio::RewindableAudioStream { - byte *_data; - byte *_p; - byte *_end; - AudioCache *_cache; - int32 _hash; - byte _compressionType; - uint16 _deafBlockRemain; - - ADPCMWestwoodDecoder _decoder; - -public: - AudStream(AudioCache *cache, int32 hash) - : _cache(cache), _hash(hash) - { - _data = _cache->findByHash(_hash); - _end = _data + READ_LE_UINT32(_data + 2) + 12; - _cache->incRef(_hash); - - assert(_end - _data >= 12); - - _compressionType = *(_data + 11); - - _deafBlockRemain = 0; - _p = _data + 12; - } - ~AudStream() { - _cache->decRef(_hash); - } - - int readBuffer(int16 *buffer, const int numSamples); - bool isStereo() const { return false; } - int getRate() const { return READ_LE_UINT16(_data); }; - bool endOfData() const { return _p == _end; } - bool rewind(); -}; - -int AudStream::readBuffer(int16 *buffer, const int numSamples) { - int samplesRead = 0; - - assert(numSamples % 2 == 0); - - if (_compressionType == 99) { - while (samplesRead < numSamples) { - if (_deafBlockRemain == 0) { - if (_end - _p == 0) - break; - - assert(_end - _p >= 6); - - uint16 blockSize = READ_LE_UINT16(_p); - uint16 blockOutSize = READ_LE_UINT16(_p + 2); - uint32 sig = READ_LE_UINT32(_p + 4); - _p += 8; - - assert(sig == 0xdeaf); - assert(_end - _p >= blockSize); - assert(blockOutSize = 4 * blockSize); - - _deafBlockRemain = blockSize; - } - - assert(_end - _p >= _deafBlockRemain); - - int bytesConsumed = MIN<int>(_deafBlockRemain, (numSamples - samplesRead) / 2); - - _decoder.decode(_p, bytesConsumed, buffer + samplesRead); - _p += bytesConsumed; - _deafBlockRemain -= bytesConsumed; - - samplesRead += 2 * bytesConsumed; - } - } else { - assert(0 && "readBuffer: Unimplemented"); - } - - return samplesRead; -} - -bool AudStream::rewind() { - _p = _data + 12; - _decoder.setParameters(0, 0); - return true; -} - AudioPlayer::AudioPlayer(BladeRunnerEngine *vm) : _vm(vm) { diff --git a/engines/bladerunner/audio_player.h b/engines/bladerunner/audio_player.h index 32c7dbb2d8..eb4c75dbb3 100644 --- a/engines/bladerunner/audio_player.h +++ b/engines/bladerunner/audio_player.h @@ -24,6 +24,8 @@ #define BLADERUNNER_AUDIO_H #include "audio/mixer.h" +#include "common/array.h" +#include "common/mutex.h" #include "common/str.h" #include "common/types.h" @@ -34,6 +36,41 @@ class AudioCache; #define TRACKS 6 +/* + * This is a poor imitation of Bladerunner's resource cache + */ +class AudioCache { + struct cacheItem { + int32 hash; + int refs; + uint lastAccess; + byte *data; + uint32 size; + }; + + Common::Mutex _mutex; + Common::Array<cacheItem> _cacheItems; + + uint32 _totalSize; + uint32 _maxSize; + uint32 _accessCounter; +public: + AudioCache() : + _totalSize(0), + _maxSize(2457600), + _accessCounter(0) + {} + ~AudioCache(); + + bool canAllocate(uint32 size); + bool dropOldest(); + byte *findByHash(int32 hash); + void storeByHash(int32 hash, Common::SeekableReadStream *stream); + + void incRef(int32 hash); + void decRef(int32 hash); +}; + class AudioPlayer { BladeRunnerEngine *_vm; AudioCache *_cache; diff --git a/engines/bladerunner/module.mk b/engines/bladerunner/module.mk index 8bc3b360b2..64d5ba8ad1 100644 --- a/engines/bladerunner/module.mk +++ b/engines/bladerunner/module.mk @@ -1,9 +1,10 @@ MODULE := engines/bladerunner MODULE_OBJS = \ + adpcm_decoder.o \ ambient_sounds.o \ archive.o \ - aud_decoder.o \ + aud_stream.o \ audio_player.o \ bladerunner.o \ boundingbox.o \ diff --git a/engines/bladerunner/vqa_decoder.h b/engines/bladerunner/vqa_decoder.h index 8b4293dc7b..3f8c968b9e 100644 --- a/engines/bladerunner/vqa_decoder.h +++ b/engines/bladerunner/vqa_decoder.h @@ -23,7 +23,7 @@ #ifndef BLADERUNNER_VQA_DECODER_H #define BLADERUNNER_VQA_DECODER_H -#include "bladerunner/aud_decoder.h" +#include "bladerunner/adpcm_decoder.h" #include "bladerunner/view.h" #include "audio/audiostream.h" |