audio: Cleanup adev_open_input_stream
Simplify logic a bit and also fix bug
where config for 24 bit recording was not
being set correctly
Change-Id: I48cbcb3a3775aa222bc8387e02795d4e4d234057
CRs-Fixed: 2133170
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 3ba3f77..f47b2b9 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -933,7 +933,6 @@
#define check_and_enable_effect(x) ENOSYS
#endif
-
int pcm_ioctl(struct pcm *pcm, int request, ...)
{
va_list ap;
@@ -6595,6 +6594,15 @@
in->standby = 1;
in->capture_handle = handle;
in->flags = flags;
+ in->bit_width = 16;
+ in->af_period_multiplier = 1;
+
+ /* Update config params with the requested sample rate and channels */
+ if ((in->device == AUDIO_DEVICE_IN_TELEPHONY_RX) &&
+ (adev->mode != AUDIO_MODE_IN_CALL)) {
+ ret = -EINVAL;
+ goto err_open;
+ }
/* restrict 24 bit capture for unprocessed source only
* for other sources if 24 bit requested reject 24 and set 16 bit capture only
@@ -6617,7 +6625,9 @@
goto err_open;
}
channel_count = audio_channel_count_from_in_mask(config->channel_mask);
- } else if (config->format == AUDIO_FORMAT_DEFAULT) {
+ }
+
+ if (config->format == AUDIO_FORMAT_DEFAULT) {
config->format = AUDIO_FORMAT_PCM_16_BIT;
} else if ((config->format == AUDIO_FORMAT_PCM_FLOAT) ||
(config->format == AUDIO_FORMAT_PCM_32_BIT) ||
@@ -6640,11 +6650,8 @@
if (config->sample_rate > 48000)
config->sample_rate = 48000;
ret_error = true;
- } else if (config->format == AUDIO_FORMAT_PCM_24_BIT_PACKED) {
- in->config.format = PCM_FORMAT_S24_3LE;
- } else if (config->format == AUDIO_FORMAT_PCM_8_24_BIT) {
- in->config.format = PCM_FORMAT_S24_LE;
- } else {
+ } else if (!(config->format == AUDIO_FORMAT_PCM_24_BIT_PACKED ||
+ config->format == AUDIO_FORMAT_PCM_8_24_BIT)) {
config->format = AUDIO_FORMAT_PCM_24_BIT_PACKED;
ret_error = true;
}
@@ -6673,32 +6680,18 @@
in->realtime = 0;
in->usecase = USECASE_AUDIO_RECORD_MMAP;
in->config = pcm_config_mmap_capture;
+ in->config.format = pcm_format_from_audio_format(config->format);
in->stream.start = in_start;
in->stream.stop = in_stop;
in->stream.create_mmap_buffer = in_create_mmap_buffer;
in->stream.get_mmap_position = in_get_mmap_position;
- in->af_period_multiplier = 1;
ALOGV("%s: USECASE_AUDIO_RECORD_MMAP", __func__);
} else if (in->realtime) {
in->config = pcm_config_audio_capture_rt;
+ in->config.format = pcm_format_from_audio_format(config->format);
in->sample_rate = in->config.rate;
in->af_period_multiplier = af_period_multiplier;
- } else {
- in->config = pcm_config_audio_capture;
- in->config.rate = config->sample_rate;
- in->sample_rate = config->sample_rate;
- in->af_period_multiplier = 1;
- }
- in->bit_width = 16;
-
- /* Update config params with the requested sample rate and channels */
- if ((in->device == AUDIO_DEVICE_IN_TELEPHONY_RX) &&
- (adev->mode != AUDIO_MODE_IN_CALL)) {
- ret = -EINVAL;
- goto err_open;
- }
-
- if (is_usb_dev && may_use_hifi_record) {
+ } else if (is_usb_dev && may_use_hifi_record) {
in->usecase = USECASE_AUDIO_RECORD_HIFI;
in->config = pcm_config_audio_capture;
frame_size = audio_stream_in_frame_size(&in->stream);
@@ -6708,7 +6701,6 @@
false /*is_low_latency*/);
in->config.period_size = buffer_size / frame_size;
in->config.rate = config->sample_rate;
- in->af_period_multiplier = 1;
in->config.format = pcm_format_from_audio_format(config->format);
in->config.channels = channel_count;
} else if ((in->device == AUDIO_DEVICE_IN_TELEPHONY_RX) ||
@@ -6751,41 +6743,54 @@
ret = audio_extn_cin_configure_input_stream(in);
if (ret)
goto err_open;
- } else {
- in->config.channels = channel_count;
- if (!in->realtime) {
- 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;
- }
-
+ } else if (in->source == AUDIO_SOURCE_VOICE_COMMUNICATION) {
+ bool valid_rate = (config->sample_rate == 8000 ||
+ config->sample_rate == 16000 ||
+ config->sample_rate == 32000 ||
+ config->sample_rate == 48000);
+ bool valid_ch = audio_channel_count_from_in_mask(in->channel_mask) == 1;
+ //XXX needed for voice_extn_compress_voip_open_input_stream
+ in->config.rate = config->sample_rate;
#ifndef COMPRESS_VOIP_ENABLED
- if ((in->source == AUDIO_SOURCE_VOICE_COMMUNICATION) &&
- (in->config.rate == 8000 || in->config.rate == 16000 ||
- in->config.rate == 32000 || in->config.rate == 48000) &&
- (audio_channel_count_from_in_mask(in->channel_mask) == 1)) {
-
+ if (valid_rate && valid_ch) {
in->usecase = USECASE_AUDIO_RECORD_VOIP;
in->config = default_pcm_config_voip_copp;
- in->config.period_size = VOIP_IO_BUF_SIZE(in->sample_rate, DEFAULT_VOIP_BUF_DURATION_MS, DEFAULT_VOIP_BIT_DEPTH_BYTE)/2;
- in->config.rate = in->sample_rate;
-#else
- if ((in->source == AUDIO_SOURCE_VOICE_COMMUNICATION) &&
- (in->dev->mode == AUDIO_MODE_IN_COMMUNICATION ||
- voice_extn_compress_voip_is_active(in->dev)) &&
- (voice_extn_compress_voip_is_format_supported(in->format)) &&
- (in->config.rate == 8000 || in->config.rate == 16000 ||
- in->config.rate == 32000 || in->config.rate == 48000) &&
- (audio_channel_count_from_in_mask(in->channel_mask) == 1)) {
- voice_extn_compress_voip_open_input_stream(in);
-#endif
+ in->config.period_size = VOIP_IO_BUF_SIZE(in->sample_rate,
+ DEFAULT_VOIP_BUF_DURATION_MS,
+ DEFAULT_VOIP_BIT_DEPTH_BYTE)/2;
}
+#else
+ if ((in->dev->mode == AUDIO_MODE_IN_COMMUNICATION ||
+ voice_extn_compress_voip_is_active(in->dev)) &&
+ (voice_extn_compress_voip_is_format_supported(in->format)) &&
+ valid_rate && valid_ch) {
+ voice_extn_compress_voip_open_input_stream(in);
+ }
+#endif
+ else {
+ ALOGE("%s AUDIO_SOURCE_VOICE_COMMUNICATION invalid args", __func__);
+ ret = -EINVAL;
+ if (!valid_ch) config->channel_mask = 1;
+ if (!valid_rate) config->sample_rate = 48000;
+ goto err_open;
+ }
+ // update back to whatever was overwritten
+ in->config.rate = config->sample_rate;
+ in->sample_rate = config->sample_rate;
+ } 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;
}
-
audio_extn_utils_update_stream_input_app_type_cfg(adev->platform,
&adev->streams_input_cfg_list,
devices, flags, in->format, in->sample_rate,