lesavka/client/src/launcher/ui/media_device_bindings.rs

168 lines
7.8 KiB
Rust

{
{
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(&microphone_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());
});
}
}