#include <stdio.h>
#include <stdlib.h>
struct fx_data_t {
float gain;
} fx_data_t;
int fx_function(void* data, int len,
int nin, float** in,
int nout, float** out)
{
struct fx_data_t* fx_data = (struct fx_data_t*) data;
int i, k;
float* out_i;
if (fluid_synth_process(fx_data->synth, len, nin, in, nout, out) != 0) {
return -1;
}
for (i = 0; i < nout; i++) {
out_i = out[i];
for (k = 0; k < len; k++) {
out_i[k] *= fx_data->gain;
}
}
return 0;
}
int main(int argc, char** argv)
{
int err = 0;
struct fx_data_t fx_data;
if (argc != 3) {
fprintf(stderr, "Usage: fluidsynth_simple [soundfont] [gain]\n");
return 1;
}
settings = new_fluid_settings();
if (settings == NULL) {
fprintf(stderr, "Failed to create the settings\n");
err = 2;
goto cleanup;
}
synth = new_fluid_synth(settings);
if (synth == NULL) {
fprintf(stderr, "Failed to create the synthesizer\n");
err = 3;
goto cleanup;
}
if (fluid_synth_sfload(synth, argv[1], 1) == -1) {
fprintf(stderr, "Failed to load the SoundFont\n");
err = 4;
goto cleanup;
}
fx_data.synth = synth;
fx_data.gain = atof(argv[2]);
adriver = new_fluid_audio_driver2(settings, fx_function, (void*) &fx_data);
if (adriver == NULL) {
fprintf(stderr, "Failed to create the audio driver\n");
err = 5;
goto cleanup;
}
fluid_synth_noteon(synth, 0, 60, 100);
printf("Press \"Enter\" to stop: ");
fgetc(stdin);
printf("done\n");
cleanup:
if (adriver) {
delete_fluid_audio_driver(adriver);
}
if (synth) {
delete_fluid_synth(synth);
}
if (settings) {
delete_fluid_settings(settings);
}
return err;
}