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}