#![allow(unsafe_code)]
use std::ptr::NonNull;
use libc::free;
use super::{
super::types::{cava_destroy, cava_execute, cava_plan},
AudioInput, AudioOutput,
};
pub(crate) struct Plan {
ptr: NonNull<cava_plan>,
}
impl Plan {
pub(crate) fn from_raw(ptr: NonNull<cava_plan>) -> Self {
Self { ptr }
}
pub fn execute(&self, audio_input: &AudioInput, audio_output: &AudioOutput) {
unsafe {
let input_data = audio_input.inner.as_ref().get_ref();
let output_data = audio_output.inner.as_ref().get_ref();
cava_execute(
input_data.cava_in,
input_data.samples_counter,
output_data.cava_out,
self.ptr.as_ptr(),
);
}
}
}
impl Drop for Plan {
fn drop(&mut self) {
unsafe {
cava_destroy(self.ptr.as_ptr());
free(self.ptr.as_ptr().cast());
}
}
}
unsafe impl Send for Plan {}