hal: Add sound card update API
Add API to notify platform when sound card
status is changed. Use function to reinitialize
ACDB-loader or resend common custom topology.
Change-Id: I59198f0ad8412ddc0d379b0c39a7807d6e22f4f7
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 7357e51..9110fa8 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -357,7 +357,10 @@
return -ENOSYS;
pthread_mutex_lock(&adev->snd_card_status.lock);
- adev->snd_card_status.state = snd_scard_state;
+ if (adev->snd_card_status.state != snd_scard_state) {
+ adev->snd_card_status.state = snd_scard_state;
+ platform_snd_card_update(adev->platform, snd_scard_state);
+ }
pthread_mutex_unlock(&adev->snd_card_status.lock);
return 0;
@@ -3154,12 +3157,6 @@
set_snd_card_state(adev,SND_CARD_STATE_ONLINE);
//send dts hpx license if enabled
audio_extn_dts_eagle_send_lic();
- if (!platform_is_acdb_initialized(adev->platform)) {
- ret = platform_acdb_init(adev->platform);
- if(ret)
- ALOGE("acdb initialization is failed");
-
- }
}
}
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index bf3e2fe..8f31b29 100644
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -173,6 +173,7 @@
acdb_loader_get_calibration_t acdb_loader_get_calibration;
typedef int (*acdb_set_audio_cal_t) (void *, void *, uint32_t);
typedef int (*acdb_get_audio_cal_t) (void *, void *, uint32_t*);
+typedef int (*acdb_send_common_top_t) (void);
struct platform_data {
struct audio_device *adev;
@@ -202,6 +203,7 @@
acdb_send_voice_cal_t acdb_send_voice_cal;
acdb_reload_vocvoltable_t acdb_reload_vocvoltable;
acdb_get_default_app_type_t acdb_get_default_app_type;
+ acdb_send_common_top_t acdb_send_common_top;
#ifdef RECORD_PLAY_CONCURRENCY
bool rec_play_conc_set;
#endif
@@ -1178,7 +1180,7 @@
ALOGE("%s: Could not send anc cal", __FUNCTION__);
}
-int platform_acdb_init(void *platform)
+static int platform_acdb_init(void *platform)
{
struct platform_data *my_data = (struct platform_data *)platform;
char *cvd_version = NULL;
@@ -1387,6 +1389,13 @@
ALOGE("%s: Could not find the symbol acdb_get_default_app_type from %s",
__func__, LIB_ACDB_LOADER);
+ my_data->acdb_send_common_top = (acdb_send_common_top_t)dlsym(
+ my_data->acdb_handle,
+ "acdb_loader_send_common_custom_topology");
+ if (!my_data->acdb_send_common_top)
+ ALOGE("%s: Could not find the symbol acdb_get_default_app_type from %s",
+ __func__, LIB_ACDB_LOADER);
+
my_data->acdb_init = (acdb_init_t)dlsym(my_data->acdb_handle,
"acdb_loader_init_v2");
if (my_data->acdb_init == NULL) {
@@ -1482,13 +1491,27 @@
audio_extn_dap_hal_deinit();
}
-int platform_is_acdb_initialized(void *platform)
+static int platform_is_acdb_initialized(void *platform)
{
struct platform_data *my_data = (struct platform_data *)platform;
ALOGD("%s: acdb initialized %d\n", __func__, my_data->is_acdb_initialized);
return my_data->is_acdb_initialized;
}
+void platform_snd_card_update(void *platform, int snd_scard_state)
+{
+ struct platform_data *my_data = (struct platform_data *)platform;
+
+ if (snd_scard_state == SND_CARD_STATE_ONLINE) {
+ if (!platform_is_acdb_initialized(my_data)) {
+ if(platform_acdb_init(my_data))
+ ALOGE("%s: acdb initialization is failed", __func__);
+ } else if (my_data->acdb_send_common_top() < 0) {
+ ALOGD("%s: acdb did not set common topology", __func__);
+ }
+ }
+}
+
const char *platform_get_snd_device_name(snd_device_t snd_device)
{
if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX)
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index 730b19a..d9921d0 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -167,6 +167,7 @@
acdb_loader_get_calibration_t acdb_loader_get_calibration;
typedef int (*acdb_set_audio_cal_t) (void *, void *, uint32_t);
typedef int (*acdb_get_audio_cal_t) (void *, void *, uint32_t*);
+typedef int (*acdb_send_common_top_t) (void);
typedef struct codec_backend_cfg {
uint32_t sample_rate;
@@ -209,6 +210,7 @@
acdb_send_voice_cal_t acdb_send_voice_cal;
acdb_reload_vocvoltable_t acdb_reload_vocvoltable;
acdb_get_default_app_type_t acdb_get_default_app_type;
+ acdb_send_common_top_t acdb_send_common_top;
void *hw_info;
struct csd_data *csd;
@@ -1041,7 +1043,7 @@
ALOGE("%s: Could not send anc cal", __FUNCTION__);
}
-int platform_acdb_init(void *platform)
+static int platform_acdb_init(void *platform)
{
struct platform_data *my_data = (struct platform_data *)platform;
char *cvd_version = NULL;
@@ -1287,6 +1289,13 @@
ALOGE("%s: Could not find the symbol acdb_get_default_app_type from %s",
__func__, LIB_ACDB_LOADER);
+ my_data->acdb_send_common_top = (acdb_send_common_top_t)dlsym(
+ my_data->acdb_handle,
+ "acdb_loader_send_common_custom_topology");
+ if (!my_data->acdb_send_common_top)
+ ALOGE("%s: Could not find the symbol acdb_get_default_app_type from %s",
+ __func__, LIB_ACDB_LOADER);
+
my_data->acdb_init = (acdb_init_t)dlsym(my_data->acdb_handle,
"acdb_loader_init_v2");
if (my_data->acdb_init == NULL) {
@@ -1394,13 +1403,27 @@
audio_extn_dap_hal_deinit();
}
-int platform_is_acdb_initialized(void *platform)
+static int platform_is_acdb_initialized(void *platform)
{
struct platform_data *my_data = (struct platform_data *)platform;
ALOGD("%s: acdb initialized %d\n", __func__, my_data->is_acdb_initialized);
return my_data->is_acdb_initialized;
}
+void platform_snd_card_update(void *platform, int snd_scard_state)
+{
+ struct platform_data *my_data = (struct platform_data *)platform;
+
+ if (snd_scard_state == SND_CARD_STATE_ONLINE) {
+ if (!platform_is_acdb_initialized(my_data)) {
+ if(platform_acdb_init(my_data))
+ ALOGE("%s: acdb initialization is failed", __func__);
+ } else if (my_data->acdb_send_common_top() < 0) {
+ ALOGD("%s: acdb did not set common topology", __func__);
+ }
+ }
+}
+
const char *platform_get_snd_device_name(snd_device_t snd_device)
{
if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX)
diff --git a/hal/platform_api.h b/hal/platform_api.h
index 8875fcb..d9fe0c0 100644
--- a/hal/platform_api.h
+++ b/hal/platform_api.h
@@ -26,8 +26,6 @@
void *platform_init(struct audio_device *adev);
void platform_deinit(void *platform);
-int platform_is_acdb_initialized(void *platform);
-int platform_acdb_init(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);
@@ -91,6 +89,8 @@
/* From platform_info_parser.c */
int platform_info_init(const char *filename);
+void platform_snd_card_update(void *platform, int snd_scard_state);
+
struct audio_offload_info_t;
uint32_t platform_get_compress_offload_buffer_size(audio_offload_info_t* info);
uint32_t platform_get_pcm_offload_buffer_size(audio_offload_info_t* info);