diff options
author | Max Horn | 2003-09-08 11:29:57 +0000 |
---|---|---|
committer | Max Horn | 2003-09-08 11:29:57 +0000 |
commit | c5a3c1235c75d90c46707f819a13316948410482 (patch) | |
tree | ae05111f05837e2e0858058fc314e0c53e95f3cf | |
parent | 3156f0dd2f1e936d1d0d0e61229cb8efecc184b6 (diff) | |
download | scummvm-rg350-c5a3c1235c75d90c46707f819a13316948410482.tar.gz scummvm-rg350-c5a3c1235c75d90c46707f819a13316948410482.tar.bz2 scummvm-rg350-c5a3c1235c75d90c46707f819a13316948410482.zip |
some cleanup
svn-id: r10084
-rw-r--r-- | scumm/player_v3a.cpp | 103 | ||||
-rw-r--r-- | scumm/player_v3a.h | 3 | ||||
-rw-r--r-- | scumm/resource.cpp | 19 |
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); |