Vivox sets interleaved Float32 stereo on output scope element 1 and
AUBase's canonical-only rule rejected it with -10868, so voice chat never
started recording (issue #75 trace: 20 attempts, all failing there).
A real AUHAL converts any linear PCM; element 1 now accepts native-endian
float32 or 8/16/32-bit integers in either layout, which PulseAudio records
and RenderBus copies. Playback (element 0) keeps the canonical rule.
The input check gains a Vivox-style run: interleaved stereo 44.1 kHz with
the device set on element 1.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
The handler read a flag the caller wrote without synchronization, and
inferred "called inside the request" from whether the call had returned,
which misfires when the handler runs on another thread first. Compare the
handler's thread with the caller's instead and keep the shared results
atomic.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Voice chat (Vivox) saw no capture device and Chromium was told mic
access was denied. Fixes for issue #75:
- AVCaptureDevice: audio is Authorized when CoreAudio has a default
input device; requestAccess answers asynchronously. Video stays Denied.
- PulseAudio input device reports 2 channels on input scope, 0 on output
(was copied from the output device).
- PulseAudio input stream: real sample/host timestamps, one device
buffer per IOProc call, holes as silence, IOProc errors no longer cork
the stream, record buffer attrs sized to the device buffer.
- AUHAL: two elements per scope like macOS, non-blocking
AudioUnitRender on bus 1 with planar support, device records in the
bus 1 format, input-only units route CurrentDevice/BufferFrameSize to
the input device, input start errors handled.
- New offline check tools/riot-audio-input-check.cpp.
Co-Authored-By: Claude Opus 5.5 <[email protected]>