Skip to content

fix wait_for_playout finishing too early#270

Merged
theomonnom merged 5 commits into
mainfrom
theo/fix-wait
Oct 1, 2024
Merged

fix wait_for_playout finishing too early#270
theomonnom merged 5 commits into
mainfrom
theo/fix-wait

Conversation

@theomonnom

Copy link
Copy Markdown
Member

No description provided.

@theomonnom theomonnom requested a review from a team October 1, 2024 06:28
@theomonnom theomonnom merged commit 9e98632 into main Oct 1, 2024
@theomonnom theomonnom deleted the theo/fix-wait branch October 1, 2024 06:58
chenghao-mou added a commit to livekit/node-sdks that referenced this pull request Jul 1, 2026
Discard the waiter when released (timer, clearQueue, close) and lazily
re-create it on the next captureFrame, matching python-sdks' fix for the
same bug (livekit/python-sdks#270). Releasing also cancels the drain
timer so an orphaned timer can't release a later segment's waiter.
waitForPlayout() now resolves immediately when no audio is queued,
matching Python semantics.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
chenghao-mou added a commit to livekit/node-sdks that referenced this pull request Jul 2, 2026
…ed (#693)

* fix: AudioSource.waitForPlayout resolving early with audio still queued

The internal playout promise could be left resolved (latched) by the
drain timer firing during a gap between captures, or by clearQueue().
A later waitForPlayout() then consumed the stale resolution and
reported playout complete with up to queueSizeMs of audio still
buffered, clipping the tail of agent speech on every turn downstream.

Re-arm the promise on the next captureFrame when it was already
released, and skip the post-playout bookkeeping reset when the promise
was re-armed while waiting.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* refactor: mirror python-sdks _release_waiter structure

Discard the waiter when released (timer, clearQueue, close) and lazily
re-create it on the next captureFrame, matching python-sdks' fix for the
same bug (livekit/python-sdks#270). Releasing also cancels the drain
timer so an orphaned timer can't release a later segment's waiter.
waitForPlayout() now resolves immediately when no audio is queued,
matching Python semantics.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants