Skip to main content

rustriff_lib/commands/
default_controls.rs

1use crate::commands::helpers::persist_amp_config;
2use crate::domain::dto::amp_config_dto::AmpConfigDto;
3use crate::domain::dto::tone_stack_dto::ToneStackDto;
4use crate::services::amp_config_service::AmpConfigPersistenceService;
5use crate::services::audio_service::AudioService;
6use std::sync::Mutex;
7
8/// Retrieves the current amplifier configuration as an [`AmpConfigDto`].
9///
10/// This command captures the state of gain, master volume, and other parameters
11/// from the [`AudioService`].
12///
13/// # Arguments
14///
15/// * `audio_service` - The shared [`AudioService`] state, accessed via Tauri's state management.
16///
17/// # Returns
18///
19/// Returns `Ok(AmpConfigDto)` on success, or `Err(String)` if the service state cannot be locked.
20#[tauri::command]
21pub fn get_amp_config(
22    audio_service: tauri::State<'_, Mutex<AudioService>>,
23) -> Result<AmpConfigDto, String> {
24    let service = audio_service
25        .lock()
26        .map_err(|_| "Failed to lock audio service".to_string())?;
27
28    Ok(AmpConfigDto::from_service(&service))
29}
30
31/// Toggles the audio loopback on or off.
32///
33/// Delegates to [`AudioService::toggle_loopback`] to start or stop audio processing.
34///
35/// # Arguments
36///
37/// * `audio_service` - The shared [`AudioService`] state.
38/// * `is_on` - Whether to enable (`true`) or disable (`false`) the loopback.
39#[tauri::command]
40pub(crate) fn toggle_on_off(
41    audio_service: tauri::State<Mutex<AudioService>>,
42    persistence_service: tauri::State<Mutex<AmpConfigPersistenceService>>,
43    is_on: bool,
44) {
45    let mut service = audio_service.inner().lock().unwrap();
46    service.toggle_loopback(is_on);
47    persist_amp_config(&service, &persistence_service);
48}
49
50/// Sets the input gain level for the amplifier.
51///
52/// Applies the gain value to the [`Channel`] within the [`AudioService`].
53///
54/// # Arguments
55///
56/// * `audio_service` - The shared [`AudioService`] state.
57/// * `gain` - The gain value (must be a positive value).
58///
59/// [`Channel`]: crate::domain::channel::Channel
60#[tauri::command]
61pub(crate) fn set_gain(
62    audio_service: tauri::State<Mutex<AudioService>>,
63    persistence_service: tauri::State<Mutex<AmpConfigPersistenceService>>,
64    gain: f32,
65) {
66    let service = audio_service.inner().lock().unwrap();
67    service
68        .channels()
69        .iter()
70        .find(|c| c.id() == *service.current_channel_id())
71        .unwrap()
72        .set_gain(gain);
73    persist_amp_config(&service, &persistence_service);
74}
75
76/// Sets the master volume level for the amplifier.
77///
78/// Applies the master volume value to the [`AudioService`].
79///
80/// # Arguments
81///
82/// * `audio_service` - The shared [`AudioService`] state.
83/// * `master_volume` - The master volume value (must be positive).
84///
85/// [`AudioService`]: crate::services::audio_service::AudioService
86#[tauri::command]
87pub(crate) fn set_master_volume(
88    audio_service: tauri::State<Mutex<AudioService>>,
89    persistence_service: tauri::State<Mutex<AmpConfigPersistenceService>>,
90    master_volume: f32,
91) {
92    let service = audio_service.inner().lock().unwrap();
93    service.set_master_volume(master_volume);
94    persist_amp_config(&service, &persistence_service);
95}
96
97/// Sets the tone stack configuration for the current channel.
98///
99/// Applies the provided [`ToneStackDto`] to the active [`Channel`] within the
100/// [`AudioService`].
101///
102/// # Arguments
103///
104/// * `audio_service` - The shared [`AudioService`] state.
105/// * `tone_stack` - The tone stack configuration to apply.
106///
107/// [`Channel`]: crate::domain::channel::Channel
108/// [`AudioService`]: crate::services::audio_service::AudioService
109#[tauri::command]
110pub(crate) fn set_tone_stack(
111    audio_service: tauri::State<Mutex<AudioService>>,
112    persistence_service: tauri::State<Mutex<AmpConfigPersistenceService>>,
113    tone_stack: ToneStackDto,
114) {
115    let service = audio_service.inner().lock().unwrap();
116    service
117        .channels()
118        .iter()
119        .find(|c| c.id() == *service.current_channel_id())
120        .unwrap()
121        .set_tone_stack(tone_stack);
122    persist_amp_config(&service, &persistence_service);
123}
124
125/// Sets the bass level for the current channel.
126///
127/// Updates the bass parameter of the active [`Channel`] within the
128/// [`AudioService`].
129///
130/// # Arguments
131///
132/// * `audio_service` - The shared [`AudioService`] state.
133/// * `bass` - The bass level value.
134///
135/// [`Channel`]: crate::domain::channel::Channel
136/// [`AudioService`]: crate::services::audio_service::AudioService
137#[tauri::command]
138pub(crate) fn set_bass(
139    audio_service: tauri::State<Mutex<AudioService>>,
140    persistence_service: tauri::State<Mutex<AmpConfigPersistenceService>>,
141    bass: f32,
142) {
143    let service = audio_service.inner().lock().unwrap();
144    service
145        .channels()
146        .iter()
147        .find(|c| c.id() == *service.current_channel_id())
148        .unwrap()
149        .set_bass(bass);
150    persist_amp_config(&service, &persistence_service);
151}
152
153/// Sets the middle frequency level for the current channel.
154///
155/// Updates the mid-range parameter of the active [`Channel`] within the
156/// [`AudioService`].
157///
158/// # Arguments
159///
160/// * `audio_service` - The shared [`AudioService`] state.
161/// * `middle` - The middle frequency level value.
162///
163/// [`Channel`]: crate::domain::channel::Channel
164/// [`AudioService`]: crate::services::audio_service::AudioService
165#[tauri::command]
166pub(crate) fn set_middle(
167    audio_service: tauri::State<Mutex<AudioService>>,
168    persistence_service: tauri::State<Mutex<AmpConfigPersistenceService>>,
169    middle: f32,
170) {
171    let service = audio_service.inner().lock().unwrap();
172    service
173        .channels()
174        .iter()
175        .find(|c| c.id() == *service.current_channel_id())
176        .unwrap()
177        .set_middle(middle);
178    persist_amp_config(&service, &persistence_service);
179}
180
181/// Sets the treble level for the current channel.
182///
183/// Updates the high-frequency parameter of the active [`Channel`] within the
184/// [`AudioService`].
185///
186/// # Arguments
187///
188/// * `audio_service` - The shared [`AudioService`] state.
189/// * `treble` - The treble level value.
190///
191/// [`Channel`]: crate::domain::channel::Channel
192/// [`AudioService`]: crate::services::audio_service::AudioService
193#[tauri::command]
194pub(crate) fn set_treble(
195    audio_service: tauri::State<Mutex<AudioService>>,
196    persistence_service: tauri::State<Mutex<AmpConfigPersistenceService>>,
197    treble: f32,
198) {
199    let service = audio_service.inner().lock().unwrap();
200    service
201        .channels()
202        .iter()
203        .find(|c| c.id() == *service.current_channel_id())
204        .unwrap()
205        .set_treble(treble);
206    persist_amp_config(&service, &persistence_service);
207}
208
209/// Sets the output volume for the current channel.
210///
211/// Applies the volume level to the active [`Channel`] within the
212/// [`AudioService`].
213///
214/// # Arguments
215///
216/// * `audio_service` - The shared [`AudioService`] state.
217/// * `volume` - The volume level value.
218///
219/// [`Channel`]: crate::domain::channel::Channel
220/// [`AudioService`]: crate::services::audio_service::AudioService
221#[tauri::command]
222pub(crate) fn set_volume(
223    audio_service: tauri::State<Mutex<AudioService>>,
224    persistence_service: tauri::State<Mutex<AmpConfigPersistenceService>>,
225    volume: f32,
226) {
227    let service = audio_service.inner().lock().unwrap();
228    service
229        .channels()
230        .iter()
231        .find(|c| c.id() == *service.current_channel_id())
232        .unwrap()
233        .set_volume(volume);
234    persist_amp_config(&service, &persistence_service);
235}