Merge "hal: add checks for calibration buffer allocation failures"
diff --git a/hal/audio_extn/fm.c b/hal/audio_extn/fm.c
index b6f8689..ed3776c 100644
--- a/hal/audio_extn/fm.c
+++ b/hal/audio_extn/fm.c
@@ -34,6 +34,7 @@
 #ifdef FM_ENABLED
 #define AUDIO_PARAMETER_KEY_HANDLE_FM "handle_fm"
 #define AUDIO_PARAMETER_KEY_FM_VOLUME "fm_volume"
+#define AUDIO_PARAMETER_KEY_REC_PLAY_CONC "rec_play_conc_on"
 
 static struct pcm_config pcm_config_fm = {
     .channels = 2,
@@ -280,6 +281,21 @@
         fm_set_volume(adev, vol);
     }
 
+#ifdef RECORD_PLAY_CONCURRENCY
+    ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_REC_PLAY_CONC,
+                               value, sizeof(value));
+    if ((ret >= 0)
+          && (fmmod.is_fm_running == true)) {
+
+        if (!strncmp("true", value, sizeof("true")))
+            ALOGD("Record play concurrency ON Forcing FM device reroute");
+        else
+            ALOGD("Record play concurrency OFF Forcing FM device reroute");
+
+        select_devices(adev, USECASE_AUDIO_PLAYBACK_FM);
+        fm_set_volume(adev,fmmod.fm_volume);
+    }
+#endif
 exit:
     ALOGV("%s: exit", __func__);
 }
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 4e33dfb..ce26388 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -795,8 +795,7 @@
                 out_snd_device = platform_get_output_snd_device(adev->platform,
                                             usecase->stream.out->devices);
                 if (usecase->stream.out == adev->primary_output &&
-                        adev->active_input &&
-                        adev->active_input->source == AUDIO_SOURCE_VOICE_COMMUNICATION) {
+                        adev->active_input) {
                     select_devices(adev, adev->active_input->usecase);
                 }
             }
@@ -805,8 +804,10 @@
             out_snd_device = SND_DEVICE_NONE;
             if (in_snd_device == SND_DEVICE_NONE) {
                 audio_devices_t out_device = AUDIO_DEVICE_NONE;
-                if (adev->active_input->source == AUDIO_SOURCE_VOICE_COMMUNICATION &&
-                        adev->primary_output && !adev->primary_output->standby) {
+                if ((adev->active_input->source == AUDIO_SOURCE_VOICE_COMMUNICATION ||
+                    (adev->mode == AUDIO_MODE_IN_COMMUNICATION &&
+                     adev->active_input->source == AUDIO_SOURCE_MIC)) &&
+                     adev->primary_output && !adev->primary_output->standby) {
                     out_device = adev->primary_output->devices;
                 } else if (usecase->id == USECASE_AUDIO_RECORD_AFE_PROXY) {
                     out_device = AUDIO_DEVICE_OUT_TELEPHONY_TX;
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index 943a43d..ca6d79b 100644
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -1861,7 +1861,8 @@
                 snd_device = SND_DEVICE_IN_VOICE_REC_MIC;
             }
         }
-    } else if (source == AUDIO_SOURCE_VOICE_COMMUNICATION) {
+    } else if ((source == AUDIO_SOURCE_VOICE_COMMUNICATION) ||
+              (mode == AUDIO_MODE_IN_COMMUNICATION)) {
         if (out_device & AUDIO_DEVICE_OUT_SPEAKER)
             in_device = AUDIO_DEVICE_IN_BACK_MIC;
         if (adev->active_input) {
@@ -2244,7 +2245,6 @@
             ALOGD("setting record playback concurrency to false");
             my_data->rec_play_conc_set = false;
         }
-        str_parms_del(parms, AUDIO_PARAMETER_KEY_REC_PLAY_CONC);
     }
 #endif
     ALOGV("%s: exit with code(%d)", __func__, ret);