Make ADL MIDI runtime configurable

Add configuration file entries for number of chips, bank index, and
whether to use ADL MIDI.  Currently, there is no GUI for this.
Interested users must enable it via direct configuration file editing.
A menu interface will come later.
This commit is contained in:
Kp 2018-10-18 02:18:56 +00:00
parent 1be414217c
commit a76487405c
4 changed files with 35 additions and 6 deletions

View file

@ -24,6 +24,7 @@
#include "digi_mixer_music.h"
#include "strutil.h"
#include "u_mem.h"
#include "config.h"
#include "console.h"
namespace dcx {
@ -97,6 +98,8 @@ static std::vector<uint8_t> current_music_hndlbuf;
static ADL_MIDIPlayer_t current_adlmidi;
static ADL_MIDIPlayer *get_adlmidi()
{
if (!CGameCfg.ADLMIDI_enabled)
return nullptr;
ADL_MIDIPlayer *adlmidi = current_adlmidi.get();
if (!adlmidi)
{
@ -106,8 +109,8 @@ static ADL_MIDIPlayer *get_adlmidi()
if (adlmidi)
{
adl_switchEmulator(adlmidi, ADLMIDI_EMU_DOSBOX);
adl_setNumChips(adlmidi, 6);
adl_setBank(adlmidi, static_cast<int>(ADL_EmbeddedBank::LBA_4OP));
adl_setNumChips(adlmidi, CGameCfg.ADLMIDI_num_chips);
adl_setBank(adlmidi, CGameCfg.ADLMIDI_bank);
adl_setSoftPanEnabled(adlmidi, 1);
current_adlmidi.reset(adlmidi);
}
@ -280,8 +283,7 @@ static CurrentMusicType load_mus_data(const uint8_t *data, size_t size)
{
CurrentMusicType type = CurrentMusicType::None;
#if DXX_USE_ADLMIDI
ADL_MIDIPlayer *adlmidi = get_adlmidi();
const auto adlmidi = get_adlmidi();
if (adlmidi && adl_openData(adlmidi, data, size) == 0)
type = CurrentMusicType::ADLMIDI;
else
@ -300,8 +302,7 @@ static CurrentMusicType load_mus_file(const char *filename)
{
CurrentMusicType type = CurrentMusicType::None;
#if DXX_USE_ADLMIDI
ADL_MIDIPlayer *adlmidi = get_adlmidi();
const auto adlmidi = get_adlmidi();
if (adlmidi && adl_openFile(adlmidi, filename) == 0)
type = CurrentMusicType::ADLMIDI;
else

View file

@ -38,6 +38,14 @@ COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
namespace dcx {
struct CCfg : prohibit_void_ptr<CCfg>
{
#if DXX_USE_ADLMIDI
int ADLMIDI_num_chips = 6;
/* See common/include/adlmidi_dynamic.h for the symbolic name and for other
* values.
*/
int ADLMIDI_bank = 31;
bool ADLMIDI_enabled;
#endif
bool VSync;
bool Grabinput;
bool WindowMode;

View file

@ -68,6 +68,8 @@ What's new in 0.60
* Fixed some Multiplayer scoring oddities.
* New SP (Options->Gameplay) / MP (Host Game -> Game Setup -> Advanced) options to remove the thief during level load and to restore the thief energy weapon bug.
* Command line option `-tmap` was specific to SDL-only builds and had no effect in OpenGL-enabled builds. It is no longer accepted by OpenGL builds.
* Added experimental support for ADL MIDI [contributed by jpcima].
- Users must separately install a compatible ADL MIDI library on the library search path.
* ... and many, many more bugfixes and improvements.

View file

@ -81,6 +81,11 @@ Cfg GameCfg;
#define MovieTexFiltStr "MovieTexFilt"
#define MovieSubtitlesStr "MovieSubtitles"
#endif
#if DXX_USE_ADLMIDI
#define ADLMIDINumChipsStr "ADLMIDI_NumberOfChips"
#define ADLMIDIBankStr "ADLMIDI_Bank"
#define ADLMIDIEnabledStr "ADLMIDI_Enabled"
#endif
#define VSyncStr "VSync"
#define MultisampleStr "Multisample"
#define FPSIndicatorStr "FPSIndicator"
@ -212,6 +217,14 @@ int ReadConfigFile()
convert_integer(GameCfg.MovieTexFilt, value);
else if (cmp(lb, eq, MovieSubtitlesStr))
convert_integer(GameCfg.MovieSubtitles, value);
#endif
#if DXX_USE_ADLMIDI
else if (cmp(lb, eq, ADLMIDINumChipsStr))
convert_integer(CGameCfg.ADLMIDI_num_chips, value);
else if (cmp(lb, eq, ADLMIDIBankStr))
convert_integer(CGameCfg.ADLMIDI_bank, value);
else if (cmp(lb, eq, ADLMIDIEnabledStr))
convert_integer(CGameCfg.ADLMIDI_enabled, value);
#endif
else if (cmp(lb, eq, VSyncStr))
convert_integer(CGameCfg.VSync, value);
@ -270,6 +283,11 @@ int WriteConfigFile()
#if defined(DXX_BUILD_DESCENT_II)
PHYSFSX_printf(infile, "%s=%i\n", MovieTexFiltStr, GameCfg.MovieTexFilt);
PHYSFSX_printf(infile, "%s=%i\n", MovieSubtitlesStr, GameCfg.MovieSubtitles);
#endif
#if DXX_USE_ADLMIDI
PHYSFSX_printf(infile, "%s=%i\n", ADLMIDINumChipsStr, CGameCfg.ADLMIDI_num_chips);
PHYSFSX_printf(infile, "%s=%i\n", ADLMIDIBankStr, CGameCfg.ADLMIDI_bank);
PHYSFSX_printf(infile, "%s=%i\n", ADLMIDIEnabledStr, CGameCfg.ADLMIDI_enabled);
#endif
PHYSFSX_printf(infile, "%s=%i\n", VSyncStr, CGameCfg.VSync);
PHYSFSX_printf(infile, "%s=%i\n", MultisampleStr, CGameCfg.Multisample);