Skip to main content

wavecraft_dev_server/
app.rs

1//! Application state with atomic parameter storage
2//!
3//! This simulates plugin parameter state using thread-safe atomics,
4//! demonstrating the pattern that will be used in the actual plugin.
5
6use std::sync::Arc;
7use wavecraft_bridge::{
8    BridgeError, InMemoryParameterHost, ParameterHost, ParameterInfo, ParameterType,
9};
10
11/// Application state with simulated plugin parameters.
12#[derive(Clone)]
13pub struct AppState {
14    host: Arc<InMemoryParameterHost>,
15}
16
17impl AppState {
18    /// Create new application state with default values
19    pub fn new() -> Self {
20        let parameters = vec![
21            ParameterInfo {
22                id: "gain".to_string(),
23                name: "Gain".to_string(),
24                param_type: ParameterType::Float,
25                value: 0.7,
26                default: 0.7,
27                unit: Some("dB".to_string()),
28                group: None,
29            },
30            ParameterInfo {
31                id: "bypass".to_string(),
32                name: "Bypass".to_string(),
33                param_type: ParameterType::Bool,
34                value: 0.0,
35                default: 0.0,
36                unit: None,
37                group: None,
38            },
39            ParameterInfo {
40                id: "mix".to_string(),
41                name: "Mix".to_string(),
42                param_type: ParameterType::Float,
43                value: 1.0,
44                default: 1.0,
45                unit: Some("%".to_string()),
46                group: None,
47            },
48        ];
49
50        Self {
51            host: Arc::new(InMemoryParameterHost::new(parameters)),
52        }
53    }
54}
55
56impl Default for AppState {
57    fn default() -> Self {
58        Self::new()
59    }
60}
61
62impl ParameterHost for AppState {
63    fn get_parameter(&self, id: &str) -> Option<ParameterInfo> {
64        self.host.get_parameter(id)
65    }
66
67    fn set_parameter(&self, id: &str, value: f32) -> Result<(), BridgeError> {
68        self.host.set_parameter(id, value)
69    }
70
71    fn get_all_parameters(&self) -> Vec<ParameterInfo> {
72        self.host.get_all_parameters()
73    }
74
75    fn get_meter_frame(&self) -> Option<wavecraft_protocol::MeterFrame> {
76        self.host.get_meter_frame()
77    }
78
79    fn request_resize(&self, _width: u32, _height: u32) -> bool {
80        self.host.request_resize(_width, _height)
81    }
82}
83
84#[cfg(test)]
85mod tests {
86    use super::*;
87
88    #[test]
89    fn test_default_values() {
90        let state = AppState::new();
91
92        let gain = state.get_parameter("gain").unwrap();
93        assert_eq!(gain.value, 0.7);
94
95        let bypass = state.get_parameter("bypass").unwrap();
96        assert_eq!(bypass.value, 0.0);
97
98        let mix = state.get_parameter("mix").unwrap();
99        assert_eq!(mix.value, 1.0);
100    }
101
102    #[test]
103    fn test_set_parameter() {
104        let state = AppState::new();
105
106        state.set_parameter("gain", 0.5).unwrap();
107        let gain = state.get_parameter("gain").unwrap();
108        assert_eq!(gain.value, 0.5);
109    }
110
111    #[test]
112    fn test_set_parameter_out_of_range() {
113        let state = AppState::new();
114
115        let result = state.set_parameter("gain", 1.5);
116        assert!(result.is_err());
117    }
118
119    #[test]
120    fn test_get_all_parameters() {
121        let state = AppState::new();
122
123        let params = state.get_all_parameters();
124        assert_eq!(params.len(), 3);
125    }
126
127    #[test]
128    fn test_unknown_parameter() {
129        let state = AppState::new();
130
131        assert!(state.get_parameter("unknown").is_none());
132        assert!(state.set_parameter("unknown", 0.5).is_err());
133    }
134}