use sim_kernel::Result;
use sim_lib_audio_dsp::Gain;
use sim_lib_audio_graph_core::{PrepareConfig, ProcessBlock, Processor};
use sim_lib_plugin_core::{
HostedPluginProcessor, PluginDescriptor, PluginInstance, PluginState, ProcessorPlugin,
};
use crate::{ClapParamMap, clap_gain_descriptor};
#[derive(Clone, Debug)]
pub struct ClapHostProcessor<I> {
hosted: HostedPluginProcessor<I>,
param_map: ClapParamMap,
}
impl<I> ClapHostProcessor<I> {
pub fn new(instance: I) -> Self {
Self {
hosted: HostedPluginProcessor::new(instance),
param_map: ClapParamMap::new(),
}
}
pub fn with_param_map(mut self, param_map: ClapParamMap) -> Self {
self.param_map = param_map;
self
}
pub fn param_map(&self) -> &ClapParamMap {
&self.param_map
}
pub fn instance(&self) -> &I {
self.hosted.instance()
}
}
impl<I: PluginInstance> Processor for ClapHostProcessor<I> {
fn prepare(&mut self, cfg: PrepareConfig) {
self.hosted.prepare(cfg);
}
fn reset(&mut self) {
self.hosted.reset();
}
fn process(&mut self, block: &mut ProcessBlock<'_>) {
self.hosted.process(block);
}
fn tail_frames(&self) -> u64 {
self.hosted.tail_frames()
}
}
impl<I: PluginInstance> PluginInstance for ClapHostProcessor<I> {
fn descriptor(&self) -> &PluginDescriptor {
self.hosted.instance().descriptor()
}
fn state(&self) -> PluginState {
self.hosted.instance().state()
}
fn set_state(&mut self, state: PluginState) {
self.hosted.instance_mut().set_state(state);
}
fn prepare(&mut self, cfg: PrepareConfig) {
self.hosted.prepare(cfg);
}
fn reset(&mut self) {
self.hosted.reset();
}
fn process(&mut self, block: &mut ProcessBlock<'_>) {
self.hosted.process(block);
}
}
#[derive(Clone, Debug)]
pub struct ClapExportedProcessor<P> {
inner: ProcessorPlugin<P>,
param_map: ClapParamMap,
}
impl<P> ClapExportedProcessor<P> {
pub fn new(descriptor: PluginDescriptor, processor: P, param_map: ClapParamMap) -> Self {
Self {
inner: ProcessorPlugin::new(descriptor, processor),
param_map,
}
}
pub fn param_map(&self) -> &ClapParamMap {
&self.param_map
}
}
sim_lib_plugin_core::forward_plugin_instance!(ClapExportedProcessor);
pub fn export_processor_as_clap<P: Processor>(
descriptor: PluginDescriptor,
processor: P,
) -> ClapExportedProcessor<P> {
let param_map = ClapParamMap::identity(descriptor.parameters.iter().map(|param| param.id));
ClapExportedProcessor::new(descriptor, processor, param_map)
}
pub fn export_gain_as_clap(gain: f32) -> Result<ClapExportedProcessor<Gain>> {
Ok(export_processor_as_clap(
clap_gain_descriptor()?,
Gain::new(gain),
))
}