diff --git a/tap_core/src/audio_source_thread.rs b/tap_core/src/audio_source_thread.rs index dd065f7..c7613b4 100644 --- a/tap_core/src/audio_source_thread.rs +++ b/tap_core/src/audio_source_thread.rs @@ -138,6 +138,7 @@ impl AudioSourceThread { } } else { error!("Channel closing, stopping threads"); + drop(stream); drop(sender); thread.join().unwrap(); return Ok(()); diff --git a/tap_gui/src/main.rs b/tap_gui/src/main.rs index 0df0fb5..840ce9d 100644 --- a/tap_gui/src/main.rs +++ b/tap_gui/src/main.rs @@ -2,7 +2,7 @@ use cpal::traits::{DeviceTrait, HostTrait}; use eframe::{App, Frame}; use egui::Ui; use env_logger::Env; -use log::{error, info}; +use log::error; use std::sync::mpsc::{Receiver, channel}; use std::thread; use std::thread::JoinHandle; @@ -36,12 +36,18 @@ pub struct Tap { host: cpal::Host, } +impl Default for Tap { + fn default() -> Self { + Self::new() + } +} + impl Tap { pub fn new() -> Self { Self { mode: Default::default(), device: "".to_string(), - denny_jack_host: "".to_string(), + denny_jack_host: "158.69.121.46:9999".to_string(), warning: "".to_string(), join_handle: None, channel: None, @@ -73,65 +79,79 @@ impl Tap { } impl App for Tap { - fn ui(&mut self, ui: &mut Ui, frame: &mut Frame) { - match self.mode { - State::Init => { - ui.label("Denny Jack Host"); - ui.text_edit_singleline(&mut self.denny_jack_host); - egui::containers::ComboBox::from_label("Device:") - .selected_text(&self.device) - .show_ui(ui, |ui| { - for device in self.host.devices().unwrap() { - ui.selectable_value( - &mut self.device, - device.id().unwrap().to_string(), - device.to_string(), - ); - } - }); + fn ui(&mut self, ui: &mut Ui, _frame: &mut Frame) { + let panel_frame = egui::containers::CentralPanel::default_margins(); - if ui.button("Connect").clicked() { - if self.device.is_empty() || self.denny_jack_host.is_empty() { - self.warning = "Enter connection details and try again".to_string(); - } else { - self.warning = "".to_string(); - self.mode = State::Connecting; + panel_frame.show(ui, |ui| { + ui.heading("Tap GUI"); + ui.add_space(4.0); + match self.mode { + State::Init => { + ui.label("Denny Jack Host"); + ui.text_edit_singleline(&mut self.denny_jack_host); + egui::containers::ComboBox::from_label("Device") + .selected_text(&self.device) + .show_ui(ui, |ui| { + for device in self.host.devices().unwrap() { + ui.selectable_value( + &mut self.device, + device.id().unwrap().to_string(), + device.to_string(), + ); + } + }); + + if ui.button("Connect").clicked() { + if self.device.is_empty() || self.denny_jack_host.is_empty() { + self.warning = "Enter connection details and try again".to_string(); + } else { + self.warning = "".to_string(); + self.mode = State::Connecting; + } + } + + if !self.warning.is_empty() { + ui.label(format!("Error: {}", self.warning)); } } + State::Connecting => { + ui.label("Connecting"); + let device = self.device.to_string(); + let host = self.denny_jack_host.to_string(); - if !self.warning.is_empty() { - ui.label(format!("Error: {}", &self.warning)); + let (sender, receiver) = channel(); + + let join = thread::spawn(move || Self::bg_threads(&device, &host, receiver)); + + self.join_handle = Some(join); + self.channel = Some(sender); + self.mode = State::Connected; + } + State::Connected => { + ui.label("Connected"); + + if self.join_handle.as_ref().unwrap().is_finished() { + let join = self.join_handle.take().unwrap(); + let err = join.join(); + error!("Thread joined early: {err:?}"); + + self.warning = "Disconnected...".to_string(); + + self.channel = None; + self.join_handle = None; + self.mode = State::Init; + } + + if ui.button("Disconnect").clicked() { + self.channel = None; + let handle = self.join_handle.take().unwrap(); + let _ = handle.join(); + self.join_handle = None; + self.mode = State::Init; + } } } - State::Connecting => { - ui.label("Connecting"); - let device = self.device.to_string(); - let host = self.denny_jack_host.to_string(); - - let (sender, receiver) = channel(); - - let join = thread::spawn(move || Self::bg_threads(&device, &host, receiver)); - - self.join_handle = Some(join); - self.channel = Some(sender); - self.mode = State::Connected; - } - State::Connected => { - ui.label("Connected"); - - if self.join_handle.as_ref().unwrap().is_finished() { - let join = self.join_handle.take().unwrap(); - let err = join.join(); - error!("Thread joined early: {err:?}"); - - self.warning = "Disconnected...".to_string(); - - self.channel = None; - self.join_handle = None; - self.mode = State::Init; - } - } - } + }); } } @@ -142,5 +162,5 @@ async fn main() -> Result<(), eframe::Error> { ..Default::default() }; - eframe::run_native("Tap", options, Box::new(|cc| Ok(Box::new(Tap::new())))) + eframe::run_native("Tap", options, Box::new(|_cc| Ok(Box::new(Tap::new())))) }