]> code.delx.au - pulseaudio/commitdiff
echo-cancel: improve accuracy
authorWim Taymans <wim.taymans@collabora.co.uk>
Thu, 9 Sep 2010 10:39:15 +0000 (12:39 +0200)
committerColin Guthrie <cguthrie@mandriva.org>
Thu, 9 Sep 2010 16:03:45 +0000 (17:03 +0100)
Make the echo canceler drift up to 1ms now that things are more accurate.
Add 10 samples of headroom to allow for timing inaccuracies.

src/modules/echo-cancel/module-echo-cancel.c

index 4df77c30b81ad464a609409061e55cf4a893cf64..467e2160718b3ff970ac0fa21300446faee57c1e 100644 (file)
@@ -295,7 +295,7 @@ static void time_callback(pa_mainloop_api *a, pa_time_event *e, const struct tim
         new_rate = base_rate;
     }
     else {
-        if (diff_time > 4000) {
+        if (diff_time > 1000) {
             /* diff too big, quickly adjust */
             pa_asyncmsgq_post(u->asyncmsgq, PA_MSGOBJECT(u->source_output), SOURCE_OUTPUT_MESSAGE_APPLY_DIFF_TIME,
                 NULL, diff_time, NULL, NULL);
@@ -594,6 +594,10 @@ static void apply_diff_time(struct userdata *u, int64_t diff_time) {
         diff = pa_usec_to_bytes (-diff_time, &u->source_output->sample_spec);
 
         if (diff > 0) {
+            /* add some extra safety samples to compensate for jitter in the
+             * timings */
+            diff += 10 * pa_frame_size (&u->source_output->sample_spec);
+
             pa_log_info("Playback after capture (%lld), drop sink %lld", (long long) diff_time, (long long) diff);
 
             u->sink_skip = diff;