AudioTimestamp: advance first timestamp time after start if stale
Test: Photos, File playback, AudioTrackSurroundTest#testPlaySineSweepBytes
Bug: 113294730
Bug: 118506063
Bug: 119895849
Bug: 120631792
Change-Id: I83ec1e4c0ae2318fb69744a6265663a50682c485
diff --git a/media/libaudioclient/AudioTrack.cpp b/media/libaudioclient/AudioTrack.cpp
index ded9cb7..4a1c717 100644
--- a/media/libaudioclient/AudioTrack.cpp
+++ b/media/libaudioclient/AudioTrack.cpp
@@ -2754,27 +2754,32 @@
// Prevent retrograde motion in timestamp.
// This is sometimes caused by erratic reports of the available space in the ALSA drivers.
if (status == NO_ERROR) {
+ // Fix stale time when checking timestamp right after start().
+ // The position is at the last reported location but the time can be stale
+ // due to pause or standby or cold start latency.
+ //
+ // We keep advancing the time (but not the position) to ensure that the
+ // stale value does not confuse the application.
+ //
+ // For offload compatibility, use a default lag value here.
+ // Any time discrepancy between this update and the pause timestamp is handled
+ // by the retrograde check afterwards.
+ int64_t currentTimeNanos = audio_utils_ns_from_timespec(×tamp.mTime);
+ const int64_t lagNs = int64_t(mAfLatency * 1000000LL);
+ const int64_t limitNs = mStartNs - lagNs;
+ if (currentTimeNanos < limitNs) {
+ ALOGD("%s(%d): correcting timestamp time for pause, "
+ "currentTimeNanos: %lld < limitNs: %lld < mStartNs: %lld",
+ __func__, mPortId,
+ (long long)currentTimeNanos, (long long)limitNs, (long long)mStartNs);
+ timestamp.mTime = convertNsToTimespec(limitNs);
+ currentTimeNanos = limitNs;
+ }
+
// previousTimestampValid is set to false when starting after a stop or flush.
if (previousTimestampValid) {
const int64_t previousTimeNanos =
audio_utils_ns_from_timespec(&mPreviousTimestamp.mTime);
- int64_t currentTimeNanos = audio_utils_ns_from_timespec(×tamp.mTime);
-
- // Fix stale time when checking timestamp right after start().
- //
- // For offload compatibility, use a default lag value here.
- // Any time discrepancy between this update and the pause timestamp is handled
- // by the retrograde check afterwards.
- const int64_t lagNs = int64_t(mAfLatency * 1000000LL);
- const int64_t limitNs = mStartNs - lagNs;
- if (currentTimeNanos < limitNs) {
- ALOGD("%s(%d): correcting timestamp time for pause, "
- "currentTimeNanos: %lld < limitNs: %lld < mStartNs: %lld",
- __func__, mPortId,
- (long long)currentTimeNanos, (long long)limitNs, (long long)mStartNs);
- timestamp.mTime = convertNsToTimespec(limitNs);
- currentTimeNanos = limitNs;
- }
// retrograde check
if (currentTimeNanos < previousTimeNanos) {