diff --git a/media/java/android/media/audiopolicy/AudioMix.java b/media/java/android/media/audiopolicy/AudioMix.java index d00e5b55fd14e..fbd2d8d031fdf 100644 --- a/media/java/android/media/audiopolicy/AudioMix.java +++ b/media/java/android/media/audiopolicy/AudioMix.java @@ -420,6 +420,20 @@ public class AudioMix { rate = 44100; } mFormat = new AudioFormat.Builder().setSampleRate(rate).build(); + } else { + // Ensure that 'mFormat' uses an output channel mask. Using an input channel + // mask was not made 'illegal' initially, however the framework code + // assumes usage in AudioMixes of output channel masks only (b/194910301). + if ((mFormat.getPropertySetMask() + & AudioFormat.AUDIO_FORMAT_HAS_PROPERTY_CHANNEL_MASK) != 0) { + if (mFormat.getChannelCount() == 1 + && mFormat.getChannelMask() == AudioFormat.CHANNEL_IN_MONO) { + mFormat = new AudioFormat.Builder(mFormat).setChannelMask( + AudioFormat.CHANNEL_OUT_MONO).build(); + } + // CHANNEL_IN_STEREO == CHANNEL_OUT_STEREO so no need to correct. + // CHANNEL_IN_FRONT_BACK is hidden, should not appear. + } } if ((mDeviceSystemType != AudioSystem.DEVICE_NONE) && (mDeviceSystemType != AudioSystem.DEVICE_OUT_REMOTE_SUBMIX)