mirror of
https://github.com/ZDoom/fluidsynth.git
synced 2024-11-27 14:32:12 +00:00
parent
226b411a04
commit
68db8f4a80
5 changed files with 99 additions and 2 deletions
|
@ -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;
|
||||
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
86
test/test_synth_process.c
Normal 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;
|
||||
}
|
Loading…
Reference in a new issue