From 87bb570e2450549cc8b4c6b7669e3db574749346 Mon Sep 17 00:00:00 2001 From: Kirill Kirilenko Date: Fri, 13 Nov 2020 14:36:13 +0300 Subject: [PATCH] Use condition variable to suspend audio processing thread --- src/AudioProcessor.cpp | 10 +++++++++- src/AudioProcessor.h | 4 ++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/AudioProcessor.cpp b/src/AudioProcessor.cpp index a817bec..04cbd7e 100644 --- a/src/AudioProcessor.cpp +++ b/src/AudioProcessor.cpp @@ -70,8 +70,10 @@ qint64 AudioProcessor::readData(char* data, qint64 maxlen) qint64 AudioProcessor::writeData(const char* data, qint64 len) { - std::unique_lock lock(inputMutex_); + std::unique_lock lock1(inputMutex_); + std::unique_lock lock2(inputEventMutex_); inputBuffer_.append(data, len); + inputEvent_.notify_all(); return len; } @@ -122,6 +124,12 @@ void AudioProcessor::process() emit readyRead(); } } + else + { + processLock.unlock(); + std::unique_lock lock(inputEventMutex_); + inputEvent_.wait(lock); + } } } diff --git a/src/AudioProcessor.h b/src/AudioProcessor.h index ccbf5e9..afc176e 100644 --- a/src/AudioProcessor.h +++ b/src/AudioProcessor.h @@ -9,6 +9,7 @@ #include #include +#include #include #include @@ -79,6 +80,9 @@ private: std::thread worker_; bool doWork_ = false; + std::condition_variable inputEvent_; + std::mutex inputEventMutex_; + QScopedPointer sourceEncoder_; QScopedPointer processedEncoder_; };