audio: send device/use case info to sthal for mic concurrency.

- Send ST device while capture device is active/inactive
  - Sound trigger hal needs to know active capture device for
    implementation of concurrent capture.
- Send usecase to sthal for voice/VoIP case
  - if input source is voice communication, send VoIP use case to
    sthal.
- Including input snd device of matching backend
  - Send correct ST device to sthal by comparing backend

Bug: 126595113
Bug: 129733664
Bug: 133123985
Bug: 130316160

Test: (ST: sound trigger, VO: VoIP, PH: phone call,
       NR: media recording, PL: playback music)
 ST->VO (MO/MT),  ST->PH (MO/MT)
 ST->NR->PH (MO/MT), ST->NR->VO (MO/MT)
 ST->PL->PH (MO/MT), ST->PL->VO (MO/MT)
 ST->NR->PL->PH (MO/MT),  ST->NR->PL->VO (MO/MT)

Change-Id: I16ffaf669450e26582eadac9ba429961d1e38665
Signed-off-by: Jasmine Cha <chajasmine@google.com>
(cherry picked from commit b310c0762b92d070babe58da8923afc0e5a94eef)
Signed-off-by: Aniket Kumar Lata <alata@codeaurora.org>
diff --git a/hal/audio_extn/soundtrigger.c b/hal/audio_extn/soundtrigger.c
index 4ef3581..4f86373 100644
--- a/hal/audio_extn/soundtrigger.c
+++ b/hal/audio_extn/soundtrigger.c
@@ -186,6 +186,8 @@
 #define SVA_PARAM_CHANNEL_INDEX "st_channel_index"
 #define MAX_STR_LENGTH_FFV_PARAMS 30
 #define MAX_FFV_SESSION_ID 100
+
+#define ST_DEVICE SND_DEVICE_IN_HANDSET_MIC
 /*
  * Current proprietary API version used by AHAL. Queried by STHAL
  * for compatibility check with AHAL
@@ -254,7 +256,8 @@
         break;
 
     case PCM_CAPTURE:
-        if (uc_info->id == USECASE_AUDIO_RECORD_VOIP)
+        if (uc_info->stream.in != NULL &&
+             uc_info->stream.in->source == AUDIO_SOURCE_VOICE_COMMUNICATION)
             usecase->type = USECASE_TYPE_VOIP_CALL;
         else
             usecase->type = USECASE_TYPE_PCM_CAPTURE;
@@ -474,14 +477,7 @@
 
 bool is_same_as_st_device(snd_device_t snd_device)
 {
-    if (snd_device == SND_DEVICE_IN_HANDSET_MIC_AEC ||
-        snd_device == SND_DEVICE_IN_HANDSET_MIC ||
-        snd_device == SND_DEVICE_IN_HANDSET_MIC_AEC_NS ||
-        snd_device == SND_DEVICE_IN_SPEAKER_MIC ||
-        snd_device == SND_DEVICE_IN_VOICE_SPEAKER_MIC ||
-        snd_device == SND_DEVICE_IN_SPEAKER_MIC_AEC ||
-        snd_device == SND_DEVICE_IN_SPEAKER_MIC_AEC_NS ||
-        snd_device == SND_DEVICE_IN_SPEAKER_MIC_NS) {
+    if (platform_check_all_backends_match(ST_DEVICE, snd_device)) {
         ALOGD("audio HAL using same device %d as ST", snd_device);
         return true;
     }
@@ -529,32 +525,52 @@
 {
     bool raise_event = false;
     int device_type = -1;
+    struct audio_event_info ev_info;
+
+    ev_info.u.usecase.type = -1;
 
     if (!st_dev)
        return;
 
+    list_init(&ev_info.device_info.devices);
+
     if (snd_device >= SND_DEVICE_OUT_BEGIN &&
         snd_device < SND_DEVICE_OUT_END)
         device_type = PCM_PLAYBACK;
     else if (snd_device >= SND_DEVICE_IN_BEGIN &&
-        snd_device < SND_DEVICE_IN_END)
+        snd_device < SND_DEVICE_IN_END) {
         device_type = PCM_CAPTURE;
-    else {
+        if (is_same_as_st_device(snd_device))
+            update_device_list(&ev_info.device_info.devices, ST_DEVICE_HANDSET_MIC, "", true);
+    } else {
         ALOGE("%s: invalid device 0x%x, for event %d",
                            __func__, snd_device, event);
         return;
     }
 
+    struct stream_in *active_input = adev_get_active_input(st_dev->adev);
+    audio_source_t  source = (active_input == NULL) ?
+                               AUDIO_SOURCE_DEFAULT : active_input->source;
+    if (st_dev->adev->mode == AUDIO_MODE_IN_CALL) {
+        ev_info.u.usecase.type = USECASE_TYPE_VOICE_CALL;
+    } else if ((st_dev->adev->mode == AUDIO_MODE_IN_COMMUNICATION ||
+                source == AUDIO_SOURCE_VOICE_COMMUNICATION) &&
+               active_input) {
+        ev_info.u.usecase.type  = USECASE_TYPE_VOIP_CALL;
+    } else if (device_type == PCM_CAPTURE) {
+        ev_info.u.usecase.type  = USECASE_TYPE_PCM_CAPTURE;
+    }
+
     raise_event = platform_sound_trigger_device_needs_event(snd_device);
     ALOGI("%s: device 0x%x of type %d for Event %d, with Raise=%d",
         __func__, snd_device, device_type, event, raise_event);
     if (raise_event && (device_type == PCM_CAPTURE)) {
         switch(event) {
         case ST_EVENT_SND_DEVICE_FREE:
-            st_dev->st_callback(AUDIO_EVENT_CAPTURE_DEVICE_INACTIVE, NULL);
+            st_dev->st_callback(AUDIO_EVENT_CAPTURE_DEVICE_INACTIVE, &ev_info);
             break;
         case ST_EVENT_SND_DEVICE_BUSY:
-            st_dev->st_callback(AUDIO_EVENT_CAPTURE_DEVICE_ACTIVE, NULL);
+            st_dev->st_callback(AUDIO_EVENT_CAPTURE_DEVICE_ACTIVE, &ev_info);
             break;
         default:
             ALOGW("%s:invalid event %d for device 0x%x",
diff --git a/hal/platform_api.h b/hal/platform_api.h
index 05ddcb1..c8c1447 100644
--- a/hal/platform_api.h
+++ b/hal/platform_api.h
@@ -314,6 +314,7 @@
                               int *num_devices,
                               snd_device_t *new_snd_devices);
 
+bool platform_check_all_backends_match(snd_device_t snd_device1, snd_device_t snd_device2);
 bool platform_check_backends_match(snd_device_t snd_device1, snd_device_t snd_device2);
 int platform_set_sidetone(struct audio_device *adev,
                           snd_device_t out_snd_device,