diff --git a/src/audio_decoder_midi.cpp b/src/audio_decoder_midi.cpp index bee33b113d..4a75c92733 100644 --- a/src/audio_decoder_midi.cpp +++ b/src/audio_decoder_midi.cpp @@ -344,7 +344,7 @@ void AudioDecoderMidi::midi_message(int, uint_least32_t message) { } void AudioDecoderMidi::sysex_message(int, const void* data, std::size_t size) { - mididec->SendSysExMessage(data, size); + mididec->SendSysExMessage(reinterpret_cast(data), size); } void AudioDecoderMidi::meta_event(int event, const void* data, std::size_t size) { diff --git a/src/audio_midi.h b/src/audio_midi.h index 6ac395e59e..3095a79b7d 100644 --- a/src/audio_midi.h +++ b/src/audio_midi.h @@ -149,7 +149,7 @@ class MidiDecoder { * @param data sysex content * @param size length of sysex content (data) */ - virtual void SendSysExMessage(const void* data, size_t size) { + virtual void SendSysExMessage(const uint8_t* data, size_t size) { (void)data; (void)size; } diff --git a/src/decoder_fluidsynth.cpp b/src/decoder_fluidsynth.cpp index 509ee096eb..b880d80125 100644 --- a/src/decoder_fluidsynth.cpp +++ b/src/decoder_fluidsynth.cpp @@ -119,6 +119,10 @@ namespace { static fluid_synth_t* create_synth(std::string& error_message) { fluid_synth_t* syn = new_fluid_synth(global_settings.get()); + if (!syn) { + error_message = "new_fluid_synth failed"; + return nullptr; + } #if defined(HAVE_FLUIDSYNTH) && FLUIDSYNTH_VERSION_MAJOR > 1 fluid_synth_add_sfloader(syn, global_loader); @@ -178,6 +182,9 @@ bool FluidSynthDecoder::Initialize(std::string& error_message) { if (!global_settings) { global_settings.reset(new_fluid_settings()); + if (!global_settings) { + return false; + } fluid_settings_setstr(global_settings.get(), "player.timing-source", "sample"); fluid_settings_setint(global_settings.get(), "synth.lock-memory", 0); @@ -268,12 +275,14 @@ void FluidSynthDecoder::SendMidiMessage(uint32_t message) { } } -void FluidSynthDecoder::SendMidiReset() { - if (!instance_synth || shutdown) { +void FluidSynthDecoder::SendSysExMessage(const uint8_t* data, std::size_t size) { + // FmMidi has F0 and F7 in SysEx, Fluidsynth wants them removed + if (size <= 2) { return; } - fluid_synth_system_reset(instance_synth); + fluid_synth_sysex(instance_synth, reinterpret_cast(data + 1), static_cast(size - 2), + nullptr, nullptr, nullptr, 0); } #endif diff --git a/src/decoder_fluidsynth.h b/src/decoder_fluidsynth.h index 7614892a64..def52195f9 100644 --- a/src/decoder_fluidsynth.h +++ b/src/decoder_fluidsynth.h @@ -50,7 +50,7 @@ class FluidSynthDecoder : public MidiDecoder { void SendMidiMessage(uint32_t message) override; - void SendMidiReset() override; + void SendSysExMessage(const uint8_t* data, size_t size) override; std::string GetName() override { #if defined(HAVE_FLUIDSYNTH) diff --git a/src/decoder_fmmidi.cpp b/src/decoder_fmmidi.cpp index 7606361a0e..022f5ff604 100644 --- a/src/decoder_fmmidi.cpp +++ b/src/decoder_fmmidi.cpp @@ -45,7 +45,7 @@ void FmMidiDecoder::SendMidiMessage(uint32_t message) { synth->midi_event(message); } -void FmMidiDecoder::SendSysExMessage(const void * data, std::size_t size) { +void FmMidiDecoder::SendSysExMessage(const uint8_t* data, std::size_t size) { synth->sysex_message(data, size); } diff --git a/src/decoder_fmmidi.h b/src/decoder_fmmidi.h index 3ea8bac2c9..bf95b0c7fc 100644 --- a/src/decoder_fmmidi.h +++ b/src/decoder_fmmidi.h @@ -35,7 +35,7 @@ class FmMidiDecoder : public MidiDecoder { int FillBuffer(uint8_t* buffer, int length) override; void SendMidiMessage(uint32_t message) override; - void SendSysExMessage(const void* data, size_t size) override; + void SendSysExMessage(const uint8_t* data, size_t size) override; void SendMidiReset() override; std::unique_ptr synth; diff --git a/src/platform/libretro/midiout_device_libretro.cpp b/src/platform/libretro/midiout_device_libretro.cpp index 7f8d032e90..87dc7f2d37 100644 --- a/src/platform/libretro/midiout_device_libretro.cpp +++ b/src/platform/libretro/midiout_device_libretro.cpp @@ -59,11 +59,9 @@ void LibretroMidiOutDevice::SendMidiMessage(uint32_t message) { midi_out.flush(); } -void LibretroMidiOutDevice::SendSysExMessage(const void* data, size_t size) { - auto mdata = reinterpret_cast(data); - +void LibretroMidiOutDevice::SendSysExMessage(const uint8_t* data, size_t size) { for (size_t i = 0; i < size; ++i) { - midi_out.write(mdata[i], 0); + midi_out.write(data[i], 0); } midi_out.flush(); } diff --git a/src/platform/libretro/midiout_device_libretro.h b/src/platform/libretro/midiout_device_libretro.h index 6f6c3779bd..6ca88a511f 100644 --- a/src/platform/libretro/midiout_device_libretro.h +++ b/src/platform/libretro/midiout_device_libretro.h @@ -30,7 +30,7 @@ class LibretroMidiOutDevice : public MidiDecoder { LibretroMidiOutDevice(); void SendMidiMessage(uint32_t message) override; - void SendSysExMessage(const void* data, size_t size) override; + void SendSysExMessage(const uint8_t* data, size_t size) override; void SendMidiReset() override; std::string GetName() override; bool IsInitialized() const; diff --git a/src/platform/linux/midiout_device_alsa.cpp b/src/platform/linux/midiout_device_alsa.cpp index d5f8b8000a..8be657e9ac 100644 --- a/src/platform/linux/midiout_device_alsa.cpp +++ b/src/platform/linux/midiout_device_alsa.cpp @@ -152,13 +152,13 @@ void AlsaMidiOutDevice::SendMidiMessage(uint32_t message) { } } -void AlsaMidiOutDevice::SendSysExMessage(const void* data, size_t size) { +void AlsaMidiOutDevice::SendSysExMessage(const uint8_t* data, size_t size) { snd_seq_event_t evt = {}; snd_seq_ev_set_source(&evt, 0); evt.queue = queue; snd_seq_ev_set_dest(&evt, dst_client, dst_port); - snd_seq_ev_set_sysex(&evt, size, const_cast(data)); + snd_seq_ev_set_sysex(&evt, size, const_cast(reinterpret_cast(data))); int status = snd_seq_event_output_direct(midi_out, &evt); if (status < 0) { @@ -167,7 +167,7 @@ void AlsaMidiOutDevice::SendSysExMessage(const void* data, size_t size) { } void AlsaMidiOutDevice::SendMidiReset() { - unsigned char gm_reset[] = {0xF0, 0x7E, 0x7F, 0x09, 0x01, 0xF7}; + const uint8_t gm_reset[] = {0xF0, 0x7E, 0x7F, 0x09, 0x01, 0xF7}; SendSysExMessage(gm_reset, sizeof(gm_reset)); } diff --git a/src/platform/linux/midiout_device_alsa.h b/src/platform/linux/midiout_device_alsa.h index 70a1cba17c..282c5c1c75 100644 --- a/src/platform/linux/midiout_device_alsa.h +++ b/src/platform/linux/midiout_device_alsa.h @@ -31,7 +31,7 @@ class AlsaMidiOutDevice : public MidiDecoder { ~AlsaMidiOutDevice(); void SendMidiMessage(uint32_t message) override; - void SendSysExMessage(const void* data, size_t size) override; + void SendSysExMessage(const uint8_t* data, size_t size) override; void SendMidiReset() override; std::string GetName() override; bool IsInitialized() const; diff --git a/src/platform/macos/midiout_device_coreaudio.cpp b/src/platform/macos/midiout_device_coreaudio.cpp index 38d0397d68..88886681ee 100644 --- a/src/platform/macos/midiout_device_coreaudio.cpp +++ b/src/platform/macos/midiout_device_coreaudio.cpp @@ -90,7 +90,7 @@ void CoreAudioMidiOutDevice::SendMidiMessage(uint32_t message) { MusicDeviceMIDIEvent(midi_out, status, value1, value2, 0); } -void CoreAudioMidiOutDevice::SendSysExMessage(const void* data, size_t size) { +void CoreAudioMidiOutDevice::SendSysExMessage(const uint8_t* data, size_t size) { MusicDeviceSysEx(midi_out, (const UInt8*) data, (UInt32) size); } diff --git a/src/platform/macos/midiout_device_coreaudio.h b/src/platform/macos/midiout_device_coreaudio.h index 94b73dc5e8..b7426e2779 100644 --- a/src/platform/macos/midiout_device_coreaudio.h +++ b/src/platform/macos/midiout_device_coreaudio.h @@ -30,7 +30,7 @@ class CoreAudioMidiOutDevice : public MidiDecoder { ~CoreAudioMidiOutDevice(); void SendMidiMessage(uint32_t message) override; - void SendSysExMessage(const void* data, size_t size) override; + void SendSysExMessage(const uint8_t* data, size_t size) override; void SendMidiReset() override; std::string GetName() override; bool IsInitialized() const; diff --git a/src/platform/windows/midiout_device_win32.cpp b/src/platform/windows/midiout_device_win32.cpp index 241bf5913a..9b030ffb21 100644 --- a/src/platform/windows/midiout_device_win32.cpp +++ b/src/platform/windows/midiout_device_win32.cpp @@ -51,7 +51,7 @@ void Win32MidiOutDevice::SendMidiMessage(uint32_t message) { midiOutShortMsg(midi_out, message); } -void Win32MidiOutDevice::SendSysExMessage(const void* data, size_t size) { +void Win32MidiOutDevice::SendSysExMessage(const uint8_t* data, size_t size) { MIDIHDR hdr; MMRESULT res; hdr.dwBufferLength = size; diff --git a/src/platform/windows/midiout_device_win32.h b/src/platform/windows/midiout_device_win32.h index 3096717637..385803a4e5 100644 --- a/src/platform/windows/midiout_device_win32.h +++ b/src/platform/windows/midiout_device_win32.h @@ -35,7 +35,7 @@ class Win32MidiOutDevice : public MidiDecoder { ~Win32MidiOutDevice(); void SendMidiMessage(uint32_t message) override; - void SendSysExMessage(const void* data, size_t size) override; + void SendSysExMessage(const uint8_t* data, size_t size) override; void SendMidiReset() override; std::string GetName() override; bool IsInitialized() const;