audioflinger: fix mmap rerouting on track invalidation

When mmap tracks are invalidated by audio policy manager to request
a reconnection of the client to another output, do not send an onTearDown()
callback to AAudioService but an onRoutingChanged() callback to force
the stream disconnection.

Bug: 246803857
Test: repro steps in bug
Change-Id: I92b759a90d13c36052c9b39de17731b0214bb673
diff --git a/services/audioflinger/Threads.cpp b/services/audioflinger/Threads.cpp
index 87eb1f5..e724fba 100644
--- a/services/audioflinger/Threads.cpp
+++ b/services/audioflinger/Threads.cpp
@@ -10287,28 +10287,22 @@
 
 void AudioFlinger::MmapThread::checkInvalidTracks_l()
 {
-    std::vector<audio_port_handle_t> invalidPortIds;
+    sp<MmapStreamCallback> callback;
     for (const sp<MmapTrack> &track : mActiveTracks) {
         if (track->isInvalid()) {
-            invalidPortIds.push_back(track->portId());
+            callback = mCallback.promote();
+            if (callback == nullptr &&  mNoCallbackWarningCount < kMaxNoCallbackWarnings) {
+                ALOGW("Could not notify MMAP stream tear down: no onRoutingChanged callback!");
+                mNoCallbackWarningCount++;
+            }
+            break;
         }
     }
-    if (invalidPortIds.empty()) {
-        return;
+    if (callback != 0) {
+        mLock.unlock();
+        callback->onRoutingChanged(AUDIO_PORT_HANDLE_NONE);
+        mLock.lock();
     }
-    sp<MmapStreamCallback> callback = mCallback.promote();
-    if (callback == nullptr) {
-        if (mNoCallbackWarningCount < kMaxNoCallbackWarnings) {
-            ALOGW("Could not notify MMAP stream tear down: no onTearDown callback!");
-            mNoCallbackWarningCount++;
-        }
-        return;
-    }
-    mLock.unlock();
-    for (const auto invalidPortId : invalidPortIds) {
-        callback->onTearDown(invalidPortId);
-    }
-    mLock.lock();
 }
 
 void AudioFlinger::MmapThread::dumpInternals_l(int fd, const Vector<String16>& args __unused)