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

Commit 8e70cf81 authored by Eric Laurent's avatar Eric Laurent
Browse files

audio policy: fix preferred device for mmap I/Os

In findPreferredDevice(), when handling mmap I/Os, only clients for
the considered strategy/capture preset must be retained.

Bug: 345044066
Bug: 338143144
Flag: EXEMPT bug fix
Test: repro steps in the bug
Change-Id: Ie4efbf3a6d2c2651c81a1aabd82e3f42a62f8d39
parent 311daa69
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -47,13 +47,17 @@ sp<DeviceDescriptor> findPreferredDevice(

    if (active) {
        // On MMAP IOs, the preferred device is selected by the first client (virtual client
        // created when the mmap stream is opened). This client is never active.
        // created when the mmap stream is opened). This client is never active and we only
        // consider the Filter criteria, not the active state.
        // On non MMAP IOs, the preferred device is honored only if all active clients have
        // a preferred device in which case the first client drives the selection.
        if (desc->isMmap()) {
            // The client list is never empty on a MMAP IO
            return devices.getDeviceFromId(
                    desc->clientsList(false /*activeOnly*/)[0]->preferredDeviceId());
            auto matchingClients = desc->clientsList(
                    false /*activeOnly*/, filter, true /*preferredDevice*/);
            if (matchingClients.empty()) {
                return nullptr;
            }
            return devices.getDeviceFromId(matchingClients[0]->preferredDeviceId());
        } else {
            auto activeClientsWithRoute =
                desc->clientsList(true /*activeOnly*/, filter, true /*preferredDevice*/);