Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 039c24a2 authored by Eric Laurent's avatar Eric Laurent
Browse files

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
parent cb9bbdf1
Loading
Loading
Loading
Loading
+11 −17
Original line number Diff line number Diff line
@@ -10287,29 +10287,23 @@ status_t AudioFlinger::MmapThread::checkEffectCompatibility_l(

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());
        }
    }
    if (invalidPortIds.empty()) {
        return;
    }
    sp<MmapStreamCallback> callback = mCallback.promote();
    if (callback == nullptr) {
        if (mNoCallbackWarningCount < kMaxNoCallbackWarnings) {
            ALOGW("Could not notify MMAP stream tear down: no onTearDown callback!");
            callback = mCallback.promote();
            if (callback == nullptr &&  mNoCallbackWarningCount < kMaxNoCallbackWarnings) {
                ALOGW("Could not notify MMAP stream tear down: no onRoutingChanged callback!");
                mNoCallbackWarningCount++;
            }
        return;
            break;
        }
    mLock.unlock();
    for (const auto invalidPortId : invalidPortIds) {
        callback->onTearDown(invalidPortId);
    }
    if (callback != 0) {
        mLock.unlock();
        callback->onRoutingChanged(AUDIO_PORT_HANDLE_NONE);
        mLock.lock();
    }
}

void AudioFlinger::MmapThread::dumpInternals_l(int fd, const Vector<String16>& args __unused)
{