use orbbec_sys::{ob_context, ob_device_list};
use crate::device::{Device, DeviceInfo};
use crate::error::{check_error, Error};
pub struct Context {
raw: *mut ob_context,
}
impl Context {
pub fn new() -> Result<Self, Error> {
let raw = unsafe { check_error(|e| orbbec_sys::ob_create_context(e))? };
if raw.is_null() {
return Err(Error {
status: orbbec_sys::OBStatus_OB_STATUS_ERROR,
message: "ob_create_context returned a null context".to_string(),
});
}
Ok(Self { raw })
}
pub fn as_raw(&self) -> *mut ob_context {
self.raw
}
pub fn query_devices(&self) -> Result<Vec<DeviceInfo>, Error> {
let list =
unsafe { check_error(|e| orbbec_sys::ob_query_device_list(self.raw, e))? };
let result = self.devices_from_list(list);
let _ = unsafe { check_error(|e| orbbec_sys::ob_delete_device_list(list, e)) };
result
}
pub fn open_device(&self, index: u32) -> Result<Device, Error> {
let list =
unsafe { check_error(|e| orbbec_sys::ob_query_device_list(self.raw, e))? };
let device = Device::from_list(self.raw, list, index);
let _ = unsafe { check_error(|e| orbbec_sys::ob_delete_device_list(list, e)) };
device
}
fn devices_from_list(&self, list: *const ob_device_list) -> Result<Vec<DeviceInfo>, Error> {
let count = unsafe { check_error(|e| orbbec_sys::ob_device_list_get_count(list, e))? };
let mut devices = Vec::with_capacity(count as usize);
for i in 0..count {
let device = Device::from_list(self.raw, list, i)?;
let info = device.info()?;
devices.push(info);
}
Ok(devices)
}
}
impl Drop for Context {
fn drop(&mut self) {
let _ = unsafe { check_error(|e| orbbec_sys::ob_delete_context(self.raw, e)) };
}
}
unsafe impl Send for Context {}
unsafe impl Sync for Context {}