hal: Fix android music app crash when turning ANC OFF

- Music app crashes when turning ANC OFF during audio
  playback
- Fix by adding device switch logic on set param request
  for ANC enable
- Fix for broken AAC recording due to missing fluence
  channel count check

Change-Id: I8035d7efd47d4aec278f6ee8c366234982b14222
CRs-fixed: 570800
diff --git a/hal/audio_extn/audio_extn.c b/hal/audio_extn/audio_extn.c
index 47d7c33..0c8918a 100644
--- a/hal/audio_extn/audio_extn.c
+++ b/hal/audio_extn/audio_extn.c
@@ -63,7 +63,7 @@
 #endif
 
 #ifndef ANC_HEADSET_ENABLED
-#define audio_extn_set_anc_parameters(parms)       (0)
+#define audio_extn_set_anc_parameters(adev, parms)       (0)
 #else
 bool audio_extn_get_anc_enabled(void)
 {
@@ -97,10 +97,13 @@
   return false;
 }
 
-void audio_extn_set_anc_parameters(struct str_parms *parms)
+void audio_extn_set_anc_parameters(struct audio_device *adev,
+                                   struct str_parms *parms)
 {
     int ret;
     char value[32] ={0};
+    struct listnode *node;
+    struct audio_usecase *usecase;
 
     ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_ANC, value,
                             sizeof(value));
@@ -111,6 +114,20 @@
             aextnmod.anc_enabled = false;
     }
 
+    list_for_each(node, &adev->usecase_list) {
+        usecase = node_to_item(node, struct audio_usecase, list);
+        if (usecase->type == PCM_PLAYBACK) {
+            if (usecase->stream.out->devices == \
+                AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
+                usecase->stream.out->devices ==  \
+                AUDIO_DEVICE_OUT_WIRED_HEADSET) {
+                select_devices(adev, usecase->id);
+                ALOGV("%s: switching device", __func__);
+                break;
+            }
+        }
+    }
+
     ALOGD("%s: anc_enabled:%d", __func__, aextnmod.anc_enabled);
 }
 #endif /* ANC_HEADSET_ENABLED */
@@ -196,7 +213,7 @@
 void audio_extn_set_parameters(struct audio_device *adev,
                                struct str_parms *parms)
 {
-   audio_extn_set_anc_parameters(parms);
+   audio_extn_set_anc_parameters(adev, parms);
    audio_extn_set_afe_proxy_parameters(parms);
    audio_extn_fm_set_parameters(adev, parms);
    audio_extn_listen_set_parameters(adev, parms);
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index 2aaaf4a..7175216 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -877,18 +877,11 @@
                 set_echo_reference(adev->mixer, "NONE");
         }
     } else if (source == AUDIO_SOURCE_MIC) {
-        if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
-            if(my_data->fluence_type & FLUENCE_DUAL_MIC &&
-                    my_data->fluence_in_audio_rec)
-                snd_device = SND_DEVICE_IN_SPEAKER_DMIC;
-            else
-                snd_device = SND_DEVICE_IN_SPEAKER_MIC;
-        } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
+        if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC &&
+                channel_count == 1 ) {
             if(my_data->fluence_type & FLUENCE_DUAL_MIC &&
                     my_data->fluence_in_audio_rec)
                 snd_device = SND_DEVICE_IN_HANDSET_DMIC;
-            else
-                snd_device = SND_DEVICE_IN_HANDSET_MIC;
         }
     } else if (source == AUDIO_SOURCE_FM_RX ||
                source == AUDIO_SOURCE_FM_RX_A2DP) {