audio: support for wide-band speech audio over BT
Adding support for WB audio with BT devices
Change-Id: Ibaab69a8eb52f42f214c9c1f8f26ad3494728695
Bug: 13763881
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 8982813..4a15874 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -2116,6 +2116,13 @@
}
}
+ ret = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_BT_SCO_WB, value, sizeof(value));
+ if (ret >= 0) {
+ pthread_mutex_lock(&adev->lock);
+ adev->bt_wb_speech_enabled = !strcmp(value, AUDIO_PARAMETER_VALUE_ON);
+ pthread_mutex_unlock(&adev->lock);
+ }
+
str_parms_destroy(parms);
ALOGV("%s: exit with code(%d)", __func__, status);
return status;
@@ -2533,6 +2540,8 @@
}
}
+ adev->bt_wb_speech_enabled = false;
+
*device = &adev->device.common;
if (k_enable_extended_precision)
adev_verify_devices(adev);
diff --git a/hal/audio_hw.h b/hal/audio_hw.h
index 887bf6b..3a30688 100644
--- a/hal/audio_hw.h
+++ b/hal/audio_hw.h
@@ -189,6 +189,7 @@
int acdb_settings;
bool speaker_lr_swap;
unsigned int cur_hdmi_channels;
+ bool bt_wb_speech_enabled;
void *platform;
diff --git a/hal/msm8960/platform.c b/hal/msm8960/platform.c
index b200e27..e9c205a 100644
--- a/hal/msm8960/platform.c
+++ b/hal/msm8960/platform.c
@@ -123,6 +123,7 @@
[SND_DEVICE_OUT_HDMI] = "hdmi",
[SND_DEVICE_OUT_SPEAKER_AND_HDMI] = "speaker-and-hdmi",
[SND_DEVICE_OUT_BT_SCO] = "bt-sco-headset",
+ [SND_DEVICE_OUT_BT_SCO_WB] = "bt-sco-headset-wb",
[SND_DEVICE_OUT_VOICE_HANDSET_TMUS] = "voice-handset-tmus",
[SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = "voice-tty-full-headphones",
[SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = "voice-tty-vco-headphones",
@@ -139,6 +140,7 @@
[SND_DEVICE_IN_VOICE_HEADSET_MIC] = "voice-headset-mic",
[SND_DEVICE_IN_HDMI_MIC] = "hdmi-mic",
[SND_DEVICE_IN_BT_SCO_MIC] = "bt-sco-mic",
+ [SND_DEVICE_IN_BT_SCO_MIC_WB] = "bt-sco-mic-wb",
[SND_DEVICE_IN_CAMCORDER_MIC] = "camcorder-mic",
[SND_DEVICE_IN_VOICE_DMIC_EF] = "voice-dmic-ef",
[SND_DEVICE_IN_VOICE_DMIC_BS] = "voice-dmic-bs",
@@ -168,6 +170,7 @@
[SND_DEVICE_OUT_HDMI] = 18,
[SND_DEVICE_OUT_SPEAKER_AND_HDMI] = 14,
[SND_DEVICE_OUT_BT_SCO] = 22,
+ [SND_DEVICE_OUT_BT_SCO_WB] = 39,
[SND_DEVICE_OUT_VOICE_HANDSET_TMUS] = 81,
[SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = 17,
[SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = 17,
@@ -183,6 +186,7 @@
[SND_DEVICE_IN_VOICE_HEADSET_MIC] = 8,
[SND_DEVICE_IN_HDMI_MIC] = 4,
[SND_DEVICE_IN_BT_SCO_MIC] = 21,
+ [SND_DEVICE_IN_BT_SCO_MIC_WB] = 38,
[SND_DEVICE_IN_CAMCORDER_MIC] = 61,
[SND_DEVICE_IN_VOICE_DMIC_EF] = 6,
[SND_DEVICE_IN_VOICE_DMIC_BS] = 5,
@@ -385,6 +389,9 @@
strcat(mixer_path, " hdmi");
else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_HDMI)
strcat(mixer_path, " speaker-and-hdmi");
+ else if (snd_device == SND_DEVICE_OUT_BT_SCO_WB ||
+ snd_device == SND_DEVICE_IN_BT_SCO_MIC_WB)
+ strcat(mixer_path, " bt-sco-wb");
}
int platform_get_pcm_device_id(audio_usecase_t usecase, int device_type)
@@ -583,7 +590,11 @@
else
snd_device = SND_DEVICE_OUT_VOICE_HEADPHONES;
} else if (devices & AUDIO_DEVICE_OUT_ALL_SCO) {
- snd_device = SND_DEVICE_OUT_BT_SCO;
+ if (adev->bt_wb_speech_enabled) {
+ snd_device = SND_DEVICE_OUT_BT_SCO_WB;
+ } else {
+ snd_device = SND_DEVICE_OUT_BT_SCO;
+ }
} else if (devices & AUDIO_DEVICE_OUT_SPEAKER) {
snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
} else if (devices & AUDIO_DEVICE_OUT_EARPIECE) {
@@ -630,7 +641,11 @@
else
snd_device = SND_DEVICE_OUT_SPEAKER;
} else if (devices & AUDIO_DEVICE_OUT_ALL_SCO) {
- snd_device = SND_DEVICE_OUT_BT_SCO;
+ if (adev->bt_wb_speech_enabled) {
+ snd_device = SND_DEVICE_OUT_BT_SCO_WB;
+ } else {
+ snd_device = SND_DEVICE_OUT_BT_SCO;
+ }
} else if (devices & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
snd_device = SND_DEVICE_OUT_HDMI ;
} else if (devices & AUDIO_DEVICE_OUT_EARPIECE) {
@@ -702,7 +717,11 @@
} else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
snd_device = SND_DEVICE_IN_VOICE_HEADSET_MIC;
} else if (out_device & AUDIO_DEVICE_OUT_ALL_SCO) {
- snd_device = SND_DEVICE_IN_BT_SCO_MIC ;
+ if (adev->bt_wb_speech_enabled) {
+ snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
+ } else {
+ snd_device = SND_DEVICE_IN_BT_SCO_MIC;
+ }
} else if (out_device & AUDIO_DEVICE_OUT_SPEAKER) {
if (my_data->fluence_in_voice_call && my_data->fluence_in_spkr_mode &&
my_data->dualmic_config == DUALMIC_CONFIG_ENDFIRE) {
@@ -772,7 +791,11 @@
} else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
snd_device = SND_DEVICE_IN_HEADSET_MIC;
} else if (in_device & AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET) {
- snd_device = SND_DEVICE_IN_BT_SCO_MIC ;
+ if (adev->bt_wb_speech_enabled) {
+ snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
+ } else {
+ snd_device = SND_DEVICE_IN_BT_SCO_MIC;
+ }
} else if (in_device & AUDIO_DEVICE_IN_AUX_DIGITAL) {
snd_device = SND_DEVICE_IN_HDMI_MIC;
} else {
@@ -790,7 +813,11 @@
} else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE) {
snd_device = SND_DEVICE_IN_HANDSET_MIC;
} else if (out_device & AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET) {
- snd_device = SND_DEVICE_IN_BT_SCO_MIC;
+ if (adev->bt_wb_speech_enabled) {
+ snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
+ } else {
+ snd_device = SND_DEVICE_IN_BT_SCO_MIC;
+ }
} else if (out_device & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
snd_device = SND_DEVICE_IN_HDMI_MIC;
} else {
diff --git a/hal/msm8960/platform.h b/hal/msm8960/platform.h
index 4bc5003..391e911 100644
--- a/hal/msm8960/platform.h
+++ b/hal/msm8960/platform.h
@@ -46,6 +46,7 @@
SND_DEVICE_OUT_HDMI,
SND_DEVICE_OUT_SPEAKER_AND_HDMI,
SND_DEVICE_OUT_BT_SCO,
+ SND_DEVICE_OUT_BT_SCO_WB,
SND_DEVICE_OUT_VOICE_HANDSET_TMUS,
SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES,
SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES,
@@ -68,6 +69,7 @@
SND_DEVICE_IN_VOICE_HEADSET_MIC,
SND_DEVICE_IN_HDMI_MIC,
SND_DEVICE_IN_BT_SCO_MIC,
+ SND_DEVICE_IN_BT_SCO_MIC_WB,
SND_DEVICE_IN_CAMCORDER_MIC,
SND_DEVICE_IN_VOICE_DMIC_EF,
SND_DEVICE_IN_VOICE_DMIC_BS,
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index 15f8476..ed125c1 100644
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -21,6 +21,7 @@
#include <stdlib.h>
#include <dlfcn.h>
#include <cutils/log.h>
+#include <cutils/str_parms.h>
#include <cutils/properties.h>
#include <audio_hw.h>
#include <platform_api.h>
@@ -74,7 +75,6 @@
bool fluence_in_voice_call;
bool fluence_in_voice_rec;
int dualmic_config;
-
void *acdb_handle;
acdb_init_t acdb_init;
acdb_deallocate_t acdb_deallocate;
@@ -107,6 +107,7 @@
[SND_DEVICE_OUT_HDMI] = "hdmi",
[SND_DEVICE_OUT_SPEAKER_AND_HDMI] = "speaker-and-hdmi",
[SND_DEVICE_OUT_BT_SCO] = "bt-sco-headset",
+ [SND_DEVICE_OUT_BT_SCO_WB] = "bt-sco-headset-wb",
[SND_DEVICE_OUT_VOICE_HANDSET_TMUS] = "voice-handset-tmus",
[SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = "voice-tty-full-headphones",
[SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = "voice-tty-vco-headphones",
@@ -123,6 +124,7 @@
[SND_DEVICE_IN_VOICE_HEADSET_MIC] = "voice-headset-mic",
[SND_DEVICE_IN_HDMI_MIC] = "hdmi-mic",
[SND_DEVICE_IN_BT_SCO_MIC] = "bt-sco-mic",
+ [SND_DEVICE_IN_BT_SCO_MIC_WB] = "bt-sco-mic-wb",
[SND_DEVICE_IN_CAMCORDER_MIC] = "camcorder-mic",
[SND_DEVICE_IN_VOICE_DMIC_EF] = "voice-dmic-ef",
[SND_DEVICE_IN_VOICE_DMIC_BS] = "voice-dmic-bs",
@@ -153,6 +155,7 @@
[SND_DEVICE_OUT_HDMI] = 18,
[SND_DEVICE_OUT_SPEAKER_AND_HDMI] = 15,
[SND_DEVICE_OUT_BT_SCO] = 22,
+ [SND_DEVICE_OUT_BT_SCO_WB] = 39,
[SND_DEVICE_OUT_VOICE_HANDSET_TMUS] = 88,
[SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = 17,
[SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = 17,
@@ -168,6 +171,7 @@
[SND_DEVICE_IN_VOICE_HEADSET_MIC] = 8,
[SND_DEVICE_IN_HDMI_MIC] = 4,
[SND_DEVICE_IN_BT_SCO_MIC] = 21,
+ [SND_DEVICE_IN_BT_SCO_MIC_WB] = 38,
[SND_DEVICE_IN_CAMCORDER_MIC] = 61,
[SND_DEVICE_IN_VOICE_DMIC_EF] = 41,
[SND_DEVICE_IN_VOICE_DMIC_BS] = 5,
@@ -368,6 +372,9 @@
strcat(mixer_path, " hdmi");
else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_HDMI)
strcat(mixer_path, " speaker-and-hdmi");
+ else if (snd_device == SND_DEVICE_OUT_BT_SCO_WB ||
+ snd_device == SND_DEVICE_IN_BT_SCO_MIC_WB)
+ strcat(mixer_path, " bt-sco-wb");
}
int platform_get_pcm_device_id(audio_usecase_t usecase, int device_type)
@@ -534,7 +541,11 @@
else
snd_device = SND_DEVICE_OUT_VOICE_HEADPHONES;
} else if (devices & AUDIO_DEVICE_OUT_ALL_SCO) {
- snd_device = SND_DEVICE_OUT_BT_SCO;
+ if (adev->bt_wb_speech_enabled) {
+ snd_device = SND_DEVICE_OUT_BT_SCO_WB;
+ } else {
+ snd_device = SND_DEVICE_OUT_BT_SCO;
+ }
} else if (devices & AUDIO_DEVICE_OUT_SPEAKER) {
snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
} else if (devices & AUDIO_DEVICE_OUT_EARPIECE) {
@@ -581,7 +592,11 @@
else
snd_device = SND_DEVICE_OUT_SPEAKER;
} else if (devices & AUDIO_DEVICE_OUT_ALL_SCO) {
- snd_device = SND_DEVICE_OUT_BT_SCO;
+ if (adev->bt_wb_speech_enabled) {
+ snd_device = SND_DEVICE_OUT_BT_SCO_WB;
+ } else {
+ snd_device = SND_DEVICE_OUT_BT_SCO;
+ }
} else if (devices & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
snd_device = SND_DEVICE_OUT_HDMI ;
} else if (devices & AUDIO_DEVICE_OUT_EARPIECE) {
@@ -653,7 +668,11 @@
} else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
snd_device = SND_DEVICE_IN_VOICE_HEADSET_MIC;
} else if (out_device & AUDIO_DEVICE_OUT_ALL_SCO) {
- snd_device = SND_DEVICE_IN_BT_SCO_MIC ;
+ if (adev->bt_wb_speech_enabled) {
+ snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
+ } else {
+ snd_device = SND_DEVICE_IN_BT_SCO_MIC;
+ }
} else if (out_device & AUDIO_DEVICE_OUT_SPEAKER) {
if (my_data->fluence_in_voice_call && my_data->fluence_in_spkr_mode &&
my_data->dualmic_config == DUALMIC_CONFIG_ENDFIRE) {
@@ -723,7 +742,11 @@
} else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
snd_device = SND_DEVICE_IN_HEADSET_MIC;
} else if (in_device & AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET) {
- snd_device = SND_DEVICE_IN_BT_SCO_MIC ;
+ if (adev->bt_wb_speech_enabled) {
+ snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
+ } else {
+ snd_device = SND_DEVICE_IN_BT_SCO_MIC;
+ }
} else if (in_device & AUDIO_DEVICE_IN_AUX_DIGITAL) {
snd_device = SND_DEVICE_IN_HDMI_MIC;
} else {
@@ -741,7 +764,11 @@
} else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE) {
snd_device = SND_DEVICE_IN_HANDSET_MIC;
} else if (out_device & AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET) {
- snd_device = SND_DEVICE_IN_BT_SCO_MIC;
+ if (adev->bt_wb_speech_enabled) {
+ snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
+ } else {
+ snd_device = SND_DEVICE_IN_BT_SCO_MIC;
+ }
} else if (out_device & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
snd_device = SND_DEVICE_IN_HDMI_MIC;
} else {
diff --git a/hal/msm8974/platform.h b/hal/msm8974/platform.h
index a6b3c31..558c91c 100644
--- a/hal/msm8974/platform.h
+++ b/hal/msm8974/platform.h
@@ -47,6 +47,7 @@
SND_DEVICE_OUT_HDMI,
SND_DEVICE_OUT_SPEAKER_AND_HDMI,
SND_DEVICE_OUT_BT_SCO,
+ SND_DEVICE_OUT_BT_SCO_WB,
SND_DEVICE_OUT_VOICE_HANDSET_TMUS,
SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES,
SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES,
@@ -69,6 +70,7 @@
SND_DEVICE_IN_VOICE_HEADSET_MIC,
SND_DEVICE_IN_HDMI_MIC,
SND_DEVICE_IN_BT_SCO_MIC,
+ SND_DEVICE_IN_BT_SCO_MIC_WB,
SND_DEVICE_IN_CAMCORDER_MIC,
SND_DEVICE_IN_VOICE_DMIC_EF,
SND_DEVICE_IN_VOICE_DMIC_BS,