summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorozpv <39195175+ozpv@users.noreply.github.com>2026-05-22 22:50:58 +0000
committerGitHub <noreply@github.com>2026-05-22 22:50:58 +0000
commitd8464ffdca706fe215b8a0a94d148a9244142067 (patch)
tree6a7f12795849c4a608836cfe238a880cda7784be
parent2bb3f394b31655a928e18fcdea3f62cf77d5496d (diff)
json state for backward and forward compatibility
-rw-r--r--Cargo.toml10
-rw-r--r--src/params.rs58
2 files changed, 35 insertions, 33 deletions
diff --git a/Cargo.toml b/Cargo.toml
index 52b1388..92729f3 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -22,19 +22,15 @@ clack-extensions = { path = "../clack/extensions", features = [
baseview = { git = "https://github.com/RustAudio/baseview.git", rev = "237d323c729f3aa99476ba3efa50129c5e86cad3", version = "0.1.0" }
egui-baseview = { git = "https://codeberg.org/BillyDM/egui-baseview.git", version = "0.7.0" }
-# to serialize parameters and save the plugin state
-# serde json could offer better backwards compatibility
-# for loading parameters in future updates
-prost = "0.14.3"
-
# for calculation
realfft = { version = "3.5.0", features = ["avx", "neon", "sse"] }
num-complex = "0.4.6"
rustc-hash = "2.1.2"
atomic_float = "1.1.0"
-[build-dependencies]
-prost-build = "0.14.3"
+# for saving the state
+serde = { version = "1.0.228", features = ["derive"] }
+serde_json = "1.0.150"
[profile.release]
opt-level = 3
diff --git a/src/params.rs b/src/params.rs
index fd928e0..4957a19 100644
--- a/src/params.rs
+++ b/src/params.rs
@@ -11,13 +11,13 @@ use clack_plugin::{
stream::{InputStream, OutputStream},
utils::Cookie,
};
-use prost::Message;
use std::{
ffi::CStr,
fmt::Write as _,
io::{Read, Write as _},
sync::atomic::{AtomicBool, AtomicU8, AtomicUsize, Ordering},
};
+use serde::{Deserialize, Serialize};
/// The default values of the parameters.
const DEFAULT_ORDER: usize = 1;
@@ -120,38 +120,46 @@ impl RetainParams {
/// Wrapper that helps save plugin parameters using protocol buffers
/// Updating this will change the schema and break old
-#[derive(Message)]
+#[derive(Serialize, Deserialize)]
+#[serde(default)]
struct PluginState {
- #[prost(uint64, tag = "1")]
- order: u64,
- #[prost(uint32, tag = "2")]
- window_size: u32,
- #[prost(uint32, tag = "3")]
- window_type: u32,
- #[prost(bool, tag = "4")]
+ order: usize,
+ window_size: usize,
+ window_type: u8,
complement: bool,
}
+impl Default for PluginState {
+ fn default() -> Self {
+ Self {
+ order: DEFAULT_ORDER,
+ window_size: DEFAULT_WINDOW_SIZE.inner(),
+ window_type: DEFAULT_WINDOW_TYPE.as_byte(),
+ complement: DEFAULT_COMPLEMENT,
+ }
+ }
+}
+
impl PluginState {
- fn copied(local_params: &RetainParams) -> Self {
+ fn copied(params: &RetainParams) -> Self {
Self {
- order: local_params.get_order() as u64,
- window_size: local_params.get_window_size().inner() as u32,
- window_type: local_params.get_window_type().as_byte() as u32,
- complement: local_params.get_complement(),
+ order: params.get_order(),
+ window_size: params.get_window_size().inner(),
+ window_type: params.get_window_type().as_byte(),
+ complement: params.get_complement(),
}
}
- fn get_order(&self) -> u64 {
+ fn get_order(&self) -> usize {
self.order
}
- fn get_window_size(&self) -> u32 {
- self.window_size
+ fn get_window_size(&self) -> WindowSize {
+ self.window_size.into()
}
- fn get_window_type_bits(&self) -> u8 {
- self.window_type as u8
+ fn get_window_type(&self) -> WindowType {
+ self.window_type.into()
}
fn get_complement(&self) -> bool {
@@ -162,11 +170,9 @@ impl PluginState {
/// To save and load the plugin parameters
impl PluginStateImpl for RetainPluginMainThread<'_> {
fn save(&mut self, output: &mut OutputStream) -> Result<(), PluginError> {
- let mut data = vec![];
-
let state = PluginState::copied(&self.shared.params);
- state.encode(&mut data)?;
+ let data = serde_json::to_vec(&state)?;
output.write_all(&data)?;
@@ -177,15 +183,15 @@ impl PluginStateImpl for RetainPluginMainThread<'_> {
let mut data = vec![];
input.read_to_end(&mut data)?;
- let data = PluginState::decode(&data[..])?;
+ let data = serde_json::from_slice::<PluginState>(&data)?;
- self.shared.params.set_order(data.get_order() as usize);
+ self.shared.params.set_order(data.get_order());
self.shared
.params
- .set_window_size((data.get_window_size() as usize).into());
+ .set_window_size(data.get_window_size());
self.shared
.params
- .set_window_type(data.get_window_type_bits().into());
+ .set_window_type(data.get_window_type());
self.shared.params.set_complement(data.get_complement());
Ok(())