diff options
| author | ozpv <39195175+ozpv@users.noreply.github.com> | 2026-05-19 01:48:04 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-05-19 01:48:04 -0500 |
| commit | 0f0bc6b88fe8cb80b947e576cdfa4a7124982f54 (patch) | |
| tree | faa432745faa91a9d0583c05a7386c0d9d0a437c /src/params.rs | |
| parent | 88bd6307ee43f3c3609d5b2f49d440d285185765 (diff) | |
add complement parameter
Diffstat (limited to 'src/params.rs')
| -rw-r--r-- | src/params.rs | 170 |
1 files changed, 73 insertions, 97 deletions
diff --git a/src/params.rs b/src/params.rs index 0762cd2..605e305 100644 --- a/src/params.rs +++ b/src/params.rs @@ -8,7 +8,7 @@ use clack_extensions::{ state::PluginStateImpl, }; use clack_plugin::{ - events::{event_types::ParamValueEvent, spaces::CoreEventSpace}, + events::spaces::CoreEventSpace, prelude::*, stream::{InputStream, OutputStream}, utils::Cookie, @@ -24,7 +24,8 @@ use std::{ /// The default value of the order parameter. const DEFAULT_ORDER: usize = 1; pub const DEFAULT_WINDOW_SIZE: WindowSize = WindowSize::Size4096; -const DEFAULT_WINDOW_TYPE: WindowType = WindowType::Hann; +pub const DEFAULT_WINDOW_TYPE: WindowType = WindowType::Hann; +const DEFAULT_COMPLEMENT: bool = false; /// A struct that manages the parameters for our plugin. /// @@ -38,8 +39,8 @@ pub struct RetainParamsShared { window_size: AtomicUsize, /// Type of window function of FFT window_type: AtomicU8, - /// Whether a gesture is currently active or not on the parameters - has_gesture: AtomicBool, + /// Whether it retains or removes the highest magnitudes + complement: AtomicBool, } impl RetainParamsShared { @@ -47,31 +48,17 @@ impl RetainParamsShared { pub const PARAM_ORDER_ID: ClapId = ClapId::new(1); pub const PARAM_WINDOW_SIZE_ID: ClapId = ClapId::new(2); pub const PARAM_WINDOW_TYPE_ID: ClapId = ClapId::new(3); + pub const PARAM_COMPLEMENT_ID: ClapId = ClapId::new(3); /// Initializes the shared parameter value. pub fn new() -> Self { Self { order: AtomicUsize::new(DEFAULT_ORDER), window_size: AtomicUsize::new(DEFAULT_WINDOW_SIZE.inner()), - window_type: AtomicU8::new(DEFAULT_WINDOW_TYPE.as_bits()), - has_gesture: AtomicBool::new(false), + window_type: AtomicU8::new(DEFAULT_WINDOW_TYPE.as_byte()), + complement: AtomicBool::new(DEFAULT_COMPLEMENT), } } - - pub fn get_window_size(&self) -> usize { - self.window_size.load(Ordering::Relaxed) - } -} - -/// A param gesture change type -#[derive(Copy, Clone, Eq, PartialEq)] -pub enum GestureChange { - /// User started changing a parameter - Begin, - /// User finished changing a parameter - End, - /// User both started and finished changing a parameter during the current block - Both, } /// The local-side of parameter state. @@ -88,8 +75,8 @@ pub struct RetainParamsLocal { window_size: usize, /// The local value of the type of window function parameter. window_type: WindowType, - /// Whether the user is currently changing the parameter, that we know of - pub has_gesture: bool, + /// The local value of the complement parameter. + complement: bool, } impl RetainParamsLocal { @@ -98,8 +85,8 @@ impl RetainParamsLocal { Self { order: shared.order.load(Ordering::Relaxed), window_size: shared.window_size.load(Ordering::Relaxed), - window_type: WindowType::from_bits(shared.window_type.load(Ordering::Relaxed)), - has_gesture: shared.has_gesture.load(Ordering::Relaxed), + window_type: WindowType::from_byte(shared.window_type.load(Ordering::Relaxed)), + complement: shared.complement.load(Ordering::Relaxed), } } @@ -137,8 +124,20 @@ impl RetainParamsLocal { /// Sets the current local window type from `bits`. #[inline] - pub fn set_window_type_from_bits(&mut self, bits: u8) { - self.window_type = WindowType::from_bits(bits); + pub fn set_window_type_from_byte(&mut self, bits: u8) { + self.window_type = WindowType::from_byte(bits); + } + + /// Returns the current local complement. + #[inline] + pub fn get_complement(&self) -> bool { + self.complement + } + + /// Sets the current local complement to `value`. + #[inline] + pub fn set_complement(&mut self, value: bool) { + self.complement = value; } /// Fetch updates from the `shared` state. @@ -148,15 +147,18 @@ impl RetainParamsLocal { pub fn fetch_updates(&mut self, shared: &RetainParamsShared) -> bool { let latest_order = shared.order.load(Ordering::Relaxed); let latest_window_size = shared.window_size.load(Ordering::Relaxed); - let latest_window_type = WindowType::from_bits(shared.window_type.load(Ordering::Relaxed)); + let latest_window_type = WindowType::from_byte(shared.window_type.load(Ordering::Relaxed)); + let latest_complement = shared.complement.load(Ordering::Relaxed); if latest_order != self.order || latest_window_size != self.order || latest_window_type != self.window_type + || latest_complement != self.complement { self.order = latest_order; self.window_size = latest_window_size; self.window_type = latest_window_type; + self.complement = latest_complement; true } else { @@ -173,48 +175,13 @@ impl RetainParamsLocal { let previous_window_size = shared.window_size.swap(self.window_size, Ordering::Relaxed); let previous_window_type = shared .window_type - .swap(self.window_type.as_bits(), Ordering::Relaxed); + .swap(self.window_type.as_byte(), Ordering::Relaxed); + let previous_complement = shared.complement.swap(self.complement, Ordering::Relaxed); previous_order != self.order || previous_window_size != self.window_size - || previous_window_type != self.window_type.as_bits() - } - - /// Pushes the local gesture state to the `shared` state. - #[inline] - pub fn push_gesture(&self, shared: &RetainParamsShared) { - shared - .has_gesture - .store(self.has_gesture, Ordering::Relaxed); - } - - /// Fetches updates to the gesture state. - /// - /// If a gesture state changed occurred, it is returned. - /// If the gesture did not change from the last update, `None` is returned. - #[inline] - pub fn fetch_gesture( - &mut self, - shared: &RetainParamsShared, - has_ui_param_updates: bool, - ) -> Option<GestureChange> { - let previous_gesture = self.has_gesture; - - self.has_gesture = shared.has_gesture.load(Ordering::Relaxed); - - if previous_gesture == self.has_gesture { - return if has_ui_param_updates && !self.has_gesture { - Some(GestureChange::Both) - } else { - None - }; - } - - if previous_gesture { - Some(GestureChange::End) - } else { - Some(GestureChange::Begin) - } + || previous_window_type != self.window_type.as_byte() + || previous_complement != self.complement } /// Handles incoming events. @@ -230,30 +197,15 @@ impl RetainParamsLocal { if event.param_id() == RetainParamsShared::PARAM_WINDOW_SIZE_ID { self.set_window_size(event.value() as usize); } - } - } - /// Sends the value of the parameters to the host, via a [`ParamValueEvent`]. - pub fn send_param_events(&self, output_events: &mut OutputEvents) { - let order_event = ParamValueEvent::new( - 0, - RetainParamsShared::PARAM_ORDER_ID, - Pckn::match_all(), - self.order as f64, - Cookie::empty(), - ); - - let _ = output_events.try_push(order_event); - - let window_size_event = ParamValueEvent::new( - 0, - RetainParamsShared::PARAM_ORDER_ID, - Pckn::match_all(), - self.window_size as f64, - Cookie::empty(), - ); - - let _ = output_events.try_push(window_size_event); + if event.param_id() == RetainParamsShared::PARAM_WINDOW_TYPE_ID { + self.set_window_type_from_byte(event.value() as u8); + } + + if event.param_id() == RetainParamsShared::PARAM_COMPLEMENT_ID { + self.set_complement(event.value() != 0.0); + } + } } } @@ -266,6 +218,8 @@ struct PluginState { window_size: u32, #[prost(uint32, tag = "3")] window_type: u32, + #[prost(bool, tag = "4")] + complement: bool, } impl PluginState { @@ -273,7 +227,8 @@ impl PluginState { Self { order: local_params.get_order() as u64, window_size: local_params.get_window_size() as u32, - window_type: local_params.get_window_type().as_bits() as u32, + window_type: local_params.get_window_type().as_byte() as u32, + complement: local_params.get_complement(), } } @@ -288,6 +243,10 @@ impl PluginState { fn get_window_type_bits(&self) -> u8 { self.window_type as u8 } + + fn get_complement(&self) -> bool { + self.complement + } } /// Implementation of the State extension. @@ -315,7 +274,8 @@ impl PluginStateImpl for RetainPluginMainThread<'_> { self.params.set_order(data.get_order() as usize); self.params.set_window_size(data.get_window_size() as usize); self.params - .set_window_type_from_bits(data.get_window_type_bits()); + .set_window_type_from_byte(data.get_window_type_bits()); + self.params.set_complement(data.get_complement()); self.params.push_updates(&self.shared.params); @@ -325,7 +285,7 @@ impl PluginStateImpl for RetainPluginMainThread<'_> { impl PluginMainThreadParams for RetainPluginMainThread<'_> { fn count(&mut self) -> u32 { - 2 + 4 } fn get_info(&mut self, param_index: u32, info: &mut ParamInfoWriter) { @@ -363,7 +323,18 @@ impl PluginMainThreadParams for RetainPluginMainThread<'_> { module: b"", min_value: 0.0, max_value: 4.0, - default_value: DEFAULT_WINDOW_TYPE.as_bits() as f64, + default_value: DEFAULT_WINDOW_TYPE.as_byte() as f64, + }); + + info.set(&ParamInfo { + id: RetainParamsShared::PARAM_COMPLEMENT_ID, + flags: ParamInfoFlags::IS_READONLY, + cookie: Cookie::default(), + name: b"Complement", + module: b"", + min_value: 0.0, + max_value: 1.0, + default_value: DEFAULT_COMPLEMENT as u8 as f64, }); } @@ -372,28 +343,33 @@ impl PluginMainThreadParams for RetainPluginMainThread<'_> { RetainParamsShared::PARAM_ORDER_ID => Some(self.params.get_order() as f64), RetainParamsShared::PARAM_WINDOW_SIZE_ID => Some(self.params.get_window_size() as f64), RetainParamsShared::PARAM_WINDOW_TYPE_ID => { - Some(self.params.get_window_type().as_bits() as f64) + Some(self.params.get_window_type().as_byte() as f64) + } + RetainParamsShared::PARAM_COMPLEMENT_ID => { + Some(self.params.get_complement() as u8 as f64) } _ => None, } } + // TODO: update for order fn value_to_text( &mut self, param_id: ClapId, value: f64, writer: &mut ParamDisplayWriter, ) -> std::fmt::Result { - if param_id == 1 { + if param_id == RetainParamsShared::PARAM_ORDER_ID { write!(writer, "{0:.2} %", value * 100.0) } else { Err(std::fmt::Error) } } + // TODO: update for order fn text_to_value(&mut self, param_id: ClapId, text: &CStr) -> Option<f64> { let text = text.to_str().ok()?; - if param_id == 1 { + if param_id == RetainParamsShared::PARAM_ORDER_ID { let text = text.strip_suffix('%').unwrap_or(text).trim(); let percentage: f64 = text.parse().ok()?; |
