voicemeeter\interface/
general_information.rs

1//! General information about the running Voicemeeter instance.
2//!
3//! # Functions
4//!
5//! * [`get_voicemeeter_type`](VoicemeeterRemote::get_voicemeeter_type)
6//! * [`get_voicemeeter_version`](VoicemeeterRemote::get_voicemeeter_version)
7use crate::types::VoicemeeterApplication;
8
9use super::VoicemeeterRemote;
10
11impl VoicemeeterRemote {
12    /// Get the application type of the running Voicemeeter instance.
13    pub fn get_voicemeeter_type(
14        &self,
15    ) -> Result<VoicemeeterApplication, GetVoicemeeterInformationError> {
16        let mut t = 0i32;
17        let res = unsafe { self.raw.VBVMR_GetVoicemeeterType(&mut t) };
18        match res {
19            0 => Ok(VoicemeeterApplication::from(t)),
20            -1 => Err(GetVoicemeeterInformationError::CannotGetClient),
21            -2 => Err(GetVoicemeeterInformationError::NoServer),
22            s => Err(GetVoicemeeterInformationError::Other(s)),
23        }
24    }
25    /// Get the version of the running Voicemeeter instance.
26    pub fn get_voicemeeter_version(
27        &self,
28    ) -> Result<VoicemeeterVersion, GetVoicemeeterInformationError> {
29        let mut t = 0i32;
30        let res = unsafe { self.raw.VBVMR_GetVoicemeeterVersion(&mut t) };
31        match res {
32            0 => {
33                let a: [u8; 4] = t.to_be_bytes();
34                Ok(VoicemeeterVersion(a[0], a[1], a[2], a[3]))
35            }
36            -1 => Err(GetVoicemeeterInformationError::CannotGetClient),
37            -2 => Err(GetVoicemeeterInformationError::NoServer),
38            s => Err(GetVoicemeeterInformationError::Other(s)),
39        }
40    }
41}
42
43/// Version of the Voicemeeter instance.
44#[derive(Debug, Clone)]
45pub struct VoicemeeterVersion(pub u8, pub u8, pub u8, pub u8);
46
47impl std::fmt::Display for VoicemeeterVersion {
48    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
49        write!(f, "{}.{}.{}.{}", self.0, self.1, self.2, self.3)
50    }
51}
52
53/// Errors that can happen when querying information from Voicemeeter.
54#[derive(Debug, thiserror::Error, Clone)]
55#[non_exhaustive]
56pub enum GetVoicemeeterInformationError {
57    /// Cannot get client.
58    #[error("cannot get client (unexpected)")]
59    CannotGetClient,
60    /// No server found.
61    #[error("no server")]
62    NoServer,
63    /// An unexpected error code occured.
64    #[error("unexpected error occurred: error code {0}")]
65    Other(i32),
66    /// Got an unexcepted response.
67    #[error("got an unexpected response")]
68    InvalidResponse(String),
69}