use super::IO_A;
use crate::raw::pcm as raw;
use linux_io::fd::ioctl::{
_IO, _IOR, _IOW, _IOWR, IoctlReqNoArgs, IoctlReqRead, IoctlReqWrite, IoctlReqWriteRead,
ioctl_no_arg, ioctl_read, ioctl_write, ioctl_writeread,
};
use linux_unsafe::{int, ulong};
pub struct PcmDevice;
impl linux_io::fd::ioctl::IoDevice for PcmDevice {}
const fn size<T>() -> ulong {
core::mem::size_of::<T>() as ulong
}
macro_rules! io {
($name:ident, $num:expr) => {
pub const $name: IoctlReqNoArgs<PcmDevice, int> = unsafe { ioctl_no_arg(_IO(IO_A, $num)) };
};
}
macro_rules! ior {
($name:ident, $num:expr, $ty:ty) => {
pub const $name: IoctlReqRead<PcmDevice, $ty> =
unsafe { ioctl_read(_IOR(IO_A, $num, size::<$ty>())) };
};
}
macro_rules! iow {
($name:ident, $num:expr, $ty:ty) => {
pub const $name: IoctlReqWrite<PcmDevice, $ty> =
unsafe { ioctl_write(_IOW(IO_A, $num, size::<$ty>())) };
};
}
macro_rules! iowr {
($name:ident, $num:expr, $ty:ty) => {
pub const $name: IoctlReqWriteRead<PcmDevice, $ty> =
unsafe { ioctl_writeread(_IOWR(IO_A, $num, size::<$ty>())) };
};
}
ior!(SNDRV_PCM_IOCTL_PVERSION, 0x00, int);
ior!(SNDRV_PCM_IOCTL_INFO, 0x01, raw::snd_pcm_info);
iow!(SNDRV_PCM_IOCTL_TSTAMP, 0x02, int);
iow!(SNDRV_PCM_IOCTL_TTSTAMP, 0x03, int);
iow!(SNDRV_PCM_IOCTL_USER_PVERSION, 0x04, int);
iowr!(SNDRV_PCM_IOCTL_HW_REFINE, 0x10, raw::snd_pcm_hw_params);
iowr!(SNDRV_PCM_IOCTL_HW_PARAMS, 0x11, raw::snd_pcm_hw_params);
io!(SNDRV_PCM_IOCTL_HW_FREE, 0x12);
iowr!(SNDRV_PCM_IOCTL_SW_PARAMS, 0x13, raw::snd_pcm_sw_params);
ior!(SNDRV_PCM_IOCTL_STATUS, 0x20, raw::snd_pcm_status);
ior!(SNDRV_PCM_IOCTL_DELAY, 0x21, raw::snd_pcm_sframes_t);
io!(SNDRV_PCM_IOCTL_HWSYNC, 0x22);
iowr!(SNDRV_PCM_IOCTL_STATUS_EXT, 0x24, raw::snd_pcm_status);
ior!(
SNDRV_PCM_IOCTL_CHANNEL_INFO,
0x32,
raw::snd_pcm_channel_info
);
io!(SNDRV_PCM_IOCTL_PREPARE, 0x40);
io!(SNDRV_PCM_IOCTL_RESET, 0x41);
io!(SNDRV_PCM_IOCTL_START, 0x42);
io!(SNDRV_PCM_IOCTL_STOP, 0x43);
io!(SNDRV_PCM_IOCTL_DRAIN, 0x44);
iow!(SNDRV_PCM_IOCTL_PAUSE, 0x45, int);
iow!(SNDRV_PCM_IOCTL_REWIND, 0x46, raw::snd_pcm_uframes_t);
io!(SNDRV_PCM_IOCTL_RESUME, 0x47);
io!(SNDRV_PCM_IOCTL_XRUN, 0x48);
iow!(SNDRV_PCM_IOCTL_FORWARD, 0x49, raw::snd_pcm_uframes_t);
iow!(SNDRV_PCM_IOCTL_WRITEI_FRAMES, 0x50, raw::snd_xferi);
ior!(SNDRV_PCM_IOCTL_READI_FRAMES, 0x51, raw::snd_xferi);
iow!(SNDRV_PCM_IOCTL_WRITEN_FRAMES, 0x52, raw::snd_xfern);
ior!(SNDRV_PCM_IOCTL_READN_FRAMES, 0x53, raw::snd_xfern);
iow!(SNDRV_PCM_IOCTL_LINK, 0x60, int);
io!(SNDRV_PCM_IOCTL_UNLINK, 0x61);