mod.rs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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<dyn 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. #[cfg(feature = "gstreamer-backend")]
  30. mod gstreamer;
  31. #[cfg(feature = "gstreamer-backend")]
  32. use self::gstreamer::GstreamerSink;
  33. #[cfg(feature = "rodio-backend")]
  34. mod rodio;
  35. #[cfg(feature = "rodio-backend")]
  36. use self::rodio::RodioSink;
  37. #[cfg(feature = "sdl-backend")]
  38. mod sdl;
  39. #[cfg(feature = "sdl-backend")]
  40. use self::sdl::SdlSink;
  41. mod pipe;
  42. use self::pipe::StdoutSink;
  43. mod subprocess;
  44. use self::subprocess::SubprocessSink;
  45. pub const BACKENDS: &'static [(&'static str, fn(Option<String>) -> Box<dyn Sink>)] = &[
  46. #[cfg(feature = "alsa-backend")]
  47. ("alsa", mk_sink::<AlsaSink>),
  48. #[cfg(feature = "portaudio-backend")]
  49. ("portaudio", mk_sink::<PortAudioSink>),
  50. #[cfg(feature = "pulseaudio-backend")]
  51. ("pulseaudio", mk_sink::<PulseAudioSink>),
  52. #[cfg(feature = "jackaudio-backend")]
  53. ("jackaudio", mk_sink::<JackSink>),
  54. #[cfg(feature = "gstreamer-backend")]
  55. ("gstreamer", mk_sink::<GstreamerSink>),
  56. #[cfg(feature = "rodio-backend")]
  57. ("rodio", mk_sink::<RodioSink>),
  58. #[cfg(feature = "sdl-backend")]
  59. ("sdl", mk_sink::<SdlSink>),
  60. ("pipe", mk_sink::<StdoutSink>),
  61. ("subprocess", mk_sink::<SubprocessSink>),
  62. ];
  63. pub fn find(name: Option<String>) -> Option<fn(Option<String>) -> Box<dyn Sink>> {
  64. if let Some(name) = name {
  65. BACKENDS
  66. .iter()
  67. .find(|backend| name == backend.0)
  68. .map(|backend| backend.1)
  69. } else {
  70. Some(
  71. BACKENDS
  72. .first()
  73. .expect("No backends were enabled at build time")
  74. .1,
  75. )
  76. }
  77. }