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/AudioHardwareALSA.cpp b/alsa_sound/AudioHardwareALSA.cpp
index 6a88074..54f386a 100644
--- a/alsa_sound/AudioHardwareALSA.cpp
+++ b/alsa_sound/AudioHardwareALSA.cpp
@@ -60,6 +60,14 @@
android_audio_legacy::AudioHardwareInterface *createAudioHardware(void) {
return android_audio_legacy::AudioHardwareALSA::create();
}
+#ifdef QCOM_ACDB_ENABLED
+ static int (*acdb_init)();
+ static void (*acdb_deallocate)();
+#endif
+#ifdef QCOM_CSDCLIENT_ENABLED
+ static int (*csd_start_playback)();
+ static int (*csd_stop_playback)();
+#endif
} // extern "C"
namespace android_audio_legacy
@@ -73,7 +81,7 @@
AudioHardwareALSA::AudioHardwareALSA() :
mALSADevice(0),mVoipStreamCount(0),mVoipMicMute(false),mVoipBitRate(0)
- ,mCallState(0)
+ ,mCallState(0),mAcdbHandle(NULL),mCsdHandle(NULL)
{
FILE *fp;
char soundCardInfo[200];
@@ -107,11 +115,32 @@
mFusion3Platform = false;
#ifdef QCOM_ACDB_ENABLED
- if ((acdb_loader_init_ACDB()) < 0) {
- ALOGE("Failed to initialize ACDB");
+ mAcdbHandle = ::dlopen("/system/lib/libacdbloader.so", RTLD_NOW);
+ if (mAcdbHandle == NULL) {
+ ALOGE("AudioHardware: DLOPEN not successful for ACDBLOADER");
+ } else {
+ ALOGD("AudioHardware: DLOPEN successful for ACDBLOADER");
+ acdb_init = (int (*)())::dlsym(mAcdbHandle,"acdb_loader_init_ACDB");
+ if (acdb_init == NULL) {
+ ALOGE("dlsym:Error:%s Loading acdb_loader_init_ACDB", dlerror());
+ }else {
+ acdb_init();
+ acdb_deallocate = (void (*)())::dlsym(mAcdbHandle,"acdb_loader_deallocate_ACDB");
+ }
}
#endif
+#ifdef QCOM_CSDCLIENT_ENABLED
+ mCsdHandle = ::dlopen("/system/lib/libcsd-client.so", RTLD_NOW);
+ if (mCsdHandle == NULL) {
+ ALOGE("AudioHardware: DLOPEN not successful for CSD CLIENT");
+ } else {
+ ALOGD("AudioHardware: DLOPEN successful for CSD CLIENT");
+ csd_start_playback = (int (*)())::dlsym(mCsdHandle,"csd_client_start_playback");
+ csd_stop_playback = (int (*)())::dlsym(mCsdHandle,"csd_client_stop_playback");
+ }
+ mALSADevice->setCsdHandle(mCsdHandle);
+#endif
if((fp = fopen("/proc/asound/cards","r")) == NULL) {
ALOGE("Cannot open /proc/asound/cards file to get sound card info");
} else {
@@ -154,6 +183,12 @@
ALOGE("Failed to open ucm instance: %d", errno);
} else {
ALOGI("ucm instance opened: %u", (unsigned)mUcMgr);
+ mUcMgr->acdb_handle = NULL;
+#ifdef QCOM_ACDB_ENABLED
+ if (mAcdbHandle) {
+ mUcMgr->acdb_handle = static_cast<void*> (mAcdbHandle);
+ }
+#endif
}
} else {
ALOGE("ALSA Module could not be opened!!!");
@@ -180,11 +215,26 @@
mDeviceList.erase(it);
}
#ifdef QCOM_ACDB_ENABLED
- acdb_loader_deallocate_ACDB();
+ if (acdb_deallocate == NULL) {
+ ALOGE("dlsym: Error:%s Loading acdb_deallocate_ACDB", dlerror());
+ } else {
+ acdb_deallocate();
+ }
+ if (mAcdbHandle) {
+ ::dlclose(mAcdbHandle);
+ mAcdbHandle = NULL;
+ }
#endif
#ifdef QCOM_USBAUDIO_ENABLED
delete mAudioUsbALSA;
#endif
+
+#ifdef QCOM_CSDCLEINT_ENABLED
+ if (mCsdHandle) {
+ ::dlclose(mCsdHandle);
+ mCsdHandle = NULL;
+ }
+#endif
}
status_t AudioHardwareALSA::initCheck()
@@ -336,10 +386,18 @@
if (param.get(key, value) == NO_ERROR) {
if (value == "true") {
ALOGV("Enabling Incall Music setting in the setparameter\n");
- csd_client_start_playback();
+ if (csd_start_playback == NULL) {
+ ALOGE("dlsym: Error:%s Loading csd_client_start_playback", dlerror());
+ } else {
+ csd_start_playback();
+ }
} else {
ALOGV("Disabling Incall Music setting in the setparameter\n");
- csd_client_stop_playback();
+ if (csd_stop_playback == NULL) {
+ ALOGE("dlsym: Error:%s Loading csd_client_stop_playback", dlerror());
+ } else {
+ csd_stop_playback();
+ }
}
}
}