From 8731902f621f1ce8218514ec258ff7e50c530fb1 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Wed, 2 Apr 2014 11:27:44 +0300 Subject: [PATCH] android/avrcp: Add avrcp_change_path() function --- android/avrcp-lib.c | 51 +++++++++++++++++++++++++++++++++++++++++++++ android/avrcp-lib.h | 4 ++++ 2 files changed, 55 insertions(+) diff --git a/android/avrcp-lib.c b/android/avrcp-lib.c index bfe5d4415..afac845af 100644 --- a/android/avrcp-lib.c +++ b/android/avrcp-lib.c @@ -1716,6 +1716,57 @@ int avrcp_get_folder_items(struct avrcp *session, uint8_t scope, get_folder_items_rsp, session); } +static gboolean change_path_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; + uint32_t items = 0; + int err; + + DBG(""); + + if (!player || !player->cfm || !player->cfm->change_path) + 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; + } + + items = get_be32(&pdu->params[1]); + +done: + player->cfm->change_path(session, err, items, player->user_data); + + return FALSE; +} + +int avrcp_change_path(struct avrcp *session, uint8_t direction, uint64_t uid, + uint16_t counter) +{ + uint8_t pdu[11]; + + put_be16(counter, &pdu[0]); + pdu[2] = direction; + put_be64(uid, &pdu[3]); + + return avrcp_send_browsing_req(session, AVRCP_CHANGE_PATH, + pdu, sizeof(pdu), + change_path_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 894310876..460ce8a08 100644 --- a/android/avrcp-lib.h +++ b/android/avrcp-lib.h @@ -208,6 +208,8 @@ struct avrcp_control_cfm { void (*get_folder_items) (struct avrcp *session, int err, uint16_t counter, uint16_t number, uint8_t *params, void *user_data); + void (*change_path) (struct avrcp *session, int err, + uint32_t items, void *user_data); }; struct avrcp_passthrough_handler { @@ -258,6 +260,8 @@ 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_change_path(struct avrcp *session, uint8_t direction, uint64_t uid, + uint16_t counter); int avrcp_get_capabilities_rsp(struct avrcp *session, uint8_t transaction, uint8_t number, uint8_t *events); -- 2.47.3