--- audio/avrcp.c | 2 ++ audio/avrcp.h | 1 + audio/media.c | 18 ++++++++++++++++++ doc/media-api.txt | 6 +++++- 4 files changed, 26 insertions(+), 1 deletions(-) diff --git a/audio/avrcp.c b/audio/avrcp.c index 879e959..c9ec314 100644 --- a/audio/avrcp.c +++ b/audio/avrcp.c @@ -383,6 +383,7 @@ int avrcp_player_event(struct avrcp_player *player, uint8_t id, void *data) memcpy(&pdu->params[1], data, sizeof(uint64_t)); break; + case AVRCP_EVENT_TRACK_REACHED_END: case AVRCP_EVENT_TRACK_REACHED_START: size = 1; break; @@ -904,6 +905,7 @@ static uint8_t avrcp_handle_register_notification(struct avrcp_player *player, memcpy(&pdu->params[1], &uid, sizeof(uint64_t)); break; + case AVRCP_EVENT_TRACK_REACHED_END: case AVRCP_EVENT_TRACK_REACHED_START: len = 1; break; diff --git a/audio/avrcp.h b/audio/avrcp.h index c798658..fb64f3b 100644 --- a/audio/avrcp.h +++ b/audio/avrcp.h @@ -71,6 +71,7 @@ /* Notification events */ #define AVRCP_EVENT_STATUS_CHANGED 0x01 #define AVRCP_EVENT_TRACK_CHANGED 0x02 +#define AVRCP_EVENT_TRACK_REACHED_END 0x03 #define AVRCP_EVENT_TRACK_REACHED_START 0x04 #define AVRCP_EVENT_LAST AVRCP_EVENT_TRACK_REACHED_START diff --git a/audio/media.c b/audio/media.c index 5528ada..dd8ed6b 100644 --- a/audio/media.c +++ b/audio/media.c @@ -1280,6 +1280,7 @@ static gboolean set_status(struct media_player *mp, DBusMessageIter *iter) static gboolean set_position(struct media_player *mp, DBusMessageIter *iter) { uint32_t value; + struct metadata_value *duration; if (dbus_message_iter_get_arg_type(iter) != DBUS_TYPE_UINT32) return FALSE; @@ -1293,6 +1294,23 @@ static gboolean set_position(struct media_player *mp, DBusMessageIter *iter) if (!mp->position) { avrcp_player_event(mp->player, AVRCP_EVENT_TRACK_REACHED_START, NULL); + return TRUE; + } + + duration = g_hash_table_lookup(mp->track, GUINT_TO_POINTER( + AVRCP_MEDIA_ATTRIBUTE_DURATION)); + + /* + * If either there's no duration available in metadata and the user + * set 'position' to the maximum value allowed or the position matches + * the duration, send a track-reached-end event. + */ + if (duration == NULL && mp->position == UINT32_MAX) { + avrcp_player_event(mp->player, AVRCP_EVENT_TRACK_REACHED_END, + NULL); + } else if (duration != NULL && mp->position == duration->value.num) { + avrcp_player_event(mp->player, AVRCP_EVENT_TRACK_REACHED_END, + NULL); } return TRUE; diff --git a/doc/media-api.txt b/doc/media-api.txt index c748e50..01eb11a 100644 --- a/doc/media-api.txt +++ b/doc/media-api.txt @@ -84,7 +84,11 @@ Methods void RegisterEndpoint(object endpoint, dict properties) uint32 Position - Playback position in milliseconds + Playback position in milliseconds. + "Track reached start" and "track + reached end" event will be sent once 0 + or track's duration are set + respectively. Metadata: -- 1.7.7.1 -- 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