diff options
author | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2014-03-16 19:39:46 +0200 |
---|---|---|
committer | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2014-03-18 10:54:31 +0200 |
commit | 524fceb7f7a635ad1e720e4000a09fce4e484d11 (patch) | |
tree | 5a5fc166003f127918802cee64a8a67fc992a57f /android/avrcp.c | |
parent | de498da768bdf9ffd7621a704eecf3dc3442ea27 (diff) | |
download | bluez-524fceb7f7a635ad1e720e4000a09fce4e484d11.tar.gz |
android/avrcp: Switch to use avrcp_register_player
This makes android daemon to start using avrcp_register_player instead
of now deprecated avrcp_set_control_handlers.
Diffstat (limited to 'android/avrcp.c')
-rw-r--r-- | android/avrcp.c | 113 |
1 files changed, 34 insertions, 79 deletions
diff --git a/android/avrcp.c b/android/avrcp.c index f0a6d5983..437164e07 100644 --- a/android/avrcp.c +++ b/android/avrcp.c @@ -599,34 +599,22 @@ 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) +static int handle_get_capabilities_cmd(struct avrcp *session, + uint8_t transaction, void *user_data) { - DBG(""); + uint8_t events[] = { AVRCP_EVENT_STATUS_CHANGED, + AVRCP_EVENT_TRACK_CHANGED, + AVRCP_EVENT_PLAYBACK_POS_CHANGED }; - if (params_len != 1) - return -EINVAL; + DBG(""); - 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; - } + /* Android do not provide this info via HAL so the list most + * be hardcoded according to what RegisterNotification can + * actually handle */ + avrcp_get_capabilities_rsp(session, transaction, sizeof(events), + events); - return -EINVAL; + return -EAGAIN; } static void push_request(struct avrcp_device *dev, uint8_t pdu_id, @@ -643,19 +631,13 @@ static void push_request(struct avrcp_device *dev, uint8_t pdu_id, g_queue_push_tail(dev->queue, req); } -static ssize_t handle_get_play_status_cmd(struct avrcp *session, - uint8_t transaction, - uint16_t params_len, - uint8_t *params, - void *user_data) +static int handle_get_play_status_cmd(struct avrcp *session, + uint8_t transaction, void *user_data) { struct avrcp_device *dev = user_data; DBG(""); - if (params_len != 0) - return -EINVAL; - ipc_send_notif(hal_ipc, HAL_SERVICE_ID_AVRCP, HAL_EV_AVRCP_GET_PLAY_STATUS, 0, NULL); @@ -664,11 +646,10 @@ static ssize_t handle_get_play_status_cmd(struct avrcp *session, return -EAGAIN; } -static ssize_t handle_get_element_attrs_cmd(struct avrcp *session, - uint8_t transaction, - uint16_t params_len, - uint8_t *params, - void *user_data) +static int handle_get_element_attrs_cmd(struct avrcp *session, + uint8_t transaction, uint64_t uid, + uint8_t number, uint32_t *attrs, + void *user_data) { struct avrcp_device *dev = user_data; uint8_t buf[IPC_MTU]; @@ -677,16 +658,7 @@ static ssize_t handle_get_element_attrs_cmd(struct avrcp *session, DBG(""); - if (params_len < 9) - return -EINVAL; - - ev->number = params[8]; - - if (params_len < ev->number * sizeof(uint32_t) + 1) - return -EINVAL; - - params += 9; - + ev->number = number; /* Set everything in case of empty list */ if (ev->number == 0) { for (i = 0; i < HAL_AVRCP_MEDIA_ATTR_DURATION; i++) { @@ -697,10 +669,8 @@ static ssize_t handle_get_element_attrs_cmd(struct avrcp *session, goto done; } - for (i = 0; i < ev->number; i++) { - ev->attrs[i] = bt_get_be32(params); - params += 4; - } + for (i = 0; i < number; i++) + ev->attrs[i] = attrs[i]; done: ipc_send_notif(hal_ipc, HAL_SERVICE_ID_AVRCP, @@ -713,25 +683,19 @@ done: } -static ssize_t handle_register_notification_cmd(struct avrcp *session, +static int handle_register_notification_cmd(struct avrcp *session, uint8_t transaction, - uint16_t params_len, - uint8_t *params, + uint8_t event, + uint32_t interval, void *user_data) { struct avrcp_device *dev = user_data; struct hal_ev_avrcp_register_notification ev; - uint8_t event_id; DBG(""); - if (params_len != 5) - return -EINVAL; - - event_id = params[0]; - /* TODO: Add any missing events supported by Android */ - switch (event_id) { + switch (event) { case AVRCP_EVENT_STATUS_CHANGED: case AVRCP_EVENT_TRACK_CHANGED: case AVRCP_EVENT_PLAYBACK_POS_CHANGED: @@ -740,32 +704,23 @@ static ssize_t handle_register_notification_cmd(struct avrcp *session, return -EINVAL; } - ev.event = event_id; - ev.param = bt_get_be32(¶ms[1]); + ev.event = event; + ev.param = interval; ipc_send_notif(hal_ipc, HAL_SERVICE_ID_AVRCP, HAL_EV_AVRCP_REGISTER_NOTIFICATION, sizeof(ev), &ev); - push_request(dev, AVRCP_REGISTER_NOTIFICATION, event_id, transaction); + push_request(dev, AVRCP_REGISTER_NOTIFICATION, event, transaction); return -EAGAIN; } -static const struct avrcp_control_handler control_handlers[] = { - { AVRCP_GET_CAPABILITIES, - AVC_CTYPE_STATUS, AVC_CTYPE_STABLE, - handle_get_capabilities_cmd }, - { AVRCP_GET_PLAY_STATUS, - AVC_CTYPE_STATUS, AVC_CTYPE_STABLE, - handle_get_play_status_cmd }, - { AVRCP_GET_ELEMENT_ATTRIBUTES, - AVC_CTYPE_STATUS, AVC_CTYPE_STABLE, - handle_get_element_attrs_cmd }, - { AVRCP_REGISTER_NOTIFICATION, - AVC_CTYPE_NOTIFY, AVC_CTYPE_INTERIM, - handle_register_notification_cmd }, - { }, +static const struct avrcp_control_ind control_ind = { + .get_capabilities = handle_get_capabilities_cmd, + .get_play_status = handle_get_play_status_cmd, + .get_element_attributes = handle_get_element_attrs_cmd, + .register_notification = handle_register_notification_cmd, }; static gboolean register_notification_rsp(struct avctp *conn, @@ -848,7 +803,7 @@ static int avrcp_device_add_session(struct avrcp_device *dev, int fd, 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); + avrcp_register_player(dev->session, &control_ind, NULL, dev); dev->queue = g_queue_new(); |