use crate::context::Context;
use crate::error::{to_option_error, SteamAudioError};
#[derive(Debug)]
pub struct EmbreeDevice(audionimbus_sys::IPLEmbreeDevice);
impl EmbreeDevice {
pub fn try_new(context: &Context) -> Result<Self, SteamAudioError> {
let mut embree_device = Self(std::ptr::null_mut());
let embree_device_settings: *mut audionimbus_sys::IPLEmbreeDeviceSettings =
std::ptr::null_mut();
let status = unsafe {
audionimbus_sys::iplEmbreeDeviceCreate(
context.raw_ptr(),
embree_device_settings,
embree_device.raw_ptr_mut(),
)
};
if let Some(error) = to_option_error(status) {
return Err(error);
}
Ok(embree_device)
}
pub const fn raw_ptr(&self) -> audionimbus_sys::IPLEmbreeDevice {
self.0
}
pub const fn raw_ptr_mut(&mut self) -> &mut audionimbus_sys::IPLEmbreeDevice {
&mut self.0
}
}
impl Drop for EmbreeDevice {
fn drop(&mut self) {
unsafe { audionimbus_sys::iplEmbreeDeviceRelease(&raw mut self.0) }
}
}
unsafe impl Send for EmbreeDevice {}
unsafe impl Sync for EmbreeDevice {}
impl Clone for EmbreeDevice {
fn clone(&self) -> Self {
Self(unsafe { audionimbus_sys::iplEmbreeDeviceRetain(self.0) })
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_clone() {
let context = Context::default();
let Ok(device) = EmbreeDevice::try_new(&context) else {
return;
};
let clone = device.clone();
assert_eq!(device.raw_ptr(), clone.raw_ptr());
drop(device);
assert!(!clone.raw_ptr().is_null());
}
}