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

Commit c1b0ca6a authored by Andy Hung's avatar Andy Hung Committed by Automerger Merge Worker
Browse files

Merge changes from topics "360RA channel mask", "audio channels" am: b1060eb9 am: d6c0a357

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1669510

Change-Id: I2fbce01d6817edb9ea41284f38fe2fa09d5eea79
parents a655f680 d6c0a357
Loading
Loading
Loading
Loading
+44 −0
Original line number Diff line number Diff line
@@ -378,6 +378,18 @@ public final class AudioFormat implements Parcelable {
    public static final int CHANNEL_OUT_TOP_BACK_CENTER = 0x40000;
    /** @hide */
    public static final int CHANNEL_OUT_TOP_BACK_RIGHT =  0x80000;
    /** @hide */
    public static final int CHANNEL_OUT_TOP_SIDE_LEFT = 0x100000;
    /** @hide */
    public static final int CHANNEL_OUT_TOP_SIDE_RIGHT = 0x200000;
    /** @hide */
    public static final int CHANNEL_OUT_BOTTOM_FRONT_LEFT = 0x400000;
    /** @hide */
    public static final int CHANNEL_OUT_BOTTOM_FRONT_CENTER = 0x800000;
    /** @hide */
    public static final int CHANNEL_OUT_BOTTOM_FRONT_RIGHT = 0x1000000;
    /** @hide */
    public static final int CHANNEL_OUT_LOW_FREQUENCY_2 = 0x2000000;

    public static final int CHANNEL_OUT_MONO = CHANNEL_OUT_FRONT_LEFT;
    public static final int CHANNEL_OUT_STEREO = (CHANNEL_OUT_FRONT_LEFT | CHANNEL_OUT_FRONT_RIGHT);
@@ -407,6 +419,38 @@ public final class AudioFormat implements Parcelable {
            CHANNEL_OUT_SIDE_LEFT | CHANNEL_OUT_SIDE_RIGHT |
            CHANNEL_OUT_BACK_LEFT | CHANNEL_OUT_BACK_RIGHT |
            CHANNEL_OUT_LOW_FREQUENCY);
    /** @hide */
    public static final int CHANNEL_OUT_5POINT1POINT2 = (CHANNEL_OUT_5POINT1 |
            CHANNEL_OUT_TOP_SIDE_LEFT | CHANNEL_OUT_TOP_SIDE_RIGHT);
    /** @hide */
    public static final int CHANNEL_OUT_5POINT1POINT4 = (CHANNEL_OUT_5POINT1 |
            CHANNEL_OUT_TOP_FRONT_LEFT | CHANNEL_OUT_TOP_FRONT_RIGHT |
            CHANNEL_OUT_TOP_BACK_LEFT | CHANNEL_OUT_TOP_BACK_RIGHT);
    /** @hide */
    public static final int CHANNEL_OUT_7POINT1POINT2 = (CHANNEL_OUT_7POINT1_SURROUND |
            CHANNEL_OUT_TOP_SIDE_LEFT | CHANNEL_OUT_TOP_SIDE_RIGHT);
    /** @hide */
    public static final int CHANNEL_OUT_7POINT1POINT4 = (CHANNEL_OUT_7POINT1_SURROUND |
            CHANNEL_OUT_TOP_FRONT_LEFT | CHANNEL_OUT_TOP_FRONT_RIGHT |
            CHANNEL_OUT_TOP_BACK_LEFT | CHANNEL_OUT_TOP_BACK_RIGHT);
    /** @hide */
    public static final int CHANNEL_OUT_13POINT_360RA = (
            CHANNEL_OUT_FRONT_LEFT | CHANNEL_OUT_FRONT_CENTER | CHANNEL_OUT_FRONT_RIGHT |
            CHANNEL_OUT_SIDE_LEFT | CHANNEL_OUT_SIDE_RIGHT |
            CHANNEL_OUT_TOP_FRONT_LEFT | CHANNEL_OUT_TOP_FRONT_CENTER |
            CHANNEL_OUT_TOP_FRONT_RIGHT |
            CHANNEL_OUT_TOP_BACK_LEFT | CHANNEL_OUT_TOP_BACK_RIGHT |
            CHANNEL_OUT_BOTTOM_FRONT_LEFT | CHANNEL_OUT_BOTTOM_FRONT_CENTER |
            CHANNEL_OUT_BOTTOM_FRONT_RIGHT);
    /** @hide */
    public static final int CHANNEL_OUT_22POINT2 = (CHANNEL_OUT_7POINT1POINT4 |
            CHANNEL_OUT_FRONT_LEFT_OF_CENTER | CHANNEL_OUT_FRONT_RIGHT_OF_CENTER |
            CHANNEL_OUT_BACK_CENTER | CHANNEL_OUT_TOP_CENTER |
            CHANNEL_OUT_TOP_FRONT_CENTER | CHANNEL_OUT_TOP_BACK_CENTER |
            CHANNEL_OUT_TOP_SIDE_LEFT | CHANNEL_OUT_TOP_SIDE_RIGHT |
            CHANNEL_OUT_BOTTOM_FRONT_LEFT | CHANNEL_OUT_BOTTOM_FRONT_RIGHT |
            CHANNEL_OUT_BOTTOM_FRONT_CENTER |
            CHANNEL_OUT_LOW_FREQUENCY_2);
    // CHANNEL_OUT_ALL is not yet defined; if added then it should match AUDIO_CHANNEL_OUT_ALL

    /** Minimum value for sample rate,
+43 −13
Original line number Diff line number Diff line
@@ -44,6 +44,7 @@ import java.lang.ref.WeakReference;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.NioUtils;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.concurrent.Executor;

@@ -1585,9 +1586,24 @@ public class AudioTrack extends PlayerBase
            AudioFormat.CHANNEL_OUT_LOW_FREQUENCY |
            AudioFormat.CHANNEL_OUT_BACK_LEFT |
            AudioFormat.CHANNEL_OUT_BACK_RIGHT |
            AudioFormat.CHANNEL_OUT_FRONT_LEFT_OF_CENTER |
            AudioFormat.CHANNEL_OUT_FRONT_RIGHT_OF_CENTER |
            AudioFormat.CHANNEL_OUT_BACK_CENTER |
            AudioFormat.CHANNEL_OUT_SIDE_LEFT |
            AudioFormat.CHANNEL_OUT_SIDE_RIGHT;
            AudioFormat.CHANNEL_OUT_SIDE_RIGHT |
            AudioFormat.CHANNEL_OUT_TOP_CENTER |
            AudioFormat.CHANNEL_OUT_TOP_FRONT_LEFT |
            AudioFormat.CHANNEL_OUT_TOP_FRONT_CENTER |
            AudioFormat.CHANNEL_OUT_TOP_FRONT_RIGHT |
            AudioFormat.CHANNEL_OUT_TOP_BACK_LEFT |
            AudioFormat.CHANNEL_OUT_TOP_BACK_CENTER |
            AudioFormat.CHANNEL_OUT_TOP_BACK_RIGHT |
            AudioFormat.CHANNEL_OUT_TOP_SIDE_LEFT |
            AudioFormat.CHANNEL_OUT_TOP_SIDE_RIGHT |
            AudioFormat.CHANNEL_OUT_BOTTOM_FRONT_LEFT |
            AudioFormat.CHANNEL_OUT_BOTTOM_FRONT_CENTER |
            AudioFormat.CHANNEL_OUT_BOTTOM_FRONT_RIGHT |
            AudioFormat.CHANNEL_OUT_LOW_FREQUENCY_2;

    // Returns a boolean whether the attributes, format, bufferSizeInBytes, mode allow
    // power saving to be automatically enabled for an AudioTrack. Returns false if
@@ -1740,6 +1756,26 @@ public class AudioTrack extends PlayerBase
        mDataLoadMode = mode;
    }

    // General pair map
    private static final HashMap<String, Integer> CHANNEL_PAIR_MAP = new HashMap<>() {{
        put("front", AudioFormat.CHANNEL_OUT_FRONT_LEFT
                | AudioFormat.CHANNEL_OUT_FRONT_RIGHT);
        put("back", AudioFormat.CHANNEL_OUT_BACK_LEFT
                | AudioFormat.CHANNEL_OUT_BACK_RIGHT);
        put("front of center", AudioFormat.CHANNEL_OUT_FRONT_LEFT_OF_CENTER
                | AudioFormat.CHANNEL_OUT_FRONT_RIGHT_OF_CENTER);
        put("side", AudioFormat.CHANNEL_OUT_SIDE_LEFT
                | AudioFormat.CHANNEL_OUT_SIDE_RIGHT);
        put("top front", AudioFormat.CHANNEL_OUT_TOP_FRONT_LEFT
                | AudioFormat.CHANNEL_OUT_TOP_FRONT_RIGHT);
        put("top back", AudioFormat.CHANNEL_OUT_TOP_BACK_LEFT
                | AudioFormat.CHANNEL_OUT_TOP_BACK_RIGHT);
        put("top side", AudioFormat.CHANNEL_OUT_TOP_SIDE_LEFT
                | AudioFormat.CHANNEL_OUT_TOP_SIDE_RIGHT);
        put("bottom front", AudioFormat.CHANNEL_OUT_BOTTOM_FRONT_LEFT
                | AudioFormat.CHANNEL_OUT_BOTTOM_FRONT_RIGHT);
    }};

    /**
     * Convenience method to check that the channel configuration (a.k.a channel mask) is supported
     * @param channelConfig the mask to validate
@@ -1766,21 +1802,15 @@ public class AudioTrack extends PlayerBase
                loge("Front channels must be present in multichannel configurations");
                return false;
        }
        final int backPair =
                AudioFormat.CHANNEL_OUT_BACK_LEFT | AudioFormat.CHANNEL_OUT_BACK_RIGHT;
        if ((channelConfig & backPair) != 0) {
            if ((channelConfig & backPair) != backPair) {
                loge("Rear channels can't be used independently");
        // Check all pairs to see that they are matched (front duplicated here).
        for (HashMap.Entry<String, Integer> e : CHANNEL_PAIR_MAP.entrySet()) {
            final int positionPair = e.getValue();
            if ((channelConfig & positionPair) != 0
                    && (channelConfig & positionPair) != positionPair) {
                loge("Channel pair (" + e.getKey() + ") cannot be used independently");
                return false;
            }
        }
        final int sidePair =
                AudioFormat.CHANNEL_OUT_SIDE_LEFT | AudioFormat.CHANNEL_OUT_SIDE_RIGHT;
        if ((channelConfig & sidePair) != 0
                && (channelConfig & sidePair) != sidePair) {
            loge("Side channels can't be used independently");
            return false;
        }
        return true;
    }