aboutsummaryrefslogtreecommitdiff
path: root/sound
diff options
context:
space:
mode:
authorMax Horn2004-12-02 00:33:42 +0000
committerMax Horn2004-12-02 00:33:42 +0000
commit5d5a13eec758665306cd21af058c118debc2ab66 (patch)
tree0ccef35e3377f781d7b9bbbdf1b3d2a4993807a8 /sound
parentcdec823d98f37bf47a5e557371c6e5a6ce7e017f (diff)
downloadscummvm-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.cpp109
-rw-r--r--sound/mididrv.h32
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() { }
/**