diff options
| author | Ravi Kumar Alamanda <ralama@codeaurora.org> | 2014-04-02 15:11:49 -0700 |
|---|---|---|
| committer | Glenn Kasten <gkasten@google.com> | 2014-04-29 11:34:19 -0700 |
| commit | 9f3065480c81bf01d3af65bfd3da09e1fb74b520 (patch) | |
| tree | ebf2c1e6f96bf227221efa655d22972e1598f1ae | |
| parent | c38e452918fd27b410a40be44132db32090dfced (diff) | |
| download | android_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.c | 9 | ||||
| -rw-r--r-- | hal/audio_hw.h | 1 | ||||
| -rw-r--r-- | hal/msm8960/platform.c | 37 | ||||
| -rw-r--r-- | hal/msm8960/platform.h | 2 | ||||
| -rw-r--r-- | hal/msm8974/platform.c | 39 | ||||
| -rw-r--r-- | hal/msm8974/platform.h | 2 |
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, |
