From 6db14b2210a9f7a8835334657e89ae49158fe660 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Wed, 26 Feb 2020 22:25:11 +0100 Subject: Fix atomic bundle execution --- src/server/Event.hpp | 3 +++ src/server/PreProcessor.cpp | 1 + src/server/events/Mark.cpp | 26 +++++++++++++++++++++----- src/server/events/Mark.hpp | 1 + 4 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/server/Event.hpp b/src/server/Event.hpp index 7da4b955..b2477ce8 100644 --- a/src/server/Event.hpp +++ b/src/server/Event.hpp @@ -62,6 +62,9 @@ public: UNBLOCK ///< Finish atomic executed block of events }; + /** Claim position in undo stack before pre-processing (non-realtime). */ + virtual void mark(PreProcessContext&) {}; + /** Pre-process event before execution (non-realtime). */ virtual bool pre_process(PreProcessContext& ctx) = 0; diff --git a/src/server/PreProcessor.cpp b/src/server/PreProcessor.cpp index 872302c0..61a3598e 100644 --- a/src/server/PreProcessor.cpp +++ b/src/server/PreProcessor.cpp @@ -202,6 +202,7 @@ PreProcessor::run() } // Set block state before enqueueing event + ev->mark(ctx); switch (ev->get_execution()) { case Event::Execution::NORMAL: break; diff --git a/src/server/events/Mark.cpp b/src/server/events/Mark.cpp index 07beb39f..eb50e4a0 100644 --- a/src/server/events/Mark.cpp +++ b/src/server/events/Mark.cpp @@ -32,7 +32,7 @@ Mark::Mark(Engine& engine, const ingen::BundleBegin& msg) : Event(engine, client, msg.seq, timestamp) , _type(Type::BUNDLE_BEGIN) - , _depth(0) + , _depth(-1) {} Mark::Mark(Engine& engine, @@ -41,11 +41,11 @@ Mark::Mark(Engine& engine, const ingen::BundleEnd& msg) : Event(engine, client, msg.seq, timestamp) , _type(Type::BUNDLE_END) - , _depth(0) + , _depth(-1) {} -bool -Mark::pre_process(PreProcessContext& ctx) +void +Mark::mark(PreProcessContext& ctx) { const UPtr& stack = ((_mode == Mode::UNDO) ? _engine.redo_stack() @@ -53,11 +53,26 @@ Mark::pre_process(PreProcessContext& ctx) switch (_type) { case Type::BUNDLE_BEGIN: - ctx.set_in_bundle(true); _depth = stack->start_entry(); break; case Type::BUNDLE_END: _depth = stack->finish_entry(); + break; + } +} + +bool +Mark::pre_process(PreProcessContext& ctx) +{ + if (_depth < 0) { + mark(ctx); + } + + switch (_type) { + case Type::BUNDLE_BEGIN: + ctx.set_in_bundle(true); + break; + case Type::BUNDLE_END: ctx.set_in_bundle(false); if (!ctx.dirty_graphs().empty()) { for (GraphImpl* g : ctx.dirty_graphs()) { @@ -91,6 +106,7 @@ Mark::post_process() Event::Execution Mark::get_execution() const { + assert(_depth >= 0); if (!_engine.atomic_bundles()) { return Execution::NORMAL; } diff --git a/src/server/events/Mark.hpp b/src/server/events/Mark.hpp index c32c2588..bff38f06 100644 --- a/src/server/events/Mark.hpp +++ b/src/server/events/Mark.hpp @@ -50,6 +50,7 @@ public: SampleCount timestamp, const ingen::BundleEnd& msg); + void mark(PreProcessContext& ctx) override; bool pre_process(PreProcessContext& ctx) override; void execute(RunContext& context) override; void post_process() override; -- cgit v1.2.1