diff options
author | Paweł Kołodziejski | 2002-10-08 07:30:50 +0000 |
---|---|---|
committer | Paweł Kołodziejski | 2002-10-08 07:30:50 +0000 |
commit | 42089431bda5429315b3ba360f9d08440ccc1588 (patch) | |
tree | 4d50bf26f39708c85ccf8c90478cbf7c41c5c62d /scumm | |
parent | b409ef66089dbc8d42c97c6721ace798b3a1feab (diff) | |
download | scummvm-rg350-42089431bda5429315b3ba360f9d08440ccc1588.tar.gz scummvm-rg350-42089431bda5429315b3ba360f9d08440ccc1588.tar.bz2 scummvm-rg350-42089431bda5429315b3ba360f9d08440ccc1588.zip |
synced with local sources (imuse)
svn-id: r5107
Diffstat (limited to 'scumm')
-rw-r--r-- | scumm/imuse.cpp | 76 | ||||
-rw-r--r-- | scumm/imuse.h | 4 | ||||
-rw-r--r-- | scumm/script_v2.cpp | 6 | ||||
-rw-r--r-- | scumm/smush/scumm_renderer.cpp | 4 |
4 files changed, 68 insertions, 22 deletions
diff --git a/scumm/imuse.cpp b/scumm/imuse.cpp index 1be6f57ffb..c90fa4c6c6 100644 --- a/scumm/imuse.cpp +++ b/scumm/imuse.cpp @@ -4866,6 +4866,35 @@ void IMuseDigital::handler() { continue; } + if (_channel[l]._volumeFade != -1) { + if (_channel[l]._volumeFadeStep < 0) { + if (_channel[l]._volume > _channel[l]._volumeFade) { + _channel[l]._volume += _channel[l]._volumeFadeStep; + _channel[l]._volumeRight += _channel[l]._volumeFadeStep; + if (_channel[l]._volume < _channel[l]._volumeFade) { + _channel[l]._volume = _channel[l]._volumeFade; + } + if (_channel[l]._volumeRight < _channel[l]._volumeFade) { + _channel[l]._volumeRight = _channel[l]._volumeFade; + } + if ((_channel[l]._volume == 0) && (_channel[l]._volumeRight == 0)) { + _channel[l]._toBeRemoved = true; + } + } + } else if (_channel[l]._volumeFadeStep > 0) { + if (_channel[l]._volume < _channel[l]._volumeFade) { + _channel[l]._volume += _channel[l]._volumeFadeStep; + _channel[l]._volumeRight += _channel[l]._volumeFadeStep; + if (_channel[l]._volume > _channel[l]._volumeFade) { + _channel[l]._volume = _channel[l]._volumeFade; + } + if (_channel[l]._volumeRight > _channel[l]._volumeFade) { + _channel[l]._volumeRight = _channel[l]._volumeFade; + } + } + } + } + if ((_channel[l]._jump[0]._numLoops == 0) && (_channel[l]._isJump == true)) { _channel[l]._isJump = false; } @@ -4889,7 +4918,7 @@ void IMuseDigital::handler() { mixer_size = new_size; } } - } else { + } else if (_channel[l]._isJump == true) { if (_channel[l]._jump[0]._numLoops != 500) { _channel[l]._jump[0]._numLoops--; } @@ -4907,18 +4936,10 @@ void IMuseDigital::handler() { } else if ((_channel[l]._numLoops > 0) && (new_size != mixer_size)) { memcpy(buf + new_size, _channel[l]._data, mixer_size - new_size); _channel[l]._offset = mixer_size - new_size; - _channel[l]._numLoops--; } else { _channel[l]._offset += mixer_size; } - if (_channel[l]._volumeFade != -1) { - if (_channel[l]._volume > _channel[l]._volumeFade) { - _channel[l]._volume -= 10; - _channel[l]._volumeRight -= 10; - } - } - if (_channel[l]._bits == 12) { for(i = 0; i < (mixer_size / 4); i++) { byte sample1 = buf[i * 4 + 0]; @@ -4969,6 +4990,7 @@ void IMuseDigital::startSound(int sound) { _channel[l]._volumeRight = 127; _channel[l]._volume = 127; _channel[l]._volumeFade = -1; + _channel[l]._volumeFadeParam = 0; uint32 tag, size = 0, r, t; @@ -5129,6 +5151,7 @@ int32 IMuseDigital::doCommand(int a, int b, int c, int d, int e, int f, int g, i int32 sample = b; byte sub_cmd = c >> 8; int8 channel = -1, l; + int8 tmp; if (!(cmd || param)) return 1; @@ -5154,8 +5177,19 @@ int32 IMuseDigital::doCommand(int a, int b, int c, int d, int e, int f, int g, i } _channel[channel]._volume = d; _channel[channel]._volumeRight = d; + if (_channel[channel]._volumeFade != -1) { + tmp = ((_channel[channel]._volumeFade - _channel[channel]._volume) * 2) / _channel[channel]._volumeFadeParam; + if ((tmp < 0) && (tmp > -2)) { + tmp = -1; + } else if ((tmp > 0) && (tmp < 2)) { + tmp = 1; + } else { + tmp /= 2; + } + _channel[channel]._volumeFadeStep = tmp; + } return 0; - case 7: // right volume control (0-127) i think + case 7: // right volume control (0-127) debug(2, "IMuseDigital::doCommand setting right volume sample(%d),volume(%d)", sample, d); for (l = 0; l < MAX_DIGITAL_CHANNELS; l++) { if ((_channel[l]._idSound == sample) && (_channel[l]._used == true)) { @@ -5184,10 +5218,20 @@ int32 IMuseDigital::doCommand(int a, int b, int c, int d, int e, int f, int g, i } } if (channel == -1) { - warning("IMuseDigital::doCommand Sample %d not exist in channels", sample); + warning("IMuseDigital::doCommand 14,6 sample %d not exist in channels", sample); return 1; } - _channel[channel]._volumeFade = e; + _channel[channel]._volumeFade = d; + _channel[channel]._volumeFadeParam = e; + tmp = ((_channel[channel]._volumeFade - _channel[channel]._volume) * 2) / _channel[channel]._volumeFadeParam; + if ((tmp < 0) && (tmp > -2)) { + tmp = -1; + } else if ((tmp > 0) && (tmp < 2)) { + tmp = 1; + } else { + tmp /= 2; + } + _channel[channel]._volumeFadeStep = tmp; return 0; default: warning("IMuseDigital::doCommand 14 DEFAULT sub command %d", sub_cmd); @@ -5199,16 +5243,16 @@ int32 IMuseDigital::doCommand(int a, int b, int c, int d, int e, int f, int g, i } } else if (param == 16) { switch (cmd) { - case 0: // it looks be play music (DIG/CMI) (state) (0, 1 ,2, 4, 6, 8, 9, 10, 12, 14, 15, 17, 18, 79, ...) + case 0: // play music (state) debug(2, "IMuseDigital::doCommand 0x1000 (%d)", b); return 0; - case 1: // it looks be play music (DIG/CMI) (seq) (2020, 2022, 2023, 2045, 2046, 2050, 2060, 2070, ...) + case 1: // play music (seq) debug(2, "IMuseDigital::doCommand 0x1001 (%d)", b); return 0; - case 2: // dummy in DIG and CMI, FT - ? + case 2: // dummy in DIG and CMI debug(2, "IMuseDigital::doCommand 0x1002 (%d)", b); return 0; - case 3: // ??? (stream related) (1, 2, 8),(1) + case 3: // ??? (stream related) debug(2, "IMuseDigital::doCommand 0x1003 (%d,%d)", b, c); return 0; default: diff --git a/scumm/imuse.h b/scumm/imuse.h index df3cb3f862..fea1ecc611 100644 --- a/scumm/imuse.h +++ b/scumm/imuse.h @@ -60,7 +60,7 @@ private: IMuseInternal *_imuse; // Pointer to the real imuse object }; -#define MAX_DIGITAL_CHANNELS 10 +#define MAX_DIGITAL_CHANNELS 16 #define MAX_IMUSE_JUMPS 1 #define MAX_IMUSE_REGIONS 3 @@ -83,6 +83,8 @@ private: int8 _volumeRight; int8 _volume; int8 _volumeFade; + int8 _volumeFadeParam; + int8 _volumeFadeStep; bool _isJump; uint32 _numLoops; uint32 _offsetStop; diff --git a/scumm/script_v2.cpp b/scumm/script_v2.cpp index f8c9575c47..9a63d71547 100644 --- a/scumm/script_v2.cpp +++ b/scumm/script_v2.cpp @@ -2728,9 +2728,9 @@ void Scumm::o6_miscOps() grabCursor(args[1], args[2], args[3], args[4]); break; case 6: { - if (_imuseDigital) { - _imuseDigital->stopAll(); - } +// if (_imuseDigital) { +// _imuseDigital->stopAll(); +// } uint32 speed; if (strcmp((char*)getStringAddressVar(VAR_VIDEONAME), "sq3.san") == 0) speed = 71; diff --git a/scumm/smush/scumm_renderer.cpp b/scumm/smush/scumm_renderer.cpp index 729032a66e..2db34688bd 100644 --- a/scumm/smush/scumm_renderer.cpp +++ b/scumm/smush/scumm_renderer.cpp @@ -188,7 +188,7 @@ bool ScummMixer::stop() { _channels[i].chan = 0; } } - _mixer->stopAll(); +// _mixer->stopAll(); return true; } @@ -196,7 +196,7 @@ ScummRenderer::ScummRenderer(Scumm * scumm, uint32 speed) : _scumm(scumm), _smixer(0), _insaneSpeed(speed) { - scumm->_mixer->stopAll(); +// scumm->_mixer->stopAll(); } static ScummRenderer * s_renderer; |