hal: Add change to dynamically load audio config file

Add change to load audio config file at runtime from
different locations

Change-Id: I38512a5ab812f76df7c817c076044124d44f555e
diff --git a/hal/audio_extn/ffv.c b/hal/audio_extn/ffv.c
index fe6ffa6..4f51cb1 100644
--- a/hal/audio_extn/ffv.c
+++ b/hal/audio_extn/ffv.c
@@ -61,21 +61,9 @@
 #define AUDIO_PARAMETER_FFV_EC_REF_DEVICE "ffv_ec_ref_dev"
 #define AUDIO_PARAMETER_FFV_CHANNEL_INDEX "ffv_channel_index"
 
-#if LINUX_ENABLED
-#define FFV_CONFIG_FILE_PATH "/etc/BF_1out.cfg"
-#ifdef __LP64__
-#define FFV_LIB "/usr/lib64/libffv.so"
-#else
-#define FFV_LIB "/usr/lib/libffv.so"
-#endif
-#else
-#define FFV_CONFIG_FILE_PATH "/vendor/etc/BF_1out.cfg"
-#ifdef __LP64__
-#define FFV_LIB "/vendor/lib64/libffv.so"
-#else
-#define FFV_LIB "/vendor/lib/libffv.so"
-#endif
-#endif
+
+#define FFV_CONFIG_FILE_NAME "BF_1out.cfg"
+#define FFV_LIB_NAME "libffv.so"
 
 #define FFV_SAMPLING_RATE_16000 16000
 #define FFV_EC_REF_LOOPBACK_DEVICE_MONO "ec-ref-loopback-mono"
@@ -200,18 +188,46 @@
     .format = PCM_FORMAT_S16_LE,
 };
 
+void audio_get_lib_path(char* lib_path, int path_size)
+{
+#ifdef LINUX_ENABLED
+#ifdef __LP64__
+    /* libs are stored in /usr/lib64 */
+    snprintf(lib_path, path_size, "%s", "/usr/lib64");
+#else
+    /* libs are stored in /usr/lib */
+    snprintf(lib_path, path_size, "%s", "/usr/lib");
+#endif
+#else
+#ifdef __LP64__
+    /* libs are stored in /vendor/lib64 */
+    snprintf(lib_path, path_size, "%s", "/vendor/lib64");
+#else
+    /* libs are stored in /vendor/lib */
+    snprintf(lib_path, path_size, "%s", "/vendor/lib");
+#endif
+#endif
+}
+
 static int32_t ffv_init_lib()
 {
     int status = 0;
+    char lib_path[VENDOR_CONFIG_PATH_MAX_LENGTH];
+    char lib_file[VENDOR_CONFIG_FILE_MAX_LENGTH];
 
+    /* Get path for lib in vendor */
+    audio_get_lib_path(lib_path, sizeof(lib_path));
+
+    /* Get path for ffv_lib_file */
+    snprintf(lib_file, sizeof(lib_file), "%s/%s", lib_path, FFV_LIB_NAME);
     if (ffvmod.ffv_lib_handle) {
         ALOGE("%s: FFV library is already initialized", __func__);
         return 0;
     }
 
-    ffvmod.ffv_lib_handle = dlopen(FFV_LIB, RTLD_NOW);
+    ffvmod.ffv_lib_handle = dlopen(lib_file, RTLD_NOW);
     if (!ffvmod.ffv_lib_handle) {
-        ALOGE("%s: Unable to open %s, error %s", __func__, FFV_LIB,
+        ALOGE("%s: Unable to open %s, error %s", __func__, lib_file,
             dlerror());
         status = -ENOENT;
         goto exit;
@@ -438,7 +454,9 @@
     int num_tx_in_ch, num_out_ch, num_ec_ref_ch;
     int frame_len;
     int sample_rate;
-    const char *config_file_path = FFV_CONFIG_FILE_PATH;
+    const char *config_file_path;
+    char vendor_config_path[VENDOR_CONFIG_PATH_MAX_LENGTH];
+    char platform_info_xml_path_file[VENDOR_CONFIG_FILE_MAX_LENGTH];
     int total_mem_size;
     FfvStatusType status_type;
     const char *sm_buffer = "DISABLE_KEYWORD_DETECTION";
@@ -447,6 +465,11 @@
     int param_size = 0;
     int param_id;
 
+    audio_get_vendor_config_path(vendor_config_path, sizeof(vendor_config_path));
+    /* Get path for ffv_config_file_name in vendor */
+    snprintf(platform_info_xml_path_file, sizeof(platform_info_xml_path_file),
+            "%s/%s", vendor_config_path, FFV_CONFIG_FILE_NAME);
+    config_file_path = platform_info_xml_path_file;
     if (!audio_extn_ffv_get_enabled()) {
         ALOGE("Rejecting FFV -- init is called without enabling FFV");
         goto fail;