aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsluicebox2019-10-11 14:19:43 -0700
committersluicebox2019-10-11 14:19:43 -0700
commit4d5699a8e7cf66cac06a12aaeccc3462fa518ab6 (patch)
treec7083248067370e7216d9ac2728b7ee60e689fb7
parent511e5441e360bf283cafc48981580bea2e07a44b (diff)
downloadscummvm-rg350-4d5699a8e7cf66cac06a12aaeccc3462fa518ab6.tar.gz
scummvm-rg350-4d5699a8e7cf66cac06a12aaeccc3462fa518ab6.tar.bz2
scummvm-rg350-4d5699a8e7cf66cac06a12aaeccc3462fa518ab6.zip
SCI32: Add support for Mac SND resource playback
Used by at least GK1 Mac, which can now be started without erroring
-rw-r--r--engines/sci/sound/audio32.cpp20
1 files changed, 20 insertions, 0 deletions
diff --git a/engines/sci/sound/audio32.cpp b/engines/sci/sound/audio32.cpp
index f9a0140323..9bf08c5f74 100644
--- a/engines/sci/sound/audio32.cpp
+++ b/engines/sci/sound/audio32.cpp
@@ -22,6 +22,7 @@
#include "sci/sound/audio32.h"
#include "audio/audiostream.h" // for SeekableAudioStream
+#include "audio/decoders/mac_snd.h" // for makeMacSndStream
#include "audio/decoders/raw.h" // for makeRawStream, RawFlags::FLAG_16BITS
#include "audio/decoders/wave.h" // for makeWAVStream
#include "audio/rate.h" // for RateConverter, makeRateConverter
@@ -83,6 +84,23 @@ bool detectWaveAudio(Common::SeekableReadStream &stream) {
return true;
}
+bool detectMacSndAudio(Common::SeekableReadStream &stream) {
+ const size_t initialPosition = stream.pos();
+
+ byte header[14];
+ if (stream.read(header, sizeof(header)) != sizeof(header)) {
+ stream.seek(initialPosition);
+ return false;
+ }
+
+ stream.seek(initialPosition);
+
+ return (READ_BE_UINT16(header) == 1 &&
+ READ_BE_UINT16(header + 2) == 1 &&
+ READ_BE_UINT16(header + 4) == 5 &&
+ READ_BE_UINT32(header + 10) == 0x00018051);
+}
+
#pragma mark -
#pragma mark MutableLoopAudioStream
@@ -793,6 +811,8 @@ uint16 Audio32::play(int16 channelIndex, const ResourceId resourceId, const bool
audioStream = makeSOLStream(dataStream, DisposeAfterUse::YES);
} else if (detectWaveAudio(*dataStream)) {
audioStream = Audio::makeWAVStream(dataStream, DisposeAfterUse::YES);
+ } else if (detectMacSndAudio(*dataStream)) {
+ audioStream = Audio::makeMacSndStream(dataStream, DisposeAfterUse::YES);
} else {
byte flags = Audio::FLAG_LITTLE_ENDIAN;
if (_globalBitDepth == 16) {