PlatformAudio stability/shutdown#1193
Draft
alan-george-lk wants to merge 2 commits into
Draft
Conversation
Clear remaining FFI handles during dispose so native resources are released across repeated initialize/shutdown cycles. Stop and detach platform/synthetic audio I/O before peer connection factory teardown so macOS CaptureWorkerThread cannot deliver frames into AudioTransportImpl while transports are being destroyed. Close rooms before dropping track handles and stop platform capture when releasing the platform ADM reference. Co-authored-by: Cursor <cursoragent@cursor.com>
Rename the changeset and document the full ADM teardown + FFI dispose fix. Bump livekit and libwebrtc as minor for the new shutdown_audio_io lifecycle hooks; keep livekit-ffi and webrtc-sys as patch. Co-authored-by: Cursor <cursoragent@cursor.com>
Contributor
ChangesetThe following package versions will be affected by this PR:
|
2 tasks
xianshijing-lk
approved these changes
Jun 27, 2026
xianshijing-lk
left a comment
Contributor
There was a problem hiding this comment.
lgtm in general, some comments
|
|
||
| // Stops active capture/playout and detaches audio callbacks from both ADMs. | ||
| // Must be called with mutex_ held. | ||
| void StopAudioIOLocked(); |
Contributor
There was a problem hiding this comment.
you already document that this function needs to be called under a mutex_, so you don't need to name it StopAudioIOLocked(), just StopAudioIO() or just StopAudio
|
|
||
| // Stops platform capture/playout and detaches its callback without touching | ||
| // synthetic mode. Must be called with mutex_ held. | ||
| void StopPlatformAudioIOLocked(); |
| if (platform_adm_) { | ||
| platform_adm_->RegisterAudioCallback(nullptr); | ||
| platform_adm_->StopRecording(); | ||
| platform_adm_->StopPlayout(); |
Contributor
There was a problem hiding this comment.
nit, curiously, why couldn't we set platform_adm_ = nullptr after calling StopXXX() function ?
| if (synthetic_adm_) { | ||
| synthetic_adm_->RegisterAudioCallback(nullptr); | ||
| synthetic_adm_->StopRecording(); | ||
| synthetic_adm_->StopPlayout(); |
| /// | ||
| /// Call before tearing down the peer connection factory so capture worker | ||
| /// threads cannot deliver frames into transports that are being destroyed. | ||
| void ShutdownAudioIO(); |
Contributor
There was a problem hiding this comment.
I think you can use StopAudioIOLocked directly without ShutdownAudioIO(); ?
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Before you submit your PR
Make sure the following is true before submitting your PR:
PR description
It was discovered in
client-sdk-cppaction runs that macOS integration tests intermittently crashed duringPlatformAudioIntegrationTest.PublishPlatformAudioTrackEndToEnd, often afterMediaMultiStreamIntegrationTestcompleted. The stack showedAudioDeviceMac::CaptureWorkerThreadstill delivering captured audio intoAudioTransportImplwhile peer connection transports (JsepTransportController/BundleManager) were being torn down — a native ADM shutdown ordering bug, not a C++ test artifact.Breaking changes
N/A
MSRV
N/A
Testing
Ideally, unit test the code you add, but ensure you're not repeating existing test cases. Use as many already written scaffolding, utilities as possible; write your own, when needed. If external services, APIs, tokens are required (e.g., running an LK server instance), provide the necessary information. Make sure your tests perform useful, context-aware assertions and do not simply emulate "happy paths".
Async
We want the project to be runtime-agnostic, so please reuse what's already in livekit-runtime and feel free to add anything missing. It's ok to use Tokio directly, when writing unit tests, if necessary. When testing, do not use artificial delays for the state to "catch up"; instead, respect the event flow and subscribe properly using channels or other mechanisms.