The DIG SFX support - thanks to aquadran
svn-id: r4303
This commit is contained in:
parent
2a53e8f661
commit
4466f1555b
3 changed files with 63 additions and 9 deletions
|
@ -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;
|
||||
|
|
13
resource.cpp
13
resource.cpp
|
@ -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) {
|
||||
|
|
53
sound.cpp
53
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] =
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue