use crate::au::ffi;
use crate::error::{Error, Result};
use std::ffi::{c_void, CString};
use std::marker::PhantomData;
pub struct AudioUnitGui {
handle: *mut ffi::RackAUGui,
_marker: PhantomData<*mut ()>, }
unsafe impl Send for AudioUnitGui {}
impl AudioUnitGui {
pub(crate) unsafe fn from_raw(handle: *mut ffi::RackAUGui) -> Self {
AudioUnitGui {
handle,
_marker: PhantomData,
}
}
pub fn get_native_view(&self) -> Option<*mut c_void> {
let ptr = unsafe { ffi::rack_au_gui_get_view(self.handle) };
if ptr.is_null() {
None
} else {
Some(ptr)
}
}
pub fn get_size(&self) -> Result<(f32, f32)> {
let mut width: f32 = 0.0;
let mut height: f32 = 0.0;
let result = unsafe { ffi::rack_au_gui_get_size(self.handle, &mut width, &mut height) };
if result != ffi::RACK_AU_OK {
return Err(Error::from_os_status(result));
}
Ok((width, height))
}
pub fn show_window(&self, title: Option<&str>) -> Result<()> {
let c_title = title.map(|t| CString::new(t).unwrap());
let title_ptr = c_title
.as_ref()
.map(|s| s.as_ptr())
.unwrap_or(std::ptr::null());
let result = unsafe { ffi::rack_au_gui_show_window(self.handle, title_ptr) };
if result != ffi::RACK_AU_OK {
return Err(Error::from_os_status(result));
}
Ok(())
}
pub fn hide_window(&self) -> Result<()> {
let result = unsafe { ffi::rack_au_gui_hide_window(self.handle) };
if result != ffi::RACK_AU_OK {
return Err(Error::from_os_status(result));
}
Ok(())
}
}
impl Drop for AudioUnitGui {
fn drop(&mut self) {
unsafe {
ffi::rack_au_gui_destroy(self.handle);
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_audio_unit_gui_is_send() {
fn assert_send<T: Send>() {}
assert_send::<AudioUnitGui>();
}
#[test]
fn test_audio_unit_gui_is_not_sync() {
fn assert_not_sync<T: Send>() {}
assert_not_sync::<AudioUnitGui>();
}
}