From f5e7aa11f9a601e400dbe859ccafc94c275cb885 Mon Sep 17 00:00:00 2001 From: Tim Mayberry Date: Fri, 11 Sep 2015 23:07:01 +1000 Subject: [PATCH] Use same algorithm as CA and ALSA backends in DSPLoadCalculation Stop using an averaging of the values until we can establish whether it is really necessary. --- libs/ardour/ardour/dsp_load_calculator.h | 18 +------- libs/ardour/dsp_load_calculator.cc | 54 +++--------------------- 2 files changed, 8 insertions(+), 64 deletions(-) diff --git a/libs/ardour/ardour/dsp_load_calculator.h b/libs/ardour/ardour/dsp_load_calculator.h index f3c5fea227..42386e2cb0 100644 --- a/libs/ardour/ardour/dsp_load_calculator.h +++ b/libs/ardour/ardour/dsp_load_calculator.h @@ -23,8 +23,6 @@ #include #include -#include - #include "ardour/libardour_visibility.h" namespace ARDOUR { @@ -36,8 +34,6 @@ public: , m_start_timestamp_us(0) , m_stop_timestamp_us(0) , m_dsp_load(0) - , m_value_history (max_value_history()) - , m_num_values(0) { } @@ -45,17 +41,8 @@ public: void set_max_time_us(uint64_t max_time_us) { assert(max_time_us != 0); m_max_time_us = max_time_us; - - // Use average of last 1/4 second of values so responsiveness - // remains consistent independent of max time - uint32_t max_dsp_samples_per_qtr_second = (250000 / m_max_time_us); - m_num_values = - std::min(max_value_history() - 1, max_dsp_samples_per_qtr_second); - - m_value_history.reset(); } - int64_t get_max_time_us() const { return m_max_time_us; } void set_start_timestamp_us(int64_t start_timestamp_us) @@ -85,9 +72,8 @@ public: } return m_dsp_load; } -private: // methods - static uint32_t max_value_history () { return 16; } +private: // methods int64_t max_timer_error () { return 4 * m_max_time_us; } private: // data @@ -95,8 +81,6 @@ private: // data int64_t m_start_timestamp_us; int64_t m_stop_timestamp_us; float m_dsp_load; - RingBuffer m_value_history; - uint32_t m_num_values; }; } // namespace ARDOUR diff --git a/libs/ardour/dsp_load_calculator.cc b/libs/ardour/dsp_load_calculator.cc index 6b8e2b70e7..789d3704f4 100644 --- a/libs/ardour/dsp_load_calculator.cc +++ b/libs/ardour/dsp_load_calculator.cc @@ -23,10 +23,6 @@ namespace ARDOUR { void DSPLoadCalculator::set_stop_timestamp_us(int64_t stop_timestamp_us) { - // We could only bother with calculations if a certain amount of time - // has passed, or the Raw DSP value is > X% different than last calc - // 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). @@ -41,52 +37,16 @@ DSPLoadCalculator::set_stop_timestamp_us(int64_t stop_timestamp_us) return; } - float load = 0; - if (elapsed_time_us() > m_max_time_us) { - load = 1.0f; + m_dsp_load = 1.0f; } else { - load = elapsed_time_us() / (float)m_max_time_us; - } - - assert(m_value_history.write_space() >= 1); - - // push raw load value onto history - m_value_history.write(&load, 1); - - // if load is under 80% use an average of past values - if (elapsed_time_us() < ((m_max_time_us * 80) / 100)) { - - RingBuffer::rw_vector vec; - m_value_history.get_read_vector(&vec); - uint32_t values_read = 0; - float dsp_accumulator = 0.0f; - - // iterate through the read vectors accumulating the dsp load - for (unsigned int i = 0; i < vec.len[0]; ++i) { - dsp_accumulator += vec.buf[0][i]; - values_read++; + const float load = elapsed_time_us() / (float)m_max_time_us; + if (load > m_dsp_load) { + m_dsp_load = load; + } else { + const float alpha = 0.2f * (m_max_time_us * 1e-6f); + m_dsp_load = m_dsp_load + alpha * (load - m_dsp_load) + 1e-12; } - - for (unsigned int i = 0; i < vec.len[1]; ++i) { - dsp_accumulator += vec.buf[1][i]; - values_read++; - } - - load = dsp_accumulator / (float)values_read; - - const float alpha = 0.2f * (m_max_time_us * 1e-6f); - m_dsp_load = m_dsp_load + alpha * (load - m_dsp_load) + 1e-12; - - } else { - // Use raw load value otherwise 100% may never be indicated because of - // averaging/LPF etc - m_dsp_load = load; - } - - if (m_value_history.read_space() >= m_num_values) { - // "remove" the oldest value - m_value_history.increment_read_idx(1); } }