use std::collections::BTreeMap;
use std::fmt::{Debug, Display};
use std::sync::Arc;
use self::internals::ParamPtr;
pub use nice_plug_derive::Params;
mod boolean;
pub mod enums;
mod float;
mod integer;
pub mod internals;
pub mod persist;
pub mod range;
pub mod smoothing;
pub use boolean::BoolParam;
pub use enums::EnumParam;
pub use float::FloatParam;
pub use integer::IntParam;
bitflags::bitflags! {
#[repr(transparent)]
#[derive(Default, Debug, Clone, Copy, PartialEq, Eq)]
pub struct ParamFlags: u32 {
const BYPASS = 1 << 0;
const NON_AUTOMATABLE = 1 << 1;
const HIDDEN = 1 << 2;
const HIDE_IN_GENERIC_UI = 1 << 3;
}
}
mod sealed {
pub trait Sealed {}
}
pub(crate) use sealed::Sealed;
pub trait Param: Display + Debug + sealed::Sealed {
type Plain: PartialEq;
fn name(&self) -> &str;
fn unit(&self) -> &'static str;
fn poly_modulation_id(&self) -> Option<u32>;
fn modulated_plain_value(&self) -> Self::Plain;
fn modulated_normalized_value(&self) -> f32;
fn unmodulated_plain_value(&self) -> Self::Plain;
fn unmodulated_normalized_value(&self) -> f32;
fn default_plain_value(&self) -> Self::Plain;
#[inline]
fn default_normalized_value(&self) -> f32 {
self.preview_normalized(self.default_plain_value())
}
fn step_count(&self) -> Option<usize>;
fn previous_step(&self, from: Self::Plain, finer: bool) -> Self::Plain;
fn next_step(&self, from: Self::Plain, finer: bool) -> Self::Plain;
fn previous_normalized_step(&self, from: f32, finer: bool) -> f32 {
self.preview_normalized(self.previous_step(self.preview_plain(from), finer))
}
fn next_normalized_step(&self, from: f32, finer: bool) -> f32 {
self.preview_normalized(self.next_step(self.preview_plain(from), finer))
}
fn normalized_value_to_string(&self, normalized: f32, include_unit: bool) -> String;
fn string_to_normalized_value(&self, string: &str) -> Option<f32>;
fn preview_normalized(&self, plain: Self::Plain) -> f32;
fn preview_plain(&self, normalized: f32) -> Self::Plain;
#[inline]
fn preview_modulated(&self, normalized_offset: f32) -> Self::Plain {
self.preview_plain(self.unmodulated_normalized_value() + normalized_offset)
}
fn flags(&self) -> ParamFlags;
fn as_ptr(&self) -> internals::ParamPtr;
}
pub trait InternalParamMut: Param {
unsafe fn _internal_set_plain_value(&self, plain: Self::Plain) -> bool;
unsafe fn _internal_set_normalized_value(&self, normalized: f32) -> bool;
unsafe fn _internal_modulate_value(&self, modulation_offset: f32) -> bool;
unsafe fn _internal_update_smoother(&self, sample_rate: f32, reset: bool);
}
pub unsafe trait Params: 'static + Send + Sync {
fn param_map(&self) -> Vec<(String, ParamPtr, String)>;
fn serialize_fields(&self) -> BTreeMap<String, String> {
BTreeMap::new()
}
#[allow(unused_variables)]
fn deserialize_fields(&self, serialized: &BTreeMap<String, String>) {}
}
unsafe impl<P: Params> Params for Arc<P> {
fn param_map(&self) -> Vec<(String, ParamPtr, String)> {
self.as_ref().param_map()
}
fn serialize_fields(&self) -> BTreeMap<String, String> {
self.as_ref().serialize_fields()
}
fn deserialize_fields(&self, serialized: &BTreeMap<String, String>) {
self.as_ref().deserialize_fields(serialized)
}
}