From a9eef767c063578f7daf7fff5b240fe7fb881a03 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 3 Jan 2026 20:45:02 +0000 Subject: [PATCH] fix: Improve TUI status display and add diagnostic logging - Add logging for UpdateEffects message reception to debug effects not updating - Fix network panel to distinguish browser connection from P2P room status: - Shows "Browser: Connected/Disconnected" for native bridge connection - Shows "Room: Standby (no room)" when connected but not in a P2P room - Mini sidebar shows "Standby" in yellow instead of confusing "Disconnected" - Add is_monitoring() method to audio engine for diagnostics - Enhanced diagnostic logging shows monitoring state and actual level values to help debug output levels not showing --- native-bridge/src/audio/engine.rs | 4 +++ native-bridge/src/protocol/server.rs | 17 +++++++++-- native-bridge/src/tui/ui.rs | 42 ++++++++++++++++++---------- 3 files changed, 47 insertions(+), 16 deletions(-) diff --git a/native-bridge/src/audio/engine.rs b/native-bridge/src/audio/engine.rs index 3f04769c..8e212b28 100644 --- a/native-bridge/src/audio/engine.rs +++ b/native-bridge/src/audio/engine.rs @@ -350,6 +350,10 @@ impl AudioEngine { .store(volume.to_bits(), Ordering::SeqCst); } + pub fn is_monitoring(&self) -> bool { + self.is_monitoring.load(Ordering::Relaxed) + } + // === Track State === /// Update track state with partial update - only fields that are Some will be changed diff --git a/native-bridge/src/protocol/server.rs b/native-bridge/src/protocol/server.rs index fef5db0e..b4bbb672 100644 --- a/native-bridge/src/protocol/server.rs +++ b/native-bridge/src/protocol/server.rs @@ -272,9 +272,17 @@ impl BridgeServer { ); } - info!("[Server] Diagnostic: loop={}, empty_reads={}, cbs=({},{}), buffer={}% ({}/{}), healthy={}", + // Get monitoring state for diagnostics + let app = self.state.lock().await; + let levels = app.audio_engine.get_levels(); + let is_monitoring = app.audio_engine.is_monitoring(); + drop(app); + + info!("[Server] Diagnostic: loop={}, empty_reads={}, cbs=({},{}), buffer={}% healthy={}, mon={}, in={:.3}/{:.3} out={:.3}/{:.3}", loop_counter, empty_read_counter, input_cbs, output_cbs, - buffer_pct, buffer_used, buffer_capacity, healthy); + buffer_pct, healthy, is_monitoring, + levels.input_level_l, levels.input_level_r, + levels.output_level_l, levels.output_level_r); last_diagnostic = Instant::now(); } @@ -541,6 +549,11 @@ impl BridgeServer { } BrowserMessage::UpdateEffects { effects, .. } => { + info!("UpdateEffects received: {} effects configured", + [effects.wah.enabled, effects.overdrive.enabled, effects.distortion.enabled, + effects.amp.enabled, effects.compressor.enabled, effects.eq.enabled, + effects.reverb.enabled, effects.delay.enabled, effects.chorus.enabled] + .iter().filter(|&&e| e).count()); let app = self.state.lock().await; app.audio_engine.update_effects(effects.clone()); diff --git a/native-bridge/src/tui/ui.rs b/native-bridge/src/tui/ui.rs index 2cfab152..4648ec22 100644 --- a/native-bridge/src/tui/ui.rs +++ b/native-bridge/src/tui/ui.rs @@ -358,20 +358,31 @@ fn draw_network_panel(f: &mut Frame, app: &App, area: Rect) { ]) .split(inner); - // Connection info - let mode_color = match app.network_mode { - NetworkMode::Disconnected => Color::Red, - NetworkMode::Connecting => Color::Yellow, - NetworkMode::P2P => Color::Green, - NetworkMode::Relay => Color::Blue, - NetworkMode::Hybrid => Color::Cyan, + // Connection info - distinguish browser connection from P2P room status + let (mode_text, mode_color) = if app.network_connected { + match app.network_mode { + NetworkMode::Disconnected => ("Standby (no room)".to_string(), Color::Yellow), + NetworkMode::Connecting => ("Connecting...".to_string(), Color::Yellow), + NetworkMode::P2P => ("P2P Direct".to_string(), Color::Green), + NetworkMode::Relay => ("Relay Server".to_string(), Color::Blue), + NetworkMode::Hybrid => ("Hybrid P2P+Relay".to_string(), Color::Cyan), + } + } else { + ("Offline".to_string(), Color::Red) }; let conn_info = Paragraph::new(vec![ Line::from(vec![ - Span::raw("Mode: "), + Span::raw("Browser: "), Span::styled( - format!("{}", app.network_mode), + if app.network_connected { "Connected" } else { "Disconnected" }, + Style::default().fg(if app.network_connected { Color::Green } else { Color::Red }).add_modifier(Modifier::BOLD), + ), + ]), + Line::from(vec![ + Span::raw("Room: "), + Span::styled( + mode_text, Style::default().fg(mode_color).add_modifier(Modifier::BOLD), ), ]), @@ -571,16 +582,19 @@ fn draw_sidebar(f: &mut Frame, app: &App, area: Rect) { .block(Block::default().title("Meters").borders(Borders::TOP)); f.render_widget(levels, chunks[0]); - // Mini network - let net_status = if app.network_connected { - format!("{} ({})", app.network_mode, app.peer_count) + // Mini network - show clearer status + let (net_status, net_color) = if app.network_connected { + match app.network_mode { + NetworkMode::Disconnected => ("Standby".to_string(), Color::Yellow), // Browser connected, no room + _ => (format!("{} ({})", app.network_mode, app.peer_count), Color::Green), + } } else { - "Offline".to_string() + ("Offline".to_string(), Color::Red) }; let network = Paragraph::new(vec![ Line::from(Span::styled( net_status, - Style::default().fg(if app.network_connected { Color::Green } else { Color::Red }), + Style::default().fg(net_color), )), Line::from(vec![ Span::raw("RTT: "),