|
|
|
@ -2248,6 +2248,16 @@ status_t AudioTrack::restoreTrack_l(const char *from)
|
|
|
|
|
staticPosition = mStaticProxy->getPosition().unsignedValue();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// See b/74409267. Connecting to a BT A2DP device supporting multiple codecs
|
|
|
|
|
// causes a lot of churn on the service side, and it can reject starting
|
|
|
|
|
// playback of a previously created track. May also apply to other cases.
|
|
|
|
|
const int INITIAL_RETRIES = 3;
|
|
|
|
|
int retries = INITIAL_RETRIES;
|
|
|
|
|
retry:
|
|
|
|
|
if (retries < INITIAL_RETRIES) {
|
|
|
|
|
// See the comment for clearAudioConfigCache at the start of the function.
|
|
|
|
|
AudioSystem::clearAudioConfigCache();
|
|
|
|
|
}
|
|
|
|
|
mFlags = mOrigFlags;
|
|
|
|
|
|
|
|
|
|
// If a new IAudioTrack is successfully created, createTrack_l() will modify the
|
|
|
|
@ -2256,7 +2266,10 @@ status_t AudioTrack::restoreTrack_l(const char *from)
|
|
|
|
|
// If a new IAudioTrack cannot be created, the previous (dead) instance will be left intact.
|
|
|
|
|
status_t result = createTrack_l();
|
|
|
|
|
|
|
|
|
|
if (result == NO_ERROR) {
|
|
|
|
|
if (result != NO_ERROR) {
|
|
|
|
|
ALOGW("%s(): createTrack_l failed, do not retry", __func__);
|
|
|
|
|
retries = 0;
|
|
|
|
|
} else {
|
|
|
|
|
// 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).
|
|
|
|
@ -2301,7 +2314,10 @@ status_t AudioTrack::restoreTrack_l(const char *from)
|
|
|
|
|
mFramesWrittenAtRestore = mFramesWrittenServerOffset;
|
|
|
|
|
}
|
|
|
|
|
if (result != NO_ERROR) {
|
|
|
|
|
ALOGW("restoreTrack_l() failed status %d", result);
|
|
|
|
|
ALOGW("%s() failed status %d, retries %d", __func__, result, retries);
|
|
|
|
|
if (--retries > 0) {
|
|
|
|
|
goto retry;
|
|
|
|
|
}
|
|
|
|
|
mState = STATE_STOPPED;
|
|
|
|
|
mReleased = 0;
|
|
|
|
|
}
|
|
|
|
|