From fb079ff5fdfc24f94c2e9621431dc58223c9fe8e Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Sat, 1 Mar 2014 17:30:34 +0200 Subject: [PATCH] android/avrcp: Add handler for GetCapabilities command --- android/avrcp-lib.h | 1 + android/avrcp.c | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/android/avrcp-lib.h b/android/avrcp-lib.h index 37b3d2e43..58d489ed2 100644 --- a/android/avrcp-lib.h +++ b/android/avrcp-lib.h @@ -51,6 +51,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 diff --git a/android/avrcp.c b/android/avrcp.c index 0db2b43c9..14b223b2d 100644 --- a/android/avrcp.c +++ b/android/avrcp.c @@ -26,6 +26,7 @@ #endif #include +#include #include #include "btio/btio.h" @@ -339,6 +340,43 @@ static const struct avrcp_passthrough_handler passthrough_handlers[] = { { }, }; +static ssize_t handle_get_capabilities_cmd(struct avrcp *session, + uint8_t transaction, + uint16_t params_len, + uint8_t *params, + void *user_data) +{ + DBG(""); + + if (params_len != 1) + return -EINVAL; + + switch (params[0]) { + case CAP_COMPANY_ID: + params[params_len++] = 1; + hton24(¶ms[params_len], IEEEID_BTSIG); + return params_len + 3; + case CAP_EVENTS_SUPPORTED: + /* Android do not provide this info via HAL so the list most + * be hardcoded according to what RegisterNotification can + * actually handle */ + params[params_len++] = 3; + params[params_len++] = AVRCP_EVENT_STATUS_CHANGED; + params[params_len++] = AVRCP_EVENT_TRACK_CHANGED; + params[params_len++] = AVRCP_EVENT_PLAYBACK_POS_CHANGED; + return params_len; + } + + return -EINVAL; +} + +static const struct avrcp_control_handler control_handlers[] = { + { AVRCP_GET_CAPABILITIES, + AVC_CTYPE_STATUS, AVC_CTYPE_STABLE, + handle_get_capabilities_cmd }, + { }, +}; + static void connect_cb(GIOChannel *chan, GError *err, gpointer user_data) { struct avrcp_device *dev; @@ -390,6 +428,7 @@ static void connect_cb(GIOChannel *chan, GError *err, gpointer user_data) avrcp_set_destroy_cb(dev->session, disconnect_cb, dev); avrcp_set_passthrough_handlers(dev->session, passthrough_handlers, dev); + avrcp_set_control_handlers(dev->session, control_handlers, dev); /* FIXME: get the real name of the device */ avrcp_init_uinput(dev->session, "bluetooth", address); -- 2.47.3