diff options
author | Artem Borisov <dedsa2002@gmail.com> | 2017-12-02 20:19:25 +0300 |
---|---|---|
committer | Arne Coucheron <arco68@gmail.com> | 2019-09-28 00:23:56 +0200 |
commit | d04778891513ec3ce3bed6964313eb389adbaae2 (patch) | |
tree | 565ffa785195d5d703f174a53cf65576db0dd230 | |
parent | c31b9164d546a56a739c2509493ffb73c7773355 (diff) | |
download | hardware_qcom_audio-d04778891513ec3ce3bed6964313eb389adbaae2.tar.gz hardware_qcom_audio-d04778891513ec3ce3bed6964313eb389adbaae2.tar.bz2 hardware_qcom_audio-d04778891513ec3ce3bed6964313eb389adbaae2.zip |
msm8960: treblize configuration
Loosely based on f62e17dbf9e88eae1371b42c59a8f48b736abb8a
Change-Id: I63e873b743d2de85d6c44491bf2aed4c8e41e0e5
-rw-r--r-- | hal/msm8960/platform.c | 28 | ||||
-rw-r--r-- | hal/platform_info.c | 44 |
2 files changed, 62 insertions, 10 deletions
diff --git a/hal/msm8960/platform.c b/hal/msm8960/platform.c index ac2c495d..ef8c73a9 100644 --- a/hal/msm8960/platform.c +++ b/hal/msm8960/platform.c @@ -40,7 +40,7 @@ #define UNUSED(a) ((void)(a)) -#define MIXER_XML_PATH "/system/etc/mixer_paths.xml" +#define MIXER_XML_PATH "mixer_paths.xml" #define LIB_ACDB_LOADER "libacdbloader.so" #define AUDIO_DATA_BLOCK_MIXER_CTL "HDMI EDID" @@ -731,6 +731,28 @@ static void set_platform_defaults(struct platform_data * my_data __unused) backend_table[SND_DEVICE_OUT_TRANSMISSION_FM] = strdup("transmission-fm"); } +// Treblized config files will be located in /odm/etc or /vendor/etc. +static const char *kConfigLocationList[] = + {"/odm/etc", "/vendor/etc", "/system/etc"}; +static const int kConfigLocationListSize = + (sizeof(kConfigLocationList) / sizeof(kConfigLocationList[0])); + +bool resolveMixerConfigFile(char file_name[MIXER_PATH_MAX_LENGTH]) { + char full_config_path[MIXER_PATH_MAX_LENGTH]; + for (int i = 0; i < kConfigLocationListSize; i++) { + snprintf(full_config_path, + MIXER_PATH_MAX_LENGTH, + "%s/%s", + kConfigLocationList[i], + file_name); + if (F_OK == access(full_config_path, 0)) { + strcpy(file_name, full_config_path); + return true; + } + } + return false; +} + void *platform_init(struct audio_device *adev) { char platform[PROPERTY_VALUE_MAX]; @@ -740,6 +762,7 @@ void *platform_init(struct audio_device *adev) struct platform_data *my_data = NULL; int retry_num = 0, snd_card_num = 0; const char *snd_card_name; + char mixer_xml_file[MIXER_PATH_MAX_LENGTH] = MIXER_XML_PATH; my_data = calloc(1, sizeof(struct platform_data)); @@ -770,8 +793,9 @@ void *platform_init(struct audio_device *adev) my_data->hw_info = hw_info_init(snd_card_name); + resolveMixerConfigFile(mixer_xml_file); adev->audio_route = audio_route_init(snd_card_num, - MIXER_XML_PATH); + mixer_xml_file); if (!adev->audio_route) { ALOGE("%s: Failed to init audio route controls, aborting.", __func__); diff --git a/hal/platform_info.c b/hal/platform_info.c index 48f19ab1..471da361 100644 --- a/hal/platform_info.c +++ b/hal/platform_info.c @@ -38,7 +38,7 @@ #include "platform_api.h" #include <platform.h> -#define PLATFORM_INFO_XML_PATH "/system/etc/audio_platform_info.xml" +#define PLATFORM_INFO_XML_PATH "audio_platform_info.xml" #define BUF_SIZE 1024 typedef enum { @@ -179,25 +179,49 @@ done: return; } +// Treblized config files will be located in /odm/etc or /vendor/etc. +static const char *kConfigLocationList[] = + {"/odm/etc", "/vendor/etc", "/system/etc"}; +static const int kConfigLocationListSize = + (sizeof(kConfigLocationList) / sizeof(kConfigLocationList[0])); + +bool resolvePlatformConfigFile(char file_name[MIXER_PATH_MAX_LENGTH]) { + char full_config_path[MIXER_PATH_MAX_LENGTH]; + for (int i = 0; i < kConfigLocationListSize; i++) { + snprintf(full_config_path, + MIXER_PATH_MAX_LENGTH, + "%s/%s", + kConfigLocationList[i], + file_name); + if (F_OK == access(full_config_path, 0)) { + strcpy(file_name, full_config_path); + return true; + } + } + return false; +} + static void process_acdb_id(const XML_Char **attr) { int index; + char platform_xml_file[MIXER_PATH_MAX_LENGTH] = PLATFORM_INFO_XML_PATH; if (strcmp(attr[0], "name") != 0) { ALOGE("%s: 'name' not found, no ACDB ID set!", __func__); goto done; } + resolvePlatformConfigFile(platform_xml_file); index = platform_get_snd_device_index((char *)attr[1]); if (index < 0) { ALOGE("%s: Device %s in %s not found, no ACDB ID set!", - __func__, attr[1], PLATFORM_INFO_XML_PATH); + __func__, attr[1], platform_xml_file); goto done; } if (strcmp(attr[2], "acdb_id") != 0) { ALOGE("%s: Device %s in %s has no acdb_id, no ACDB ID set!", - __func__, attr[1], PLATFORM_INFO_XML_PATH); + __func__, attr[1], platform_xml_file); goto done; } @@ -214,22 +238,24 @@ done: static void process_device_name(const XML_Char **attr) { int index; + char platform_xml_file[MIXER_PATH_MAX_LENGTH] = PLATFORM_INFO_XML_PATH; if (strcmp(attr[0], "name") != 0) { ALOGE("%s: 'name' not found, no alias set!", __func__); goto done; } + resolvePlatformConfigFile(platform_xml_file); index = platform_get_snd_device_index((char *)attr[1]); if (index < 0) { ALOGE("%s: Device %s in %s not found, no alias set!", - __func__, attr[1], PLATFORM_INFO_XML_PATH); + __func__, attr[1], platform_xml_file); goto done; } if (strcmp(attr[2], "alias") != 0) { ALOGE("%s: Device %s in %s has no alias, no alias set!", - __func__, attr[1], PLATFORM_INFO_XML_PATH); + __func__, attr[1], platform_xml_file); goto done; } @@ -301,13 +327,15 @@ int platform_info_init(void) int ret = 0; int bytes_read; void *buf; + char platform_xml_file[MIXER_PATH_MAX_LENGTH] = PLATFORM_INFO_XML_PATH; - file = fopen(PLATFORM_INFO_XML_PATH, "r"); + resolvePlatformConfigFile(platform_xml_file); + file = fopen(platform_xml_file, "r"); section = ROOT; if (!file) { ALOGD("%s: Failed to open %s, using defaults.", - __func__, PLATFORM_INFO_XML_PATH); + __func__, platform_xml_file); ret = -ENODEV; goto done; } @@ -339,7 +367,7 @@ int platform_info_init(void) if (XML_ParseBuffer(parser, bytes_read, bytes_read == 0) == XML_STATUS_ERROR) { ALOGE("%s: XML_ParseBuffer failed, for %s", - __func__, PLATFORM_INFO_XML_PATH); + __func__, platform_xml_file); ret = -EINVAL; goto err_free_parser; } |