use crate::alsa::{Access, Result};
use crate::libc as c;
use alsa_sys as alsa;
use std::mem;
use std::ptr;
pub struct AccessMask {
pub(super) handle: ptr::NonNull<alsa::snd_pcm_access_mask_t>,
}
impl AccessMask {
pub fn new() -> Result<Self> {
unsafe {
let mut mask = Self::allocate()?;
alsa::snd_pcm_access_mask_none(mask.handle.as_mut());
Ok(mask)
}
}
pub(super) unsafe fn allocate() -> Result<Self> {
let mut handle = mem::MaybeUninit::uninit();
errno!(alsa::snd_pcm_access_mask_malloc(handle.as_mut_ptr()))?;
let handle = ptr::NonNull::new_unchecked(handle.assume_init());
Ok(Self { handle })
}
pub fn is_empty(&self) -> bool {
unsafe { alsa::snd_pcm_access_mask_empty(self.handle.as_ptr()) == 1 }
}
pub fn any(&mut self) {
unsafe {
alsa::snd_pcm_access_mask_any(self.handle.as_mut());
}
}
pub fn none(&mut self) {
unsafe {
alsa::snd_pcm_access_mask_none(self.handle.as_mut());
}
}
pub fn set(&mut self, access: Access) {
unsafe {
alsa::snd_pcm_access_mask_set(self.handle.as_mut(), access as c::c_uint);
}
}
pub fn reset(&mut self, access: Access) {
unsafe {
alsa::snd_pcm_access_mask_reset(self.handle.as_mut(), access as c::c_uint);
}
}
pub fn test(&mut self, access: Access) -> bool {
unsafe { alsa::snd_pcm_access_mask_test(self.handle.as_mut(), access as c::c_uint) == 1 }
}
pub fn copy(&mut self, other: &Self) {
unsafe {
alsa::snd_pcm_access_mask_copy(self.handle.as_mut(), other.handle.as_ptr());
}
}
}
impl Drop for AccessMask {
fn drop(&mut self) {
unsafe {
let _ = alsa::snd_pcm_access_mask_free(self.handle.as_mut());
}
}
}