[chore](trx-frontend-http): add debug logging to audio WebSocket handler

Trace per-rig audio subscription lookup, stream info availability, and
session lifecycle to diagnose multi-rig audio regression.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Stan Grams <sjg@haxx.space>
This commit is contained in:
2026-03-24 07:50:14 +01:00
parent 80ed1155f5
commit cfc8407c3a
@@ -19,7 +19,7 @@ use actix_ws::Message;
use bytes::Bytes; use bytes::Bytes;
use serde::Deserialize; use serde::Deserialize;
use tokio::sync::broadcast; use tokio::sync::broadcast;
use tracing::warn; use tracing::{info, warn};
use uuid::Uuid; use uuid::Uuid;
use trx_core::decode::{ use trx_core::decode::{
@@ -533,15 +533,22 @@ pub async fn audio_ws(
// Do NOT fall back to global — that would silently deliver the wrong // Do NOT fall back to global — that would silently deliver the wrong
// rig's audio. Wait briefly for the per-rig channel to appear (it is // rig's audio. Wait briefly for the per-rig channel to appear (it is
// lazily created by the audio relay sync task every 500ms). // lazily created by the audio relay sync task every 500ms).
info!("Audio WS: per-rig request for remote={}", remote);
let deadline = Instant::now() + Duration::from_secs(3); let deadline = Instant::now() + Duration::from_secs(3);
let (rx_sub, info_rx) = loop { let (rx_sub, info_rx) = loop {
let has_audio = context.rig_audio_subscribe(remote).is_some();
let has_info = context.rig_audio_info_rx(remote).is_some();
info!("Audio WS: remote={} has_audio={} has_info={}", remote, has_audio, has_info);
if let (Some(rx), Some(info_rx)) = ( if let (Some(rx), Some(info_rx)) = (
context.rig_audio_subscribe(remote), context.rig_audio_subscribe(remote),
context.rig_audio_info_rx(remote), context.rig_audio_info_rx(remote),
) { ) {
let current = info_rx.borrow().clone();
info!("Audio WS: remote={} info_rx current value is_some={}", remote, current.is_some());
break (rx, info_rx); break (rx, info_rx);
} }
if Instant::now() >= deadline { if Instant::now() >= deadline {
info!("Audio WS: timeout waiting for rig {}", remote);
return Ok( return Ok(
HttpResponse::NotFound().body(format!("audio not available for rig {remote}")) HttpResponse::NotFound().body(format!("audio not available for rig {remote}"))
); );
@@ -563,11 +570,15 @@ pub async fn audio_ws(
let (response, mut session, mut msg_stream) = actix_ws::handle(&req, body)?; let (response, mut session, mut msg_stream) = actix_ws::handle(&req, body)?;
actix_web::rt::spawn(async move { actix_web::rt::spawn(async move {
info!("Audio WS: session started, waiting for stream info");
let mut current_info = loop { let mut current_info = loop {
if let Some(info) = info_rx.borrow().clone() { if let Some(info) = info_rx.borrow().clone() {
info!("Audio WS: got stream info: {}Hz {}ch", info.sample_rate, info.channels);
break info; break info;
} }
info!("Audio WS: info_rx is None, waiting for changed()");
if info_rx.changed().await.is_err() { if info_rx.changed().await.is_err() {
info!("Audio WS: info_rx sender dropped, closing");
let _ = session.close(None).await; let _ = session.close(None).await;
return; return;
} }
@@ -580,7 +591,9 @@ pub async fn audio_ws(
return; return;
} }
}; };
info!("Audio WS: sending stream info JSON to browser");
if session.text(info_json).await.is_err() { if session.text(info_json).await.is_err() {
info!("Audio WS: failed to send stream info, closing");
return; return;
} }