#![allow(non_camel_case_types)]
use cfg_if::cfg_if;
pub const SNDRV_PCM_MMAP_OFFSET_STATUS: libc::c_uint = 0x80000000;
pub const SNDRV_PCM_MMAP_OFFSET_CONTROL: libc::c_uint = 0x81000000;
pub const SNDRV_PCM_SYNC_PTR_HWSYNC: libc::c_uint = 1;
pub const SNDRV_PCM_SYNC_PTR_APPL: libc::c_uint = 2;
pub const SNDRV_PCM_SYNC_PTR_AVAIL_MIN: libc::c_uint = 4;
#[allow(non_camel_case_types)]
pub type snd_pcm_state_t = libc::c_int;
#[allow(non_camel_case_types)]
pub type snd_pcm_uframes_t = libc::c_ulong;
#[allow(non_camel_case_types)]
pub type __kernel_off_t = libc::c_long;
#[repr(C)]
#[derive(Copy, Clone)]
pub struct snd_pcm_mmap_status {
pub state: snd_pcm_state_t, pub pad1: libc::c_int, pub hw_ptr: snd_pcm_uframes_t, pub tstamp: libc::timespec, pub suspended_state: snd_pcm_state_t, pub audio_tstamp: libc::timespec, }
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct snd_pcm_mmap_control {
pub appl_ptr: snd_pcm_uframes_t, pub avail_min: snd_pcm_uframes_t, }
#[repr(C)]
#[derive(Debug)]
pub struct snd_pcm_channel_info {
pub channel: libc::c_uint,
pub offset: __kernel_off_t, pub first: libc::c_uint, pub step: libc::c_uint, }
#[repr(C)]
#[derive(Copy, Clone)]
pub union snd_pcm_mmap_status_r {
pub status: snd_pcm_mmap_status,
pub reserved: [libc::c_uchar; 64],
}
#[repr(C)]
#[derive(Copy, Clone)]
pub union snd_pcm_mmap_control_r {
pub control: snd_pcm_mmap_control,
pub reserved: [libc::c_uchar; 64],
}
#[repr(C)]
#[derive(Copy, Clone)]
pub struct snd_pcm_sync_ptr {
pub flags: libc::c_uint,
pub s: snd_pcm_mmap_status_r,
pub c: snd_pcm_mmap_control_r,
}
cfg_if! {
if #[cfg(any(target_os = "linux", target_os = "android"))] {
cfg_if! {
if #[cfg(any(target_os = "android", target_env = "musl"))] {
pub(super) type ioctl_num_type = libc::c_int;
} else {
pub(super) type ioctl_num_type = libc::c_ulong;
}
}
pub(super) const READ: ioctl_num_type = 2;
cfg_if!{
if #[cfg(any(
target_arch = "mips",
target_arch = "mips32r6",
target_arch = "mips64",
target_arch = "mips64r6",
target_arch = "powerpc",
target_arch = "powerpc64",
target_arch = "sparc64"
))] {
pub(super) const WRITE: ioctl_num_type = 4;
const SIZEBITS: ioctl_num_type = 13;
} else {
pub(super) const WRITE: ioctl_num_type = 1;
const SIZEBITS: ioctl_num_type = 14;
}
}
const NRSHIFT: ioctl_num_type = 0;
const NRBITS: ioctl_num_type = 8;
const TYPEBITS: ioctl_num_type = 8;
const TYPESHIFT: ioctl_num_type = NRSHIFT + NRBITS;
const SIZESHIFT: ioctl_num_type = TYPESHIFT + TYPEBITS;
const DIRSHIFT: ioctl_num_type = SIZESHIFT + SIZEBITS;
pub(super) const fn make_request(
dir: ioctl_num_type,
typ: u8,
nr: u8,
size: usize,
) -> ioctl_num_type {
dir << DIRSHIFT
| (typ as ioctl_num_type) << TYPESHIFT
| (nr as ioctl_num_type) << NRSHIFT
| (size as ioctl_num_type) << SIZESHIFT
}
} else if #[cfg(any(
target_os = "dragonfly",
target_os = "freebsd",
target_os = "netbsd",
target_os = "openbsd",
target_os = "solaris",
target_os = "illumos"
))] {
cfg_if! {
if #[cfg(not(any(target_os = "illumos", target_os = "solaris")))] {
pub(super) type ioctl_num_type = libc::c_ulong;
} else {
pub(super) type ioctl_num_type = libc::c_int;
}
}
#[allow(overflowing_literals)]
pub(super) const READ: ioctl_num_type = 0x4000_0000;
#[allow(overflowing_literals)]
pub(super) const WRITE: ioctl_num_type = 0x8000_0000;
const IOCPARM_MASK: ioctl_num_type = 0x1fff;
pub(super) const fn make_request(
dir: ioctl_num_type,
typ: u8,
nr: u8,
size: usize,
) -> ioctl_num_type {
dir | ((size as ioctl_num_type) & IOCPARM_MASK) << 16
| (typ as ioctl_num_type) << 8
| nr as ioctl_num_type
}
} else {
compile_error!("unknown target platform");
}
}
pub(crate) unsafe fn sndrv_pcm_ioctl_channel_info(
fd: libc::c_int,
data: *mut snd_pcm_channel_info,
) -> Result<(), crate::Error> {
const REQUEST: ioctl_num_type = make_request(
READ,
b'A',
0x32,
std::mem::size_of::<snd_pcm_channel_info>(),
);
unsafe {
if libc::ioctl(fd, REQUEST, data) == -1 {
Err(crate::Error::last("SNDRV_PCM_IOCTL_CHANNEL_INFO"))
} else {
Ok(())
}
}
}
pub(crate) unsafe fn sndrv_pcm_ioctl_sync_ptr(
fd: libc::c_int,
data: *mut snd_pcm_sync_ptr,
) -> Result<(), crate::Error> {
const REQUEST: ioctl_num_type = make_request(
READ | WRITE,
b'A',
0x23,
std::mem::size_of::<snd_pcm_sync_ptr>(),
);
unsafe {
if libc::ioctl(fd, REQUEST, data) == -1 {
Err(crate::Error::last("SNDRV_PCM_IOCTL_SYNC_PTR"))
} else {
Ok(())
}
}
}
pub fn pagesize() -> usize {
unsafe { libc::sysconf(libc::_SC_PAGESIZE) as usize }
}