1use std::{ffi::OsString, io::Result};
70
71use super::{
72 util::{FunctionDir, Status},
73 Function, Handle,
74};
75
76#[derive(Debug, Clone, Default)]
78pub struct Channel {
79 pub channel_mask: Option<u32>,
86 pub sample_rate: Option<u32>,
88 pub sample_size: Option<u32>,
90}
91
92impl Channel {
93 pub fn new(channel_mask: u32, sample_rate: u32, sample_size: u32) -> Self {
96 Self { channel_mask: Some(channel_mask), sample_rate: Some(sample_rate), sample_size: Some(sample_size) }
97 }
98}
99
100#[derive(Debug, Clone, Default)]
106#[non_exhaustive]
107pub struct Uac2Config {
108 pub channel: Channel,
110 pub sync_type: Option<u32>,
112 pub hs_interval: Option<u8>,
114 pub mute_present: Option<bool>,
116 pub terminal_type: Option<u8>,
118 pub volume_present: Option<bool>,
120 pub volume_min: Option<i16>,
122 pub volume_max: Option<i16>,
124 pub volume_resolution: Option<i16>,
126 pub volume_name: Option<String>,
128 pub input_terminal_name: Option<String>,
130 pub input_terminal_channel_name: Option<String>,
132 pub output_terminal_name: Option<String>,
134}
135
136#[derive(Debug, Clone, Default)]
140#[non_exhaustive]
141pub struct Uac2Builder {
142 pub capture: Uac2Config,
144 pub playback: Uac2Config,
146 pub fb_max: Option<u32>,
148 pub request_number: Option<u32>,
150 pub function_name: Option<String>,
152 pub control_name: Option<String>,
154 pub clock_source_in_name: Option<String>,
156 pub clock_source_out_name: Option<String>,
158}
159
160impl Uac2Builder {
161 #[must_use]
165 pub fn build(self) -> (Uac2, Handle) {
166 let dir = FunctionDir::new();
167 (Uac2 { dir: dir.clone() }, Handle::new(Uac2Function { builder: self, dir }))
168 }
169
170 #[must_use]
172 pub fn with_capture_config(mut self, capture: Uac2Config) -> Self {
173 self.capture = capture;
174 self
175 }
176
177 #[must_use]
179 pub fn with_playback_config(mut self, playback: Uac2Config) -> Self {
180 self.playback = playback;
181 self
182 }
183}
184
185#[derive(Debug)]
186struct Uac2Function {
187 builder: Uac2Builder,
188 dir: FunctionDir,
189}
190
191impl Function for Uac2Function {
192 fn driver(&self) -> OsString {
193 "uac2".into()
194 }
195
196 fn dir(&self) -> FunctionDir {
197 self.dir.clone()
198 }
199
200 fn register(&self) -> Result<()> {
201 if let Some(channel_mask) = self.builder.capture.channel.channel_mask {
203 self.dir.write("c_chmask", channel_mask.to_string())?;
204 }
205 if let Some(sample_rate) = self.builder.capture.channel.sample_rate {
206 self.dir.write("c_srate", sample_rate.to_string())?;
207 }
208 if let Some(sample_size) = self.builder.capture.channel.sample_size {
209 self.dir.write("c_ssize", sample_size.to_string())?;
210 }
211 if let Some(sync_type) = self.builder.capture.sync_type {
212 self.dir.write("c_sync", sync_type.to_string())?;
213 }
214 if let Some(hs_interval) = self.builder.capture.hs_interval {
215 self.dir.write("c_hs_bint", hs_interval.to_string())?;
216 }
217 if let Some(mute_present) = self.builder.capture.mute_present {
218 self.dir.write("c_mute_present", (mute_present as u8).to_string())?;
219 }
220 if let Some(volume_present) = self.builder.capture.volume_present {
221 self.dir.write("c_volume_present", (volume_present as u8).to_string())?;
222 }
223 if let Some(volume_min) = self.builder.capture.volume_min {
224 self.dir.write("c_volume_min", volume_min.to_string())?;
225 }
226 if let Some(volume_max) = self.builder.capture.volume_max {
227 self.dir.write("c_volume_max", volume_max.to_string())?;
228 }
229 if let Some(volume_resolution) = self.builder.capture.volume_resolution {
230 self.dir.write("c_volume_res", volume_resolution.to_string())?;
231 }
232 if let Some(volume_name) = &self.builder.capture.volume_name {
233 self.dir.write("c_fu_vol_name", volume_name)?;
234 }
235 if let Some(terminal_type) = self.builder.capture.terminal_type {
236 self.dir.write("c_terminal_type", terminal_type.to_string())?;
237 }
238 if let Some(input_terminal_name) = &self.builder.capture.input_terminal_name {
239 self.dir.write("c_it_name", input_terminal_name)?;
240 }
241 if let Some(input_terminal_channel_name) = &self.builder.capture.input_terminal_channel_name {
242 self.dir.write("c_it_ch_name", input_terminal_channel_name)?;
243 }
244 if let Some(output_terminal_name) = &self.builder.capture.output_terminal_name {
245 self.dir.write("c_ot_name", output_terminal_name)?;
246 }
247
248 if let Some(channel_mask) = self.builder.playback.channel.channel_mask {
250 self.dir.write("p_chmask", channel_mask.to_string())?;
251 }
252 if let Some(sample_rate) = self.builder.playback.channel.sample_rate {
253 self.dir.write("p_srate", sample_rate.to_string())?;
254 }
255 if let Some(sample_size) = self.builder.playback.channel.sample_size {
256 self.dir.write("p_ssize", sample_size.to_string())?;
257 }
258 if let Some(hs_interval) = self.builder.playback.hs_interval {
259 self.dir.write("p_hs_bint", hs_interval.to_string())?;
260 }
261 if let Some(mute_present) = self.builder.playback.mute_present {
262 self.dir.write("p_mute_present", (mute_present as u8).to_string())?;
263 }
264 if let Some(volume_present) = self.builder.playback.volume_present {
265 self.dir.write("p_volume_present", (volume_present as u8).to_string())?;
266 }
267 if let Some(volume_min) = self.builder.playback.volume_min {
268 self.dir.write("p_volume_min", volume_min.to_string())?;
269 }
270 if let Some(volume_max) = self.builder.playback.volume_max {
271 self.dir.write("p_volume_max", volume_max.to_string())?;
272 }
273 if let Some(volume_resolution) = self.builder.playback.volume_resolution {
274 self.dir.write("p_volume_res", volume_resolution.to_string())?;
275 }
276 if let Some(volume_name) = &self.builder.playback.volume_name {
277 self.dir.write("p_fu_vol_name", volume_name)?;
278 }
279 if let Some(terminal_type) = self.builder.playback.terminal_type {
280 self.dir.write("p_terminal_type", terminal_type.to_string())?;
281 }
282 if let Some(input_terminal_name) = &self.builder.playback.input_terminal_name {
283 self.dir.write("p_it_name", input_terminal_name)?;
284 }
285 if let Some(input_terminal_channel_name) = &self.builder.playback.input_terminal_channel_name {
286 self.dir.write("p_it_ch_name", input_terminal_channel_name)?;
287 }
288 if let Some(output_terminal_name) = &self.builder.playback.output_terminal_name {
289 self.dir.write("p_ot_name", output_terminal_name)?;
290 }
291
292 if let Some(fb_max) = self.builder.fb_max {
294 self.dir.write("fb_max", fb_max.to_string())?;
295 }
296 if let Some(request_number) = self.builder.request_number {
297 self.dir.write("req_number", request_number.to_string())?;
298 }
299 if let Some(function_name) = &self.builder.function_name {
300 self.dir.write("function_name", function_name)?;
301 }
302 if let Some(control_name) = &self.builder.control_name {
303 self.dir.write("if_ctrl_name", control_name)?;
304 }
305 if let Some(clock_source_in_name) = &self.builder.clock_source_in_name {
306 self.dir.write("clksrc_in_name", clock_source_in_name)?;
307 }
308 if let Some(clock_source_out_name) = &self.builder.clock_source_out_name {
309 self.dir.write("clksrc_out_name", clock_source_out_name)?;
310 }
311
312 Ok(())
313 }
314}
315
316#[derive(Debug)]
318pub struct Uac2 {
319 dir: FunctionDir,
320}
321
322impl Uac2 {
323 pub fn builder() -> Uac2Builder {
325 Uac2Builder::default()
326 }
327
328 pub fn new(capture: Channel, playback: Channel) -> (Uac2, Handle) {
331 let mut builder = Uac2Builder::default();
332 builder.capture.channel = capture;
333 builder.playback.channel = playback;
334 builder.build()
335 }
336
337 pub fn status(&self) -> Status {
339 self.dir.status()
340 }
341}
342
343#[derive(Debug, Clone, Default)]
349#[non_exhaustive]
350pub struct Uac1Config {
351 pub channel: Channel,
353 pub mute_present: Option<bool>,
355 pub volume_present: Option<bool>,
357 pub volume_min: Option<i16>,
359 pub volume_max: Option<i16>,
361 pub volume_resolution: Option<i16>,
363 pub volume_name: Option<String>,
365 pub input_terminal_name: Option<String>,
367 pub input_terminal_channel_name: Option<String>,
369 pub output_terminal_name: Option<String>,
371}
372
373#[derive(Debug, Clone, Default)]
377#[non_exhaustive]
378pub struct Uac1Builder {
379 pub capture: Uac1Config,
381 pub playback: Uac1Config,
383 pub request_number: Option<u32>,
385 pub function_name: Option<String>,
387}
388
389impl Uac1Builder {
390 #[must_use]
394 pub fn build(self) -> (Uac1, Handle) {
395 let dir = FunctionDir::new();
396 (Uac1 { dir: dir.clone() }, Handle::new(Uac1Function { builder: self, dir }))
397 }
398
399 #[must_use]
401 pub fn with_capture_config(mut self, capture: Uac1Config) -> Self {
402 self.capture = capture;
403 self
404 }
405
406 #[must_use]
408 pub fn with_playback_config(mut self, playback: Uac1Config) -> Self {
409 self.playback = playback;
410 self
411 }
412}
413
414#[derive(Debug)]
415struct Uac1Function {
416 builder: Uac1Builder,
417 dir: FunctionDir,
418}
419
420impl Function for Uac1Function {
421 fn driver(&self) -> OsString {
422 "uac1".into()
423 }
424
425 fn dir(&self) -> FunctionDir {
426 self.dir.clone()
427 }
428
429 fn register(&self) -> Result<()> {
430 if let Some(channel_mask) = self.builder.capture.channel.channel_mask {
432 self.dir.write("c_chmask", channel_mask.to_string())?;
433 }
434 if let Some(sample_rate) = self.builder.capture.channel.sample_rate {
435 self.dir.write("c_srate", sample_rate.to_string())?;
436 }
437 if let Some(sample_size) = self.builder.capture.channel.sample_size {
438 self.dir.write("c_ssize", sample_size.to_string())?;
439 }
440 if let Some(mute_present) = self.builder.capture.mute_present {
441 self.dir.write("c_mute_present", (mute_present as u8).to_string())?;
442 }
443 if let Some(volume_present) = self.builder.capture.volume_present {
444 self.dir.write("c_volume_present", (volume_present as u8).to_string())?;
445 }
446 if let Some(volume_min) = self.builder.capture.volume_min {
447 self.dir.write("c_volume_min", volume_min.to_string())?;
448 }
449 if let Some(volume_max) = self.builder.capture.volume_max {
450 self.dir.write("c_volume_max", volume_max.to_string())?;
451 }
452 if let Some(volume_resolution) = self.builder.capture.volume_resolution {
453 self.dir.write("c_volume_res", volume_resolution.to_string())?;
454 }
455 if let Some(volume_name) = &self.builder.capture.volume_name {
456 self.dir.write("c_fu_vol_name", volume_name)?;
457 }
458 if let Some(input_terminal_name) = &self.builder.capture.input_terminal_name {
459 self.dir.write("c_it_name", input_terminal_name)?;
460 }
461 if let Some(input_terminal_channel_name) = &self.builder.capture.input_terminal_channel_name {
462 self.dir.write("c_it_ch_name", input_terminal_channel_name)?;
463 }
464 if let Some(output_terminal_name) = &self.builder.capture.output_terminal_name {
465 self.dir.write("c_ot_name", output_terminal_name)?;
466 }
467
468 if let Some(channel_mask) = self.builder.playback.channel.channel_mask {
470 self.dir.write("p_chmask", channel_mask.to_string())?;
471 }
472 if let Some(sample_rate) = self.builder.playback.channel.sample_rate {
473 self.dir.write("p_srate", sample_rate.to_string())?;
474 }
475 if let Some(sample_size) = self.builder.playback.channel.sample_size {
476 self.dir.write("p_ssize", sample_size.to_string())?;
477 }
478 if let Some(mute_present) = self.builder.playback.mute_present {
479 self.dir.write("p_mute_present", (mute_present as u8).to_string())?;
480 }
481 if let Some(volume_present) = self.builder.playback.volume_present {
482 self.dir.write("p_volume_present", (volume_present as u8).to_string())?;
483 }
484 if let Some(volume_min) = self.builder.playback.volume_min {
485 self.dir.write("p_volume_min", volume_min.to_string())?;
486 }
487 if let Some(volume_max) = self.builder.playback.volume_max {
488 self.dir.write("p_volume_max", volume_max.to_string())?;
489 }
490 if let Some(volume_resolution) = self.builder.playback.volume_resolution {
491 self.dir.write("p_volume_res", volume_resolution.to_string())?;
492 }
493 if let Some(volume_name) = &self.builder.playback.volume_name {
494 self.dir.write("p_fu_vol_name", volume_name)?;
495 }
496 if let Some(input_terminal_name) = &self.builder.playback.input_terminal_name {
497 self.dir.write("p_it_name", input_terminal_name)?;
498 }
499 if let Some(input_terminal_channel_name) = &self.builder.playback.input_terminal_channel_name {
500 self.dir.write("p_it_ch_name", input_terminal_channel_name)?;
501 }
502 if let Some(output_terminal_name) = &self.builder.playback.output_terminal_name {
503 self.dir.write("p_ot_name", output_terminal_name)?;
504 }
505
506 if let Some(request_number) = self.builder.request_number {
508 self.dir.write("req_number", request_number.to_string())?;
509 }
510 if let Some(function_name) = &self.builder.function_name {
511 self.dir.write("function_name", function_name)?;
512 }
513
514 Ok(())
515 }
516}
517
518#[derive(Debug)]
523pub struct Uac1 {
524 dir: FunctionDir,
525}
526
527impl Uac1 {
528 pub fn builder() -> Uac1Builder {
530 Uac1Builder::default()
531 }
532
533 pub fn new(capture: Channel, playback: Channel) -> (Uac1, Handle) {
536 let mut builder = Uac1Builder::default();
537 builder.capture.channel = capture;
538 builder.playback.channel = playback;
539 builder.build()
540 }
541
542 pub fn status(&self) -> Status {
544 self.dir.status()
545 }
546}