summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArtem Borisov <dedsa2002@gmail.com>2017-12-02 20:19:25 +0300
committerArne Coucheron <arco68@gmail.com>2019-09-28 00:23:56 +0200
commitd04778891513ec3ce3bed6964313eb389adbaae2 (patch)
tree565ffa785195d5d703f174a53cf65576db0dd230
parentc31b9164d546a56a739c2509493ffb73c7773355 (diff)
downloadhardware_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.c28
-rw-r--r--hal/platform_info.c44
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;
}