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

Commit d2a8a229 authored by Vlad Popa's avatar Vlad Popa Committed by Android (Google) Code Review
Browse files

Merge "AS: send the mute event to APM" into main

parents 34daf84e 5dce646c
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -7319,6 +7319,7 @@ package android.media {
    field @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static final int MUTED_BY_APP_OPS = 8; // 0x8
    field @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static final int MUTED_BY_CLIENT_VOLUME = 16; // 0x10
    field @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static final int MUTED_BY_MASTER = 1; // 0x1
    field @FlaggedApi("android.media.audio.muted_by_port_volume_api") @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static final int MUTED_BY_PORT_VOLUME = 64; // 0x40
    field @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static final int MUTED_BY_STREAM_MUTED = 4; // 0x4
    field @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static final int MUTED_BY_STREAM_VOLUME = 2; // 0x2
    field @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static final int MUTED_BY_VOLUME_SHAPER = 32; // 0x20
+181 −192
Original line number Diff line number Diff line
@@ -747,16 +747,12 @@ android_media_AudioSystem_initStreamVolume(JNIEnv *env, jobject thiz, jint strea
                                          indexMax));
}

static jint
android_media_AudioSystem_setStreamVolumeIndex(JNIEnv *env,
                                               jobject thiz,
                                               jint stream,
                                               jint index,
                                               jint device)
{
static jint android_media_AudioSystem_setStreamVolumeIndex(JNIEnv *env, jobject thiz, jint stream,
                                                           jint index, jboolean muted,
                                                           jint device) {
    return check_AudioSystem_Command(
            AudioSystem::setStreamVolumeIndex(static_cast<audio_stream_type_t>(stream), index,
                                              static_cast<audio_devices_t>(device)));
                                              muted, static_cast<audio_devices_t>(device)));
}

static jint
@@ -773,13 +769,9 @@ android_media_AudioSystem_getStreamVolumeIndex(JNIEnv *env,
    return index;
}

static jint
android_media_AudioSystem_setVolumeIndexForAttributes(JNIEnv *env,
                                                      jobject thiz,
                                                      jobject jaa,
                                                      jint index,
                                                      jint device)
{
static jint android_media_AudioSystem_setVolumeIndexForAttributes(JNIEnv *env, jobject thiz,
                                                                  jobject jaa, jint index,
                                                                  jboolean muted, jint device) {
    // read the AudioAttributes values
    JNIAudioAttributeHelper::UniqueAaPtr paa = JNIAudioAttributeHelper::makeUnique();
    jint jStatus = JNIAudioAttributeHelper::nativeFromJava(env, jaa, paa.get());
@@ -787,7 +779,7 @@ android_media_AudioSystem_setVolumeIndexForAttributes(JNIEnv *env,
        return jStatus;
    }
    return check_AudioSystem_Command(
            AudioSystem::setVolumeIndexForAttributes(*(paa.get()), index,
            AudioSystem::setVolumeIndexForAttributes(*(paa.get()), index, muted,
                                                     static_cast<audio_devices_t>(device)));
}

@@ -3448,8 +3440,8 @@ static void android_media_AudioSystem_triggerSystemPropertyUpdate(JNIEnv *env,
#define MAKE_AUDIO_SYSTEM_METHOD(x) \
    MAKE_JNI_NATIVE_METHOD_AUTOSIG(#x, android_media_AudioSystem_##x)

static const JNINativeMethod gMethods[] =
        {MAKE_AUDIO_SYSTEM_METHOD(setParameters),
static const JNINativeMethod gMethods[] = {
        MAKE_AUDIO_SYSTEM_METHOD(setParameters),
        MAKE_AUDIO_SYSTEM_METHOD(getParameters),
        MAKE_AUDIO_SYSTEM_METHOD(muteMicrophone),
        MAKE_AUDIO_SYSTEM_METHOD(isMicrophoneMuted),
@@ -3471,10 +3463,9 @@ static const JNINativeMethod gMethods[] =
        MAKE_AUDIO_SYSTEM_METHOD(setStreamVolumeIndex),
        MAKE_AUDIO_SYSTEM_METHOD(getStreamVolumeIndex),
        MAKE_JNI_NATIVE_METHOD("setVolumeIndexForAttributes",
                                "(Landroid/media/AudioAttributes;II)I",
                               "(Landroid/media/AudioAttributes;IZI)I",
                               android_media_AudioSystem_setVolumeIndexForAttributes),
         MAKE_JNI_NATIVE_METHOD("getVolumeIndexForAttributes",
                                "(Landroid/media/AudioAttributes;I)I",
        MAKE_JNI_NATIVE_METHOD("getVolumeIndexForAttributes", "(Landroid/media/AudioAttributes;I)I",
                               android_media_AudioSystem_getVolumeIndexForAttributes),
        MAKE_JNI_NATIVE_METHOD("getMinVolumeIndexForAttributes",
                               "(Landroid/media/AudioAttributes;)I",
@@ -3619,10 +3610,8 @@ static const JNINativeMethod gMethods[] =
        MAKE_JNI_NATIVE_METHOD("listenForSystemPropertyChange",
                               "(Ljava/lang/String;Ljava/lang/Runnable;)J",
                               android_media_AudioSystem_listenForSystemPropertyChange),
         MAKE_JNI_NATIVE_METHOD("triggerSystemPropertyUpdate",
                                "(J)V",
        MAKE_JNI_NATIVE_METHOD("triggerSystemPropertyUpdate", "(J)V",
                               android_media_AudioSystem_triggerSystemPropertyUpdate),

};

static const JNINativeMethod gEventHandlerMethods[] =
+18 −1
Original line number Diff line number Diff line
@@ -18,7 +18,9 @@ package android.media;

import static android.media.AudioAttributes.ALLOW_CAPTURE_BY_ALL;
import static android.media.AudioAttributes.ALLOW_CAPTURE_BY_NONE;
import static android.media.audio.Flags.FLAG_MUTED_BY_PORT_VOLUME_API;

import android.annotation.FlaggedApi;
import android.annotation.IntDef;
import android.annotation.IntRange;
import android.annotation.NonNull;
@@ -291,12 +293,24 @@ public final class AudioPlaybackConfiguration implements Parcelable {
    @SystemApi
    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
    public static final int MUTED_BY_VOLUME_SHAPER = (1 << 5);
    /**
     * @hide
     * Flag used when muted by the track's port volume.
     *
     * <p>Note: this will replace the stream volume mute when using the AudioFlinger port volume
     * APIs
     */
    @SystemApi
    @FlaggedApi(FLAG_MUTED_BY_PORT_VOLUME_API)
    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
    public static final int MUTED_BY_PORT_VOLUME = (1 << 6);

    /** @hide */
    @IntDef(
            flag = true,
            value = {MUTED_BY_MASTER, MUTED_BY_STREAM_VOLUME, MUTED_BY_STREAM_MUTED,
                    MUTED_BY_APP_OPS, MUTED_BY_CLIENT_VOLUME, MUTED_BY_VOLUME_SHAPER})
                    MUTED_BY_APP_OPS, MUTED_BY_CLIENT_VOLUME, MUTED_BY_VOLUME_SHAPER,
                    MUTED_BY_PORT_VOLUME})
    @Retention(RetentionPolicy.SOURCE)
    public @interface PlayerMuteEvent {
    }
@@ -858,6 +872,9 @@ public final class AudioPlaybackConfiguration implements Parcelable {
                if ((mMutedState & MUTED_BY_VOLUME_SHAPER) != 0) {
                    apcToString.append("volumeShaper ");
                }
                if ((mMutedState & MUTED_BY_PORT_VOLUME) != 0) {
                    apcToString.append("portVolume ");
                }
            }
            apcToString.append(" ").append(mFormatInfo);
        }
+6 −5
Original line number Diff line number Diff line
@@ -1698,12 +1698,12 @@ public class AudioSystem
    }

    /** @hide Wrapper for native methods called from AudioService */
    public static int setStreamVolumeIndexAS(int stream, int index, int device) {
    public static int setStreamVolumeIndexAS(int stream, int index, boolean muted, int device) {
        if (DEBUG_VOLUME) {
            Log.i(TAG, "setStreamVolumeIndex: " + STREAM_NAMES[stream]
                    + " dev=" + Integer.toHexString(device) + " idx=" + index);
                    + " dev=" + Integer.toHexString(device) + " idx=" + index + " muted=" + muted);
        }
        return setStreamVolumeIndex(stream, index, device);
        return setStreamVolumeIndex(stream, index, muted, device);
    }

    // usage for AudioRecord.startRecordingSync(), must match AudioSystem::sync_event_t
@@ -1774,7 +1774,8 @@ public class AudioSystem
    @UnsupportedAppUsage
    public static native int initStreamVolume(int stream, int indexMin, int indexMax);
    @UnsupportedAppUsage
    private static native int setStreamVolumeIndex(int stream, int index, int device);
    private static native int setStreamVolumeIndex(int stream, int index, boolean muted,
            int device);
    /** @hide */
    public static native int getStreamVolumeIndex(int stream, int device);
    /**
@@ -1787,7 +1788,7 @@ public class AudioSystem
     * @return command completion status.
     */
    public static native int setVolumeIndexForAttributes(@NonNull AudioAttributes attributes,
                                                         int index, int device);
                                                         int index, boolean muted, int device);
   /**
    * @hide
    * get the volume index for the given {@link AudioAttributes}.
+29 −11
Original line number Diff line number Diff line
@@ -69,6 +69,7 @@ import static com.android.media.audio.Flags.disablePrescaleAbsoluteVolume;
import static com.android.media.audio.Flags.equalScoLeaVcIndexRange;
import static com.android.media.audio.Flags.replaceStreamBtSco;
import static com.android.media.audio.Flags.ringerModeAffectsAlarm;
import static com.android.media.audio.Flags.ringMyCar;
import static com.android.media.audio.Flags.setStreamVolumeOrder;
import static com.android.media.audio.Flags.vgsVssSyncMuteOrder;
import static com.android.server.audio.SoundDoseHelper.ACTION_CHECK_MUSIC_ACTIVE;
@@ -761,7 +762,7 @@ public class AudioService extends IAudioService.Stub
    /** Streams that can be muted by system. Do not resolve to aliases when checking.
     * @see System#MUTE_STREAMS_AFFECTED */
    private int mMuteAffectedStreams;
    protected int mMuteAffectedStreams;
    /** Streams that can be muted by user. Do not resolve to aliases when checking.
     * @see System#MUTE_STREAMS_AFFECTED */
@@ -1465,7 +1466,8 @@ public class AudioService extends IAudioService.Stub
        mPlaybackMonitor =
                new PlaybackActivityMonitor(context, MAX_STREAM_VOLUME[AudioSystem.STREAM_ALARM],
                        device -> onMuteAwaitConnectionTimeout(device));
                        device -> onMuteAwaitConnectionTimeout(device),
                        stream -> isStreamMute(stream));
        mPlaybackMonitor.registerPlaybackCallback(mPlaybackActivityMonitor, true);
        mMediaFocusControl = new MediaFocusControl(mContext, mPlaybackMonitor);
@@ -4846,6 +4848,8 @@ public class AudioService extends IAudioService.Stub
                + replaceStreamBtSco());
        pw.println("\tcom.android.media.audio.equalScoLeaVcIndexRange:"
                + equalScoLeaVcIndexRange());
        pw.println("\tcom.android.media.audio.ringMyCar:"
                + ringMyCar());
    }
    private void dumpAudioMode(PrintWriter pw) {
@@ -8695,9 +8699,14 @@ public class AudioService extends IAudioService.Stub
            // Only set audio policy BT SCO stream volume to 0 when the stream is actually muted.
            // This allows RX path muting by the audio HAL only when explicitly muted but not when
            // index is just set to 0 to repect BT requirements
            boolean muted = false;
            if (mHasValidStreamType && isVssMuteBijective(mPublicStreamType)
                    && getVssForStreamOrDefault(mPublicStreamType).isFullyMuted()) {
                if (ringMyCar()) {
                    muted = true;
                } else {
                    index = 0;
                }
            } else if (isStreamBluetoothSco(mPublicStreamType) && index == 0) {
                index = 1;
            }
@@ -8707,13 +8716,14 @@ public class AudioService extends IAudioService.Stub
                        / getVssForStreamOrDefault(mPublicStreamType).getIndexStepFactor());
            }
            if (DEBUG_VOL) {
                Log.d(TAG, "setVolumeIndexInt(" + mAudioVolumeGroup.getId() + ", " + index + ", "
                        + device + ")");
                        + muted + ", " + device + ")");
            }
            // Set the volume index
            mAudioSystem.setVolumeIndexForAttributes(mAudioAttributes, index, device);
            mAudioSystem.setVolumeIndexForAttributes(mAudioAttributes, index, muted, device);
        }
        @GuardedBy("AudioService.VolumeStreamState.class")
@@ -9297,6 +9307,13 @@ public class AudioService extends IAudioService.Stub
            }
        }
        /**
         * Sends the new volume index on the given device to native.
         *
         * <p>Make sure the index is consistent with the muting state. When ringMyCar is enabled
         * will send the non-zero index together with muted state. Otherwise, index 0  will be sent
         * to native for signalising a muted stream.
         **/
        @GuardedBy("VolumeStreamState.class")
        private void setStreamVolumeIndex(int index, int device) {
            // Only set audio policy BT SCO stream volume to 0 when the stream is actually muted.
@@ -9311,18 +9328,19 @@ public class AudioService extends IAudioService.Stub
                        / 10;
            }
            boolean muted = ringMyCar() ? isFullyMuted() : false;
            if (DEBUG_VOL) {
                Log.d(TAG, "setStreamVolumeIndexAS(" + mStreamType + ", " + index + ", " + device
                        + ")");
                Log.d(TAG, "setStreamVolumeIndexAS(streamType=" + mStreamType + ", index=" + index
                        + ", muted=" + muted + ", device=" + device + ")");
            }
            mAudioSystem.setStreamVolumeIndexAS(mStreamType, index, device);
            mAudioSystem.setStreamVolumeIndexAS(mStreamType, index, muted, device);
        }
        // must be called while synchronized VolumeStreamState.class
        @GuardedBy("VolumeStreamState.class")
        /*package*/ void applyDeviceVolume_syncVSS(int device) {
            int index;
            if (isFullyMuted()) {
            if (isFullyMuted() && !ringMyCar()) {
                index = 0;
            } else if (isAbsoluteVolumeDevice(device)
                    || isA2dpAbsoluteVolumeDevice(device)
@@ -9356,7 +9374,7 @@ public class AudioService extends IAudioService.Stub
                for (int i = 0; i < mIndexMap.size(); i++) {
                    final int device = mIndexMap.keyAt(i);
                    if (device != AudioSystem.DEVICE_OUT_DEFAULT) {
                        if (isFullyMuted()) {
                        if (isFullyMuted() && !ringMyCar()) {
                            index = 0;
                        } else if (isAbsoluteVolumeDevice(device)
                                || isA2dpAbsoluteVolumeDevice(device)
@@ -9391,7 +9409,7 @@ public class AudioService extends IAudioService.Stub
                }
                // apply default volume last: by convention , default device volume will be used
                // by audio policy manager if no explicit volume is present for a given device type
                if (isFullyMuted()) {
                if (isFullyMuted() && !ringMyCar()) {
                    index = 0;
                } else {
                    index = (getIndex(AudioSystem.DEVICE_OUT_DEFAULT) + 5)/10;
Loading