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/audio_extn/audio_defs.h b/hal/audio_extn/audio_defs.h
index 5fb5cdf..ea84b75 100644
--- a/hal/audio_extn/audio_defs.h
+++ b/hal/audio_extn/audio_defs.h
@@ -209,6 +209,11 @@
void *payload; /* the actual payload */
};
+struct audio_out_channel_map_param {
+ uint8_t channels; /* Input Channels */
+ uint8_t channel_map[AUDIO_CHANNEL_COUNT_MAX]; /* Input Channel Map */
+};
+
typedef union {
struct source_tracking_param st_params;
struct sound_focus_param sf_params;
@@ -219,6 +224,7 @@
struct audio_out_enable_drift_correction drift_enable_param;
struct audio_out_correct_drift drift_correction_param;
struct audio_adsp_event adsp_event_params;
+ struct audio_out_channel_map_param channel_map_param;
} audio_extn_param_payload;
typedef enum {
@@ -232,7 +238,9 @@
AUDIO_EXTN_PARAM_OUT_ENABLE_DRIFT_CORRECTION,
/* param to set drift value to be adjusted by dsp */
AUDIO_EXTN_PARAM_OUT_CORRECT_DRIFT,
- AUDIO_EXTN_PARAM_ADSP_STREAM_CMD
+ AUDIO_EXTN_PARAM_ADSP_STREAM_CMD,
+ /* param to set input channel map for playback stream */
+ AUDIO_EXTN_PARAM_OUT_CHANNEL_MAP
} audio_extn_param_id;
#endif /* AUDIO_DEFS_H */
diff --git a/hal/audio_extn/audio_extn.c b/hal/audio_extn/audio_extn.c
index 05afda0..62b661e 100644
--- a/hal/audio_extn/audio_extn.c
+++ b/hal/audio_extn/audio_extn.c
@@ -1380,6 +1380,10 @@
ADSP_HDLR_STREAM_CMD_REGISTER_EVENT,
(void *)&payload->adsp_event_params);
break;
+ case AUDIO_EXTN_PARAM_OUT_CHANNEL_MAP:
+ ret = audio_extn_utils_set_channel_map(out,
+ (struct audio_out_channel_map_param *)(payload));
+ break;
default:
ALOGE("%s:: unsupported param_id %d", __func__, param_id);
break;
diff --git a/hal/audio_extn/audio_extn.h b/hal/audio_extn/audio_extn.h
index c71037e..aeaab5f 100644
--- a/hal/audio_extn/audio_extn.h
+++ b/hal/audio_extn/audio_extn.h
@@ -870,4 +870,7 @@
int audio_extn_utils_compress_correct_drift(
struct stream_out *out,
struct audio_out_correct_drift *drift_correction_param);
+int audio_extn_utils_set_channel_map(
+ struct stream_out *out,
+ struct audio_out_channel_map_param *channel_map_param);
#endif /* AUDIO_EXTN_H */
diff --git a/hal/audio_extn/utils.c b/hal/audio_extn/utils.c
index 0331fc4..660bd6b 100644
--- a/hal/audio_extn/utils.c
+++ b/hal/audio_extn/utils.c
@@ -2114,3 +2114,30 @@
return 0;
}
#endif
+
+int audio_extn_utils_set_channel_map(
+ struct stream_out *out,
+ struct audio_out_channel_map_param *channel_map_param)
+{
+ int ret = -EINVAL, i = 0;
+ int channels = audio_channel_count_from_out_mask(out->channel_mask);
+
+ if (channel_map_param == NULL) {
+ ALOGE("%s:: Invalid channel_map", __func__);
+ goto exit;
+ }
+
+ if (channel_map_param->channels != channels) {
+ ALOGE("%s:: Channels(%d) does not match stream channels(%d)",
+ __func__, channel_map_param->channels, channels);
+ goto exit;
+ }
+
+ for ( i = 0; i < channels; i++) {
+ ALOGV("%s:: channel_map[%d]- %d", __func__, i, channel_map_param->channel_map[i]);
+ out->channel_map_param.channel_map[i] = channel_map_param->channel_map[i];
+ }
+ ret = 0;
+exit:
+ return ret;
+}
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index a04cc45..0b4ba95 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -2342,9 +2342,6 @@
break;
}
- platform_set_stream_channel_map(adev->platform, out->channel_mask,
- out->pcm_device_id);
-
ALOGV("%s: pcm_prepare", __func__);
if (pcm_is_ready(out->pcm)) {
ret = pcm_prepare(out->pcm);
@@ -2356,10 +2353,11 @@
}
}
platform_set_stream_channel_map(adev->platform, out->channel_mask,
- out->pcm_device_id);
+ out->pcm_device_id, &out->channel_map_param.channel_map[0]);
+
} else {
platform_set_stream_channel_map(adev->platform, out->channel_mask,
- out->pcm_device_id);
+ out->pcm_device_id, &out->channel_map_param.channel_map[0]);
out->pcm = NULL;
out->compr = compress_open(adev->snd_card,
out->pcm_device_id,
@@ -4189,6 +4187,9 @@
out->render_mode = RENDER_MODE_AUDIO_NO_TIMESTAMP;
}
+ memset(&out->channel_map_param, 0,
+ sizeof(struct audio_out_channel_map_param));
+
out->send_new_metadata = 1;
out->send_next_track_params = false;
out->is_compr_metadata_avail = false;
diff --git a/hal/audio_hw.h b/hal/audio_hw.h
index 26d5d18..c86834f 100644
--- a/hal/audio_hw.h
+++ b/hal/audio_hw.h
@@ -268,6 +268,7 @@
render_mode_t render_mode;
bool drift_correction_enabled;
+ struct audio_out_channel_map_param channel_map_param; /* input channel map */
audio_offload_info_t info;
qahwi_stream_out_t qahwi_out;
};
diff --git a/hal/audio_hw_extn_api.c b/hal/audio_hw_extn_api.c
index 63f8d0d..0ee927e 100644
--- a/hal/audio_hw_extn_api.c
+++ b/hal/audio_hw_extn_api.c
@@ -76,7 +76,7 @@
if (ret)
ALOGE("%s::qaf_out_set_param_data failed error %d", __func__ , ret);
} else {
- if (out->standby)
+ if (out->standby && (param_id != AUDIO_EXTN_PARAM_OUT_CHANNEL_MAP))
out->stream.write(&out->stream, NULL, 0);
lock_output_stream(out);
ret = audio_extn_out_set_param_data(out, param_id, payload);
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index a7e0044..cacdd85 100644
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -6018,94 +6018,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;
diff --git a/hal/msm8960/platform.c b/hal/msm8960/platform.c
index c2ffd4a..3d50488 100644
--- a/hal/msm8960/platform.c
+++ b/hal/msm8960/platform.c
@@ -1148,7 +1148,8 @@
int platform_set_stream_channel_map(void *platform __unused,
audio_channel_mask_t channel_mask __unused,
- int snd_id __unused)
+ int snd_id __unused
+ uint8_t *input_channel_map __unused)
{
return -ENOSYS;
}
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;
diff --git a/hal/platform_api.h b/hal/platform_api.h
index b7c4598..a5ba7bf 100644
--- a/hal/platform_api.h
+++ b/hal/platform_api.h
@@ -168,7 +168,8 @@
int platform_get_edid_info(void *platform);
int platform_set_channel_map(void *platform, int ch_count, char *ch_map,
int snd_id);
-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 platform_set_edid_channels_configuration(void *platform, int channels);
unsigned char platform_map_to_edid_format(int format);
bool platform_is_edid_supported_format(void *platform, int format);
diff --git a/qahw_api/inc/qahw_defs.h b/qahw_api/inc/qahw_defs.h
index 7dcad2a..3900676 100644
--- a/qahw_api/inc/qahw_defs.h
+++ b/qahw_api/inc/qahw_defs.h
@@ -301,6 +301,11 @@
void *payload; /* the actual payload */
};
+struct qahw_out_channel_map_param {
+ uint8_t channels; /* Input Channels */
+ uint8_t channel_map[AUDIO_CHANNEL_COUNT_MAX]; /* Input Channel Map */
+};
+
typedef union {
struct qahw_source_tracking_param st_params;
struct qahw_sound_focus_param sf_params;
@@ -311,20 +316,22 @@
struct qahw_out_enable_drift_correction drift_enable_param;
struct qahw_out_correct_drift drift_correction_param;
struct qahw_adsp_event adsp_event_params;
+ struct qahw_out_channel_map_param channel_map_params;
} qahw_param_payload;
typedef enum {
QAHW_PARAM_SOURCE_TRACK,
QAHW_PARAM_SOUND_FOCUS,
QAHW_PARAM_APTX_DEC,
- QAHW_PARAM_AVT_DEVICE_DRIFT, /* PARAM to query AV timer vs device drift */
+ QAHW_PARAM_AVT_DEVICE_DRIFT, /* PARAM to query AV timer vs device drift */
QAHW_PARAM_OUT_RENDER_WINDOW, /* PARAM to set render window */
QAHW_PARAM_OUT_START_DELAY, /* PARAM to set session start delay*/
/* enable adsp drift correction this must be called before out_write */
QAHW_PARAM_OUT_ENABLE_DRIFT_CORRECTION,
/* param to set drift value to be adjusted by dsp */
QAHW_PARAM_OUT_CORRECT_DRIFT,
- QAHW_PARAM_ADSP_STREAM_CMD
+ QAHW_PARAM_ADSP_STREAM_CMD,
+ QAHW_PARAM_OUT_CHANNEL_MAP /* PARAM to set i/p channel map */
} qahw_param_id;
__END_DECLS