diff options
| author | 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> | 2025-09-16 23:58:44 +1000 |
|---|---|---|
| committer | 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> | 2025-09-16 23:58:44 +1000 |
| commit | 1984458565462f0f7d54266021e7f1977bc4b302 (patch) | |
| tree | cfa2c7cbd6630acc8caf4b8740d7446abd2f0cd3 /plugin/src/Caelestia/Services/cavaprovider.cpp | |
| parent | utilities/toggles: add dnd (diff) | |
| download | caelestia-shell-1984458565462f0f7d54266021e7f1977bc4b302.tar.gz caelestia-shell-1984458565462f0f7d54266021e7f1977bc4b302.tar.bz2 caelestia-shell-1984458565462f0f7d54266021e7f1977bc4b302.zip | |
plugin: fix crashes
Fixes #629
Diffstat (limited to 'plugin/src/Caelestia/Services/cavaprovider.cpp')
| -rw-r--r-- | plugin/src/Caelestia/Services/cavaprovider.cpp | 84 |
1 files changed, 31 insertions, 53 deletions
diff --git a/plugin/src/Caelestia/Services/cavaprovider.cpp b/plugin/src/Caelestia/Services/cavaprovider.cpp index 76a1a10..381183d 100644 --- a/plugin/src/Caelestia/Services/cavaprovider.cpp +++ b/plugin/src/Caelestia/Services/cavaprovider.cpp @@ -9,38 +9,45 @@ namespace caelestia { -CavaProcessor::CavaProcessor(AudioCollector* collector, QObject* parent) - : AudioProcessor(collector, parent) +CavaProcessor::CavaProcessor(QObject* parent) + : AudioProcessor(parent) , m_plan(nullptr) - , m_in(nullptr) + , m_in(new double[ac::CHUNK_SIZE]) , m_out(nullptr) - , m_bars(0) { - if (collector) { - m_in = new double[collector->chunkSize()]; - } -}; + , m_bars(0) {}; CavaProcessor::~CavaProcessor() { cleanup(); - if (m_in) { - delete[] m_in; - } + delete[] m_in; } -void CavaProcessor::setCollector(AudioCollector* collector) { - AudioProcessor::setCollector(collector); - - if (m_in) { - delete[] m_in; +void CavaProcessor::process() { + if (!m_plan || m_bars == 0 || !m_out) { + return; } - if (collector) { - m_in = new double[collector->chunkSize()]; - } else { - m_in = nullptr; + const int count = static_cast<int>(AudioCollector::instance().readChunk(m_in)); + + // Process in data via cava + 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]); + } } - reload(); + // 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); + } } void CavaProcessor::setBars(int bars) { @@ -73,11 +80,11 @@ void CavaProcessor::cleanup() { } void CavaProcessor::initCava() { - if (m_plan || m_bars == 0 || !m_collector) { + if (m_plan || m_bars == 0) { return; } - m_plan = cava_init(m_bars, m_collector->sampleRate(), 1, 1, 0.85, 50, 10000); + m_plan = cava_init(m_bars, ac::SAMPLE_RATE, 1, 1, 0.85, 50, 10000); if (m_plan->status == -1) { qWarning() << "CavaProcessor::initCava: failed to initialise cava plan"; @@ -88,40 +95,11 @@ void CavaProcessor::initCava() { m_out = new double[static_cast<size_t>(m_bars)]; } -void CavaProcessor::process() { - if (!m_plan || m_bars == 0 || !m_collector || !m_in || !m_out) { - return; - } - - const int count = static_cast<int>(m_collector->readChunk(m_in)); - - // Process in data via cava - 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]); - } - } - - // 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); - } -} - CavaProvider::CavaProvider(QObject* parent) : AudioProvider(parent) , m_bars(0) , m_values(m_bars, 0.0) { - m_processor = new CavaProcessor(m_collector); + m_processor = new CavaProcessor(); init(); connect(static_cast<CavaProcessor*>(m_processor), &CavaProcessor::valuesChanged, this, &CavaProvider::updateValues); |