FuguAudio: do not reset frame position on standby

Keep separate RenderPosition and PresentationPosition because
they behave differently.

Also do not use DIRECT mode for multi-channel PCM.

Bug: 21930805
Change-Id: Ib9cfa502d7ed0e7dd5f32f65c32412af32bdde0a
Signed-off-by: Phil Burk <philburk@google.com>
diff --git a/audio_policy.conf b/audio_policy.conf
index 4e337fe..8cf93a0 100644
--- a/audio_policy.conf
+++ b/audio_policy.conf
@@ -34,7 +34,6 @@
         channel_masks dynamic
         formats dynamic
         devices AUDIO_DEVICE_OUT_AUX_DIGITAL
-        flags AUDIO_OUTPUT_FLAG_DIRECT
       }
     }
     inputs {
diff --git a/libaudio/AudioStreamOut.cpp b/libaudio/AudioStreamOut.cpp
index 82678c9..93cce95 100644
--- a/libaudio/AudioStreamOut.cpp
+++ b/libaudio/AudioStreamOut.cpp
@@ -37,7 +37,8 @@
 namespace android {
 
 AudioStreamOut::AudioStreamOut(AudioHardwareOutput& owner, bool mcOut)
-    : mFramesRendered(0)
+    : mRenderPosition(0)
+    , mPresentationPosition(0)
     , mOwnerHAL(owner)
     , mFramesWritten(0)
     , mTgtDevices(0)
@@ -141,7 +142,8 @@
 
 status_t AudioStreamOut::standby()
 {
-    mFramesRendered = 0;
+    mRenderPosition = 0;
+    // Don't reset the presentation position.
     return standbyHardware();
 }
 
@@ -168,7 +170,8 @@
 
 status_t AudioStreamOut::flush()
 {
-    mFramesRendered = 0;
+    mRenderPosition = 0;
+    mPresentationPosition = 0;
     return NO_ERROR;
 }
 
@@ -266,7 +269,8 @@
     }
 
     mFramesWritten += framesWritten;
-    mFramesRendered += framesWritten;
+    mPresentationPosition += framesWritten;
+    mRenderPosition += framesWritten;
 
     if (needThrottle) {
         int64_t deltaLT;
@@ -404,21 +408,21 @@
                     (int64_t)audioOutput->getKernelBufferSize() - (int64_t)avail;
 
                 int64_t pendingFrames = framesInDriverBuffer + fudgeFrames;
-                int64_t signedFrames = mFramesRendered - pendingFrames;
+                int64_t signedFrames = mPresentationPosition - pendingFrames;
                 if (pendingFrames < 0) {
                     ALOGE("getPresentationPosition: negative pendingFrames = %lld",
                         pendingFrames);
                 } else if (signedFrames < 0) {
                     ALOGI("getPresentationPosition: playing silent preroll"
-                        ", mFramesRendered = %llu, pendingFrames = %lld",
-                        mFramesRendered, pendingFrames);
+                        ", mPresentationPosition = %llu, pendingFrames = %lld",
+                        mPresentationPosition, pendingFrames);
                 } else {
 #if HAL_PRINT_TIMESTAMP_CSV
                     // Print comma separated values for spreadsheet analysis.
                     uint64_t nanos = (((uint64_t)timestamp->tv_sec) * 1000000000L)
                             + timestamp->tv_nsec;
                     ALOGI("getPresentationPosition, %lld, %4u, %lld, %llu",
-                            mFramesRendered, avail, signedFrames, nanos);
+                            mPresentationPosition, avail, signedFrames, nanos);
 #endif
                     *frames = (uint64_t) signedFrames;
                     result = NO_ERROR;
@@ -443,7 +447,7 @@
     if (dspFrames == NULL) {
         return -EINVAL;
     }
-    *dspFrames = (uint32_t) mFramesRendered;
+    *dspFrames = (uint32_t) mRenderPosition;
     return NO_ERROR;
 }
 
diff --git a/libaudio/AudioStreamOut.h b/libaudio/AudioStreamOut.h
index f73241d..a24bc71 100644
--- a/libaudio/AudioStreamOut.h
+++ b/libaudio/AudioStreamOut.h
@@ -73,7 +73,8 @@
     Mutex           mRoutingLock;
 
     // Track frame position for timestamps, etc.
-    int64_t         mFramesRendered;
+    uint64_t        mRenderPosition;
+    uint64_t        mPresentationPosition;
 
     // Our HAL, used as the middle-man to collect and trade AudioOutputs.
     AudioHardwareOutput&  mOwnerHAL;