audio_device/alsa/
writer.rs

1use crate::alsa::{Error, Pcm, Result};
2use crate::libc as c;
3use audio_core as core;
4use std::marker;
5
6/// A interleaved type-checked PCM writer.
7///
8/// See [Pcm::writer].
9pub 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    /// Construct a new writer surrounding the given PCM.
17    ///
18    /// # Safety
19    ///
20    /// This constructor assumes that the caller has checked that type `T` is
21    /// appropriate for writing to the given PCM.
22    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    /// Write an interleaved buffer.
31    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}