From 88cb2dfa12ffa51c54017d25b1f480d2c016b36d Mon Sep 17 00:00:00 2001 From: aoife cassidy Date: Thu, 19 Sep 2024 11:48:10 -0700 Subject: [PATCH 1/2] only subtract 50ms from stream queue once --- livekit-rtc/livekit/rtc/audio_source.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/livekit-rtc/livekit/rtc/audio_source.py b/livekit-rtc/livekit/rtc/audio_source.py index bb445cdd..96da839e 100644 --- a/livekit-rtc/livekit/rtc/audio_source.py +++ b/livekit-rtc/livekit/rtc/audio_source.py @@ -57,7 +57,10 @@ def __init__( self._info = resp.new_audio_source.source self._ffi_handle = FfiHandle(self._info.handle.id) - self._last_capture = self._q_size = 0.0 + # remove 50ms to account for processing time + # (e.g. using wait_for_playout for very small chunks) + self._q_size = -0.05 + self._last_capture = 0.0 self._join_handle: asyncio.TimerHandle | None = None self._join_fut: asyncio.Future[None] = self._loop.create_future() @@ -91,9 +94,6 @@ async def capture_frame(self, frame: AudioFrame) -> None: now = time.monotonic() elapsed = 0.0 if self._last_capture == 0.0 else now - self._last_capture self._q_size += frame.samples_per_channel / self.sample_rate - elapsed - - # remove 50ms to account for processing time (e.g. using wait_for_playour for very small chunks) - self._q_size -= 0.05 self._last_capture = now if self._join_handle: From b7fdb7d5d609a4ccc1cd17e3a39c2b4f5e27afd2 Mon Sep 17 00:00:00 2001 From: aoife cassidy Date: Thu, 19 Sep 2024 11:58:42 -0700 Subject: [PATCH 2/2] remove 50ms from each timeout --- livekit-rtc/livekit/rtc/audio_source.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/livekit-rtc/livekit/rtc/audio_source.py b/livekit-rtc/livekit/rtc/audio_source.py index 96da839e..5ac063b8 100644 --- a/livekit-rtc/livekit/rtc/audio_source.py +++ b/livekit-rtc/livekit/rtc/audio_source.py @@ -57,10 +57,7 @@ def __init__( self._info = resp.new_audio_source.source self._ffi_handle = FfiHandle(self._info.handle.id) - # remove 50ms to account for processing time - # (e.g. using wait_for_playout for very small chunks) - self._q_size = -0.05 - self._last_capture = 0.0 + self._last_capture = self._q_size = 0.0 self._join_handle: asyncio.TimerHandle | None = None self._join_fut: asyncio.Future[None] = self._loop.create_future() @@ -102,7 +99,11 @@ async def capture_frame(self, frame: AudioFrame) -> None: if self._join_fut.done(): self._join_fut = self._loop.create_future() - self._join_handle = self._loop.call_later(self._q_size, self._release_waiter) + # remove 50ms to account for processing time + # (e.g. using wait_for_playout for very small chunks) + self._join_handle = self._loop.call_later( + self._q_size - 0.05, self._release_waiter + ) req = proto_ffi.FfiRequest() req.capture_audio_frame.source_handle = self._ffi_handle.handle