Reconcile with jb-mr1-factory-release jb-mr1-release - do not merge

Change-Id: I145f70e1468eb53bf0ab955ff096ea795797bd3b
diff --git a/alsa_sound/alsa_default.cpp b/alsa_sound/alsa_default.cpp
index 18a28d2..7c2449e 100644
--- a/alsa_sound/alsa_default.cpp
+++ b/alsa_sound/alsa_default.cpp
@@ -409,6 +409,11 @@
         } else if (devices & AudioSystem::DEVICE_IN_BUILTIN_MIC) {
             if (mode == AudioSystem::MODE_IN_CALL) {
                 devices |= AudioSystem::DEVICE_OUT_EARPIECE;
+            } else if (mode == AudioSystem::MODE_IN_COMMUNICATION) {
+                if (!strncmp(curRxUCMDevice, SND_USE_CASE_DEV_SPEAKER, MAX_LEN(curRxUCMDevice, SND_USE_CASE_DEV_SPEAKER))) {
+                    devices &= ~AudioSystem::DEVICE_IN_BUILTIN_MIC;
+                    devices |= AudioSystem::DEVICE_IN_BACK_MIC;
+                }
             }
         } else if (devices & AudioSystem::DEVICE_OUT_EARPIECE) {
             devices = devices | AudioSystem::DEVICE_IN_BUILTIN_MIC;
@@ -1088,6 +1093,21 @@
     handle->rxHandle = 0;
     ALOGV("s_close: handle %p h %p", handle, h);
     if (h) {
+        if ((!strcmp(handle->useCase, SND_USE_CASE_VERB_VOICECALL) ||
+             !strcmp(handle->useCase, SND_USE_CASE_MOD_PLAY_VOICE)) &&
+            platform_is_Fusion3()) {
+#ifdef QCOM_CSDCLIENT_ENABLED
+            if (csd_stop_voice == NULL) {
+                ALOGE("dlsym:Error:%s Loading csd_client_disable_device", dlerror());
+            } else {
+                err = csd_stop_voice();
+                if (err < 0) {
+                    ALOGE("s_close: csd_client error %d\n", err);
+                }
+            }
+#endif
+        }
+
         ALOGV("s_close rxHandle\n");
         err = pcm_close(h);
         if(err != NO_ERROR) {
@@ -1105,21 +1125,6 @@
             ALOGE("s_close: pcm_close failed for handle with err %d", err);
         }
 
-        if ((!strcmp(handle->useCase, SND_USE_CASE_VERB_VOICECALL) ||
-             !strcmp(handle->useCase, SND_USE_CASE_MOD_PLAY_VOICE)) &&
-            platform_is_Fusion3()) {
-#ifdef QCOM_CSDCLIENT_ENABLED
-            if (csd_stop_voice == NULL) {
-                ALOGE("dlsym:Error:%s Loading csd_client_disable_device", dlerror());
-            } else {
-                err = csd_stop_voice();
-                if (err < 0) {
-                    ALOGE("s_close: csd_client error %d\n", err);
-                }
-            }
-#endif
-        }
-
         disableDevice(handle);
     } else if((!strcmp(handle->useCase, SND_USE_CASE_VERB_HIFI_LOW_POWER)) ||
               (!strcmp(handle->useCase, SND_USE_CASE_MOD_PLAY_LPA)) ||
@@ -1330,6 +1335,9 @@
             } else {
                 return strdup(SND_USE_CASE_DEV_SPEAKER_HEADSET); /* COMBO SPEAKER+HEADSET RX */
             }
+        } else if ((devices & AudioSystem::DEVICE_OUT_SPEAKER) &&
+            ((devices & AudioSystem::DEVICE_OUT_AUX_DIGITAL))) {
+            return strdup(SND_USE_CASE_DEV_HDMI_SPEAKER);
 #ifdef QCOM_ANC_HEADSET_ENABLED
         } else if ((devices & AudioSystem::DEVICE_OUT_SPEAKER) &&
             ((devices & AudioSystem::DEVICE_OUT_ANC_HEADSET) ||
diff --git a/libalsa-intf/msm8960_use_cases.h b/libalsa-intf/msm8960_use_cases.h
index ad69e09..ed58d8a 100644
--- a/libalsa-intf/msm8960_use_cases.h
+++ b/libalsa-intf/msm8960_use_cases.h
@@ -237,6 +237,7 @@
 #define SND_USE_CASE_DEV_SSR_QUAD_MIC "SSR QMIC"
 #define SND_USE_CASE_DEV_PROXY_RX     "PROXY Rx"
 #define SND_USE_CASE_DEV_PROXY_TX     "PROXY Tx"
+#define SND_USE_CASE_DEV_HDMI_SPEAKER     "HDMI Speaker"
 #define SND_USE_CASE_DEV_SPDIF_SPEAKER     "SPDIF Speaker"
 #define SND_USE_CASE_DEV_SPDIF_HANDSET     "SPDIF Earpiece"
 #define SND_USE_CASE_DEV_SPDIF_HEADSET     "SPDIF Headphones"