Fix audio timestamp computation for pause, stop, and dynamic speed changes
Timestamp on pause and underrun (stop) do not reflect actual position.
Timestamps do not account for dynamic changes to track speed / sample rate.
Bug: 11085154
Bug: 17552775
Change-Id: I0e5e40ab3eaee82f0c91b9f399089698a0b1947e
diff --git a/services/audioflinger/PlaybackTracks.h b/services/audioflinger/PlaybackTracks.h
index 1450ca1..c81bbf9 100644
--- a/services/audioflinger/PlaybackTracks.h
+++ b/services/audioflinger/PlaybackTracks.h
@@ -100,6 +100,8 @@
void flushAck();
bool isResumePending();
void resumeAck();
+ void updateTrackFrameInfo(uint32_t trackFramesReleased, uint32_t sinkFramesWritten,
+ AudioTimestamp *timeStamp = NULL);
sp<IMemory> sharedBuffer() const { return mSharedBuffer; }
@@ -137,6 +139,12 @@
size_t mPresentationCompleteFrames; // number of frames written to the
// audio HAL when this track will be fully rendered
// zero means not monitoring
+
+ // access these three variables only when holding thread lock.
+ LinearMap<uint32_t> mFrameMap; // track frame to server frame mapping
+ bool mSinkTimestampValid; // valid cached timestamp
+ AudioTimestamp mSinkTimestamp;
+
private:
// The following fields are only for fast tracks, and should be in a subclass
int mFastIndex; // index within FastMixerState::mFastTracks[];