Fluidsynth: more recent patchset

This commit is contained in:
François Revol
2025-02-16 01:41:21 +01:00
parent 9c1714659c
commit 952858cc99

View File

@@ -0,0 +1,828 @@
From 8b7bf5ac764bfdb1ef526f3d31935eb013083dc0 Mon Sep 17 00:00:00 2001
From: Gerasim Troeglazov <3dEyes@gmail.com>
Date: Sun, 14 Apr 2019 17:27:45 +1000
Subject: [PATCH 1/6] Add Haiku MediaKit support
---
CMakeLists.txt | 19 +++++
cmake_admin/report.cmake | 6 ++
src/CMakeLists.txt | 5 ++
src/config.cmake | 3 +
src/drivers/fluid_adriver.c | 10 +++
src/drivers/fluid_adriver.h | 7 ++
src/drivers/fluid_haiku.cpp | 140 ++++++++++++++++++++++++++++++++++++
src/synth/fluid_synth.c | 21 ++++++
src/utils/fluid_sys.h | 2 +-
9 files changed, 212 insertions(+), 1 deletion(-)
create mode 100644 src/drivers/fluid_haiku.cpp
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 75b8862a..831f29c6 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -94,6 +94,7 @@ option ( enable-dsound "compile DirectSound support (if it is available)" on )
option ( enable-wasapi "compile Windows WASAPI support (if it is available)" on )
option ( enable-waveout "compile Windows WaveOut support (if it is available)" on )
option ( enable-winmidi "compile Windows MIDI support (if it is available)" on )
+option ( enable-haiku "compile Haiku MediaKit audio support (if it is available)" on )
option ( enable-sdl2 "compile SDL2 audio support (if it is available)" off )
option ( enable-pulseaudio "compile PulseAudio support (if it is available)" on )
option ( enable-pipewire "compile PipeWire support (if it is available)" on )
@@ -186,8 +187,10 @@ endif ()
include ( CMakePrintHelpers ) # for cmake_print_properties() and cmake_print_variables()
include ( TestInline )
include ( TestVLA )
+if ( NOT HAIKU )
include ( TestBigEndian )
test_big_endian ( WORDS_BIGENDIAN )
+endif ( NOT HAIKU )
unset ( LIBFLUID_CPPFLAGS CACHE )
unset ( LIBFLUID_LIBS CACHE )
@@ -249,6 +252,11 @@ if ( CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID MATCHES "Clang" OR CMAKE_C_C
endif (CMAKE_C_COMPILER_ID STREQUAL "Intel" )
endif ( CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID MATCHES "Clang" OR CMAKE_C_COMPILER_ID STREQUAL "Intel" )
+# Haiku
+if ( HAIKU )
+set ( CMAKE_CXX_FLAGS "-fpermissive")
+endif ( HAIKU )
+
# Windows
unset ( WINDOWS_LIBS CACHE )
unset ( DSOUND_SUPPORT CACHE )
@@ -395,6 +403,12 @@ if ( CMAKE_SYSTEM MATCHES "SunOS" )
set ( LIBFLUID_LIBS "${LIBFLUID_LIBS};nsl;socket" )
endif ( CMAKE_SYSTEM MATCHES "SunOS" )
+# Haiku
+if ( CMAKE_SYSTEM MATCHES "Haiku" )
+ set ( FLUID_LIBS "${FLUID_LIBS};network;bsd;be;media" )
+ set ( LIBFLUID_LIBS "${LIBFLUID_LIBS};network;bsd;be;media" )
+endif ( CMAKE_SYSTEM MATCHES "Haiku" )
+
# Apple Mac OSX
unset ( COREAUDIO_SUPPORT CACHE )
unset ( COREAUDIO_LIBS CACHE )
@@ -708,6 +722,11 @@ if ( enable-readline )
endif ( Readline_FOUND )
endif ( enable-readline )
+unset ( HAIKU_SUPPORT CACHE )
+if ( enable-haiku )
+ set ( HAIKU_SUPPORT 1 )
+endif ( enable-haiku )
+
unset ( AUFILE_SUPPORT CACHE )
if ( enable-aufile )
set ( AUFILE_SUPPORT 1 )
diff --git a/cmake_admin/report.cmake b/cmake_admin/report.cmake
index e2fe5055..391cdd78 100644
--- a/cmake_admin/report.cmake
+++ b/cmake_admin/report.cmake
@@ -154,6 +154,12 @@ else ( DBUS_SUPPORT )
set ( MISC_REPORT "${MISC_REPORT} D-Bus: no\n" )
endif ( DBUS_SUPPORT )
+if ( HAIKU_SUPPORT )
+ message ( "Haiku MediaKit support: yes" )
+else ( HAIKU_SUPPORT )
+ message ( "Haiku MediaKit support: no" )
+endif ( HAIKU_SUPPORT )
+
if ( LADSPA_SUPPORT )
set ( MISC_REPORT "${MISC_REPORT} LADSPA support: yes\n" )
else ( LADSPA_SUPPORT )
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 0275227b..68265ffb 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -73,6 +73,10 @@ if ( SDL2_SUPPORT )
set ( fluid_sdl2_SOURCES drivers/fluid_sdl2.c )
endif ( SDL2_SUPPORT )
+if ( HAIKU_SUPPORT )
+ set ( fluid_haiku_SOURCES drivers/fluid_haiku.cpp )
+endif ( HAIKU_SUPPORT )
+
if ( OSS_SUPPORT )
set ( fluid_oss_SOURCES drivers/fluid_oss.c )
endif ( OSS_SUPPORT )
@@ -239,6 +243,7 @@ add_library ( libfluidsynth-OBJ OBJECT
${fluid_wasapi_SOURCES}
${fluid_waveout_SOURCES}
${fluid_winmidi_SOURCES}
+ ${fluid_haiku_SOURCES}
${fluid_sdl2_SOURCES}
${fluid_libinstpatch_SOURCES}
${libfluidsynth_SOURCES}
diff --git a/src/config.cmake b/src/config.cmake
index d98a86f9..13bde4d5 100644
--- a/src/config.cmake
+++ b/src/config.cmake
@@ -208,6 +208,9 @@
/* Define to enable SDL2 audio driver */
#cmakedefine SDL2_SUPPORT @SDL2_SUPPORT@
+/* Define to enable Haiku MediaKit audio driver */
+#cmakedefine HAIKU_SUPPORT @HAIKU_SUPPORT@
+
/* Define to 1 if you have the ANSI C header files. */
#cmakedefine STDC_HEADERS @STDC_HEADERS@
diff --git a/src/drivers/fluid_adriver.c b/src/drivers/fluid_adriver.c
index f56d636b..9e8bedf9 100644
--- a/src/drivers/fluid_adriver.c
+++ b/src/drivers/fluid_adriver.c
@@ -110,6 +110,16 @@ static const fluid_audriver_definition_t fluid_audio_drivers[] =
},
#endif
+#if HAIKU_SUPPORT
+ {
+ "mediakit",
+ new_fluid_haiku_audio_driver,
+ NULL,
+ delete_fluid_haiku_audio_driver,
+ fluid_haiku_audio_driver_settings
+ },
+#endif
+
#if COREAUDIO_SUPPORT
{
"coreaudio",
diff --git a/src/drivers/fluid_adriver.h b/src/drivers/fluid_adriver.h
index a3651905..8caaf1fe 100644
--- a/src/drivers/fluid_adriver.h
+++ b/src/drivers/fluid_adriver.h
@@ -61,6 +61,13 @@ void delete_fluid_alsa_audio_driver(fluid_audio_driver_t *p);
void fluid_alsa_audio_driver_settings(fluid_settings_t *settings);
#endif
+#if HAIKU_SUPPORT
+fluid_audio_driver_t *new_fluid_haiku_audio_driver(fluid_settings_t *settings,
+ fluid_synth_t *synth);
+void delete_fluid_haiku_audio_driver(fluid_audio_driver_t *p);
+void fluid_haiku_audio_driver_settings(fluid_settings_t *settings);
+#endif
+
#if OSS_SUPPORT
fluid_audio_driver_t *new_fluid_oss_audio_driver(fluid_settings_t *settings,
fluid_synth_t *synth);
diff --git a/src/drivers/fluid_haiku.cpp b/src/drivers/fluid_haiku.cpp
new file mode 100644
index 00000000..4d86529a
--- /dev/null
+++ b/src/drivers/fluid_haiku.cpp
@@ -0,0 +1,140 @@
+/* Haiku MediaKit Driver for FluidSynth
+ *
+ * Copyright (C) 2019 Gerasim Troeglazov
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA
+ */
+
+
+#include <MediaKit.h>
+#include <SupportKit.h>
+
+extern "C" {
+#include "fluid_synth.h"
+#include "fluid_adriver.h"
+#include "fluid_settings.h"
+}
+
+typedef struct
+{
+ fluid_audio_driver_t driver;
+
+ fluid_synth_t *synth;
+ fluid_audio_callback_t write_ptr;
+
+ int frame_size;
+
+ BSoundPlayer *m_player;
+
+} fluid_haiku_audio_driver_t;
+
+
+static void playerProc(void *cookie, void *buffer, size_t len, const media_raw_audio_format &format)
+{
+ fluid_haiku_audio_driver_t *dev = (fluid_haiku_audio_driver_t *)cookie;
+ len /= dev->frame_size;
+ dev->write_ptr(dev->synth, len, buffer, 0, 2, buffer, 1, 2);
+}
+
+void fluid_haiku_audio_driver_settings(fluid_settings_t *settings)
+{
+ fluid_settings_register_str(settings, "audio.haiku.device", "default", 0);
+ fluid_settings_add_option(settings, "audio.haiku.device", "default");
+}
+
+fluid_audio_driver_t *
+new_fluid_haiku_audio_driver(fluid_settings_t *settings, fluid_synth_t *synth)
+{
+ fluid_haiku_audio_driver_t *dev = NULL;
+ fluid_audio_callback_t write_ptr;
+
+ double sample_rate;
+ int period_size;
+ int periods;
+ int sample_size;
+
+ char *device;
+ const char *dev_name;
+
+ fluid_settings_getnum(settings, "synth.sample-rate", &sample_rate);
+ fluid_settings_getint(settings, "audio.periods", &periods);
+ fluid_settings_getint(settings, "audio.period-size", &period_size);
+
+ if(period_size < 1024) {
+ period_size = 1024;
+ } else {
+ if((period_size & (period_size - 1)) != 0) {
+ FLUID_LOG(FLUID_ERR, "\"audio.period-size\" must be a power of 2");
+ return NULL;
+ }
+ }
+
+ if(fluid_settings_str_equal(settings, "audio.sample-format", "16bits"))
+ {
+ FLUID_LOG(FLUID_DBG, "Selected 16 bit sample format");
+ sample_size = sizeof(short);
+ write_ptr = fluid_synth_write_s16;
+ } else {
+ FLUID_LOG(FLUID_ERR, "Unhandled sample format");
+ return NULL;
+ }
+
+ dev = FLUID_NEW(fluid_haiku_audio_driver_t);
+ if(dev == NULL) {
+ FLUID_LOG(FLUID_ERR, "Out of memory");
+ return NULL;
+ }
+ FLUID_MEMSET(dev, 0, sizeof(fluid_haiku_audio_driver_t));
+
+ dev->synth = synth;
+ dev->frame_size = 2 * sample_size;
+ dev->write_ptr = write_ptr;
+
+ media_raw_audio_format mediaKitFormat = {
+ (float)sample_rate,
+ (uint32)2,
+ media_raw_audio_format::B_AUDIO_SHORT,
+ B_MEDIA_LITTLE_ENDIAN,
+ (uint32)periods * period_size * dev->frame_size
+ };
+
+ dev->m_player = new BSoundPlayer(&mediaKitFormat, "FluidSynth", playerProc, NULL, (void*)dev);
+
+ if(dev->m_player->InitCheck() != B_OK) {
+ delete dev->m_player;
+ dev->m_player = NULL;
+ delete_fluid_haiku_audio_driver(&dev->driver);
+ return NULL;
+ }
+
+ dev->m_player->SetHasData(true);
+ dev->m_player->Start();
+
+ return (fluid_audio_driver_t *) dev;
+}
+
+
+void delete_fluid_haiku_audio_driver(fluid_audio_driver_t *d)
+{
+ fluid_haiku_audio_driver_t *dev = (fluid_haiku_audio_driver_t *) d;
+ if (dev->m_player != NULL) {
+ dev->m_player->SetHasData(false);
+ dev->m_player->Stop();
+ delete dev->m_player;
+ dev->m_player = NULL;
+ }
+ FLUID_FREE(dev);
+}
diff --git a/src/synth/fluid_synth.c b/src/synth/fluid_synth.c
index 82cfac4c..a97efbf5 100644
--- a/src/synth/fluid_synth.c
+++ b/src/synth/fluid_synth.c
@@ -27,6 +27,10 @@
#include "fluid_defsfont.h"
#include "fluid_instpatch.h"
+#ifdef __HAIKU__
+#include <FindDirectory.h>
+#endif
+
#ifdef TRAP_ON_FPE
#define _GNU_SOURCE
#include <fenv.h>
@@ -218,8 +222,25 @@ void fluid_synth_settings(fluid_settings_t *settings)
fluid_settings_register_int(settings, "synth.lock-memory", 1, 0, 1, FLUID_HINT_TOGGLED);
fluid_settings_register_str(settings, "midi.portname", "", 0);
+#ifdef __HAIKU__
+ char midiSettings[PATH_MAX] = "";
+ if (find_directory(B_USER_SETTINGS_DIRECTORY, -1, false, midiSettings, sizeof(midiSettings)) == B_OK) {
+ strcat(midiSettings, "/Media/midi_settings");
+ if( access( midiSettings, F_OK ) != -1 ) {
+ FILE *inFile = fopen(midiSettings, "rt");
+ if (inFile) {
+ char sf2file[PATH_MAX];
+ if (fscanf(inFile, "# Midi\n\tsoundfont \"%[^\"]\"", sf2file)) {
+ fluid_settings_register_str(settings, "synth.default-soundfont", sf2file, 0);
+ }
+ fclose(inFile);
+ }
+ }
+ }
+#else
#ifdef DEFAULT_SOUNDFONT
fluid_settings_register_str(settings, "synth.default-soundfont", DEFAULT_SOUNDFONT, 0);
+#endif
#endif
fluid_settings_register_int(settings, "synth.polyphony", 256, 1, 65535, 0);
diff --git a/src/utils/fluid_sys.h b/src/utils/fluid_sys.h
index f491254d..30805fd2 100644
--- a/src/utils/fluid_sys.h
+++ b/src/utils/fluid_sys.h
@@ -738,7 +738,7 @@ enum
sample data.
*/
-#if defined(HAVE_SYS_MMAN_H) && !defined(__OS2__)
+#if defined(HAVE_SYS_MMAN_H) && !defined(__OS2__) && !defined(__HAIKU__)
#define fluid_mlock(_p,_n) mlock(_p, _n)
#define fluid_munlock(_p,_n) munlock(_p,_n)
#else
--
2.45.2
From f73f4f574674b2c534b4ffc611b8e864419e09ff Mon Sep 17 00:00:00 2001
From: Cacodemon345 <wahil1976@outlook.com>
Date: Thu, 17 Mar 2022 14:08:23 +0600
Subject: [PATCH 2/6] Get rid of excessive realtime audio output latency
---
src/drivers/fluid_haiku.cpp | 17 +++++++----------
1 file changed, 7 insertions(+), 10 deletions(-)
diff --git a/src/drivers/fluid_haiku.cpp b/src/drivers/fluid_haiku.cpp
index 4d86529a..e68653f5 100644
--- a/src/drivers/fluid_haiku.cpp
+++ b/src/drivers/fluid_haiku.cpp
@@ -73,16 +73,13 @@ new_fluid_haiku_audio_driver(fluid_settings_t *settings, fluid_synth_t *synth)
fluid_settings_getint(settings, "audio.periods", &periods);
fluid_settings_getint(settings, "audio.period-size", &period_size);
- if(period_size < 1024) {
- period_size = 1024;
- } else {
- if((period_size & (period_size - 1)) != 0) {
- FLUID_LOG(FLUID_ERR, "\"audio.period-size\" must be a power of 2");
- return NULL;
- }
+ if(fluid_settings_str_equal(settings, "audio.sample-format", "float"))
+ {
+ FLUID_LOG(FLUID_DBG, "Selected 32 bit sample format");
+ sample_size = sizeof(float);
+ write_ptr = fluid_synth_write_float;
}
-
- if(fluid_settings_str_equal(settings, "audio.sample-format", "16bits"))
+ else if(fluid_settings_str_equal(settings, "audio.sample-format", "16bits"))
{
FLUID_LOG(FLUID_DBG, "Selected 16 bit sample format");
sample_size = sizeof(short);
@@ -106,7 +103,7 @@ new_fluid_haiku_audio_driver(fluid_settings_t *settings, fluid_synth_t *synth)
media_raw_audio_format mediaKitFormat = {
(float)sample_rate,
(uint32)2,
- media_raw_audio_format::B_AUDIO_SHORT,
+ sample_size == sizeof(float) ? media_raw_audio_format::B_AUDIO_FLOAT : media_raw_audio_format::B_AUDIO_SHORT,
B_MEDIA_LITTLE_ENDIAN,
(uint32)periods * period_size * dev->frame_size
};
--
2.45.2
From faebc01901f2471d0ee10085ede0c57e98bd5180 Mon Sep 17 00:00:00 2001
From: Cacodemon345 <wahil1976@outlook.com>
Date: Thu, 17 Mar 2022 14:09:10 +0600
Subject: [PATCH 3/6] Add Haiku MidiKit2 MIDI backend
---
CMakeLists.txt | 9 ++
src/CMakeLists.txt | 5 +
src/config.cmake | 3 +
src/drivers/fluid_mdriver.c | 8 ++
src/drivers/fluid_mdriver.h | 9 ++
src/drivers/fluid_midikit2.cpp | 162 +++++++++++++++++++++++++++++++++
6 files changed, 196 insertions(+)
create mode 100644 src/drivers/fluid_midikit2.cpp
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 831f29c6..8bacb7b1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -95,6 +95,7 @@ option ( enable-wasapi "compile Windows WASAPI support (if it is available)" on
option ( enable-waveout "compile Windows WaveOut support (if it is available)" on )
option ( enable-winmidi "compile Windows MIDI support (if it is available)" on )
option ( enable-haiku "compile Haiku MediaKit audio support (if it is available)" on )
+option ( enable-midikit2 "compile Haiku MidiKit2 MIDI support (if it is available)" on )
option ( enable-sdl2 "compile SDL2 audio support (if it is available)" off )
option ( enable-pulseaudio "compile PulseAudio support (if it is available)" on )
option ( enable-pipewire "compile PipeWire support (if it is available)" on )
@@ -407,6 +408,9 @@ endif ( CMAKE_SYSTEM MATCHES "SunOS" )
if ( CMAKE_SYSTEM MATCHES "Haiku" )
set ( FLUID_LIBS "${FLUID_LIBS};network;bsd;be;media" )
set ( LIBFLUID_LIBS "${LIBFLUID_LIBS};network;bsd;be;media" )
+ if ( enable-midikit2 )
+ set( LIBFLUID_LIBS "midi2" ${LIBFLUID_LIBS} )
+ endif ( enable-midikit2 )
endif ( CMAKE_SYSTEM MATCHES "Haiku" )
# Apple Mac OSX
@@ -723,10 +727,15 @@ if ( enable-readline )
endif ( enable-readline )
unset ( HAIKU_SUPPORT CACHE )
+unset ( MIDIKIT2_SUPPORT CACHE )
if ( enable-haiku )
set ( HAIKU_SUPPORT 1 )
endif ( enable-haiku )
+if ( enable-midikit2 )
+ set ( MIDIKIT2_SUPPORT 1 )
+endif ( enable-midikit2 )
+
unset ( AUFILE_SUPPORT CACHE )
if ( enable-aufile )
set ( AUFILE_SUPPORT 1 )
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 68265ffb..ddabc28f 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -77,6 +77,10 @@ if ( HAIKU_SUPPORT )
set ( fluid_haiku_SOURCES drivers/fluid_haiku.cpp )
endif ( HAIKU_SUPPORT )
+if ( MIDIKIT2_SUPPORT )
+ set ( fluid_midikit2_SOURCES drivers/fluid_midikit2.cpp )
+endif ( MIDIKIT2_SUPPORT )
+
if ( OSS_SUPPORT )
set ( fluid_oss_SOURCES drivers/fluid_oss.c )
endif ( OSS_SUPPORT )
@@ -244,6 +248,7 @@ add_library ( libfluidsynth-OBJ OBJECT
${fluid_waveout_SOURCES}
${fluid_winmidi_SOURCES}
${fluid_haiku_SOURCES}
+ ${fluid_midikit2_SOURCES}
${fluid_sdl2_SOURCES}
${fluid_libinstpatch_SOURCES}
${libfluidsynth_SOURCES}
diff --git a/src/config.cmake b/src/config.cmake
index 13bde4d5..1b182d0d 100644
--- a/src/config.cmake
+++ b/src/config.cmake
@@ -211,6 +211,9 @@
/* Define to enable Haiku MediaKit audio driver */
#cmakedefine HAIKU_SUPPORT @HAIKU_SUPPORT@
+/* Define to enable Haiku MidiKit2 MIDI driver */
+#cmakedefine MIDIKIT2_SUPPORT @MIDIKIT2_SUPPORT@
+
/* Define to 1 if you have the ANSI C header files. */
#cmakedefine STDC_HEADERS @STDC_HEADERS@
diff --git a/src/drivers/fluid_mdriver.c b/src/drivers/fluid_mdriver.c
index 973aef58..33b07eb4 100644
--- a/src/drivers/fluid_mdriver.c
+++ b/src/drivers/fluid_mdriver.c
@@ -84,6 +84,14 @@ static const fluid_mdriver_definition_t fluid_midi_drivers[] =
NULL
},
#endif
+#if MIDIKIT2_SUPPORT
+ {
+ "midikit2",
+ new_fluid_midikit2_driver,
+ delete_fluid_midikit2_driver,
+ fluid_midikit2_driver_settings
+ },
+#endif
#if COREMIDI_SUPPORT
{
"coremidi",
diff --git a/src/drivers/fluid_mdriver.h b/src/drivers/fluid_mdriver.h
index 76b8b7b0..7a2d701e 100644
--- a/src/drivers/fluid_mdriver.h
+++ b/src/drivers/fluid_mdriver.h
@@ -88,6 +88,15 @@ fluid_midi_driver_t *new_fluid_midishare_midi_driver(fluid_settings_t *settings,
void delete_fluid_midishare_midi_driver(fluid_midi_driver_t *p);
#endif
+/* definitions for the MidiKit2 driver */
+#if MIDIKIT2_SUPPORT
+fluid_midi_driver_t *new_fluid_midikit2_driver(fluid_settings_t *settings,
+ handle_midi_event_func_t handler,
+ void *event_handler_data);
+void delete_fluid_midikit2_driver(fluid_midi_driver_t *p);
+void fluid_midikit2_driver_settings(fluid_settings_t *settings);
+#endif
+
/* definitions for the CoreMidi driver */
#if COREMIDI_SUPPORT
fluid_midi_driver_t *new_fluid_coremidi_driver(fluid_settings_t *settings,
diff --git a/src/drivers/fluid_midikit2.cpp b/src/drivers/fluid_midikit2.cpp
new file mode 100644
index 00000000..c65ab471
--- /dev/null
+++ b/src/drivers/fluid_midikit2.cpp
@@ -0,0 +1,162 @@
+/* Haiku MidiKit2 Driver for FluidSynth
+ *
+ * Copyright (C) 2022 Cacodemon345
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA
+ */
+
+/* Parts of code taken from the CoreMIDI driver. */
+#include <type_traits>
+
+extern "C" {
+#include "fluid_midi.h"
+#include "fluid_mdriver.h"
+#include "fluid_settings.h"
+}
+
+#include <MidiKit.h>
+#include <midi2/MidiRoster.h>
+#include <midi2/MidiConsumer.h>
+#include <midi2/MidiProducer.h>
+#include <SupportKit.h>
+
+typedef struct
+{
+ fluid_midi_driver_t driver;
+ fluid_midi_parser_t* parser;
+
+ BMidiLocalConsumer *m_consumer;
+ int autoconn_inputs;
+} fluid_midikit2_driver_t;
+
+class fluid_midikit2_input : public BMidiLocalConsumer
+{
+ void Data(uchar *data, size_t length, bool atomic, bigtime_t time) override
+ {
+ if (atomic && callback)
+ {
+ fluid_midi_event_t *event = NULL;
+ snooze_until(time, B_SYSTEM_TIMEBASE);
+ for (int i = 0; i < length; i++)
+ {
+ event = fluid_midi_parser_parse(callback->parser, data[i]);
+ }
+ if (event)
+ {
+ callback->driver.handler(callback->driver.data, event);
+ }
+ }
+ }
+public:
+ fluid_midikit2_driver_t* callback;
+};
+
+void fluid_midikit2_driver_settings(fluid_settings_t *settings)
+{
+ fluid_settings_register_str(settings, "midi.midikit2.id", "pid", 0);
+}
+
+static void fluid_coremidi_autoconnect(fluid_midikit2_driver_t *dev)
+{
+ int32 id = 0;
+ BMidiProducer* producer = NULL;
+ while ((producer = BMidiRoster::NextProducer(&id)) != NULL)
+ {
+ producer->Connect(dev->m_consumer);
+ producer->Release();
+ }
+}
+
+fluid_midi_driver_t*
+new_fluid_midikit2_driver(fluid_settings_t *settings, handle_midi_event_func_t handler, void *data)
+{
+ fluid_midikit2_driver_t* driver = NULL;
+ char* id = NULL;
+ char clientid[128];
+
+ memset(clientid, 0, sizeof(clientid));
+ driver = FLUID_MALLOC(sizeof(fluid_midikit2_driver_t));
+
+ if(driver == NULL)
+ {
+ FLUID_LOG(FLUID_ERR, "Out of memory");
+ return NULL;
+ }
+
+ driver->driver.handler = handler;
+ driver->driver.data = data;
+
+ driver->parser = new_fluid_midi_parser();
+
+ if(driver->parser == NULL)
+ {
+ FLUID_LOG(FLUID_ERR, "Out of memory");
+ FLUID_FREE(driver);
+ return NULL;
+ }
+
+ fluid_settings_dupstr(settings, "midi.midikit2.id", &id);
+ if(id != NULL)
+ {
+ if(FLUID_STRCMP(id, "pid") == 0)
+ {
+ FLUID_SNPRINTF(clientid, sizeof(clientid), "FluidSynth virtual port (%d)", getpid());
+ }
+ else
+ {
+ FLUID_SNPRINTF(clientid, sizeof(clientid), "FluidSynth virtual port (%s)", id);
+ }
+
+ FLUID_FREE(id); /* -- free id string */
+ }
+ else strncpy(clientid, "FluidSynth virtual port", sizeof(clientid));
+
+ driver->m_consumer = new fluid_midikit2_input;
+ if(!driver->m_consumer->IsValid())
+ {
+ FLUID_LOG(FLUID_ERR, "Failed to create the MIDI consumer");
+ driver->m_consumer->Release();
+ delete_fluid_midi_parser(driver->parser);
+ FLUID_FREE(driver);
+ return NULL;
+ }
+
+ ((fluid_midikit2_input*)driver->m_consumer)->callback = driver;
+ driver->m_consumer->SetName(clientid);
+ driver->m_consumer->Register();
+ fluid_settings_getint(settings, "midi.autoconnect", &driver->autoconn_inputs);
+
+ if (driver->autoconn_inputs)
+ {
+ fluid_coremidi_autoconnect(driver);
+ }
+
+ return (fluid_midi_driver_t *)driver;
+}
+
+void
+delete_fluid_midikit2_driver(fluid_midi_driver_t *p)
+{
+ fluid_return_if_fail(p != NULL);
+ if (p)
+ {
+ fluid_midikit2_driver_t* driver = (fluid_midikit2_driver_t*)p;
+ driver->m_consumer->Unregister();
+ driver->m_consumer->Release();
+ delete_fluid_midi_parser(driver->parser);
+ FLUID_FREE(driver);
+ }
+}
--
2.45.2
From 7f2a52e8ffe9092514f827db50be1299fb5c8025 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Revol?= <revol@free.fr>
Date: Sun, 16 Feb 2025 00:15:33 +0100
Subject: [PATCH 4/6] CMake: Report Haiku audio & MIDI
---
cmake_admin/report.cmake | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/cmake_admin/report.cmake b/cmake_admin/report.cmake
index 391cdd78..e2271ea0 100644
--- a/cmake_admin/report.cmake
+++ b/cmake_admin/report.cmake
@@ -26,6 +26,18 @@ else ( DSOUND_SUPPORT )
set ( AUDIO_MIDI_REPORT "${AUDIO_MIDI_REPORT} DSound: no\n" )
endif ( DSOUND_SUPPORT )
+if ( HAIKU_SUPPORT )
+ set ( AUDIO_MIDI_REPORT "${AUDIO_MIDI_REPORT} Haiku: yes\n" )
+else ( HAIKU_SUPPORT )
+ set ( AUDIO_MIDI_REPORT "${AUDIO_MIDI_REPORT} Haiku: no\n" )
+endif ( HAIKU_SUPPORT )
+
+if ( MIDIKIT2_SUPPORT )
+ set ( AUDIO_MIDI_REPORT "${AUDIO_MIDI_REPORT} Haiku MidiKit2: yes\n" )
+else ( MIDIKIT2_SUPPORT )
+ set ( AUDIO_MIDI_REPORT "${AUDIO_MIDI_REPORT} Haiku MidiKit2: no\n" )
+endif ( MIDIKIT2_SUPPORT )
+
if ( JACK_SUPPORT )
set ( AUDIO_MIDI_REPORT "${AUDIO_MIDI_REPORT} JACK: yes\n" )
else ( JACK_SUPPORT )
--
2.45.2
From 73f122436cd8df64568c14dc4ef74728f3c7037c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Revol?= <revol@free.fr>
Date: Sun, 16 Feb 2025 00:37:24 +0100
Subject: [PATCH 5/6] Haiku: no need for <type_traits> and C++2011
---
src/drivers/fluid_midikit2.cpp | 1 -
1 file changed, 1 deletion(-)
diff --git a/src/drivers/fluid_midikit2.cpp b/src/drivers/fluid_midikit2.cpp
index c65ab471..5989bcbe 100644
--- a/src/drivers/fluid_midikit2.cpp
+++ b/src/drivers/fluid_midikit2.cpp
@@ -19,7 +19,6 @@
*/
/* Parts of code taken from the CoreMIDI driver. */
-#include <type_traits>
extern "C" {
#include "fluid_midi.h"
--
2.45.2
From 1881c2b3fdf5af115c644b930e98c4a03784e23d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fran=C3=A7ois=20Revol?= <revol@free.fr>
Date: Sun, 16 Feb 2025 01:34:40 +0100
Subject: [PATCH 6/6] CMake: properly check for Haiku headers
---
CMakeLists.txt | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8bacb7b1..16cf76dd 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -729,11 +729,23 @@ endif ( enable-readline )
unset ( HAIKU_SUPPORT CACHE )
unset ( MIDIKIT2_SUPPORT CACHE )
if ( enable-haiku )
- set ( HAIKU_SUPPORT 1 )
+ check_include_file_cxx("MediaKit.h" HAVE_MEDIAKIT_H)
+ check_include_file_cxx("SupportKit.h" HAVE_SUPPORTKIT_H)
+ if ( HAVE_MEDIAKIT_H AND HAVE_SUPPORTKIT_H )
+ set ( HAIKU_SUPPORT TRUE )
+ else ( HAVE_MEDIAKIT_H AND HAVE_SUPPORTKIT_H )
+ set ( HAIKU_SUPPORT FALSE )
+ endif ( HAVE_MEDIAKIT_H AND HAVE_SUPPORTKIT_H )
endif ( enable-haiku )
if ( enable-midikit2 )
- set ( MIDIKIT2_SUPPORT 1 )
+ check_include_file_cxx("Midi2Defs.h" HAVE_MIDI2DEFS_H)
+ check_include_file_cxx("MidiRoster.h" HAVE_MIDIROSTER_H)
+ if ( HAVE_MIDI2DEFS_H AND HAVE_MIDIROSTER_H )
+ set ( MIDIKIT2_SUPPORT TRUE )
+ else ( HAVE_MIDI2DEFS_H AND HAVE_MIDIROSTER_H )
+ set ( MIDIKIT2_SUPPORT FALSE )
+ endif ( HAVE_MIDI2DEFS_H AND HAVE_MIDIROSTER_H )
endif ( enable-midikit2 )
unset ( AUFILE_SUPPORT CACHE )
--
2.45.2