aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/hopkins/events.cpp2
-rw-r--r--engines/hopkins/sound.cpp25
-rw-r--r--engines/hopkins/sound.h19
3 files changed, 36 insertions, 10 deletions
diff --git a/engines/hopkins/events.cpp b/engines/hopkins/events.cpp
index 3a54e8788d..81ca05b236 100644
--- a/engines/hopkins/events.cpp
+++ b/engines/hopkins/events.cpp
@@ -154,7 +154,7 @@ void EventsManager::CHANGE_MOUSE(int id) {
// Check Events
void EventsManager::CONTROLE_MES() {
- _vm->_soundManager.checkMusic();
+ _vm->_soundManager.checkSounds();
pollEvents();
}
diff --git a/engines/hopkins/sound.cpp b/engines/hopkins/sound.cpp
index e23c7e525f..9cbfa39f71 100644
--- a/engines/hopkins/sound.cpp
+++ b/engines/hopkins/sound.cpp
@@ -331,6 +331,11 @@ void SoundManager::DEL_MUSIC() {
Music._currentIndex = -1;
}
+void SoundManager::checkSounds() {
+ checkMusic();
+ checkVoices();
+}
+
void SoundManager::checkMusic() {
if (Music._active && Music._isPlaying) {
int mwavIndex = Music._mwavIndexes[Music._currentIndex];
@@ -363,6 +368,20 @@ void SoundManager::checkMusic() {
}
}
+void SoundManager::checkVoices() {
+ // Check the status of each voice.
+ bool hasActiveVoice = false;
+ for (int i = 0; i < VOICE_COUNT; ++i) {
+ VOICE_STAT(i);
+ hasActiveVoice |= Voice[i]._status != 0;
+ }
+
+ if (!hasActiveVoice && SOUND_FLAG) {
+ SOUND_FLAG = false;
+ SOUND_NUM = 0;
+ }
+}
+
void SoundManager::LOAD_MSAMPLE(int mwavIndex, const Common::String &file) {
if (!Mwav[mwavIndex]._active) {
Common::File f;
@@ -578,7 +597,8 @@ void SoundManager::PLAY_WAV(int wavIndex) {
int SoundManager::VOICE_STAT(int voiceIndex) {
if (Voice[voiceIndex]._status) {
- if (Voice[voiceIndex]._audioStream->endOfStream())
+ int wavIndex = Voice[voiceIndex]._wavIndex;
+ if (Swav[wavIndex]._audioStream->endOfStream())
STOP_VOICE(voiceIndex);
}
@@ -599,7 +619,6 @@ void SoundManager::STOP_VOICE(int voiceIndex) {
Voice[voiceIndex].fieldC = 0;
Voice[voiceIndex]._status = 0;
Voice[voiceIndex].field14 = 0;
- Voice[voiceIndex]._audioStream = NULL;
}
void SoundManager::SDL_LVOICE(size_t filePosition, size_t entryLength) {
@@ -691,9 +710,9 @@ void SoundManager::PLAY_SAMPLE_SDL(int voiceIndex, int wavIndex) {
DEL_SAMPLE_SDL(wavIndex);
Voice[voiceIndex].fieldC = 0;
- Voice[voiceIndex]._audioStream = Swav[wavIndex]._audioStream;
Voice[voiceIndex]._status = 1;
Voice[voiceIndex].field14 = 4;
+ Voice[voiceIndex]._wavIndex = wavIndex;
int volume = (voiceIndex == 2) ? VOICEVOL * 255 / 16 : SOUNDVOL * 255 / 16;
diff --git a/engines/hopkins/sound.h b/engines/hopkins/sound.h
index 88cecbbea7..36184715ba 100644
--- a/engines/hopkins/sound.h
+++ b/engines/hopkins/sound.h
@@ -35,7 +35,6 @@ class VoiceItem {
public:
int _status;
int _wavIndex;
- Audio::RewindableAudioStream *_audioStream;
int fieldC;
int field14;
};
@@ -96,6 +95,18 @@ private:
void PLAY_SAMPLE_SDL(int voiceIndex, int wavIndex);
void LOAD_MSAMPLE(int mwavIndex, const Common::String &file);
void DEL_MSAMPLE(int mwavIndex);
+
+ /**
+ * Checks the music structure to see if music playback is active, and whether
+ * it needs to move to the next WAV file
+ */
+ void checkMusic();
+
+ /**
+ * Checks voices to see if they're finished
+ */
+ void checkVoices();
+
public:
int SPECIAL_SOUND;
int SOUNDVOL;
@@ -137,11 +148,6 @@ public:
void STOP_MUSIC();
void DEL_MUSIC();
- /**
- * Checks the music structure to see if music playback is active, and whether
- * it needs to move to the next WAV file
- */
- void checkMusic();
bool VOICE_MIX(int voiceId, int voiceMode);
void DEL_SAMPLE(int soundIndex);
@@ -156,6 +162,7 @@ public:
void syncSoundSettings();
void updateScummVMSoundSettings();
+ void checkSounds();
};
} // End of namespace Hopkins