summaryrefslogtreecommitdiffstats
path: root/src/server/Engine.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2012-05-22 03:30:42 +0000
committerDavid Robillard <d@drobilla.net>2012-05-22 03:30:42 +0000
commitb1d4027b58465d9cc31d6cb1be05a7ff4f202711 (patch)
treeb1b7e9d1379fc16c5f451fda7afff0d2bc071e18 /src/server/Engine.cpp
parente3b0886bfbd12f65450d4b302371f07f511458c3 (diff)
downloadingen-b1d4027b58465d9cc31d6cb1be05a7ff4f202711.tar.gz
ingen-b1d4027b58465d9cc31d6cb1be05a7ff4f202711.tar.bz2
ingen-b1d4027b58465d9cc31d6cb1be05a7ff4f202711.zip
More work on test suite.
Clean up, simplify, and shrink event code. Support disconnect_all via Atom protocol. git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@4432 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/server/Engine.cpp')
-rw-r--r--src/server/Engine.cpp21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/server/Engine.cpp b/src/server/Engine.cpp
index 9359bacf..ead11895 100644
--- a/src/server/Engine.cpp
+++ b/src/server/Engine.cpp
@@ -66,6 +66,7 @@ Engine::Engine(Ingen::Shared::World* a_world)
, _message_context(*this)
, _process_context(*this)
, _quit_flag(false)
+ , _direct_driver(true)
{
if (a_world->store()) {
SharedPtr<EngineStore> estore = PtrCast<EngineStore>(a_world->store());
@@ -133,10 +134,27 @@ Engine::set_driver(SharedPtr<Driver> driver)
_driver = driver;
}
+SampleCount
+Engine::event_time()
+{
+ const SampleCount start = _direct_driver
+ ? _process_context.start()
+ : _driver->frame_time();
+
+ /* Exactly one cycle latency (some could run ASAP if we get lucky, but not
+ always, and a slight constant latency is far better than jittery lower
+ (average) latency */
+ return start + _driver->block_length();
+}
+
static void
execute_and_delete_event(ProcessContext& context, Event* ev)
{
ev->pre_process();
+ if (ev->time() < context.start()) {
+ // Didn't get around to executing in time, oh well...
+ ev->set_time(context.start());
+ }
ev->execute(context);
ev->post_process();
delete ev;
@@ -146,6 +164,7 @@ void
Engine::init(double sample_rate, uint32_t block_length)
{
set_driver(SharedPtr<Driver>(new DirectDriver(sample_rate, block_length)));
+ _direct_driver = true;
}
bool
@@ -252,6 +271,8 @@ Engine::deactivate()
unsigned
Engine::run(uint32_t sample_count)
{
+ _process_context.locate(_process_context.end(), sample_count, 0);
+
// Apply control bindings to input
control_bindings()->pre_process(
_process_context, _root_patch->port_impl(0)->buffer(0).get());