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

Commit fd25fe12 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge changes from topic "rnm-audio-product-strategies"

* changes:
  Add API to retrieve Audio Product Strategy from a given Audio Attributes
  AudioManager: add Audio Product Strategies introspection SystemAPI
parents 803db6cf f4f3bfe7
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -3455,6 +3455,7 @@ package android.media {
    method @Deprecated public int abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, android.media.AudioAttributes);
    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 @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public android.media.audiopolicy.AudioProductStrategies getAudioProductStrategies();
    method public boolean isAudioServerRunning();
    method public boolean isHdmiSystemAudioSupported();
    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int registerAudioPolicy(@NonNull android.media.audiopolicy.AudioPolicy);
@@ -3647,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)
+25 −0
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ import android.content.Context;
import android.content.Intent;
import android.media.audiopolicy.AudioPolicy;
import android.media.audiopolicy.AudioPolicy.AudioPolicyFocusListener;
import android.media.audiopolicy.AudioProductStrategies;
import android.media.projection.MediaProjection;
import android.media.session.MediaController;
import android.media.session.MediaSession;
@@ -5221,6 +5222,30 @@ public class AudioManager {
        return AudioSystem.isHapticPlaybackSupported();
    }

    /**
     * @hide
     * Introspection API to retrieve audio product strategies.
     * When implementing {Car|Oem}AudioManager, use this method  to retrieve the collection of
     * audio product strategies, which is indexed by a weakly typed index in order to be extended
     * by OEM without any needs of AOSP patches.
     * The {Car|Oem}AudioManager can expose API to build {@link AudioAttributes} for a given product
     * strategy refered either by its index or human readable string. It will allow clients
     * application to start streaming data using these {@link AudioAttributes} on the selected
     * device by Audio Policy Engine.
     * @return a (possibly zero-length) array of
     *         {@see android.media.audiopolicy.AudioProductStrategy} objects.
     */
    @SystemApi
    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
    public @NonNull AudioProductStrategies getAudioProductStrategies() {
        final IAudioService service = getService();
        try {
            return service.getAudioProductStrategies();
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }


    //---------------------------------------------------------
    // Inner classes
+3 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import android.media.IVolumeController;
import android.media.PlayerBase;
import android.media.VolumePolicy;
import android.media.audiopolicy.AudioPolicyConfig;
import android.media.audiopolicy.AudioProductStrategies;
import android.media.audiopolicy.IAudioPolicyCallback;
import android.media.projection.IMediaProjection;

@@ -82,6 +83,8 @@ interface IAudioService {

    int getLastAudibleStreamVolume(int streamType);

    AudioProductStrategies getAudioProductStrategies();

    void setMicrophoneMute(boolean on, String callingPackage, int userId);

    void setRingerModeExternal(int ringerMode, String caller);
+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);
}
Loading