diff options
-rw-r--r-- | src/server/Engine.cpp | 6 | ||||
-rw-r--r-- | src/server/Engine.hpp | 3 | ||||
-rw-r--r-- | src/server/ingen_lv2.cpp | 16 |
3 files changed, 18 insertions, 7 deletions
diff --git a/src/server/Engine.cpp b/src/server/Engine.cpp index 2d458bc4..6e61f463 100644 --- a/src/server/Engine.cpp +++ b/src/server/Engine.cpp @@ -458,6 +458,12 @@ Engine::process_events() run_context(), *_post_processor, MAX_EVENTS_PER_CYCLE); } +unsigned +Engine::process_all_events() +{ + return _pre_processor->process(run_context(), *_post_processor, 0); +} + void Engine::register_client(SPtr<Interface> client) { diff --git a/src/server/Engine.hpp b/src/server/Engine.hpp index d7e4f87b..5be18faf 100644 --- a/src/server/Engine.hpp +++ b/src/server/Engine.hpp @@ -117,6 +117,9 @@ public: /** Process events (process thread only). */ unsigned process_events(); + /** Process all events (no RT limits). */ + unsigned process_all_events(); + Ingen::World* world() const { return _world; } Interface* interface() const { return _interface.get(); } diff --git a/src/server/ingen_lv2.cpp b/src/server/ingen_lv2.cpp index cc01f68a..40d5b664 100644 --- a/src/server/ingen_lv2.cpp +++ b/src/server/ingen_lv2.cpp @@ -560,22 +560,24 @@ ingen_instantiate(const LV2_Descriptor* descriptor, engine->activate(); Server::ThreadManager::single_threaded = true; - engine->locate(0, block_length); + std::lock_guard<std::mutex> lock(plugin->world->rdf_mutex()); + // Locate to time 0 to process initialization events + engine->locate(0, block_length); engine->post_processor()->set_end_time(block_length); - engine->process_events(); - engine->post_processor()->process(); - - std::lock_guard<std::mutex> lock(plugin->world->rdf_mutex()); - fprintf(stderr, "LV2 parse resource %s from %s\n", graph->uri.c_str(), graph->filename.c_str()); + // Parse graph, filling the queue with events to create it + plugin->world->interface()->bundle_begin(); plugin->world->parser()->parse_file(plugin->world, plugin->world->interface().get(), graph->filename); + plugin->world->interface()->bundle_end(); + // Drain event queue while (engine->pending_events()) { - engine->process_events(); + engine->process_all_events(); engine->post_processor()->process(); + engine->maid()->cleanup(); } /* Register client after loading graph so the to-ui ring does not overflow. |