summaryrefslogtreecommitdiff
path: root/monitor/avctp.c
diff options
context:
space:
mode:
authorVikrampal Yadav <vikram.pal@samsung.com>2014-08-25 16:46:22 +0530
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2014-08-26 13:24:38 +0300
commit7299624f4f7e35fe6b0ff7273a8d4c1c26941e93 (patch)
treed62fa52683fb0a3c57bcfa480d957ada06a3069c /monitor/avctp.c
parenta5b34cb0d328b189baab26238fd20daa51b73439 (diff)
downloadbluez-7299624f4f7e35fe6b0ff7273a8d4c1c26941e93.tar.gz
monitor: Add AVRCP ListPlayerApplicationSettingValues support
Support for decoding AVRCP ListPlayerApplicationSettingValues added in Bluetooth monitor.
Diffstat (limited to 'monitor/avctp.c')
-rw-r--r--monitor/avctp.c92
1 files changed, 92 insertions, 0 deletions
diff --git a/monitor/avctp.c b/monitor/avctp.c
index ec2adcd22..17c80f345 100644
--- a/monitor/avctp.c
+++ b/monitor/avctp.c
@@ -429,6 +429,60 @@ static const char *attr2str(uint8_t attr)
}
}
+static const char *value2str(uint8_t attr, uint8_t value)
+{
+ switch (attr) {
+ case AVRCP_ATTRIBUTE_ILEGAL:
+ return "Illegal";
+ case AVRCP_ATTRIBUTE_EQUALIZER:
+ switch (value) {
+ case 0x01:
+ return "OFF";
+ case 0x02:
+ return "ON";
+ default:
+ return "Reserved";
+ }
+ case AVRCP_ATTRIBUTE_REPEAT_MODE:
+ switch (value) {
+ case 0x01:
+ return "OFF";
+ case 0x02:
+ return "Single Track Repeat";
+ case 0x03:
+ return "All Track Repeat";
+ case 0x04:
+ return "Group Repeat";
+ default:
+ return "Reserved";
+ }
+ case AVRCP_ATTRIBUTE_SHUFFLE:
+ switch (value) {
+ case 0x01:
+ return "OFF";
+ case 0x02:
+ return "All Track Suffle";
+ case 0x03:
+ return "Group Suffle";
+ default:
+ return "Reserved";
+ }
+ case AVRCP_ATTRIBUTE_SCAN:
+ switch (value) {
+ case 0x01:
+ return "OFF";
+ case 0x02:
+ return "All Track Scan";
+ case 0x03:
+ return "Group Scan";
+ default:
+ return "Reserved";
+ }
+ default:
+ return "Unknown";
+ }
+}
+
static void avrcp_passthrough_packet(const struct l2cap_frame *frame)
{
}
@@ -504,6 +558,44 @@ static void avrcp_list_player_values(const struct l2cap_frame *frame,
uint8_t ctype, uint8_t len,
uint8_t indent)
{
+ struct l2cap_frame avrcp_frame;
+ static uint8_t attr = 0;
+ uint8_t num;
+
+ l2cap_frame_pull(&avrcp_frame, frame, 0);
+
+ if (ctype > AVC_CTYPE_GENERAL_INQUIRY)
+ goto response;
+
+ if (l2cap_frame_get_u8(&avrcp_frame, &attr))
+ goto error;
+
+ print_field("%*cAttributeID: 0x%02x (%s)", (indent - 8), ' ',
+ attr, attr2str(attr));
+
+ return;
+
+response:
+ if (l2cap_frame_get_u8(&avrcp_frame, &num))
+ goto error;
+
+ print_field("%*cValueCount: 0x%02x", (indent - 8), ' ', num);
+
+ for (; num > 0; num--) {
+ uint8_t value;
+
+ if (l2cap_frame_get_u8(&avrcp_frame, &value))
+ goto error;
+
+ print_field("%*cValueID: 0x%02x (%s)", (indent - 8),
+ ' ', value, value2str(attr, value));
+ }
+
+ return;
+
+error:
+ print_text(COLOR_ERROR, "PDU malformed");
+ packet_hexdump(frame->data, frame->size);
}
static void avrcp_get_current_player_value(const struct l2cap_frame *frame,