aboutsummaryrefslogtreecommitdiff
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
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
-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.cpp110
-rw-r--r--engines/bladerunner/aud_stream.h63
-rw-r--r--engines/bladerunner/audio_player.cpp124
-rw-r--r--engines/bladerunner/audio_player.h37
-rw-r--r--engines/bladerunner/module.mk3
-rw-r--r--engines/bladerunner/vqa_decoder.h2
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"