summaryrefslogtreecommitdiff
path: root/plugin/src/Caelestia/audiocollector.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/src/Caelestia/audiocollector.hpp')
-rw-r--r--plugin/src/Caelestia/audiocollector.hpp28
1 files changed, 19 insertions, 9 deletions
diff --git a/plugin/src/Caelestia/audiocollector.hpp b/plugin/src/Caelestia/audiocollector.hpp
index 283b758..ecfae09 100644
--- a/plugin/src/Caelestia/audiocollector.hpp
+++ b/plugin/src/Caelestia/audiocollector.hpp
@@ -3,8 +3,9 @@
#include "service.hpp"
#include <atomic>
#include <cstdint>
-#include <mutex>
#include <pipewire/pipewire.h>
+#include <qmutex.h>
+#include <qqmlintegration.h>
#include <spa/param/audio/format-utils.h>
#include <stop_token>
#include <thread>
@@ -41,24 +42,35 @@ private:
class AudioCollector : public Service {
Q_OBJECT
+ QML_ELEMENT
+
+ Q_PROPERTY(uint32_t nodeId READ nodeId WRITE setNodeId NOTIFY nodeIdChanged)
public:
- explicit AudioCollector(uint32_t sampleRate = 44100, uint32_t chunkSize = 512, QObject* parent = nullptr);
+ explicit AudioCollector(QObject* parent = nullptr);
~AudioCollector();
- static AudioCollector* instance();
-
[[nodiscard]] uint32_t sampleRate() const;
[[nodiscard]] uint32_t chunkSize() const;
+ [[nodiscard]] uint32_t nodeId();
+ void setNodeId(uint32_t nodeId);
+
void clearBuffer();
void loadChunk(const int16_t* samples, uint32_t count);
uint32_t readChunk(float* out, uint32_t count = 0);
uint32_t readChunk(double* out, uint32_t count = 0);
+signals:
+ void sampleRateChanged();
+ void chunkSizeChanged();
+ void nodeIdChanged();
+
private:
- inline static AudioCollector* s_instance = nullptr;
- inline static std::mutex s_mutex;
+ const uint32_t m_sampleRate;
+ const uint32_t m_chunkSize;
+ uint32_t m_nodeId;
+ QMutex m_nodeIdMutex;
std::jthread m_thread;
std::vector<float> m_buffer1;
@@ -67,9 +79,7 @@ private:
std::atomic<std::vector<float>*> m_writeBuffer;
uint32_t m_sampleCount;
- const uint32_t m_sampleRate;
- const uint32_t m_chunkSize;
-
+ void reload();
void start() override;
void stop() override;
};