From b6cf04bb0e4e511ffa795ee1cb8a11c70169500d Mon Sep 17 00:00:00 2001 From: Martin Kiewitz Date: Wed, 1 Jul 2015 01:30:12 +0200 Subject: [PATCH] AMAZON: implement proper AdLib support (Miles) implement proper AdLib support game uses MIDPAK, which seems to be basically Miles Audio too instrument data was hidden inside MIDIDRV.AP thanks to dreammaster for extracting the files --- engines/access/sound.cpp | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/engines/access/sound.cpp b/engines/access/sound.cpp index da267bdc4c61..89fd4fe66e34 100644 --- a/engines/access/sound.cpp +++ b/engines/access/sound.cpp @@ -21,9 +21,12 @@ */ #include "common/algorithm.h" +#include "common/config-manager.h" #include "audio/mixer.h" #include "audio/decoders/raw.h" #include "audio/decoders/wave.h" +// Miles Audio +#include "audio/miles.h" #include "access/access.h" #include "access/sound.h" @@ -194,9 +197,41 @@ MusicManager::MusicManager(AccessEngine *vm) : _vm(vm) { _music = nullptr; _tempMusic = nullptr; _isLooping = false; + _driver = nullptr; + MidiDriver::DeviceHandle dev = MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MT32); + MusicType musicType = MidiDriver::getMusicType(dev); + + // Amazon Guardians of Eden uses MIDPAK inside MIDIDRV.AP + // Amazon Guardians of Eden possibly used MIDPAK as well + // AdLib patches are inside MIDIDRV.AP too, 2nd resource file + switch (musicType) { + case MT_ADLIB: { + Resource *midiDrvResource = _vm->_files->loadFile(92, 1); + const byte *adLibInstrumentData = midiDrvResource->data(); + uint32 adLibInstrumentDataSize = midiDrvResource->_size; + + _driver = Audio::MidiDriver_Miles_AdLib_create("", "", adLibInstrumentData, adLibInstrumentDataSize); + + delete midiDrvResource; + break; + } + case MT_MT32: + _driver = Audio::MidiDriver_Miles_MT32_create(""); + _nativeMT32 = true; + break; + case MT_GM: + if (ConfMan.getBool("native_mt32")) { + _driver = Audio::MidiDriver_Miles_MT32_create(""); + _nativeMT32 = true; + } + break; + } + +#if 0 MidiPlayer::createDriver(); MidiDriver::detectDevice(MDT_MIDI | MDT_ADLIB | MDT_PREFER_GM); +#endif int retValue = _driver->open(); if (retValue == 0) { @@ -215,11 +250,15 @@ MusicManager::~MusicManager() { } void MusicManager::send(uint32 b) { + // Pass data directly to driver + _driver->send(b); +#if 0 if ((b & 0xF0) == 0xC0 && !_nativeMT32) { b = (b & 0xFFFF00FF) | MidiDriver::_mt32ToGm[(b >> 8) & 0xFF] << 8; } Audio::MidiPlayer::send(b); +#endif } void MusicManager::midiPlay() {