summaryrefslogtreecommitdiff
path: root/libs/ardour/audioengine.cc
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2013-07-06 18:22:12 +0200
committerRobin Gareus <robin@gareus.org>2013-07-10 15:27:12 +0200
commitb2beb11c8dda45a4cd36f2f0d763033b87be531e (patch)
treefaa8b71e23f837877ee720a102be69bb4a6e43aa /libs/ardour/audioengine.cc
parentc5ded1dbebd0b0834a39f1788ff41786f115414b (diff)
improve timing accuracy for meter-falloff calc.
Diffstat (limited to 'libs/ardour/audioengine.cc')
-rw-r--r--libs/ardour/audioengine.cc14
1 files changed, 13 insertions, 1 deletions
diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc
index 5b9d34f5e5..9f102a016a 100644
--- a/libs/ardour/audioengine.cc
+++ b/libs/ardour/audioengine.cc
@@ -759,13 +759,25 @@ void
AudioEngine::meter_thread ()
{
pthread_set_name (X_("meter"));
+ struct timeval clock1, clock2;
+ int64_t delay = 10000; /* 1/100th sec interval */
while (true) {
- Glib::usleep (10000); /* 1/100th sec interval */
+ /* TODO use select() for sleep:
+ * select() has a maxium delay time,
+ * [u]sleep has a minimum delay time
+ */
+ Glib::usleep (delay);
if (g_atomic_int_get(&m_meter_exit)) {
break;
}
+ gettimeofday(&clock1, NULL);
Metering::Meter ();
+ gettimeofday(&clock2, NULL);
+ const int64_t elapsed_time =
+ (clock2.tv_sec-clock1.tv_sec) * 10000
+ + (clock2.tv_usec-clock1.tv_usec);
+ delay = max((int64_t)0, 10000 - elapsed_time);
}
}