From 477ecca127c529611adbc53f08039cefaf86305d Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Tue, 26 Jun 2018 13:37:33 +0300 Subject: [PATCH] policy: Add logic to connect a Sink References: boo#1131772 Patch-mainline: 5.51 Git-commit: 477ecca127c529611adbc53f08039cefaf86305d If HFP/HSP HS connects and the device also supports a Sink connect it as well since some devices (e.g. Sony MW600) may not connect it automatically. Acked-by: Michal Suchanek --- plugins/policy.c | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/plugins/policy.c b/plugins/policy.c index 1f5a506a2c2f..de51e58b91dc 100644 --- a/plugins/policy.c +++ b/plugins/policy.c @@ -297,6 +297,42 @@ static void sink_cb(struct btd_service *service, btd_service_state_t old_state, } } +static void hs_cb(struct btd_service *service, btd_service_state_t old_state, + btd_service_state_t new_state) +{ + struct btd_device *dev = btd_service_get_device(service); + struct policy_data *data; + struct btd_service *sink; + + /* If the device supports Sink set a timer to connect it as well */ + sink = btd_device_get_service(dev, A2DP_SINK_UUID); + if (sink == NULL) + return; + + data = policy_get_data(dev); + + switch (new_state) { + case BTD_SERVICE_STATE_UNAVAILABLE: + break; + case BTD_SERVICE_STATE_DISCONNECTED: + break; + case BTD_SERVICE_STATE_CONNECTING: + break; + case BTD_SERVICE_STATE_CONNECTED: + /* Check if service initiate the connection then proceed + * immediately otherwise set timer + */ + if (old_state == BTD_SERVICE_STATE_CONNECTING) + policy_connect(data, sink); + else if (btd_service_get_state(sink) != + BTD_SERVICE_STATE_CONNECTED) + policy_set_sink_timer(data); + break; + case BTD_SERVICE_STATE_DISCONNECTING: + break; + } +} + static gboolean policy_connect_tg(gpointer user_data) { struct policy_data *data = user_data; @@ -615,6 +651,9 @@ static void service_cb(struct btd_service *service, controller_cb(service, old_state, new_state); else if (g_str_equal(profile->remote_uuid, AVRCP_TARGET_UUID)) target_cb(service, old_state, new_state); + else if (g_str_equal(profile->remote_uuid, HFP_HS_UUID) || + g_str_equal(profile->remote_uuid, HSP_HS_UUID)) + hs_cb(service, old_state, new_state); /* * Return if the reconnection feature is not enabled (all -- 2.20.1