summaryrefslogtreecommitdiff
path: root/net-wireless/bluez/files/bluez-5.51-disconnect-timeout.patch
blob: 2f6e7c8c4d957043a7ebf9883707f0ac623db9e8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
From 52faac4648500dd45c06b6aa41f1be426c43a125 Mon Sep 17 00:00:00 2001
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
Date: Fri, 11 Oct 2019 15:40:04 +0300
Subject: audio: Fix cancelling disconnect timeout

If AVDTP session has been connected but no stream has been setup calls
to service->connect would return -EBUSY to avoid stream setup collision
but it also takes a reference to the session cancelling the disconnect
timeout and disabling the stream_setup logic that would attempt to
estabilish a stream.
---
 profiles/audio/sink.c   | 25 ++++++++++++-------------
 profiles/audio/source.c | 25 ++++++++++++-------------
 2 files changed, 24 insertions(+), 26 deletions(-)

diff --git a/profiles/audio/sink.c b/profiles/audio/sink.c
index 7cac21034..966440534 100644
--- a/profiles/audio/sink.c
+++ b/profiles/audio/sink.c
@@ -256,11 +256,18 @@ gboolean sink_setup_stream(struct btd_service *service, struct avdtp *session)
 	if (sink->connect_id > 0 || sink->disconnect_id > 0)
 		return FALSE;
 
-	if (session && !sink->session)
-		sink->session = avdtp_ref(session);
-
-	if (!sink->session)
-		return FALSE;
+	if (!sink->session) {
+		if (session)
+			sink->session = avdtp_ref(session);
+		else
+			sink->session = a2dp_avdtp_get(
+					btd_service_get_device(service));
+
+		if (!sink->session) {
+			DBG("Unable to get a session");
+			return FALSE;
+		}
+	}
 
 	sink->connect_id = a2dp_discover(sink->session, discovery_complete,
 								sink);
@@ -274,14 +281,6 @@ int sink_connect(struct btd_service *service)
 {
 	struct sink *sink = btd_service_get_user_data(service);
 
-	if (!sink->session)
-		sink->session = a2dp_avdtp_get(btd_service_get_device(service));
-
-	if (!sink->session) {
-		DBG("Unable to get a session");
-		return -EIO;
-	}
-
 	if (sink->connect_id > 0 || sink->disconnect_id > 0)
 		return -EBUSY;
 
diff --git a/profiles/audio/source.c b/profiles/audio/source.c
index 4081e1970..0ac20fe40 100644
--- a/profiles/audio/source.c
+++ b/profiles/audio/source.c
@@ -257,11 +257,18 @@ gboolean source_setup_stream(struct btd_service *service,
 	if (source->connect_id > 0 || source->disconnect_id > 0)
 		return FALSE;
 
-	if (session && !source->session)
-		source->session = avdtp_ref(session);
-
-	if (!source->session)
-		return FALSE;
+	if (!source->session) {
+		if (session)
+			source->session = avdtp_ref(session);
+		else
+			source->session = a2dp_avdtp_get(
+					btd_service_get_device(service));
+
+		if (!source->session) {
+			DBG("Unable to get a session");
+			return FALSE;
+		}
+	}
 
 	source->connect_id = a2dp_discover(source->session, discovery_complete,
 								source);
@@ -275,14 +282,6 @@ int source_connect(struct btd_service *service)
 {
 	struct source *source = btd_service_get_user_data(service);
 
-	if (!source->session)
-		source->session = a2dp_avdtp_get(btd_service_get_device(service));
-
-	if (!source->session) {
-		DBG("Unable to get a session");
-		return -EIO;
-	}
-
 	if (source->connect_id > 0 || source->disconnect_id > 0)
 		return -EBUSY;
 
-- 
cgit 1.2-0.3.lf.el7