fmod/core/channel_control/
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 std::ffi::c_void;
9
10use crate::{ChannelControl, System};
11
12impl ChannelControl {
13    // TODO callback
14
15    #[allow(clippy::not_unsafe_ptr_arg_deref)] // fmod doesn't dereference the passed in pointer, and the user dereferencing it is unsafe anyway
16    pub fn set_raw_userdata(&self, userdata: *mut c_void) -> Result<()> {
17        unsafe { FMOD_ChannelControl_SetUserData(self.inner, userdata).to_result() }
18    }
19
20    pub fn get_raw_userdata(&self) -> Result<*mut c_void> {
21        let mut userdata = std::ptr::null_mut();
22        unsafe {
23            FMOD_ChannelControl_GetUserData(self.inner, &mut userdata).to_result()?;
24        }
25        Ok(userdata)
26    }
27
28    pub fn get_system(&self) -> Result<System> {
29        let mut system = std::ptr::null_mut();
30        unsafe { FMOD_ChannelControl_GetSystemObject(self.inner, &mut system).to_result()? }
31        Ok(system.into())
32    }
33}
34
35#[cfg(feature = "userdata-abstraction")]
36impl ChannelControl {
37    pub fn set_userdata(&self, userdata: crate::userdata::Userdata) -> Result<()> {
38        use crate::userdata::{insert_userdata, set_userdata};
39
40        let pointer = self.get_raw_userdata()?;
41        if pointer.is_null() {
42            let key = insert_userdata(userdata, *self);
43            self.set_raw_userdata(key.into())?;
44        } else {
45            set_userdata(pointer.into(), userdata);
46        }
47
48        Ok(())
49    }
50
51    pub fn get_userdata(&self) -> Result<Option<crate::userdata::Userdata>> {
52        use crate::userdata::get_userdata;
53
54        let pointer = self.get_raw_userdata()?;
55        Ok(get_userdata(pointer.into()))
56    }
57}