Merge "AudioFormat: Make member variables final for immutable class"
diff --git a/media/java/android/media/AudioFormat.java b/media/java/android/media/AudioFormat.java
index 3e3e651..24d2725 100644
--- a/media/java/android/media/AudioFormat.java
+++ b/media/java/android/media/AudioFormat.java
@@ -670,27 +670,43 @@
}
/**
- * 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.
*/
// Update sound trigger JNI in core/jni/android_hardware_SoundTrigger.cpp when modifying this
// 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 @@
/** @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 @@
* {@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 @@
* {@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 @@
* {@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 @@
* 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 @@
/** @hide */
public String toLogFriendlyString() {
return String.format("%dch %dHz %s",
- getChannelCount(), mSampleRate, toLogFriendlyEncoding(mEncoding));
+ mChannelCount, mSampleRate, toLogFriendlyEncoding(mEncoding));
}
/**
@@ -839,14 +845,13 @@
* @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 @@
}
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 =