*
*/
+#include <stdbool.h>
#include <dlog.h>
#include <time.h>
#include <sys/types.h>
return NULL; \
} \
} while (0)
+/*
+static device_type_t outDeviceTypes[] = {
+ { AUDIO_DEVICE_OUT_SPEAKER, "speaker" },
+ { AUDIO_DEVICE_OUT_BT_SCO, "bt-sco-headset" },
+ { AUDIO_DEVICE_OUT_BT_SCO_8K_NB, "bt-8k-sco-nb-headset" },
+ { AUDIO_DEVICE_OUT_BT_SCO_16K_NB, "bt-16k-sco-nb-headset" },
+ { AUDIO_DEVICE_OUT_BT_SCO_8K_WB, "bt-8k-sco-wb-headset" },
+ { AUDIO_DEVICE_OUT_BT_SCO_16K_WB, "bt-16k-sco-wb-headset" },
+ { 0, 0 },
+};
+
+static device_type_t inDeviceTypes[] = {
+ { AUDIO_DEVICE_IN_MAIN_MIC, "main-mic" },
+ { AUDIO_DEVICE_IN_BT_SCO, "bt-sco-mic" },
+ { AUDIO_DEVICE_IN_BT_SCO_8K_NB, "bt-8k-sco-nb-mic" },
+ { AUDIO_DEVICE_IN_BT_SCO_16K_NB, "bt-16k-sco-nb-mic" },
+ { AUDIO_DEVICE_IN_BT_SCO_8K_WB, "bt-8k-sco-wb-mic" },
+ { AUDIO_DEVICE_IN_BT_SCO_16K_WB, "bt-16k-sco-wb-mic" },
+ { 0, 0 },
+};
+
+
+*/
/* Devices : Normal */
#define AUDIO_DEVICE_OUT 0x00000000
AUDIO_DEVICE_OUT_RECEIVER = AUDIO_DEVICE_OUT | 0x00000002,
AUDIO_DEVICE_OUT_JACK = AUDIO_DEVICE_OUT | 0x00000004,
AUDIO_DEVICE_OUT_BT_SCO = AUDIO_DEVICE_OUT | 0x00000008,
+ AUDIO_DEVICE_OUT_BT_SCO_8K_NB = AUDIO_DEVICE_OUT | 0x00000010,
+ AUDIO_DEVICE_OUT_BT_SCO_16K_NB = AUDIO_DEVICE_OUT | 0x00000020,
+ AUDIO_DEVICE_OUT_BT_SCO_8K_WB = AUDIO_DEVICE_OUT | 0x00000040,
+ AUDIO_DEVICE_OUT_BT_SCO_16K_WB = AUDIO_DEVICE_OUT | 0x00000080,
AUDIO_DEVICE_OUT_ALL = (AUDIO_DEVICE_OUT_SPEAKER |
AUDIO_DEVICE_OUT_RECEIVER |
AUDIO_DEVICE_OUT_JACK |
- AUDIO_DEVICE_OUT_BT_SCO),
+ AUDIO_DEVICE_OUT_BT_SCO |
+ AUDIO_DEVICE_OUT_BT_SCO_8K_NB |
+ AUDIO_DEVICE_OUT_BT_SCO_16K_NB |
+ AUDIO_DEVICE_OUT_BT_SCO_8K_WB |
+ AUDIO_DEVICE_OUT_BT_SCO_16K_WB),
/* input devices */
AUDIO_DEVICE_IN_MAIN_MIC = AUDIO_DEVICE_IN | 0x00000001,
AUDIO_DEVICE_IN_SUB_MIC = AUDIO_DEVICE_IN | 0x00000002,
AUDIO_DEVICE_IN_JACK = AUDIO_DEVICE_IN | 0x00000004,
AUDIO_DEVICE_IN_BT_SCO = AUDIO_DEVICE_IN | 0x00000008,
+ AUDIO_DEVICE_IN_BT_SCO_8K_NB = AUDIO_DEVICE_IN | 0x00000010,
+ AUDIO_DEVICE_IN_BT_SCO_16K_NB = AUDIO_DEVICE_IN | 0x00000020,
+ AUDIO_DEVICE_IN_BT_SCO_8K_WB = AUDIO_DEVICE_IN | 0x00000040,
+ AUDIO_DEVICE_IN_BT_SCO_16K_WB = AUDIO_DEVICE_IN | 0x00000080,
AUDIO_DEVICE_IN_ALL = (AUDIO_DEVICE_IN_MAIN_MIC |
AUDIO_DEVICE_IN_SUB_MIC |
AUDIO_DEVICE_IN_JACK |
- AUDIO_DEVICE_IN_BT_SCO),
+ AUDIO_DEVICE_IN_BT_SCO |
+ AUDIO_DEVICE_IN_BT_SCO_8K_NB |
+ AUDIO_DEVICE_IN_BT_SCO_16K_NB |
+ AUDIO_DEVICE_IN_BT_SCO_8K_WB |
+ AUDIO_DEVICE_IN_BT_SCO_16K_WB),
};
typedef struct device_type {
audio_pcm_devices_t voice_pcm;
audio_pcm_devices_t bt_pcm;
audio_route_mode_t mode;
- uint32_t bt_wideband;
+ bool bt_wideband;
} audio_hal_device_t;
/* Volume */
audio_hal_volume_t volume;
audio_hal_ucm_t ucm;
audio_hal_mixer_t mixer;
+ bool call_wideband;
} audio_hal_t;
audio_return_t _audio_volume_init(audio_hal_t *ah);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <stdbool.h>
#include "tizen-audio-internal.h"
#include "tizen-audio-impl.h"
static device_type_t outDeviceTypes[] = {
{ AUDIO_DEVICE_OUT_SPEAKER, "speaker" },
{ AUDIO_DEVICE_OUT_BT_SCO, "bt-sco-headset" },
+ { AUDIO_DEVICE_OUT_BT_SCO_8K_NB, "bt-8k-sco-nb-headset" },
+ { AUDIO_DEVICE_OUT_BT_SCO_16K_NB, "bt-16k-sco-nb-headset" },
+ { AUDIO_DEVICE_OUT_BT_SCO_8K_WB, "bt-8k-sco-wb-headset" },
+ { AUDIO_DEVICE_OUT_BT_SCO_16K_WB, "bt-16k-sco-wb-headset" },
{ 0, 0 },
};
static device_type_t inDeviceTypes[] = {
{ AUDIO_DEVICE_IN_MAIN_MIC, "main-mic" },
{ AUDIO_DEVICE_IN_BT_SCO, "bt-sco-mic" },
+ { AUDIO_DEVICE_IN_BT_SCO_8K_NB, "bt-8k-sco-nb-mic" },
+ { AUDIO_DEVICE_IN_BT_SCO_16K_NB, "bt-16k-sco-nb-mic" },
+ { AUDIO_DEVICE_IN_BT_SCO_8K_WB, "bt-8k-sco-wb-mic" },
+ { AUDIO_DEVICE_IN_BT_SCO_16K_WB, "bt-16k-sco-wb-mic" },
{ 0, 0 },
};
AUDIO_USE_CASE_VERB_VOIP,
};
-static uint32_t __convert_device_string_to_enum(const char* device_str, uint32_t direction)
+static bool __is_acive_device_bt_sco_for_call(audio_hal_t *ah)
+{
+ if (!ah) {
+ AUDIO_LOG_WARN("ah is null");
+ return false;
+ }
+
+ if (ah->device.active_in & AUDIO_DEVICE_IN_BT_SCO_8K_NB &&
+ ah->device.active_out & AUDIO_DEVICE_OUT_BT_SCO_8K_NB)
+ return true;
+ if (ah->device.active_in & AUDIO_DEVICE_IN_BT_SCO_16K_NB &&
+ ah->device.active_out & AUDIO_DEVICE_OUT_BT_SCO_16K_NB)
+ return true;
+ if (ah->device.active_in & AUDIO_DEVICE_IN_BT_SCO_8K_WB &&
+ ah->device.active_out & AUDIO_DEVICE_OUT_BT_SCO_8K_WB)
+ return true;
+ if (ah->device.active_in & AUDIO_DEVICE_IN_BT_SCO_16K_WB &&
+ ah->device.active_out & AUDIO_DEVICE_OUT_BT_SCO_16K_WB)
+ return true;
+
+ return false;
+}
+
+static uint32_t __convert_device_string_to_enum(audio_hal_t *ah, const char *verb, const char* device_str, uint32_t direction)
{
uint32_t device = 0;
+ AUDIO_LOG_INFO("verb(%s), device string(%s), direction(%d)", verb, device_str, direction);
+
if (!strncmp(device_str, "builtin-speaker", MAX_NAME_LEN)) {
device = AUDIO_DEVICE_OUT_SPEAKER;
+
} else if ((!strncmp(device_str, "bt-sco", MAX_NAME_LEN)) && (direction == AUDIO_DIRECTION_OUT)) {
- device = AUDIO_DEVICE_OUT_BT_SCO;
+ if (!strncmp(verb, AUDIO_USE_CASE_VERB_HIFI, MAX_NAME_LEN)) {
+ device = AUDIO_DEVICE_OUT_BT_SCO;
+ } else if (!strncmp(verb, AUDIO_USE_CASE_VERB_VOICECALL, MAX_NAME_LEN)) {
+ AUDIO_LOG_INFO("device.bt_widband(%d), call_wideband(%d)", ah->device.bt_wideband, ah->call_wideband);
+ if (ah->device.bt_wideband) {
+ if (ah->call_wideband)
+ device = AUDIO_DEVICE_OUT_BT_SCO_16K_WB;
+ else
+ device = AUDIO_DEVICE_OUT_BT_SCO_16K_NB;
+ } else {
+ if (ah->call_wideband)
+ device = AUDIO_DEVICE_OUT_BT_SCO_8K_WB;
+ else
+ device = AUDIO_DEVICE_OUT_BT_SCO_8K_NB;
+ }
+ } else {
+ device = AUDIO_DEVICE_OUT_BT_SCO;
+ AUDIO_LOG_WARN("invalid verb, set device(%d) forcedly", device);
+ }
+
} else if ((!strncmp(device_str, "builtin-mic", MAX_NAME_LEN))) {
device = AUDIO_DEVICE_IN_MAIN_MIC;
+
} else if ((!strncmp(device_str, "bt-sco", MAX_NAME_LEN)) && (direction == AUDIO_DIRECTION_IN)) {
- device = AUDIO_DEVICE_IN_BT_SCO;
+ if (!strncmp(verb, AUDIO_USE_CASE_VERB_HIFI, MAX_NAME_LEN)) {
+ device = AUDIO_DEVICE_IN_BT_SCO;
+ } else if (!strncmp(verb, AUDIO_USE_CASE_VERB_VOICECALL, MAX_NAME_LEN)) {
+ AUDIO_LOG_INFO("device.bt_widband(%d), call_wideband(%d)", ah->device.bt_wideband, ah->call_wideband);
+ if (ah->device.bt_wideband) {
+ if (ah->call_wideband)
+ device = AUDIO_DEVICE_IN_BT_SCO_16K_WB;
+ else
+ device = AUDIO_DEVICE_IN_BT_SCO_16K_NB;
+ } else {
+ if (ah->call_wideband)
+ device = AUDIO_DEVICE_IN_BT_SCO_8K_WB;
+ else
+ device = AUDIO_DEVICE_IN_BT_SCO_8K_NB;
+ }
+ } else {
+ device = AUDIO_DEVICE_IN_BT_SCO;
+ AUDIO_LOG_WARN("invalid verb, set device(%d) forcedly", device);
+ }
+
} else {
device = AUDIO_DEVICE_NONE;
}
+
AUDIO_LOG_INFO("device type(%s), enum(0x%x)", device_str, device);
return device;
}
}
for (i = 0; i < num_of_devices; i++) {
- new_device = __convert_device_string_to_enum(devices[i].type, devices[i].direction);
+ new_device = __convert_device_string_to_enum(ah, verb, devices[i].type, devices[i].direction);
if (new_device & AUDIO_DEVICE_IN) {
for (j = 0; j < inDeviceTypes[j].type; j++) {
if (new_device == inDeviceTypes[j].type) {
if (ah->device.mode != VERB_VOICECALL) {
ah->device.mode = VERB_VOICECALL;
- /* FIXME. Get network info and configure rate in pcm device */
_reset_pcm_devices(ah);
} else {
+ /* if this request is for BT SCO device */
+ if (__is_acive_device_bt_sco_for_call(ah)) {
+ if (_is_bt_pcm_opened_all(ah)) {
+ AUDIO_LOG_INFO("bt pcm device is already opened, skip it");
+ return audio_ret;
+ }
+ if ((audio_ret = _bt_pcm_open_all(ah))) {
+ AUDIO_LOG_ERROR("Failed to open bt pcm device: error = 0x%x", audio_ret);
+ return audio_ret;
+ }
+ }
+
if (_is_voice_pcm_opened_all(ah)) {
AUDIO_LOG_INFO("voice pcm device is already opened, skip it");
return audio_ret;
if ((audio_ret = _ucm_set_devices(ah, mode_to_verb_str[ah->device.mode], active_devices)))
AUDIO_LOG_ERROR("failed to _ucm_set_devices(), ret(0x%x)", audio_ret);
+ /* reset bandwidth information */
+ ah->device.bt_wideband = false;
+ ah->call_wideband = false;
+
return audio_ret;
}
AUDIO_RETURN_VAL_IF_FAIL(option, AUDIO_ERR_PARAMETER);
AUDIO_LOG_INFO("role:%s, name:%s, value:%d", option->role, option->name, option->value);
- if (!strncmp("voice-recognition", option->role, MAX_NAME_LEN)) {
- if (!strncmp("bt-wideband", option->name, MAX_NAME_LEN)) {
- if (option->value > 0)
- ah->device.bt_wideband = 1;
- else
- ah->device.bt_wideband = 0;
- }
+ if (!strncmp("voice-recognition", option->role, MAX_NAME_LEN) ||
+ !strncmp("voice-information", option->role, MAX_NAME_LEN)) {
+ if (!strncmp("bt-wideband", option->name, MAX_NAME_LEN))
+ ah->device.bt_wideband = (option->value > 0) ? true : false;
+
+ } else if (!strncmp("call-voice", option->role, MAX_NAME_LEN)) {
+ if (!strncmp("bt-wideband", option->name, MAX_NAME_LEN))
+ ah->device.bt_wideband = (option->value > 0) ? true : false;
+ if (!strncmp("call-wideband", option->name, MAX_NAME_LEN))
+ ah->call_wideband = (option->value > 0) ? true : false;
}
return audio_ret;