am d90c5495: am bdfd2924: add device specific voice processing descriptors

* commit 'd90c54958fe8239b2d4302141d3e8e81d18ef7ec':
  add device specific voice processing descriptors
diff --git a/voice_processing/voice_processing.c b/voice_processing/voice_processing.c
index f412090..b8b1e1b 100644
--- a/voice_processing/voice_processing.c
+++ b/voice_processing/voice_processing.c
@@ -16,6 +16,7 @@
 
 #define LOG_TAG "voice_processing"
 /*#define LOG_NDEBUG 0*/
+#include <dlfcn.h>
 #include <cutils/log.h>
 #include <cutils/list.h>
 #include <hardware/audio_effect.h>
@@ -28,6 +29,8 @@
 // local definitions
 //------------------------------------------------------------------------------
 
+#define EFFECTS_DESCRIPTOR_LIBRARY_PATH "/system/lib/soundfx/libqcomvoiceprocessingdescriptors.so"
+
 // types of pre processing modules
 enum effect_id
 {
@@ -74,14 +77,15 @@
 
 
 //------------------------------------------------------------------------------
-// Effect descriptors
+// Default Effect descriptors. Device specific descriptors should be defined in
+// libqcomvoiceprocessing.<product_name>.so if needed.
 //------------------------------------------------------------------------------
 
 // UUIDs for effect types have been generated from http://www.itu.int/ITU-T/asn1/uuid.html
 // as the pre processing effects are not defined by OpenSL ES
 
 // Acoustic Echo Cancellation
-static const effect_descriptor_t aec_descriptor = {
+static const effect_descriptor_t qcom_default_aec_descriptor = {
         { 0x7b491460, 0x8d4d, 0x11e0, 0xbd61, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } }, // type
         { 0x0f8d0d2a, 0x59e5, 0x45fe, 0xb6e4, { 0x24, 0x8c, 0x8a, 0x79, 0x91, 0x09 } }, // uuid
         EFFECT_CONTROL_API_VERSION,
@@ -93,7 +97,7 @@
 };
 
 // Noise suppression
-static const effect_descriptor_t ns_descriptor = {
+static const effect_descriptor_t qcom_default_ns_descriptor = {
         { 0x58b4b260, 0x8e06, 0x11e0, 0xaa8e, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } }, // type
         { 0x1d97bb0b, 0x9e2f, 0x4403, 0x9ae3, { 0x58, 0xc2, 0x55, 0x43, 0x06, 0xf8 } }, // uuid
         EFFECT_CONTROL_API_VERSION,
@@ -106,7 +110,7 @@
 
 //ENABLE_AGC
 // Automatic Gain Control
-//static const effect_descriptor_t agc_descriptor = {
+//static const effect_descriptor_t qcom_default_agc_descriptor = {
 //        { 0x0a8abfe0, 0x654c, 0x11e0, 0xba26, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } }, // type
 //        { 0x0dd49521, 0x8c59, 0x40b1, 0xb403, { 0xe0, 0x8d, 0x5f, 0x01, 0x87, 0x5e } }, // uuid
 //        EFFECT_CONTROL_API_VERSION,
@@ -117,10 +121,10 @@
 //        "Qualcomm Fluence"
 //};
 
-static const effect_descriptor_t *descriptors[NUM_ID] = {
-        &aec_descriptor,
-        &ns_descriptor,
-//ENABLE_AGC       &agc_descriptor,
+const effect_descriptor_t *descriptors[NUM_ID] = {
+        &qcom_default_aec_descriptor,
+        &qcom_default_ns_descriptor,
+//ENABLE_AGC       &qcom_default_agc_descriptor,
 };
 
 
@@ -415,14 +419,39 @@
 }
 
 static int init() {
-    size_t i;
-    int status = 0;
+    void *lib_handle;
+    const effect_descriptor_t *desc;
 
     if (init_status <= 0)
         return init_status;
 
+    if (access(EFFECTS_DESCRIPTOR_LIBRARY_PATH, R_OK) == 0) {
+        lib_handle = dlopen(EFFECTS_DESCRIPTOR_LIBRARY_PATH, RTLD_NOW);
+        if (lib_handle == NULL) {
+            ALOGE("%s: DLOPEN failed for %s", __func__, EFFECTS_DESCRIPTOR_LIBRARY_PATH);
+        } else {
+            ALOGV("%s: DLOPEN successful for %s", __func__, EFFECTS_DESCRIPTOR_LIBRARY_PATH);
+            desc = (const effect_descriptor_t *)dlsym(lib_handle,
+                                                        "qcom_product_aec_descriptor");
+            if (desc)
+                descriptors[AEC_ID] = desc;
+
+            desc = (const effect_descriptor_t *)dlsym(lib_handle,
+                                                        "qcom_product_ns_descriptor");
+            if (desc)
+                descriptors[NS_ID] = desc;
+
+//ENABLE_AGC
+//            desc = (const effect_descriptor_t *)dlsym(lib_handle,
+//                                                        "qcom_product_agc_descriptor");
+//            if (desc)
+//                descriptors[AGC_ID] = desc;
+        }
+    }
+
     uuid_to_id_table[AEC_ID] = FX_IID_AEC;
     uuid_to_id_table[NS_ID] = FX_IID_NS;
+//ENABLE_AGC uuid_to_id_table[AGC_ID] = FX_IID_AGC;
 
     list_init(&session_list);
 
@@ -700,6 +729,9 @@
     if (pDescriptor == NULL || uuid == NULL)
         return -EINVAL;
 
+    if (init() != 0)
+        return init_status;
+
     desc = get_descriptor(uuid);
     if (desc == NULL) {
         ALOGV("lib_get_descriptor() not found");