[pulseaudio-discuss] [PATCH v2 06/25] echo-cancel: Relax restrictions on webrtc AEC stream config

arun at accosted.net arun at accosted.net
Tue Dec 15 19:39:52 PST 2015


From: Arun Raghavan <git at arunraghavan.net>

This exposes the range of configurations the library actually supports.
---
 src/modules/echo-cancel/webrtc.cc | 37 +++++++++++++++++++++++++++++--------
 1 file changed, 29 insertions(+), 8 deletions(-)

diff --git a/src/modules/echo-cancel/webrtc.cc b/src/modules/echo-cancel/webrtc.cc
index e2ce08e..3be7fe5 100644
--- a/src/modules/echo-cancel/webrtc.cc
+++ b/src/modules/echo-cancel/webrtc.cc
@@ -78,6 +78,33 @@ static int routing_mode_from_string(const char *rmode) {
         return -1;
 }
 
+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)
+{
+    rec_ss->format = PA_SAMPLE_S16NE;
+    play_ss->format = PA_SAMPLE_S16NE;
+
+    /* AudioProcessing expects one of the following rates */
+    if (rec_ss->rate > 48000)
+        rec_ss->rate = 48000;
+    else if (rec_ss->rate > 32000 && rec_ss->rate < 48000)
+        rec_ss->rate = 32000;
+    else if (rec_ss->rate > 16000 && rec_ss->rate < 32000)
+        rec_ss->rate = 16000;
+    else if (rec_ss->rate != 8000)
+        rec_ss->rate = 8000;
+    else
+        ; /* All good, rate is 8/16/32/48 kHz */
+
+    /* In int16 mode, AudioProcessing will give us the same spec we give it */
+    *out_ss = *rec_ss;
+    *out_map = *rec_map;
+
+    /* Playback stream rate needs to be the same as capture */
+    play_ss->rate = rec_ss->rate;
+}
+
 bool pa_webrtc_ec_init(pa_core *c, pa_echo_canceller *ec,
                        pa_sample_spec *rec_ss, pa_channel_map *rec_map,
                        pa_sample_spec *play_ss, pa_channel_map *play_map,
@@ -176,15 +203,9 @@ bool pa_webrtc_ec_init(pa_core *c, pa_echo_canceller *ec,
     if (intelligibility)
         config.Set<webrtc::Intelligibility>(new webrtc::Intelligibility(true));
 
-    apm = webrtc::AudioProcessing::Create(config);
+    pa_webrtc_ec_fixate_spec(rec_ss, rec_map, play_ss, play_map, out_ss, out_map);
 
-    out_ss->format = PA_SAMPLE_S16NE;
-    *play_ss = *out_ss;
-    /* FIXME: the implementation actually allows a different number of
-     * source/sink channels. Do we want to support that? */
-    *play_map = *out_map;
-    *rec_ss = *out_ss;
-    *rec_map = *out_map;
+    apm = webrtc::AudioProcessing::Create(config);
 
     pconfig = {
         webrtc::StreamConfig(rec_ss->rate, rec_ss->channels, false), /* input stream */
-- 
2.5.0



More information about the pulseaudio-discuss mailing list