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
}
}