A2DP profile multiple source support 59/196359/5
authorAvichal <avichal.a@samsung.com>
Thu, 27 Dec 2018 14:23:58 +0000 (19:53 +0530)
committerDoHyun Pyun <dh79.pyun@samsung.com>
Fri, 25 Jan 2019 06:10:22 +0000 (15:10 +0900)
Added Support multiple a2dp and avrctp connections.

Change-Id: I50d4ba897042648afc35a59d91e8e61c3b2ac91e
Signed-off-by: Avichal <avichal.a@samsung.com>
bt-oal/bluez_hal/src/bt-hal-dbus-common-utils.c
bt-service-adaptation/services/audio/a2dp_sink/bt-service-a2dp-sink.c

index 2fac142..248c6e8 100644 (file)
@@ -50,6 +50,7 @@
  * 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;
@@ -63,6 +64,14 @@ static GDBusProxy *profile_gproxy = NULL;
 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;
@@ -215,25 +224,40 @@ static GDBusProxy *__bt_hal_init_adapter_properties_proxy(void)
 
 void _bt_hal_set_control_device_path(const char *path)
 {
+       int i;
 
        if (path == NULL)
                return;
 
-       g_free(avrcp_control_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)
 {
+       int i;
+
        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;
+               }
        }
 }
 
@@ -405,30 +429,40 @@ static GDBusProxy *__bt_hal_init_avrcp_ctrl_proxy(bt_bdaddr_t *bd_addr)
 {
        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;
 
-       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,
                        NULL, BT_HAL_BLUEZ_NAME,
-                       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;
+       proxy_array[i].avrcp_ctrl_proxy = proxy;
+
        return proxy;
 }
 
@@ -482,17 +516,27 @@ GDBusProxy *_bt_hal_get_adapter_proxy(void)
 
 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);
-               }
+       int i;
 
-               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)
index 4c680a1..48d9434 100644 (file)
@@ -66,10 +66,8 @@ int _bt_a2dp_disconnect_remote_source(bluetooth_device_address_t *device_address
 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;
-       bluetooth_device_address_t device_address;
        bluetooth_device_address_t wait_device_address;
        GVariant *param;
        int result = BLUETOOTH_ERROR_NONE;
@@ -86,15 +84,6 @@ static void __bt_handle_av_source_connected_state(bluetooth_device_address_t *ad
        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);