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