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

Commit f40141dd authored by jiabin's avatar jiabin
Browse files

Introduce device(s) role for strategy.

Adding interface for set/remove/getDevicesRoleForStrategy. This will be
used for setting device(s) role, such as preferred, for strategy.
Set/remove/getPreferreDeviceForStrategy are reimplemented by calling
the new interfaces.

Test: atest AudioHostTest
Test: atest AudioServiceHostTest
Test: atest AudioServiceTest
Test: atest audiopolicy_tests
Bug: 160352965
Change-Id: I2ba02c6b50af80846a25010ead05c4ae364868de
parent 0b553296
Loading
Loading
Loading
Loading
+12 −4
Original line number Original line Diff line number Diff line
@@ -4195,7 +4195,8 @@ package android.media {
  public class AudioManager {
  public class AudioManager {
    method @Deprecated public int abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, android.media.AudioAttributes);
    method @Deprecated public int abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, android.media.AudioAttributes);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void addOnPreferredDeviceForStrategyChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.OnPreferredDeviceForStrategyChangedListener) throws java.lang.SecurityException;
    method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void addOnPreferredDeviceForStrategyChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.OnPreferredDeviceForStrategyChangedListener) throws java.lang.SecurityException;
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void addOnPreferredDevicesForStrategyChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.OnPreferredDevicesForStrategyChangedListener) throws java.lang.SecurityException;
    method public void clearAudioServerStateCallback();
    method public void clearAudioServerStateCallback();
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int dispatchAudioFocusChange(@NonNull android.media.AudioFocusInfo, int, @NonNull android.media.audiopolicy.AudioPolicy);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int dispatchAudioFocusChange(@NonNull android.media.AudioFocusInfo, int, @NonNull android.media.audiopolicy.AudioPolicy);
    method @IntRange(from=0) public long getAdditionalOutputDeviceDelay(@NonNull android.media.AudioDeviceInfo);
    method @IntRange(from=0) public long getAdditionalOutputDeviceDelay(@NonNull android.media.AudioDeviceInfo);
@@ -4207,13 +4208,15 @@ package android.media {
    method @IntRange(from=0) @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getMaxVolumeIndexForAttributes(@NonNull android.media.AudioAttributes);
    method @IntRange(from=0) @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getMaxVolumeIndexForAttributes(@NonNull android.media.AudioAttributes);
    method @IntRange(from=0) @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getMinVolumeIndexForAttributes(@NonNull android.media.AudioAttributes);
    method @IntRange(from=0) @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getMinVolumeIndexForAttributes(@NonNull android.media.AudioAttributes);
    method @Nullable @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public android.media.AudioDeviceAttributes getPreferredDeviceForStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy);
    method @Nullable @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public android.media.AudioDeviceAttributes getPreferredDeviceForStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy);
    method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public java.util.List<android.media.AudioDeviceAttributes> getPreferredDevicesForStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy);
    method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int[] getSupportedSystemUsages();
    method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int[] getSupportedSystemUsages();
    method @IntRange(from=0) @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getVolumeIndexForAttributes(@NonNull android.media.AudioAttributes);
    method @IntRange(from=0) @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getVolumeIndexForAttributes(@NonNull android.media.AudioAttributes);
    method public boolean isAudioServerRunning();
    method public boolean isAudioServerRunning();
    method public boolean isHdmiSystemAudioSupported();
    method public boolean isHdmiSystemAudioSupported();
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int registerAudioPolicy(@NonNull android.media.audiopolicy.AudioPolicy);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int registerAudioPolicy(@NonNull android.media.audiopolicy.AudioPolicy);
    method public void registerVolumeGroupCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.VolumeGroupCallback);
    method public void registerVolumeGroupCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.VolumeGroupCallback);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void removeOnPreferredDeviceForStrategyChangedListener(@NonNull android.media.AudioManager.OnPreferredDeviceForStrategyChangedListener);
    method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void removeOnPreferredDeviceForStrategyChangedListener(@NonNull android.media.AudioManager.OnPreferredDeviceForStrategyChangedListener);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void removeOnPreferredDevicesForStrategyChangedListener(@NonNull android.media.AudioManager.OnPreferredDevicesForStrategyChangedListener);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean removePreferredDeviceForStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean removePreferredDeviceForStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy);
    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, @NonNull android.media.AudioAttributes, int, int) throws java.lang.IllegalArgumentException;
    method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, @NonNull android.media.AudioAttributes, int, int) throws java.lang.IllegalArgumentException;
    method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_PHONE_STATE, android.Manifest.permission.MODIFY_AUDIO_ROUTING}) public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, @NonNull android.media.AudioAttributes, int, int, android.media.audiopolicy.AudioPolicy) throws java.lang.IllegalArgumentException;
    method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_PHONE_STATE, android.Manifest.permission.MODIFY_AUDIO_ROUTING}) public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, @NonNull android.media.AudioAttributes, int, int, android.media.audiopolicy.AudioPolicy) throws java.lang.IllegalArgumentException;
@@ -4223,6 +4226,7 @@ package android.media {
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setDeviceVolumeBehavior(@NonNull android.media.AudioDeviceAttributes, int);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setDeviceVolumeBehavior(@NonNull android.media.AudioDeviceAttributes, int);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setFocusRequestResult(@NonNull android.media.AudioFocusInfo, int, @NonNull android.media.audiopolicy.AudioPolicy);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setFocusRequestResult(@NonNull android.media.AudioFocusInfo, int, @NonNull android.media.audiopolicy.AudioPolicy);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setPreferredDeviceForStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy, @NonNull android.media.AudioDeviceAttributes);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setPreferredDeviceForStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy, @NonNull android.media.AudioDeviceAttributes);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setPreferredDevicesForStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy, @NonNull java.util.List<android.media.AudioDeviceAttributes>);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setSupportedSystemUsages(@NonNull int[]);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setSupportedSystemUsages(@NonNull int[]);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setVolumeIndexForAttributes(@NonNull android.media.AudioAttributes, int, int);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setVolumeIndexForAttributes(@NonNull android.media.AudioAttributes, int, int);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void unregisterAudioPolicy(@NonNull android.media.audiopolicy.AudioPolicy);
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void unregisterAudioPolicy(@NonNull android.media.audiopolicy.AudioPolicy);
@@ -4246,8 +4250,12 @@ package android.media {
    method public void onAudioServerUp();
    method public void onAudioServerUp();
  }
  }
  public static interface AudioManager.OnPreferredDeviceForStrategyChangedListener {
  @Deprecated public static interface AudioManager.OnPreferredDeviceForStrategyChangedListener {
    method public void onPreferredDeviceForStrategyChanged(@NonNull android.media.audiopolicy.AudioProductStrategy, @Nullable android.media.AudioDeviceAttributes);
    method @Deprecated public void onPreferredDeviceForStrategyChanged(@NonNull android.media.audiopolicy.AudioProductStrategy, @Nullable android.media.AudioDeviceAttributes);
  }
  public static interface AudioManager.OnPreferredDevicesForStrategyChangedListener {
    method public void onPreferredDevicesForStrategyChanged(@NonNull android.media.audiopolicy.AudioProductStrategy, @NonNull java.util.List<android.media.AudioDeviceAttributes>);
  }
  }
  public abstract static class AudioManager.VolumeGroupCallback {
  public abstract static class AudioManager.VolumeGroupCallback {
+3 −0
Original line number Original line Diff line number Diff line
@@ -1779,6 +1779,9 @@ package android.media {
    method public static float getMasterBalance();
    method public static float getMasterBalance();
    method public static final int getNumStreamTypes();
    method public static final int getNumStreamTypes();
    method public static int setMasterBalance(float);
    method public static int setMasterBalance(float);
    field public static final int DEVICE_ROLE_DISABLED = 2; // 0x2
    field public static final int DEVICE_ROLE_NONE = 0; // 0x0
    field public static final int DEVICE_ROLE_PREFERRED = 1; // 0x1
    field public static final int STREAM_DEFAULT = -1; // 0xffffffff
    field public static final int STREAM_DEFAULT = -1; // 0xffffffff
  }
  }


+3 −3
Original line number Original line Diff line number Diff line
@@ -3709,9 +3709,9 @@ android.media.IRemoteVolumeObserver
android.media.IRingtonePlayer$Stub$Proxy
android.media.IRingtonePlayer$Stub$Proxy
android.media.IRingtonePlayer$Stub
android.media.IRingtonePlayer$Stub
android.media.IRingtonePlayer
android.media.IRingtonePlayer
android.media.IStrategyPreferredDeviceDispatcher$Stub$Proxy
android.media.IStrategyPreferredDevicesDispatcher$Stub$Proxy
android.media.IStrategyPreferredDeviceDispatcher$Stub
android.media.IStrategyPreferredDevicesDispatcher$Stub
android.media.IStrategyPreferredDeviceDispatcher
android.media.IStrategyPreferredDevicesDispatcher
android.media.IVolumeController$Stub$Proxy
android.media.IVolumeController$Stub$Proxy
android.media.IVolumeController$Stub
android.media.IVolumeController$Stub
android.media.IVolumeController
android.media.IVolumeController
+1 −1
Original line number Original line Diff line number Diff line
@@ -31,7 +31,7 @@ jint createAudioDeviceAttributesFromNative(JNIEnv *env, jobject *jAudioDeviceAtt
                                 const AudioDeviceTypeAddr *devTypeAddr) {
                                 const AudioDeviceTypeAddr *devTypeAddr) {
    jint jStatus = (jint)AUDIO_JAVA_SUCCESS;
    jint jStatus = (jint)AUDIO_JAVA_SUCCESS;
    jint jNativeType = (jint)devTypeAddr->mType;
    jint jNativeType = (jint)devTypeAddr->mType;
    ScopedLocalRef<jstring> jAddress(env, env->NewStringUTF(devTypeAddr->mAddress.data()));
    ScopedLocalRef<jstring> jAddress(env, env->NewStringUTF(devTypeAddr->getAddress()));


    *jAudioDeviceAttributes = env->NewObject(gAudioDeviceAttributesClass, gAudioDeviceAttributesCstor,
    *jAudioDeviceAttributes = env->NewObject(gAudioDeviceAttributesClass, gAudioDeviceAttributesCstor,
            jNativeType, jAddress.get());
            jNativeType, jAddress.get());
+42 −35
Original line number Original line Diff line number Diff line
@@ -172,6 +172,8 @@ static struct {
    jmethodID postRecordConfigEventFromNative;
    jmethodID postRecordConfigEventFromNative;
} gAudioPolicyEventHandlerMethods;
} gAudioPolicyEventHandlerMethods;


static struct { jmethodID add; } gListMethods;

//
//
// JNI Initialization for OpenSLES routing
// JNI Initialization for OpenSLES routing
//
//
@@ -2361,47 +2363,49 @@ android_media_AudioSystem_isCallScreeningModeSupported(JNIEnv *env, jobject thiz
    return AudioSystem::isCallScreenModeSupported();
    return AudioSystem::isCallScreenModeSupported();
}
}


static jint
static jint android_media_AudioSystem_setDevicesRoleForStrategy(JNIEnv *env, jobject thiz,
android_media_AudioSystem_setPreferredDeviceForStrategy(JNIEnv *env, jobject thiz,
                                                                jint strategy, jint role,
        jint strategy, jint deviceType, jstring deviceAddress) {
                                                                jintArray jDeviceTypes,

                                                                jobjectArray jDeviceAddresses) {
    const char *c_address = env->GetStringUTFChars(deviceAddress, NULL);
    AudioDeviceTypeAddrVector nDevices;
    jint results = getVectorOfAudioDeviceTypeAddr(env, jDeviceTypes, jDeviceAddresses, nDevices);
    if (results != NO_ERROR) {
        return results;
    }
    int status = check_AudioSystem_Command(
    int status = check_AudioSystem_Command(
            AudioSystem::setPreferredDeviceForStrategy((product_strategy_t) strategy,
            AudioSystem::setDevicesRoleForStrategy((product_strategy_t)strategy,
                    AudioDeviceTypeAddr(deviceType, c_address)));
                                                   (device_role_t)role, nDevices));
    env->ReleaseStringUTFChars(deviceAddress, c_address);
    return (jint) status;
    return (jint) status;
}
}


static jint
static jint android_media_AudioSystem_removeDevicesRoleForStrategy(JNIEnv *env, jobject thiz,
android_media_AudioSystem_removePreferredDeviceForStrategy(JNIEnv *env, jobject thiz, jint strategy)
                                                                   jint strategy, jint role) {
{
    return (jint)check_AudioSystem_Command(
    return (jint)check_AudioSystem_Command(
            AudioSystem::removePreferredDeviceForStrategy((product_strategy_t) strategy));
            AudioSystem::removeDevicesRoleForStrategy((product_strategy_t)strategy,
                                                      (device_role_t)role));
}
}


static jint
static jint android_media_AudioSystem_getDevicesForRoleAndStrategy(JNIEnv *env, jobject thiz,
android_media_AudioSystem_getPreferredDeviceForStrategy(JNIEnv *env, jobject thiz,
                                                                   jint strategy, jint role,
        jint strategy, jobjectArray jDeviceArray)
                                                                   jobject jDevices) {
{
    AudioDeviceTypeAddrVector nDevices;
    if (jDeviceArray == nullptr || env->GetArrayLength(jDeviceArray) != 1) {
        ALOGE("%s invalid array to store AudioDeviceAttributes", __FUNCTION__);
        return (jint)AUDIO_JAVA_BAD_VALUE;
    }

    AudioDeviceTypeAddr elDevice;
    status_t status = check_AudioSystem_Command(
    status_t status = check_AudioSystem_Command(
            AudioSystem::getPreferredDeviceForStrategy((product_strategy_t) strategy, elDevice));
            AudioSystem::getDevicesForRoleAndStrategy((product_strategy_t)strategy,
                                                      (device_role_t)role, nDevices));
    if (status != NO_ERROR) {
    if (status != NO_ERROR) {
        return (jint) status;
        return (jint) status;
    }
    }
    for (const auto &device : nDevices) {
        jobject jAudioDeviceAttributes = NULL;
        jobject jAudioDeviceAttributes = NULL;
    jint jStatus = createAudioDeviceAttributesFromNative(env, &jAudioDeviceAttributes, &elDevice);
        jint jStatus = createAudioDeviceAttributesFromNative(env, &jAudioDeviceAttributes, &device);
    if (jStatus == AUDIO_JAVA_SUCCESS) {
        if (jStatus != AUDIO_JAVA_SUCCESS) {
        env->SetObjectArrayElement(jDeviceArray, 0, jAudioDeviceAttributes);
    }
            return jStatus;
            return jStatus;
        }
        }
        env->CallBooleanMethod(jDevices, gListMethods.add, jAudioDeviceAttributes);
        env->DeleteLocalRef(jAudioDeviceAttributes);
    }
    return AUDIO_JAVA_SUCCESS;
}


static jint
static jint
android_media_AudioSystem_getDevicesForAttributes(JNIEnv *env, jobject thiz,
android_media_AudioSystem_getDevicesForAttributes(JNIEnv *env, jobject thiz,
@@ -2548,12 +2552,12 @@ static const JNINativeMethod gMethods[] =
         {"setAudioHalPids", "([I)I", (void *)android_media_AudioSystem_setAudioHalPids},
         {"setAudioHalPids", "([I)I", (void *)android_media_AudioSystem_setAudioHalPids},
         {"isCallScreeningModeSupported", "()Z",
         {"isCallScreeningModeSupported", "()Z",
          (void *)android_media_AudioSystem_isCallScreeningModeSupported},
          (void *)android_media_AudioSystem_isCallScreeningModeSupported},
         {"setPreferredDeviceForStrategy", "(IILjava/lang/String;)I",
         {"setDevicesRoleForStrategy", "(II[I[Ljava/lang/String;)I",
          (void *)android_media_AudioSystem_setPreferredDeviceForStrategy},
          (void *)android_media_AudioSystem_setDevicesRoleForStrategy},
         {"removePreferredDeviceForStrategy", "(I)I",
         {"removeDevicesRoleForStrategy", "(II)I",
          (void *)android_media_AudioSystem_removePreferredDeviceForStrategy},
          (void *)android_media_AudioSystem_removeDevicesRoleForStrategy},
         {"getPreferredDeviceForStrategy", "(I[Landroid/media/AudioDeviceAttributes;)I",
         {"getDevicesForRoleAndStrategy", "(IILjava/util/List;)I",
          (void *)android_media_AudioSystem_getPreferredDeviceForStrategy},
          (void *)android_media_AudioSystem_getDevicesForRoleAndStrategy},
         {"getDevicesForAttributes",
         {"getDevicesForAttributes",
          "(Landroid/media/AudioAttributes;[Landroid/media/AudioDeviceAttributes;)I",
          "(Landroid/media/AudioAttributes;[Landroid/media/AudioDeviceAttributes;)I",
          (void *)android_media_AudioSystem_getDevicesForAttributes},
          (void *)android_media_AudioSystem_getDevicesForAttributes},
@@ -2755,6 +2759,9 @@ int register_android_media_AudioSystem(JNIEnv *env)
    gMidAudioRecordRoutingProxy_release =
    gMidAudioRecordRoutingProxy_release =
            android::GetMethodIDOrDie(env, gClsAudioRecordRoutingProxy, "native_release", "()V");
            android::GetMethodIDOrDie(env, gClsAudioRecordRoutingProxy, "native_release", "()V");


    jclass listClass = FindClassOrDie(env, "java/util/List");
    gListMethods.add = GetMethodIDOrDie(env, listClass, "add", "(Ljava/lang/Object;)Z");

    AudioSystem::addErrorCallback(android_media_AudioSystem_error_callback);
    AudioSystem::addErrorCallback(android_media_AudioSystem_error_callback);


    RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
    RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
Loading