diff options
author | Paweł Kołodziejski | 2004-02-14 15:14:30 +0000 |
---|---|---|
committer | Paweł Kołodziejski | 2004-02-14 15:14:30 +0000 |
commit | abdb4fbe8784593d57e8e80afe8196a8cfc50dc8 (patch) | |
tree | 0309a496ccc4157f6517a2e921684ca1b1847a96 | |
parent | 0459089ca8da0b5b735e5708ad878b690373d3cf (diff) | |
download | scummvm-rg350-abdb4fbe8784593d57e8e80afe8196a8cfc50dc8.tar.gz scummvm-rg350-abdb4fbe8784593d57e8e80afe8196a8cfc50dc8.tar.bz2 scummvm-rg350-abdb4fbe8784593d57e8e80afe8196a8cfc50dc8.zip |
fixed bug #892426 - improved FT sound loops
svn-id: r12886
-rw-r--r-- | scumm/imuse_digi/dimuse.cpp | 13 | ||||
-rw-r--r-- | scumm/imuse_digi/dimuse_sndmgr.cpp | 20 | ||||
-rw-r--r-- | sound/voc.cpp | 10 | ||||
-rw-r--r-- | sound/voc.h | 2 |
4 files changed, 25 insertions, 20 deletions
diff --git a/scumm/imuse_digi/dimuse.cpp b/scumm/imuse_digi/dimuse.cpp index aa81af9c35..95ed94c433 100644 --- a/scumm/imuse_digi/dimuse.cpp +++ b/scumm/imuse_digi/dimuse.cpp @@ -208,19 +208,6 @@ void IMuseDigital::callback() { void IMuseDigital::switchToNextRegion(int track) { int num_regions = _sound->getNumRegions(_track[track].soundHandle); - int num_jumps = _sound->getNumJumps(_track[track].soundHandle); - if (_vm->_gameId == GID_FT) { - if (_track[track].curRegion == -1) { - _track[track].curRegion = 0; - _track[track].regionOffset = 0; - return; - } - if (num_jumps != 0) - _track[track].regionOffset = 0; - else - _track[track].toBeRemoved = true; - return; - } if (++_track[track].curRegion == num_regions) { _track[track].toBeRemoved = true; diff --git a/scumm/imuse_digi/dimuse_sndmgr.cpp b/scumm/imuse_digi/dimuse_sndmgr.cpp index 6ea582b5c5..9d6201a755 100644 --- a/scumm/imuse_digi/dimuse_sndmgr.cpp +++ b/scumm/imuse_digi/dimuse_sndmgr.cpp @@ -49,16 +49,30 @@ ImuseDigiSndMgr::~ImuseDigiSndMgr() { void ImuseDigiSndMgr::prepareSound(byte *ptr, int slot) { if (READ_UINT32(ptr) == MKID('Crea')) { - int size = 0, rate = 0, loops = 0; - _sounds[slot].resPtr = readVOCFromMemory(ptr, size, rate, loops); + int size = 0, rate = 0, loops = 0, begin_loop = 0, end_loop = 0; + _sounds[slot].resPtr = readVOCFromMemory(ptr, size, rate, loops, begin_loop, end_loop); _sounds[slot].freeResPtr = true; _sounds[slot].bits = 8; _sounds[slot].freq = rate; _sounds[slot].channels = 1; + _sounds[slot].region[0].offset = 0; _sounds[slot].region[0].length = size; _sounds[slot].numRegions++; - if (loops != 0) + if (loops != 0) { + if (begin_loop == 0) { + _sounds[slot].region[1].offset = end_loop; + _sounds[slot].numRegions++; + } else { + _sounds[slot].region[0].length = begin_loop; + _sounds[slot].region[1].offset = begin_loop; + _sounds[slot].region[1].length = end_loop - begin_loop; + _sounds[slot].region[2].offset = end_loop; + _sounds[slot].numRegions += 2; + } + _sounds[slot].jump[0].dest = begin_loop; + _sounds[slot].jump[0].offset = end_loop; _sounds[slot].numJumps++; + } } else if (READ_UINT32(ptr) == MKID('iMUS')) { uint32 tag; int32 size = 0; diff --git a/sound/voc.cpp b/sound/voc.cpp index ef1741111f..f1f4fa7727 100644 --- a/sound/voc.cpp +++ b/sound/voc.cpp @@ -41,7 +41,7 @@ int getSampleRateFromVOCRate(int vocSR) { } } -byte *readVOCFromMemory(byte *ptr, int &size, int &rate, int &loops) { +byte *readVOCFromMemory(byte *ptr, int &size, int &rate, int &loops, int &begin_loop, int &end_loop) { assert(memcmp(ptr, "Creative Voice File\x1A", 20) == 0); int32 offset = READ_LE_UINT16(ptr + 20); @@ -53,6 +53,8 @@ byte *readVOCFromMemory(byte *ptr, int &size, int &rate, int &loops) { bool quit = false; byte *ret_sound = 0; size = 0; + begin_loop = 0; + end_loop = 0; while (!quit) { int len = READ_LE_UINT32(ptr + offset); @@ -76,7 +78,9 @@ byte *readVOCFromMemory(byte *ptr, int &size, int &rate, int &loops) { ret_sound = (byte *)malloc(len); } memcpy(ret_sound + size, ptr + offset, len); + begin_loop = size; size += len; + end_loop = size; } else { warning("VOC file packing %d unsupported", packing); } @@ -153,8 +157,8 @@ byte *loadVOCFile(File *file, int &size, int &rate) { } AudioStream *makeVOCStream(byte *ptr) { - int size, rate, loops; - byte *data = readVOCFromMemory(ptr, size, rate, loops); + int size, rate, loops, begin_loop, end_loop; + byte *data = readVOCFromMemory(ptr, size, rate, loops, begin_loop, end_loop); if (!data) return 0; diff --git a/sound/voc.h b/sound/voc.h index a83401ecaa..878078fe56 100644 --- a/sound/voc.h +++ b/sound/voc.h @@ -57,7 +57,7 @@ struct VocBlockHeader { */ extern int getSampleRateFromVOCRate(int vocSR); -extern byte *readVOCFromMemory(byte *ptr, int &size, int &rate, int &loops); +extern byte *readVOCFromMemory(byte *ptr, int &size, int &rate, int &loops, int &begin_loop, int &end_loop); extern byte *loadVOCFile(File *file, int &size, int &rate); AudioStream *makeVOCStream(byte *ptr); |