summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRavi Kumar Alamanda <ralama@codeaurora.org>2014-04-02 15:11:49 -0700
committerGlenn Kasten <gkasten@google.com>2014-04-29 11:34:19 -0700
commit9f3065480c81bf01d3af65bfd3da09e1fb74b520 (patch)
treeebf2c1e6f96bf227221efa655d22972e1598f1ae
parentc38e452918fd27b410a40be44132db32090dfced (diff)
downloadandroid_hardware_qcom_audio-9f3065480c81bf01d3af65bfd3da09e1fb74b520.tar.gz
android_hardware_qcom_audio-9f3065480c81bf01d3af65bfd3da09e1fb74b520.tar.bz2
android_hardware_qcom_audio-9f3065480c81bf01d3af65bfd3da09e1fb74b520.zip
audio: support for wide-band speech audio over BT
Adding support for WB audio with BT devices Change-Id: Ibaab69a8eb52f42f214c9c1f8f26ad3494728695 Bug: 13763881
-rw-r--r--hal/audio_hw.c9
-rw-r--r--hal/audio_hw.h1
-rw-r--r--hal/msm8960/platform.c37
-rw-r--r--hal/msm8960/platform.h2
-rw-r--r--hal/msm8974/platform.c39
-rw-r--r--hal/msm8974/platform.h2
6 files changed, 79 insertions, 11 deletions
diff --git a/hal/audio_hw.c b/hal/audio_hw.c
index 89828139..4a15874c 100644
--- a/hal/audio_hw.c
+++ b/hal/audio_hw.c
@@ -2116,6 +2116,13 @@ static int adev_set_parameters(struct audio_hw_device *dev, const char *kvpairs)
}
}
+ 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 @@ static int adev_open(const hw_module_t *module, const char *name,
}
}
+ 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 887bf6bb..3a306884 100644
--- a/hal/audio_hw.h
+++ b/hal/audio_hw.h
@@ -189,6 +189,7 @@ struct audio_device {
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 b200e274..e9c205a6 100644
--- a/hal/msm8960/platform.c
+++ b/hal/msm8960/platform.c
@@ -123,6 +123,7 @@ static const char * const device_table[SND_DEVICE_MAX] = {
[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 @@ static const char * const device_table[SND_DEVICE_MAX] = {
[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 @@ static const int acdb_device_table[SND_DEVICE_MAX] = {
[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 @@ static const int acdb_device_table[SND_DEVICE_MAX] = {
[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 @@ void platform_add_backend_name(char *mixer_path, snd_device_t snd_device)
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 @@ snd_device_t platform_get_output_snd_device(void *platform, audio_devices_t devi
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 @@ snd_device_t platform_get_output_snd_device(void *platform, audio_devices_t devi
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 @@ snd_device_t platform_get_input_snd_device(void *platform, audio_devices_t out_d
} 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 @@ snd_device_t platform_get_input_snd_device(void *platform, audio_devices_t out_d
} 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 @@ snd_device_t platform_get_input_snd_device(void *platform, audio_devices_t out_d
} 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 4bc50032..391e9119 100644
--- a/hal/msm8960/platform.h
+++ b/hal/msm8960/platform.h
@@ -46,6 +46,7 @@ enum {
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 @@ enum {
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 15f84769..ed125c1a 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 @@ struct platform_data {
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 @@ static const char * const device_table[SND_DEVICE_MAX] = {
[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 @@ static const char * const device_table[SND_DEVICE_MAX] = {
[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 @@ static const int acdb_device_table[SND_DEVICE_MAX] = {
[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 @@ static const int acdb_device_table[SND_DEVICE_MAX] = {
[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 @@ void platform_add_backend_name(char *mixer_path, snd_device_t snd_device)
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 @@ snd_device_t platform_get_output_snd_device(void *platform, audio_devices_t devi
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 @@ snd_device_t platform_get_output_snd_device(void *platform, audio_devices_t devi
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 @@ snd_device_t platform_get_input_snd_device(void *platform, audio_devices_t out_d
} 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 @@ snd_device_t platform_get_input_snd_device(void *platform, audio_devices_t out_d
} 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 @@ snd_device_t platform_get_input_snd_device(void *platform, audio_devices_t out_d
} 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 a6b3c31c..558c91c6 100644
--- a/hal/msm8974/platform.h
+++ b/hal/msm8974/platform.h
@@ -47,6 +47,7 @@ enum {
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 @@ enum {
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,