pulseaudio.rs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. use super::{Open, Sink};
  2. use std::io;
  3. use libpulse_sys::*;
  4. use std::ptr::{null, null_mut};
  5. use std::mem::{transmute};
  6. use std::ffi::CString;
  7. pub struct PulseAudioSink(*mut pa_simple);
  8. impl Open for PulseAudioSink {
  9. fn open() -> PulseAudioSink {
  10. info!("Using PulseAudioSink");
  11. let ss = pa_sample_spec {
  12. format: PA_SAMPLE_S16LE,
  13. channels: 2, // stereo
  14. rate: 44100
  15. };
  16. let name = CString::new("librespot").unwrap();
  17. let description = CString::new("A spoty client library").unwrap();
  18. let s = unsafe {
  19. pa_simple_new(null(), // Use the default server.
  20. name.as_ptr(), // Our application's name.
  21. PA_STREAM_PLAYBACK,
  22. null(), // Use the default device.
  23. description.as_ptr(), // Description of our stream.
  24. &ss, // Our sample format.
  25. null(), // Use default channel map
  26. null(), // Use default buffering attributes.
  27. null_mut(), // Ignore error code.
  28. )
  29. };
  30. assert!(s != null_mut());
  31. PulseAudioSink(s)
  32. }
  33. }
  34. impl Sink for PulseAudioSink {
  35. fn start(&self) -> io::Result<()> {
  36. Ok(())
  37. }
  38. fn stop(&self) -> io::Result<()> {
  39. Ok(())
  40. }
  41. fn write(&self, data: &[i16]) -> io::Result<()> {
  42. unsafe {
  43. let ptr = transmute(data.as_ptr());
  44. let bytes = data.len() as usize * 2;
  45. pa_simple_write(self.0, ptr, bytes, null_mut());
  46. };
  47. Ok(())
  48. }
  49. }