aboutsummaryrefslogtreecommitdiff
path: root/scumm
diff options
context:
space:
mode:
authorPaweł Kołodziejski2003-12-22 22:39:16 +0000
committerPaweł Kołodziejski2003-12-22 22:39:16 +0000
commit5b38b9ccbe7ec5c622af89ad64165949c2755572 (patch)
treed12c5b551da3f4b13f89b09d00eddd7acd87c991 /scumm
parentcc241c52ccd0ffe7de42e1ba172fe8d42d602649 (diff)
downloadscummvm-rg350-5b38b9ccbe7ec5c622af89ad64165949c2755572.tar.gz
scummvm-rg350-5b38b9ccbe7ec5c622af89ad64165949c2755572.tar.bz2
scummvm-rg350-5b38b9ccbe7ec5c622af89ad64165949c2755572.zip
some changes in imuse digital (synced with local sources)
svn-id: r11860
Diffstat (limited to 'scumm')
-rw-r--r--scumm/imuse_digi.cpp344
-rw-r--r--scumm/imuse_digi.h75
2 files changed, 225 insertions, 194 deletions
diff --git a/scumm/imuse_digi.cpp b/scumm/imuse_digi.cpp
index 980f2a2254..91cbab97c5 100644
--- a/scumm/imuse_digi.cpp
+++ b/scumm/imuse_digi.cpp
@@ -719,23 +719,20 @@ static uint32 decode12BitsSample(byte *src, byte **dst, uint32 size, bool stereo
void IMuseDigital::timer_handler(void *refCon) {
IMuseDigital *imuseDigital = (IMuseDigital *)refCon;
- imuseDigital->musicTimer();
+ imuseDigital->mixerCallback();
}
IMuseDigital::IMuseDigital(ScummEngine *scumm)
: _scumm(scumm) {
memset(_channel, 0, sizeof(Channel) * MAX_DIGITAL_CHANNELS);
- for (int l = 0; l < MAX_DIGITAL_CHANNELS; l++) {
- _channel[l]._handle = 0;
- }
- _scumm->_timer->installTimerProc(timer_handler, 200000, this);
+ _scumm->_timer->installTimerProc(timer_handler, 40000, this);
_pause = false;
-
+
_nameBundleMusic = "";
_musicBundleBufFinal = NULL;
_musicBundleBufOutput = NULL;
_musicDisk = 0;
-
+
_bundle = new Bundle();
}
@@ -743,141 +740,121 @@ IMuseDigital::~IMuseDigital() {
_scumm->_timer->removeTimerProc(timer_handler);
for (int l = 0; l < MAX_DIGITAL_CHANNELS; l++) {
- _scumm->_mixer->stopHandle(_channel[l]._handle);
+ _scumm->_mixer->stopHandle(_channel[l].handle);
}
delete _bundle;
}
-void IMuseDigital::musicTimer() {
+void IMuseDigital::mixerCallback() {
int l = 0;
if (_pause || !_scumm)
return;
for (l = 0; l < MAX_DIGITAL_CHANNELS;l ++) {
- if (_channel[l]._used) {
- if (_channel[l]._toBeRemoved) {
- _scumm->_mixer->endStream(_channel[l]._handle);
+ if (_channel[l].used) {
+ if (_channel[l].toBeRemoved) {
+ _scumm->_mixer->endStream(_channel[l].handle);
+ debug(5, "IMuseDigital::mixerCallback(): stop sound: %d", _channel[l].idSound);
- free(_channel[l]._data);
- _channel[l]._used = false;
+ free(_channel[l].data);
+ _channel[l].used = false;
continue;
}
- if (_channel[l]._delay > 0) {
- _channel[l]._delay--;
- 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].volFadeUsed == true) {
+ if (_channel[l].volFadeStep < 0) {
+ if (_channel[l].vol > _channel[l].volFadeDest) {
+ _channel[l].vol += _channel[l].volFadeStep;
+ if (_channel[l].vol < _channel[l].volFadeDest) {
+ _channel[l].vol = _channel[l].volFadeDest;
+ _channel[l].volFadeUsed = false;
}
- 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;
+ if (_channel[l].vol == 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;
+ } else if (_channel[l].volFadeStep > 0) {
+ if (_channel[l].vol < _channel[l].volFadeDest) {
+ _channel[l].vol += _channel[l].volFadeStep;
+ if (_channel[l].vol > _channel[l].volFadeDest) {
+ _channel[l].vol = _channel[l].volFadeDest;
+ _channel[l].volFadeUsed = false;
}
}
}
+ debug(5, "Fade: sound(%d), Vol(%d)", _channel[l].idSound, _channel[l].vol / 1000);
}
- int32 new_size = _channel[l]._mixerSize;
+ int32 new_size = _channel[l].mixerSize;
int32 mixer_size = new_size;
- if (_channel[l]._handle == 0) {
- mixer_size *= 2;
- new_size *= 2;
+ if (_channel[l].offset + mixer_size > _channel[l].size) {
+ new_size = _channel[l].size - _channel[l].offset;
}
- if (_channel[l]._offset + mixer_size > _channel[l]._size) {
- new_size = _channel[l]._size - _channel[l]._offset;
- }
-
- if (_channel[l]._offset + mixer_size > _channel[l]._size) {
- new_size = _channel[l]._size - _channel[l]._offset;
- _channel[l]._toBeRemoved = true;
+ if (_channel[l].offset + mixer_size > _channel[l].size) {
+ new_size = _channel[l].size - _channel[l].offset;
+ _channel[l].toBeRemoved = true;
mixer_size = new_size;
}
- byte *buf = (byte*)malloc(mixer_size);
- memcpy(buf, _channel[l]._data + _channel[l]._offset, new_size);
- _channel[l]._offset += mixer_size;
+ byte *buf = (byte *)malloc(mixer_size);
+ memcpy(buf, _channel[l].data + _channel[l].offset, new_size);
+ _channel[l].offset += mixer_size;
if (_scumm->_silentDigitalImuse == false) {
- if (_channel[l]._handle == 0)
- _scumm->_mixer->newStream(&_channel[l]._handle,
- _channel[l]._freq, _channel[l]._mixerFlags, 100000);
-
- _scumm->_mixer->setChannelVolume(_channel[l]._handle, _channel[l]._volume);
- _scumm->_mixer->setChannelPan(_channel[l]._handle, _channel[l]._volumeRight - _channel[l]._volume);
- _scumm->_mixer->appendStream(_channel[l]._handle, buf, mixer_size);
+ if (_channel[l].handle == 0)
+ _scumm->_mixer->newStream(&_channel[l].handle, _channel[l].freq,
+ _channel[l].mixerFlags, 100000);
+ _scumm->_mixer->setChannelVolume(_channel[l].handle, _channel[l].vol / 1000);
+ _scumm->_mixer->setChannelPan(_channel[l].handle, _channel[l].pan);
+ _scumm->_mixer->appendStream(_channel[l].handle, buf, mixer_size);
}
- free(buf);
}
}
}
void IMuseDigital::startSound(int sound) {
debug(5, "IMuseDigital::startSound(%d)", sound);
- int l;
+ int l, r;
for (l = 0; l < MAX_DIGITAL_CHANNELS; l++) {
- if (_channel[l]._used == false) {
+ if (!_channel[l].used && !_channel[l].handle) {
byte *ptr = _scumm->getResourceAddress(rtSound, sound);
byte *s_ptr = ptr;
if (ptr == NULL) {
warning("IMuseDigital::startSound(%d) NULL resource pointer", sound);
return;
}
- _channel[l]._idSound = sound;
- _channel[l]._offset = 0;
- _channel[l]._volumeRight = 127;
- _channel[l]._volume = 127;
- _channel[l]._volumeFade = -1;
- _channel[l]._volumeFadeParam = 0;
- _channel[l]._delay = 1;
+ _channel[l].idSound = sound;
+ _channel[l].offset = 0;
+ _channel[l].pan = 0;
+ _channel[l].vol = 127 * 1000;
+ _channel[l].volFadeUsed = false;
+ _channel[l].volFadeDest = 0;
+ _channel[l].volFadeStep = 0;
+ _channel[l].volFadeDelay = 0;
uint32 tag;
int32 size = 0;
int t;
if (READ_UINT32(ptr) == MKID('Crea')) {
- _channel[l]._bits = 8;
- // Always output stereo, because in IMuseDigital::handler the data is expected to be in stereo, and
- // different volumes for the left and right channel are being applied.
- // That might also be the justification for specifying FLAG_REVERSE_STEREO here. Not sure.
- _channel[l]._channels = 2;
- _channel[l]._mixerFlags = SoundMixer::FLAG_STEREO | SoundMixer::FLAG_REVERSE_STEREO | SoundMixer::FLAG_UNSIGNED;
- byte *t_ptr= readCreativeVocFile(ptr, size, _channel[l]._freq);
-
- _channel[l]._mixerSize = (_channel[l]._freq / 5) * 2;
-
- size *= 2;
- _channel[l]._data = (byte *)malloc(size);
+ _channel[l].bits = 8;
+ _channel[l].channels = 2;
+ _channel[l].mixerFlags = SoundMixer::FLAG_STEREO | SoundMixer::FLAG_REVERSE_STEREO | SoundMixer::FLAG_UNSIGNED | SoundMixer::FLAG_AUTOFREE;
+ _channel[l].mixerSize = _channel[l].freq * 2;
+
+ byte *t_ptr= readCreativeVocFile(ptr, size, _channel[l].freq);
+ _channel[l].data = (byte *)malloc(size);
for (t = 0; t < size / 2; t++) {
- *(_channel[l]._data + t * 2 + 0) = *(t_ptr + t);
- *(_channel[l]._data + t * 2 + 1) = *(t_ptr + t);
+ *(_channel[l].data + t * 2 + 0) = *(t_ptr + t);
+ *(_channel[l].data + t * 2 + 1) = *(t_ptr + t);
}
free(t_ptr);
- _channel[l]._size = size;
+ _channel[l].size = size;
} else if (READ_UINT32(ptr) == MKID('iMUS')) {
ptr += 16;
for (;;) {
@@ -885,22 +862,48 @@ void IMuseDigital::startSound(int sound) {
switch(tag) {
case MKID_BE('FRMT'):
ptr += 12;
- _channel[l]._bits = READ_BE_UINT32(ptr); ptr += 4;
- _channel[l]._freq = READ_BE_UINT32(ptr); ptr += 4;
- _channel[l]._channels = READ_BE_UINT32(ptr); ptr += 4;
+ _channel[l].bits = READ_BE_UINT32(ptr); ptr += 4;
+ _channel[l].freq = READ_BE_UINT32(ptr); ptr += 4;
+ _channel[l].channels = READ_BE_UINT32(ptr); ptr += 4;
break;
case MKID_BE('TEXT'):
- size = READ_BE_UINT32(ptr); ptr += size + 4;
+ size = READ_BE_UINT32(ptr); ptr += 4;
+ if (_channel[l].numRegions >= MAX_IMUSE_MARKERS) {
+ warning("IMuseDigital::startSound() Not enough space for Marker");
+ ptr += size;
+ break;
+ }
+ strcpy(_channel[l].marker[_channel[l].numMarkers].name, (char *)ptr + 4);
+ _channel[l].numMarkers++;
+ ptr += size;
break;
case MKID_BE('REGN'):
- ptr += 12;
+ size = READ_BE_UINT32(ptr); ptr += 4;
+ if (_channel[l].numRegions >= MAX_IMUSE_REGIONS) {
+ warning("IMuseDigital::startSound() Not enough space for Region");
+ ptr += 8;
+ break;
+ }
+ _channel[l].region[_channel[l].numRegions].start = READ_BE_UINT32(ptr); ptr += 4;
+ _channel[l].region[_channel[l].numRegions].length = READ_BE_UINT32(ptr); ptr += 4;
+ _channel[l].numRegions++;
break;
case MKID_BE('STOP'):
ptr += 4;
- _channel[l]._offsetStop = READ_BE_UINT32(ptr); ptr += 4;
+ _channel[l].offsetStop = READ_BE_UINT32(ptr); ptr += 4;
break;
case MKID_BE('JUMP'):
- ptr += 20;
+ size = READ_BE_UINT32(ptr); ptr += 4;
+ if (_channel[l].numJumps >= MAX_IMUSE_JUMPS) {
+ warning("IMuseDigital::startSound() Not enough space for Jump");
+ ptr += size;
+ break;
+ }
+ _channel[l].jump[_channel[l].numJumps].start = READ_BE_UINT32(ptr); ptr += 4;
+ _channel[l].jump[_channel[l].numJumps].dest = READ_BE_UINT32(ptr); ptr += 4;
+ _channel[l].jump[_channel[l].numJumps].hookId = READ_BE_UINT32(ptr); ptr += 4;
+ _channel[l].jump[_channel[l].numJumps].fadeDelay = READ_BE_UINT32(ptr); ptr += 4;
+ _channel[l].numJumps++;
break;
case MKID_BE('DATA'):
size = READ_BE_UINT32(ptr); ptr += 4;
@@ -908,44 +911,62 @@ void IMuseDigital::startSound(int sound) {
default:
error("IMuseDigital::startSound(%d) Unknown sfx header %c%c%c%c", sound, (byte)(tag >> 24), (byte)(tag >> 16), (byte)(tag >> 8), (byte)tag);
}
- if (tag == MKID_BE('DATA')) break;
+ if (tag == MKID_BE('DATA'))
+ break;
}
uint32 header_size = ptr - s_ptr;
- _channel[l]._offsetStop -= header_size;
- if (_channel[l]._bits == 12) {
- _channel[l]._offsetStop = (_channel[l]._offsetStop / 3) * 4;
+
+ _channel[l].offsetStop -= header_size;
+ if (_channel[l].bits == 12) {
+ _channel[l].offsetStop = (_channel[l].offsetStop / 3) * 4;
}
+ for (r = 0; r < _channel[l].numRegions; r++) {
+ _channel[l].region[r].start -= header_size;
+ if (_channel[l].bits == 12) {
+ _channel[l].region[r].start = (_channel[l].region[r].start / 3) * 4;
+ _channel[l].region[r].length = (_channel[l].region[r].length / 3) * 4;
+ }
+ }
+ if (_channel[l].numJumps > 0) {
+ for (r = 0; r < _channel[l].numJumps; r++) {
+ _channel[l].jump[r].start -= header_size;
+ _channel[l].jump[r].dest -= header_size;
+ if (_channel[l].bits == 12) {
+ _channel[l].jump[r].start = (_channel[l].jump[r].start / 3) * 4;
+ _channel[l].jump[r].dest = (_channel[l].jump[r].dest / 3) * 4;
+ }
+ }
+ }
+
+ _channel[l].mixerFlags = SoundMixer::FLAG_STEREO | SoundMixer::FLAG_REVERSE_STEREO | SoundMixer::FLAG_AUTOFREE;
+ _channel[l].mixerSize = _channel[l].freq * 2;
- // Always output stereo, because in IMuseDigital::handler the data is expected to be in stereo, and
- // different volumes for the left and right channel are being applied.
- // That might also be the justification for specifying FLAG_REVERSE_STEREO here. Not sure.
- _channel[l]._mixerFlags = SoundMixer::FLAG_STEREO | SoundMixer::FLAG_REVERSE_STEREO;
- _channel[l]._mixerSize = (_channel[l]._freq / 5) * 2;
- if (_channel[l]._bits == 12) {
- _channel[l]._mixerSize *= 2;
- _channel[l]._mixerFlags |= SoundMixer::FLAG_16BITS;
- _channel[l]._size = decode12BitsSample(ptr, &_channel[l]._data, size, (_channel[l]._channels == 2) ? false : true);
- } else if (_channel[l]._bits == 8) {
- _channel[l]._mixerFlags |= SoundMixer::FLAG_UNSIGNED;
- if (_channel[l]._channels == 1) {
+ if (_channel[l].bits == 12) {
+ _channel[l].mixerSize *= 2;
+ _channel[l].mixerFlags |= SoundMixer::FLAG_16BITS;
+ _channel[l].size = decode12BitsSample(ptr, &_channel[l].data, size, (_channel[l].channels == 2) ? false : true);
+ } else if (_channel[l].bits == 8) {
+ _channel[l].mixerFlags |= SoundMixer::FLAG_UNSIGNED;
+ if (_channel[l].channels == 1) {
size *= 2;
- _channel[l]._channels = 2;
- _channel[l]._data = (byte *)malloc(size);
+ _channel[l].channels = 2;
+ _channel[l].data = (byte *)malloc(size);
for (t = 0; t < size / 2; t++) {
- *(_channel[l]._data + t * 2 + 0) = *(ptr + t);
- *(_channel[l]._data + t * 2 + 1) = *(ptr + t);
+ *(_channel[l].data + t * 2 + 0) = *(ptr + t);
+ *(_channel[l].data + t * 2 + 1) = *(ptr + t);
}
} else {
- _channel[l]._data = (byte *)malloc(size);
- memcpy(_channel[l]._data, ptr, size);
+ _channel[l].data = (byte *)malloc(size);
+ memcpy(_channel[l].data, ptr, size);
}
- _channel[l]._size = size;
+ _channel[l].size = size;
} else
- error("Can't handle %d bit samples in iMuseDigital", _channel[l]._bits);
+ error("Can't handle %d bit samples in iMuseDigital", _channel[l].bits);
}
- _channel[l]._toBeRemoved = false;
- _channel[l]._used = true;
+ _channel[l].mixerSize /= 25;
+ _channel[l].toBeRemoved = false;
+ _channel[l].used = true;
break;
}
}
@@ -954,21 +975,27 @@ void IMuseDigital::startSound(int sound) {
void IMuseDigital::stopSound(int sound) {
debug(5, "IMuseDigital::stopSound(%d)", sound);
for (int l = 0; l < MAX_DIGITAL_CHANNELS; l++) {
- if ((_channel[l]._idSound == sound) && _channel[l]._used) {
- _channel[l]._toBeRemoved = true;
+ if ((_channel[l].idSound == sound) && _channel[l].used) {
+ _channel[l].toBeRemoved = true;
}
}
}
void IMuseDigital::stopAllSounds() {
+ debug(5, "IMuseDigital::stopAllSounds");
for (int l = 0; l < MAX_DIGITAL_CHANNELS; l++) {
- if (_channel[l]._used) {
- _channel[l]._toBeRemoved = true;
+ if (_channel[l].used) {
+ _channel[l].toBeRemoved = true;
}
}
}
void IMuseDigital::pause(bool p) {
+ for (int l = 0; l < MAX_DIGITAL_CHANNELS; l++) {
+ if (_channel[l].used) {
+ _scumm->_mixer->pauseID(_channel[l].handle, p);
+ }
+ }
_pause = p;
pauseBundleMusic(p);
}
@@ -978,50 +1005,40 @@ int32 IMuseDigital::doCommand(int a, int b, int c, int d, int e, int f, int g, i
int sample = b;
int sub_cmd = c;
int chan = -1;
- int tmp, l, r;
+ int l, r;
if (!cmd)
return 1;
switch (cmd) {
- case 10:
+ case 10: // ImuseStopAllSounds
debug(5, "ImuseStopAllSounds()");
stopAllSounds();
return 0;
case 12: // ImuseSetParam
switch (sub_cmd) {
- case 0x500: // volume control (0-127)
- case 0x600: // volume control (0-127) with pan
- debug(5, "ImuseSetParam (%x), setting volume sample(%d), volume(%d)", sub_cmd, sample, d);
+ case 0x500: // set priority - could be ignored
+ return 0;
+ case 0x600: // set volume
+ debug(5, "ImuseSetParam (%x), sample(%d), volume(%d)", sub_cmd, sample, d);
for (l = 0; l < MAX_DIGITAL_CHANNELS; l++) {
- if ((_channel[l]._idSound == sample) && _channel[l]._used) {
+ if ((_channel[l].idSound == sample) && _channel[l].used) {
chan = l;
break;
}
}
if (chan == -1) {
- debug(5, "ImuseSetParam (%x), sample(%d) not exist in channels", sub_cmd, sample);
+ debug(0, "ImuseSetParam (%x), sample(%d) not exist in channels", sub_cmd, sample);
return 1;
}
- _channel[chan]._volume = d;
- _channel[chan]._volumeRight = d;
- if (_channel[chan]._volumeFade != -1) {
- tmp = ((_channel[chan]._volumeFade - _channel[chan]._volume) * 2) / _channel[chan]._volumeFadeParam;
- if ((tmp < 0) && (tmp > -2)) {
- tmp = -1;
- } else if ((tmp > 0) && (tmp < 2)) {
- tmp = 1;
- } else {
- tmp /= 2;
- }
- _channel[chan]._volumeFadeStep = tmp;
- debug(5, "ImuseSetParam: to volume %d, step is %d", d, tmp);
- }
+ _channel[chan].vol = d * 1000;
+ if (_channel[chan].volFadeUsed)
+ _channel[chan].volFadeStep = (_channel[chan].volFadeDest - _channel[chan].vol) / (((1000 * _channel[chan].volFadeDelay) / 60) / 40);
return 0;
- case 0x700: // right volume control (0-127)
- debug(5, "ImuseSetParam (0x700), setting right volume sample(%d), volume(%d)", sample, d);
+ case 0x700: // set pan
+ debug(5, "ImuseSetParam (0x700), sample(%d), pan(%d)", sample, d);
for (l = 0; l < MAX_DIGITAL_CHANNELS; l++) {
- if ((_channel[l]._idSound == sample) && _channel[l]._used) {
+ if ((_channel[l].idSound == sample) && _channel[l].used) {
chan = l;
break;
}
@@ -1030,7 +1047,7 @@ int32 IMuseDigital::doCommand(int a, int b, int c, int d, int e, int f, int g, i
debug(5, "ImuseSetParam (0x700), sample(%d) not exist in channels", sample);
return 1;
}
- _channel[chan]._volumeRight = d;
+ _channel[chan].pan = d;
return 0;
default:
warning("IMuseDigital::doCommand SetParam DEFAULT command %d", sub_cmd);
@@ -1038,34 +1055,27 @@ int32 IMuseDigital::doCommand(int a, int b, int c, int d, int e, int f, int g, i
}
case 14: // ImuseFadeParam
switch (sub_cmd) {
- case 0x600: // control volume fade
- debug(5, "ImuseFadeParam - fading volume sample(%d), to volume(%d) with speed(%d)", sample, d, e);
+ case 0x600: // set new volume with fading
+ debug(5, "ImuseFadeParam - fade sample(%d), to volume(%d) with 60hz ticks(%d)", sample, d, e);
if ((_scumm->_gameId == GID_DIG) && (_scumm->_features & GF_DEMO)) {
stopSound(sample);
return 0;
}
for (l = 0; l < MAX_DIGITAL_CHANNELS; l++) {
- if ((_channel[l]._idSound == sample) && _channel[l]._used) {
+ if ((_channel[l].idSound == sample) && _channel[l].used) {
chan = l;
break;
}
}
if (chan == -1) {
- debug(5, "ImuseFadeParam (0x600), sample %d not exist in channels", sample);
+ debug(5, "ImuseFadeParam (0x600), sample %d not exist in channels", sample);
return 1;
}
- _channel[chan]._volumeFade = d;
- _channel[chan]._volumeFadeParam = e;
- tmp = ((_channel[chan]._volumeFade - _channel[chan]._volume) * 2) / _channel[chan]._volumeFadeParam;
- if ((tmp < 0) && (tmp > -2)) {
- tmp = -1;
- } else if ((tmp > 0) && (tmp < 2)) {
- tmp = 1;
- } else {
- tmp /= 2;
- }
- _channel[chan]._volumeFadeStep = tmp;
- debug(5, "ImuseFadeParam: to volume %d, step is %d", d, tmp);
+ _channel[chan].volFadeDelay = e;
+ _channel[chan].volFadeDest = d * 1000;
+ _channel[chan].volFadeStep = (_channel[chan].volFadeDest - _channel[chan].vol) / (((1000 * e) / 60) / 40);
+ _channel[chan].volFadeUsed = true;
+ debug(5, "ImuseFadeParam: vol %d, volDest %d, step %d", _channel[chan].vol, d * 1000, _channel[chan].volFadeStep);
return 0;
default:
warning("IMuseDigital::doCommand FadeParam DEFAULT sub command %d", sub_cmd);
@@ -1223,7 +1233,7 @@ int32 IMuseDigital::doCommand(int a, int b, int c, int d, int e, int f, int g, i
int IMuseDigital::getSoundStatus(int sound) const {
debug(5, "IMuseDigital::getSoundStatus(%d)", sound);
for (int l = 0; l < MAX_DIGITAL_CHANNELS; l++) {
- if ((_channel[l]._idSound == sound) && _channel[l]._used) {
+ if ((_channel[l].idSound == sound) && _channel[l].used) {
return 1;
}
}
@@ -1231,8 +1241,6 @@ int IMuseDigital::getSoundStatus(int sound) const {
return 0;
}
-#pragma mark -
-
void IMuseDigital::music_handler(void *refCon) {
((IMuseDigital *)refCon)->bundleMusicHandler();
}
@@ -1541,8 +1549,6 @@ bail:
free(orig_ptr);
}
-
-
} // End of namespace Scumm
#ifdef __PALM_OS__
diff --git a/scumm/imuse_digi.h b/scumm/imuse_digi.h
index 161f27e10f..a083f58ad4 100644
--- a/scumm/imuse_digi.h
+++ b/scumm/imuse_digi.h
@@ -30,8 +30,9 @@
namespace Scumm {
#define MAX_DIGITAL_CHANNELS 8
-#define MAX_IMUSE_JUMPS 1
-#define MAX_IMUSE_REGIONS 3
+#define MAX_IMUSE_JUMPS 50
+#define MAX_IMUSE_REGIONS 50
+#define MAX_IMUSE_MARKERS 50
class ScummEngine;
class Bundle;
@@ -42,35 +43,59 @@ class Bundle;
class IMuseDigital : public MusicEngine {
private:
+ struct _region {
+ uint32 start; // begin of region
+ uint32 length; // lenght of region
+ };
+
+ struct _jump {
+ uint32 start; // jump start position
+ uint32 dest; // jump to dest position
+ uint32 hookId; // id of hook
+ uint32 fadeDelay; // fade delay in ms
+ };
+
+ struct _marker {
+ char name[256]; // name of marker
+ };
+
struct Channel {
- int8 _volumeRight;
- int8 _volume;
- int8 _volumeFade;
- int8 _volumeFadeParam;
- int8 _volumeFadeStep;
- int _delay;
- int32 _offsetStop;
- int32 _offset;
- byte *_data;
- int _freq;
- int _channels;
- int _bits;
- int32 _size;
- int _idSound;
- int32 _mixerSize;
- int _mixerFlags;
- PlayingSoundHandle _handle;
- bool _used;
- bool _toBeRemoved;
+ int8 pan; // pan
+ int32 vol; // volume
+ int32 volFadeDest; //
+ int32 volFadeStep; //
+ int32 volFadeDelay; //
+ bool volFadeUsed; //
+
+ _region region[MAX_IMUSE_REGIONS];
+ _marker marker[MAX_IMUSE_MARKERS];
+ _jump jump[MAX_IMUSE_JUMPS];
+ int32 offsetStop;
+ int32 numJumps;
+ int32 numRegions;
+ int32 numMarkers;
+
+ int32 offset;
+ byte *data;
+ int freq;
+ int channels;
+ int bits;
+ int32 size;
+ int idSound;
+ int32 mixerSize;
+ int mixerFlags;
+ PlayingSoundHandle handle;
+ bool used;
+ bool toBeRemoved;
};
-
+
Channel _channel[MAX_DIGITAL_CHANNELS];
ScummEngine *_scumm;
bool _pause;
static void timer_handler(void *refConf);
- void musicTimer();
+ void mixerCallback();
//
// Bundle music
@@ -97,15 +122,15 @@ private:
void bundleMusicHandler();
void playBundleMusic(const char *song);
- void pauseBundleMusic(bool state);
public:
int32 _bundleSongPosInMs;
Bundle *_bundle; // FIXME: should be protected but is used by ScummEngine::askForDisk
+ void pauseBundleMusic(bool state);
void stopBundleMusic();
void playBundleSound(const char *sound, PlayingSoundHandle *handle);
-
+
public:
IMuseDigital(ScummEngine *scumm);
~IMuseDigital();