From bb6765f85d6272f736fa9bbe0981582fa7679ef5 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Thu, 2 Oct 2003 22:52:57 +0000 Subject: cleanup & restructuring; in particular move the midi driver list to its own source file svn-id: r10550 --- TODO | 7 +++ base/gameDetector.cpp | 158 +++++++++++++++++++++----------------------------- base/gameDetector.h | 31 ++-------- base/plugins.cpp | 3 + gui/options.cpp | 27 +++++---- sound/mididrv.cpp | 68 ++++++++++++++++++++++ sound/mididrv.h | 78 ++++++++++++++++--------- sound/module.mk | 1 + 8 files changed, 212 insertions(+), 161 deletions(-) create mode 100644 sound/mididrv.cpp diff --git a/TODO b/TODO index c9ff5a2425..969df839e7 100644 --- a/TODO +++ b/TODO @@ -111,6 +111,13 @@ Descumm * Rewrite code to use 2 passes; first pass builds an intermediate graph, the second pass then tries to detect loops, break/continue statements etc. +Backend +======= +* Several of the backend factory functions take config parameters. It should + be possible to get rid of those once the config system rewrite (see above) + has been done. In that case, the backends simply can query the config + manager for these parameters (or any others they might like :-). + SDL backend =========== * Maybe change the shortcuts? One idea (add ctrl-alt in all cases): diff --git a/base/gameDetector.cpp b/base/gameDetector.cpp index 4e44eb1a62..41a00ee967 100644 --- a/base/gameDetector.cpp +++ b/base/gameDetector.cpp @@ -21,12 +21,15 @@ */ #include "stdafx.h" + #include "backends/intern.h" +#include "base/engine.h" #include "base/gameDetector.h" #include "base/plugins.h" + #include "common/config-file.h" -#include "base/engine.h" #include "common/scaler.h" // Only for gfx_modes + #include "sound/mididrv.h" #include "sound/mixer.h" @@ -51,52 +54,50 @@ static const char USAGE_STRING[] = "NoUsageString"; // save more data segment sp static const char USAGE_STRING[] = "ScummVM - Graphical Adventure Game Interpreter\n" "Syntax:\n" - "\tscummvm [OPTIONS] [game]\n" + " scummvm [OPTIONS] [game]\n" "Options:\n" - "\t-p - Look for game in \n" - "\t-x[num] - Load this savegame (default: 0 - autosave)\n" - "\t-f - Full-screen mode (-F forces window mode.)\n" - "\t-g - Graphics mode (normal,2x,3x,2xsai,super2xsai,\n" - "\t supereagle,advmame2x,advmame3x,hq2x,hq3x,\n" - "\t tv2x,dotmatrix)\n" - "\t-e - Set music engine (see README for details)\n" - "\t-q - Specify language (en,de,fr,it,pt,es,jp,zh,kr,se,\n" - "\t gb,hb)\n" + " -p - Look for game in \n" + " -x[num] - Load this savegame (default: 0 - autosave)\n" + " -f - Full-screen mode (-F forces window mode.)\n" + " -g - Graphics mode (normal,2x,3x,2xsai,super2xsai,supereagle,\n" + " advmame2x,advmame3x,hq2x,hq3x,tv2x,dotmatrix)\n" + " -e - Set music engine (see README for details)\n" + " -q - Specify language (en,de,fr,it,pt,es,jp,zh,kr,se,gb,hb)\n" "\n" - "\t-c - Use cdrom for cd audio\n" - "\t-j[num] - Enable input with joystick (default: 0 - 1st joystick)\n" - "\t-m - Set music volume to (0-255)\n" - "\t-o - Set master volume to (0-255)\n" - "\t-s - Set sfx volume to (0-255)\n" - "\t-t - Set music tempo (50-200, default 100%%)\n" + " -c - Use cdrom for cd audio\n" + " -j[num] - Enable input with joystick (default: 0 - first joystick)\n" + " -m - Set music volume to (0-255)\n" + " -o - Set master volume to (0-255)\n" + " -s - Set sfx volume to (0-255)\n" + " -t - Set music tempo (50-200, default 100%%)\n" "\n" - "\t-n - No subtitles for speech\n" - "\t-y - Set text speed (default: 60)\n" + " -n - No subtitles for speech\n" + " -y - Set text speed (default: 60)\n" "\n" - "\t-l - Load config file instead of default\n" + " -l - Load config file instead of default\n" #if defined(UNIX) - "\t-w[file] - Write to config file [~/.scummvmrc]\n" + " -w[file] - Write to config file [~/.scummvmrc]\n" #else - "\t-w[file] - Write to config file [scummvm.ini]\n" + " -w[file] - Write to config file [scummvm.ini]\n" #endif - "\t-v - Show version info and exit\n" - "\t-h - Display this text and exit\n" - "\t-z - Display list of games\n" + " -v - Show version info and exit\n" + " -h - Display this text and exit\n" + " -z - Display list of games\n" "\n" - "\t-b - Pass number to the boot script (boot param)\n" - "\t-d[num] - Enable debug output (debug level [0])\n" - "\t-u - Dump scripts\n" + " -b - Pass number to the boot script (boot param)\n" + " -d[num] - Enable debug output (debug level [0])\n" + " -u - Dump scripts\n" "\n" - "\t--platform= - Specify version of game (amiga,atari-st,macintosh)\n" - "\t--multi-midi - Enable combination Adlib and native MIDI\n" - "\t--native-mt32 - True Roland MT-32 (disable GM emulation)\n" - "\t--fullscreen - Full-screen mode (same as -f)\n" - "\t--aspect-ratio - Enable aspect ratio correction\n" + " --platform= - Specify version of game (amiga,atari-st,macintosh)\n" + " --multi-midi - Enable combination Adlib and native MIDI\n" + " --native-mt32 - True Roland MT-32 (disable GM emulation)\n" + " --fullscreen - Full-screen mode (same as -f)\n" + " --aspect-ratio - Enable aspect ratio correction\n" #ifndef DISABLE_SCUMM - "\t--demo-mode - Start demo mode of Maniac Mansion (Classic version)\n" + " --demo-mode - Start demo mode of Maniac Mansion (Classic version)\n" #endif #ifndef DISABLE_SKY - "\t--floppy-intro - Use floppy version intro for Beneath a Steel Sky CD\n" + " --floppy-intro - Use floppy version intro for Beneath a Steel Sky CD\n" #endif "\n" "The meaning of long options can be inverted by prefixing them with \"no-\",\n" @@ -104,6 +105,20 @@ static const char USAGE_STRING[] = ; #endif + +struct GraphicsMode { + const char *name; + const char *description; + int id; +}; + +/** + * List of graphic 'modes' we potentially support. Potentially because not all + * backends actually support all the filters listed here. At this point only + * the SDL backend supports all (except for the PalmOS ones of course). + * @todo Remove this explicit list of graphic modes and rather extend the + * OSystem API to allow querying a backend for the modes it supports. + */ static const struct GraphicsMode gfx_modes[] = { {"normal", "Normal (no scaling)", GFX_NORMAL}, {"1x", "Normal (no scaling)", GFX_NORMAL}, @@ -128,6 +143,12 @@ static const struct GraphicsMode gfx_modes[] = { {0, 0, 0} }; +struct Language { + const char *name; + const char *description; + int id; +}; + static const struct Language languages[] = { {"en", "English", EN_USA}, {"de", "German", DE_DEU}, @@ -144,25 +165,6 @@ static const struct Language languages[] = { {0, 0, 0} }; -static const struct MusicDriver music_drivers[] = { - {"auto", "Default", MD_AUTO}, - {"null", "No music", MD_NULL}, -#ifndef __PALM_OS__ // reduce contant data size - {"windows", "Windows MIDI", MD_WINDOWS}, - {"seq", "SEQ", MD_SEQ}, - {"qt", "QuickTime", MD_QTMUSIC}, - {"core", "CoreAudio", MD_COREAUDIO}, - {"etude", "Etude", MD_ETUDE}, - {"alsa", "ALSA", MD_ALSA}, - {"adlib", "Adlib", MD_ADLIB}, - {"pcspk", "PC Speaker", MD_PCSPK}, - {"pcjr", "IBM PCjr", MD_PCJR}, -#else - {"ypa1", "Yamaha Pa1", MD_YPA1}, -#endif - {0, 0, 0} -}; - GameDetector::GameDetector() { _fullScreen = false; @@ -363,6 +365,10 @@ void GameDetector::parseCommandLine(int argc, char **argv) { break; case 'e': HANDLE_OPTION(); + // TODO: Instead of just showing the generic help text, + // maybe print a message like: + // "'option' is not a supported music driver on this machine. + // Available driver: ..." if (!parseMusicDriver(option)) goto ShowHelpAndExit; g_config->set("music_driver", option); @@ -376,6 +382,10 @@ void GameDetector::parseCommandLine(int argc, char **argv) { case 'g': HANDLE_OPTION(); _gfx_mode = parseGraphicsMode(option); + // TODO: Instead of just showing the generic help text, + // maybe print a message like: + // "'option' is not a supported graphic mode on this machine. + // Available graphic modes: ..." if (_gfx_mode == -1) goto ShowHelpAndExit; g_config->set("gfx_mode", option); @@ -593,46 +603,8 @@ int GameDetector::parseLanguage(const char *s) { return -1; } -bool GameDetector::isMusicDriverAvailable(int drv) { - switch(drv) { - case MD_AUTO: - case MD_NULL: return true; -#ifndef __PALM_OS__ // don't show it on palmos - case MD_ADLIB: - case MD_PCSPK: - case MD_PCJR: return true; -#else - case MD_YPA1: return true; -#endif -#if defined(WIN32) && !defined(_WIN32_WCE) - case MD_WINDOWS: return true; -#endif -#if defined(__MORPHOS__) - case MD_ETUDE: return true; -#endif -#if defined(UNIX) && !defined(__BEOS__) && !defined(MACOSX) - case MD_SEQ: return true; -#endif -#if defined(MACOSX) || defined(macintosh) - case MD_QTMUSIC: return true; -#endif -#if defined(MACOSX) - case MD_COREAUDIO: return true; -#endif -#if defined(UNIX) && defined(USE_ALSA) - case MD_ALSA: return true; -#endif - } - return false; -} - -const MusicDriver *GameDetector::getMusicDrivers() { - return music_drivers; -} - - bool GameDetector::parseMusicDriver(const char *s) { - const MusicDriver *md = music_drivers; + const MidiDriverDescription *md = getAvailableMidiDrivers(); while (md->name) { if (!scumm_stricmp(md->name, s)) { diff --git a/base/gameDetector.h b/base/gameDetector.h index 798780adf9..038a7681c4 100644 --- a/base/gameDetector.h +++ b/base/gameDetector.h @@ -46,9 +46,10 @@ enum { GF_DEFAULT_TO_1X_SCALER = 1 << 31 }; -/* Languages - * note: values 0->8 are are _needed_ for scripts in comi please don't - * remove/change fixed numbers from this enum +/** + * List of language ids. + * @note The order and mappings of the values 0..8 are *required* to stay the + * way they are now, as scripts in COMI rely on them. So don't touch them. */ enum { EN_USA = 0, @@ -82,33 +83,9 @@ struct TargetSettings { const char *detectname; }; -struct MusicDriver { - const char *name; - const char *description; - int id; -}; - -struct GraphicsMode { - const char *name; - const char *description; - int id; -}; - -struct Language { - const char *name; - const char *description; - int id; -}; - -typedef Engine *(*EngineFactory)(GameDetector *detector, OSystem *syst); - class GameDetector { typedef Common::String String; -public: - static const MusicDriver *getMusicDrivers(); - static bool isMusicDriverAvailable(int drv); - public: GameDetector(); diff --git a/base/plugins.cpp b/base/plugins.cpp index 3ba63f3e0e..04d1460ec2 100644 --- a/base/plugins.cpp +++ b/base/plugins.cpp @@ -26,6 +26,9 @@ #include "common/util.h" +typedef Engine *(*EngineFactory)(GameDetector *detector, OSystem *syst); + + #ifdef DYNAMIC_MODULES #ifdef UNIX diff --git a/gui/options.cpp b/gui/options.cpp index abba0229e0..0e3bc0ea73 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -19,15 +19,16 @@ */ #include "stdafx.h" -#include "browser.h" -#include "chooser.h" -#include "newgui.h" -#include "options.h" -#include "PopUpWidget.h" +#include "gui/browser.h" +#include "gui/chooser.h" +#include "gui/newgui.h" +#include "gui/options.h" +#include "gui/PopUpWidget.h" #include "backends/fs/fs.h" -#include "common/config-file.h" #include "base/gameDetector.h" +#include "common/config-file.h" +#include "sound/mididrv.h" #if (!( defined(__DC__) || defined(__GP32__)) && !defined(_MSC_VER)) #include @@ -90,14 +91,12 @@ GlobalOptionsDialog::GlobalOptionsDialog(NewGui *gui, GameDetector &detector) int midiSelected = 0, i = 0;; // Populate it - const MusicDriver *md = GameDetector::getMusicDrivers(); + const MidiDriverDescription *md = getAvailableMidiDrivers(); while (md->name) { - if (GameDetector::isMusicDriverAvailable(md->id)) { - _midiPopUp->appendEntry(md->description, md->id); - if (md->id == _detector._midi_driver) - midiSelected = i; - i++; - } + _midiPopUp->appendEntry(md->description, md->id); + if (md->id == _detector._midi_driver) + midiSelected = i; + i++; md++; } _midiPopUp->setSelected(midiSelected); @@ -205,7 +204,7 @@ void GlobalOptionsDialog::handleCommand(CommandSender *sender, uint32 cmd, uint3 break; case kPopUpItemSelectedCmd: if (sender == _midiPopUp) { - const MusicDriver *md = GameDetector::getMusicDrivers(); + const MidiDriverDescription *md = getAvailableMidiDrivers(); for (; md->name; md++) { if (md->id == (int) data) { g_config->set ("music_driver", md->name, "_USER_OVERRIDES"); diff --git a/sound/mididrv.cpp b/sound/mididrv.cpp new file mode 100644 index 0000000000..3f175ce1f6 --- /dev/null +++ b/sound/mididrv.cpp @@ -0,0 +1,68 @@ +/* ScummVM - Scumm Interpreter + * Copyright (C) 2001 Ludvig Strigeus + * Copyright (C) 2001-2003 The ScummVM project + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * $Header$ + * + */ + +#include "stdafx.h" +#include "sound/mididrv.h" + + +/** Internal list of all available 'midi' drivers. */ +static const struct MidiDriverDescription midiDrivers[] = { + {"auto", "Default", MD_AUTO}, + {"null", "No music", MD_NULL}, + +#if defined(WIN32) && !defined(_WIN32_WCE) + {"windows", "Windows MIDI", MD_WINDOWS}, +#endif + +#if defined(UNIX) && !defined(__BEOS__) && !defined(MACOSX) + {"seq", "SEQ", MD_SEQ}, +#endif + +#if defined(MACOSX) + {"qt", "QuickTime", MD_QTMUSIC}, + {"core", "CoreAudio", MD_COREAUDIO}, +#endif + +#if defined(__MORPHOS__) + {"etude", "Etude", MD_ETUDE}, +#endif + +#if defined(UNIX) && defined(USE_ALSA) + {"alsa", "ALSA", MD_ALSA}, +#endif + +#if !defined(__PALM_OS__) + {"adlib", "Adlib", MD_ADLIB}, + {"pcspk", "PC Speaker", MD_PCSPK}, + {"pcjr", "IBM PCjr", MD_PCJR}, +#endif + +#if defined(__PALM_OS__) + {"ypa1", "Yamaha Pa1", MD_YPA1}, +#endif + {0, 0, 0} +}; + + +const MidiDriverDescription *getAvailableMidiDrivers() { + return midiDrivers; +} diff --git a/sound/mididrv.h b/sound/mididrv.h index f9164cb3fb..65043ff5f9 100644 --- a/sound/mididrv.h +++ b/sound/mididrv.h @@ -28,13 +28,53 @@ class MidiChannel; class SoundMixer; -// Abstract MIDI Driver Class + +/** MIDI Driver Types */ +enum { + MD_AUTO = 0, + MD_NULL = 1, + MD_WINDOWS = 2, + MD_TIMIDITY = 3, + MD_SEQ = 4, + MD_QTMUSIC = 5, + MD_ETUDE = 6, + MD_COREAUDIO = 7, + MD_MIDIEMU = 8, + MD_ALSA = 9, + MD_ADLIB = 10, + MD_PCSPK = 11, + MD_PCJR = 12, + + MD_YPA1 = 100 // palmos +}; + +/** + * Abstract description of a MIDI driver. Used by the config file and command + * line parsing code, and also to be able to give the user a list of available + * drivers. + */ +struct MidiDriverDescription { + const char *name; + const char *description; + 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: virtual ~MidiDriver() { } - // Error codes returned by open. - // Can be converted to a string with getErrorName() + /** + * Error codes returned by open. + * Can be converted to a string with getErrorName(). + */ enum { MERR_CANNOT_CONNECT = 1, // MERR_STREAMING_NOT_AVAILABLE = 2, @@ -48,20 +88,22 @@ public: PROP_CHANNEL_MASK = 3 }; - // Open the midi driver. - // Returns 0 if successful, otherwise an error code. + /** + * Open the midi driver. + * @return 0 if successful, otherwise an error code. + */ virtual int open() = 0; - // Close the midi driver + /** Close the midi driver. */ virtual void close() = 0; - // Output a packed midi command to the midi stream + /** Output a packed midi command to the midi stream. */ virtual void send(uint32 b) = 0; - // Get or set a property + /** Get or set a property. */ virtual uint32 property(int prop, uint32 param) { return 0; } - // Retrieve a string representation of an error code + /** Retrieve a string representation of an error code. */ static const char *getErrorName(int error_code); // HIGH-LEVEL SEMANTIC METHODS @@ -117,24 +159,6 @@ public: virtual void sysEx_customInstrument (uint32 type, byte *instr) = 0; }; -// MIDI Driver Types -enum { - MD_AUTO = 0, - MD_NULL = 1, - MD_WINDOWS = 2, - MD_TIMIDITY = 3, - MD_SEQ = 4, - MD_QTMUSIC = 5, - MD_ETUDE = 6, - MD_COREAUDIO = 7, - MD_MIDIEMU = 8, - MD_ALSA = 9, - MD_ADLIB = 10, - MD_PCSPK = 11, - MD_PCJR = 12, - - MD_YPA1 = 100 // palmos -}; // Factory functions, for faster compile extern MidiDriver *MidiDriver_NULL_create(); diff --git a/sound/module.mk b/sound/module.mk index 50072c0b5b..e0974162a5 100644 --- a/sound/module.mk +++ b/sound/module.mk @@ -3,6 +3,7 @@ MODULE := sound MODULE_OBJS := \ sound/audiostream.o \ sound/fmopl.o \ + sound/mididrv.o \ sound/midiparser.o \ sound/midiparser_smf.o \ sound/midiparser_xmidi.o \ -- cgit v1.2.3