4e93dcc82a
Three bugs prevented vchan audio from working reliably: 1. vchan.js: `vchanReconnectAudio` returned before updating `_audioChannelOverride` when audio was inactive. Switching to a virtual channel with audio off then starting audio manually would connect to the primary channel instead. Move the override update before the rxActive guard so it always reflects the active channel. 2. audio.rs: `audio_ws` returned 404 immediately if the channel was not yet in `vchan_audio`. The entry is populated when `AUDIO_MSG_VCHAN_ALLOCATED` arrives from the audio TCP client, which can lag the HTTP allocation by up to ~100 ms. Replace the instant 404 with a 2-second polling loop (50 ms intervals) so the WebSocket upgrade waits for the channel to be ready. 3. vchan.rs: `release_session_on_rig` evicted zero-subscriber channels silently — no `VChanAudioCmd::Remove` was sent. Collect evicted channel IDs before retain() and send Remove commands so the server-side DSP pipeline and Opus encoder are torn down properly on session disconnect. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Signed-off-by: Stan Grams <sjg@haxx.space>