Skip to content
Snippets Groups Projects
Commit 303da322 authored by Adrien Béraud's avatar Adrien Béraud
Browse files

opensl: avoid blocking on stop

Change-Id: I9cb774da618e1a6e0a31e4915035a9faaaa4569b
parent 01810bbb
No related branches found
No related tags found
No related merge requests found
...@@ -88,18 +88,18 @@ OpenSLLayer::startStream() ...@@ -88,18 +88,18 @@ OpenSLLayer::startStream()
startAudioPlayback(); startAudioPlayback();
startAudioCapture(); startAudioCapture();
JAMI_WARN("OpenSL audio layer started"); JAMI_WARN("OpenSL audio layer started");
{
std::lock_guard<std::mutex> lock(mutex_); std::lock_guard<std::mutex> lock(mutex_);
status_ = Status::Started; status_ = Status::Started;
}
startedCv_.notify_all(); startedCv_.notify_all();
}); });
startedCv_.notify_all();
} }
void void
OpenSLLayer::stopStream() OpenSLLayer::stopStream()
{ {
std::lock_guard<std::mutex> lock(mutex_); std::unique_lock<std::mutex> lock(mutex_);
startedCv_.wait(lock, [this] { return status_ != Status::Starting; });
if (startThread_.joinable()) { if (startThread_.joinable()) {
startThread_.join(); startThread_.join();
} }
...@@ -126,6 +126,7 @@ OpenSLLayer::stopStream() ...@@ -126,6 +126,7 @@ OpenSLLayer::stopStream()
recBufQueue_.clear(); recBufQueue_.clear();
bufs_.clear(); bufs_.clear();
dcblocker_.reset(); dcblocker_.reset();
startedCv_.notify_all();
} }
std::vector<sample_buf> std::vector<sample_buf>
...@@ -246,7 +247,7 @@ OpenSLLayer::engineServiceRing(bool waiting) { ...@@ -246,7 +247,7 @@ OpenSLLayer::engineServiceRing(bool waiting) {
void void
OpenSLLayer::engineServiceRec(bool /* waiting */) { OpenSLLayer::engineServiceRec(bool /* waiting */) {
playCv.notify_one(); //playCv.notify_one();
recCv.notify_one(); recCv.notify_one();
return; return;
} }
...@@ -334,10 +335,10 @@ OpenSLLayer::startAudioCapture() ...@@ -334,10 +335,10 @@ OpenSLLayer::startAudioCapture()
std::unique_lock<std::mutex> lck(recMtx); std::unique_lock<std::mutex> lck(recMtx);
while (recorder_) { while (recorder_) {
recCv.wait(lck); recCv.wait(lck);
while (true) { if (not recorder_)
sample_buf *buf;
if(!recBufQueue_.front(&buf))
break; break;
sample_buf *buf;
while (recBufQueue_.front(&buf)) {
recBufQueue_.pop(); recBufQueue_.pop();
if (buf->size_ > 0) { if (buf->size_ > 0) {
auto nb_samples = buf->size_ / hardwareFormat_.getBytesPerFrame(); auto nb_samples = buf->size_ / hardwareFormat_.getBytesPerFrame();
...@@ -394,8 +395,8 @@ OpenSLLayer::stopAudioCapture() ...@@ -394,8 +395,8 @@ OpenSLLayer::stopAudioCapture()
recorder_.reset(); recorder_.reset();
} }
} }
if (recThread.joinable()) {
recCv.notify_all(); recCv.notify_all();
if (recThread.joinable()) {
recThread.join(); recThread.join();
} }
......
...@@ -425,7 +425,7 @@ AudioPreference::createAudioLayer() ...@@ -425,7 +425,7 @@ AudioPreference::createAudioLayer()
} }
return nullptr; return nullptr;
#endif #endif
#endif // __ANDROID__ #endif // HAVE_OPENSL
JAMI_WARN("No audio layer provided"); JAMI_WARN("No audio layer provided");
return nullptr; return nullptr;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment