2015-03-11 09:34:21

by Marcin Kraglak

[permalink] [raw]
Subject: [PATCH 1/2] audio/avrcp: Remove redundant check

There is no need to check if device has specific services,
it was checked in session_init_control.
---
profiles/audio/avrcp.c | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c
index b1552b1..a57756e 100644
--- a/profiles/audio/avrcp.c
+++ b/profiles/audio/avrcp.c
@@ -3394,8 +3394,7 @@ static void target_init(struct avrcp *session)
DBG("%p version 0x%04x", target, target->version);

service = btd_device_get_service(session->dev, AVRCP_REMOTE_UUID);
- if (service != NULL)
- btd_service_connecting_complete(service, 0);
+ btd_service_connecting_complete(service, 0);

player = g_slist_nth_data(server->players, 0);
if (player != NULL) {
@@ -3440,8 +3439,7 @@ static void controller_init(struct avrcp *session)
session->supported_events |= (1 << AVRCP_EVENT_VOLUME_CHANGED);

service = btd_device_get_service(session->dev, AVRCP_TARGET_UUID);
- if (service != NULL)
- btd_service_connecting_complete(service, 0);
+ btd_service_connecting_complete(service, 0);

/* Only create player if category 1 is supported */
if (!(controller->features & AVRCP_FEATURE_CATEGORY_1))
--
2.1.0



2015-03-13 12:10:34

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: Re: [PATCH 1/2] audio/avrcp: Remove redundant check

Hi Marcin,

On Wed, Mar 11, 2015 at 11:34 AM, Marcin Kraglak
<[email protected]> wrote:
> There is no need to check if device has specific services,
> it was checked in session_init_control.
> ---
> profiles/audio/avrcp.c | 6 ++----
> 1 file changed, 2 insertions(+), 4 deletions(-)
>
> diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c
> index b1552b1..a57756e 100644
> --- a/profiles/audio/avrcp.c
> +++ b/profiles/audio/avrcp.c
> @@ -3394,8 +3394,7 @@ static void target_init(struct avrcp *session)
> DBG("%p version 0x%04x", target, target->version);
>
> service = btd_device_get_service(session->dev, AVRCP_REMOTE_UUID);
> - if (service != NULL)
> - btd_service_connecting_complete(service, 0);
> + btd_service_connecting_complete(service, 0);
>
> player = g_slist_nth_data(server->players, 0);
> if (player != NULL) {
> @@ -3440,8 +3439,7 @@ static void controller_init(struct avrcp *session)
> session->supported_events |= (1 << AVRCP_EVENT_VOLUME_CHANGED);
>
> service = btd_device_get_service(session->dev, AVRCP_TARGET_UUID);
> - if (service != NULL)
> - btd_service_connecting_complete(service, 0);
> + btd_service_connecting_complete(service, 0);
>
> /* Only create player if category 1 is supported */
> if (!(controller->features & AVRCP_FEATURE_CATEGORY_1))
> --
> 2.1.0

Applied, thanks.


--
Luiz Augusto von Dentz

2015-03-11 09:34:22

by Marcin Kraglak

[permalink] [raw]
Subject: [PATCH 2/2] audio/avrcp: Always notify about disconnecting service

If there is a call to avrcp_connect, state of service is changed to
BTD_SERVICE_STATE_CONNECTING. If connection failed, state didn't change
to BTD_SERVICE_STATE_DISCONNECTED because controller_destroy() and
target_destroy() was not called. Set state of services in session_destroy()
instead.
---
profiles/audio/avrcp.c | 33 +++++++++++++++++----------------
1 file changed, 17 insertions(+), 16 deletions(-)

diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c
index a57756e..a67b81e 100644
--- a/profiles/audio/avrcp.c
+++ b/profiles/audio/avrcp.c
@@ -3486,19 +3486,11 @@ static void session_init_control(struct avrcp *session)
static void controller_destroy(struct avrcp *session)
{
struct avrcp_data *controller = session->controller;
- struct btd_service *service;

DBG("%p", controller);

g_slist_free_full(controller->players, player_destroy);

- service = btd_device_get_service(session->dev, AVRCP_TARGET_UUID);
-
- if (session->control_id == 0)
- btd_service_connecting_complete(service, -EIO);
- else
- btd_service_disconnecting_complete(service, 0);
-
g_free(controller);
}

@@ -3506,31 +3498,40 @@ static void target_destroy(struct avrcp *session)
{
struct avrcp_data *target = session->target;
struct avrcp_player *player = target->player;
- struct btd_service *service;

DBG("%p", target);

if (player != NULL)
player->sessions = g_slist_remove(player->sessions, session);

- service = btd_device_get_service(session->dev, AVRCP_REMOTE_UUID);
-
- if (session->control_id == 0)
- btd_service_connecting_complete(service, -EIO);
- else
- btd_service_disconnecting_complete(service, 0);
-
g_free(target);
}

static void session_destroy(struct avrcp *session)
{
struct avrcp_server *server = session->server;
+ struct btd_service *service;

server->sessions = g_slist_remove(server->sessions, session);

session_abort_pending_pdu(session);

+ service = btd_device_get_service(session->dev, AVRCP_TARGET_UUID);
+ if (service != NULL) {
+ if (session->control_id == 0)
+ btd_service_connecting_complete(service, -EIO);
+ else
+ btd_service_disconnecting_complete(service, 0);
+ }
+
+ service = btd_device_get_service(session->dev, AVRCP_REMOTE_UUID);
+ if (service != NULL) {
+ if (session->control_id == 0)
+ btd_service_connecting_complete(service, -EIO);
+ else
+ btd_service_disconnecting_complete(service, 0);
+ }
+
if (session->browsing_timer > 0)
g_source_remove(session->browsing_timer);

--
2.1.0