diff options
-rw-r--r-- | libs/ardour/ardour/dsp_load_calculator.h | 2 | ||||
-rw-r--r-- | libs/ardour/dsp_load_calculator.cc | 13 |
2 files changed, 15 insertions, 0 deletions
diff --git a/libs/ardour/ardour/dsp_load_calculator.h b/libs/ardour/ardour/dsp_load_calculator.h index 6e1ac25cb0..f3c5fea227 100644 --- a/libs/ardour/ardour/dsp_load_calculator.h +++ b/libs/ardour/ardour/dsp_load_calculator.h @@ -88,6 +88,8 @@ public: private: // methods static uint32_t max_value_history () { return 16; } + int64_t max_timer_error () { return 4 * m_max_time_us; } + private: // data int64_t m_max_time_us; int64_t m_start_timestamp_us; diff --git a/libs/ardour/dsp_load_calculator.cc b/libs/ardour/dsp_load_calculator.cc index 99147c6a14..6b8e2b70e7 100644 --- a/libs/ardour/dsp_load_calculator.cc +++ b/libs/ardour/dsp_load_calculator.cc @@ -28,6 +28,19 @@ DSPLoadCalculator::set_stop_timestamp_us(int64_t stop_timestamp_us) // which would mean consistent overhead for small values of m_max_time_us m_stop_timestamp_us = stop_timestamp_us; + + /* querying the performance counter can fail occasionally (-1). + * Also on some multi-core systems, timers are CPU specific and not + * synchronized. We assume they differ more than a few milliseconds + * (4 * nominal cycle time) and simply ignore cases where the + * execution switches cores. + */ + if (m_start_timestamp_us < 0 || m_stop_timestamp_us < 0 || + m_start_timestamp_us > m_stop_timestamp_us || + elapsed_time_us() > max_timer_error()) { + return; + } + float load = 0; if (elapsed_time_us() > m_max_time_us) { |