pub trait Mixer : Send { fn open() -> Self where Self: Sized; fn start(&self); fn stop(&self); fn set_volume(&self, volume: u16); fn volume(&self) -> u16; fn get_audio_filter(&self) -> Option> { None } } pub trait AudioFilter { fn modify_stream(&self, data: &mut [i16]); } pub mod softmixer; use self::softmixer::SoftMixer; fn mk_sink() -> Box { Box::new(M::open()) } pub fn find>(name: Option) -> Option Box> { match name.as_ref().map(AsRef::as_ref) { None | Some("softvol") => Some(mk_sink::), _ => None, } }