use crate::{PcmBuf, PcmLayout, PcmSampleType, PcmSpec};
#[doc = crate::_tags!(audio)]
#[doc = crate::_doc_meta!{location("media/audio/pcm")}]
pub trait PcmStream {
type Error;
fn pcm_spec(&self) -> Option<PcmSpec>;
fn pcm_layout(&self) -> Option<PcmLayout>;
}
pub trait PcmDrain: PcmStream {
fn drain(&mut self) -> Result<(), Self::Error>;
}
#[doc = crate::_tags!(audio)]
#[doc = crate::_doc_meta!{location("media/audio/pcm")}]
pub trait PcmSink<T: PcmSampleType>: PcmStream {
fn write(&mut self, pcm: PcmBuf<T, &[T]>) -> Result<usize, Self::Error>;
fn write_all(&mut self, pcm: PcmBuf<T, &[T]>) -> Result<(), Self::Error>;
fn write_all_drain(&mut self, pcm: PcmBuf<T, &[T]>) -> Result<(), Self::Error>
where
Self: PcmDrain,
{
self.write_all(pcm)?;
self.drain()
}
}
#[doc = crate::_tags!(audio)]
#[doc = crate::_doc_meta!{location("media/audio/pcm")}]
pub trait PcmSinkPlanar<T: PcmSampleType>: PcmStream {
fn write_planar(&mut self, pcm: PcmBuf<T, &[&[T]]>) -> Result<usize, Self::Error>;
fn write_all_planar(&mut self, pcm: PcmBuf<T, &[&[T]]>) -> Result<(), Self::Error>;
fn write_all_planar_drain(&mut self, pcm: PcmBuf<T, &[&[T]]>) -> Result<(), Self::Error>
where
Self: PcmDrain,
{
self.write_all_planar(pcm)?;
self.drain()
}
}
#[doc = crate::_tags!(audio)]
#[doc = crate::_doc_meta!{location("media/audio/pcm")}]
pub trait PcmSource<T: PcmSampleType>: PcmStream {
fn read(&mut self, pcm: PcmBuf<T, &mut [T]>) -> Result<usize, Self::Error>;
fn read_all(&mut self, pcm: PcmBuf<T, &mut [T]>) -> Result<(), Self::Error>;
}
#[doc = crate::_tags!(audio)]
#[doc = crate::_doc_meta!{location("media/audio/pcm")}]
pub trait PcmSourcePlanar<T: PcmSampleType>: PcmStream {
fn read_planar(&mut self, pcm: PcmBuf<T, &mut [&mut [T]]>) -> Result<usize, Self::Error>;
fn read_all_planar(&mut self, pcm: PcmBuf<T, &mut [&mut [T]]>) -> Result<(), Self::Error>;
}