Added Support multiple a2dp and avrctp connections.
Change-Id: I50d4ba897042648afc35a59d91e8e61c3b2ac91e
Signed-off-by: Avichal <avichal.a@samsung.com>
* This is RFCOMM default Channel Value
*/
#define RFCOMM_DEFAULT_PROFILE_CHANNEL 0
* This is RFCOMM default Channel Value
*/
#define RFCOMM_DEFAULT_PROFILE_CHANNEL 0
+#define BT_AUDIO_SOURCE_MAX 2
static char *avrcp_control_path = NULL;
static char *avrcp_transport_path = NULL;
static char *avrcp_control_path = NULL;
static char *avrcp_transport_path = NULL;
static GDBusProxy *adapter_properties_proxy;
static GDBusProxy *avrcp_ctrl_proxy;
static GDBusProxy *adapter_properties_proxy;
static GDBusProxy *avrcp_ctrl_proxy;
+struct avrcp_proxy {
+ GDBusProxy *avrcp_ctrl_proxy;
+ char *avrcp_control_path;
+ bt_bdaddr_t bd_addr;
+};
+
+struct avrcp_proxy proxy_array[BT_AUDIO_SOURCE_MAX];
+
static GDBusConnection *system_gconn = NULL;
static guint bus_id;
static GDBusConnection *system_gconn = NULL;
static guint bus_id;
void _bt_hal_set_control_device_path(const char *path)
{
void _bt_hal_set_control_device_path(const char *path)
{
if (path == NULL)
return;
if (path == NULL)
return;
- g_free(avrcp_control_path);
DBG("control_path = %s", path);
DBG("control_path = %s", path);
- avrcp_control_path = g_strdup(path);
+
+ for (i = 0; i < BT_AUDIO_SOURCE_MAX; i++) {
+ if (proxy_array[i].avrcp_control_path == NULL) {
+ proxy_array[i].avrcp_control_path = g_strdup(path);
+ DBG("PATH %s formed index %d", proxy_array[i].avrcp_control_path, i);
+ return;
+ }
+ }
}
void _bt_hal_remove_control_device_path(const char *path)
{
}
void _bt_hal_remove_control_device_path(const char *path)
{
if (path == NULL)
return;
if (path == NULL)
return;
- if (avrcp_control_path &&
- !g_strcmp0(avrcp_control_path, path)) {
- DBG("control_path = %s", path);
- g_free(avrcp_control_path);
- avrcp_control_path = NULL;
+ for (i = 0; i < BT_AUDIO_SOURCE_MAX; i++) {
+ if (g_strcmp0(proxy_array[i].avrcp_control_path, path) == 0) {
+ DBG("Clear AVRCP proxy[%d]", i);
+ g_free(proxy_array[i].avrcp_control_path);
+ g_object_unref(proxy_array[i].avrcp_ctrl_proxy);
+
+ proxy_array[i].avrcp_control_path = NULL;
+ proxy_array[i].avrcp_ctrl_proxy = NULL;
+ memset(proxy_array[i].bd_addr.address, 0, 6);
+ return;
+ }
{
GDBusProxy *manager_proxy;
GDBusProxy *proxy;
{
GDBusProxy *manager_proxy;
GDBusProxy *proxy;
- char *control_path = NULL;
+ GDBusConnection *gconn = NULL;
+ int i;
- if (system_conn == NULL) {
- system_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, NULL);
- if (system_conn == NULL)
- return NULL;
- }
+ gconn = _bt_hal_gdbus_get_system_gconn();
+ if (gconn == NULL)
+ return NULL;
manager_proxy = _bt_hal_get_manager_proxy();
if (manager_proxy == NULL)
return NULL;
manager_proxy = _bt_hal_get_manager_proxy();
if (manager_proxy == NULL)
return NULL;
- control_path = _bt_hal_get_control_device_path(bd_addr);
- if (control_path == NULL)
- return NULL;
+ for (i = 0; i < BT_AUDIO_SOURCE_MAX; i++) {
+ if (proxy_array[i].avrcp_ctrl_proxy == NULL) {
+ memcpy(proxy_array[i].bd_addr.address, bd_addr->address, 6);
+ DBG("PATH %s formed index %d ", proxy_array[i].avrcp_control_path, i);
+ break;
+ }
+ }
- proxy = g_dbus_proxy_new_sync(system_conn, G_DBUS_PROXY_FLAGS_NONE,
+ if (i == BT_AUDIO_SOURCE_MAX) {
+ ERR("NO free arr proxy space found");
+ return NULL;
+ }
+
+ proxy = g_dbus_proxy_new_sync(gconn, G_DBUS_PROXY_FLAGS_NONE,
- control_path, BT_HAL_PLAYER_CONTROL_INTERFACE, NULL, NULL);
+ proxy_array[i].avrcp_control_path, BT_HAL_PLAYER_CONTROL_INTERFACE, NULL, NULL);
if (proxy == NULL)
return NULL;
avrcp_ctrl_proxy = proxy;
if (proxy == NULL)
return NULL;
avrcp_ctrl_proxy = proxy;
+ proxy_array[i].avrcp_ctrl_proxy = proxy;
+
GDBusProxy *_bt_hal_get_avrcp_ctrl_proxy(bt_bdaddr_t *bd_addr)
{
GDBusProxy *_bt_hal_get_avrcp_ctrl_proxy(bt_bdaddr_t *bd_addr)
{
- if (avrcp_ctrl_proxy) {
- const char *path = g_dbus_proxy_get_object_path(avrcp_ctrl_proxy);
- if (path == NULL) {
- ERR("Already proxy released hence creating new proxy");
- return __bt_hal_init_avrcp_ctrl_proxy(bd_addr);
- }
- return avrcp_ctrl_proxy;
+ for (i = 0; i < BT_AUDIO_SOURCE_MAX; i++) {
+ if (proxy_array[i].avrcp_ctrl_proxy
+ && (!memcmp(proxy_array[i].bd_addr.address, bd_addr->address, 6))) {
+ char *path = g_dbus_proxy_get_object_path(proxy_array[i].avrcp_ctrl_proxy);
+
+ if (!path) {
+ proxy_array[i].avrcp_ctrl_proxy = NULL;
+ ERR("Already proxy released hence creating new proxy");
+ return __bt_hal_init_avrcp_ctrl_proxy(bd_addr);
+ }
+
+ DBG("address found path PATH %s", path);
+ return proxy_array[i].avrcp_ctrl_proxy;
+ }
- return __bt_hal_init_avrcp_ctrl_proxy(bd_addr);
+ DBG("address NOT found");
+
+ return __bt_hal_init_avrcp_ctrl_proxy(bd_addr);
}
GDBusProxy *_bt_hal_get_avrcp_ctrl_properties_proxy(bt_bdaddr_t *bd_addr)
}
GDBusProxy *_bt_hal_get_avrcp_ctrl_properties_proxy(bt_bdaddr_t *bd_addr)
static void __bt_handle_av_source_connected_state(bluetooth_device_address_t *address)
{
char addr[BT_ADDRESS_STRING_SIZE] = { 0 };
static void __bt_handle_av_source_connected_state(bluetooth_device_address_t *address)
{
char addr[BT_ADDRESS_STRING_SIZE] = { 0 };
- char connected_address[BT_ADDRESS_STRING_SIZE + 1];
- gboolean connected;
bt_headset_wait_t *wait_device = NULL;
bt_headset_wait_t *wait_device = NULL;
- bluetooth_device_address_t device_address;
bluetooth_device_address_t wait_device_address;
GVariant *param;
int result = BLUETOOTH_ERROR_NONE;
bluetooth_device_address_t wait_device_address;
GVariant *param;
int result = BLUETOOTH_ERROR_NONE;
param = g_variant_new("(is)", result, addr);
_bt_send_event(BT_HEADSET_EVENT, BLUETOOTH_EVENT_AV_SOURCE_CONNECTED, param);
param = g_variant_new("(is)", result, addr);
_bt_send_event(BT_HEADSET_EVENT, BLUETOOTH_EVENT_AV_SOURCE_CONNECTED, param);
- connected = _bt_is_headset_type_connected(BT_AUDIO_A2DP_SOURCE, connected_address);
- if (connected) {
- if (g_strcmp0(connected_address, addr) != 0) {
- _bt_convert_addr_string_to_type(
- device_address.addr,
- connected_address);
- _bt_audio_disconnect(BT_AUDIO_A2DP_SOURCE, &device_address);
- }
- }
/* Add data from the connected list */
_bt_add_headset_to_list(BT_AUDIO_A2DP_SOURCE, BT_STATE_CONNECTED, addr);
/* Add data from the connected list */
_bt_add_headset_to_list(BT_AUDIO_A2DP_SOURCE, BT_STATE_CONNECTED, addr);