hal: enable form factor based configuration
- for 8996 enable form factor based mixer path configuration
Change-Id: Ib3cc1bdb2b0427c9d98cfaa9cbae21b91dc38bd2
diff --git a/hal/Android.mk b/hal/Android.mk
index d55e37a..28c1786 100644
--- a/hal/Android.mk
+++ b/hal/Android.mk
@@ -39,8 +39,8 @@
LOCAL_CFLAGS := -DPLATFORM_MSM8996
LOCAL_CFLAGS += -DMAX_TARGET_SPECIFIC_CHANNEL_CNT="4"
LOCAL_CFLAGS += -DKPI_OPTIMIZE_ENABLED
+ MULTIPLE_HW_VARIANTS_ENABLED := true
endif
-
endif
LOCAL_SRC_FILES := \
@@ -51,6 +51,11 @@
audio_extn/audio_extn.c \
$(AUDIO_PLATFORM)/platform.c
+ifdef MULTIPLE_HW_VARIANTS_ENABLED
+ LOCAL_CFLAGS += -DHW_VARIANTS_ENABLED
+ LOCAL_SRC_FILES += $(AUDIO_PLATFORM)/hw_info.c
+endif
+
LOCAL_SHARED_LIBRARIES := \
liblog \
libcutils \
diff --git a/hal/audio_extn/audio_extn.c b/hal/audio_extn/audio_extn.c
index 7583f83..e5d7db4 100644
--- a/hal/audio_extn/audio_extn.c
+++ b/hal/audio_extn/audio_extn.c
@@ -29,7 +29,62 @@
#include "platform.h"
#include "platform_api.h"
+struct snd_card_split cur_snd_card_split = {
+ .device = {0},
+ .snd_card = {0},
+ .form_factor = {0},
+};
+struct snd_card_split *audio_extn_get_snd_card_split()
+{
+ return &cur_snd_card_split;
+}
+
+void audio_extn_set_snd_card_split(const char* in_snd_card_name)
+{
+ /* sound card name follows below mentioned convention
+ <target name>-<sound card name>-<form factor>-snd-card
+ parse target name, sound card name and form factor
+ */
+ char *snd_card_name = strdup(in_snd_card_name);
+ char *tmp = NULL;
+ char *device = NULL;
+ char *snd_card = NULL;
+ char *form_factor = NULL;
+
+ if (in_snd_card_name == NULL) {
+ ALOGE("%s: snd_card_name passed is NULL", __func__);
+ goto on_error;
+ }
+
+ device = strtok_r(snd_card_name, "-", &tmp);
+ if (device == NULL) {
+ ALOGE("%s: called on invalid snd card name", __func__);
+ goto on_error;
+ }
+ strlcpy(cur_snd_card_split.device, device, HW_INFO_ARRAY_MAX_SIZE);
+
+ snd_card = strtok_r(NULL, "-", &tmp);
+ if (snd_card == NULL) {
+ ALOGE("%s: called on invalid snd card name", __func__);
+ goto on_error;
+ }
+ strlcpy(cur_snd_card_split.snd_card, snd_card, HW_INFO_ARRAY_MAX_SIZE);
+
+ form_factor = strtok_r(NULL, "-", &tmp);
+ if (form_factor == NULL) {
+ ALOGE("%s: called on invalid snd card name", __func__);
+ goto on_error;
+ }
+ strlcpy(cur_snd_card_split.form_factor, form_factor, HW_INFO_ARRAY_MAX_SIZE);
+
+ ALOGI("%s: snd_card_name(%s) device(%s) snd_card(%s) form_factor(%s)",
+ __func__, in_snd_card_name, device, snd_card, form_factor);
+
+on_error:
+ if (snd_card_name)
+ free(snd_card_name);
+}
#ifdef KPI_OPTIMIZE_ENABLED
typedef int (*perf_lock_acquire_t)(int, int, int*, int);
diff --git a/hal/audio_extn/audio_extn.h b/hal/audio_extn/audio_extn.h
index c518faa..715284a 100644
--- a/hal/audio_extn/audio_extn.h
+++ b/hal/audio_extn/audio_extn.h
@@ -19,11 +19,21 @@
#include <cutils/str_parms.h>
+#define HW_INFO_ARRAY_MAX_SIZE 32
+
+struct snd_card_split {
+ char device[HW_INFO_ARRAY_MAX_SIZE];
+ char snd_card[HW_INFO_ARRAY_MAX_SIZE];
+ char form_factor[HW_INFO_ARRAY_MAX_SIZE];
+};
+
void *audio_extn_extspk_init(struct audio_device *adev);
void audio_extn_extspk_deinit(void *extn);
void audio_extn_extspk_update(void* extn);
void audio_extn_extspk_set_mode(void* extn, audio_mode_t mode);
void audio_extn_extspk_set_voice_vol(void* extn, float vol);
+struct snd_card_split *audio_extn_get_snd_card_split();
+void audio_extn_set_snd_card_split(const char* in_snd_card_name);
#ifndef SPKR_PROT_ENABLED
#define audio_extn_spkr_prot_init(adev) (0)
@@ -110,4 +120,16 @@
void audio_extn_perf_lock_acquire(void);
void audio_extn_perf_lock_release(void);
#endif /* KPI_OPTIMIZE_ENABLED */
+
+#ifndef HW_VARIANTS_ENABLED
+#define hw_info_init(snd_card_name) (0)
+#define hw_info_deinit(hw_info) (0)
+#define hw_info_append_hw_type(hw_info,\
+ snd_device, device_name) (0)
+#else
+void *hw_info_init(const char *snd_card_name);
+void hw_info_deinit(void *hw_info);
+void hw_info_append_hw_type(void *hw_info, snd_device_t snd_device,
+ char *device_name);
+#endif /* HW_VARIANTS_ENABLED */
#endif /* AUDIO_EXTN_H */
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index ae65409..f87fde9 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -307,20 +307,19 @@
{
int i, num_devices = 0;
snd_device_t new_snd_devices[2];
-
+ int ret_val = -EINVAL;
if (snd_device < SND_DEVICE_MIN ||
snd_device >= SND_DEVICE_MAX) {
ALOGE("%s: Invalid sound device %d", __func__, snd_device);
- return -EINVAL;
+ goto on_error;
}
platform_send_audio_calibration(adev->platform, snd_device);
- adev->snd_dev_ref_cnt[snd_device]++;
- if (adev->snd_dev_ref_cnt[snd_device] > 1) {
+ if (adev->snd_dev_ref_cnt[snd_device] >= 1) {
ALOGV("%s: snd_device(%d: %s) is already active",
__func__, snd_device, platform_get_snd_device_name(snd_device));
- return 0;
+ goto on_success;
}
/* due to the possibility of calibration overwrite between listen
@@ -337,12 +336,11 @@
snd_device == SND_DEVICE_OUT_VOICE_SPEAKER) &&
audio_extn_spkr_prot_is_enabled()) {
if (audio_extn_spkr_prot_get_acdb_id(snd_device) < 0) {
- adev->snd_dev_ref_cnt[snd_device]--;
- return -EINVAL;
+ goto on_error;
}
if (audio_extn_spkr_prot_start_processing(snd_device)) {
ALOGE("%s: spkr_start_processing failed", __func__);
- return -EINVAL;
+ goto on_error;
}
} else if (platform_can_split_snd_device(snd_device, &num_devices, new_snd_devices)) {
for (i = 0; i < num_devices; i++) {
@@ -350,12 +348,20 @@
}
platform_set_speaker_gain_in_combo(adev, snd_device, true);
} else {
- const char * dev_path = platform_get_snd_device_name(snd_device);
- ALOGV("%s: snd_device(%d: %s)", __func__, snd_device, dev_path);
- audio_route_apply_and_update_path(adev->audio_route, dev_path);
- }
+ char device_name[DEVICE_NAME_MAX_SIZE] = {0};
+ if (platform_get_snd_device_name_extn(adev->platform, snd_device, device_name) < 0 ) {
+ ALOGE(" %s: Invalid sound device returned", __func__);
+ goto on_error;
+ }
- return 0;
+ ALOGV("%s: snd_device(%d: %s)", __func__, snd_device, device_name);
+ audio_route_apply_and_update_path(adev->audio_route, device_name);
+ }
+on_success:
+ adev->snd_dev_ref_cnt[snd_device]++;
+ ret_val = 0;
+on_error:
+ return ret_val;
}
int disable_snd_device(struct audio_device *adev,
@@ -375,9 +381,6 @@
}
adev->snd_dev_ref_cnt[snd_device]--;
if (adev->snd_dev_ref_cnt[snd_device] == 0) {
- const char * dev_path = platform_get_snd_device_name(snd_device);
- ALOGV("%s: snd_device(%d: %s)", __func__, snd_device, dev_path);
-
audio_extn_dsm_feedback_enable(adev, snd_device, false);
if ((snd_device == SND_DEVICE_OUT_SPEAKER ||
snd_device == SND_DEVICE_OUT_VOICE_SPEAKER) &&
@@ -389,7 +392,14 @@
}
platform_set_speaker_gain_in_combo(adev, snd_device, false);
} else {
- audio_route_reset_and_update_path(adev->audio_route, dev_path);
+ char device_name[DEVICE_NAME_MAX_SIZE] = {0};
+ if (platform_get_snd_device_name_extn(adev->platform, snd_device, device_name) < 0 ) {
+ ALOGE(" %s: Invalid sound device returned", __func__);
+ return -EINVAL;
+ }
+
+ ALOGV("%s: snd_device(%d: %s)", __func__, snd_device, device_name);
+ audio_route_reset_and_update_path(adev->audio_route, device_name);
}
audio_extn_sound_trigger_update_device_status(snd_device,
ST_EVENT_SND_DEVICE_FREE);
diff --git a/hal/audio_hw.h b/hal/audio_hw.h
index 261e547..9a956f9 100644
--- a/hal/audio_hw.h
+++ b/hal/audio_hw.h
@@ -45,8 +45,6 @@
#define MAX_SUPPORTED_CHANNEL_MASKS 2
#define DEFAULT_HDMI_OUT_CHANNELS 2
-typedef int snd_device_t;
-
/* These are the supported use cases by the hardware.
* Each usecase is mapped to a specific PCM device.
* Refer to pcm_device_table[].
diff --git a/hal/msm8960/platform.c b/hal/msm8960/platform.c
index 0ffe8a9..b2d4e04 100644
--- a/hal/msm8960/platform.c
+++ b/hal/msm8960/platform.c
@@ -1087,3 +1087,12 @@
{
return true;
}
+
+int platform_get_snd_device_name_extn(void *platform __unused,
+ snd_device_t snd_device,
+ char *device_name)
+{
+ device_name = platform_get_snd_device_name(snd_device);
+ return 0;
+}
+
diff --git a/hal/msm8974/hw_info.c b/hal/msm8974/hw_info.c
new file mode 100644
index 0000000..6723362
--- /dev/null
+++ b/hal/msm8974/hw_info.c
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "hardware_info"
+/*#define LOG_NDEBUG 0*/
+#define LOG_NDDEBUG 0
+
+#include <stdlib.h>
+#include <cutils/log.h>
+#include "audio_hw.h"
+#include "platform.h"
+#include "audio_extn.h"
+
+struct hardware_info {
+ char name[HW_INFO_ARRAY_MAX_SIZE];
+ char type[HW_INFO_ARRAY_MAX_SIZE];
+ /* variables for handling target variants */
+ uint32_t num_snd_devices;
+ char dev_extn[HW_INFO_ARRAY_MAX_SIZE];
+ snd_device_t *snd_devices;
+};
+
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
+
+
+static const snd_device_t tasha_db_variant_devices[] = {
+ SND_DEVICE_OUT_SPEAKER
+};
+
+static const snd_device_t tasha_fluid_variant_devices[] = {
+ SND_DEVICE_OUT_SPEAKER,
+ SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES,
+ SND_DEVICE_OUT_VOICE_SPEAKER,
+ SND_DEVICE_OUT_SPEAKER_AND_HDMI,
+ SND_DEVICE_OUT_SPEAKER_PROTECTED,
+ SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED,
+};
+
+static const snd_device_t tasha_liquid_variant_devices[] = {
+ SND_DEVICE_OUT_SPEAKER,
+ SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES,
+ SND_DEVICE_IN_SPEAKER_MIC,
+ SND_DEVICE_IN_HEADSET_MIC,
+ SND_DEVICE_IN_VOICE_DMIC,
+ SND_DEVICE_IN_VOICE_SPEAKER_DMIC,
+ SND_DEVICE_IN_VOICE_REC_DMIC_STEREO,
+ SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE,
+ SND_DEVICE_IN_QUAD_MIC,
+};
+
+static void update_hardware_info_8996(struct hardware_info *hw_info)
+{
+ struct snd_card_split *tmp_handle = audio_extn_get_snd_card_split();
+ ALOGV("%s: device %s snd_card %s form_factor %s",
+ __func__, tmp_handle->device, tmp_handle->snd_card, tmp_handle->form_factor);
+
+ strlcpy(hw_info->name, tmp_handle->device, sizeof(hw_info->name));
+ snprintf(hw_info->type, sizeof(hw_info->type), " %s", tmp_handle->form_factor);
+ snprintf(hw_info->dev_extn, sizeof(hw_info->dev_extn), "-%s", tmp_handle->form_factor);
+
+ if (!strncmp(tmp_handle->form_factor, "fluid", sizeof("fluid"))) {
+ hw_info->snd_devices = (snd_device_t *)tasha_fluid_variant_devices;
+ hw_info->num_snd_devices = ARRAY_SIZE(tasha_fluid_variant_devices);
+ } else if (!strncmp(tmp_handle->form_factor, "liquid", sizeof("liquid"))) {
+ hw_info->snd_devices = (snd_device_t *)tasha_liquid_variant_devices;
+ hw_info->num_snd_devices = ARRAY_SIZE(tasha_liquid_variant_devices);
+ } else if (!strncmp(tmp_handle->form_factor, "db", sizeof("db"))) {
+ hw_info->snd_devices = (snd_device_t *)tasha_db_variant_devices;
+ hw_info->num_snd_devices = ARRAY_SIZE(tasha_db_variant_devices);
+ } else {
+ ALOGW("%s: %s form factor doesnt need mixer path over ride", __func__, tmp_handle->form_factor);
+ }
+
+ ALOGV("name %s type %s dev_extn %s", hw_info->name, hw_info->type, hw_info->dev_extn);
+}
+
+
+void *hw_info_init(const char *snd_card_name)
+{
+ struct hardware_info *hw_info = NULL;
+ bool hw_supported = false;
+
+ if (strstr(snd_card_name, "msm8996")) {
+ ALOGD("8996 - variant soundcard");
+ hw_supported = true;
+ } else {
+ ALOGE("%s: Unsupported target %s:",__func__, snd_card_name);
+ }
+
+ if (hw_supported) {
+ hw_info = malloc(sizeof(struct hardware_info));
+ if (!hw_info) {
+ ALOGE("failed to allocate mem for hardware info");
+ goto on_finish;
+ }
+
+ hw_info->snd_devices = NULL;
+ hw_info->num_snd_devices = 0;
+ strlcpy(hw_info->dev_extn, "", sizeof(hw_info->dev_extn));
+ strlcpy(hw_info->type, "", sizeof(hw_info->type));
+ strlcpy(hw_info->name, "", sizeof(hw_info->name));
+ update_hardware_info_8996(hw_info);
+ }
+
+on_finish:
+ return hw_info;
+}
+
+void hw_info_deinit(void *hw_info)
+{
+ free(hw_info);
+}
+
+void hw_info_append_hw_type(void *hw_info, snd_device_t snd_device,
+ char *device_name)
+{
+ struct hardware_info *my_data = (struct hardware_info*) hw_info;
+ uint32_t i = 0;
+
+ if (my_data == NULL)
+ return;
+
+ snd_device_t *snd_devices =
+ (snd_device_t *) my_data->snd_devices;
+
+ if (snd_devices != NULL) {
+ for (i = 0; i < my_data->num_snd_devices; i++) {
+ if (snd_device == (snd_device_t)snd_devices[i]) {
+ ALOGV("extract dev_extn device %d, device_name %s extn = %s ",
+ (snd_device_t)snd_devices[i], device_name, my_data->dev_extn);
+ CHECK(strlcat(device_name, my_data->dev_extn,
+ DEVICE_NAME_MAX_SIZE) < DEVICE_NAME_MAX_SIZE);
+ break;
+ }
+ }
+ }
+ ALOGD("%s : device_name = %s", __func__,device_name);
+}
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index d0260f5..4af0c04 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -129,6 +129,8 @@
char *snd_card_name;
int max_vol_index;
int max_mic_count;
+
+ void *hw_info;
};
static int pcm_device_table[AUDIO_USECASE_MAX][2] = {
@@ -932,7 +934,8 @@
char *snd_internal_name = NULL;
char *tmp = NULL;
char mixer_xml_file[MIXER_PATH_MAX_LENGTH]= {0};
-
+ char platform_info_file[MIXER_PATH_MAX_LENGTH]= {0};
+ struct snd_card_split *snd_split_handle = NULL;
my_data = calloc(1, sizeof(struct platform_data));
my_data->adev = adev;
@@ -941,9 +944,6 @@
set_platform_defaults(my_data);
- /* Initialize platform specific ids and/or backends*/
- platform_info_init(my_data);
-
while (snd_card_num < MAX_SND_CARD) {
adev->mixer = mixer_open(snd_card_num);
@@ -962,52 +962,89 @@
}
snd_card_name = mixer_get_name(adev->mixer);
+ my_data->hw_info = hw_info_init(snd_card_name);
- /* validate the sound card name */
- if (my_data->snd_card_name != NULL &&
- strncmp(snd_card_name, my_data->snd_card_name, MAX_SND_CARD_NAME_LEN) != 0) {
- ALOGI("%s: found valid sound card %s, but not primary sound card %s",
- __func__, snd_card_name, my_data->snd_card_name);
- retry_num = 0;
- snd_card_num++;
- continue;
- }
+ audio_extn_set_snd_card_split(snd_card_name);
+ snd_split_handle = audio_extn_get_snd_card_split();
- if ((snd_internal_name = strtok_r(snd_card_name, "-", &tmp)) != NULL) {
- /* Get the codec internal name from the sound card name
- * and form the mixer paths file name dynamically. This
- * is generic way of picking any codec name based mixer
- * files in future with no code change. This code
- * assumes mixer files are formed with format as
- * mixer_paths_internalcodecname.xml
+ /* Get the codec internal name from the sound card and/or form factor
+ * name and form the mixer paths and platfor info file name dynamically.
+ * This is generic way of picking any codec and forma factor name based
+ * mixer and platform info files in future with no code change.
- * If this dynamically read mixer files fails to open then it
- * falls back to default mixer file i.e mixer_paths.xml. This is
- * done to preserve backward compatibility but not mandatory as
- * long as the mixer files are named as per above assumption.
- */
+ * current code extends and looks for any of the exteneded mixer path and
+ * platform info file present based on codec and form factor.
- if ((snd_internal_name = strtok_r(NULL, "-", &tmp)) != NULL) {
- // need to carryforward old file name
- if (!strncmp(snd_card_name, TOMTOM_8226_SND_CARD_NAME,
+ * order of picking appropriate file is
+ * <i> mixer_paths_<codec_name>_<form_factor>.xml, if file not present
+ * <ii> mixer_paths_<codec_name>.xml, if file not present
+ * <iii> mixer_paths.xml
+
+ * same order is followed for audio_platform_info.xml as well
+ */
+
+ // need to carryforward old file name
+ if (!strncmp(snd_card_name, TOMTOM_8226_SND_CARD_NAME,
sizeof(TOMTOM_8226_SND_CARD_NAME))) {
- snprintf(mixer_xml_file, sizeof(mixer_xml_file), "%s_%s.xml",
+ snprintf(mixer_xml_file, sizeof(mixer_xml_file), "%s_%s.xml",
MIXER_XML_BASE_STRING, TOMTOM_MIXER_FILE_SUFFIX );
- } else {
- snprintf(mixer_xml_file, sizeof(mixer_xml_file), "%s_%s.xml",
- MIXER_XML_BASE_STRING, snd_internal_name);
- }
+ } else {
- if (F_OK == access(mixer_xml_file, 0)) {
- use_default_mixer_path = false;
+ snprintf(mixer_xml_file, sizeof(mixer_xml_file), "%s_%s_%s.xml",
+ MIXER_XML_BASE_STRING, snd_split_handle->snd_card,
+ snd_split_handle->form_factor);
+
+ if (F_OK != access(mixer_xml_file, 0)) {
+ memset(mixer_xml_file, 0, sizeof(mixer_xml_file));
+ snprintf(mixer_xml_file, sizeof(mixer_xml_file), "%s_%s.xml",
+ MIXER_XML_BASE_STRING, snd_split_handle->snd_card);
+
+ if (F_OK != access(mixer_xml_file, 0)) {
+ memset(mixer_xml_file, 0, sizeof(mixer_xml_file));
+ strlcpy(mixer_xml_file, MIXER_XML_DEFAULT_PATH, MIXER_PATH_MAX_LENGTH);
+ }
+ }
+
+ snprintf(platform_info_file, sizeof(platform_info_file), "%s_%s_%s.xml",
+ PLATFORM_INFO_XML_BASE_STRING, snd_split_handle->snd_card,
+ snd_split_handle->form_factor);
+
+ if (F_OK != access(platform_info_file, 0)) {
+ memset(platform_info_file, 0, sizeof(platform_info_file));
+ snprintf(platform_info_file, sizeof(platform_info_file), "%s_%s.xml",
+ PLATFORM_INFO_XML_BASE_STRING, snd_split_handle->snd_card);
+
+ if (F_OK != access(platform_info_file, 0)) {
+ memset(platform_info_file, 0, sizeof(platform_info_file));
+ strlcpy(platform_info_file, PLATFORM_INFO_XML_PATH, MIXER_PATH_MAX_LENGTH);
}
}
}
- if (use_default_mixer_path) {
- memset(mixer_xml_file, 0, sizeof(mixer_xml_file));
- strlcpy(mixer_xml_file, MIXER_XML_DEFAULT_PATH, MIXER_PATH_MAX_LENGTH);
+ /* Initialize platform specific ids and/or backends*/
+ platform_info_init(platform_info_file, my_data);
+
+ /* validate the sound card name
+ * my_data->snd_card_name can contain
+ * <a> complete sound card name, i.e. <device>-<codec>-<form_factor>-snd-card
+ * example: msm8994-tomtom-mtp-snd-card
+ * <b> or sub string of the card name, i.e. <device>-<codec>
+ * example: msm8994-tomtom
+ * so use length of my_data->snd_card_name for comparision
+ */
+
+ if (my_data->snd_card_name != NULL &&
+ strncmp(snd_card_name, my_data->snd_card_name, strlen(my_data->snd_card_name)) != 0) {
+ ALOGI("%s: found valid sound card %s, but not primary sound card %s",
+ __func__, snd_card_name, my_data->snd_card_name);
+ retry_num = 0;
+ snd_card_num++;
+ hw_info_deinit(my_data->hw_info);
+ my_data->hw_info = NULL;
+ continue;
}
+ ALOGI("%s: found sound card %s, primary sound card expeted is %s",
+ __func__, snd_card_name, my_data->snd_card_name);
ALOGD("%s: Loading mixer file: %s", __func__, mixer_xml_file);
adev->audio_route = audio_route_init(snd_card_num, mixer_xml_file);
@@ -1195,6 +1232,8 @@
struct platform_data *my_data = (struct platform_data *)platform;
close_csd_client(my_data->csd);
+ hw_info_deinit(my_data->hw_info);
+
for (dev = 0; dev < SND_DEVICE_MAX; dev++) {
if (backend_tag_table[dev])
free(backend_tag_table[dev]);
@@ -1239,6 +1278,29 @@
return "none";
}
+int platform_get_snd_device_name_extn(void *platform, snd_device_t snd_device,
+ char *device_name)
+{
+ struct platform_data *my_data = (struct platform_data *)platform;
+
+ if (platform == NULL || device_name == NULL) {
+ ALOGW("%s: something wrong, use legacy get_snd_device name", __func__);
+ device_name = platform_get_snd_device_name(snd_device);
+ } else if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX) {
+ if (operator_specific_device_table[snd_device] != NULL) {
+ strlcpy(device_name, get_operator_specific_device_mixer_path(snd_device),
+ DEVICE_NAME_MAX_SIZE);
+ } else {
+ strlcpy(device_name, device_table[snd_device], DEVICE_NAME_MAX_SIZE);
+ }
+ hw_info_append_hw_type(my_data->hw_info, snd_device, device_name);
+ } else {
+ strlcpy(device_name, "none", DEVICE_NAME_MAX_SIZE);
+ }
+
+ return 0;
+}
+
void platform_add_backend_name(void *platform, char *mixer_path,
snd_device_t snd_device)
{
diff --git a/hal/msm8974/platform.h b/hal/msm8974/platform.h
index d6c9e8e..53474f6 100644
--- a/hal/msm8974/platform.h
+++ b/hal/msm8974/platform.h
@@ -149,6 +149,9 @@
};
+#define DEVICE_NAME_MAX_SIZE 128
+#define HW_INFO_ARRAY_MAX_SIZE 32
+
#define DEFAULT_OUTPUT_SAMPLING_RATE 48000
#define ALL_SESSION_VSID 0xFFFFFFFF
@@ -303,4 +306,6 @@
get_sample_rate_t get_sample_rate;
};
+#define PLATFORM_INFO_XML_PATH "/system/etc/audio_platform_info.xml"
+#define PLATFORM_INFO_XML_BASE_STRING "/system/etc/audio_platform_info"
#endif // QCOM_AUDIO_PLATFORM_H
diff --git a/hal/platform_api.h b/hal/platform_api.h
index 1e41358..9bd55b1 100644
--- a/hal/platform_api.h
+++ b/hal/platform_api.h
@@ -20,6 +20,8 @@
void *platform_init(struct audio_device *adev);
void platform_deinit(void *platform);
const char *platform_get_snd_device_name(snd_device_t snd_device);
+int platform_get_snd_device_name_extn(void *platform, snd_device_t snd_device,
+ char *device_name);
void platform_add_backend_name(void *platform, char *mixer_path,
snd_device_t snd_device);
bool platform_send_gain_dep_cal(void *platform, int level);
@@ -69,7 +71,7 @@
const char * hw_interface);
/* From platform_info.c */
-int platform_info_init(void *);
+int platform_info_init(const char *filename, void *);
int platform_get_usecase_index(const char * usecase);
int platform_set_usecase_pcm_id(audio_usecase_t usecase, int32_t type, int32_t pcm_id);
diff --git a/hal/platform_info.c b/hal/platform_info.c
index 4556294..7432230 100644
--- a/hal/platform_info.c
+++ b/hal/platform_info.c
@@ -25,8 +25,6 @@
#include "platform_api.h"
#include <platform.h>
-#define PLATFORM_INFO_XML_PATH "/system/etc/audio_platform_info.xml"
-
typedef enum {
ROOT,
ACDB,
@@ -344,7 +342,7 @@
}
}
-int platform_info_init(void *platform)
+int platform_info_init(const char *filename, void *platform)
{
XML_Parser parser;
FILE *file;
@@ -352,13 +350,22 @@
int bytes_read;
void *buf;
static const uint32_t kBufSize = 1024;
-
+ char platform_info_file_name[MIXER_PATH_MAX_LENGTH]= {0};
section = ROOT;
- file = fopen(PLATFORM_INFO_XML_PATH, "r");
+ if (filename == NULL) {
+ strlcpy(platform_info_file_name, PLATFORM_INFO_XML_PATH, MIXER_PATH_MAX_LENGTH);
+ } else {
+ strlcpy(platform_info_file_name, filename, MIXER_PATH_MAX_LENGTH);
+ }
+
+ ALOGV("%s: platform info file name is %s", __func__, platform_info_file_name);
+
+ file = fopen(platform_info_file_name, "r");
+
if (!file) {
ALOGD("%s: Failed to open %s, using defaults.",
- __func__, PLATFORM_INFO_XML_PATH);
+ __func__, platform_info_file_name);
ret = -ENODEV;
goto done;
}
@@ -393,7 +400,7 @@
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_info_file_name);
ret = -EINVAL;
goto err_free_parser;
}