hal: Add support for secure MS12 dolby playback

Call audio extension IP handler interface APIs to support
secure dolby decoding in HLOS.

Change-Id: Id5f54475217212006795936db6dfa8bd74835e62
diff --git a/hal/audio_extn/qaf.c b/hal/audio_extn/qaf.c
index 5dba1d2..90b054c 100644
--- a/hal/audio_extn/qaf.c
+++ b/hal/audio_extn/qaf.c
@@ -170,6 +170,7 @@
 
 struct qaf_module {
     audio_session_handle_t session_handle;
+    void *ip_hdlr_hdl;
     void *qaf_lib;
     int (*qaf_audio_session_open)(audio_session_handle_t* session_handle,
                                   audio_session_type_t s_type,
@@ -246,6 +247,7 @@
 static int qaf_out_pause(struct audio_stream_out* stream);
 static int qaf_out_flush(struct audio_stream_out* stream);
 static int qaf_out_drain(struct audio_stream_out* stream, audio_drain_type_t type);
+static int qaf_session_close();
 
 //Global handle of QAF. Access to this should be protected by mutex lock.
 static struct qaf *p_qaf = NULL;
@@ -1249,6 +1251,13 @@
     config.offload_info.bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
     config.offload_info.channel_mask = config.channel_mask = AUDIO_CHANNEL_OUT_STEREO;
 
+    if (event_id == AUDIO_SEC_FAIL_EVENT) {
+        DEBUG_MSG("%s Security failed, closing session");
+        qaf_session_close(qaf_mod);
+        pthread_mutex_unlock(&p_qaf->lock);
+        return;
+    }
+
     if (event_id == AUDIO_DATA_EVENT) {
         data_buffer_p = (int8_t*)buf;
         buffer_size = size;
@@ -1733,6 +1742,11 @@
     }
 
     if (qaf_mod->session_handle != NULL && qaf_mod->qaf_audio_session_close) {
+#ifdef AUDIO_EXTN_IP_HDLR_ENABLED
+        if (qaf_mod == &p_qaf->qaf_mod[MS12]) {
+            audio_extn_ip_hdlr_intf_close(qaf_mod->ip_hdlr_hdl, false, qaf_mod->session_handle);
+        }
+#endif
         qaf_mod->qaf_audio_session_close(qaf_mod->session_handle);
         qaf_mod->session_handle = NULL;
         qaf_mod->is_vol_set = false;
@@ -1789,7 +1803,7 @@
 }
 
 /* Open a MM module session with QAF. */
-static int audio_extn_qaf_session_open(mm_module_type mod_type)
+static int audio_extn_qaf_session_open(mm_module_type mod_type, struct stream_out *out)
 {
     ALOGV("%s %d", __func__, __LINE__);
     unsigned char* license_data = NULL;
@@ -1812,6 +1826,7 @@
         return 0;
     }
 
+#ifndef AUDIO_EXTN_IP_HDLR_ENABLED
     if (mod_type == MS12) {
         //Getting the license
         license_data = platform_get_license((struct audio_hw_device *)(p_qaf->adev->platform),
@@ -1840,6 +1855,7 @@
             goto exit;
         }
     }
+#endif
 
     ret = qaf_mod->qaf_audio_session_open(&qaf_mod->session_handle,
                                           AUDIO_SESSION_BROADCAST,
@@ -1864,6 +1880,16 @@
 
     set_hdmi_configuration_to_module();
 
+#ifdef AUDIO_EXTN_IP_HDLR_ENABLED
+    if (mod_type == MS12) {
+        ret = audio_extn_ip_hdlr_intf_open(qaf_mod->ip_hdlr_hdl, false, qaf_mod->session_handle, out->usecase);
+        if (ret < 0) {
+            ERROR_MSG("audio_extn_ip_hdlr_intf_open failed, ret = %d", __func__, ret);
+            goto exit;
+        }
+    }
+#endif
+
 exit:
     if (license_data != NULL) {
         free(license_data);
@@ -1897,7 +1923,7 @@
     }
 
     //Open the module session, if not opened already.
-    status = audio_extn_qaf_session_open(mmtype);
+    status = audio_extn_qaf_session_open(mmtype, out);
     qaf_mod = &(p_qaf->qaf_mod[mmtype]);
 
     if ((status != 0) || (qaf_mod->session_handle == NULL)) {
@@ -2819,21 +2845,42 @@
 
         if (i == MS12) {
             property_get("vendor.audio.qaf.library", value, NULL);
-        } else if (i == DTS_M8) {
-            property_get("vendor.audio.qaf.m8.library", value, NULL);
-        } else {
+            snprintf(lib_name, PROPERTY_VALUE_MAX, "%s", value);
+#ifdef AUDIO_EXTN_IP_HDLR_ENABLED
+{
+        int ret = 0;
+        ret = audio_extn_ip_hdlr_intf_init(&qaf_mod->ip_hdlr_hdl, lib_name, &qaf_mod->qaf_lib,
+                                           adev, USECASE_AUDIO_PLAYBACK_OFFLOAD);
+        if (ret < 0) {
+            ERROR_MSG("audio_extn_ip_hdlr_intf_init failed, ret = %d", ret);
             continue;
         }
-
-        snprintf(lib_name, PROPERTY_VALUE_MAX, "%s", value);
-
+        if (qaf_mod->qaf_lib == NULL) {
+            ERROR_MSG("failed to get library handle");
+            continue;
+        }
+}
+#else
         qaf_mod->qaf_lib = dlopen(lib_name, RTLD_NOW);
         if (qaf_mod->qaf_lib == NULL) {
             ERROR_MSG("DLOPEN failed for %s", lib_name);
             continue;
         }
-
         DEBUG_MSG("DLOPEN successful for %s", lib_name);
+#endif
+        } else if (i == DTS_M8) {
+            property_get("audio.qaf.m8.library", value, NULL);
+            snprintf(lib_name, PROPERTY_VALUE_MAX, "%s", value);
+            qaf_mod->qaf_lib = dlopen(lib_name, RTLD_NOW);
+            if (qaf_mod->qaf_lib == NULL) {
+                ERROR_MSG("DLOPEN failed for %s", lib_name);
+                continue;
+            }
+            DEBUG_MSG("DLOPEN successful for %s", lib_name);
+        } else {
+            continue;
+        }
+
         qaf_mod->qaf_audio_session_open =
                     (int (*)(audio_session_handle_t* session_handle, audio_session_type_t s_type,
                                   void *p_data, void* license_data))dlsym(qaf_mod->qaf_lib,
@@ -2896,8 +2943,17 @@
             qaf_session_close(&p_qaf->qaf_mod[i]);
 
             if (p_qaf->qaf_mod[i].qaf_lib != NULL) {
-                dlclose(p_qaf->qaf_mod[i].qaf_lib);
-                p_qaf->qaf_mod[i].qaf_lib = NULL;
+                if (i == MS12) {
+#ifdef AUDIO_EXTN_IP_HDLR_ENABLED
+                    audio_extn_ip_hdlr_intf_deinit(p_qaf->qaf_mod[i].ip_hdlr_hdl);
+#else
+                    dlclose(p_qaf->qaf_mod[i].qaf_lib);
+#endif
+                    p_qaf->qaf_mod[i].qaf_lib = NULL;
+                } else {
+                    dlclose(p_qaf->qaf_mod[i].qaf_lib);
+                    p_qaf->qaf_mod[i].qaf_lib = NULL;
+                }
             }
         }
         if (p_qaf->passthrough_out) {