Re: [PATCH BlueZ 1/2] audio/avrcp: Use position changed event to resync

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

On Wed, May 6, 2015 at 5:08 PM, Luiz Augusto von Dentz
<luiz.dentz@xxxxxxxxx> wrote:
> From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx>
>
> Some player do not change state when backward is pressed only once,
> instead it will just start the track from the beginning.
>
> To fix this subscribe to playback position changed event since it is
> mandatory to be sent in the following conditions:
>
>  - TG has reached the registered playback Interval time.
>  - Changed PLAY STATUS.
>  - Changed Current Track.
>  - Reached end or beginning of track.
> ---
>  profiles/audio/avrcp.c | 23 +++++++++++++++++++++++
>  profiles/audio/avrcp.h |  1 +
>  2 files changed, 24 insertions(+)
>
> diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c
> index cc26eed..245b3fc 100644
> --- a/profiles/audio/avrcp.c
> +++ b/profiles/audio/avrcp.c
> @@ -3084,6 +3084,17 @@ static void avrcp_track_changed(struct avrcp *session,
>                 avrcp_get_element_attributes(session);
>  }
>
> +static void avrcp_playback_pos_changed(struct avrcp *session,
> +                                               struct avrcp_header *pdu)
> +{
> +       struct avrcp_player *player = session->controller->player;
> +       struct media_player *mp = player->user_data;
> +       uint32_t position;
> +
> +       position = get_be32(&pdu->params[1]);
> +       media_player_set_position(mp, position);
> +}
> +
>  static void avrcp_setting_changed(struct avrcp *session,
>                                                 struct avrcp_header *pdu)
>  {
> @@ -3177,6 +3188,9 @@ static gboolean avrcp_handle_event(struct avctp *conn,
>         case AVRCP_EVENT_TRACK_CHANGED:
>                 avrcp_track_changed(session, pdu);
>                 break;
> +       case AVRCP_EVENT_PLAYBACK_POS_CHANGED:
> +               avrcp_playback_pos_changed(session, pdu);
> +               break;
>         case AVRCP_EVENT_SETTINGS_CHANGED:
>                 avrcp_setting_changed(session, pdu);
>                 break;
> @@ -3208,6 +3222,14 @@ static void avrcp_register_notification(struct avrcp *session, uint8_t event)
>         pdu->pdu_id = AVRCP_REGISTER_NOTIFICATION;
>         pdu->packet_type = AVRCP_PACKET_TYPE_SINGLE;
>         pdu->params[0] = event;
> +
> +       /*
> +        * Set maximum interval possible for position changed as we only
> +        * use it to resync.
> +        */
> +       if (event == AVRCP_EVENT_PLAYBACK_POS_CHANGED)
> +               bt_put_be32(UINT32_MAX, &pdu->params[1]);
> +
>         pdu->params_len = htons(AVRCP_REGISTER_NOTIFICATION_PARAM_LENGTH);
>
>         length = AVRCP_HEADER_LENGTH + ntohs(pdu->params_len);
> @@ -3248,6 +3270,7 @@ static gboolean avrcp_get_capabilities_resp(struct avctp *conn,
>                 switch (event) {
>                 case AVRCP_EVENT_STATUS_CHANGED:
>                 case AVRCP_EVENT_TRACK_CHANGED:
> +               case AVRCP_EVENT_PLAYBACK_POS_CHANGED:
>                 case AVRCP_EVENT_SETTINGS_CHANGED:
>                 case AVRCP_EVENT_ADDRESSED_PLAYER_CHANGED:
>                 case AVRCP_EVENT_UIDS_CHANGED:
> diff --git a/profiles/audio/avrcp.h b/profiles/audio/avrcp.h
> index 6ac5294..a9aeb1a 100644
> --- a/profiles/audio/avrcp.h
> +++ b/profiles/audio/avrcp.h
> @@ -74,6 +74,7 @@
>  #define AVRCP_EVENT_TRACK_CHANGED              0x02
>  #define AVRCP_EVENT_TRACK_REACHED_END          0x03
>  #define AVRCP_EVENT_TRACK_REACHED_START                0x04
> +#define AVRCP_EVENT_PLAYBACK_POS_CHANGED       0x05
>  #define AVRCP_EVENT_SETTINGS_CHANGED           0x08
>  #define AVRCP_EVENT_AVAILABLE_PLAYERS_CHANGED  0x0a
>  #define AVRCP_EVENT_ADDRESSED_PLAYER_CHANGED   0x0b
> --
> 2.1.0

Applied,


-- 
Luiz Augusto von Dentz
--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux