1use crate::Error;
2
3#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
5#[non_exhaustive]
6pub enum Layout {
7 Mono,
9 #[default]
11 Stereo,
12 Discrete(u32),
14}
15
16impl Layout {
17 pub fn from_channels(channels: u32) -> Result<Self, Error> {
19 match channels {
20 0 => Err(Error::Unsupported(
21 "audio layout must contain at least one channel".into(),
22 )),
23 1 => Ok(Self::Mono),
24 2 => Ok(Self::Stereo),
25 channels => Ok(Self::Discrete(channels)),
26 }
27 }
28
29 pub fn channels(self) -> u32 {
31 match self {
32 Self::Mono => 1,
33 Self::Stereo => 2,
34 Self::Discrete(channels) => channels,
35 }
36 }
37
38 pub(crate) fn validate(self) -> Result<(), Error> {
39 if self.channels() == 0 {
40 return Err(Error::Unsupported(
41 "audio layout must contain at least one channel".into(),
42 ));
43 }
44 Ok(())
45 }
46}