use super::open_cl::OpenClDevice;
use crate::error::{to_option_error, SteamAudioError};
#[derive(Debug)]
pub struct RadeonRaysDevice(audionimbus_sys::IPLRadeonRaysDevice);
impl RadeonRaysDevice {
pub fn try_new(open_cl_device: &OpenClDevice) -> Result<Self, SteamAudioError> {
let mut radeon_rays_device = Self(std::ptr::null_mut());
let radeon_rays_device_settings: *mut audionimbus_sys::IPLRadeonRaysDeviceSettings =
std::ptr::null_mut();
let status = unsafe {
audionimbus_sys::iplRadeonRaysDeviceCreate(
open_cl_device.raw_ptr(),
radeon_rays_device_settings,
radeon_rays_device.raw_ptr_mut(),
)
};
if let Some(error) = to_option_error(status) {
return Err(error);
}
Ok(radeon_rays_device)
}
pub const fn raw_ptr(&self) -> audionimbus_sys::IPLRadeonRaysDevice {
self.0
}
pub const fn raw_ptr_mut(&mut self) -> &mut audionimbus_sys::IPLRadeonRaysDevice {
&mut self.0
}
}
impl Drop for RadeonRaysDevice {
fn drop(&mut self) {
unsafe { audionimbus_sys::iplRadeonRaysDeviceRelease(&raw mut self.0) }
}
}
unsafe impl Send for RadeonRaysDevice {}
unsafe impl Sync for RadeonRaysDevice {}
impl Clone for RadeonRaysDevice {
fn clone(&self) -> Self {
Self(unsafe { audionimbus_sys::iplRadeonRaysDeviceRetain(self.0) })
}
}
#[cfg(test)]
mod tests {
use crate::*;
#[test]
fn test_clone() {
let context = Context::default();
let settings = OpenClDeviceSettings::default();
let Ok(device_list) = OpenClDeviceList::try_new(&context, &settings) else {
return;
};
let open_cl_device = OpenClDevice::try_new(&context, &device_list, 0).unwrap();
let radeon_rays_device = RadeonRaysDevice::try_new(&open_cl_device).unwrap();
let clone = radeon_rays_device.clone();
assert_eq!(radeon_rays_device.raw_ptr(), clone.raw_ptr());
drop(radeon_rays_device);
assert!(!clone.raw_ptr().is_null());
}
}