hal: Update acdb extn and platform to pass Instance ID support info
Update acdb extn and platform to pass Instance ID support info
in order to enable ACDB loader use this info and call the respective
ACDB SW APIs. Update GEF APIs to support instance ID feature.
Add a property to query the instance ID support and use that
to call ACDB loader for instance ID support.
CRs-Fixed: 2199639
Change-Id: I64b41faf23cb42ec2af1695adb8a7021cad996dc
diff --git a/hal/Android.mk b/hal/Android.mk
index 50009c4..7f2db53 100644
--- a/hal/Android.mk
+++ b/hal/Android.mk
@@ -405,6 +405,10 @@
LOCAL_SRC_FILES += audio_extn/ffv.c
endif
+ifeq ($(strip $(AUDIO_FEATURE_ENABLED_INSTANCE_ID)), true)
+ LOCAL_CFLAGS += -DINSTANCE_ID_ENABLED
+endif
+
LOCAL_CFLAGS += -Wall -Werror
LOCAL_COPY_HEADERS_TO := mm-audio
diff --git a/hal/acdb.c b/hal/acdb.c
index 4ae03e9..79ef4ae 100644
--- a/hal/acdb.c
+++ b/hal/acdb.c
@@ -28,6 +28,34 @@
#include "acdb.h"
#include "platform_api.h"
+#ifdef INSTANCE_ID_ENABLED
+int check_and_set_instance_id_support(struct mixer* mixer, bool acdb_support)
+{
+ const char *mixer_ctl_name = "Instance ID Support";
+ struct mixer_ctl* ctl;
+
+ ALOGV("%s", __func__);
+
+ /* Check for ACDB and property instance ID support and issue mixer control */
+ ctl = mixer_get_ctl_by_name(mixer, mixer_ctl_name);
+ if (!ctl) {
+ ALOGE("%s: Could not get ctl for mixer cmd - %s",
+ __func__, mixer_ctl_name);
+ return -EINVAL;
+ }
+
+ ALOGD("%s: Final Instance ID support:%d\n", __func__, acdb_support);
+ if (mixer_ctl_set_value(ctl, 0, acdb_support) < 0) {
+ ALOGE("%s: Could not set Instance ID support %d", __func__,
+ acdb_support);
+ return -EINVAL;
+ }
+ return 0;
+}
+#else
+#define check_and_set_instance_id_support(x, y) -ENOSYS
+#endif
+
int acdb_init(int snd_card_num)
{
@@ -83,6 +111,11 @@
ALOGV("%s: DLOPEN successful for %s", __func__, LIB_ACDB_LOADER);
+ my_data->acdb_init_v4 = (acdb_init_v4_t)dlsym(my_data->acdb_handle,
+ "acdb_loader_init_v4");
+ if (my_data->acdb_init_v4 == NULL)
+ ALOGE("%s: dlsym error %s for acdb_loader_init_v4", __func__, dlerror());
+
my_data->acdb_init_v3 = (acdb_init_v3_t)dlsym(my_data->acdb_handle,
"acdb_loader_init_v3");
if (my_data->acdb_init_v3 == NULL)
@@ -96,7 +129,7 @@
my_data->acdb_init = (acdb_init_t)dlsym(my_data->acdb_handle,
"acdb_loader_init_ACDB");
if (my_data->acdb_init == NULL && my_data->acdb_init_v2 == NULL
- && my_data->acdb_init_v3 == NULL) {
+ && my_data->acdb_init_v3 == NULL && my_data->acdb_init_v4 == NULL) {
ALOGE("%s: dlsym error %s for acdb_loader_init_ACDB", __func__, dlerror());
goto cleanup;
}
@@ -140,8 +173,16 @@
int key = 0;
struct listnode *node = NULL;
struct meta_key_list *key_info = NULL;
+ static bool acdb_instance_id_support = false;
- if (my_data->acdb_init_v3) {
+ my_data->acdb_init_data.cvd_version = cvd_version;
+ my_data->acdb_init_data.snd_card_name = strdup(snd_card_name);
+ my_data->acdb_init_data.meta_key_list = &my_data->acdb_meta_key_list;
+ my_data->acdb_init_data.is_instance_id_supported = &acdb_instance_id_support;
+
+ if (my_data->acdb_init_v4) {
+ result = my_data->acdb_init_v4(&my_data->acdb_init_data, ACDB_LOADER_INIT_V4);
+ } else if (my_data->acdb_init_v3) {
result = my_data->acdb_init_v3(snd_card_name, cvd_version,
&my_data->acdb_meta_key_list);
} else if (my_data->acdb_init_v2) {
@@ -152,6 +193,9 @@
} else {
result = my_data->acdb_init();
}
+ ALOGD("%s: ACDB Instance ID support after ACDB init:%d\n",
+ __func__, acdb_instance_id_support);
+ check_and_set_instance_id_support(mixer, acdb_instance_id_support);
cleanup:
if (NULL != my_data) {
diff --git a/hal/acdb.h b/hal/acdb.h
index 140370a..5e8c376 100644
--- a/hal/acdb.h
+++ b/hal/acdb.h
@@ -20,6 +20,7 @@
#ifndef ACDB_H
#define ACDB_H
+#include <stdbool.h>
#include <linux/msm_audio_calibration.h>
#define MAX_CVD_VERSION_STRING_SIZE 100
@@ -34,11 +35,19 @@
#endif
struct mixer;
+enum {
+ ACDB_LOADER_INIT_V1 = 1,
+ ACDB_LOADER_INIT_V2,
+ ACDB_LOADER_INIT_V3,
+ ACDB_LOADER_INIT_V4,
+};
+
/* Audio calibration related functions */
typedef void (*acdb_deallocate_t)();
typedef int (*acdb_init_t)();
typedef int (*acdb_init_v2_t)(const char *, char *, int);
typedef int (*acdb_init_v3_t)(const char *, char *, struct listnode *);
+typedef int (*acdb_init_v4_t)(void *, int);
typedef void (*acdb_send_audio_cal_t)(int, int, int , int);
typedef void (*acdb_send_audio_cal_v3_t)(int, int, int, int, int);
typedef void (*acdb_send_voice_cal_t)(int, int);
@@ -59,13 +68,22 @@
char name[ACDB_METAINFO_KEY_MODULE_NAME_LEN];
};
+struct acdb_init_data_v4 {
+ char *cvd_version;
+ char *snd_card_name;
+ struct listnode *meta_key_list;
+ bool *is_instance_id_supported;
+};
+
struct acdb_platform_data {
/* Audio calibration related functions */
void *acdb_handle;
acdb_init_t acdb_init;
acdb_init_v2_t acdb_init_v2;
acdb_init_v3_t acdb_init_v3;
+ acdb_init_v4_t acdb_init_v4;
struct listnode acdb_meta_key_list;
+ struct acdb_init_data_v4 acdb_init_data;
};
int acdb_init(int);
diff --git a/hal/audio_extn/audio_extn.h b/hal/audio_extn/audio_extn.h
index 0092e87..a14366d 100755
--- a/hal/audio_extn/audio_extn.h
+++ b/hal/audio_extn/audio_extn.h
@@ -798,6 +798,8 @@
#define audio_extn_gef_init(adev) (0)
#define audio_extn_gef_deinit() (0)
#define audio_extn_gef_notify_device_config(devices, cmask, sample_rate, acdb_id) (0)
+
+#ifndef INSTANCE_ID_ENABLED
#define audio_extn_gef_send_audio_cal(dev, acdb_dev_id, acdb_device_type,\
app_type, topology_id, sample_rate, module_id, param_id, data, length, persist) (0)
#define audio_extn_gef_get_audio_cal(adev, acdb_dev_id, acdb_device_type,\
@@ -806,6 +808,20 @@
app_type, topology_id, sample_rate, module_id, param_id, data, length) (0)
#define audio_extn_gef_retrieve_audio_cal(adev, acdb_dev_id, acdb_device_type,\
app_type, topology_id, sample_rate, module_id, param_id, data, length) (0)
+#else
+#define audio_extn_gef_send_audio_cal(dev, acdb_dev_id, acdb_device_type,\
+ app_type, topology_id, sample_rate, module_id, instance_id, param_id, data,\
+ length, persist) (0)
+#define audio_extn_gef_get_audio_cal(adev, acdb_dev_id, acdb_device_type,\
+ app_type, topology_id, sample_rate, module_id, instance_id, param_id, data,\
+ length, persist) (0)
+#define audio_extn_gef_store_audio_cal(adev, acdb_dev_id, acdb_device_type,\
+ app_type, topology_id, sample_rate, module_id, instance_id, param_id, data,\
+ length) (0)
+#define audio_extn_gef_retrieve_audio_cal(adev, acdb_dev_id, acdb_device_type,\
+ app_type, topology_id, sample_rate, module_id, instance_id, param_id, data,\
+ length) (0)
+#endif
#else
@@ -814,18 +830,33 @@
void audio_extn_gef_notify_device_config(audio_devices_t audio_device,
audio_channel_mask_t channel_mask, int sample_rate, int acdb_id);
+#ifndef INSTANCE_ID_ENABLED
int audio_extn_gef_send_audio_cal(void* adev, int acdb_dev_id, int acdb_device_type,
- int app_type, int topology_id, int sample_rate, uint32_t module_id, uint32_t param_id,
- void* data, int length, bool persist);
+ int app_type, int topology_id, int sample_rate, uint32_t module_id,
+ uint32_t param_id, void* data, int length, bool persist);
int audio_extn_gef_get_audio_cal(void* adev, int acdb_dev_id, int acdb_device_type,
- int app_type, int topology_id, int sample_rate, uint32_t module_id, uint32_t param_id,
- void* data, int* length, bool persist);
+ int app_type, int topology_id, int sample_rate, uint32_t module_id,
+ uint32_t param_id, void* data, int* length, bool persist);
int audio_extn_gef_store_audio_cal(void* adev, int acdb_dev_id, int acdb_device_type,
- int app_type, int topology_id, int sample_rate, uint32_t module_id, uint32_t param_id,
- void* data, int length);
+ int app_type, int topology_id, int sample_rate, uint32_t module_id,
+ uint32_t param_id, void* data, int length);
int audio_extn_gef_retrieve_audio_cal(void* adev, int acdb_dev_id, int acdb_device_type,
- int app_type, int topology_id, int sample_rate, uint32_t module_id, uint32_t param_id,
- void* data, int* length);
+ int app_type, int topology_id, int sample_rate, uint32_t module_id,
+ uint32_t param_id, void* data, int* length);
+#else
+int audio_extn_gef_send_audio_cal(void* adev, int acdb_dev_id, int acdb_device_type,
+ int app_type, int topology_id, int sample_rate, uint32_t module_id,
+ uint16_t instance_id, uint32_t param_id, void* data, int length, bool persist);
+int audio_extn_gef_get_audio_cal(void* adev, int acdb_dev_id, int acdb_device_type,
+ int app_type, int topology_id, int sample_rate, uint32_t module_id,
+ uint16_t instance_id, uint32_t param_id, void* data, int* length, bool persist);
+int audio_extn_gef_store_audio_cal(void* adev, int acdb_dev_id, int acdb_device_type,
+ int app_type, int topology_id, int sample_rate, uint32_t module_id,
+ uint16_t instance_id, uint32_t param_id, void* data, int length);
+int audio_extn_gef_retrieve_audio_cal(void* adev, int acdb_dev_id, int acdb_device_type,
+ int app_type, int topology_id, int sample_rate, uint32_t module_id,
+ uint16_t instance_id, uint32_t param_id, void* data, int* length);
+#endif
#endif /* AUDIO_GENERIC_EFFECT_FRAMEWORK_ENABLED */
diff --git a/hal/audio_extn/gef.c b/hal/audio_extn/gef.c
index 4525f08..7f82a8a 100644
--- a/hal/audio_extn/gef.c
+++ b/hal/audio_extn/gef.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2016-2018, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
@@ -170,25 +170,31 @@
}
+#ifdef INSTANCE_ID_ENABLED
//this will be called from GEF to exchange calibration using acdb
int audio_extn_gef_send_audio_cal(void* dev, int acdb_dev_id,
int gef_cal_type, int app_type, int topology_id, int sample_rate,
- uint32_t module_id, uint32_t param_id, void* data, int length, bool persist)
+ uint32_t module_id, uint16_t instance_id, uint32_t param_id,
+ void* data, int length, bool persist)
{
int ret = 0;
struct audio_device *adev = (struct audio_device*)dev;
+ acdb_audio_cal_cfg_t cal;
int acdb_device_type =
make_acdb_device_type_from_gef_cal_type(gef_cal_type);
ALOGV("%s: Enter", __func__);
+ memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
//lock adev
pthread_mutex_lock(&adev->lock);
- //send cal
- ret = platform_send_audio_cal(adev->platform, acdb_dev_id,
+ //pack cal
+ platform_make_cal_cfg(&cal, acdb_dev_id,
acdb_device_type, app_type, topology_id, sample_rate,
- module_id, param_id, data, length, persist);
+ module_id, instance_id, param_id, true);
+
+ ret = platform_send_audio_cal(adev->platform, &cal, data, length, persist);
pthread_mutex_unlock(&adev->lock);
@@ -200,21 +206,154 @@
//this will be called from GEF to exchange calibration using acdb
int audio_extn_gef_get_audio_cal(void* dev, int acdb_dev_id,
int gef_cal_type, int app_type, int topology_id, int sample_rate,
- uint32_t module_id, uint32_t param_id, void* data, int* length, bool persist)
+ uint32_t module_id, uint16_t instance_id, uint32_t param_id,
+ void* data, int* length, bool persist)
{
int ret = 0;
struct audio_device *adev = (struct audio_device*)dev;
+ acdb_audio_cal_cfg_t cal;
int acdb_device_type =
make_acdb_device_type_from_gef_cal_type(gef_cal_type);
ALOGV("%s: Enter", __func__);
+ memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
//lock adev
pthread_mutex_lock(&adev->lock);
- ret = platform_get_audio_cal(adev->platform, acdb_dev_id,
+ //pack cal
+ platform_make_cal_cfg(&cal, acdb_dev_id,
acdb_device_type, app_type, topology_id, sample_rate,
- module_id, param_id, data, length, persist);
+ module_id, instance_id, param_id, false);
+
+ ret = platform_get_audio_cal(adev->platform, &cal, data, length, persist);
+
+ pthread_mutex_unlock(&adev->lock);
+
+ ALOGV("%s: Exit with error %d", __func__, ret);
+
+ return ret;
+}
+
+//this will be called from GEF to store into acdb
+int audio_extn_gef_store_audio_cal(void* dev, int acdb_dev_id,
+ int gef_cal_type, int app_type, int topology_id, int sample_rate,
+ uint32_t module_id, uint16_t instance_id,
+ uint32_t param_id, void* data, int length)
+{
+ int ret = 0;
+ struct audio_device *adev = (struct audio_device*)dev;
+ acdb_audio_cal_cfg_t cal;
+ int acdb_device_type =
+ make_acdb_device_type_from_gef_cal_type(gef_cal_type);
+
+ ALOGV("%s: Enter", __func__);
+ memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
+
+ //lock adev
+ pthread_mutex_lock(&adev->lock);
+
+ //pack cal
+ platform_make_cal_cfg(&cal, acdb_dev_id,
+ acdb_device_type, app_type, topology_id, sample_rate,
+ module_id, instance_id, param_id, true);
+
+ ret = platform_store_audio_cal(adev->platform, &cal, data, length);
+
+ pthread_mutex_unlock(&adev->lock);
+
+ ALOGV("%s: Exit with error %d", __func__, ret);
+
+ return ret;
+}
+
+//this will be called from GEF to retrieve calibration using acdb
+int audio_extn_gef_retrieve_audio_cal(void* dev, int acdb_dev_id,
+ int gef_cal_type, int app_type, int topology_id, int sample_rate,
+ uint32_t module_id, uint16_t instance_id, uint32_t param_id, void* data, int* length)
+{
+ int ret = 0;
+ struct audio_device *adev = (struct audio_device*)dev;
+ acdb_audio_cal_cfg_t cal;
+ int acdb_device_type =
+ make_acdb_device_type_from_gef_cal_type(gef_cal_type);
+
+ ALOGV("%s: Enter", __func__);
+ memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
+
+ //lock adev
+ pthread_mutex_lock(&adev->lock);
+
+ //pack cal
+ platform_make_cal_cfg(&cal, acdb_dev_id,
+ acdb_device_type, app_type, topology_id, sample_rate,
+ module_id, instance_id, param_id, true);
+
+ ret = platform_retrieve_audio_cal(adev->platform, &cal, data, length);
+
+ pthread_mutex_unlock(&adev->lock);
+
+ ALOGV("%s: Exit with error %d", __func__, ret);
+
+ return ret;
+}
+#else
+//this will be called from GEF to exchange calibration using acdb
+int audio_extn_gef_send_audio_cal(void* dev, int acdb_dev_id,
+ int gef_cal_type, int app_type, int topology_id, int sample_rate,
+ uint32_t module_id, uint32_t param_id, void* data, int length,
+ bool persist)
+{
+ int ret = 0;
+ struct audio_device *adev = (struct audio_device*)dev;
+ acdb_audio_cal_cfg_t cal;
+ int acdb_device_type =
+ make_acdb_device_type_from_gef_cal_type(gef_cal_type);
+
+ ALOGV("%s: Enter", __func__);
+ memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
+
+ //lock adev
+ pthread_mutex_lock(&adev->lock);
+
+ //pack cal
+ platform_make_cal_cfg(&cal, acdb_dev_id,
+ acdb_device_type, app_type, topology_id, sample_rate,
+ module_id, param_id, true);
+
+ ret = platform_send_audio_cal(adev->platform, &cal, data, length, persist);
+
+ pthread_mutex_unlock(&adev->lock);
+
+ ALOGV("%s: Exit with error %d", __func__, ret);
+
+ return ret;
+}
+
+//this will be called from GEF to exchange calibration using acdb
+int audio_extn_gef_get_audio_cal(void* dev, int acdb_dev_id,
+ int gef_cal_type, int app_type, int topology_id, int sample_rate,
+ uint32_t module_id, uint32_t param_id, void* data, int* length,
+ bool persist)
+{
+ int ret = 0;
+ struct audio_device *adev = (struct audio_device*)dev;
+ acdb_audio_cal_cfg_t cal;
+ int acdb_device_type =
+ make_acdb_device_type_from_gef_cal_type(gef_cal_type);
+
+ ALOGV("%s: Enter", __func__);
+ memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
+
+ //lock adev
+ pthread_mutex_lock(&adev->lock);
+
+ //pack cal
+ platform_make_cal_cfg(&cal, acdb_dev_id,
+ acdb_device_type, app_type, topology_id, sample_rate,
+ module_id, param_id, false);
+
+ ret = platform_get_audio_cal(adev->platform, &cal, data, length, persist);
pthread_mutex_unlock(&adev->lock);
@@ -230,17 +369,22 @@
{
int ret = 0;
struct audio_device *adev = (struct audio_device*)dev;
+ acdb_audio_cal_cfg_t cal;
int acdb_device_type =
make_acdb_device_type_from_gef_cal_type(gef_cal_type);
ALOGV("%s: Enter", __func__);
+ memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
//lock adev
pthread_mutex_lock(&adev->lock);
- ret = platform_store_audio_cal(adev->platform, acdb_dev_id,
+ //pack cal
+ platform_make_cal_cfg(&cal, acdb_dev_id,
acdb_device_type, app_type, topology_id, sample_rate,
- module_id, param_id, data, length);
+ module_id, param_id, true);
+
+ ret = platform_store_audio_cal(adev->platform, &cal, data, length);
pthread_mutex_unlock(&adev->lock);
@@ -256,17 +400,22 @@
{
int ret = 0;
struct audio_device *adev = (struct audio_device*)dev;
+ acdb_audio_cal_cfg_t cal;
int acdb_device_type =
make_acdb_device_type_from_gef_cal_type(gef_cal_type);
ALOGV("%s: Enter", __func__);
+ memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
//lock adev
pthread_mutex_lock(&adev->lock);
- ret = platform_retrieve_audio_cal(adev->platform, acdb_dev_id,
+ //pack cal
+ platform_make_cal_cfg(&cal, acdb_dev_id,
acdb_device_type, app_type, topology_id, sample_rate,
- module_id, param_id, data, length);
+ module_id, param_id, true);
+
+ ret = platform_retrieve_audio_cal(adev->platform, &cal, data, length);
pthread_mutex_unlock(&adev->lock);
@@ -274,6 +423,7 @@
return ret;
}
+#endif
//this will be called from HAL to notify GEF of new device configuration
void audio_extn_gef_notify_device_config(audio_devices_t audio_device,
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index e6af9e0..e4dbd10 100755
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -209,19 +209,6 @@
int length;
};
-typedef struct acdb_audio_cal_cfg {
- uint32_t persist;
- uint32_t snd_dev_id;
- audio_devices_t dev_id;
- int32_t acdb_dev_id;
- uint32_t app_type;
- uint32_t topo_id;
- uint32_t sampling_rate;
- uint32_t cal_type;
- uint32_t module_id;
- uint32_t param_id;
-} acdb_audio_cal_cfg_t;
-
enum {
CAL_MODE_SEND = 0x1,
CAL_MODE_PERSIST = 0x2,
@@ -275,6 +262,7 @@
int voice_feature_set;
acdb_init_t acdb_init;
acdb_init_v3_t acdb_init_v3;
+ acdb_init_v4_t acdb_init_v4;
acdb_deallocate_t acdb_deallocate;
acdb_send_audio_cal_t acdb_send_audio_cal;
acdb_send_audio_cal_v3_t acdb_send_audio_cal_v3;
@@ -307,6 +295,7 @@
bool is_dsd_supported;
bool is_asrc_supported;
struct listnode acdb_meta_key_list;
+ struct acdb_init_data_v4 acdb_init_data;
bool use_generic_handset;
struct spkr_device_chmap *spkr_ch_map;
};
@@ -1978,7 +1967,12 @@
snd_card_name = mixer_get_name(my_data->adev->mixer);
snd_card_name = platform_get_snd_card_name_for_acdb_loader(snd_card_name);
- if (my_data->acdb_init_v3) {
+ my_data->acdb_init_data.cvd_version = cvd_version;
+ my_data->acdb_init_data.snd_card_name = strdup(snd_card_name);
+ my_data->acdb_init_data.meta_key_list = &my_data->acdb_meta_key_list;
+ if (my_data->acdb_init_v4) {
+ result = my_data->acdb_init_v4(&my_data->acdb_init_data, ACDB_LOADER_INIT_V4);
+ } else if (my_data->acdb_init_v3) {
result = my_data->acdb_init_v3(snd_card_name, cvd_version,
&my_data->acdb_meta_key_list);
} else if (my_data->acdb_init) {
@@ -2461,6 +2455,12 @@
ALOGV("%s: Could not find the symbol acdb_loader_send_gain_dep_cal from %s",
__func__, LIB_ACDB_LOADER);
+ my_data->acdb_init_v4 = (acdb_init_v4_t)dlsym(my_data->acdb_handle,
+ "acdb_loader_init_v4");
+ if (my_data->acdb_init_v4 == NULL) {
+ ALOGE("%s: dlsym error %s for acdb_loader_init_v4", __func__, dlerror());
+ }
+
my_data->acdb_init_v3 = (acdb_init_v3_t)dlsym(my_data->acdb_handle,
"acdb_loader_init_v3");
if (my_data->acdb_init_v3 == NULL) {
@@ -4993,11 +4993,19 @@
cal->module_id = (uint32_t) strtoul(value, NULL, 0);
ret = ret | 0x80;
}
+#ifdef INSTANCE_ID_ENABLED
+ err = str_parms_get_str(parms, "cal_instanceid", value, sizeof(value));
+ if (err >= 0) {
+ str_parms_del(parms, "cal_instanceid");
+ cal->instance_id = (uint32_t) strtoul(value, NULL, 0);
+ ret = ret | 0x100;
+ }
+#endif
err = str_parms_get_str(parms, "cal_paramid", value, sizeof(value));
if (err >= 0) {
str_parms_del(parms, "cal_paramid");
cal->param_id = (uint32_t) strtoul(value, NULL, 0);
- ret = ret | 0x100;
+ ret = ret | 0x200;
}
return ret;
}
@@ -7808,7 +7816,37 @@
return;
}
-static void make_cal_cfg(acdb_audio_cal_cfg_t* cal, int acdb_dev_id,
+#ifdef INSTANCE_ID_ENABLED
+void platform_make_cal_cfg(acdb_audio_cal_cfg_t* cal, int acdb_dev_id,
+ int acdb_device_type, int app_type, int topology_id,
+ int sample_rate, uint32_t module_id, uint16_t instance_id,
+ uint32_t param_id, bool persist)
+{
+ int persist_send_flags = 1;
+
+ if (!cal) {
+ return;
+ }
+
+ if (persist)
+ persist_send_flags |= 0x2;
+
+ memset(cal, 0, sizeof(acdb_audio_cal_cfg_t));
+
+ cal->persist = persist;
+ cal->app_type = app_type;
+ cal->acdb_dev_id = acdb_dev_id;
+ cal->sampling_rate = sample_rate;
+ cal->topo_id = topology_id;
+ //if module and param id is set to 0, the whole blob will be stored
+ //or sent to the DSP
+ cal->module_id = module_id;
+ cal->instance_id = instance_id;
+ cal->param_id = param_id;
+ cal->cal_type = acdb_device_type;
+}
+#else
+void platform_make_cal_cfg(acdb_audio_cal_cfg_t* cal, int acdb_dev_id,
int acdb_device_type, int app_type, int topology_id,
int sample_rate, uint32_t module_id, uint32_t param_id, bool persist)
{
@@ -7833,27 +7871,20 @@
cal->module_id = module_id;
cal->param_id = param_id;
cal->cal_type = acdb_device_type;
- cal->persist = persist;
-
}
+#endif
-int platform_send_audio_cal(void* platform, int acdb_dev_id,
- int acdb_device_type, int app_type, int topology_id, int sample_rate,
- uint32_t module_id, uint32_t param_id, void* data, int length, bool persist)
+int platform_send_audio_cal(void* platform, acdb_audio_cal_cfg_t* cal,
+ void* data, int length, bool persist)
{
int ret = 0;
struct platform_data *my_data = (struct platform_data *)platform;
- acdb_audio_cal_cfg_t cal;
- memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
if (!my_data) {
ret = -EINVAL;
goto ERROR_RETURN;
}
- make_cal_cfg(&cal, acdb_dev_id, acdb_device_type, app_type, topology_id,
- sample_rate, module_id, param_id, true);
-
if (my_data->acdb_set_audio_cal) {
// persist audio cal in local cache
if (persist) {
@@ -7861,7 +7892,7 @@
}
// send audio cal to dsp
if (ret == 0) {
- cal.persist = false;
+ cal->persist = false;
ret = my_data->acdb_set_audio_cal((void*)&cal, data, (uint32_t)length);
if (persist && (ret != 0)) {
ALOGV("[%s] audio cal stored with success, ignore set cal failure", __func__);
@@ -7874,30 +7905,23 @@
return ret;
}
-int platform_get_audio_cal(void* platform, int acdb_dev_id,
- int acdb_device_type, int app_type, int topology_id,
- int sample_rate, uint32_t module_id, uint32_t param_id,
+int platform_get_audio_cal(void* platform, acdb_audio_cal_cfg_t* cal,
void* data, int* length, bool persist)
{
int ret = 0;
struct platform_data *my_data = (struct platform_data *)platform;
- acdb_audio_cal_cfg_t cal;
- memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
if (!my_data) {
ret = -EINVAL;
goto ERROR_RETURN;
}
- make_cal_cfg(&cal, acdb_dev_id, acdb_device_type, app_type, topology_id,
- sample_rate, module_id, param_id, false);
-
if (my_data->acdb_get_audio_cal) {
// get cal from dsp
ret = my_data->acdb_get_audio_cal((void*)&cal, data, (uint32_t*)length);
// get cached cal if prevoius attempt fails and persist flag is set
if ((ret != 0) && persist) {
- cal.persist = true;
+ cal->persist = true;
ret = my_data->acdb_get_audio_cal((void*)&cal, data, (uint32_t*)length);
}
}
@@ -7906,24 +7930,17 @@
return ret;
}
-int platform_store_audio_cal(void* platform, int acdb_dev_id,
- int acdb_device_type, int app_type, int topology_id,
- int sample_rate, uint32_t module_id, uint32_t param_id,
+int platform_store_audio_cal(void* platform, acdb_audio_cal_cfg_t* cal,
void* data, int length)
{
int ret = 0;
struct platform_data *my_data = (struct platform_data *)platform;
- acdb_audio_cal_cfg_t cal;
- memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
if (!my_data) {
ret = -EINVAL;
goto ERROR_RETURN;
}
- make_cal_cfg(&cal, acdb_dev_id, acdb_device_type, app_type, topology_id,
- sample_rate, module_id, param_id, true);
-
if (my_data->acdb_set_audio_cal) {
ret = my_data->acdb_set_audio_cal((void*)&cal, data, (uint32_t)length);
}
@@ -7932,24 +7949,17 @@
return ret;
}
-int platform_retrieve_audio_cal(void* platform, int acdb_dev_id,
- int acdb_device_type, int app_type, int topology_id,
- int sample_rate, uint32_t module_id, uint32_t param_id,
+int platform_retrieve_audio_cal(void* platform, acdb_audio_cal_cfg_t* cal,
void* data, int* length)
{
int ret = 0;
struct platform_data *my_data = (struct platform_data *)platform;
- acdb_audio_cal_cfg_t cal;
- memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
if (!my_data) {
ret = -EINVAL;
goto ERROR_RETURN;
}
- make_cal_cfg(&cal, acdb_dev_id, acdb_device_type, app_type, topology_id,
- sample_rate, module_id, param_id, true);
-
if (my_data->acdb_get_audio_cal) {
ret = my_data->acdb_get_audio_cal((void*)&cal, data, (uint32_t*)length);
}
diff --git a/hal/msm8960/platform.c b/hal/msm8960/platform.c
index f4132c2..442263e 100755
--- a/hal/msm8960/platform.c
+++ b/hal/msm8960/platform.c
@@ -1260,30 +1260,21 @@
}
int platform_send_audio_cal(void* platform __unused,
- int acdb_dev_id __unused, int acdb_device_type __unused,
- int app_type __unused, int topology_id __unused,
- int sample_rate __unused, uint32_t module_id,
- uint32_t param_id, void* data __unused,
+ acdb_audio_cal_cfg_t* cal __unused, void* data __unused,
int length __unused, bool persist __unused)
{
return -ENOSYS;
}
int platform_get_audio_cal(void* platform __unused,
- int acdb_dev_id __unused, int acdb_device_type __unused,
- int app_type __unused, int topology_id __unused,
- int sample_rate __unused, uint32_t module_id,
- uint32_t param_id, void* data __unused,
+ acdb_audio_cal_cfg_t* cal __unused, void* data __unused,
int* length __unused, bool persist __unused)
{
return -ENOSYS;
}
int platform_store_audio_cal(void* platform __unused,
- int acdb_dev_id __unused, int acdb_device_type __unused,
- int app_type __unused, int topology_id __unused,
- int sample_rate __unused, uint32_t module_id,
- uint32_t param_id, void* data __unused,
+ acdb_audio_cal_cfg_t* cal __unused, void* data __unused,
int length __unused)
{
return -ENOSYS;
@@ -1291,10 +1282,7 @@
int platform_retrieve_audio_cal(void* platform __unused,
- int acdb_dev_id __unused, int acdb_device_type __unused,
- int app_type __unused, int topology_id __unused,
- int sample_rate __unused, uint32_t module_id,
- uint32_t param_id, void* data __unused,
+ acdb_audio_cal_cfg_t* cal __unused, void* data __unused,
int* length __unused)
{
return -ENOSYS;
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index d92b9d4..115ea82 100755
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -185,19 +185,6 @@
int length;
};
-typedef struct acdb_audio_cal_cfg {
- uint32_t persist;
- uint32_t snd_dev_id;
- audio_devices_t dev_id;
- int32_t acdb_dev_id;
- uint32_t app_type;
- uint32_t topo_id;
- uint32_t sampling_rate;
- uint32_t cal_type;
- uint32_t module_id;
- uint32_t param_id;
-} acdb_audio_cal_cfg_t;
-
enum {
CAL_MODE_SEND = 0x1,
CAL_MODE_PERSIST = 0x2,
@@ -254,6 +241,7 @@
int voice_feature_set;
acdb_init_t acdb_init;
acdb_init_v3_t acdb_init_v3;
+ acdb_init_v4_t acdb_init_v4;
acdb_deallocate_t acdb_deallocate;
acdb_send_audio_cal_t acdb_send_audio_cal;
acdb_send_audio_cal_v3_t acdb_send_audio_cal_v3;
@@ -283,6 +271,7 @@
bool is_dsd_supported;
bool is_asrc_supported;
struct listnode acdb_meta_key_list;
+ struct acdb_init_data_v4 acdb_init_data;
bool use_generic_handset;
struct spkr_device_chmap *spkr_ch_map;
};
@@ -1794,7 +1783,12 @@
snd_card_name = mixer_get_name(my_data->adev->mixer);
snd_card_name = platform_get_snd_card_name_for_acdb_loader(snd_card_name);
- if (my_data->acdb_init_v3) {
+ my_data->acdb_init_data.cvd_version = cvd_version;
+ my_data->acdb_init_data.snd_card_name = strdup(snd_card_name);
+ my_data->acdb_init_data.meta_key_list = &my_data->acdb_meta_key_list;
+ if (my_data->acdb_init_v4) {
+ result = my_data->acdb_init_v4(&my_data->acdb_init_data, ACDB_LOADER_INIT_V4);
+ } else if (my_data->acdb_init_v3) {
result = my_data->acdb_init_v3(snd_card_name, cvd_version,
&my_data->acdb_meta_key_list);
} else if (my_data->acdb_init) {
@@ -2242,6 +2236,12 @@
__func__, LIB_ACDB_LOADER);
+ my_data->acdb_init_v4 = (acdb_init_v4_t)dlsym(my_data->acdb_handle,
+ "acdb_loader_init_v4");
+ if (my_data->acdb_init_v4 == NULL) {
+ ALOGE("%s: dlsym error %s for acdb_loader_init_v4", __func__, dlerror());
+ }
+
my_data->acdb_init_v3 = (acdb_init_v3_t)dlsym(my_data->acdb_handle,
"acdb_loader_init_v3");
if (my_data->acdb_init_v3 == NULL) {
@@ -4823,11 +4823,19 @@
cal->module_id = (uint32_t) strtoul(value, NULL, 0);
ret = ret | 0x80;
}
+#ifdef INSTANCE_ID_ENABLED
+ err = str_parms_get_str(parms, "cal_instanceid", value, sizeof(value));
+ if (err >= 0) {
+ str_parms_del(parms, "cal_instanceid");
+ cal->instance_id = (uint32_t) strtoul(value, NULL, 0);
+ ret = ret | 0x100;
+ }
+#endif
err = str_parms_get_str(parms, "cal_paramid", value, sizeof(value));
if (err >= 0) {
str_parms_del(parms, "cal_paramid");
cal->param_id = (uint32_t) strtoul(value, NULL, 0);
- ret = ret | 0x100;
+ ret = ret | 0x200;
}
return ret;
}
@@ -7574,7 +7582,37 @@
return;
}
-static void make_cal_cfg(acdb_audio_cal_cfg_t* cal, int acdb_dev_id,
+#ifdef INSTANCE_ID_ENABLED
+void platform_make_cal_cfg(acdb_audio_cal_cfg_t* cal, int acdb_dev_id,
+ int acdb_device_type, int app_type, int topology_id,
+ int sample_rate, uint32_t module_id, uint16_t instance_id,
+ uint32_t param_id, bool persist)
+{
+ int persist_send_flags = 1;
+
+ if (!cal) {
+ return;
+ }
+
+ if (persist)
+ persist_send_flags |= 0x2;
+
+ memset(cal, 0, sizeof(acdb_audio_cal_cfg_t));
+
+ cal->persist = persist;
+ cal->app_type = app_type;
+ cal->acdb_dev_id = acdb_dev_id;
+ cal->sampling_rate = sample_rate;
+ cal->topo_id = topology_id;
+ //if module and param id is set to 0, the whole blob will be stored
+ //or sent to the DSP
+ cal->module_id = module_id;
+ cal->instance_id = instance_id;
+ cal->param_id = param_id;
+ cal->cal_type = acdb_device_type;
+}
+#else
+void platform_make_cal_cfg(acdb_audio_cal_cfg_t* cal, int acdb_dev_id,
int acdb_device_type, int app_type, int topology_id,
int sample_rate, uint32_t module_id, uint32_t param_id, bool persist)
{
@@ -7599,27 +7637,20 @@
cal->module_id = module_id;
cal->param_id = param_id;
cal->cal_type = acdb_device_type;
- cal->persist = persist;
-
}
+#endif
-int platform_send_audio_cal(void* platform, int acdb_dev_id,
- int acdb_device_type, int app_type, int topology_id, int sample_rate,
- uint32_t module_id, uint32_t param_id, void* data, int length, bool persist)
+int platform_send_audio_cal(void* platform, acdb_audio_cal_cfg_t* cal,
+ void* data, int length, bool persist)
{
int ret = 0;
struct platform_data *my_data = (struct platform_data *)platform;
- acdb_audio_cal_cfg_t cal;
- memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
if (!my_data) {
ret = -EINVAL;
goto ERROR_RETURN;
}
- make_cal_cfg(&cal, acdb_dev_id, acdb_device_type, app_type, topology_id,
- sample_rate, module_id, param_id, true);
-
if (my_data->acdb_set_audio_cal) {
// persist audio cal in local cache
if (persist) {
@@ -7627,7 +7658,7 @@
}
// send audio cal to dsp
if (ret == 0) {
- cal.persist = false;
+ cal->persist = false;
ret = my_data->acdb_set_audio_cal((void*)&cal, data, (uint32_t)length);
if (persist && (ret != 0)) {
ALOGV("[%s] audio cal stored with success, ignore set cal failure", __func__);
@@ -7640,30 +7671,23 @@
return ret;
}
-int platform_get_audio_cal(void* platform, int acdb_dev_id,
- int acdb_device_type, int app_type, int topology_id,
- int sample_rate, uint32_t module_id, uint32_t param_id,
+int platform_get_audio_cal(void* platform, acdb_audio_cal_cfg_t* cal,
void* data, int* length, bool persist)
{
int ret = 0;
struct platform_data *my_data = (struct platform_data *)platform;
- acdb_audio_cal_cfg_t cal;
- memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
if (!my_data) {
ret = -EINVAL;
goto ERROR_RETURN;
}
- make_cal_cfg(&cal, acdb_dev_id, acdb_device_type, app_type, topology_id,
- sample_rate, module_id, param_id, false);
-
if (my_data->acdb_get_audio_cal) {
// get cal from dsp
ret = my_data->acdb_get_audio_cal((void*)&cal, data, (uint32_t*)length);
// get cached cal if prevoius attempt fails and persist flag is set
if ((ret != 0) && persist) {
- cal.persist = true;
+ cal->persist = true;
ret = my_data->acdb_get_audio_cal((void*)&cal, data, (uint32_t*)length);
}
}
@@ -7672,24 +7696,17 @@
return ret;
}
-int platform_store_audio_cal(void* platform, int acdb_dev_id,
- int acdb_device_type, int app_type, int topology_id,
- int sample_rate, uint32_t module_id, uint32_t param_id,
+int platform_store_audio_cal(void* platform, acdb_audio_cal_cfg_t* cal,
void* data, int length)
{
int ret = 0;
struct platform_data *my_data = (struct platform_data *)platform;
- acdb_audio_cal_cfg_t cal;
- memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
if (!my_data) {
ret = -EINVAL;
goto ERROR_RETURN;
}
- make_cal_cfg(&cal, acdb_dev_id, acdb_device_type, app_type, topology_id,
- sample_rate, module_id, param_id, true);
-
if (my_data->acdb_set_audio_cal) {
ret = my_data->acdb_set_audio_cal((void*)&cal, data, (uint32_t)length);
}
@@ -7698,24 +7715,17 @@
return ret;
}
-int platform_retrieve_audio_cal(void* platform, int acdb_dev_id,
- int acdb_device_type, int app_type, int topology_id,
- int sample_rate, uint32_t module_id, uint32_t param_id,
+int platform_retrieve_audio_cal(void* platform, acdb_audio_cal_cfg_t* cal,
void* data, int* length)
{
int ret = 0;
struct platform_data *my_data = (struct platform_data *)platform;
- acdb_audio_cal_cfg_t cal;
- memset(&cal, 0, sizeof(acdb_audio_cal_cfg_t));
if (!my_data) {
ret = -EINVAL;
goto ERROR_RETURN;
}
- make_cal_cfg(&cal, acdb_dev_id, acdb_device_type, app_type, topology_id,
- sample_rate, module_id, param_id, true);
-
if (my_data->acdb_get_audio_cal) {
ret = my_data->acdb_get_audio_cal((void*)&cal, data, (uint32_t*)length);
}
diff --git a/hal/platform_api.h b/hal/platform_api.h
index 2bacf6d..09c69de 100755
--- a/hal/platform_api.h
+++ b/hal/platform_api.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2017, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2018, The Linux Foundation. All rights reserved.
* Not a contribution.
*
* Copyright (C) 2013 The Android Open Source Project
@@ -73,6 +73,23 @@
char be_name[BE_DAI_NAME_MAX_LENGTH];
};
+typedef struct acdb_audio_cal_cfg {
+ uint32_t persist;
+ uint32_t snd_dev_id;
+ audio_devices_t dev_id;
+ int32_t acdb_dev_id;
+ uint32_t app_type;
+ uint32_t topo_id;
+ uint32_t sampling_rate;
+ uint32_t cal_type;
+ uint32_t module_id;
+#ifdef INSTANCE_ID_ENABLED
+ uint16_t instance_id;
+ uint16_t reserved;
+#endif
+ uint32_t param_id;
+} acdb_audio_cal_cfg_t;
+
enum card_status_t;
void *platform_init(struct audio_device *adev);
@@ -240,20 +257,27 @@
void platform_invalidate_hdmi_config(void *platform);
void platform_invalidate_backend_config(void * platform,snd_device_t snd_device);
-int platform_send_audio_cal(void* platform, int acdb_dev_id, int acdb_device_type,
- int app_type, int topology_id, int sample_rate, uint32_t module_id, uint32_t param_id,
+#ifdef INSTANCE_ID_ENABLED
+void platform_make_cal_cfg(acdb_audio_cal_cfg_t* cal, int acdb_dev_id,
+ int acdb_device_type, int app_type, int topology_id,
+ int sample_rate, uint32_t module_id, uint16_t instance_id,
+ uint32_t param_id, bool persist);
+#else
+void platform_make_cal_cfg(acdb_audio_cal_cfg_t* cal, int acdb_dev_id,
+ int acdb_device_type, int app_type, int topology_id,
+ int sample_rate, uint32_t module_id, uint32_t param_id, bool persist);
+#endif
+
+int platform_send_audio_cal(void* platform, acdb_audio_cal_cfg_t* cal,
void* data, int length, bool persist);
-int platform_get_audio_cal(void* platform, int acdb_dev_id, int acdb_device_type,
- int app_type, int topology_id, int sample_rate, uint32_t module_id, uint32_t param_id,
+int platform_get_audio_cal(void* platform, acdb_audio_cal_cfg_t* cal,
void* data, int* length, bool persist);
-int platform_store_audio_cal(void* platform, int acdb_dev_id, int acdb_device_type,
- int app_type, int topology_id, int sample_rate, uint32_t module_id, uint32_t param_id,
+int platform_store_audio_cal(void* platform, acdb_audio_cal_cfg_t* cal,
void* data, int length);
-int platform_retrieve_audio_cal(void* platform, int acdb_dev_id, int acdb_device_type,
- int app_type, int topology_id, int sample_rate, uint32_t module_id, uint32_t param_id,
+int platform_retrieve_audio_cal(void* platform, acdb_audio_cal_cfg_t* cal,
void* data, int* length);
unsigned char* platform_get_license(void* platform, int* size);