use std::sync::{Arc, Mutex};
use maudio_sys::ffi as sys;
use crate::{util::fence::Fence, AsRawRef, Binding};
#[derive(Clone)]
pub struct NotificationPipeline {
inner: Arc<NotifPipeInner>,
}
struct NotifPipeInner {
inner: sys::ma_resource_manager_pipeline_notifications,
_init: Option<Fence>, _done: Option<Fence>, }
unsafe impl Send for NotifPipeInner {}
unsafe impl Sync for NotifPipeInner {}
impl AsRawRef for NotificationPipeline {
type Raw = sys::ma_resource_manager_pipeline_notifications;
fn as_raw(&self) -> &Self::Raw {
&self.inner.inner
}
}
pub struct NotificationPipelineBuilder {
inner: sys::ma_resource_manager_pipeline_notifications,
init_fence: Option<Fence>,
done_fence: Option<Fence>,
}
impl NotificationPipelineBuilder {
#[allow(clippy::new_without_default)]
pub fn new() -> NotificationPipelineBuilder {
let inner = unsafe { sys::ma_resource_manager_pipeline_notifications_init() };
Self {
inner,
init_fence: None,
done_fence: None,
}
}
pub fn init_with_fence(&mut self, fence: Fence) -> &mut Self {
self.inner.init.pFence = fence.to_raw();
self.init_fence = Some(fence);
self
}
pub fn done_with_fence(&mut self, fence: &Fence) -> &mut Self {
self.inner.done.pFence = fence.to_raw();
self.done_fence = Some(fence.clone());
self
}
pub fn build(self) -> NotificationPipeline {
NotificationPipeline {
inner: Arc::new(NotifPipeInner {
inner: self.inner,
_init: self.init_fence,
_done: self.done_fence,
}),
}
}
}
#[repr(C)]
struct CustomNotif {
cb: sys::ma_async_notification,
state: *mut core::ffi::c_void,
}
struct State {
cb: Mutex<Option<Box<dyn FnOnce() + Send + 'static>>>,
}