use super::{InternalParamMut, Param, ParamFlags};
#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
pub enum ParamPtr {
FloatParam(*const super::FloatParam),
IntParam(*const super::IntParam),
BoolParam(*const super::BoolParam),
EnumParam(*const super::enums::EnumParamInner),
}
unsafe impl Send for ParamPtr {}
unsafe impl Sync for ParamPtr {}
macro_rules! param_ptr_forward(
($vis:vis unsafe fn $method:ident(&self $(, $arg_name:ident: $arg_ty:ty)*) $(-> $ret:ty)?) => {
$vis unsafe fn $method(&self $(, $arg_name: $arg_ty)*) $(-> $ret)? {
unsafe {
match self {
ParamPtr::FloatParam(p) => (**p).$method($($arg_name),*),
ParamPtr::IntParam(p) => (**p).$method($($arg_name),*),
ParamPtr::BoolParam(p) => (**p).$method($($arg_name),*),
ParamPtr::EnumParam(p) => (**p).$method($($arg_name),*),
}
}
}
};
($vis:vis unsafe fn $method:ident(&mut self $(, $arg_name:ident: $arg_ty:ty)*) $(-> $ret:ty)?) => {
$vis unsafe fn $method(&mut self $(, $arg_name: $arg_ty)*) $(-> $ret)? {
match self {
ParamPtr::FloatParam(p) => (**p).$method($($arg_name),*),
ParamPtr::IntParam(p) => (**p).$method($($arg_name),*),
ParamPtr::BoolParam(p) => (**p).$method($($arg_name),*),
ParamPtr::EnumParam(p) => (**p).$method($($arg_name),*),
}
}
};
);
impl ParamPtr {
param_ptr_forward!(pub unsafe fn name(&self) -> &str);
param_ptr_forward!(pub unsafe fn unit(&self) -> &'static str);
param_ptr_forward!(pub unsafe fn poly_modulation_id(&self) -> Option<u32>);
param_ptr_forward!(pub unsafe fn modulated_normalized_value(&self) -> f32);
param_ptr_forward!(pub unsafe fn unmodulated_normalized_value(&self) -> f32);
param_ptr_forward!(pub unsafe fn default_normalized_value(&self) -> f32);
param_ptr_forward!(pub unsafe fn step_count(&self) -> Option<usize>);
param_ptr_forward!(pub unsafe fn previous_normalized_step(&self, from: f32, finer: bool) -> f32);
param_ptr_forward!(pub unsafe fn next_normalized_step(&self, from: f32, finer: bool) -> f32);
param_ptr_forward!(pub unsafe fn normalized_value_to_string(&self, normalized: f32, include_unit: bool) -> String);
param_ptr_forward!(pub unsafe fn string_to_normalized_value(&self, string: &str) -> Option<f32>);
param_ptr_forward!(pub unsafe fn flags(&self) -> ParamFlags);
param_ptr_forward!(pub unsafe fn _internal_set_normalized_value(&self, normalized: f32) -> bool);
param_ptr_forward!(pub unsafe fn _internal_modulate_value(&self, modulation_offset: f32) -> bool);
param_ptr_forward!(pub unsafe fn _internal_update_smoother(&self, sample_rate: f32, reset: bool));
pub unsafe fn modulated_plain_value(&self) -> f32 {
unsafe {
match self {
ParamPtr::FloatParam(p) => (**p).modulated_plain_value(),
ParamPtr::IntParam(p) => (**p).modulated_plain_value() as f32,
ParamPtr::BoolParam(p) => (**p).modulated_normalized_value(),
ParamPtr::EnumParam(p) => (**p).modulated_plain_value() as f32,
}
}
}
pub unsafe fn unmodulated_plain_value(&self) -> f32 {
unsafe {
match self {
ParamPtr::FloatParam(p) => (**p).unmodulated_plain_value(),
ParamPtr::IntParam(p) => (**p).unmodulated_plain_value() as f32,
ParamPtr::BoolParam(p) => (**p).unmodulated_normalized_value(),
ParamPtr::EnumParam(p) => (**p).unmodulated_plain_value() as f32,
}
}
}
pub unsafe fn default_plain_value(&self) -> f32 {
unsafe {
match self {
ParamPtr::FloatParam(p) => (**p).default_plain_value(),
ParamPtr::IntParam(p) => (**p).default_plain_value() as f32,
ParamPtr::BoolParam(p) => (**p).modulated_normalized_value(),
ParamPtr::EnumParam(p) => (**p).default_plain_value() as f32,
}
}
}
pub unsafe fn preview_normalized(&self, plain: f32) -> f32 {
unsafe {
match self {
ParamPtr::FloatParam(p) => (**p).preview_normalized(plain),
ParamPtr::IntParam(p) => (**p).preview_normalized(plain as i32),
ParamPtr::BoolParam(_) => plain,
ParamPtr::EnumParam(p) => (**p).preview_normalized(plain as i32),
}
}
}
pub unsafe fn preview_plain(&self, normalized: f32) -> f32 {
unsafe {
match self {
ParamPtr::FloatParam(p) => (**p).preview_plain(normalized),
ParamPtr::IntParam(p) => (**p).preview_plain(normalized) as f32,
ParamPtr::BoolParam(_) => normalized,
ParamPtr::EnumParam(p) => (**p).preview_plain(normalized) as f32,
}
}
}
}