hal:qaf: Fix to avoid hang while session close

-session close sometime hangs due to deadlock in qaf
-fix is done to avoid multiple lock while closing session

Change-Id: Ia4b89bf039e44a4e543d751a5f62cedec896d59e
diff --git a/hal/audio_extn/qaf.c b/hal/audio_extn/qaf.c
index 20d0ae4..c1086f8 100644
--- a/hal/audio_extn/qaf.c
+++ b/hal/audio_extn/qaf.c
@@ -219,6 +219,7 @@
     float vol_right;
     bool is_vol_set;
     qaf_stream_state stream_state[MAX_QAF_MODULE_IN];
+    bool is_session_closing;
 };
 
 struct qaf {
@@ -1269,11 +1270,15 @@
     struct audio_config config;
     audio_qaf_media_format_t *media_fmt = NULL;
 
+    if (qaf_mod->is_session_closing) {
+        DEBUG_MSG("Dropping event as session is closing."
+                "Device 0x%X, Event = 0x%X, Bytes to write %d", device, event_id, size);
+        return;
+    }
+
     DEBUG_MSG_VV("Device 0x%X, Event = 0x%X, Bytes to write %d", device, event_id, size);
 
 
-    pthread_mutex_lock(&p_qaf->lock);
-
     /* Default config initialization. */
     config.sample_rate = config.offload_info.sample_rate = QAF_OUTPUT_SAMPLING_RATE;
     config.offload_info.version = AUDIO_INFO_INITIALIZER.version;
@@ -1285,10 +1290,11 @@
     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;
     }
 
+    pthread_mutex_lock(&p_qaf->lock);
+
     if (event_id == AUDIO_DATA_EVENT) {
         data_buffer_p = (int8_t*)buf;
         buffer_size = size;
@@ -1777,6 +1783,8 @@
 {
     int j;
 
+    DEBUG_MSG("Closing Session.");
+
     //Check if all streams are closed or not.
     for (j = 0; j < MAX_QAF_MODULE_IN; j++) {
         if (qaf_mod->stream_in[j] != NULL) {
@@ -1787,6 +1795,9 @@
         return 0; //Some stream is already active, Can not close session.
     }
 
+    qaf_mod->is_session_closing = true;
+    pthread_mutex_lock(&p_qaf->lock);
+
     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]) {
@@ -1810,6 +1821,8 @@
     }
     qaf_mod->new_out_format_index = 0;
 
+    pthread_mutex_unlock(&p_qaf->lock);
+    qaf_mod->is_session_closing = false;
     DEBUG_MSG("Session Closed.");
 
     return 0;
@@ -1843,11 +1856,11 @@
     }
     unlock_output_stream(out);
 
+    pthread_mutex_unlock(&p_qaf->lock);
+
     //If all streams are closed then close the session.
     qaf_session_close(qaf_mod);
 
-    pthread_mutex_unlock(&p_qaf->lock);
-
     DEBUG_MSG();
     return ret;
 }