AudioFormat: Make member variables final for immutable class

Test: CTS AudioFormatTest
Bug: 120626200
Change-Id: I56f9b569546622e4ababa306b0f5bb6cad2b1d4a
This commit is contained in:
Andy Hung
2018-12-05 18:59:31 -08:00
parent 37fc6eaaf4
commit 7d8aa3f36c

View File

@@ -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 =