summaryrefslogtreecommitdiff
path: root/plugin/src/Caelestia/audioprovider.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/src/Caelestia/audioprovider.cpp')
-rw-r--r--plugin/src/Caelestia/audioprovider.cpp79
1 files changed, 79 insertions, 0 deletions
diff --git a/plugin/src/Caelestia/audioprovider.cpp b/plugin/src/Caelestia/audioprovider.cpp
new file mode 100644
index 0000000..4188460
--- /dev/null
+++ b/plugin/src/Caelestia/audioprovider.cpp
@@ -0,0 +1,79 @@
+#include "audioprovider.hpp"
+
+#include "audiocollector.hpp"
+#include "service.hpp"
+#include <qdebug.h>
+#include <qthread.h>
+
+namespace caelestia {
+
+AudioProcessor::AudioProcessor(QObject* parent)
+ : QObject(parent)
+ , m_sampleRate(AudioCollector::instance()->sampleRate())
+ , m_chunkSize(AudioCollector::instance()->chunkSize()) {}
+
+AudioProcessor::~AudioProcessor() {
+ stop();
+}
+
+void AudioProcessor::init() {
+ m_timer = new QTimer(this);
+ m_timer->setInterval(static_cast<int>(m_chunkSize * 1000.0 / m_sampleRate));
+ connect(m_timer, &QTimer::timeout, this, &AudioProcessor::process);
+}
+
+void AudioProcessor::start() {
+ AudioCollector::instance()->ref();
+ if (m_timer) {
+ m_timer->start();
+ }
+}
+
+void AudioProcessor::stop() {
+ if (m_timer) {
+ m_timer->stop();
+ }
+ AudioCollector::instance()->unref();
+}
+
+AudioProvider::AudioProvider(QObject* parent)
+ : Service(parent)
+ , m_processor(nullptr)
+ , m_thread(nullptr) {}
+
+AudioProvider::~AudioProvider() {
+ if (m_thread) {
+ m_thread->quit();
+ m_thread->wait();
+ }
+}
+
+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