2013-07-04 12:00:44

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: [PATCH BlueZ 1/2] audio/sink: Fix not notifying service about connection state

From: Luiz Augusto von Dentz <[email protected]>

btd_service_connecting_complete should be called whenever the service
is connected otherwise the service state will not be consistent.
---
profiles/audio/sink.c | 16 ++++------------
1 file changed, 4 insertions(+), 12 deletions(-)

diff --git a/profiles/audio/sink.c b/profiles/audio/sink.c
index 3969417..f55efe8 100644
--- a/profiles/audio/sink.c
+++ b/profiles/audio/sink.c
@@ -164,6 +164,7 @@ static void stream_state_changed(struct avdtp_stream *stream,
sink->cb_id = 0;
break;
case AVDTP_STATE_OPEN:
+ btd_service_connecting_complete(sink->service, 0);
sink_set_state(dev, SINK_STATE_CONNECTED);
break;
case AVDTP_STATE_STREAMING:
@@ -182,20 +183,14 @@ static void stream_state_changed(struct avdtp_stream *stream,
static gboolean stream_setup_retry(gpointer user_data)
{
struct sink *sink = user_data;
- int err;

sink->retry_id = 0;

- if (sink->stream_state >= AVDTP_STATE_OPEN) {
- DBG("Stream successfully created, after XCASE connect:connect");
- err = 0;
- } else {
+ if (sink->stream_state < AVDTP_STATE_OPEN) {
DBG("Stream setup failed, after XCASE connect:connect");
- err = -EIO;
+ btd_service_connecting_complete(sink->service, -EIO);
}

- btd_service_connecting_complete(sink->service, err);
-
if (sink->connect_id > 0) {
a2dp_cancel(sink->dev, sink->connect_id);
sink->connect_id = 0;
@@ -212,11 +207,8 @@ static void stream_setup_complete(struct avdtp *session, struct a2dp_sep *sep,

sink->connect_id = 0;

- if (stream) {
- DBG("Stream successfully created");
- btd_service_connecting_complete(sink->service, 0);
+ if (stream)
return;
- }

avdtp_unref(sink->session);
sink->session = NULL;
--
1.8.1.4



2013-07-05 10:20:22

by Johan Hedberg

[permalink] [raw]
Subject: Re: [PATCH BlueZ 1/2] audio/sink: Fix not notifying service about connection state

Hi Luiz,

On Thu, Jul 04, 2013, Luiz Augusto von Dentz wrote:
> btd_service_connecting_complete should be called whenever the service
> is connected otherwise the service state will not be consistent.
> ---
> profiles/audio/sink.c | 16 ++++------------
> 1 file changed, 4 insertions(+), 12 deletions(-)

Both patches have been applied. Thanks.

Johan

2013-07-04 12:19:55

by Mikel Astiz

[permalink] [raw]
Subject: Re: [PATCH BlueZ 1/2] audio/sink: Fix not notifying service about connection state

Hi Luiz,

On Thu, Jul 4, 2013 at 2:00 PM, Luiz Augusto von Dentz
<[email protected]> wrote:
> From: Luiz Augusto von Dentz <[email protected]>
>
> btd_service_connecting_complete should be called whenever the service
> is connected otherwise the service state will not be consistent.
> ---
> profiles/audio/sink.c | 16 ++++------------
> 1 file changed, 4 insertions(+), 12 deletions(-)
>
> diff --git a/profiles/audio/sink.c b/profiles/audio/sink.c
> index 3969417..f55efe8 100644
> --- a/profiles/audio/sink.c
> +++ b/profiles/audio/sink.c
> @@ -164,6 +164,7 @@ static void stream_state_changed(struct avdtp_stream *stream,
> sink->cb_id = 0;
> break;
> case AVDTP_STATE_OPEN:
> + btd_service_connecting_complete(sink->service, 0);

I guess it's impossible to enter AVDTP_STATE_STREAMING without being OPEN first?

If this is guaranteed, the patch looks good to me.

Cheers,
Mikel

> sink_set_state(dev, SINK_STATE_CONNECTED);
> break;
> case AVDTP_STATE_STREAMING:
> @@ -182,20 +183,14 @@ static void stream_state_changed(struct avdtp_stream *stream,
> static gboolean stream_setup_retry(gpointer user_data)
> {
> struct sink *sink = user_data;
> - int err;
>
> sink->retry_id = 0;
>
> - if (sink->stream_state >= AVDTP_STATE_OPEN) {
> - DBG("Stream successfully created, after XCASE connect:connect");
> - err = 0;
> - } else {
> + if (sink->stream_state < AVDTP_STATE_OPEN) {
> DBG("Stream setup failed, after XCASE connect:connect");
> - err = -EIO;
> + btd_service_connecting_complete(sink->service, -EIO);
> }
>
> - btd_service_connecting_complete(sink->service, err);
> -
> if (sink->connect_id > 0) {
> a2dp_cancel(sink->dev, sink->connect_id);
> sink->connect_id = 0;
> @@ -212,11 +207,8 @@ static void stream_setup_complete(struct avdtp *session, struct a2dp_sep *sep,
>
> sink->connect_id = 0;
>
> - if (stream) {
> - DBG("Stream successfully created");
> - btd_service_connecting_complete(sink->service, 0);
> + if (stream)
> return;
> - }
>
> avdtp_unref(sink->session);
> sink->session = NULL;
> --
> 1.8.1.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
> the body of a message to [email protected]
> More majordomo info at http://vger.kernel.org/majordomo-info.html

2013-07-04 12:00:45

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: [PATCH BlueZ 2/2] audio/source: Fix not notifying service about connection state

From: Luiz Augusto von Dentz <[email protected]>

btd_service_connecting_complete should be called whenever the service
is connected otherwise the service state will not be consistent.
---
profiles/audio/source.c | 16 ++++------------
1 file changed, 4 insertions(+), 12 deletions(-)

diff --git a/profiles/audio/source.c b/profiles/audio/source.c
index 226c372..73c3185 100644
--- a/profiles/audio/source.c
+++ b/profiles/audio/source.c
@@ -165,6 +165,7 @@ static void stream_state_changed(struct avdtp_stream *stream,
source->cb_id = 0;
break;
case AVDTP_STATE_OPEN:
+ btd_service_connecting_complete(source->service, 0);
source_set_state(dev, SOURCE_STATE_CONNECTED);
break;
case AVDTP_STATE_STREAMING:
@@ -183,20 +184,14 @@ static void stream_state_changed(struct avdtp_stream *stream,
static gboolean stream_setup_retry(gpointer user_data)
{
struct source *source = user_data;
- int err;

source->retry_id = 0;

- if (source->stream_state >= AVDTP_STATE_OPEN) {
- DBG("Stream successfully created, after XCASE connect:connect");
- err = 0;
- } else {
+ if (source->stream_state < AVDTP_STATE_OPEN) {
DBG("Stream setup failed, after XCASE connect:connect");
- err = -EIO;
+ btd_service_connecting_complete(source->service, -EIO);
}

- btd_service_connecting_complete(source->service, err);
-
if (source->connect_id > 0) {
a2dp_cancel(source->dev, source->connect_id);
source->connect_id = 0;
@@ -213,11 +208,8 @@ static void stream_setup_complete(struct avdtp *session, struct a2dp_sep *sep,

source->connect_id = 0;

- if (stream) {
- DBG("Stream successfully created");
- btd_service_connecting_complete(source->service, 0);
+ if (stream)
return;
- }

avdtp_unref(source->session);
source->session = NULL;
--
1.8.1.4