aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/simon/res.cpp24
-rw-r--r--engines/simon/simon.cpp6
-rw-r--r--engines/simon/simon.h1
-rw-r--r--engines/simon/sound.cpp17
-rw-r--r--engines/simon/sound.h3
5 files changed, 48 insertions, 3 deletions
diff --git a/engines/simon/res.cpp b/engines/simon/res.cpp
index c9ddd6a27b..a09f6d6b10 100644
--- a/engines/simon/res.cpp
+++ b/engines/simon/res.cpp
@@ -706,4 +706,28 @@ void SimonEngine::loadSound(uint sound, uint pan, uint vol, bool ambient) {
}
}
+void SimonEngine::loadVoice(uint speechId) {
+ if (getFeatures() & GF_ZLIBCOMP) {
+ char filename[15];
+
+ uint32 file, offset, srcSize, dstSize;
+ if (getPlatform() == Common::kPlatformAmiga) {
+ loadOffsets((const char*)"spindex.dat", speechId, file, offset, srcSize, dstSize);
+ } else {
+ loadOffsets((const char*)"speech.wav", speechId, file, offset, srcSize, dstSize);
+ }
+
+ if (getPlatform() == Common::kPlatformAmiga)
+ sprintf(filename, "sp%d.wav", file);
+ else
+ sprintf(filename, "speech.wav");
+
+ byte *dst = (byte *)malloc(dstSize);
+ decompressData(filename, dst, offset, srcSize, dstSize);
+ _sound->playVoiceData(dst, speechId);
+ } else {
+ _sound->playVoice(speechId);
+ }
+}
+
} // End of namespace Simon
diff --git a/engines/simon/simon.cpp b/engines/simon/simon.cpp
index d2fbfa94dd..0ce9807910 100644
--- a/engines/simon/simon.cpp
+++ b/engines/simon/simon.cpp
@@ -3240,7 +3240,7 @@ void SimonEngine::playSpeech(uint speech_id, uint vgaSpriteId) {
kill_sprite_simon1(204);
}
kill_sprite_simon1(vgaSpriteId + 201);
- _sound->playVoice(speech_id);
+ loadVoice(speech_id);
loadSprite(4, 2, vgaSpriteId + 201, 0, 0, 0);
}
} else {
@@ -3256,7 +3256,7 @@ void SimonEngine::playSpeech(uint speech_id, uint vgaSpriteId) {
_skipVgaWait = true;
} else {
if (_subtitles && _language != Common::HB_ISR) {
- _sound->playVoice(speech_id);
+ loadVoice(speech_id);
return;
} else if (_subtitles && _scriptVar2) {
loadSprite(4, 2, 5, 0, 0, 0);
@@ -3265,7 +3265,7 @@ void SimonEngine::playSpeech(uint speech_id, uint vgaSpriteId) {
}
kill_sprite_simon2(2, vgaSpriteId + 2);
- _sound->playVoice(speech_id);
+ loadVoice(speech_id);
loadSprite(4, 2, vgaSpriteId + 2, 0, 0, 0);
}
}
diff --git a/engines/simon/simon.h b/engines/simon/simon.h
index 17025aa856..826f09490b 100644
--- a/engines/simon/simon.h
+++ b/engines/simon/simon.h
@@ -483,6 +483,7 @@ protected:
void decompressData(const char *srcName, byte *dst, uint32 offset, uint32 srcSize, uint32 dstSize);
void loadOffsets(const char *filename, int number, uint32 &file, uint32 &offset, uint32 &compressedSize, uint32 &size);
void loadSound(uint sound, uint pan, uint vol, bool ambient);
+ void loadVoice(uint speechId);
void palette_fadeout(uint32 *pal_values, uint num);
diff --git a/engines/simon/sound.cpp b/engines/simon/sound.cpp
index 88cc32b969..73c0f36589 100644
--- a/engines/simon/sound.cpp
+++ b/engines/simon/sound.cpp
@@ -494,6 +494,23 @@ void Sound::playSoundData(byte *soundData, uint sound, uint pan, uint vol, bool
}
}
+void Sound::playVoiceData(byte *soundData, uint sound) {
+ byte flags;
+ int rate;
+
+ int size = READ_LE_UINT32(soundData + 4);
+ Common::MemoryReadStream stream(soundData, size);
+ if (!loadWAVFromStream(stream, size, rate, flags)) {
+ error("playSoundData: Not a valid WAV data");
+ }
+
+ byte *buffer = (byte *)malloc(size);
+ memcpy(buffer, soundData + stream.pos(), size);
+
+ _mixer->stopHandle(_voiceHandle);
+ _mixer->playRaw(&_voiceHandle, buffer, size, rate, flags);
+}
+
void Sound::playEffects(uint sound) {
if (!_effects)
return;
diff --git a/engines/simon/sound.h b/engines/simon/sound.h
index 245c6ffb0c..f2da1a61e2 100644
--- a/engines/simon/sound.h
+++ b/engines/simon/sound.h
@@ -65,7 +65,10 @@ public:
void playVoice(uint sound);
void playEffects(uint sound);
void playAmbient(uint sound);
+
+ // Feeble Files specific
void playSoundData(byte *soundData, uint sound, uint pan, uint vol, bool ambient);
+ void playVoiceData(byte *soundData, uint sound);
bool hasVoice() const;
bool isVoiceActive() const;