aboutsummaryrefslogtreecommitdiff
path: root/scumm/imuse_player.cpp
diff options
context:
space:
mode:
authorJamieson Christian2003-08-06 18:20:15 +0000
committerJamieson Christian2003-08-06 18:20:15 +0000
commit1615278ecc376f7de5136e72239e86363cd96134 (patch)
treeea6508dbbc37f2759a132e3209188d893e54dd8a /scumm/imuse_player.cpp
parent79a804c4014c09d5a8f5b566d8f41ad3f301c906 (diff)
downloadscummvm-rg350-1615278ecc376f7de5136e72239e86363cd96134.tar.gz
scummvm-rg350-1615278ecc376f7de5136e72239e86363cd96134.tar.bz2
scummvm-rg350-1615278ecc376f7de5136e72239e86363cd96134.zip
Upgraded IMuse::doCommand() to support more than 8 parameters.
V6 scripts can specify up to 16 parameters to be passed to doCommand(). In most cases 8 or fewer parameters were used, but occasional uses of 9 or 10 parameters resulted in incorrect iMuse behavior due to lost doCommand() data. ImTrigger was also upgraded to support 8 parameters instead of 4, since the incorrect behavior that was observed involved the use of triggered commands that required more than 4 parameters. Since ImTrigger data is not currently being saved (which is bad), we do not at this time have to go to another savegame format to support the additional ImTrigger data (which is good). This fix corrects a problem in the Tunnel of Love. When the "execution scene" music finishes and the hidden door opens, the Tunnel of Love music is supposed to start up again. In ScummVM, it never would, do to the loss of parameters for a trigger-based "Parameter Fade" command. A bit of miscellaneous cleanup has also been made. svn-id: r9579
Diffstat (limited to 'scumm/imuse_player.cpp')
-rw-r--r--scumm/imuse_player.cpp65
1 files changed, 36 insertions, 29 deletions
diff --git a/scumm/imuse_player.cpp b/scumm/imuse_player.cpp
index 0e4ee34fdf..50cee4bae5 100644
--- a/scumm/imuse_player.cpp
+++ b/scumm/imuse_player.cpp
@@ -94,16 +94,7 @@ bool Player::startSound(int sound, MidiDriver *midi) {
warning("Player::startSound(): Couldn't find start of sound %d!", sound);
return false;
}
-/*
- mdhd = _se->findTag(sound, MDHD_TAG, 0);
- if (mdhd == NULL) {
- mdhd = _se->findTag(sound, MDPG_TAG, 0);
- if (mdhd == NULL) {
- warning("P::startSound failed: Couldn't find %s", MDHD_TAG);
- return false;
- }
- }
-*/
+
_isMT32 = _se->isMT32(sound);
_isGM = _se->isGM(sound);
@@ -128,6 +119,10 @@ bool Player::startSound(int sound, MidiDriver *midi) {
_midi = NULL;
return false;
}
+
+#ifdef IMUSE_DEBUG
+ debug (0, "Starting music %d", sound);
+#endif
return true;
}
@@ -144,12 +139,20 @@ bool Player::isFadingOut() {
}
void Player::clear() {
+ if (!_active)
+ return;
+
+#ifdef IMUSE_DEBUG
+ debug (0, "Stopping music %d", _id);
+#endif
+
if (_parser)
_parser->unloadMusic();
uninit_parts();
_se->ImFireAllTriggers(_id);
_active = false;
_midi = NULL;
+ _id = 0;
}
void Player::hook_clear() {
@@ -389,11 +392,7 @@ void Player::sysEx(byte *p, uint16 len) {
_se->_snm_triggers [a].id == *p)
{
_se->_snm_triggers [a].sound = _se->_snm_triggers [a].id = 0;
- _se->doCommand(_se->_snm_triggers [a].command [0],
- _se->_snm_triggers [a].command [1],
- _se->_snm_triggers [a].command [2],
- _se->_snm_triggers [a].command [3],
- 0, 0, 0, 0);
+ _se->doCommand (8, _se->_snm_triggers[a].command);
break;
}
}
@@ -979,7 +978,7 @@ void Player::onTimer() {
// "time" is referenced as hundredths of a second.
// IS THAT CORRECT??
-// We convert it to microseconds before prceeding
+// We convert it to microseconds before proceeding
int Player::addParameterFader(int param, int target, int time) {
int start;
@@ -1002,25 +1001,29 @@ int Player::addParameterFader(int param, int target, int time) {
case ParameterFader::pfTranspose:
// FIXME: Is this transpose? And what's the scale?
// It's set to fade to -2400 in the tunnel of love.
- warning("parameterTransition(3) outside Tunnel of Love?");
+// warning("parameterTransition(3) outside Tunnel of Love?");
start = _transpose;
- target /= 200;
+// target /= 200;
break;
- case ParameterFader::pfSpeed:
+ case ParameterFader::pfSpeed: // impSpeed
// FIXME: Is the speed from 0-100?
// Right now I convert it to 0-128.
start = _speed;
- target = target * 128 / 100;
+// target = target * 128 / 100;
break;
case 127:
- // FIXME: This MIGHT fade ALL supported parameters,
- // but I'm not sure.
- return 0;
+ { // FIXME? I *think* this clears all parameter faders.
+ ParameterFader *ptr = &_parameterFaders[0];
+ int i;
+ for (i = ARRAYSIZE(_parameterFaders); i; --i, ++ptr)
+ ptr->param = 0;
+ return 0;
+ }
default:
- warning("Player::addParameterFader(): Unknown parameter %d", param);
+ warning("Player::addParameterFader (%d, %d, %d): Unknown parameter", param, target, time);
return 0; // Should be -1, but we'll let the script think it worked.
}
@@ -1079,15 +1082,19 @@ void Player::transitionParameters() {
setVolume((byte) value);
break;
- case ParameterFader::pfSpeed:
+ case ParameterFader::pfTranspose:
+ // FIXME: Is this really transpose?
+ setTranspose (0, value / 100);
+ setDetune (value % 100);
+ break;
+
+ case ParameterFader::pfSpeed: // impSpeed:
// Speed.
setSpeed((byte) value);
break;
- case ParameterFader::pfTranspose:
- // FIXME: Is this really transpose?
- setTranspose(0, value);
- break;
+ default:
+ ptr->param = 0;
}
if (ptr->current_time >= ptr->total_time)