{ { let state = Rc::clone(&state); let widgets = widgets.clone(); let child_proc = Rc::clone(&child_proc); let tests = Rc::clone(&tests); let microphone_combo = microphone_combo.clone(); let microphone_combo_read = microphone_combo.clone(); microphone_combo.connect_changed(move |_| { state .borrow_mut() .select_microphone(selected_combo_value(µphone_combo_read)); if tests.borrow_mut().is_running(DeviceTestKind::Microphone) { widgets.status_label.set_text( "Microphone selection changed. Restart Monitor Mic to audition the new input.", ); } refresh_launcher_ui(&widgets, &state.borrow(), child_proc.borrow().is_some()); refresh_test_buttons(&widgets, &mut tests.borrow_mut()); }); } { let state = Rc::clone(&state); let widgets = widgets.clone(); let child_proc = Rc::clone(&child_proc); let tests = Rc::clone(&tests); let speaker_combo = speaker_combo.clone(); let speaker_combo_read = speaker_combo.clone(); speaker_combo.connect_changed(move |_| { state .borrow_mut() .select_speaker(selected_combo_value(&speaker_combo_read)); let speaker_running = tests.borrow_mut().is_running(DeviceTestKind::Speaker); let microphone_running = tests.borrow_mut().is_running(DeviceTestKind::Microphone); if speaker_running || microphone_running { widgets.status_label.set_text( "Speaker selection changed. Restart the local audio tests to hear the new output.", ); } refresh_launcher_ui(&widgets, &state.borrow(), child_proc.borrow().is_some()); refresh_test_buttons(&widgets, &mut tests.borrow_mut()); }); } { let state = Rc::clone(&state); let widgets = widgets.clone(); let child_proc = Rc::clone(&child_proc); let audio_gain_scale = widgets.audio_gain_scale.clone(); audio_gain_scale.connect_value_changed(move |scale| { if !apply_audio_gain_change(scale, &state, &widgets, &child_proc) { let scale = scale.clone(); let state = Rc::clone(&state); let widgets = widgets.clone(); let child_proc = Rc::clone(&child_proc); glib::idle_add_local_once(move || { let _ = apply_audio_gain_change(&scale, &state, &widgets, &child_proc); }); } }); } { let state = Rc::clone(&state); let widgets = widgets.clone(); let child_proc = Rc::clone(&child_proc); let mic_gain_scale = widgets.mic_gain_scale.clone(); mic_gain_scale.connect_value_changed(move |scale| { if !apply_mic_gain_change(scale, &state, &widgets, &child_proc) { let scale = scale.clone(); let state = Rc::clone(&state); let widgets = widgets.clone(); let child_proc = Rc::clone(&child_proc); glib::idle_add_local_once(move || { let _ = apply_mic_gain_change(&scale, &state, &widgets, &child_proc); }); } }); } { let state = Rc::clone(&state); let widgets = widgets.clone(); let child_proc = Rc::clone(&child_proc); let tests = Rc::clone(&tests); let toggle = widgets.camera_channel_toggle.clone(); toggle.connect_toggled(move |toggle| { if let Ok(mut state) = state.try_borrow_mut() { state.set_camera_channel_enabled(toggle.is_active()); } if !toggle.is_active() { tests.borrow_mut().stop_camera_preview(); widgets .status_label .set_text("Camera stream disabled. Webcam preview stopped."); } if let Ok(state_snapshot) = state.try_borrow().map(|state| state.clone()) { refresh_launcher_ui( &widgets, &state_snapshot, child_proc.borrow().is_some(), ); } refresh_test_buttons(&widgets, &mut tests.borrow_mut()); }); } { let state = Rc::clone(&state); let widgets = widgets.clone(); let child_proc = Rc::clone(&child_proc); let tests = Rc::clone(&tests); let toggle = widgets.microphone_channel_toggle.clone(); toggle.connect_toggled(move |toggle| { if let Ok(mut state) = state.try_borrow_mut() { state.set_microphone_channel_enabled(toggle.is_active()); } if !toggle.is_active() { let mut tests = tests.borrow_mut(); tests.stop_microphone_monitor(); tests.stop_microphone_replay(); widgets .status_label .set_text("Mic stream disabled. Mic monitor and replay stopped."); } if let Ok(state_snapshot) = state.try_borrow().map(|state| state.clone()) { refresh_launcher_ui( &widgets, &state_snapshot, child_proc.borrow().is_some(), ); } refresh_test_buttons(&widgets, &mut tests.borrow_mut()); }); } { let state = Rc::clone(&state); let widgets = widgets.clone(); let child_proc = Rc::clone(&child_proc); let tests = Rc::clone(&tests); let toggle = widgets.audio_channel_toggle.clone(); toggle.connect_toggled(move |toggle| { if let Ok(mut state) = state.try_borrow_mut() { state.set_audio_channel_enabled(toggle.is_active()); } if !toggle.is_active() { let mut tests = tests.borrow_mut(); tests.stop_speaker_test(); tests.stop_microphone_replay(); widgets .status_label .set_text("Speaker stream disabled. Local audio playback stopped."); } if let Ok(state_snapshot) = state.try_borrow().map(|state| state.clone()) { refresh_launcher_ui( &widgets, &state_snapshot, child_proc.borrow().is_some(), ); } refresh_test_buttons(&widgets, &mut tests.borrow_mut()); }); } }