audio_policy: Add extra check before restoring device in stopOutput
When certain game apks run with sound enabled, UI lag will be
observed.
This is due to device to be restored with double HAL latency even
when it's the same with the previous device, since setOutputDevice
is synchronous call now, then it will block the subsequent calling
to APM until the latency time elapsed.
When the device to be restored is the same as previous device,
set the latency to 0.
Ported from Change-Id: I2c92675cedd8930430f81147c7f733d8dd70798c
Change-Id: I4582cdc98f4cf8189d89b648e5c3f6e0ce8089ab
diff --git a/policy_hal/AudioPolicyManager.cpp b/policy_hal/AudioPolicyManager.cpp
index b0707d7..b0efee0 100644
--- a/policy_hal/AudioPolicyManager.cpp
+++ b/policy_hal/AudioPolicyManager.cpp
@@ -977,6 +977,7 @@
// store time at which the stream was stopped - see isStreamActive()
if (outputDesc->mRefCount[stream] == 0 || forceDeviceUpdate) {
outputDesc->mStopTime[stream] = systemTime();
+ audio_devices_t prevDevice = outputDesc->device();
audio_devices_t newDevice = getNewOutputDevice(outputDesc, false /*fromCache*/);
// delay the device switch by twice the latency because stopOutput() is executed when
// the track stop() command is received and at that time the audio track buffer can
@@ -995,10 +996,16 @@
outputDesc->sharesHwModuleWith(desc) &&
(newDevice != desc->device())) {
audio_devices_t dev = getNewOutputDevice(mOutputs.valueFor(curOutput), false /*fromCache*/);
+ uint32_t delayMs;
+ if (dev == prevDevice) {
+ delayMs = 0;
+ } else {
+ delayMs = outputDesc->mLatency*2;
+ }
setOutputDevice(desc,
dev,
true,
- outputDesc->latency()*2);
+ delayMs);
}
}
// update the outputs if stopping one with a stream that can affect notification routing