audio_core/
uniform_buf.rs

1use crate::buf::Buf;
2use crate::frame::Frame;
3
4/// A buffer which has a unifom channel size.
5pub trait UniformBuf: Buf {
6    /// The type the channel assumes when coerced into a reference.
7    type Frame<'this>: Frame<Sample = Self::Sample>
8    where
9        Self: 'this;
10
11    /// A borrowing iterator over the channel.
12    type IterFrames<'this>: Iterator<Item = Self::Frame<'this>>
13    where
14        Self: 'this;
15
16    /// Get a single frame at the given offset.
17    ///
18    /// # Examples
19    ///
20    /// ```
21    /// use audio::{Frame, UniformBuf};
22    ///
23    /// fn test<B>(buf: B)
24    /// where
25    ///     B: UniformBuf<Sample = u32>,
26    /// {
27    ///     let frame = buf.get_frame(0).unwrap();
28    ///     assert_eq!(frame.get(1), Some(5));
29    ///     assert_eq!(frame.iter().collect::<Vec<_>>(), [1, 5]);
30    ///
31    ///     let frame = buf.get_frame(2).unwrap();
32    ///     assert_eq!(frame.get(1), Some(7));
33    ///     assert_eq!(frame.iter().collect::<Vec<_>>(), [3, 7]);
34    ///
35    ///     assert!(buf.get_frame(4).is_none());
36    /// }
37    ///
38    /// test(audio::sequential![[1, 2, 3, 4], [5, 6, 7, 8]]);
39    /// test(audio::wrap::sequential([1, 2, 3, 4, 5, 6, 7, 8], 2));
40    ///
41    /// test(audio::interleaved![[1, 2, 3, 4], [5, 6, 7, 8]]);
42    /// test(audio::wrap::interleaved([1, 5, 2, 6, 3, 7, 4, 8], 2));
43    /// ```
44    fn get_frame(&self, frame: usize) -> Option<Self::Frame<'_>>;
45
46    /// Construct an iterator over all the frames in the audio buffer.
47    ///
48    /// # Examples
49    ///
50    /// ```
51    /// use audio::{Frame, UniformBuf};
52    ///
53    /// fn test<B>(buf: B)
54    /// where
55    ///     B: UniformBuf<Sample = u32>,
56    /// {
57    ///     let mut it = buf.iter_frames();
58    ///
59    ///     let frame = it.next().unwrap();
60    ///     assert_eq!(frame.get(1), Some(5));
61    ///     assert_eq!(frame.iter().collect::<Vec<_>>(), [1, 5]);
62    ///
63    ///     assert!(it.next().is_some());
64    ///
65    ///     let frame = it.next().unwrap();
66    ///     assert_eq!(frame.get(1), Some(7));
67    ///     assert_eq!(frame.iter().collect::<Vec<_>>(), [3, 7]);
68    ///
69    ///     assert!(it.next().is_some());
70    ///     assert!(it.next().is_none());
71    /// }
72    ///
73    /// test(audio::sequential![[1, 2, 3, 4], [5, 6, 7, 8]]);
74    /// test(audio::wrap::interleaved([1, 5, 2, 6, 3, 7, 4, 8], 2));
75    ///
76    /// test(audio::interleaved![[1, 2, 3, 4], [5, 6, 7, 8]]);
77    /// test(audio::wrap::sequential([1, 2, 3, 4, 5, 6, 7, 8], 2));
78    /// ```
79    fn iter_frames(&self) -> Self::IterFrames<'_>;
80}