xref: /webrtc/media/src/audio/buffer/info.rs (revision ffe74184)
1 use std::marker::PhantomData;
2 
3 use crate::audio::buffer::layout::{Deinterleaved, Interleaved};
4 
5 #[derive(Eq, PartialEq, Debug)]
6 pub struct BufferInfo<L> {
7     channels: usize,
8     frames: usize,
9     _phantom: PhantomData<L>,
10 }
11 
12 impl<L> BufferInfo<L> {
new(channels: usize, frames: usize) -> Self13     pub fn new(channels: usize, frames: usize) -> Self {
14         Self {
15             channels,
16             frames,
17             _phantom: PhantomData,
18         }
19     }
20 
21     /// Get a reference to the buffer info's channels.
channels(&self) -> usize22     pub fn channels(&self) -> usize {
23         self.channels
24     }
25 
26     /// Set the buffer info's channels.
set_channels(&mut self, channels: usize)27     pub fn set_channels(&mut self, channels: usize) {
28         self.channels = channels;
29     }
30 
31     /// Get a reference to the buffer info's frames.
frames(&self) -> usize32     pub fn frames(&self) -> usize {
33         self.frames
34     }
35 
36     /// Set the buffer info's frames.
set_frames(&mut self, frames: usize)37     pub fn set_frames(&mut self, frames: usize) {
38         self.frames = frames;
39     }
40 
samples(&self) -> usize41     pub fn samples(&self) -> usize {
42         self.channels * self.frames
43     }
44 }
45 
46 impl<L> Copy for BufferInfo<L> {}
47 
48 impl<L> Clone for BufferInfo<L> {
clone(&self) -> Self49     fn clone(&self) -> Self {
50         Self {
51             channels: self.channels,
52             frames: self.frames,
53             _phantom: PhantomData,
54         }
55     }
56 }
57 
58 macro_rules! impl_from_buffer_info {
59     ($in_layout:ty => $out_layout:ty) => {
60         impl From<BufferInfo<$in_layout>> for BufferInfo<$out_layout> {
61             fn from(info: BufferInfo<$in_layout>) -> Self {
62                 Self {
63                     channels: info.channels,
64                     frames: info.frames,
65                     _phantom: PhantomData,
66                 }
67             }
68         }
69     };
70 }
71 
72 impl_from_buffer_info!(Interleaved => Deinterleaved);
73 impl_from_buffer_info!(Deinterleaved => Interleaved);
74 
75 #[cfg(test)]
76 mod tests {
77     use super::*;
78 
79     #[test]
new()80     fn new() {
81         let channels = 3;
82         let frames = 100;
83 
84         let interleaved = BufferInfo::<Interleaved>::new(channels, frames);
85 
86         assert_eq!(interleaved.channels, channels);
87         assert_eq!(interleaved.frames, frames);
88 
89         let deinterleaved = BufferInfo::<Deinterleaved>::new(channels, frames);
90 
91         assert_eq!(deinterleaved.channels, channels);
92         assert_eq!(deinterleaved.frames, frames);
93     }
94 
95     #[test]
clone()96     fn clone() {
97         let channels = 3;
98         let frames = 100;
99 
100         let interleaved = BufferInfo::<Interleaved>::new(channels, frames);
101 
102         assert_eq!(interleaved.clone(), interleaved);
103 
104         let deinterleaved = BufferInfo::<Deinterleaved>::new(channels, frames);
105 
106         assert_eq!(deinterleaved.clone(), deinterleaved);
107     }
108 
109     #[test]
samples()110     fn samples() {
111         let channels = 3;
112         let frames = 100;
113 
114         let interleaved = BufferInfo::<Interleaved>::new(channels, frames);
115 
116         assert_eq!(interleaved.samples(), channels * frames);
117 
118         let deinterleaved = BufferInfo::<Deinterleaved>::new(channels, frames);
119 
120         assert_eq!(deinterleaved.samples(), channels * frames);
121     }
122 }
123