Merge "sthal: incorrect order of microphone SRC plugin" into qt-r1-dev
diff --git a/sound_trigger_hw_iaxxx.c b/sound_trigger_hw_iaxxx.c
index 44f3cba..1d322a2 100644
--- a/sound_trigger_hw_iaxxx.c
+++ b/sound_trigger_hw_iaxxx.c
@@ -164,7 +164,7 @@
     bool is_mic_route_enabled;
     bool is_music_playing;
     bool is_bargein_route_enabled;
-    bool is_chre_route_enabled;
+    bool is_chre_loaded;
     bool is_buffer_package_loaded;
     bool is_sensor_route_enabled;
     bool is_src_package_loaded;
@@ -671,7 +671,7 @@
         (!stdev->is_sensor_destroy_in_prog &&
         !stdev->is_sensor_route_enabled) &&
         (!stdev->is_chre_destroy_in_prog &&
-        !stdev->is_chre_route_enabled)) {
+        !stdev->is_chre_loaded)) {
 
         err = destroy_buffer_package(stdev->odsp_hdl);
         if (err != 0) {
@@ -984,8 +984,9 @@
      * b/119390722 for tracing.
      */
     if (check_uuid_equality(uuid, stdev->chre_model_uuid)) {
-        set_chre_audio_route(stdev->route_hdl, bargein);
-        stdev->is_chre_route_enabled = true;
+        if (stdev->is_chre_loaded == true) {
+            set_chre_audio_route(stdev->route_hdl, bargein);
+        }
     } else if (check_uuid_equality(uuid, stdev->hotword_model_uuid)) {
         if (!((stdev->current_enable & PLUGIN1_MASK) & ~HOTWORD_MASK)) {
             set_hotword_route(stdev->route_hdl, bargein);
@@ -1017,8 +1018,9 @@
      * b/119390722 for tracing.
      */
     if (check_uuid_equality(uuid, stdev->chre_model_uuid)) {
-        tear_chre_audio_route(stdev->route_hdl, bargein);
-        stdev->is_chre_route_enabled = false;
+        if (stdev->is_chre_loaded == true) {
+            tear_chre_audio_route(stdev->route_hdl, bargein);
+        }
     } else if (check_uuid_equality(uuid, stdev->hotword_model_uuid)) {
         if (!((stdev->current_enable & PLUGIN1_MASK) & ~HOTWORD_MASK))
             tear_hotword_route(stdev->route_hdl, bargein);
@@ -1334,7 +1336,10 @@
                     tear_package_route(stdev, stdev->models[i].uuid,
                                     stdev->is_bargein_route_enabled);
                     stdev->models[i].is_active = false;
-                    destroy_package(stdev, &stdev->models[i]);
+                    if (!check_uuid_equality(stdev->models[i].uuid,
+                                            stdev->chre_model_uuid))
+                        destroy_package(stdev, &stdev->models[i]);
+
                     if ((stdev->hotword_buffer_enable) &&
                         !(stdev->current_enable & PLUGIN1_MASK)) {
                         tear_hotword_buffer_route(stdev->route_hdl,
@@ -1412,7 +1417,9 @@
                                             stdev->is_bargein_route_enabled);
                         }
 
-                        setup_package(stdev, &stdev->models[i]);
+                        if (!check_uuid_equality(stdev->models[i].uuid,
+                                                stdev->chre_model_uuid))
+                            setup_package(stdev, &stdev->models[i]);
                         set_package_route(stdev, stdev->models[i].uuid,
                                         stdev->is_bargein_route_enabled);
                     }
@@ -1538,6 +1545,14 @@
             tear_package_route(stdev, stdev->models[i].uuid,
                                stdev->is_bargein_route_enabled);
         }
+        // if chre enabled before crash during call, need to setup package for SLPI.
+        if (stdev->is_chre_loaded == true) {
+            err = setup_chre_package(stdev->odsp_hdl);
+            if (err != 0) {
+                ALOGE("Failed to load CHRE package");
+            }
+            stdev->current_enable = stdev->current_enable | CHRE_MASK;
+        }
         goto reload_oslo;
     }
 
@@ -1887,11 +1902,10 @@
         stdev->chre_timer_created = false;
     }
 
-    if (stdev->is_chre_route_enabled == true) {
+    if (stdev->is_chre_loaded == true) {
         for (i = 0; i < MAX_MODELS; i++) {
             if (check_uuid_equality(stdev->models[i].uuid,
-                                    stdev->chre_model_uuid) &&
-                stdev->models[i].is_active == true) {
+                                    stdev->chre_model_uuid)) {
                 stdev->models[i].is_active = false;
                 stdev->models[i].is_loaded = false;
                 memset(&stdev->models[i].uuid, 0,
@@ -1899,7 +1913,7 @@
                 break;
             }
         }
-        stdev->is_chre_route_enabled = false;
+        stdev->is_chre_loaded = false;
         stdev->current_enable &= ~CHRE_MASK;
     }
     stdev->is_chre_destroy_in_prog = false;
@@ -1946,7 +1960,6 @@
         goto exit;
     }
 
-    // setup the sensor route
     err = check_and_setup_buffer_package(stdev);
     if (err != 0) {
         ALOGE("%s: ERROR: Failed to load the buffer package", __func__);
@@ -1955,20 +1968,28 @@
 
     // add chre to recover list
     if (can_enable_chre(stdev)) {
-        if(stdev->is_chre_route_enabled == false) {
+        if(stdev->is_chre_loaded == false) {
             stdev->models[model_id].is_active = true;
             handle_input_source(stdev, true);
             setup_chre_package(stdev->odsp_hdl);
             set_chre_audio_route(stdev->route_hdl,
-                                stdev->is_bargein_route_enabled);
-            stdev->is_chre_route_enabled = true;
+                               stdev->is_bargein_route_enabled);
+            stdev->is_chre_loaded = true;
             stdev->current_enable = stdev->current_enable | CHRE_MASK;
         }
     } else {
-        ALOGW("%s: device is recording / in call, can't enable chre now",
+        ALOGW("%s: device is in call, setup CHRE for SLPI",
               __func__);
-        if (can_update_recover_list(stdev) == true)
-            update_recover_list(stdev, model_id, true);
+        //Setup CHRE package and allow SLPI connect
+        //during in-call mode.
+        if (stdev->is_chre_loaded == false) {
+            setup_chre_package(stdev->odsp_hdl);
+            stdev->models[model_id].uuid = stdev->chre_model_uuid;
+            stdev->is_chre_loaded = true;
+            stdev->current_enable = stdev->current_enable | CHRE_MASK;
+            if (can_update_recover_list(stdev) == true)
+                update_recover_list(stdev, model_id, true);
+        }
     }
 
 exit:
@@ -1980,7 +2001,7 @@
     int err = 0;
     ALOGD("+%s+", __func__);
 
-    if (stdev->is_chre_route_enabled == true) {
+    if (stdev->is_chre_loaded == true) {
         int i;
         tear_chre_audio_route(stdev->route_hdl,
                               stdev->is_bargein_route_enabled);
@@ -1989,11 +2010,12 @@
             ALOGE("%s: ERROR: Failed to destroy chre package", __func__);
         }
 
-        // now we can change the flag
+        //Need force reset the flag for chre due to in-call state
+        //The model is inactive, but need to clean if user disable it
+        //during call.
         for (i = 0; i < MAX_MODELS; i++) {
             if (check_uuid_equality(stdev->models[i].uuid,
-                                    stdev->chre_model_uuid) &&
-                stdev->models[i].is_active == true) {
+                                    stdev->chre_model_uuid)) {
                 stdev->models[i].is_active = false;
                 stdev->models[i].is_loaded = false;
                 memset(&stdev->models[i].uuid, 0,
@@ -2002,7 +2024,7 @@
             }
         }
         handle_input_source(stdev, false);
-        stdev->is_chre_route_enabled = false;
+        stdev->is_chre_loaded = false;
         stdev->current_enable = stdev->current_enable & ~CHRE_MASK;
     }
 
@@ -2753,7 +2775,7 @@
             update_recover_list(stdev, handle, false);
 
          // Disable the CHRE route
-        if (true == stdev->is_chre_route_enabled) {
+        if (stdev->is_chre_loaded == true) {
             struct itimerspec chre_timer_spec;
             struct sigevent chre_sigevent;
 
@@ -3371,7 +3393,7 @@
     stdev->is_voice_voip_stop = false;
     stdev->is_music_playing = false;
     stdev->is_bargein_route_enabled = false;
-    stdev->is_chre_route_enabled = false;
+    stdev->is_chre_loaded = false;
     stdev->is_buffer_package_loaded = false;
     stdev->hotword_buffer_enable = 0;
     stdev->music_buffer_enable = 0;