summaryrefslogtreecommitdiff
path: root/plugin/src/Caelestia/Services/audioprovider.cpp
diff options
context:
space:
mode:
author2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>2025-09-13 14:38:44 +1000
committer2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>2025-09-13 14:38:44 +1000
commit306cfc06ed38a2f86616c1f2fe64de45321f21a6 (patch)
treea27c79d9c4d01c2dadeeae74c844875ab7ab4eed /plugin/src/Caelestia/Services/audioprovider.cpp
parentpopouts/tray: better interaction (diff)
downloadcaelestia-shell-306cfc06ed38a2f86616c1f2fe64de45321f21a6.tar.gz
caelestia-shell-306cfc06ed38a2f86616c1f2fe64de45321f21a6.tar.bz2
caelestia-shell-306cfc06ed38a2f86616c1f2fe64de45321f21a6.zip
plugin: refactor into modules
Diffstat (limited to 'plugin/src/Caelestia/Services/audioprovider.cpp')
-rw-r--r--plugin/src/Caelestia/Services/audioprovider.cpp122
1 files changed, 122 insertions, 0 deletions
diff --git a/plugin/src/Caelestia/Services/audioprovider.cpp b/plugin/src/Caelestia/Services/audioprovider.cpp
new file mode 100644
index 0000000..f31480e
--- /dev/null
+++ b/plugin/src/Caelestia/Services/audioprovider.cpp
@@ -0,0 +1,122 @@
+#include "audioprovider.hpp"
+
+#include "audiocollector.hpp"
+#include "service.hpp"
+#include <qdebug.h>
+#include <qthread.h>
+
+namespace caelestia {
+
+AudioProcessor::AudioProcessor(AudioCollector* collector, QObject* parent)
+ : QObject(parent)
+ , m_collector(collector) {}
+
+AudioProcessor::~AudioProcessor() {
+ stop();
+}
+
+void AudioProcessor::init() {
+ m_timer = new QTimer(this);
+ if (m_collector) {
+ m_timer->setInterval(static_cast<int>(m_collector->chunkSize() * 1000.0 / m_collector->sampleRate()));
+ }
+ connect(m_timer, &QTimer::timeout, this, &AudioProcessor::process);
+}
+
+void AudioProcessor::setCollector(AudioCollector* collector) {
+ if (m_collector == collector) {
+ return;
+ }
+
+ if (m_timer) {
+ if (m_timer->isActive()) {
+ if (m_collector) {
+ m_collector->unref();
+ }
+ if (collector) {
+ collector->ref();
+ }
+ }
+ if (collector) {
+ m_timer->setInterval(static_cast<int>(collector->chunkSize() * 1000.0 / collector->sampleRate()));
+ } else {
+ m_timer->stop();
+ }
+ }
+
+ m_collector = collector;
+}
+
+void AudioProcessor::start() {
+ if (m_timer && m_collector) {
+ m_collector->ref();
+ m_timer->start();
+ }
+}
+
+void AudioProcessor::stop() {
+ if (m_timer && m_collector) {
+ m_timer->stop();
+ m_collector->unref();
+ }
+}
+
+AudioProvider::AudioProvider(QObject* parent)
+ : Service(parent)
+ , m_collector(nullptr)
+ , m_processor(nullptr)
+ , m_thread(nullptr) {}
+
+AudioProvider::~AudioProvider() {
+ if (m_thread) {
+ m_thread->quit();
+ m_thread->wait();
+ }
+}
+
+AudioCollector* AudioProvider::collector() const {
+ return m_collector;
+}
+
+void AudioProvider::setCollector(AudioCollector* collector) {
+ if (m_collector == collector) {
+ return;
+ }
+
+ m_collector = collector;
+ emit collectorChanged();
+
+ if (m_processor) {
+ QMetaObject::invokeMethod(m_processor, "setCollector", Qt::QueuedConnection, Q_ARG(AudioCollector*, collector));
+ }
+}
+
+void AudioProvider::init() {
+ if (!m_processor) {
+ qWarning() << "AudioProvider::init: attempted to init with no processor set";
+ return;
+ }
+
+ m_thread = new QThread(this);
+ m_processor->moveToThread(m_thread);
+
+ connect(m_thread, &QThread::started, m_processor, &AudioProcessor::init);
+ connect(m_thread, &QThread::finished, m_processor, &AudioProcessor::deleteLater);
+ connect(m_thread, &QThread::finished, m_thread, &QThread::deleteLater);
+
+ m_thread->start();
+}
+
+void AudioProvider::start() {
+ if (m_processor) {
+ QMetaObject::invokeMethod(m_processor, "start", Qt::QueuedConnection);
+ }
+}
+
+void AudioProvider::stop() {
+ if (m_processor) {
+ QMetaObject::invokeMethod(m_processor, "stop", Qt::QueuedConnection);
+ }
+}
+
+} // namespace caelestia