aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kyra/kyra.cpp32
-rw-r--r--kyra/sound.cpp6
-rw-r--r--kyra/sound.h2
3 files changed, 27 insertions, 13 deletions
diff --git a/kyra/kyra.cpp b/kyra/kyra.cpp
index 9247c84992..3dc230e45a 100644
--- a/kyra/kyra.cpp
+++ b/kyra/kyra.cpp
@@ -121,19 +121,25 @@ KyraEngine::KyraEngine(GameDetector *detector, OSystem *syst)
} else {
error("unknown game");
}
-
- MidiDriver *driver = GameDetector::createMidi(GameDetector::detectMusicDriver(MDT_NATIVE | MDT_PREFER_NATIVE));
- if (driver) {
- if (ConfMan.getBool("native_mt32"))
- driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE);
- _midiDriver = new MusicPlayer(driver, this);
- assert(_midiDriver);
- _midiDriver->hasNativeMT32(ConfMan.getBool("native_mt32"));
- _midiDriver->setVolume(255);
- } else {
- warning("Couldn't create MIDI driver... No music!");
- _midiDriver = NULL;
- };
+
+ int midiDrv = GameDetector::detectMusicDriver(MDT_NATIVE | MDT_ADLIB | MDT_PREFER_NATIVE);
+ bool native_mt32 = (ConfMan.getBool("native_mt32") || (midiDrv == MD_MT32));
+
+ MidiDriver *driver = GameDetector::createMidi(midiDrv);
+ if (!driver) {
+ // In this case we should play the Adlib tracks, but for now
+ // the automagic MIDI-to-Adlib conversion will do.
+ driver = MidiDriver_ADLIB_create(_mixer);
+ } else if (native_mt32)
+ driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE);
+
+ _midiDriver = new MusicPlayer(driver, this);
+ assert(_midiDriver);
+ _midiDriver->hasNativeMT32(native_mt32);
+ _midiDriver->setVolume(255);
+
+ if (midiDrv == MD_MT32)
+ _midiDriver->setPassThrough(true);
// Initialize backen
syst->initSize(320, 200);
diff --git a/kyra/sound.cpp b/kyra/sound.cpp
index d631f35b5a..40b73efed1 100644
--- a/kyra/sound.cpp
+++ b/kyra/sound.cpp
@@ -18,6 +18,7 @@ namespace Kyra {
MusicPlayer::MusicPlayer(MidiDriver* driver, KyraEngine* engine) {
_engine = engine;
_driver = driver;
+ _passThrough = false;
_isPlaying = _nativeMT32 = false;
memset(_channel, 0, sizeof(MidiChannel*) * 16);
@@ -73,6 +74,11 @@ namespace Kyra {
}
void MusicPlayer::send(uint32 b) {
+ if (_passThrough) {
+ _driver->send(b);
+ return;
+ }
+
uint8 channel = (byte)(b & 0x0F);
if ((b & 0xFFF0) == 0x07B0) {
// Adjust volume changes by master volume
diff --git a/kyra/sound.h b/kyra/sound.h
index dfe393e53c..e9e33952fc 100644
--- a/kyra/sound.h
+++ b/kyra/sound.h
@@ -25,6 +25,7 @@ namespace Kyra {
void stopMusic();
void playTrack(uint8 track);
+ void setPassThrough(bool b) { _passThrough = b; }
//MidiDriver interface implementation
int open();
@@ -47,6 +48,7 @@ namespace Kyra {
uint8 _channelVolume[16];
MidiDriver* _driver;
bool _nativeMT32;
+ bool _passThrough;
uint8 _volume;
bool _isPlaying;
MidiParser* _parser;