Skip to content

Commit 1e82bd6

Browse files
authored
Resolve playback issues for Soundfonts not using zero padding samples (#1487)
Soundfonts that do not have at least 46 zero-samples at the end of each sample may not sound correctly when `synth.dynamic-sample-loading` is active. * Add debug output about discovered samples * Add test cases for dynamic-sample loading * Do not advance sample endpoint
1 parent 698c659 commit 1e82bd6

File tree

2 files changed

+17
-18
lines changed

2 files changed

+17
-18
lines changed

Diff for: src/sfloader/fluid_defsfont.c

+3-17
Original file line numberDiff line numberDiff line change
@@ -317,25 +317,9 @@ const char *fluid_defsfont_get_name(fluid_defsfont_t *defsfont)
317317
int fluid_defsfont_load_sampledata(fluid_defsfont_t *defsfont, SFData *sfdata, fluid_sample_t *sample)
318318
{
319319
int num_samples;
320-
unsigned int source_end = sample->source_end;
321-
322-
/* For uncompressed samples we want to include the 46 zero sample word area following each sample
323-
* in the Soundfont. Otherwise samples with loopend > end, which we have decided not to correct, would
324-
* be corrected after all in fluid_sample_sanitize_loop */
325-
if(!(sample->sampletype & FLUID_SAMPLETYPE_OGG_VORBIS))
326-
{
327-
source_end += 46; /* Length of zero sample word after each sample, according to SF specs */
328-
329-
/* Safeguard against Soundfonts that are not quite valid and don't include 46 sample words after the
330-
* last sample */
331-
if(source_end >= (defsfont->samplesize / sizeof(short)))
332-
{
333-
source_end = defsfont->samplesize / sizeof(short);
334-
}
335-
}
336320

337321
num_samples = fluid_samplecache_load(
338-
sfdata, sample->source_start, source_end, sample->sampletype,
322+
sfdata, sample->source_start, sample->source_end, sample->sampletype,
339323
defsfont->mlock, &sample->data, &sample->data24);
340324

341325
if(num_samples < 0)
@@ -2097,6 +2081,8 @@ fluid_sample_import_sfont(fluid_sample_t *sample, SFSample *sfsample, fluid_defs
20972081
sample->notify = dynamic_samples_sample_notify;
20982082
}
20992083

2084+
FLUID_LOG(FLUID_DBG, "Discovering sample '%s', src_start %d, loop_start %d, loop_end %d, src_end %d", sample->name, sample->source_start, sample->loopstart, sample->loopend, sample->source_end);
2085+
21002086
if(fluid_sample_validate(sample, defsfont->samplesize) == FLUID_FAILED)
21012087
{
21022088
return FLUID_FAILED;

Diff for: test/CMakeLists.txt

+14-1
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ else()
5858
set(REVERB_RENDER_DIR "${CMAKE_CURRENT_BINARY_DIR}/manual/reverb")
5959
set(EXCL_RENDER_DIR "${CMAKE_CURRENT_BINARY_DIR}/manual/exclusive_class")
6060
set(DSPINTERP_RENDER_DIR "${CMAKE_CURRENT_BINARY_DIR}/manual/dsp_interp")
61+
set(DYNSAM_RENDER_DIR "${CMAKE_CURRENT_BINARY_DIR}/manual/dynamic-sample-loading")
6162

6263
if(LIBSNDFILE_SUPPORT)
6364
set(FEXT "wav")
@@ -69,7 +70,7 @@ else()
6970
add_custom_target(check_manual)
7071

7172
add_custom_target(create_iir_dir
72-
COMMAND ${CMAKE_COMMAND} -E make_directory ${IIR_FILTER_RENDER_DIR} ${AWE32_NRPN_RENDER_DIR} ${SFSPEC_RENDER_DIR} ${PORTAMENTO_RENDER_DIR} ${REVERB_RENDER_DIR} ${EXCL_RENDER_DIR} ${DSPINTERP_RENDER_DIR}
73+
COMMAND ${CMAKE_COMMAND} -E make_directory ${IIR_FILTER_RENDER_DIR} ${AWE32_NRPN_RENDER_DIR} ${SFSPEC_RENDER_DIR} ${PORTAMENTO_RENDER_DIR} ${REVERB_RENDER_DIR} ${EXCL_RENDER_DIR} ${DSPINTERP_RENDER_DIR} ${DYNSAM_RENDER_DIR}
7374
VERBATIM)
7475

7576
add_custom_target(render1415
@@ -219,6 +220,15 @@ else()
219220
VERBATIM
220221
)
221222

223+
add_custom_target(render1484
224+
COMMAND fluidsynth -R 0 -C 0 -g 0.6 -o synth.dynamic-sample-loading=1 -F "${DYNSAM_RENDER_DIR}/dynamic-sample-loading_on.${FEXT}" "dynamic-sample-loading_test.mid" "DrTebz.sf2"
225+
COMMAND fluidsynth -R 0 -C 0 -g 0.6 -o synth.dynamic-sample-loading=0 -F "${DYNSAM_RENDER_DIR}/dynamic-sample-loading_off.${FEXT}" "dynamic-sample-loading_test.mid" "DrTebz.sf2"
226+
COMMENT "Rendering dynamic sample loading test"
227+
DEPENDS fluidsynth create_iir_dir
228+
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/manual/dynamic-sample-loading/
229+
VERBATIM
230+
)
231+
222232
# Add a dependency so that rendering targets depends on check_manual
223233
add_dependencies(check_manual render1415)
224234
add_dependencies(check_manual render1417)
@@ -233,5 +243,8 @@ else()
233243
add_dependencies(check_manual render1455)
234244
add_dependencies(check_manual renderDK64JJU)
235245
add_dependencies(check_manual renderExcl)
246+
add_dependencies(check_manual rendere1m1)
247+
add_dependencies(check_manual renderdspInterp)
248+
add_dependencies(check_manual render1484)
236249

237250
endif()

0 commit comments

Comments
 (0)