summaryrefslogtreecommitdiff
path: root/plugin/src/Caelestia/Services/cavaprovider.cpp
diff options
context:
space:
mode:
author2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>2025-09-16 23:58:44 +1000
committer2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>2025-09-16 23:58:44 +1000
commit1984458565462f0f7d54266021e7f1977bc4b302 (patch)
treecfa2c7cbd6630acc8caf4b8740d7446abd2f0cd3 /plugin/src/Caelestia/Services/cavaprovider.cpp
parentutilities/toggles: add dnd (diff)
downloadcaelestia-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.cpp84
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);