alsa_sound: Add hdmi audio sink capability discovery

- Add hdmi sink capabilities parsing utility to support
  multi-channel output configuration.
- Update getParameters to calculate supported channels by
  hdmi sink.
- Update alsa_default to calculate channel count to set control
  option.

Bug: 7156174
Change-Id: Iabb9844c1e5a8b7aa7f168992f8beef79b7df8d2
Signed-off-by: Iliyan Malchev <malchev@google.com>
diff --git a/alsa_sound/AudioUtil.h b/alsa_sound/AudioUtil.h
new file mode 100644
index 0000000..6575315
--- /dev/null
+++ b/alsa_sound/AudioUtil.h
@@ -0,0 +1,71 @@
+/* AudioUtil.h
+ *
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ALSA_SOUND_AUDIO_UTIL_H
+#define ALSA_SOUND_AUDIO_UTIL_H
+
+#define BIT(nr)     (1UL << (nr))
+#define MAX_EDID_BLOCKS 10
+#define MAX_SHORT_AUDIO_DESC_CNT        30
+#define MIN_AUDIO_DESC_LENGTH           3
+#define MIN_SPKR_ALLOCATION_DATA_LENGTH 3
+
+typedef enum EDID_AUDIO_FORMAT_ID {
+    LPCM = 1,
+    AC3,
+    MPEG1,
+    MP3,
+    MPEG2_MULTI_CHANNEL,
+    AAC,
+    DTS,
+    ATRAC,
+    SACD,
+    DOLBY_DIGITAL_PLUS,
+    DTS_HD,
+    MAT,
+    DST,
+    WMA_PRO
+} EDID_AUDIO_FORMAT_ID;
+
+typedef struct EDID_AUDIO_BLOCK_INFO {
+    EDID_AUDIO_FORMAT_ID nFormatId;
+    int nSamplingFreq;
+    int nBitsPerSample;
+    int nChannels;
+} EDID_AUDIO_BLOCK_INFO;
+
+typedef struct EDID_AUDIO_INFO {
+    int nAudioBlocks;
+    unsigned char nSpeakerAllocation[MIN_SPKR_ALLOCATION_DATA_LENGTH];
+    EDID_AUDIO_BLOCK_INFO AudioBlocksArray[MAX_EDID_BLOCKS];
+} EDID_AUDIO_INFO;
+
+class AudioUtil {
+public:
+
+    //Parses EDID audio block when if HDMI is connected to determine audio sink capabilities.
+    static bool getHDMIAudioSinkCaps(EDID_AUDIO_INFO*);
+
+private:
+    static int printFormatFromEDID(unsigned char format);
+    static int getSamplingFrequencyFromEDID(unsigned char byte);
+    static int getBitsPerSampleFromEDID(unsigned char byte,
+        unsigned char format);
+    static bool getSpeakerAllocation(EDID_AUDIO_INFO* pInfo);
+};
+
+#endif /* ALSA_SOUND_AUDIO_UTIL_H */