aboutsummaryrefslogtreecommitdiff
path: root/engines/queen/sound.cpp
diff options
context:
space:
mode:
authorGregory Montoir2007-02-18 21:46:40 +0000
committerGregory Montoir2007-02-18 21:46:40 +0000
commit18cab2cc65b8f13a8c69d65318706e75258b4b4f (patch)
tree33210359a781b529844cef4115a44d8adc1f6126 /engines/queen/sound.cpp
parent23a4e1de640a046d9517416b43a671b43ff9d81e (diff)
downloadscummvm-rg350-18cab2cc65b8f13a8c69d65318706e75258b4b4f.tar.gz
scummvm-rg350-18cab2cc65b8f13a8c69d65318706e75258b4b4f.tar.bz2
scummvm-rg350-18cab2cc65b8f13a8c69d65318706e75258b4b4f.zip
added basic support for playing FOTAQ amiga modules files (rjp1) instead of MIDI (code is currently #ifdef'ed out).
svn-id: r25707
Diffstat (limited to 'engines/queen/sound.cpp')
-rw-r--r--engines/queen/sound.cpp86
1 files changed, 83 insertions, 3 deletions
diff --git a/engines/queen/sound.cpp b/engines/queen/sound.cpp
index b416bb953c..b2f9bb04f5 100644
--- a/engines/queen/sound.cpp
+++ b/engines/queen/sound.cpp
@@ -42,9 +42,9 @@ namespace Queen {
Sound::Sound(Audio::Mixer *mixer, QueenEngine *vm) :
_mixer(mixer), _vm(vm), _sfxToggle(true), _speechToggle(true), _musicToggle(true), _lastOverride(0) {
-}
-
-Sound::~Sound() {
+#ifdef ENABLE_AMIGA_MUSIC
+ _lastModuleOverride = -1;
+#endif
}
Sound *Sound::giveSound(Audio::Mixer *mixer, QueenEngine *vm, uint8 compression) {
@@ -122,6 +122,84 @@ void Sound::playSound(const char *base, bool isSpeech) {
}
}
+#ifdef ENABLE_AMIGA_MUSIC
+
+static struct {
+ const char *name;
+ uint8 songNum;
+ uint8 remapSongNumTable[6];
+} amigaMusicData[] = {
+ { "HOTEL", 1, { 1, 2, 39, 0 } },
+ { "HOTEL", 2, { 20, 30, 34, 0 } },
+ { "HOTEL", 3, { 19, 0 } },
+ { "HOTEL", 4, { 29, 35, 36, 0 } },
+ { "JUNG", 1, { 40, 0 } },
+ { "JUNG", 2, { 3, 38, 89, 0 } },
+ { "TEMPLE", 1, { 54, 0 } },
+ { "TEMPLE", 2, { 12, 0 } },
+ { "TEMPLE", 3, { 7, 9, 10, 11, 0 } },
+ { "TEMPLE", 4, { 31, 0 } },
+ { "FLODA", 1, { 16, 0 } },
+ { "FLODA", 2, { 17, 0 } },
+ { "FLODA", 3, { 13, 0 } },
+ { "FLODA", 4, { 41, 0 } },
+ { "FLODA", 5, { 30, 43, 0 } },
+ { "TITLE", 1, { 67, 88, 203, 0 } },
+ { "AWESTRUK", 1, { 37, 52, 90, 196, 0 } },
+ { "'JUNGLE'", 1, { 91, 0 } },
+ { "FRANK", 1, { 46, 0 } },
+ { "BOB", 1, { 6, 0 } },
+ { "AZURA", 1, { 44, 53, 204, 0 } },
+ { "FORT", 1, { 21, 0 } },
+ { "ROCKET", 1, { 32, 194, 195, 0 } },
+ { "ROBOT", 1, { 92, 0 } }
+};
+
+void Sound::playSong(int16 songNum) {
+ debug(2, "Sound::playSong %d override %d/%d", songNum, _lastModuleOverride, _lastOverride);
+
+ const char *moduleName = 0;
+ for (int i = 0; i < ARRAYSIZE(amigaMusicData) && !moduleName; ++i) {
+ for (int j = 0; amigaMusicData[i].remapSongNumTable[j] != 0; ++j) {
+ if (amigaMusicData[i].remapSongNumTable[j] == songNum) {
+ moduleName = amigaMusicData[i].name;
+ songNum = amigaMusicData[i].songNum;
+
+ if (_lastModuleOverride == i && _lastOverride == songNum)
+ return;
+
+ _lastModuleOverride = i;
+ _lastOverride = songNum;
+ break;
+ }
+ }
+ }
+ if (!moduleName)
+ return;
+
+ _mixer->stopHandle(_musicHandle);
+
+ debug(1, "playAmigaSong name '%s' subsong %d", moduleName, songNum);
+
+ char buf[16];
+ sprintf(buf, "%s.SNG", moduleName);
+ Common::File fsng;
+ if (!fsng.open(buf))
+ return;
+
+ sprintf(buf, "%s.INS", moduleName);
+ Common::File fins;
+ if (!fins.open(buf))
+ return;
+
+ Audio::AudioStream *rjp1Stream = Audio::makeRjp1Stream(&fsng, &fins, songNum);
+ if (rjp1Stream) {
+ _mixer->playInputStream(Audio::Mixer::kMusicSoundType, &_musicHandle, rjp1Stream);
+ }
+}
+
+#else
+
void Sound::playSong(int16 songNum) {
if (songNum <= 0) {
_vm->music()->stopSong();
@@ -165,6 +243,8 @@ void Sound::playSong(int16 songNum) {
_vm->music()->playMusic();
}
+#endif // ENABLE_AMIGA_MUSIC
+
void Sound::saveState(byte *&ptr) {
WRITE_BE_UINT16(ptr, _lastOverride); ptr += 2;
}