hal: qahw: Add support for Input channel map config
Add new set param api to configure input channel map to DSP
Change-Id: I47f8c165040be59c4da70b13b0cbc66c8802f71b
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index c2b5af0..a2ca01f 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -5752,94 +5752,101 @@
*device_to_be_id = (int*) msm_device_to_be_id;
*length = msm_be_id_array_len;
}
-int platform_set_stream_channel_map(void *platform, audio_channel_mask_t channel_mask, int snd_id)
+
+int platform_set_stream_channel_map(void *platform, audio_channel_mask_t channel_mask,
+ int snd_id, uint8_t *input_channel_map)
{
- int ret = 0;
+ int ret = 0, i = 0;
int channels = audio_channel_count_from_out_mask(channel_mask);
- char channel_map[8];
+ char channel_map[AUDIO_CHANNEL_COUNT_MAX];
memset(channel_map, 0, sizeof(channel_map));
- /* Following are all most common standard WAV channel layouts
- overridden by channel mask if its allowed and different */
- switch (channels) {
- case 1:
- /* AUDIO_CHANNEL_OUT_MONO */
- channel_map[0] = PCM_CHANNEL_FC;
- break;
- case 2:
- /* AUDIO_CHANNEL_OUT_STEREO */
- channel_map[0] = PCM_CHANNEL_FL;
- channel_map[1] = PCM_CHANNEL_FR;
- break;
- case 3:
- /* AUDIO_CHANNEL_OUT_2POINT1 */
- channel_map[0] = PCM_CHANNEL_FL;
- channel_map[1] = PCM_CHANNEL_FR;
- channel_map[2] = PCM_CHANNEL_FC;
- break;
- case 4:
- /* AUDIO_CHANNEL_OUT_QUAD_SIDE */
- channel_map[0] = PCM_CHANNEL_FL;
- channel_map[1] = PCM_CHANNEL_FR;
- channel_map[2] = PCM_CHANNEL_LS;
- channel_map[3] = PCM_CHANNEL_RS;
- if (channel_mask == AUDIO_CHANNEL_OUT_QUAD_BACK)
- {
- channel_map[2] = PCM_CHANNEL_LB;
- channel_map[3] = PCM_CHANNEL_RB;
- }
- if (channel_mask == AUDIO_CHANNEL_OUT_SURROUND)
- {
+ if (*input_channel_map) {
+ for (i = 0; i < channels; i++) {
+ ALOGV("%s:: Channel Map channel_map[%d] - %d", __func__, i, *input_channel_map);
+ channel_map[i] = *input_channel_map;
+ input_channel_map++;
+ }
+ } else {
+ /* Following are all most common standard WAV channel layouts
+ overridden by channel mask if its allowed and different */
+ switch (channels) {
+ case 1:
+ /* AUDIO_CHANNEL_OUT_MONO */
+ channel_map[0] = PCM_CHANNEL_FC;
+ break;
+ case 2:
+ /* AUDIO_CHANNEL_OUT_STEREO */
+ channel_map[0] = PCM_CHANNEL_FL;
+ channel_map[1] = PCM_CHANNEL_FR;
+ break;
+ case 3:
+ /* AUDIO_CHANNEL_OUT_2POINT1 */
+ channel_map[0] = PCM_CHANNEL_FL;
+ channel_map[1] = PCM_CHANNEL_FR;
channel_map[2] = PCM_CHANNEL_FC;
- channel_map[3] = PCM_CHANNEL_CS;
- }
- break;
- case 5:
- /* AUDIO_CHANNEL_OUT_PENTA */
- channel_map[0] = PCM_CHANNEL_FL;
- channel_map[1] = PCM_CHANNEL_FR;
- channel_map[2] = PCM_CHANNEL_FC;
- channel_map[3] = PCM_CHANNEL_LB;
- channel_map[4] = PCM_CHANNEL_RB;
- break;
- case 6:
- /* AUDIO_CHANNEL_OUT_5POINT1 */
- channel_map[0] = PCM_CHANNEL_FL;
- channel_map[1] = PCM_CHANNEL_FR;
- channel_map[2] = PCM_CHANNEL_FC;
- channel_map[3] = PCM_CHANNEL_LFE;
- channel_map[4] = PCM_CHANNEL_LB;
- channel_map[5] = PCM_CHANNEL_RB;
- if (channel_mask == AUDIO_CHANNEL_OUT_5POINT1_SIDE)
- {
- channel_map[4] = PCM_CHANNEL_LS;
- channel_map[5] = PCM_CHANNEL_RS;
- }
- break;
- case 7:
- /* AUDIO_CHANNEL_OUT_6POINT1 */
- channel_map[0] = PCM_CHANNEL_FL;
- channel_map[1] = PCM_CHANNEL_FR;
- channel_map[2] = PCM_CHANNEL_FC;
- channel_map[3] = PCM_CHANNEL_LFE;
- channel_map[4] = PCM_CHANNEL_LB;
- channel_map[5] = PCM_CHANNEL_RB;
- channel_map[6] = PCM_CHANNEL_CS;
- break;
- case 8:
- /* AUDIO_CHANNEL_OUT_7POINT1 */
- channel_map[0] = PCM_CHANNEL_FL;
- channel_map[1] = PCM_CHANNEL_FR;
- channel_map[2] = PCM_CHANNEL_FC;
- channel_map[3] = PCM_CHANNEL_LFE;
- channel_map[4] = PCM_CHANNEL_LB;
- channel_map[5] = PCM_CHANNEL_RB;
- channel_map[6] = PCM_CHANNEL_LS;
- channel_map[7] = PCM_CHANNEL_RS;
- break;
- default:
- ALOGE("unsupported channels %d for setting channel map", channels);
- return -1;
+ break;
+ case 4:
+ /* AUDIO_CHANNEL_OUT_QUAD_SIDE */
+ channel_map[0] = PCM_CHANNEL_FL;
+ channel_map[1] = PCM_CHANNEL_FR;
+ channel_map[2] = PCM_CHANNEL_LS;
+ channel_map[3] = PCM_CHANNEL_RS;
+ if (channel_mask == AUDIO_CHANNEL_OUT_QUAD_BACK) {
+ channel_map[2] = PCM_CHANNEL_LB;
+ channel_map[3] = PCM_CHANNEL_RB;
+ }
+ if (channel_mask == AUDIO_CHANNEL_OUT_SURROUND) {
+ channel_map[2] = PCM_CHANNEL_FC;
+ channel_map[3] = PCM_CHANNEL_CS;
+ }
+ break;
+ case 5:
+ /* AUDIO_CHANNEL_OUT_PENTA */
+ channel_map[0] = PCM_CHANNEL_FL;
+ channel_map[1] = PCM_CHANNEL_FR;
+ channel_map[2] = PCM_CHANNEL_FC;
+ channel_map[3] = PCM_CHANNEL_LB;
+ channel_map[4] = PCM_CHANNEL_RB;
+ break;
+ case 6:
+ /* AUDIO_CHANNEL_OUT_5POINT1 */
+ channel_map[0] = PCM_CHANNEL_FL;
+ channel_map[1] = PCM_CHANNEL_FR;
+ channel_map[2] = PCM_CHANNEL_FC;
+ channel_map[3] = PCM_CHANNEL_LFE;
+ channel_map[4] = PCM_CHANNEL_LB;
+ channel_map[5] = PCM_CHANNEL_RB;
+ if (channel_mask == AUDIO_CHANNEL_OUT_5POINT1_SIDE) {
+ channel_map[4] = PCM_CHANNEL_LS;
+ channel_map[5] = PCM_CHANNEL_RS;
+ }
+ break;
+ case 7:
+ /* AUDIO_CHANNEL_OUT_6POINT1 */
+ channel_map[0] = PCM_CHANNEL_FL;
+ channel_map[1] = PCM_CHANNEL_FR;
+ channel_map[2] = PCM_CHANNEL_FC;
+ channel_map[3] = PCM_CHANNEL_LFE;
+ channel_map[4] = PCM_CHANNEL_LB;
+ channel_map[5] = PCM_CHANNEL_RB;
+ channel_map[6] = PCM_CHANNEL_CS;
+ break;
+ case 8:
+ /* AUDIO_CHANNEL_OUT_7POINT1 */
+ channel_map[0] = PCM_CHANNEL_FL;
+ channel_map[1] = PCM_CHANNEL_FR;
+ channel_map[2] = PCM_CHANNEL_FC;
+ channel_map[3] = PCM_CHANNEL_LFE;
+ channel_map[4] = PCM_CHANNEL_LB;
+ channel_map[5] = PCM_CHANNEL_RB;
+ channel_map[6] = PCM_CHANNEL_LS;
+ channel_map[7] = PCM_CHANNEL_RS;
+ break;
+ default:
+ ALOGE("unsupported channels %d for setting channel map", channels);
+ return -1;
+ }
}
ret = platform_set_channel_map(platform, channels, channel_map, snd_id);
return ret;