Merge "audio: fix AudioTrack and AudioRecord restore"

gugelfrei
TreeHugger Robot 6 years ago committed by Android (Google) Code Review
commit cab10da0da

@ -1300,10 +1300,7 @@ retry:
mNewPosition = position + mUpdatePeriod;
status_t result = createRecord_l(position, mOpPackageName);
if (result != NO_ERROR) {
ALOGW("%s(%d): createRecord_l failed, do not retry", __func__, mId);
retries = 0;
} else {
if (result == NO_ERROR) {
if (mActive) {
// callback thread or sync event hasn't changed
// FIXME this fails if we have a new AudioFlinger instance
@ -1316,13 +1313,15 @@ retry:
if (result != NO_ERROR) {
ALOGW("%s(%d): failed status %d, retries %d", __func__, mId, result, retries);
if (--retries > 0) {
// leave time for an eventual race condition to clear before retrying
usleep(500000);
goto retry;
}
}
if (result != NO_ERROR) {
ALOGW("%s(%d): failed status %d", __func__, mId, result);
mActive = false;
// if no retries left, set invalid bit to force restoring at next occasion
// and avoid inconsistent active state on client and server sides
if (mCblk != nullptr) {
android_atomic_or(CBLK_INVALID, &mCblk->mFlags);
}
}
return result;

@ -2308,10 +2308,7 @@ retry:
// If a new IAudioTrack cannot be created, the previous (dead) instance will be left intact.
status_t result = createTrack_l();
if (result != NO_ERROR) {
ALOGW("%s(%d): createTrack_l failed, do not retry", __func__, mId);
retries = 0;
} else {
if (result == NO_ERROR) {
// take the frames that will be lost by track recreation into account in saved position
// For streaming tracks, this is the amount we obtained from the user/client
// (not the number actually consumed at the server - those are already lost).
@ -2358,12 +2355,16 @@ retry:
if (result != NO_ERROR) {
ALOGW("%s(%d): failed status %d, retries %d", __func__, mId, result, retries);
if (--retries > 0) {
// leave time for an eventual race condition to clear before retrying
usleep(500000);
goto retry;
}
mState = STATE_STOPPED;
mReleased = 0;
// if no retries left, set invalid bit to force restoring at next occasion
// and avoid inconsistent active state on client and server sides
if (mCblk != nullptr) {
android_atomic_or(CBLK_INVALID, &mCblk->mFlags);
}
}
return result;
}

Loading…
Cancel
Save