summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Worthe <justin.worthe@gmail.com>2016-10-23 14:01:46 +0200
committerJustin Worthe <justin.worthe@gmail.com>2016-10-23 14:01:46 +0200
commit3b264ac05a532828e3ce8c035249903ca0a51ecd (patch)
treef08407e9a56bd406a6753bbb51f29c40f20fdfc3
parent605095f3522bb2111de8dd3b9b2b9474549d9572 (diff)
Changed gui to use xml
-rw-r--r--Cargo.lock1
-rw-r--r--Cargo.toml6
-rw-r--r--src/audio.rs6
-rw-r--r--src/gui.rs69
-rw-r--r--src/lib.rs1
5 files changed, 62 insertions, 21 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 64f2372..4707988 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -3,6 +3,7 @@ name = "musician_training"
version = "0.1.0"
dependencies = [
"dft 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "gdk 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
"gtk 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"portaudio 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
]
diff --git a/Cargo.toml b/Cargo.toml
index 7b65fb2..0830062 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -6,4 +6,8 @@ authors = ["Justin Worthe <justin.worthe@gmail.com>"]
[dependencies]
portaudio = "0.6.4"
dft = "0.4.3"
-gtk = "0.1.0"
+gdk = "0.5.0"
+
+[dependencies.gtk]
+version = "0.1.0"
+features = ["v3_10"] \ No newline at end of file
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");
}
diff --git a/src/gui.rs b/src/gui.rs
index de8a322..bae29c2 100644
--- a/src/gui.rs
+++ b/src/gui.rs
@@ -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: &gtk::ComboBoxText, microphones: Vec<(u32, String)>) {
+ for (index, name) in microphones {
+ dropdown.append(Some(format!("{}", index).as_ref()), name.as_ref());
+ }
}
diff --git a/src/lib.rs b/src/lib.rs
index 81da674..b361502 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,4 +1,5 @@
extern crate gtk;
+extern crate gdk;
extern crate portaudio;
pub mod transforms;