From b4ad4bf93e1ff7d9e78092f904d62d64d34a201a Mon Sep 17 00:00:00 2001 From: Julian Ospald Date: Wed, 12 Jul 2017 16:26:41 +0200 Subject: [PATCH] Fix some TODOs --- src/alsa_card.rs | 5 ----- src/audio.rs | 20 +++++++++++++++----- src/prefs.rs | 12 ++++++------ src/support_audio.rs | 1 + src/ui_prefs_dialog.rs | 26 +++++++++++++++----------- src/ui_tray_icon.rs | 6 +++--- 6 files changed, 40 insertions(+), 30 deletions(-) diff --git a/src/alsa_card.rs b/src/alsa_card.rs index 81c0b8a22..9e3e47216 100644 --- a/src/alsa_card.rs +++ b/src/alsa_card.rs @@ -92,9 +92,6 @@ impl AlsaCard { cb: cb, }); - /* TODO: callback is registered here, which must be unregistered - * when the card is destroyed!! - * poll descriptors must be unwatched too */ let watch_ids = AlsaCard::watch_poll_descriptors(vec_pollfd, acard.as_ref()); acard.watch_ids.set(watch_ids); @@ -199,7 +196,6 @@ impl AlsaCard { } -// TODO: test that this is actually triggered when switching cards impl Drop for AlsaCard { // call Box::new(x), transmute the Box into a raw pointer, and then // std::mem::forget @@ -258,7 +254,6 @@ extern "C" fn watch_cb(chan: *mut glib_sys::GIOChannel, debug!("G_IO_STATUS_AGAIN"); continue; } - // TODO: handle these failure cases glib_sys::G_IO_STATUS_NORMAL => { error!("Alsa failed to clear the channel"); cb(AlsaEvent::AlsaCardError); diff --git a/src/audio.rs b/src/audio.rs index b5709b905..77eb615b5 100644 --- a/src/audio.rs +++ b/src/audio.rs @@ -181,6 +181,21 @@ impl Audio { *rc = glib::get_monotonic_time(); } + let alsa_vol = percent_to_vol(new_vol, + self.acard.borrow().get_volume_range(), + dir)?; + + /* only invoke handlers etc. if volume did actually change */ + { + let old_alsa_vol = percent_to_vol(self.vol()?, + self.acard.borrow().get_volume_range(), + dir)?; + + if old_alsa_vol == alsa_vol { + return Ok(()); + } + } + /* auto-unmute */ if self.has_mute() && self.get_mute()? { self.set_mute(false, user)?; @@ -198,14 +213,10 @@ impl Audio { new_vol, user); - let alsa_vol = percent_to_vol(new_vol, - self.acard.borrow().get_volume_range(), - dir)?; self.acard .borrow() .set_vol(alsa_vol)?; - // TODO: only invoke handlers if volume did not change invoke_handlers(&self.handlers.borrow(), AudioSignal::ValuesChanged, user); @@ -313,7 +324,6 @@ fn on_alsa_event(last_action_timestamp: &mut i64, /* external change */ match alsa_event { - // TODO: invoke handlers with AudioUserUnknown AlsaEvent::AlsaCardError => { invoke_handlers(handlers, self::AudioSignal::CardError, diff --git a/src/prefs.rs b/src/prefs.rs index a345cf1c9..b8b85a6c4 100644 --- a/src/prefs.rs +++ b/src/prefs.rs @@ -101,17 +101,17 @@ impl Default for ViewPrefs { #[derive(Deserialize, Debug, Serialize)] #[serde(default)] pub struct VolColor { - pub red: u8, - pub green: u8, - pub blue: u8, + pub red: f64, + pub green: f64, + pub blue: f64, } impl Default for VolColor { fn default() -> VolColor { return VolColor { - red: 245, - green: 180, - blue: 0, + red: 0.960784313725, + green: 0.705882352941, + blue: 0.0, }; } } diff --git a/src/support_audio.rs b/src/support_audio.rs index 9458b75b3..812912195 100644 --- a/src/support_audio.rs +++ b/src/support_audio.rs @@ -3,6 +3,7 @@ use errors::*; use prefs::*; +#[derive(Clone, Copy, Debug)] pub enum VolDir { Up, Down, diff --git a/src/ui_prefs_dialog.rs b/src/ui_prefs_dialog.rs index 14f5d2fcf..27a2e3f51 100644 --- a/src/ui_prefs_dialog.rs +++ b/src/ui_prefs_dialog.rs @@ -111,11 +111,10 @@ impl PrefsDialog { self.vol_meter_pos_spin.set_value(prefs.view_prefs.vol_meter_offset as f64); - // TODO don't convert like that let rgba = gdk::RGBA { - red: prefs.view_prefs.vol_meter_color.red as f64 / 255.0, - green: prefs.view_prefs.vol_meter_color.green as f64 / 255.0, - blue: prefs.view_prefs.vol_meter_color.blue as f64 / 255.0, + red: prefs.view_prefs.vol_meter_color.red, + green: prefs.view_prefs.vol_meter_color.green, + blue: prefs.view_prefs.vol_meter_color.blue, alpha: 1.0, }; self.vol_meter_color_button.set_rgba(&rgba); @@ -162,22 +161,27 @@ impl PrefsDialog { fn to_prefs(&self) -> Prefs { - // TODO: remove duplication with default instance + let card = self.card_combo.get_active_text(); + let channel = self.chan_combo.get_active_text(); + + if card.is_none() || channel.is_none() { + return Prefs::default(); + } + let device_prefs = DevicePrefs { card: self.card_combo .get_active_text() - .unwrap_or(String::from("(default)")), + .unwrap(), channel: self.chan_combo .get_active_text() - .unwrap_or(String::from("Master")), + .unwrap(), }; - // TODO save raw values? let vol_meter_color = VolColor { - red: (self.vol_meter_color_button.get_rgba().red * 255.0) as u8, - green: (self.vol_meter_color_button.get_rgba().green * 255.0) as u8, - blue: (self.vol_meter_color_button.get_rgba().blue * 255.0) as u8, + red: (self.vol_meter_color_button.get_rgba().red), + green: (self.vol_meter_color_button.get_rgba().green), + blue: (self.vol_meter_color_button.get_rgba().blue), }; let view_prefs = ViewPrefs { diff --git a/src/ui_tray_icon.rs b/src/ui_tray_icon.rs index 29f2506fd..bdebe5ce4 100644 --- a/src/ui_tray_icon.rs +++ b/src/ui_tray_icon.rs @@ -159,9 +159,9 @@ pub struct VolMeter { impl VolMeter { fn new(prefs: &Prefs) -> VolMeter { return VolMeter { - red: prefs.view_prefs.vol_meter_color.red, - green: prefs.view_prefs.vol_meter_color.green, - blue: prefs.view_prefs.vol_meter_color.blue, + red: (prefs.view_prefs.vol_meter_color.red * 255.0) as u8, + green: (prefs.view_prefs.vol_meter_color.green * 255.0) as u8, + blue: (prefs.view_prefs.vol_meter_color.blue * 255.0) as u8, x_offset_pct: prefs.view_prefs.vol_meter_offset as i64, y_offset_pct: 10, /* dynamic */