audio: qahw: Implement new api to store data in payload

Implement new api qahw_get_param_data to store Sourcetracking
parameters in given payload.

Change-Id: Ie256d075566ad9072466c8ac72f46dca9e5a0f3a
diff --git a/qahw_api/inc/qahw_api.h b/qahw_api/inc/qahw_api.h
index 5db0fdd..1dc52f2 100644
--- a/qahw_api/inc/qahw_api.h
+++ b/qahw_api/inc/qahw_api.h
@@ -421,6 +421,13 @@
 /*returns current QTI HAL version */
 int qahw_get_version();
 
+/* Api to implement get parameters based on keyword param_id
+ * and store data in payload.
+ */
+int qahw_get_param_data(const qahw_module_handle_t *hw_module,
+                        qahw_param_id param_id,
+                        qahw_param_payload *payload);
+
 __END_DECLS
 
 #endif  // QTI_AUDIO_HAL_API_H
diff --git a/qahw_api/inc/qahw_defs.h b/qahw_api/inc/qahw_defs.h
index 5e92464..c3def18 100644
--- a/qahw_api/inc/qahw_defs.h
+++ b/qahw_api/inc/qahw_defs.h
@@ -217,6 +217,32 @@
     uint32_t reserved[64]; /*reserved for future */
 } qahw_in_buffer_t;
 
+#define MAX_SECTORS 8
+
+struct qahw_source_tracking_param {
+    uint8_t   vad[MAX_SECTORS];
+    uint16_t  doa_speech;
+    uint16_t  doa_noise[3];
+    uint8_t   polar_activity[360];
+};
+
+struct qahw_sound_focus_param {
+    uint16_t  start_angle[MAX_SECTORS];
+    uint8_t   enable[MAX_SECTORS];
+    uint16_t  gain_step;
+};
+
+typedef union {
+    struct qahw_source_tracking_param st_params;
+    struct qahw_sound_focus_param sf_params;
+} qahw_param_payload;
+
+typedef enum {
+    QAHW_PARAM_SOURCE_TRACK,
+    QAHW_PARAM_SOUND_FOCUS
+} qahw_param_id;
+
+
 __END_DECLS
 
 #endif  // QTI_AUDIO_HAL_DEFS_H
diff --git a/qahw_api/src/qahw.c b/qahw_api/src/qahw.c
index 48df887..4025c56 100644
--- a/qahw_api/src/qahw.c
+++ b/qahw_api/src/qahw.c
@@ -91,6 +91,10 @@
 static int qahw_list_count;
 static pthread_mutex_t qahw_module_init_lock = PTHREAD_MUTEX_INITIALIZER;
 
+typedef int (*qahwi_get_param_data_t) (const struct audio_device *,
+                              qahw_param_id, qahw_param_payload *);
+qahwi_get_param_data_t qahwi_get_param_data;
+
 /** Start of internal functions */
 /******************************************************************************/
 
@@ -1208,6 +1212,39 @@
     return str_param;
 }
 
+/* Api to implement get parameters  based on keyword param_id
+ * and store data in payload.
+ */
+int qahw_get_param_data(const qahw_module_handle_t *hw_module,
+                        qahw_param_id param_id,
+                        qahw_param_payload *payload)
+{
+    int ret = 0;
+    qahw_module_t *qahw_module = (qahw_module_t *)hw_module;
+    qahw_module_t *qahw_module_temp;
+
+    pthread_mutex_lock(&qahw_module_init_lock);
+    qahw_module_temp = get_qahw_module_by_ptr(qahw_module);
+    pthread_mutex_unlock(&qahw_module_init_lock);
+    if (qahw_module_temp == NULL) {
+        ALOGE("%s:: invalid hw module %p", __func__, qahw_module);
+        goto exit;
+    }
+
+    pthread_mutex_lock(&qahw_module->lock);
+
+    if (qahwi_get_param_data){
+        ret = qahwi_get_param_data (qahw_module->audio_device, param_id, payload);
+    } else {
+         ret = -ENOSYS;
+         ALOGE("%s not supported\n",__func__);
+    }
+    pthread_mutex_unlock(&qahw_module->lock);
+
+exit:
+     return ret;
+}
+
 /* Returns audio input buffer size according to parameters passed or
  * 0 if one of the parameters is not supported.
  * See also get_buffer_size which is for a particular stream.
@@ -1507,6 +1544,11 @@
     qahw_module->module = module;
     ALOGD("%s::Loaded HAL %s module %p", __func__, ahal_name, qahw_module);
 
+    qahwi_get_param_data = (qahwi_get_param_data_t) dlsym (module->dso,
+                            "qahwi_get_param_data");
+    if (!qahwi_get_param_data)
+         ALOGD("%s::qahwi_get_param_data api is not defined\n",__func__);
+
     if (!qahw_list_count)
         list_init(&qahw_module_list);
     qahw_list_count++;