summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/server/Event.hpp3
-rw-r--r--src/server/PreProcessor.cpp1
-rw-r--r--src/server/events/Mark.cpp26
-rw-r--r--src/server/events/Mark.hpp1
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<UndoStack>& 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;