extern crate spandsp_sys;
use std::os::raw::c_int;
use std::ptr::NonNull;
use crate::error::{Result, SpanDspError};
pub struct PowerMeter {
ptr: NonNull<spandsp_sys::power_meter_t>,
}
impl PowerMeter {
pub fn new(shift: i32) -> Result<Self> {
let ptr = unsafe { spandsp_sys::power_meter_init(std::ptr::null_mut(), shift as c_int) };
let ptr = NonNull::new(ptr).ok_or(SpanDspError::InitFailed)?;
Ok(Self { ptr })
}
pub fn update(&mut self, amp: i16) -> i32 {
unsafe { spandsp_sys::power_meter_update(self.ptr.as_ptr(), amp) }
}
pub fn current(&self) -> i32 {
unsafe { spandsp_sys::power_meter_current(self.ptr.as_ptr()) }
}
pub fn current_dbm0(&self) -> f32 {
unsafe { spandsp_sys::power_meter_current_dbm0(self.ptr.as_ptr()) }
}
pub fn current_dbov(&self) -> f32 {
unsafe { spandsp_sys::power_meter_current_dbov(self.ptr.as_ptr()) }
}
pub fn set_damping(&mut self, shift: i32) {
unsafe {
spandsp_sys::power_meter_damping(self.ptr.as_ptr(), shift as c_int);
}
}
pub fn as_ptr(&self) -> *mut spandsp_sys::power_meter_t {
self.ptr.as_ptr()
}
}
impl Drop for PowerMeter {
fn drop(&mut self) {
unsafe {
spandsp_sys::power_meter_free(self.ptr.as_ptr());
}
}
}
pub fn level_dbm0(level: f32) -> i32 {
unsafe { spandsp_sys::power_meter_level_dbm0(level) }
}
pub fn level_dbov(level: f32) -> i32 {
unsafe { spandsp_sys::power_meter_level_dbov(level) }
}