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

Commit e4a458a5 authored by jiabin's avatar jiabin
Browse files

Fix the logic of getting aaudio MMAP policy from collection of policy info.

When the HAL reports mmap policy per device type, the framework will set
the aaudio policy according to the values of the reported policies.
1. Uses AUTO if any of the policy is AUTO or ALWAYS
2. Uses NEVER if all of the policies are NEVER or UNSPECIFIED
3. Uses default policy if all of the policies are UNSPECIFIED

Bug: 342652379
Test: dump aaudio service
FLAG: EXEMPT bugfix
Change-Id: I93bae470e6d9fbdb6eca24108f3f33cb1499824e
parent 788af1c4
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@

#include <aaudio/AAudio.h>
#include <aaudio/AAudioTesting.h>
#include <android/media/audio/common/AudioMMapPolicy.h>
#include <android/media/audio/common/AudioMMapPolicyInfo.h>
#include <android/media/audio/common/AudioMMapPolicyType.h>
#include <media/AudioSystem.h>
@@ -40,11 +41,14 @@

using namespace aaudio;

using android::media::audio::common::AudioMMapPolicy;
using android::media::audio::common::AudioMMapPolicyInfo;
using android::media::audio::common::AudioMMapPolicyType;

#define AAUDIO_MMAP_POLICY_DEFAULT             AAUDIO_POLICY_NEVER
#define AAUDIO_MMAP_EXCLUSIVE_POLICY_DEFAULT   AAUDIO_POLICY_NEVER
#define AAUDIO_MMAP_POLICY_DEFAULT_AIDL        AudioMMapPolicy::NEVER
#define AAUDIO_MMAP_EXCLUSIVE_POLICY_DEFAULT_AIDL AudioMMapPolicy::NEVER

// These values are for a pre-check before we ask the lower level service to open a stream.
// So they are just outside the maximum conceivable range of value,
@@ -116,7 +120,8 @@ aaudio_result_t AudioStreamBuilder::build(AudioStream** streamPtr) {
    aaudio_policy_t mmapPolicy = AudioGlobal_getMMapPolicy();
    if (android::AudioSystem::getMmapPolicyInfo(
            AudioMMapPolicyType::DEFAULT, &policyInfos) == NO_ERROR) {
        aaudio_policy_t systemMmapPolicy = AAudio_getAAudioPolicy(policyInfos);
        aaudio_policy_t systemMmapPolicy = AAudio_getAAudioPolicy(
                policyInfos, AAUDIO_MMAP_POLICY_DEFAULT_AIDL);
        if (mmapPolicy == AAUDIO_POLICY_ALWAYS && systemMmapPolicy == AAUDIO_POLICY_NEVER) {
            // No need to try as AAudioService is not created and the client only wants MMAP path.
            return AAUDIO_ERROR_NO_SERVICE;
@@ -145,7 +150,8 @@ aaudio_result_t AudioStreamBuilder::build(AudioStream** streamPtr) {
    aaudio_policy_t mmapExclusivePolicy = AAUDIO_UNSPECIFIED;
    if (android::AudioSystem::getMmapPolicyInfo(
            AudioMMapPolicyType::EXCLUSIVE, &policyInfos) == NO_ERROR) {
        mmapExclusivePolicy = AAudio_getAAudioPolicy(policyInfos);
        mmapExclusivePolicy = AAudio_getAAudioPolicy(
                policyInfos, AAUDIO_MMAP_EXCLUSIVE_POLICY_DEFAULT_AIDL);
    }
    if (mmapExclusivePolicy == AAUDIO_UNSPECIFIED) {
        mmapExclusivePolicy = AAUDIO_MMAP_EXCLUSIVE_POLICY_DEFAULT;
+9 −5
Original line number Diff line number Diff line
@@ -680,12 +680,16 @@ aaudio_policy_t aidl2legacy_aaudio_policy(AudioMMapPolicy aidl) {

} // namespace

aaudio_policy_t AAudio_getAAudioPolicy(const std::vector<AudioMMapPolicyInfo>& policyInfos) {
    if (policyInfos.empty()) return AAUDIO_POLICY_AUTO;
    for (size_t i = 1; i < policyInfos.size(); ++i) {
        if (policyInfos.at(i).mmapPolicy != policyInfos.at(0).mmapPolicy) {
aaudio_policy_t AAudio_getAAudioPolicy(const std::vector<AudioMMapPolicyInfo>& policyInfos,
                                       AudioMMapPolicy defaultPolicy) {
    AudioMMapPolicy policy = defaultPolicy;
    for (const auto& policyInfo : policyInfos) {
        if (policyInfo.mmapPolicy == AudioMMapPolicy::NEVER) {
            policy = policyInfo.mmapPolicy;
        } else if (policyInfo.mmapPolicy == AudioMMapPolicy::AUTO ||
                   policyInfo.mmapPolicy == AudioMMapPolicy::ALWAYS) {
            return AAUDIO_POLICY_AUTO;
        }
    }
    return aidl2legacy_aaudio_policy(policyInfos.at(0).mmapPolicy);
    return aidl2legacy_aaudio_policy(policy);
}
+13 −3
Original line number Diff line number Diff line
@@ -348,9 +348,19 @@ enum {
    AAUDIO_CHANNEL_INDEX_MASK_24 = AAUDIO_CHANNEL_BIT_INDEX | (1 << 24) - 1,
};

// The aaudio policy will be ALWAYS, NEVER, UNSPECIFIED only when all policy info are
// ALWAYS, NEVER or UNSPECIFIED. Otherwise, the aaudio policy will be AUTO.
/**
 * Returns the aaudio mmap policy based on the vector of mmap policy info. The rule as
 * 1. Returns AUTO if any of the policy is AUTO or ALWAYS
 * 2. Returns NEVER if all of the policies are NEVER or UNSPECIFIED
 * 3. Returns default policy if all of the policies are UNSPECIFIED
 *
 * @param policyInfos
 * @param defaultPolicy
 * @return
 */
aaudio_policy_t AAudio_getAAudioPolicy(
        const std::vector<android::media::audio::common::AudioMMapPolicyInfo>& policyInfos);
        const std::vector<android::media::audio::common::AudioMMapPolicyInfo>& policyInfos,
        android::media::audio::common::AudioMMapPolicy defaultPolicy =
                android::media::audio::common::AudioMMapPolicy::NEVER);

#endif //UTILITY_AAUDIO_UTILITIES_H