summaryrefslogtreecommitdiff
path: root/monitor/avctp.c
diff options
context:
space:
mode:
authorVikrampal Yadav <vikram.pal@samsung.com>2014-08-13 15:13:35 +0530
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2014-08-13 13:09:21 +0300
commitdcd08628a2d23c004244cae6dc47647b869396b3 (patch)
treed9d9b3b07e2f757d7162bcb9029e769905f572b3 /monitor/avctp.c
parent0cb017cb86756ff8b5b6d40e9eff22aea027570b (diff)
downloadbluez-dcd08628a2d23c004244cae6dc47647b869396b3.tar.gz
monitor: Add AVRCP GetCapabilities support
Support for decoding AVRCP GetCapabilities added in Bluetooth monitor.
Diffstat (limited to 'monitor/avctp.c')
-rw-r--r--monitor/avctp.c100
1 files changed, 100 insertions, 0 deletions
diff --git a/monitor/avctp.c b/monitor/avctp.c
index bc8f469bb..9eeac7fd2 100644
--- a/monitor/avctp.c
+++ b/monitor/avctp.c
@@ -79,6 +79,21 @@
#define AVC_OP_SUBUNITINFO 0x31
#define AVC_OP_PASSTHROUGH 0x7c
+/* notification events */
+#define AVRCP_EVENT_PLAYBACK_STATUS_CHANGED 0x01
+#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_BATT_STATUS_CHANGED 0x06
+#define AVRCP_EVENT_SYSTEM_STATUS_CHANGED 0x07
+#define AVRCP_EVENT_PLAYER_APPLICATION_SETTING_CHANGED 0x08
+#define AVRCP_EVENT_NOW_PLAYING_CONTENT_CHANGED 0x09
+#define AVRCP_EVENT_AVAILABLE_PLAYERS_CHANGED 0x0a
+#define AVRCP_EVENT_ADDRESSED_PLAYER_CHANGED 0x0b
+#define AVRCP_EVENT_UIDS_CHANGED 0x0c
+#define AVRCP_EVENT_VOLUME_CHANGED 0x0d
+
/* error statuses */
#define AVRCP_STATUS_INVALID_COMMAND 0x00
#define AVRCP_STATUS_INVALID_PARAMETER 0x01
@@ -219,6 +234,52 @@ static const char *opcode2str(uint8_t opcode)
}
}
+static char *cap2str(uint8_t cap)
+{
+ switch (cap) {
+ case 0x2:
+ return "CompanyID";
+ case 0x3:
+ return "EventsID";
+ default:
+ return "Unknown";
+ }
+}
+
+static char *event2str(uint8_t event)
+{
+ switch (event) {
+ case AVRCP_EVENT_PLAYBACK_STATUS_CHANGED:
+ return "EVENT_PLAYBACK_STATUS_CHANGED";
+ case AVRCP_EVENT_TRACK_CHANGED:
+ return "EVENT_TRACK_CHANGED";
+ case AVRCP_EVENT_TRACK_REACHED_END:
+ return "EVENT_TRACK_REACHED_END";
+ case AVRCP_EVENT_TRACK_REACHED_START:
+ return "EVENT_TRACK_REACHED_START";
+ case AVRCP_EVENT_PLAYBACK_POS_CHANGED:
+ return "EVENT_PLAYBACK_POS_CHANGED";
+ case AVRCP_EVENT_BATT_STATUS_CHANGED:
+ return "EVENT_BATT_STATUS_CHANGED";
+ case AVRCP_EVENT_SYSTEM_STATUS_CHANGED:
+ return "EVENT_SYSTEM_STATUS_CHANGED";
+ case AVRCP_EVENT_PLAYER_APPLICATION_SETTING_CHANGED:
+ return "EVENT_PLAYER_APPLICATION_SETTING_CHANGED";
+ case AVRCP_EVENT_NOW_PLAYING_CONTENT_CHANGED:
+ return "EVENT_NOW_PLAYING_CONTENT_CHANGED";
+ case AVRCP_EVENT_AVAILABLE_PLAYERS_CHANGED:
+ return "EVENT_AVAILABLE_PLAYERS_CHANGED";
+ case AVRCP_EVENT_ADDRESSED_PLAYER_CHANGED:
+ return "EVENT_ADDRESSED_PLAYER_CHANGED";
+ case AVRCP_EVENT_UIDS_CHANGED:
+ return "EVENT_UIDS_CHANGED";
+ case AVRCP_EVENT_VOLUME_CHANGED:
+ return "EVENT_VOLUME_CHANGED";
+ default:
+ return "Reserved";
+ }
+}
+
static const char *error2str(uint8_t status)
{
switch (status) {
@@ -351,6 +412,45 @@ static void avrcp_get_capabilities(const struct l2cap_frame *frame,
uint8_t ctype, uint8_t len,
uint8_t indent)
{
+ uint8_t cap, count;
+ int i;
+
+ if (len < 1) {
+ print_text(COLOR_ERROR, "PDU malformed");
+ packet_hexdump(frame->data, frame->size);
+ return;
+ }
+
+ cap = *((uint8_t *) frame->data);
+ print_field("%*cCapabilityID: 0x%02x (%s)", (indent - 8), ' ', cap,
+ cap2str(cap));
+
+ if (len == 1)
+ return;
+
+ count = *((uint8_t *) (frame->data + 1));
+ print_field("%*cCapabilityCount: 0x%02x", (indent - 8), ' ', count);
+
+ switch (cap) {
+ case 0x2:
+ for (; count > 0; count--) {
+ print_field("%s: 0x", cap2str(cap));
+ for (i = 0; i < 3; i++)
+ print_field("%*c%02x", (indent - 8), ' ',
+ *((uint8_t *) (frame->data + 2 + i)));
+ }
+ break;
+ case 0x3:
+ for (i = 0; count > 0; count--, i++) {
+ uint8_t event;
+ event = *((uint8_t *) (frame->data + 2 + i));
+ print_field("%*c%s: 0x%02x (%s)", (indent - 8), ' ',
+ cap2str(cap), event, event2str(event));
+ }
+ break;
+ default:
+ packet_hexdump(frame->data + 1, frame->size - 1);
+ }
}
static void avrcp_list_player_attributes(const struct l2cap_frame *frame,