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