diff options
| author | Jean-Michel Trivi <jmtrivi@google.com> | 2012-05-12 10:08:22 -0700 |
|---|---|---|
| committer | Jean-Michel Trivi <jmtrivi@google.com> | 2012-05-14 08:49:42 -0700 |
| commit | d9e587137b926a56e6e339f11da6a91624df515a (patch) | |
| tree | f047d0cb92ef71118cc5b2dd5d0c9b3d87d87677 | |
| parent | 2d97a70ff8bbac5ea807003d65b64e3b255e82bc (diff) | |
| download | frameworks_base-d9e587137b926a56e6e339f11da6a91624df515a.zip frameworks_base-d9e587137b926a56e6e339f11da6a91624df515a.tar.gz frameworks_base-d9e587137b926a56e6e339f11da6a91624df515a.tar.bz2 | |
Verify AudioTrack only uses a valid multichannel configuration
Enforce the same rules as for HDMI output:
- FL/FR must be present
- paired channels must be used in pairs (e.g. no rear left
without rear right)
Bug 6392126
Change-Id: I0a39e474dcf509cb7eabd8edd1f0e44852d72b51
| -rw-r--r-- | media/java/android/media/AudioTrack.java | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java index f51a24a..96f01db 100644 --- a/media/java/android/media/AudioTrack.java +++ b/media/java/android/media/AudioTrack.java @@ -401,7 +401,7 @@ public class AudioTrack mChannels = AudioFormat.CHANNEL_OUT_STEREO; break; default: - if ((channelConfig & SUPPORTED_OUT_CHANNELS) != channelConfig) { + if (!isMultichannelConfigSupported(channelConfig)) { // input channel configuration features unsupported channels mChannelCount = 0; mChannels = AudioFormat.CHANNEL_INVALID; @@ -438,6 +438,37 @@ public class AudioTrack } } + /** + * Convenience method to check that the channel configuration (a.k.a channel mask) is supported + * @param channelConfig the mask to validate + * @return false if the AudioTrack can't be used with such a mask + */ + private static boolean isMultichannelConfigSupported(int channelConfig) { + // check for unsupported channels + if ((channelConfig & SUPPORTED_OUT_CHANNELS) != channelConfig) { + Log.e(TAG, "Channel configuration features unsupported channels"); + return false; + } + // check for unsupported multichannel combinations: + // - FL/FR must be present + // - L/R channels must be paired (e.g. no single L channel) + final int frontPair = + AudioFormat.CHANNEL_OUT_FRONT_LEFT | AudioFormat.CHANNEL_OUT_FRONT_RIGHT; + if ((channelConfig & frontPair) != frontPair) { + Log.e(TAG, "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) { + Log.e(TAG, "Rear channels can't be used independently"); + return false; + } + } + return true; + } + // Convenience method for the contructor's audio buffer size check. // preconditions: |
