From fc9c1d9fc2c7ed68efbcff2ce9fea8f53f740a9f Mon Sep 17 00:00:00 2001 From: iamdoubz <> Date: Wed, 1 Jul 2026 21:09:34 -0500 Subject: [PATCH] feat(audio): forward capture-event sink to recording://level/device (T7.3) start_recording now creates the EventSink alongside the existing frame channel and forwards Level/DeviceChanged onto a small fire-and-forget thread that emits "recording://level" and "recording://device". --- src-tauri/src/commands.rs | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src-tauri/src/commands.rs b/src-tauri/src/commands.rs index ae0cb54..a8f19fe 100644 --- a/src-tauri/src/commands.rs +++ b/src-tauri/src/commands.rs @@ -222,8 +222,44 @@ pub async fn start_recording( // Bounded so a slow/stalled transcription worker can never back up the capture thread. let (frame_tx, frame_rx) = std::sync::mpsc::sync_channel::>(8); + // Level updates + device-change notices (FR-CAP-5/6); low-volume, forwarded to events below. + let (event_tx, event_rx) = std::sync::mpsc::sync_channel::(8); let capture = WasapiCapture - .start(&wav_path, frame_tx) + .start(&wav_path, frame_tx, event_tx) + .map_err(|e| WaError::new("audio", e.to_string()))?; + + // Fire-and-forget: exits on its own once `event_tx` drops at capture stop; + // nothing downstream needs to join it. + let app_for_capture_events = app.clone(); + let meeting_id_for_capture_events = meeting_id.clone(); + std::thread::Builder::new() + .name("wa-capture-events".into()) + .spawn(move || { + for event in event_rx { + match event { + crate::audio::CaptureEvent::Level(level) => { + let _ = app_for_capture_events.emit( + "recording://level", + serde_json::json!({ + "meetingId": meeting_id_for_capture_events, + "rms": level.rms, + "peak": level.peak, + }), + ); + } + crate::audio::CaptureEvent::DeviceChanged { recovered, message } => { + let _ = app_for_capture_events.emit( + "recording://device", + serde_json::json!({ + "meetingId": meeting_id_for_capture_events, + "recovered": recovered, + "message": message, + }), + ); + } + } + } + }) .map_err(|e| WaError::new("audio", e.to_string()))?; let segments: Arc>> = Arc::new(StdMutex::new(Vec::new()));