From d8019264d1d299a3198897f36c2a83a276eac23a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jo=C3=A3o=20Paulo=20Rechi=20Vita?= Date: Fri, 11 Jan 2013 17:25:31 -0300 Subject: [PATCH] avrcp: Notify remote of volume changes --- profiles/audio/avrcp.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c index b1016dfeb..d715177d0 100644 --- a/profiles/audio/avrcp.c +++ b/profiles/audio/avrcp.c @@ -2540,7 +2540,7 @@ int avrcp_set_volume(struct audio_device *dev, uint8_t volume) { struct avrcp_server *server; struct avrcp *session; - uint8_t buf[AVRCP_HEADER_LENGTH + 1]; + uint8_t buf[AVRCP_HEADER_LENGTH + 2]; struct avrcp_header *pdu = (void *) buf; server = find_server(servers, device_get_adapter(dev->btd_dev)); @@ -2555,13 +2555,27 @@ int avrcp_set_volume(struct audio_device *dev, uint8_t volume) set_company_id(pdu->company_id, IEEEID_BTSIG); - pdu->pdu_id = AVRCP_SET_ABSOLUTE_VOLUME; - pdu->params[0] = volume; - pdu->params_len = htons(1); - DBG("volume=%u", volume); - return avctp_send_vendordep_req(session->conn, AVC_CTYPE_CONTROL, - AVC_SUBUNIT_PANEL, buf, sizeof(buf), + if (session->target) { + pdu->pdu_id = AVRCP_SET_ABSOLUTE_VOLUME; + pdu->params[0] = volume; + pdu->params_len = htons(1); + + return avctp_send_vendordep_req(session->conn, + AVC_CTYPE_CONTROL, AVC_SUBUNIT_PANEL, + buf, sizeof(buf), avrcp_handle_set_volume, session); + } else { + uint8_t id = AVRCP_EVENT_VOLUME_CHANGED; + pdu->pdu_id = AVRCP_REGISTER_NOTIFICATION; + pdu->params[0] = AVRCP_EVENT_VOLUME_CHANGED; + pdu->params[1] = volume; + pdu->params_len = htons(2); + + return avctp_send_vendordep(session->conn, + session->transaction_events[id], + AVC_CTYPE_CHANGED, AVC_SUBUNIT_PANEL, + buf, sizeof(buf)); + } } -- 2.11.0