alsa_sound: Remove pcm stream close for flushing buffers

- Currently pcm stream is closed to flush buffers while switching
  between speaker+headset combo device and headset device.
- Fix this problem by removing unnecessary pcm stream close.

Bug-id: 7051374
Change-Id: Id2faaeadd2a8e009f67e85beee42bbfe47b959f4
diff --git a/alsa_sound/AudioHardwareALSA.cpp b/alsa_sound/AudioHardwareALSA.cpp
index f33ef9f..6a88074 100644
--- a/alsa_sound/AudioHardwareALSA.cpp
+++ b/alsa_sound/AudioHardwareALSA.cpp
@@ -612,29 +612,9 @@
                                     break;
                          }
                     }
-        } else 
+        } else
 #endif
-        if((((mCurDevice & AudioSystem::DEVICE_OUT_WIRED_HEADSET) ||
-                  (mCurDevice & AudioSystem::DEVICE_OUT_WIRED_HEADPHONE)) &&
-                  (mCurDevice & AudioSystem::DEVICE_OUT_SPEAKER) &&
-                  ((device & AudioSystem::DEVICE_OUT_WIRED_HEADSET) ||
-                  (device & AudioSystem::DEVICE_OUT_WIRED_HEADPHONE))) ||
-                  (((device & AudioSystem::DEVICE_OUT_WIRED_HEADSET) ||
-                  (device & AudioSystem::DEVICE_OUT_WIRED_HEADPHONE))  &&
-                  (device & AudioSystem::DEVICE_OUT_SPEAKER) &&
-                  ((mCurDevice & AudioSystem::DEVICE_OUT_WIRED_HEADSET) ||
-                  (mCurDevice & AudioSystem::DEVICE_OUT_WIRED_HEADPHONE)))) {
-                        for(ALSAHandleList::iterator it = mDeviceList.begin();
-                             it != mDeviceList.end(); ++it) {
-                             if((!strncmp(it->useCase, SND_USE_CASE_VERB_HIFI,
-                                 strlen(SND_USE_CASE_VERB_HIFI))) ||
-                                 (!strncmp(it->useCase, SND_USE_CASE_MOD_PLAY_MUSIC,
-                                 strlen(SND_USE_CASE_MOD_PLAY_MUSIC)))) {
-                                     mALSADevice->route(&(*it),(uint32_t)device, newMode);
-                                     break;
-                              }
-                         }
-        } else {
+        {
              ALSAHandleList::iterator it = mDeviceList.end();
              it--;
              mALSADevice->route(&(*it), (uint32_t)device, newMode);
@@ -1059,7 +1039,7 @@
               ALOGD("Starting recording in openoutputstream, musbRecordingState: %d", musbRecordingState);
               startUsbRecordingIfNotStarted();
               musbRecordingState |= USBRECBIT_VOIPCALL;
-           }else 
+           } else
 #endif
            {
                mALSADevice->route(&(*it),mCurDevice, AudioSystem::MODE_IN_COMMUNICATION);
diff --git a/alsa_sound/AudioStreamOutALSA.cpp b/alsa_sound/AudioStreamOutALSA.cpp
index 894d9f3..eb0949e 100644
--- a/alsa_sound/AudioStreamOutALSA.cpp
+++ b/alsa_sound/AudioStreamOutALSA.cpp
@@ -124,83 +124,81 @@
          (strcmp(mHandle->useCase, SND_USE_CASE_VERB_IP_VOICECALL)) &&
          (strcmp(mHandle->useCase, SND_USE_CASE_MOD_PLAY_VOIP))) {
         mParent->mLock.lock();
-        /* PCM handle might be closed and reopened immediately to flush
-         * the buffers, recheck and break if PCM handle is valid */
-        if (mHandle->handle == NULL && mHandle->rxHandle == NULL) {
-            snd_use_case_get(mHandle->ucMgr, "_verb", (const char **)&use_case);
-            if ((use_case == NULL) || (!strcmp(use_case, SND_USE_CASE_VERB_INACTIVE))) {
-                if(!strcmp(mHandle->useCase, SND_USE_CASE_VERB_IP_VOICECALL)){
-                     strlcpy(mHandle->useCase, SND_USE_CASE_VERB_IP_VOICECALL,sizeof(mHandle->useCase));
-                } else if (mHandle->isDeepbufferOutput){
-                           strlcpy(mHandle->useCase, SND_USE_CASE_VERB_HIFI, sizeof(mHandle->useCase));
-                } else {
-                           strlcpy(mHandle->useCase, SND_USE_CASE_VERB_HIFI_LOWLATENCY_MUSIC, sizeof(mHandle->useCase));
-                }
+
+        snd_use_case_get(mHandle->ucMgr, "_verb", (const char **)&use_case);
+        if ((use_case == NULL) || (!strcmp(use_case, SND_USE_CASE_VERB_INACTIVE))) {
+            if(!strcmp(mHandle->useCase, SND_USE_CASE_VERB_IP_VOICECALL)){
+                 strlcpy(mHandle->useCase, SND_USE_CASE_VERB_IP_VOICECALL,sizeof(mHandle->useCase));
+            } else if (mHandle->isDeepbufferOutput){
+                       strlcpy(mHandle->useCase, SND_USE_CASE_VERB_HIFI, sizeof(mHandle->useCase));
             } else {
-                if(!strcmp(mHandle->useCase, SND_USE_CASE_MOD_PLAY_VOIP)) {
-                    strlcpy(mHandle->useCase, SND_USE_CASE_MOD_PLAY_VOIP,sizeof(mHandle->useCase));
-                } else if (mHandle->isDeepbufferOutput){
-                           strlcpy(mHandle->useCase, SND_USE_CASE_MOD_PLAY_MUSIC, sizeof(mHandle->useCase));
-                } else {
-                           strlcpy(mHandle->useCase, SND_USE_CASE_MOD_PLAY_LOWLATENCY_MUSIC, sizeof(mHandle->useCase));
-                }
+                       strlcpy(mHandle->useCase, SND_USE_CASE_VERB_HIFI_LOWLATENCY_MUSIC, sizeof(mHandle->useCase));
             }
-            free(use_case);
-            if((!strcmp(mHandle->useCase, SND_USE_CASE_VERB_IP_VOICECALL)) ||
-               (!strcmp(mHandle->useCase, SND_USE_CASE_MOD_PLAY_VOIP))) {
+        } else {
+            if(!strcmp(mHandle->useCase, SND_USE_CASE_MOD_PLAY_VOIP)) {
+                strlcpy(mHandle->useCase, SND_USE_CASE_MOD_PLAY_VOIP,sizeof(mHandle->useCase));
+            } else if (mHandle->isDeepbufferOutput){
+                       strlcpy(mHandle->useCase, SND_USE_CASE_MOD_PLAY_MUSIC, sizeof(mHandle->useCase));
+            } else {
+                       strlcpy(mHandle->useCase, SND_USE_CASE_MOD_PLAY_LOWLATENCY_MUSIC, sizeof(mHandle->useCase));
+            }
+        }
+        free(use_case);
+        if((!strcmp(mHandle->useCase, SND_USE_CASE_VERB_IP_VOICECALL)) ||
+           (!strcmp(mHandle->useCase, SND_USE_CASE_MOD_PLAY_VOIP))) {
 #ifdef QCOM_USBAUDIO_ENABLED
-                if((mDevices & AudioSystem::DEVICE_OUT_ANLG_DOCK_HEADSET)||
-                      (mDevices & AudioSystem::DEVICE_OUT_DGTL_DOCK_HEADSET)||
-                      (mDevices & AudioSystem::DEVICE_OUT_PROXY)) {
-                    mDevices |= AudioSystem::DEVICE_OUT_PROXY;
-                    mHandle->module->route(mHandle, mDevices , mParent->mode());
-                }else
-#endif         
-                {
-                  mHandle->module->route(mHandle, mDevices , AudioSystem::MODE_IN_COMMUNICATION);
-                }
-#ifdef QCOM_USBAUDIO_ENABLED
-            } else if((mDevices & AudioSystem::DEVICE_OUT_ANLG_DOCK_HEADSET)||
-                      (mDevices & AudioSystem::DEVICE_OUT_DGTL_DOCK_HEADSET)||
-                      (mDevices & AudioSystem::DEVICE_OUT_PROXY)) {
+            if((mDevices & AudioSystem::DEVICE_OUT_ANLG_DOCK_HEADSET)||
+                  (mDevices & AudioSystem::DEVICE_OUT_DGTL_DOCK_HEADSET)||
+                  (mDevices & AudioSystem::DEVICE_OUT_PROXY)) {
                 mDevices |= AudioSystem::DEVICE_OUT_PROXY;
                 mHandle->module->route(mHandle, mDevices , mParent->mode());
+            }else
 #endif
-            } else {
- 
-                  mHandle->module->route(mHandle, mDevices , mParent->mode());
-            }
-            if (!strcmp(mHandle->useCase, SND_USE_CASE_VERB_HIFI) ||
-                !strcmp(mHandle->useCase, SND_USE_CASE_VERB_HIFI_LOWLATENCY_MUSIC) ||
-                !strcmp(mHandle->useCase, SND_USE_CASE_VERB_IP_VOICECALL)) {
-                snd_use_case_set(mHandle->ucMgr, "_verb", mHandle->useCase);
-            } else {
-                snd_use_case_set(mHandle->ucMgr, "_enamod", mHandle->useCase);
-            }
-            if((!strcmp(mHandle->useCase, SND_USE_CASE_VERB_IP_VOICECALL)) ||
-              (!strcmp(mHandle->useCase, SND_USE_CASE_MOD_PLAY_VOIP))) {
-                 err = mHandle->module->startVoipCall(mHandle);
-            }
-            else
-                 mHandle->module->open(mHandle);
-            if(mHandle->handle == NULL) {
-                ALOGE("write:: device open failed");
-                mParent->mLock.unlock();
-                return 0;
+            {
+              mHandle->module->route(mHandle, mDevices , AudioSystem::MODE_IN_COMMUNICATION);
             }
 #ifdef QCOM_USBAUDIO_ENABLED
-            if((mHandle->devices == AudioSystem::DEVICE_IN_ANLG_DOCK_HEADSET)||
-                   (mHandle->devices == AudioSystem::DEVICE_OUT_ANLG_DOCK_HEADSET)){
-                if((!strcmp(mHandle->useCase, SND_USE_CASE_VERB_IP_VOICECALL)) ||
-                   (!strcmp(mHandle->useCase, SND_USE_CASE_MOD_PLAY_VOIP))) {
-                    mParent->musbPlaybackState |= USBPLAYBACKBIT_VOIPCALL;
-                } else {
-                    mParent->startUsbPlaybackIfNotStarted();
-                    mParent->musbPlaybackState |= USBPLAYBACKBIT_MUSIC;
-                }
-            }
+        } else if((mDevices & AudioSystem::DEVICE_OUT_ANLG_DOCK_HEADSET)||
+                  (mDevices & AudioSystem::DEVICE_OUT_DGTL_DOCK_HEADSET)||
+                  (mDevices & AudioSystem::DEVICE_OUT_PROXY)) {
+            mDevices |= AudioSystem::DEVICE_OUT_PROXY;
+            mHandle->module->route(mHandle, mDevices , mParent->mode());
 #endif
+        } else {
+
+              mHandle->module->route(mHandle, mDevices , mParent->mode());
         }
+        if (!strcmp(mHandle->useCase, SND_USE_CASE_VERB_HIFI) ||
+            !strcmp(mHandle->useCase, SND_USE_CASE_VERB_HIFI_LOWLATENCY_MUSIC) ||
+            !strcmp(mHandle->useCase, SND_USE_CASE_VERB_IP_VOICECALL)) {
+            snd_use_case_set(mHandle->ucMgr, "_verb", mHandle->useCase);
+        } else {
+            snd_use_case_set(mHandle->ucMgr, "_enamod", mHandle->useCase);
+        }
+        if((!strcmp(mHandle->useCase, SND_USE_CASE_VERB_IP_VOICECALL)) ||
+          (!strcmp(mHandle->useCase, SND_USE_CASE_MOD_PLAY_VOIP))) {
+             err = mHandle->module->startVoipCall(mHandle);
+        }
+        else
+             mHandle->module->open(mHandle);
+        if(mHandle->handle == NULL) {
+            ALOGE("write:: device open failed");
+            mParent->mLock.unlock();
+            return 0;
+        }
+#ifdef QCOM_USBAUDIO_ENABLED
+        if((mHandle->devices == AudioSystem::DEVICE_IN_ANLG_DOCK_HEADSET)||
+               (mHandle->devices == AudioSystem::DEVICE_OUT_ANLG_DOCK_HEADSET)){
+            if((!strcmp(mHandle->useCase, SND_USE_CASE_VERB_IP_VOICECALL)) ||
+               (!strcmp(mHandle->useCase, SND_USE_CASE_MOD_PLAY_VOIP))) {
+                mParent->musbPlaybackState |= USBPLAYBACKBIT_VOIPCALL;
+            } else {
+                mParent->startUsbPlaybackIfNotStarted();
+                mParent->musbPlaybackState |= USBPLAYBACKBIT_MUSIC;
+            }
+        }
+#endif
+
         mParent->mLock.unlock();
     }
 
@@ -239,17 +237,20 @@
         }
         if (n < 0) {
             mParent->mLock.lock();
-            ALOGE("pcm_write returned error %l, trying to recover\n", n);
-            pcm_close(mHandle->handle);
-            mHandle->handle = NULL;
-            if((!strncmp(mHandle->useCase, SND_USE_CASE_VERB_IP_VOICECALL, strlen(SND_USE_CASE_VERB_IP_VOICECALL))) ||
-              (!strncmp(mHandle->useCase, SND_USE_CASE_MOD_PLAY_VOIP, strlen(SND_USE_CASE_MOD_PLAY_VOIP)))) {
-                 pcm_close(mHandle->rxHandle);
-                 mHandle->rxHandle = NULL;
-                 mHandle->module->startVoipCall(mHandle);
+            if (mHandle->handle != NULL) {
+                ALOGE("pcm_write returned error %d, trying to recover\n", n);
+                pcm_close(mHandle->handle);
+                mHandle->handle = NULL;
+                if((!strncmp(mHandle->useCase, SND_USE_CASE_VERB_IP_VOICECALL, strlen(SND_USE_CASE_VERB_IP_VOICECALL))) ||
+                  (!strncmp(mHandle->useCase, SND_USE_CASE_MOD_PLAY_VOIP, strlen(SND_USE_CASE_MOD_PLAY_VOIP)))) {
+                     pcm_close(mHandle->rxHandle);
+                     mHandle->rxHandle = NULL;
+                     mHandle->module->startVoipCall(mHandle);
+                }
+                else {
+                    mHandle->module->open(mHandle);
+                }
             }
-            else
-            mHandle->module->open(mHandle);
             mParent->mLock.unlock();
             continue;
         }
diff --git a/alsa_sound/alsa_default.cpp b/alsa_sound/alsa_default.cpp
index 0fd9f83..1754a82 100644
--- a/alsa_sound/alsa_default.cpp
+++ b/alsa_sound/alsa_default.cpp
@@ -412,22 +412,6 @@
     rxDevice = getUCMDevice(devices & AudioSystem::DEVICE_OUT_ALL, 0, NULL);
     txDevice = getUCMDevice(devices & AudioSystem::DEVICE_IN_ALL, 1, rxDevice);
 
-    if (rxDevice != NULL) {
-        if ((handle->handle) && (((!strncmp(rxDevice, DEVICE_SPEAKER_HEADSET, strlen(DEVICE_SPEAKER_HEADSET))) &&
-            ((!strncmp(curRxUCMDevice, DEVICE_HEADPHONES, strlen(DEVICE_HEADPHONES))) ||
-            (!strncmp(curRxUCMDevice, DEVICE_HEADSET, strlen(DEVICE_HEADSET))))) ||
-            (((!strncmp(curRxUCMDevice, DEVICE_SPEAKER_HEADSET, strlen(DEVICE_SPEAKER_HEADSET))) &&
-            ((!strncmp(rxDevice, DEVICE_HEADPHONES, strlen(DEVICE_HEADPHONES))) ||
-            (!strncmp(rxDevice, DEVICE_HEADSET, strlen(DEVICE_HEADSET))))))) &&
-            ((!strncmp(handle->useCase, SND_USE_CASE_VERB_HIFI, strlen(SND_USE_CASE_VERB_HIFI))) ||
-            (!strncmp(handle->useCase, SND_USE_CASE_MOD_PLAY_MUSIC, strlen(SND_USE_CASE_MOD_PLAY_MUSIC))))) {
-            pcm_close(handle->handle);
-            handle->handle=NULL;
-            handle->rxHandle=NULL;
-            pflag = true;
-        }
-    }
-
     if ((rxDevice != NULL) && (txDevice != NULL)) {
         if (((strncmp(rxDevice, curRxUCMDevice, MAX_STR_LEN)) ||
              (strncmp(txDevice, curTxUCMDevice, MAX_STR_LEN))) && (mode == AudioSystem::MODE_IN_CALL))
@@ -643,7 +627,7 @@
     }
     if (handle->channels == 1) {
         flags |= PCM_MONO;
-    } 
+    }
 #ifdef QCOM_SSR_ENABLED
     else if (handle->channels == 4 ) {
         flags |= PCM_QUAD;
@@ -654,7 +638,7 @@
         } else {
             flags |= PCM_5POINT1;
         }
-    } 
+    }
 #endif
     else {
         flags |= PCM_STEREO;
@@ -1108,7 +1092,7 @@
 static status_t s_standby(alsa_handle_t *handle)
 {
     int ret;
-    status_t err = NO_ERROR;  
+    status_t err = NO_ERROR;
     struct pcm *h = handle->rxHandle;
     handle->rxHandle = 0;
 #if LOCAL_LOGD
@@ -1495,7 +1479,7 @@
         err = csd_client_volume(vol);
         if (err < 0) {
             ALOGE("s_set_voice_volume: csd_client error %d", err);
-        } 
+        }
 #endif
     }
 }