Fix 7.1 audio playback from AudioTrack

Uses AudioFormat.CHANNEL_OUT_7POINT1_SURROUND.

Bug: 16951383
Change-Id: I7e94598d5cae1a741b8b1e0492b202163bf9f9fd
diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java
index 8bc2498..52bcbbb 100644
--- a/media/java/android/media/AudioTrack.java
+++ b/media/java/android/media/AudioTrack.java
@@ -94,6 +94,9 @@
     /** Maximum value for sample rate */
     private static final int SAMPLE_RATE_HZ_MAX = 48000;
 
+    /** Maximum value for AudioTrack channel count */
+    private static final int CHANNEL_COUNT_MAX = 8;
+
     /** indicates AudioTrack state is stopped */
     public static final int PLAYSTATE_STOPPED = 1;  // matches SL_PLAYSTATE_STOPPED
     /** indicates AudioTrack state is paused */
@@ -465,7 +468,9 @@
             AudioFormat.CHANNEL_OUT_LOW_FREQUENCY |
             AudioFormat.CHANNEL_OUT_BACK_LEFT |
             AudioFormat.CHANNEL_OUT_BACK_RIGHT |
-            AudioFormat.CHANNEL_OUT_BACK_CENTER;
+            AudioFormat.CHANNEL_OUT_BACK_CENTER |
+            AudioFormat.CHANNEL_OUT_SIDE_LEFT |
+            AudioFormat.CHANNEL_OUT_SIDE_RIGHT;
 
     // Convenience method for the constructor's parameter checks.
     // This is where constructor IllegalArgumentException-s are thrown
@@ -541,6 +546,12 @@
             loge("Channel configuration features unsupported channels");
             return false;
         }
+        final int channelCount = Integer.bitCount(channelConfig);
+        if (channelCount > CHANNEL_COUNT_MAX) {
+            loge("Channel configuration contains too many channels " +
+                    channelCount + ">" + CHANNEL_COUNT_MAX);
+            return false;
+        }
         // check for unsupported multichannel combinations:
         // - FL/FR must be present
         // - L/R channels must be paired (e.g. no single L channel)
@@ -558,6 +569,13 @@
                 return false;
             }
         }
+        final int sidePair =
+                AudioFormat.CHANNEL_OUT_SIDE_LEFT | AudioFormat.CHANNEL_OUT_SIDE_RIGHT;
+        if ((channelConfig & sidePair) != 0
+                && (channelConfig & sidePair) != sidePair) {
+            loge("Side channels can't be used independently");
+            return false;
+        }
         return true;
     }