summaryrefslogtreecommitdiff
path: root/plugin/src/Caelestia/cavaprovider.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/src/Caelestia/cavaprovider.hpp')
-rw-r--r--plugin/src/Caelestia/cavaprovider.hpp64
1 files changed, 64 insertions, 0 deletions
diff --git a/plugin/src/Caelestia/cavaprovider.hpp b/plugin/src/Caelestia/cavaprovider.hpp
new file mode 100644
index 0000000..d819f54
--- /dev/null
+++ b/plugin/src/Caelestia/cavaprovider.hpp
@@ -0,0 +1,64 @@
+#pragma once
+
+#include "audioprovider.hpp"
+#include <QObject>
+#include <cava/cavacore.h>
+#include <qqmlintegration.h>
+
+namespace caelestia {
+
+class CavaProcessor : public AudioProcessor {
+ Q_OBJECT
+
+public:
+ explicit CavaProcessor(AudioProvider* provider, QObject* parent = nullptr);
+ ~CavaProcessor();
+
+signals:
+ void valuesChanged(QVector<double> values);
+
+private:
+ struct cava_plan* m_plan;
+ double* m_in;
+ double* m_out;
+
+ int m_bars;
+ QVector<double> m_values;
+
+ Q_INVOKABLE void setBars(int bars);
+
+ void reload();
+ void initCava();
+ void cleanup();
+
+ void processChunk(const QVector<double>& chunk) override;
+};
+
+class CavaProvider : public AudioProvider {
+ Q_OBJECT
+ QML_ELEMENT
+
+ Q_PROPERTY(int bars READ bars WRITE setBars NOTIFY barsChanged)
+
+ Q_PROPERTY(QVector<double> values READ values NOTIFY valuesChanged)
+
+public:
+ explicit CavaProvider(int sampleRate = 48000, int chunkSize = 512, QObject* parent = nullptr);
+
+ [[nodiscard]] int bars() const;
+ void setBars(int bars);
+
+ [[nodiscard]] QVector<double> values() const;
+
+signals:
+ void barsChanged();
+ void valuesChanged();
+
+private:
+ int m_bars;
+ QVector<double> m_values;
+
+ void updateValues(QVector<double> values);
+};
+
+} // namespace caelestia