From 348b260ec4e874fb1553fc890254159244b6ec04 Mon Sep 17 00:00:00 2001
From: Adrien Beraud <adrien.beraud@savoirfairelinux.com>
Date: Fri, 11 Aug 2023 17:39:58 -0400
Subject: [PATCH] audio processor: avoid drops in some cases

Avoid dropping the mic input or the output feedback if both feeds are late,
by adding the condition that the dropped stream should have a buffer
at least twice as large as the other one.

Change-Id: I99180f299e3ee848fd0c0d4a6ee0d39f7919be32
---
 .../audio/audio-processing/audio_processor.h     | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/src/media/audio/audio-processing/audio_processor.h b/src/media/audio/audio-processing/audio_processor.h
index 4f43a475de..07a8800a7c 100644
--- a/src/media/audio/audio-processing/audio_processor.h
+++ b/src/media/audio/audio-processing/audio_processor.h
@@ -118,16 +118,20 @@ protected:
      */
     bool tidyQueues()
     {
-        while (recordQueue_.samples() > recordQueue_.frameSize() * 10) {
-            JAMI_DBG("record overflow %d / %d", recordQueue_.samples(), frameSize_);
+        auto recordFrameSize = recordQueue_.frameSize();
+        auto playbackFrameSize = playbackQueue_.frameSize();
+        while (recordQueue_.samples() > recordFrameSize * 10
+            && 2 * playbackQueue_.samples() * recordFrameSize < recordQueue_.samples() * playbackFrameSize) {
+            JAMI_LOG("record overflow {:d} / {:d} - playback: {:d}", recordQueue_.samples(), frameSize_, playbackQueue_.samples());
             recordQueue_.dequeue();
         }
-        while (playbackQueue_.samples() > playbackQueue_.frameSize() * 10) {
-            JAMI_DBG("playback overflow %d / %d", playbackQueue_.samples(), frameSize_);
+        while (playbackQueue_.samples() > playbackFrameSize * 10
+            && 2 * recordQueue_.samples() * playbackFrameSize < playbackQueue_.samples() * recordFrameSize) {
+            JAMI_LOG("playback overflow {:d} / {:d} - record: {:d}", playbackQueue_.samples(), frameSize_, recordQueue_.samples());
             playbackQueue_.dequeue();
         }
-        if (recordQueue_.samples() < recordQueue_.frameSize()
-            || playbackQueue_.samples() < playbackQueue_.frameSize()) {
+        if (recordQueue_.samples() < recordFrameSize
+            || playbackQueue_.samples() < playbackFrameSize) {
             // If there are not enough samples in either queue, we can't
             // process anything.
             return true;
-- 
GitLab