hal: Enable support to dynamically load config files

QCV allows multiple chipsets to be supported on a single
vendor. Enable support to dynamically get configuration
file path in vendor and load audio configuration files.

If 'ro.boot.product.vendor.sku' is not set, audio config
files would be loaded from /vendor/etc/.
If the property is set, files would be loaded from
/vendor/etc/audio/sku_{ro.boot.product.vendor.sku}.

'ro.boot.product.vendor.sku' would be set to SoC/SKU
at boot up in vendor.

Change-Id: Id228d94735b239e7608dfe84dd5f1eec7b016d2b
diff --git a/hal/audio_extn/utils.c b/hal/audio_extn/utils.c
index a888a07..2653564 100644
--- a/hal/audio_extn/utils.c
+++ b/hal/audio_extn/utils.c
@@ -54,13 +54,8 @@
 #include "audio_parsers.h"
 #endif
 
-#ifdef LINUX_ENABLED
-#define AUDIO_OUTPUT_POLICY_VENDOR_CONFIG_FILE "/etc/audio_output_policy.conf"
-#define AUDIO_IO_POLICY_VENDOR_CONFIG_FILE "/etc/audio_io_policy.conf"
-#else
-#define AUDIO_OUTPUT_POLICY_VENDOR_CONFIG_FILE "/vendor/etc/audio_output_policy.conf"
-#define AUDIO_IO_POLICY_VENDOR_CONFIG_FILE "/vendor/etc/audio_io_policy.conf"
-#endif
+#define AUDIO_IO_POLICY_VENDOR_CONFIG_FILE_NAME "audio_io_policy.conf"
+#define AUDIO_OUTPUT_POLICY_VENDOR_CONFIG_FILE_NAME "audio_output_policy.conf"
 
 #define OUTPUTS_TAG "outputs"
 #define INPUTS_TAG "inputs"
@@ -517,6 +512,25 @@
     }
 }
 
+/* Function to retrieve audio vendor configs path */
+void audio_get_vendor_config_path (char* config_file_path, int path_size)
+{
+    char vendor_sku[PROPERTY_VALUE_MAX] = {'\0'};
+    if (property_get("ro.boot.product.vendor.sku", vendor_sku, "") <= 0) {
+#ifdef LINUX_ENABLED
+        /* Audio configs are stored in /etc */
+        snprintf(config_file_path, path_size, "%s", "/etc");
+#else
+        /* Audio configs are stored in /vendor/etc */
+        snprintf(config_file_path, path_size, "%s", "/vendor/etc");
+#endif
+    } else {
+        /* Audio configs are stored in /vendor/etc/audio/sku_${vendor_sku} */
+        snprintf(config_file_path, path_size,
+            "%s%s", "/vendor/etc/audio/sku_", vendor_sku);
+    }
+}
+
 void audio_extn_utils_update_streams_cfg_lists(void *platform,
                                     struct mixer *mixer,
                                     struct listnode *streams_output_cfg_list,
@@ -524,6 +538,9 @@
 {
     cnode *root;
     char *data = NULL;
+    char vendor_config_path[VENDOR_CONFIG_PATH_MAX_LENGTH];
+    char audio_io_policy_file[VENDOR_CONFIG_FILE_MAX_LENGTH];
+    char audio_output_policy_file[VENDOR_CONFIG_FILE_MAX_LENGTH];
 
     ALOGV("%s", __func__);
     list_init(streams_output_cfg_list);
@@ -535,11 +552,29 @@
         return;
     }
 
-    data = (char *)load_file(AUDIO_IO_POLICY_VENDOR_CONFIG_FILE, NULL);
+    /* Get path for audio configuration files in vendor */
+    audio_get_vendor_config_path(vendor_config_path,
+        sizeof(vendor_config_path));
+
+    /* Get path for audio_io_policy_file in vendor */
+    snprintf(audio_io_policy_file, sizeof(audio_io_policy_file),
+        "%s/%s", vendor_config_path, AUDIO_IO_POLICY_VENDOR_CONFIG_FILE_NAME);
+
+    /* Load audio_io_policy_file from vendor */
+    data = (char *)load_file(audio_io_policy_file, NULL);
+
     if (data == NULL) {
         ALOGD("%s: failed to open io config file(%s), trying older config file",
-              __func__, AUDIO_IO_POLICY_VENDOR_CONFIG_FILE);
-        data = (char *)load_file(AUDIO_OUTPUT_POLICY_VENDOR_CONFIG_FILE, NULL);
+              __func__, audio_io_policy_file);
+
+        /* Get path for audio_output_policy_file in vendor */
+        snprintf(audio_output_policy_file, sizeof(audio_output_policy_file),
+            "%s/%s", vendor_config_path,
+                AUDIO_OUTPUT_POLICY_VENDOR_CONFIG_FILE_NAME);
+
+        /* Load audio_output_policy_file from vendor */
+        data = (char *)load_file(audio_output_policy_file, NULL);
+
         if (data == NULL) {
             send_app_type_cfg(platform, mixer,
                               streams_output_cfg_list,