audio policy: fix disordered sequence while changing device

  Disordered sequence will occur when delayMs of muting volume
  and changing path are the same and no additional delay between
  both commands (muteWaitMs == 0).
  Add half reported latency to delayMs for routing could avoid
  processing muting stream volume and switching path concurrently.

Bug: 149798335
Test: Make VoIP/voice call and switch device between handset/handsfree.
      Check if touch tone is truncated in QXDM.

Signed-off-by: Jasmine Cha <>
Change-Id: Ifa15ba9de330805637cfb20ee96c4293c1c1bd31
(cherry picked from commit 7f82d1a74e77e0a89fd8431dbaf68f9b8e8b7118)
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
index c048de3..a984b10 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -5535,7 +5535,10 @@
-        installPatch(__func__, patchHandle, outputDesc.get(), patchBuilder.patch(), delayMs);
+        // Add half reported latency to delayMs when muteWaitMs is null in order
+        // to avoid disordered sequence of muting volume and changing devices.
+        installPatch(__func__, patchHandle, outputDesc.get(), patchBuilder.patch(),
+                muteWaitMs == 0 ? (delayMs + (outputDesc->latency() / 2)) : delayMs);
     // update stream volumes according to new device