From: Arun Raghavan <git@xxxxxxxxxxxxxxxx> --- src/modules/echo-cancel/echo-cancel.h | 1 + src/modules/echo-cancel/webrtc.cc | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/src/modules/echo-cancel/echo-cancel.h b/src/modules/echo-cancel/echo-cancel.h index 29d1574..142f8ac 100644 --- a/src/modules/echo-cancel/echo-cancel.h +++ b/src/modules/echo-cancel/echo-cancel.h @@ -67,6 +67,7 @@ struct pa_echo_canceller_params { uint32_t blocksize; pa_sample_spec sample_spec; bool agc; + bool trace; } webrtc; #endif /* each canceller-specific structure goes here */ diff --git a/src/modules/echo-cancel/webrtc.cc b/src/modules/echo-cancel/webrtc.cc index a8b69b5..58af280 100644 --- a/src/modules/echo-cancel/webrtc.cc +++ b/src/modules/echo-cancel/webrtc.cc @@ -35,6 +35,7 @@ PA_C_DECL_END #include <webrtc/modules/audio_processing/include/audio_processing.h> #include <webrtc/modules/interface/module_common_types.h> +#include <webrtc/system_wrappers/include/trace.h> #define BLOCK_SIZE_US 10000 @@ -48,6 +49,7 @@ PA_C_DECL_END #define DEFAULT_DRIFT_COMPENSATION false #define DEFAULT_EXTENDED_FILTER false #define DEFAULT_INTELLIGIBILITY_ENHANCER false +#define DEFAULT_TRACE false static const char* const valid_modargs[] = { "high_pass_filter", @@ -60,6 +62,7 @@ static const char* const valid_modargs[] = { "drift_compensation", "extended_filter", "intelligibility_enhancer", + "trace", NULL }; @@ -78,6 +81,20 @@ static int routing_mode_from_string(const char *rmode) { return -1; } +class PaWebrtcTraceCallback : public webrtc::TraceCallback { + void Print(webrtc::TraceLevel level, const char *message, int length) + { + if (level & webrtc::kTraceError || level & webrtc::kTraceCritical) + pa_log(message); + else if (level & webrtc::kTraceWarning) + pa_log_warn(message); + else if (level & webrtc::kTraceInfo) + pa_log_info(message); + else + pa_log_debug(message); + } +}; + static void pa_webrtc_ec_fixate_spec(pa_sample_spec *rec_ss, pa_channel_map *rec_map, pa_sample_spec *play_ss, pa_channel_map *play_map, pa_sample_spec *out_ss, pa_channel_map *out_map) @@ -203,6 +220,18 @@ bool pa_webrtc_ec_init(pa_core *c, pa_echo_canceller *ec, if (intelligibility) config.Set<webrtc::Intelligibility>(new webrtc::Intelligibility(true)); + ec->params.priv.webrtc.trace = DEFAULT_TRACE; + if (pa_modargs_get_value_boolean(ma, "trace", &ec->params.priv.webrtc.trace) < 0) { + pa_log("Failed to parse trace value"); + goto fail; + } + + if (ec->params.priv.webrtc.trace) { + webrtc::Trace::CreateTrace(); + webrtc::Trace::set_level_filter(webrtc::kTraceAll); + webrtc::Trace::SetTraceCallback(new PaWebrtcTraceCallback()); + } + pa_webrtc_ec_fixate_spec(rec_ss, rec_map, play_ss, play_map, out_ss, out_map); apm = webrtc::AudioProcessing::Create(config); @@ -265,6 +294,8 @@ bool pa_webrtc_ec_init(pa_core *c, pa_echo_canceller *ec, fail: if (ma) pa_modargs_free(ma); + if (ec->params.priv.webrtc.trace) + webrtc::Trace::ReturnTrace(); if (apm) delete apm; @@ -331,6 +362,9 @@ void pa_webrtc_ec_run(pa_echo_canceller *ec, const uint8_t *rec, const uint8_t * } void pa_webrtc_ec_done(pa_echo_canceller *ec) { + if (ec->params.priv.webrtc.trace) + webrtc::Trace::ReturnTrace(); + if (ec->params.priv.webrtc.apm) { delete (webrtc::AudioProcessing*)ec->params.priv.webrtc.apm; ec->params.priv.webrtc.apm = NULL; -- 2.4.3