Skip to content

Preserve draining across device reinitialization - #866

Draft
padenot wants to merge 1 commit into
masterfrom
fix-drain-reinitialization
Draft

padenot wants to merge 1 commit into
masterfrom
fix-drain-reinitialization

Conversation

@padenot

@padenot padenot commented Oct 16, 2026 •

Copy link
Copy Markdown
Collaborator

An application callback that returns fewer frames than requested must remain drained across a device change, even when buffered resampler output fills the current device buffer. Keep the terminal callback result on the stream in AAudio, WASAPI and C++ AudioUnit so replacing the resampler cannot resume application callbacks.

AAudio recovery now completes an existing drain without restarting the replacement device or emitting STARTED, preserves callback errors, and resets both the resampler and position bookkeeping on an explicit restart. C++ AudioUnit also resets its drained resampler on explicit start.

Validation: 42 AAudio cases pass with host AAudio stubs; all 20 native macOS resampler tests pass. Added tests cover short and zero returns, resampler buffering, repeated recovery, explicit restart, delayed callbacks, and callback versus device-stop errors. Windows validation is left to CI.

This addresses the cubeb behavior behind https://phabricator.services.mozilla.com/D334378. Buffered audio on the removed device may be lost.

Related Rust fixes: mozilla/cubeb-coreaudio-rs#293 and mozilla/cubeb-pulse-rs#117.

This branch has not been deployed

No deployments
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.

1 participant