audio: hal: support app_type for capture usecase

When audio path is enabled app_type, acdb_id details are sent to
driver using mixer controls. Add support for audio recording also.

Change-Id: Id81719485abb710f10fd5171a3dd8551d2cfa7a5
diff --git a/hal/audio_extn/utils.c b/hal/audio_extn/utils.c
index 8e2e1dc..0698e73 100644
--- a/hal/audio_extn/utils.c
+++ b/hal/audio_extn/utils.c
@@ -499,11 +499,13 @@
     app_type_cfg->bit_width = 16;
 }
 
+#define GENERAL_RECORDING_APP_TYPE  0x11132
 int audio_extn_utils_send_app_type_cfg(struct audio_usecase *usecase)
 {
     char mixer_ctl_name[MAX_LENGTH_MIXER_CONTROL_IN_INT];
     int app_type_cfg[MAX_LENGTH_MIXER_CONTROL_IN_INT], len = 0, rc;
     struct stream_out *out;
+    struct stream_in *in;
     struct audio_device *adev;
     struct mixer_ctl *ctl;
     int pcm_device_id, acdb_dev_id, snd_device = usecase->out_snd_device;
@@ -511,25 +513,32 @@
 
     ALOGV("%s", __func__);
 
-    if (usecase->type != PCM_PLAYBACK) {
-        ALOGV("%s: not a playback path, no need to cfg app type", __func__);
+    if (usecase->type != PCM_PLAYBACK && usecase->type != PCM_CAPTURE) {
+        ALOGE("%s: not a playback or capture path, no need to cfg app type", __func__);
         rc = 0;
         goto exit_send_app_type_cfg;
     }
     if ((usecase->id != USECASE_AUDIO_PLAYBACK_DEEP_BUFFER) &&
         (usecase->id != USECASE_AUDIO_PLAYBACK_LOW_LATENCY) &&
         (usecase->id != USECASE_AUDIO_PLAYBACK_MULTI_CH) &&
-        (!is_offload_usecase(usecase->id))) {
+        (!is_offload_usecase(usecase->id)) &&
+        (usecase->type != PCM_CAPTURE)) {
         ALOGV("%s: a playback path where app type cfg is not required %d", __func__, usecase->id);
         rc = 0;
         goto exit_send_app_type_cfg;
     }
-    out = usecase->stream.out;
-    adev = out->dev;
-
-    snd_device = usecase->out_snd_device;
-
-    pcm_device_id = platform_get_pcm_device_id(out->usecase, PCM_PLAYBACK);
+    if (usecase->type == PCM_PLAYBACK) {
+        out = usecase->stream.out;
+        adev = out->dev;
+        snd_device = usecase->out_snd_device;
+        pcm_device_id = platform_get_pcm_device_id(out->usecase, PCM_PLAYBACK);
+    }
+    if (usecase->type == PCM_CAPTURE) {
+        in = usecase->stream.in;
+        adev = in->dev;
+        snd_device = usecase->in_snd_device;
+        pcm_device_id = platform_get_pcm_device_id(in->usecase, PCM_CAPTURE);
+    }
 
     snprintf(mixer_ctl_name, sizeof(mixer_ctl_name),
              "Audio Stream %d App Type Cfg", pcm_device_id);
@@ -550,32 +559,40 @@
         goto exit_send_app_type_cfg;
     }
 
-    if ((24 == usecase->stream.out->bit_width) &&
-        (usecase->stream.out->devices & AUDIO_DEVICE_OUT_SPEAKER)) {
-        sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
-    } else if ((snd_device != SND_DEVICE_OUT_HEADPHONES_44_1 &&
-        usecase->stream.out->sample_rate == OUTPUT_SAMPLING_RATE_44100) ||
-        (usecase->stream.out->sample_rate < OUTPUT_SAMPLING_RATE_44100)) {
-        sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
-    } else {
-        sample_rate = out->app_type_cfg.sample_rate;
-    }
+    if (usecase->type == PCM_PLAYBACK) {
+        if ((24 == usecase->stream.out->bit_width) &&
+            (usecase->stream.out->devices & AUDIO_DEVICE_OUT_SPEAKER)) {
+            sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
+        } else if ((snd_device != SND_DEVICE_OUT_HEADPHONES_44_1 &&
+            usecase->stream.out->sample_rate == OUTPUT_SAMPLING_RATE_44100) ||
+            (usecase->stream.out->sample_rate < OUTPUT_SAMPLING_RATE_44100)) {
+            sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
+        } else {
+            sample_rate = out->app_type_cfg.sample_rate;
+        }
 
-    app_type_cfg[len++] = out->app_type_cfg.app_type;
-    app_type_cfg[len++] = acdb_dev_id;
-    if (((out->format == AUDIO_FORMAT_E_AC3) ||
-        (out->format == AUDIO_FORMAT_E_AC3_JOC))
+        app_type_cfg[len++] = out->app_type_cfg.app_type;
+        app_type_cfg[len++] = acdb_dev_id;
+        if (((out->format == AUDIO_FORMAT_E_AC3) ||
+            (out->format == AUDIO_FORMAT_E_AC3_JOC))
 #ifdef HDMI_PASSTHROUGH_ENABLED
-        && (out->flags  & AUDIO_OUTPUT_FLAG_COMPRESS_PASSTHROUGH)
+            && (out->flags  & AUDIO_OUTPUT_FLAG_COMPRESS_PASSTHROUGH)
 #endif
-        )
-        app_type_cfg[len++] = sample_rate * 4;
-    else
+            )
+            app_type_cfg[len++] = sample_rate * 4;
+        else
+            app_type_cfg[len++] = sample_rate;
+        ALOGI("%s PLAYBACK app_type %d, acdb_dev_id %d, sample_rate %d",
+              __func__, out->app_type_cfg.app_type, acdb_dev_id, sample_rate);
+    }
+    else if (usecase->type == PCM_CAPTURE) {
+        app_type_cfg[len++] = GENERAL_RECORDING_APP_TYPE;
+        app_type_cfg[len++] = acdb_dev_id;
         app_type_cfg[len++] = sample_rate;
-
+        ALOGI("%s CAPTURE app_type %d, acdb_dev_id %d, sample_rate %d",
+           __func__, platform_get_default_app_type(adev->platform), acdb_dev_id, sample_rate);
+    }
     mixer_ctl_set_array(ctl, app_type_cfg, len);
-    ALOGI("%s app_type %d, acdb_dev_id %d, sample_rate %d",
-           __func__, out->app_type_cfg.app_type, acdb_dev_id, sample_rate);
     rc = 0;
 exit_send_app_type_cfg:
     return rc;