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

Commit 7d8aa3f3 authored by Andy Hung's avatar Andy Hung
Browse files

AudioFormat: Make member variables final for immutable class

Test: CTS AudioFormatTest
Bug: 120626200
Change-Id: I56f9b569546622e4ababa306b0f5bb6cad2b1d4a
parent 37fc6eaa
Loading
Loading
Loading
Loading
+58 −51
Original line number Diff line number Diff line
@@ -669,13 +669,6 @@ public final class AudioFormat implements Parcelable {
        throw new UnsupportedOperationException("There is no valid usage of this constructor");
    }

    /**
     * Private constructor with an ignored argument to differentiate from the removed default ctor
     * @param ignoredArgument
     */
    private AudioFormat(int ignoredArgument) {
    }

    /**
     * Constructor used by the JNI.  Parameters are not checked for validity.
     */
@@ -683,14 +676,37 @@ public final class AudioFormat implements Parcelable {
    // constructor
    @UnsupportedAppUsage
    private AudioFormat(int encoding, int sampleRate, int channelMask, int channelIndexMask) {
        mEncoding = encoding;
        mSampleRate = sampleRate;
        mChannelMask = channelMask;
        mChannelIndexMask = channelIndexMask;
        mPropertySetMask = AUDIO_FORMAT_HAS_PROPERTY_ENCODING |
                AUDIO_FORMAT_HAS_PROPERTY_SAMPLE_RATE |
                AUDIO_FORMAT_HAS_PROPERTY_CHANNEL_MASK |
                AUDIO_FORMAT_HAS_PROPERTY_CHANNEL_INDEX_MASK;
        this(
             AUDIO_FORMAT_HAS_PROPERTY_ENCODING
             | AUDIO_FORMAT_HAS_PROPERTY_SAMPLE_RATE
             | AUDIO_FORMAT_HAS_PROPERTY_CHANNEL_MASK
             | AUDIO_FORMAT_HAS_PROPERTY_CHANNEL_INDEX_MASK,
             encoding, sampleRate, channelMask, channelIndexMask
             );
    }

    private AudioFormat(int propertySetMask,
            int encoding, int sampleRate, int channelMask, int channelIndexMask) {
        mPropertySetMask = propertySetMask;
        mEncoding = (propertySetMask & AUDIO_FORMAT_HAS_PROPERTY_ENCODING) != 0
                ? encoding : ENCODING_INVALID;
        mSampleRate = (propertySetMask & AUDIO_FORMAT_HAS_PROPERTY_SAMPLE_RATE) != 0
                ? sampleRate : SAMPLE_RATE_UNSPECIFIED;
        mChannelMask = (propertySetMask & AUDIO_FORMAT_HAS_PROPERTY_CHANNEL_MASK) != 0
                ? channelMask : CHANNEL_INVALID;
        mChannelIndexMask = (propertySetMask & AUDIO_FORMAT_HAS_PROPERTY_CHANNEL_INDEX_MASK) != 0
                ? channelIndexMask : CHANNEL_INVALID;

        // Compute derived values.

        final int channelIndexCount = Integer.bitCount(getChannelIndexMask());
        int channelCount = channelCountFromOutChannelMask(getChannelMask());
        if (channelCount == 0) {
            channelCount = channelIndexCount;
        } else if (channelCount != channelIndexCount && channelIndexCount != 0) {
            channelCount = 0; // position and index channel count mismatch
        }
        mChannelCount = channelCount;
    }

    /** @hide */
@@ -704,14 +720,20 @@ public final class AudioFormat implements Parcelable {
    /** @hide */
    public final static int AUDIO_FORMAT_HAS_PROPERTY_CHANNEL_INDEX_MASK = 0x1 << 3;

    // This is an immutable class, all member variables are final.

    // Essential values.
    @UnsupportedAppUsage
    private int mEncoding;
    private final int mEncoding;
    @UnsupportedAppUsage
    private int mSampleRate;
    private final int mSampleRate;
    @UnsupportedAppUsage
    private int mChannelMask;
    private int mChannelIndexMask;
    private int mPropertySetMask;
    private final int mChannelMask;
    private final int mChannelIndexMask;
    private final int mPropertySetMask;

    // Derived values computed in the constructor, cached here.
    private final int mChannelCount;

    /**
     * Return the encoding.
@@ -721,9 +743,6 @@ public final class AudioFormat implements Parcelable {
     * {@link AudioFormat#ENCODING_INVALID} if not set.
     */
    public int getEncoding() {
        if ((mPropertySetMask & AUDIO_FORMAT_HAS_PROPERTY_ENCODING) == 0) {
            return ENCODING_INVALID;
        }
        return mEncoding;
    }

@@ -745,9 +764,6 @@ public final class AudioFormat implements Parcelable {
     * {@link AudioFormat#CHANNEL_INVALID} if not set.
     */
    public int getChannelMask() {
        if ((mPropertySetMask & AUDIO_FORMAT_HAS_PROPERTY_CHANNEL_MASK) == 0) {
            return CHANNEL_INVALID;
        }
        return mChannelMask;
    }

@@ -760,9 +776,6 @@ public final class AudioFormat implements Parcelable {
     * {@link AudioFormat#CHANNEL_INVALID} if not set or an invalid mask was used.
     */
    public int getChannelIndexMask() {
        if ((mPropertySetMask & AUDIO_FORMAT_HAS_PROPERTY_CHANNEL_INDEX_MASK) == 0) {
            return CHANNEL_INVALID;
        }
        return mChannelIndexMask;
    }

@@ -772,14 +785,7 @@ public final class AudioFormat implements Parcelable {
     * Zero is returned if both the channel position mask and the channel index mask are not set.
     */
    public int getChannelCount() {
        final int channelIndexCount = Integer.bitCount(getChannelIndexMask());
        int channelCount = channelCountFromOutChannelMask(getChannelMask());
        if (channelCount == 0) {
            channelCount = channelIndexCount;
        } else if (channelCount != channelIndexCount && channelIndexCount != 0) {
            channelCount = 0; // position and index channel count mismatch
        }
        return channelCount;
        return mChannelCount;
    }

    /** @hide */
@@ -790,7 +796,7 @@ public final class AudioFormat implements Parcelable {
    /** @hide */
    public String toLogFriendlyString() {
        return String.format("%dch %dHz %s",
                getChannelCount(), mSampleRate, toLogFriendlyEncoding(mEncoding));
                mChannelCount, mSampleRate, toLogFriendlyEncoding(mEncoding));
    }

    /**
@@ -839,14 +845,13 @@ public final class AudioFormat implements Parcelable {
         * @return a new {@link AudioFormat} object
         */
        public AudioFormat build() {
            AudioFormat af = new AudioFormat(1980/*ignored*/);
            af.mEncoding = mEncoding;
            // not calling setSampleRate is equivalent to calling
            // setSampleRate(SAMPLE_RATE_UNSPECIFIED)
            af.mSampleRate = mSampleRate;
            af.mChannelMask = mChannelMask;
            af.mChannelIndexMask = mChannelIndexMask;
            af.mPropertySetMask = mPropertySetMask;
            AudioFormat af = new AudioFormat(
                    mPropertySetMask,
                    mEncoding,
                    mSampleRate,
                    mChannelMask,
                    mChannelIndexMask
                    );
            return af;
        }

@@ -1049,11 +1054,13 @@ public final class AudioFormat implements Parcelable {
    }

    private AudioFormat(Parcel in) {
        mPropertySetMask = in.readInt();
        mEncoding = in.readInt();
        mSampleRate = in.readInt();
        mChannelMask = in.readInt();
        mChannelIndexMask = in.readInt();
        this(
             in.readInt(), // propertySetMask
             in.readInt(), // encoding
             in.readInt(), // sampleRate
             in.readInt(), // channelMask
             in.readInt()  // channelIndexMask
            );
    }

    public static final Parcelable.Creator<AudioFormat> CREATOR =