1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
//! Parameter host trait - abstraction for plugin parameter management.
//!
//! The `ParameterHost` trait provides the interface between the IPC bridge
//! and the actual parameter storage (typically in the plugin or DAW host).
use crateBridgeError;
use ;
/// Trait for objects that store and manage parameters.
///
/// This trait abstracts parameter storage, allowing the bridge to work with
/// both standalone applications and plugin hosts. Implementations provide
/// access to parameter values, metadata, and metering data for the UI.
///
/// # Thread Safety
///
/// Implementations must be `Send + Sync` to work with the IPC bridge, which
/// operates across multiple threads (audio thread, UI thread, IPC thread).
///
/// # Example
///
/// ```rust,ignore
/// use wavecraft_bridge::{ParameterHost, BridgeError};
/// use wavecraft_protocol::{ParameterInfo, ParameterType, MeterFrame};
/// use std::sync::{Arc, Mutex};
///
/// struct MyHost {
/// params: Arc<Mutex<Vec<f32>>>,
/// }
///
/// impl ParameterHost for MyHost {
/// fn get_parameter(&self, id: &str) -> Option<ParameterInfo> {
/// let idx: usize = id.parse().ok()?;
/// let params = self.params.lock().unwrap();
/// Some(ParameterInfo {
/// id: id.to_string(),
/// name: format!("Param {}", idx),
/// value: params.get(idx).copied()?,
/// default: 0.5,
/// min: 0.0,
/// max: 1.0,
/// param_type: ParameterType::Float,
/// unit: String::new(),
/// })
/// }
///
/// fn set_parameter(&self, id: &str, value: f32) -> Result<(), BridgeError> {
/// let idx: usize = id.parse()
/// .map_err(|_| BridgeError::InvalidParameter(id.to_string()))?;
/// let mut params = self.params.lock().unwrap();
/// if let Some(param) = params.get_mut(idx) {
/// *param = value;
/// Ok(())
/// } else {
/// Err(BridgeError::InvalidParameter(id.to_string()))
/// }
/// }
///
/// fn get_all_parameters(&self) -> Vec<ParameterInfo> {
/// // Return all parameters...
/// vec![]
/// }
///
/// fn get_meter_frame(&self) -> Option<MeterFrame> {
/// None
/// }
///
/// fn request_resize(&self, _width: u32, _height: u32) -> bool {
/// false
/// }
/// }
/// ```