.delayreport = endpoint_delayreport_ind,
};
-#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
-static sdp_record_t *a2dp_record(uint8_t type, gboolean sink_enabled)
-#else
static sdp_record_t *a2dp_record(uint8_t type)
-#endif
{
sdp_list_t *svclass_id, *pfseq, *apseq, *root;
uuid_t root_uuid, l2cap_uuid, avdtp_uuid, a2dp_uuid;
uint16_t lp = AVDTP_UUID;
#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
uint16_t a2dp_ver, avdtp_ver, feat;
- if (sink_enabled) {
+ if (type == AVDTP_SEP_TYPE_SINK) {
DBG("A2DP record for Sink role");
a2dp_ver = 0x0102;
avdtp_ver = 0x0103;
mode = btd_opts.avdtp.session_mode;
-#if defined(TIZEN_FEATURE_BLUEZ_MODIFY)
- if (btd_adapter_get_a2dp_role(server->adapter) == BLUETOOTH_A2DP_SINK_ROLE) {
- server->io = bt_io_listen(NULL, confirm_cb, server, NULL, &err,
- BT_IO_OPT_SOURCE_BDADDR,
- btd_adapter_get_address(server->adapter),
- BT_IO_OPT_PSM, AVDTP_PSM,
- BT_IO_OPT_MODE, mode,
- BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
- BT_IO_OPT_IMTU, 895,
- BT_IO_OPT_CENTRAL, true,
- BT_IO_OPT_INVALID);
- } else {
- server->io = bt_io_listen(NULL, confirm_cb, server, NULL, &err,
- BT_IO_OPT_SOURCE_BDADDR,
- btd_adapter_get_address(server->adapter),
- BT_IO_OPT_PSM, AVDTP_PSM,
- BT_IO_OPT_MODE, mode,
- BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
- BT_IO_OPT_CENTRAL, true,
- BT_IO_OPT_INVALID);
- }
-#else
server->io = bt_io_listen(NULL, confirm_cb, server, NULL, &err,
BT_IO_OPT_SOURCE_BDADDR,
btd_adapter_get_address(server->adapter),
BT_IO_OPT_PSM, AVDTP_PSM,
BT_IO_OPT_MODE, mode,
BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
+#if defined(TIZEN_FEATURE_BLUEZ_MODIFY) /* for A2DP SINK connection */
+ BT_IO_OPT_IMTU, 895,
+#endif
BT_IO_OPT_CENTRAL, true,
BT_IO_OPT_INVALID);
-#endif
if (server->io)
return true;
if (*record_id != 0)
goto add;
-#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
- if (btd_adapter_get_a2dp_role(adapter) == BLUETOOTH_A2DP_SINK_ROLE)
- record = a2dp_record(type, true);
- else
- record = a2dp_record(type, false);
-#else
record = a2dp_record(type);
-#endif
if (!record) {
error("Unable to allocate new service record");
a2dp_unregister_sep(sep);
GError *err = NULL;
GIOChannel *io;
const bdaddr_t *src;
-#if defined TIZEN_FEATURE_BLUEZ_MODIFY
- struct btd_adapter *adapter;
- adapter = avdtp_get_adapter(session);
-#endif
src = btd_adapter_get_address(device_get_adapter(session->device));
-#if defined TIZEN_FEATURE_BLUEZ_MODIFY
- if (btd_adapter_get_a2dp_role(adapter) == BLUETOOTH_A2DP_SINK_ROLE) {
- io = bt_io_connect(avdtp_connect_cb, session,
- NULL, &err,
- BT_IO_OPT_SOURCE_BDADDR, src,
- BT_IO_OPT_DEST_BDADDR,
- device_get_address(session->device),
- BT_IO_OPT_PSM, AVDTP_PSM,
- BT_IO_OPT_MODE, mode,
- BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
- BT_IO_OPT_IMTU, 895,
- BT_IO_OPT_INVALID);
- }
- else {
- io = bt_io_connect(avdtp_connect_cb, session,
- NULL, &err,
- BT_IO_OPT_SOURCE_BDADDR, src,
- BT_IO_OPT_DEST_BDADDR,
- device_get_address(session->device),
- BT_IO_OPT_PSM, AVDTP_PSM,
- BT_IO_OPT_MODE, mode,
- BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
- BT_IO_OPT_INVALID);
- }
-#else
if (session->phy)
io = bt_io_connect(avdtp_connect_cb, session,
NULL, &err,
BT_IO_OPT_PSM, AVDTP_PSM,
BT_IO_OPT_MODE, mode,
BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_MEDIUM,
- BT_IO_OPT_INVALID);
+#if defined TIZEN_FEATURE_BLUEZ_MODIFY /* for A2DP SINK connection */
+ BT_IO_OPT_IMTU, 895,
#endif
-
+ BT_IO_OPT_INVALID);
if (!io) {
error("%s", err->message);
g_error_free(err);
#define SINK_SUSPEND_TIMEOUT 4 /* 4 seconds */
unsigned int suspend_timer_id = 0;
-static gboolean a2dp_sink_support = false;
-static gboolean a2dp_source_support = true;
#endif
struct media_app {
#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
if (strcasecmp(uuid, A2DP_SOURCE_UUID) == 0) {
source_endpoint = endpoint;
- if (btd_adapter_get_a2dp_role(adapter->btd_adapter) == BLUETOOTH_A2DP_SINK_ROLE)
- return endpoint;
- else
+ if (btd_adapter_get_a2dp_role(adapter->btd_adapter) & BLUETOOTH_A2DP_SOURCE_ROLE)
succeeded = endpoint_init_a2dp_source(endpoint, err);
+ else
+ return endpoint;
} else if (strcasecmp(uuid, A2DP_SINK_UUID) == 0) {
sink_endpoint = endpoint;
- if (btd_adapter_get_a2dp_role(adapter->btd_adapter) == BLUETOOTH_A2DP_SOURCE_ROLE)
- return endpoint;
- else
+ if (btd_adapter_get_a2dp_role(adapter->btd_adapter) & BLUETOOTH_A2DP_SINK_ROLE)
succeeded = endpoint_init_a2dp_sink(endpoint, err);
+ else
+ return endpoint;
} else if (strcasecmp(uuid, HFP_AG_UUID) == 0 ||
strcasecmp(uuid, HSP_AG_UUID) == 0)
succeeded = TRUE;
return btd_error_invalid_args(msg);
if (!g_strcmp0(a2dp_role, A2DP_SINK_ROLE)) {
- if (btd_adapter_get_a2dp_role(adapter->btd_adapter) == BLUETOOTH_A2DP_SINK_ROLE) {
+ if (btd_adapter_get_a2dp_role(adapter->btd_adapter) & BLUETOOTH_A2DP_SINK_ROLE) {
DBG("Already selected A2DP sink role");
return btd_error_already_exists(msg);
}
source_endpoint->sep = NULL;
} else if (!g_strcmp0(a2dp_role, A2DP_SOURCE_ROLE)) {
- if (btd_adapter_get_a2dp_role(adapter->btd_adapter) == BLUETOOTH_A2DP_SOURCE_ROLE) {
+ if (btd_adapter_get_a2dp_role(adapter->btd_adapter) & BLUETOOTH_A2DP_SOURCE_ROLE) {
DBG("Already selected A2DP source role");
return btd_error_already_exists(msg);
}
uint8_t *capabilities = NULL;
int size = 0;
int err;
-#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
- if (btd_adapter_get_a2dp_role(adapter->btd_adapter) == BLUETOOTH_A2DP_SINK_ROLE) {
- a2dp_sink_support = true;
- a2dp_source_support = false;
- } else {
- a2dp_sink_support = false;
- a2dp_source_support = true;
- }
-#endif
+
sender = dbus_message_get_sender(msg);
dbus_message_iter_init(msg, &args);
/* Store A2DP Role */
if (adapter->a2dp_role == BLUETOOTH_A2DP_SINK_ROLE)
g_key_file_set_string(key_file, "General", "DefaultA2DPRole", "sink");
- else
+ else if (adapter->a2dp_role == BLUETOOTH_A2DP_BOTH_ROLE)
+ g_key_file_set_string(key_file, "General", "DefaultA2DPRole", "both");
+ else /* source */
g_key_file_set_string(key_file, "General", "DefaultA2DPRole", "source");
#endif
} else if (role == BLUETOOTH_A2DP_SINK_ROLE) {
DBG("Set audio sink role");
adapter->a2dp_role = BLUETOOTH_A2DP_SINK_ROLE;
+#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
+ } else if (role == BLUETOOTH_A2DP_BOTH_ROLE) {
+ DBG("Set audio both role");
+ adapter->a2dp_role = BLUETOOTH_A2DP_BOTH_ROLE;
+#endif
}
store_adapter_info(adapter);
/* Get A2DP Role */
str = g_key_file_get_string(key_file, "General", "DefaultA2DPRole", &gerr);
if (gerr || !str) {
- if (btd_opts.default_a2dp_role_sink) {
- DBG("Default A2DP role is sink");
- adapter->a2dp_role = BLUETOOTH_A2DP_SINK_ROLE;
+ if (btd_opts.default_a2dp_role) {
+ DBG("Default A2DP role is %s", btd_opts.default_a2dp_role);
+ if (g_strcmp0(btd_opts.default_a2dp_role, "sink") == 0) {
+ adapter->a2dp_role = BLUETOOTH_A2DP_SINK_ROLE;
+ } else if (g_strcmp0(btd_opts.default_a2dp_role, "both") == 0) {
+ adapter->a2dp_role = BLUETOOTH_A2DP_BOTH_ROLE;
+ } else { /* source */
+ adapter->a2dp_role = BLUETOOTH_A2DP_SOURCE_ROLE;
+ }
} else {
adapter->a2dp_role = BLUETOOTH_A2DP_SOURCE_ROLE;
}
} else {
if (g_strcmp0(str, "sink") == 0)
adapter->a2dp_role = BLUETOOTH_A2DP_SINK_ROLE;
- else if (g_strcmp0(str, "source") == 0)
+ else if (g_strcmp0(str, "both") == 0)
+ adapter->a2dp_role = BLUETOOTH_A2DP_BOTH_ROLE;
+ else /* source */
adapter->a2dp_role = BLUETOOTH_A2DP_SOURCE_ROLE;
g_free(str);
}
device_set_bonded(device, BDADDR_BREDR);
#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
} else {
- if (btd_adapter_get_a2dp_role(adapter) == BLUETOOTH_A2DP_SINK_ROLE) {
+ if (btd_adapter_get_a2dp_role(adapter) & BLUETOOTH_A2DP_SINK_ROLE) {
DBG("store_hint %d", ev->store_hint);
btd_device_set_temporary(device, false);
}
- }
-#else
- }
#endif
+ }
bonding_complete(adapter, &addr->bdaddr, addr->type, 0);
}
struct queue;
#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
typedef enum {
- BLUETOOTH_A2DP_SOURCE_ROLE = 0,
+ BLUETOOTH_A2DP_SOURCE_ROLE = 1,
BLUETOOTH_A2DP_SINK_ROLE,
+ BLUETOOTH_A2DP_BOTH_ROLE, /* SINK_ROLE | SOURCE_ROLE */
} bluetooth_a2dp_role_t;
#endif
#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
gboolean le_privacy;
char *pin_code;
- gboolean default_a2dp_role_sink;
+ char *default_a2dp_role;
#endif
uint16_t did_source;
#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
"EnableLEPrivacy",
"PinCode",
- "DefaultA2DPRoleSink",
+ "DefaultA2DPRole",
#endif
NULL
};
g_free(str);
}
- boolean = g_key_file_get_boolean(config, "General", "DefaultA2DPRoleSink", &err);
+ str = g_key_file_get_string(config, "General", "DefaultA2DPRole", &err);
if (err) {
DBG("%s", err->message);
g_clear_error(&err);
} else {
- DBG("DefaultA2DPRoleSink=%s", boolean ? "true" : "false");
- btd_opts.default_a2dp_role_sink = boolean;
+ DBG("DefaultA2DPRole=%s", str);
+ btd_opts.default_a2dp_role = g_strdup(str);
+ g_free(str);
}
#endif
str = g_key_file_get_string(config, "GATT", "Cache", &err);
#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
btd_opts.le_privacy = FALSE;
btd_opts.pin_code = NULL;
- btd_opts.default_a2dp_role_sink = false;
+ btd_opts.default_a2dp_role = NULL;
#endif
if (sscanf(VERSION, "%hhu.%hhu", &major, &minor) != 2)
queue_destroy(btd_opts.kernel, free);
#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
g_free(btd_opts.pin_code);
+ g_free(btd_opts.default_a2dp_role);
#endif
if (main_conf)
EnableLEPrivacy = false
#endif
-#ifdef TIZEN_APPLIANCE
-# Default A2DP role is sink in Fhub.
-DefaultA2DPRoleSink = true
-#endif
-
# How long to keep temporary devices around
# The value is in seconds. Default is 30.
# 0 = disable timer, i.e. never keep temporary devices
#TemporaryTimeout = 30
#endif
+#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
+DefaultA2DPRole = both
+#endif
+
#ifdef TIZEN_APPLIANCE
[GATT]
# GATT attribute cache.
#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
# Default A2DP role is sink in headless device.
-DefaultA2DPRoleSink = true
+DefaultA2DPRole = sink
#endif
[GATT]
#PinCode = 0000
#endif
-#ifdef TIZEN_FEATURE_BLUEZ_MODIFY
-# Default A2DP role is sink in headless device.
-DefaultA2DPRoleSink = false
-#endif
-
[GATT]
# GATT attribute cache.
# Possible values: