Merge "pal: initialize curBtDevId to avoid unitialized use error"
diff --git a/configs/crow/mixer_paths_crow_qrd.xml b/configs/crow/mixer_paths_crow_qrd.xml
index 587416c..44bc7ba 100644
--- a/configs/crow/mixer_paths_crow_qrd.xml
+++ b/configs/crow/mixer_paths_crow_qrd.xml
@@ -822,11 +822,12 @@
     </path>
 
     <path name="va-mic-mono">
-        <ctl name="VA_AIF1_CAP Mixer DEC1" value="1" />
-        <ctl name="VA DEC1 MUX" value="SWR_MIC" />
-        <ctl name="VA SMIC MUX1" value="SWR_MIC0" />
-        <ctl name="ADC1 ChMap" value="SWRM_TX1_CH1" />
-        <ctl name="ADC1_MIXER Switch" value="1" />
+        <ctl name="VA_AIF1_CAP Mixer DEC2" value="1" />
+        <ctl name="VA DEC2 MUX" value="SWR_MIC" />
+        <ctl name="VA SMIC MUX2" value="SWR_MIC6" />
+        <ctl name="ADC2 ChMap" value="SWRM_TX2_CH3" />
+        <ctl name="ADC2 MUX" value="INP3" />
+        <ctl name="ADC2_MIXER Switch" value="1" />
     </path>
 
     <path name="va-mic-dmic">
@@ -839,8 +840,8 @@
         <ctl name="ADC2_BCS Disable" value="1" />
         <ctl name="ADC2 MUX" value="INP3" />
         <ctl name="VA SMIC MUX0" value="SWR_MIC0" />
-        <ctl name="VA SMIC MUX1" value="SWR_MIC5" />
-        <ctl name="ADC2 ChMap" value="SWRM_TX2_CH2" />
+        <ctl name="VA SMIC MUX1" value="SWR_MIC6" />
+        <ctl name="ADC2 ChMap" value="SWRM_TX2_CH3" />
         <ctl name="ADC1 ChMap" value="SWRM_TX1_CH1" />
         <ctl name="ADC2_MIXER Switch" value="1" />
         <ctl name="ADC1_MIXER Switch" value="1" />
@@ -929,37 +930,13 @@
     </path>
 
     <path name="va-mic-mono-lpi">
-        <ctl name="VA_DEC0 Volume" value="96" />
-        <ctl name="VA_AIF1_CAP Mixer DEC0" value="1" />
-        <ctl name="VA DEC0 MUX" value="SWR_MIC" />
-        <ctl name="VA_DEC0 MODE" value="ADC_LOW_PWR" />
-        <ctl name="TX0 MODE" value="ADC_LP" />
-        <ctl name="VA SMIC MUX0" value="SWR_MIC4" />
-        <ctl name="ADC1 ChMap" value="SWRM_TX2_CH1" />
-        <ctl name="ADC1_MIXER Switch" value="1" />
-        <ctl name="VA_AMIC1_MIXER Switch" value="1" />
+        <ctl name="LPI Enable" value="1" />
+        <path name="va-mic-mono" />
     </path>
 
     <path name="va-mic-dmic-lpi">
-        <ctl name="VA_DEC0 Volume" value="96" />
-        <ctl name="VA_DEC1 Volume" value="96" />
-        <ctl name="VA_AIF1_CAP Mixer DEC0" value="1" />
-        <ctl name="VA_AIF1_CAP Mixer DEC1" value="1" />
-        <ctl name="VA DEC0 MUX" value="SWR_MIC" />
-        <ctl name="VA DEC1 MUX" value="SWR_MIC" />
-        <ctl name="VA_DEC0 MODE" value="ADC_LOW_PWR" />
-        <ctl name="VA_DEC1 MODE" value="ADC_LOW_PWR" />
-        <ctl name="TX0 MODE" value="ADC_LP" />
-        <ctl name="TX2 MODE" value="ADC_LP" />
-        <ctl name="VA SMIC MUX0" value="SWR_MIC4" />
-        <ctl name="VA SMIC MUX1" value="SWR_MIC9" />
-        <ctl name="ADC4 MUX" value="INP5" />
-        <ctl name="ADC1 ChMap" value="SWRM_TX2_CH1" />
-        <ctl name="ADC4 ChMap" value="SWRM_TX3_CH2" />
-        <ctl name="ADC1_MIXER Switch" value="1" />
-        <ctl name="ADC4_MIXER Switch" value="1" />
-        <ctl name="VA_AMIC1_MIXER Switch" value="1" />
-        <ctl name="VA_AMIC5_MIXER Switch" value="1" />
+        <ctl name="LPI Enable" value="1" />
+        <path name="va-mic-dmic" />
     </path>
 
     <path name="va-mic-tmic-lpi">
@@ -1044,31 +1021,26 @@
     </path>
 
     <path name="headset-va-mic-lpi">
+        <ctl name="LPI Enable" value="1" />
         <ctl name="VA_AIF1_CAP Mixer DEC0" value="1" />
         <ctl name="VA DEC0 MUX" value="SWR_MIC" />
         <ctl name="VA SMIC MUX0" value="SWR_MIC5" />
-        <ctl name="TX1 MODE" value="ADC_LP" />
         <ctl name="ADC2 MUX" value="INP2" />
         <ctl name="VA_DEC0 MODE" value="ADC_LOW_PWR" />
         <ctl name="ADC2 ChMap" value="SWRM_TX2_CH2" />
-        <ctl name="HDR12 MUX" value="NO_HDR12" />
         <ctl name="ADC2_BCS Disable" value="1" />
         <ctl name="ADC2_MIXER Switch" value="1" />
-        <ctl name="VA_AMIC2_MIXER Switch" value="1" />
     </path>
 
     <path name="headset-va-mic">
         <ctl name="VA_AIF1_CAP Mixer DEC0" value="1" />
         <ctl name="VA DEC0 MUX" value="SWR_MIC" />
         <ctl name="VA SMIC MUX0" value="SWR_MIC5" />
-        <ctl name="TX1 MODE" value="ADC_LP" />
         <ctl name="ADC2 MUX" value="INP2" />
         <ctl name="VA_DEC0 MODE" value="ADC_LOW_PWR" />
         <ctl name="ADC2 ChMap" value="SWRM_TX2_CH2" />
-        <ctl name="HDR12 MUX" value="NO_HDR12" />
         <ctl name="ADC2_BCS Disable" value="1" />
         <ctl name="ADC2_MIXER Switch" value="1" />
-        <ctl name="VA_AMIC2_MIXER Switch" value="1" />
     </path>
 
     <path name="lpi-pcm-logging">
@@ -1077,40 +1049,33 @@
 
     <!-- Dual MIC devices -->
     <path name="handset-dmic-endfire">
-        <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
-        <ctl name="TX_AIF1_CAP Mixer DEC3" value="1" />
+        <ctl name="TX DEC1 MUX" value="SWR_MIC" />
         <ctl name="TX DEC2 MUX" value="SWR_MIC" />
-        <ctl name="TX DEC3 MUX" value="SWR_MIC" />
-        <ctl name="TX SMIC MUX2" value="SWR_MIC4" />
-        <ctl name="TX SMIC MUX3" value="SWR_MIC5" />
-        <ctl name="TX0 MODE" value="ADC_LP" />
-        <ctl name="TX3 MODE" value="ADC_LP" />
+        <ctl name="TX SMIC MUX1" value="SWR_MIC0" />
+        <ctl name="TX SMIC MUX2" value="SWR_MIC6" />
         <ctl name="ADC2 MUX" value="INP3" />
-        <ctl name="ADC1 ChMap" value="SWRM_TX2_CH1" />
-        <ctl name="ADC2 ChMap" value="SWRM_TX2_CH2" />
+        <ctl name="ADC1 ChMap" value="SWRM_TX1_CH1" />
+        <ctl name="ADC2_BCS Disable" value="1" />
+        <ctl name="ADC2 ChMap" value="SWRM_TX2_CH3" />
+        <ctl name="TX_AIF1_CAP Mixer DEC1" value="1" />
+        <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
         <ctl name="ADC1_MIXER Switch" value="1" />
         <ctl name="ADC2_MIXER Switch" value="1" />
-        <ctl name="AMIC1_MIXER Switch" value="1" />
-        <ctl name="AMIC3_MIXER Switch" value="1" />
     </path>
 
     <path name="speaker-dmic-endfire">
-        <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
-        <ctl name="TX_AIF1_CAP Mixer DEC3" value="1" />
+        <ctl name="TX DEC1 MUX" value="SWR_MIC" />
         <ctl name="TX DEC2 MUX" value="SWR_MIC" />
-        <ctl name="TX DEC3 MUX" value="SWR_MIC" />
-        <ctl name="TX SMIC MUX2" value="SWR_MIC9" />
-        <ctl name="TX SMIC MUX3" value="SWR_MIC4" />
-        <ctl name="ADC4 MUX" value="INP5" />
-        <ctl name="HDR34 MUX" value="NO_HDR34" />
-        <ctl name="TX2 MODE" value="ADC_LP" />
-        <ctl name="TX0 MODE" value="ADC_LP" />
-        <ctl name="ADC4 ChMap" value="SWRM_TX3_CH2" />
-        <ctl name="ADC1 ChMap" value="SWRM_TX2_CH1" />
-        <ctl name="ADC4_MIXER Switch" value="1" />
+        <ctl name="TX SMIC MUX1" value="SWR_MIC0" />
+        <ctl name="TX SMIC MUX2" value="SWR_MIC6" />
+        <ctl name="ADC2 MUX" value="INP3" />
+        <ctl name="ADC1 ChMap" value="SWRM_TX1_CH1" />
+        <ctl name="ADC2_BCS Disable" value="1" />
+        <ctl name="ADC2 ChMap" value="SWRM_TX2_CH3" />
+        <ctl name="TX_AIF1_CAP Mixer DEC1" value="1" />
+        <ctl name="TX_AIF1_CAP Mixer DEC2" value="1" />
         <ctl name="ADC1_MIXER Switch" value="1" />
-        <ctl name="AMIC5_MIXER Switch" value="1" />
-        <ctl name="AMIC1_MIXER Switch" value="1" />
+        <ctl name="ADC2_MIXER Switch" value="1" />
     </path>
 
     <path name="dmic-endfire">
diff --git a/device/src/Bluetooth.cpp b/device/src/Bluetooth.cpp
index 505c6fa..a448e47 100644
--- a/device/src/Bluetooth.cpp
+++ b/device/src/Bluetooth.cpp
@@ -1738,6 +1738,7 @@
 
     if (a2dpState != A2DP_STATE_STARTED && !totalActiveSessionRequests) {
         codecFormat = CODEC_TYPE_INVALID;
+        isAbrEnabled = false;
         PAL_DBG(LOG_TAG, "calling BT module stream start");
         /* This call indicates BT IPC lib to start playback */
         if (audio_source_start_api) {
diff --git a/device/src/USBAudio.cpp b/device/src/USBAudio.cpp
index 072ebd2..5c40793 100644
--- a/device/src/USBAudio.cpp
+++ b/device/src/USBAudio.cpp
@@ -774,16 +774,12 @@
         channels = MAX_HIFI_CHANNEL_COUNT;
 
     if (is_playback) {
-        // start from 2 channels as framework currently doesn't support mono.
-        if (channels >= 2) {
-            channel[num_masks++] = audio_channel_out_mask_from_count(2);
-        }
-        for (channel_count = 2;
-                channel_count <= channels && num_masks < MAX_SUPPORTED_CHANNEL_MASKS;
-                ++channel_count) {
-            channel[num_masks++] =
-                    audio_channel_mask_for_index_assignment_from_count(channel_count);
-        }
+        channel[num_masks++] = channels <= 2
+                     /* position mask for mono and stereo*/
+                     ? audio_channel_out_mask_from_count(channels)
+                     /* otherwise indexed */
+                     : audio_channel_mask_for_index_assignment_from_count(channels);
+        // TODO: needs to figure out the accurate match of channel mask
     } else {
         // For capture we report all supported channel masks from 1 channel up.
         channel_count = MIN_CHANNEL_COUNT;
diff --git a/resource_manager/src/ResourceManager.cpp b/resource_manager/src/ResourceManager.cpp
index 133e387..8007e33 100644
--- a/resource_manager/src/ResourceManager.cpp
+++ b/resource_manager/src/ResourceManager.cpp
@@ -7224,6 +7224,7 @@
                 PAL_DBG(LOG_TAG,"connected stream %pK from device %d",
                         std::get<0>(*sIter), (std::get<1>(*sIter))->id);
             }
+            std::get<0>(*sIter)->unlockStreamMutex();
         }
     }
 
@@ -7337,6 +7338,18 @@
         PAL_ERR(LOG_TAG, "Connect failed");
     }
 
+    for (sIter2 = streamDevConnectList.begin(); sIter2 != streamDevConnectList.end(); sIter2++) {
+        if ((std::get<0>(*sIter2) != NULL) && isStreamActive(std::get<0>(*sIter2), mActiveStreams)) {
+            for (sIter = uniqueStreamsList.begin(); sIter != uniqueStreamsList.end(); sIter++) {
+                if (*sIter == std::get<0>(*sIter2)) {
+                    uniqueStreamsList.erase(sIter);
+                    PAL_VERBOSE(LOG_TAG, "already unlocked, remove stream %pK from list",
+                                std::get<0>(*sIter2));
+                    break;
+                }
+            }
+        }
+    }
 exit:
     // unlock all stream mutexes
     for (sIter = uniqueStreamsList.begin(); sIter != uniqueStreamsList.end(); sIter++) {
diff --git a/session/src/Session.cpp b/session/src/Session.cpp
index 7235640..848e6d2 100644
--- a/session/src/Session.cpp
+++ b/session/src/Session.cpp
@@ -829,7 +829,7 @@
     return status;
 }
 
-/* This is to set devicePP MFC(if exists) and PSPD MFC */
+/* This is to set devicePP MFC(if exists) and PSPD MFC and stream MFC*/
 int Session::configureMFC(const std::shared_ptr<ResourceManager>& rm, struct pal_stream_attributes &sAttr,
             struct pal_device &dAttr, const std::vector<int> &pcmDevIds, const char* intf)
 {
@@ -896,6 +896,32 @@
         setSlotMask(rm, sAttr, dAttr, pcmDevIds);
     }
 
+    /* Prepare stream MFC payload */
+    if (sAttr.direction == PAL_AUDIO_INPUT) {
+        status = SessionAlsaUtils::getModuleInstanceId(mixer, pcmDevIds.at(0), intf,
+                                                       TAG_STREAM_MFC_SR, &miid);
+        if (status == 0) {
+            PAL_DBG(LOG_TAG, "miid : %x id = %d, data %s, dev id = %d\n", miid,
+                    pcmDevIds.at(0), intf, dAttr.id);
+            if (isPalPCMFormat(sAttr.in_media_config.aud_fmt_id))
+                mfcData.bitWidth = ResourceManager::palFormatToBitwidthLookup(
+                                                    sAttr.in_media_config.aud_fmt_id);
+            else
+                mfcData.bitWidth = sAttr.in_media_config.bit_width;
+            mfcData.sampleRate = sAttr.in_media_config.sample_rate;
+            mfcData.numChannel = sAttr.in_media_config.ch_info.channels;
+            mfcData.ch_info = nullptr;
+            builder->payloadMFCConfig((uint8_t **)&payload, &payloadSize, miid, &mfcData);
+            if (payloadSize && payload) {
+                status = updateCustomPayload(payload, payloadSize);
+                freeCustomPayload(&payload, &payloadSize);
+                if (0 != status) {
+                    PAL_ERR(LOG_TAG, "updateCustomPayload failed\n");
+                    goto exit;
+                }
+            }
+        }
+    }
     /* Prepare PSPD MFC payload */
     /* Get PSPD MFC MIID and configure to match to device config */
     /* This has to be done after sending all mixer controls and before connect */
diff --git a/session/src/SessionAlsaUtils.cpp b/session/src/SessionAlsaUtils.cpp
index f1e1ab8..024117c 100644
--- a/session/src/SessionAlsaUtils.cpp
+++ b/session/src/SessionAlsaUtils.cpp
@@ -2326,6 +2326,28 @@
                 status = -EINVAL;
                 goto exit;
             }
+        } else if (sAttr.direction == PAL_AUDIO_INPUT &&
+                   streamType == PAL_STREAM_ULTRA_LOW_LATENCY) {
+            if (sess) {
+                sess->configureMFC(rmHandle, sAttr, dAttr, pcmDevIds,
+                                    aifBackEndsToConnect[0].second.data());
+                sess->getCustomPayload(&payload, &payloadSize);
+                if (payload) {
+                    status = SessionAlsaUtils::setMixerParameter(mixerHandle, pcmDevIds.at(0),
+                                                payload, payloadSize);
+                }
+                sess->freeCustomPayload();
+                payload = NULL;
+                payloadSize = 0;
+                if (status != 0) {
+                    PAL_ERR(LOG_TAG, "setMixerParameter failed");
+                    goto exit;
+                }
+            } else {
+                PAL_ERR(LOG_TAG, "invalid session audio object");
+                status = -EINVAL;
+                goto exit;
+            }
         }
     } else if (!(SessionAlsaUtils::isMmapUsecase(sAttr))) {
         if (sess) {
@@ -2346,35 +2368,6 @@
             goto exit;
         }
     }
-    if (sAttr.direction == PAL_AUDIO_INPUT && streamType == PAL_STREAM_ULTRA_LOW_LATENCY) {
-        status = SessionAlsaUtils::getModuleInstanceId(mixerHandle, pcmDevIds.at(0),
-                                           aifBackEndsToConnect[0].second.data(),
-                                           TAG_STREAM_MFC_SR, &miid);
-        if (status != 0) {
-            PAL_ERR(LOG_TAG, "getModuleInstanceId failed\n");
-            goto exit;
-        }
-        PAL_DBG(LOG_TAG, "ULL record, miid : %x id = %d\n", miid, pcmDevIds.at(0));
-        if (isPalPCMFormat(sAttr.in_media_config.aud_fmt_id))
-            streamData.bitWidth = ResourceManager::palFormatToBitwidthLookup(
-                                                   sAttr.in_media_config.aud_fmt_id);
-        else
-            streamData.bitWidth = sAttr.in_media_config.bit_width;
-        streamData.sampleRate = sAttr.in_media_config.sample_rate;
-        streamData.numChannel = sAttr.in_media_config.ch_info.channels;
-        streamData.ch_info = nullptr;
-        builder->payloadMFCConfig(&payload, &payloadSize, miid, &streamData);
-        if (payloadSize && payload) {
-            sess->getCustomPayload(&payload, &payloadSize);
-        }
-        status = SessionAlsaUtils::setMixerParameter(mixerHandle, pcmDevIds.at(0),
-                                                    payload, payloadSize);
-        sess->freeCustomPayload();
-        if (status != 0) {
-            PAL_ERR(LOG_TAG, "setMixerParameter failed");
-            goto exit;
-         }
-    }
 
     connectCtrl = mixer_get_ctl_by_name(mixerHandle, connectCtrlName.str().data());
     if (!connectCtrl) {