aboutsummaryrefslogtreecommitdiff
path: root/engines/bladerunner/audio_player.cpp
diff options
context:
space:
mode:
authorThomas Fach-Pedersen2015-02-10 17:51:16 +0100
committerEugene Sandulenko2016-09-29 22:33:38 +0200
commit35ea84935ff3259aaa09946f0447a75e9b617086 (patch)
tree99498b9e6842bd38fb67aef9e27195cc1485d6ad /engines/bladerunner/audio_player.cpp
parent2d8f421597d3bd31f76695f322c2c324774c567a (diff)
downloadscummvm-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/audio_player.cpp')
-rw-r--r--engines/bladerunner/audio_player.cpp124
1 files changed, 1 insertions, 123 deletions
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)
{