Initial commit
This commit is contained in:
50
src/audio.rs
Normal file
50
src/audio.rs
Normal file
@@ -0,0 +1,50 @@
|
||||
extern crate alsa;
|
||||
|
||||
use self::alsa::card::{Card};
|
||||
use self::alsa::mixer::{Mixer, Selem};
|
||||
|
||||
|
||||
|
||||
pub fn get_default_alsa_card() -> Card {
|
||||
let default_card: Card = Card::new(0);
|
||||
|
||||
return default_card;
|
||||
}
|
||||
|
||||
pub fn get_mixer(card: Card) -> Mixer {
|
||||
let mixer = Mixer::new(&format!("hw:{}", card.get_index()),
|
||||
false).unwrap();
|
||||
|
||||
for elem in mixer.iter() {
|
||||
let selem: Selem = Selem::new(elem).unwrap();
|
||||
println!("Elem: {}", selem.get_id().get_name().unwrap());
|
||||
}
|
||||
|
||||
return mixer;
|
||||
}
|
||||
|
||||
pub fn get_channels(mixer: &Mixer) -> alsa::mixer::Iter {
|
||||
return mixer.iter();
|
||||
}
|
||||
|
||||
pub fn get_channel_by_name<'a>(mixer: &'a Mixer, name: String) -> Option<Selem<'a>> {
|
||||
for elem in mixer.iter() {
|
||||
let m_selem = Selem::new(elem);
|
||||
let m_name = m_selem.and_then(|x| x.get_id().get_name().ok());
|
||||
let retval = m_name.map_or(false, |n| {
|
||||
return n == name;
|
||||
});
|
||||
|
||||
if retval {
|
||||
return Selem::new(elem);
|
||||
}
|
||||
}
|
||||
|
||||
return None;
|
||||
}
|
||||
|
||||
|
||||
// pub fn list_channels(card: Card, hctl: HCtl) -> [str] {
|
||||
|
||||
// }
|
||||
|
||||
71
src/main.rs
Normal file
71
src/main.rs
Normal file
@@ -0,0 +1,71 @@
|
||||
extern crate gtk;
|
||||
extern crate gdk;
|
||||
extern crate alsa;
|
||||
|
||||
// #[macro_use]
|
||||
// extern crate lazy_static;
|
||||
|
||||
// use gdk::EventButton;
|
||||
// use gdk::EventType;
|
||||
|
||||
|
||||
// use std::ops::Deref;
|
||||
|
||||
// use std::boxed::Box;
|
||||
// use std::rc::Rc;
|
||||
// use std::sync::Arc;
|
||||
|
||||
use gtk::prelude::*;
|
||||
|
||||
use alsa::mixer::SelemChannelId::*;
|
||||
|
||||
mod audio;
|
||||
|
||||
|
||||
fn main() {
|
||||
gtk::init().unwrap();
|
||||
|
||||
let tray_icon = gtk::StatusIcon::new_from_icon_name("pnmixer");
|
||||
|
||||
let glade_src = include_str!("../data/ui/popup-window-vertical.glade");
|
||||
let builder_popup = gtk::Builder::new_from_string(glade_src);
|
||||
|
||||
let popup_window: gtk::Window = builder_popup.get_object("popup_window").unwrap();
|
||||
|
||||
// let builder_prefs_dialog = Rc::new(Builder::new_from_file("data/ui/prefs-dialog.glade"));
|
||||
|
||||
// with_builder!(builder_popup_window,
|
||||
// tray_icon.connect_activate(move |_| {
|
||||
// let popup_window: gtk::Window = builder
|
||||
// .get_object("popup_window").unwrap();
|
||||
// popup_window.show_all();
|
||||
// })
|
||||
// );
|
||||
|
||||
// 2nd binding
|
||||
|
||||
tray_icon.connect_button_press_event(move |_, e| {
|
||||
let bt = e.as_ref().button;
|
||||
match bt {
|
||||
3 => {
|
||||
popup_window.show_all();
|
||||
return true;
|
||||
}
|
||||
_ => {
|
||||
println!("Blah");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
let alsa_card = audio::get_default_alsa_card();
|
||||
let mixer = audio::get_mixer(alsa_card);
|
||||
let channel = audio::get_channel_by_name(&mixer, String::from("Master")).unwrap();
|
||||
|
||||
println!("Range: {:?}", channel.get_playback_volume_range());
|
||||
println!("Channel: {}", channel.get_playback_volume(FrontCenter).unwrap());
|
||||
|
||||
tray_icon.set_visible(true);
|
||||
|
||||
gtk::main();
|
||||
}
|
||||
Reference in New Issue
Block a user