diff options
| -rw-r--r-- | media/java/android/media/AudioFormat.java | 109 |
1 files changed, 58 insertions, 51 deletions
diff --git a/media/java/android/media/AudioFormat.java b/media/java/android/media/AudioFormat.java index 3e3e65188761..24d27256ca03 100644 --- a/media/java/android/media/AudioFormat.java +++ b/media/java/android/media/AudioFormat.java @@ -670,27 +670,43 @@ public final class AudioFormat implements Parcelable { } /** - * 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 @@ 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 = |