aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Horn2003-09-08 11:29:57 +0000
committerMax Horn2003-09-08 11:29:57 +0000
commitc5a3c1235c75d90c46707f819a13316948410482 (patch)
treeae05111f05837e2e0858058fc314e0c53e95f3cf
parent3156f0dd2f1e936d1d0d0e61229cb8efecc184b6 (diff)
downloadscummvm-rg350-c5a3c1235c75d90c46707f819a13316948410482.tar.gz
scummvm-rg350-c5a3c1235c75d90c46707f819a13316948410482.tar.bz2
scummvm-rg350-c5a3c1235c75d90c46707f819a13316948410482.zip
some cleanup
svn-id: r10084
-rw-r--r--scumm/player_v3a.cpp103
-rw-r--r--scumm/player_v3a.h3
-rw-r--r--scumm/resource.cpp19
3 files changed, 55 insertions, 70 deletions
diff --git a/scumm/player_v3a.cpp b/scumm/player_v3a.cpp
index 90fdb70d63..0ceb439786 100644
--- a/scumm/player_v3a.cpp
+++ b/scumm/player_v3a.cpp
@@ -38,12 +38,6 @@ unsigned short _notefreqs[4][12] = {
//
////////////////////////////////////////
-static void playerv3a_handler (void *engine) {
- Scumm *scumm = (Scumm *)engine;
- if (scumm && scumm->_playerV3A)
- scumm->_playerV3A->playMusic();
-}
-
Player_V3A::Player_V3A(Scumm *scumm) {
int i;
_scumm = scumm;
@@ -62,13 +56,13 @@ Player_V3A::Player_V3A(Scumm *scumm) {
_maxvol = 255;
- scumm->_timer->installProcedure(playerv3a_handler,16666);
+ scumm->_timer->installProcedure(timerHandler, 16666);
_isinit = false;
}
Player_V3A::~Player_V3A() {
- _scumm->_timer->releaseProcedure(playerv3a_handler);
+ _scumm->_timer->releaseProcedure(timerHandler);
if (!_isinit)
return;
for (int i = 0; _wavetable[i] != NULL; i++) {
@@ -152,66 +146,51 @@ void Player_V3A::startSound(int nr) {
byte *data = _scumm->getResourceAddress(rtSound, nr);
assert(data);
+ if (_scumm->_gameId != GID_INDY3 && _scumm->_gameId != GID_LOOM)
+ error("player_v3a - unknown game!");
+
if (!_isinit) {
int i;
+ unsigned char *ptr;
+ int offset = 4;
+ int numInstruments;
+
if (_scumm->_gameId == GID_INDY3) {
- unsigned char *ptr = _scumm->getResourceAddress(rtSound,83);
- int offset = 4;
- _wavetable = (instData **)malloc(13 * sizeof(void *));
- for (i = 0; i < 12; i++) {
- _wavetable[i] = (instData *)malloc(sizeof(instData));
- for (int j = 0; j < 6; j++) {
- int off, len;
- off = READ_BE_UINT16(ptr + offset + 0);
- _wavetable[i]->_ilen[j] = len = READ_BE_UINT16(ptr + offset + 2);
- if (len) {
- _wavetable[i]->_idat[j] = (char *)malloc(len);
- memcpy(_wavetable[i]->_idat[j],ptr + off,len);
- } else _wavetable[i]->_idat[j] = NULL;
- off = READ_BE_UINT16(ptr + offset + 4);
- _wavetable[i]->_llen[j] = len = READ_BE_UINT16(ptr + offset + 6);
- if (len) {
- _wavetable[i]->_ldat[j] = (char *)malloc(len);
- memcpy(_wavetable[i]->_ldat[j],ptr + off,len);
- } else _wavetable[i]->_ldat[j] = NULL;
- _wavetable[i]->_oct[j] = READ_BE_UINT16(ptr + offset + 8);
- offset += 10;
- }
+ ptr = _scumm->getResourceAddress(rtSound, 83);
+ numInstruments = 12;
+ } else {
+ ptr = _scumm->getResourceAddress(rtSound, 79);
+ numInstruments = 9;
+ }
+ _wavetable = (instData **)malloc((numInstruments + 1) * sizeof(void *));
+ for (i = 0; i < numInstruments; i++) {
+ _wavetable[i] = (instData *)malloc(sizeof(instData));
+ for (int j = 0; j < 6; j++) {
+ int off, len;
+ off = READ_BE_UINT16(ptr + offset + 0);
+ _wavetable[i]->_ilen[j] = len = READ_BE_UINT16(ptr + offset + 2);
+ if (len) {
+ _wavetable[i]->_idat[j] = (char *)malloc(len);
+ memcpy(_wavetable[i]->_idat[j],ptr + off,len);
+ } else _wavetable[i]->_idat[j] = NULL;
+ off = READ_BE_UINT16(ptr + offset + 4);
+ _wavetable[i]->_llen[j] = len = READ_BE_UINT16(ptr + offset + 6);
+ if (len) {
+ _wavetable[i]->_ldat[j] = (char *)malloc(len);
+ memcpy(_wavetable[i]->_ldat[j],ptr + off,len);
+ } else _wavetable[i]->_ldat[j] = NULL;
+ _wavetable[i]->_oct[j] = READ_BE_UINT16(ptr + offset + 8);
+ offset += 10;
+ }
+ if (_scumm->_gameId == GID_INDY3) {
_wavetable[i]->_pitadjust = 0;
offset += 2;
- }
- _wavetable[i] = NULL;
- }
- else if (_scumm->_gameId == GID_LOOM) {
- unsigned char *ptr = _scumm->getResourceAddress(rtSound,79);
- int offset = 4;
- _wavetable = (instData **)malloc(10 * sizeof(void *));
- for (i = 0; i < 9; i++) {
- _wavetable[i] = (instData *)malloc(sizeof(instData));
- for (int j = 0; j < 6; j++) {
- int off, len;
- off = READ_BE_UINT16(ptr + offset + 0);
- _wavetable[i]->_ilen[j] = len = READ_BE_UINT16(ptr + offset + 2);
- if (len) {
- _wavetable[i]->_idat[j] = (char *)malloc(len);
- memcpy(_wavetable[i]->_idat[j],ptr + off,len);
- } else _wavetable[i]->_idat[j] = NULL;
- off = READ_BE_UINT16(ptr + offset + 4);
- _wavetable[i]->_llen[j] = len = READ_BE_UINT16(ptr + offset + 6);
- if (len) {
- _wavetable[i]->_ldat[j] = (char *)malloc(len);
- memcpy(_wavetable[i]->_ldat[j],ptr + off,len);
- } else _wavetable[i]->_ldat[j] = NULL;
- _wavetable[i]->_oct[j] = READ_BE_UINT16(ptr + offset + 8);
- offset += 10;
- }
+ } else {
_wavetable[i]->_pitadjust = READ_BE_UINT16(ptr + offset + 2);
offset += 4;
}
- _wavetable[i] = NULL;
}
- else
- error("player_v3a - unknown game!");
+ _wavetable[i] = NULL;
_isinit = true;
}
@@ -249,6 +228,12 @@ void Player_V3A::startSound(int nr) {
}
}
+void Player_V3A::timerHandler(void *engine) {
+ Scumm *scumm = (Scumm *)engine;
+ if (scumm && scumm->_playerV3A)
+ scumm->_playerV3A->playMusic();
+}
+
void Player_V3A::playMusic() {
int i;
for (i = 0; i < V3A_MAXCHANS; i++)
diff --git a/scumm/player_v3a.h b/scumm/player_v3a.h
index 23df188f94..5a1edd7e1c 100644
--- a/scumm/player_v3a.h
+++ b/scumm/player_v3a.h
@@ -44,7 +44,6 @@ public:
virtual void stopAllSounds();
virtual int getMusicTimer() const;
- virtual void playMusic();
virtual int getSoundStatus(int nr) const;
protected:
@@ -75,6 +74,8 @@ protected:
} **_wavetable;
void playSound (int nr, char *data, int size, int rate, int vol, int tl, bool looped, int loopStart = 0, int loopEnd = 0);
+ void playMusic();
+ static void timerHandler(void *engine);
};
#endif
diff --git a/scumm/resource.cpp b/scumm/resource.cpp
index fb3aadfe83..cefda53379 100644
--- a/scumm/resource.cpp
+++ b/scumm/resource.cpp
@@ -1026,22 +1026,21 @@ int Scumm::convertADResource(int type, int idx, byte * src_ptr, int size) {
byte num_instr;
byte *channel, *instr, *track;
byte *tracks[3];
- int ppqn;
+ // We will ignore the PPQN in the original resource, because
+ // it's invalid anyway. We use a constant PPQN of 480.
+ const int ppqn = 480;
int delay, delay2, olddelay;
int i, ch;
int total_size = 8 + 16 + 14 + 8 + 7 + 8*sizeof(ADLIB_INSTR_MIDI_HACK) + size;
total_size += 24; // Up to 24 additional bytes are needed for the jump sysex
ptr = createResource(type, idx, total_size);
- // We will ignore the PPQN in the original resource, because
- // it's invalid anyway. We use a constant PPQN of 480.
- ppqn = 480;
src_ptr += 2;
size -= 2;
if (*src_ptr == 0x80) {
- // 0x80: is music; otherwise not.
+ // 0x80 marks a music resource. Otherwise it's a SFX
memcpy(ptr, "ADL ", 4); ptr += 4;
uint32 dw = READ_BE_UINT32(&total_size);
memcpy(ptr, &dw, 4); ptr += 4;
@@ -1087,11 +1086,12 @@ int Scumm::convertADResource(int type, int idx, byte * src_ptr, int size) {
// Unfortunate LOOM and INDY3 have different interpretation
// of the ticks value.
if (_gameId == GID_INDY3) {
- dw = 1000000 * 256 / 473 * ppqn / 2 / ticks;
+ // Note: since we fix ppqn at 480, ppqn/473 is almost 1
+ dw = 500000 * 256 * ppqn / 473 / ticks;
} else if (_gameId == GID_LOOM) {
- dw = 1000000 * ppqn / 4 / 2 / ticks;
+ dw = 500000 * ppqn / 4 / ticks;
} else {
- dw = (500000 * 256) / ticks;
+ dw = 500000 * 256 / ticks;
}
debug(4, " ticks = %d, speed = %ld", ticks, dw);
@@ -1295,7 +1295,7 @@ int Scumm::convertADResource(int type, int idx, byte * src_ptr, int size) {
break;
src_ptr = tracks[ch];
- chunk_type = *(src_ptr);
+ chunk_type = *src_ptr;
if (current_note[ch] >= 0) {
@@ -1380,7 +1380,6 @@ int Scumm::convertADResource(int type, int idx, byte * src_ptr, int size) {
delay = mintime - curtime;
curtime = mintime;
-
{
delay = convert_extraflags(ptr + 30 + 22, src_ptr + 1);