diff options
author | James Brown | 2002-05-13 08:25:58 +0000 |
---|---|---|
committer | James Brown | 2002-05-13 08:25:58 +0000 |
commit | 4466f1555b6158ec7f8e35f46def08c744b0ae1f (patch) | |
tree | 5c18e675712290fab11ac2993eae2ee9ad313119 /sound.cpp | |
parent | 2a53e8f661c06b79a9a2d7443f4fb1e6be71cf13 (diff) | |
download | scummvm-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.cpp | 53 |
1 files changed, 53 insertions, 0 deletions
@@ -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] = |