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);