[pulseaudio-discuss] [PATCH v3 19/24] echo-cancel: webrtc canceller supports different in/out channel counts

Tanu Kaskinen tanuk at iki.fi
Thu Feb 11 11:07:36 UTC 2016


On Mon, 2016-01-18 at 13:06 +0530, arun at accosted.net wrote:
> From: Arun Raghavan <git at arunraghavan.net>
> 
> Needed for upcoming beamforming code.
> ---
>  src/modules/echo-cancel/echo-cancel.h |  2 +-
>  src/modules/echo-cancel/webrtc.cc     | 14 ++++++++------
>  2 files changed, 9 insertions(+), 7 deletions(-)
> 
> diff --git a/src/modules/echo-cancel/echo-cancel.h b/src/modules/echo-cancel/echo-cancel.h
> index 4693516..613f7e3 100644
> --- a/src/modules/echo-cancel/echo-cancel.h
> +++ b/src/modules/echo-cancel/echo-cancel.h
> @@ -65,7 +65,7 @@ struct pa_echo_canceller_params {
>               * to C++ linkage. apm is a pointer to an AudioProcessing object */
>              void *apm;
>              int32_t blocksize; /* in frames */
> -            pa_sample_spec rec_ss, play_ss;
> +            pa_sample_spec rec_ss, play_ss, out_ss;
>              bool agc;
>              bool trace;
>              bool first;
> diff --git a/src/modules/echo-cancel/webrtc.cc b/src/modules/echo-cancel/webrtc.cc
> index 5741f45..5f00286 100644
> --- a/src/modules/echo-cancel/webrtc.cc
> +++ b/src/modules/echo-cancel/webrtc.cc
> @@ -333,6 +333,7 @@ bool pa_webrtc_ec_init(pa_core *c, pa_echo_canceller *ec,
>      ec->params.webrtc.apm = apm;
>      ec->params.webrtc.rec_ss = *rec_ss;
>      ec->params.webrtc.play_ss = *play_ss;
> +    ec->params.webrtc.out_ss = *out_ss;
>      ec->params.webrtc.blocksize =
>          (uint64_t) (pa_bytes_per_second(out_ss) / pa_frame_size(out_ss)) * BLOCK_SIZE_US / PA_USEC_PER_SEC;
>      *nframes = ec->params.webrtc.blocksize;
> @@ -372,17 +373,18 @@ void pa_webrtc_ec_play(pa_echo_canceller *ec, const uint8_t *play) {
>  void pa_webrtc_ec_record(pa_echo_canceller *ec, const uint8_t *rec, uint8_t *out) {
>      webrtc::AudioProcessing *apm = (webrtc::AudioProcessing*)ec->params.webrtc.apm;
>      webrtc::AudioFrame out_frame;
> -    const pa_sample_spec *ss = &ec->params.webrtc.rec_ss;
> +    const pa_sample_spec *rec_ss = &ec->params.webrtc.rec_ss;
> +    const pa_sample_spec *out_ss = &ec->params.webrtc.out_ss;
>      pa_cvolume v;
>      int old_volume, new_volume;
>  
> -    out_frame.num_channels_ = ss->channels;
> -    out_frame.sample_rate_hz_ = ss->rate;
> +    out_frame.num_channels_ = rec_ss->channels;
> +    out_frame.sample_rate_hz_ = rec_ss->rate;
>      out_frame.interleaved_ = true;
>      out_frame.samples_per_channel_ = ec->params.webrtc.blocksize;
>  
>      pa_assert(out_frame.samples_per_channel_ <= webrtc::AudioFrame::kMaxDataSizeSamples);

Not directly related to this patch, but this assertion seems wrong. We
compare kMaxDataSizeSamples to the number of frames, but
kMaxDataSizeSamples is calculated as frames * channels.

Also, kMaxDataSizeSamples assumes that the maximum sample spec is 16-
bit, stereo, 32 kHz, and that the maximum buffer size is 60 ms.
However, we seem to allow using 48 kHz, and I didn't find any
limitations for the channel count. We seem to use 10 ms buffers, so
that gives some headroom. webrtc_ec_fixate_spec() should check all
this, and make sure that our parameters don't exceed
kMaxDataSizeSamples.

The changes in this patch all look good.

-- 
Tanu


More information about the pulseaudio-discuss mailing list