add a unit test for fluid_synth_process()

addresses #527
This commit is contained in:
derselbst 2019-04-14 16:54:59 +02:00
parent 226b411a04
commit 68db8f4a80
5 changed files with 99 additions and 2 deletions

View File

@ -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;

View File

@ -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
*/

View File

@ -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)

View File

@ -4,7 +4,7 @@
#include <stdio.h>
#include <stdlib.h>
#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)

86
test/test_synth_process.c Normal file
View File

@ -0,0 +1,86 @@
#include "test.h"
#include "fluidsynth.h"
#include "fluidsynth_priv.h"
#include "fluid_synth.h"
#include <string.h>
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<number_of_samples; i++)
{
TEST_ASSERT(left[i]==i+offset);
TEST_ASSERT(right[i]==i+offset);
}
return i+offset;
}
// this test should make sure that sample rate changed are handled correctly
int main(void)
{
int off=0;
fluid_synth_t *synth;
fluid_settings_t *settings = new_fluid_settings();
TEST_ASSERT(settings != NULL);
// TEST_SUCCESS(fluid_settings_setint(settings, "synth.audio-channels", CHANNELS));
// TEST_SUCCESS(fluid_settings_setint(settings, "synth.audio-groups", CHANNELS));
synth = new_fluid_synth(settings);
TEST_ASSERT(synth != NULL);
off = render_and_check(synth, 100, off);
off = render_and_check(synth, 200, off);
off = render_and_check(synth, 300, off);
off = render_and_check(synth, 1000, off);
off = render_and_check(synth, 900, off);
off = render_and_check(synth, 800, off);
delete_fluid_synth(synth);
delete_fluid_settings(settings);
return EXIT_SUCCESS;
}