audio_sink.rs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. use std::io;
  2. pub trait Sink {
  3. fn start(&self) -> io::Result<()>;
  4. fn stop(&self) -> io::Result<()>;
  5. fn write(&self, data: &[i16]) -> io::Result<()>;
  6. }
  7. mod portaudio_sink {
  8. use audio_sink::Sink;
  9. use std::io;
  10. use portaudio;
  11. pub struct PortAudioSink<'a>(portaudio::stream::Stream<'a, i16, i16>);
  12. impl <'a> PortAudioSink<'a> {
  13. pub fn open() -> PortAudioSink<'a> {
  14. portaudio::initialize().unwrap();
  15. let stream = portaudio::stream::Stream::open_default(
  16. 0, 2, 44100.0,
  17. portaudio::stream::FRAMES_PER_BUFFER_UNSPECIFIED,
  18. None
  19. ).unwrap();
  20. PortAudioSink(stream)
  21. }
  22. }
  23. impl <'a> Sink for PortAudioSink<'a> {
  24. fn start(&self) -> io::Result<()> {
  25. self.0.start().unwrap();
  26. Ok(())
  27. }
  28. fn stop(&self) -> io::Result<()> {
  29. self.0.stop().unwrap();
  30. Ok(())
  31. }
  32. fn write(&self, data: &[i16]) -> io::Result<()> {
  33. match self.0.write(&data) {
  34. Ok(_) => (),
  35. Err(portaudio::PaError::OutputUnderflowed) => eprintln!("Underflow"),
  36. Err(e) => panic!("PA Error {}", e),
  37. };
  38. Ok(())
  39. }
  40. }
  41. impl <'a> Drop for PortAudioSink<'a> {
  42. fn drop(&mut self) {
  43. portaudio::terminate().unwrap();
  44. }
  45. }
  46. }
  47. pub type DefaultSink = portaudio_sink::PortAudioSink<'static>;