From 36d6b226c7172d7d1faa503bc5f99ffef9911803 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Wed, 2 Apr 2014 11:27:31 +0300 Subject: [PATCH] android/avrcp: Add avrcp_get_folder_items() function --- android/avrcp-lib.c | 61 +++++++++++++++++++++++++++++++++++++++++++++ android/avrcp-lib.h | 12 +++++++++ 2 files changed, 73 insertions(+) diff --git a/android/avrcp-lib.c b/android/avrcp-lib.c index 1d11ea424..bfe5d4415 100644 --- a/android/avrcp-lib.c +++ b/android/avrcp-lib.c @@ -1655,6 +1655,67 @@ int avrcp_set_browsed_player(struct avrcp *session, uint16_t player_id) session); } +static gboolean get_folder_items_rsp(struct avctp *conn, + uint8_t *operands, size_t operand_count, + void *user_data) +{ + struct avrcp *session = user_data; + struct avrcp_player *player = session->player; + struct avrcp_browsing_header *pdu; + uint16_t counter = 0, number = 0; + int err; + + DBG(""); + + if (!player || !player->cfm || !player->cfm->get_folder_items) + return FALSE; + + pdu = parse_browsing_pdu(operands, operand_count); + if (!pdu) { + err = -EPROTO; + goto done; + } + + err = parse_browsing_status(pdu); + if (err < 0) + goto done; + + if (pdu->params_len < 5) { + err = -EPROTO; + goto done; + } + + counter = get_be16(&pdu->params[1]); + number = get_be16(&pdu->params[3]); + + /* FIXME: Add proper parsing for each item type */ + +done: + player->cfm->get_folder_items(session, err, counter, number, + &pdu->params[5], player->user_data); + + return FALSE; +} + +int avrcp_get_folder_items(struct avrcp *session, uint8_t scope, + uint32_t start, uint32_t end, uint8_t number, + uint32_t *attrs) +{ + + uint8_t pdu[10 + number * sizeof(uint32_t)]; + + pdu[0] = scope; + bt_put_be32(start, &pdu[1]); + bt_put_be32(end, &pdu[5]); + pdu[9] = number; + + memcpy(&pdu[10], attrs, number); + + return avrcp_send_browsing_req(session, AVRCP_GET_FOLDER_ITEMS, + pdu, sizeof(pdu), + get_folder_items_rsp, session); +} + int avrcp_get_capabilities_rsp(struct avrcp *session, uint8_t transaction, uint8_t number, uint8_t *events) { diff --git a/android/avrcp-lib.h b/android/avrcp-lib.h index eaa03f1b3..894310876 100644 --- a/android/avrcp-lib.h +++ b/android/avrcp-lib.h @@ -115,6 +115,12 @@ #define AVRCP_MEDIA_ATTRIBUTE_DURATION 0x07 #define AVRCP_MEDIA_ATTRIBUTE_LAST AVRCP_MEDIA_ATTRIBUTE_DURATION +/* Media Scope */ +#define AVRCP_MEDIA_PLAYER_LIST 0x00 +#define AVRCP_MEDIA_PLAYER_VFS 0x01 +#define AVRCP_MEDIA_SEARCH 0x02 +#define AVRCP_MEDIA_NOW_PLAYING 0x03 + /* Company IDs for vendor dependent commands */ #define IEEEID_BTSIG 0x001958 @@ -199,6 +205,9 @@ struct avrcp_control_cfm { void (*set_browsed) (struct avrcp *session, int err, uint16_t counter, uint32_t items, char *path, void *user_data); + void (*get_folder_items) (struct avrcp *session, int err, + uint16_t counter, uint16_t number, + uint8_t *params, void *user_data); }; struct avrcp_passthrough_handler { @@ -246,6 +255,9 @@ int avrcp_set_volume(struct avrcp *session, uint8_t volume, avctp_rsp_cb func, int avrcp_get_element_attributes(struct avrcp *session); int avrcp_set_addressed_player(struct avrcp *session, uint16_t player_id); int avrcp_set_browsed_player(struct avrcp *session, uint16_t player_id); +int avrcp_get_folder_items(struct avrcp *session, uint8_t scope, + uint32_t start, uint32_t end, uint8_t number, + uint32_t *attrs); int avrcp_get_capabilities_rsp(struct avrcp *session, uint8_t transaction, uint8_t number, uint8_t *events); -- 2.47.3