OSDN Git Service

avrcp: Handle RegisterNotification for volume
authorJoão Paulo Rechi Vita <jprvita@openbossa.org>
Fri, 11 Jan 2013 20:25:30 +0000 (17:25 -0300)
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>
Tue, 15 Jan 2013 18:06:57 +0000 (20:06 +0200)
This commit answers a NOTIFY command to register for nofications of
EVENT_VOLUME_CHANGED with an INTERIM response containing the current
absolute volume value.

profiles/audio/avrcp.c
profiles/audio/media.c
profiles/audio/transport.c
profiles/audio/transport.h

index bb8ab24..b1016df 100644 (file)
@@ -62,6 +62,7 @@
 #include "avdtp.h"
 #include "sink.h"
 #include "player.h"
+#include "transport.h"
 
 /* Company IDs for vendor dependent commands */
 #define IEEEID_BTSIG           0x001958
@@ -1247,6 +1248,7 @@ static uint8_t avrcp_handle_register_notification(struct avrcp *session,
                                                uint8_t transaction)
 {
        struct avrcp_player *player = session->player;
+       struct audio_device *dev = session->dev;
        uint16_t len = ntohs(pdu->params_len);
        uint64_t uid;
        GList *settings;
@@ -1293,6 +1295,17 @@ static uint8_t avrcp_handle_register_notification(struct avrcp *session,
                }
 
                break;
+       case AVRCP_EVENT_VOLUME_CHANGED:
+               if (session->version < 0x0104)
+                       goto err;
+
+               pdu->params[1] = media_transport_get_device_volume(dev);
+               if (pdu->params[1] > 127)
+                       goto err;
+
+               len = 2;
+
+               break;
        default:
                /* All other events are not supported yet */
                goto err;
@@ -1414,6 +1427,8 @@ static const struct control_pdu_handler tg_control_handlers[] = {
 static const struct control_pdu_handler ct_control_handlers[] = {
                { AVRCP_GET_CAPABILITIES, AVC_CTYPE_STATUS,
                                        avrcp_handle_get_capabilities },
+               { AVRCP_REGISTER_NOTIFICATION, AVC_CTYPE_NOTIFY,
+                                       avrcp_handle_register_notification },
                { },
 };
 
index 4b91656..15dab8c 100644 (file)
@@ -411,8 +411,8 @@ static gboolean set_configuration(struct media_endpoint *endpoint,
        if (transport != NULL)
                return FALSE;
 
-       transport = media_transport_create(endpoint, device,
-                                               configuration, size);
+       transport = media_transport_create(device, configuration, size,
+                                                               endpoint);
        if (transport == NULL)
                return FALSE;
 
index 7e44f20..eae98ed 100644 (file)
@@ -768,11 +768,11 @@ static void source_state_changed(struct audio_device *dev,
                transport_update_playing(transport, FALSE);
 }
 
-struct media_transport *media_transport_create(struct media_endpoint *endpoint,
-                                               struct audio_device *device,
+struct media_transport *media_transport_create(struct audio_device *device,
                                                uint8_t *configuration,
-                                               size_t size)
+                                               size_t size, void *data)
 {
+       struct media_endpoint *endpoint = data;
        struct media_transport *transport;
        const char *uuid;
        static int fd = 0;
index 78c6fa7..cd2fd6e 100644 (file)
 
 struct media_transport;
 
-struct media_transport *media_transport_create(struct media_endpoint *endpoint,
-                                               struct audio_device *device,
+struct media_transport *media_transport_create(struct audio_device *device,
                                                uint8_t *configuration,
-                                               size_t size);
+                                               size_t size, void *data);
 
 void media_transport_destroy(struct media_transport *transport);
 const char *media_transport_get_path(struct media_transport *transport);