diff options
| author | 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> | 2025-09-16 23:58:44 +1000 |
|---|---|---|
| committer | 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> | 2025-09-16 23:58:44 +1000 |
| commit | 1984458565462f0f7d54266021e7f1977bc4b302 (patch) | |
| tree | cfa2c7cbd6630acc8caf4b8740d7446abd2f0cd3 /plugin/src/Caelestia/Services/audiocollector.cpp | |
| parent | utilities/toggles: add dnd (diff) | |
| download | caelestia-shell-1984458565462f0f7d54266021e7f1977bc4b302.tar.gz caelestia-shell-1984458565462f0f7d54266021e7f1977bc4b302.tar.bz2 caelestia-shell-1984458565462f0f7d54266021e7f1977bc4b302.zip | |
plugin: fix crashes
Fixes #629
Diffstat (limited to 'plugin/src/Caelestia/Services/audiocollector.cpp')
| -rw-r--r-- | plugin/src/Caelestia/Services/audiocollector.cpp | 79 |
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; |