From 0fd80330bb6fe075a754b8a5e9da27297cf4a944 Mon Sep 17 00:00:00 2001 From: Robbert van der Helm Date: Tue, 1 Mar 2022 01:48:16 +0100 Subject: [PATCH] Move parameter step count to ParamPtr --- src/param/internals.rs | 20 ++++++++++++++++++++ src/wrapper/vst3/wrapper.rs | 11 +---------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/param/internals.rs b/src/param/internals.rs index 0d144444..b8d4980e 100644 --- a/src/param/internals.rs +++ b/src/param/internals.rs @@ -3,6 +3,7 @@ use std::collections::HashMap; use std::pin::Pin; +use super::range::Range; use super::Param; /// Re-export for use in the [Params] proc-macro. @@ -82,6 +83,25 @@ where } impl ParamPtr { + /// Get the number of steps for this paramter, if it is stepped. + /// + /// # Safety + /// + /// Calling this function is only safe as long as the object this `ParamPtr` was created for is + /// still alive. + pub unsafe fn step_count(&self) -> Option { + match self { + ParamPtr::FloatParam(_) => None, + ParamPtr::IntParam(p) => match (**p).range { + Range::Linear { min, max } => Some(max - min), + Range::Skewed { min, max, .. } => Some(max - min), + Range::SymmetricalSkewed { min, max, .. } => Some(max - min), + }, + ParamPtr::BoolParam(_) => Some(1), + ParamPtr::EnumParam(p) => Some((**p).len() as i32 - 1), + } + } + /// Get the human readable name for this parameter. /// /// # Safety diff --git a/src/wrapper/vst3/wrapper.rs b/src/wrapper/vst3/wrapper.rs index b651fbd9..15718d25 100644 --- a/src/wrapper/vst3/wrapper.rs +++ b/src/wrapper/vst3/wrapper.rs @@ -433,16 +433,7 @@ impl IEditController for Wrapper

{ u16strlcpy(&mut info.title, param_ptr.name()); u16strlcpy(&mut info.short_title, param_ptr.name()); u16strlcpy(&mut info.units, param_ptr.unit()); - info.step_count = match param_ptr { - ParamPtr::FloatParam(_) => 0, - ParamPtr::IntParam(p) => match (**p).range { - Range::Linear { min, max } => max - min, - Range::Skewed { min, max, .. } => max - min, - Range::SymmetricalSkewed { min, max, .. } => max - min, - }, - ParamPtr::BoolParam(_) => 1, - ParamPtr::EnumParam(p) => (**p).len() as i32 - 1, - }; + info.step_count = param_ptr.step_count().unwrap_or(0); info.default_normalized_value = *default_value as f64; info.unit_id = vst3_sys::vst::kRootUnitId; info.flags = vst3_sys::vst::ParameterFlags::kCanAutomate as i32;