From 5e6935121ae35064bcc8840c659272cf046c96a1 Mon Sep 17 00:00:00 2001 From: Brad Stein Date: Wed, 22 Apr 2026 16:18:46 -0300 Subject: [PATCH] fix(server): decode mic uplink before UAC sink --- server/src/audio.rs | 35 +++++++++++++++++++++++++++++++++++ server/src/main.rs | 4 ++-- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/server/src/audio.rs b/server/src/audio.rs index 3cc2af4..b76136f 100644 --- a/server/src/audio.rs +++ b/server/src/audio.rs @@ -510,6 +510,14 @@ impl Voice { .unwrap(); // dedicated AppSrc helpers exist and avoid the needless `?` + appsrc.set_caps(Some( + &gst::Caps::builder("audio/mpeg") + .field("mpegversion", 4i32) + .field("stream-format", "adts") + .field("rate", 48_000i32) + .field("channels", 2i32) + .build(), + )); appsrc.set_format(gst::Format::Time); appsrc.set_is_live(true); @@ -570,6 +578,33 @@ impl Voice { let _ = pad.link(&convert_sink); }); + let bus = pipeline.bus().context("voice pipeline bus")?; + std::thread::spawn(move || { + for msg in bus.iter_timed(gst::ClockTime::NONE) { + match msg.view() { + Error(e) => error!( + "🎤💥 voice pipeline from {:?}: {} ({})", + msg.src().map(gst::prelude::GstObjectExt::path_string), + e.error(), + e.debug().unwrap_or_default() + ), + Warning(w) => warn!( + "🎤⚠️ voice pipeline from {:?}: {} ({})", + msg.src().map(gst::prelude::GstObjectExt::path_string), + w.error(), + w.debug().unwrap_or_default() + ), + StateChanged(s) + if s.current() == gst::State::Playing + && msg.src().map(|s| s.is::()).unwrap_or(false) => + { + debug!("🎤 voice pipeline ▶️") + } + _ => {} + } + } + }); + // underrun ≠ error – just show a warning // let _id = alsa_sink.connect("underrun", false, |_| { // tracing::warn!("⚠️ USB playback underrun – host muted/not reading"); diff --git a/server/src/main.rs b/server/src/main.rs index 102589f..6079537 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -686,8 +686,8 @@ impl Relay for Handler { while let Some(pkt) = inbound.next().await.transpose()? { let n = CNT.fetch_add(1, std::sync::atomic::Ordering::Relaxed); - if n < 10 || n % 300 == 0 { - tracing::trace!(rpc_id, "🎤⬇ srv pkt#{n} {} bytes", pkt.data.len()); + if n < 5 || n % 3_000 == 0 { + tracing::info!(rpc_id, "🎤⬇ srv pkt#{n} {} bytes", pkt.data.len()); } sink.push(&pkt); }