diff options
author | sluicebox | 2019-10-11 14:19:43 -0700 |
---|---|---|
committer | sluicebox | 2019-10-11 14:19:43 -0700 |
commit | 4d5699a8e7cf66cac06a12aaeccc3462fa518ab6 (patch) | |
tree | c7083248067370e7216d9ac2728b7ee60e689fb7 /engines/sci/sound | |
parent | 511e5441e360bf283cafc48981580bea2e07a44b (diff) | |
download | scummvm-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
Diffstat (limited to 'engines/sci/sound')
-rw-r--r-- | engines/sci/sound/audio32.cpp | 20 |
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) { |