From 56e56295375a6f2d2db747b76dbf72bc65301d4a Mon Sep 17 00:00:00 2001 From: Gerasim Troeglazov <3dEyes@gmail.com> Date: Sun, 14 Apr 2019 13:45:10 +1000 Subject: [PATCH] FluidSynth: add new recipe for 2.0.4 version --- .../fluidsynth/fluidsynth2-2.0.4.recipe | 97 ++++ .../patches/fluidsynth2-2.0.4.patchset | 421 ++++++++++++++++++ 2 files changed, 518 insertions(+) create mode 100644 media-sound/fluidsynth/fluidsynth2-2.0.4.recipe create mode 100644 media-sound/fluidsynth/patches/fluidsynth2-2.0.4.patchset diff --git a/media-sound/fluidsynth/fluidsynth2-2.0.4.recipe b/media-sound/fluidsynth/fluidsynth2-2.0.4.recipe new file mode 100644 index 000000000..287cc4287 --- /dev/null +++ b/media-sound/fluidsynth/fluidsynth2-2.0.4.recipe @@ -0,0 +1,97 @@ +SUMMARY="A software real-time synthesizer" +DESCRIPTION=" +Fluidsynth is a free open source software synthesizer written in C. It \ +can convert MIDI note data to an audio signal using SoundFont technology \ +without a SoundFont compatible soundcard. Fluidsynth can perform as a virtual \ +MIDI device and read in SMF (.mid) files directly. Another function is its \ +ability to send audio data to a Raw or Wave file." +HOMEPAGE="http://www.fluidsynth.org/" +COPYRIGHT="2007-2019 Josh Green, Pedro Lopez-Cabanillas, David Henningsson" +LICENSE="GNU LGPL v2.1" +REVISION="1" +SOURCE_URI="https://github.com/FluidSynth/fluidsynth/archive/v$portVersion.tar.gz" +CHECKSUM_SHA256="2c065de87e9c9ba0311ebf2f4828a4fd76f1f5cc7d1d93dd80d7a048d7d2a76c" +SOURCE_DIR="fluidsynth-$portVersion" +PATCHES="fluidsynth2-$portVersion.patchset" + +ARCHITECTURES="?x86_gcc2 x86_64" +SECONDARY_ARCHITECTURES="x86" + +PROVIDES=" + fluidsynth2${secondaryArchSuffix} = $portVersion + cmd:fluidsynth${secondaryArchSuffix} + lib:libfluidsynth${secondaryArchSuffix} = 2.1.1 compat >= 2 + " +REQUIRES=" + haiku${secondaryArchSuffix} + lib:libFLAC$secondaryArchSuffix + lib:libglib_2.0$secondaryArchSuffix + lib:libgomp$secondaryArchSuffix + lib:libiconv$secondaryArchSuffix + lib:libintl$secondaryArchSuffix + lib:libncurses$secondaryArchSuffix + lib:libogg$secondaryArchSuffix + lib:libreadline$secondaryArchSuffix + lib:libSDL_1.2$secondaryArchSuffix + lib:libsndfile$secondaryArchSuffix + lib:libvorbis$secondaryArchSuffix + " + +PROVIDES_devel=" + fluidsynth2${secondaryArchSuffix}_devel = $portVersion + devel:libfluidsynth$secondaryArchSuffix = 2.1.1 compat >= 2 + " +REQUIRES_devel=" + fluidsynth2$secondaryArchSuffix == $portVersion base + " +CONFLICTS_devel=" + fluidsynth${secondaryArchSuffix}_devel + " + +BUILD_REQUIRES=" + haiku${secondaryArchSuffix}_devel + devel:libFLAC$secondaryArchSuffix + devel:libglib_2.0$secondaryArchSuffix + devel:libiconv$secondaryArchSuffix + devel:libncurses$secondaryArchSuffix + devel:libogg$secondaryArchSuffix + devel:libreadline$secondaryArchSuffix + devel:libSDL_1.2$secondaryArchSuffix + devel:libsndfile$secondaryArchSuffix + devel:libvorbis$secondaryArchSuffix + " +BUILD_PREREQUIRES=" + cmd:cmake + cmd:gcc$secondaryArchSuffix + cmd:libtoolize$secondaryArchSuffix + cmd:make + cmd:pkg_config$secondaryArchSuffix + " + +BUILD() +{ + mkdir -p build + cd build + cmake .. $cmakeDirArgs + make $jobArgs +} + +INSTALL() +{ + cd build + make install + + mkdir -p $(dirname $includeDir) + mv $prefix/include $includeDir + mv $prefix/lib64 $libDir || true + mkdir -p $(dirname $manDir) + mv $prefix/share/man $manDir + rm -rf $prefix/share + + prepareInstalledDevelLib libfluidsynth + fixPkgconfig + + # devel package + packageEntries devel \ + $developDir +} diff --git a/media-sound/fluidsynth/patches/fluidsynth2-2.0.4.patchset b/media-sound/fluidsynth/patches/fluidsynth2-2.0.4.patchset new file mode 100644 index 000000000..90a723925 --- /dev/null +++ b/media-sound/fluidsynth/patches/fluidsynth2-2.0.4.patchset @@ -0,0 +1,421 @@ +From 6c276fc426e1482c9f62155c6f3090353396192a Mon Sep 17 00:00:00 2001 +From: Gerasim Troeglazov <3dEyes@gmail.com> +Date: Sun, 14 Apr 2019 11:09:51 +1000 +Subject: Add MediaKit support + + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index b759259..0e37e9f 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -20,7 +20,8 @@ + # CMake based build system. Pedro Lopez-Cabanillas + + cmake_minimum_required ( VERSION 3.1.0 ) # because of CMAKE_C_STANDARD +-project ( FluidSynth C ) ++project ( FluidSynth C CXX) ++set(CMAKE_CXX_STANDARD 11) + set ( CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake_admin ) + + # FluidSynth package name +@@ -69,6 +70,7 @@ option ( enable-network "enable network support (requires BSD sockets)" on ) + option ( enable-oss "compile OSS support (if it is available)" on ) + option ( enable-dsound "compile DirectSound 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-pkgconfig "use pkg-config to locate fluidsynth's (mostly optional) dependencies" on ) + option ( enable-pulseaudio "compile PulseAudio support (if it is available)" on ) + option ( enable-readline "compile readline lib line editing (if it is available)" on ) +@@ -92,7 +94,7 @@ if ( CMAKE_SYSTEM MATCHES "OS2" ) + endif ( CMAKE_SYSTEM MATCHES "OS2" ) + + # Initialize the library directory name suffix. +-if (NOT MINGW AND NOT MSVC AND NOT CMAKE_SYSTEM_NAME MATCHES "FreeBSD|DragonFly") ++if (NOT MINGW AND NOT MSVC AND NOT HAIKU AND NOT CMAKE_SYSTEM_NAME MATCHES "FreeBSD|DragonFly") + if ( CMAKE_SIZEOF_VOID_P EQUAL 8 ) + set ( _init_lib_suffix "64" ) + else ( CMAKE_SIZEOF_VOID_P EQUAL 8 ) +@@ -156,8 +158,10 @@ check_include_file ( getopt.h HAVE_GETOPT_H ) + check_include_file ( stdint.h HAVE_STDINT_H ) + 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 ) +@@ -189,6 +193,11 @@ if ( CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID STREQUAL "Clang" OR CMAKE_C_ + + endif ( CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID STREQUAL "Clang" OR CMAKE_C_COMPILER_ID STREQUAL "Intel" ) + ++# Haiku ++if ( HAIKU ) ++set ( CMAKE_CXX_FLAGS "-fpermissive") ++endif ( HAIKU ) ++ + # Windows + unset ( WINDOWS_SUPPORT CACHE ) + unset ( WINDOWS_LIBS CACHE ) +@@ -256,7 +265,11 @@ else ( WIN32 ) + # Check PThreads, but not in Windows + find_package ( Threads REQUIRED ) + set ( HAVE_LIBPTHREAD ${Threads_FOUND} ) ++if ( HAIKU ) ++ set ( LIBFLUID_LIBS "network;bsd;be;media" ${CMAKE_THREAD_LIBS_INIT} ) ++else ( HAIKU ) + set ( LIBFLUID_LIBS "m" ${CMAKE_THREAD_LIBS_INIT} ) ++endif ( HAIKU ) + endif ( WIN32 ) + + # IBM OS/2 +@@ -538,6 +551,11 @@ else(NOT enable-pkgconfig) + endif ( LADSPA_SUPPORT ) + endif ( enable-ladspa ) + ++ unset ( HAIKU_SUPPORT CACHE ) ++ if ( enable-haiku ) ++ set ( HAIKU_SUPPORT 1 ) ++ endif ( enable-haiku ) ++ + endif(NOT enable-pkgconfig) + + unset ( AUFILE_SUPPORT CACHE ) +@@ -637,8 +655,13 @@ else () + endif () + configure_file ( fluidsynth.pc.in + ${CMAKE_BINARY_DIR}/fluidsynth.pc IMMEDIATE @ONLY ) ++if ( HAIKU ) ++install ( FILES ${CMAKE_BINARY_DIR}/fluidsynth.pc ++ DESTINATION ${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}${LIB_SUFFIX}/pkgconfig ) ++else ( HAIKU ) + install ( FILES ${CMAKE_BINARY_DIR}/fluidsynth.pc + DESTINATION ${LIB_INSTALL_DIR}/pkgconfig ) ++endif ( HAIKU) + + # Extra targets for Unix build environments + if ( UNIX ) +diff --git a/cmake_admin/report.cmake b/cmake_admin/report.cmake +index e25a989..be77acc 100644 +--- a/cmake_admin/report.cmake ++++ b/cmake_admin/report.cmake +@@ -86,6 +86,12 @@ else ( WINMIDI_SUPPORT ) + message ( "WinMidi support: no" ) + endif ( WINMIDI_SUPPORT ) + ++if ( HAIKU_SUPPORT ) ++ message ( "Haiku MediaKit support: yes" ) ++else ( HAIKU_SUPPORT ) ++ message ( "Haiku MediaKit support: no" ) ++endif ( HAIKU_SUPPORT ) ++ + if ( LADSPA_SUPPORT ) + message ( "LADSPA support: yes" ) + else ( LADSPA_SUPPORT ) +diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt +index a0ba53d..b96dfb5 100644 +--- a/src/CMakeLists.txt ++++ b/src/CMakeLists.txt +@@ -86,6 +86,10 @@ if ( WINMIDI_SUPPORT ) + set ( fluid_winmidi_SOURCES drivers/fluid_winmidi.c ) + endif ( WINMIDI_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 ) +@@ -249,6 +253,7 @@ add_library ( libfluidsynth-OBJ OBJECT + ${fluid_pulse_SOURCES} + ${fluid_dsound_SOURCES} + ${fluid_winmidi_SOURCES} ++ ${fluid_haiku_SOURCES} + ${libfluidsynth_SOURCES} + ${public_HEADERS} + ${public_main_HEADER} +diff --git a/src/config.cmake b/src/config.cmake +index 2d1d786..9ff3e29 100644 +--- a/src/config.cmake ++++ b/src/config.cmake +@@ -199,6 +199,9 @@ + /* Define to enable Windows MIDI driver */ + #cmakedefine WINMIDI_SUPPORT @WINMIDI_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 4311c46..bf4a84b 100644 +--- a/src/drivers/fluid_adriver.c ++++ b/src/drivers/fluid_adriver.c +@@ -80,6 +80,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 5cfc688..ace6353 100644 +--- a/src/drivers/fluid_adriver.h ++++ b/src/drivers/fluid_adriver.h +@@ -57,6 +57,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 0000000..31bfdea +--- /dev/null ++++ b/src/drivers/fluid_haiku.cpp +@@ -0,0 +1,139 @@ ++/* 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 ++ */ ++ ++extern "C" { ++#include "fluid_synth.h" ++#include "fluid_adriver.h" ++#include "fluid_settings.h" ++} ++ ++#include ++#include ++ ++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) { ++ dev->m_player->SetHasData(false); ++ dev->m_player->Stop(); ++ delete dev->m_player; ++ dev->m_player = NULL; ++ } ++} ++ +diff --git a/src/synth/fluid_synth.c b/src/synth/fluid_synth.c +index 15e167a..2bcf167 100644 +--- a/src/synth/fluid_synth.c ++++ b/src/synth/fluid_synth.c +@@ -26,6 +26,10 @@ + #include "fluid_sfont.h" + #include "fluid_defsfont.h" + ++#ifdef __HAIKU__ ++#include ++#endif ++ + #ifdef TRAP_ON_FPE + #define _GNU_SOURCE + #include +@@ -209,8 +213,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 9f2d6f6..f3d1464 100644 +--- a/src/utils/fluid_sys.h ++++ b/src/utils/fluid_sys.h +@@ -687,7 +687,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.21.0 + + +From 3a61c410708d121233477c684494ef3f8f5d731d Mon Sep 17 00:00:00 2001 +From: Gerasim Troeglazov <3dEyes@gmail.com> +Date: Sun, 14 Apr 2019 13:37:19 +1000 +Subject: Fix memory leaks + + +diff --git a/src/drivers/fluid_haiku.cpp b/src/drivers/fluid_haiku.cpp +index 31bfdea..2871948 100644 +--- a/src/drivers/fluid_haiku.cpp ++++ b/src/drivers/fluid_haiku.cpp +@@ -129,11 +129,12 @@ new_fluid_haiku_audio_driver(fluid_settings_t *settings, fluid_synth_t *synth) + 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) { ++ 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); + } + +-- +2.21.0 +