diff options
author | Martin Kiewitz | 2015-06-28 02:10:18 +0200 |
---|---|---|
committer | Martin Kiewitz | 2015-06-28 02:10:18 +0200 |
commit | 63656348a7e09c7d026099c3bd204fca10393969 (patch) | |
tree | 590d1c0db8e7ae8aaba857e3e91e7f1f63218863 /engines/tinsel | |
parent | 7594507277ba7506b8c7142b8a1463a97036c14d (diff) | |
download | scummvm-rg350-63656348a7e09c7d026099c3bd204fca10393969.tar.gz scummvm-rg350-63656348a7e09c7d026099c3bd204fca10393969.tar.bz2 scummvm-rg350-63656348a7e09c7d026099c3bd204fca10393969.zip |
TINSEL: DW1: add support for Miles Audio driver
- AdLib + MT32 support
Diffstat (limited to 'engines/tinsel')
-rw-r--r-- | engines/tinsel/music.cpp | 45 | ||||
-rw-r--r-- | engines/tinsel/music.h | 4 | ||||
-rw-r--r-- | engines/tinsel/tinsel.cpp | 2 |
3 files changed, 47 insertions, 4 deletions
diff --git a/engines/tinsel/music.cpp b/engines/tinsel/music.cpp index 8a7305f63b..354fce179d 100644 --- a/engines/tinsel/music.cpp +++ b/engines/tinsel/music.cpp @@ -27,6 +27,8 @@ #include "audio/audiostream.h" #include "audio/mididrv.h" #include "audio/midiparser.h" +// Miles Audio for Discworld 1 +#include "audio/miles.h" #include "audio/decoders/adpcm.h" #include "backends/audiocd/audiocd.h" @@ -373,8 +375,42 @@ void DeleteMidiBuffer() { g_midiBuffer.pDat = NULL; } -MidiMusicPlayer::MidiMusicPlayer() { - MidiPlayer::createDriver(); +MidiMusicPlayer::MidiMusicPlayer(TinselEngine *vm) { + _driver = NULL; + _milesAudioMode = false; + bool milesAudioEnabled = true; + + if ((vm->getGameId() == GID_DW1) && (milesAudioEnabled)) { + // Discworld 1 uses Miles Audio 3 + // use our own Miles Audio drivers + // DW1 has SAMPLE.AD + SAMPLE.OPL, but no SAMPLE.MT + ::MidiDriver::DeviceHandle dev = ::MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM); + ::MusicType musicType = ::MidiDriver::getMusicType(dev); + + switch (musicType) { + case MT_ADLIB: + _driver = Audio::MidiDriver_Miles_AdLib_create("SAMPLE.AD", "SAMPLE.OPL"); + break; + case MT_MT32: + _driver = Audio::MidiDriver_Miles_MT32_create("SAMPLE.MT"); + break; + case MT_GM: + if (ConfMan.getBool("native_mt32")) { + _driver = Audio::MidiDriver_Miles_MT32_create("SAMPLE.MT"); + musicType = MT_MT32; + } + break; + } + if (!_driver) { + // nothing got created yet? -> create default driver + MidiPlayer::createDriver(); + } else { + _milesAudioMode = true; + } + + } else { + MidiPlayer::createDriver(); + } int ret = _driver->open(); if (ret == 0) { @@ -394,6 +430,11 @@ void MidiMusicPlayer::setVolume(int volume) { } void MidiMusicPlayer::send(uint32 b) { + if (_milesAudioMode) { + _driver->send(b); + return; + } + Audio::MidiPlayer::send(b); byte channel = (byte)(b & 0x0F); diff --git a/engines/tinsel/music.h b/engines/tinsel/music.h index 0a78c39a76..422d80ae30 100644 --- a/engines/tinsel/music.h +++ b/engines/tinsel/music.h @@ -60,7 +60,7 @@ void dumpMusic(); class MidiMusicPlayer : public Audio::MidiPlayer { public: - MidiMusicPlayer(); + MidiMusicPlayer(TinselEngine *vm); virtual void setVolume(int volume); @@ -77,6 +77,8 @@ public: // means. The default is 120. uint32 getBaseTempo() { return _driver ? (109 * _driver->getBaseTempo()) / 120 : 0; } + bool _milesAudioMode; + private: void playXMIDI(uint32 size, bool loop); void playSEQ(uint32 size, bool loop); diff --git a/engines/tinsel/tinsel.cpp b/engines/tinsel/tinsel.cpp index 57d8432f0e..28e569cd3a 100644 --- a/engines/tinsel/tinsel.cpp +++ b/engines/tinsel/tinsel.cpp @@ -890,7 +890,7 @@ void TinselEngine::initializePath(const Common::FSNode &gamePath) { } Common::Error TinselEngine::run() { - _midiMusic = new MidiMusicPlayer(); + _midiMusic = new MidiMusicPlayer(this); _pcmMusic = new PCMMusicPlayer(); _sound = new SoundManager(this); _bmv = new BMVPlayer(); |