X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcodec%2Ffluidsynth.c;h=43a91f2af3a7e983614e6f3d1f7cf9a4b304c6b2;hb=e0e1f0fce33f18dd288151fb8a3ffa05e971d5c8;hp=cc442f79929d06fa9ea084eb239a743176cfe38c;hpb=c8961f3a00b3754fe69ad6267fce06133915b589;p=vlc diff --git a/modules/codec/fluidsynth.c b/modules/codec/fluidsynth.c index cc442f7992..43a91f2af3 100644 --- a/modules/codec/fluidsynth.c +++ b/modules/codec/fluidsynth.c @@ -4,19 +4,19 @@ * Copyright © 2007 Rémi Denis-Courmont * $Id$ * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ #ifdef HAVE_CONFIG_H @@ -27,17 +27,14 @@ #include #include #include -#include -#ifdef HAVE_UNISTD_H -# include -#endif +#include #ifdef _POSIX_VERSION # include #endif /* On Win32, we link statically */ -#ifdef WIN32 +#ifdef _WIN32 # define FLUIDSYNTH_NOT_A_DLL #endif @@ -47,6 +44,21 @@ #define SOUNDFONT_LONGTEXT N_( \ "A sound fonts file is required for software synthesis." ) +#define CHORUS_TEXT N_("Chorus") + +#define GAIN_TEXT N_("Synthesis gain") +#define GAIN_LONGTEXT N_("This gain is applied to synthesis output. " \ + "High values may cause saturation when many notes are played at a time." ) + +#define POLYPHONY_TEXT N_("Polyphony") +#define POLYPHONY_LONGTEXT N_( \ + "The polyphony defines how many voices can be played at a time. " \ + "Larger values require more processing power.") + +#define REVERB_TEXT N_("Reverb") + +#define SAMPLE_RATE_TEXT N_("Sample rate") + static int Open (vlc_object_t *); static void Close (vlc_object_t *); @@ -58,7 +70,17 @@ vlc_module_begin () set_subcategory (SUBCAT_INPUT_ACODEC) set_callbacks (Open, Close) add_loadfile ("soundfont", "", - SOUNDFONT_TEXT, SOUNDFONT_LONGTEXT, false); + SOUNDFONT_TEXT, SOUNDFONT_LONGTEXT, false) + add_bool ("synth-chorus", true, CHORUS_TEXT, CHORUS_TEXT, false) + add_float ("synth-gain", .5, GAIN_TEXT, GAIN_LONGTEXT, false) + change_float_range (0., 10.) + add_integer ("synth-polyphony", 256, + POLYPHONY_TEXT, POLYPHONY_LONGTEXT, false) + change_integer_range (1, 65535) + add_bool ("synth-reverb", true, REVERB_TEXT, REVERB_TEXT, true) + add_integer ("synth-sample-rate", 44100, + SAMPLE_RATE_TEXT, SAMPLE_RATE_TEXT, true) + change_integer_range (22050, 96000) vlc_module_end () @@ -71,7 +93,7 @@ struct decoder_sys_t }; -static aout_buffer_t *DecodeBlock (decoder_t *p_dec, block_t **pp_block); +static block_t *DecodeBlock (decoder_t *p_dec, block_t **pp_block); static int Open (vlc_object_t *p_this) @@ -92,11 +114,8 @@ static int Open (vlc_object_t *p_this) char *font_path = var_InheritString (p_this, "soundfont"); if (font_path != NULL) { - const char *lpath = ToLocale (font_path); - msg_Dbg (p_this, "loading sound fonts file %s", font_path); p_sys->soundfont = fluid_synth_sfload (p_sys->synth, font_path, 1); - LocaleFree (lpath); if (p_sys->soundfont == -1) msg_Err (p_this, "cannot load sound fonts file %s", font_path); free (font_path); @@ -135,8 +154,19 @@ static int Open (vlc_object_t *p_this) return VLC_EGENERIC; } + fluid_synth_set_chorus_on (p_sys->synth, + var_InheritBool (p_this, "synth-chorus")); + fluid_synth_set_gain (p_sys->synth, + var_InheritFloat (p_this, "synth-gain")); + fluid_synth_set_polyphony (p_sys->synth, + var_InheritInteger (p_this, "synth-polyphony")); + fluid_synth_set_reverb_on (p_sys->synth, + var_InheritBool (p_this, "synth-reverb")); + p_dec->fmt_out.i_cat = AUDIO_ES; - p_dec->fmt_out.audio.i_rate = 44100; + p_dec->fmt_out.audio.i_rate = + var_InheritInteger (p_this, "synth-sample-rate");; + fluid_synth_set_sample_rate (p_sys->synth, p_dec->fmt_out.audio.i_rate); p_dec->fmt_out.audio.i_channels = 2; p_dec->fmt_out.audio.i_original_channels = p_dec->fmt_out.audio.i_physical_channels = @@ -163,11 +193,11 @@ static void Close (vlc_object_t *p_this) } -static aout_buffer_t *DecodeBlock (decoder_t *p_dec, block_t **pp_block) +static block_t *DecodeBlock (decoder_t *p_dec, block_t **pp_block) { block_t *p_block; decoder_sys_t *p_sys = p_dec->p_sys; - aout_buffer_t *p_out = NULL; + block_t *p_out = NULL; if (pp_block == NULL) return NULL; @@ -176,6 +206,16 @@ static aout_buffer_t *DecodeBlock (decoder_t *p_dec, block_t **pp_block) return NULL; *pp_block = NULL; + if (p_block->i_flags & (BLOCK_FLAG_DISCONTINUITY|BLOCK_FLAG_CORRUPTED)) + { + date_Set (&p_sys->end_date, 0); + //fluid_synth_system_reset (p_sys->synth); + fluid_synth_program_reset (p_sys->synth); + for (unsigned channel = 0; channel < 16; channel++) + for (unsigned note = 0; note < 128; note++) + fluid_synth_noteoff (p_sys->synth, channel, note); + } + if (p_block->i_pts > VLC_TS_INVALID && !date_Get (&p_sys->end_date)) date_Set (&p_sys->end_date, p_block->i_pts); else