diff options
author | Max Horn | 2002-09-29 17:34:00 +0000 |
---|---|---|
committer | Max Horn | 2002-09-29 17:34:00 +0000 |
commit | 9926433cc1b316a01bae6d9d590b121968d3d8ad (patch) | |
tree | 720e3a963eeedc50212f4474ba7c36e5f72d2e08 | |
parent | 2081e89c140616edc0b383025803d91d0bec4b84 (diff) | |
download | scummvm-rg350-9926433cc1b316a01bae6d9d590b121968d3d8ad.tar.gz scummvm-rg350-9926433cc1b316a01bae6d9d590b121968d3d8ad.tar.bz2 scummvm-rg350-9926433cc1b316a01bae6d9d590b121968d3d8ad.zip |
patch #616195
svn-id: r5039
-rw-r--r-- | scumm/resource.cpp | 86 |
1 files changed, 47 insertions, 39 deletions
diff --git a/scumm/resource.cpp b/scumm/resource.cpp index 2b3d0818b8..b000c355be 100644 --- a/scumm/resource.cpp +++ b/scumm/resource.cpp @@ -929,8 +929,13 @@ int Scumm::readSoundResourceSmallHeader(int type, int idx) } /* copy the instrument data in another memory area */ - instr = (byte *)calloc(8 * 16, 1); - memcpy(instr, ptr + 0x19, 8*16); + if (size >= 0x19 + 8*16) { + instr = (byte *)calloc(8 * 16, 1); + if (instr) + memcpy(instr, ptr + 0x19, 8*16); + } else { + instr = 0; + } ptr += skip; // size + instruments size -= skip; // drop instruments for now @@ -976,55 +981,58 @@ int Scumm::readSoundResourceSmallHeader(int type, int idx) *ptr++ = (byte)(dw & 0xFF); memcpy(ptr, OLD256_MIDI_HACK, sizeof(OLD256_MIDI_HACK) - 1); - /* now fill in the instruments */ - for (int i = 0; i < 8; i++) { + if (instr) { - /* flags_1 */ - ptr[95 * i + 30 + 0] = (instr[i * 16 + 3] >> 4) & 0xf; - ptr[95 * i + 30 + 1] = instr[i * 16 + 3] & 0xf; + /* now fill in the instruments */ + for (int i = 0; i < 8; i++) { - /* oplvl_1 */ - ptr[95 * i + 30 + 2] = (instr[i * 16 + 4] >> 4) & 0xf; - ptr[95 * i + 30 + 3] = instr[i * 16 + 4] & 0xf; + /* flags_1 */ + ptr[95 * i + 30 + 0] = (instr[i * 16 + 3] >> 4) & 0xf; + ptr[95 * i + 30 + 1] = instr[i * 16 + 3] & 0xf; - /* atdec_1 */ - ptr[95 * i + 30 + 4] = ((~instr[i * 16 + 5]) >> 4) & 0xf; - ptr[95 * i + 30 + 5] = (~instr[i * 16 + 5]) & 0xf; + /* oplvl_1 */ + ptr[95 * i + 30 + 2] = (instr[i * 16 + 4] >> 4) & 0xf; + ptr[95 * i + 30 + 3] = instr[i * 16 + 4] & 0xf; - /* sustrel_1 */ - ptr[95 * i + 30 + 6] = ((~instr[i * 16 + 6]) >> 4) & 0xf; - ptr[95 * i + 30 + 7] = (~instr[i * 16 + 6]) & 0xf; + /* atdec_1 */ + ptr[95 * i + 30 + 4] = ((~instr[i * 16 + 5]) >> 4) & 0xf; + ptr[95 * i + 30 + 5] = (~instr[i * 16 + 5]) & 0xf; - /* waveform_1 */ - ptr[95 * i + 30 + 8] = (instr[i * 16 + 7] >> 4) & 0xf; - ptr[95 * i + 30 + 9] = instr[i * 16 + 7] & 0xf; + /* sustrel_1 */ + ptr[95 * i + 30 + 6] = ((~instr[i * 16 + 6]) >> 4) & 0xf; + ptr[95 * i + 30 + 7] = (~instr[i * 16 + 6]) & 0xf; - /* flags_2 */ - ptr[95 * i + 30 + 10] = (instr[i * 16 + 8] >> 4) & 0xf; - ptr[95 * i + 30 + 11] = instr[i * 16 + 8] & 0xf; + /* waveform_1 */ + ptr[95 * i + 30 + 8] = (instr[i * 16 + 7] >> 4) & 0xf; + ptr[95 * i + 30 + 9] = instr[i * 16 + 7] & 0xf; - /* oplvl_2 */ - ptr[95 * i + 30 + 12] = 3; - ptr[95 * i + 30 + 13] = 0xF; + /* flags_2 */ + ptr[95 * i + 30 + 10] = (instr[i * 16 + 8] >> 4) & 0xf; + ptr[95 * i + 30 + 11] = instr[i * 16 + 8] & 0xf; - /* atdec_2 */ - ptr[95 * i + 30 + 14] = ((~instr[i * 16 + 10]) >> 4) & 0xf; - ptr[95 * i + 30 + 15] = (~instr[i * 16 + 10]) & 0xf; + /* oplvl_2 */ + ptr[95 * i + 30 + 12] = 3; + ptr[95 * i + 30 + 13] = 0xF; - /* sustrel_2 */ - ptr[95 * i + 30 + 16] = ((~instr[i * 16 + 11]) >> 4) & 0xf; - ptr[95 * i + 30 + 17] = (~instr[i * 16 + 11]) & 0xf; + /* atdec_2 */ + ptr[95 * i + 30 + 14] = ((~instr[i * 16 + 10]) >> 4) & 0xf; + ptr[95 * i + 30 + 15] = (~instr[i * 16 + 10]) & 0xf; - /* waveform_2 */ - ptr[95 * i + 30 + 18] = (instr[i * 16 + 12] >> 4) & 0xf; - ptr[95 * i + 30 + 19] = instr[i * 16 + 12] & 0xf; + /* sustrel_2 */ + ptr[95 * i + 30 + 16] = ((~instr[i * 16 + 11]) >> 4) & 0xf; + ptr[95 * i + 30 + 17] = (~instr[i * 16 + 11]) & 0xf; - /* feedback */ - ptr[95 * i + 30 + 20] = (instr[i * 16 + 2] >> 4) & 0xf; - ptr[95 * i + 30 + 21] = instr[i * 16 + 2] & 0xf; - } + /* waveform_2 */ + ptr[95 * i + 30 + 18] = (instr[i * 16 + 12] >> 4) & 0xf; + ptr[95 * i + 30 + 19] = instr[i * 16 + 12] & 0xf; - free(instr); + /* feedback */ + ptr[95 * i + 30 + 20] = (instr[i * 16 + 2] >> 4) & 0xf; + ptr[95 * i + 30 + 21] = instr[i * 16 + 2] & 0xf; + } + + free(instr); + } ptr += sizeof(OLD256_MIDI_HACK) - 1; memcpy(ptr, track, size); |