audio_device/alsa/
writer.rs1use crate::alsa::{Error, Pcm, Result};
2use crate::libc as c;
3use audio_core as core;
4use std::marker;
5
6pub struct Writer<'a, T> {
10 pcm: &'a mut Pcm,
11 channels: usize,
12 _marker: marker::PhantomData<T>,
13}
14
15impl<'a, T> Writer<'a, T> {
16 pub(super) unsafe fn new(pcm: &'a mut Pcm, channels: usize) -> Self {
23 Self {
24 pcm,
25 channels,
26 _marker: marker::PhantomData,
27 }
28 }
29
30 pub fn write_interleaved<B>(&mut self, mut buf: B) -> Result<()>
32 where
33 B: core::ReadBuf + core::ExactSizeBuf + core::AsInterleaved<T>,
34 {
35 if buf.channels() != self.channels {
36 return Err(Error::ChannelsMismatch {
37 actual: buf.channels(),
38 expected: self.channels,
39 });
40 }
41
42 let frames = buf.frames() as usize;
43
44 unsafe {
45 let ptr = buf.as_interleaved().as_ptr() as *const c::c_void;
46 let written = self.pcm.write_interleaved_unchecked(ptr, frames as u64)?;
47 buf.advance(written as usize);
48 }
49
50 Ok(())
51 }
52}