hal: Update the stream_in sample rate and also acquire lock for SSR

- Update the stream_in sample rate in adev_open_input_stream
  for surround sound record.
- As the ssr calls are not protected with the locks the ssr_init and ssr_deinit
  calls are coming from different threads and hence crash is seen in the ssr calls.

Change-Id: I22186a33e560a5de70a384b71910eb953fd369f0
diff --git a/hal/audio_extn/audio_extn.c b/hal/audio_extn/audio_extn.c
index c598990..b3ba566 100644
--- a/hal/audio_extn/audio_extn.c
+++ b/hal/audio_extn/audio_extn.c
@@ -1252,6 +1252,7 @@
                                                   bool *update_params)
 {
     bool ssr_supported = false;
+    in->config.rate = config->sample_rate;
     ssr_supported = audio_extn_ssr_check_usecase(in);
     if (ssr_supported) {
         return audio_extn_ssr_set_usecase(in, config, update_params);
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 2ff15a7..eec4fb3 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -6792,45 +6792,52 @@
         in->config.channels = channel_count;
         in->config.rate = config->sample_rate;
         in->sample_rate = config->sample_rate;
-    } else if (!audio_extn_check_and_set_multichannel_usecase(adev,
-                in, config, &channel_mask_updated)) {
-        if (channel_mask_updated == true) {
-            ALOGD("%s: return error to retry with updated channel mask (%#x)",
-                   __func__, config->channel_mask);
-            ret = -EINVAL;
-            goto err_open;
-        }
-        ALOGD("%s: created multi-channel session succesfully",__func__);
-    } else if (audio_extn_compr_cap_enabled() &&
-            audio_extn_compr_cap_format_supported(config->format) &&
-            (in->dev->mode != AUDIO_MODE_IN_COMMUNICATION)) {
-        audio_extn_compr_cap_init(in);
-    } else if (audio_extn_cin_applicable_stream(in)) {
-        ret = audio_extn_cin_configure_input_stream(in);
-        if (ret)
-            goto err_open;
     } else {
-        in->config = pcm_config_audio_capture;
-        in->config.rate = config->sample_rate;
-        in->config.format = pcm_format_from_audio_format(config->format);
-        in->config.channels = channel_count;
-        in->sample_rate = config->sample_rate;
-        in->format = config->format;
-        frame_size = audio_stream_in_frame_size(&in->stream);
-        buffer_size = get_input_buffer_size(config->sample_rate,
+        int ret_val;
+        pthread_mutex_lock(&adev->lock);
+        ret_val = audio_extn_check_and_set_multichannel_usecase(adev,
+               in, config, &channel_mask_updated);
+        pthread_mutex_unlock(&adev->lock);
+
+        if (!ret_val) {
+           if (channel_mask_updated == true) {
+               ALOGD("%s: return error to retry with updated channel mask (%#x)",
+                   __func__, config->channel_mask);
+               ret = -EINVAL;
+               goto err_open;
+           }
+           ALOGD("%s: created multi-channel session succesfully",__func__);
+        } else if (audio_extn_compr_cap_enabled() &&
+                   audio_extn_compr_cap_format_supported(config->format) &&
+                   (in->dev->mode != AUDIO_MODE_IN_COMMUNICATION)) {
+            audio_extn_compr_cap_init(in);
+        } else if (audio_extn_cin_applicable_stream(in)) {
+            ret = audio_extn_cin_configure_input_stream(in);
+            if (ret)
+                goto err_open;
+        } else {
+            in->config = pcm_config_audio_capture;
+            in->config.rate = config->sample_rate;
+            in->config.format = pcm_format_from_audio_format(config->format);
+            in->config.channels = channel_count;
+            in->sample_rate = config->sample_rate;
+            in->format = config->format;
+            frame_size = audio_stream_in_frame_size(&in->stream);
+            buffer_size = get_input_buffer_size(config->sample_rate,
                                             config->format,
                                             channel_count,
                                             is_low_latency);
-        in->config.period_size = buffer_size / frame_size;
+            in->config.period_size = buffer_size / frame_size;
 
-        if (in->source == AUDIO_SOURCE_VOICE_COMMUNICATION) {
-            /* optionally use VOIP usecase depending on config(s) */
-            ret = adev_update_voice_comm_input_stream(in, config);
-        }
+            if (in->source == AUDIO_SOURCE_VOICE_COMMUNICATION) {
+                /* optionally use VOIP usecase depending on config(s) */
+                ret = adev_update_voice_comm_input_stream(in, config);
+            }
 
-        if (ret) {
-            ALOGE("%s AUDIO_SOURCE_VOICE_COMMUNICATION invalid args", __func__);
-            goto err_open;
+            if (ret) {
+                ALOGE("%s AUDIO_SOURCE_VOICE_COMMUNICATION invalid args", __func__);
+                goto err_open;
+            }
         }
     }
     audio_extn_utils_update_stream_input_app_type_cfg(adev->platform,
@@ -6886,6 +6893,7 @@
     } else
         in_standby(&stream->common);
 
+    pthread_mutex_lock(&adev->lock);
     if (audio_extn_ssr_get_stream() == in) {
         audio_extn_ssr_deinit();
     }
@@ -6906,6 +6914,7 @@
         audio_extn_sound_trigger_stop_lab(in);
     }
     free(stream);
+    pthread_mutex_unlock(&adev->lock);
     return;
 }