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

Commit ba98acb3 authored by Kevin Rocard's avatar Kevin Rocard
Browse files

Audiopolicy: Move AudioPolicyMixCollection in helper function



No functional changes

Test: adb shell audiorecorder --target /data/file.raw
Bug: 111453086
Change-Id: I300450742a3d6f0b22f69a25eeda7800e0a27943
Signed-off-by: default avatarKevin Rocard <krocard@google.com>
parent 1086b05f
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -99,6 +99,11 @@ public:
    status_t getDevicesForUid(uid_t uid, Vector<AudioDeviceTypeAddr>& devices) const;

    void dump(String8 *dst) const;

private:
    enum class MixMatchStatus { MATCH, NO_MATCH, INVALID_MIX };
    MixMatchStatus mixMatch(const AudioMix* mix, size_t mixIndex,
                            audio_attributes_t attributes, uid_t uid);
};

} // namespace android
+118 −102
Original line number Diff line number Diff line
@@ -156,14 +156,35 @@ void AudioPolicyMixCollection::closeOutput(sp<SwAudioOutputDescriptor> &desc)
    }
}

status_t AudioPolicyMixCollection::getOutputForAttr(audio_attributes_t attributes, uid_t uid,
                                                    sp<SwAudioOutputDescriptor> &desc)
status_t AudioPolicyMixCollection::getOutputForAttr(
        audio_attributes_t attributes, uid_t uid, sp<SwAudioOutputDescriptor> &desc)
{
    ALOGV("getOutputForAttr() querying %zu mixes:", size());
    desc = 0;
    for (size_t i = 0; i < size(); i++) {
        sp<AudioPolicyMix> policyMix = valueAt(i);
        sp<SwAudioOutputDescriptor> policyDesc = policyMix->getOutput();
        if (!policyDesc) {
            ALOGV("Skiping %zu: Mix has no output", i);
            continue;
        }

        AudioMix *mix = policyMix->getMix();
        switch (mixMatch(mix, i, attributes, uid)) {
            case MixMatchStatus::INVALID_MIX: return BAD_VALUE; // TODO: Do we really want to abort ?
            case MixMatchStatus::NO_MATCH: continue; // skip the mix
            case MixMatchStatus::MATCH:;
        }

        desc = policyMix->getOutput();
        desc->mPolicyMix = mix;
        return NO_ERROR;
    }
    return BAD_VALUE;
}

AudioPolicyMixCollection::MixMatchStatus AudioPolicyMixCollection::mixMatch(
        const AudioMix* mix, size_t mixIndex, audio_attributes_t attributes, uid_t uid) {

    if (mix->mMixType == MIX_TYPE_PLAYERS) {
        // TODO if adding more player rules (currently only 2), make rule handling "generic"
@@ -183,7 +204,7 @@ status_t AudioPolicyMixCollection::getOutputForAttr(audio_attributes_t attribute
        // iterate over all mix criteria to list what rules this mix contains
        for (size_t j = 0; j < mix->mCriteria.size(); j++) {
            ALOGV(" getOutputForAttr: mix %zu: inspecting mix criteria %zu of %zu",
                        i, j, mix->mCriteria.size());
                    mixIndex, j, mix->mCriteria.size());

            // if there is an address match, prioritize that match
            if (strncmp(attributes.tags, "addr=", strlen("addr=")) == 0 &&
@@ -237,13 +258,13 @@ status_t AudioPolicyMixCollection::getOutputForAttr(audio_attributes_t attribute
            // only have MATCH rules, or EXCLUDE rules in each dimension, not a combination
            if (hasUsageMatchRules && hasUsageExcludeRules) {
                ALOGE("getOutputForAttr: invalid combination of RULE_MATCH_ATTRIBUTE_USAGE"
                            " and RULE_EXCLUDE_ATTRIBUTE_USAGE in mix %zu", i);
                    return BAD_VALUE;
                        " and RULE_EXCLUDE_ATTRIBUTE_USAGE in mix %zu", mixIndex);
                return MixMatchStatus::INVALID_MIX;
            }
            if (hasUidMatchRules && hasUidExcludeRules) {
                ALOGE("getOutputForAttr: invalid combination of RULE_MATCH_UID"
                            " and RULE_EXCLUDE_UID in mix %zu", i);
                    return BAD_VALUE;
                        " and RULE_EXCLUDE_UID in mix %zu", mixIndex);
                return MixMatchStatus::INVALID_MIX;
            }

            if ((hasUsageExcludeRules && usageExclusionFound)
@@ -259,8 +280,8 @@ status_t AudioPolicyMixCollection::getOutputForAttr(audio_attributes_t attribute
                  (hasUsageMatchRules && !usageMatchFound)  ||
                  (hasUidExcludeRules && uidExclusionFound) ||
                  (hasUidMatchRules && !uidMatchFound))) {
                ALOGV("\tgetOutputForAttr will use mix %zu", i);
                desc = policyMix->getOutput();
            ALOGV("\tgetOutputForAttr will use mix %zu", mixIndex);
            return MixMatchStatus::MATCH;
        }

    } else if (mix->mMixType == MIX_TYPE_RECORDERS) {
@@ -269,15 +290,10 @@ status_t AudioPolicyMixCollection::getOutputForAttr(audio_attributes_t attribute
                strncmp(attributes.tags + strlen("addr="),
                        mix->mDeviceAddress.string(),
                        AUDIO_ATTRIBUTES_TAGS_MAX_SIZE - strlen("addr=") - 1) == 0) {
                desc = policyMix->getOutput();
            return MixMatchStatus::MATCH;
        }
    }
        if (desc != 0) {
            desc->mPolicyMix = mix;
            return NO_ERROR;
        }
    }
    return BAD_VALUE;
    return MixMatchStatus::NO_MATCH;
}

sp<DeviceDescriptor> AudioPolicyMixCollection::getDeviceAndMixForOutput(