portaudio.rs 1.1 KB

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