improve timing accuracy for meter-falloff calc.
authorRobin Gareus <robin@gareus.org>
Sat, 6 Jul 2013 16:22:12 +0000 (18:22 +0200)
committerRobin Gareus <robin@gareus.org>
Wed, 10 Jul 2013 13:27:12 +0000 (15:27 +0200)
libs/ardour/audioengine.cc

index 5b9d34f5e50c4cd6fc2af0926dc1eff45d00029f..9f102a016ae143dff38ea06d0e90be84a6fc2b69 100644 (file)
@@ -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);
        }
 }