Applied libav-10 patch from bug #539680 by Daniel Schulte and others. Fixes build...
authorSergei Trofimovich <slyfox@gentoo.org>
Mon, 6 Apr 2015 19:17:56 +0000 (19:17 +0000)
committerSergei Trofimovich <slyfox@gentoo.org>
Mon, 6 Apr 2015 19:17:56 +0000 (19:17 +0000)
Package-Manager: portage-2.2.17/cvs/Linux x86_64
Manifest-Sign-Key: 0x611FF3AA

media-plugins/alsa-plugins/ChangeLog
media-plugins/alsa-plugins/Manifest
media-plugins/alsa-plugins/alsa-plugins-1.0.29.ebuild
media-plugins/alsa-plugins/files/alsa-plugins-1.0.28-libav10.patch [new file with mode: 0644]

index a4f9c6b7a338ed4a8a34a821bed56267ac5d26ee..1c718556e5e05c9443b9f9920412fa8a36b229ea 100644 (file)
@@ -1,6 +1,11 @@
 # ChangeLog for media-plugins/alsa-plugins
 # Copyright 1999-2015 Gentoo Foundation; Distributed under the GPL v2
-# $Header: /var/cvsroot/gentoo-x86/media-plugins/alsa-plugins/ChangeLog,v 1.206 2015/03/25 11:41:10 chainsaw Exp $
+# $Header: /var/cvsroot/gentoo-x86/media-plugins/alsa-plugins/ChangeLog,v 1.207 2015/04/06 19:17:56 slyfox Exp $
+
+  06 Apr 2015; Sergei Trofimovich <slyfox@gentoo.org>
+  +files/alsa-plugins-1.0.28-libav10.patch, alsa-plugins-1.0.29.ebuild:
+  Applied libav-10 patch from bug #539680 by Daniel Schulte and others. Fixes
+  build failure for me.
 
 *alsa-plugins-1.0.29 (25 Mar 2015)
 
index d82d44ec2300c8396a75bed218df695171450d8e..a0c62594c1fc8728603b25cee994b82e17cc2e1b 100644 (file)
@@ -6,6 +6,7 @@ AUX alsa-plugins-1.0.19-missing-avutil.patch 489 SHA256 8b3f3469043f0cf9d313f6a0
 AUX alsa-plugins-1.0.23-automagic.patch 346 SHA256 fe30d4011c06c37a84ff74f467f37d3c6e7a43c01b436de49addf9a36f794840 SHA512 e10f990a0138d83af93bbcb8848a588ed0a1dc643452352b75ca56e243979b69a07a1b6685dbd4c5ff6e32a3d2e98fcb3c0f5da35ff5645c0cae490ece3c710c WHIRLPOOL 89c7967ed0a20658468943424761c52cf8ce894093becdfe9e8ad637cc221bd7495b83e7d8a709774b45fd606abcdb79ccf361536405455bdcf0d6a7c6549b4f
 AUX alsa-plugins-1.0.27-ffmpeg-version-check.patch 482 SHA256 f9d13f2d35c61ca1c52ec033f62f19ce64eed58930e4e140d219862e3f791e39 SHA512 20d08381ecce296a8ec94289029d03938ccc3eb13781276cf392a941a0adc2028d0534de70a01aa775aab4f97eb528f57a83ffb93a0bc602820d3d8394b43837 WHIRLPOOL 2e120a764fcfc1b52e16ba45fc26c0e77ee1ef4c1ac4cd9aaf730cdd400a120ca94386ac9604eb1f8814f736a3ce7f190ec635ea43431ad6a3e936c3904b218f
 AUX alsa-plugins-1.0.27-ffmpeg.patch 1031 SHA256 bca9e739909a6e2652555641688ffbb9b2bc588dc7c6c065900f89ccf86c9ce2 SHA512 027d899b09b1827f69af3d0a38e06420df36aa5737f7511100a6f73f7f6847f78d609373a2c42eabf84f18ffc88036a7c91e8efd522a8a8845a7ffb652a4aec3 WHIRLPOOL fc856938af69b4d0a704f24149368484e8338bb90c9d53621b02e82ce4422e13ce60be691929df5df1c1a2f8cd67ef3e678dfc0416dd7a50565d32ea289d576f
+AUX alsa-plugins-1.0.28-libav10.patch 10113 SHA256 f95e97a6001596d76c785c97d371473d9f43b8b8a5b24075fde8ed0072dbd36d SHA512 b0a169c300e3cb21ee76a6773ccc1f6d69c0e9af604d6bf24669a561e038cf670bac20c5eff5ac48b33f3f36de81d99895b6a43c8310b2609e9b2bfce42cc0bc WHIRLPOOL 9eec9b53f188315ac827b6fd61f495cfa9b9456065af7552cb3093de3e3ccc0f9975bb54c40224caa45b661e0b1a851138a291989244f3f2fd9c6906f0d409b1
 AUX pulse-default.conf 196 SHA256 331ddca02bf9324f924baa7ab14460d8878f1db917e509bfc8c314938c53c26f SHA512 c64f73a46c9f50704d4b2bef09d95ce3bc2352da1437750f49974ab8e6f60d5467d5d94ab0e1490deea5f2b1f67b20aa60a10c502e7d6e049649bca4208f7c1e WHIRLPOOL 373d276717005df7531b9a517d5392d7ff6ac765d677819ffc59799cfa6fd944428008e7e6e827bc31db0ed861044576f45eea67137158bb5a543717e17b00f1
 DIST alsa-plugins-1.0.27.tar.bz2 363593 SHA256 0bbd0c37c2dd7baf16363afb2e58169ffb0f9c0a70031b3b6235594630f3ab35 SHA512 73c2010b66022429bc664bdab1c03694dfd669260dea569e32496bc6e10a11a0da2dd87db6a661ab1376f3aa59f1df8a84cb48ff1d20bb064756c655203f9993 WHIRLPOOL 4487734e0377c880a46df6f7fa53d86a7c38fa3d4bd35e06d128c0ec2b99c789ed64674b59003d8bd0abce2db53301234e467d235532ea145ddb150919cb49af
 DIST alsa-plugins-1.0.28.tar.bz2 366023 SHA256 426f8af1a07ee9d8c06449524d1f0bd59a06e0331a51aa3d59d343a7c6d03120 SHA512 c79cf22f426f500c704c947af602604c62a76a026c9b945589d1ca83dff16de23cec2f1c29c9713e42736092aa0d0389e514ca2ca646f8e4770c8aa8320725cc WHIRLPOOL 9cb54e2a30a3f682aa23acb6317f267ffb3cd47eceb959fbce73c8db3ba7c8af420b91b91cce865f0aaf0c60b2920f51972640aff8413c871d0709fa7f4f90a6
@@ -13,13 +14,13 @@ DIST alsa-plugins-1.0.29.tar.bz2 366077 SHA256 325d85cac285f632b83e0191ae3f348ba
 EBUILD alsa-plugins-1.0.27-r1.ebuild 2643 SHA256 a77d77ed72c162db150b442897256b9a138143556449238964a21de33fca1239 SHA512 494d8729af45bb4a632cf643382cec26f0e63a85000052ae316014b250be37df356fa9a627f700aff5d9bfd9c187e9760a1215271c84ff3f381365673dcb085f WHIRLPOOL 66f27affcb888213d0faf37da7275df5e7e1dcf7e8beacc930182e8c8ec9eef4dacb0b24d26ed8513b08d69758205ad581fdd2ef2793372c3470e2e3a20f90c8
 EBUILD alsa-plugins-1.0.27-r3.ebuild 3036 SHA256 8133d4e1ec28feaf90993e6e5cc9f9d1e4cfed9235fca208e0e142091e161c9f SHA512 737dc0cf8ecdf5c4f0ec037532ddf169715aa028fffe879c0db526f51395133e21efe830bb8bacae25649148df3f1ecd43c99a386563272b55ff1099a94cd651 WHIRLPOOL a957eaa69be7910ef458c739cfd33eda2a896332c49dae0af3e5b0532527a6ec588dc762d74a0a65a659f0c6cece66a75e37c121896a7a654badd79856f5aaf6
 EBUILD alsa-plugins-1.0.28.ebuild 2863 SHA256 c48a18dbcde5d1b5f33e60c93ba87e73ac4b54a30d8f7de7cc204a59ebb758bf SHA512 03bd5729c3d561fe520ded28b815e27e96079d1d4bb7f5f8a1ba838851de22c486ab4d439a134cc4c5a0d9c7226f22db9bc42e2af75d23ebe0a6fc9419adb01f WHIRLPOOL 45cf61d8a3f6529c0ca43163565d2944dab0479c704d0a891dee5c22e11980145cd2010e2b2fafd25169de70cecba4571f481cf0a857092e3f6a2e54ac4c74be
-EBUILD alsa-plugins-1.0.29.ebuild 2877 SHA256 5d601d11363a935ae0883fe2538693c02ff7aa64c2ec349bca9ab1b4bf573b0a SHA512 69db6a3f051f09d3794517c01b97697beadb17df1d152b57efb8fda4ef4bba0955cac172372d83368026c777b59753b24faa03b4f04a5d26934be8fffa3eb682 WHIRLPOOL 1086ff221189d800bde26f10107818686a0d0845ba9f63de551af8f45b46cc01c60b5a8ea9e2d47ec88200fe72274350baf043e3973fef14b48891da41351691
-MISC ChangeLog 30542 SHA256 9a494274be0d24597df67d601c54d5a3378abf348853fc406fe5028fba778094 SHA512 6baef0bd2a98fbcb54d1a93334b4c71168dc9998256dc1e4dd79d9d8c1f8f622f2ebc9e42b3268b1465a0e67b58fa3d08012327e31217aecb1a3b18c7f3a4edd WHIRLPOOL 89730642d08958c4b41f15ed86982093c8df5695842f161e263b3dc6750273f00eeda15f91d1b29d8a22b07dcf5367a383bc5a79259daf3bf7aeadd93f1e893a
+EBUILD alsa-plugins-1.0.29.ebuild 2923 SHA256 3054dcb0af44aa7d198b4c7aff5263527a76f664a75284754164d5f7d910a1d4 SHA512 2fa4c88c14d717ad39245dd72d7923a03d17d1fcf45116fcfe469bcf2fd6b33c8ccdd2a17a2e8245006cd025d1b16c56b6079e055bebd8e2d63e81712e4ba1b4 WHIRLPOOL fe0a50a65a4f63e7600c566288d2bdef445e1f6596210426e50b5ad5fe806bdaa84ead2024582b46f3b9f8c608d1f421bfe60de663df9b38fc9df900badf4b9c
+MISC ChangeLog 30769 SHA256 2f9550ad53918ead01dcd16bb4f839a51b44e25ddf8202b277e7fda30b229485 SHA512 9927e901373010d0c36d3a9d528398560ce96d1b0c46a262374472189e2b5b352c0643d26484f5e3e102fd41549e3e57579650438787d77961e6c1abc4a1ffe2 WHIRLPOOL eab75ced9f3ac90e8c7b95ad7d93df574aba7f5182d9b5eb7c8f1d2ac8437d6c5203a778f3b814f8ee6a47cb573731f1751b029e3be9c24c2a6cd91e73e24a7b
 MISC metadata.xml 310 SHA256 d82c778805ce9088b30b84e54f57aab84dc02dd4c8d59c91740bf06e6d9b17fc SHA512 c05b98f8288c3fbaacbb5c9f194dbddf607e044e1cfc4f2ae2af9aeedb682a162aa4bb25ad17b6337224a5d25d367e809b23591fbeee261ccfe29c0ad14729db WHIRLPOOL e8be3c90b18296caa09d109a3c217473896a6f6ba023ab6be47a1e3909dd7fc3acaa8d7b3222f1de7b466b45fbf9295b23a072a9407915cae5fa3ee8aebdecf8
 -----BEGIN PGP SIGNATURE-----
 Version: GnuPG v2
 
-iEYEAREIAAYFAlUSntcACgkQp5vW4rUFj5q3wgCglp6ZRBPa6eBLgpD+yvklm+Y6
-7HMAoJFwYI1gTjdTrcf1j7zMIbzMKNl2
-=5ube
+iEYEAREIAAYFAlUi25cACgkQcaHudmEf86oFGQCfby6ykPq1I8E8HCfpxOVnXlLz
+OesAn2qBlvfP/qgUgDHz4ToEvV/z8NXm
+=bOmR
 -----END PGP SIGNATURE-----
index a60cada5a5cd63a08dbf8ec6c5c1ddf830ee4b50..83180b0e7de315c5d062c68d0ef38e82b0c23046 100644 (file)
@@ -1,6 +1,6 @@
 # Copyright 1999-2015 Gentoo Foundation
 # Distributed under the terms of the GNU General Public License v2
-# $Header: /var/cvsroot/gentoo-x86/media-plugins/alsa-plugins/alsa-plugins-1.0.29.ebuild,v 1.1 2015/03/25 11:41:10 chainsaw Exp $
+# $Header: /var/cvsroot/gentoo-x86/media-plugins/alsa-plugins/alsa-plugins-1.0.29.ebuild,v 1.2 2015/04/06 19:17:56 slyfox Exp $
 
 EAPI=5
 inherit autotools eutils flag-o-matic multilib multilib-minimal
@@ -28,7 +28,8 @@ DEPEND="${RDEPEND}
        virtual/pkgconfig"
 
 src_prepare() {
-:      epatch "${FILESDIR}"/${PN}-1.0.23-automagic.patch
+       epatch "${FILESDIR}"/${PN}-1.0.23-automagic.patch
+       epatch "${FILESDIR}"/${PN}-1.0.28-libav10.patch
 
        epatch_user
 
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 (file)
index 0000000..9718369
--- /dev/null
@@ -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);
++}
++
++