OPNMIDI: Fixed an inability to load a custom bank

This commit is contained in:
Wohlstand 2020-09-29 01:57:08 +03:00 committed by drfrag
parent b00f8c5431
commit a574025373

View file

@ -46,7 +46,7 @@ class OPNMIDIDevice : public SoftSynthMIDIDevice
{ {
struct OPN2_MIDIPlayer *Renderer; struct OPN2_MIDIPlayer *Renderer;
public: public:
OPNMIDIDevice(const char *bank); OPNMIDIDevice(const OpnConfig *config);
~OPNMIDIDevice(); ~OPNMIDIDevice();
@ -59,7 +59,7 @@ protected:
void ComputeOutput(float *buffer, int len) override; void ComputeOutput(float *buffer, int len) override;
private: private:
int LoadCustomBank(const char *bankfile); int LoadCustomBank(const OpnConfig *config);
}; };
@ -82,25 +82,25 @@ enum
//========================================================================== //==========================================================================
#include "data/xg.h" #include "data/xg.h"
OPNMIDIDevice::OPNMIDIDevice(const char *bank) OPNMIDIDevice::OPNMIDIDevice(const OpnConfig *config)
:SoftSynthMIDIDevice(44100) :SoftSynthMIDIDevice(44100)
{ {
Renderer = opn2_init(44100); // todo: make it configurable Renderer = opn2_init(44100); // todo: make it configurable
if (Renderer != nullptr) if (Renderer != nullptr)
{ {
if (!opnConfig.opn_use_custom_bank || !LoadCustomBank(opnConfig.opn_custom_bank.c_str())) if (!LoadCustomBank(config))
{ {
if(opnConfig.default_bank.size() == 0) if(config->default_bank.size() == 0)
{ {
opn2_openBankData(Renderer, xg_default, sizeof(xg_default)); opn2_openBankData(Renderer, xg_default, sizeof(xg_default));
} }
else opn2_openBankData(Renderer, opnConfig.default_bank.data(), (long)opnConfig.default_bank.size()); else opn2_openBankData(Renderer, config->default_bank.data(), (long)config->default_bank.size());
} }
opn2_switchEmulator(Renderer, (int)opnConfig.opn_emulator_id); opn2_switchEmulator(Renderer, (int)config->opn_emulator_id);
opn2_setRunAtPcmRate(Renderer, (int)opnConfig.opn_run_at_pcm_rate); opn2_setRunAtPcmRate(Renderer, (int)config->opn_run_at_pcm_rate);
opn2_setNumChips(Renderer, opnConfig.opn_chips_count); opn2_setNumChips(Renderer, config->opn_chips_count);
opn2_setSoftPanEnabled(Renderer, (int)opnConfig.opn_fullpan); opn2_setSoftPanEnabled(Renderer, (int)config->opn_fullpan);
} }
else else
{ {
@ -133,9 +133,12 @@ OPNMIDIDevice::~OPNMIDIDevice()
//========================================================================== //==========================================================================
int OPNMIDIDevice::LoadCustomBank(const char *bankfile) int OPNMIDIDevice::LoadCustomBank(const OpnConfig *config)
{ {
if(!bankfile || !*bankfile) const char *bankfile = config->opn_custom_bank.c_str();
if(!config->opn_use_custom_bank)
return 0;
if(!*bankfile)
return 0; return 0;
return (opn2_openBankFile(Renderer, bankfile) == 0); return (opn2_openBankFile(Renderer, bankfile) == 0);
} }
@ -235,17 +238,34 @@ void OPNMIDIDevice::ComputeOutput(float *buffer, int len)
MIDIDevice *CreateOPNMIDIDevice(const char *Args) MIDIDevice *CreateOPNMIDIDevice(const char *Args)
{ {
OpnConfig config = opnConfig;
const char* bank = Args && *Args ? Args : opnConfig.opn_use_custom_bank ? opnConfig.opn_custom_bank.c_str() : nullptr; const char* bank = Args && *Args ? Args : opnConfig.opn_use_custom_bank ? opnConfig.opn_custom_bank.c_str() : nullptr;
if (bank && *bank) if (bank && *bank)
{ {
const char* info;
if (musicCallbacks.PathForSoundfont) if (musicCallbacks.PathForSoundfont)
{ {
auto info = musicCallbacks.PathForSoundfont(bank, SF_WOPN); info = musicCallbacks.PathForSoundfont(bank, SF_WOPN);
if (info != nullptr) bank = info; }
else
{
info = bank;
}
if(info == nullptr)
{
config.opn_custom_bank = "";
config.opn_use_custom_bank = false;
}
else
{
config.opn_custom_bank = info;
config.opn_use_custom_bank = true;
} }
} }
return new OPNMIDIDevice(bank); return new OPNMIDIDevice(&config);
} }
#else #else