use std::pin::Pin;
use std::task::{Context, Poll};
use audio_samples::AudioSamples;
use futures_core::Stream;
use crate::traits::AudioStream;
pub struct AsyncAudioStream<S: AudioStream + Send> {
stream: S,
buffer: AudioSamples<'static, S::Sample>,
}
impl<S: AudioStream + Send> AsyncAudioStream<S> {
pub fn new(stream: S, buffer: AudioSamples<'static, S::Sample>) -> Self {
Self { stream, buffer }
}
pub fn buffer(&self) -> &AudioSamples<'static, S::Sample> {
&self.buffer
}
}
impl<S: AudioStream + Send + Unpin> Stream for AsyncAudioStream<S> {
type Item = Result<usize, S::Error>;
fn poll_next(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
let this = self.get_mut();
match this.stream.fill_chunk(&mut this.buffer) {
Ok(Some(n)) => Poll::Ready(Some(Ok(n))),
Ok(None) => Poll::Ready(None),
Err(e) => Poll::Ready(Some(Err(e))),
}
}
}