On Mon, 2016-01-18 at 13:06 +0530, arun at accosted.net wrote: > From: Arun Raghavan <git at arunraghavan.net> > > --- >  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 4dbd2fc..53ab7e1 100644 > --- a/src/modules/echo-cancel/webrtc.cc > +++ b/src/modules/echo-cancel/webrtc.cc > @@ -35,6 +35,7 @@ PA_C_DECL_END >  >  #include >  #include > +#include >  >  #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) I hope the presence of a length parameter doesn't mean that message isn't null-terminated. > +    { > +        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) > @@ -201,6 +218,18 @@ bool pa_webrtc_ec_init(pa_core *c, pa_echo_canceller *ec, >      if (intelligibility) >          config.Set(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()); Does webrtc::Trace delete the object that you allocate here? > +    } > + >      pa_webrtc_ec_fixate_spec(rec_ss, rec_map, play_ss, play_map, out_ss, out_map); >  >      apm = webrtc::AudioProcessing::Create(config); > @@ -263,6 +292,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(); What does this do? Is it safe to call this if you haven't yet set up the tracing? -- Tanu