diff options
-rw-r--r-- | kyra/kyra.cpp | 32 | ||||
-rw-r--r-- | kyra/sound.cpp | 6 | ||||
-rw-r--r-- | kyra/sound.h | 2 |
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; |