fmod/core/sound_group/
general.rs

1// Copyright (c) 2024 Lily Lyons
2//
3// This Source Code Form is subject to the terms of the Mozilla Public
4// License, v. 2.0. If a copy of the MPL was not distributed with this
5// file, You can obtain one at https://mozilla.org/MPL/2.0/.
6
7use fmod_sys::*;
8use lanyard::Utf8CString;
9use std::ffi::{c_int, c_void};
10
11use crate::{get_string, SoundGroup, System};
12
13impl SoundGroup {
14    /// Retrieves the name of the sound group.
15    pub fn get_name(&self) -> Result<Utf8CString> {
16        get_string(|name| unsafe {
17            FMOD_SoundGroup_GetName(self.inner, name.as_mut_ptr().cast(), name.len() as c_int)
18        })
19    }
20
21    /// Releases a soundgroup object and returns all sounds back to the master sound group.
22    ///
23    /// You cannot release the master [`SoundGroup`].
24    pub fn release(&self) -> Result<()> {
25        // release userdata
26        #[cfg(feature = "userdata-abstraction")]
27        let userdata = self.get_raw_userdata()?;
28
29        unsafe {
30            FMOD_SoundGroup_Release(self.inner).to_result()?;
31        }
32
33        // release/remove userdata if it is not null
34        #[cfg(feature = "userdata-abstraction")]
35        if !userdata.is_null() {
36            crate::userdata::remove_userdata(userdata.into());
37            self.set_raw_userdata(std::ptr::null_mut())?;
38        }
39
40        Ok(())
41    }
42
43    #[allow(clippy::not_unsafe_ptr_arg_deref)] // fmod doesn't dereference the passed in pointer, and the user dereferencing it is unsafe anyway
44    pub fn set_raw_userdata(&self, userdata: *mut c_void) -> Result<()> {
45        unsafe { FMOD_SoundGroup_SetUserData(self.inner, userdata).to_result() }
46    }
47
48    pub fn get_raw_userdata(&self) -> Result<*mut c_void> {
49        let mut userdata = std::ptr::null_mut();
50        unsafe {
51            FMOD_SoundGroup_GetUserData(self.inner, &mut userdata).to_result()?;
52        }
53        Ok(userdata)
54    }
55
56    /// Retrieves the parent System object.
57    pub fn get_system(&self) -> Result<System> {
58        let mut system = std::ptr::null_mut();
59        unsafe { FMOD_SoundGroup_GetSystemObject(self.inner, &mut system).to_result()? };
60        Ok(system.into())
61    }
62}
63
64#[cfg(feature = "userdata-abstraction")]
65impl SoundGroup {
66    pub fn set_userdata(&self, userdata: crate::userdata::Userdata) -> Result<()> {
67        use crate::userdata::{insert_userdata, set_userdata};
68
69        let pointer = self.get_raw_userdata()?;
70        if pointer.is_null() {
71            let key = insert_userdata(userdata, *self);
72            self.set_raw_userdata(key.into())?;
73        } else {
74            set_userdata(pointer.into(), userdata);
75        }
76
77        Ok(())
78    }
79
80    pub fn get_userdata(&self) -> Result<Option<crate::userdata::Userdata>> {
81        use crate::userdata::get_userdata;
82
83        let pointer = self.get_raw_userdata()?;
84        Ok(get_userdata(pointer.into()))
85    }
86}