audio: Remove HAL, UCM dependency on acdb and csd client modules

b/6815609

- acdb and csd client modules are linked into HAL, UCM
  at compile time.
- Remove the compile time dependency by loading the modules at
  runtime.

Change-Id: Iab9684a4564e5dccd8eb6e07017959886d2f57b1
Signed-off-by: Iliyan Malchev <malchev@google.com>
diff --git a/alsa_sound/alsa_default.cpp b/alsa_sound/alsa_default.cpp
index 1754a82..fdc89da 100644
--- a/alsa_sound/alsa_default.cpp
+++ b/alsa_sound/alsa_default.cpp
@@ -24,9 +24,19 @@
 #include <linux/ioctl.h>
 #include "AudioHardwareALSA.h"
 #include <media/AudioRecord.h>
+#include <dlfcn.h>
 #ifdef QCOM_CSDCLIENT_ENABLED
 extern "C" {
 #include "csd_client.h"
+static int (*csd_disable_device)();
+static int (*csd_enable_device)(int, int, uint32_t);
+static int (*csd_volume)(int);
+static int (*csd_mic_mute)(int);
+static int (*csd_wide_voice)(uint8_t);
+static int (*csd_slow_talk)(uint8_t);
+static int (*csd_fens)(uint8_t);
+static int (*csd_start_voice)();
+static int (*csd_stop_voice)();
 }
 #endif
 
@@ -72,6 +82,9 @@
 
 static int input_source;
 #endif
+#ifdef QCOM_CSDCLIENT_ENABLED
+static void     s_set_csd_handle(void*);
+#endif
 
 static char mic_type[25];
 static char curRxUCMDevice[50];
@@ -86,12 +99,14 @@
 static int btsco_samplerate = 8000;
 static bool pflag = false;
 static ALSAUseCaseList mUseCaseList;
+static void *csd_handle;
 
 static hw_module_methods_t s_module_methods = {
     open            : s_device_open
 };
 
-extern "C" hw_module_t HAL_MODULE_INFO_SYM = {
+extern "C" {
+hw_module_t HAL_MODULE_INFO_SYM = {
     tag             : HARDWARE_MODULE_TAG,
     version_major   : 1,
     version_minor   : 0,
@@ -102,6 +117,7 @@
     dso             : 0,
     reserved        : {0,},
 };
+}
 
 static int s_device_open(const hw_module_t* module, const char* name,
         hw_device_t** device)
@@ -145,7 +161,9 @@
 #ifdef SEPERATED_AUDIO_INPUT
     dev->setInput = s_setInput;
 #endif
-
+#ifdef QCOM_CSDCLIENT_ENABLED
+    dev->setCsdHandle = s_set_csd_handle;
+#endif
     *device = &dev->common;
 
     property_get("persist.audio.handset.mic",value,"0");
@@ -420,10 +438,14 @@
 
 #ifdef QCOM_CSDCLIENT_ENABLED
     if (mode == AudioSystem::MODE_IN_CALL && platform_is_Fusion3() && (inCallDevSwitch == true)) {
-        err = csd_client_disable_device();
-        if (err < 0)
-        {
-            ALOGE("csd_client_disable_device, failed, error %d", err);
+        if (csd_disable_device == NULL) {
+            ALOGE("dlsym:Error:%s Loading csd_client_disable_device", dlerror());
+        } else {
+            err = csd_disable_device();
+            if (err < 0)
+            {
+                ALOGE("csd_client_disable_device, failed, error %d", err);
+            }
         }
     }
 #endif
@@ -537,10 +559,14 @@
 
 #ifdef QCOM_CSDCLIENT_ENABLED
         ALOGV("rx_dev_id=%d, tx_dev_id=%d\n", rx_dev_id, tx_dev_id);
-        err = csd_client_enable_device(rx_dev_id, tx_dev_id, mDevSettingsFlag);
-        if (err < 0)
-        {
-            ALOGE("csd_client_disable_device failed, error %d", err);
+        if (csd_enable_device == NULL) {
+            ALOGE("dlsym:Error:%s Loading csd_client_enable_device", dlerror());
+        } else {
+            err = csd_enable_device(rx_dev_id, tx_dev_id, mDevSettingsFlag);
+            if (err < 0)
+            {
+                ALOGE("csd_client_disable_device failed, error %d", err);
+            }
         }
 #endif
     }
@@ -875,10 +901,14 @@
 
     if (platform_is_Fusion3()) {
 #ifdef QCOM_CSDCLIENT_ENABLED
-        err = csd_client_start_voice();
-        if (err < 0) {
-            ALOGE("s_start_voice_call: csd_client error %d\n", err);
-            goto Error;
+        if (csd_start_voice == NULL) {
+            ALOGE("dlsym:Error:%s Loading csd_client_start_voice", dlerror());
+        } else {
+            err = csd_start_voice();
+            if (err < 0){
+                ALOGE("s_start_voice_call: csd_client error %d\n", err);
+                goto Error;
+            }
         }
 #endif
     }
@@ -1065,9 +1095,13 @@
              !strcmp(handle->useCase, SND_USE_CASE_MOD_PLAY_VOICE)) &&
             platform_is_Fusion3()) {
 #ifdef QCOM_CSDCLIENT_ENABLED
-            err = csd_client_stop_voice();
-            if (err < 0) {
-                ALOGE("s_close: csd_client error %d\n", err);
+            if (csd_stop_voice == NULL) {
+                ALOGE("dlsym:Error:%s Loading csd_client_disable_device", dlerror());
+            } else {
+                err = csd_stop_voice();
+                if (err < 0) {
+                    ALOGE("s_close: csd_client error %d\n", err);
+                }
             }
 #endif
         }
@@ -1476,9 +1510,13 @@
 
     if (platform_is_Fusion3()) {
 #ifdef QCOM_CSDCLIENT_ENABLED
-        err = csd_client_volume(vol);
-        if (err < 0) {
-            ALOGE("s_set_voice_volume: csd_client error %d", err);
+        if (csd_volume == NULL) {
+            ALOGE("dlsym:Error:%s Loading csd_client_volume", dlerror());
+        } else {
+            err = csd_volume(vol);
+            if (err < 0) {
+                ALOGE("s_set_voice_volume: csd_client error %d", err);
+            }
         }
 #endif
     }
@@ -1513,9 +1551,13 @@
 
     if (platform_is_Fusion3()) {
 #ifdef QCOM_CSDCLIENT_ENABLED
-        err = csd_client_mic_mute(state);
-        if (err < 0) {
-            ALOGE("s_set_mic_mute: csd_client error %d", err);
+        if (csd_mic_mute == NULL) {
+            ALOGE("dlsym:Error:%s Loading csd_mic_mute", dlerror());
+        } else {
+            err=csd_mic_mute(state);
+            if (err < 0) {
+                ALOGE("s_set_mic_mute: csd_client error %d", err);
+            }
         }
 #endif
     }
@@ -1593,9 +1635,13 @@
 
     if (platform_is_Fusion3()) {
 #ifdef QCOM_CSDCLIENT_ENABLED
-        err == csd_client_wide_voice(flag);
-        if (err < 0) {
-            ALOGE("s_enable_wide_voice: csd_client error %d", err);
+        if (csd_wide_voice == NULL) {
+            ALOGE("dlsym:Error:%s Loading csd_wide_voice", dlerror());
+        } else {
+            err = csd_wide_voice(flag);
+            if (err < 0) {
+                ALOGE("enableWideVoice: csd_client_wide_voice error %d", err);
+            }
         }
 #endif
     }
@@ -1626,9 +1672,13 @@
 
     if (platform_is_Fusion3()) {
 #ifdef QCOM_CSDCLIENT_ENABLED
-        err = csd_client_fens(flag);
-        if (err < 0) {
-            ALOGE("s_enable_fens: csd_client error %d", err);
+        if (csd_fens == NULL) {
+            ALOGE("dlsym:Error:%s Loading csd_fens", dlerror());
+        } else {
+            err = csd_fens(flag);
+            if (err < 0) {
+                ALOGE("s_enable_fens: csd_client error %d", err);
+            }
         }
 #endif
     }
@@ -1650,9 +1700,13 @@
 
     if (platform_is_Fusion3()) {
 #ifdef QCOM_CSDCLIENT_ENABLED
-        err = csd_client_slow_talk(flag);
-        if (err < 0) {
-            ALOGE("s_enable_slow_talk: csd_client error %d", err);
+        if (csd_slow_talk == NULL) {
+            ALOGE("dlsym:Error:%s Loading csd_slow_talk", dlerror());
+        } else {
+            err = csd_slow_talk(flag);
+            if (err < 0) {
+                ALOGE("s_enable_slow_talk: csd_client error %d", err);
+            }
         }
 #endif
     }
@@ -1681,4 +1735,23 @@
     ALOGD("s_setInput() : input_source = %d",input_source);
 }
 #endif
+
+#ifdef QCOM_CSDCLIENT_ENABLED
+static void  s_set_csd_handle(void* handle)
+{
+    csd_handle = static_cast<void*>(handle);
+    ALOGI("%s csd_handle: %p", __func__, csd_handle);
+
+    csd_disable_device = (int (*)())::dlsym(csd_handle,"csd_client_disable_device");
+    csd_enable_device = (int (*)(int,int,uint32_t))::dlsym(csd_handle,"csd_client_enable_device");
+    csd_start_voice = (int (*)())::dlsym(csd_handle,"csd_client_start_voice");
+    csd_stop_voice = (int (*)())::dlsym(csd_handle,"csd_client_stop_voice");
+    csd_volume = (int (*)(int))::dlsym(csd_handle,"csd_client_volume");
+    csd_mic_mute = (int (*)(int))::dlsym(csd_handle,"csd_client_mic_mute");
+    csd_wide_voice = (int (*)(uint8_t))::dlsym(csd_handle,"csd_client_wide_voice");
+    csd_fens = (int (*)(uint8_t))::dlsym(csd_handle,"csd_client_fens");
+    csd_slow_talk = (int (*)(uint8_t))::dlsym(csd_handle,"csd_client_slow_talk");
+}
+#endif
+
 }