recover if no chunks are available

This commit is contained in:
badaix 2016-01-03 15:57:35 +01:00
parent 25acbc1717
commit 0f9c86c7c2
2 changed files with 25 additions and 11 deletions

View file

@ -84,20 +84,29 @@ void OpenslPlayer::playerCallback(SLAndroidSimpleBufferQueueItf bq)
// diff = 0; // diff = 0;
// chronos::usec delay((250 - diff) * 1000); // chronos::usec delay((250 - diff) * 1000);
// while (active_ && !stream_->waitForChunk(100))
// logO << "Waiting for chunk\n";
if (!active_)
return;
chronos::usec delay(150 * 1000); chronos::usec delay(150 * 1000);
if (!pubStream_->getPlayerChunk(buffer[curBuffer], delay, frames_))
if (pubStream_->getPlayerChunk(buffer[curBuffer], delay, frames_))
{ {
logO << "Failed to get chunk. Playing silence.\n";
memset(buffer[curBuffer], 0, buff_size);
}
SLresult result; while (active_)
do
{ {
result = (*bq)->Enqueue(bq, buffer[curBuffer], buff_size); SLresult result = (*bq)->Enqueue(bq, buffer[curBuffer], buff_size);
if (result == SL_RESULT_BUFFER_INSUFFICIENT) if (result == SL_RESULT_BUFFER_INSUFFICIENT)
usleep(1000); usleep(1000);
else
break;
} }
while (result == SL_RESULT_BUFFER_INSUFFICIENT);
}
curBuffer ^= 1; // Switch buffer curBuffer ^= 1; // Switch buffer
} }
@ -256,12 +265,14 @@ void OpenslPlayer::uninitOpensl()
void OpenslPlayer::start() void OpenslPlayer::start()
{ {
active_ = true;
initOpensl(); initOpensl();
} }
void OpenslPlayer::stop() void OpenslPlayer::stop()
{ {
active_ = false;
uninitOpensl(); uninitOpensl();
} }

View file

@ -82,6 +82,9 @@ void Stream::addChunk(msg::PcmChunk* chunk)
bool Stream::waitForChunk(size_t ms) const bool Stream::waitForChunk(size_t ms) const
{ {
if (!chunks_.empty())
return true;
std::unique_lock<std::mutex> lck(cvMutex_); std::unique_lock<std::mutex> lck(cvMutex_);
cv_.wait_for(lck, std::chrono::milliseconds(ms)); cv_.wait_for(lck, std::chrono::milliseconds(ms));
return !chunks_.empty(); return !chunks_.empty();