1use super::IO_A;
4use crate::raw::pcm as raw;
5use linux_io::fd::ioctl::{
6 _IO, _IOR, _IOW, _IOWR, IoctlReqNoArgs, IoctlReqRead, IoctlReqWrite, IoctlReqWriteRead,
7 ioctl_no_arg, ioctl_read, ioctl_write, ioctl_writeread,
8};
9use linux_unsafe::{int, ulong};
10
11pub struct PcmDevice;
14
15impl linux_io::fd::ioctl::IoDevice for PcmDevice {}
16
17const fn size<T>() -> ulong {
18 core::mem::size_of::<T>() as ulong
19}
20
21macro_rules! io {
22 ($name:ident, $num:expr) => {
23 pub const $name: IoctlReqNoArgs<PcmDevice, int> = unsafe { ioctl_no_arg(_IO(IO_A, $num)) };
24 };
25}
26macro_rules! ior {
27 ($name:ident, $num:expr, $ty:ty) => {
28 pub const $name: IoctlReqRead<PcmDevice, $ty> =
29 unsafe { ioctl_read(_IOR(IO_A, $num, size::<$ty>())) };
30 };
31}
32macro_rules! iow {
33 ($name:ident, $num:expr, $ty:ty) => {
34 pub const $name: IoctlReqWrite<PcmDevice, $ty> =
35 unsafe { ioctl_write(_IOW(IO_A, $num, size::<$ty>())) };
36 };
37}
38macro_rules! iowr {
39 ($name:ident, $num:expr, $ty:ty) => {
40 pub const $name: IoctlReqWriteRead<PcmDevice, $ty> =
41 unsafe { ioctl_writeread(_IOWR(IO_A, $num, size::<$ty>())) };
42 };
43}
44
45ior!(SNDRV_PCM_IOCTL_PVERSION, 0x00, int);
46ior!(SNDRV_PCM_IOCTL_INFO, 0x01, raw::snd_pcm_info);
47iow!(SNDRV_PCM_IOCTL_TSTAMP, 0x02, int);
48iow!(SNDRV_PCM_IOCTL_TTSTAMP, 0x03, int);
49iow!(SNDRV_PCM_IOCTL_USER_PVERSION, 0x04, int);
50iowr!(SNDRV_PCM_IOCTL_HW_REFINE, 0x10, raw::snd_pcm_hw_params);
51iowr!(SNDRV_PCM_IOCTL_HW_PARAMS, 0x11, raw::snd_pcm_hw_params);
52io!(SNDRV_PCM_IOCTL_HW_FREE, 0x12);
53iowr!(SNDRV_PCM_IOCTL_SW_PARAMS, 0x13, raw::snd_pcm_sw_params);
54ior!(SNDRV_PCM_IOCTL_STATUS, 0x20, raw::snd_pcm_status);
55ior!(SNDRV_PCM_IOCTL_DELAY, 0x21, raw::snd_pcm_sframes_t);
56io!(SNDRV_PCM_IOCTL_HWSYNC, 0x22);
57iowr!(SNDRV_PCM_IOCTL_STATUS_EXT, 0x24, raw::snd_pcm_status);
59ior!(
60 SNDRV_PCM_IOCTL_CHANNEL_INFO,
61 0x32,
62 raw::snd_pcm_channel_info
63);
64io!(SNDRV_PCM_IOCTL_PREPARE, 0x40);
65io!(SNDRV_PCM_IOCTL_RESET, 0x41);
66io!(SNDRV_PCM_IOCTL_START, 0x42);
67io!(SNDRV_PCM_IOCTL_STOP, 0x43);
68io!(SNDRV_PCM_IOCTL_DRAIN, 0x44);
69iow!(SNDRV_PCM_IOCTL_PAUSE, 0x45, int);
70iow!(SNDRV_PCM_IOCTL_REWIND, 0x46, raw::snd_pcm_uframes_t);
71io!(SNDRV_PCM_IOCTL_RESUME, 0x47);
72io!(SNDRV_PCM_IOCTL_XRUN, 0x48);
73iow!(SNDRV_PCM_IOCTL_FORWARD, 0x49, raw::snd_pcm_uframes_t);
74iow!(SNDRV_PCM_IOCTL_WRITEI_FRAMES, 0x50, raw::snd_xferi);
75ior!(SNDRV_PCM_IOCTL_READI_FRAMES, 0x51, raw::snd_xferi);
76iow!(SNDRV_PCM_IOCTL_WRITEN_FRAMES, 0x52, raw::snd_xfern);
77ior!(SNDRV_PCM_IOCTL_READN_FRAMES, 0x53, raw::snd_xfern);
78iow!(SNDRV_PCM_IOCTL_LINK, 0x60, int);
79io!(SNDRV_PCM_IOCTL_UNLINK, 0x61);