Spool param rescan call to the GUI thread
Otherwise the CLAP example host std::terminates, and we can also reuse the existing restart task for the VST3 wrapper.
This commit is contained in:
parent
d0064f87d6
commit
84bac0a47c
|
@ -228,6 +228,8 @@ pub struct Wrapper<P: ClapPlugin> {
|
|||
pub enum Task {
|
||||
/// Inform the host that the latency has changed.
|
||||
LatencyChanged,
|
||||
/// Tell the host that it should rescan the current parameter values.
|
||||
RescanParamValues,
|
||||
}
|
||||
|
||||
/// The types of CLAP parameter updates for events.
|
||||
|
@ -314,6 +316,12 @@ impl<P: ClapPlugin> MainThreadExecutor<Task> for Wrapper<P> {
|
|||
}
|
||||
None => nih_debug_assert_failure!("Host does not support the latency extension"),
|
||||
},
|
||||
Task::RescanParamValues => match &*self.host_params.borrow() {
|
||||
Some(host_params) => {
|
||||
(host_params.rescan)(&*self.host_callback, CLAP_PARAM_RESCAN_VALUES);
|
||||
}
|
||||
None => nih_debug_assert_failure!("The host does not support parameters? What?"),
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -993,12 +1001,8 @@ impl<P: ClapPlugin> Wrapper<P> {
|
|||
}
|
||||
|
||||
// After the state has been updated, notify the host about the new parameter values
|
||||
match &*self.host_params.borrow() {
|
||||
Some(host_params) => {
|
||||
(host_params.rescan)(&*self.host_callback, CLAP_PARAM_RESCAN_VALUES)
|
||||
}
|
||||
None => nih_debug_assert_failure!("The host does not support parameters? What?"),
|
||||
}
|
||||
let task_posted = self.do_maybe_async(Task::RescanParamValues);
|
||||
nih_debug_assert!(task_posted, "The task queue is full, dropping task...");
|
||||
}
|
||||
|
||||
unsafe extern "C" fn init(plugin: *const clap_plugin) -> bool {
|
||||
|
|
|
@ -2,7 +2,7 @@ use atomic_refcell::AtomicRefMut;
|
|||
use std::collections::VecDeque;
|
||||
use std::sync::atomic::Ordering;
|
||||
use std::sync::Arc;
|
||||
use vst3_sys::vst::IComponentHandler;
|
||||
use vst3_sys::vst::{IComponentHandler, RestartFlags};
|
||||
|
||||
use super::inner::{Task, WrapperInner};
|
||||
use crate::context::{GuiContext, ProcessContext, Transport};
|
||||
|
@ -112,9 +112,7 @@ impl<P: Vst3Plugin> ProcessContext for WrapperProcessContext<'_, P> {
|
|||
let old_latency = self.inner.current_latency.swap(samples, Ordering::SeqCst);
|
||||
if old_latency != samples {
|
||||
let task_posted = unsafe { self.inner.event_loop.borrow().assume_init_ref() }
|
||||
.do_maybe_async(Task::TriggerRestart(
|
||||
vst3_sys::vst::RestartFlags::kLatencyChanged as i32,
|
||||
));
|
||||
.do_maybe_async(Task::TriggerRestart(RestartFlags::kLatencyChanged as i32));
|
||||
nih_debug_assert!(task_posted, "The task queue is full, dropping task...");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -397,14 +397,10 @@ impl<P: Vst3Plugin> WrapperInner<P> {
|
|||
}
|
||||
|
||||
// After the state has been updated, notify the host about the new parameter values
|
||||
match &*self.component_handler.borrow() {
|
||||
Some(component_handler) => {
|
||||
unsafe {
|
||||
component_handler.restart_component(RestartFlags::kParamValuesChanged as i32)
|
||||
};
|
||||
}
|
||||
None => nih_debug_assert_failure!("The host does not support parameters? What?"),
|
||||
}
|
||||
let task_posted = unsafe { self.event_loop.borrow().assume_init_ref() }.do_maybe_async(
|
||||
Task::TriggerRestart(RestartFlags::kParamValuesChanged as i32),
|
||||
);
|
||||
nih_debug_assert!(task_posted, "The task queue is full, dropping task...");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue