Merge 0b5bf63cec484feba08b773184bc4069bc184633 on remote branch

Change-Id: I8e59ac1c9f946f7600583ac29dffcccfd17b9fb7
diff --git a/policy_hal/AudioPolicyManager.cpp b/policy_hal/AudioPolicyManager.cpp
index 28ba3a9..9cf20c7 100644
--- a/policy_hal/AudioPolicyManager.cpp
+++ b/policy_hal/AudioPolicyManager.cpp
@@ -247,6 +247,19 @@
         // checkA2dpSuspend must run before checkOutputForAllStrategies so that A2DP
         // output is suspended before any tracks are moved to it
         checkA2dpSuspend();
+
+        if (!outputs.isEmpty()) {
+            for (size_t i = 0; i < outputs.size(); i++) {
+                sp<SwAudioOutputDescriptor> desc = mOutputs.valueFor(outputs[i]);
+                // close voip output before track invalidation to allow creation of
+                // new voip stream from restoreTrack
+                if((desc->mFlags == (AUDIO_OUTPUT_FLAG_DIRECT | AUDIO_OUTPUT_FLAG_VOIP_RX)) != 0) {
+                    closeOutput(outputs[i]);
+                    outputs.remove(outputs[i]);
+                }
+            }
+        }
+
         checkOutputForAllStrategies();
         // outputs must be closed after checkOutputForAllStrategies() is executed
         if (!outputs.isEmpty()) {