Merge "Fix issue 2428563: Camera rendered inoperable by voice call interruption."

This commit is contained in:
Eric Laurent
2010-03-05 16:01:47 -08:00
committed by Android (Google) Code Review
2 changed files with 15 additions and 5 deletions

View File

@@ -3247,7 +3247,10 @@ bool AudioFlinger::RecordThread::threadLoop()
if (mBytesRead < 0) {
LOGE("Error reading audio input");
if (mActiveTrack->mState == TrackBase::ACTIVE) {
sleep(1);
// Force input into standby so that it tries to
// recover at next read attempt
mInput->standby();
usleep(5000);
}
mRsmpInIndex = mFrameCount;
framesOut = 0;
@@ -3429,7 +3432,10 @@ status_t AudioFlinger::RecordThread::getNextBuffer(AudioBufferProvider::Buffer*
if (mBytesRead < 0) {
LOGE("RecordThread::getNextBuffer() Error reading audio input");
if (mActiveTrack->mState == TrackBase::ACTIVE) {
sleep(1);
// Force input into standby so that it tries to
// recover at next read attempt
mInput->standby();
usleep(5000);
}
buffer->raw = 0;
buffer->frameCount = 0;

View File

@@ -552,13 +552,17 @@ ssize_t AudioRecord::read(void* buffer, size_t userSize)
audioBuffer.frameCount = userSize/frameSize();
// Calling obtainBuffer() with a negative wait count causes
// an (almost) infinite wait time.
status_t err = obtainBuffer(&audioBuffer, -1);
// By using a wait count corresponding to twice the timeout period in
// obtainBuffer() we give a chance to recover once for a read timeout
// (if media_server crashed for instance) before returning a length of
// 0 bytes read to the client
status_t err = obtainBuffer(&audioBuffer, ((2 * MAX_RUN_TIMEOUT_MS) / WAIT_PERIOD_MS));
if (err < 0) {
// out of buffers, return #bytes written
if (err == status_t(NO_MORE_BUFFERS))
break;
if (err == status_t(TIMED_OUT))
err = 0;
return ssize_t(err);
}