bbbe2d8f17cfdd869205bae6fb6f4a6156a50581
Two correctness fixes for the cpal/WASAPI backend from the Codex Windows-compat review, plus device logging. W1 — start_capture/start_playback no longer return Ok before the stream exists. The owning thread did device resolution, config selection, build_stream, and play() and only *logged* failures, so a missing 48 kHz config / unsupported format / WASAPI error left the UI in a joined-but-silent room. The worker now reports readiness over a channel and start_* blocks on it via finish_start(), returning the real AudioError on failure (and joining the dead worker). W3 — the RT capture callback no longer allocates or sends on a channel. It now only downmixes and wait-free-pushes mono samples into a preallocated lock-free HeapRb; the owning thread drains that ring, frames it (the Vec allocation lives off the RT path), and sends completed frames. A full ring increments an overrun counter instead of blocking. Restores the no-alloc/no-block-in-callback contract the PipeWire backend already honors. Also logs the selected device name / sample format / channels / rate on stream start (a review nice-to-have) and logs capture overruns when they occur. Windows-only file (cfg(windows)); Linux build unaffected. Compile-verified via the windows-gnu cross-build; not yet run on a real WASAPI host. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>