diff options
author | Jochen Hoenicke | 2003-08-15 13:58:54 +0000 |
---|---|---|
committer | Jochen Hoenicke | 2003-08-15 13:58:54 +0000 |
commit | f86a8cd38be74bf0b714df0bf81684849462c6ad (patch) | |
tree | eadfb6f07982caf79c5d04d856cb6f9f9eb44f37 /scumm | |
parent | 185d56369055faa2f1a28f6af1ce2e464fab4e84 (diff) | |
download | scummvm-rg350-f86a8cd38be74bf0b714df0bf81684849462c6ad.tar.gz scummvm-rg350-f86a8cd38be74bf0b714df0bf81684849462c6ad.tar.bz2 scummvm-rg350-f86a8cd38be74bf0b714df0bf81684849462c6ad.zip |
implement the PCjr chunk 1 sounds.
svn-id: r9706
Diffstat (limited to 'scumm')
-rw-r--r-- | scumm/player_v1.cpp | 79 | ||||
-rw-r--r-- | scumm/player_v1.h | 4 |
2 files changed, 76 insertions, 7 deletions
diff --git a/scumm/player_v1.cpp b/scumm/player_v1.cpp index 4d98413adb..6e8faacbaf 100644 --- a/scumm/player_v1.cpp +++ b/scumm/player_v1.cpp @@ -265,10 +265,6 @@ void Player_V1::parsePCjrChunk() { _next_chunk += 2; switch (_chunk_type) { - case 1: /* FIXME: implement! */ - warning("Unimplemented PCjr chunk in sound %d:", _current_nr); - hexdump(_next_chunk-2, 160); - /* fall through*/ case 0xffff: for (i = 0; i < 4; ++i) clear_channel(i); @@ -310,6 +306,49 @@ void Player_V1::parsePCjrChunk() { _channels[i].cmd_ptr = _current_data + tmp + 10; } break; + case 1: /* FIXME: implement! */ + set_mplex(READ_LE_UINT16(_next_chunk)); + tmp = READ_LE_UINT16(_next_chunk + 2); + _channels[0].cmd_ptr = tmp != 0xffff ? _current_data + tmp : NULL; + tmp = READ_LE_UINT16(_next_chunk + 4); + _start = READ_LE_UINT16(_next_chunk + 6); + _delta = (int16) READ_LE_UINT16(_next_chunk + 8); + _time_left = READ_LE_UINT16(_next_chunk + 10); + _next_chunk += 12; + if (tmp >= 0xe0) { + _channels[3].freq = tmp & 0xf; + _value_ptr = &_channels[3].volume; + } else { + assert(!(tmp & 0x10)); + tmp = (tmp & 0x60) >> 5; + _value_ptr = &_channels[tmp].freq; + _channels[tmp].volume = 0; + } + *_value_ptr = _start; + if (_channels[0].cmd_ptr) { + tmp = READ_LE_UINT16(_channels[0].cmd_ptr); + _start_2 = READ_LE_UINT16(_channels[0].cmd_ptr + 2); + _delta_2 = (int16) READ_LE_UINT16(_channels[0].cmd_ptr + 4); + _time_left_2 = READ_LE_UINT16(_channels[0].cmd_ptr + 6); + _channels[0].cmd_ptr += 8; + if (_value_ptr == &_channels[3].volume) { + tmp = (tmp & 0x70) >> 4; + if (tmp & 1) + _value_ptr_2 = &_channels[tmp >> 1].volume; + else + _value_ptr_2 = &_channels[tmp >> 1].freq; + } else { + assert(!(tmp & 0x10)); + tmp = (tmp & 0x60) >> 5; + _value_ptr_2 = &_channels[tmp].freq; + _channels[tmp].volume = 0; + } + *_value_ptr_2 = _start_2; + } + debug(6, "chunk 1: %d: %d step %d for %d, %d: %d step %d for %d", + _value_ptr - (uint*)_channels, _start, _delta, _time_left, + _value_ptr_2 - (uint*)_channels, _start_2, _delta_2, _time_left_2); + break; case 2: _start = READ_LE_UINT16(_next_chunk); @@ -398,6 +437,36 @@ void Player_V1::nextPCjrCmd() { break; case 1: + _start += _delta; + *_value_ptr = _start; + if (!--_time_left) { + _start = READ_LE_UINT16(_next_chunk); + _next_chunk += 2; + if (_start == 0xffff) { + parsePCjrChunk(); + return; + } + _delta = (int16) READ_LE_UINT16(_next_chunk); + _time_left = READ_LE_UINT16(_next_chunk + 2); + _next_chunk += 4; + *_value_ptr = _start; + } + + if (_channels[0].cmd_ptr) { + _start_2 += _delta_2; + *_value_ptr_2 = _start_2; + if (!--_time_left_2) { + _start_2 = READ_LE_UINT16(_channels[0].cmd_ptr); + if (_start_2 == 0xffff) { + _next_chunk = _channels[0].cmd_ptr + 2; + parsePCjrChunk(); + return; + } + _delta_2 = (int16) READ_LE_UINT16(_channels[0].cmd_ptr + 2); + _time_left_2 = READ_LE_UINT16(_channels[0].cmd_ptr + 4); + _channels[0].cmd_ptr += 6; + } + } break; case 2: @@ -522,7 +591,7 @@ void Player_V1::generatePCjrSamples(int16 *data, uint len) { for (i = 0; i < 4; i++) { freq = _channels[i].freq; vol = _channels[i].volume; - if (!freq || !_volumetable[_channels[i].volume]) { + if (!_volumetable[_channels[i].volume]) { _timer_count[i] -= len << FIXP_SHIFT; if (_timer_count[i] < 0) _timer_count[i] = 0; diff --git a/scumm/player_v1.h b/scumm/player_v1.h index 6560078d83..ceefe1c15a 100644 --- a/scumm/player_v1.h +++ b/scumm/player_v1.h @@ -80,15 +80,15 @@ private: uint _freq_current; uint _forced_level; uint16 _random_lsr; - uint _channel; + uint *_value_ptr; uint _time_left; uint _start; uint _end; int _delta; + uint *_value_ptr_2; uint _time_left_2; uint _start_2; int _delta_2; - uint _channel_2; }; #endif |