byte *ScummEngine_v71he::findWrappedBlock(uint32 tag, byte *ptr, int state, bool errorFlag) { if (READ_BE_UINT32(ptr) == MKTAG('M','U','L','T')) { byte *offs, *wrap; uint32 size; wrap = heFindResource(MKTAG('W','R','A','P'), ptr); if (wrap == NULL) return NULL; offs = heFindResourceData(MKTAG('O','F','F','S'), wrap); if (offs == NULL) return NULL; size = getResourceDataSize(offs) / 4; assert((uint32)state <= (uint32)size); offs += READ_LE_UINT32(offs + state * sizeof(uint32)); offs = heFindResourceData(tag, offs - 8); if (offs) return offs; offs = heFindResourceData(MKTAG('D','E','F','A'), ptr); if (offs == NULL) return NULL; return heFindResourceData(tag, offs - 8); } else { return heFindResourceData(tag, ptr); } }
byte *ScummEngine_v71he::heFindResourceData(uint32 tag, byte *ptr) { ptr = heFindResource(tag, ptr); if (ptr == NULL) return NULL; return ptr + _resourceHeaderSize; }
void ScummEngine_v80he::createSound(int snd1id, int snd2id) { byte *snd1Ptr, *snd2Ptr; byte *sbng1Ptr, *sbng2Ptr; byte *sdat1Ptr, *sdat2Ptr; byte *src, *dst, *tmp; int len, offs, size; int sdat1size, sdat2size; sbng1Ptr = NULL; sbng2Ptr = NULL; if (snd2id == -1) { _sndPtrOffs = 0; _sndTmrOffs = 0; _sndDataSize = 0; return; } if (snd1id != _curSndId) { _curSndId = snd1id; _sndPtrOffs = 0; _sndTmrOffs = 0; _sndDataSize = 0; } snd1Ptr = getResourceAddress(rtSound, snd1id); assert(snd1Ptr); snd2Ptr = getResourceAddress(rtSound, snd2id); assert(snd2Ptr); int i; int chan = -1; for (i = 0; i < ARRAYSIZE(((SoundHE *)_sound)->_heChannel); i++) { if (((SoundHE *)_sound)->_heChannel[i].sound == snd1id) chan = i; } if (!findSoundTag(MKTAG('d','a','t','a'), snd1Ptr)) { sbng1Ptr = heFindResource(MKTAG('S','B','N','G'), snd1Ptr); sbng2Ptr = heFindResource(MKTAG('S','B','N','G'), snd2Ptr); } if (sbng1Ptr != NULL && sbng2Ptr != NULL) { if (chan != -1 && ((SoundHE *)_sound)->_heChannel[chan].codeOffs > 0) { int curOffs = ((SoundHE *)_sound)->_heChannel[chan].codeOffs; src = snd1Ptr + curOffs; dst = sbng1Ptr + 8; size = READ_BE_UINT32(sbng1Ptr + 4); len = sbng1Ptr - snd1Ptr + size - curOffs; byte *data = (byte *)malloc(len); memcpy(data, src, len); memcpy(dst, data, len); free(data); dst = sbng1Ptr + 8; while ((size = READ_LE_UINT16(dst)) != 0) dst += size; } else { dst = sbng1Ptr + 8; } ((SoundHE *)_sound)->_heChannel[chan].codeOffs = sbng1Ptr - snd1Ptr + 8; tmp = sbng2Ptr + 8; while ((offs = READ_LE_UINT16(tmp)) != 0) { tmp += offs; } src = sbng2Ptr + 8; len = tmp - sbng2Ptr - 6; memcpy(dst, src, len); int32 time; while ((size = READ_LE_UINT16(dst)) != 0) { time = READ_LE_UINT32(dst + 2); time += _sndTmrOffs; WRITE_LE_UINT32(dst + 2, time); dst += size; } } if (findSoundTag(MKTAG('d','a','t','a'), snd1Ptr)) { sdat1Ptr = findSoundTag(MKTAG('d','a','t','a'), snd1Ptr); assert(sdat1Ptr); sdat2Ptr = findSoundTag(MKTAG('d','a','t','a'), snd2Ptr); assert(sdat2Ptr); if (!_sndDataSize) _sndDataSize = READ_LE_UINT32(sdat1Ptr + 4) - 8; sdat2size = READ_LE_UINT32(sdat2Ptr + 4) - 8; } else { sdat1Ptr = heFindResource(MKTAG('S','D','A','T'), snd1Ptr); assert(sdat1Ptr); sdat2Ptr = heFindResource(MKTAG('S','D','A','T'), snd2Ptr); assert(sdat2Ptr); _sndDataSize = READ_BE_UINT32(sdat1Ptr + 4) - 8; sdat2size = READ_BE_UINT32(sdat2Ptr + 4) - 8; } sdat1size = _sndDataSize - _sndPtrOffs; if (sdat2size < sdat1size) { src = sdat2Ptr + 8; dst = sdat1Ptr + 8 + _sndPtrOffs; len = sdat2size; memcpy(dst, src, len); _sndPtrOffs += sdat2size; _sndTmrOffs += sdat2size; } else { src = sdat2Ptr + 8; dst = sdat1Ptr + 8 + _sndPtrOffs; len = sdat1size; memcpy(dst, src, len); if (sdat2size != sdat1size) { src = sdat2Ptr + 8 + sdat1size; dst = sdat1Ptr + 8; len = sdat2size - sdat1size; memcpy(dst, src, len); } _sndPtrOffs = sdat2size - sdat1size; _sndTmrOffs += sdat2size; } }