diff options
-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) { |