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

Commit 9958c94e authored by Jean-Michel Trivi's avatar Jean-Michel Trivi Committed by Android (Google) Code Review
Browse files

Merge "Dynamic audio policies: multi-zone through uid/device affinity"

parents a7b3c1a7 d6f65dea
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -3001,6 +3001,7 @@ package android.media {
    field public static final int AUDIOFOCUS_FLAG_LOCK = 4; // 0x4
    field public static final int AUDIOFOCUS_FLAG_PAUSES_ON_DUCKABLE_LOSS = 2; // 0x2
    field public static final int FLAG_FROM_KEY = 65536; // 0x10000
    field public static final int SUCCESS = 0; // 0x0
  }

  public static abstract class AudioManager.AudioServerStateCallback {
@@ -3117,8 +3118,10 @@ package android.media.audiopolicy {
    method public int detachMixes(java.util.List<android.media.audiopolicy.AudioMix>);
    method public int getFocusDuckingBehavior();
    method public int getStatus();
    method public int removeUidDeviceAffinity(int);
    method public int setFocusDuckingBehavior(int) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException;
    method public void setRegistration(java.lang.String);
    method public int setUidDeviceAffinity(int, java.util.List<android.media.AudioDeviceInfo>);
    method public java.lang.String toLogFriendlyString();
    field public static final int FOCUS_POLICY_DUCKING_DEFAULT = 0; // 0x0
    field public static final int FOCUS_POLICY_DUCKING_IN_APP = 0; // 0x0
+51 −0
Original line number Diff line number Diff line
@@ -1906,6 +1906,53 @@ exit:
    return jStatus;
}

static jint android_media_AudioSystem_setUidDeviceAffinities(JNIEnv *env, jobject clazz,
        jint uid, jintArray deviceTypes, jobjectArray deviceAddresses) {
    if (deviceTypes == nullptr || deviceAddresses == nullptr) {
        return (jint) AUDIO_JAVA_BAD_VALUE;
    }
    jsize nb = env->GetArrayLength(deviceTypes);
    if (nb == 0 || nb != env->GetArrayLength(deviceAddresses)) {
        return (jint) AUDIO_JAVA_BAD_VALUE;
    }
    // retrieve all device types
    std::vector<audio_devices_t> deviceTypesVector;
    jint* typesPtr = nullptr;
    typesPtr = env->GetIntArrayElements(deviceTypes, 0);
    if (typesPtr == nullptr) {
        return (jint) AUDIO_JAVA_BAD_VALUE;
    }
    for (jint i = 0; i < nb; i++) {
        deviceTypesVector.push_back((audio_devices_t) typesPtr[i]);
    }
    env->ReleaseIntArrayElements(deviceTypes, typesPtr, 0);

    // check each address is a string and add device type/address to list for device affinity
    Vector<AudioDeviceTypeAddr> deviceVector;
    jclass stringClass = FindClassOrDie(env, "java/lang/String");
    for (jint i = 0; i < nb; i++) {
        jobject addrJobj = env->GetObjectArrayElement(deviceAddresses, i);
        if (!env->IsInstanceOf(addrJobj, stringClass)) {
            return (jint) AUDIO_JAVA_BAD_VALUE;
        }
        String8 address = String8(env->GetStringUTFChars((jstring) addrJobj, NULL));
        AudioDeviceTypeAddr dev = AudioDeviceTypeAddr(typesPtr[i], address);
        deviceVector.add(dev);
    }

    status_t status = AudioSystem::setUidDeviceAffinities((uid_t) uid, deviceVector);
    return (jint) nativeToJavaStatus(status);
}

static jint android_media_AudioSystem_removeUidDeviceAffinities(JNIEnv *env, jobject clazz,
        jint uid) {

    //###
    status_t status = NO_ERROR;//AudioSystem::removeUidDeviceAffinities();
    return (jint) nativeToJavaStatus(status);
}


static jint
android_media_AudioSystem_systemReady(JNIEnv *env, jobject thiz)
{
@@ -2133,6 +2180,10 @@ static const JNINativeMethod gMethods[] = {
                                    (void *)android_media_AudioSystem_getAudioHwSyncForSession},
    {"registerPolicyMixes",    "(Ljava/util/ArrayList;Z)I",
                                            (void *)android_media_AudioSystem_registerPolicyMixes},
    {"setUidDeviceAffinities", "(I[I[Ljava/lang/String;)I",
                                        (void *)android_media_AudioSystem_setUidDeviceAffinities},
    {"removeUidDeviceAffinities", "(I)I",
                                        (void *)android_media_AudioSystem_removeUidDeviceAffinities},
    {"native_register_dynamic_policy_callback", "()V",
                                    (void *)android_media_AudioSystem_registerDynPolicyCallback},
    {"native_register_recording_callback", "()V",
+2 −3
Original line number Diff line number Diff line
@@ -4280,9 +4280,8 @@ public class AudioManager {
     * Return codes for listAudioPorts(), createAudioPatch() ...
     */

    /** @hide
     * CANDIDATE FOR PUBLIC API
     */
    /** @hide */
    @SystemApi
    public static final int SUCCESS = AudioSystem.SUCCESS;
    /**
     * A default error code.
+7 −0
Original line number Diff line number Diff line
@@ -916,6 +916,13 @@ public class AudioSystem

    public static native int registerPolicyMixes(ArrayList<AudioMix> mixes, boolean register);

    /** see AudioPolicy.setUidDeviceAffinities() */
    public static native int setUidDeviceAffinities(int uid, @NonNull int[] types,
            @NonNull String[] addresses);

    /** see AudioPolicy.removeUidDeviceAffinities() */
    public static native int removeUidDeviceAffinities(int uid);

    public static native int systemReady();

    public static native float getStreamVolumeDB(int stream, int index, int device);
+5 −0
Original line number Diff line number Diff line
@@ -223,6 +223,11 @@ interface IAudioService {

    boolean isAudioServerRunning();

    int setUidDeviceAffinity(in IAudioPolicyCallback pcb, in int uid, in int[] deviceTypes,
             in String[] deviceAddresses);

    int removeUidDeviceAffinity(in IAudioPolicyCallback pcb, in int uid);

    // WARNING: read warning at top of file, new methods that need to be used by native
    // code via IAudioManager.h need to be added to the top section.
}
Loading