1/* 2 * Copyright 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#pragma once 18 19#include <vector> 20 21// AVRCP packets pulled from wireshark 22namespace { 23 24// AVRCP Get Capabilities Request packet 25std::vector<uint8_t> get_capabilities_request = { 26 0x01, 0x48, 0x00, 0x00, 0x19, 0x58, 0x10, 0x00, 0x00, 0x01, 0x03}; 27 28// AVRCP Get Capabilities Request packet with Company ID 29std::vector<uint8_t> get_capabilities_request_company_id = { 30 0x01, 0x48, 0x00, 0x00, 0x19, 0x58, 0x10, 0x00, 0x00, 0x01, 0x02}; 31 32// AVRCP Get Capabilities Request packet with Unknown 33std::vector<uint8_t> get_capabilities_request_unknown = { 34 0x01, 0x48, 0x00, 0x00, 0x19, 0x58, 0x10, 0x00, 0x00, 0x01, 0x7f}; 35 36// AVRCP Get Capabilities Response to Company ID request 37std::vector<uint8_t> get_capabilities_response_company_id = { 38 0x0c, 0x48, 0x00, 0x00, 0x19, 0x58, 0x10, 0x00, 0x00, 39 0x08, 0x02, 0x02, 0x00, 0x19, 0x58, 0x00, 0x23, 0x45}; 40 41// AVRCP Get Capabilities Response to Events Supported request 42std::vector<uint8_t> get_capabilities_response_events_supported = { 43 0x0c, 0x48, 0x00, 0x00, 0x19, 0x58, 0x10, 0x00, 44 0x00, 0x05, 0x03, 0x03, 0x01, 0x02, 0x05}; 45 46// AVRCP Get Element Attributes request for current playing song and attribute 47// Title 48std::vector<uint8_t> get_element_attributes_request_partial = { 49 0x01, 0x48, 0x00, 0x00, 0x19, 0x58, 0x20, 0x00, 0x00, 0x0d, 0x00, 0x00, 50 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01}; 51 52// AVRCP Get Element Attributes request for current playing song and attributes 53// Title, Artist, Album, Media Number, Playing Time, Total Number of Media, and 54// Genre 55std::vector<uint8_t> get_element_attributes_request_full = { 56 0x01, 0x48, 0x00, 0x00, 0x19, 0x58, 0x20, 0x00, 0x00, 0x25, 0x00, 0x00, 57 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 58 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 59 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x06}; 60 61// AVRCP Get Element Attributes response with attribute values as follows 62// Title: "Test Song" 63// Artist: "Test Artist" 64// Album: "Test Album" 65// Track Number: "1" 66// Number of Tracks: "2" 67// Genre: "Test Genre" 68// Duration: "1000" 69std::vector<uint8_t> get_elements_attributes_response_full = { 70 0x0c, 0x48, 0x00, 0x00, 0x19, 0x58, 0x20, 0x00, 0x00, 0x67, 0x07, 0x00, 71 0x00, 0x00, 0x01, 0x00, 0x6a, 0x00, 0x09, 0x54, 0x65, 0x73, 0x74, 0x20, 72 0x53, 0x6f, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x02, 0x00, 0x6a, 0x00, 0x0b, 73 0x54, 0x65, 0x73, 0x74, 0x20, 0x41, 0x72, 0x74, 0x69, 0x73, 0x74, 0x00, 74 0x00, 0x00, 0x03, 0x00, 0x6a, 0x00, 0x0a, 0x54, 0x65, 0x73, 0x74, 0x20, 75 0x41, 0x6c, 0x62, 0x75, 0x6d, 0x00, 0x00, 0x00, 0x04, 0x00, 0x6a, 0x00, 76 0x01, 0x31, 0x00, 0x00, 0x00, 0x05, 0x00, 0x6a, 0x00, 0x01, 0x32, 0x00, 77 0x00, 0x00, 0x06, 0x00, 0x6a, 0x00, 0x0a, 0x54, 0x65, 0x73, 0x74, 0x20, 78 0x47, 0x65, 0x6e, 0x72, 0x65, 0x00, 0x00, 0x00, 0x07, 0x00, 0x6a, 0x00, 79 0x04, 0x31, 0x30, 0x30, 0x30}; 80 81// AVRCP Get Play Status Request 82std::vector<uint8_t> get_play_status_request = {0x01, 0x48, 0x00, 0x00, 0x19, 83 0x58, 0x30, 0x00, 0x00, 0x00}; 84 85// AVRCP Get Play Status Response 86std::vector<uint8_t> get_play_status_response = { 87 0x0c, 0x48, 0x00, 0x00, 0x19, 0x58, 0x30, 0x00, 0x00, 0x09, 88 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00}; 89 90// AVRCP Pass Through Command Play Pushed Request 91std::vector<uint8_t> pass_through_command_play_pushed = {0x00, 0x48, 0x7c, 0x44, 92 0x00}; 93 94// AVRCP Pass Through Command Play Pushed Response 95std::vector<uint8_t> pass_through_command_play_released = {0x09, 0x48, 0x7c, 96 0xc4, 0x00}; 97 98// AVRCP Register Playback Status Notification 99std::vector<uint8_t> register_play_status_notification = { 100 0x03, 0x48, 0x00, 0x00, 0x19, 0x58, 0x31, 0x00, 101 0x00, 0x05, 0x01, 0x00, 0x00, 0x00, 0x05}; 102 103// AVRCP Register Volume Changed Notification 104std::vector<uint8_t> register_volume_changed_notification = { 105 0x03, 0x48, 0x00, 0x00, 0x19, 0x58, 0x31, 0x00, 106 0x00, 0x05, 0x0d, 0x00, 0x00, 0x00, 0x00}; 107 108// AVRCP Interim Playback Status Notification 109std::vector<uint8_t> interim_play_status_notification = { 110 0x0f, 0x48, 0x00, 0x00, 0x19, 0x58, 0x31, 0x00, 0x00, 0x02, 0x01, 0x00}; 111 112// AVRCP Interim Track Changed Notification 113std::vector<uint8_t> interim_track_changed_notification = { 114 0x0f, 0x48, 0x00, 0x00, 0x19, 0x58, 0x31, 0x00, 0x00, 0x09, 115 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 116 117// AVRCP Changed Playback Position Notification 118std::vector<uint8_t> changed_play_pos_notification = { 119 0x0d, 0x48, 0x00, 0x00, 0x19, 0x58, 0x31, 0x00, 120 0x00, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00}; 121 122// AVRCP Interim Now Playing Changed Notification 123std::vector<uint8_t> interim_now_playing_notification = { 124 0x0f, 0x48, 0x00, 0x00, 0x19, 0x58, 0x31, 0x00, 0x00, 0x01, 0x09}; 125 126// AVRCP Interim Available Players Changed Notification 127std::vector<uint8_t> interim_available_players_notification = { 128 0x0f, 0x48, 0x00, 0x00, 0x19, 0x58, 0x31, 0x00, 0x00, 0x01, 0x0a}; 129 130// AVRCP Interim Addressed Player Changed Notification with active 131// player ID 1 132std::vector<uint8_t> interim_addressed_player_notification = { 133 0x0f, 0x48, 0x00, 0x00, 0x19, 0x58, 0x31, 0x00, 134 0x00, 0x05, 0x0b, 0x00, 0x01, 0x00, 0x00}; 135 136// AVRCP Interim UIDs Changed Notification 137std::vector<uint8_t> interim_uids_notificaiton = {0x0f, 0x48, 0x00, 0x00, 0x19, 138 0x58, 0x31, 0x00, 0x00, 0x03, 139 0x0c, 0x00, 0x00}; 140 141// AVRCP Interim Volume Changed Notification with volume at 55% (0x47) 142std::vector<uint8_t> interim_volume_changed_notification = { 143 0x0f, 0x48, 0x00, 0x00, 0x19, 0x58, 0x31, 0x00, 0x00, 0x02, 0x0d, 0x47}; 144 145// AVRCP Rejected Volume Changed Notification with volume at 0% 146std::vector<uint8_t> rejected_volume_changed_notification = { 147 0x0a, 0x48, 0x00, 0x00, 0x19, 0x58, 0x31, 0x00, 0x00, 0x02, 0x0d, 0x00}; 148 149// AVRCP Changed Volume Changed Notification with volume at 55% (0x47) 150std::vector<uint8_t> changed_volume_changed_notification = { 151 0x0d, 0x48, 0x00, 0x00, 0x19, 0x58, 0x31, 0x00, 0x00, 0x02, 0x0d, 0x47}; 152 153// AVRCP Reject List Player Application Settings Response 154std::vector<uint8_t> reject_player_app_settings_response = { 155 0x0a, 0x48, 0x00, 0x00, 0x19, 0x58, 0x11, 0x00, 0x00, 0x01, 0x00}; 156 157// AVRCP Browse General Reject packet for invalid PDU ID 158std::vector<uint8_t> general_reject_invalid_command_packet = {0xa0, 0x00, 0x01, 159 0x00}; 160 161// AVRCP Browse Get Folder Items Request packet for media players with 162// the following data: 163// scope = 0x00 (Media Player List) 164// start_item = 0x00 165// end_item = 0x03 166// attributes_requested: all 167std::vector<uint8_t> get_folder_items_request = {0x71, 0x00, 0x0a, 0x00, 0x00, 168 0x00, 0x00, 0x00, 0x00, 0x00, 169 0x00, 0x03, 0x00}; 170 171// AVRCP Browse Get Folder Items Request packet for media players with 172// the following data: 173// scope = 0x01 (VFS) 174// start_item = 0x00 175// end_item = 0x09 176// attributes_requested: none 177std::vector<uint8_t> get_folder_items_request_no_attrs = { 178 0x71, 0x00, 0x0a, 0x01, 0x00, 0x00, 0x00, 179 0x00, 0x00, 0x00, 0x00, 0x09, 0xff}; 180 181// AVRCP Browse Get Folder Items Request packet for media players with 182// the following data: 183// scope = 0x01 (VFS) 184// start_item = 0x00 185// end_item = 0x09 186// attributes_requested: Title 187std::vector<uint8_t> get_folder_items_request_title = { 188 0x71, 0x00, 0x0e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 189 0x00, 0x00, 0x09, 0x01, 0x00, 0x00, 0x00, 0x1}; 190 191// AVRCP Browse Get Folder Items Request packet for vfs with 192// the following data: 193// scope = 0x01 (VFS) 194// start_item = 0x00 195// end_item = 0x05 196// attributes_requested: TITLE 197std::vector<uint8_t> get_folder_items_request_vfs = { 198 0x71, 0x00, 0x0e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 199 0x00, 0x00, 0x05, 0x01, 0x00, 0x00, 0x00, 0x01}; 200 201// AVRCP Browse Get Folder Items Request packet for now playing with 202// the following data: 203// scope = 0x03 (Now Playing) 204// start_item = 0x00 205// end_item = 0x05 206// attributes_requested: All Items 207std::vector<uint8_t> get_folder_items_request_now_playing = { 208 0x71, 0x00, 0x0e, 0x03, 0x00, 0x00, 0x00, 209 0x00, 0x00, 0x00, 0x00, 0x05, 0x00}; 210 211// AVRCP Browse Get Folder Items Response packet with range out of bounds error 212std::vector<uint8_t> get_folder_items_error_response = {0x71, 0x00, 0x01, 0x0b}; 213 214// AVRCP Browse Get Folder Items Response packet for media players 215// Contains one media player with the following fields: 216// id = 0x0001 217// name = "com.google.android.music" 218// browsing_supported = true 219std::vector<uint8_t> get_folder_items_media_player_response = { 220 0x71, 0x00, 0x3c, 0x04, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00, 0x34, 221 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 222 0x00, 0x00, 0xb7, 0x01, 0x0c, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 223 0x00, 0x00, 0x00, 0x6a, 0x00, 0x18, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 224 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x6e, 0x64, 0x72, 0x6f, 225 0x69, 0x64, 0x2e, 0x6d, 0x75, 0x73, 0x69, 0x63}; 226 227// AVRCP Browse Get Folder Items Response packet with one folder 228// with the following fields: 229// uid = 0x0000000000000001 230// type = 0x00 (Mixed); 231// name = "Test Folder" 232// is_playable = true 233std::vector<uint8_t> get_folder_items_folder_response = { 234 0x71, 0x00, 0x21, 0x04, 0x00, 0x00, 0x00, 0x01, 0x02, 0x00, 0x19, 0x00, 235 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x6a, 0x00, 236 0x0b, 0x54, 0x65, 0x73, 0x74, 0x20, 0x46, 0x6f, 0x6c, 0x64, 0x65, 0x72}; 237 238// AVRCP Browse Get Folder Items Response packet with one song 239// with the following fields: 240// uid = 0x0000000000000002 241// name = "Test Title" 242// attribute[TITLE] = "Test Title" 243std::vector<uint8_t> get_folder_items_song_response = { 244 0x71, 0x00, 0x32, 0x04, 0x00, 0x00, 0x00, 0x01, 0x03, 0x00, 0x2a, 245 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x6a, 246 0x00, 0x0a, 0x54, 0x65, 0x73, 0x74, 0x20, 0x54, 0x69, 0x74, 0x6c, 247 0x65, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6a, 0x00, 0x0a, 0x54, 248 0x65, 0x73, 0x74, 0x20, 0x54, 0x69, 0x74, 0x6c, 0x65}; 249 250// AVRCP Browse Change Path Request down to folder with UID 0x0000000000000002 251std::vector<uint8_t> change_path_request = {0x72, 0x00, 0x0b, 0x00, 0x00, 252 0x01, 0x00, 0x00, 0x00, 0x00, 253 0x00, 0x00, 0x00, 0x02}; 254 255// AVRCP Browse Change Path Request up 256std::vector<uint8_t> change_path_up_request = {0x72, 0x00, 0x0b, 0x00, 0x00, 257 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 258 0xFF, 0xFF, 0xFF, 0xFF}; 259 260// AVRCP Browse Change Path Response with two items in current folder 261std::vector<uint8_t> change_path_response = {0x72, 0x00, 0x05, 0x04, 262 0x00, 0x00, 0x00, 0x02}; 263 264// AVRCP Browse Change Path Response with an error of invalid direction 265std::vector<uint8_t> change_path_error_response = {0x72, 0x00, 0x01, 0x07}; 266 267// AVRCP Get Item Attributes request with all attributes requested 268// with the following fields: 269// scope = 0x03 (Now Playing List) 270// uid_counter = 0x0000 271// uid = 0x0000000000000001 272std::vector<uint8_t> get_item_attributes_request_all_attributes = { 273 0x73, 0x00, 0x28, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 274 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 275 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 276 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07}; 277 278// AVRCP Get Item Attributes request with all attributes requested 279// with the following fields: 280// scope = 0x03 (Now Playing List) 281// uid_counter = 0x0001 282// uid = 0x0000000000000001 283std::vector<uint8_t> get_item_attributes_request_all_attributes_invalid = { 284 0x73, 0x00, 0x28, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 285 0x01, 0x00, 0x01, 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 286 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 287 0x00, 0x05, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07}; 288 289// AVRCP Get Item Attributes Response with the following attributes: 290// title = "Test Song" 291// artist = "Test Artist" 292// album = "Test Album" 293std::vector<uint8_t> get_item_attributes_song_response = { 294 0x73, 0x00, 0x38, 0x04, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x6a, 0x00, 295 0x09, 0x54, 0x65, 0x73, 0x74, 0x20, 0x53, 0x6f, 0x6e, 0x67, 0x00, 0x00, 296 0x00, 0x02, 0x00, 0x6a, 0x00, 0x0b, 0x54, 0x65, 0x73, 0x74, 0x20, 0x41, 297 0x72, 0x74, 0x69, 0x73, 0x74, 0x00, 0x00, 0x00, 0x03, 0x00, 0x6a, 0x00, 298 0x0a, 0x54, 0x65, 0x73, 0x74, 0x20, 0x41, 0x6c, 0x62, 0x75, 0x6d}; 299 300// AVRCP Set Addressed Player Request with player_id = 1 301std::vector<uint8_t> set_addressed_player_request = { 302 0x00, 0x48, 0x00, 0x00, 0x19, 0x58, 0x60, 0x00, 0x00, 0x02, 0x00, 0x01}; 303 304// AVRCP Set Addressed Player Response with status success 305std::vector<uint8_t> set_addressed_player_response = { 306 0x09, 0x48, 0x00, 0x00, 0x19, 0x58, 0x60, 0x00, 0x00, 0x01, 0x04}; 307 308// AVRCP Set Browsed Player Request with player_id = 2 309std::vector<uint8_t> set_browsed_player_request = {0x70, 0x00, 0x02, 0x00, 310 0x02}; 311 312// AVRCP Set Browsed Player Response with num items = 4 and depth = 0 313std::vector<uint8_t> set_browsed_player_response = { 314 0x70, 0x00, 0x0a, 0x04, 0x00, 0x00, 0x00, 315 0x00, 0x00, 0x04, 0x00, 0x6a, 0x00}; 316 317// AVRCP Get Total Number of Items Request with Scope = Media Player List 318std::vector<uint8_t> get_total_number_of_items_request_media_players = { 319 0x75, 0x00, 0x01, 0x00}; 320 321// AVRCP Get Total Number of Items Request with Scope = VFS 322std::vector<uint8_t> get_total_number_of_items_request_vfs = {0x75, 0x00, 0x01, 323 0x01}; 324 325// AVRCP Get Total Number of Items Request with Scope = Now Playing List 326std::vector<uint8_t> get_total_number_of_items_request_now_playing = { 327 0x75, 0x00, 0x01, 0x03}; 328 329// AVRCP Get Total number of Items Response with 5 items in folder 330std::vector<uint8_t> get_total_number_of_items_response = { 331 0x75, 0x00, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05}; 332 333// AVRCP Play Item Request with scope = Now Playing and 334// UID = 0x0000000000000003 335std::vector<uint8_t> play_item_request = { 336 0x00, 0x48, 0x00, 0x00, 0x19, 0x58, 0x74, 0x00, 0x00, 0x0b, 0x03, 337 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00}; 338 339// AVRCP Play Item Response 340std::vector<uint8_t> play_item_response = {0x09, 0x48, 0x00, 0x00, 0x19, 0x58, 341 0x74, 0x00, 0x00, 0x01, 0x04}; 342 343// AVRCP Set Absolute Volume Request with volume at 56% (0x48) 344std::vector<uint8_t> set_absolute_volume_request = { 345 0x00, 0x48, 0x00, 0x00, 0x19, 0x58, 0x50, 0x00, 0x00, 0x01, 0x48}; 346 347// AVRCP Set Absolute Volume Response with voume at 52% (0x43) 348std::vector<uint8_t> set_absolute_volume_response = { 349 0x09, 0x48, 0x00, 0x00, 0x19, 0x58, 0x50, 0x00, 0x00, 0x01, 0x43}; 350 351} // namespace 352