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

Commit f4f3bfe7 authored by François Gaffie's avatar François Gaffie Committed by Hongwei Wang
Browse files

Add API to retrieve Audio Product Strategy from a given Audio Attributes



In order to ensure only one matching algorithm is implemented in the
audio policy engine, we cannot use the list of audio product strategy
to let the client of this API inferring the product strategy to use.
It shall request the audio policy manager which product strategy shall be
followed by a given Audio Attributes.

Bug: 124767636
Test: dumpsys media.audio_policy
Change-Id: I372a47df4a35efd68a3ea327581af54823997dba
Signed-off-by: default avatarFrançois Gaffie <francois.gaffie@renault.com>
parent 0699fecd
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -3648,6 +3648,7 @@ package android.media.audiopolicy {
    method @NonNull public android.media.AudioAttributes getAudioAttributesForProductStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy);
    method @Nullable public android.media.audiopolicy.AudioProductStrategy getById(int);
    method public int getLegacyStreamTypeForAudioAttributes(@NonNull android.media.AudioAttributes);
    method @Nullable public android.media.audiopolicy.AudioProductStrategy getProductStrategyForAudioAttributes(@NonNull android.media.AudioAttributes);
    method public java.util.Iterator<android.media.audiopolicy.AudioProductStrategy> iterator();
    method public int size();
    method public void writeToParcel(@NonNull android.os.Parcel, int);
+22 −0
Original line number Diff line number Diff line
@@ -194,12 +194,34 @@ exit:
    return jStatus;
}

static jint
android_media_AudioSystem_getProductStrategyFromAudioAttributes(JNIEnv *env, jobject clazz,
                                                                jobject jAudioAttributes)
{
    JNIAudioAttributeHelper::UniqueAaPtr attributes = JNIAudioAttributeHelper::makeUnique();
    jint jStatus = JNIAudioAttributeHelper::nativeFromJava(env,
                                                           jAudioAttributes,
                                                           attributes.get());
    if (jStatus != (jint)AUDIO_JAVA_SUCCESS) {
        return jStatus;
    }
    product_strategy_t psId;
    status_t status = AudioSystem::getProductStrategyFromAudioAttributes(
            AudioAttributes(*attributes.get()), psId);
    if (status != NO_ERROR) {
        return nativeToJavaStatus(status);
    }
    return psId;
}

/*
 * JNI registration.
 */
static const JNINativeMethod gMethods[] = {
    {"native_list_audio_product_strategies", "(Ljava/util/ArrayList;)I",
                        (void *)android_media_AudioSystem_listAudioProductStrategies},
    {"native_get_product_strategies_from_audio_attributes", "(Landroid/media/AudioAttributes;)I",
                        (void *)android_media_AudioSystem_getProductStrategyFromAudioAttributes},
};

int register_android_media_AudioProductStrategies(JNIEnv *env)
+20 −2
Original line number Diff line number Diff line
@@ -144,8 +144,10 @@ public final class AudioProductStrategies implements Iterable<AudioProductStrate
     * @hide
     * @param aa the {@link AudioAttributes} for which stream type is requested
     * @return the legacy stream type relevant for the given {@link AudioAttributes}.
     *         If the product strategy is not associated to any stream, it returns STREAM_MUSIC.
     *         If no product strategy supports the stream type, it returns STREAM_MUSIC.
     *         If the product strategy is not associated to any stream, it returns
     *         {@link AudioSystem#STREAM_MUSIC}.
     *         If no product strategy supports the stream type, it returns
     *         {@link AudioSystem#STREAM_MUSIC}.
     */
    @SystemApi
    public int getLegacyStreamTypeForAudioAttributes(@NonNull AudioAttributes aa) {
@@ -165,6 +167,19 @@ public final class AudioProductStrategies implements Iterable<AudioProductStrate
        return AudioSystem.STREAM_MUSIC;
    }

    /**
     * @hide
     * @param aa the {@link AudioAttributes} to be considered
     * @return {@link AudioProductStrategy} supporting the given {@link AudioAttributes}.
     *         null is returned if no match with given attributes.
     */
    @SystemApi
    @Nullable
    public AudioProductStrategy getProductStrategyForAudioAttributes(@NonNull AudioAttributes aa) {
        Preconditions.checkNotNull(aa, "attributes must not be null");
        return getById(native_get_product_strategies_from_audio_attributes(aa));
    }

    @Override
    public int describeContents() {
        return 0;
@@ -198,4 +213,7 @@ public final class AudioProductStrategies implements Iterable<AudioProductStrate

    private static native int native_list_audio_product_strategies(
            ArrayList<AudioProductStrategy> strategies);

    private static native int native_get_product_strategies_from_audio_attributes(
            AudioAttributes attributes);
}