am 093000f7: Don\'t allow AudioTrack frameCount to decrease
* commit '093000f7d11839b920e8dfaa42ed1d09f48e24b8':
Don't allow AudioTrack frameCount to decrease
diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp
index b5b7adc..6189be5 100644
--- a/media/libmedia/AudioTrack.cpp
+++ b/media/libmedia/AudioTrack.cpp
@@ -269,6 +269,7 @@
mNotificationFramesReq = notificationFrames;
mSessionId = sessionId;
mAuxEffectId = 0;
+ mFlags = flags;
mCbf = cbf;
if (cbf != NULL) {
@@ -310,7 +311,6 @@
mNewPosition = 0;
mUpdatePeriod = 0;
mFlushed = false;
- mFlags = flags;
AudioSystem::acquireAudioSessionId(mSessionId);
mRestoreStatus = NO_ERROR;
return NO_ERROR;
@@ -770,7 +770,9 @@
// use case 2: callback handler
(mCbf != NULL))) {
ALOGW("AUDIO_OUTPUT_FLAG_FAST denied by client");
+ // once denied, do not request again if IAudioTrack is re-created
flags = (audio_output_flags_t) (flags & ~AUDIO_OUTPUT_FLAG_FAST);
+ mFlags = flags;
}
ALOGV("createTrack_l() output %d afLatency %d", output, afLatency);
@@ -899,6 +901,9 @@
ALOGV("AUDIO_OUTPUT_FLAG_FAST successful; frameCount %u", mCblk->frameCount);
} else {
ALOGV("AUDIO_OUTPUT_FLAG_FAST denied by server; frameCount %u", mCblk->frameCount);
+ // once denied, do not request again if IAudioTrack is re-created
+ flags = (audio_output_flags_t) (flags & ~AUDIO_OUTPUT_FLAG_FAST);
+ mFlags = flags;
}
if (sharedBuffer == 0) {
mNotificationFramesAct = mCblk->frameCount/2;
@@ -920,6 +925,11 @@
mRemainingFrames = mNotificationFramesAct;
// FIXME don't believe this lie
mLatency = afLatency + (1000*mCblk->frameCount) / sampleRate;
+ // If IAudioTrack is re-created, don't let the requested frameCount
+ // decrease. This can confuse clients that cache frameCount().
+ if (mCblk->frameCount > mFrameCount) {
+ mFrameCount = mCblk->frameCount;
+ }
return NO_ERROR;
}