From 89715ca7bbde6aec6e23b714756ea8fb157bce93 Mon Sep 17 00:00:00 2001 From: Daisuke Murase Date: Fri, 27 Dec 2024 07:39:07 -0800 Subject: [PATCH 1/5] implement close function in audio/video source --- livekit-rtc/livekit/rtc/audio_source.py | 10 +++++++++- livekit-rtc/livekit/rtc/video_source.py | 3 +++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/livekit-rtc/livekit/rtc/audio_source.py b/livekit-rtc/livekit/rtc/audio_source.py index f32b8213..7c13c974 100644 --- a/livekit-rtc/livekit/rtc/audio_source.py +++ b/livekit-rtc/livekit/rtc/audio_source.py @@ -118,7 +118,7 @@ async def capture_frame(self, frame: AudioFrame) -> None: Exception: If there is an error during frame capture. """ - if frame.samples_per_channel == 0: + if frame.samples_per_channel == 0 or self._ffi_handle.disposed: return now = time.monotonic() @@ -175,3 +175,11 @@ def _release_waiter(self) -> None: self._last_capture = 0.0 self._q_size = 0.0 self._join_fut = None + + def close(self) -> None: + """Close the audio source + + This method cleans up resources associated with the audio source. + """ + self._ffi_handle.dispose() + diff --git a/livekit-rtc/livekit/rtc/video_source.py b/livekit-rtc/livekit/rtc/video_source.py index 377f39f9..e6cd2a67 100644 --- a/livekit-rtc/livekit/rtc/video_source.py +++ b/livekit-rtc/livekit/rtc/video_source.py @@ -42,3 +42,6 @@ def capture_frame( req.capture_video_frame.rotation = rotation req.capture_video_frame.timestamp_us = timestamp_us FfiClient.instance.request(req) + + def close() -> None: + self._ffi_handle.dispose() From fed0f8f7896090b792f82742bcc9afe10936df2b Mon Sep 17 00:00:00 2001 From: Daisuke Murase Date: Fri, 27 Dec 2024 07:44:50 -0800 Subject: [PATCH 2/5] update example as well --- examples/video-stream/audio_wave.py | 2 ++ examples/video-stream/video_play.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/examples/video-stream/audio_wave.py b/examples/video-stream/audio_wave.py index ce588702..37d0a86b 100644 --- a/examples/video-stream/audio_wave.py +++ b/examples/video-stream/audio_wave.py @@ -296,6 +296,8 @@ async def main(room: rtc.Room, room_name: str): finally: audio_task.cancel() await av_sync.aclose() + audio_source.close() + video_source.close() if __name__ == "__main__": diff --git a/examples/video-stream/video_play.py b/examples/video-stream/video_play.py index 05f753ef..ea4d8ce3 100644 --- a/examples/video-stream/video_play.py +++ b/examples/video-stream/video_play.py @@ -181,6 +181,8 @@ async def _push_frames( finally: await streamer.aclose() await av_sync.aclose() + audio_source.close() + video_source.close() if __name__ == "__main__": From 971aa51e1aceb3044abb600e6e7aa74dcf8e61fe Mon Sep 17 00:00:00 2001 From: Daisuke Murase Date: Fri, 27 Dec 2024 07:51:30 -0800 Subject: [PATCH 3/5] oops --- livekit-rtc/livekit/rtc/video_source.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/livekit-rtc/livekit/rtc/video_source.py b/livekit-rtc/livekit/rtc/video_source.py index e6cd2a67..96114b29 100644 --- a/livekit-rtc/livekit/rtc/video_source.py +++ b/livekit-rtc/livekit/rtc/video_source.py @@ -43,5 +43,5 @@ def capture_frame( req.capture_video_frame.timestamp_us = timestamp_us FfiClient.instance.request(req) - def close() -> None: + def close(self) -> None: self._ffi_handle.dispose() From c69807d70ba99e629ee8b13afe668e3611b928f4 Mon Sep 17 00:00:00 2001 From: Daisuke Murase Date: Fri, 27 Dec 2024 07:54:20 -0800 Subject: [PATCH 4/5] format --- livekit-rtc/livekit/rtc/audio_source.py | 1 - 1 file changed, 1 deletion(-) diff --git a/livekit-rtc/livekit/rtc/audio_source.py b/livekit-rtc/livekit/rtc/audio_source.py index 7c13c974..ac54462e 100644 --- a/livekit-rtc/livekit/rtc/audio_source.py +++ b/livekit-rtc/livekit/rtc/audio_source.py @@ -182,4 +182,3 @@ def close(self) -> None: This method cleans up resources associated with the audio source. """ self._ffi_handle.dispose() - From 221f1de759fb650cca7cf18f3b304a908ee78248 Mon Sep 17 00:00:00 2001 From: Daisuke Murase Date: Sat, 28 Dec 2024 08:23:20 -0800 Subject: [PATCH 5/5] make async for future flexibility --- examples/video-stream/audio_wave.py | 4 ++-- examples/video-stream/video_play.py | 4 ++-- livekit-rtc/livekit/rtc/audio_source.py | 2 +- livekit-rtc/livekit/rtc/video_source.py | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/video-stream/audio_wave.py b/examples/video-stream/audio_wave.py index 37d0a86b..b00c31aa 100644 --- a/examples/video-stream/audio_wave.py +++ b/examples/video-stream/audio_wave.py @@ -296,8 +296,8 @@ async def main(room: rtc.Room, room_name: str): finally: audio_task.cancel() await av_sync.aclose() - audio_source.close() - video_source.close() + await audio_source.aclose() + await video_source.aclose() if __name__ == "__main__": diff --git a/examples/video-stream/video_play.py b/examples/video-stream/video_play.py index ea4d8ce3..b15e1ccc 100644 --- a/examples/video-stream/video_play.py +++ b/examples/video-stream/video_play.py @@ -181,8 +181,8 @@ async def _push_frames( finally: await streamer.aclose() await av_sync.aclose() - audio_source.close() - video_source.close() + await audio_source.aclose() + await video_source.aclose() if __name__ == "__main__": diff --git a/livekit-rtc/livekit/rtc/audio_source.py b/livekit-rtc/livekit/rtc/audio_source.py index ac54462e..839203d8 100644 --- a/livekit-rtc/livekit/rtc/audio_source.py +++ b/livekit-rtc/livekit/rtc/audio_source.py @@ -176,7 +176,7 @@ def _release_waiter(self) -> None: self._q_size = 0.0 self._join_fut = None - def close(self) -> None: + async def aclose(self) -> None: """Close the audio source This method cleans up resources associated with the audio source. diff --git a/livekit-rtc/livekit/rtc/video_source.py b/livekit-rtc/livekit/rtc/video_source.py index 96114b29..5ae58f66 100644 --- a/livekit-rtc/livekit/rtc/video_source.py +++ b/livekit-rtc/livekit/rtc/video_source.py @@ -43,5 +43,5 @@ def capture_frame( req.capture_video_frame.timestamp_us = timestamp_us FfiClient.instance.request(req) - def close(self) -> None: + async def aclose(self) -> None: self._ffi_handle.dispose()