aboutsummaryrefslogtreecommitdiff
path: root/sound.cpp
diff options
context:
space:
mode:
authorJames Brown2002-05-13 08:25:58 +0000
committerJames Brown2002-05-13 08:25:58 +0000
commit4466f1555b6158ec7f8e35f46def08c744b0ae1f (patch)
tree5c18e675712290fab11ac2993eae2ee9ad313119 /sound.cpp
parent2a53e8f661c06b79a9a2d7443f4fb1e6be71cf13 (diff)
downloadscummvm-rg350-4466f1555b6158ec7f8e35f46def08c744b0ae1f.tar.gz
scummvm-rg350-4466f1555b6158ec7f8e35f46def08c744b0ae1f.tar.bz2
scummvm-rg350-4466f1555b6158ec7f8e35f46def08c744b0ae1f.zip
The DIG SFX support - thanks to aquadran
svn-id: r4303
Diffstat (limited to 'sound.cpp')
-rw-r--r--sound.cpp53
1 files changed, 53 insertions, 0 deletions
diff --git a/sound.cpp b/sound.cpp
index 48b8505a6d..4b0477d771 100644
--- a/sound.cpp
+++ b/sound.cpp
@@ -87,6 +87,59 @@ void Scumm::processSoundQues()
data[1], data[2], data[3], data[4], data[5], data[6], data[7]
);
#endif
+ if ((_gameId == GID_DIG) && (data[0] == 12)){
+ uint32 size, rate, tag, chan;
+ uint8 * ptr = getResourceAddress(rtSound, data[1]);
+ if (ptr != NULL) {
+ ptr+=16; /* Skip header */
+ for (;;) {
+ tag = READ_BE_UINT32(ptr); ptr+=4;
+ switch(tag) {
+ case MKID_BE('FRMT'):
+ size = READ_BE_UINT32(ptr); ptr+=16;
+ rate = READ_BE_UINT32(ptr); ptr+=4;
+ chan = READ_BE_UINT32(ptr); ptr+=4;
+ break;
+ case MKID_BE('TEXT'):
+ case MKID_BE('REGN'):
+ case MKID_BE('STOP'):
+ size = READ_BE_UINT32(ptr); ptr+=size+4;
+ break;
+ case MKID_BE('DATA'):
+ size = READ_BE_UINT32(ptr); ptr+=4;
+ break;
+ default:
+ error("Unknown sfx header %c%c%c%c", tag>>24, tag>>16, tag>>8, tag);
+ }
+ if (tag == MKID_BE('DATA')) break;
+ }
+ if (chan == 1)
+ {
+ uint32 s_size = (size * 2) / 3;
+ byte * buffer = (byte*)malloc (s_size);
+ uint32 l = 0, r = 0, tmp;
+ memset (buffer, 0, s_size);
+ for (; l < size - 1; l += 3)
+ {
+ tmp = (ptr[l + 1] & 0x0f) << 8;
+ tmp = (tmp | ptr[l + 0]) << 4;
+ tmp -= 0x8000;
+// buffer[r++] = (uint8)(tmp & 0xff);
+ buffer[r++] = (uint8)((tmp >> 8) & 0xff);
+
+ tmp = (ptr[l + 1] & 0xf0) << 4;
+ tmp = (tmp | ptr[l + 2]) << 4;
+ tmp -= 0x8000;
+// buffer[r++] = (uint8)(tmp & 0xff);
+ buffer[r++] = (uint8)((tmp >> 8) & 0xff);
+ }
+ _mixer->play_raw(NULL, buffer, s_size, rate, SoundMixer::FLAG_AUTOFREE);
+ } else {
+ warning("DIG: ignoring stereo sample");
+ }
+ }
+ }
+
if (!(_features & GF_AFTER_V7)) {
if (se)
_vars[VAR_SOUNDRESULT] =