123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- use super::{Open, Sink};
- use std::io;
- use portaudio;
- pub struct PortAudioSink<'a>(portaudio::stream::Stream<'a, i16, i16>);
- impl <'a> Open for PortAudioSink<'a> {
- fn open() -> PortAudioSink<'a> {
- portaudio::initialize().unwrap();
- let stream = portaudio::stream::Stream::open_default(
- 0, 2, 44100.0,
- portaudio::stream::FRAMES_PER_BUFFER_UNSPECIFIED,
- None
- ).unwrap();
- PortAudioSink(stream)
- }
- }
- impl <'a> Sink for PortAudioSink<'a> {
- fn start(&self) -> io::Result<()> {
- self.0.start().unwrap();
- Ok(())
- }
- fn stop(&self) -> io::Result<()> {
- self.0.stop().unwrap();
- Ok(())
- }
- fn write(&self, data: &[i16]) -> io::Result<()> {
- match self.0.write(&data) {
- Ok(_) => (),
- Err(portaudio::PaError::OutputUnderflowed) => error!("PortAudio write underflow"),
- Err(e) => panic!("PA Error {}", e),
- };
- Ok(())
- }
- }
- impl <'a> Drop for PortAudioSink<'a> {
- fn drop(&mut self) {
- portaudio::terminate().unwrap();
- }
- }
|