summaryrefslogtreecommitdiff
path: root/src/gui.rs
diff options
context:
space:
mode:
authorJustin Worthe <justin.worthe@gmail.com>2016-11-05 15:56:24 +0200
committerJustin Worthe <justin.worthe@gmail.com>2016-11-05 15:56:24 +0200
commit75c9880d1a7bb7e54996743989374a45d5a26e49 (patch)
treeb0b3e14714c464a468c27bf8be42efceab0146f7 /src/gui.rs
parent420ad331332bce98f871f1c4ca2c0bea51688767 (diff)
Reordered passing in channels
Diffstat (limited to 'src/gui.rs')
-rw-r--r--src/gui.rs41
1 files changed, 28 insertions, 13 deletions
diff --git a/src/gui.rs b/src/gui.rs
index 444f21b..42e062d 100644
--- a/src/gui.rs
+++ b/src/gui.rs
@@ -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: &gtk::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(())
}