Hello community,
here is the log from the commit of package fluidsynth for openSUSE:Factory checked in at 2019-04-23 14:33:53
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/fluidsynth (Old)
and /work/SRC/openSUSE:Factory/.fluidsynth.new.5536 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "fluidsynth"
Tue Apr 23 14:33:53 2019 rev:44 rq:696464 version:2.0.5
Changes:
--------
--- /work/SRC/openSUSE:Factory/fluidsynth/fluidsynth.changes 2019-02-28 21:26:50.673864051 +0100
+++ /work/SRC/openSUSE:Factory/.fluidsynth.new.5536/fluidsynth.changes 2019-04-23 14:33:55.837379204 +0200
@@ -1,0 +2,12 @@
+Fri Apr 19 07:59:57 UTC 2019 - Tom Mbrt
+
+- Update to 2.0.5
+ * the MIDI player erroneously assumed a default tempo of 125 BPM
+ rather than 120 BPM
+ * improve integration of systemd
+ * fix a buffering bug in fluid_synth_process()
+ * fix a major memory leak when unloading SF3 files
+ * fix multiple NULL dereferences and memory leaks in jack driver
+ * fix a memory leak when creating threads
+
+-------------------------------------------------------------------
Old:
----
fluidsynth-2.0.4.tar.gz
New:
----
fluidsynth-2.0.5.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ fluidsynth.spec ++++++
--- /var/tmp/diff_new_pack.i6RGWe/_old 2019-04-23 14:33:56.733379888 +0200
+++ /var/tmp/diff_new_pack.i6RGWe/_new 2019-04-23 14:33:56.733379888 +0200
@@ -24,7 +24,7 @@
%endif
Name: fluidsynth
-Version: 2.0.4
+Version: 2.0.5
Release: 0
Summary: A Real-Time Software Synthesizer That Uses Soundfont(tm)
License: LGPL-2.1-or-later
++++++ fluidsynth-2.0.4.tar.gz -> fluidsynth-2.0.5.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.0.4/CMakeLists.txt new/fluidsynth-2.0.5/CMakeLists.txt
--- old/fluidsynth-2.0.4/CMakeLists.txt 2019-02-22 10:15:18.000000000 +0100
+++ new/fluidsynth-2.0.5/CMakeLists.txt 2019-04-18 19:43:39.000000000 +0200
@@ -29,7 +29,7 @@
# FluidSynth package version
set ( FLUIDSYNTH_VERSION_MAJOR 2 )
set ( FLUIDSYNTH_VERSION_MINOR 0 )
-set ( FLUIDSYNTH_VERSION_MICRO 4 )
+set ( FLUIDSYNTH_VERSION_MICRO 5 )
set ( VERSION "${FLUIDSYNTH_VERSION_MAJOR}.${FLUIDSYNTH_VERSION_MINOR}.${FLUIDSYNTH_VERSION_MICRO}" )
set ( FLUIDSYNTH_VERSION "\"${VERSION}\"" )
@@ -44,7 +44,7 @@
# This is not exactly the same algorithm as the libtool one, but the results are the same.
set ( LIB_VERSION_CURRENT 2 )
set ( LIB_VERSION_AGE 1 )
-set ( LIB_VERSION_REVISION 1 )
+set ( LIB_VERSION_REVISION 2 )
set ( LIB_VERSION_INFO
"${LIB_VERSION_CURRENT}.${LIB_VERSION_AGE}.${LIB_VERSION_REVISION}" )
@@ -80,6 +80,10 @@
option ( enable-alsa "compile ALSA support (if it is available)" on )
endif ( CMAKE_SYSTEM MATCHES "Linux|FreeBSD|DragonFly" )
+if ( CMAKE_SYSTEM MATCHES "Linux" )
+ option ( enable-systemd "compile systemd support (if it is available)" on )
+endif ( CMAKE_SYSTEM MATCHES "Linux" )
+
if ( CMAKE_SYSTEM MATCHES "Darwin" )
option ( enable-coreaudio "compile CoreAudio support (if it is available)" on )
option ( enable-coremidi "compile CoreMIDI support (if it is available)" on )
@@ -521,6 +525,14 @@
remove_definitions( -DHAVE_LASH )
endif ( enable-lash )
+ unset ( SYSTEMD_SUPPORT CACHE )
+ if ( enable-systemd )
+ pkg_check_modules ( SYSTEMD libsystemd )
+ set ( SYSTEMD_SUPPORT ${SYSTEMD_FOUND} )
+ else ( enable-systemd )
+ unset_pkg_config ( SYSTEMD )
+ endif ( enable-systemd )
+
unset ( DBUS_SUPPORT CACHE )
if ( enable-dbus )
pkg_check_modules ( DBUS dbus-1>=1.0.0 )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.0.4/cmake_admin/report.cmake new/fluidsynth-2.0.5/cmake_admin/report.cmake
--- old/fluidsynth-2.0.4/cmake_admin/report.cmake 2019-02-22 10:15:18.000000000 +0100
+++ new/fluidsynth-2.0.5/cmake_admin/report.cmake 2019-04-18 19:43:39.000000000 +0200
@@ -98,6 +98,12 @@
message ( "LASH support: no" )
endif ( LASH_SUPPORT )
+if ( SYSTEMD_SUPPORT )
+ message ( "systemd support: yes" )
+else ( SYSTEMD_SUPPORT )
+ message ( "systemd support: no" )
+endif ( SYSTEMD_SUPPORT )
+
if ( DART_SUPPORT )
message ( "OS/2 DART support: yes" )
else ( DART_SUPPORT )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.0.4/doc/Doxyfile new/fluidsynth-2.0.5/doc/Doxyfile
--- old/fluidsynth-2.0.4/doc/Doxyfile 2019-02-22 10:15:18.000000000 +0100
+++ new/fluidsynth-2.0.5/doc/Doxyfile 2019-04-18 19:43:39.000000000 +0200
@@ -5,7 +5,7 @@
#---------------------------------------------------------------------------
DOXYFILE_ENCODING = UTF-8
PROJECT_NAME = libfluidsynth
-PROJECT_NUMBER = 2.0.4
+PROJECT_NUMBER = 2.0.5
OUTPUT_DIRECTORY = api
CREATE_SUBDIRS = NO
OUTPUT_LANGUAGE = English
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.0.4/doc/fluidsynth-v20-devdoc.txt new/fluidsynth-2.0.5/doc/fluidsynth-v20-devdoc.txt
--- old/fluidsynth-2.0.4/doc/fluidsynth-v20-devdoc.txt 2019-02-22 10:15:18.000000000 +0100
+++ new/fluidsynth-2.0.5/doc/fluidsynth-v20-devdoc.txt 2019-04-18 19:43:39.000000000 +0200
@@ -8,8 +8,8 @@
\author David Henningsson
\author Tom Moebert
\author Copyright © 2003-2019 Peter Hanappe, Conrad Berhörster, Antoine Schmitt, Pedro López-Cabanillas, Josh Green, David Henningsson, Tom Moebert
-\version Revision 2.0.4
-\date 2019-02-09
+\version Revision 2.0.5
+\date 2019-04-17
All the source code examples in this document are in the public domain; you can use them as you please. This document is licensed under the Creative Commons Attribution-Share Alike 3.0 Unported License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ . The FluidSynth library is distributed under the GNU Lesser General Public License. A copy of the GNU Lesser General Public License is contained in the FluidSynth package; if not, visit http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt or write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
@@ -21,6 +21,7 @@
- \ref Disclaimer
- \ref Introduction
+- \ref NewIn2_0_5
- \ref NewIn2_0_3
- \ref NewIn2_0_2
- \ref NewIn2_0_0
@@ -42,7 +43,7 @@
\section Disclaimer
-This documentation, in its current version, is incomplete. As always, the source code is the final reference.
+This documentation may be partly incomplete. As always, the source code is the final reference.
SoundFont(R) is a registered trademark of E-mu Systems, Inc.
@@ -62,6 +63,11 @@
- FluidSynth is open source, in active development. For more details, take a look at http://www.fluidsynth.org
+\section NewIn2_0_5 Whats new in 2.0.5?
+
+- fluid_synth_process() omitted audio samples when called with arbitrary sample counts that were not a multiple of fluid_synth_get_internal_bufsize()
+- fluid_synth_sfunload() was not releasing sample buffers of SoundFont3 files if <a href="fluidsettings.xml#synth.dynamic-sample-loading">"synth.dynamic-sample-loading"</a> was set to FALSE
+
\section NewIn2_0_3 Whats new in 2.0.3?
- fix incorrect behaviour of fluid_sample_set_sound_data()
@@ -141,7 +147,7 @@
- remove deprecated fluid_synth_select_tuning(), use fluid_synth_activate_tuning(synth, chan, bank, prog, FALSE) instead
- remove deprecated fluid_synth_reset_tuning(), use fluid_synth_deactivate_tuning(synth, chan, FALSE) instead
- remove deprecated FLUID_HINT_INTEGER
-- remove deprecated fluid_synth_set_gen2() as there doesnt seem to be a use case for absolute generator values
+- remove deprecated fluid_synth_set_gen2() as there doesn't seem to be a use case for absolute generator values
- remove deprecated "synth.parallel-render" setting
- remove obsolete "audio.[out|in]put-channels" settings
- remove unimplemented "synth.dump" setting
@@ -162,7 +168,7 @@
Before you can use the synthesizer, you have to create a settings object. The settings objects is used by many components of the FluidSynth library. It gives a unified API to set the parameters of the audio drivers, the midi drivers, the synthesizer, and so forth. A number of default settings are defined by the current implementation.
-All settings have a name that follows the "dotted-name" notation. For example, "synth.polyphony" refers to the number of voices (polyphony) preallocated by the synthesizer. The settings also have a type. There are currently three types: strings, numbers (double floats), and integers. You can change the values of a setting using the fluid_settings_setstr(), fluid_settings_setnum(), and fluid_settings_setint() functions. For example:
+All settings have a name that follows the "dotted-name" notation. For example, "synth.polyphony" refers to the number of voices (polyphony) allocated by the synthesizer. The settings also have a type. There are currently three types: strings, numbers (double floats), and integers. You can change the values of a setting using the fluid_settings_setstr(), fluid_settings_setnum(), and fluid_settings_setint() functions. For example:
\code
#include
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.0.4/fluidsynth.service.in new/fluidsynth-2.0.5/fluidsynth.service.in
--- old/fluidsynth-2.0.4/fluidsynth.service.in 2019-02-22 10:15:18.000000000 +0100
+++ new/fluidsynth-2.0.5/fluidsynth.service.in 2019-04-18 19:43:39.000000000 +0200
@@ -4,6 +4,8 @@
After=sound.target
[Service]
+Type=notify
+NotifyAccess=main
EnvironmentFile=@FLUID_DAEMON_ENV_FILE@
EnvironmentFile=-%h/.config/fluidsynth
ExecStart=@CMAKE_INSTALL_PREFIX@/@BIN_INSTALL_DIR@/fluidsynth -is $OTHER_OPTS $SOUND_FONT
Binary files old/fluidsynth-2.0.4/sf2/VintageDreamsWaves-v2.sf3 and new/fluidsynth-2.0.5/sf2/VintageDreamsWaves-v2.sf3 differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.0.4/src/CMakeLists.txt new/fluidsynth-2.0.5/src/CMakeLists.txt
--- old/fluidsynth-2.0.4/src/CMakeLists.txt 2019-02-22 10:15:18.000000000 +0100
+++ new/fluidsynth-2.0.5/src/CMakeLists.txt 2019-04-18 19:43:39.000000000 +0200
@@ -95,6 +95,10 @@
include_directories ( ${LASH_INCLUDE_DIRS})
endif ( LASH_SUPPORT )
+if ( SYSTEMD_SUPPORT )
+ include_directories ( ${SYSTEMD_INCLUDE_DIRS})
+endif ( SYSTEMD_SUPPORT )
+
if ( DART_SUPPORT )
set ( fluid_dart_SOURCES drivers/fluid_dart.c )
include_directories ( ${DART_INCLUDE_DIRS} )
@@ -341,6 +345,7 @@
target_link_libraries ( fluidsynth
libfluidsynth
+ ${SYSTEMD_LIBRARIES}
${FLUID_LIBS}
)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.0.4/src/bindings/fluid_cmd.c new/fluidsynth-2.0.5/src/bindings/fluid_cmd.c
--- old/fluidsynth-2.0.4/src/bindings/fluid_cmd.c 2019-02-22 10:15:18.000000000 +0100
+++ new/fluidsynth-2.0.5/src/bindings/fluid_cmd.c 2019-04-18 19:43:39.000000000 +0200
@@ -102,7 +102,7 @@
},
{
"pitch_bend_range", "event", fluid_handle_pitch_bend_range,
- "pitch_bend chan range Sets bend pitch range"
+ "pitch_bend_range chn range Sets pitch bend range for the given midi channel"
},
{
"cc", "event", fluid_handle_cc,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.0.4/src/config.cmake new/fluidsynth-2.0.5/src/config.cmake
--- old/fluidsynth-2.0.4/src/config.cmake 2019-02-22 10:15:18.000000000 +0100
+++ new/fluidsynth-2.0.5/src/config.cmake 2019-04-18 19:43:39.000000000 +0200
@@ -49,6 +49,9 @@
/* whether or not we are supporting lash */
#cmakedefine HAVE_LASH @HAVE_LASH@
+/* Define if systemd support is enabled */
+#cmakedefine SYSTEMD_SUPPORT @SYSTEMD_SUPPORT@
+
/* Define to 1 if you have the `MidiShare' library (-lMidiShare). */
#cmakedefine HAVE_LIBMIDISHARE @HAVE_LIBMIDISHARE@
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.0.4/src/drivers/fluid_alsa.c new/fluidsynth-2.0.5/src/drivers/fluid_alsa.c
--- old/fluidsynth-2.0.4/src/drivers/fluid_alsa.c 2019-02-22 10:15:18.000000000 +0100
+++ new/fluidsynth-2.0.5/src/drivers/fluid_alsa.c 2019-04-18 19:43:39.000000000 +0200
@@ -355,6 +355,7 @@
if(dev->thread)
{
fluid_thread_join(dev->thread);
+ delete_fluid_thread(dev->thread);
}
if(dev->pcm)
@@ -757,6 +758,7 @@
if(dev->thread)
{
fluid_thread_join(dev->thread);
+ delete_fluid_thread(dev->thread);
}
if(dev->rawmidi_in)
@@ -1210,6 +1212,7 @@
if(dev->thread)
{
fluid_thread_join(dev->thread);
+ delete_fluid_thread(dev->thread);
}
if(dev->seq_handle)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.0.4/src/drivers/fluid_jack.c new/fluidsynth-2.0.5/src/drivers/fluid_jack.c
--- old/fluidsynth-2.0.4/src/drivers/fluid_jack.c 2019-02-22 10:15:18.000000000 +0100
+++ new/fluidsynth-2.0.5/src/drivers/fluid_jack.c 2019-04-18 19:43:39.000000000 +0200
@@ -115,11 +115,13 @@
* Connect all midi input ports to all terminal midi output ports
*/
void
-fluid_jack_midi_autoconnect(jack_client_t *client, fluid_jack_midi_driver_t *midi_driver) {
+fluid_jack_midi_autoconnect(jack_client_t *client, fluid_jack_midi_driver_t *midi_driver)
+{
int i, j;
- const char ** midi_source_ports;
+ const char **midi_source_ports;
midi_source_ports = jack_get_ports(client, NULL, JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput | JackPortIsTerminal);
+
if(midi_source_ports != NULL)
{
for(j = 0; midi_source_ports[j] != NULL; j++)
@@ -130,6 +132,7 @@
jack_connect(client, midi_source_ports[j], jack_port_name(midi_driver->midi_port[i]));
}
}
+
jack_free(midi_source_ports);
}
@@ -199,7 +202,7 @@
if(!client_ref)
{
- FLUID_LOG(FLUID_ERR, "Out of memory");
+ FLUID_LOG(FLUID_PANIC, "Out of memory");
goto error_recovery;
}
@@ -338,7 +341,7 @@
if((dev->midi_port = FLUID_ARRAY(jack_port_t *, ports)) == NULL)
{
- FLUID_LOG(FLUID_ERR, "Out of memory");
+ FLUID_LOG(FLUID_PANIC, "Out of memory");
return FLUID_FAILED;
}
@@ -375,7 +378,7 @@
if(dev->output_ports == NULL)
{
- FLUID_LOG(FLUID_PANIC, "Jack server not running?");
+ FLUID_LOG(FLUID_PANIC, "Out of memory");
return FLUID_FAILED;
}
@@ -388,6 +391,11 @@
dev->output_ports[1]
= jack_port_register(client, "right", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
+ if(dev->output_ports[0] == NULL || dev->output_ports[1] == NULL)
+ {
+ FLUID_LOG(FLUID_ERR, "Failed to create Jack audio port");
+ goto error_recovery;
+ }
}
else
{
@@ -406,7 +414,7 @@
if(dev->output_bufs == NULL)
{
FLUID_LOG(FLUID_PANIC, "Out of memory");
- return FLUID_FAILED;
+ goto error_recovery;
}
FLUID_MEMSET(dev->output_ports, 0, 2 * dev->num_output_ports * sizeof(jack_port_t *));
@@ -414,12 +422,22 @@
for(i = 0; i < dev->num_output_ports; i++)
{
sprintf(name, "l_%02d", i);
- dev->output_ports[2 * i]
- = jack_port_register(client, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
+
+ if((dev->output_ports[2 * i]
+ = jack_port_register(client, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0)) == NULL)
+ {
+ FLUID_LOG(FLUID_ERR, "Failed to create Jack audio port '%s'", name);
+ goto error_recovery;
+ }
sprintf(name, "r_%02d", i);
- dev->output_ports[2 * i + 1]
- = jack_port_register(client, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
+
+ if((dev->output_ports[2 * i + 1]
+ = jack_port_register(client, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0)) == NULL)
+ {
+ FLUID_LOG(FLUID_ERR, "Failed to create Jack audio port '%s'", name);
+ goto error_recovery;
+ }
}
fluid_settings_getint(settings, "synth.effects-channels", &dev->num_fx_ports);
@@ -431,7 +449,7 @@
if(dev->fx_ports == NULL)
{
FLUID_LOG(FLUID_PANIC, "Out of memory");
- return FLUID_FAILED;
+ goto error_recovery;
}
dev->fx_bufs = FLUID_ARRAY(float *, 2 * dev->num_fx_ports);
@@ -439,7 +457,7 @@
if(dev->fx_bufs == NULL)
{
FLUID_LOG(FLUID_PANIC, "Out of memory");
- return FLUID_FAILED;
+ goto error_recovery;
}
FLUID_MEMSET(dev->fx_ports, 0, 2 * dev->num_fx_ports * sizeof(jack_port_t *));
@@ -447,12 +465,22 @@
for(i = 0; i < dev->num_fx_ports; i++)
{
sprintf(name, "fx_l_%02d", i);
- dev->fx_ports[2 * i]
- = jack_port_register(client, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
+
+ if((dev->fx_ports[2 * i]
+ = jack_port_register(client, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0)) == NULL)
+ {
+ FLUID_LOG(FLUID_ERR, "Failed to create Jack fx audio port '%s'", name);
+ goto error_recovery;
+ }
sprintf(name, "fx_r_%02d", i);
- dev->fx_ports[2 * i + 1]
- = jack_port_register(client, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
+
+ if((dev->fx_ports[2 * i + 1]
+ = jack_port_register(client, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0)) == NULL)
+ {
+ FLUID_LOG(FLUID_ERR, "Failed to create Jack fx audio port '%s'", name);
+ goto error_recovery;
+ }
}
}
@@ -477,6 +505,18 @@
}
return FLUID_OK;
+
+error_recovery:
+
+ FLUID_FREE(dev->output_ports);
+ dev->output_ports = NULL;
+ FLUID_FREE(dev->fx_ports);
+ dev->fx_ports = NULL;
+ FLUID_FREE(dev->output_bufs);
+ dev->output_bufs = NULL;
+ FLUID_FREE(dev->fx_bufs);
+ dev->fx_bufs = NULL;
+ return FLUID_FAILED;
}
static void
@@ -539,7 +579,7 @@
if(dev == NULL)
{
- FLUID_LOG(FLUID_ERR, "Out of memory");
+ FLUID_LOG(FLUID_PANIC, "Out of memory");
return NULL;
}
@@ -688,6 +728,7 @@
}
audio_driver = fluid_atomic_pointer_get(&client->audio_driver);
+
if(audio_driver == NULL)
{
// shutting down
@@ -765,6 +806,7 @@
fluid_jack_port_registration(jack_port_id_t port, int is_registering, void *arg)
{
fluid_jack_client_t *client_ref = (fluid_jack_client_t *)arg;
+
if(client_ref->midi_driver != NULL)
{
client_ref->midi_driver->autoconnect_is_outdated = client_ref->midi_driver->autoconnect_inputs && is_registering != 0;
@@ -793,7 +835,7 @@
if(dev == NULL)
{
- FLUID_LOG(FLUID_ERR, "Out of memory");
+ FLUID_LOG(FLUID_PANIC, "Out of memory");
return NULL;
}
@@ -807,9 +849,8 @@
if(dev->parser == NULL)
{
- FLUID_LOG(FLUID_ERR, "Out of memory");
- FLUID_FREE(dev);
- return NULL;
+ FLUID_LOG(FLUID_PANIC, "Out of memory");
+ goto error_recovery;
}
fluid_settings_getint(settings, "midi.autoconnect", &dev->autoconnect_inputs);
@@ -819,11 +860,15 @@
if(!dev->client_ref)
{
- FLUID_FREE(dev);
- return NULL;
+ FLUID_LOG(FLUID_PANIC, "Out of memory");
+ goto error_recovery;
}
return (fluid_midi_driver_t *)dev;
+
+error_recovery:
+ delete_fluid_jack_midi_driver((fluid_midi_driver_t *)dev);
+ return NULL;
}
void
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.0.4/src/drivers/fluid_oss.c new/fluidsynth-2.0.5/src/drivers/fluid_oss.c
--- old/fluidsynth-2.0.4/src/drivers/fluid_oss.c 2019-02-22 10:15:18.000000000 +0100
+++ new/fluidsynth-2.0.5/src/drivers/fluid_oss.c 2019-04-18 19:43:39.000000000 +0200
@@ -448,6 +448,7 @@
if(dev->thread)
{
fluid_thread_join(dev->thread);
+ delete_fluid_thread(dev->thread);
}
if(dev->dspfd >= 0)
@@ -705,6 +706,7 @@
if(dev->thread)
{
fluid_thread_join(dev->thread);
+ delete_fluid_thread(dev->thread);
}
if(dev->fd >= 0)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.0.4/src/drivers/fluid_pulse.c new/fluidsynth-2.0.5/src/drivers/fluid_pulse.c
--- old/fluidsynth-2.0.4/src/drivers/fluid_pulse.c 2019-02-22 10:15:18.000000000 +0100
+++ new/fluidsynth-2.0.5/src/drivers/fluid_pulse.c 2019-04-18 19:43:39.000000000 +0200
@@ -221,6 +221,7 @@
if(dev->thread)
{
fluid_thread_join(dev->thread);
+ delete_fluid_thread(dev->thread);
}
if(dev->pa_handle)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.0.4/src/fluidsynth.c new/fluidsynth-2.0.5/src/fluidsynth.c
--- old/fluidsynth-2.0.4/src/fluidsynth.c 2019-02-22 10:15:18.000000000 +0100
+++ new/fluidsynth-2.0.5/src/fluidsynth.c 2019-04-18 19:43:39.000000000 +0200
@@ -31,6 +31,9 @@
#include "fluid_lash.h"
+#ifdef SYSTEMD_SUPPORT
+#include
+#endif
void print_usage(void);
void print_help(fluid_settings_t *settings);
@@ -892,6 +895,12 @@
fprintf(stderr, "Failed to create the server.\n"
"Continuing without it.\n");
}
+#ifdef SYSTEMD_SUPPORT
+ else
+ {
+ sd_notify(0, "READY=1");
+ }
+#endif
}
#endif
@@ -954,10 +963,13 @@
fluid_server_join(server);
}
+#ifdef SYSTEMD_SUPPORT
+ sd_notify(0, "STOPPING=1");
+#endif
delete_fluid_server(server);
}
-#endif
+#endif /* NETWORK_SUPPORT */
if(cmd_handler != NULL)
{
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.0.4/src/midi/fluid_midi.c new/fluidsynth-2.0.5/src/midi/fluid_midi.c
--- old/fluidsynth-2.0.4/src/midi/fluid_midi.c 2019-02-22 10:15:18.000000000 +0100
+++ new/fluidsynth-2.0.5/src/midi/fluid_midi.c 2019-04-18 19:43:39.000000000 +0200
@@ -99,13 +99,7 @@
do
{
- if(!fluid_file_test(filename, G_FILE_TEST_IS_REGULAR))
- {
- return retcode;
- }
-
- // file seems to exist and is a regular file or a symlink to such
- if((fp = FLUID_FOPEN(filename, "rb")) == NULL)
+ if((fp = fluid_file_open(filename, NULL)) == NULL)
{
return retcode;
}
@@ -1676,7 +1670,7 @@
player->currentfile = NULL;
player->division = 0;
player->send_program_change = 1;
- player->miditempo = 480000;
+ player->miditempo = 500000;
player->deltatime = 4.0;
player->cur_msec = 0;
player->cur_ticks = 0;
@@ -1760,7 +1754,7 @@
player->ntracks = 0;
player->division = 0;
player->send_program_change = 1;
- player->miditempo = 480000;
+ player->miditempo = 500000;
player->deltatime = 4.0;
return 0;
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.0.4/src/sfloader/fluid_defsfont.c new/fluidsynth-2.0.5/src/sfloader/fluid_defsfont.c
--- old/fluidsynth-2.0.4/src/sfloader/fluid_defsfont.c 2019-02-22 10:15:18.000000000 +0100
+++ new/fluidsynth-2.0.5/src/sfloader/fluid_defsfont.c 2019-04-18 19:43:39.000000000 +0200
@@ -246,7 +246,18 @@
for(list = defsfont->sample; list; list = fluid_list_next(list))
{
- delete_fluid_sample((fluid_sample_t *) fluid_list_get(list));
+ sample = (fluid_sample_t *) fluid_list_get(list);
+
+ /* If the sample data pointer is different to the sampledata chunk of
+ * the soundfont, then the sample has been loaded individually (SF3)
+ * and needs to be unloaded explicitly. This is safe even if using
+ * dynamic sample loading, as the sample_unload mechanism sets
+ * sample->data to NULL after unload. */
+ if ((sample->data != NULL) && (sample->data != defsfont->sampledata))
+ {
+ fluid_samplecache_unload(sample->data);
+ }
+ delete_fluid_sample(sample);
}
if(defsfont->sample)
@@ -425,7 +436,7 @@
if(sfdata == NULL)
{
- FLUID_LOG(FLUID_ERR, "Couldn't load soundfont file");
+ /* error message already printed */
return FLUID_FAILED;
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.0.4/src/sfloader/fluid_sffile.c new/fluidsynth-2.0.5/src/sfloader/fluid_sffile.c
--- old/fluidsynth-2.0.4/src/sfloader/fluid_sffile.c 2019-02-22 10:15:18.000000000 +0100
+++ new/fluidsynth-2.0.5/src/sfloader/fluid_sffile.c 2019-04-18 19:43:39.000000000 +0200
@@ -340,13 +340,7 @@
do
{
- if(!fluid_file_test(filename, G_FILE_TEST_IS_REGULAR))
- {
- return retcode;
- }
-
- // file seems to exist and is a regular file or a symlink to such
- if((fp = FLUID_FOPEN(filename, "rb")) == NULL)
+ if((fp = fluid_file_open(filename, NULL)) == NULL)
{
return retcode;
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.0.4/src/sfloader/fluid_sfont.c new/fluidsynth-2.0.5/src/sfloader/fluid_sfont.c
--- old/fluidsynth-2.0.4/src/sfloader/fluid_sfont.c 2019-02-22 10:15:18.000000000 +0100
+++ new/fluidsynth-2.0.5/src/sfloader/fluid_sfont.c 2019-04-18 19:43:39.000000000 +0200
@@ -24,26 +24,14 @@
void *default_fopen(const char *path)
{
- FILE* handle;
+ const char* msg;
+ FILE* handle = fluid_file_open(path, &msg);
- if(!fluid_file_test(path, G_FILE_TEST_EXISTS))
+ if(handle == NULL)
{
- FLUID_LOG(FLUID_ERR, "fluid_sfloader_load(): Unable to load non-existent file. ('%s')", path);
- return NULL;
+ FLUID_LOG(FLUID_ERR, "fluid_sfloader_load(): Failed to open '%s': %s", path, msg);
}
-
- if(!fluid_file_test(path, G_FILE_TEST_IS_REGULAR))
- {
- FLUID_LOG(FLUID_ERR, "fluid_sfloader_load(): Refusing to load non-regular file! ('%s')", path);
- return NULL;
- }
-
- if((handle = FLUID_FOPEN(path, "rb")) == NULL)
- {
- FLUID_LOG(FLUID_ERR, "fluid_sfloader_load(): Specified file does not exists or insufficient permissions to open it! ('%s')", path);
- return NULL;
- }
-
+
return handle;
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.0.4/src/synth/fluid_synth.c new/fluidsynth-2.0.5/src/synth/fluid_synth.c
--- old/fluidsynth-2.0.4/src/synth/fluid_synth.c 2019-02-22 10:15:18.000000000 +0100
+++ new/fluidsynth-2.0.5/src/synth/fluid_synth.c 2019-04-18 19:43:39.000000000 +0200
@@ -1237,7 +1237,7 @@
{
/* channel is poly and legato CC is Off) */
/* removes the note from the monophonic list */
- if(key == fluid_channel_last_note(channel))
+ if(channel->n_notes && key == fluid_channel_last_note(channel))
{
fluid_channel_clear_monolist(channel);
}
@@ -3633,12 +3633,19 @@
fluid_synth_process(fluid_synth_t *synth, int len, int nfx, float *fx[],
int nout, float *out[])
{
+ return fluid_synth_process_LOCAL(synth, len, nfx, fx, nout, out, fluid_synth_render_blocks);
+}
+
+int
+fluid_synth_process_LOCAL(fluid_synth_t *synth, int len, int nfx, float *fx[],
+ int nout, float *out[], int (*block_render_func)(fluid_synth_t *, int))
+{
fluid_real_t *left_in, *fx_left_in;
fluid_real_t *right_in, *fx_right_in;
int nfxchan, nfxunits, naudchan;
double time = fluid_utime();
- int i, f, num, count;
+ int i, f, num, count, buffered_blocks;
float cpu_load;
@@ -3662,9 +3669,10 @@
count = 0;
num = synth->cur;
- if(synth->cur < FLUID_BUFSIZE)
+ buffered_blocks = (synth->cur + FLUID_BUFSIZE - 1) / FLUID_BUFSIZE;
+ if(synth->cur < buffered_blocks * FLUID_BUFSIZE)
{
- int available = FLUID_BUFSIZE - synth->cur;
+ int available = (buffered_blocks * FLUID_BUFSIZE) - synth->cur;
num = (available > len) ? len : available;
if(nout != 0)
@@ -3706,7 +3714,7 @@
while(count < len)
{
int blocksleft = (len - count + FLUID_BUFSIZE - 1) / FLUID_BUFSIZE;
- int blockcount = fluid_synth_render_blocks(synth, blocksleft);
+ int blockcount = block_render_func(synth, blocksleft);
num = (blockcount * FLUID_BUFSIZE > len - count) ? len - count : blockcount * FLUID_BUFSIZE;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.0.4/src/synth/fluid_synth.h new/fluidsynth-2.0.5/src/synth/fluid_synth.h
--- old/fluidsynth-2.0.4/src/synth/fluid_synth.h 2019-02-22 10:15:18.000000000 +0100
+++ new/fluidsynth-2.0.5/src/synth/fluid_synth.h 2019-04-18 19:43:39.000000000 +0200
@@ -212,6 +212,9 @@
int fluid_synth_set_gen2(fluid_synth_t *synth, int chan,
int param, float value,
int absolute, int normalized);
+int
+fluid_synth_process_LOCAL(fluid_synth_t *synth, int len, int nfx, float *fx[],
+ int nout, float *out[], int (*block_render_func)(fluid_synth_t *, int));
/*
* misc
*/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.0.4/src/utils/fluid_sys.c new/fluidsynth-2.0.5/src/utils/fluid_sys.c
--- old/fluidsynth-2.0.4/src/utils/fluid_sys.c 2019-02-22 10:15:18.000000000 +0100
+++ new/fluidsynth-2.0.5/src/utils/fluid_sys.c 2019-04-18 19:43:39.000000000 +0200
@@ -945,7 +945,7 @@
new_fluid_thread(const char *name, fluid_thread_func_t func, void *data, int prio_level, int detach)
{
GThread *thread;
- fluid_thread_info_t *info;
+ fluid_thread_info_t *info = NULL;
GError *err = NULL;
g_return_val_if_fail(func != NULL, NULL);
@@ -982,25 +982,21 @@
#endif
}
-#if NEW_GLIB_THREAD_API
else
{
+#if NEW_GLIB_THREAD_API
thread = g_thread_try_new(name, (GThreadFunc)func, data, &err);
- }
-
#else
- else
- {
thread = g_thread_create((GThreadFunc)func, data, detach == FALSE, &err);
- }
-
#endif
+ }
if(!thread)
{
FLUID_LOG(FLUID_ERR, "Failed to create the thread: %s",
fluid_gerror_message(err));
g_clear_error(&err);
+ FLUID_FREE(info);
return NULL;
}
@@ -1614,3 +1610,36 @@
}
#endif // NETWORK_SUPPORT
+
+FILE* fluid_file_open(const char* path, const char** errMsg)
+{
+ static const char ErrExist[] = "File does not exist.";
+ static const char ErrRegular[] = "File is not regular, refusing to open it.";
+ static const char ErrNull[] = "File does not exists or insufficient permissions to open it.";
+
+ FILE* handle = NULL;
+
+ if(!g_file_test(path, G_FILE_TEST_EXISTS))
+ {
+ if(errMsg != NULL)
+ {
+ *errMsg = ErrExist;
+ }
+ }
+ else if(!g_file_test(path, G_FILE_TEST_IS_REGULAR))
+ {
+ if(errMsg != NULL)
+ {
+ *errMsg = ErrRegular;
+ }
+ }
+ else if((handle = FLUID_FOPEN(path, "rb")) == NULL)
+ {
+ if(errMsg != NULL)
+ {
+ *errMsg = ErrNull;
+ }
+ }
+
+ return handle;
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.0.4/src/utils/fluid_sys.h new/fluidsynth-2.0.5/src/utils/fluid_sys.h
--- old/fluidsynth-2.0.4/src/utils/fluid_sys.h 2019-02-22 10:15:18.000000000 +0100
+++ new/fluidsynth-2.0.5/src/utils/fluid_sys.h 2019-04-18 19:43:39.000000000 +0200
@@ -19,7 +19,7 @@
*/
-/**
+/*
* @file fluid_sys.h
*
* This header contains a bunch of (mostly) system and machine
@@ -485,7 +485,7 @@
typedef GStatBuf fluid_stat_buf_t;
#endif
-#define fluid_file_test g_file_test
+FILE* fluid_file_open(const char* filename, const char** errMsg);
/* Profiling */
#if WITH_PROFILING
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.0.4/src/utils/fluidsynth_priv.h new/fluidsynth-2.0.5/src/utils/fluidsynth_priv.h
--- old/fluidsynth-2.0.4/src/utils/fluidsynth_priv.h 2019-02-22 10:15:18.000000000 +0100
+++ new/fluidsynth-2.0.5/src/utils/fluidsynth_priv.h 2019-04-18 19:43:39.000000000 +0200
@@ -18,7 +18,7 @@
* 02110-1301, USA
*/
-/**
+/*
* @file fluidsynth_priv.h
*
* lightweight part of fluid_sys.h, containing forward declarations of fluidsynth's private types and private macros
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.0.4/test/CMakeLists.txt new/fluidsynth-2.0.5/test/CMakeLists.txt
--- old/fluidsynth-2.0.4/test/CMakeLists.txt 2019-02-22 10:15:18.000000000 +0100
+++ new/fluidsynth-2.0.5/test/CMakeLists.txt 2019-04-18 19:43:39.000000000 +0200
@@ -10,12 +10,13 @@
ADD_FLUID_TEST(test_sample_cache)
ADD_FLUID_TEST(test_sfont_loading)
ADD_FLUID_TEST(test_sample_rate_change)
-ADD_FLUID_TEST(test_preset_sample_loading)
+# ADD_FLUID_TEST(test_preset_sample_loading)
ADD_FLUID_TEST(test_pointer_alignment)
ADD_FLUID_TEST(test_seqbind_unregister)
ADD_FLUID_TEST(test_synth_chorus_reverb)
ADD_FLUID_TEST(test_snprintf)
+ADD_FLUID_TEST(test_synth_process)
-if ( LIBSNDFILE_HASVORBIS )
- ADD_FLUID_TEST(test_sf3_sfont_loading)
-endif ( LIBSNDFILE_HASVORBIS )
+# if ( LIBSNDFILE_HASVORBIS )
+# ADD_FLUID_TEST(test_sf3_sfont_loading)
+# endif ( LIBSNDFILE_HASVORBIS )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.0.4/test/test.h new/fluidsynth-2.0.5/test/test.h
--- old/fluidsynth-2.0.4/test/test.h 2019-02-22 10:15:18.000000000 +0100
+++ new/fluidsynth-2.0.5/test/test.h 2019-04-18 19:43:39.000000000 +0200
@@ -4,7 +4,7 @@
#include
#include
-#define TEST_ASSERT(COND) do { if (!(COND)) { fprintf(stderr, __FILE__ ":%d assertion (%s) failed\n", __LINE__, #COND); exit(-1); } } while (0)
+#define TEST_ASSERT(COND) do { if (!(COND)) { fprintf(stderr, __FILE__ ":%d assertion (%s) failed\n", __LINE__, #COND); abort(); } } while (0)
/* macro to test whether a fluidsynth function succeeded or not */
#define TEST_SUCCESS(FLUID_FUNCT) TEST_ASSERT((FLUID_FUNCT) != FLUID_FAILED)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/fluidsynth-2.0.4/test/test_synth_process.c new/fluidsynth-2.0.5/test/test_synth_process.c
--- old/fluidsynth-2.0.4/test/test_synth_process.c 1970-01-01 01:00:00.000000000 +0100
+++ new/fluidsynth-2.0.5/test/test_synth_process.c 2019-04-18 19:43:39.000000000 +0200
@@ -0,0 +1,87 @@
+
+#include "test.h"
+#include "fluidsynth.h"
+#include "fluidsynth_priv.h"
+#include "fluid_synth.h"
+#include
+
+// static const int CHANNELS=16;
+enum { SAMPLES=1024 };
+
+int render_one_mock(fluid_synth_t *synth, int blocks)
+{
+ static int smpl;
+
+ fluid_real_t *left_in, *fx_left_in;
+ fluid_real_t *right_in, *fx_right_in;
+
+ int i, j;
+
+ int nfxchan = fluid_synth_count_effects_channels(synth),
+ nfxunits = fluid_synth_count_effects_groups(synth),
+ naudchan = fluid_synth_count_audio_channels(synth);
+
+ fluid_rvoice_mixer_get_bufs(synth->eventhandler->mixer, &left_in, &right_in);
+ fluid_rvoice_mixer_get_fx_bufs(synth->eventhandler->mixer, &fx_left_in, &fx_right_in);
+
+ for(i = 0; i < naudchan; i++)
+ {
+ for(j = 0; j < blocks * FLUID_BUFSIZE; j++)
+ {
+ int idx = i * FLUID_MIXER_MAX_BUFFERS_DEFAULT * FLUID_BUFSIZE + j;
+
+ right_in[idx] = left_in[idx] = (float)smpl++;
+ }
+ }
+
+ return blocks;
+}
+
+int render_and_check(fluid_synth_t* synth, int number_of_samples, int offset)
+{
+ int i;
+ float left[SAMPLES], right[SAMPLES];
+ float *dry[1 * 2];
+ dry[0] = left;
+ dry[1] = right;
+ memset(left, 0, sizeof(left));
+ memset(right, 0, sizeof(right));
+
+ TEST_SUCCESS(fluid_synth_process_LOCAL(synth, number_of_samples, 0, NULL, 2, dry, render_one_mock));
+
+ for(i=0; i