1use crate::alsa::Result;
2use crate::libc as c;
3use alsa_sys as alsa;
4use std::fmt;
5
6macro_rules! decl_enum {
7 (
8 $(#[doc = $doc:literal])*
9 #[repr($ty:ident)]
10 $vis:vis enum $name:ident {
11 $(
12 $(#[$m:meta])*
13 $a:ident = $b:ident
14 ),* $(,)?
15 }
16 ) => {
17 $(#[doc = $doc])*
18 #[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
19 #[non_exhaustive]
20 #[repr($ty)]
21 $vis enum $name {
22 $(
23 $(#[$m])*
24 #[allow(missing_docs)]
25 $a = alsa::$b,
26 )*
27 }
28
29 impl $name {
30 $vis fn from_value(value: $ty) -> Option<Self> {
32 Some(match value {
33 $(alsa::$b => Self::$a,)*
34 _ => return None,
35 })
36 }
37 }
38
39 impl fmt::Display for $name {
40 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
41 let id = match self {
42 $(Self::$a => stringify!($a),)*
43 };
44
45 f.write_str(id)
46 }
47 }
48 }
49}
50
51#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)]
54#[repr(i32)]
55pub enum Direction {
56 Smaller = -1,
58 Nearest = 0,
60 Greater = 1,
62}
63
64impl Direction {
65 pub(super) fn from_value(value: i32) -> Self {
66 match value {
67 -1 => Self::Smaller,
68 0 => Self::Nearest,
69 _ => Self::Greater,
70 }
71 }
72}
73
74decl_enum! {
75 #[repr(u32)]
77 pub enum State {
78 Open = SND_PCM_STATE_OPEN,
80 Setup = SND_PCM_STATE_SETUP,
82 Prepare = SND_PCM_STATE_PREPARED,
84 Running = SND_PCM_STATE_RUNNING,
86 Xrun = SND_PCM_STATE_XRUN,
88 Draining = SND_PCM_STATE_DRAINING,
90 Paused = SND_PCM_STATE_PAUSED,
92 Suspended = SND_PCM_STATE_SUSPENDED,
94 Disconnected = SND_PCM_STATE_DISCONNECTED,
96 Private1 = SND_PCM_STATE_PRIVATE1,
98 }
99}
100
101decl_enum! {
102 #[repr(i32)]
104 pub enum Format {
105 Unknown = SND_PCM_FORMAT_UNKNOWN,
106 S8 = SND_PCM_FORMAT_S8,
107 U8 = SND_PCM_FORMAT_U8,
108 S16LE = SND_PCM_FORMAT_S16_LE,
109 S16BE = SND_PCM_FORMAT_S16_BE,
110 U16LE = SND_PCM_FORMAT_U16_LE,
111 U16BE = SND_PCM_FORMAT_U16_BE,
112 S24LE = SND_PCM_FORMAT_S24_LE,
113 S24BE = SND_PCM_FORMAT_S24_BE,
114 U24LE = SND_PCM_FORMAT_U24_LE,
115 U24BE = SND_PCM_FORMAT_U24_BE,
116 S32LE = SND_PCM_FORMAT_S32_LE,
117 S32BE = SND_PCM_FORMAT_S32_BE,
118 U32LE = SND_PCM_FORMAT_U32_LE,
119 U32BE = SND_PCM_FORMAT_U32_BE,
120 FloatLE = SND_PCM_FORMAT_FLOAT_LE,
121 FloatBE = SND_PCM_FORMAT_FLOAT_BE,
122 Float64LE = SND_PCM_FORMAT_FLOAT64_LE,
123 Float64BE = SND_PCM_FORMAT_FLOAT64_BE,
124 IEC958SubframeLE = SND_PCM_FORMAT_IEC958_SUBFRAME_LE,
125 IEC958SubframeBE = SND_PCM_FORMAT_IEC958_SUBFRAME_BE,
126 MuLaw = SND_PCM_FORMAT_MU_LAW,
127 ALaw = SND_PCM_FORMAT_A_LAW,
128 ImaAdPCM = SND_PCM_FORMAT_IMA_ADPCM,
129 MPEG = SND_PCM_FORMAT_MPEG,
130 GSM = SND_PCM_FORMAT_GSM,
131 Special = SND_PCM_FORMAT_SPECIAL,
132 S243LE = SND_PCM_FORMAT_S24_3LE,
133 S243BE = SND_PCM_FORMAT_S24_3BE,
134 U243LE = SND_PCM_FORMAT_U24_3LE,
135 U243BE = SND_PCM_FORMAT_U24_3BE,
136 S203LE = SND_PCM_FORMAT_S20_3LE,
137 S203BE = SND_PCM_FORMAT_S20_3BE,
138 U203LE = SND_PCM_FORMAT_U20_3LE,
139 U203BE = SND_PCM_FORMAT_U20_3BE,
140 S183LE = SND_PCM_FORMAT_S18_3LE,
141 S183BE = SND_PCM_FORMAT_S18_3BE,
142 U183LE = SND_PCM_FORMAT_U18_3LE,
143 U183BE = SND_PCM_FORMAT_U18_3BE,
144 G72324 = SND_PCM_FORMAT_G723_24,
145 G723241B = SND_PCM_FORMAT_G723_24_1B,
146 G72340 = SND_PCM_FORMAT_G723_40,
147 G723401B = SND_PCM_FORMAT_G723_40_1B,
148 DSDU8 = SND_PCM_FORMAT_DSD_U8,
149 DSDU16LE = SND_PCM_FORMAT_DSD_U16_LE,
150 DSDU32LE = SND_PCM_FORMAT_DSD_U32_LE,
151 DSDU16BE = SND_PCM_FORMAT_DSD_U16_BE,
152 DSDU32BE = SND_PCM_FORMAT_DSD_U32_BE,
153 }
154}
155
156impl Format {
157 pub fn physical_width(self) -> Result<usize> {
171 unsafe { Ok(errno!(alsa::snd_pcm_format_physical_width(self as c::c_int))? as usize) }
172 }
173}
174
175decl_enum! {
176 #[repr(u32)]
180 pub enum Stream {
181 Capture = SND_PCM_STREAM_CAPTURE,
183 Playback = SND_PCM_STREAM_PLAYBACK,
185 }
186}
187
188decl_enum! {
189 #[repr(u32)]
191 pub enum Access {
192 MmapInterleaved = SND_PCM_ACCESS_MMAP_INTERLEAVED,
194 MmapNoninterleaved = SND_PCM_ACCESS_MMAP_NONINTERLEAVED,
196 MmapComplex = SND_PCM_ACCESS_MMAP_COMPLEX,
198 ReadWriteInterleaved = SND_PCM_ACCESS_RW_INTERLEAVED,
200 ReadWriteNoninterleaved = SND_PCM_ACCESS_RW_NONINTERLEAVED,
202 }
203}
204
205decl_enum! {
206 #[repr(u32)]
208 pub enum Timestamp {
209 None = SND_PCM_TSTAMP_NONE,
211 Enable = SND_PCM_TSTAMP_ENABLE,
213 }
214}
215
216decl_enum! {
217 #[repr(u32)]
219 pub enum TimestampType {
220 GetTimeOfDay = SND_PCM_TSTAMP_TYPE_GETTIMEOFDAY,
222 Monotonic = SND_PCM_TSTAMP_TYPE_MONOTONIC,
224 MonotonicRaw = SND_PCM_TSTAMP_TYPE_MONOTONIC_RAW,
226 }
227}