Move implementation details to the module's end
This commit is contained in:
parent
52f80de5dc
commit
3c950d98d4
1 changed files with 80 additions and 82 deletions
|
@ -62,88 +62,6 @@ pub struct PlainParam<T> {
|
||||||
pub string_to_value: Option<Box<dyn Fn(&str) -> Option<T>>>,
|
pub string_to_value: Option<Box<dyn Fn(&str) -> Option<T>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Describes a single normalized parameter and also stores its value.
|
|
||||||
///
|
|
||||||
/// TODO: This is an implementation detail, maybe hide this somewhere else
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub enum ParamPtr {
|
|
||||||
FloatParam(*mut FloatParam),
|
|
||||||
IntParam(*mut IntParam),
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Describes a struct containing parameters. The idea is that we can have a normal struct
|
|
||||||
/// containing [FloatParam] and other parameter types with attributes describing a unique identifier
|
|
||||||
/// for each parameter. We can then build a mapping from those parameter IDs to the parameters using
|
|
||||||
/// the [param_map] function. That way we can have easy to work with JUCE-style parameter objects in
|
|
||||||
/// the plugin without needing to manually register each parameter, like you would in JUCE.
|
|
||||||
///
|
|
||||||
/// # Safety
|
|
||||||
///
|
|
||||||
/// This implementation is safe when using from the wrapper because the plugin object needs to be
|
|
||||||
/// pinned, and it can never outlive the wrapper.
|
|
||||||
///
|
|
||||||
/// TODO: Create a derive macro for this
|
|
||||||
pub trait Params {
|
|
||||||
/// Create a mapping from unique parameter IDs to parameters. Dereferencing the pointers stored
|
|
||||||
/// in the values is only valid as long as this pinned object is valid.
|
|
||||||
fn param_map(self: Pin<&Self>) -> HashMap<&'static str, ParamPtr>;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ParamPtr {
|
|
||||||
/// Get the human readable name for this parameter.
|
|
||||||
///
|
|
||||||
/// # Safety
|
|
||||||
///
|
|
||||||
/// Calling this function is only safe as long as the object this `ParamPtr` was created for is
|
|
||||||
/// still alive.
|
|
||||||
pub unsafe fn name(&self) -> &'static str {
|
|
||||||
match &self {
|
|
||||||
ParamPtr::FloatParam(p) => (**p).name,
|
|
||||||
ParamPtr::IntParam(p) => (**p).name,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Set this parameter based on a string. Returns whether the updating succeeded. That can fail
|
|
||||||
/// if the string cannot be parsed.
|
|
||||||
///
|
|
||||||
/// # Safety
|
|
||||||
///
|
|
||||||
/// Calling this function is only safe as long as the object this `ParamPtr` was created for is
|
|
||||||
/// still alive.
|
|
||||||
pub unsafe fn from_string(&mut self, string: &str) -> bool {
|
|
||||||
match &self {
|
|
||||||
ParamPtr::FloatParam(p) => (**p).from_string(string),
|
|
||||||
ParamPtr::IntParam(p) => (**p).from_string(string),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Get the normalized `[0, 1]` value for this parameter.
|
|
||||||
///
|
|
||||||
/// # Safety
|
|
||||||
///
|
|
||||||
/// Calling this function is only safe as long as the object this `ParamPtr` was created for is
|
|
||||||
/// still alive.
|
|
||||||
pub unsafe fn normalized_value(&self) -> f32 {
|
|
||||||
match &self {
|
|
||||||
ParamPtr::FloatParam(p) => (**p).normalized_value(),
|
|
||||||
ParamPtr::IntParam(p) => (**p).normalized_value(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Set this parameter based on a normalized value.
|
|
||||||
///
|
|
||||||
/// # Safety
|
|
||||||
///
|
|
||||||
/// Calling this function is only safe as long as the object this `ParamPtr` was created for is
|
|
||||||
/// still alive.
|
|
||||||
pub unsafe fn set_normalized_value(&self, normalized: f32) {
|
|
||||||
match &self {
|
|
||||||
ParamPtr::FloatParam(p) => (**p).set_normalized_value(normalized),
|
|
||||||
ParamPtr::IntParam(p) => (**p).set_normalized_value(normalized),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
macro_rules! impl_plainparam {
|
macro_rules! impl_plainparam {
|
||||||
($ty:ident) => {
|
($ty:ident) => {
|
||||||
impl $ty {
|
impl $ty {
|
||||||
|
@ -227,6 +145,86 @@ impl NormalizebleRange<i32> for Range<i32> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Describes a struct containing parameters. The idea is that we can have a normal struct
|
||||||
|
/// containing [FloatParam] and other parameter types with attributes describing a unique identifier
|
||||||
|
/// for each parameter. We can then build a mapping from those parameter IDs to the parameters using
|
||||||
|
/// the [param_map] function. That way we can have easy to work with JUCE-style parameter objects in
|
||||||
|
/// the plugin without needing to manually register each parameter, like you would in JUCE.
|
||||||
|
///
|
||||||
|
/// # Safety
|
||||||
|
///
|
||||||
|
/// This implementation is safe when using from the wrapper because the plugin object needs to be
|
||||||
|
/// pinned, and it can never outlive the wrapper.
|
||||||
|
///
|
||||||
|
/// TODO: Create a derive macro for this
|
||||||
|
pub trait Params {
|
||||||
|
/// Create a mapping from unique parameter IDs to parameters. Dereferencing the pointers stored
|
||||||
|
/// in the values is only valid as long as this pinned object is valid.
|
||||||
|
fn param_map(self: Pin<&Self>) -> HashMap<&'static str, ParamPtr>;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Internal pointers to parameters. This is an implementation detail used by the wrappers.
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum ParamPtr {
|
||||||
|
FloatParam(*mut FloatParam),
|
||||||
|
IntParam(*mut IntParam),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ParamPtr {
|
||||||
|
/// Get the human readable name for this parameter.
|
||||||
|
///
|
||||||
|
/// # Safety
|
||||||
|
///
|
||||||
|
/// Calling this function is only safe as long as the object this `ParamPtr` was created for is
|
||||||
|
/// still alive.
|
||||||
|
pub unsafe fn name(&self) -> &'static str {
|
||||||
|
match &self {
|
||||||
|
ParamPtr::FloatParam(p) => (**p).name,
|
||||||
|
ParamPtr::IntParam(p) => (**p).name,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Set this parameter based on a string. Returns whether the updating succeeded. That can fail
|
||||||
|
/// if the string cannot be parsed.
|
||||||
|
///
|
||||||
|
/// # Safety
|
||||||
|
///
|
||||||
|
/// Calling this function is only safe as long as the object this `ParamPtr` was created for is
|
||||||
|
/// still alive.
|
||||||
|
pub unsafe fn from_string(&mut self, string: &str) -> bool {
|
||||||
|
match &self {
|
||||||
|
ParamPtr::FloatParam(p) => (**p).from_string(string),
|
||||||
|
ParamPtr::IntParam(p) => (**p).from_string(string),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get the normalized `[0, 1]` value for this parameter.
|
||||||
|
///
|
||||||
|
/// # Safety
|
||||||
|
///
|
||||||
|
/// Calling this function is only safe as long as the object this `ParamPtr` was created for is
|
||||||
|
/// still alive.
|
||||||
|
pub unsafe fn normalized_value(&self) -> f32 {
|
||||||
|
match &self {
|
||||||
|
ParamPtr::FloatParam(p) => (**p).normalized_value(),
|
||||||
|
ParamPtr::IntParam(p) => (**p).normalized_value(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Set this parameter based on a normalized value.
|
||||||
|
///
|
||||||
|
/// # Safety
|
||||||
|
///
|
||||||
|
/// Calling this function is only safe as long as the object this `ParamPtr` was created for is
|
||||||
|
/// still alive.
|
||||||
|
pub unsafe fn set_normalized_value(&self, normalized: f32) {
|
||||||
|
match &self {
|
||||||
|
ParamPtr::FloatParam(p) => (**p).set_normalized_value(normalized),
|
||||||
|
ParamPtr::IntParam(p) => (**p).set_normalized_value(normalized),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
|
Loading…
Add table
Reference in a new issue