Merge "configs: update adsp sva handset device path with wcd9340 for msmcobalt" into audio-userspace.lnx.2.1-dev
diff --git a/configs/msmcobalt/mixer_paths_tasha.xml b/configs/msmcobalt/mixer_paths_tasha.xml
index 038408c..fe3446b 100644
--- a/configs/msmcobalt/mixer_paths_tasha.xml
+++ b/configs/msmcobalt/mixer_paths_tasha.xml
@@ -205,12 +205,6 @@
<ctl name="MultiMedia1 Mixer USB_AUDIO_TX" value="0" />
<ctl name="MultiMedia5 Mixer USB_AUDIO_TX" value="0" />
<ctl name="MultiMedia8 Mixer USB_AUDIO_TX" value="0" />
- <ctl name="USB_AUDIO_RX Channels" value="One" />
- <ctl name="USB_AUDIO_RX SampleRate" value="KHZ_48" />
- <ctl name="USB_AUDIO_RX Format" value="S16_LE" />
- <ctl name="USB_AUDIO_TX Channels" value="One" />
- <ctl name="USB_AUDIO_TX SampleRate" value="KHZ_48" />
- <ctl name="USB_AUDIO_TX Format" value="S16_LE" />
<ctl name="MultiMedia6 Mixer SLIM_0_TX" value="0" />
<ctl name="IIR0 INP0 MUX" value="ZERO" />
<ctl name="IIR0 INP1 MUX" value="ZERO" />
diff --git a/configs/msmcobalt/mixer_paths_tavil.xml b/configs/msmcobalt/mixer_paths_tavil.xml
index 4baaa52..5c18acb 100644
--- a/configs/msmcobalt/mixer_paths_tavil.xml
+++ b/configs/msmcobalt/mixer_paths_tavil.xml
@@ -166,12 +166,6 @@
<ctl name="MultiMedia1 Mixer USB_AUDIO_TX" value="0" />
<ctl name="MultiMedia5 Mixer USB_AUDIO_TX" value="0" />
<ctl name="MultiMedia8 Mixer USB_AUDIO_TX" value="0" />
- <ctl name="USB_AUDIO_RX Channels" value="One" />
- <ctl name="USB_AUDIO_RX SampleRate" value="KHZ_48" />
- <ctl name="USB_AUDIO_RX Format" value="S16_LE" />
- <ctl name="USB_AUDIO_TX Channels" value="One" />
- <ctl name="USB_AUDIO_TX SampleRate" value="KHZ_48" />
- <ctl name="USB_AUDIO_TX Format" value="S16_LE" />
<ctl name="MultiMedia6 Mixer SLIM_0_TX" value="0" />
<ctl name="SLIM_2_RX Format" value="UNPACKED" />
<ctl name="SLIM_2_RX SampleRate" value="KHZ_48" />
diff --git a/hal/audio_extn/dev_arbi.c b/hal/audio_extn/dev_arbi.c
index d7ab5ff..69d8568 100644
--- a/hal/audio_extn/dev_arbi.c
+++ b/hal/audio_extn/dev_arbi.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2014, 2016 The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
@@ -131,6 +131,7 @@
{SND_DEVICE_OUT_VOICE_HANDSET, AUDIO_DEVICE_OUT_EARPIECE},
{SND_DEVICE_OUT_SPEAKER, AUDIO_DEVICE_OUT_SPEAKER},
{SND_DEVICE_OUT_VOICE_SPEAKER, AUDIO_DEVICE_OUT_SPEAKER},
+ {SND_DEVICE_OUT_VOICE_SPEAKER_2, AUDIO_DEVICE_OUT_SPEAKER},
{SND_DEVICE_OUT_HEADPHONES, AUDIO_DEVICE_OUT_WIRED_HEADPHONE},
{SND_DEVICE_OUT_VOICE_HEADPHONES, AUDIO_DEVICE_OUT_WIRED_HEADPHONE},
{SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES,
diff --git a/hal/audio_extn/spkr_protection.c b/hal/audio_extn/spkr_protection.c
index 1f88c71..008130f 100644
--- a/hal/audio_extn/spkr_protection.c
+++ b/hal/audio_extn/spkr_protection.c
@@ -117,6 +117,11 @@
SPKR_PROTECTION_MODE_CALIBRATE = 1,
};
+struct spkr_prot_r0t0 {
+ int r0[SP_V2_NUM_MAX_SPKRS];
+ int t0[SP_V2_NUM_MAX_SPKRS];
+};
+
struct speaker_prot_session {
int spkr_prot_mode;
int spkr_processing_state;
@@ -142,6 +147,7 @@
bool spkr_prot_enable;
bool spkr_in_use;
struct timespec spkr_last_time_used;
+ struct spkr_prot_r0t0 sp_r0t0_cal;
bool wsa_found;
int spkr_1_tzn;
int spkr_2_tzn;
@@ -340,6 +346,7 @@
int ret = 0;
struct audio_cal_fb_spk_prot_cfg cal_data;
char value[PROPERTY_VALUE_MAX];
+ static int cal_done = 0;
if (cal_fd < 0) {
ALOGE("%s: Error: cal_fd = %d", __func__, cal_fd);
@@ -382,6 +389,13 @@
ret = -ENODEV;
goto done;
}
+ if (protCfg->mode == MSM_SPKR_PROT_CALIBRATED && !cal_done) {
+ handle.sp_r0t0_cal.r0[SP_V2_SPKR_1] = protCfg->r0[SP_V2_SPKR_1];
+ handle.sp_r0t0_cal.r0[SP_V2_SPKR_2] = protCfg->r0[SP_V2_SPKR_2];
+ handle.sp_r0t0_cal.t0[SP_V2_SPKR_1] = protCfg->t0[SP_V2_SPKR_1];
+ handle.sp_r0t0_cal.t0[SP_V2_SPKR_2] = protCfg->t0[SP_V2_SPKR_2];
+ cal_done = 1;
+ }
done:
return ret;
}
@@ -1347,12 +1361,48 @@
}
}
+int audio_extn_select_spkr_prot_cal_data(snd_device_t snd_device)
+{
+ struct audio_cal_info_spk_prot_cfg protCfg;
+ int acdb_fd = -1;
+ int ret = 0;
+
+ acdb_fd = open("/dev/msm_audio_cal", O_RDWR | O_NONBLOCK);
+ if (acdb_fd < 0) {
+ ALOGE("%s: open msm_acdb failed", __func__);
+ return -ENODEV;
+ }
+ switch(snd_device) {
+ case SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT:
+ case SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED:
+ protCfg.r0[SP_V2_SPKR_1] = handle.sp_r0t0_cal.r0[SP_V2_SPKR_2];
+ protCfg.r0[SP_V2_SPKR_2] = handle.sp_r0t0_cal.r0[SP_V2_SPKR_1];
+ protCfg.t0[SP_V2_SPKR_1] = handle.sp_r0t0_cal.t0[SP_V2_SPKR_2];
+ protCfg.t0[SP_V2_SPKR_2] = handle.sp_r0t0_cal.t0[SP_V2_SPKR_1];
+ break;
+ default:
+ protCfg.r0[SP_V2_SPKR_1] = handle.sp_r0t0_cal.r0[SP_V2_SPKR_1];
+ protCfg.r0[SP_V2_SPKR_2] = handle.sp_r0t0_cal.r0[SP_V2_SPKR_2];
+ protCfg.t0[SP_V2_SPKR_1] = handle.sp_r0t0_cal.t0[SP_V2_SPKR_1];
+ protCfg.t0[SP_V2_SPKR_2] = handle.sp_r0t0_cal.t0[SP_V2_SPKR_2];
+ break;
+ }
+ protCfg.mode = MSM_SPKR_PROT_CALIBRATED;
+ ret = set_spkr_prot_cal(acdb_fd, &protCfg);
+ if (ret)
+ ALOGE("%s: speaker protection cal data swap failed", __func__);
+
+ close(acdb_fd);
+ return ret;
+}
+
int audio_extn_spkr_prot_start_processing(snd_device_t snd_device)
{
struct audio_usecase *uc_info_tx;
struct audio_device *adev = handle.adev_handle;
int32_t pcm_dev_tx_id = -1, ret = 0;
bool disable_tx = false;
+ snd_device_t in_snd_device;
ALOGV("%s: Entry", __func__);
/* cancel speaker calibration */
@@ -1361,6 +1411,15 @@
return -EINVAL;
}
snd_device = platform_get_spkr_prot_snd_device(snd_device);
+ if (handle.spkr_prot_mode == MSM_SPKR_PROT_CALIBRATED) {
+ ret = audio_extn_select_spkr_prot_cal_data(snd_device);
+ if (ret) {
+ ALOGE("%s: Setting speaker protection cal data failed", __func__);
+ return ret;
+ }
+ }
+
+ in_snd_device = platform_get_vi_feedback_snd_device(snd_device);
spkr_prot_set_spkrstatus(true);
uc_info_tx = (struct audio_usecase *)calloc(1, sizeof(struct audio_usecase));
if (!uc_info_tx) {
@@ -1375,12 +1434,12 @@
if (handle.spkr_processing_state == SPKR_PROCESSING_IN_IDLE) {
uc_info_tx->id = USECASE_AUDIO_SPKR_CALIB_TX;
uc_info_tx->type = PCM_CAPTURE;
- uc_info_tx->in_snd_device = SND_DEVICE_IN_CAPTURE_VI_FEEDBACK;
+ uc_info_tx->in_snd_device = in_snd_device;
uc_info_tx->out_snd_device = SND_DEVICE_NONE;
handle.pcm_tx = NULL;
list_add_tail(&adev->usecase_list, &uc_info_tx->list);
disable_tx = true;
- enable_snd_device(adev, SND_DEVICE_IN_CAPTURE_VI_FEEDBACK);
+ enable_snd_device(adev, in_snd_device);
enable_audio_route(adev, uc_info_tx);
pcm_dev_tx_id = platform_get_pcm_device_id(uc_info_tx->id, PCM_CAPTURE);
@@ -1420,9 +1479,9 @@
list_remove(&uc_info_tx->list);
uc_info_tx->id = USECASE_AUDIO_SPKR_CALIB_TX;
uc_info_tx->type = PCM_CAPTURE;
- uc_info_tx->in_snd_device = SND_DEVICE_IN_CAPTURE_VI_FEEDBACK;
+ uc_info_tx->in_snd_device = in_snd_device;
uc_info_tx->out_snd_device = SND_DEVICE_NONE;
- disable_snd_device(adev, SND_DEVICE_IN_CAPTURE_VI_FEEDBACK);
+ disable_snd_device(adev, in_snd_device);
disable_audio_route(adev, uc_info_tx);
free(uc_info_tx);
} else
@@ -1436,17 +1495,20 @@
{
struct audio_usecase *uc_info_tx;
struct audio_device *adev = handle.adev_handle;
+ snd_device_t in_snd_device;
ALOGV("%s: Entry", __func__);
snd_device = platform_get_spkr_prot_snd_device(snd_device);
spkr_prot_set_spkrstatus(false);
+ in_snd_device = platform_get_vi_feedback_snd_device(snd_device);
+
pthread_mutex_lock(&handle.mutex_spkr_prot);
if (adev && handle.spkr_processing_state == SPKR_PROCESSING_IN_PROGRESS) {
uc_info_tx = get_usecase_from_list(adev, USECASE_AUDIO_SPKR_CALIB_TX);
if (handle.pcm_tx)
pcm_close(handle.pcm_tx);
handle.pcm_tx = NULL;
- disable_snd_device(adev, SND_DEVICE_IN_CAPTURE_VI_FEEDBACK);
+ disable_snd_device(adev, in_snd_device);
if (uc_info_tx) {
list_remove(&uc_info_tx->list);
disable_audio_route(adev, uc_info_tx);
diff --git a/hal/audio_extn/usb.c b/hal/audio_extn/usb.c
index a7b10d9..b3bd58f 100644
--- a/hal/audio_extn/usb.c
+++ b/hal/audio_extn/usb.c
@@ -190,33 +190,6 @@
}
}
-static int usb_set_channel_mixer_ctl(int channel,
- char *ch_mixer_ctl_name)
-{
- struct mixer_ctl *ctl;
-
- ctl = mixer_get_ctl_by_name(usbmod->adev->mixer, ch_mixer_ctl_name);
- if (!ctl) {
- ALOGE("%s: Could not get ctl for mixer cmd - %s",
- __func__, ch_mixer_ctl_name);
- return -EINVAL;
- }
- switch (channel) {
- case 1:
- mixer_ctl_set_enum_by_string(ctl, "One");
- break;
- case 2:
- mixer_ctl_set_enum_by_string(ctl, "Two");
- break;
- default:
- ALOGV("%s: channel(%d) not supported, set as default 2 channels",
- __func__, channel);
- mixer_ctl_set_enum_by_string(ctl, "Two");
- break;
- }
- return 0;
-}
-
static int usb_set_dev_id_mixer_ctl(unsigned int usb_usecase_type, int card,
char *dev_mixer_ctl_name)
{
@@ -472,8 +445,6 @@
int card)
{
int ret;
- struct listnode *node_d;
- struct usb_device_config *dev_info;
/* get capabilities */
if ((ret = usb_get_capability(USB_PLAYBACK, usb_card_info, card))) {
@@ -481,14 +452,6 @@
__func__);
goto exit;
}
- /* Currently only use the first profile using to configure channel for simplification */
- list_for_each(node_d, &usb_card_info->usb_device_conf_list) {
- dev_info = node_to_item(node_d, struct usb_device_config, list);
- if (dev_info != NULL) {
- usb_set_channel_mixer_ctl(dev_info->channels, "USB_AUDIO_RX Channels");
- break;
- }
- }
usb_set_dev_id_mixer_ctl(USB_PLAYBACK, card, "USB_AUDIO_RX dev_token");
exit:
@@ -500,8 +463,6 @@
int card)
{
int ret;
- struct listnode *node_d;
- struct usb_device_config *dev_info;
/* get capabilities */
if ((ret = usb_get_capability(USB_CAPTURE, usb_card_info, card))) {
@@ -509,14 +470,6 @@
__func__);
goto exit;
}
- /* Currently only use the first profile using to configure channel for simplification */
- list_for_each(node_d, &usb_card_info->usb_device_conf_list) {
- dev_info = node_to_item(node_d, struct usb_device_config, list);
- if (dev_info != NULL) {
- usb_set_channel_mixer_ctl(dev_info->channels, "USB_AUDIO_TX Channels");
- break;
- }
- }
usb_set_dev_id_mixer_ctl(USB_CAPTURE, card, "USB_AUDIO_TX dev_token");
exit:
@@ -909,14 +862,8 @@
"%s: card_dev_type (0x%x), card_no(%d)",
__func__, card_info->usb_device_type, card_info->usb_card);
/* Currently only apply the first playback sound card configuration */
- if (is_playback && card_info->usb_device_type == AUDIO_DEVICE_OUT_USB_DEVICE) {
- is_usb_supported = usb_audio_backend_apply_policy(
- &card_info->usb_device_conf_list,
- bit_width,
- sample_rate,
- ch);
- break;
- } else if (card_info->usb_device_type == AUDIO_DEVICE_IN_USB_DEVICE ) {
+ if ((is_playback && card_info->usb_device_type == AUDIO_DEVICE_OUT_USB_DEVICE) ||
+ ((!is_playback) && card_info->usb_device_type == AUDIO_DEVICE_IN_USB_DEVICE)){
is_usb_supported = usb_audio_backend_apply_policy(
&card_info->usb_device_conf_list,
bit_width,
diff --git a/hal/msm8916/platform.c b/hal/msm8916/platform.c
index 47f251f..47943da 100644
--- a/hal/msm8916/platform.c
+++ b/hal/msm8916/platform.c
@@ -118,6 +118,8 @@
#define AUDIO_PARAMETER_KEY_AUD_CALDATA "cal_data"
#define AUDIO_PARAMETER_KEY_AUD_CALRESULT "cal_result"
+#define AUDIO_PARAMETER_KEY_MONO_SPEAKER "mono_speaker"
+
/* Reload ACDB files from specified path */
#define AUDIO_PARAMETER_KEY_RELOAD_ACDB "reload_acdb"
@@ -221,6 +223,7 @@
/* Vbat monitor related flags */
bool is_vbat_speaker;
bool gsm_mode_enabled;
+ int mono_speaker;
/* Audio calibration related functions */
void *acdb_handle;
int voice_feature_set;
@@ -244,7 +247,6 @@
bool edid_valid;
int ext_disp_type;
codec_backend_cfg_t current_backend_cfg[MAX_CODEC_BACKENDS];
- codec_backend_cfg_t current_tx_backend_cfg[MAX_CODEC_TX_BACKENDS];
char ec_ref_mixer_path[64];
char codec_version[CODEC_VERSION_MAX_LENGTH];
int hw_dep_fd;
@@ -343,6 +345,9 @@
[SND_DEVICE_OUT_VOICE_SPEAKER] = "voice-speaker",
[SND_DEVICE_OUT_VOICE_SPEAKER_WSA] = "wsa-voice-speaker",
[SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = "vbat-voice-speaker",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2] = "voice-speaker-2",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA] = "wsa-voice-speaker-2",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT] = "vbat-voice-speaker-2",
[SND_DEVICE_OUT_VOICE_HEADPHONES] = "voice-headphones",
[SND_DEVICE_OUT_VOICE_LINE] = "voice-line",
[SND_DEVICE_OUT_HDMI] = "hdmi",
@@ -369,8 +374,10 @@
[SND_DEVICE_OUT_ANC_HANDSET] = "anc-handset",
[SND_DEVICE_OUT_SPEAKER_PROTECTED] = "speaker-protected",
[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = "voice-speaker-protected",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED] = "voice-speaker-2-protected",
[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT] = "speaker-protected-vbat",
[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT] = "voice-speaker-protected-vbat",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT] = "voice-speaker-2-protected-vbat",
#ifdef RECORD_PLAY_CONCURRENCY
[SND_DEVICE_OUT_VOIP_HANDSET] = "voip-handset",
[SND_DEVICE_OUT_VOIP_SPEAKER] = "voip-speaker",
@@ -423,6 +430,8 @@
[SND_DEVICE_IN_HANDSET_STEREO_DMIC] = "handset-stereo-dmic-ef",
[SND_DEVICE_IN_SPEAKER_STEREO_DMIC] = "speaker-stereo-dmic-ef",
[SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = "vi-feedback",
+ [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1] = "vi-feedback-mono-1",
+ [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2] = "vi-feedback-mono-2",
[SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE] = "voice-speaker-dmic-broadside",
[SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE] = "speaker-dmic-broadside",
[SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE] = "speaker-dmic-broadside",
@@ -465,8 +474,11 @@
[SND_DEVICE_OUT_VOICE_HANDSET] = 7,
[SND_DEVICE_OUT_VOICE_LINE] = 10,
[SND_DEVICE_OUT_VOICE_SPEAKER] = 14,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2] = 14,
[SND_DEVICE_OUT_VOICE_SPEAKER_WSA] = 135,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA] = 135,
[SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = 135,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT] = 135,
[SND_DEVICE_OUT_VOICE_HEADPHONES] = 10,
[SND_DEVICE_OUT_HDMI] = 18,
[SND_DEVICE_OUT_SPEAKER_AND_HDMI] = 14,
@@ -492,8 +504,10 @@
[SND_DEVICE_OUT_ANC_HANDSET] = 103,
[SND_DEVICE_OUT_SPEAKER_PROTECTED] = 124,
[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = 101,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED] = 101,
[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT] = 124,
[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT] = 101,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT] = 101,
#ifdef RECORD_PLAY_CONCURRENCY
[SND_DEVICE_OUT_VOIP_HANDSET] = 133,
[SND_DEVICE_OUT_VOIP_SPEAKER] = 132,
@@ -545,6 +559,8 @@
[SND_DEVICE_IN_HANDSET_STEREO_DMIC] = 34,
[SND_DEVICE_IN_SPEAKER_STEREO_DMIC] = 35,
[SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = 102,
+ [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1] = 102,
+ [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2] = 102,
[SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE] = 12,
[SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE] = 12,
[SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE] = 119,
@@ -591,6 +607,9 @@
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_WSA)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_VBAT)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_HEADPHONES)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_LINE)},
{TO_NAME_INDEX(SND_DEVICE_OUT_HDMI)},
@@ -617,8 +636,10 @@
{TO_NAME_INDEX(SND_DEVICE_OUT_ANC_HANDSET)},
{TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED)},
{TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT)},
#ifdef RECORD_PLAY_CONCURRENCY
{TO_NAME_INDEX(SND_DEVICE_OUT_VOIP_HANDSET)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOIP_SPEAKER)},
@@ -669,6 +690,8 @@
{TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_STEREO_DMIC)},
{TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_STEREO_DMIC)},
{TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_VI_FEEDBACK)},
+ {TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1)},
+ {TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2)},
{TO_NAME_INDEX(SND_DEVICE_IN_VOICE_FLUENCE_DMIC_AANC)},
{TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE)},
{TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE)},
@@ -1224,6 +1247,7 @@
backend_tag_table[SND_DEVICE_OUT_TRANSMISSION_FM] = strdup("transmission-fm");
backend_tag_table[SND_DEVICE_OUT_HEADPHONES_44_1] = strdup("headphones-44.1");
backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = strdup("vbat-voice-speaker");
+ backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT] = strdup("vbat-voice-speaker-2");
backend_tag_table[SND_DEVICE_OUT_BT_A2DP] = strdup("bt-a2dp");
backend_tag_table[SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP] = strdup("speaker-and-bt-a2dp");
@@ -1689,6 +1713,7 @@
my_data->ext_disp_type = EXT_DISPLAY_TYPE_NONE;
my_data->is_wsa_speaker = false;
my_data->hw_dep_fd = -1;
+ my_data->mono_speaker = SPKR_1;
property_get("ro.qc.sdk.audio.fluencetype", my_data->fluence_cap, "");
if (!strncmp("fluencepro", my_data->fluence_cap, sizeof("fluencepro"))) {
@@ -1897,16 +1922,13 @@
my_data->current_backend_cfg[idx].sample_rate = OUTPUT_SAMPLING_RATE_44100;
my_data->current_backend_cfg[idx].bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
my_data->current_backend_cfg[idx].channels = CODEC_BACKEND_DEFAULT_CHANNELS;
+ if (idx > MAX_RX_CODEC_BACKENDS)
+ my_data->current_backend_cfg[idx].channels = CODEC_BACKEND_DEFAULT_TX_CHANNELS;
my_data->current_backend_cfg[idx].bitwidth_mixer_ctl = NULL;
my_data->current_backend_cfg[idx].samplerate_mixer_ctl = NULL;
my_data->current_backend_cfg[idx].channels_mixer_ctl = NULL;
}
- my_data->current_tx_backend_cfg[DEFAULT_CODEC_BACKEND].sample_rate =
- CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
- my_data->current_tx_backend_cfg[DEFAULT_CODEC_BACKEND].bit_width =
- CODEC_BACKEND_DEFAULT_BIT_WIDTH;
-
if (is_external_codec) {
my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].bitwidth_mixer_ctl =
strdup("SLIM_0_RX Format");
@@ -1923,9 +1945,9 @@
my_data->current_backend_cfg[HEADPHONE_BACKEND].samplerate_mixer_ctl =
strdup("SLIM_6_RX SampleRate");
- my_data->current_tx_backend_cfg[DEFAULT_CODEC_BACKEND].bitwidth_mixer_ctl =
+ my_data->current_backend_cfg[SLIMBUS_0_TX].bitwidth_mixer_ctl =
strdup("SLIM_0_TX Format");
- my_data->current_tx_backend_cfg[DEFAULT_CODEC_BACKEND].samplerate_mixer_ctl =
+ my_data->current_backend_cfg[SLIMBUS_0_TX].samplerate_mixer_ctl =
strdup("SLIM_0_TX SampleRate");
} else {
my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].bitwidth_mixer_ctl =
@@ -1933,16 +1955,17 @@
my_data->current_backend_cfg[DEFAULT_CODEC_BACKEND].samplerate_mixer_ctl =
strdup("MI2S_RX SampleRate");
- my_data->current_tx_backend_cfg[DEFAULT_CODEC_TX_BACKEND].bitwidth_mixer_ctl =
+ my_data->current_backend_cfg[DEFAULT_CODEC_TX_BACKEND].bitwidth_mixer_ctl =
strdup("MI2S_TX Format");
- my_data->current_tx_backend_cfg[DEFAULT_CODEC_TX_BACKEND].samplerate_mixer_ctl =
+ my_data->current_backend_cfg[DEFAULT_CODEC_TX_BACKEND].samplerate_mixer_ctl =
strdup("MI2S_TX SampleRate");
-
- my_data->current_tx_backend_cfg[USB_AUDIO_TX_BACKEND].bitwidth_mixer_ctl =
- strdup("USB_AUDIO_TX Format");
- my_data->current_tx_backend_cfg[USB_AUDIO_TX_BACKEND].samplerate_mixer_ctl =
- strdup("USB_AUDIO_TX SampleRate");
}
+ my_data->current_backend_cfg[USB_AUDIO_TX_BACKEND].bitwidth_mixer_ctl =
+ strdup("USB_AUDIO_TX Format");
+ my_data->current_backend_cfg[USB_AUDIO_TX_BACKEND].samplerate_mixer_ctl =
+ strdup("USB_AUDIO_TX SampleRate");
+ my_data->current_backend_cfg[USB_AUDIO_TX_BACKEND].channels_mixer_ctl =
+ strdup("USB_AUDIO_TX Channels");
my_data->current_backend_cfg[USB_AUDIO_RX_BACKEND].bitwidth_mixer_ctl =
strdup("USB_AUDIO_RX Format");
@@ -2081,7 +2104,8 @@
return;
}
- if((snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT) &&
+ if ((snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT) &&
!(usecase->type == VOICE_CALL || usecase->type == VOIP_CALL)) {
ALOGI("%s: Not adding vbat speaker device to non voice use cases", __func__);
return;
@@ -2485,7 +2509,7 @@
{
int32_t port = DEFAULT_CODEC_BACKEND;
- if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX) {
+ if (snd_device >= SND_DEVICE_OUT_BEGIN && snd_device < SND_DEVICE_OUT_END) {
if (backend_tag_table[snd_device] != NULL) {
if (strncmp(backend_tag_table[snd_device], "headphones-44.1",
sizeof("headphones-44.1")) == 0)
@@ -2500,29 +2524,17 @@
else if (strcmp(backend_tag_table[snd_device], "usb-headphones") == 0)
port = USB_AUDIO_RX_BACKEND;
}
- } else {
- ALOGV("%s:napb: Invalid device - %d ", __func__, snd_device);
- }
-
- ALOGV("%s:napb: backend port - %d device - %d ", __func__, port,
- snd_device);
- return port;
-}
-
-static int platform_get_capture_backend_index(snd_device_t snd_device)
-{
- int32_t port = DEFAULT_CODEC_TX_BACKEND;
-
- if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX) {
+ } else if (snd_device >= SND_DEVICE_IN_BEGIN && snd_device < SND_DEVICE_IN_END) {
+ port = DEFAULT_CODEC_TX_BACKEND;
if (backend_tag_table[snd_device] != NULL) {
if (strcmp(backend_tag_table[snd_device], "usb-headset-mic") == 0)
port = USB_AUDIO_TX_BACKEND;
}
} else {
- ALOGW("%s: Invalid device - %d ", __func__, snd_device);
+ ALOGW("%s:napb: Invalid device - %d ", __func__, snd_device);
}
- ALOGV("%s: backend port - %d snd_device %d", __func__, port, snd_device);
+ ALOGV("%s:napb: backend port - %d device - %d ", __func__, port, snd_device);
return port;
}
@@ -2605,7 +2617,9 @@
return ret;
if ((out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
- out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT) &&
+ out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2 ||
+ out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
+ out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT) &&
audio_extn_spkr_prot_is_enabled()) {
if (my_data->is_vbat_speaker)
acdb_rx_id = acdb_device_table[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT];
@@ -2640,9 +2654,18 @@
if (my_data->acdb_send_voice_cal == NULL) {
ALOGE("%s: dlsym error for acdb_send_voice_call", __func__);
} else {
- if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER &&
- audio_extn_spkr_prot_is_enabled())
- out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED;
+ if (audio_extn_spkr_prot_is_enabled()) {
+ if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
+ out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_WSA)
+ out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED;
+ else if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2 ||
+ out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA)
+ out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED;
+ else if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT)
+ out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT;
+ else if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT)
+ out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT;
+ }
acdb_rx_id = acdb_device_table[out_snd_device];
acdb_tx_id = acdb_device_table[in_snd_device];
@@ -2669,7 +2692,9 @@
return ret;
if ((out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
- out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT) &&
+ out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2 ||
+ out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
+ out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT) &&
audio_extn_spkr_prot_is_enabled()) {
if (my_data->is_vbat_speaker)
acdb_rx_id = acdb_device_table[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT];
@@ -3073,12 +3098,22 @@
} else if (devices & AUDIO_DEVICE_OUT_ALL_A2DP) {
snd_device = SND_DEVICE_OUT_BT_A2DP;
} else if (devices & AUDIO_DEVICE_OUT_SPEAKER) {
- if (my_data->is_vbat_speaker)
- snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_VBAT;
- else if (my_data->is_wsa_speaker)
- snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_WSA;
- else
- snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
+ if (my_data->is_vbat_speaker) {
+ if (my_data->mono_speaker == SPKR_1)
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_VBAT;
+ else
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT;
+ } else if (my_data->is_wsa_speaker) {
+ if (my_data->mono_speaker == SPKR_1)
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_WSA;
+ else
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA;
+ } else {
+ if (my_data->mono_speaker == SPKR_1)
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
+ else
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2;
+ }
} else if (devices & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET ||
devices & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) {
snd_device = SND_DEVICE_OUT_USB_HEADSET;
@@ -3784,6 +3819,16 @@
}
+ err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_MONO_SPEAKER, value, len);
+ if (err >= 0) {
+ if (!strncmp("left", value, sizeof("left")))
+ my_data->mono_speaker = SPKR_1;
+ else if (!strncmp("right", value, sizeof("right")))
+ my_data->mono_speaker = SPKR_2;
+
+ str_parms_del(parms, AUDIO_PARAMETER_KEY_MONO_SPEAKER);
+ }
+
#ifdef RECORD_PLAY_CONCURRENCY
err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_REC_PLAY_CONC, value, sizeof(value));
if (err >= 0) {
@@ -4027,7 +4072,9 @@
if ((snd_device >= SND_DEVICE_IN_BEGIN) &&
(snd_device < SND_DEVICE_IN_END) &&
(snd_device != SND_DEVICE_IN_CAPTURE_FM) &&
- (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK))
+ (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK) &&
+ (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1) &&
+ (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2))
needs_event = true;
return needs_event;
@@ -4090,7 +4137,9 @@
if ((snd_device >= SND_DEVICE_IN_BEGIN) &&
(snd_device < SND_DEVICE_IN_END) &&
(snd_device != SND_DEVICE_IN_CAPTURE_FM) &&
- (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK))
+ (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK) &&
+ (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1) &&
+ (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2))
needs_event = true;
return needs_event;
@@ -4239,7 +4288,7 @@
if (bit_width !=
my_data->current_backend_cfg[backend_idx].bit_width) {
- struct mixer_ctl *ctl;
+ struct mixer_ctl *ctl = NULL;
ctl = mixer_get_ctl_by_name(adev->mixer,
my_data->current_backend_cfg[backend_idx].bitwidth_mixer_ctl);
if (!ctl) {
@@ -4296,14 +4345,24 @@
rate_str = "KHZ_44P1";
break;
case 64000:
- case 88200:
case 96000:
rate_str = "KHZ_96";
break;
+ case 88200:
+ rate_str = "KHZ_88P2";
+ break;
case 176400:
+ rate_str = "KHZ_176P4";
+ break;
case 192000:
rate_str = "KHZ_192";
break;
+ case 352800:
+ rate_str = "KHZ_352P8";
+ break;
+ case 384000:
+ rate_str = "KHZ_384";
+ break;
default:
rate_str = "KHZ_48";
break;
@@ -4343,6 +4402,9 @@
channel_cnt_str = "Four"; break;
case 3:
channel_cnt_str = "Three"; break;
+ case 1:
+ channel_cnt_str = "One"; break;
+ case 2:
default:
channel_cnt_str = "Two"; break;
}
@@ -4695,127 +4757,6 @@
}
/*
- * configures afe with bit width and Sample Rate
- */
-
-static int platform_set_capture_codec_backend_cfg(struct audio_device* adev,
- snd_device_t snd_device,
- struct audio_backend_cfg backend_cfg)
-{
- int ret = 0;
- int backend_idx = platform_get_capture_backend_index(snd_device);
- struct platform_data *my_data = (struct platform_data *)adev->platform;
-
- ALOGI("%s:txbecf: afe: bitwidth %d, samplerate %d, backend_idx %d device (%s)",
- __func__, backend_cfg.bit_width, backend_cfg.sample_rate, backend_idx,
- platform_get_snd_device_name(snd_device));
-
- if (backend_cfg.bit_width !=
- my_data->current_tx_backend_cfg[backend_idx].bit_width) {
-
- struct mixer_ctl *ctl = NULL;
- ctl = mixer_get_ctl_by_name(adev->mixer,
- my_data->current_tx_backend_cfg[backend_idx].bitwidth_mixer_ctl);
- if (!ctl) {
- ALOGE("%s:txbecf: afe: Could not get ctl for mixer command - %s",
- __func__,
- my_data->current_tx_backend_cfg[backend_idx].bitwidth_mixer_ctl);
- return -EINVAL;
- }
-
- if (backend_cfg.bit_width == 24) {
- if (backend_cfg.format == AUDIO_FORMAT_PCM_24_BIT_PACKED)
- ret = mixer_ctl_set_enum_by_string(ctl, "S24_3LE");
- else
- ret = mixer_ctl_set_enum_by_string(ctl, "S24_LE");
- } else {
- ret = mixer_ctl_set_enum_by_string(ctl, "S16_LE");
- }
-
- if (ret < 0) {
- ALOGE("%s:txbecf: afe: Could not set ctl for mixer command - %s",
- __func__,
- my_data->current_tx_backend_cfg[backend_idx].bitwidth_mixer_ctl);
- return -EINVAL;
- }
-
- my_data->current_tx_backend_cfg[backend_idx].bit_width = backend_cfg.bit_width;
- ALOGD("%s:txbecf: afe: %s mixer set to %d bit", __func__,
- my_data->current_tx_backend_cfg[backend_idx].bitwidth_mixer_ctl,
- backend_cfg.bit_width);
- }
-
- /*
- * Backend sample rate configuration follows:
- * 16 bit record - 48khz for streams at any valid sample rate
- * 24 bit record - 48khz for stream sample rate less than 48khz
- * 24 bit record - 96khz for sample rate range of 48khz to 96khz
- * 24 bit record - 192khz for sample rate range of 96khz to 192 khz
- * Upper limit is inclusive in the sample rate range.
- */
- // TODO: This has to be more dynamic based on policy file
-
- if (backend_cfg.sample_rate !=
- my_data->current_tx_backend_cfg[(int)backend_idx].sample_rate) {
- /*
- * sample rate update is needed only for hifi audio enabled platforms
- */
- char *rate_str = NULL;
- struct mixer_ctl *ctl = NULL;
-
- switch (backend_cfg.sample_rate) {
- case 8000:
- case 11025:
- case 16000:
- case 22050:
- case 32000:
- case 44100:
- case 48000:
- rate_str = "KHZ_48";
- break;
- case 64000:
- case 88200:
- case 96000:
- rate_str = "KHZ_96";
- break;
- case 176400:
- case 192000:
- rate_str = "KHZ_192";
- break;
- default:
- rate_str = "KHZ_48";
- break;
- }
-
- ctl = mixer_get_ctl_by_name(adev->mixer,
- my_data->current_tx_backend_cfg[backend_idx].samplerate_mixer_ctl);
-
- if (ctl < 0) {
- ALOGE("%s:txbecf: afe: Could not get ctl to set the Sample Rate for mixer command - %s",
- __func__,
- my_data->current_tx_backend_cfg[backend_idx].samplerate_mixer_ctl);
- return -EINVAL;
- }
-
- ALOGD("%s:txbecf: afe: %s set to %s", __func__,
- my_data->current_tx_backend_cfg[backend_idx].samplerate_mixer_ctl,
- rate_str);
- ret = mixer_ctl_set_enum_by_string(ctl, rate_str);
- if (ret < 0) {
- ALOGE("%s:txbecf: afe: Could not set ctl for mixer command - %s",
- __func__,
- my_data->current_tx_backend_cfg[backend_idx].samplerate_mixer_ctl);
- return -EINVAL;
- }
-
- my_data->current_tx_backend_cfg[backend_idx].sample_rate =
- backend_cfg.sample_rate;
- }
-
- return ret;
-}
-
-/*
* goes through all the current usecases and picks the highest
* bitwidth & samplerate
*/
@@ -4834,7 +4775,8 @@
channels = backend_cfg->channels;
ALOGI("%s:txbecf: afe: Codec selected backend: %d current bit width: %d and "
- "sample rate: %d",__func__,backend_idx, bit_width, sample_rate);
+ "sample rate: %d, channels %d",__func__,backend_idx, bit_width,
+ sample_rate, channels);
// For voice calls use default configuration i.e. 16b/48K, only applicable to
// default backend
@@ -4856,14 +4798,17 @@
"sample rate: %d", __func__, backend_idx, bit_width, sample_rate);
// Force routing if the expected bitwdith or samplerate
// is not same as current backend comfiguration
- if ((bit_width != my_data->current_tx_backend_cfg[backend_idx].bit_width) ||
- (sample_rate != my_data->current_tx_backend_cfg[backend_idx].sample_rate)) {
+ if ((bit_width != my_data->current_backend_cfg[backend_idx].bit_width) ||
+ (sample_rate != my_data->current_backend_cfg[backend_idx].sample_rate) ||
+ (channels != my_data->current_backend_cfg[backend_idx].channels)) {
backend_cfg->bit_width = bit_width;
backend_cfg->sample_rate= sample_rate;
+ backend_cfg->channels = channels;
backend_change = true;
ALOGI("%s:txbecf: afe: Codec backend needs to be updated. new bit width: %d "
- "new sample rate: %d", __func__, backend_cfg->bit_width,
- backend_cfg->sample_rate);
+ "new sample rate: %d new channel: %d",
+ __func__, backend_cfg->bit_width,
+ backend_cfg->sample_rate, backend_cfg->channels);
}
return backend_change;
@@ -4872,7 +4817,7 @@
bool platform_check_and_set_capture_codec_backend_cfg(struct audio_device* adev,
struct audio_usecase *usecase, snd_device_t snd_device)
{
- int backend_idx = platform_get_capture_backend_index(snd_device);
+ int backend_idx = platform_get_backend_index(snd_device);
int ret = 0;
struct audio_backend_cfg backend_cfg;
@@ -4898,8 +4843,8 @@
platform_get_snd_device_name(snd_device));
if (platform_check_capture_codec_backend_cfg(adev, backend_idx,
&backend_cfg)) {
- ret = platform_set_capture_codec_backend_cfg(adev, snd_device,
- backend_cfg);
+ ret = platform_set_codec_backend_cfg(adev, snd_device,
+ backend_cfg);
if(!ret)
return true;
}
@@ -5553,8 +5498,11 @@
snd_device == SND_DEVICE_OUT_SPEAKER_WSA ||
snd_device == SND_DEVICE_OUT_SPEAKER_VBAT ||
snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT ||
snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
- snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_WSA) {
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2 ||
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_WSA ||
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA) {
ret = true;
}
@@ -5574,12 +5522,19 @@
case SND_DEVICE_OUT_VOICE_SPEAKER_WSA:
acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED);
break;
+ case SND_DEVICE_OUT_VOICE_SPEAKER_2:
+ case SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA:
+ acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED);
+ break;
case SND_DEVICE_OUT_SPEAKER_VBAT:
acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT);
break;
case SND_DEVICE_OUT_VOICE_SPEAKER_VBAT:
acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT);
break;
+ case SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT:
+ acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT);
+ break;
default:
acdb_id = -EINVAL;
break;
@@ -5599,15 +5554,37 @@
case SND_DEVICE_OUT_VOICE_SPEAKER:
case SND_DEVICE_OUT_VOICE_SPEAKER_WSA:
return SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED;
+ case SND_DEVICE_OUT_VOICE_SPEAKER_2:
+ case SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA:
+ return SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED;
case SND_DEVICE_OUT_SPEAKER_VBAT:
return SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT;
case SND_DEVICE_OUT_VOICE_SPEAKER_VBAT:
return SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT;
+ case SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT:
+ return SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT;
default:
return snd_device;
}
}
+int platform_get_vi_feedback_snd_device(snd_device_t snd_device)
+{
+ switch(snd_device) {
+ case SND_DEVICE_OUT_SPEAKER_PROTECTED:
+ case SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT:
+ return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK;
+ case SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED:
+ case SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT:
+ return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1;
+ case SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED:
+ case SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT:
+ return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2;
+ default:
+ return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK;
+ }
+}
+
int platform_set_sidetone(struct audio_device *adev,
snd_device_t out_snd_device,
bool enable,
diff --git a/hal/msm8916/platform.h b/hal/msm8916/platform.h
index 1e54ee1..33be141 100644
--- a/hal/msm8916/platform.h
+++ b/hal/msm8916/platform.h
@@ -39,6 +39,11 @@
SOURCE_QUAD_MIC = 0x8, /* Target contains 4 mics */
};
+enum {
+ SPKR_1,
+ SPKR_2
+};
+
#define PLATFORM_IMAGE_NAME "modem"
/*
@@ -92,6 +97,9 @@
SND_DEVICE_OUT_VOICE_SPEAKER,
SND_DEVICE_OUT_VOICE_SPEAKER_WSA,
SND_DEVICE_OUT_VOICE_SPEAKER_VBAT,
+ SND_DEVICE_OUT_VOICE_SPEAKER_2,
+ SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA,
+ SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT,
SND_DEVICE_OUT_VOICE_HEADPHONES,
SND_DEVICE_OUT_VOICE_LINE,
SND_DEVICE_OUT_HDMI,
@@ -118,8 +126,10 @@
SND_DEVICE_OUT_ANC_HANDSET,
SND_DEVICE_OUT_SPEAKER_PROTECTED,
SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED,
+ SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED,
SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT,
SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT,
+ SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT,
#ifdef RECORD_PLAY_CONCURRENCY
SND_DEVICE_OUT_VOIP_HANDSET,
SND_DEVICE_OUT_VOIP_SPEAKER,
@@ -178,6 +188,8 @@
SND_DEVICE_IN_HANDSET_STEREO_DMIC,
SND_DEVICE_IN_SPEAKER_STEREO_DMIC,
SND_DEVICE_IN_CAPTURE_VI_FEEDBACK,
+ SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1,
+ SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2,
SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE,
SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE,
SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE,
@@ -221,14 +233,14 @@
HDMI_RX_BACKEND,
DISP_PORT_RX_BACKEND,
USB_AUDIO_RX_BACKEND,
+ MAX_RX_CODEC_BACKENDS = USB_AUDIO_RX_BACKEND,
+ /* TX BE follows RX BE */
+ SLIMBUS_0_TX,
+ DEFAULT_CODEC_TX_BACKEND = SLIMBUS_0_TX,
+ USB_AUDIO_TX_BACKEND,
MAX_CODEC_BACKENDS
};
-enum {
- DEFAULT_CODEC_TX_BACKEND,
- SLIMBUS_0_TX = DEFAULT_CODEC_TX_BACKEND,
- USB_AUDIO_TX_BACKEND,
- MAX_CODEC_TX_BACKENDS
-};
+
#define AUDIO_PARAMETER_KEY_NATIVE_AUDIO "audio.nat.codec.enabled"
#define AUDIO_PARAMETER_KEY_NATIVE_AUDIO_MODE "native_audio_mode"
diff --git a/hal/msm8960/platform.c b/hal/msm8960/platform.c
index 3c2dae6..b687d96 100644
--- a/hal/msm8960/platform.c
+++ b/hal/msm8960/platform.c
@@ -1229,6 +1229,11 @@
return -ENOSYS;
}
+int platform_get_vi_feedback_snd_device(snd_device_t snd_device __unused)
+{
+ return -ENOSYS;
+}
+
int platform_spkr_prot_is_wsa_analog_mode(void *adev __unused)
{
return 0;
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index 48bb46c..7350836 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -108,6 +108,8 @@
#define AUDIO_PARAMETER_KEY_AUD_CALDATA "cal_data"
#define AUDIO_PARAMETER_KEY_AUD_CALRESULT "cal_result"
+#define AUDIO_PARAMETER_KEY_MONO_SPEAKER "mono_speaker"
+
#define AUDIO_PARAMETER_KEY_PERF_LOCK_OPTS "perf_lock_opts"
/* Reload ACDB files from specified path */
@@ -218,6 +220,7 @@
/* Vbat monitor related flags */
bool is_vbat_speaker;
bool gsm_mode_enabled;
+ int mono_speaker;
/* Audio calibration related functions */
void *acdb_handle;
int voice_feature_set;
@@ -240,7 +243,6 @@
int ext_disp_type;
char ec_ref_mixer_path[64];
codec_backend_cfg_t current_backend_cfg[MAX_CODEC_BACKENDS];
- codec_backend_cfg_t current_tx_backend_cfg[MAX_CODEC_TX_BACKENDS];
char codec_version[CODEC_VERSION_MAX_LENGTH];
int hw_dep_fd;
char cvd_version[MAX_CVD_VERSION_STRING_SIZE];
@@ -348,6 +350,8 @@
[SND_DEVICE_OUT_VOICE_HANDSET] = "voice-handset",
[SND_DEVICE_OUT_VOICE_SPEAKER] = "voice-speaker",
[SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = "voice-speaker-vbat",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2] = "voice-speaker-2",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT] = "voice-speaker-2-vbat",
[SND_DEVICE_OUT_VOICE_HEADPHONES] = "voice-headphones",
[SND_DEVICE_OUT_VOICE_LINE] = "voice-line",
[SND_DEVICE_OUT_HDMI] = "hdmi",
@@ -374,8 +378,10 @@
[SND_DEVICE_OUT_ANC_HANDSET] = "anc-handset",
[SND_DEVICE_OUT_SPEAKER_PROTECTED] = "speaker-protected",
[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = "voice-speaker-protected",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED] = "voice-speaker-2-protected",
[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT] = "speaker-protected-vbat",
[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT] = "voice-speaker-protected-vbat",
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT] = "voice-speaker-2-protected-vbat",
/* Capture sound devices */
[SND_DEVICE_IN_HANDSET_MIC] = "handset-mic",
@@ -425,6 +431,8 @@
[SND_DEVICE_IN_HANDSET_STEREO_DMIC] = "handset-stereo-dmic-ef",
[SND_DEVICE_IN_SPEAKER_STEREO_DMIC] = "speaker-stereo-dmic-ef",
[SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = "vi-feedback",
+ [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1] = "vi-feedback-mono-1",
+ [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2] = "vi-feedback-mono-2",
[SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE] = "voice-speaker-dmic-broadside",
[SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE] = "speaker-dmic-broadside",
[SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE] = "speaker-dmic-broadside",
@@ -467,6 +475,8 @@
[SND_DEVICE_OUT_VOICE_HANDSET] = 7,
[SND_DEVICE_OUT_VOICE_SPEAKER] = 14,
[SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = 14,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2] = 14,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT] = 14,
[SND_DEVICE_OUT_VOICE_HEADPHONES] = 10,
[SND_DEVICE_OUT_VOICE_LINE] = 10,
[SND_DEVICE_OUT_HDMI] = 18,
@@ -493,8 +503,10 @@
[SND_DEVICE_OUT_ANC_HANDSET] = 103,
[SND_DEVICE_OUT_SPEAKER_PROTECTED] = 124,
[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = 101,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED] = 101,
[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT] = 124,
[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT] = 101,
+ [SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT] = 101,
[SND_DEVICE_IN_HANDSET_MIC] = 4,
[SND_DEVICE_IN_HANDSET_MIC_EXTERNAL] = 4,
@@ -543,6 +555,8 @@
[SND_DEVICE_IN_HANDSET_STEREO_DMIC] = 34,
[SND_DEVICE_IN_SPEAKER_STEREO_DMIC] = 35,
[SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = 102,
+ [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1] = 102,
+ [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2] = 102,
[SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE] = 12,
[SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE] = 12,
[SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE] = 119,
@@ -588,6 +602,8 @@
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_HANDSET)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_VBAT)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_HEADPHONES)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_LINE)},
{TO_NAME_INDEX(SND_DEVICE_OUT_HDMI)},
@@ -613,8 +629,10 @@
{TO_NAME_INDEX(SND_DEVICE_OUT_ANC_HANDSET)},
{TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED)},
{TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT)},
{TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC)},
{TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_EXTERNAL)},
{TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_AEC)},
@@ -660,6 +678,8 @@
{TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_STEREO_DMIC)},
{TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_STEREO_DMIC)},
{TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_VI_FEEDBACK)},
+ {TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1)},
+ {TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2)},
{TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE)},
{TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE)},
{TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE)},
@@ -1121,6 +1141,7 @@
backend_tag_table[SND_DEVICE_OUT_HEADPHONES_DSD] = strdup("headphones-dsd");
backend_tag_table[SND_DEVICE_OUT_HEADPHONES_44_1] = strdup("headphones-44.1");
backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_VBAT] = strdup("voice-speaker-vbat");
+ backend_tag_table[SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT] = strdup("voice-speaker-2-vbat");
backend_tag_table[SND_DEVICE_OUT_BT_A2DP] = strdup("bt-a2dp");
backend_tag_table[SND_DEVICE_OUT_SPEAKER_AND_BT_A2DP] = strdup("speaker-and-bt-a2dp");
@@ -1544,6 +1565,7 @@
my_data->edid_info = NULL;
my_data->ext_disp_type = EXT_DISPLAY_TYPE_NONE;
my_data->hw_dep_fd = -1;
+ my_data->mono_speaker = SPKR_1;
property_get("ro.qc.sdk.audio.fluencetype", my_data->fluence_cap, "");
if (!strncmp("fluencepro", my_data->fluence_cap, sizeof("fluencepro"))) {
@@ -1732,6 +1754,8 @@
my_data->current_backend_cfg[idx].sample_rate = OUTPUT_SAMPLING_RATE_44100;
my_data->current_backend_cfg[idx].bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
my_data->current_backend_cfg[idx].channels = CODEC_BACKEND_DEFAULT_CHANNELS;
+ if (idx > MAX_RX_CODEC_BACKENDS)
+ my_data->current_backend_cfg[idx].channels = CODEC_BACKEND_DEFAULT_TX_CHANNELS;
my_data->current_backend_cfg[idx].bitwidth_mixer_ctl = NULL;
my_data->current_backend_cfg[idx].samplerate_mixer_ctl = NULL;
my_data->current_backend_cfg[idx].channels_mixer_ctl = NULL;
@@ -1752,15 +1776,17 @@
my_data->current_backend_cfg[HEADPHONE_44_1_BACKEND].samplerate_mixer_ctl =
strdup("SLIM_5_RX SampleRate");
- my_data->current_tx_backend_cfg[DEFAULT_CODEC_TX_BACKEND].bitwidth_mixer_ctl =
+ my_data->current_backend_cfg[DEFAULT_CODEC_TX_BACKEND].bitwidth_mixer_ctl =
strdup("SLIM_0_TX Format");
- my_data->current_tx_backend_cfg[DEFAULT_CODEC_TX_BACKEND].samplerate_mixer_ctl =
+ my_data->current_backend_cfg[DEFAULT_CODEC_TX_BACKEND].samplerate_mixer_ctl =
strdup("SLIM_0_TX SampleRate");
- my_data->current_tx_backend_cfg[USB_AUDIO_TX_BACKEND].bitwidth_mixer_ctl =
+ my_data->current_backend_cfg[USB_AUDIO_TX_BACKEND].bitwidth_mixer_ctl =
strdup("USB_AUDIO_TX Format");
- my_data->current_tx_backend_cfg[USB_AUDIO_TX_BACKEND].samplerate_mixer_ctl =
+ my_data->current_backend_cfg[USB_AUDIO_TX_BACKEND].samplerate_mixer_ctl =
strdup("USB_AUDIO_TX SampleRate");
+ my_data->current_backend_cfg[USB_AUDIO_TX_BACKEND].channels_mixer_ctl =
+ strdup("USB_AUDIO_TX Channels");
ret = audio_extn_utils_get_codec_version(snd_card_name,
my_data->adev->snd_card,
@@ -1911,7 +1937,8 @@
return;
}
- if ((snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT) &&
+ if ((snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT) &&
!(usecase->type == VOICE_CALL || usecase->type == VOIP_CALL)) {
ALOGI("%s: Not adding vbat speaker device to non voice use cases", __func__);
return;
@@ -2335,7 +2362,7 @@
{
int32_t port = DEFAULT_CODEC_BACKEND;
- if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX) {
+ if (snd_device >= SND_DEVICE_OUT_BEGIN && snd_device < SND_DEVICE_OUT_END) {
if (backend_tag_table[snd_device] != NULL) {
if (strncmp(backend_tag_table[snd_device], "headphones-44.1",
sizeof("headphones-44.1")) == 0)
@@ -2353,28 +2380,17 @@
else if (strcmp(backend_tag_table[snd_device], "usb-headphones") == 0)
port = USB_AUDIO_RX_BACKEND;
}
- } else {
- ALOGV("%s:napb: Invalid device - %d ", __func__, snd_device);
- }
-
- ALOGV("%s:napb: backend port - %d snd_device %d", __func__, port, snd_device);
- return port;
-}
-
-static int platform_get_capture_backend_index(snd_device_t snd_device)
-{
- int32_t port = DEFAULT_CODEC_TX_BACKEND;
-
- if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX) {
+ } else if (snd_device >= SND_DEVICE_IN_BEGIN && snd_device < SND_DEVICE_IN_END) {
+ port = DEFAULT_CODEC_TX_BACKEND;
if (backend_tag_table[snd_device] != NULL) {
if (strcmp(backend_tag_table[snd_device], "usb-headset-mic") == 0)
port = USB_AUDIO_TX_BACKEND;
}
} else {
- ALOGW("%s: Invalid device - %d ", __func__, snd_device);
+ ALOGW("%s:napb: Invalid device - %d ", __func__, snd_device);
}
- ALOGV("%s: backend port - %d snd_device %d", __func__, port, snd_device);
+ ALOGV("%s:napb: backend port - %d device - %d ", __func__, port, snd_device);
return port;
}
@@ -2459,7 +2475,9 @@
return ret;
if ((out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
- out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT) &&
+ out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2 ||
+ out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
+ out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT) &&
audio_extn_spkr_prot_is_enabled()) {
if (my_data->is_vbat_speaker)
acdb_rx_id = acdb_device_table[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT];
@@ -2494,9 +2512,16 @@
if (my_data->acdb_send_voice_cal == NULL) {
ALOGE("%s: dlsym error for acdb_send_voice_call", __func__);
} else {
- if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER &&
- audio_extn_spkr_prot_is_enabled())
- out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED;
+ if (audio_extn_spkr_prot_is_enabled()) {
+ if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER)
+ out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED;
+ else if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT)
+ out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT;
+ else if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER)
+ out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED;
+ else if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT)
+ out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT;
+ }
acdb_rx_id = acdb_device_table[out_snd_device];
acdb_tx_id = acdb_device_table[in_snd_device];
@@ -2523,7 +2548,9 @@
return ret;
if ((out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
- out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT) &&
+ out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2 ||
+ out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
+ out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT) &&
audio_extn_spkr_prot_is_enabled()) {
if (my_data->is_vbat_speaker)
acdb_rx_id = acdb_device_table[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT];
@@ -2902,10 +2929,17 @@
else
snd_device = SND_DEVICE_OUT_BT_SCO;
} else if (devices & AUDIO_DEVICE_OUT_SPEAKER) {
- if (my_data->is_vbat_speaker)
- snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_VBAT;
- else
- snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
+ if (my_data->is_vbat_speaker) {
+ if (my_data->mono_speaker == SPKR_1)
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_VBAT;
+ else
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT;
+ } else {
+ if (my_data->mono_speaker == SPKR_1)
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
+ else
+ snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_2;
+ }
} else if (devices & AUDIO_DEVICE_OUT_ALL_A2DP) {
snd_device = SND_DEVICE_OUT_BT_A2DP;
} else if (devices & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET ||
@@ -3800,6 +3834,16 @@
}
+ err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_MONO_SPEAKER, value, len);
+ if (err >= 0) {
+ if (!strncmp("left", value, sizeof("left")))
+ my_data->mono_speaker = SPKR_1;
+ else if (!strncmp("right", value, sizeof("right")))
+ my_data->mono_speaker = SPKR_2;
+
+ str_parms_del(parms, AUDIO_PARAMETER_KEY_MONO_SPEAKER);
+ }
+
err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_EXT_AUDIO_DEVICE,
value, len);
if (err >= 0) {
@@ -4198,7 +4242,9 @@
if ((snd_device >= SND_DEVICE_IN_BEGIN) &&
(snd_device < SND_DEVICE_IN_END) &&
(snd_device != SND_DEVICE_IN_CAPTURE_FM) &&
- (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK))
+ (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK) &&
+ (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1) &&
+ (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2))
needs_event = true;
return needs_event;
@@ -4216,7 +4262,9 @@
if ((snd_device >= SND_DEVICE_IN_BEGIN) &&
(snd_device < SND_DEVICE_IN_END) &&
(snd_device != SND_DEVICE_IN_CAPTURE_FM) &&
- (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK))
+ (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK) &&
+ (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1) &&
+ (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2))
needs_event = true;
return needs_event;
@@ -4303,7 +4351,7 @@
snd_device_t snd_device, struct audio_backend_cfg backend_cfg)
{
int ret = 0;
- int backend_idx = DEFAULT_CODEC_BACKEND;
+ int backend_idx = platform_get_backend_index(snd_device);
struct platform_data *my_data = (struct platform_data *)adev->platform;
backend_idx = platform_get_backend_index(snd_device);
unsigned int bit_width = backend_cfg.bit_width;
@@ -4313,13 +4361,14 @@
bool passthrough_enabled = backend_cfg.passthrough_enabled;
ALOGI("%s:becf: afe: bitwidth %d, samplerate %d channels %d"
- ", backend_idx %d device (%s)", __func__, bit_width, sample_rate, channels, backend_idx,
+ ", backend_idx %d device (%s)", __func__, bit_width,
+ sample_rate, channels, backend_idx,
platform_get_snd_device_name(snd_device));
if (bit_width !=
my_data->current_backend_cfg[backend_idx].bit_width) {
- struct mixer_ctl *ctl;
+ struct mixer_ctl *ctl = NULL;
ctl = mixer_get_ctl_by_name(adev->mixer,
my_data->current_backend_cfg[backend_idx].bitwidth_mixer_ctl);
if (!ctl) {
@@ -4331,23 +4380,30 @@
if (bit_width == 24) {
if (format == AUDIO_FORMAT_PCM_24_BIT_PACKED)
- mixer_ctl_set_enum_by_string(ctl, "S24_3LE");
+ ret = mixer_ctl_set_enum_by_string(ctl, "S24_3LE");
else
- mixer_ctl_set_enum_by_string(ctl, "S24_LE");
+ ret = mixer_ctl_set_enum_by_string(ctl, "S24_LE");
} else if (bit_width == 32) {
- mixer_ctl_set_enum_by_string(ctl, "S24_LE");
+ ret = mixer_ctl_set_enum_by_string(ctl, "S24_LE");
} else {
- mixer_ctl_set_enum_by_string(ctl, "S16_LE");
+ ret = mixer_ctl_set_enum_by_string(ctl, "S16_LE");
}
- my_data->current_backend_cfg[backend_idx].bit_width = bit_width;
- ALOGD("%s:becf: afe: %s mixer set to %d bit for %x format", __func__,
- my_data->current_backend_cfg[backend_idx].bitwidth_mixer_ctl, bit_width, format);
+ if ( ret < 0) {
+ ALOGE("%s:becf: afe: fail for %s mixer set to %d bit for %x format", __func__,
+ my_data->current_backend_cfg[backend_idx].bitwidth_mixer_ctl, bit_width, format);
+ } else {
+ my_data->current_backend_cfg[backend_idx].bit_width = bit_width;
+ ALOGD("%s:becf: afe: %s mixer set to %d bit for %x format", __func__,
+ my_data->current_backend_cfg[backend_idx].bitwidth_mixer_ctl, bit_width, format);
+ }
+ /* set the ret as 0 and not pass back to upper layer */
+ ret = 0;
}
if (sample_rate !=
my_data->current_backend_cfg[backend_idx].sample_rate) {
char *rate_str = NULL;
- struct mixer_ctl *ctl;
+ struct mixer_ctl *ctl = NULL;
switch (sample_rate) {
case 8000:
@@ -4401,7 +4457,7 @@
}
if ((my_data->current_backend_cfg[backend_idx].channels_mixer_ctl) &&
(channels != my_data->current_backend_cfg[backend_idx].channels)) {
- struct mixer_ctl *ctl;
+ struct mixer_ctl *ctl = NULL;
char *channel_cnt_str = NULL;
switch (channels) {
@@ -4417,6 +4473,9 @@
channel_cnt_str = "Four"; break;
case 3:
channel_cnt_str = "Three"; break;
+ case 1:
+ channel_cnt_str = "One"; break;
+ case 2:
default:
channel_cnt_str = "Two"; break;
}
@@ -4436,7 +4495,8 @@
platform_set_edid_channels_configuration(adev->platform, channels);
ALOGD("%s:becf: afe: %s set to %s", __func__,
- my_data->current_backend_cfg[backend_idx].channels_mixer_ctl, channel_cnt_str);
+ my_data->current_backend_cfg[backend_idx].channels_mixer_ctl,
+ channel_cnt_str);
}
bool set_ext_disp_format = false;
@@ -4786,126 +4846,6 @@
}
/*
- * configures afe with bit width and Sample Rate
- */
-
-static int platform_set_capture_codec_backend_cfg(struct audio_device* adev,
- snd_device_t snd_device,
- struct audio_backend_cfg backend_cfg)
-{
- int ret = 0;
- int backend_idx = platform_get_capture_backend_index(snd_device);
- struct platform_data *my_data = (struct platform_data *)adev->platform;
-
- ALOGI("%s:txbecf: afe: bitwidth %d, samplerate %d, backend_idx %d device (%s)",
- __func__, backend_cfg.bit_width, backend_cfg.sample_rate, backend_idx,
- platform_get_snd_device_name(snd_device));
-
- if (backend_cfg.bit_width!=
- my_data->current_tx_backend_cfg[backend_idx].bit_width) {
-
- struct mixer_ctl *ctl = NULL;
- ctl = mixer_get_ctl_by_name(adev->mixer,
- my_data->current_tx_backend_cfg[backend_idx].bitwidth_mixer_ctl);
- if (!ctl) {
- ALOGE("%s:txbecf: afe: Could not get ctl for mixer command - %s",
- __func__,
- my_data->current_tx_backend_cfg[backend_idx].bitwidth_mixer_ctl);
- return -EINVAL;
- }
- if (backend_cfg.bit_width == 24) {
- if (backend_cfg.format == AUDIO_FORMAT_PCM_24_BIT_PACKED)
- ret = mixer_ctl_set_enum_by_string(ctl, "S24_3LE");
- else
- ret = mixer_ctl_set_enum_by_string(ctl, "S24_LE");
- } else {
- ret = mixer_ctl_set_enum_by_string(ctl, "S16_LE");
- }
-
- if (ret < 0) {
- ALOGE("%s:txbecf: afe: Could not set ctl for mixer command - %s",
- __func__,
- my_data->current_tx_backend_cfg[backend_idx].bitwidth_mixer_ctl);
- return -EINVAL;
- }
-
- my_data->current_tx_backend_cfg[backend_idx].bit_width = backend_cfg.bit_width;
- ALOGD("%s:txbecf: afe: %s mixer set to %d bit", __func__,
- my_data->current_tx_backend_cfg[backend_idx].bitwidth_mixer_ctl,
- backend_cfg.bit_width);
- }
-
- /*
- * Backend sample rate configuration follows:
- * 16 bit record - 48khz for streams at any valid sample rate
- * 24 bit record - 48khz for stream sample rate less than 48khz
- * 24 bit record - 96khz for sample rate range of 48khz to 96khz
- * 24 bit record - 192khz for sample rate range of 96khz to 192 khz
- * Upper limit is inclusive in the sample rate range.
- */
- // TODO: This has to be more dynamic based on policy file
-
- if (backend_cfg.sample_rate !=
- my_data->current_tx_backend_cfg[(int)backend_idx].sample_rate) {
- /*
- * sample rate update is needed only for hifi audio enabled platforms
- */
- char *rate_str = NULL;
- struct mixer_ctl *ctl = NULL;
-
- switch (backend_cfg.sample_rate) {
- case 8000:
- case 11025:
- case 16000:
- case 22050:
- case 32000:
- case 44100:
- case 48000:
- rate_str = "KHZ_48";
- break;
- case 64000:
- case 88200:
- case 96000:
- rate_str = "KHZ_96";
- break;
- case 176400:
- case 192000:
- rate_str = "KHZ_192";
- break;
- default:
- rate_str = "KHZ_48";
- break;
- }
-
- ctl = mixer_get_ctl_by_name(adev->mixer,
- my_data->current_tx_backend_cfg[backend_idx].samplerate_mixer_ctl);
-
- if (!ctl) {
- ALOGE("%s:txbecf: afe: Could not get ctl to set the Sample Rate for mixer command - %s",
- __func__,
- my_data->current_tx_backend_cfg[backend_idx].samplerate_mixer_ctl);
- return -EINVAL;
- }
-
- ALOGD("%s:txbecf: afe: %s set to %s", __func__,
- my_data->current_tx_backend_cfg[backend_idx].samplerate_mixer_ctl,
- rate_str);
- ret = mixer_ctl_set_enum_by_string(ctl, rate_str);
- if (ret < 0) {
- ALOGE("%s:txbecf: afe: Could not set ctl for mixer command - %s",
- __func__,
- my_data->current_tx_backend_cfg[backend_idx].samplerate_mixer_ctl);
- return -EINVAL;
- }
-
- my_data->current_tx_backend_cfg[backend_idx].sample_rate =
- backend_cfg.sample_rate;
- }
-
- return ret;
-}
-
-/*
* goes through all the current usecases and picks the highest
* bitwidth & samplerate
*/
@@ -4924,20 +4864,21 @@
channels = backend_cfg->channels;
ALOGI("%s:txbecf: afe: Codec selected backend: %d current bit width: %d and "
- "sample rate: %d",__func__,backend_idx, bit_width, sample_rate);
+ "sample rate: %d, channels %d",__func__,backend_idx, bit_width,
+ sample_rate, channels);
// For voice calls use default configuration i.e. 16b/48K, only applicable to
// default backend
// force routing is not required here, caller will do it anyway
if (voice_is_in_call(adev) || adev->mode == AUDIO_MODE_IN_COMMUNICATION) {
- ALOGW("%s:txbecf: afe:Use default bw and sr for voice/voip calls and "
+ ALOGW("%s:txbecf: afe: Use default bw and sr for voice/voip calls and "
"for unprocessed/camera source", __func__);
bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
}
if (backend_idx == USB_AUDIO_TX_BACKEND) {
audio_extn_usb_is_config_supported(&bit_width, &sample_rate, &channels, false);
- ALOGV("%s: USB BE configured as bit_width(%d)sample_rate(%d)channels(%d)",
+ ALOGV("%s:txbecf: afe: USB BE configured as bit_width(%d)sample_rate(%d)channels(%d)",
__func__, bit_width, sample_rate, channels);
}
@@ -4945,14 +4886,17 @@
"sample rate: %d", __func__, backend_idx, bit_width, sample_rate);
// Force routing if the expected bitwdith or samplerate
// is not same as current backend comfiguration
- if ((bit_width != my_data->current_tx_backend_cfg[backend_idx].bit_width) ||
- (sample_rate != my_data->current_tx_backend_cfg[backend_idx].sample_rate)) {
+ if ((bit_width != my_data->current_backend_cfg[backend_idx].bit_width) ||
+ (sample_rate != my_data->current_backend_cfg[backend_idx].sample_rate) ||
+ (channels != my_data->current_backend_cfg[backend_idx].channels)) {
backend_cfg->bit_width = bit_width;
backend_cfg->sample_rate= sample_rate;
+ backend_cfg->channels = channels;
backend_change = true;
ALOGI("%s:txbecf: afe: Codec backend needs to be updated. new bit width: %d "
- "new sample rate: %d", __func__, backend_cfg->bit_width,
- backend_cfg->sample_rate);
+ "new sample rate: %d new channel: %d",
+ __func__, backend_cfg->bit_width,
+ backend_cfg->sample_rate, backend_cfg->channels);
}
return backend_change;
@@ -4961,7 +4905,7 @@
bool platform_check_and_set_capture_codec_backend_cfg(struct audio_device* adev,
struct audio_usecase *usecase, snd_device_t snd_device)
{
- int backend_idx = platform_get_capture_backend_index(snd_device);
+ int backend_idx = platform_get_backend_index(snd_device);
int ret = 0;
struct audio_backend_cfg backend_cfg;
@@ -4987,8 +4931,8 @@
platform_get_snd_device_name(snd_device));
if (platform_check_capture_codec_backend_cfg(adev, backend_idx,
&backend_cfg)) {
- ret = platform_set_capture_codec_backend_cfg(adev, snd_device,
- backend_cfg);
+ ret = platform_set_codec_backend_cfg(adev, snd_device,
+ backend_cfg);
if(!ret)
return true;
}
@@ -5546,7 +5490,9 @@
if (snd_device == SND_DEVICE_OUT_SPEAKER ||
snd_device == SND_DEVICE_OUT_SPEAKER_VBAT ||
snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
- snd_device == SND_DEVICE_OUT_VOICE_SPEAKER) {
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT ||
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
+ snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2) {
ret = true;
}
@@ -5564,12 +5510,18 @@
case SND_DEVICE_OUT_VOICE_SPEAKER:
acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED);
break;
+ case SND_DEVICE_OUT_VOICE_SPEAKER_2:
+ acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED);
+ break;
case SND_DEVICE_OUT_SPEAKER_VBAT:
acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT);
break;
case SND_DEVICE_OUT_VOICE_SPEAKER_VBAT:
acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT);
break;
+ case SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT:
+ acdb_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT);
+ break;
default:
acdb_id = -EINVAL;
break;
@@ -5587,14 +5539,34 @@
return SND_DEVICE_OUT_SPEAKER_PROTECTED;
case SND_DEVICE_OUT_VOICE_SPEAKER:
return SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED;
+ case SND_DEVICE_OUT_VOICE_SPEAKER_2:
+ return SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED;
case SND_DEVICE_OUT_SPEAKER_VBAT:
return SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT;
case SND_DEVICE_OUT_VOICE_SPEAKER_VBAT:
return SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT;
+ case SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT:
+ return SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT;
default:
return snd_device;
}
}
+int platform_get_vi_feedback_snd_device(snd_device_t snd_device)
+{
+ switch(snd_device) {
+ case SND_DEVICE_OUT_SPEAKER_PROTECTED:
+ case SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT:
+ return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK;
+ case SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED:
+ case SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT:
+ return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1;
+ case SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED:
+ case SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT:
+ return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2;
+ default:
+ return SND_DEVICE_IN_CAPTURE_VI_FEEDBACK;
+ }
+}
int platform_spkr_prot_is_wsa_analog_mode(void *adev __unused)
{
diff --git a/hal/msm8974/platform.h b/hal/msm8974/platform.h
index bcf5d93..2b65950 100644
--- a/hal/msm8974/platform.h
+++ b/hal/msm8974/platform.h
@@ -39,6 +39,11 @@
SOURCE_QUAD_MIC = 0x8, /* Target contains 4 mics */
};
+enum {
+ SPKR_1,
+ SPKR_2
+};
+
/*
* Below are the devices for which is back end is same, SLIMBUS_0_RX.
* All these devices are handled by the internal HW codec. We can
@@ -89,6 +94,8 @@
SND_DEVICE_OUT_VOICE_HANDSET,
SND_DEVICE_OUT_VOICE_SPEAKER,
SND_DEVICE_OUT_VOICE_SPEAKER_VBAT,
+ SND_DEVICE_OUT_VOICE_SPEAKER_2,
+ SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT,
SND_DEVICE_OUT_VOICE_HEADPHONES,
SND_DEVICE_OUT_VOICE_LINE,
SND_DEVICE_OUT_HDMI,
@@ -115,10 +122,13 @@
SND_DEVICE_OUT_ANC_HANDSET,
SND_DEVICE_OUT_SPEAKER_PROTECTED,
SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED,
+ SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED,
SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT,
SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED_VBAT,
+ SND_DEVICE_OUT_VOICE_SPEAKER_2_PROTECTED_VBAT,
SND_DEVICE_OUT_SPEAKER_WSA,
SND_DEVICE_OUT_VOICE_SPEAKER_WSA,
+ SND_DEVICE_OUT_VOICE_SPEAKER_2_WSA,
SND_DEVICE_OUT_END,
/*
@@ -172,6 +182,8 @@
SND_DEVICE_IN_HANDSET_STEREO_DMIC,
SND_DEVICE_IN_SPEAKER_STEREO_DMIC,
SND_DEVICE_IN_CAPTURE_VI_FEEDBACK,
+ SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_1,
+ SND_DEVICE_IN_CAPTURE_VI_FEEDBACK_MONO_2,
SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE,
SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE,
SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE,
@@ -213,14 +225,12 @@
HDMI_RX_BACKEND,
DISP_PORT_RX_BACKEND,
USB_AUDIO_RX_BACKEND,
- MAX_CODEC_BACKENDS
-};
-
-enum {
- DEFAULT_CODEC_TX_BACKEND,
- SLIMBUS_0_TX = DEFAULT_CODEC_TX_BACKEND,
+ MAX_RX_CODEC_BACKENDS = USB_AUDIO_RX_BACKEND,
+ /* TX BE follows RX BE */
+ SLIMBUS_0_TX,
+ DEFAULT_CODEC_TX_BACKEND = SLIMBUS_0_TX,
USB_AUDIO_TX_BACKEND,
- MAX_CODEC_TX_BACKENDS
+ MAX_CODEC_BACKENDS
};
#define AUDIO_PARAMETER_KEY_NATIVE_AUDIO "audio.nat.codec.enabled"
diff --git a/hal/platform_api.h b/hal/platform_api.h
index 7bd6756..7dcd1b6 100644
--- a/hal/platform_api.h
+++ b/hal/platform_api.h
@@ -24,6 +24,8 @@
#define CODEC_BACKEND_DEFAULT_BIT_WIDTH 16
#define CODEC_BACKEND_DEFAULT_SAMPLE_RATE 48000
#define CODEC_BACKEND_DEFAULT_CHANNELS 2
+#define CODEC_BACKEND_DEFAULT_TX_CHANNELS 1
+
enum {
NATIVE_AUDIO_MODE_SRC = 1,
@@ -143,6 +145,7 @@
bool platform_can_enable_spkr_prot_on_device(snd_device_t snd_device);
int platform_get_spkr_prot_acdb_id(snd_device_t snd_device);
int platform_get_spkr_prot_snd_device(snd_device_t snd_device);
+int platform_get_vi_feedback_snd_device(snd_device_t snd_device);
int platform_spkr_prot_is_wsa_analog_mode(void *adev);
bool platform_can_split_snd_device(void *platform,
snd_device_t snd_device,
diff --git a/policy_hal/AudioPolicyManager.cpp b/policy_hal/AudioPolicyManager.cpp
index 9b950d9..022a3c0 100644
--- a/policy_hal/AudioPolicyManager.cpp
+++ b/policy_hal/AudioPolicyManager.cpp
@@ -464,6 +464,11 @@
}
}
#endif
+ if (property_get_bool("voice.dsd.playback.conc.disabled", true) &&
+ isInCall() && (offloadInfo.format == AUDIO_FORMAT_DSD)) {
+ ALOGD("blocking DSD compress offload on call mode");
+ return false;
+ }
#ifdef RECORD_PLAY_CONCURRENCY
char recConcPropValue[PROPERTY_VALUE_MAX];
bool prop_rec_play_enabled = false;
@@ -846,6 +851,26 @@
}
#endif
+
+ sp<SwAudioOutputDescriptor> outputDesc = NULL;
+ for (size_t i = 0; i < mOutputs.size(); i++) {
+ outputDesc = mOutputs.valueAt(i);
+ if ((outputDesc == NULL) || (outputDesc->mProfile == NULL)) {
+ ALOGD("voice_conc:ouput desc / profile is NULL");
+ continue;
+ }
+
+ if (property_get_bool("voice.dsd.playback.conc.disabled", true) &&
+ (outputDesc->mFlags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) &&
+ (outputDesc->mFormat == AUDIO_FORMAT_DSD)) {
+ ALOGD("voice_conc:calling closeOutput on call mode for DSD COMPRESS output");
+ closeOutput(mOutputs.keyAt(i));
+ // call invalidate for music, so that DSD compress will fallback to deep-buffer.
+ mpClientInterface->invalidateStream(AUDIO_STREAM_MUSIC);
+ }
+
+ }
+
#ifdef RECORD_PLAY_CONCURRENCY
char recConcPropValue[PROPERTY_VALUE_MAX];
bool prop_rec_play_enabled = false;