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