audio: Fix regressions in adev_open_input_stream

1) Refactor selection logic to select default input if COMPRESS_VOIP
   feature is enabled
2) If stream config allows usb hifi record, proceed to select usecase
   without checking for config again
3) Set channel count requested in open_input_stream for realtime usecases

CRs-Fixed: 2148143
Change-Id: Idb7fc78c6d53578713a79490309d96d9d7980977
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 6097028..a101d2d 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -6527,6 +6527,47 @@
     return allowed;
 }
 
+static int adev_update_voice_comm_input_stream(struct stream_in *in,
+                                               struct audio_config *config)
+{
+    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;
+
+#ifndef COMPRESS_VOIP_ENABLED
+    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;
+    } else {
+        if (!valid_ch) config->channel_mask = 1;
+        if (!valid_rate) config->sample_rate = 48000;
+        return -EINVAL;
+    }
+    in->config.rate = config->sample_rate;
+    in->sample_rate = config->sample_rate;
+#else
+    //XXX needed for voice_extn_compress_voip_open_input_stream
+    in->config.rate = config->sample_rate;
+    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);
+        // update rate entries to match config from AF
+        in->config.rate = config->sample_rate;
+        in->sample_rate = config->sample_rate;
+    } else {
+        ALOGW("%s compress voip not active, use defaults", __func__);
+    }
+#endif
+    return 0;
+}
+
 static int adev_open_input_stream(struct audio_hw_device *dev,
                                   audio_io_handle_t handle,
                                   audio_devices_t devices,
@@ -6609,9 +6650,6 @@
         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
-     */
     if (is_usb_dev && may_use_hifi_record) {
         /* HiFi record selects an appropriate format, channel, rate combo
            depending on sink capabilities*/
@@ -6630,9 +6668,7 @@
             goto err_open;
         }
         channel_count = audio_channel_count_from_in_mask(config->channel_mask);
-    }
-
-    if (config->format == AUDIO_FORMAT_DEFAULT) {
+    } else 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) ||
@@ -6694,6 +6730,7 @@
     } else if (in->realtime) {
         in->config = pcm_config_audio_capture_rt;
         in->config.format = pcm_format_from_audio_format(config->format);
+        in->config.channels = channel_count;
         in->sample_rate = in->config.rate;
         in->af_period_multiplier = af_period_multiplier;
     } else if (is_usb_dev && may_use_hifi_record) {
@@ -6748,40 +6785,6 @@
         ret = audio_extn_cin_configure_input_stream(in);
         if (ret)
             goto err_open;
-    } 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 (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;
-        }
-#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;
@@ -6795,11 +6798,22 @@
                                             channel_count,
                                             is_low_latency);
         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 (ret) {
+            ALOGE("%s AUDIO_SOURCE_VOICE_COMMUNICATION invalid args", __func__);
+            goto err_open;
+        }
     }
     audio_extn_utils_update_stream_input_app_type_cfg(adev->platform,
                                                 &adev->streams_input_cfg_list,
-                                                devices, flags, in->format, in->sample_rate,
-                                                in->bit_width, in->profile, &in->app_type_cfg);
+                                                devices, flags, in->format,
+                                                in->sample_rate, in->bit_width,
+                                                in->profile, &in->app_type_cfg);
 
     /* This stream could be for sound trigger lab,
        get sound trigger pcm if present */