diff options
author | Justin Worthe <justin.worthe@gmail.com> | 2016-11-05 15:56:24 +0200 |
---|---|---|
committer | Justin Worthe <justin.worthe@gmail.com> | 2016-11-05 15:56:24 +0200 |
commit | 75c9880d1a7bb7e54996743989374a45d5a26e49 (patch) | |
tree | b0b3e14714c464a468c27bf8be42efceab0146f7 /src/gui.rs | |
parent | 420ad331332bce98f871f1c4ca2c0bea51688767 (diff) |
Reordered passing in channels
Diffstat (limited to 'src/gui.rs')
-rw-r--r-- | src/gui.rs | 41 |
1 files changed, 28 insertions, 13 deletions
@@ -3,8 +3,11 @@ use gtk::prelude::*; use std::cell::RefCell; use portaudio as pa; use std::rc::Rc; +use std::sync::Arc; use std::io; use std::io::Write; +use std::thread; +use std::sync::mpsc::*; const GUI_XML: &'static str = r#" <interface> @@ -20,43 +23,55 @@ const GUI_XML: &'static str = r#" struct ApplicationState { pa: pa::PortAudio, - channel: Option<::audio::OpenRecordingChannel> + pa_stream: Option<pa::Stream<pa::NonBlocking, pa::Input<f32>>> } pub fn start_gui() -> Result<(), String> { let pa = try!(::audio::init().map_err(|e| e.to_string())); let microphones = try!(::audio::get_device_list(&pa).map_err(|e| e.to_string())); - + + let (mic_sender, mic_receiver) = channel(); let state = Rc::new(RefCell::new(ApplicationState { pa: pa, - channel: None + pa_stream: None })); try!(gtk::init().map_err(|_| "Failed to initialize GTK.")); let gtk_builder = try!(create_window(microphones)); - let dropdown: gtk::ComboBoxText = try!( - gtk_builder.get_object("dropdown") - .ok_or("GUI does not contain an object with id 'dropdown'") - ); { let state_for_dropdown = state.clone(); + + let dropdown: gtk::ComboBoxText = try!( + gtk_builder.get_object("dropdown").ok_or("GUI does not contain an object with id 'dropdown'") + ); dropdown.connect_changed(move |dropdown: >k::ComboBoxText| { - match state_for_dropdown.borrow_mut().channel { - Some(ref mut channel) => {channel.stream.stop().ok();}, + match state_for_dropdown.borrow_mut().pa_stream { + Some(ref mut stream) => {stream.stop().ok();}, _ => {} } - let selected_mic = dropdown.get_active_id().and_then(|id| id.parse().ok()).expect("Dropdown did not change to a valid value"); - let channel = ::audio::start_listening(&state_for_dropdown.borrow().pa, selected_mic).ok(); - if channel.is_none() { + let stream = ::audio::start_listening(&state_for_dropdown.borrow().pa, selected_mic, mic_sender.clone()).ok(); + if stream.is_none() { writeln!(io::stderr(), "Failed to open audio channel").ok(); } - state_for_dropdown.borrow_mut().channel = channel; + state_for_dropdown.borrow_mut().pa_stream = stream; }); } + let async_thread = thread::spawn(move || { + for samples in mic_receiver { + let frequency_domain = ::transforms::fft(samples, 44100.0); + + let max_frequency = frequency_domain.iter() + .fold(None as Option<::transforms::FrequencyBucket>, |max, next| + if max.is_none() || max.clone().unwrap().intensity < next.intensity { Some(next.clone()) } else { max } + ).unwrap().max_freq; + println!("{}Hz", max_frequency.floor()); + } + }); + gtk::main(); Ok(()) } |