- more work on music code

- renamed the FluidSetting functions to ChangeSetting so that they can be used as a generic means to change music player options without overloading the virtual function table for each minor thing.
- pass Printf as a parameter to the MIDI renderer to uncouple it from the main GZDoom code.
- throw exceptions when setting up the renderer fails so that this can be handled consistently for all construction errors here.
- delete FluidSynth handles before the constructor aborts.
This commit is contained in:
Christoph Oelckers 2019-09-26 22:30:07 +02:00
parent 9b0529b8a3
commit 8d2c67fe95
7 changed files with 100 additions and 101 deletions

View file

@ -69,3 +69,4 @@ CUSTOM_CVAR(Int, adl_volume_model, ADLMIDI_VolumeModel_DMX, CVAR_ARCHIVE | CVAR_
CheckRestart(MDEV_ADL); CheckRestart(MDEV_ADL);
adlConfig.adl_volume_model = self; adlConfig.adl_volume_model = self;
} }

View file

@ -83,12 +83,13 @@ ADLMIDIDevice::ADLMIDIDevice(const char *args, const ADLConfig *config)
{ {
adl_switchEmulator(Renderer, config->adl_emulator_id); adl_switchEmulator(Renderer, config->adl_emulator_id);
adl_setRunAtPcmRate(Renderer, config->adl_run_at_pcm_rate); adl_setRunAtPcmRate(Renderer, config->adl_run_at_pcm_rate);
if(!LoadCustomBank(config->adl_custom_bank, config)) if (!LoadCustomBank(config->adl_custom_bank, config))
adl_setBank(Renderer, config->adl_bank); adl_setBank(Renderer, config->adl_bank);
adl_setNumChips(Renderer, config->adl_chips_count); adl_setNumChips(Renderer, config->adl_chips_count);
adl_setVolumeRangeModel(Renderer, config->adl_volume_model); adl_setVolumeRangeModel(Renderer, config->adl_volume_model);
adl_setSoftPanEnabled(Renderer, config->adl_fullpan); adl_setSoftPanEnabled(Renderer, config->adl_fullpan);
} }
else throw std::runtime_error("Failed to create ADL MIDI renderer.");
} }
//========================================================================== //==========================================================================

View file

@ -56,14 +56,14 @@ struct fluid_synth_t;
class FluidSynthMIDIDevice : public SoftSynthMIDIDevice class FluidSynthMIDIDevice : public SoftSynthMIDIDevice
{ {
public: public:
FluidSynthMIDIDevice(const char *args, int samplerate); FluidSynthMIDIDevice(const char *args, int samplerate, int (*printfunc_)(const char *, ...));
~FluidSynthMIDIDevice(); ~FluidSynthMIDIDevice();
int Open(MidiCallback, void *userdata); int Open(MidiCallback, void *userdata);
FString GetStats(); FString GetStats();
void FluidSettingInt(const char *setting, int value); void ChangeSettingInt(const char *setting, int value);
void FluidSettingNum(const char *setting, double value); void ChangeSettingNum(const char *setting, double value);
void FluidSettingStr(const char *setting, const char *value); void ChangeSettingString(const char *setting, const char *value);
int GetDeviceType() const override { return MDEV_FLUIDSYNTH; } int GetDeviceType() const override { return MDEV_FLUIDSYNTH; }
protected: protected:
@ -74,6 +74,7 @@ protected:
fluid_settings_t *FluidSettings; fluid_settings_t *FluidSettings;
fluid_synth_t *FluidSynth; fluid_synth_t *FluidSynth;
int (*printfunc)(const char*, ...);
#ifdef DYN_FLUIDSYNTH #ifdef DYN_FLUIDSYNTH
enum { FLUID_FAILED = -1, FLUID_OK = 0 }; enum { FLUID_FAILED = -1, FLUID_OK = 0 };
@ -136,19 +137,9 @@ extern "C" unsigned __stdcall GetSystemDirectoryA(char *lpBuffer, unsigned uSize
#endif // __APPLE__ #endif // __APPLE__
#endif #endif
#define FLUID_REVERB_DEFAULT_ROOMSIZE 0.2f
#define FLUID_REVERB_DEFAULT_DAMP 0.0f
#define FLUID_REVERB_DEFAULT_WIDTH 0.5f
#define FLUID_REVERB_DEFAULT_LEVEL 0.9f
#define FLUID_CHORUS_MOD_SINE 0 #define FLUID_CHORUS_MOD_SINE 0
#define FLUID_CHORUS_MOD_TRIANGLE 1 #define FLUID_CHORUS_MOD_TRIANGLE 1
#define FLUID_CHORUS_DEFAULT_N 3
#define FLUID_CHORUS_DEFAULT_LEVEL 2.0f
#define FLUID_CHORUS_DEFAULT_SPEED 0.3f
#define FLUID_CHORUS_DEFAULT_DEPTH 8.0f
#endif #endif
#ifndef FLUID_CHORUS_DEFAULT_TYPE #ifndef FLUID_CHORUS_DEFAULT_TYPE
@ -188,19 +179,19 @@ CUSTOM_CVAR(Float, fluid_gain, 0.5, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
else if (self > 10) else if (self > 10)
self = 10; self = 10;
else if (currSong != NULL) else if (currSong != NULL)
currSong->FluidSettingNum("synth.gain", self); currSong->ChangeSettingNum("fluidsynth.synth.gain", self);
} }
CUSTOM_CVAR(Bool, fluid_reverb, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CUSTOM_CVAR(Bool, fluid_reverb, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
{ {
if (currSong != NULL) if (currSong != NULL)
currSong->FluidSettingInt("synth.reverb.active", self); currSong->ChangeSettingInt("fluidsynth.synth.reverb.active", self);
} }
CUSTOM_CVAR(Bool, fluid_chorus, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CUSTOM_CVAR(Bool, fluid_chorus, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
{ {
if (currSong != NULL) if (currSong != NULL)
currSong->FluidSettingInt("synth.chorus.active", self); currSong->ChangeSettingInt("fluidsynth.synth.chorus.active", self);
} }
CUSTOM_CVAR(Int, fluid_voices, 128, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CUSTOM_CVAR(Int, fluid_voices, 128, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
@ -210,7 +201,7 @@ CUSTOM_CVAR(Int, fluid_voices, 128, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
else if (self > 4096) else if (self > 4096)
self = 4096; self = 4096;
else if (currSong != NULL) else if (currSong != NULL)
currSong->FluidSettingInt("synth.polyphony", self); currSong->ChangeSettingInt("fluidsynth.synth.polyphony", self);
} }
CUSTOM_CVAR(Int, fluid_interp, 1, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CUSTOM_CVAR(Int, fluid_interp, 1, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
@ -230,7 +221,7 @@ CUSTOM_CVAR(Int, fluid_interp, 1, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
else if (self == 6 || self > 7) else if (self == 6 || self > 7)
self = 7; self = 7;
else if (currSong != NULL) else if (currSong != NULL)
currSong->FluidSettingInt("synth.interpolation", self); currSong->ChangeSettingInt("fluidsynth.synth.interpolation", self);
} }
CVAR(Int, fluid_samplerate, 0, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CVAR(Int, fluid_samplerate, 0, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
@ -252,7 +243,7 @@ CUSTOM_CVAR(Float, fluid_reverb_roomsize, 0.61f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
else if (self > 1.2f) else if (self > 1.2f)
self = 1.2f; self = 1.2f;
else if (currSong != NULL) else if (currSong != NULL)
currSong->FluidSettingInt("z.reverb-changed", 0); currSong->ChangeSettingInt("fluidsynth.z.reverb-changed", 0);
} }
CUSTOM_CVAR(Float, fluid_reverb_damping, 0.23f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CUSTOM_CVAR(Float, fluid_reverb_damping, 0.23f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
@ -262,7 +253,7 @@ CUSTOM_CVAR(Float, fluid_reverb_damping, 0.23f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
else if (self > 1) else if (self > 1)
self = 1; self = 1;
else if (currSong != NULL) else if (currSong != NULL)
currSong->FluidSettingInt("z.reverb-changed", 0); currSong->ChangeSettingInt("fluidsynth.z.reverb-changed", 0);
} }
CUSTOM_CVAR(Float, fluid_reverb_width, 0.76f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CUSTOM_CVAR(Float, fluid_reverb_width, 0.76f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
@ -272,7 +263,7 @@ CUSTOM_CVAR(Float, fluid_reverb_width, 0.76f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
else if (self > 100) else if (self > 100)
self = 100; self = 100;
else if (currSong != NULL) else if (currSong != NULL)
currSong->FluidSettingInt("z.reverb-changed", 0); currSong->ChangeSettingInt("fluidsynth.z.reverb-changed", 0);
} }
CUSTOM_CVAR(Float, fluid_reverb_level, 0.57f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CUSTOM_CVAR(Float, fluid_reverb_level, 0.57f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
@ -282,7 +273,7 @@ CUSTOM_CVAR(Float, fluid_reverb_level, 0.57f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
else if (self > 1) else if (self > 1)
self = 1; self = 1;
else if (currSong != NULL) else if (currSong != NULL)
currSong->FluidSettingInt("z.reverb-changed", 0); currSong->ChangeSettingInt("fluidsynth.z.reverb-changed", 0);
} }
CUSTOM_CVAR(Int, fluid_chorus_voices, 3, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CUSTOM_CVAR(Int, fluid_chorus_voices, 3, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
@ -292,7 +283,7 @@ CUSTOM_CVAR(Int, fluid_chorus_voices, 3, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
else if (self > 99) else if (self > 99)
self = 99; self = 99;
else if (currSong != NULL) else if (currSong != NULL)
currSong->FluidSettingInt("z.chorus-changed", 0); currSong->ChangeSettingInt("fluidsynth.z.chorus-changed", 0);
} }
CUSTOM_CVAR(Float, fluid_chorus_level, 1.2f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CUSTOM_CVAR(Float, fluid_chorus_level, 1.2f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
@ -302,7 +293,7 @@ CUSTOM_CVAR(Float, fluid_chorus_level, 1.2f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
else if (self > 1) else if (self > 1)
self = 1; self = 1;
else if (currSong != NULL) else if (currSong != NULL)
currSong->FluidSettingInt("z.chorus-changed", 0); currSong->ChangeSettingInt("fluidsynth.z.chorus-changed", 0);
} }
CUSTOM_CVAR(Float, fluid_chorus_speed, 0.3f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CUSTOM_CVAR(Float, fluid_chorus_speed, 0.3f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
@ -312,7 +303,7 @@ CUSTOM_CVAR(Float, fluid_chorus_speed, 0.3f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
else if (self > 5) else if (self > 5)
self = 5; self = 5;
else if (currSong != NULL) else if (currSong != NULL)
currSong->FluidSettingInt("z.chorus-changed", 0); currSong->ChangeSettingInt("fluidsynth.z.chorus-changed", 0);
} }
// depth is in ms and actual maximum depends on the sample rate // depth is in ms and actual maximum depends on the sample rate
@ -323,7 +314,7 @@ CUSTOM_CVAR(Float, fluid_chorus_depth, 8, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
else if (self > 21) else if (self > 21)
self = 21; self = 21;
else if (currSong != NULL) else if (currSong != NULL)
currSong->FluidSettingInt("z.chorus-changed", 0); currSong->ChangeSettingInt("fluidsynth.z.chorus-changed", 0);
} }
CUSTOM_CVAR(Int, fluid_chorus_type, FLUID_CHORUS_DEFAULT_TYPE, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CUSTOM_CVAR(Int, fluid_chorus_type, FLUID_CHORUS_DEFAULT_TYPE, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
@ -331,7 +322,7 @@ CUSTOM_CVAR(Int, fluid_chorus_type, FLUID_CHORUS_DEFAULT_TYPE, CVAR_ARCHIVE|CVAR
if (self != FLUID_CHORUS_MOD_SINE && self != FLUID_CHORUS_MOD_TRIANGLE) if (self != FLUID_CHORUS_MOD_SINE && self != FLUID_CHORUS_MOD_TRIANGLE)
self = FLUID_CHORUS_DEFAULT_TYPE; self = FLUID_CHORUS_DEFAULT_TYPE;
else if (currSong != NULL) else if (currSong != NULL)
currSong->FluidSettingInt("z.chorus-changed", 0); currSong->ChangeSettingInt("fluidsynth.z.chorus-changed", 0);
} }
// CODE -------------------------------------------------------------------- // CODE --------------------------------------------------------------------
@ -342,22 +333,22 @@ CUSTOM_CVAR(Int, fluid_chorus_type, FLUID_CHORUS_DEFAULT_TYPE, CVAR_ARCHIVE|CVAR
// //
//========================================================================== //==========================================================================
FluidSynthMIDIDevice::FluidSynthMIDIDevice(const char *args, int samplerate) FluidSynthMIDIDevice::FluidSynthMIDIDevice(const char *args, int samplerate, int (*printfunc_)(const char*, ...) = nullptr)
: SoftSynthMIDIDevice(samplerate <= 0? fluid_samplerate : samplerate, 22050, 96000) : SoftSynthMIDIDevice(samplerate <= 0? fluid_samplerate : samplerate, 22050, 96000)
{ {
printfunc = printfunc_;
FluidSynth = NULL; FluidSynth = NULL;
FluidSettings = NULL; FluidSettings = NULL;
#ifdef DYN_FLUIDSYNTH #ifdef DYN_FLUIDSYNTH
if (!LoadFluidSynth()) LoadFluidSynth();
{ {
return; throw std::runtime_error("Failed to load FluidSynth.\n");
} }
#endif #endif
FluidSettings = new_fluid_settings(); FluidSettings = new_fluid_settings();
if (FluidSettings == NULL) if (FluidSettings == NULL)
{ {
printf("Failed to create FluidSettings.\n"); throw std::runtime_error("Failed to create FluidSettings.\n");
return;
} }
fluid_settings_setnum(FluidSettings, "synth.sample-rate", SampleRate); fluid_settings_setnum(FluidSettings, "synth.sample-rate", SampleRate);
fluid_settings_setnum(FluidSettings, "synth.gain", fluid_gain); fluid_settings_setnum(FluidSettings, "synth.gain", fluid_gain);
@ -368,8 +359,8 @@ FluidSynthMIDIDevice::FluidSynthMIDIDevice(const char *args, int samplerate)
FluidSynth = new_fluid_synth(FluidSettings); FluidSynth = new_fluid_synth(FluidSettings);
if (FluidSynth == NULL) if (FluidSynth == NULL)
{ {
Printf("Failed to create FluidSynth.\n"); delete_fluid_settings(FluidSettings);
return; throw std::runtime_error("Failed to create FluidSynth.\n");
} }
fluid_synth_set_interp_method(FluidSynth, -1, fluid_interp); fluid_synth_set_interp_method(FluidSynth, -1, fluid_interp);
fluid_synth_set_reverb(FluidSynth, fluid_reverb_roomsize, fluid_reverb_damping, fluid_synth_set_reverb(FluidSynth, fluid_reverb_roomsize, fluid_reverb_damping,
@ -418,9 +409,11 @@ FluidSynthMIDIDevice::FluidSynthMIDIDevice(const char *args, int samplerate)
#endif #endif
delete_fluid_settings(FluidSettings);
delete_fluid_synth(FluidSynth); delete_fluid_synth(FluidSynth);
FluidSynth = NULL; FluidSynth = nullptr;
I_Error("Failed to load any MIDI patches.\n"); FluidSettings = nullptr;
throw std::runtime_error("Failed to load any MIDI patches.\n");
} }
@ -592,17 +585,17 @@ int FluidSynthMIDIDevice::LoadPatchSets(const char *patches)
{ {
if (FLUID_FAILED != fluid_synth_sfload(FluidSynth, path, count == 0)) if (FLUID_FAILED != fluid_synth_sfload(FluidSynth, path, count == 0))
{ {
DPrintf(DMSG_NOTIFY, "Loaded patch set %s.\n", tok); //DPrintf(DMSG_NOTIFY, "Loaded patch set %s.\n", tok);
count++; count++;
} }
else else
{ {
DPrintf(DMSG_ERROR, "Failed to load patch set %s.\n", tok); if (printfunc) printfunc("Failed to load patch set %s.\n", tok);
} }
} }
else else
{ {
DPrintf(DMSG_ERROR, "Could not find patch set %s.\n", tok); if (printfunc) printfunc("Could not find patch set %s.\n", tok);
} }
tok = strtok(NULL, delim); tok = strtok(NULL, delim);
} }
@ -612,31 +605,32 @@ int FluidSynthMIDIDevice::LoadPatchSets(const char *patches)
//========================================================================== //==========================================================================
// //
// FluidSynthMIDIDevice :: FluidSettingInt // FluidSynthMIDIDevice :: ChangeSettingInt
// //
// Changes an integer setting. // Changes an integer setting.
// //
//========================================================================== //==========================================================================
void FluidSynthMIDIDevice::FluidSettingInt(const char *setting, int value) void FluidSynthMIDIDevice::ChangeSettingInt(const char *setting, int value)
{ {
if (FluidSynth == NULL || FluidSettings == NULL) if (FluidSynth == nullptr || FluidSettings == nullptr || strncmp(setting, "fluidsynth.", 11))
{ {
return; return;
} }
setting += 11;
if (strcmp(setting, "synth.interpolation") == 0) if (strcmp(setting, "synth.interpolation") == 0)
{ {
if (FLUID_OK != fluid_synth_set_interp_method(FluidSynth, -1, value)) if (FLUID_OK != fluid_synth_set_interp_method(FluidSynth, -1, value))
{ {
Printf("Setting interpolation method %d failed.\n", value); if (printfunc) printfunc("Setting interpolation method %d failed.\n", value);
} }
} }
else if (strcmp(setting, "synth.polyphony") == 0) else if (strcmp(setting, "synth.polyphony") == 0)
{ {
if (FLUID_OK != fluid_synth_set_polyphony(FluidSynth, value)) if (FLUID_OK != fluid_synth_set_polyphony(FluidSynth, value))
{ {
Printf("Setting polyphony to %d failed.\n", value); if (printfunc) printfunc("Setting polyphony to %d failed.\n", value);
} }
} }
else if (strcmp(setting, "z.reverb-changed") == 0) else if (strcmp(setting, "z.reverb-changed") == 0)
@ -651,7 +645,7 @@ void FluidSynthMIDIDevice::FluidSettingInt(const char *setting, int value)
} }
else if (0 == fluid_settings_setint(FluidSettings, setting, value)) else if (0 == fluid_settings_setint(FluidSettings, setting, value))
{ {
Printf("Failed to set %s to %d.\n", setting, value); if (printfunc) printfunc("Failed to set %s to %d.\n", setting, value);
} }
// fluid_settings_setint succeeded; update these settings in the running synth, too // fluid_settings_setint succeeded; update these settings in the running synth, too
else if (strcmp(setting, "synth.reverb.active") == 0) else if (strcmp(setting, "synth.reverb.active") == 0)
@ -666,39 +660,45 @@ void FluidSynthMIDIDevice::FluidSettingInt(const char *setting, int value)
//========================================================================== //==========================================================================
// //
// FluidSynthMIDIDevice :: FluidSettingNum // FluidSynthMIDIDevice :: ChangeSettingNum
// //
// Changes a numeric setting. // Changes a numeric setting.
// //
//========================================================================== //==========================================================================
void FluidSynthMIDIDevice::FluidSettingNum(const char *setting, double value) void FluidSynthMIDIDevice::ChangeSettingNum(const char *setting, double value)
{ {
if (FluidSettings != NULL) if (FluidSynth == nullptr || FluidSettings == nullptr || strncmp(setting, "fluidsynth.", 11))
{ {
return;
}
setting += 11;
if (0 == fluid_settings_setnum(FluidSettings, setting, value)) if (0 == fluid_settings_setnum(FluidSettings, setting, value))
{ {
Printf("Failed to set %s to %g.\n", setting, value); if (printfunc) printfunc("Failed to set %s to %g.\n", setting, value);
}
} }
} }
//========================================================================== //==========================================================================
// //
// FluidSynthMIDIDevice :: FluidSettingStr // FluidSynthMIDIDevice :: ChangeSettingString
// //
// Changes a string setting. // Changes a string setting.
// //
//========================================================================== //==========================================================================
void FluidSynthMIDIDevice::FluidSettingStr(const char *setting, const char *value) void FluidSynthMIDIDevice::ChangeSettingString(const char *setting, const char *value)
{ {
if (FluidSettings != NULL) if (FluidSynth == nullptr || FluidSettings == nullptr || strncmp(setting, "fluidsynth.", 11))
{ {
return;
}
setting += 11;
if (0 == fluid_settings_setstr(FluidSettings, setting, value)) if (0 == fluid_settings_setstr(FluidSettings, setting, value))
{ {
Printf("Failed to set %s to %s.\n", setting, value); if (printfunc) printfunc("Failed to set %s to %s.\n", setting, value);
}
} }
} }
@ -725,10 +725,7 @@ FString FluidSynthMIDIDevice::GetStats()
fluid_settings_getint(FluidSettings, "synth.reverb.active", &reverb); fluid_settings_getint(FluidSettings, "synth.reverb.active", &reverb);
fluid_settings_getint(FluidSettings, "synth.polyphony", &maxpoly); fluid_settings_getint(FluidSettings, "synth.polyphony", &maxpoly);
out.Format("Voices: " TEXTCOLOR_YELLOW "%3d" TEXTCOLOR_NORMAL "/" TEXTCOLOR_ORANGE "%3d" TEXTCOLOR_NORMAL "(" TEXTCOLOR_RED "%3d" TEXTCOLOR_NORMAL ")" out.Format("Voices: %3d/%3d(%3d) %6.2f%% CPU Reverb: %3s Chorus: %3s",
TEXTCOLOR_YELLOW "%6.2f" TEXTCOLOR_NORMAL "%% CPU "
"Reverb: " TEXTCOLOR_YELLOW "%3s" TEXTCOLOR_NORMAL
" Chorus: " TEXTCOLOR_YELLOW "%3s",
voices, polyphony, maxpoly, load, reverb ? "yes" : "no", chorus ? "yes" : "no"); voices, polyphony, maxpoly, load, reverb ? "yes" : "no", chorus ? "yes" : "no");
return out; return out;
} }
@ -781,7 +778,7 @@ bool FluidSynthMIDIDevice::LoadFluidSynth()
if(!FluidSynthModule.Load({fluid_lib})) if(!FluidSynthModule.Load({fluid_lib}))
{ {
const char* libname = fluid_lib; const char* libname = fluid_lib;
Printf(TEXTCOLOR_RED "Could not load %s\n", libname); if (printfunc) printfunc("Could not load %s\n", libname);
} }
else else
return true; return true;
@ -790,13 +787,13 @@ bool FluidSynthMIDIDevice::LoadFluidSynth()
#ifdef FLUIDSYNTHLIB2 #ifdef FLUIDSYNTHLIB2
if(!FluidSynthModule.Load({FLUIDSYNTHLIB1, FLUIDSYNTHLIB2})) if(!FluidSynthModule.Load({FLUIDSYNTHLIB1, FLUIDSYNTHLIB2}))
{ {
Printf(TEXTCOLOR_RED "Could not load " FLUIDSYNTHLIB1 " or " FLUIDSYNTHLIB2 "\n"); if (printfunc) printfunc("Could not load " FLUIDSYNTHLIB1 " or " FLUIDSYNTHLIB2 "\n");
return false; return false;
} }
#else #else
if(!FluidSynthModule.Load({fluid_lib, FLUIDSYNTHLIB1})) if(!FluidSynthModule.Load({fluid_lib, FLUIDSYNTHLIB1}))
{ {
Printf(TEXTCOLOR_RED "Could not load " FLUIDSYNTHLIB1 ": %s\n", dlerror()); if (printfunc) printfunc("Could not load " FLUIDSYNTHLIB1 ": %s\n", dlerror());
return false; return false;
} }
#endif #endif
@ -822,7 +819,7 @@ void FluidSynthMIDIDevice::UnloadFluidSynth()
// //
//========================================================================== //==========================================================================
MIDIDevice *CreateFluidSynthMIDIDevice(const char *args, int samplerate) MIDIDevice *CreateFluidSynthMIDIDevice(const char *args, int samplerate, int (*printfunc)(const char*, ...))
{ {
return new FluidSynthMIDIDevice(args, samplerate); return new FluidSynthMIDIDevice(args, samplerate, printfunc);
} }

View file

@ -245,15 +245,15 @@ void MusInfo::GMEDepthChanged(float val)
{ {
} }
void MusInfo::FluidSettingInt(const char *, int) void MusInfo::ChangeSettingInt(const char *, int)
{ {
} }
void MusInfo::FluidSettingNum(const char *, double) void MusInfo::ChangeSettingNum(const char *, double)
{ {
} }
void MusInfo::FluidSettingStr(const char *, const char *) void MusInfo::ChangeSettingString(const char *, const char *)
{ {
} }

View file

@ -79,9 +79,9 @@ public:
virtual FString GetStats(); virtual FString GetStats();
virtual MusInfo *GetOPLDumper(const char *filename); virtual MusInfo *GetOPLDumper(const char *filename);
virtual MusInfo *GetWaveDumper(const char *filename, int rate); virtual MusInfo *GetWaveDumper(const char *filename, int rate);
virtual void FluidSettingInt(const char *setting, int value); // FluidSynth settings virtual void ChangeSettingInt(const char *setting, int value); // FluidSynth settings
virtual void FluidSettingNum(const char *setting, double value); // " virtual void ChangeSettingNum(const char *setting, double value); // "
virtual void FluidSettingStr(const char *setting, const char *value); // " virtual void ChangeSettingString(const char *setting, const char *value); // "
virtual void WildMidiSetOption(int opt, int set); virtual void WildMidiSetOption(int opt, int set);
virtual void GMEDepthChanged(float val); virtual void GMEDepthChanged(float val);

View file

@ -69,9 +69,9 @@ public:
virtual void InitPlayback(); virtual void InitPlayback();
virtual bool Update(); virtual bool Update();
virtual void PrecacheInstruments(const uint16_t *instruments, int count); virtual void PrecacheInstruments(const uint16_t *instruments, int count);
virtual void FluidSettingInt(const char *setting, int value); virtual void ChangeSettingInt(const char *setting, int value);
virtual void FluidSettingNum(const char *setting, double value); virtual void ChangeSettingNum(const char *setting, double value);
virtual void FluidSettingStr(const char *setting, const char *value); virtual void ChangeSettingString(const char *setting, const char *value);
virtual void WildMidiSetOption(int opt, int set); virtual void WildMidiSetOption(int opt, int set);
virtual bool Preprocess(MIDIStreamer *song, bool looping); virtual bool Preprocess(MIDIStreamer *song, bool looping);
virtual FString GetStats(); virtual FString GetStats();
@ -215,9 +215,9 @@ public:
bool SetSubsong(int subsong) override; bool SetSubsong(int subsong) override;
void Update() override; void Update() override;
FString GetStats() override; FString GetStats() override;
void FluidSettingInt(const char *setting, int value) override; void ChangeSettingInt(const char *setting, int value) override;
void FluidSettingNum(const char *setting, double value) override; void ChangeSettingNum(const char *setting, double value) override;
void FluidSettingStr(const char *setting, const char *value) override; void ChangeSettingString(const char *setting, const char *value) override;
void WildMidiSetOption(int opt, int set) override; void WildMidiSetOption(int opt, int set) override;
int ServiceEvent(); int ServiceEvent();
void SetMIDISource(MIDISource *_source); void SetMIDISource(MIDISource *_source);

View file

@ -50,7 +50,7 @@
#ifdef _WIN32 #ifdef _WIN32
MIDIDevice *CreateWinMIDIDevice(int mididevice); MIDIDevice *CreateWinMIDIDevice(int mididevice);
#endif #endif
MIDIDevice *CreateFluidSynthMIDIDevice(const char *args, int samplerate); MIDIDevice *CreateFluidSynthMIDIDevice(const char *args, int samplerate, int (*printfunc_)(const char*, ...));
MIDIDevice *CreateTimidityMIDIDevice(const char *args, int samplerate); MIDIDevice *CreateTimidityMIDIDevice(const char *args, int samplerate);
MIDIDevice *CreateTimidityPPMIDIDevice(const char *args, int samplerate); MIDIDevice *CreateTimidityPPMIDIDevice(const char *args, int samplerate);
MIDIDevice *CreateADLMIDIDevice(const char *args, const ADLConfig* config); MIDIDevice *CreateADLMIDIDevice(const char *args, const ADLConfig* config);
@ -227,7 +227,7 @@ MIDIDevice *MIDIStreamer::CreateMIDIDevice(EMidiDevice devtype, int samplerate)
// Intentional fall-through for non-Windows systems. // Intentional fall-through for non-Windows systems.
case MDEV_FLUIDSYNTH: case MDEV_FLUIDSYNTH:
dev = CreateFluidSynthMIDIDevice(Args, samplerate); dev = CreateFluidSynthMIDIDevice(Args, samplerate, Printf);
break; break;
case MDEV_OPL: case MDEV_OPL:
@ -246,9 +246,9 @@ MIDIDevice *MIDIStreamer::CreateMIDIDevice(EMidiDevice devtype, int samplerate)
break; break;
} }
} }
catch (CRecoverableError &err) catch (std::runtime_error &err)
{ {
DPrintf(DMSG_WARNING, "%s\n", err.GetMessage()); DPrintf(DMSG_WARNING, "%s\n", err.what());
checked[devtype] = true; checked[devtype] = true;
devtype = MDEV_DEFAULT; devtype = MDEV_DEFAULT;
// Opening the requested device did not work out so choose another one. // Opening the requested device did not work out so choose another one.
@ -555,43 +555,43 @@ void MIDIStreamer::MusicVolumeChanged()
//========================================================================== //==========================================================================
// //
// MIDIStreamer :: FluidSettingInt // MIDIStreamer :: ChangeSettingInt
// //
//========================================================================== //==========================================================================
void MIDIStreamer::FluidSettingInt(const char *setting, int value) void MIDIStreamer::ChangeSettingInt(const char *setting, int value)
{ {
if (MIDI != NULL) if (MIDI != NULL)
{ {
MIDI->FluidSettingInt(setting, value); MIDI->ChangeSettingInt(setting, value);
} }
} }
//========================================================================== //==========================================================================
// //
// MIDIStreamer :: FluidSettingNum // MIDIStreamer :: ChangeSettingNum
// //
//========================================================================== //==========================================================================
void MIDIStreamer::FluidSettingNum(const char *setting, double value) void MIDIStreamer::ChangeSettingNum(const char *setting, double value)
{ {
if (MIDI != NULL) if (MIDI != NULL)
{ {
MIDI->FluidSettingNum(setting, value); MIDI->ChangeSettingNum(setting, value);
} }
} }
//========================================================================== //==========================================================================
// //
// MIDIDeviceStreamer :: FluidSettingStr // MIDIDeviceStreamer :: ChangeSettingString
// //
//========================================================================== //==========================================================================
void MIDIStreamer::FluidSettingStr(const char *setting, const char *value) void MIDIStreamer::ChangeSettingString(const char *setting, const char *value)
{ {
if (MIDI != NULL) if (MIDI != NULL)
{ {
MIDI->FluidSettingStr(setting, value); MIDI->ChangeSettingString(setting, value);
} }
} }
@ -1042,31 +1042,31 @@ bool MIDIDevice::Update()
//========================================================================== //==========================================================================
// //
// MIDIDevice :: FluidSettingInt // MIDIDevice :: ChangeSettingInt
// //
//========================================================================== //==========================================================================
void MIDIDevice::FluidSettingInt(const char *setting, int value) void MIDIDevice::ChangeSettingInt(const char *setting, int value)
{ {
} }
//========================================================================== //==========================================================================
// //
// MIDIDevice :: FluidSettingNum // MIDIDevice :: ChangeSettingNum
// //
//========================================================================== //==========================================================================
void MIDIDevice::FluidSettingNum(const char *setting, double value) void MIDIDevice::ChangeSettingNum(const char *setting, double value)
{ {
} }
//========================================================================== //==========================================================================
// //
// MIDIDevice :: FluidSettingStr // MIDIDevice :: ChangeSettingString
// //
//========================================================================== //==========================================================================
void MIDIDevice::FluidSettingStr(const char *setting, const char *value) void MIDIDevice::ChangeSettingString(const char *setting, const char *value)
{ {
} }