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

Commit abd9b898 authored by Marvin Ramin's avatar Marvin Ramin
Browse files

Improve AudioMix registration/unregistration

1) Pass through the AudioMix binder token introduced in frameworks/base
   all the way to AudioPolicyManager incl. aidl conversions.
2) When AudioPolicyManager#registerPolicyMixes fails improve the
   resetting logic. Only unregister policy mixes that were not already
registered before the call to registerPolicyMixes.
3) AudioPolicyManager#unregisterPolicyMixes returns an error if any
   mix unregistration failed. Previously the method only returned an
error if the LAST unregistration failed.
4) AudioPolicyMix#unregisterMix matches mixes on the AudioMix binder
   token instead of device type + address. This ensures AudioMixes are
uniquely identified and different policies cannot interfere with each
other.

Bug: 309080867
Test: atest AudioHostTest
Change-Id: If56134c56d77c615ed40e039aa566032b445842d
parent a8b7ec8e
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -68,7 +68,6 @@ cc_library {
        "libaudioclient_aidl_conversion",
        "libaudioutils",
        "libbinder",
        "libbinder_ndk",
        "libcutils",
        "liblog",
        "libutils",
+2 −0
Original line number Diff line number Diff line
@@ -242,6 +242,7 @@ aidl2legacy_AudioMix(const media::AudioMix& aidl) {
    legacy.mCbFlags = VALUE_OR_RETURN(aidl2legacy_AudioMixCallbackFlag_uint32_t_mask(aidl.cbFlags));
    legacy.mAllowPrivilegedMediaPlaybackCapture = aidl.allowPrivilegedMediaPlaybackCapture;
    legacy.mVoiceCommunicationCaptureAllowed = aidl.voiceCommunicationCaptureAllowed;
    legacy.mToken = aidl.mToken;
    return legacy;
}

@@ -265,6 +266,7 @@ legacy2aidl_AudioMix(const AudioMix& legacy) {
    aidl.cbFlags = VALUE_OR_RETURN(legacy2aidl_uint32_t_AudioMixCallbackFlag_mask(legacy.mCbFlags));
    aidl.allowPrivilegedMediaPlaybackCapture = legacy.mAllowPrivilegedMediaPlaybackCapture;
    aidl.voiceCommunicationCaptureAllowed = legacy.mVoiceCommunicationCaptureAllowed;
    aidl.mToken = legacy.mToken;
    return aidl;
}

+2 −0
Original line number Diff line number Diff line
@@ -39,4 +39,6 @@ parcelable AudioMix {
    boolean allowPrivilegedMediaPlaybackCapture;
    /** Indicates if the caller can capture voice communication output */
    boolean voiceCommunicationCaptureAllowed;
    /** Identifies the owner of the AudioPolicy that this AudioMix belongs to */
    IBinder mToken;
}
+2 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@
#ifndef ANDROID_AUDIO_POLICY_H
#define ANDROID_AUDIO_POLICY_H

#include <binder/IBinder.h>
#include <binder/Parcel.h>
#include <media/AudioDeviceTypeAddr.h>
#include <system/audio.h>
@@ -127,6 +128,7 @@ public:
    audio_devices_t mDeviceType;
    String8         mDeviceAddress;
    uint32_t        mCbFlags; // flags indicating which callbacks to use, see kCbFlag*
    sp<IBinder>     mToken;
    /** Ignore the AUDIO_FLAG_NO_MEDIA_PROJECTION */
    bool            mAllowPrivilegedMediaPlaybackCapture = false;
    /** Indicates if the caller can capture voice communication output */
+4 −0
Original line number Diff line number Diff line
@@ -17,6 +17,9 @@
//#define LOG_NDEBUG 0
#define LOG_TAG "AudioRoutingTest"

#include <string.h>

#include <binder/Binder.h>
#include <binder/ProcessState.h>
#include <cutils/properties.h>
#include <gtest/gtest.h>
@@ -149,6 +152,7 @@ class AudioRoutingTest : public ::testing::Test {
        config.sample_rate = 48000;
        AudioMix mix(criteria, mixType, config, mixFlag, String8{mAddress.c_str()}, 0);
        mix.mDeviceType = deviceType;
        mix.mToken = sp<BBinder>::make();
        mMixes.push(mix);
        if (OK == AudioSystem::registerPolicyMixes(mMixes, true)) {
            mPolicyMixRegistered = true;
Loading