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,