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;