diff options
author | Max Horn | 2004-12-02 00:33:42 +0000 |
---|---|---|
committer | Max Horn | 2004-12-02 00:33:42 +0000 |
commit | 5d5a13eec758665306cd21af058c118debc2ab66 (patch) | |
tree | 0ccef35e3377f781d7b9bbbdf1b3d2a4993807a8 /sound | |
parent | cdec823d98f37bf47a5e557371c6e5a6ce7e017f (diff) | |
download | scummvm-rg350-5d5a13eec758665306cd21af058c118debc2ab66.tar.gz scummvm-rg350-5d5a13eec758665306cd21af058c118debc2ab66.tar.bz2 scummvm-rg350-5d5a13eec758665306cd21af058c118debc2ab66.zip |
Moved MidiDriver creation code into the MidiDriver class (as static methods), same for some other MIDI related stuff
svn-id: r15968
Diffstat (limited to 'sound')
-rw-r--r-- | sound/mididrv.cpp | 109 | ||||
-rw-r--r-- | sound/mididrv.h | 32 |
2 files changed, 128 insertions, 13 deletions
diff --git a/sound/mididrv.cpp b/sound/mididrv.cpp index ed37e93272..11fa0d3b15 100644 --- a/sound/mididrv.cpp +++ b/sound/mididrv.cpp @@ -21,9 +21,11 @@ */ #include "stdafx.h" -#include "sound/mididrv.h" -#include "common/str.h" +#include "base/engine.h" +#include "common/config-manager.h" +#include "common/str.h" +#include "sound/mididrv.h" /** Internal list of all available 'midi' drivers. */ static const struct MidiDriverDescription midiDrivers[] = { @@ -67,11 +69,11 @@ static const struct MidiDriverDescription midiDrivers[] = { }; -const MidiDriverDescription *getAvailableMidiDrivers() { +const MidiDriverDescription *MidiDriver::getAvailableMidiDrivers() { return midiDrivers; } -int parseMusicDriver(const Common::String &str) { +int MidiDriver::parseMusicDriver(const Common::String &str) { if (str.isEmpty()) return -1; @@ -87,3 +89,102 @@ int parseMusicDriver(const Common::String &str) { return -1; } + +int MidiDriver::detectMusicDriver(int midiFlags) { + int musicDriver = parseMusicDriver(ConfMan.get("music_driver")); + /* Use the adlib sound driver if auto mode is selected, + * and the game is one of those that want adlib as + * default, OR if the game is an older game that doesn't + * support anything else anyway. */ + if (musicDriver == MD_AUTO || musicDriver < 0) { + if (midiFlags & MDT_PREFER_NATIVE) { + if (musicDriver == MD_AUTO) { + #if defined (WIN32) && !defined(_WIN32_WCE) + musicDriver = MD_WINDOWS; // MD_WINDOWS is default MidiDriver on windows targets + #elif defined(MACOSX) + musicDriver = MD_COREAUDIO; + #elif defined(__PALM_OS__) // must be before mac + musicDriver = MD_YPA1; // TODO : cahnge this and use Zodiac driver when needed + #elif defined(__MORPHOS__) + musicDriver = MD_ETUDE; + #elif defined (_WIN32_WCE) || defined(UNIX) || defined(X11_BACKEND) + // Always use MIDI emulation via adlib driver on CE and UNIX device + + // TODO: We should, for the Unix targets, attempt to detect + // whether a sequencer is available, and use it instead. + musicDriver = MD_ADLIB; + #else + musicDriver = MD_NULL; + #endif + } else + musicDriver = MD_ADLIB; + } else + musicDriver = MD_TOWNS; + } + bool nativeMidiDriver = + (musicDriver != MD_NULL && musicDriver != MD_ADLIB && + musicDriver != MD_PCSPK && musicDriver != MD_PCJR && + musicDriver != MD_TOWNS); + + if (nativeMidiDriver && !(midiFlags & MDT_NATIVE)) + musicDriver = MD_TOWNS; + if (musicDriver == MD_TOWNS && !(midiFlags & MDT_TOWNS)) + musicDriver = MD_ADLIB; + if (musicDriver == MD_ADLIB && !(midiFlags & MDT_ADLIB)) + musicDriver = MD_PCJR; + if ((musicDriver == MD_PCSPK || musicDriver == MD_PCJR) && !(midiFlags & MDT_PCSPK)) + musicDriver = MD_NULL; + + return musicDriver; +} + +MidiDriver *MidiDriver::createMidi(int midiDriver) { + switch(midiDriver) { + case MD_NULL: return MidiDriver_NULL_create(); + + // In the case of Adlib, we won't specify anything. + // IMuse is designed to set up its own Adlib driver + // if need be, and we only have to specify a native + // driver. + case MD_ADLIB: return NULL; + +#ifdef USE_MT32EMU + case MD_MT32: return MidiDriver_MT32_create(g_engine->_mixer); +#endif + + case MD_TOWNS: return MidiDriver_YM2612_create(g_engine->_mixer); + + // Right now PC Speaker and PCjr are handled + // outside the MidiDriver architecture, so + // don't create anything for now. + case MD_PCSPK: + case MD_PCJR: return NULL; +#if defined(__PALM_OS__) + case MD_YPA1: return MidiDriver_YamahaPa1_create(); +#ifndef DISABLE_TAPWAVE + case MD_ZODIAC: return MidiDriver_Zodiac_create(); +#endif +#endif +#if defined(WIN32) && !defined(_WIN32_WCE) + case MD_WINDOWS: return MidiDriver_WIN_create(); +#endif +#if defined(__MORPHOS__) + case MD_ETUDE: return MidiDriver_ETUDE_create(); +#endif +#if defined(UNIX) && !defined(__BEOS__) && !defined(MACOSX) + case MD_SEQ: return MidiDriver_SEQ_create(); +#endif +#if (defined(MACOSX) || defined(macintosh)) && !defined(__PALM_OS__) + case MD_QTMUSIC: return MidiDriver_QT_create(); +#endif +#if defined(MACOSX) + case MD_COREAUDIO: return MidiDriver_CORE_create(); +#endif +#if defined(UNIX) && defined(USE_ALSA) + case MD_ALSA: return MidiDriver_ALSA_create(); +#endif + } + + error("Invalid midi driver selected"); + return NULL; +} diff --git a/sound/mididrv.h b/sound/mididrv.h index b6e57fe7f9..0041c146ed 100644 --- a/sound/mididrv.h +++ b/sound/mididrv.h @@ -51,8 +51,14 @@ enum { MD_MT32 = 16 }; -/** Convert a string containing a music driver name into MIDI Driver type. */ -extern int parseMusicDriver(const Common::String &str); +enum MidiDriverType { + MDT_NONE = 0, + MDT_PCSPK = 1, // MD_PCSPK and MD_PCJR + MDT_ADLIB = 2, // MD_ADLIB + MDT_TOWNS = 4, // MD_TOWNS + MDT_NATIVE = 8, // Everything else + MDT_PREFER_NATIVE = 16 +}; /** * Abstract description of a MIDI driver. Used by the config file and command @@ -65,16 +71,24 @@ struct MidiDriverDescription { int id; }; -/** - * Get a list of all available MidiDriver types. - * @return list of all available midi drivers, terminated by a zero entry - */ -extern const MidiDriverDescription *getAvailableMidiDrivers(); - - /** Abstract MIDI Driver Class */ class MidiDriver { public: + /** Convert a string containing a music driver name into MIDI Driver type. */ + static int parseMusicDriver(const Common::String &str); + + /** + * Get a list of all available MidiDriver types. + * @return list of all available midi drivers, terminated by a zero entry + */ + static const MidiDriverDescription *getAvailableMidiDrivers(); + + static MidiDriver *createMidi(int midiDriver); + + static int detectMusicDriver(int midiFlags); + + +public: virtual ~MidiDriver() { } /** |