13
0

fix threaded state restore (duplicate calls to restore during init)

and also allow immediate work during use latency-compute runs.

At session load, Ardour calls a plugins "set default" state (GUI thread).
Some plugins may schedule work during state-restore. Ardour immediately
proceeded to restore the actual session plugin state without processing
the already scheduled work and without calling run() for a plugin
to apply state synchronously.
This commit is contained in:
Robin Gareus 2016-08-23 13:40:42 +02:00
parent 81c481f975
commit 4a831725af
2 changed files with 11 additions and 4 deletions

View File

@ -312,7 +312,7 @@ class LIBARDOUR_API LV2Plugin : public ARDOUR::Plugin, public ARDOUR::Workee
void init (const void* c_plugin, framecnt_t rate); void init (const void* c_plugin, framecnt_t rate);
void allocate_atom_event_buffers (); void allocate_atom_event_buffers ();
void run (pframes_t nsamples); void run (pframes_t nsamples, bool sync_work = false);
void load_supported_properties(PropertyDescriptors& descs); void load_supported_properties(PropertyDescriptors& descs);

View File

@ -558,6 +558,13 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate)
#ifdef HAVE_LILV_0_16_0 #ifdef HAVE_LILV_0_16_0
// Load default state // Load default state
if (_worker) {
/* immediately schedule any work,
* so that state restore later will not find a busy
* worker. latency_compute_run() flushes any replies
*/
_worker->set_synchronous(true);
}
LilvState* state = lilv_state_new_from_world( LilvState* state = lilv_state_new_from_world(
_world.world, _uri_map.urid_map(), lilv_plugin_get_uri(_impl->plugin)); _world.world, _uri_map.urid_map(), lilv_plugin_get_uri(_impl->plugin));
if (state && _has_state_interface) { if (state && _has_state_interface) {
@ -2830,7 +2837,7 @@ LV2Plugin::get_scale_points(uint32_t port_index) const
} }
void void
LV2Plugin::run(pframes_t nframes) LV2Plugin::run(pframes_t nframes, bool sync_work)
{ {
uint32_t const N = parameter_count(); uint32_t const N = parameter_count();
for (uint32_t i = 0; i < N; ++i) { for (uint32_t i = 0; i < N; ++i) {
@ -2841,7 +2848,7 @@ LV2Plugin::run(pframes_t nframes)
if (_worker) { if (_worker) {
// Execute work synchronously if we're freewheeling (export) // Execute work synchronously if we're freewheeling (export)
_worker->set_synchronous(session().engine().freewheeling()); _worker->set_synchronous(sync_work || session().engine().freewheeling());
} }
// Run the plugin for this cycle // Run the plugin for this cycle
@ -2902,7 +2909,7 @@ LV2Plugin::latency_compute_run()
port_index++; port_index++;
} }
run(bufsize); run(bufsize, true);
deactivate(); deactivate();
if (was_activated) { if (was_activated) {
activate(); activate();