use core::ptr::null_mut;
use core::ffi::c_int;
use ffi::{BPMDetect as BPMDetectSys, BPMDetect_BPMDetect_destructor};
use soundtouch_ffi as ffi;
pub struct BPMDetect(BPMDetectSys);
unsafe impl Send for BPMDetect {}
impl Default for BPMDetect {
fn default() -> Self {
Self(unsafe { BPMDetectSys::new(2, 44100) })
}
}
impl BPMDetect {
pub fn new(num_channels: u32, sample_rate: u32) -> Self {
Self(unsafe { BPMDetectSys::new(num_channels as c_int, sample_rate as c_int) })
}
pub fn input_samples(&mut self, samples: &[f32]) {
unsafe {
self.0
.inputSamples(samples.as_ptr(), samples.len() as c_int / self.0.channels)
}
}
pub fn get_bpm(&mut self) -> f32 {
unsafe { ffi::BPMDetect_getBpm(&mut self.0) }
}
pub fn get_beats(&mut self, pos: &mut [f32], values: &mut [f32], max_num: i32) -> i32 {
unsafe {
self.0
.getBeats(pos.as_mut_ptr(), values.as_mut_ptr(), max_num)
}
}
pub fn query_size(&mut self, max_num: i32) -> i32 {
unsafe { self.0.getBeats(null_mut(), null_mut(), max_num) }
}
pub fn update_beat_pos(&mut self, process_samples: i32) {
unsafe { self.0.updateBeatPos(process_samples) }
}
pub fn remove_bias(&mut self) {
unsafe { self.0.removeBias() }
}
pub fn decimate(&mut self, dest: &mut [f32], src: &[f32], numsamples: i32) -> i32 {
unsafe { self.0.decimate(dest.as_mut_ptr(), src.as_ptr(), numsamples) }
}
pub fn update_x_corr(&mut self, process_samples: i32) {
unsafe { self.0.updateXCorr(process_samples) }
}
}
#[cfg(not(windows))]
impl Drop for BPMDetect {
fn drop(&mut self) {
unsafe { BPMDetect_BPMDetect_destructor(&mut self.0) }
}
}