Selaa lähdekoodia

More `alsa` stragglers

ashthespy 6 vuotta sitten
vanhempi
commit
cc6c9b2dc4
3 muutettua tiedostoa jossa 18 lisäystä ja 15 poistoa
  1. 1 2
      playback/src/audio_backend/alsa.rs
  2. 8 6
      playback/src/mixer/alsamixer.rs
  3. 9 7
      src/main.rs

+ 1 - 2
playback/src/audio_backend/alsa.rs

@@ -2,7 +2,6 @@ use super::{Open, Sink};
 use alsa::device_name::HintIter;
 use alsa::pcm::{Access, Format, HwParams, PCM};
 use alsa::{Direction, Error, ValueOr};
-use std::env;
 use std::ffi::CString;
 use std::io;
 use std::process::exit;
@@ -15,7 +14,7 @@ fn list_outputs() {
         let i = HintIter::new(None, &*CString::new(*t).unwrap()).unwrap();
         for a in i {
             if let Some(Direction::Playback) = a.direction {
-                println!("{:#?}", a)
+                println!("{}\n\t{}", a.name.unwrap(), a.desc.unwrap());
             }
         }
     }

+ 8 - 6
playback/src/mixer/alsamixer.rs

@@ -14,25 +14,27 @@ impl AlsaMixer {
         let mixer = alsa::mixer::Mixer::new(&self.config.card, false)?;
         let sid = alsa::mixer::SelemId::new(&*self.config.mixer, self.config.index);
 
-        let selem = mixer.find_selem(&sid).expect("Couldn't find SelemId");
+        let selem = mixer
+            .find_selem(&sid)
+            .expect(format!("Couldn't find simple mixer control for {}", self.config.mixer).as_str());
         let (min, max) = selem.get_playback_volume_range();
-        let cur_vol = selem
-            .get_playback_volume(alsa::mixer::SelemChannelId::mono())
-            .expect("Couldn't get current volume");
         let range = (max - min) as f64;
 
         let new_vol: u16;
 
         if let Some(vol) = set_volume {
             let alsa_volume: i64 = ((vol as f64 / 0xFFFF as f64) * range) as i64 + min;
-            debug!("Mapping volume {:?} [u16] ->> alsa {:?} [i64]", vol, alsa_volume);
+            debug!("Mapping volume {:?} ->> alsa {:?}", vol, alsa_volume);
             selem
                 .set_playback_volume_all(alsa_volume)
                 .expect("Couldn't set alsa volume");
             new_vol = vol;
         } else {
+            let cur_vol = selem
+                .get_playback_volume(alsa::mixer::SelemChannelId::mono())
+                .expect("Couldn't get current volume");
             new_vol = (((cur_vol - min) as f64 / range) * 0xFFFF as f64) as u16;
-            debug!("Mapping volume {:?} [u16] <<- alsa {:?} [i64]", new_vol, cur_vol);
+            debug!("Mapping volume {:?} <<- alsa {:?}", new_vol, cur_vol);
         }
 
         Ok(new_vol)

+ 9 - 7
src/main.rs

@@ -140,10 +140,10 @@ fn setup(args: &[String]) -> Setup {
         .optopt(
             "",
             "device",
-            "Audio device to use. Use '?' to list options if using portaudio",
+            "Audio device to use. Use '?' to list options if using portaudio or alsa",
             "DEVICE",
         )
-        .optopt("", "mixer", "Mixer to use (Alsa or softmixer)", "MIXER")
+        .optopt("", "mixer", "Mixer to use (alsa or softmixer)", "MIXER")
         .optopt(
             "m",
             "mixer-name",
@@ -228,9 +228,12 @@ fn setup(args: &[String]) -> Setup {
     let mixer = mixer::find(mixer_name.as_ref()).expect("Invalid mixer");
 
     let mixer_config = MixerConfig {
-            card:  matches.opt_str("mixer-card").unwrap_or(String::from("default")),
-            mixer: matches.opt_str("mixer-name").unwrap_or(String::from("PCM")),
-            index: matches.opt_str("mixer-index").map(|index| index.parse::<u32>().unwrap()).unwrap_or(0),
+        card: matches.opt_str("mixer-card").unwrap_or(String::from("default")),
+        mixer: matches.opt_str("mixer-name").unwrap_or(String::from("PCM")),
+        index: matches
+            .opt_str("mixer-index")
+            .map(|index| index.parse::<u32>().unwrap())
+            .unwrap_or(0),
     };
 
     let use_audio_cache = !matches.opt_present("disable-audio-cache");
@@ -247,8 +250,7 @@ fn setup(args: &[String]) -> Setup {
                 panic!("Initial volume must be in the range 0-100");
             }
             (volume as i32 * 0xFFFF / 100) as u16
-        })
-        .or_else(|| cache.as_ref().and_then(Cache::volume))
+        }).or_else(|| cache.as_ref().and_then(Cache::volume))
         .unwrap_or(0x8000);
 
     let zeroconf_port = matches