use std::os::raw::c_int;
use std::ptr::NonNull;
use crate::error::{Result, SpanDspError};
use crate::t30::T30State;
pub struct FaxState {
inner: NonNull<spandsp_sys::fax_state_t>,
}
impl FaxState {
pub fn new(calling_party: bool) -> Result<Self> {
let ptr = unsafe { spandsp_sys::fax_init(std::ptr::null_mut(), calling_party) };
let inner = NonNull::new(ptr).ok_or(SpanDspError::InitFailed)?;
Ok(Self { inner })
}
pub fn as_ptr(&self) -> *mut spandsp_sys::fax_state_t {
self.inner.as_ptr()
}
pub fn get_t30_state(&self) -> Result<T30State> {
let ptr = unsafe { spandsp_sys::fax_get_t30_state(self.inner.as_ptr()) };
unsafe { T30State::from_raw(ptr, false) }
}
pub fn rx(&self, samples: &mut [i16]) -> usize {
unsafe {
spandsp_sys::fax_rx(
self.inner.as_ptr(),
samples.as_mut_ptr(),
samples.len() as c_int,
) as usize
}
}
pub fn tx(&self, buf: &mut [i16]) -> usize {
unsafe {
spandsp_sys::fax_tx(self.inner.as_ptr(), buf.as_mut_ptr(), buf.len() as c_int) as usize
}
}
pub fn set_transmit_on_idle(&self, on: bool) {
unsafe {
spandsp_sys::fax_set_transmit_on_idle(self.inner.as_ptr(), on as c_int);
}
}
pub fn restart(&self, calling_party: bool) -> Result<()> {
let rc = unsafe { spandsp_sys::fax_restart(self.inner.as_ptr(), calling_party) };
if rc != 0 {
return Err(SpanDspError::ErrorCode(rc));
}
Ok(())
}
}
unsafe impl Send for FaxState {}
impl Drop for FaxState {
fn drop(&mut self) {
unsafe {
spandsp_sys::fax_free(self.inner.as_ptr());
}
}
}