From a36c06cff2962452a6fbdc0dd91e7101f35ffe15 Mon Sep 17 00:00:00 2001 From: derselbst Date: Sun, 24 Mar 2019 17:25:57 +0100 Subject: [PATCH 1/9] remove VintageDreamsWaves-v2.sf3 Converting this soundfont to other formats is forbidden. Suspend depending unit tests. --- sf2/VintageDreamsWaves-v2.sf3 | Bin 519300 -> 0 bytes test/CMakeLists.txt | 8 ++++---- 2 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 sf2/VintageDreamsWaves-v2.sf3 diff --git a/sf2/VintageDreamsWaves-v2.sf3 b/sf2/VintageDreamsWaves-v2.sf3 deleted file mode 100644 index d0a699b531c9fb6fbbb72a93934de0d0b99b078b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 519300 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�F|c?e2e-*oslVGtm>++wO=KaJMwQa@JbLus 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 diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index fb086598..8f229c85 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -10,12 +10,12 @@ add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND} -C $ --output-on 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) -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 ) From faef23f094dcba06c912730a769f3a526bdece2c Mon Sep 17 00:00:00 2001 From: derselbst Date: Fri, 5 Apr 2019 20:04:21 +0200 Subject: [PATCH 2/9] fix various NULL derefs and mem leaks in jack driver closes #416 --- src/drivers/fluid_jack.c | 80 ++++++++++++++++++++++++++++++---------- 1 file changed, 61 insertions(+), 19 deletions(-) diff --git a/src/drivers/fluid_jack.c b/src/drivers/fluid_jack.c index d86daa26..b36b5a0e 100644 --- a/src/drivers/fluid_jack.c +++ b/src/drivers/fluid_jack.c @@ -115,11 +115,13 @@ fluid_jack_audio_driver_settings(fluid_settings_t *settings) * 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 @@ fluid_jack_midi_autoconnect(jack_client_t *client, fluid_jack_midi_driver_t *mid jack_connect(client, midi_source_ports[j], jack_port_name(midi_driver->midi_port[i])); } } + jack_free(midi_source_ports); } @@ -199,7 +202,7 @@ new_fluid_jack_client(fluid_settings_t *settings, int isaudio, void *driver) if(!client_ref) { - FLUID_LOG(FLUID_ERR, "Out of memory"); + FLUID_LOG(FLUID_PANIC, "Out of memory"); goto error_recovery; } @@ -338,7 +341,7 @@ fluid_jack_client_register_ports(void *driver, int isaudio, jack_client_t *clien 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 @@ fluid_jack_client_register_ports(void *driver, int isaudio, jack_client_t *clien 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 @@ fluid_jack_client_register_ports(void *driver, int isaudio, jack_client_t *clien 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 @@ fluid_jack_client_register_ports(void *driver, int isaudio, jack_client_t *clien 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 @@ fluid_jack_client_register_ports(void *driver, int isaudio, jack_client_t *clien 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 @@ fluid_jack_client_register_ports(void *driver, int isaudio, jack_client_t *clien 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 @@ fluid_jack_client_register_ports(void *driver, int isaudio, jack_client_t *clien 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 @@ fluid_jack_client_register_ports(void *driver, int isaudio, jack_client_t *clien 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 @@ fluid_jack_client_register_ports(void *driver, int isaudio, jack_client_t *clien } 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 @@ new_fluid_jack_audio_driver2(fluid_settings_t *settings, fluid_audio_func_t func if(dev == NULL) { - FLUID_LOG(FLUID_ERR, "Out of memory"); + FLUID_LOG(FLUID_PANIC, "Out of memory"); return NULL; } @@ -688,6 +728,7 @@ fluid_jack_driver_process(jack_nframes_t nframes, void *arg) } audio_driver = fluid_atomic_pointer_get(&client->audio_driver); + if(audio_driver == NULL) { // shutting down @@ -765,6 +806,7 @@ void 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 @@ new_fluid_jack_midi_driver(fluid_settings_t *settings, if(dev == NULL) { - FLUID_LOG(FLUID_ERR, "Out of memory"); + FLUID_LOG(FLUID_PANIC, "Out of memory"); return NULL; } @@ -807,7 +849,7 @@ new_fluid_jack_midi_driver(fluid_settings_t *settings, if(dev->parser == NULL) { - FLUID_LOG(FLUID_ERR, "Out of memory"); + FLUID_LOG(FLUID_PANIC, "Out of memory"); FLUID_FREE(dev); return NULL; } From 33450117e964e6b05e3e129c34d2f11123216313 Mon Sep 17 00:00:00 2001 From: derselbst Date: Fri, 5 Apr 2019 20:12:56 +0200 Subject: [PATCH 3/9] another memory leak in jack midi driver --- src/drivers/fluid_jack.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/drivers/fluid_jack.c b/src/drivers/fluid_jack.c index b36b5a0e..60503e2f 100644 --- a/src/drivers/fluid_jack.c +++ b/src/drivers/fluid_jack.c @@ -850,8 +850,7 @@ new_fluid_jack_midi_driver(fluid_settings_t *settings, if(dev->parser == NULL) { FLUID_LOG(FLUID_PANIC, "Out of memory"); - FLUID_FREE(dev); - return NULL; + goto error_recovery; } fluid_settings_getint(settings, "midi.autoconnect", &dev->autoconnect_inputs); @@ -861,11 +860,15 @@ new_fluid_jack_midi_driver(fluid_settings_t *settings, 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 From a5436021a5f41e5aeb5c0c26e5ec88a64adbc9cc Mon Sep 17 00:00:00 2001 From: derselbst Date: Sat, 13 Apr 2019 10:45:05 +0200 Subject: [PATCH 4/9] fix conditional jump depending on uninitialized variable --- src/synth/fluid_synth.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/synth/fluid_synth.c b/src/synth/fluid_synth.c index 15e167a1..1c83cf17 100644 --- a/src/synth/fluid_synth.c +++ b/src/synth/fluid_synth.c @@ -1237,7 +1237,7 @@ fluid_synth_noteoff_LOCAL(fluid_synth_t *synth, int chan, int key) { /* 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); } From e5c29cf8b88dfd4e98e4acbd22c27a052734ae34 Mon Sep 17 00:00:00 2001 From: derselbst Date: Sat, 13 Apr 2019 14:02:01 +0200 Subject: [PATCH 5/9] bump to 2.0.5 --- CMakeLists.txt | 4 ++-- doc/Doxyfile | 2 +- doc/fluidsynth-v20-devdoc.txt | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 42d9bf5b..880cf9b7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,7 +29,7 @@ set ( PACKAGE "fluidsynth" ) # 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 @@ set ( FLUIDSYNTH_VERSION "\"${VERSION}\"" ) # 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}" ) diff --git a/doc/Doxyfile b/doc/Doxyfile index b32e5f15..6e09cb84 100644 --- a/doc/Doxyfile +++ b/doc/Doxyfile @@ -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 --git a/doc/fluidsynth-v20-devdoc.txt b/doc/fluidsynth-v20-devdoc.txt index 651f6525..48cd3faf 100644 --- a/doc/fluidsynth-v20-devdoc.txt +++ b/doc/fluidsynth-v20-devdoc.txt @@ -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-13 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. From 226b411a04e5beda6ab6b6d652ef993af0c1277e Mon Sep 17 00:00:00 2001 From: derselbst Date: Sat, 13 Apr 2019 14:52:45 +0200 Subject: [PATCH 6/9] wording docs --- doc/fluidsynth-v20-devdoc.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/fluidsynth-v20-devdoc.txt b/doc/fluidsynth-v20-devdoc.txt index 48cd3faf..ee529a0c 100644 --- a/doc/fluidsynth-v20-devdoc.txt +++ b/doc/fluidsynth-v20-devdoc.txt @@ -42,7 +42,7 @@ All the source code examples in this document are in the public domain; you can \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. @@ -162,7 +162,7 @@ FluidSynths major version was bumped. The API was reworked, deprecated functions 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 From 68db8f4a807cda1c9c4154e3206dfd3c3843457b Mon Sep 17 00:00:00 2001 From: derselbst Date: Sun, 14 Apr 2019 16:54:59 +0200 Subject: [PATCH 7/9] add a unit test for fluid_synth_process() addresses #527 --- src/synth/fluid_synth.c | 9 +++- src/synth/fluid_synth.h | 3 ++ test/CMakeLists.txt | 1 + test/test.h | 2 +- test/test_synth_process.c | 86 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 test/test_synth_process.c diff --git a/src/synth/fluid_synth.c b/src/synth/fluid_synth.c index 1c83cf17..244a21b4 100644 --- a/src/synth/fluid_synth.c +++ b/src/synth/fluid_synth.c @@ -3632,6 +3632,13 @@ alias with buffers of \c fx. NULL buffers are permitted and will cause to skip m int 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; @@ -3706,7 +3713,7 @@ fluid_synth_process(fluid_synth_t *synth, int len, int nfx, float *fx[], 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 --git a/src/synth/fluid_synth.h b/src/synth/fluid_synth.h index 156424af..c22e61fb 100644 --- a/src/synth/fluid_synth.h +++ b/src/synth/fluid_synth.h @@ -212,6 +212,9 @@ void fluid_synth_process_event_queue(fluid_synth_t *synth); 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 --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 8f229c85..0b735452 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -15,6 +15,7 @@ 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) diff --git a/test/test.h b/test/test.h index 74c4bc59..2df1ebe6 100644 --- a/test/test.h +++ b/test/test.h @@ -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 --git a/test/test_synth_process.c b/test/test_synth_process.c new file mode 100644 index 00000000..d273bdf2 --- /dev/null +++ b/test/test_synth_process.c @@ -0,0 +1,86 @@ + +#include "test.h" +#include "fluidsynth.h" +#include "fluidsynth_priv.h" +#include "fluid_synth.h" +#include + +static int smpl; +// static const int CHANNELS=16; +static const int SAMPLES=1024; + +int render_one_mock(fluid_synth_t *synth, int blocks) +{ + 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 Date: Sun, 14 Apr 2019 14:54:43 +0200 Subject: [PATCH 8/9] Fix buffering bug in fluid_synth_process(). The old buffering code assumes that synth->cur is between 0 and FLUID_BUFSIZE. However since fluid_synth_process() can render more than one buffer at a time this isn't always true, and the new code handles other values properly. Closes #527 --- src/synth/fluid_synth.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/synth/fluid_synth.c b/src/synth/fluid_synth.c index 244a21b4..70bc3cee 100644 --- a/src/synth/fluid_synth.c +++ b/src/synth/fluid_synth.c @@ -3645,7 +3645,7 @@ fluid_synth_process_LOCAL(fluid_synth_t *synth, int len, int nfx, float *fx[], int nfxchan, nfxunits, naudchan; double time = fluid_utime(); - int i, f, num, count; + int i, f, num, count, buffered_blocks; float cpu_load; @@ -3669,9 +3669,10 @@ fluid_synth_process_LOCAL(fluid_synth_t *synth, int len, int nfx, float *fx[], 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) From a0e91b9878ca51fcd8ea41490a17a89aedabc900 Mon Sep 17 00:00:00 2001 From: Marcus Weseloh Date: Tue, 16 Apr 2019 14:50:11 +0200 Subject: [PATCH 9/9] Fix memory-leak with SF3 samples when dynamic-sample-loading is not active Vorbis compressed SF3 samples are always loaded individually and stored in the sample cache in uncompressed form. When dynamic-sample-loading is not active (the default), then the uncompressed samples did not get unloaded when unloading the SF3 font. This fix makes sure that those samples are also freed. For bulk loaded samples, the sample->data pointer is always the same as the font->sampledata pointer. For individually loaded samples, the sample->data pointer always points to a different memory region. So we can use that information to determine if and when to unload the samples one by one. Fixes #530 Fixes #528 --- src/sfloader/fluid_defsfont.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/sfloader/fluid_defsfont.c b/src/sfloader/fluid_defsfont.c index b81aaca2..8c6b67c9 100644 --- a/src/sfloader/fluid_defsfont.c +++ b/src/sfloader/fluid_defsfont.c @@ -246,7 +246,18 @@ int delete_fluid_defsfont(fluid_defsfont_t *defsfont) 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)