linux_audio/ioctl/
pcm.rs

1//! Low-level ioctl request definitions for the digital audio (PCM) interface.
2
3use 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
11/// A marker type for use with [`linux_io::File`] to indicate when a file is
12/// representing a PCM device, allowing use of ioctl requests in this module.
13pub 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);
57//iowr!(SNDRV_PCM_IOCTL_SYNC_PTR, 0x23, raw::snd_pcm_sync_ptr);
58iowr!(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);