aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scumm/imuse.cpp30
-rw-r--r--scumm/imuse.h3
-rw-r--r--scumm/saveload.cpp11
-rw-r--r--scumm/smush/scumm_renderer.cpp11
-rw-r--r--scumm/sound.cpp72
-rw-r--r--scumm/sound.h3
-rw-r--r--scumm/string.cpp4
7 files changed, 94 insertions, 40 deletions
diff --git a/scumm/imuse.cpp b/scumm/imuse.cpp
index 0c7ef1e960..82f1232e9f 100644
--- a/scumm/imuse.cpp
+++ b/scumm/imuse.cpp
@@ -4998,6 +4998,7 @@ IMuseDigital::IMuseDigital(Scumm *scumm) {
memset(_channel, 0, sizeof(channel) * MAX_DIGITAL_CHANNELS);
_scumm = scumm;
_scumm->_timer->installProcedure(imus_digital_handler, 200);
+ _pause = false;
}
IMuseDigital::~IMuseDigital() {
@@ -5395,9 +5396,11 @@ static const imuse_ft_music_table _ftSeqMusicTable[] = {
};
void IMuseDigital::handler() {
- bool new_mixer;
uint32 l = 0, i = 0;
+ if (_pause == true)
+ return;
+
for (l = 0; l < MAX_DIGITAL_CHANNELS;l ++) {
if (_channel[l]._used) {
if (_channel[l]._toBeRemoved == true) {
@@ -5449,11 +5452,9 @@ void IMuseDigital::handler() {
uint32 mixer_size = new_size;
if (_channel[l]._mixerTrack == -1) {
- new_mixer = true;
mixer_size *= 2;
new_size *= 2;
} else {
- new_mixer = false;
}
if (_channel[l]._isJump == false) {
@@ -5506,7 +5507,12 @@ void IMuseDigital::handler() {
}
}
- if (new_mixer) {
+
+ if (_channel[l]._mixerTrack == -1) {
+ _channel[l]._mixerTrack = _scumm->_mixer->playStream(NULL, -1, buf, mixer_size,
+ _channel[l]._freq, _channel[l]._mixerFlags);
+ continue;
+ } else if (_scumm->_mixer->_channels[_channel[l]._mixerTrack] == NULL) {
_channel[l]._mixerTrack = _scumm->_mixer->playStream(NULL, -1, buf, mixer_size,
_channel[l]._freq, _channel[l]._mixerFlags);
} else {
@@ -5692,6 +5698,10 @@ void IMuseDigital::stopAll() {
}
}
+void IMuseDigital::pause(bool pause) {
+ _pause = pause;
+}
+
int32 IMuseDigital::doCommand(int a, int b, int c, int d, int e, int f, int g, int h) {
byte cmd = a & 0xFF;
byte param = a >> 8;
@@ -5791,7 +5801,7 @@ 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: // play music (state)
- debug(1, "IMuseDigital::doCommand 0x1000 (%d)", b);
+ debug(2, "IMuseDigital::doCommand 0x1000 (%d)", b);
if (_scumm->_gameId == GID_DIG) {
for(l = 0;; l++) {
if (_digStateMusicMap[l].room == -1) {
@@ -5799,7 +5809,7 @@ int32 IMuseDigital::doCommand(int a, int b, int c, int d, int e, int f, int g, i
}
if (_digStateMusicMap[l].room == b) {
int16 music = _digStateMusicMap[l].table_index;
- debug(1, "Play imuse music: %s, %s, %s", _digStateMusicTable[music].name, _digStateMusicTable[music].title, _digStateMusicTable[music].filename);
+ debug(2, "Play imuse music: %s, %s, %s", _digStateMusicTable[music].name, _digStateMusicTable[music].title, _digStateMusicTable[music].filename);
if (_digStateMusicTable[music].filename[0] != 0) {
_scumm->_sound->playBundleMusic((char*)&_digStateMusicTable[music].filename);
}
@@ -5812,7 +5822,7 @@ int32 IMuseDigital::doCommand(int a, int b, int c, int d, int e, int f, int g, i
return 1;
}
if (_ftStateMusicTable[l].index == b) {
- debug(1, "Play imuse music: %s, %s", _ftStateMusicTable[l].name, _ftStateMusicTable[l].audioname);
+ debug(2, "Play imuse music: %s, %s", _ftStateMusicTable[l].name, _ftStateMusicTable[l].audioname);
if (_ftStateMusicTable[l].audioname[0] != 0) {
for(r = 0; r < _scumm->_numAudioNames; r++) {
if (strcmp(_ftStateMusicTable[l].audioname, &_scumm->_audioNames[r * 9]) == 0) {
@@ -5826,14 +5836,14 @@ int32 IMuseDigital::doCommand(int a, int b, int c, int d, int e, int f, int g, i
}
return 0;
case 1: // play music (seq)
- debug(1, "IMuseDigital::doCommand 0x1001 (%d)", b);
+ debug(2, "IMuseDigital::doCommand 0x1001 (%d)", b);
if (_scumm->_gameId == GID_DIG) {
for(l = 0;; l++) {
if (_digSeqMusicTable[l].index == -1) {
return 1;
}
if ((_digSeqMusicTable[l].index == b)) {
- debug(1, "Play imuse music: %s, %s, %s", _digSeqMusicTable[l].name, _digSeqMusicTable[l].title, _digSeqMusicTable[l].filename);
+ debug(2, "Play imuse music: %s, %s, %s", _digSeqMusicTable[l].name, _digSeqMusicTable[l].title, _digSeqMusicTable[l].filename);
if (_digSeqMusicTable[l].filename[0] != 0) {
_scumm->_sound->playBundleMusic((char*)&_digSeqMusicTable[l].filename);
}
@@ -5846,7 +5856,7 @@ int32 IMuseDigital::doCommand(int a, int b, int c, int d, int e, int f, int g, i
return 1;
}
if (_ftSeqMusicTable[l].index == b) {
- debug(1, "Play imuse music: %s, %s", _ftSeqMusicTable[l].name, _ftSeqMusicTable[l].audioname);
+ debug(2, "Play imuse music: %s, %s", _ftSeqMusicTable[l].name, _ftSeqMusicTable[l].audioname);
if (_ftSeqMusicTable[l].audioname[0] != 0) {
for(r = 0; r < _scumm->_numAudioNames; r++) {
if (strcmp(_ftSeqMusicTable[l].audioname, &_scumm->_audioNames[r * 9]) == 0) {
diff --git a/scumm/imuse.h b/scumm/imuse.h
index 80063199ab..2620276073 100644
--- a/scumm/imuse.h
+++ b/scumm/imuse.h
@@ -21,6 +21,7 @@
*/
class IMuseInternal;
+class MidiDriver;
class IMuse {
public:
@@ -108,6 +109,7 @@ private:
} _channel[MAX_DIGITAL_CHANNELS];
Scumm * _scumm;
+ bool _pause;
public:
IMuseDigital(Scumm *scumm);
@@ -116,6 +118,7 @@ public:
void startSound(int sound);
void stopSound(int sound);
void stopAll();
+ void pause(bool pause);
int32 doCommand(int a, int b, int c, int d, int e, int f, int g, int h);
int getSoundStatus(int sound);
};
diff --git a/scumm/saveload.cpp b/scumm/saveload.cpp
index bdbdb03516..f1d07c1383 100644
--- a/scumm/saveload.cpp
+++ b/scumm/saveload.cpp
@@ -115,6 +115,8 @@ bool Scumm::loadState(int slot, bool compat)
_imuseDigital->stopAll();
}
+ _sound->stopBundleMusic();
+
_sound->pauseSounds(true);
CHECK_HEAP openRoom(-1);
@@ -614,8 +616,13 @@ void Scumm::saveOrLoad(Serializer *s)
int var120Backup;
int var98Backup;
- if (_mixer && !s->isSaving())
- _mixer->stopAll();
+ if (_mixer && !s->isSaving()) {
+ if (_imuseDigital) {
+ _imuseDigital->stopAll();
+ } else {
+ _mixer->stopAll();
+ }
+ }
if (_current_version == VER_V9)
s->saveLoadEntries(this, mainEntriesV9);
diff --git a/scumm/smush/scumm_renderer.cpp b/scumm/smush/scumm_renderer.cpp
index 2db34688bd..94e0616ebd 100644
--- a/scumm/smush/scumm_renderer.cpp
+++ b/scumm/smush/scumm_renderer.cpp
@@ -27,9 +27,9 @@
#include "sound/mixer.h"
#include "scumm/scumm.h"
#include "scumm/sound.h"
+#include "scumm/imuse.h"
#include "scumm/actor.h"
-
class ScummMixer : public Mixer {
private:
SoundMixer * _mixer; //!< pointer to the SoundMixer instance
@@ -188,7 +188,6 @@ bool ScummMixer::stop() {
_channels[i].chan = 0;
}
}
-// _mixer->stopAll();
return true;
}
@@ -196,7 +195,6 @@ ScummRenderer::ScummRenderer(Scumm * scumm, uint32 speed) :
_scumm(scumm),
_smixer(0),
_insaneSpeed(speed) {
-// scumm->_mixer->stopAll();
}
static ScummRenderer * s_renderer;
@@ -207,7 +205,6 @@ static void smush_handler(void * engine) {
Mixer * ScummRenderer::getMixer() {
if(_smixer == 0) {
- _scumm->_sound->pauseBundleMusic(true);
_smixer = new ScummMixer(_scumm->_mixer);
if(!_smixer) error("unable to allocate a smush mixer");
s_renderer = this;
@@ -224,6 +221,9 @@ ScummRenderer::~ScummRenderer() {
delete _smixer;
_smixer = 0;
}
+ if (_scumm->_imuseDigital) {
+ _scumm->_imuseDigital->pause(false);
+ }
_scumm->_sound->pauseBundleMusic(false);
_scumm->_fullRedraw = 1;
_scumm->redrawBGAreas();
@@ -240,6 +240,9 @@ bool ScummRenderer::wait(int32 ms) {
}
bool ScummRenderer::startDecode(const char * fname, int32 version, int32 nbframes) {
+ if (_scumm->_imuseDigital) {
+ _scumm->_imuseDigital->pause(true);
+ }
_scumm->_sound->pauseBundleMusic(true);
_scumm->_videoFinished = false;
_scumm->_insaneState = true;
diff --git a/scumm/sound.cpp b/scumm/sound.cpp
index fb9714b188..00204c8b3a 100644
--- a/scumm/sound.cpp
+++ b/scumm/sound.cpp
@@ -710,6 +710,12 @@ void Sound::pauseSounds(bool pause) {
_soundsPaused = pause;
_scumm->_mixer->pause(pause);
+ _scumm->_sound->pauseBundleMusic(pause);
+
+ if (_scumm->_imuseDigital) {
+ _scumm->_imuseDigital->pause(pause);
+ }
+
if ((_scumm->_features & GF_AUDIOTRACKS) && _scumm->_vars[_scumm->VAR_MI1_TIMER] > 0) {
if (pause)
stopCDTimer();
@@ -843,8 +849,9 @@ File * Sound::openSfxFile() {
void Sound::stopSfxSound() {
if (_scumm->_imuseDigital) {
_scumm->_imuseDigital->stopAll();
+ } else {
+ _scumm->_mixer->stopAll();
}
- _scumm->_mixer->stopAll();
}
@@ -901,6 +908,8 @@ void Sound::playBundleMusic(char * song) {
_offsetSampleBundleMusic = 0;
_offsetBufBundleMusic = 0;
_pauseBundleMusic = false;
+ _musicBundleToBeRemoved = false;
+ _musicBundleToBeChanged = false;
_bundleMusicTrack = -1;
_numberSamplesBundleMusic = _scumm->_bundle->getNumberOfMusicSamplesByName(song);
_nameBundleMusic = song;
@@ -908,11 +917,9 @@ void Sound::playBundleMusic(char * song) {
return;
}
if (strcmp(_nameBundleMusic, song) != 0) {
- _numberSamplesBundleMusic = _scumm->_bundle->getNumberOfMusicSamplesByName(song);
- _nameBundleMusic = song;
- _currentSampleBundleMusic = 0;
- _offsetSampleBundleMusic = 0;
- _offsetBufBundleMusic = 0;
+ _newNameBundleMusic = song;
+ _musicBundleToBeRemoved = false;
+ _musicBundleToBeChanged = true;
}
}
@@ -921,17 +928,7 @@ void Sound::pauseBundleMusic(bool state) {
}
void Sound::stopBundleMusic() {
- _scumm->_timer->releaseProcedure(&music_handler);
- _nameBundleMusic = NULL;
- _bundleMusicTrack = -1;
- if (_musicBundleBufFinal) {
- free(_musicBundleBufFinal);
- _musicBundleBufFinal = NULL;
- }
- if (_musicBundleBufOutput) {
- free(_musicBundleBufOutput);
- _musicBundleBufOutput = NULL;
- }
+ _musicBundleToBeRemoved = true;
}
void Sound::bundleMusicHandler(Scumm * scumm) {
@@ -940,11 +937,36 @@ void Sound::bundleMusicHandler(Scumm * scumm) {
int32 rate = 22050;
int32 tag, size = -1, header_size = 0;
- ptr = _musicBundleBufOutput;
-
if (_pauseBundleMusic)
return;
+ if (_musicBundleToBeRemoved == true) {
+ _scumm->_timer->releaseProcedure(&music_handler);
+ _nameBundleMusic = NULL;
+ _scumm->_mixer->stopChannel(_bundleMusicTrack);
+ _bundleMusicTrack = -1;
+ if (_musicBundleBufFinal) {
+ free(_musicBundleBufFinal);
+ _musicBundleBufFinal = NULL;
+ }
+ if (_musicBundleBufOutput) {
+ free(_musicBundleBufOutput);
+ _musicBundleBufOutput = NULL;
+ }
+ return;
+ }
+
+ if (_musicBundleToBeChanged == true) {
+ _nameBundleMusic = _newNameBundleMusic;
+ _numberSamplesBundleMusic = _scumm->_bundle->getNumberOfMusicSamplesByName(_nameBundleMusic);
+ _currentSampleBundleMusic = 0;
+ _offsetSampleBundleMusic = 0;
+ _offsetBufBundleMusic = 0;
+ _musicBundleToBeChanged = false;
+ }
+
+ ptr = _musicBundleBufOutput;
+
for (k = 0, l = _currentSampleBundleMusic; l < num; k++) {
length = _scumm->_bundle->decompressMusicSampleByName(_nameBundleMusic, l, (_musicBundleBufOutput + ((k * 0x2000) + _offsetBufBundleMusic)));
_offsetSampleBundleMusic += length;
@@ -953,7 +975,7 @@ void Sound::bundleMusicHandler(Scumm * scumm) {
tag = READ_BE_UINT32(ptr); ptr += 4;
if (tag != MKID_BE('iMUS')) {
warning("Decompression of bundle song failed");
- _nameBundleMusic = NULL;
+ _musicBundleToBeRemoved = true;
return;
}
@@ -980,7 +1002,7 @@ void Sound::bundleMusicHandler(Scumm * scumm) {
}
if (size < 0) {
warning("Decompression sound failed (no size field)");
- _nameBundleMusic = NULL;
+ _musicBundleToBeRemoved = true;
return;
}
header_size = (ptr - _musicBundleBufOutput);
@@ -998,17 +1020,21 @@ void Sound::bundleMusicHandler(Scumm * scumm) {
}
}
- if (_currentSampleBundleMusic == num)
+ if (_currentSampleBundleMusic == num) {
_currentSampleBundleMusic = 0;
+ _offsetSampleBundleMusic = 0;
+ _offsetBufBundleMusic = 0;
+ }
size = OUTPUT_SIZE;
ptr = _musicBundleBufFinal;
byte * buffer = NULL;
uint32 final_size = decode12BitsSample(ptr, &buffer, size);
+
if (_bundleMusicTrack == -1) {
_bundleMusicTrack = _scumm->_mixer->playStream(NULL, -1, buffer, final_size, rate,
- SoundMixer::FLAG_AUTOFREE | SoundMixer::FLAG_16BITS | SoundMixer::FLAG_STEREO);
+ SoundMixer::FLAG_AUTOFREE | SoundMixer::FLAG_16BITS | SoundMixer::FLAG_STEREO, -1);
} else {
_scumm->_mixer->append(_bundleMusicTrack, buffer, final_size, rate,
SoundMixer::FLAG_AUTOFREE | SoundMixer::FLAG_16BITS | SoundMixer::FLAG_STEREO);
diff --git a/scumm/sound.h b/scumm/sound.h
index cad4619376..409e1b7c58 100644
--- a/scumm/sound.h
+++ b/scumm/sound.h
@@ -44,6 +44,7 @@ enum {
bool _soundVolumePreset;
char * _nameBundleMusic;
+ char * _newNameBundleMusic;
int32 _currentSampleBundleMusic;
int32 _numberSamplesBundleMusic;
int32 _offsetSampleBundleMusic;
@@ -52,6 +53,8 @@ enum {
byte * _musicBundleBufOutput;
bool _pauseBundleMusic;
int32 _bundleMusicTrack;
+ bool _musicBundleToBeChanged;
+ bool _musicBundleToBeRemoved;
int _talkChannel; /* Mixer channel actor is talking on */
File *_sfxFile;
diff --git a/scumm/string.cpp b/scumm/string.cpp
index 61c83be5ef..2de4718f54 100644
--- a/scumm/string.cpp
+++ b/scumm/string.cpp
@@ -475,7 +475,9 @@ void Scumm::description()
charset._center = false;
charset._color = 15;
_bkColor = 0;
- _talkDelay = 1;
+ // FIXME: _talkdelay = 1 - display description, not correct ego actor talking,
+ // 0 - no display, correct ego actor talking
+ _talkDelay = 0;
restoreCharsetBg();