[Scummvm-cvs-logs] SF.net SVN: scummvm: [30494] scummvm/trunk/engines/scumm/imuse_digi
aquadran at users.sourceforge.net
aquadran at users.sourceforge.net
Tue Jan 15 13:51:27 CET 2008
Revision: 30494
http://scummvm.svn.sourceforge.net/scummvm/?rev=30494&view=rev
Author: aquadran
Date: 2008-01-15 04:51:26 -0800 (Tue, 15 Jan 2008)
Log Message:
-----------
implement loading markers "exit". dumped version 3 for compressed bun files, compress tools are not ready
Modified Paths:
--------------
scummvm/trunk/engines/scumm/imuse_digi/dimuse_sndmgr.cpp
scummvm/trunk/engines/scumm/imuse_digi/dimuse_sndmgr.h
Modified: scummvm/trunk/engines/scumm/imuse_digi/dimuse_sndmgr.cpp
===================================================================
--- scummvm/trunk/engines/scumm/imuse_digi/dimuse_sndmgr.cpp 2008-01-15 12:28:56 UTC (rev 30493)
+++ scummvm/trunk/engines/scumm/imuse_digi/dimuse_sndmgr.cpp 2008-01-15 12:51:26 UTC (rev 30494)
@@ -58,19 +58,23 @@
delete _cacheBundleDir;
}
-void ImuseDigiSndMgr::countElements(byte *ptr, int &numRegions, int &numJumps, int &numSyncs) {
+void ImuseDigiSndMgr::countElements(byte *ptr, int &numRegions, int &numJumps, int &numSyncs, int &numMarkers) {
uint32 tag;
int32 size = 0;
do {
tag = READ_BE_UINT32(ptr); ptr += 4;
switch (tag) {
- case MKID_BE('TEXT'):
case MKID_BE('STOP'):
case MKID_BE('FRMT'):
case MKID_BE('DATA'):
size = READ_BE_UINT32(ptr); ptr += size + 4;
break;
+ case MKID_BE('TEXT'):
+ if (!scumm_stricmp((const char *)(ptr + 8), "exit"))
+ numMarkers++;
+ size = READ_BE_UINT32(ptr); ptr += size + 4;
+ break;
case MKID_BE('REGN'):
numRegions++;
size = READ_BE_UINT32(ptr); ptr += size + 4;
@@ -96,8 +100,8 @@
uint32 tag = file->readUint32BE();
assert(tag == MKID_BE('RMAP'));
int32 version = file->readUint32BE();
- if (version != 2) {
- error("ImuseDigiSndMgr::prepareSoundFromRMAP: Wrong version number, expected 2, but it's: %d.", version);
+ if (version != 3) {
+ error("ImuseDigiSndMgr::prepareSoundFromRMAP: Wrong version number, expected 3, but it's: %d.", version);
}
sound->bits = file->readUint32BE();
sound->freq = file->readUint32BE();
@@ -105,12 +109,16 @@
sound->numRegions = file->readUint32BE();
sound->numJumps = file->readUint32BE();
sound->numSyncs = file->readUint32BE();
+ sound->numMarkers = file->readUint32BE();
sound->region = new Region[sound->numRegions];
assert(sound->region);
sound->jump = new Jump[sound->numJumps];
assert(sound->jump);
sound->sync = new Sync[sound->numSyncs];
assert(sound->sync);
+ sound->marker = new Marker[sound->numMarkers];
+ assert(sound->marker);
+
for (l = 0; l < sound->numRegions; l++) {
sound->region[l].offset = file->readUint32BE();
sound->region[l].length = file->readUint32BE();
@@ -126,6 +134,12 @@
sound->sync[l].ptr = (byte *)malloc(sound->sync[l].size);
file->read(sound->sync[l].ptr, sound->sync[l].size);
}
+ for (l = 0; l < sound->numMarkers; l++) {
+ sound->marker[l].pos = file->readUint32BE();
+ sound->marker[l].length = file->readUint32BE();
+ sound->marker[l].ptr = new char[sound->marker[l].length];
+ file->read(sound->marker[l].ptr, sound->marker[l].length);
+ }
}
void ImuseDigiSndMgr::prepareSound(byte *ptr, SoundDesc *sound) {
@@ -207,17 +221,21 @@
int curIndexRegion = 0;
int curIndexJump = 0;
int curIndexSync = 0;
+ int curIndexMarker = 0;
sound->numRegions = 0;
sound->numJumps = 0;
sound->numSyncs = 0;
- countElements(ptr, sound->numRegions, sound->numJumps, sound->numSyncs);
+ sound->numMarkers = 0;
+ countElements(ptr, sound->numRegions, sound->numJumps, sound->numSyncs, sound->numMarkers);
sound->region = new Region[sound->numRegions];
assert(sound->region);
sound->jump = new Jump[sound->numJumps];
assert(sound->jump);
sound->sync = new Sync[sound->numSyncs];
assert(sound->sync);
+ sound->marker = new Marker[sound->numMarkers];
+ assert(sound->marker);
do {
tag = READ_BE_UINT32(ptr); ptr += 4;
@@ -229,6 +247,15 @@
sound->channels = READ_BE_UINT32(ptr); ptr += 4;
break;
case MKID_BE('TEXT'):
+ if (!scumm_stricmp((const char *)(ptr + 8), "exit")) {
+ sound->marker[curIndexRegion].pos = READ_BE_UINT32(ptr + 4);
+ sound->marker[curIndexRegion].length = strlen((const char *)(ptr + 8)) + 1;
+ sound->marker[curIndexRegion].ptr = new char[sound->marker[curIndexRegion].length];
+ strcpy(sound->marker[curIndexRegion].ptr, (const char *)(ptr + 8));
+ curIndexMarker++;
+ }
+ size = READ_BE_UINT32(ptr); ptr += size + 4;
+ break;
case MKID_BE('STOP'):
size = READ_BE_UINT32(ptr); ptr += size + 4;
break;
@@ -451,6 +478,7 @@
delete[] soundDesc->region;
delete[] soundDesc->jump;
delete[] soundDesc->sync;
+ delete[] soundDesc->marker;
memset(soundDesc, 0, sizeof(SoundDesc));
}
Modified: scummvm/trunk/engines/scumm/imuse_digi/dimuse_sndmgr.h
===================================================================
--- scummvm/trunk/engines/scumm/imuse_digi/dimuse_sndmgr.h 2008-01-15 12:28:56 UTC (rev 30493)
+++ scummvm/trunk/engines/scumm/imuse_digi/dimuse_sndmgr.h 2008-01-15 12:51:26 UTC (rev 30494)
@@ -65,6 +65,12 @@
byte *ptr; // pointer to sync
};
+ struct Marker {
+ int32 pos; // position Markaer in sound data
+ int32 length; // length of marker string
+ char *ptr; // pointer to string
+ };
+
public:
struct SoundDesc {
@@ -81,6 +87,9 @@
int numSyncs; // number of Syncs
Sync *sync;
+ int numMarkers; // number of Markers
+ Marker *marker;
+
bool endFlag;
bool inUse;
byte *allData;
@@ -113,7 +122,7 @@
bool openMusicBundle(SoundDesc *sound, int &disk);
bool openVoiceBundle(SoundDesc *sound, int &disk);
- void countElements(byte *ptr, int &numRegions, int &numJumps, int &numSyncs);
+ void countElements(byte *ptr, int &numRegions, int &numJumps, int &numSyncs, int &numMarkers);
public:
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list