Skip to content

Commit 444a5c9

Browse files
authored
AudioSource: ignore empty frames (#280)
1 parent 2188b7e commit 444a5c9

File tree

2 files changed

+10
-2
lines changed

2 files changed

+10
-2
lines changed

livekit-rtc/livekit/rtc/audio_frame.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ class AudioFrame:
2424
"""
2525
A class that represents a frame of audio data with specific properties such as sample rate,
2626
number of channels, and samples per channel.
27+
28+
The format of the audio data is 16-bit signed integers (int16) interleaved by channel.
2729
"""
2830

2931
def __init__(

livekit-rtc/livekit/rtc/audio_source.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ def __init__(
7070
self._last_capture = 0.0
7171
self._q_size = 0.0
7272
self._join_handle: asyncio.TimerHandle | None = None
73-
self._join_fut: asyncio.Future[None] = self._loop.create_future()
73+
self._join_fut: asyncio.Future[None] | None = None
7474

7575
@property
7676
def sample_rate(self) -> int:
@@ -118,6 +118,9 @@ async def capture_frame(self, frame: AudioFrame) -> None:
118118
Exception: If there is an error during frame capture.
119119
"""
120120

121+
if frame.samples_per_channel == 0:
122+
return
123+
121124
now = time.monotonic()
122125
elapsed = 0.0 if self._last_capture == 0.0 else now - self._last_capture
123126
self._q_size += frame.samples_per_channel / self.sample_rate - elapsed
@@ -126,7 +129,7 @@ async def capture_frame(self, frame: AudioFrame) -> None:
126129
if self._join_handle:
127130
self._join_handle.cancel()
128131

129-
if self._join_fut.done():
132+
if self._join_fut is None:
130133
self._join_fut = self._loop.create_future()
131134

132135
self._join_handle = self._loop.call_later(self._q_size, self._release_waiter)
@@ -163,8 +166,11 @@ async def wait_for_playout(self) -> None:
163166
await asyncio.shield(self._join_fut)
164167

165168
def _release_waiter(self) -> None:
169+
assert self._join_fut is not None
170+
166171
if not self._join_fut.done():
167172
self._join_fut.set_result(None)
168173

169174
self._last_capture = 0.0
170175
self._q_size = 0.0
176+
self._join_fut = None

0 commit comments

Comments
 (0)