diff --git a/src/main.rs b/src/main.rs index 7fbad5fe..72e0113c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -122,14 +122,13 @@ fn setup(args: &[String]) -> (Session, Player, Box) { let credentials = get_credentials(&session, matches.opt_str("username"), matches.opt_str("password")); session.login(credentials).unwrap(); - - - let mixer_name = matches.opt_str("mixer").unwrap_or("SoftMixer".to_owned()); - - let mixer = mixer::find(&mixer_name).unwrap(); + + let mixer_name = matches.opt_str("mixer"); + let mixer = mixer::find(mixer_name.as_ref()).expect("Invalid mixer"); + let audio_filter = mixer.get_audio_filter(); let device_name = matches.opt_str("device"); - let player = Player::new(session.clone(), mixer.get_stream_editor(), move || { + let player = Player::new(session.clone(), audio_filter, move || { (backend)(device_name.as_ref().map(AsRef::as_ref)) }); diff --git a/src/mixer/mod.rs b/src/mixer/mod.rs index bcd4564c..bc19bf8e 100644 --- a/src/mixer/mod.rs +++ b/src/mixer/mod.rs @@ -1,4 +1,5 @@ use std::borrow::Cow; +use self::softmixer::SoftMixer; pub mod softmixer; @@ -8,19 +9,17 @@ pub trait Mixer { fn stop(&self); fn set_volume(&self, volume: u16); fn volume(&self) -> u16; - fn get_stream_editor(&self) -> Option> - { + fn get_audio_filter(&self) -> Option> { None } } -pub trait StreamEditor { +pub trait AudioFilter { fn modify_stream<'a>(&self, data: &'a [i16]) -> Cow<'a, [i16]>; } -pub fn find(s: &str) -> Option> { - match s { - "SoftMixer" => Some(Box::new(softmixer::SoftMixer::new())), - _ => None, +pub fn find>(name: Option) -> Option> { + match name { + _ => Some(Box::new(SoftMixer::new())), } } \ No newline at end of file diff --git a/src/mixer/softmixer.rs b/src/mixer/softmixer.rs index 15333873..cbe7477f 100644 --- a/src/mixer/softmixer.rs +++ b/src/mixer/softmixer.rs @@ -1,5 +1,5 @@ use super::Mixer; -use super::StreamEditor; +use super::AudioFilter; use std::borrow::Cow; use std::sync::{Arc, RwLock}; @@ -28,9 +28,10 @@ impl Mixer for SoftMixer { fn set_volume(&self, volume: u16) { *self.volume.write().unwrap() = volume; } - fn get_stream_editor(&self) -> Option> { + fn get_audio_filter(&self) -> Option> { let vol = self.volume.clone(); - Some(Box::new(SoftVolumeApplier { get_volume: Box::new(move || *vol.read().unwrap() ) })) + let get_volume = Box::new(move || *vol.read().unwrap()); + Some(Box::new(SoftVolumeApplier { get_volume: get_volume })) } } @@ -38,7 +39,7 @@ struct SoftVolumeApplier { get_volume: Box u16 + Send> } -impl StreamEditor for SoftVolumeApplier { +impl AudioFilter for SoftVolumeApplier { fn modify_stream<'a>(&self, data: &'a [i16]) -> Cow<'a, [i16]> { let volume = (self.get_volume)(); if volume == 0xFFFF { diff --git a/src/player.rs b/src/player.rs index a41ab489..f03a592b 100644 --- a/src/player.rs +++ b/src/player.rs @@ -9,7 +9,7 @@ use audio_decrypt::AudioDecrypt; use audio_backend::Sink; use metadata::{FileFormat, Track, TrackRef}; use session::{Bitrate, Session}; -use mixer::StreamEditor; +use mixer::AudioFilter; use util::{self, ReadSeek, SpotifyId, Subfile}; pub use spirc::PlayStatus; @@ -72,7 +72,7 @@ enum PlayerCommand { } impl Player { - pub fn new(session: Session, stream_editor: Option>, sink_builder: F) -> Player + pub fn new(session: Session, stream_editor: Option>, sink_builder: F) -> Player where F: FnOnce() -> Box + Send + 'static { let (cmd_tx, cmd_rx) = mpsc::channel(); @@ -210,7 +210,7 @@ fn run_onstop(session: &Session) { } impl PlayerInternal { - fn run(self, mut sink: Box, stream_editor: Option>) { + fn run(self, mut sink: Box, stream_editor: Option>) { let mut decoder = None; loop {