The DIG SFX support - thanks to aquadran

svn-id: r4303
This commit is contained in:
James Brown 2002-05-13 08:25:58 +00:00
parent 2a53e8f661
commit 4466f1555b
3 changed files with 63 additions and 9 deletions

View file

@ -257,8 +257,10 @@ void SmushPlayer::parseIACT() {
break;
default :
error("trk %d: unknown tag inside iMUS %08x",
trk, _imusSubTag[idx]);
error("trk %d: unknown tag inside iMUS %08x [%c%c%c%c]",
trk, _imusSubTag[idx], _imusSubTag[idx] >> 24,
_imusSubTag[idx] >> 16, _imusSubTag[idx] >> 8,
_imusSubTag[idx]);
}
_imusSubSize[idx] -= sublen;

View file

@ -557,13 +557,12 @@ int Scumm::readSoundResource(int type, int idx)
basetag = fileReadDword();
total_size = fileReadDwordBE();
if (_gameId == GID_SAMNMAX || _features & GF_AFTER_V7) {
if (basetag == MKID('MIDI')) {
fileSeek(_fileHandle, -8, SEEK_CUR);
fileRead(_fileHandle, createResource(type, idx, total_size + 8),
total_size + 8);
return 1;
}
//if (_gameId == GID_SAMNMAX || _features & GF_AFTER_V7) {
if (basetag == MKID('MIDI') || basetag == MKID('iMUS')) {
fileSeek(_fileHandle, -8, SEEK_CUR);
fileRead(_fileHandle, createResource(type, idx, total_size + 8),
total_size + 8);
return 1;
} else if (basetag == MKID('SOU ')) {
best_pri = -1;
while (pos < total_size) {

View file

@ -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] =