diff options
Diffstat (limited to 'media-plugins/alsa-plugins/files/alsa-plugins-1.0.28-libav10.patch')
-rw-r--r-- | media-plugins/alsa-plugins/files/alsa-plugins-1.0.28-libav10.patch | 338 |
1 files changed, 338 insertions, 0 deletions
diff --git a/media-plugins/alsa-plugins/files/alsa-plugins-1.0.28-libav10.patch b/media-plugins/alsa-plugins/files/alsa-plugins-1.0.28-libav10.patch new file mode 100644 index 000000000000..9718369782b3 --- /dev/null +++ b/media-plugins/alsa-plugins/files/alsa-plugins-1.0.28-libav10.patch @@ -0,0 +1,338 @@ +https://bugs.gentoo.org/539680 + +From: Luca Barbato <lu_zero@gentoo.org> +Description: lavr: Add a libavresample based rate plugin +Date: Mon, 14 Apr 2014 10:01:07 +0200 + +Provide lavcrate compatibility. + +Index: alsa-plugins-1.0.28/configure.ac +=================================================================== +--- alsa-plugins-1.0.28.orig/configure.ac ++++ alsa-plugins-1.0.28/configure.ac +@@ -66,7 +66,7 @@ if test "$use_maemo_rm" = "yes"; then + fi + + AC_ARG_ENABLE([avcodec], +- AS_HELP_STRING([--disable-avcodec], [Don't build plugins depending on avcodec (a52)])) ++ AS_HELP_STRING([--disable-avcodec], [Do not build plugins depending on avcodec (a52)])) + + if test "x$enable_avcodec" != "xno"; then + PKG_CHECK_MODULES(AVCODEC, [libavcodec libavutil], [HAVE_AVCODEC=yes], [HAVE_AVCODEC=no]) +@@ -101,6 +101,10 @@ if test $HAVE_AVCODEC = yes; then + if test -z "$AVCODEC_HEADER"; then + HAVE_AVCODEC=no + fi ++ SAVE_LIBS=$LIBS ++ LIBS="$LIBS $AVCODEC_LIBS" ++ AC_CHECK_FUNCS([av_resample_init]) ++ LIBS=$SAVE_LIBS + fi + + AM_CONDITIONAL(HAVE_AVCODEC, test x$HAVE_AVCODEC = xyes) +@@ -108,6 +112,18 @@ AC_SUBST(AVCODEC_CFLAGS) + AC_SUBST(AVCODEC_LIBS) + AC_SUBST(AVCODEC_HEADER) + ++AC_ARG_ENABLE([avresample], ++ AS_HELP_STRING([--disable-avresample], [Do not build plugins depending on avcodec (lavrate)])) ++ ++if test "x$enable_avresample" != "xno"; then ++ PKG_CHECK_MODULES(AVRESAMPLE, [libavresample libavutil], [HAVE_AVRESAMPLE=yes], [HAVE_AVRESAMPLE=no]) ++fi ++ ++AM_CONDITIONAL(HAVE_AVRESAMPLE, test x$HAVE_AVCODEC = xyes) ++AC_SUBST(AVRESAMPLE_CFLAGS) ++AC_SUBST(AVRESAMPLE_LIBS) ++AC_SUBST(AVRESAMPLE_HEADER) ++ + PKG_CHECK_MODULES(speexdsp, [speexdsp >= 1.2], [HAVE_SPEEXDSP="yes"], [HAVE_SPEEXDSP=""]) + AM_CONDITIONAL(HAVE_SPEEXDSP, test "$HAVE_SPEEXDSP" = "yes") + +@@ -181,7 +197,7 @@ AC_OUTPUT([ + mix/Makefile + rate/Makefile + a52/Makefile +- rate-lavc/Makefile ++ rate-lavr/Makefile + maemo/Makefile + doc/Makefile + usb_stream/Makefile +Index: alsa-plugins-1.0.28/Makefile.am +=================================================================== +--- alsa-plugins-1.0.28.orig/Makefile.am ++++ alsa-plugins-1.0.28/Makefile.am +@@ -9,8 +9,14 @@ if HAVE_SAMPLERATE + SUBDIRS += rate + endif + if HAVE_AVCODEC ++SUBDIRS += a52 ++if !HAVE_AVRESAMPLE + SUBDIRS += a52 rate-lavc + endif ++endif ++if HAVE_AVRESAMPLE ++SUBDIRS += rate-lavr ++endif + if HAVE_MAEMO_PLUGIN + SUBDIRS += maemo + endif +Index: alsa-plugins-1.0.28/rate-lavr/Makefile.am +=================================================================== +--- /dev/null ++++ alsa-plugins-1.0.28/rate-lavr/Makefile.am +@@ -0,0 +1,22 @@ ++asound_module_rate_lavr_LTLIBRARIES = libasound_module_rate_lavr.la ++ ++asound_module_rate_lavrdir = @ALSA_PLUGIN_DIR@ ++ ++AM_CFLAGS = -Wall -g @ALSA_CFLAGS@ @AVRESAMPLE_CFLAGS@ ++AM_LDFLAGS = -module -avoid-version -export-dynamic -no-undefined $(LDFLAGS_NOUNDEFINED) ++ ++libasound_module_rate_lavr_la_SOURCES = rate_lavr.c ++libasound_module_rate_lavr_la_LIBADD = @ALSA_LIBS@ @AVRESAMPLE_LIBS@ ++ ++ ++install-exec-hook: ++ rm -f $(DESTDIR)@ALSA_PLUGIN_DIR@/libasound_module_rate_lavcrate*.so ++ $(LN_S) libasound_module_rate_lavr.so $(DESTDIR)@ALSA_PLUGIN_DIR@/libasound_module_rate_lavcrate.so ++ $(LN_S) libasound_module_rate_lavr.so $(DESTDIR)@ALSA_PLUGIN_DIR@/libasound_module_rate_lavcrate_higher.so ++ $(LN_S) libasound_module_rate_lavr.so $(DESTDIR)@ALSA_PLUGIN_DIR@/libasound_module_rate_lavcrate_high.so ++ $(LN_S) libasound_module_rate_lavr.so $(DESTDIR)@ALSA_PLUGIN_DIR@/libasound_module_rate_lavcrate_fast.so ++ $(LN_S) libasound_module_rate_lavr.so $(DESTDIR)@ALSA_PLUGIN_DIR@/libasound_module_rate_lavcrate_faster.so ++ ++uninstall-hook: ++ rm -f $(DESTDIR)@ALSA_PLUGIN_DIR@/libasound_module_rate_lavcrate*.so ++ rm -f $(DESTDIR)@ALSA_PLUGIN_DIR@/libasound_module_rate_lavr*.so +Index: alsa-plugins-1.0.28/rate-lavr/rate_lavr.c +=================================================================== +--- /dev/null ++++ alsa-plugins-1.0.28/rate-lavr/rate_lavr.c +@@ -0,0 +1,227 @@ ++/* ++ * Rate converter plugin using libavresample ++ * Copyright (c) 2014 by Anton Khirnov ++ * ++ * This library 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 library 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 ++ * Lesser General Public License for more details. ++ */ ++ ++#include <stdio.h> ++#include <alsa/asoundlib.h> ++#include <alsa/pcm_rate.h> ++ ++#include <libavresample/avresample.h> ++#include <libavutil/channel_layout.h> ++#include <libavutil/opt.h> ++#include <libavutil/mathematics.h> ++#include <libavutil/samplefmt.h> ++ ++ ++static int filter_size = 16; ++static int phase_shift = 10; /* auto-adjusts */ ++static double cutoff = 0; /* auto-adjusts */ ++ ++struct rate_src { ++ AVAudioResampleContext *avr; ++ ++ int in_rate; ++ int out_rate; ++ unsigned int channels; ++}; ++ ++static snd_pcm_uframes_t input_frames(void *obj, snd_pcm_uframes_t frames) ++{ ++ return frames; ++} ++ ++static snd_pcm_uframes_t output_frames(void *obj, snd_pcm_uframes_t frames) ++{ ++ return frames; ++} ++ ++static void pcm_src_free(void *obj) ++{ ++ struct rate_src *rate = obj; ++ avresample_free(&rate->avr); ++} ++ ++static int pcm_src_init(void *obj, snd_pcm_rate_info_t *info) ++{ ++ struct rate_src *rate = obj; ++ int i, ir, or; ++ ++ if (!rate->avr || rate->channels != info->channels) { ++ int ret; ++ ++ pcm_src_free(rate); ++ rate->channels = info->channels; ++ ir = rate->in_rate = info->in.rate; ++ or = rate->out_rate = info->out.rate; ++ i = av_gcd(or, ir); ++ if (or > ir) { ++ phase_shift = or/i; ++ } else { ++ phase_shift = ir/i; ++ } ++ if (cutoff <= 0.0) { ++ cutoff = 1.0 - 1.0/filter_size; ++ if (cutoff < 0.80) ++ cutoff = 0.80; ++ } ++ ++ rate->avr = avresample_alloc_context(); ++ if (!rate->avr) ++ return -ENOMEM; ++ ++ av_opt_set_int(rate->avr, "in_sample_rate", info->in.rate, 0); ++ av_opt_set_int(rate->avr, "out_sample_rate", info->out.rate, 0); ++ av_opt_set_int(rate->avr, "in_sample_format", AV_SAMPLE_FMT_S16, 0); ++ av_opt_set_int(rate->avr, "out_sample_format", AV_SAMPLE_FMT_S16, 0); ++ av_opt_set_int(rate->avr, "in_channel_layout", av_get_default_channel_layout(rate->channels), 0); ++ av_opt_set_int(rate->avr, "out_channel_layout", av_get_default_channel_layout(rate->channels), 0); ++ ++ av_opt_set_int(rate->avr, "filter_size", filter_size, 0); ++ av_opt_set_int(rate->avr, "phase_shift", phase_shift, 0); ++ av_opt_set_double(rate->avr, "cutoff", cutoff, 0); ++ ++ ret = avresample_open(rate->avr); ++ if (ret < 0) { ++ avresample_free(&rate->avr); ++ return -EINVAL; ++ } ++ } ++ ++ return 0; ++} ++ ++static int pcm_src_adjust_pitch(void *obj, snd_pcm_rate_info_t *info) ++{ ++ struct rate_src *rate = obj; ++ ++ if (info->out.rate != rate->out_rate || info->in.rate != rate->in_rate) ++ pcm_src_init(obj, info); ++ return 0; ++} ++ ++static void pcm_src_reset(void *obj) ++{ ++ struct rate_src *rate = obj; ++ ++ if (rate->avr) { ++ avresample_close(rate->avr); ++ avresample_open(rate->avr); ++ } ++} ++ ++static void pcm_src_convert_s16(void *obj, int16_t *dst, unsigned int ++ dst_frames, const int16_t *src, unsigned int src_frames) ++{ ++ struct rate_src *rate = obj; ++ int consumed = 0, chans=rate->channels, ret=0, i; ++ int total_in = avresample_get_delay(rate->avr) + src_frames; ++ ++ ret = avresample_convert(rate->avr, &dst, dst_frames * chans * 2, dst_frames, ++ &src, src_frames * chans * 2, src_frames); ++ ++ avresample_set_compensation(rate->avr, ++ total_in - src_frames > filter_size ? 0 : 1, src_frames); ++} ++ ++static void pcm_src_close(void *obj) ++{ ++ pcm_src_free(obj); ++} ++ ++#if SND_PCM_RATE_PLUGIN_VERSION >= 0x010002 ++static int get_supported_rates(void *obj, unsigned int *rate_min, ++ unsigned int *rate_max) ++{ ++ *rate_min = *rate_max = 0; /* both unlimited */ ++ return 0; ++} ++ ++static void dump(void *obj, snd_output_t *out) ++{ ++ snd_output_printf(out, "Converter: libavr\n"); ++} ++#endif ++ ++static snd_pcm_rate_ops_t pcm_src_ops = { ++ .close = pcm_src_close, ++ .init = pcm_src_init, ++ .free = pcm_src_free, ++ .adjust_pitch = pcm_src_adjust_pitch, ++ .convert_s16 = pcm_src_convert_s16, ++ .input_frames = input_frames, ++ .output_frames = output_frames, ++#if SND_PCM_RATE_PLUGIN_VERSION >= 0x010002 ++ .version = SND_PCM_RATE_PLUGIN_VERSION, ++ .get_supported_rates = get_supported_rates, ++ .dump = dump, ++#endif ++}; ++ ++int pcm_src_open(unsigned int version, void **objp, snd_pcm_rate_ops_t *ops) ++ ++{ ++ struct rate_src *rate; ++ ++#if SND_PCM_RATE_PLUGIN_VERSION < 0x010002 ++ if (version != SND_PCM_RATE_PLUGIN_VERSION) { ++ fprintf(stderr, "Invalid rate plugin version %x\n", version); ++ return -EINVAL; ++ } ++#endif ++ rate = calloc(1, sizeof(*rate)); ++ if (!rate) ++ return -ENOMEM; ++ ++ *objp = rate; ++ rate->avr = NULL; ++#if SND_PCM_RATE_PLUGIN_VERSION >= 0x010002 ++ if (version == 0x010001) ++ memcpy(ops, &pcm_src_ops, sizeof(snd_pcm_rate_old_ops_t)); ++ else ++#endif ++ *ops = pcm_src_ops; ++ return 0; ++} ++ ++int SND_PCM_RATE_PLUGIN_ENTRY(lavcrate)(unsigned int version, void **objp, ++ snd_pcm_rate_ops_t *ops) ++{ ++ return pcm_src_open(version, objp, ops); ++} ++int SND_PCM_RATE_PLUGIN_ENTRY(lavcrate_higher)(unsigned int version, ++ void **objp, snd_pcm_rate_ops_t *ops) ++{ ++ filter_size = 64; ++ return pcm_src_open(version, objp, ops); ++} ++int SND_PCM_RATE_PLUGIN_ENTRY(lavcrate_high)(unsigned int version, ++ void **objp, snd_pcm_rate_ops_t *ops) ++{ ++ filter_size = 32; ++ return pcm_src_open(version, objp, ops); ++} ++int SND_PCM_RATE_PLUGIN_ENTRY(lavcrate_fast)(unsigned int version, ++ void **objp, snd_pcm_rate_ops_t *ops) ++{ ++ filter_size = 8; ++ return pcm_src_open(version, objp, ops); ++} ++int SND_PCM_RATE_PLUGIN_ENTRY(lavcrate_faster)(unsigned int version, ++ void **objp, snd_pcm_rate_ops_t *ops) ++{ ++ filter_size = 4; ++ return pcm_src_open(version, objp, ops); ++} ++ ++ |