1
0
Fork 0
mirror of https://github.com/librespot-org/librespot.git synced 2025-10-04 18:29:45 +02:00

Forgot to add some files in previous commit.

This commit is contained in:
Paul Lietar 2016-03-14 00:50:42 +00:00
parent 9274a6bfb3
commit 0973469120
2 changed files with 42 additions and 33 deletions

View file

@ -1,4 +1,3 @@
use portaudio;
use std::io; use std::io;
pub trait Sink { pub trait Sink {
@ -7,9 +6,13 @@ pub trait Sink {
fn write(&self, data: &[i16]) -> io::Result<()>; fn write(&self, data: &[i16]) -> io::Result<()>;
} }
pub struct PortAudioSink<'a>(portaudio::stream::Stream<'a, i16, i16>); mod portaudio_sink {
use audio_sink::Sink;
use std::io;
use portaudio;
pub struct PortAudioSink<'a>(portaudio::stream::Stream<'a, i16, i16>);
impl <'a> PortAudioSink<'a> { impl <'a> PortAudioSink<'a> {
pub fn open() -> PortAudioSink<'a> { pub fn open() -> PortAudioSink<'a> {
portaudio::initialize().unwrap(); portaudio::initialize().unwrap();
@ -21,9 +24,9 @@ impl <'a> PortAudioSink<'a> {
PortAudioSink(stream) PortAudioSink(stream)
} }
} }
impl <'a> Sink for PortAudioSink<'a> { impl <'a> Sink for PortAudioSink<'a> {
fn start(&self) -> io::Result<()> { fn start(&self) -> io::Result<()> {
self.0.start().unwrap(); self.0.start().unwrap();
Ok(()) Ok(())
@ -33,14 +36,24 @@ impl <'a> Sink for PortAudioSink<'a> {
Ok(()) Ok(())
} }
fn write(&self, data: &[i16]) -> io::Result<()> { fn write(&self, data: &[i16]) -> io::Result<()> {
self.0.write(&data).unwrap(); match self.0.write(&data) {
Ok(_) => (),
Err(portaudio::PaError::OutputUnderflowed) => eprintln!("Underflow"),
Err(e) => panic!("PA Error {}", e),
};
Ok(()) Ok(())
} }
} }
impl <'a> Drop for PortAudioSink<'a> { impl <'a> Drop for PortAudioSink<'a> {
fn drop(&mut self) { fn drop(&mut self) {
portaudio::terminate().unwrap(); portaudio::terminate().unwrap();
} }
}
} }
}
pub type DefaultSink = portaudio_sink::PortAudioSink<'static>;

View file

@ -107,14 +107,10 @@ fn main() {
let reusable_credentials = session.login(credentials).unwrap(); let reusable_credentials = session.login(credentials).unwrap();
reusable_credentials.save_to_file(credentials_path); reusable_credentials.save_to_file(credentials_path);
portaudio::initialize().unwrap();
let player = Player::new(session.clone(), || DefaultSink::open()); let player = Player::new(session.clone(), || DefaultSink::open());
let spirc = SpircManager::new(session.clone(), player); let spirc = SpircManager::new(session.clone(), player);
thread::spawn(move || spirc.run()); thread::spawn(move || spirc.run());
portaudio::terminate().unwrap();
loop { loop {
session.poll(); session.poll();
} }