use crate::alsa::{Error, Pcm, Result};
use crate::libc as c;
use audio_core as core;
use std::marker;
pub struct Writer<'a, T> {
pcm: &'a mut Pcm,
channels: usize,
_marker: marker::PhantomData<T>,
}
impl<'a, T> Writer<'a, T> {
pub(super) unsafe fn new(pcm: &'a mut Pcm, channels: usize) -> Self {
Self {
pcm,
channels,
_marker: marker::PhantomData,
}
}
pub fn write_interleaved<B>(&mut self, mut buf: B) -> Result<()>
where
B: core::ReadBuf + core::ExactSizeBuf + core::AsInterleaved<T>,
{
if buf.channels() != self.channels {
return Err(Error::ChannelsMismatch {
actual: buf.channels(),
expected: self.channels,
});
}
let frames = buf.frames() as usize;
unsafe {
let ptr = buf.as_interleaved().as_ptr() as *const c::c_void;
let written = self.pcm.write_interleaved_unchecked(ptr, frames as u64)?;
buf.advance(written as usize);
}
Ok(())
}
}