#[doc(hidden)]
pub mod __macro_deps {
pub use truce_core;
pub use truce_plugin;
}
mod canary;
mod safe_types;
#[cfg(feature = "shell")]
mod loader;
#[cfg(feature = "shell")]
pub mod shell;
pub mod static_shell;
pub use canary::{ABI_EPOCH, AbiCanary};
pub use safe_types::*;
pub use truce_plugin::{PluginLogic, PluginLogic64, PluginLogicCore};
#[cfg(feature = "shell")]
pub use loader::NativeLoader;
#[macro_export]
macro_rules! export_plugin {
($logic:ty, $params:ty) => {
#[unsafe(no_mangle)]
pub fn truce_init_state(params_ptr: *const ()) -> *mut () {
let params: &$params = unsafe { &*(params_ptr as *const $params) };
let cx = $crate::__macro_deps::truce_core::tasks::InitContext::new(
::core::option::Option::None,
);
let state = <$logic as $crate::PluginLogicCore<Sample>>::init(params, &cx);
Box::into_raw(Box::new(state)).cast::<()>()
}
#[unsafe(no_mangle)]
pub fn truce_drop_state(state: *mut ()) {
drop(unsafe {
Box::from_raw(state.cast::<<$logic as $crate::PluginLogicCore<Sample>>::DspState>())
});
}
#[unsafe(no_mangle)]
pub fn truce_preserve_dsp_state() -> bool {
<$logic as $crate::PluginLogicCore<Sample>>::PRESERVE_DSP_STATE
}
#[unsafe(no_mangle)]
pub fn truce_reset(
state: *mut (),
params_ptr: *const (),
config: &$crate::__macro_deps::truce_core::config::AudioConfig,
) {
let state = unsafe {
&mut *state.cast::<<$logic as $crate::PluginLogicCore<Sample>>::DspState>()
};
let params: &$params = unsafe { &*(params_ptr as *const $params) };
<$logic as $crate::PluginLogicCore<Sample>>::reset(state, params, config);
}
#[unsafe(no_mangle)]
pub fn truce_process(
state: *mut (),
params_ptr: *const (),
buffer: &mut $crate::__macro_deps::truce_core::buffer::AudioBuffer<Sample>,
events: &$crate::__macro_deps::truce_core::events::EventList,
ctx: &mut $crate::__macro_deps::truce_core::process::ProcessContext,
) -> $crate::__macro_deps::truce_core::process::ProcessStatus {
let state = unsafe {
&mut *state.cast::<<$logic as $crate::PluginLogicCore<Sample>>::DspState>()
};
let params: &$params = unsafe { &*(params_ptr as *const $params) };
<$logic as $crate::PluginLogicCore<Sample>>::process(state, params, buffer, events, ctx)
}
#[unsafe(no_mangle)]
pub fn truce_latency(state: *const ()) -> u32 {
let state =
unsafe { &*state.cast::<<$logic as $crate::PluginLogicCore<Sample>>::DspState>() };
<$logic as $crate::PluginLogicCore<Sample>>::latency(state)
}
#[unsafe(no_mangle)]
pub fn truce_tail(state: *const ()) -> u32 {
let state =
unsafe { &*state.cast::<<$logic as $crate::PluginLogicCore<Sample>>::DspState>() };
<$logic as $crate::PluginLogicCore<Sample>>::tail(state)
}
#[unsafe(no_mangle)]
pub fn truce_save_state(state: *const ()) -> Vec<u8> {
let state =
unsafe { &*state.cast::<<$logic as $crate::PluginLogicCore<Sample>>::DspState>() };
<$logic as $crate::PluginLogicCore<Sample>>::save_state(state)
}
#[unsafe(no_mangle)]
pub fn truce_snapshot_into(state: *const (), buf: &mut Vec<u8>) -> bool {
let state =
unsafe { &*state.cast::<<$logic as $crate::PluginLogicCore<Sample>>::DspState>() };
<$logic as $crate::PluginLogicCore<Sample>>::snapshot_into(state, buf)
}
#[unsafe(no_mangle)]
pub fn truce_snapshot_version(state: *const ()) -> ::core::option::Option<u64> {
let state =
unsafe { &*state.cast::<<$logic as $crate::PluginLogicCore<Sample>>::DspState>() };
<$logic as $crate::PluginLogicCore<Sample>>::snapshot_version(state)
}
#[unsafe(no_mangle)]
pub fn truce_load_state(
state: *mut (),
data: &[u8],
) -> Result<(), $crate::__macro_deps::truce_core::state::StateLoadError> {
let state = unsafe {
&mut *state.cast::<<$logic as $crate::PluginLogicCore<Sample>>::DspState>()
};
<$logic as $crate::PluginLogicCore<Sample>>::load_state(state, data)
}
#[unsafe(no_mangle)]
pub fn truce_state_changed(state: *mut (), params_ptr: *const ()) {
let state = unsafe {
&mut *state.cast::<<$logic as $crate::PluginLogicCore<Sample>>::DspState>()
};
let params: &$params = unsafe { &*(params_ptr as *const $params) };
<$logic as $crate::PluginLogicCore<Sample>>::state_changed(state, params);
}
#[unsafe(no_mangle)]
pub fn truce_build_editor(
params_ptr: *const (),
) -> Box<dyn $crate::__macro_deps::truce_core::editor::Editor> {
let params: Arc<$params> = unsafe {
Arc::increment_strong_count(params_ptr as *const $params);
Arc::from_raw(params_ptr as *const $params)
};
<$logic as $crate::__macro_deps::truce_plugin::PluginEditor<Sample>>::editor(params)
}
#[unsafe(no_mangle)]
pub fn truce_abi_canary_v2() -> $crate::AbiCanary {
$crate::AbiCanary::current::<Sample>()
}
};
}