Use condition variable to suspend audio processing thread

This commit is contained in:
Kirill Kirilenko 2020-11-13 14:36:13 +03:00
parent 3fd40888aa
commit 87bb570e24
2 changed files with 13 additions and 1 deletions

View file

@ -70,8 +70,10 @@ qint64 AudioProcessor::readData(char* data, qint64 maxlen)
qint64 AudioProcessor::writeData(const char* data, qint64 len) qint64 AudioProcessor::writeData(const char* data, qint64 len)
{ {
std::unique_lock<std::mutex> lock(inputMutex_); std::unique_lock<std::mutex> lock1(inputMutex_);
std::unique_lock<std::mutex> lock2(inputEventMutex_);
inputBuffer_.append(data, len); inputBuffer_.append(data, len);
inputEvent_.notify_all();
return len; return len;
} }
@ -122,6 +124,12 @@ void AudioProcessor::process()
emit readyRead(); emit readyRead();
} }
} }
else
{
processLock.unlock();
std::unique_lock<std::mutex> lock(inputEventMutex_);
inputEvent_.wait(lock);
}
} }
} }

View file

@ -9,6 +9,7 @@
#include <QIODevice> #include <QIODevice>
#include <QScopedPointer> #include <QScopedPointer>
#include <condition_variable>
#include <mutex> #include <mutex>
#include <thread> #include <thread>
@ -79,6 +80,9 @@ private:
std::thread worker_; std::thread worker_;
bool doWork_ = false; bool doWork_ = false;
std::condition_variable inputEvent_;
std::mutex inputEventMutex_;
QScopedPointer<WavFileWriter> sourceEncoder_; QScopedPointer<WavFileWriter> sourceEncoder_;
QScopedPointer<WavFileWriter> processedEncoder_; QScopedPointer<WavFileWriter> processedEncoder_;
}; };