From 3dd85709ac74d37396607f267401a165c9efc361 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Thu, 20 Feb 2014 16:16:52 +0200 Subject: [PATCH] android/avrcp-lib: Add avrcp_set_passthrough_handlers This adds avrcp_set_passthrough_handlers which can be used to set pass-through PDU handlers table and user data. --- android/avrcp-lib.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ android/avrcp-lib.h | 8 ++++++++ 2 files changed, 52 insertions(+) diff --git a/android/avrcp-lib.c b/android/avrcp-lib.c index c5085160d..d46e3d3f6 100644 --- a/android/avrcp-lib.c +++ b/android/avrcp-lib.c @@ -98,6 +98,10 @@ struct avrcp { const struct avrcp_control_handler *control_handlers; void *control_data; unsigned int control_id; + + const struct avrcp_passthrough_handler *passthrough_handlers; + void *passthrough_data; + unsigned int passthrough_id; }; void avrcp_shutdown(struct avrcp *session) @@ -106,6 +110,9 @@ void avrcp_shutdown(struct avrcp *session) if (session->control_id > 0) avctp_unregister_pdu_handler(session->conn, session->control_id); + if (session->passthrough_id > 0) + avctp_unregister_passthrough_handler(session->conn, + session->passthrough_id); avctp_shutdown(session->conn); } @@ -168,6 +175,31 @@ reject: return AVRCP_HEADER_LENGTH + 1; } +static bool handle_passthrough_pdu(struct avctp *conn, uint8_t op, + bool pressed, void *user_data) +{ + struct avrcp *session = user_data; + const struct avrcp_passthrough_handler *handler; + + if (!session->passthrough_handlers) + return false; + + for (handler = session->passthrough_handlers; handler->func; + handler++) { + if (handler->op == op) + break; + } + + if (handler->func == NULL) + return false; + + /* Do not trigger handler on release */ + if (!pressed) + return true; + + return handler->func(session); +} + struct avrcp *avrcp_new(int fd, size_t imtu, size_t omtu, uint16_t version) { struct avrcp *session; @@ -180,6 +212,10 @@ struct avrcp *avrcp_new(int fd, size_t imtu, size_t omtu, uint16_t version) return NULL; } + session->passthrough_id = avctp_register_passthrough_handler( + session->conn, + handle_passthrough_pdu, + session); session->control_id = avctp_register_pdu_handler(session->conn, AVC_OP_VENDORDEP, handle_vendordep_pdu, @@ -202,6 +238,14 @@ void avrcp_set_control_handlers(struct avrcp *session, session->control_data = user_data; } +void avrcp_set_passthrough_handlers(struct avrcp *session, + const struct avrcp_passthrough_handler *handlers, + void *user_data) +{ + session->passthrough_handlers = handlers; + session->passthrough_data = user_data; +} + int avrcp_init_uinput(struct avrcp *session, const char *name, const char *address) { diff --git a/android/avrcp-lib.h b/android/avrcp-lib.h index 1a135cc5c..23374295c 100644 --- a/android/avrcp-lib.h +++ b/android/avrcp-lib.h @@ -55,6 +55,11 @@ struct avrcp_control_handler { uint16_t *params_len, uint8_t *params, void *user_data); }; +struct avrcp_passthrough_handler { + uint8_t op; + bool (*func) (struct avrcp *session); +}; + typedef void (*avrcp_destroy_cb_t) (void *user_data); struct avrcp *avrcp_new(int fd, size_t imtu, size_t omtu, uint16_t version); @@ -64,5 +69,8 @@ void avrcp_set_destroy_cb(struct avrcp *session, avrcp_destroy_cb_t cb, void avrcp_set_control_handlers(struct avrcp *session, const struct avrcp_control_handler *handlers, void *user_data); +void avrcp_set_passthrough_handlers(struct avrcp *session, + const struct avrcp_passthrough_handler *handlers, + void *user_data); int avrcp_init_uinput(struct avrcp *session, const char *name, const char *address); -- 2.47.3