summaryrefslogtreecommitdiff
path: root/plugin/src/Caelestia/Services/audiocollector.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/src/Caelestia/Services/audiocollector.cpp')
-rw-r--r--plugin/src/Caelestia/Services/audiocollector.cpp79
1 files changed, 25 insertions, 54 deletions
diff --git a/plugin/src/Caelestia/Services/audiocollector.cpp b/plugin/src/Caelestia/Services/audiocollector.cpp
index 9dc3871..9fe77a8 100644
--- a/plugin/src/Caelestia/Services/audiocollector.cpp
+++ b/plugin/src/Caelestia/Services/audiocollector.cpp
@@ -35,20 +35,20 @@ PipeWireWorker::PipeWireWorker(std::stop_token token, AudioCollector* collector)
auto props = pw_properties_new(
PW_KEY_MEDIA_TYPE, "Audio", PW_KEY_MEDIA_CATEGORY, "Capture", PW_KEY_MEDIA_ROLE, "Music", nullptr);
pw_properties_set(props, PW_KEY_STREAM_CAPTURE_SINK, "true");
- pw_properties_setf(props, PW_KEY_NODE_LATENCY, "%u/%u", nextPowerOf2(512 * collector->sampleRate() / 48000),
- collector->sampleRate());
+ pw_properties_setf(
+ props, PW_KEY_NODE_LATENCY, "%u/%u", nextPowerOf2(512 * ac::SAMPLE_RATE / 48000), ac::SAMPLE_RATE);
pw_properties_set(props, PW_KEY_NODE_PASSIVE, "true");
pw_properties_set(props, PW_KEY_NODE_VIRTUAL, "true");
pw_properties_set(props, PW_KEY_STREAM_DONT_REMIX, "false");
pw_properties_set(props, "channelmix.upmix", "true");
- std::vector<uint8_t> buffer(collector->chunkSize());
+ std::vector<uint8_t> buffer(ac::CHUNK_SIZE);
spa_pod_builder b;
spa_pod_builder_init(&b, buffer.data(), static_cast<quint32>(buffer.size()));
spa_audio_info_raw info{};
info.format = SPA_AUDIO_FORMAT_S16;
- info.rate = collector->sampleRate();
+ info.rate = ac::SAMPLE_RATE;
info.channels = 1;
const spa_pod* params[1];
@@ -66,7 +66,7 @@ PipeWireWorker::PipeWireWorker(std::stop_token token, AudioCollector* collector)
m_stream = pw_stream_new_simple(pw_main_loop_get_loop(m_loop), "caelestia-shell", props, &events, this);
- const int success = pw_stream_connect(m_stream, PW_DIRECTION_INPUT, collector->nodeId(),
+ const int success = pw_stream_connect(m_stream, PW_DIRECTION_INPUT, PW_ID_ANY,
static_cast<pw_stream_flags>(
PW_STREAM_FLAG_AUTOCONNECT | PW_STREAM_FLAG_MAP_BUFFERS | PW_STREAM_FLAG_RT_PROCESS),
params, 1);
@@ -162,49 +162,9 @@ unsigned int PipeWireWorker::nextPowerOf2(unsigned int n) {
return n;
}
-AudioCollector::AudioCollector(QObject* parent)
- : Service(parent)
- , m_sampleRate(44100)
- , m_chunkSize(512)
- , m_nodeId(PW_ID_ANY)
- , m_buffer1(m_chunkSize)
- , m_buffer2(m_chunkSize)
- , m_readBuffer(&m_buffer1)
- , m_writeBuffer(&m_buffer2) {}
-
-AudioCollector::~AudioCollector() {
- stop();
-}
-
-quint32 AudioCollector::sampleRate() const {
- return m_sampleRate;
-}
-
-quint32 AudioCollector::chunkSize() const {
- return m_chunkSize;
-}
-
-quint32 AudioCollector::nodeId() {
- QMutexLocker locker(&m_nodeIdMutex);
- return m_nodeId;
-}
-
-void AudioCollector::setNodeId(quint32 nodeId) {
- {
- QMutexLocker locker(&m_nodeIdMutex);
-
- if (nodeId == m_nodeId) {
- return;
- }
-
- m_nodeId = nodeId;
- }
- emit nodeIdChanged();
-
- if (m_thread.joinable()) {
- stop();
- start();
- }
+AudioCollector& AudioCollector::instance() {
+ static AudioCollector instance;
+ return instance;
}
void AudioCollector::clearBuffer() {
@@ -216,8 +176,8 @@ void AudioCollector::clearBuffer() {
}
void AudioCollector::loadChunk(const qint16* samples, quint32 count) {
- if (count > m_chunkSize) {
- count = m_chunkSize;
+ if (count > ac::CHUNK_SIZE) {
+ count = ac::CHUNK_SIZE;
}
auto* writeBuffer = m_writeBuffer.load(std::memory_order_relaxed);
@@ -230,8 +190,8 @@ void AudioCollector::loadChunk(const qint16* samples, quint32 count) {
}
quint32 AudioCollector::readChunk(float* out, quint32 count) {
- if (count == 0 || count > m_chunkSize) {
- count = m_chunkSize;
+ if (count == 0 || count > ac::CHUNK_SIZE) {
+ count = ac::CHUNK_SIZE;
}
auto* readBuffer = m_readBuffer.load(std::memory_order_acquire);
@@ -241,8 +201,8 @@ quint32 AudioCollector::readChunk(float* out, quint32 count) {
}
quint32 AudioCollector::readChunk(double* out, quint32 count) {
- if (count == 0 || count > m_chunkSize) {
- count = m_chunkSize;
+ if (count == 0 || count > ac::CHUNK_SIZE) {
+ count = ac::CHUNK_SIZE;
}
auto* readBuffer = m_readBuffer.load(std::memory_order_acquire);
@@ -253,6 +213,17 @@ quint32 AudioCollector::readChunk(double* out, quint32 count) {
return count;
}
+AudioCollector::AudioCollector(QObject* parent)
+ : Service(parent)
+ , m_buffer1(ac::CHUNK_SIZE)
+ , m_buffer2(ac::CHUNK_SIZE)
+ , m_readBuffer(&m_buffer1)
+ , m_writeBuffer(&m_buffer2) {}
+
+AudioCollector::~AudioCollector() {
+ stop();
+}
+
void AudioCollector::start() {
if (m_thread.joinable()) {
return;