use super::{Open, Sink}; use std::io; use alsa::{PCM, Stream, Mode, Format, Access}; pub struct AlsaSink(Option, String); impl Open for AlsaSink { fn open(device: Option) -> AlsaSink { info!("Using alsa sink"); let name = device.unwrap_or("default".to_string()); AlsaSink(None, name) } } impl Sink for AlsaSink { fn start(&mut self) -> io::Result<()> { if self.0.is_some() { } else { match PCM::open(&*self.1, Stream::Playback, Mode::Blocking, Format::Signed16, Access::Interleaved, 2, 44100) { Ok(f) => self.0 = Some(f), Err(e) => { self.0 = None; error!("Alsa error PCM open {}", e); return Err(io::Error::new(io::ErrorKind::Other, "Alsa error: PCM open failed")); } } } Ok(()) } fn stop(&mut self) -> io::Result<()> { self.0 = None; Ok(()) } fn write(&mut self, data: &[i16]) -> io::Result<()> { self.0.as_mut().unwrap().write_interleaved(&data).unwrap(); Ok(()) } }