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;
+}