diff options
author | Justin Worthe <justin.worthe@gmail.com> | 2016-10-23 14:01:46 +0200 |
---|---|---|
committer | Justin Worthe <justin.worthe@gmail.com> | 2016-10-23 14:01:46 +0200 |
commit | 3b264ac05a532828e3ce8c035249903ca0a51ecd (patch) | |
tree | f08407e9a56bd406a6753bbb51f29c40f20fdfc3 /src | |
parent | 605095f3522bb2111de8dd3b9b2b9474549d9572 (diff) |
Changed gui to use xml
Diffstat (limited to 'src')
-rw-r--r-- | src/audio.rs | 6 | ||||
-rw-r--r-- | src/gui.rs | 69 | ||||
-rw-r--r-- | src/lib.rs | 1 |
3 files changed, 56 insertions, 20 deletions
diff --git a/src/audio.rs b/src/audio.rs index df4a933..8f23bed 100644 --- a/src/audio.rs +++ b/src/audio.rs @@ -38,7 +38,7 @@ fn get_device_list_returns_devices() { pub struct OpenRecordingChannel<'a> { - receiver: Receiver<Vec<f64>>, + receiver: Receiver<Vec<f32>>, stream: pa::Stream<'a, pa::NonBlocking, pa::Input<f32>> } @@ -72,7 +72,7 @@ pub fn start_listening<'a>(pa: &'a pa::PortAudio, device_index: u32) -> Result<O // This callback A callback to pass to the non-blocking stream. let callback = move |pa::InputStreamCallbackArgs { buffer, .. }| { - sender.send(buffer.iter().map(|x| *x as f64).collect()).ok(); + sender.send(buffer.iter().cloned().collect()).ok(); pa::Continue }; @@ -90,7 +90,7 @@ fn start_listening_returns_successfully() { let pa = init().expect("Could not init portaudio"); let devices = get_device_list(&pa).expect("Getting devices had an error"); let device = devices.first().expect("Should have at least one device"); - let recording_channel = start_listening(&pa, device.0).expect("Error starting listening to first channel"); + start_listening(&pa, device.0).expect("Error starting listening to first channel"); } @@ -1,29 +1,64 @@ use gtk; use gtk::prelude::*; +const GUI_XML: &'static str = r#" +<interface> + <object class="GtkWindow" id="window"> + <property name="title">Rusty Microphone</property> + <child> + <object class="GtkComboBoxText" id="dropdown"> + </object> + </child> + </object> +</interface> +"#; + 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())); + try!(gtk::init().map_err(|_| "Failed to initialize GTK.")); - - // Create the main window. - let window = gtk::Window::new(gtk::WindowType::Toplevel); - window.set_title("Musician Training"); - - let pa = ::audio::init().expect("Could not init portaudio"); - let audio_devices = try!(::audio::get_device_list(&pa).map_err(|e| e.to_string())); - let dropdown = gtk::ComboBoxText::new(); - for (index, name) in audio_devices { - dropdown.append(Some(format!("{}", index).as_ref()), name.as_ref()); - } - window.add(&dropdown); - window.set_default_size(300, 300); - window.show_all(); + 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'") + ); + dropdown.connect_changed(|ref dropdown| { + println!("{}", dropdown.get_active_id().unwrap()); + //This callback can now mutate state on the same level as our + //other logic to get the list of microphones + }); + + gtk::main(); + Ok(()) +} +fn create_window(microphones: Vec<(u32, String)>) -> Result<gtk::Builder, String> { + let gtk_builder = gtk::Builder::new_from_string(GUI_XML); + let window: gtk::Window = try!( + gtk_builder.get_object("window") + .ok_or("GUI does not contain an object with id 'window'") + ); + window.set_default_size(300, 300); window.connect_delete_event(|_, _| { gtk::main_quit(); - gtk::prelude::Inhibit(false) + Inhibit(false) }); + window.show_all(); - gtk::main(); - Ok(()) + let dropdown: gtk::ComboBoxText = try!( + gtk_builder.get_object("dropdown") + .ok_or("GUI does not contain an object with id 'dropdown'") + ); + set_dropdown_items(&dropdown, microphones); + + Ok(gtk_builder) +} + +fn set_dropdown_items(dropdown: >k::ComboBoxText, microphones: Vec<(u32, String)>) { + for (index, name) in microphones { + dropdown.append(Some(format!("{}", index).as_ref()), name.as_ref()); + } } @@ -1,4 +1,5 @@ extern crate gtk; +extern crate gdk; extern crate portaudio; pub mod transforms; |