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

Commit 7db2d8f1 authored by Jean-Michel Trivi's avatar Jean-Michel Trivi
Browse files

AudioService: don't send BECOMING_NOISY when dyn policy affects media

Only send ACTION_AUDIO_BECOMING_NOISY when there is no dynamic
  policy registered that affects media.

Bug: 67610473
Test: see bug
Change-Id: I0768718fbde35ea53c36c309086529567dfa82ac
parent 88840820
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -161,6 +161,11 @@ public class AudioMix {
        return mDeviceAddress;
    }

    /** @hide */
    public boolean isAffectingUsage(int usage) {
        return mRule.isAffectingUsage(usage);
    }

    /** @hide */
    @Override
    public boolean equals(Object o) {
+11 −0
Original line number Diff line number Diff line
@@ -135,6 +135,17 @@ public class AudioMixingRule {
        }
    }

    boolean isAffectingUsage(int usage) {
        for (AudioMixMatchCriterion criterion : mCriteria) {
            if ((criterion.mRule & RULE_MATCH_ATTRIBUTE_USAGE) != 0
                    && criterion.mAttr != null
                    && criterion.mAttr.getUsage() == usage) {
                return true;
            }
        }
        return false;
    }

    private static boolean areCriteriaEquivalent(ArrayList<AudioMixMatchCriterion> cr1,
            ArrayList<AudioMixMatchCriterion> cr2) {
        if (cr1 == null || cr2 == null) return false;
+31 −1
Original line number Diff line number Diff line
@@ -141,6 +141,7 @@ import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@@ -5615,7 +5616,9 @@ public class AudioService extends IAudioService.Stub
            }
            // ignore condition on device being actually used for music when in communication
            // because music routing is altered in this case.
            if (((device == musicDevice) || isInCommunication()) && (device == devices)) {
            // also checks whether media routing if affected by a dynamic policy
            if (((device == musicDevice) || isInCommunication()) && (device == devices)
                    && !hasMediaDynamicPolicy()) {
                mAudioHandler.removeMessages(MSG_BROADCAST_AUDIO_BECOMING_NOISY);
                sendMsg(mAudioHandler,
                        MSG_BROADCAST_AUDIO_BECOMING_NOISY,
@@ -5641,6 +5644,24 @@ public class AudioService extends IAudioService.Stub
        return delay;
    }

    /**
     * @return true if there is currently a registered dynamic mixing policy that affects media
     */
    private boolean hasMediaDynamicPolicy() {
        synchronized (mAudioPolicies) {
            if (mAudioPolicies.isEmpty()) {
                return false;
            }
            final Collection<AudioPolicyProxy> appColl = mAudioPolicies.values();
            for (AudioPolicyProxy app : appColl) {
                if (app.hasMixAffectingUsage(AudioAttributes.USAGE_MEDIA)) {
                    return true;
                }
            }
            return false;
        }
    }

    private void updateAudioRoutes(int device, int state)
    {
        int connType = 0;
@@ -7339,6 +7360,15 @@ public class AudioService extends IAudioService.Stub
            Binder.restoreCallingIdentity(identity);
        }

        boolean hasMixAffectingUsage(int usage) {
            for (AudioMix mix : mMixes) {
                if (mix.isAffectingUsage(usage)) {
                    return true;
                }
            }
            return false;
        }

        void addMixes(@NonNull ArrayList<AudioMix> mixes) {
            // TODO optimize to not have to unregister the mixes already in place
            synchronized (mMixes) {