Audio HAL: Add support for incall music usecase
This change adds the incall music uplink usecase to the audio hal.
The change adds a check for the AUDIO_OUTPUT_INCALL_MUSIC_UPLINK flag
when opening an output stream. The playback config logic as well as the
mixer path and flag name is the same one
which is used for the usecase in other repo/code paths.
This is part of a larger change which will enable routing audio playback to the
uplink stream using the AudioTrack and setPreferredDevice method, and
will only be available for apps with the MODIFY_PHONE_STATE permission.
Bug: 69973354.
Test: Tested manually.
Change-Id: Ief23049936134b27aefff449c25e8579ce24489e
diff --git a/hal/Android.mk b/hal/Android.mk
index 71d4c80..02c4832 100644
--- a/hal/Android.mk
+++ b/hal/Android.mk
@@ -39,17 +39,20 @@
LOCAL_CFLAGS := -DPLATFORM_MSM8996
LOCAL_CFLAGS += -DMAX_TARGET_SPECIFIC_CHANNEL_CNT="4"
LOCAL_CFLAGS += -DKPI_OPTIMIZE_ENABLED
+ LOCAL_CFLAGS += -DINCALL_MUSIC_ENABLED
MULTIPLE_HW_VARIANTS_ENABLED := true
endif
ifneq ($(filter msm8998,$(TARGET_BOARD_PLATFORM)),)
LOCAL_CFLAGS := -DPLATFORM_MSM8998
LOCAL_CFLAGS += -DMAX_TARGET_SPECIFIC_CHANNEL_CNT="4"
+ LOCAL_CFLAGS += -DINCALL_MUSIC_ENABLED
MULTIPLE_HW_VARIANTS_ENABLED := true
endif
ifneq ($(filter sdm845,$(TARGET_BOARD_PLATFORM)),)
LOCAL_CFLAGS := -DPLATFORM_SDM845
LOCAL_CFLAGS += -DMAX_TARGET_SPECIFIC_CHANNEL_CNT="4"
LOCAL_CFLAGS += -DKPI_OPTIMIZE_ENABLED
+ LOCAL_CFLAGS += -DINCALL_MUSIC_ENABLED
MULTIPLE_HW_VARIANTS_ENABLED := true
endif
endif
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 77081c7..7037b56 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -287,6 +287,8 @@
[USECASE_AUDIO_PLAYBACK_VOIP] = "audio-playback-voip",
[USECASE_AUDIO_RECORD_VOIP] = "audio-record-voip",
+
+ [USECASE_INCALL_MUSIC_UPLINK] = "incall-music-uplink",
};
@@ -2706,7 +2708,7 @@
if (out->muted)
memset((void *)buffer, 0, bytes);
// FIXME: this can be removed once audio flinger mixer supports mono output
- if (out->usecase == USECASE_AUDIO_PLAYBACK_VOIP) {
+ if (out->usecase == USECASE_AUDIO_PLAYBACK_VOIP || out->usecase == USECASE_INCALL_MUSIC_UPLINK) {
size_t channel_count = audio_channel_count_from_out_mask(out->channel_mask);
int16_t *src = (int16_t *)buffer;
int16_t *dst = (int16_t *)buffer;
@@ -3867,6 +3869,50 @@
ALOGV("%s: offloaded output offload_info version %04x bit rate %d",
__func__, config->offload_info.version,
config->offload_info.bit_rate);
+ } else if (out->flags & AUDIO_OUTPUT_FLAG_INCALL_MUSIC) {
+ switch (config->sample_rate) {
+ case 0:
+ out->sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
+ break;
+ case 8000:
+ case 16000:
+ case 48000:
+ out->sample_rate = config->sample_rate;
+ break;
+ default:
+ ALOGE("%s: Unsupported sampling rate %d for Incall Music", __func__,
+ config->sample_rate);
+ config->sample_rate = DEFAULT_OUTPUT_SAMPLING_RATE;
+ ret = -EINVAL;
+ goto error_open;
+ }
+ //FIXME: add support for MONO stream configuration when audioflinger mixer supports it
+ switch (config->channel_mask) {
+ case AUDIO_CHANNEL_NONE:
+ case AUDIO_CHANNEL_OUT_STEREO:
+ out->channel_mask = AUDIO_CHANNEL_OUT_STEREO;
+ break;
+ default:
+ ALOGE("%s: Unsupported channel mask %#x for Incall Music", __func__,
+ config->channel_mask);
+ config->channel_mask = AUDIO_CHANNEL_OUT_STEREO;
+ ret = -EINVAL;
+ goto error_open;
+ }
+ switch (config->format) {
+ case AUDIO_FORMAT_DEFAULT:
+ case AUDIO_FORMAT_PCM_16_BIT:
+ out->format = AUDIO_FORMAT_PCM_16_BIT;
+ break;
+ default:
+ ALOGE("%s: Unsupported format %#x for Incall Music", __func__,
+ config->format);
+ config->format = AUDIO_FORMAT_PCM_16_BIT;
+ ret = -EINVAL;
+ goto error_open;
+ }
+
+ voice_extn_check_and_set_incall_music_usecase(adev, out);
} else if (out->devices == AUDIO_DEVICE_OUT_TELEPHONY_TX) {
switch (config->sample_rate) {
case 0:
diff --git a/hal/audio_hw.h b/hal/audio_hw.h
index 845ce6c..06cacc2 100644
--- a/hal/audio_hw.h
+++ b/hal/audio_hw.h
@@ -131,6 +131,8 @@
USECASE_AUDIO_PLAYBACK_VOIP,
USECASE_AUDIO_RECORD_VOIP,
+ USECASE_INCALL_MUSIC_UPLINK,
+
AUDIO_USECASE_MAX
};
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index c61b8ad..4efd1d2 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -205,6 +205,9 @@
AUDIO_PLAYBACK_VOIP_PCM_DEVICE},
[USECASE_AUDIO_RECORD_VOIP] = {AUDIO_RECORD_VOIP_PCM_DEVICE,
AUDIO_RECORD_VOIP_PCM_DEVICE},
+
+ [USECASE_INCALL_MUSIC_UPLINK] = {INCALL_MUSIC_UPLINK_PCM_DEVICE,
+ INCALL_MUSIC_UPLINK_PCM_DEVICE},
};
/* Array to store sound devices */
@@ -587,6 +590,7 @@
{TO_NAME_INDEX(USECASE_AUDIO_DSM_FEEDBACK)},
{TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_VOIP)},
{TO_NAME_INDEX(USECASE_AUDIO_RECORD_VOIP)},
+ {TO_NAME_INDEX(USECASE_INCALL_MUSIC_UPLINK)},
};
static const struct name_to_index usecase_type_index[USECASE_TYPE_MAX] = {
diff --git a/hal/msm8974/platform.h b/hal/msm8974/platform.h
index 7c5133b..aebd667 100644
--- a/hal/msm8974/platform.h
+++ b/hal/msm8974/platform.h
@@ -314,6 +314,8 @@
#define AFE_PROXY_PLAYBACK_PCM_DEVICE 7
#define AFE_PROXY_RECORD_PCM_DEVICE 8
+#define INCALL_MUSIC_UPLINK_PCM_DEVICE 27
+
#define HFP_PCM_RX 5
#ifdef PLATFORM_MSM8x26
#ifdef EXTERNAL_BT_SUPPORTED
diff --git a/hal/voice_extn/voice_extn.c b/hal/voice_extn/voice_extn.c
index 01a1c3f..92b85b6 100644
--- a/hal/voice_extn/voice_extn.c
+++ b/hal/voice_extn/voice_extn.c
@@ -583,22 +583,14 @@
int voice_extn_check_and_set_incall_music_usecase(struct audio_device *adev,
struct stream_out *out)
{
- uint32_t session_id = 0;
-
- session_id = get_session_id_with_state(adev, CALL_LOCAL_HOLD);
- if (session_id == VOICE_VSID) {
- out->usecase = USECASE_INCALL_MUSIC_UPLINK;
- } else if (session_id == VOICE2_VSID) {
- out->usecase = USECASE_INCALL_MUSIC_UPLINK2;
- } else {
- ALOGE("%s: Invalid session id %x", __func__, session_id);
- return -EINVAL;
- }
-
+ out->usecase = USECASE_INCALL_MUSIC_UPLINK;
out->config = pcm_config_incall_music;
- out->supported_channel_masks[0] = AUDIO_CHANNEL_OUT_MONO;
- out->channel_mask = AUDIO_CHANNEL_OUT_MONO;
+ //FIXME: add support for MONO stream configuration when audioflinger mixer supports it
+ out->supported_channel_masks[0] = AUDIO_CHANNEL_OUT_STEREO;
+ out->channel_mask = AUDIO_CHANNEL_OUT_STEREO;
+ out->config.rate = out->sample_rate;
+ ALOGV("%s: mode=%d, usecase id=%d", __func__, adev->mode, out->usecase);
return 0;
}
#endif