aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/resource.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/resource.cpp')
-rw-r--r--engines/sci/resource.cpp81
1 files changed, 81 insertions, 0 deletions
diff --git a/engines/sci/resource.cpp b/engines/sci/resource.cpp
index 1a8f819926..e5fc218e0e 100644
--- a/engines/sci/resource.cpp
+++ b/engines/sci/resource.cpp
@@ -1808,4 +1808,85 @@ bool ResourceManager::hasSci1Voc900() {
return offset == res->size;
}
+#ifndef USE_OLD_MUSIC_FUNCTIONS
+
+SoundResource::SoundResource(uint32 resNumber, ResourceManager *resMan) : _resMan(resMan) {
+ Resource *res = resNumber ? _resMan->findResource(ResourceId(kResourceTypeSound, resNumber), true) : NULL;
+ if (!res)
+ return;
+
+ _innerResource = res;
+
+ byte *ptr = res->data, *p1;
+ tagChannel *pCh;
+ // count # of tracks
+ nTracks = 0;
+ while ((*ptr++) != 0xFF) {
+ nTracks++;
+ while (*ptr != 0xFF)
+ ptr += 6;
+ ptr++;
+ }
+ aTracks = new tagTrack[nTracks];
+ ptr = res->data;
+ for (int i = 0; i < nTracks; i++) {
+ aTracks[i].type = (kTrackType) * ptr++;
+ // counting # of channels used
+ p1 = ptr;
+ aTracks[i].nChannels = 0;
+ while (*p1 != 0xFF) {
+ p1 += 6;
+ aTracks[i].nChannels++;
+ }
+ aTracks[i].aChannels = new tagChannel[aTracks[i].nChannels];
+ if (aTracks[i].type != 0xF0) // digital track marker - not supported at time
+ {
+ aTracks[i].nDigital = 0xFF; // meanwhile - no ditigal channel associated
+ for (int j = 0; j < aTracks[i].nChannels; j++) {
+ pCh = &aTracks[i].aChannels[j];
+ pCh->unk = READ_LE_UINT16(ptr);
+ pCh->ptr = res->data + READ_LE_UINT16(ptr + 2) + 2;
+ pCh->size = READ_LE_UINT16(ptr + 4) - 2; // not counting channel header
+ pCh->number = *(pCh->ptr - 2);
+ pCh->poly = *(pCh->ptr - 1);
+ pCh->time = pCh->prev = 0;
+ if (pCh->number == 0xFE) // digital channel
+ aTracks[i].nDigital = j;
+ ptr += 6;
+ }
+ }
+ ptr++; // skipping 0xFF that closes channels list
+ }
+ /*
+ digital track ->ptr points to header:
+ [w] sample rate
+ [w] size
+ [w] ? 00 00 maybe compression flag
+ [w] ? size again - decompressed size maybe
+ */
+}
+//----------------------------------------------------
+SoundResource::~SoundResource() {
+ for (int i = 0; i < nTracks; i++)
+ delete[] aTracks[i].aChannels;
+ delete[] aTracks;
+
+ _resMan->unlockResource(_innerResource);
+}
+//----------------------------------------------------
+SoundResource::tagTrack* SoundResource::getTrackByNumber(uint16 number) {
+ if (/*number >= 0 &&*/number < nTracks)
+ return &aTracks[number];
+ return NULL;
+}
+
+SoundResource::tagTrack* SoundResource::getTrackByType(kTrackType type) {
+ for (int i = 0; i < nTracks; i++)
+ if (aTracks[i].type == type)
+ return &aTracks[i];
+ return NULL;
+}
+
+#endif
+
} // End of namespace Sci