aboutsummaryrefslogtreecommitdiff
path: root/engines/hopkins
diff options
context:
space:
mode:
Diffstat (limited to 'engines/hopkins')
-rw-r--r--engines/hopkins/sound.cpp52
-rw-r--r--engines/hopkins/sound.h4
2 files changed, 53 insertions, 3 deletions
diff --git a/engines/hopkins/sound.cpp b/engines/hopkins/sound.cpp
index da3a3de747..6f9f17a937 100644
--- a/engines/hopkins/sound.cpp
+++ b/engines/hopkins/sound.cpp
@@ -20,6 +20,7 @@
*
*/
+#include "audio/decoders/adpcm_intern.h"
#include "common/system.h"
#include "common/config-manager.h"
#include "common/file.h"
@@ -28,6 +29,45 @@
#include "hopkins/globals.h"
#include "hopkins/hopkins.h"
+namespace Audio {
+
+class APC_ADPCMStream : public Audio::DVI_ADPCMStream {
+public:
+ APC_ADPCMStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse, int rate, int channels) : DVI_ADPCMStream(stream, disposeAfterUse, stream->size(), rate, channels, 0) {
+ stream->seek(-12, SEEK_CUR);
+ _status.ima_ch[0].last = _startValue[0] = stream->readUint32LE();
+ _status.ima_ch[1].last = _startValue[1] = stream->readUint32LE();
+ stream->seek(4, SEEK_CUR);
+ }
+
+ void reset() {
+ DVI_ADPCMStream::reset();
+ _status.ima_ch[0].last = _startValue[0];
+ _status.ima_ch[1].last = _startValue[1];
+ }
+
+private:
+ int16 _startValue[2];
+};
+
+Audio::RewindableAudioStream *makeAPCStream(Common::SeekableReadStream *stream, DisposeAfterUse::Flag disposeAfterUse) {
+ if (stream->readUint32BE() != MKTAG('C', 'R', 'Y', 'O'))
+ return 0;
+ if (stream->readUint32BE() != MKTAG('_', 'A', 'P', 'C'))
+ return 0;
+ stream->readUint32BE(); // version
+ stream->readUint32LE(); // out size
+ uint32 rate = stream->readUint32LE();
+ stream->skip(8); // initial values, will be handled by the class
+ bool stereo = stream->readUint32LE() != 0;
+
+ return new APC_ADPCMStream(stream, disposeAfterUse, rate, stereo ? 2 : 1);
+}
+
+}
+
+/*------------------------------------------------------------------------*/
+
namespace Hopkins {
SoundManager::SoundManager() {
@@ -388,7 +428,7 @@ void SoundManager::LOAD_MSAMPLE(int mwavIndex, const Common::String &file) {
if (!f.open(file))
error("Could not open %s for reading", file.c_str());
- Mwav[mwavIndex]._audioStream = Audio::makeWAVStream(f.readStream(f.size()), DisposeAfterUse::YES);
+ Mwav[mwavIndex]._audioStream = makeSoundStream(f.readStream(f.size()));
Mwav[mwavIndex]._active = true;
f.close();
@@ -685,8 +725,7 @@ bool SoundManager::SDL_LoadVoice(const Common::String &filename, size_t fileOffs
error("Could not open %s for reading", filename.c_str());
f.seek(fileOffset);
- item._audioStream = Audio::makeWAVStream(f.readStream((entryLength == 0) ? f.size() : entryLength),
- DisposeAfterUse::YES);
+ item._audioStream = makeSoundStream(f.readStream((entryLength == 0) ? f.size() : entryLength));
f.close();
return true;
@@ -789,4 +828,11 @@ void SoundManager::updateScummVMSoundSettings() {
ConfMan.flushToDisk();
}
+Audio::RewindableAudioStream *SoundManager::makeSoundStream(Common::SeekableReadStream *stream) {
+ if (_vm->getPlatform() == Common::kPlatformWindows)
+ return Audio::makeAPCStream(stream, DisposeAfterUse::YES);
+ else
+ return Audio::makeWAVStream(stream, DisposeAfterUse::YES);
+}
+
} // End of namespace Hopkins
diff --git a/engines/hopkins/sound.h b/engines/hopkins/sound.h
index fa0a5419a2..75cb29789c 100644
--- a/engines/hopkins/sound.h
+++ b/engines/hopkins/sound.h
@@ -107,6 +107,10 @@ private:
*/
void checkVoices();
+ /**
+ * Creates an audio stream based on a passed raw stream
+ */
+ Audio::RewindableAudioStream *makeSoundStream(Common::SeekableReadStream *stream);
public:
int SPECIAL_SOUND;
int SOUNDVOL;