use fmod_sys::*;
use std::ffi::c_void;
use crate::panic_wrapper;
use super::Dsp;
use crate::{FmodResultExt, Result};
pub trait DspCallback {
fn data_parameter_release(dsp: Dsp, info: FMOD_DSP_DATA_PARAMETER_INFO) -> Result<()>;
}
unsafe extern "C" fn callback_impl<C: DspCallback>(
dsp: *mut FMOD_DSP,
kind: FMOD_DSP_CALLBACK_TYPE,
data: *mut c_void,
) -> FMOD_RESULT {
panic_wrapper(|| {
let dsp = unsafe { Dsp::from_ffi(dsp) };
#[allow(clippy::single_match_else)]
let result = match kind {
FMOD_DSP_CALLBACK_DATAPARAMETERRELEASE => {
let info = unsafe { std::ptr::read(data.cast()) };
C::data_parameter_release(dsp, info)
}
_ => {
eprintln!("warning: unknown dsp callback type {kind}");
return FMOD_RESULT::FMOD_OK;
}
};
FMOD_RESULT::from_result(result)
})
}
impl Dsp {
pub fn set_callback<C: DspCallback>(&self) -> Result<()> {
unsafe { FMOD_DSP_SetCallback(self.inner.as_ptr(), Some(callback_impl::<C>)).to_result() }
}
}