From 49e49b00dc6b15952118eef29f5f2c14bc5712c8 Mon Sep 17 00:00:00 2001 From: Luiz Augusto von Dentz Date: Mon, 19 May 2014 12:41:54 +0300 Subject: [PATCH] android/avrcp-lib: Add support for SetAbsoluteVolume PDU --- android/avrcp-lib.c | 40 ++++++++++++++++++++++++++++++++++++++++ android/avrcp-lib.h | 4 ++++ 2 files changed, 44 insertions(+) diff --git a/android/avrcp-lib.c b/android/avrcp-lib.c index 7aeab434d..036867ecf 100644 --- a/android/avrcp-lib.c +++ b/android/avrcp-lib.c @@ -709,6 +709,27 @@ static ssize_t register_notification(struct avrcp *session, uint8_t transaction, player->user_data); } +static ssize_t set_volume(struct avrcp *session, uint8_t transaction, + uint16_t params_len, uint8_t *params, + void *user_data) +{ + struct avrcp_player *player = user_data; + uint8_t volume; + + DBG(""); + + if (!player->ind || !player->ind->set_volume) + return -ENOSYS; + + if (!params || params_len != sizeof(volume)) + return -EINVAL; + + volume = params[0] & 0x7f; + + return player->ind->set_volume(session, transaction, volume, + player->user_data); +} + static ssize_t set_addressed(struct avrcp *session, uint8_t transaction, uint16_t params_len, uint8_t *params, void *user_data) @@ -761,6 +782,9 @@ static const struct avrcp_control_handler player_handlers[] = { { AVRCP_REGISTER_NOTIFICATION, AVC_CTYPE_NOTIFY, AVC_CTYPE_INTERIM, register_notification }, + { AVRCP_SET_ABSOLUTE_VOLUME, + AVC_CTYPE_CONTROL, AVC_CTYPE_STABLE, + set_volume }, { AVRCP_SET_ADDRESSED_PLAYER, AVC_CTYPE_CONTROL, AVC_CTYPE_STABLE, set_addressed }, @@ -2705,6 +2729,22 @@ int avrcp_register_notification_rsp(struct avrcp *session, uint8_t transaction, &iov, 1); } +int avrcp_set_volume_rsp(struct avrcp *session, uint8_t transaction, + uint8_t volume) +{ + struct iovec iov; + + if (volume > 127) + return -EINVAL; + + iov.iov_base = &volume; + iov.iov_len = sizeof(volume); + + return avrcp_send(session, transaction, AVC_CTYPE_STABLE, + AVC_SUBUNIT_PANEL, AVRCP_SET_ABSOLUTE_VOLUME, + &iov, 1); +} + int avrcp_set_addressed_player_rsp(struct avrcp *session, uint8_t transaction, uint8_t status) { diff --git a/android/avrcp-lib.h b/android/avrcp-lib.h index f91a007f4..ee03958fe 100644 --- a/android/avrcp-lib.h +++ b/android/avrcp-lib.h @@ -157,6 +157,8 @@ struct avrcp_control_ind { int (*register_notification) (struct avrcp *session, uint8_t transaction, uint8_t event, uint32_t interval, void *user_data); + int (*set_volume) (struct avrcp *session, uint8_t transaction, + uint8_t volume, void *user_data); int (*set_addressed) (struct avrcp *session, uint8_t transaction, uint16_t id, void *user_data); int (*get_folder_items) (struct avrcp *session, uint8_t transaction, @@ -313,6 +315,8 @@ int avrcp_get_element_attrs_rsp(struct avrcp *session, uint8_t transaction, int avrcp_register_notification_rsp(struct avrcp *session, uint8_t transaction, uint8_t code, uint8_t *params, size_t params_len); +int avrcp_set_volume_rsp(struct avrcp *session, uint8_t transaction, + uint8_t volume); int avrcp_set_addressed_player_rsp(struct avrcp *session, uint8_t transaction, uint8_t status); int avrcp_get_folder_items_rsp(struct avrcp *session, uint8_t transaction, -- 2.47.3