mod.rs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. use std::io;
  2. pub trait Open {
  3. fn open(Option<String>) -> Self;
  4. }
  5. pub trait Sink {
  6. fn start(&mut self) -> io::Result<()>;
  7. fn stop(&mut self) -> io::Result<()>;
  8. fn write(&mut self, data: &[i16]) -> io::Result<()>;
  9. }
  10. fn mk_sink<S: Sink + Open + 'static>(device: Option<String>) -> Box<Sink> {
  11. Box::new(S::open(device))
  12. }
  13. #[cfg(feature = "alsa-backend")]
  14. mod alsa;
  15. #[cfg(feature = "alsa-backend")]
  16. use self::alsa::AlsaSink;
  17. #[cfg(feature = "portaudio-backend")]
  18. mod portaudio;
  19. #[cfg(feature = "portaudio-backend")]
  20. use self::portaudio::PortAudioSink;
  21. #[cfg(feature = "pulseaudio-backend")]
  22. mod pulseaudio;
  23. #[cfg(feature = "pulseaudio-backend")]
  24. use self::pulseaudio::PulseAudioSink;
  25. #[cfg(feature = "jackaudio-backend")]
  26. mod jackaudio;
  27. #[cfg(feature = "jackaudio-backend")]
  28. use self::jackaudio::JackSink;
  29. mod pipe;
  30. use self::pipe::StdoutSink;
  31. pub const BACKENDS : &'static [
  32. (&'static str, fn(Option<String>) -> Box<Sink>)
  33. ] = &[
  34. #[cfg(feature = "alsa-backend")]
  35. ("alsa", mk_sink::<AlsaSink>),
  36. #[cfg(feature = "portaudio-backend")]
  37. ("portaudio", mk_sink::<PortAudioSink>),
  38. #[cfg(feature = "pulseaudio-backend")]
  39. ("pulseaudio", mk_sink::<PulseAudioSink>),
  40. #[cfg(feature = "jackaudio-backend")]
  41. ("jackaudio", mk_sink::<JackSink>),
  42. ("pipe", mk_sink::<StdoutSink>),
  43. ];
  44. pub fn find(name: Option<String>) -> Option<fn(Option<String>) -> Box<Sink>> {
  45. if let Some(name) = name {
  46. BACKENDS.iter().find(|backend| name == backend.0).map(|backend| backend.1)
  47. } else {
  48. Some(BACKENDS.first().expect("No backends were enabled at build time").1)
  49. }
  50. }