diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c index b5b7cb78..bb229b8e 100644 --- a/hal/msm8916/platform.c +++ b/hal/msm8916/platform.c @@ -4090,3 +4090,57 @@ int platform_set_audio_device_interface(const char * device_name, done: return ret; } + +/* + * This is a lookup table to map names of speaker device with respective left and right TZ names. + * Also the tz names for a particular left or right speaker can be overriden by adding + * corresponding entry in audio_platform_info.xml file. + */ +struct speaker_device_to_tz_names speaker_device_tz_names = { + {SND_DEVICE_OUT_SPEAKER, "", ""}, +}; + +const char *platform_get_spkr_1_tz_name(snd_device_t snd_device) +{ + if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX) + return speaker_device_tz_names.spkr_1_tz_name; + else + return ""; +} + +const char *platform_get_spkr_2_tz_name(snd_device_t snd_device) +{ + if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX) + return speaker_device_tz_names.spkr_2_tz_name; + else + return ""; +} + +int platform_set_spkr_device_tz_names(snd_device_t index, + const char *spkr_1_tz_name, const char *spkr_2_tz_name) +{ + int ret = 0; + + if (spkr_1_tz_name == NULL && spkr_2_tz_name == NULL) { + ALOGE("%s: Invalid input", __func__); + ret = -EINVAL; + goto done; + } + if (index != speaker_device_tz_names.snd_device) { + ALOGE("%s: not matching speaker device\n"); + ret = -EINVAL; + goto done; + } + ALOGD("%s: Enter, spkr_1_tz_name :%s, spkr_2_tz_name:%s", + __func__, spkr_1_tz_name, spkr_2_tz_name); + + if (spkr_1_tz_name != NULL) + strlcpy(speaker_device_tz_names.spkr_1_tz_name, spkr_1_tz_name, + sizeof(speaker_device_tz_names.spkr_1_tz_name)); + + if (spkr_2_tz_name != NULL) + strlcpy(speaker_device_tz_names.spkr_2_tz_name, spkr_2_tz_name, + sizeof(speaker_device_tz_names.spkr_2_tz_name)); +done: + return ret; +} diff --git a/hal/msm8916/platform.h b/hal/msm8916/platform.h index aae05d08..3ce4c571 100644 --- a/hal/msm8916/platform.h +++ b/hal/msm8916/platform.h @@ -306,4 +306,10 @@ struct audio_device_to_audio_interface { char device_name[100]; char interface_name[100]; }; + +struct speaker_device_to_tz_names { + snd_device_t snd_device; + char spkr_1_tz_name[100]; + char spkr_2_tz_name[100]; +}; #endif // QCOM_AUDIO_PLATFORM_H diff --git a/hal/msm8960/platform.c b/hal/msm8960/platform.c index f9b7851f..50dba2de 100644 --- a/hal/msm8960/platform.c +++ b/hal/msm8960/platform.c @@ -1160,3 +1160,9 @@ int platform_set_audio_device_interface(const char * device_name __unused, { return -ENOSYS; } + +int platform_set_spkr_device_tz_names(snd_device_t index, + const char *spkr_1_tz_name, const char *spkr_2_tz_name) +{ + return -ENOSYS; +} diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c index 28a75df8..b30eb97b 100644 --- a/hal/msm8974/platform.c +++ b/hal/msm8974/platform.c @@ -696,6 +696,14 @@ static int msm_device_to_be_id [][NO_COLS] = { static int msm_be_id_array_len = sizeof(msm_device_to_be_id) / sizeof(msm_device_to_be_id[0]); +/* + * This is a lookup table to map names of speaker device with respective left and right TZ names. + * Also the tz names for a particular left or right speaker can be overriden by adding + * corresponding entry in audio_platform_info.xml file. + */ +struct speaker_device_to_tz_names speaker_device_tz_names = { + {SND_DEVICE_OUT_SPEAKER, "", ""}, +}; #define DEEP_BUFFER_PLATFORM_DELAY (29*1000LL) #define LOW_LATENCY_PLATFORM_DELAY (13*1000LL) @@ -1375,6 +1383,22 @@ const char *platform_get_snd_device_name(snd_device_t snd_device) return ""; } +const char *platform_get_spkr_1_tz_name(snd_device_t snd_device) +{ + if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX) + return speaker_device_tz_names.spkr_1_tz_name; + else + return ""; +} + +const char *platform_get_spkr_2_tz_name(snd_device_t snd_device) +{ + if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX) + return speaker_device_tz_names.spkr_2_tz_name; + else + return ""; +} + int platform_get_snd_device_name_extn(void *platform, snd_device_t snd_device, char *device_name) { @@ -3993,3 +4017,32 @@ int platform_set_audio_device_interface(const char *device_name, const char *int done: return ret; } + +int platform_set_spkr_device_tz_names(snd_device_t index, + const char *spkr_1_tz_name, const char *spkr_2_tz_name) +{ + int ret = 0; + + if (spkr_1_tz_name == NULL && spkr_2_tz_name == NULL) { + ALOGE("%s: Invalid input", __func__); + ret = -EINVAL; + goto done; + } + if (index != speaker_device_tz_names.snd_device) { + ALOGE("%s: not matching speaker device\n"); + ret = -EINVAL; + goto done; + } + ALOGD("%s: Enter, spkr_1_tz_name :%s, spkr_2_tz_name:%s", + __func__, spkr_1_tz_name, spkr_2_tz_name); + + if (spkr_1_tz_name != NULL) + strlcpy(speaker_device_tz_names.spkr_1_tz_name, spkr_1_tz_name, + sizeof(speaker_device_tz_names.spkr_1_tz_name)); + + if (spkr_2_tz_name != NULL) + strlcpy(speaker_device_tz_names.spkr_2_tz_name, spkr_2_tz_name, + sizeof(speaker_device_tz_names.spkr_2_tz_name)); +done: + return ret; +} diff --git a/hal/msm8974/platform.h b/hal/msm8974/platform.h index 6b0f13ea..4b90f8b8 100644 --- a/hal/msm8974/platform.h +++ b/hal/msm8974/platform.h @@ -396,4 +396,10 @@ struct audio_device_to_audio_interface { char device_name[100]; char interface_name[100]; }; + +struct speaker_device_to_tz_names { + snd_device_t snd_device; + char spkr_1_tz_name[100]; + char spkr_2_tz_name[100]; +}; #endif // QCOM_AUDIO_PLATFORM_H diff --git a/hal/platform_api.h b/hal/platform_api.h index 7e861749..5542a6d9 100644 --- a/hal/platform_api.h +++ b/hal/platform_api.h @@ -115,4 +115,8 @@ int platform_set_hdmi_config(struct stream_out *out); int platform_set_device_params(struct stream_out *out, int param, int value); int platform_set_audio_device_interface(const char * device_name, const char *intf_name, const char * codec_type); +int platform_set_spkr_device_tz_names(snd_device_t index, + const char *spkr_1_tz_name, const char *spkr_2_tz_name); +const char *platform_get_spkr_1_tz_name(snd_device_t snd_device); +const char *platform_get_spkr_2_tz_name(snd_device_t snd_device); #endif // AUDIO_PLATFORM_API_H diff --git a/hal/platform_info.c b/hal/platform_info.c index 02f4988a..e6cc15d1 100644 --- a/hal/platform_info.c +++ b/hal/platform_info.c @@ -48,6 +48,7 @@ typedef enum { PCM_ID, BACKEND_NAME, INTERFACE_NAME, + TZ_NAME, } section_t; typedef void (* section_process_fn)(const XML_Char **attr); @@ -58,6 +59,7 @@ static void process_native_support(const XML_Char **attr); static void process_pcm_id(const XML_Char **attr); static void process_backend_name(const XML_Char **attr); static void process_interface_name(const XML_Char **attr); +static void process_tz_name(const XML_Char **attr); static void process_root(const XML_Char **attr); static section_process_fn section_table[] = { @@ -68,6 +70,7 @@ static section_process_fn section_table[] = { [PCM_ID] = process_pcm_id, [BACKEND_NAME] = process_backend_name, [INTERFACE_NAME] = process_interface_name, + [TZ_NAME] = process_tz_name, }; static section_t section; @@ -94,6 +97,11 @@ static section_t section; * ... * ... * + * + * + * ... + * ... + * * */ @@ -308,6 +316,42 @@ done: return; } +static void process_tz_name(const XML_Char **attr) +{ + int ret, index; + + if (strcmp(attr[0], "name") != 0) { + ALOGE("%s: 'name' not found, no Audio Interface set!", __func__); + goto done; + } + + index = platform_get_snd_device_index((char *)attr[1]); + if (index < 0) { + ALOGE("%s: Device %s not found, no snd device set!", + __func__, attr[1]); + goto done; + } + + if (strcmp(attr[2], "spkr_1_tz_name") != 0) { + ALOGE("%s: Device %s has no spkr_1_tz_name set!", + __func__, attr[1]); + } + + if (strcmp(attr[4], "spkr_2_tz_name") != 0) { + ALOGE("%s: Device %s has no spkr_2_tz_name set!", + __func__, attr[1]); + } + + ret = platform_set_spkr_device_tz_names(index, (char *)attr[3], (char *)attr[5]); + if (ret < 0) { + ALOGE("%s: Audio Interface not set!", __func__); + goto done; + } + +done: + return; +} + static void start_tag(void *userdata __unused, const XML_Char *tag_name, const XML_Char **attr) { @@ -327,10 +371,12 @@ static void start_tag(void *userdata __unused, const XML_Char *tag_name, section = INTERFACE_NAME; } else if (strcmp(tag_name, "native_configs") == 0) { section = NATIVESUPPORT; + } else if (strcmp(tag_name, "tz_names") == 0) { + section = TZ_NAME; } else if (strcmp(tag_name, "device") == 0) { if ((section != ACDB) && (section != BACKEND_NAME) && (section != BITWIDTH) && - (section != INTERFACE_NAME)) { - ALOGE("device tag only supported for acdb/backend names/bitwitdh/interface names"); + (section != INTERFACE_NAME) && (section != TZ_NAME)) { + ALOGE("device tag only supported for acdb/backend names/bitwitdh/interface/tz names"); return; }