Read from proxy for PCM direct and offloaded track position
Bug: 27776737
Change-Id: I721bf2b4d46271bf84ad9fc29ff5c4ecd4759206
diff --git a/include/media/AudioTrack.h b/include/media/AudioTrack.h
index 9e0e98b..bdd6372 100644
--- a/include/media/AudioTrack.h
+++ b/include/media/AudioTrack.h
@@ -830,6 +830,11 @@
bool isDirect_l() const
{ return (mFlags & AUDIO_OUTPUT_FLAG_DIRECT) != 0; }
+ // pure pcm data is mixable (which excludes HW_AV_SYNC, with embedded timing)
+ bool isPurePcmData_l() const
+ { return audio_is_linear_pcm(mFormat)
+ && (mAttributes.flags & AUDIO_FLAG_HW_AV_SYNC) == 0; }
+
// increment mPosition by the delta of mServer, and return new value of mPosition
Modulo<uint32_t> updateAndGetPosition_l();
diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp
index 3f4594d..34d23d5 100644
--- a/media/libmedia/AudioTrack.cpp
+++ b/media/libmedia/AudioTrack.cpp
@@ -1014,7 +1014,11 @@
}
AutoMutex lock(mLock);
- if (isOffloadedOrDirect_l()) {
+ // FIXME: offloaded and direct tracks call into the HAL for render positions
+ // for compressed/synced data; however, we use proxy position for pure linear pcm data
+ // as we do not know the capability of the HAL for pcm position support and standby.
+ // There may be some latency differences between the HAL position and the proxy position.
+ if (isOffloadedOrDirect_l() && !isPurePcmData_l()) {
uint32_t dspFrames = 0;
if (isOffloaded_l() && ((mState == STATE_PAUSED) || (mState == STATE_PAUSED_STOPPING))) {