hal: Add support for Hearing Aid Compatibility (HAC) mode
Change-Id: Id4e7eb98336fd3dd3569a31b61a3ccf529d081a3
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index 86bfbfa..a6f2a8c 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -129,6 +129,7 @@
[SND_DEVICE_OUT_HEADPHONES] = "headphones",
[SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES] = "speaker-and-headphones",
[SND_DEVICE_OUT_VOICE_HANDSET] = "voice-handset",
+ [SND_DEVICE_OUT_VOICE_HAC_HANDSET] = "voice-hac-handset",
[SND_DEVICE_OUT_VOICE_SPEAKER] = "voice-speaker",
[SND_DEVICE_OUT_VOICE_HEADPHONES] = "voice-headphones",
[SND_DEVICE_OUT_HDMI] = "hdmi",
@@ -183,6 +184,7 @@
[SND_DEVICE_OUT_VOICE_HANDSET] = 7,
[SND_DEVICE_OUT_VOICE_SPEAKER] = 15,
#endif
+ [SND_DEVICE_OUT_VOICE_HAC_HANDSET] = 53,
[SND_DEVICE_OUT_VOICE_HEADPHONES] = 10,
[SND_DEVICE_OUT_HDMI] = 18,
[SND_DEVICE_OUT_SPEAKER_AND_HDMI] = 15,
@@ -244,6 +246,7 @@
{TO_NAME_INDEX(SND_DEVICE_OUT_BT_SCO)},
{TO_NAME_INDEX(SND_DEVICE_OUT_BT_SCO_WB)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_HANDSET_TMUS)},
+ {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_HAC_HANDSET)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES)},
{TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET)},
@@ -544,6 +547,7 @@
if (my_data->ext_earpiece) {
backend_table[SND_DEVICE_OUT_VOICE_HANDSET] = strdup("handset");
+ backend_table[SND_DEVICE_OUT_VOICE_HAC_HANDSET] = strdup("handset");
backend_table[SND_DEVICE_OUT_VOICE_HANDSET_TMUS] = strdup("handset");
backend_table[SND_DEVICE_OUT_HANDSET] = strdup("handset");
backend_table[SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = strdup("handset");
@@ -1103,7 +1107,9 @@
} else if (devices & AUDIO_DEVICE_OUT_SPEAKER) {
snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
} else if (devices & AUDIO_DEVICE_OUT_EARPIECE) {
- if (is_operator_tmus())
+ if(adev->voice.hac)
+ snd_device = SND_DEVICE_OUT_VOICE_HAC_HANDSET;
+ else if (is_operator_tmus())
snd_device = SND_DEVICE_OUT_VOICE_HANDSET_TMUS;
else
snd_device = SND_DEVICE_OUT_VOICE_HANDSET;
@@ -1154,7 +1160,11 @@
} else if (devices & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
snd_device = SND_DEVICE_OUT_HDMI ;
} else if (devices & AUDIO_DEVICE_OUT_EARPIECE) {
- snd_device = SND_DEVICE_OUT_HANDSET;
+ /*HAC support for voice-ish audio (eg visual voicemail)*/
+ if(adev->voice.hac)
+ snd_device = SND_DEVICE_OUT_VOICE_HAC_HANDSET;
+ else
+ snd_device = SND_DEVICE_OUT_HANDSET;
} else {
ALOGE("%s: Unknown device(s) %#x", __func__, devices);
}
diff --git a/hal/msm8974/platform.h b/hal/msm8974/platform.h
index c713561..65a1f6b 100644
--- a/hal/msm8974/platform.h
+++ b/hal/msm8974/platform.h
@@ -52,6 +52,7 @@
SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES,
SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES,
SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET,
+ SND_DEVICE_OUT_VOICE_HAC_HANDSET,
SND_DEVICE_OUT_END,
/*
diff --git a/hal/voice.c b/hal/voice.c
index c63c525..ecc607d 100644
--- a/hal/voice.c
+++ b/hal/voice.c
@@ -402,6 +402,21 @@
}
}
+ err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_HAC,
+ value, sizeof(value));
+ if (err >= 0) {
+ bool hac = false;
+ str_parms_del(parms, AUDIO_PARAMETER_KEY_HAC);
+ if (strcmp(value, AUDIO_PARAMETER_VALUE_HAC_ON) == 0)
+ hac = true;
+
+ if (hac != adev->voice.hac) {
+ adev->voice.hac = hac;
+ if (voice_is_in_call(adev))
+ voice_update_devices_for_all_voice_usecases(adev);
+ }
+ }
+
err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_INCALLMUSIC,
value, sizeof(value));
if (err >= 0) {
@@ -424,6 +439,7 @@
memset(&adev->voice, 0, sizeof(adev->voice));
adev->voice.tty_mode = TTY_MODE_OFF;
+ adev->voice.hac = false;
adev->voice.volume = 1.0f;
adev->voice.mic_mute = false;
adev->voice.voice_device_set = false;
diff --git a/hal/voice.h b/hal/voice.h
index ba2240c..11f3be0 100644
--- a/hal/voice.h
+++ b/hal/voice.h
@@ -55,6 +55,7 @@
struct voice {
struct voice_session session[MAX_VOICE_SESSIONS];
int tty_mode;
+ bool hac;
bool mic_mute;
float volume;
bool voice_device_set;