[pulseaudio-discuss] [PATCH v2] make Adrian's echo cancellation code optional

Maarten Bosmans mkbosmans at gmail.com
Wed Dec 21 14:10:12 PST 2011


2011/12/11 Peter Meerwald <pmeerw at pmeerw.net>:
> From: Peter Meerwald <p.meerwald at bct-electronic.com>
>
> makes the Adrian echo canceller implementation optional at compile time
>
> this patch supersedes an earlier patch proposal and addresses the following
> comments:
> * separate patch from speex dependency rework (Arun)
> * check that at least one EC implementation is available (Arun)
> * properly align yes/no in configure summary for Adrian (Frederic)
>
> ---
>  configure.ac                                 |   15 ++++++++++++++-
>  src/Makefile.am                              |   10 +++++++---
>  src/modules/echo-cancel/echo-cancel.h        |    4 ++++
>  src/modules/echo-cancel/module-echo-cancel.c |    8 +++++++-
>  4 files changed, 32 insertions(+), 5 deletions(-)
>
> diff --git a/configure.ac b/configure.ac
> index ac7dcbf..0009c17 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -1176,7 +1176,14 @@ AC_SUBST(WEBRTC_CFLAGS)
>  AC_SUBST(WEBRTC_LIBS)
>  AM_CONDITIONAL([HAVE_WEBRTC], [test "x$HAVE_WEBRTC" = "x1"])
>
> +AC_ARG_ENABLE([adrian-aec],
> +    AS_HELP_STRING([--enable-adrian-aec], [Enable Adrian's optional echo canceller]))
> +AS_IF([test "x$enable_adrian_aec" != "xno"],
> +    [HAVE_ADRIAN_EC=1])
> +AM_CONDITIONAL([HAVE_ADRIAN_EC], [test "x$HAVE_ADRIAN_EC" = "x1"])
> +
> +
>
>  ###################################
>  #            Output               #
>  ###################################
> @@ -1322,6 +1329,7 @@ AS_IF([test "x$HAVE_IPV6" = "x1"], ENABLE_IPV6=yes, ENABLE_IPV6=no)
>  AS_IF([test "x$HAVE_OPENSSL" = "x1"], ENABLE_OPENSSL=yes, ENABLE_OPENSSL=no)
>  AS_IF([test "x$HAVE_FFTW" = "x1"], ENABLE_FFTW=yes, ENABLE_FFTW=no)
>  AS_IF([test "x$HAVE_ORC" = "xyes"], ENABLE_ORC=yes, ENABLE_ORC=no)
> +AS_IF([test "x$HAVE_ADRIAN_EC" = "x1"], ENABLE_ADRIAN_EC=yes, ENABLE_ADRIAN_EC=no)
>  AS_IF([test "x$HAVE_SPEEX" = "x1"], ENABLE_SPEEX=yes, ENABLE_SPEEX=no)
>  AS_IF([test "x$HAVE_WEBRTC" = "x1"], ENABLE_WEBRTC=yes, ENABLE_WEBRTC=no)
>  AS_IF([test "x$HAVE_TDB" = "x1"], ENABLE_TDB=yes, ENABLE_TDB=no)
> @@ -1370,7 +1378,8 @@ echo "
>     Enable OpenSSL (for Airtunes): ${ENABLE_OPENSSL}
>     Enable fftw:                   ${ENABLE_FFTW}
>     Enable orc:                    ${ENABLE_ORC}
> -    Enable speex:                  ${ENABLE_SPEEX}
> +    Enable Adrian echo canceller:  ${ENABLE_ADRIAN_EC}
> +    Enable speex (resampler, AEC): ${ENABLE_SPEEX}
>     Enable WebRTC echo canceller:  ${ENABLE_WEBRTC}
>     Database
>       tdb:                         ${ENABLE_TDB}
> @@ -1388,6 +1397,10 @@ echo "
>     Legacy Database Entry Support: ${ENABLE_LEGACY_DATABASE_ENTRY_FORMAT}
>  "
>
> +if test "${ENABLE_SPEEX}" = "no" && test "${ENABLE_WEBRTC}" = "no" && test "${ENABLE_ADRIAN_EC}" = "no" ; then
> +AC_MSG_ERROR([At least one echo canceller implementation must be available.])
> +fi
> +

I think it's better to just disable building module-echo-cancel
instead of giving this error message when none of the necessary
requirements are available. We have lots of modules that are only
optionally build.

Maarten

>  if test "${ENABLE_DBUS}" = "no" && test "x$os_is_win32" != "x1" ; then
>    echo "
>  ===== WARNING WARNING WARNING WARNING WARNING WARNING WARNING =====
> diff --git a/src/Makefile.am b/src/Makefile.am
> index 852e962..649f82f 100644
> --- a/src/Makefile.am
> +++ b/src/Makefile.am
> @@ -1744,12 +1744,15 @@ module_suspend_on_idle_la_CFLAGS = $(AM_CFLAGS)
>
>  # echo-cancel module
>  module_echo_cancel_la_SOURCES = \
> -               modules/echo-cancel/module-echo-cancel.c modules/echo-cancel/echo-cancel.h \
> -               modules/echo-cancel/adrian-aec.c modules/echo-cancel/adrian-aec.h \
> -               modules/echo-cancel/adrian.c modules/echo-cancel/adrian.h
> +               modules/echo-cancel/module-echo-cancel.c modules/echo-cancel/echo-cancel.h
>  module_echo_cancel_la_LDFLAGS = $(MODULE_LDFLAGS)
>  module_echo_cancel_la_LIBADD = $(MODULE_LIBADD) $(LIBSPEEX_LIBS)
>  module_echo_cancel_la_CFLAGS = $(AM_CFLAGS) $(SERVER_CFLAGS) $(LIBSPEEX_CFLAGS)
> +if HAVE_ADRIAN_EC
> +module_echo_cancel_la_SOURCES += \
> +               modules/echo-cancel/adrian-aec.c modules/echo-cancel/adrian-aec.h \
> +               modules/echo-cancel/adrian.c modules/echo-cancel/adrian.h
> +module_echo_cancel_la_CFLAGS += -DHAVE_ADRIAN_EC=1
>  if HAVE_ORC
>  ORC_SOURCE += modules/echo-cancel/adrian-aec
>  nodist_module_echo_cancel_la_SOURCES = \
> @@ -1758,6 +1761,7 @@ nodist_module_echo_cancel_la_SOURCES = \
>  module_echo_cancel_la_LIBADD += $(ORC_LIBS)
>  module_echo_cancel_la_CFLAGS += $(ORC_CFLAGS) -I$(top_builddir)/src/modules/echo-cancel
>  endif
> +endif
>  if HAVE_SPEEX
>  module_echo_cancel_la_SOURCES += modules/echo-cancel/speex.c
>  endif
> diff --git a/src/modules/echo-cancel/echo-cancel.h b/src/modules/echo-cancel/echo-cancel.h
> index 15d44f5..870d163 100644
> --- a/src/modules/echo-cancel/echo-cancel.h
> +++ b/src/modules/echo-cancel/echo-cancel.h
> @@ -52,10 +52,12 @@ struct pa_echo_canceller_params {
>             SpeexPreprocessState *pp_state;
>         } speex;
>  #endif
> +#ifdef HAVE_ADRIAN_EC
>         struct {
>             uint32_t blocksize;
>             AEC *aec;
>         } adrian;
> +#endif
>  #ifdef HAVE_WEBRTC
>         struct {
>             /* This is a void* so that we don't have to convert this whole file
> @@ -136,6 +138,7 @@ void pa_speex_ec_run(pa_echo_canceller *ec, const uint8_t *rec, const uint8_t *p
>  void pa_speex_ec_done(pa_echo_canceller *ec);
>  #endif
>
> +#ifdef HAVE_ADRIAN_EC
>  /* Adrian Andre's echo canceller */
>  pa_bool_t pa_adrian_ec_init(pa_core *c, pa_echo_canceller *ec,
>                            pa_sample_spec *source_ss, pa_channel_map *source_map,
> @@ -143,6 +146,7 @@ pa_bool_t pa_adrian_ec_init(pa_core *c, pa_echo_canceller *ec,
>                            uint32_t *blocksize, const char *args);
>  void pa_adrian_ec_run(pa_echo_canceller *ec, const uint8_t *rec, const uint8_t *play, uint8_t *out);
>  void pa_adrian_ec_done(pa_echo_canceller *ec);
> +#endif
>
>  #ifdef HAVE_WEBRTC
>  /* WebRTC canceller functions */
> diff --git a/src/modules/echo-cancel/module-echo-cancel.c b/src/modules/echo-cancel/module-echo-cancel.c
> index 0640afc..5c7bb78 100644
> --- a/src/modules/echo-cancel/module-echo-cancel.c
> +++ b/src/modules/echo-cancel/module-echo-cancel.c
> @@ -85,7 +85,9 @@ typedef enum {
>  #ifdef HAVE_SPEEX
>     PA_ECHO_CANCELLER_SPEEX,
>  #endif
> +#ifdef HAVE_ADRIAN_EC
>     PA_ECHO_CANCELLER_ADRIAN,
> +#endif
>  #ifdef HAVE_WEBRTC
>     PA_ECHO_CANCELLER_WEBRTC,
>  #endif
> @@ -106,12 +108,14 @@ static const pa_echo_canceller ec_table[] = {
>         .done                   = pa_speex_ec_done,
>     },
>  #endif
> +#ifdef HAVE_ADRIAN_EC
>     {
>         /* Adrian Andre's NLMS implementation */
>         .init                   = pa_adrian_ec_init,
>         .run                    = pa_adrian_ec_run,
>         .done                   = pa_adrian_ec_done,
>     },
> +#endif
>  #ifdef HAVE_WEBRTC
>     {
>         /* WebRTC's audio processing engine */
> @@ -1549,13 +1553,15 @@ static pa_echo_canceller_method_t get_ec_method_from_string(const char *method)
>     if (pa_streq(method, "speex"))
>         return PA_ECHO_CANCELLER_SPEEX;
>  #endif
> +#ifdef HAVE_ADRIAN_EC
>     if (pa_streq(method, "adrian"))
>         return PA_ECHO_CANCELLER_ADRIAN;
> +#endif
>  #ifdef HAVE_WEBRTC
>     if (pa_streq(method, "webrtc"))
>         return PA_ECHO_CANCELLER_WEBRTC;
>  #endif
>     return PA_ECHO_CANCELLER_INVALID;
>  }
>
>  /* Common initialisation bits between module-echo-cancel and the standalone test program */
> --
> 1.7.4.1
>
> _______________________________________________
> pulseaudio-discuss mailing list
> pulseaudio-discuss at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss


More information about the pulseaudio-discuss mailing list