Home | History | Annotate | Download | only in include
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 2006-2012 Broadcom Corporation
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 /******************************************************************************
     20  *
     21  *  AVRCP definition and data types
     22  *
     23  ******************************************************************************/
     24 #ifndef _AVRC_DEFS_H
     25 #define _AVRC_DEFS_H
     26 
     27 /*****************************************************************************
     28 **  constants
     29 *****************************************************************************/
     30 
     31 /* Profile revision numbers */
     32 #define AVRC_REV_1_0        0x0100
     33 #define AVRC_REV_1_3        0x0103
     34 #define AVRC_REV_1_4        0x0104
     35 
     36 #define AVRC_PACKET_LEN             512 /* Per the spec, you must support 512 byte RC packets */
     37 
     38 #define AVRC_MIN_CONTROL_MTU        48  /* Per the spec, minimum MTU for the control channel */
     39 #define AVRC_MIN_BROWSE_MTU         335 /* Per the spec, minimum MTU for the browsing channel */
     40 
     41 #define AVRC_META_PDU_OFFSET        4
     42 #define AVRC_SUB_TYPE_LEN           4
     43 #define AVRC_UID_SIZE               8
     44 #define AVRC_FEATURE_MASK_SIZE      16
     45 
     46 /* command type codes */
     47 #define AVRC_CMD_CTRL       0   /* Instruct a target to perform an operation */
     48 #define AVRC_CMD_STATUS     1   /* Check a devices current status */
     49 #define AVRC_CMD_SPEC_INQ   2   /* Check whether a target supports a particular
     50                                    control command; all operands are included */
     51 #define AVRC_CMD_NOTIF      3   /* Used for receiving notification of a change in a devices state */
     52 #define AVRC_CMD_GEN_INQ    4   /* Check whether a target supports a particular
     53                                    control command; operands are not included */
     54 
     55 /* response type codes */
     56 #define AVRC_RSP_NOT_IMPL   8   /* The target does not implement the command specified
     57                                    by the opcode and operand,
     58                                    or doesnt implement the specified subunit */
     59 #define AVRC_RSP_ACCEPT     9   /* The target executed or is executing the command */
     60 #define AVRC_RSP_REJ        10  /* The target implements the command specified by the
     61                                    opcode but cannot respond because the current state
     62                                    of the target doesnt allow it */
     63 #define AVRC_RSP_IN_TRANS   11  /* The target implements the status command but it is
     64                                    in a state of transition; the status command may
     65                                    be retried at a future time */
     66 #define AVRC_RSP_IMPL_STBL  12  /* For specific inquiry or general inquiy commands,
     67                                    the target implements the command; for status
     68                                    commands, the target returns stable and includes
     69                                    the status results */
     70 #define AVRC_RSP_CHANGED    13  /* The response frame contains a notification that the
     71                                    target devices state has changed */
     72 #define AVRC_RSP_INTERIM    15  /* For control commands, the target has accepted the
     73                                    request but cannot return information within 100
     74                                    milliseconds; for notify commands, the target accepted
     75                                    the command, and will notify the controller of a change
     76                                    of target state at a future time */
     77 
     78 /* subunit type */
     79 #define AVRC_SUB_MONITOR    0x00    /* Monitor */
     80 #define AVRC_SUB_AUDIO      0x01    /* Audio */
     81 #define AVRC_SUB_PRINTER    0x02    /* Printer */
     82 #define AVRC_SUB_DISC       0x03    /* Disc */
     83 #define AVRC_SUB_TAPE       0x04    /* Tape recorder/player */
     84 #define AVRC_SUB_TUNER      0x05    /* Tuner */
     85 #define AVRC_SUB_CA         0x06    /* CA */
     86 #define AVRC_SUB_CAMERA     0x07    /* Camera */
     87 #define AVRC_SUB_PANEL      0x09    /* Panel */
     88 #define AVRC_SUB_BB         0x0A    /* Bulletin Board */
     89 #define AVRC_SUB_CAM_STOR   0x0B    /* Camera Storage */
     90 #define AVRC_SUB_VENDOR     0x1C    /* Vendor unique */
     91 #define AVRC_SUB_EXT        0x1E    /* Subunit type extended to next byte */
     92 #define AVRC_SUB_UNIT       0x1F    /* Unit */
     93 
     94 /* opcodes - defined by 1394ta */
     95 #define AVRC_OP_UNIT_INFO   0x30    /* Report unit information */
     96 #define AVRC_OP_SUB_INFO    0x31    /* Report subunit information */
     97 #define AVRC_OP_VENDOR      0x00    /* Vendor-dependent commands */
     98 #define AVRC_OP_PASS_THRU   0x7C    /* panel subunit opcode */
     99 /* opcodes 80-9F and E0-FF are not used by 1394ta.Sneak one for the browsing channel */
    100 #define AVRC_OP_BROWSE      0xFF    /* Browsing */
    101 #define AVRC_OP_INVALID     0xFE    /* invalid one */
    102 
    103 /* Company ID's
    104 */
    105 #define AVRC_CO_BLUETOOTH_SIG   0x00FFFFFF
    106 #define AVRC_CO_WIDCOMM         0x00000361
    107 #define AVRC_CO_BROADCOM        0x00001018
    108 #define AVRC_CO_METADATA        0x00001958  /* Unique COMPANY ID for Metadata messages */
    109 
    110 /* State flag for Passthrough commands
    111 */
    112 #define AVRC_STATE_PRESS    0
    113 #define AVRC_STATE_RELEASE  1
    114 
    115 /* Operation ID list for Passthrough commands
    116 */
    117 #define AVRC_ID_SELECT      0x00    /* select */
    118 #define AVRC_ID_UP          0x01    /* up */
    119 #define AVRC_ID_DOWN        0x02    /* down */
    120 #define AVRC_ID_LEFT        0x03    /* left */
    121 #define AVRC_ID_RIGHT       0x04    /* right */
    122 #define AVRC_ID_RIGHT_UP    0x05    /* right-up */
    123 #define AVRC_ID_RIGHT_DOWN  0x06    /* right-down */
    124 #define AVRC_ID_LEFT_UP     0x07    /* left-up */
    125 #define AVRC_ID_LEFT_DOWN   0x08    /* left-down */
    126 #define AVRC_ID_ROOT_MENU   0x09    /* root menu */
    127 #define AVRC_ID_SETUP_MENU  0x0A    /* setup menu */
    128 #define AVRC_ID_CONT_MENU   0x0B    /* contents menu */
    129 #define AVRC_ID_FAV_MENU    0x0C    /* favorite menu */
    130 #define AVRC_ID_EXIT        0x0D    /* exit */
    131 #define AVRC_ID_0           0x20    /* 0 */
    132 #define AVRC_ID_1           0x21    /* 1 */
    133 #define AVRC_ID_2           0x22    /* 2 */
    134 #define AVRC_ID_3           0x23    /* 3 */
    135 #define AVRC_ID_4           0x24    /* 4 */
    136 #define AVRC_ID_5           0x25    /* 5 */
    137 #define AVRC_ID_6           0x26    /* 6 */
    138 #define AVRC_ID_7           0x27    /* 7 */
    139 #define AVRC_ID_8           0x28    /* 8 */
    140 #define AVRC_ID_9           0x29    /* 9 */
    141 #define AVRC_ID_DOT         0x2A    /* dot */
    142 #define AVRC_ID_ENTER       0x2B    /* enter */
    143 #define AVRC_ID_CLEAR       0x2C    /* clear */
    144 #define AVRC_ID_CHAN_UP     0x30    /* channel up */
    145 #define AVRC_ID_CHAN_DOWN   0x31    /* channel down */
    146 #define AVRC_ID_PREV_CHAN   0x32    /* previous channel */
    147 #define AVRC_ID_SOUND_SEL   0x33    /* sound select */
    148 #define AVRC_ID_INPUT_SEL   0x34    /* input select */
    149 #define AVRC_ID_DISP_INFO   0x35    /* display information */
    150 #define AVRC_ID_HELP        0x36    /* help */
    151 #define AVRC_ID_PAGE_UP     0x37    /* page up */
    152 #define AVRC_ID_PAGE_DOWN   0x38    /* page down */
    153 #define AVRC_ID_POWER       0x40    /* power */
    154 #define AVRC_ID_VOL_UP      0x41    /* volume up */
    155 #define AVRC_ID_VOL_DOWN    0x42    /* volume down */
    156 #define AVRC_ID_MUTE        0x43    /* mute */
    157 #define AVRC_ID_PLAY        0x44    /* play */
    158 #define AVRC_ID_STOP        0x45    /* stop */
    159 #define AVRC_ID_PAUSE       0x46    /* pause */
    160 #define AVRC_ID_RECORD      0x47    /* record */
    161 #define AVRC_ID_REWIND      0x48    /* rewind */
    162 #define AVRC_ID_FAST_FOR    0x49    /* fast forward */
    163 #define AVRC_ID_EJECT       0x4A    /* eject */
    164 #define AVRC_ID_FORWARD     0x4B    /* forward */
    165 #define AVRC_ID_BACKWARD    0x4C    /* backward */
    166 #define AVRC_ID_ANGLE       0x50    /* angle */
    167 #define AVRC_ID_SUBPICT     0x51    /* subpicture */
    168 #define AVRC_ID_F1          0x71    /* F1 */
    169 #define AVRC_ID_F2          0x72    /* F2 */
    170 #define AVRC_ID_F3          0x73    /* F3 */
    171 #define AVRC_ID_F4          0x74    /* F4 */
    172 #define AVRC_ID_F5          0x75    /* F5 */
    173 #define AVRC_ID_VENDOR      0x7E    /* vendor unique */
    174 #define AVRC_KEYPRESSED_RELEASE 0x80
    175 
    176 /*****************************************************************************
    177 **  Metadata transfer definitions
    178 *****************************************************************************/
    179 
    180 /* Define the Metadata Packet types
    181 */
    182 #define AVRC_PKT_SINGLE           0
    183 #define AVRC_PKT_START            1
    184 #define AVRC_PKT_CONTINUE         2
    185 #define AVRC_PKT_END              3
    186 #define AVRC_PKT_TYPE_MASK        3
    187 
    188 /* Define the PDUs carried in the vendor dependant data
    189 */
    190 #define AVRC_PDU_GET_CAPABILITIES               0x10
    191 #define AVRC_PDU_LIST_PLAYER_APP_ATTR           0x11
    192 #define AVRC_PDU_LIST_PLAYER_APP_VALUES         0x12
    193 #define AVRC_PDU_GET_CUR_PLAYER_APP_VALUE       0x13
    194 #define AVRC_PDU_SET_PLAYER_APP_VALUE           0x14
    195 #define AVRC_PDU_GET_PLAYER_APP_ATTR_TEXT       0x15
    196 #define AVRC_PDU_GET_PLAYER_APP_VALUE_TEXT      0x16
    197 #define AVRC_PDU_INFORM_DISPLAY_CHARSET         0x17
    198 #define AVRC_PDU_INFORM_BATTERY_STAT_OF_CT      0x18
    199 #define AVRC_PDU_GET_ELEMENT_ATTR               0x20
    200 #define AVRC_PDU_GET_PLAY_STATUS                0x30
    201 #define AVRC_PDU_REGISTER_NOTIFICATION          0x31
    202 #define AVRC_PDU_REQUEST_CONTINUATION_RSP       0x40
    203 #define AVRC_PDU_ABORT_CONTINUATION_RSP         0x41
    204 /* added in 1.4 */
    205 #define AVRC_PDU_SET_ABSOLUTE_VOLUME            0x50
    206 #define AVRC_PDU_SET_ADDRESSED_PLAYER           0x60
    207 #define AVRC_PDU_SET_BROWSED_PLAYER             0x70
    208 #define AVRC_PDU_GET_FOLDER_ITEMS               0x71
    209 #define AVRC_PDU_CHANGE_PATH                    0x72
    210 #define AVRC_PDU_GET_ITEM_ATTRIBUTES            0x73
    211 #define AVRC_PDU_PLAY_ITEM                      0x74
    212 #define AVRC_PDU_SEARCH                         0x80
    213 #define AVRC_PDU_ADD_TO_NOW_PLAYING             0x90
    214 #define AVRC_PDU_GENERAL_REJECT                 0xA0
    215 
    216 /* Define the vendor unique id carried in the pass through data
    217 */
    218 #define AVRC_PDU_NEXT_GROUP                     0x00
    219 #define AVRC_PDU_PREV_GROUP                     0x01
    220 /* the only pass through vendor unique commands defined by AVRC is the group navigation commands
    221  * The len for vendor unique data is 5 */
    222 #define AVRC_PASS_THRU_GROUP_LEN                5
    223 
    224 #define AVRC_PDU_INVALID                        0xff
    225 /* 6.15.3 error status code for general reject */
    226 #define AVRC_STS_BAD_CMD        0x00    /* Invalid command, sent if TG received a PDU that it did not understand. */
    227 #define AVRC_STS_BAD_PARAM      0x01    /* Invalid parameter, sent if the TG received a PDU with a parameter ID that it did not understand. Sent if there is only one parameter ID in the PDU. */
    228 #define AVRC_STS_NOT_FOUND      0x02    /* Specified parameter not found., sent if the parameter ID is understood, but content is wrong or corrupted. */
    229 #define AVRC_STS_INTERNAL_ERR   0x03    /* Internal Error, sent if there are error conditions not covered by a more specific error code. */
    230 #define AVRC_STS_NO_ERROR       0x04    /* Operation completed without error.  This is the status that should be returned if the operation was successful. */
    231 #define AVRC_STS_UID_CHANGED    0x05    /* UID Changed - The UIDs on the device have changed */
    232 /* #define AVRC_STS_GEN_ERROR      0x06    Unknown Error - this is changed to "reserved" */
    233 #define AVRC_STS_BAD_DIR        0x07    /* Invalid Direction - The Direction parameter is invalid - Change Path*/
    234 #define AVRC_STS_NOT_DIR        0x08    /* Not a Directory - The UID provided does not refer to a folder item  Change Path*/
    235 #define AVRC_STS_NOT_EXIST      0x09    /* Does Not Exist - The UID provided does not refer to any item    Change Path, PlayItem, AddToNowPlaying, GetItemAttributes*/
    236 #define AVRC_STS_BAD_SCOPE      0x0a    /* Invalid Scope - The scope parameter is invalid  GetFolderItems, PlayItem, AddToNowPlayer, GetItemAttributes, */
    237 #define AVRC_STS_BAD_RANGE      0x0b    /* Range Out of Bounds - The start of range provided is not valid  GetFolderItems*/
    238 #define AVRC_STS_UID_IS_DIR     0x0c    /* UID is a Directory - The UID provided refers to a directory, which cannot be handled by this media player   PlayItem, AddToNowPlaying */
    239 #define AVRC_STS_IN_USE         0x0d    /* Media in Use - The media is not able to be used for this operation at this time PlayItem, AddToNowPlaying */
    240 #define AVRC_STS_NOW_LIST_FULL  0x0e    /* Now Playing List Full - No more items can be added to the Now Playing List  AddToNowPlaying*/
    241 #define AVRC_STS_SEARCH_NOT_SUP 0x0f    /* Search Not Supported - The Browsed Media Player does not support search Search */
    242 #define AVRC_STS_SEARCH_BUSY    0x10    /* Search in Progress - A search operation is already in progress  Search*/
    243 #define AVRC_STS_BAD_PLAYER_ID  0x11    /* Invalid Player Id - The specified Player Id does not refer to a valid player    SetAddressedPlayer, SetBrowsedPlayer*/
    244 #define AVRC_STS_PLAYER_N_BR    0x12    /* Player Not Browsable - The Player Id supplied refers to a Media Player which does not support browsing. SetBrowsedPlayer */
    245 #define AVRC_STS_PLAYER_N_ADDR  0x13    /* Player Not Addressed.  The Player Id supplied refers to a player which is not currently addressed, and the command is not able to be performed if the player is not set as addressed.   Search, SetBrowsedPlayer*/
    246 #define AVRC_STS_BAD_SEARCH_RES 0x14    /* No valid Search Results - The Search result list does not contain valid entries, e.g. after being invalidated due to change of browsed player   GetFolderItems */
    247 #define AVRC_STS_NO_AVAL_PLAYER 0x15    /* No available players ALL */
    248 #define AVRC_STS_ADDR_PLAYER_CHG 0x16   /* Addressed Player Changed - Register Notification */
    249 typedef UINT8 tAVRC_STS;
    250 
    251 
    252 /* Define the Capability IDs
    253 */
    254 #define AVRC_CAP_COMPANY_ID                     0x02
    255 #define AVRC_CAP_EVENTS_SUPPORTED               0x03
    256 #define AVRC_COMPANY_ID_LEN                     3
    257 #define AVRC_CAPABILITY_OFFSET                  2
    258 
    259 /* Define the Player Application Settings IDs
    260 */
    261 #define AVRC_PLAYER_SETTING_EQUALIZER           0x01
    262 #define AVRC_PLAYER_SETTING_REPEAT              0x02
    263 #define AVRC_PLAYER_SETTING_SHUFFLE             0x03
    264 #define AVRC_PLAYER_SETTING_SCAN                0x04
    265 #define AVRC_PLAYER_SETTING_LOW_MENU_EXT        0x80
    266 #define AVRC_PLAYER_SETTING_HIGH_MENU_EXT       0xff
    267 
    268 /* Define the possible values of the Player Application Settings
    269 */
    270 #define AVRC_PLAYER_VAL_OFF                     0x01
    271 #define AVRC_PLAYER_VAL_ON                      0x02
    272 #define AVRC_PLAYER_VAL_SINGLE_REPEAT           0x02
    273 #define AVRC_PLAYER_VAL_ALL_REPEAT              0x03
    274 #define AVRC_PLAYER_VAL_GROUP_REPEAT            0x04
    275 #define AVRC_PLAYER_VAL_ALL_SHUFFLE             0x02
    276 #define AVRC_PLAYER_VAL_GROUP_SHUFFLE           0x03
    277 #define AVRC_PLAYER_VAL_ALL_SCAN                0x02
    278 #define AVRC_PLAYER_VAL_GROUP_SCAN              0x03
    279 
    280 /* Define the possible values of Battery Status PDU
    281 */
    282 #define AVRC_BATTERY_STATUS_NORMAL              0x00
    283 #define AVRC_BATTERY_STATUS_WARNING             0x01
    284 #define AVRC_BATTERY_STATUS_CRITICAL            0x02
    285 #define AVRC_BATTERY_STATUS_EXTERNAL            0x03
    286 #define AVRC_BATTERY_STATUS_FULL_CHARGE         0x04
    287 typedef UINT8 tAVRC_BATTERY_STATUS;
    288 
    289 /* Define character set */
    290 #define AVRC_CHAR_SET_SIZE                      2
    291 
    292 /* Define the Media Attribute IDs
    293 */
    294 #define AVRC_MEDIA_ATTR_ID_TITLE                 0x00000001
    295 #define AVRC_MEDIA_ATTR_ID_ARTIST                0x00000002
    296 #define AVRC_MEDIA_ATTR_ID_ALBUM                 0x00000003
    297 #define AVRC_MEDIA_ATTR_ID_TRACK_NUM             0x00000004
    298 #define AVRC_MEDIA_ATTR_ID_NUM_TRACKS            0x00000005
    299 #define AVRC_MEDIA_ATTR_ID_GENRE                 0x00000006
    300 #define AVRC_MEDIA_ATTR_ID_PLAYING_TIME          0x00000007        /* in miliseconds */
    301 #define AVRC_MAX_NUM_MEDIA_ATTR_ID               7
    302 
    303 /* Define the possible values of play state
    304 */
    305 #define AVRC_PLAYSTATE_RESP_MSG_SIZE            9
    306 #define AVRC_PLAYSTATE_STOPPED                  0x00    /* Stopped */
    307 #define AVRC_PLAYSTATE_PLAYING                  0x01    /* Playing */
    308 #define AVRC_PLAYSTATE_PAUSED                   0x02    /* Paused  */
    309 #define AVRC_PLAYSTATE_FWD_SEEK                 0x03    /* Fwd Seek*/
    310 #define AVRC_PLAYSTATE_REV_SEEK                 0x04    /* Rev Seek*/
    311 #define AVRC_PLAYSTATE_ERROR                    0xFF    /* Error   */
    312 typedef UINT8 tAVRC_PLAYSTATE;
    313 
    314 /* Define the events that can be registered for notifications
    315 */
    316 #define AVRC_EVT_PLAY_STATUS_CHANGE             0x01
    317 #define AVRC_EVT_TRACK_CHANGE                   0x02
    318 #define AVRC_EVT_TRACK_REACHED_END              0x03
    319 #define AVRC_EVT_TRACK_REACHED_START            0x04
    320 #define AVRC_EVT_PLAY_POS_CHANGED               0x05
    321 #define AVRC_EVT_BATTERY_STATUS_CHANGE          0x06
    322 #define AVRC_EVT_SYSTEM_STATUS_CHANGE           0x07
    323 #define AVRC_EVT_APP_SETTING_CHANGE             0x08
    324 /* added in AVRCP 1.4 */
    325 #define AVRC_EVT_NOW_PLAYING_CHANGE             0x09
    326 #define AVRC_EVT_AVAL_PLAYERS_CHANGE            0x0a
    327 #define AVRC_EVT_ADDR_PLAYER_CHANGE             0x0b
    328 #define AVRC_EVT_UIDS_CHANGE                    0x0c
    329 #define AVRC_EVT_VOLUME_CHANGE                  0x0d
    330 
    331 /* the number of events that can be registered for notifications */
    332 #define AVRC_NUM_NOTIF_EVENTS                   0x0d
    333 
    334 #define AVRC_EVT_MSG_LEN_1                      0x01
    335 #define AVRC_EVT_MSG_LEN_2                      0x02
    336 #define AVRC_EVT_MSG_LEN_5                      0x05
    337 #define AVRC_EVT_MSG_LEN_9                      0x09
    338 
    339 #define AVRC_MAX_VOLUME                         0x7F
    340 
    341 /* Define the possible values of system status
    342 */
    343 #define AVRC_SYSTEMSTATE_PWR_ON                 0x00
    344 #define AVRC_SYSTEMSTATE_PWR_OFF                0x01
    345 #define AVRC_SYSTEMSTATE_PWR_UNPLUGGED          0x02
    346 typedef UINT8 tAVRC_SYSTEMSTATE;
    347 
    348 /* the frequently used character set ids */
    349 #define AVRC_CHARSET_ID_ASCII                  ((UINT16) 0x0003) /* ASCII */
    350 #define AVRC_CHARSET_ID_UTF8                   ((UINT16) 0x006a) /* UTF-8 */
    351 #define AVRC_CHARSET_ID_UTF16                  ((UINT16) 0x03f7) /* 1015 */
    352 #define AVRC_CHARSET_ID_UTF32                  ((UINT16) 0x03f9) /* 1017 */
    353 
    354 /*****************************************************************************
    355 **  Advanced Control
    356 *****************************************************************************/
    357 #define AVRC_ITEM_PLAYER            0x01
    358 #define AVRC_ITEM_FOLDER            0x02
    359 #define AVRC_ITEM_MEDIA             0x03
    360 
    361 #define AVRC_SCOPE_PLAYER_LIST      0x00  /* Media Player Item - Contains all available media players */
    362 #define AVRC_SCOPE_FILE_SYSTEM      0x01  /* Folder Item, Media Element Item
    363                                              - The virtual filesystem containing the media content of the browsed player */
    364 #define AVRC_SCOPE_SEARCH           0x02  /* Media Element Item  The results of a search operation on the browsed player */
    365 #define AVRC_SCOPE_NOW_PLAYING      0x03  /* Media Element Item  The Now Playing list (or queue) of the addressed player */
    366 
    367 #define AVRC_FOLDER_ITEM_COUNT_NONE 0xFF
    368 
    369 /* folder type */
    370 #define AVRC_FOLDER_TYPE_MIXED      0x00
    371 #define AVRC_FOLDER_TYPE_TITLES     0x01
    372 #define AVRC_FOLDER_TYPE_ALNUMS     0x02
    373 #define AVRC_FOLDER_TYPE_ARTISTS    0x03
    374 #define AVRC_FOLDER_TYPE_GENRES     0x04
    375 #define AVRC_FOLDER_TYPE_PLAYLISTS  0x05
    376 #define AVRC_FOLDER_TYPE_YEARS      0x06
    377 
    378 /* major player type */
    379 #define AVRC_MJ_TYPE_AUDIO          0x01  /* Audio */
    380 #define AVRC_MJ_TYPE_VIDEO          0x02  /* Video */
    381 #define AVRC_MJ_TYPE_BC_AUDIO       0x04  /* Broadcasting Audio */
    382 #define AVRC_MJ_TYPE_BC_VIDEO       0x08  /* Broadcasting Video */
    383 #define AVRC_MJ_TYPE_INVALID        0xF0
    384 
    385 /* player sub type */
    386 #define AVRC_SUB_TYPE_NONE          0x00
    387 #define AVRC_SUB_TYPE_AUDIO_BOOK    0x01  /* Audio Book */
    388 #define AVRC_SUB_TYPE_PODCAST       0x02  /* Podcast */
    389 #define AVRC_SUB_TYPE_INVALID       0xFC
    390 
    391 /* media item - media type */
    392 #define AVRC_MEDIA_TYPE_AUDIO       0x00
    393 #define AVRC_MEDIA_TYPE_VIDEO       0x01
    394 
    395 #define AVRC_DIR_UP                 0x00  /* Folder Up */
    396 #define AVRC_DIR_DOWN               0x01  /* Folder Down */
    397 
    398 #define AVRC_UID_SIZE               8
    399 typedef UINT8 tAVRC_UID[AVRC_UID_SIZE];
    400 
    401 /*****************************************************************************
    402 **  player attribute - supported features
    403 *****************************************************************************/
    404 #define AVRC_PF_SELECT_BIT_NO           0
    405 #define AVRC_PF_SELECT_MASK             0x01
    406 #define AVRC_PF_SELECT_OFF              0
    407 #define AVRC_PF_SELECT_SUPPORTED(x)     ((x)[AVRC_PF_SELECT_OFF] & AVRC_PF_SELECT_MASK)
    408 
    409 #define AVRC_PF_UP_BIT_NO               1
    410 #define AVRC_PF_UP_MASK                 0x02
    411 #define AVRC_PF_UP_OFF                  0
    412 #define AVRC_PF_UP_SUPPORTED(x)         ((x)[AVRC_PF_UP_OFF] & AVRC_PF_UP_MASK)
    413 
    414 #define AVRC_PF_DOWN_BIT_NO             2
    415 #define AVRC_PF_DOWN_MASK               0x04
    416 #define AVRC_PF_DOWN_OFF                0
    417 #define AVRC_PF_DOWN_SUPPORTED(x)       ((x)[AVRC_PF_DOWN_OFF] & AVRC_PF_DOWN_MASK)
    418 
    419 #define AVRC_PF_LEFT_BIT_NO             3
    420 #define AVRC_PF_LEFT_MASK               0x08
    421 #define AVRC_PF_LEFT_OFF                0
    422 #define AVRC_PF_LEFT_SUPPORTED(x)       ((x)[AVRC_PF_LEFT_OFF] & AVRC_PF_LEFT_MASK)
    423 
    424 #define AVRC_PF_RIGHT_BIT_NO            4
    425 #define AVRC_PF_RIGHT_MASK              0x10
    426 #define AVRC_PF_RIGHT_OFF               0
    427 #define AVRC_PF_RIGHT_SUPPORTED(x)      ((x)[AVRC_PF_RIGHT_OFF] & AVRC_PF_RIGHT_MASK)
    428 
    429 #define AVRC_PF_RIGHTUP_BIT_NO          5
    430 #define AVRC_PF_RIGHTUP_MASK            0x20
    431 #define AVRC_PF_RIGHTUP_OFF             0
    432 #define AVRC_PF_RIGHTUP_SUPPORTED(x)    ((x)[AVRC_PF_RIGHTUP_OFF] & AVRC_PF_RIGHTUP_MASK)
    433 
    434 #define AVRC_PF_RIGHTDOWN_BIT_NO        6
    435 #define AVRC_PF_RIGHTDOWN_MASK          0x40
    436 #define AVRC_PF_RIGHTDOWN_OFF           0
    437 #define AVRC_PF_RIGHTDOWN_SUPPORTED(x)  ((x)[AVRC_PF_RIGHTDOWN_OFF] & AVRC_PF_RIGHTDOWN_MASK)
    438 
    439 #define AVRC_PF_LEFTUP_BIT_NO           7
    440 #define AVRC_PF_LEFTUP_MASK             0x80
    441 #define AVRC_PF_LEFTUP_OFF              0
    442 #define AVRC_PF_LEFTUP_SUPPORTED(x)     ((x)[AVRC_PF_LEFTUP_OFF] & AVRC_PF_LEFTUP_MASK)
    443 
    444 #define AVRC_PF_LEFTDOWN_BIT_NO         8
    445 #define AVRC_PF_LEFTDOWN_MASK           0x01
    446 #define AVRC_PF_LEFTDOWN_OFF            1
    447 #define AVRC_PF_LEFTDOWN_SUPPORTED(x)   ((x)[AVRC_PF_LEFTDOWN_OFF] & AVRC_PF_LEFTDOWN_MASK)
    448 
    449 #define AVRC_PF_ROOT_MENU_BIT_NO        9
    450 #define AVRC_PF_ROOT_MENU_MASK          0x02
    451 #define AVRC_PF_ROOT_MENU_OFF           1
    452 #define AVRC_PF_ROOT_MENU_SUPPORTED(x)  ((x)[AVRC_PF_ROOT_MENU_OFF] & AVRC_PF_ROOT_MENU_MASK)
    453 
    454 #define AVRC_PF_SETUP_MENU_BIT_NO       10
    455 #define AVRC_PF_SETUP_MENU_MASK         0x04
    456 #define AVRC_PF_SETUP_MENU_OFF          1
    457 #define AVRC_PF_SETUP_MENU_SUPPORTED(x) ((x)[AVRC_PF_SETUP_MENU_OFF] & AVRC_PF_SETUP_MENU_MASK)
    458 
    459 #define AVRC_PF_CONTENTS_MENU_BIT_NO    11
    460 #define AVRC_PF_CONTENTS_MENU_MASK      0x08
    461 #define AVRC_PF_CONTENTS_MENU_OFF       1
    462 #define AVRC_PF_CONTENTS_MENU_SUPPORTED(x)  ((x)[AVRC_PF_CONTENTS_MENU_OFF] & AVRC_PF_CONTENTS_MENU_MASK)
    463 
    464 #define AVRC_PF_FAVORITE_MENU_BIT_NO    12
    465 #define AVRC_PF_FAVORITE_MENU_MASK      0x10
    466 #define AVRC_PF_FAVORITE_MENU_OFF       1
    467 #define AVRC_PF_FAVORITE_MENU_SUPPORTED(x)  ((x)[AVRC_PF_FAVORITE_MENU_OFF] & AVRC_PF_FAVORITE_MENU_MASK)
    468 
    469 #define AVRC_PF_EXIT_BIT_NO             13
    470 #define AVRC_PF_EXIT_MASK               0x20
    471 #define AVRC_PF_EXIT_OFF                1
    472 #define AVRC_PF_EXIT_SUPPORTED(x)       ((x)[AVRC_PF_EXIT_OFF] & AVRC_PF_EXIT_MASK)
    473 
    474 #define AVRC_PF_0_BIT_NO                14
    475 #define AVRC_PF_0_MASK                  0x40
    476 #define AVRC_PF_0_OFF                   1
    477 #define AVRC_PF_0_SUPPORTED(x)          ((x)[AVRC_PF_0_OFF] & AVRC_PF_0_MASK)
    478 
    479 #define AVRC_PF_1_BIT_NO                15
    480 #define AVRC_PF_1_MASK                  0x80
    481 #define AVRC_PF_1_OFF                   1
    482 #define AVRC_PF_1_SUPPORTED(x)          ((x)[AVRC_PF_1_OFF] & AVRC_PF_1_MASK)
    483 
    484 #define AVRC_PF_2_BIT_NO                16
    485 #define AVRC_PF_2_MASK                  0x01
    486 #define AVRC_PF_2_OFF                   2
    487 #define AVRC_PF_2_SUPPORTED(x)          ((x)[AVRC_PF_2_OFF] & AVRC_PF_2_MASK)
    488 
    489 #define AVRC_PF_3_BIT_NO                17
    490 #define AVRC_PF_3_MASK                  0x02
    491 #define AVRC_PF_3_OFF                   2
    492 #define AVRC_PF_3_SUPPORTED(x)          ((x)[AVRC_PF_3_OFF] & AVRC_PF_3_MASK)
    493 
    494 #define AVRC_PF_4_BIT_NO                18
    495 #define AVRC_PF_4_MASK                  0x04
    496 #define AVRC_PF_4_OFF                   2
    497 #define AVRC_PF_4_SUPPORTED(x)          ((x)[AVRC_PF_4_OFF] & AVRC_PF_4_MASK)
    498 
    499 #define AVRC_PF_5_BIT_NO                19
    500 #define AVRC_PF_5_MASK                  0x08
    501 #define AVRC_PF_5_OFF                   2
    502 #define AVRC_PF_5_SUPPORTED(x)          ((x)[AVRC_PF_5_OFF] & AVRC_PF_5_MASK)
    503 
    504 #define AVRC_PF_6_BIT_NO                20
    505 #define AVRC_PF_6_MASK                  0x10
    506 #define AVRC_PF_6_OFF                   2
    507 #define AVRC_PF_6_SUPPORTED(x)          ((x)[AVRC_PF_6_OFF] & AVRC_PF_6_MASK)
    508 
    509 #define AVRC_PF_7_BIT_NO                21
    510 #define AVRC_PF_7_MASK                  0x20
    511 #define AVRC_PF_7_OFF                   2
    512 #define AVRC_PF_7_SUPPORTED(x)          ((x)[AVRC_PF_7_OFF] & AVRC_PF_7_MASK)
    513 
    514 #define AVRC_PF_8_BIT_NO                22
    515 #define AVRC_PF_8_MASK                  0x40
    516 #define AVRC_PF_8_OFF                   2
    517 #define AVRC_PF_8_SUPPORTED(x)          ((x)[AVRC_PF_8_OFF] & AVRC_PF_8_MASK)
    518 
    519 #define AVRC_PF_9_BIT_NO                23
    520 #define AVRC_PF_9_MASK                  0x80
    521 #define AVRC_PF_9_OFF                   2
    522 #define AVRC_PF_9_SUPPORTED(x)          ((x)[AVRC_PF_9_OFF] & AVRC_PF_9_MASK)
    523 
    524 #define AVRC_PF_DOT_BIT_NO              24
    525 #define AVRC_PF_DOT_MASK                0x01
    526 #define AVRC_PF_DOT_OFF                 3
    527 #define AVRC_PF_DOT_SUPPORTED(x)        ((x)[AVRC_PF_DOT_OFF] & AVRC_PF_DOT_MASK)
    528 
    529 #define AVRC_PF_ENTER_BIT_NO            25
    530 #define AVRC_PF_ENTER_MASK              0x02
    531 #define AVRC_PF_ENTER_OFF               3
    532 #define AVRC_PF_ENTER_SUPPORTED(x)      ((x)[AVRC_PF_ENTER_OFF] & AVRC_PF_ENTER_MASK)
    533 
    534 #define AVRC_PF_CLEAR_BIT_NO            26
    535 #define AVRC_PF_CLEAR_MASK              0x04
    536 #define AVRC_PF_CLEAR_OFF               3
    537 #define AVRC_PF_CLEAR_SUPPORTED(x)      ((x)[AVRC_PF_CLEAR_OFF] & AVRC_PF_CLEAR_MASK)
    538 
    539 #define AVRC_PF_CHNL_UP_BIT_NO          27
    540 #define AVRC_PF_CHNL_UP_MASK            0x08
    541 #define AVRC_PF_CHNL_UP_OFF             3
    542 #define AVRC_PF_CHNL_UP_SUPPORTED(x)    ((x)[AVRC_PF_CHNL_UP_OFF] & AVRC_PF_CHNL_UP_MASK)
    543 
    544 #define AVRC_PF_CHNL_DOWN_BIT_NO        28
    545 #define AVRC_PF_CHNL_DOWN_MASK          0x10
    546 #define AVRC_PF_CHNL_DOWN_OFF           3
    547 #define AVRC_PF_CHNL_DOWN_SUPPORTED(x)  ((x)[AVRC_PF_CHNL_DOWN_OFF] & AVRC_PF_CHNL_DOWN_MASK)
    548 
    549 #define AVRC_PF_PREV_CHNL_BIT_NO        29
    550 #define AVRC_PF_PREV_CHNL_MASK          0x20
    551 #define AVRC_PF_PREV_CHNL_OFF           3
    552 #define AVRC_PF_PREV_CHNL_SUPPORTED(x)  ((x)[AVRC_PF_PREV_CHNL_OFF] & AVRC_PF_PREV_CHNL_MASK)
    553 
    554 #define AVRC_PF_SOUND_SEL_BIT_NO        30
    555 #define AVRC_PF_SOUND_SEL_MASK          0x40
    556 #define AVRC_PF_SOUND_SEL_OFF           3
    557 #define AVRC_PF_SOUND_SEL_SUPPORTED(x)  ((x)[AVRC_PF_SOUND_SEL_OFF] & AVRC_PF_SOUND_SEL_MASK)
    558 
    559 #define AVRC_PF_INPUT_SEL_BIT_NO        31
    560 #define AVRC_PF_INPUT_SEL_MASK          0x80
    561 #define AVRC_PF_INPUT_SEL_OFF           3
    562 #define AVRC_PF_INPUT_SEL_SUPPORTED(x)  ((x)[AVRC_PF_INPUT_SEL_OFF] & AVRC_PF_INPUT_SEL_MASK)
    563 
    564 #define AVRC_PF_DISP_INFO_BIT_NO        32
    565 #define AVRC_PF_DISP_INFO_MASK          0x01
    566 #define AVRC_PF_DISP_INFO_OFF           4
    567 #define AVRC_PF_DISP_INFO_SUPPORTED(x)  ((x)[AVRC_PF_DISP_INFO_OFF] & AVRC_PF_DISP_INFO_MASK)
    568 
    569 #define AVRC_PF_HELP_BIT_NO             33
    570 #define AVRC_PF_HELP_MASK               0x02
    571 #define AVRC_PF_HELP_OFF                4
    572 #define AVRC_PF_HELP_SUPPORTED(x)       ((x)[AVRC_PF_HELP_OFF] & AVRC_PF_HELP_MASK)
    573 
    574 #define AVRC_PF_PAGE_UP_BIT_NO          34
    575 #define AVRC_PF_PAGE_UP_MASK            0x04
    576 #define AVRC_PF_PAGE_UP_OFF             4
    577 #define AVRC_PF_PAGE_UP_SUPPORTED(x)    ((x)[AVRC_PF_PAGE_UP_OFF] & AVRC_PF_PAGE_UP_MASK)
    578 
    579 #define AVRC_PF_PAGE_DOWN_BIT_NO        35
    580 #define AVRC_PF_PAGE_DOWN_MASK          0x08
    581 #define AVRC_PF_PAGE_DOWN_OFF           4
    582 #define AVRC_PF_PAGE_DOWN_SUPPORTED(x)  ((x)[AVRC_PF_PAGE_DOWN_OFF] & AVRC_PF_PAGE_DOWN_MASK)
    583 
    584 #define AVRC_PF_POWER_BIT_NO            36
    585 #define AVRC_PF_POWER_MASK              0x10
    586 #define AVRC_PF_POWER_OFF               4
    587 #define AVRC_PF_POWER_SUPPORTED(x)      ((x)[AVRC_PF_POWER_OFF] & AVRC_PF_POWER_MASK)
    588 
    589 #define AVRC_PF_VOL_UP_BIT_NO           37
    590 #define AVRC_PF_VOL_UP_MASK             0x20
    591 #define AVRC_PF_VOL_UP_OFF              4
    592 #define AVRC_PF_VOL_UP_SUPPORTED(x)     ((x)[AVRC_PF_VOL_UP_OFF] & AVRC_PF_VOL_UP_MASK)
    593 
    594 #define AVRC_PF_VOL_DOWN_BIT_NO         38
    595 #define AVRC_PF_VOL_DOWN_MASK           0x40
    596 #define AVRC_PF_VOL_DOWN_OFF            4
    597 #define AVRC_PF_VOL_DOWN_SUPPORTED(x)   ((x)[AVRC_PF_VOL_DOWN_OFF] & AVRC_PF_VOL_DOWN_MASK)
    598 
    599 #define AVRC_PF_MUTE_BIT_NO             39
    600 #define AVRC_PF_MUTE_MASK               0x80
    601 #define AVRC_PF_MUTE_OFF                4
    602 #define AVRC_PF_MUTE_SUPPORTED(x)       ((x)[AVRC_PF_MUTE_OFF] & AVRC_PF_MUTE_MASK)
    603 
    604 #define AVRC_PF_PLAY_BIT_NO             40
    605 #define AVRC_PF_PLAY_MASK               0x01
    606 #define AVRC_PF_PLAY_OFF                5
    607 #define AVRC_PF_PLAY_SUPPORTED(x)       ((x)[AVRC_PF_PLAY_OFF] & AVRC_PF_PLAY_MASK)
    608 
    609 #define AVRC_PF_STOP_BIT_NO             41
    610 #define AVRC_PF_STOP_MASK               0x02
    611 #define AVRC_PF_STOP_OFF                5
    612 #define AVRC_PF_STOP_SUPPORTED(x)       ((x)[AVRC_PF_STOP_OFF] & AVRC_PF_STOP_MASK)
    613 
    614 #define AVRC_PF_PAUSE_BIT_NO            42
    615 #define AVRC_PF_PAUSE_MASK              0x04
    616 #define AVRC_PF_PAUSE_OFF               5
    617 #define AVRC_PF_PAUSE_SUPPORTED(x)      ((x)[AVRC_PF_PAUSE_OFF] & AVRC_PF_PAUSE_MASK)
    618 
    619 #define AVRC_PF_RECORD_BIT_NO           43
    620 #define AVRC_PF_RECORD_MASK             0x08
    621 #define AVRC_PF_RECORD_OFF              5
    622 #define AVRC_PF_RECORD_SUPPORTED(x)     ((x)[AVRC_PF_RECORD_OFF] & AVRC_PF_RECORD_MASK)
    623 
    624 #define AVRC_PF_REWIND_BIT_NO           44
    625 #define AVRC_PF_REWIND_MASK             0x10
    626 #define AVRC_PF_REWIND_OFF              5
    627 #define AVRC_PF_REWIND_SUPPORTED(x)     ((x)[AVRC_PF_REWIND_OFF] & AVRC_PF_REWIND_MASK)
    628 
    629 #define AVRC_PF_FAST_FWD_BIT_NO         45
    630 #define AVRC_PF_FAST_FWD_MASK           0x20
    631 #define AVRC_PF_FAST_FWD_OFF            5
    632 #define AVRC_PF_FAST_FWD_SUPPORTED(x)   ((x)[AVRC_PF_FAST_FWD_OFF] & AVRC_PF_FAST_FWD_MASK)
    633 
    634 #define AVRC_PF_EJECT_BIT_NO            46
    635 #define AVRC_PF_EJECT_MASK              0x40
    636 #define AVRC_PF_EJECT_OFF               5
    637 #define AVRC_PF_EJECT_SUPPORTED(x)      ((x)[AVRC_PF_EJECT_OFF] & AVRC_PF_EJECT_MASK)
    638 
    639 #define AVRC_PF_FORWARD_BIT_NO          47
    640 #define AVRC_PF_FORWARD_MASK            0x80
    641 #define AVRC_PF_FORWARD_OFF             5
    642 #define AVRC_PF_FORWARD_SUPPORTED(x)    ((x)[AVRC_PF_FORWARD_OFF] & AVRC_PF_FORWARD_MASK)
    643 
    644 #define AVRC_PF_BACKWARD_BIT_NO         48
    645 #define AVRC_PF_BACKWARD_MASK           0x01
    646 #define AVRC_PF_BACKWARD_OFF            6
    647 #define AVRC_PF_BACKWARD_SUPPORTED(x)   ((x)[AVRC_PF_BACKWARD_OFF] & AVRC_PF_BACKWARD_MASK)
    648 
    649 #define AVRC_PF_ANGLE_BIT_NO            49
    650 #define AVRC_PF_ANGLE_MASK              0x02
    651 #define AVRC_PF_ANGLE_OFF               6
    652 #define AVRC_PF_ANGLE_SUPPORTED(x)      ((x)[AVRC_PF_ANGLE_OFF] & AVRC_PF_ANGLE_MASK)
    653 
    654 #define AVRC_PF_SUBPICTURE_BIT_NO       50
    655 #define AVRC_PF_SUBPICTURE_MASK         0x04
    656 #define AVRC_PF_SUBPICTURE_OFF          6
    657 #define AVRC_PF_SUBPICTURE_SUPPORTED(x) ((x)[AVRC_PF_SUBPICTURE_OFF] & AVRC_PF_SUBPICTURE_MASK)
    658 
    659 #define AVRC_PF_F1_BIT_NO               51
    660 #define AVRC_PF_F1_MASK                 0x08
    661 #define AVRC_PF_F1_OFF                  6
    662 #define AVRC_PF_F1_SUPPORTED(x)         ((x)[AVRC_PF_F1_OFF] & AVRC_PF_F1_MASK)
    663 
    664 #define AVRC_PF_F2_BIT_NO               52
    665 #define AVRC_PF_F2_MASK                 0x10
    666 #define AVRC_PF_F2_OFF                  6
    667 #define AVRC_PF_F2_SUPPORTED(x)         ((x)[AVRC_PF_F2_OFF] & AVRC_PF_F2_MASK)
    668 
    669 #define AVRC_PF_F3_BIT_NO               53
    670 #define AVRC_PF_F3_MASK                 0x20
    671 #define AVRC_PF_F3_OFF                  6
    672 #define AVRC_PF_F3_SUPPORTED(x)         ((x)[AVRC_PF_F3_OFF] & AVRC_PF_F3_MASK)
    673 
    674 #define AVRC_PF_F4_BIT_NO               54
    675 #define AVRC_PF_F4_MASK                 0x40
    676 #define AVRC_PF_F4_OFF                  6
    677 #define AVRC_PF_F4_SUPPORTED(x)         ((x)[AVRC_PF_F4_OFF] & AVRC_PF_F4_MASK)
    678 
    679 #define AVRC_PF_F5_BIT_NO               55
    680 #define AVRC_PF_F5_MASK                 0x80
    681 #define AVRC_PF_F5_OFF                  6
    682 #define AVRC_PF_F5_SUPPORTED(x)         ((x)[AVRC_PF_F5_OFF] & AVRC_PF_F5_MASK)
    683 
    684 /* Vendor unique. This PASSTHROUGH command is supported. */
    685 #define AVRC_PF_VENDOR_BIT_NO           56
    686 #define AVRC_PF_VENDOR_MASK             0x01
    687 #define AVRC_PF_VENDOR_OFF              7
    688 #define AVRC_PF_VENDOR_SUPPORTED(x)     ((x)[AVRC_PF_VENDOR_OFF] & AVRC_PF_VENDOR_MASK)
    689 
    690 /* Basic Group Navigation.  This overrules the SDP entry as it is set per player.7 */
    691 #define AVRC_PF_GROUP_NAVI_BIT_NO       57
    692 #define AVRC_PF_GROUP_NAVI_MASK         0x02
    693 #define AVRC_PF_GROUP_NAVI_OFF          7
    694 #define AVRC_PF_GROUP_NAVI_SUPPORTED(x) ((x)[AVRC_PF_GROUP_NAVI_OFF] & AVRC_PF_GROUP_NAVI_MASK)
    695 
    696 /* Advanced Control Player.  This bit is set if the player supports at least AVRCP 1.4. */
    697 #define AVRC_PF_ADV_CTRL_BIT_NO         58
    698 #define AVRC_PF_ADV_CTRL_MASK           0x04
    699 #define AVRC_PF_ADV_CTRL_OFF            7
    700 #define AVRC_PF_ADV_CTRL_SUPPORTED(x)   ((x)[AVRC_PF_ADV_CTRL_OFF] & AVRC_PF_ADV_CTRL_MASK)
    701 
    702 /* Browsing.  This bit is set if the player supports browsing. */
    703 #define AVRC_PF_BROWSE_BIT_NO           59
    704 #define AVRC_PF_BROWSE_MASK             0x08
    705 #define AVRC_PF_BROWSE_OFF              7
    706 #define AVRC_PF_BROWSE_SUPPORTED(x)     ((x)[AVRC_PF_BROWSE_OFF] & AVRC_PF_BROWSE_MASK)
    707 
    708 /* Searching. This bit is set if the player supports searching. */
    709 #define AVRC_PF_SEARCH_BIT_NO           60
    710 #define AVRC_PF_SEARCH_MASK             0x10
    711 #define AVRC_PF_SEARCH_OFF              7
    712 #define AVRC_PF_SEARCH_SUPPORTED(x)     ((x)[AVRC_PF_SEARCH_OFF] & AVRC_PF_SEARCH_MASK)
    713 
    714 /* AddToNowPlaying.  This bit is set if the player supports the AddToNowPlaying command. */
    715 #define AVRC_PF_ADD2NOWPLAY_BIT_NO      61
    716 #define AVRC_PF_ADD2NOWPLAY_MASK        0x20
    717 #define AVRC_PF_ADD2NOWPLAY_OFF         7
    718 #define AVRC_PF_ADD2NOWPLAY_SUPPORTED(x) ((x)[AVRC_PF_ADD2NOWPLAY_OFF] & AVRC_PF_ADD2NOWPLAY_MASK)
    719 
    720 /* UIDs unique in player browse tree.  This bit is set if the player is able to maintain unique UIDs across the player browse tree. */
    721 #define AVRC_PF_UID_UNIQUE_BIT_NO       62
    722 #define AVRC_PF_UID_UNIQUE_MASK         0x40
    723 #define AVRC_PF_UID_UNIQUE_OFF          7
    724 #define AVRC_PF_UID_UNIQUE_SUPPORTED(x) ((x)[AVRC_PF_UID_UNIQUE_OFF] & AVRC_PF_UID_UNIQUE_MASK)
    725 
    726 /* OnlyBrowsableWhenAddressed.  This bit is set if the player is only able to be browsed when it is set as the Addressed Player. */
    727 #define AVRC_PF_BR_WH_ADDR_BIT_NO       63
    728 #define AVRC_PF_BR_WH_ADDR_MASK         0x80
    729 #define AVRC_PF_BR_WH_ADDR_OFF          7
    730 #define AVRC_PF_BR_WH_ADDR_SUPPORTED(x) ((x)[AVRC_PF_BR_WH_ADDR_OFF] & AVRC_PF_BR_WH_ADDR_MASK)
    731 
    732 /* OnlySearchableWhenAddressed.  This bit is set if the player is only able to be searched when it is set as the Addressed player. */
    733 #define AVRC_PF_SEARCH_WH_ADDR_BIT_NO   64
    734 #define AVRC_PF_SEARCH_WH_ADDR_MASK     0x01
    735 #define AVRC_PF_SEARCH_WH_ADDR_OFF      8
    736 #define AVRC_PF_SEARCH_WH_ADDR_SUPPORTED(x) ((x)[AVRC_PF_SEARCH_WH_ADDR_OFF] & AVRC_PF_SEARCH_WH_ADDR_MASK)
    737 
    738 /* NowPlaying.  This bit is set if the player supports the NowPlaying folder.  Note that for all players that support browsing this bit shall be set */
    739 #define AVRC_PF_NOW_PLAY_BIT_NO         65
    740 #define AVRC_PF_NOW_PLAY_MASK           0x02
    741 #define AVRC_PF_NOW_PLAY_OFF            8
    742 #define AVRC_PF_NOW_PLAY_SUPPORTED(x)   ((x)[AVRC_PF_NOW_PLAY_OFF] & AVRC_PF_NOW_PLAY_MASK)
    743 
    744 /* UIDPersistency.  This bit is set if the Player is able to persist UID values between AVRCP Browse Reconnect */
    745 #define AVRC_PF_UID_PERSIST_BIT_NO      66
    746 #define AVRC_PF_UID_PERSIST_MASK        0x04
    747 #define AVRC_PF_UID_PERSIST_OFF         8
    748 #define AVRC_PF_UID_PERSIST_SUPPORTED(x) ((x)[AVRC_PF_UID_PERSIST_OFF] & AVRC_PF_UID_PERSIST_MASK)
    749 
    750 /*****************************************************************************
    751 **  data type definitions
    752 *****************************************************************************/
    753 
    754 /*
    755 This structure contains the header parameters of an AV/C message.
    756 */
    757 typedef struct
    758 {
    759     UINT8   ctype;          /* Command type.  */
    760     UINT8   subunit_type;   /* Subunit type. */
    761     UINT8   subunit_id;     /* Subunit ID.  This value is typically ignored in AVRCP,
    762                              * except for VENDOR DEPENDENT messages when the value is
    763                              * vendor-dependent.  Value range is 0-7. */
    764     UINT8   opcode;         /* Op Code (passthrough, vendor, etc) */
    765 } tAVRC_HDR;
    766 
    767 /* This structure contains a UNIT INFO message. */
    768 typedef struct
    769 {
    770     tAVRC_HDR   hdr;        /* Message header. */
    771     UINT32      company_id; /* Company identifier. */
    772     UINT8       unit_type;  /* Unit type.  Uses the same values as subunit type. */
    773     UINT8       unit;       /* This value is vendor dependent and typically zero.  */
    774 } tAVRC_MSG_UNIT;
    775 
    776 /* This structure contains a SUBUNIT INFO message. */
    777 typedef struct
    778 {
    779     tAVRC_HDR   hdr;        /* Message header. */
    780     UINT8       subunit_type[AVRC_SUB_TYPE_LEN];
    781                             /* Array containing subunit type values.  */
    782     BOOLEAN     panel;      /* TRUE if the panel subunit type is in the
    783                              * subunit_type array, FALSE otherwise. */
    784     UINT8       page;       /* Specifies which part of the subunit type table is
    785                              * returned.  For AVRCP it is typically zero.
    786                              * Value range is 0-7. */
    787 } tAVRC_MSG_SUB;
    788 
    789 /* This structure contains a VENDOR DEPENDENT message. */
    790 typedef struct
    791 {
    792     tAVRC_HDR   hdr;        /* Message header. */
    793     UINT32      company_id; /* Company identifier. */
    794     UINT8      *p_vendor_data;/* Pointer to vendor dependent data. */
    795     UINT16      vendor_len; /* Length in bytes of vendor dependent data. */
    796 } tAVRC_MSG_VENDOR;
    797 
    798 /* PASS THROUGH message structure */
    799 typedef struct
    800 {
    801     tAVRC_HDR   hdr;        /* hdr.ctype Unused.
    802                              * hdr.subunit_type Unused.
    803                              * hdr.subunit_id Unused. */
    804     UINT8       op_id;      /* Operation ID.  */
    805     UINT8       state;      /* Keypress state.  */
    806     UINT8      *p_pass_data;/* Pointer to data.  This parameter is only valid
    807                              * when the op_id is AVRC_ID_VENDOR.*/
    808     UINT8       pass_len;   /* Length in bytes of data. This parameter is only
    809                              * valid when the op_id is AVRC_ID_VENDOR.*/
    810 } tAVRC_MSG_PASS;
    811 
    812 /* Command/Response indicator. */
    813 #define AVRC_CMD            AVCT_CMD    /* Command message */
    814 #define AVRC_RSP            AVCT_RSP    /* Response message */
    815 
    816 /* Browsing channel message structure */
    817 typedef struct
    818 {
    819     tAVRC_HDR   hdr;            /* hdr.ctype AVRC_CMD or AVRC_RSP.
    820                                  * hdr.subunit_type Unused.
    821                                  * hdr.subunit_id Unused. */
    822     UINT8      *p_browse_data;  /* Pointer to data.  */
    823     UINT16      browse_len;     /* Length in bytes of data. */
    824     BT_HDR     *p_browse_pkt;   /* The GKI buffer received. Set to NULL, if the callback function wants to keep the buffer */
    825 } tAVRC_MSG_BROWSE;
    826 
    827 /* This is a union of all message type structures. */
    828 typedef union
    829 {
    830     tAVRC_HDR           hdr;    /* Message header. */
    831     tAVRC_MSG_UNIT      unit;   /* UNIT INFO message. */
    832     tAVRC_MSG_SUB       sub;    /* SUBUNIT INFO message. */
    833     tAVRC_MSG_VENDOR    vendor; /* VENDOR DEPENDENT message. */
    834     tAVRC_MSG_PASS      pass;   /* PASS THROUGH message. */
    835     tAVRC_MSG_BROWSE    browse; /* messages thru browsing channel */
    836 } tAVRC_MSG;
    837 
    838 /* macros */
    839 #define AVRC_IS_VALID_CAP_ID(a)           (((a == AVRC_CAP_COMPANY_ID) || (a == AVRC_CAP_EVENTS_SUPPORTED)) ? TRUE : FALSE)
    840 
    841 #define AVRC_IS_VALID_EVENT_ID(a)           (((a >= AVRC_EVT_PLAY_STATUS_CHANGE) && \
    842                                               (a <= AVRC_EVT_APP_SETTING_CHANGE)) ? TRUE : FALSE)
    843 
    844 #define AVRC_IS_VALID_ATTRIBUTE(a)          (((((a > 0) && a <= AVRC_PLAYER_SETTING_SCAN)) || \
    845 					      (a >= AVRC_PLAYER_SETTING_LOW_MENU_EXT)) ? TRUE : FALSE)
    846 
    847 #define AVRC_IS_VALID_MEDIA_ATTRIBUTE(a)    ((a >= AVRC_MEDIA_ATTR_ID_TITLE) && \
    848                                              (a <= AVRC_MEDIA_ATTR_ID_PLAYING_TIME) ? TRUE : FALSE)
    849 
    850 #define AVRC_IS_VALID_BATTERY_STATUS(a)    ((a <= AVRC_BATTERY_STATUS_FULL_CHARGE) ? TRUE : FALSE)
    851 
    852 #define AVRC_IS_VALID_SYSTEM_STATUS(a)    ((a <= AVRC_SYSTEMSTATE_PWR_UNPLUGGED) ? TRUE : FALSE)
    853 
    854 #define AVRC_IS_VALID_GROUP(a)    ((a <= AVRC_PDU_PREV_GROUP) ? TRUE : FALSE)
    855 
    856 /* Company ID is 24-bit integer We can not use the macros in bt_types.h */
    857 #define AVRC_CO_ID_TO_BE_STREAM(p, u32) {*(p)++ = (UINT8)((u32) >> 16); *(p)++ = (UINT8)((u32) >> 8); *(p)++ = (UINT8)(u32); }
    858 #define AVRC_BE_STREAM_TO_CO_ID(u32, p) {u32 = (((UINT32)(*((p) + 2))) + (((UINT32)(*((p) + 1))) << 8) + (((UINT32)(*(p))) << 16)); (p) += 3;}
    859 
    860 /*****************************************************************************
    861 **  data type definitions
    862 *****************************************************************************/
    863 #define AVRC_MAX_APP_ATTR_SIZE      16
    864 #define AVRC_MAX_CHARSET_SIZE       16
    865 #define AVRC_MAX_ELEM_ATTR_SIZE     8
    866 
    867 
    868 /*****************************************************************************
    869 **  Metadata transfer Building/Parsing definitions
    870 *****************************************************************************/
    871 
    872 typedef struct {
    873     UINT16              charset_id;
    874     UINT16              str_len;
    875     UINT8               *p_str;
    876 } tAVRC_FULL_NAME;
    877 
    878 typedef struct {
    879     UINT16              str_len;
    880     UINT8               *p_str;
    881 } tAVRC_NAME;
    882 
    883 
    884 #ifndef AVRC_CAP_MAX_NUM_COMP_ID
    885 #define AVRC_CAP_MAX_NUM_COMP_ID    4
    886 #endif
    887 
    888 #ifndef AVRC_CAP_MAX_NUM_EVT_ID
    889 #define AVRC_CAP_MAX_NUM_EVT_ID     16
    890 #endif
    891 
    892 typedef union
    893 {
    894     UINT32  company_id[AVRC_CAP_MAX_NUM_COMP_ID];
    895     UINT8   event_id[AVRC_CAP_MAX_NUM_EVT_ID];
    896 } tAVRC_CAPS_PARAM;
    897 
    898 typedef struct
    899 {
    900     UINT8   attr_id;
    901     UINT8   attr_val;
    902 } tAVRC_APP_SETTING;
    903 
    904 typedef struct
    905 {
    906     UINT8   attr_id;
    907     UINT16  charset_id;
    908     UINT8   str_len;
    909     UINT8   *p_str;
    910 } tAVRC_APP_SETTING_TEXT;
    911 
    912 typedef UINT8 tAVRC_FEATURE_MASK[AVRC_FEATURE_MASK_SIZE];
    913 
    914 typedef struct
    915 {
    916     UINT16              player_id;      /* A unique identifier for this media player.*/
    917     UINT8               major_type;     /* Use AVRC_MJ_TYPE_AUDIO, AVRC_MJ_TYPE_VIDEO, AVRC_MJ_TYPE_BC_AUDIO, or AVRC_MJ_TYPE_BC_VIDEO.*/
    918     UINT32              sub_type;       /* Use AVRC_SUB_TYPE_NONE, AVRC_SUB_TYPE_AUDIO_BOOK, or AVRC_SUB_TYPE_PODCAST*/
    919     UINT8               play_status;    /* Use AVRC_PLAYSTATE_STOPPED, AVRC_PLAYSTATE_PLAYING, AVRC_PLAYSTATE_PAUSED, AVRC_PLAYSTATE_FWD_SEEK,
    920                                             AVRC_PLAYSTATE_REV_SEEK, or AVRC_PLAYSTATE_ERROR*/
    921     tAVRC_FEATURE_MASK  features;       /* Supported feature bit mask*/
    922     tAVRC_FULL_NAME     name;           /* The player name, name length and character set id.*/
    923 } tAVRC_ITEM_PLAYER;
    924 
    925 typedef struct
    926 {
    927     tAVRC_UID           uid;            /* The uid of this folder */
    928     UINT8               type;           /* Use AVRC_FOLDER_TYPE_MIXED, AVRC_FOLDER_TYPE_TITLES,
    929                                            AVRC_FOLDER_TYPE_ALNUMS, AVRC_FOLDER_TYPE_ARTISTS, AVRC_FOLDER_TYPE_GENRES,
    930                                            AVRC_FOLDER_TYPE_PLAYLISTS, or AVRC_FOLDER_TYPE_YEARS.*/
    931     BOOLEAN             playable;       /* TRUE, if the folder can be played. */
    932     tAVRC_FULL_NAME     name;           /* The folder name, name length and character set id. */
    933 } tAVRC_ITEM_FOLDER;
    934 
    935 typedef struct
    936 {
    937     UINT32              attr_id;        /* Use AVRC_MEDIA_ATTR_ID_TITLE, AVRC_MEDIA_ATTR_ID_ARTIST, AVRC_MEDIA_ATTR_ID_ALBUM,
    938                                            AVRC_MEDIA_ATTR_ID_TRACK_NUM, AVRC_MEDIA_ATTR_ID_NUM_TRACKS,
    939                                            AVRC_MEDIA_ATTR_ID_GENRE, AVRC_MEDIA_ATTR_ID_PLAYING_TIME */
    940     tAVRC_FULL_NAME     name;           /* The attribute value, value length and character set id. */
    941 } tAVRC_ATTR_ENTRY;
    942 
    943 typedef struct
    944 {
    945     tAVRC_UID           uid;            /* The uid of this media element item */
    946     UINT8               type;           /* Use AVRC_MEDIA_TYPE_AUDIO or AVRC_MEDIA_TYPE_VIDEO. */
    947     tAVRC_FULL_NAME     name;           /* The media name, name length and character set id. */
    948     UINT8               attr_count;     /* The number of attributes in p_attr_list */
    949     tAVRC_ATTR_ENTRY*   p_attr_list;    /* Attribute entry list. */
    950 } tAVRC_ITEM_MEDIA;
    951 
    952 typedef struct
    953 {
    954     UINT8                   item_type;  /* AVRC_ITEM_PLAYER, AVRC_ITEM_FOLDER, or AVRC_ITEM_MEDIA */
    955     union
    956     {
    957         tAVRC_ITEM_PLAYER   player;     /* The properties of a media player item.*/
    958         tAVRC_ITEM_FOLDER   folder;     /* The properties of a folder item.*/
    959         tAVRC_ITEM_MEDIA    media;      /* The properties of a media item.*/
    960     } u;
    961 } tAVRC_ITEM;
    962 
    963 /* GetCapability */
    964 typedef struct
    965 {
    966     UINT8       pdu;
    967     tAVRC_STS   status;
    968     UINT8       opcode;         /* Op Code (assigned by AVRC_BldCommand according to pdu) */
    969     UINT8       capability_id;
    970 } tAVRC_GET_CAPS_CMD;
    971 
    972 /* ListPlayerAppValues */
    973 typedef struct
    974 {
    975     UINT8       pdu;
    976     tAVRC_STS   status;
    977     UINT8       opcode;         /* Op Code (assigned by AVRC_BldCommand according to pdu) */
    978     UINT8       attr_id;
    979 } tAVRC_LIST_APP_VALUES_CMD;
    980 
    981 /* GetCurAppValue */
    982 typedef struct
    983 {
    984     UINT8       pdu;
    985     tAVRC_STS   status;
    986     UINT8       opcode;         /* Op Code (assigned by AVRC_BldCommand according to pdu) */
    987     UINT8       num_attr;
    988     UINT8       attrs[AVRC_MAX_APP_ATTR_SIZE];
    989 } tAVRC_GET_CUR_APP_VALUE_CMD;
    990 
    991 /* SetAppValue */
    992 typedef struct
    993 {
    994     UINT8       pdu;
    995     tAVRC_STS   status;
    996     UINT8       opcode;         /* Op Code (assigned by AVRC_BldCommand according to pdu) */
    997     UINT8       num_val;
    998     tAVRC_APP_SETTING   *p_vals;
    999 } tAVRC_SET_APP_VALUE_CMD;
   1000 
   1001 /* GetAppAttrTxt */
   1002 typedef struct
   1003 {
   1004     UINT8       pdu;
   1005     tAVRC_STS   status;
   1006     UINT8       opcode;         /* Op Code (assigned by AVRC_BldCommand according to pdu) */
   1007     UINT8       num_attr;
   1008     UINT8       attrs[AVRC_MAX_APP_ATTR_SIZE];
   1009 } tAVRC_GET_APP_ATTR_TXT_CMD;
   1010 
   1011 /* GetAppValueTxt */
   1012 typedef struct
   1013 {
   1014     UINT8       pdu;
   1015     tAVRC_STS   status;
   1016     UINT8       opcode;         /* Op Code (assigned by AVRC_BldCommand according to pdu) */
   1017     UINT8       attr_id;
   1018     UINT8       num_val;
   1019     UINT8       vals[AVRC_MAX_APP_ATTR_SIZE];
   1020 } tAVRC_GET_APP_VAL_TXT_CMD;
   1021 
   1022 /* InformCharset */
   1023 typedef struct
   1024 {
   1025     UINT8       pdu;
   1026     tAVRC_STS   status;
   1027     UINT8       opcode;         /* Op Code (assigned by AVRC_BldCommand according to pdu) */
   1028     UINT8       num_id;
   1029     UINT16      charsets[AVRC_MAX_CHARSET_SIZE];
   1030 } tAVRC_INFORM_CHARSET_CMD;
   1031 
   1032 /* InformBatteryStatus */
   1033 typedef struct
   1034 {
   1035     UINT8       pdu;
   1036     tAVRC_STS   status;
   1037     UINT8       opcode;         /* Op Code (assigned by AVRC_BldCommand according to pdu) */
   1038     UINT8       battery_status;
   1039 } tAVRC_BATTERY_STATUS_CMD;
   1040 
   1041 /* GetElemAttrs */
   1042 typedef struct
   1043 {
   1044     UINT8       pdu;
   1045     tAVRC_STS   status;
   1046     UINT8       opcode;         /* Op Code (assigned by AVRC_BldCommand according to pdu) */
   1047     UINT8       num_attr;
   1048     UINT32      attrs[AVRC_MAX_ELEM_ATTR_SIZE];
   1049 } tAVRC_GET_ELEM_ATTRS_CMD;
   1050 
   1051 /* RegNotify */
   1052 typedef struct
   1053 {
   1054     UINT8       pdu;
   1055     tAVRC_STS   status;
   1056     UINT8       opcode;         /* Op Code (assigned by AVRC_BldCommand according to pdu) */
   1057     UINT8       event_id;
   1058     UINT32      param;
   1059 } tAVRC_REG_NOTIF_CMD;
   1060 
   1061 /* SetAddrPlayer */
   1062 typedef struct
   1063 {
   1064     UINT8       pdu;
   1065     tAVRC_STS   status;
   1066     UINT8       opcode;         /* Op Code (assigned by AVRC_BldCommand according to pdu) */
   1067     UINT16      player_id;
   1068 } tAVRC_SET_ADDR_PLAYER_CMD;
   1069 
   1070 /* SetBrowsedPlayer */
   1071 typedef struct
   1072 {
   1073     UINT8       pdu;
   1074     tAVRC_STS   status;
   1075     UINT8       opcode;         /* Op Code (assigned by AVRC_BldCommand according to pdu) */
   1076     UINT16      player_id;
   1077 } tAVRC_SET_BR_PLAYER_CMD;
   1078 
   1079 /* SetAbsVolume */
   1080 typedef struct
   1081 {
   1082     UINT8       pdu;
   1083     tAVRC_STS   status;
   1084     UINT8       opcode;         /* Op Code (assigned by AVRC_BldCommand according to pdu) */
   1085     UINT8       volume;
   1086 } tAVRC_SET_VOLUME_CMD;
   1087 
   1088 /* GetFolderItems */
   1089 typedef struct
   1090 {
   1091     UINT8       pdu;
   1092     tAVRC_STS   status;
   1093     UINT8       opcode;         /* Op Code (assigned by AVRC_BldCommand according to pdu) */
   1094     UINT8       scope;
   1095     UINT32      start_item;
   1096     UINT32      end_item;
   1097     UINT8       attr_count;
   1098     UINT32      *p_attr_list;
   1099 } tAVRC_GET_ITEMS_CMD;
   1100 
   1101 /* ChangePath */
   1102 typedef struct
   1103 {
   1104     UINT8       pdu;
   1105     tAVRC_STS   status;
   1106     UINT8       opcode;         /* Op Code (assigned by AVRC_BldCommand according to pdu) */
   1107     UINT16      uid_counter;
   1108     UINT8       direction;
   1109     tAVRC_UID   folder_uid;
   1110 } tAVRC_CHG_PATH_CMD;
   1111 
   1112 /* GetItemAttrs */
   1113 typedef struct
   1114 {
   1115     UINT8       pdu;
   1116     tAVRC_STS   status;
   1117     UINT8       opcode;         /* Op Code (assigned by AVRC_BldCommand according to pdu) */
   1118     UINT8       scope;
   1119     tAVRC_UID   uid;
   1120     UINT16      uid_counter;
   1121     UINT8       attr_count;
   1122     UINT32      *p_attr_list;
   1123 } tAVRC_GET_ATTRS_CMD;
   1124 
   1125 /* Search */
   1126 typedef struct
   1127 {
   1128     UINT8           pdu;
   1129     tAVRC_STS       status;
   1130     UINT8           opcode;         /* Op Code (assigned by AVRC_BldCommand according to pdu) */
   1131     tAVRC_FULL_NAME string;
   1132 } tAVRC_SEARCH_CMD;
   1133 
   1134 /* PlayItem */
   1135 typedef struct
   1136 {
   1137     UINT8       pdu;
   1138     tAVRC_STS   status;
   1139     UINT8       opcode;         /* Op Code (assigned by AVRC_BldCommand according to pdu) */
   1140     UINT8       scope;
   1141     tAVRC_UID   uid;
   1142     UINT16      uid_counter;
   1143 } tAVRC_PLAY_ITEM_CMD;
   1144 
   1145 /* AddToNowPlaying */
   1146 typedef struct
   1147 {
   1148     UINT8       pdu;
   1149     tAVRC_STS   status;
   1150     UINT8       opcode;         /* Op Code (assigned by AVRC_BldCommand according to pdu) */
   1151     UINT8       scope;
   1152     tAVRC_UID   uid;
   1153     UINT16      uid_counter;
   1154 } tAVRC_ADD_TO_PLAY_CMD;
   1155 
   1156 typedef struct
   1157 {
   1158     UINT8       pdu;
   1159     tAVRC_STS   status;
   1160     UINT8       opcode;         /* Op Code (assigned by AVRC_BldCommand according to pdu) */
   1161 } tAVRC_CMD;
   1162 
   1163 /* Continue and Abort */
   1164 typedef struct
   1165 {
   1166     UINT8       pdu;
   1167     tAVRC_STS   status;
   1168     UINT8       opcode;         /* Op Code (assigned by AVRC_BldCommand according to pdu) */
   1169     UINT8       target_pdu;
   1170 } tAVRC_NEXT_CMD;
   1171 
   1172 typedef union
   1173 {
   1174     UINT8                       pdu;
   1175     tAVRC_CMD                   cmd;
   1176     tAVRC_GET_CAPS_CMD          get_caps;               /* GetCapability */
   1177     tAVRC_CMD                   list_app_attr;          /* ListPlayerAppAttr */
   1178     tAVRC_LIST_APP_VALUES_CMD   list_app_values;        /* ListPlayerAppValues */
   1179     tAVRC_GET_CUR_APP_VALUE_CMD get_cur_app_val;        /* GetCurAppValue */
   1180     tAVRC_SET_APP_VALUE_CMD     set_app_val;            /* SetAppValue */
   1181     tAVRC_GET_APP_ATTR_TXT_CMD  get_app_attr_txt;       /* GetAppAttrTxt */
   1182     tAVRC_GET_APP_VAL_TXT_CMD   get_app_val_txt;        /* GetAppValueTxt */
   1183     tAVRC_INFORM_CHARSET_CMD    inform_charset;         /* InformCharset */
   1184     tAVRC_BATTERY_STATUS_CMD    inform_battery_status;  /* InformBatteryStatus */
   1185     tAVRC_GET_ELEM_ATTRS_CMD    get_elem_attrs;         /* GetElemAttrs */
   1186     tAVRC_CMD                   get_play_status;        /* GetPlayStatus */
   1187     tAVRC_REG_NOTIF_CMD         reg_notif;              /* RegNotify */
   1188     tAVRC_NEXT_CMD              continu;                /* Continue */
   1189     tAVRC_NEXT_CMD              abort;                  /* Abort */
   1190 
   1191     tAVRC_SET_ADDR_PLAYER_CMD   addr_player;            /* SetAddrPlayer */
   1192     tAVRC_SET_VOLUME_CMD        volume;                 /* SetAbsVolume */
   1193     tAVRC_SET_BR_PLAYER_CMD     br_player;              /* SetBrowsedPlayer */
   1194     tAVRC_GET_ITEMS_CMD         get_items;              /* GetFolderItems */
   1195     tAVRC_CHG_PATH_CMD          chg_path;               /* ChangePath */
   1196     tAVRC_GET_ATTRS_CMD         get_attrs;              /* GetItemAttrs */
   1197     tAVRC_SEARCH_CMD            search;                 /* Search */
   1198     tAVRC_PLAY_ITEM_CMD         play_item;              /* PlayItem */
   1199     tAVRC_ADD_TO_PLAY_CMD       add_to_play;            /* AddToNowPlaying */
   1200 } tAVRC_COMMAND;
   1201 
   1202 /* GetCapability */
   1203 typedef struct
   1204 {
   1205     UINT8       pdu;
   1206     tAVRC_STS   status;
   1207     UINT8       opcode;         /* Op Code (copied from avrc_cmd.opcode by AVRC_BldResponse user. invalid one to generate according to pdu) */
   1208     UINT8       capability_id;
   1209     UINT8       count;
   1210     tAVRC_CAPS_PARAM param;
   1211 } tAVRC_GET_CAPS_RSP;
   1212 
   1213 /* ListPlayerAppAttr */
   1214 typedef struct
   1215 {
   1216     UINT8       pdu;
   1217     tAVRC_STS   status;
   1218     UINT8       opcode;         /* Op Code (copied from avrc_cmd.opcode by AVRC_BldResponse user. invalid one to generate according to pdu) */
   1219     UINT8       num_attr;
   1220     UINT8       attrs[AVRC_MAX_APP_ATTR_SIZE];
   1221 } tAVRC_LIST_APP_ATTR_RSP;
   1222 
   1223 /* ListPlayerAppValues */
   1224 typedef struct
   1225 {
   1226     UINT8       pdu;
   1227     tAVRC_STS   status;
   1228     UINT8       opcode;         /* Op Code (copied from avrc_cmd.opcode by AVRC_BldResponse user. invalid one to generate according to pdu) */
   1229     UINT8       num_val;
   1230     UINT8       vals[AVRC_MAX_APP_ATTR_SIZE];
   1231 } tAVRC_LIST_APP_VALUES_RSP;
   1232 
   1233 /* GetCurAppValue */
   1234 typedef struct
   1235 {
   1236     UINT8       pdu;
   1237     tAVRC_STS   status;
   1238     UINT8       opcode;         /* Op Code (copied from avrc_cmd.opcode by AVRC_BldResponse user. invalid one to generate according to pdu) */
   1239     UINT8       num_val;
   1240     tAVRC_APP_SETTING   *p_vals;
   1241 } tAVRC_GET_CUR_APP_VALUE_RSP;
   1242 
   1243 /* GetAppAttrTxt */
   1244 typedef struct
   1245 {
   1246     UINT8       pdu;
   1247     tAVRC_STS   status;
   1248     UINT8       opcode;         /* Op Code (copied from avrc_cmd.opcode by AVRC_BldResponse user. invalid one to generate according to pdu) */
   1249     UINT8       num_attr;
   1250     tAVRC_APP_SETTING_TEXT   *p_attrs;
   1251 } tAVRC_GET_APP_ATTR_TXT_RSP;
   1252 
   1253 /* GetElemAttrs */
   1254 typedef struct
   1255 {
   1256     UINT8       pdu;
   1257     tAVRC_STS   status;
   1258     UINT8       opcode;         /* Op Code (copied from avrc_cmd.opcode by AVRC_BldResponse user. invalid one to generate according to pdu) */
   1259     UINT8       num_attr;
   1260     tAVRC_ATTR_ENTRY   *p_attrs;
   1261 } tAVRC_GET_ELEM_ATTRS_RSP;
   1262 
   1263 /* GetPlayStatus */
   1264 typedef struct
   1265 {
   1266     UINT8       pdu;
   1267     tAVRC_STS   status;
   1268     UINT8       opcode;         /* Op Code (copied from avrc_cmd.opcode by AVRC_BldResponse user. invalid one to generate according to pdu) */
   1269     UINT32      song_len;
   1270     UINT32      song_pos;
   1271     UINT8       play_status;
   1272 } tAVRC_GET_PLAY_STATUS_RSP;
   1273 
   1274 /* notification event parameter for AddressedPlayer change */
   1275 typedef struct
   1276 {
   1277     UINT16              player_id;
   1278     UINT16              uid_counter;
   1279 } tAVRC_ADDR_PLAYER_PARAM;
   1280 
   1281 #ifndef AVRC_MAX_APP_SETTINGS
   1282 #define AVRC_MAX_APP_SETTINGS    8
   1283 #endif
   1284 
   1285 /* notification event parameter for Player Application setting change */
   1286 typedef struct
   1287 {
   1288     UINT8               num_attr;
   1289     UINT8               attr_id[AVRC_MAX_APP_SETTINGS];
   1290     UINT8               attr_value[AVRC_MAX_APP_SETTINGS];
   1291 } tAVRC_PLAYER_APP_PARAM;
   1292 
   1293 typedef union
   1294 {
   1295     tAVRC_PLAYSTATE         play_status;
   1296     tAVRC_UID               track;
   1297     UINT32                  play_pos;
   1298     tAVRC_BATTERY_STATUS    battery_status;
   1299     tAVRC_SYSTEMSTATE       system_status;
   1300     tAVRC_PLAYER_APP_PARAM  player_setting;
   1301     tAVRC_ADDR_PLAYER_PARAM addr_player;
   1302     UINT16                  uid_counter;
   1303     UINT8                   volume;
   1304 } tAVRC_NOTIF_RSP_PARAM;
   1305 
   1306 /* RegNotify */
   1307 typedef struct
   1308 {
   1309     UINT8                   pdu;
   1310     tAVRC_STS               status;
   1311     UINT8                   opcode;         /* Op Code (copied from avrc_cmd.opcode by AVRC_BldResponse user. invalid one to generate according to pdu) */
   1312     UINT8                   event_id;
   1313     tAVRC_NOTIF_RSP_PARAM   param;
   1314 } tAVRC_REG_NOTIF_RSP;
   1315 
   1316 /* SetAbsVolume */
   1317 typedef struct
   1318 {
   1319     UINT8               pdu;
   1320     tAVRC_STS           status;
   1321     UINT8               opcode;         /* Op Code (copied from avrc_cmd.opcode by AVRC_BldResponse user. invalid one to generate according to pdu) */
   1322     UINT8               volume;
   1323 } tAVRC_SET_VOLUME_RSP;
   1324 
   1325 /* SetBrowsedPlayer */
   1326 typedef struct
   1327 {
   1328     UINT8               pdu;
   1329     tAVRC_STS           status;
   1330     UINT8               opcode;         /* Op Code (copied from avrc_cmd.opcode by AVRC_BldResponse user. invalid one to generate according to pdu) */
   1331     UINT16              uid_counter;
   1332     UINT32              num_items;
   1333     UINT16              charset_id;
   1334     UINT8               folder_depth;
   1335     tAVRC_NAME          *p_folders;
   1336 } tAVRC_SET_BR_PLAYER_RSP;
   1337 
   1338 /* GetFolderItems */
   1339 typedef struct
   1340 {
   1341     UINT8               pdu;
   1342     tAVRC_STS           status;
   1343     UINT8               opcode;         /* Op Code (copied from avrc_cmd.opcode by AVRC_BldResponse user. invalid one to generate according to pdu) */
   1344     UINT16              uid_counter;
   1345     UINT16              item_count;
   1346     tAVRC_ITEM          *p_item_list;
   1347 } tAVRC_GET_ITEMS_RSP;
   1348 
   1349 /* ChangePath */
   1350 typedef struct
   1351 {
   1352     UINT8               pdu;
   1353     tAVRC_STS           status;
   1354     UINT8               opcode;         /* Op Code (copied from avrc_cmd.opcode by AVRC_BldResponse user. invalid one to generate according to pdu) */
   1355     UINT32              num_items;
   1356 } tAVRC_CHG_PATH_RSP;
   1357 
   1358 /* GetItemAttrs */
   1359 typedef struct
   1360 {
   1361     UINT8               pdu;
   1362     tAVRC_STS           status;
   1363     UINT8               opcode;         /* Op Code (copied from avrc_cmd.opcode by AVRC_BldResponse user. invalid one to generate according to pdu) */
   1364     UINT8               attr_count;
   1365     tAVRC_ATTR_ENTRY    *p_attr_list;
   1366 } tAVRC_GET_ATTRS_RSP;
   1367 
   1368 /* Search */
   1369 typedef struct
   1370 {
   1371     UINT8               pdu;
   1372     tAVRC_STS           status;
   1373     UINT8               opcode;         /* Op Code (copied from avrc_cmd.opcode by AVRC_BldResponse user. invalid one to generate according to pdu) */
   1374     UINT16              uid_counter;
   1375     UINT32              num_items;
   1376 } tAVRC_SEARCH_RSP;
   1377 
   1378 
   1379 typedef struct
   1380 {
   1381     UINT8       pdu;
   1382     tAVRC_STS   status;
   1383     UINT8       opcode;         /* Op Code (copied from avrc_cmd.opcode by AVRC_BldResponse user. invalid one to generate according to pdu) */
   1384 } tAVRC_RSP;
   1385 
   1386 typedef union
   1387 {
   1388     UINT8                           pdu;
   1389     tAVRC_RSP                       rsp;
   1390     tAVRC_GET_CAPS_RSP              get_caps;               /* GetCapability */
   1391     tAVRC_LIST_APP_ATTR_RSP         list_app_attr;          /* ListPlayerAppAttr */
   1392     tAVRC_LIST_APP_VALUES_RSP       list_app_values;        /* ListPlayerAppValues */
   1393     tAVRC_GET_CUR_APP_VALUE_RSP     get_cur_app_val;        /* GetCurAppValue */
   1394     tAVRC_RSP                       set_app_val;            /* SetAppValue */
   1395     tAVRC_GET_APP_ATTR_TXT_RSP      get_app_attr_txt;       /* GetAppAttrTxt */
   1396     tAVRC_GET_APP_ATTR_TXT_RSP      get_app_val_txt;        /* GetAppValueTxt */
   1397     tAVRC_RSP                       inform_charset;         /* InformCharset */
   1398     tAVRC_RSP                       inform_battery_status;  /* InformBatteryStatus */
   1399     tAVRC_GET_ELEM_ATTRS_RSP        get_elem_attrs;         /* GetElemAttrs */
   1400     tAVRC_GET_PLAY_STATUS_RSP       get_play_status;        /* GetPlayStatus */
   1401     tAVRC_REG_NOTIF_RSP             reg_notif;              /* RegNotify */
   1402     tAVRC_RSP                       continu;                /* Continue */
   1403     tAVRC_RSP                       abort;                  /* Abort */
   1404 
   1405     tAVRC_RSP                       addr_player;            /* SetAddrPlayer */
   1406     tAVRC_SET_VOLUME_RSP            volume;                 /* SetAbsVolume */
   1407     tAVRC_SET_BR_PLAYER_RSP         br_player;              /* SetBrowsedPlayer */
   1408     tAVRC_GET_ITEMS_RSP             get_items;              /* GetFolderItems */
   1409     tAVRC_CHG_PATH_RSP              chg_path;               /* ChangePath */
   1410     tAVRC_GET_ATTRS_RSP             get_attrs;              /* GetItemAttrs */
   1411     tAVRC_SEARCH_RSP                search;                 /* Search */
   1412     tAVRC_RSP                       play_item;              /* PlayItem */
   1413     tAVRC_RSP                       add_to_play;            /* AddToNowPlaying */
   1414 } tAVRC_RESPONSE;
   1415 
   1416 
   1417 #endif
   1418