vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Tue Jun 7 21:34:51 2011 +0300| [98ce3c33470c521a7957131d606a9c727589652f] | committer: Rémi Denis-Courmont
Add mixer for FI32 and S16N Audio volume should now work on !HAVE_FPU. This is untested though. > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=98ce3c33470c521a7957131d606a9c727589652f --- modules/LIST | 1 + modules/audio_mixer/Modules.am | 2 + modules/audio_mixer/fixed32.c | 91 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 94 insertions(+), 0 deletions(-) diff --git a/modules/LIST b/modules/LIST index ad05107..680da4d 100644 --- a/modules/LIST +++ b/modules/LIST @@ -118,6 +118,7 @@ $Id$ * fb: video output module for the Linux framebuffer * fbosd: framebuffer osd plugin * filesystem: Filesystem access module + * fixed32_mixer: Fixed-point audio mixer * flac: Flac decoder using libflac * flacsys: FLAC demuxer * float32_mixer: Precise float32 audio mixer diff --git a/modules/audio_mixer/Modules.am b/modules/audio_mixer/Modules.am index f9f5efa..9d2eeb5 100644 --- a/modules/audio_mixer/Modules.am +++ b/modules/audio_mixer/Modules.am @@ -1,6 +1,8 @@ SOURCES_trivial_mixer = trivial.c SOURCES_float32_mixer = float32.c +SOURCES_fixed32_mixer = fixed32.c libvlc_LTLIBRARIES += \ libfloat32_mixer_plugin.la \ + libfixed32_mixer_plugin.la \ libtrivial_mixer_plugin.la diff --git a/modules/audio_mixer/fixed32.c b/modules/audio_mixer/fixed32.c new file mode 100644 index 0000000..a2edeba --- /dev/null +++ b/modules/audio_mixer/fixed32.c @@ -0,0 +1,91 @@ +/***************************************************************************** + * fixed32.c : fixed-point software volume + ***************************************************************************** + * Copyright (C) 2011 Rémi Denis-Courmnot + * + * 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. + * + * 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 +# include "config.h" +#endif + +#include <vlc_common.h> +#include <vlc_plugin.h> +#include <vlc_aout.h> +#include <vlc_aout_mixer.h> + +static int Activate (vlc_object_t *); + +vlc_module_begin () + set_category (CAT_AUDIO) + set_subcategory (SUBCAT_AUDIO_MISC) + set_description (N_("Fixed-point audio mixer")) + set_capability ("audio mixer", 9) + set_callbacks (Activate, NULL) +vlc_module_end () + +static void FilterFI32 (aout_mixer_t *, block_t *, float); +static void FilterS16N (aout_mixer_t *, block_t *, float); + +static int Activate (vlc_object_t *obj) +{ + aout_mixer_t *mixer = (aout_mixer_t *)obj; + + switch (mixer->fmt.i_format) + { + case VLC_CODEC_FI32: + mixer->mix = FilterFI32; + break; + case VLC_CODEC_S16N: + mixer->mix = FilterS16N; + break; + default: + return -1; + } + return 0; +} + +static void FilterFI32 (aout_mixer_t *mixer, block_t *block, float volume) +{ + const int64_t mult = volume * mixer->input->multiplier * FIXED32_ONE; + + if (mult == FIXED32_ONE) + return; + + int32_t *p = (int32_t *)block->p_buffer; + + for (size_t n = block->i_buffer / sizeof (*p); n > 0; n--) + { + *p = (*p * mult) >> 33; // FIXED32_FRACBITS; + p++; + } +} + +static void FilterS16N (aout_mixer_t *mixer, block_t *block, float volume) +{ + const int32_t mult = volume * mixer->input->multiplier * 0x10000; + + if (mult == 0x10000) + return; + + int16_t *p = (int16_t *)block->p_buffer; + + for (size_t n = block->i_buffer / sizeof (*p); n > 0; n--) + { + *p = (*p * mult) >> 16; + p++; + } +} _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
