use crate::alsa::{CString, Result};
use crate::libc as c;
use alsa_sys as alsa;
use std::ffi::CStr;
use std::mem;
pub fn cards() -> Cards {
Cards { index: -1 }
}
pub struct Cards {
index: c::c_int,
}
impl Iterator for Cards {
type Item = Result<Card>;
fn next(&mut self) -> Option<Self::Item> {
Some(
if let Err(e) = errno!(unsafe { alsa::snd_card_next(&mut self.index) }) {
Err(e.into())
} else {
if self.index == -1 {
return None;
}
Ok(Card { index: self.index })
},
)
}
}
pub struct Card {
index: c::c_int,
}
impl Card {
pub fn open(name: &CStr) -> Result<Self> {
unsafe {
let index = errno!(alsa::snd_card_get_index(
name.to_bytes().as_ptr() as *const i8
))?;
Ok(Self { index })
}
}
pub fn index(&self) -> c::c_int {
self.index
}
pub fn name(&self) -> Result<CString> {
unsafe {
let mut ptr = mem::MaybeUninit::uninit();
errno!(alsa::snd_card_get_name(self.index, ptr.as_mut_ptr()))?;
let ptr = ptr.assume_init();
Ok(CString::from_raw(ptr))
}
}
pub fn long_name(&self) -> Result<CString> {
unsafe {
let mut ptr = mem::MaybeUninit::uninit();
errno!(alsa::snd_card_get_longname(self.index, ptr.as_mut_ptr()))?;
let ptr = ptr.assume_init();
Ok(CString::from_raw(ptr))
}
}
}