Skip to content
Snippets Groups Projects
Commit ea97002a authored by Sébastien Blin's avatar Sébastien Blin
Browse files

opensl: fix incorrect injected buffer

Sometimes, buffer with incorrect capacity were injected into
the audio, causing the daemon to crash.
Before the stream's split, stopStream was flushing the buffers.
In this patch, stopStream will correctly re-init the buffers and
avoid to inject incorrect buffer into the audio.
Also, remove unused value in buf_manager.h and clean some warnings
for log.
Finally, modify engineServiceRing to avoid many push operations
and make it similar to engineServicePlay

Change-Id: I589cea814452d3dbf5172af6369e448dcd9d5c72
GitLab: #676
parent 41eab75d
Branches
No related tags found
No related merge requests found
...@@ -76,7 +76,7 @@ AudioPlayer::processSLCallback(SLAndroidSimpleBufferQueueItf bq) ...@@ -76,7 +76,7 @@ AudioPlayer::processSLCallback(SLAndroidSimpleBufferQueueItf bq)
while (playQueue_->front(&buf) && devShadowQueue_.push(buf)) { while (playQueue_->front(&buf) && devShadowQueue_.push(buf)) {
if ((*bq)->Enqueue(bq, buf->buf_, buf->size_) != SL_RESULT_SUCCESS) { if ((*bq)->Enqueue(bq, buf->buf_, buf->size_) != SL_RESULT_SUCCESS) {
devShadowQueue_.pop(); devShadowQueue_.pop();
JAMI_ERR("enqueue failed %zu %zu %zu %zu", JAMI_ERR("enqueue failed %zu %d %d %d",
buf->size_, buf->size_,
freeQueue_->size(), freeQueue_->size(),
playQueue_->size(), playQueue_->size(),
...@@ -279,7 +279,7 @@ AudioPlayer::playAudioBuffers(unsigned count) ...@@ -279,7 +279,7 @@ AudioPlayer::playAudioBuffers(unsigned count)
SLresult result = (*playBufferQueueItf_)->Enqueue(playBufferQueueItf_, buf->buf_, buf->size_); SLresult result = (*playBufferQueueItf_)->Enqueue(playBufferQueueItf_, buf->buf_, buf->size_);
if (result != SL_RESULT_SUCCESS) { if (result != SL_RESULT_SUCCESS) {
JAMI_ERR("%s Error @( %p, %d ), result = %d", JAMI_ERR("%s Error @( %p, %zu ), result = %d",
__FUNCTION__, __FUNCTION__,
(void*) buf->buf_, (void*) buf->buf_,
buf->size_, buf->size_,
......
...@@ -30,10 +30,6 @@ ...@@ -30,10 +30,6 @@
#include <limits> #include <limits>
#include <vector> #include <vector>
#ifndef CACHE_ALIGN
#define CACHE_ALIGN 64
#endif
/* /*
* ProducerConsumerQueue, borrowed from Ian NiLewis * ProducerConsumerQueue, borrowed from Ian NiLewis
*/ */
......
...@@ -116,6 +116,8 @@ void ...@@ -116,6 +116,8 @@ void
OpenSLLayer::stopStream(AudioDeviceType stream) OpenSLLayer::stopStream(AudioDeviceType stream)
{ {
std::lock_guard<std::mutex> lock(mutex_); std::lock_guard<std::mutex> lock(mutex_);
if (!engineObject_)
return; // bufs_ should be initialized
JAMI_WARN("Stopping OpenSL audio layer for type %u", (unsigned) stream); JAMI_WARN("Stopping OpenSL audio layer for type %u", (unsigned) stream);
if (stream == AudioDeviceType::PLAYBACK) { if (stream == AudioDeviceType::PLAYBACK) {
...@@ -124,13 +126,27 @@ OpenSLLayer::stopStream(AudioDeviceType stream) ...@@ -124,13 +126,27 @@ OpenSLLayer::stopStream(AudioDeviceType stream)
player_->stop(); player_->stop();
player_.reset(); player_.reset();
} }
freePlayBufQueue_.clear();
for (int i = 0; i < BUF_COUNT; i++)
freePlayBufQueue_.push(&bufs_[i]);
playBufQueue_.clear();
} else if (stream == AudioDeviceType::RINGTONE) { } else if (stream == AudioDeviceType::RINGTONE) {
if (ringtone_) { if (ringtone_) {
ringtone_->stop(); ringtone_->stop();
ringtone_.reset(); ringtone_.reset();
} }
// Flush buffer
freeRingBufQueue_.clear();
for (int i = BUF_COUNT; i < 2 * BUF_COUNT; i++)
freeRingBufQueue_.push(&bufs_[i]);
ringBufQueue_.clear();
} else if (stream == AudioDeviceType::CAPTURE) { } else if (stream == AudioDeviceType::CAPTURE) {
stopAudioCapture(); stopAudioCapture();
// Flush buffer
freeRecBufQueue_.clear();
for (int i = 2 * BUF_COUNT; i < 3 * BUF_COUNT; i++)
freeRecBufQueue_.push(&bufs_[i]);
recBufQueue_.clear();
} }
if (not player_ and not ringtone_ and not recorder_) if (not player_ and not ringtone_ and not recorder_)
...@@ -168,7 +184,10 @@ OpenSLLayer::initAudioEngine() ...@@ -168,7 +184,10 @@ OpenSLLayer::initAudioEngine()
SLASSERT((*engineObject_)->GetInterface(engineObject_, SL_IID_ENGINE, &engineInterface_)); SLASSERT((*engineObject_)->GetInterface(engineObject_, SL_IID_ENGINE, &engineInterface_));
size_t bufSize = hardwareBuffSize_ * hardwareFormat_.getBytesPerFrame(); size_t bufSize = hardwareBuffSize_ * hardwareFormat_.getBytesPerFrame();
JAMI_DBG("OpenSL init: using buffer of %u bytes to support %s with %zu samples per channel", bufSize, hardwareFormat_.toString().c_str(), hardwareBuffSize_); JAMI_DBG("OpenSL init: using buffer of %zu bytes to support %s with %zu samples per channel",
bufSize,
hardwareFormat_.toString().c_str(),
hardwareBuffSize_);
bufs_ = allocateSampleBufs(BUF_COUNT * 3, bufSize); bufs_ = allocateSampleBufs(BUF_COUNT * 3, bufSize);
for (int i = 0; i < BUF_COUNT; i++) for (int i = 0; i < BUF_COUNT; i++)
freePlayBufQueue_.push(&bufs_[i]); freePlayBufQueue_.push(&bufs_[i]);
...@@ -224,17 +243,17 @@ OpenSLLayer::dbgEngineGetBufCount() ...@@ -224,17 +243,17 @@ OpenSLLayer::dbgEngineGetBufCount()
count_ringtone += freeRingBufQueue_.size(); count_ringtone += freeRingBufQueue_.size();
count_ringtone += ringBufQueue_.size(); count_ringtone += ringBufQueue_.size();
JAMI_ERR("Buf Disrtibutions: PlayerDev=%d, PlayQ=%d, FreePlayQ=%d", JAMI_ERR("Buf Disrtibutions: PlayerDev=%zu, PlayQ=%u, FreePlayQ=%u",
player_->dbgGetDevBufCount(), player_->dbgGetDevBufCount(),
playBufQueue_.size(), playBufQueue_.size(),
freePlayBufQueue_.size()); freePlayBufQueue_.size());
JAMI_ERR("Buf Disrtibutions: RingDev=%d, RingQ=%d, FreeRingQ=%d", JAMI_ERR("Buf Disrtibutions: RingDev=%zu, RingQ=%u, FreeRingQ=%u",
ringtone_->dbgGetDevBufCount(), ringtone_->dbgGetDevBufCount(),
ringBufQueue_.size(), ringBufQueue_.size(),
freeRingBufQueue_.size()); freeRingBufQueue_.size());
if (count_player != BUF_COUNT) { if (count_player != BUF_COUNT) {
JAMI_ERR("====Lost Bufs among the queue(supposed = %d, found = %d)", JAMI_ERR("====Lost Bufs among the queue(supposed = %d, found = %u)",
BUF_COUNT, BUF_COUNT,
count_player); count_player);
} }
...@@ -260,8 +279,6 @@ OpenSLLayer::engineServicePlay() ...@@ -260,8 +279,6 @@ OpenSLLayer::engineServicePlay()
dat->pointer()->nb_samples); dat->pointer()->nb_samples);
break; break;
} }
// JAMI_ERR("std::copy_n %p -> %p %zu", dat->pointer()->data[0], buf->buf_,
// dat->pointer()->nb_samples);
std::copy_n((const AudioSample*) dat->pointer()->data[0], std::copy_n((const AudioSample*) dat->pointer()->data[0],
dat->pointer()->nb_samples, dat->pointer()->nb_samples,
(AudioSample*) buf->buf_); (AudioSample*) buf->buf_);
...@@ -281,7 +298,6 @@ OpenSLLayer::engineServiceRing() ...@@ -281,7 +298,6 @@ OpenSLLayer::engineServiceRing()
{ {
sample_buf* buf; sample_buf* buf;
while (ringtone_ and freeRingBufQueue_.front(&buf)) { while (ringtone_ and freeRingBufQueue_.front(&buf)) {
freeRingBufQueue_.pop();
if (auto dat = getToRing(hardwareFormat_, hardwareBuffSize_)) { if (auto dat = getToRing(hardwareFormat_, hardwareBuffSize_)) {
buf->size_ = dat->pointer()->nb_samples * dat->pointer()->channels buf->size_ = dat->pointer()->nb_samples * dat->pointer()->channels
* sizeof(AudioSample); * sizeof(AudioSample);
...@@ -301,11 +317,10 @@ OpenSLLayer::engineServiceRing() ...@@ -301,11 +317,10 @@ OpenSLLayer::engineServiceRing()
(AudioSample*) buf->buf_); (AudioSample*) buf->buf_);
if (!ringBufQueue_.push(buf)) { if (!ringBufQueue_.push(buf)) {
JAMI_WARN("playThread ringtone_ PLAY_KICKSTART_BUFFER_COUNT 1"); JAMI_WARN("playThread ringtone_ PLAY_KICKSTART_BUFFER_COUNT 1");
freeRingBufQueue_.push(buf);
break; break;
} } else
freeRingBufQueue_.pop();
} else { } else {
freeRingBufQueue_.push(buf);
break; break;
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment