hal: Add support for multiple hardware variants
- Most of the targets supports multiple hardware variants such as
MTP, CDP, Fluid, Liquid etc. The mixer paths for certain devices
may vary on some of the variants. For example, the mixer controls
for speaker device are different on msm8974 MTP and Fluid variants.
- Update audio HAL to select corresponding entry in the
mixer_paths.xml file based on HW information.
Change-Id: I060f2e6c331344dd41417c19fb688ff27a129308
Conflicts:
hal/Android.mk
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index 1734ced..1888253 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -75,7 +75,6 @@
typedef void (*acdb_send_audio_cal_t)(int, int);
typedef void (*acdb_send_voice_cal_t)(int, int);
-/* Audio calibration related functions */
struct platform_data {
struct audio_device *adev;
bool fluence_in_spkr_mode;
@@ -85,11 +84,14 @@
int btsco_sample_rate;
bool slowtalk;
+ /* Audio calibration related functions */
void *acdb_handle;
acdb_init_t acdb_init;
acdb_deallocate_t acdb_deallocate;
acdb_send_audio_cal_t acdb_send_audio_cal;
acdb_send_voice_cal_t acdb_send_voice_cal;
+
+ void *hw_info;
};
static const int pcm_device_table[AUDIO_USECASE_MAX][2] = {
@@ -204,9 +206,9 @@
[SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET] = 14,
[SND_DEVICE_OUT_TRANSMISSION_FM] = 0,
[SND_DEVICE_OUT_ANC_HEADSET] = 26,
- [SND_DEVICE_OUT_ANC_FB_HEADSET] = 26,
+ [SND_DEVICE_OUT_ANC_FB_HEADSET] = 27,
[SND_DEVICE_OUT_VOICE_ANC_HEADSET] = 26,
- [SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET] = 26,
+ [SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET] = 27,
[SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET] = 26,
[SND_DEVICE_OUT_ANC_HANDSET] = 103,
@@ -302,7 +304,8 @@
{
char value[PROPERTY_VALUE_MAX];
struct platform_data *my_data;
- int retry_num = 0, ret;
+ int retry_num = 0;
+ const char *snd_card_name;
adev->mixer = mixer_open(MIXER_CARD);
@@ -325,6 +328,12 @@
my_data = calloc(1, sizeof(struct platform_data));
+ snd_card_name = mixer_get_name(adev->mixer);
+ my_data->hw_info = hw_info_init(snd_card_name);
+ if (!my_data->hw_info) {
+ ALOGE("%s: Failed to init hardware info", __func__);
+ }
+
my_data->adev = adev;
my_data->btsco_sample_rate = SAMPLE_RATE_8KHZ;
my_data->fluence_in_spkr_mode = false;
@@ -391,6 +400,9 @@
void platform_deinit(void *platform)
{
+ struct platform_data *my_data = (struct platform_data *)platform;
+
+ hw_info_deinit(my_data->hw_info);
free(platform);
/* deinit usb */
audio_extn_usb_deinit();
@@ -404,6 +416,22 @@
return "";
}
+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 (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX) {
+ 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, "", DEVICE_NAME_MAX_SIZE);
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
void platform_add_backend_name(char *mixer_path, snd_device_t snd_device)
{
if (snd_device == SND_DEVICE_IN_BT_SCO_MIC)