summaryrefslogtreecommitdiff
path: root/plugin/src/Caelestia/Services/cavaprovider.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/src/Caelestia/Services/cavaprovider.cpp')
-rw-r--r--plugin/src/Caelestia/Services/cavaprovider.cpp24
1 files changed, 15 insertions, 9 deletions
diff --git a/plugin/src/Caelestia/Services/cavaprovider.cpp b/plugin/src/Caelestia/Services/cavaprovider.cpp
index 81477d7..d51b7c6 100644
--- a/plugin/src/Caelestia/Services/cavaprovider.cpp
+++ b/plugin/src/Caelestia/Services/cavaprovider.cpp
@@ -32,18 +32,24 @@ void CavaProcessor::process() {
cava_execute(m_in, count, m_out, m_plan);
// Apply monstercat filter
- for (int i = 0; i < m_bars; i++) {
- for (int j = i - 1; j >= 0; j--) {
- m_out[j] = std::max(m_out[i] / std::pow(1.5, i - j), m_out[j]);
- }
- for (int j = i + 1; j < m_bars; j++) {
- m_out[j] = std::max(m_out[i] / std::pow(1.5, j - i), m_out[j]);
- }
+ QVector<double> values(m_bars);
+
+ // Left to right pass
+ const double inv = 1.0 / 1.5;
+ double carry = 0.0;
+ for (int i = 0; i < m_bars; ++i) {
+ carry = std::max(m_out[i], carry * inv);
+ values[i] = carry;
+ }
+
+ // Right to left pass and combine
+ carry = 0.0;
+ for (int i = m_bars - 1; i >= 0; --i) {
+ carry = std::max(m_out[i], carry * inv);
+ values[i] = std::max(values[i], carry);
}
// Update values
- QVector<double> values(m_bars);
- std::copy(m_out, m_out + m_bars, values.begin());
if (values != m_values) {
m_values = std::move(values);
emit valuesChanged(m_values);