voicemeeter\interface\parameters/
set_parameters.rs

1//! Functions and data types for setting parameter values.
2//!
3//! # Functions
4//!
5//! * [`set_parameter_float`](VoicemeeterRemote::set_parameter_float)
6//! * [`set_parameter_string`](VoicemeeterRemote::set_parameter_string)
7//! * [`set_parameters`](VoicemeeterRemote::set_parameters)
8use std::ffi::CString;
9
10use crate::types::ParameterNameRef;
11
12use crate::VoicemeeterRemote;
13
14impl VoicemeeterRemote {
15    /// Set the float value of a parameter. See also [`VoicemeeterRemote::parameters()`] to do this with functions.
16    #[tracing::instrument(skip(self))]
17    pub fn set_parameter_float(
18        &self,
19        param: &ParameterNameRef,
20        value: f32,
21    ) -> Result<(), SetParameterError> {
22        let param = CString::new(param.as_ref()).unwrap();
23        tracing::debug!("setting float parameter");
24        let res = unsafe {
25            self.raw
26                .VBVMR_SetParameterFloat(param.as_ptr() as *mut _, value)
27        };
28        match res {
29            0 => Ok(()),
30            -1 => Err(SetParameterError::CannotGetClient),
31            -2 => Err(SetParameterError::NoServer),
32            -3 => Err(SetParameterError::UnknownParameter(
33                param.to_string_lossy().into_owned(),
34            )), // NOTE: Lossless always (assuming vmr doesn't modify :) ), unsafe?
35            s => Err(SetParameterError::Other(s)),
36        }
37    }
38
39    /// Set the string value of a parameter. See also [`VoicemeeterRemote::parameters()`] to do this with functions.
40    #[tracing::instrument(skip(self))]
41    pub fn set_parameter_string(
42        &self,
43        param: &ParameterNameRef,
44        value: &str,
45    ) -> Result<(), SetParameterError> {
46        let param = CString::new(param.as_ref()).unwrap();
47        let value = CString::new(value).unwrap();
48        tracing::debug!("setting string parameter");
49        let res = unsafe {
50            self.raw
51                .VBVMR_SetParameterStringA(param.as_ptr() as *mut _, value.as_ptr() as *mut _)
52        };
53        match res {
54            0 => Ok(()),
55            -1 => Err(SetParameterError::CannotGetClient),
56            -2 => Err(SetParameterError::NoServer),
57            -3 => Err(SetParameterError::UnknownParameter(
58                param.to_string_lossy().into_owned(),
59            )), // NOTE: Lossless always (assuming vmr doesn't modify :) ), unsafe?
60            s => Err(SetParameterError::Other(s)),
61        }
62    }
63
64    // TODO: Example script.
65    /// Set parameters using a script. Similar to macro button scripts.
66    pub fn set_parameters(&self, script: &str) -> Result<(), SetParametersError> {
67        let script = CString::new(script).unwrap();
68        let res = unsafe { self.raw.VBVMR_SetParameters(script.as_ptr() as *mut _) };
69
70        match res {
71            l if l > 0 => Err(SetParametersError::ScriptError(l as usize)),
72            0 => Ok(()),
73            -1 => Err(SetParameterError::CannotGetClient.into()),
74            -2 => Err(SetParameterError::NoServer.into()),
75            s => Err(SetParameterError::Other(s).into()),
76        }
77    }
78}
79
80/// Errors that can happen when setting parameters.
81#[derive(Debug, thiserror::Error, Clone)]
82#[non_exhaustive]
83pub enum SetParametersError {
84    /// Script error
85    #[error("script error on line: {0}")]
86    ScriptError(usize),
87    /// An error occured when setting parameters.
88    #[error(transparent)]
89    SetParameterError(#[from] SetParameterError),
90}
91
92/// Errors that can happen when setting a parameter.
93#[derive(Debug, thiserror::Error, Clone)]
94#[non_exhaustive]
95pub enum SetParameterError {
96    // TODO: is this correct? docs say "error (unexpected)""
97    /// Cannot get client.
98    #[error("cannot get client (unexpected)")]
99    CannotGetClient,
100    /// No server.
101    #[error("no server")]
102    NoServer,
103    /// Unknown parameter.
104    #[error("unknown parameter: {0}")]
105    UnknownParameter(String),
106    /// An unknown error code occured.
107    #[error("unexpected error occurred: error code {0}")]
108    Other(i32),
109}