1 /* 2 * Copyright (C) 2012 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 #ifndef ANDROID_INCLUDE_BT_RC_H 18 #define ANDROID_INCLUDE_BT_RC_H 19 20 #include "types/raw_address.h" 21 __BEGIN_DECLS 22 23 /* Change this macro to use multiple RC */ 24 #define BT_RC_NUM_APP 6 25 26 /* Macros */ 27 #define BTRC_MAX_ATTR_STR_LEN (1 << 16) 28 #define BTRC_UID_SIZE 8 29 #define BTRC_MAX_APP_SETTINGS 8 30 #define BTRC_MAX_FOLDER_DEPTH 4 31 #define BTRC_MAX_APP_ATTR_SIZE 16 32 #define BTRC_MAX_ELEM_ATTR_SIZE 8 33 #define BTRC_FEATURE_BIT_MASK_SIZE 16 34 35 /* Macros for valid scopes in get_folder_items */ 36 #define BTRC_SCOPE_PLAYER_LIST 0x00 /* Media Player List */ 37 #define BTRC_SCOPE_FILE_SYSTEM 0x01 /* Virtual File System */ 38 #define BTRC_SCOPE_SEARCH 0x02 /* Search */ 39 #define BTRC_SCOPE_NOW_PLAYING 0x03 /* Now Playing */ 40 41 /* Macros for supported character encoding */ 42 #define BTRC_CHARSET_ID_UTF8 0x006A 43 44 /* Macros for item types */ 45 #define BTRC_ITEM_PLAYER 0x01 /* Media Player */ 46 #define BTRC_ITEM_FOLDER 0x02 /* Folder */ 47 #define BTRC_ITEM_MEDIA 0x03 /* Media File */ 48 49 /* Macros for media attribute IDs */ 50 #define BTRC_MEDIA_ATTR_ID_INVALID -1 51 #define BTRC_MEDIA_ATTR_ID_TITLE 0x00000001 52 #define BTRC_MEDIA_ATTR_ID_ARTIST 0x00000002 53 #define BTRC_MEDIA_ATTR_ID_ALBUM 0x00000003 54 #define BTRC_MEDIA_ATTR_ID_TRACK_NUM 0x00000004 55 #define BTRC_MEDIA_ATTR_ID_NUM_TRACKS 0x00000005 56 #define BTRC_MEDIA_ATTR_ID_GENRE 0x00000006 57 #define BTRC_MEDIA_ATTR_ID_PLAYING_TIME 0x00000007 /* in miliseconds */ 58 #define BTRC_MEDIA_ATTR_ID_COVER_ARTWORK_HANDLE 0x00000008 59 60 /* Macros for folder types */ 61 #define BTRC_FOLDER_TYPE_MIXED 0x00 62 #define BTRC_FOLDER_TYPE_TITLES 0x01 63 #define BTRC_FOLDER_TYPE_ALBUMS 0x02 64 #define BTRC_FOLDER_TYPE_ARTISTS 0x03 65 #define BTRC_FOLDER_TYPE_GENRES 0x04 66 #define BTRC_FOLDER_TYPE_PLAYLISTS 0x05 67 #define BTRC_FOLDER_TYPE_YEARS 0x06 68 69 /* Macros for media types */ 70 #define BTRC_MEDIA_TYPE_AUDIO 0x00 /* audio */ 71 #define BTRC_MEDIA_TYPE_VIDEO 0x01 /* video */ 72 73 /* Macros for num attributes */ 74 #define BTRC_NUM_ATTR_NONE 0xFF /* No attributes required */ 75 #define BTRC_NUM_ATTR_ALL 0X00 /* All attributes required */ 76 77 #define BTRC_HANDLE_NONE 0xFF 78 79 typedef uint8_t btrc_uid_t[BTRC_UID_SIZE]; 80 81 typedef enum { 82 BTRC_CONNECTION_STATE_DISCONNECTED = 0, 83 BTRC_CONNECTION_STATE_CONNECTED 84 } btrc_connection_state_t; 85 86 typedef enum { 87 BTRC_FEAT_NONE = 0x00, /* AVRCP 1.0 */ 88 BTRC_FEAT_METADATA = 0x01, /* AVRCP 1.3 */ 89 BTRC_FEAT_ABSOLUTE_VOLUME = 0x02, /* Supports TG role and volume sync */ 90 BTRC_FEAT_BROWSE = 0x04, /* AVRCP 1.4 and up, with Browsing support */ 91 BTRC_FEAT_COVER_ARTWORK = 0x8, /* AVRCP 1.6 and up, Cover Art */ 92 } btrc_remote_features_t; 93 94 typedef enum { 95 BTRC_PLAYSTATE_STOPPED = 0x00, /* Stopped */ 96 BTRC_PLAYSTATE_PLAYING = 0x01, /* Playing */ 97 BTRC_PLAYSTATE_PAUSED = 0x02, /* Paused */ 98 BTRC_PLAYSTATE_FWD_SEEK = 0x03, /* Fwd Seek*/ 99 BTRC_PLAYSTATE_REV_SEEK = 0x04, /* Rev Seek*/ 100 BTRC_PLAYSTATE_ERROR = 0xFF, /* Error */ 101 } btrc_play_status_t; 102 103 typedef enum { 104 BTRC_EVT_PLAY_STATUS_CHANGED = 0x01, 105 BTRC_EVT_TRACK_CHANGE = 0x02, 106 BTRC_EVT_TRACK_REACHED_END = 0x03, 107 BTRC_EVT_TRACK_REACHED_START = 0x04, 108 BTRC_EVT_PLAY_POS_CHANGED = 0x05, 109 BTRC_EVT_APP_SETTINGS_CHANGED = 0x08, 110 BTRC_EVT_NOW_PLAYING_CONTENT_CHANGED = 0x09, 111 BTRC_EVT_AVAL_PLAYER_CHANGE = 0x0a, 112 BTRC_EVT_ADDR_PLAYER_CHANGE = 0x0b, 113 BTRC_EVT_UIDS_CHANGED = 0x0c, 114 BTRC_EVT_VOL_CHANGED = 0x0d, 115 } btrc_event_id_t; 116 117 typedef enum { 118 BTRC_NOTIFICATION_TYPE_INTERIM = 0, 119 BTRC_NOTIFICATION_TYPE_CHANGED = 1, 120 } btrc_notification_type_t; 121 122 typedef enum { 123 BTRC_PLAYER_ATTR_EQUALIZER = 0x01, 124 BTRC_PLAYER_ATTR_REPEAT = 0x02, 125 BTRC_PLAYER_ATTR_SHUFFLE = 0x03, 126 BTRC_PLAYER_ATTR_SCAN = 0x04, 127 } btrc_player_attr_t; 128 129 typedef enum { 130 BTRC_MEDIA_ATTR_TITLE = 0x01, 131 BTRC_MEDIA_ATTR_ARTIST = 0x02, 132 BTRC_MEDIA_ATTR_ALBUM = 0x03, 133 BTRC_MEDIA_ATTR_TRACK_NUM = 0x04, 134 BTRC_MEDIA_ATTR_NUM_TRACKS = 0x05, 135 BTRC_MEDIA_ATTR_GENRE = 0x06, 136 BTRC_MEDIA_ATTR_PLAYING_TIME = 0x07, 137 } btrc_media_attr_t; 138 139 typedef enum { 140 BTRC_PLAYER_VAL_OFF_REPEAT = 0x01, 141 BTRC_PLAYER_VAL_SINGLE_REPEAT = 0x02, 142 BTRC_PLAYER_VAL_ALL_REPEAT = 0x03, 143 BTRC_PLAYER_VAL_GROUP_REPEAT = 0x04 144 } btrc_player_repeat_val_t; 145 146 typedef enum { 147 BTRC_PLAYER_VAL_OFF_SHUFFLE = 0x01, 148 BTRC_PLAYER_VAL_ALL_SHUFFLE = 0x02, 149 BTRC_PLAYER_VAL_GROUP_SHUFFLE = 0x03 150 } btrc_player_shuffle_val_t; 151 152 typedef enum { 153 BTRC_STS_BAD_CMD = 0x00, /* Invalid command */ 154 BTRC_STS_BAD_PARAM = 0x01, /* Invalid parameter */ 155 BTRC_STS_NOT_FOUND = 0x02, /* Specified parameter is wrong or not found */ 156 BTRC_STS_INTERNAL_ERR = 0x03, /* Internal Error */ 157 BTRC_STS_NO_ERROR = 0x04, /* Operation Success */ 158 BTRC_STS_UID_CHANGED = 0x05, /* UIDs changed */ 159 BTRC_STS_RESERVED = 0x06, /* Reserved */ 160 BTRC_STS_INV_DIRN = 0x07, /* Invalid direction */ 161 BTRC_STS_INV_DIRECTORY = 0x08, /* Invalid directory */ 162 BTRC_STS_INV_ITEM = 0x09, /* Invalid Item */ 163 BTRC_STS_INV_SCOPE = 0x0a, /* Invalid scope */ 164 BTRC_STS_INV_RANGE = 0x0b, /* Invalid range */ 165 BTRC_STS_DIRECTORY = 0x0c, /* UID is a directory */ 166 BTRC_STS_MEDIA_IN_USE = 0x0d, /* Media in use */ 167 BTRC_STS_PLAY_LIST_FULL = 0x0e, /* Playing list full */ 168 BTRC_STS_SRCH_NOT_SPRTD = 0x0f, /* Search not supported */ 169 BTRC_STS_SRCH_IN_PROG = 0x10, /* Search in progress */ 170 BTRC_STS_INV_PLAYER = 0x11, /* Invalid player */ 171 BTRC_STS_PLAY_NOT_BROW = 0x12, /* Player not browsable */ 172 BTRC_STS_PLAY_NOT_ADDR = 0x13, /* Player not addressed */ 173 BTRC_STS_INV_RESULTS = 0x14, /* Invalid results */ 174 BTRC_STS_NO_AVBL_PLAY = 0x15, /* No available players */ 175 BTRC_STS_ADDR_PLAY_CHGD = 0x16, /* Addressed player changed */ 176 } btrc_status_t; 177 178 typedef struct { 179 uint8_t num_attr; 180 uint8_t attr_ids[BTRC_MAX_APP_SETTINGS]; 181 uint8_t attr_values[BTRC_MAX_APP_SETTINGS]; 182 } btrc_player_settings_t; 183 184 typedef struct { 185 uint8_t val; 186 uint16_t charset_id; 187 uint16_t str_len; 188 uint8_t* p_str; 189 } btrc_player_app_ext_attr_val_t; 190 191 typedef struct { 192 uint8_t attr_id; 193 uint16_t charset_id; 194 uint16_t str_len; 195 uint8_t* p_str; 196 uint8_t num_val; 197 btrc_player_app_ext_attr_val_t ext_attr_val[BTRC_MAX_APP_ATTR_SIZE]; 198 } btrc_player_app_ext_attr_t; 199 200 typedef struct { 201 uint8_t attr_id; 202 uint8_t num_val; 203 uint8_t attr_val[BTRC_MAX_APP_ATTR_SIZE]; 204 } btrc_player_app_attr_t; 205 206 typedef struct { 207 uint32_t attr_id; 208 uint8_t text[BTRC_MAX_ATTR_STR_LEN]; 209 } btrc_element_attr_val_t; 210 211 typedef struct { 212 uint16_t player_id; 213 uint8_t major_type; 214 uint32_t sub_type; 215 uint8_t play_status; 216 uint8_t features[BTRC_FEATURE_BIT_MASK_SIZE]; 217 uint16_t charset_id; 218 uint8_t name[BTRC_MAX_ATTR_STR_LEN]; 219 } btrc_item_player_t; 220 221 typedef struct { 222 uint8_t uid[BTRC_UID_SIZE]; 223 uint8_t type; 224 uint8_t playable; 225 uint16_t charset_id; 226 uint8_t name[BTRC_MAX_ATTR_STR_LEN]; 227 } btrc_item_folder_t; 228 229 typedef struct { 230 uint8_t uid[BTRC_UID_SIZE]; 231 uint8_t type; 232 uint16_t charset_id; 233 uint8_t name[BTRC_MAX_ATTR_STR_LEN]; 234 int num_attrs; 235 btrc_element_attr_val_t* p_attrs; 236 } btrc_item_media_t; 237 238 typedef struct { 239 uint8_t item_type; 240 union { 241 btrc_item_player_t player; 242 btrc_item_folder_t folder; 243 btrc_item_media_t media; 244 }; 245 } btrc_folder_items_t; 246 247 typedef void (*btrc_passthrough_rsp_callback)(const RawAddress& bd_addr, int id, int key_state); 248 249 typedef void (*btrc_groupnavigation_rsp_callback)(int id, int key_state); 250 251 typedef void (*btrc_connection_state_callback)(bool rc_connect, bool bt_connect, 252 const RawAddress& bd_addr); 253 254 typedef void (*btrc_ctrl_getrcfeatures_callback)(const RawAddress& bd_addr, int features); 255 256 typedef void (*btrc_ctrl_setabsvol_cmd_callback)(const RawAddress& bd_addr, uint8_t abs_vol, 257 uint8_t label); 258 259 typedef void (*btrc_ctrl_registernotification_abs_vol_callback)(const RawAddress& bd_addr, 260 uint8_t label); 261 262 typedef void (*btrc_ctrl_setplayerapplicationsetting_rsp_callback)(const RawAddress& bd_addr, 263 uint8_t accepted); 264 265 typedef void (*btrc_ctrl_playerapplicationsetting_callback)(const RawAddress& bd_addr, 266 uint8_t num_attr, 267 btrc_player_app_attr_t* app_attrs, 268 uint8_t num_ext_attr, 269 btrc_player_app_ext_attr_t* ext_attrs); 270 271 typedef void (*btrc_ctrl_playerapplicationsetting_changed_callback)( 272 const RawAddress& bd_addr, const btrc_player_settings_t& vals); 273 274 typedef void (*btrc_ctrl_track_changed_callback)(const RawAddress& bd_addr, uint8_t num_attr, 275 btrc_element_attr_val_t* p_attrs); 276 277 typedef void (*btrc_ctrl_play_position_changed_callback)(const RawAddress& bd_addr, 278 uint32_t song_len, uint32_t song_pos); 279 280 typedef void (*btrc_ctrl_play_status_changed_callback)(const RawAddress& bd_addr, 281 btrc_play_status_t play_status); 282 283 typedef void (*btrc_ctrl_get_folder_items_callback)(const RawAddress& bd_addr, btrc_status_t status, 284 const btrc_folder_items_t* folder_items, 285 uint8_t count); 286 287 typedef void (*btrc_ctrl_change_path_callback)(const RawAddress& bd_addr, uint32_t count); 288 289 typedef void (*btrc_ctrl_set_browsed_player_callback)(const RawAddress& bd_addr, uint8_t num_items, 290 uint8_t depth); 291 typedef void (*btrc_ctrl_set_addressed_player_callback)(const RawAddress& bd_addr, uint8_t status); 292 typedef void (*btrc_ctrl_addressed_player_changed_callback)(const RawAddress& bd_addr, uint16_t id); 293 typedef void (*btrc_ctrl_now_playing_contents_changed_callback)(const RawAddress& bd_addr); 294 typedef void (*btrc_ctrl_available_player_changed_callback)(const RawAddress& bd_addr); 295 296 typedef void (*btrc_ctrl_get_cover_art_psm_callback)(const RawAddress& bd_addr, const uint16_t psm); 297 298 /** BT-RC Controller callback structure. */ 299 typedef struct { 300 /** set to sizeof(BtRcCallbacks) */ 301 size_t size; 302 btrc_passthrough_rsp_callback passthrough_rsp_cb; 303 btrc_groupnavigation_rsp_callback groupnavigation_rsp_cb; 304 btrc_connection_state_callback connection_state_cb; 305 btrc_ctrl_getrcfeatures_callback getrcfeatures_cb; 306 btrc_ctrl_setplayerapplicationsetting_rsp_callback setplayerappsetting_rsp_cb; 307 btrc_ctrl_playerapplicationsetting_callback playerapplicationsetting_cb; 308 btrc_ctrl_playerapplicationsetting_changed_callback playerapplicationsetting_changed_cb; 309 btrc_ctrl_setabsvol_cmd_callback setabsvol_cmd_cb; 310 btrc_ctrl_registernotification_abs_vol_callback registernotification_absvol_cb; 311 btrc_ctrl_track_changed_callback track_changed_cb; 312 btrc_ctrl_play_position_changed_callback play_position_changed_cb; 313 btrc_ctrl_play_status_changed_callback play_status_changed_cb; 314 btrc_ctrl_get_folder_items_callback get_folder_items_cb; 315 btrc_ctrl_change_path_callback change_folder_path_cb; 316 btrc_ctrl_set_browsed_player_callback set_browsed_player_cb; 317 btrc_ctrl_set_addressed_player_callback set_addressed_player_cb; 318 btrc_ctrl_addressed_player_changed_callback addressed_player_changed_cb; 319 btrc_ctrl_now_playing_contents_changed_callback now_playing_contents_changed_cb; 320 btrc_ctrl_available_player_changed_callback available_player_changed_cb; 321 btrc_ctrl_get_cover_art_psm_callback get_cover_art_psm_cb; 322 } btrc_ctrl_callbacks_t; 323 324 /** Represents the standard BT-RC AVRCP Controller interface. */ 325 typedef struct { 326 /** set to sizeof(BtRcInterface) */ 327 size_t size; 328 /** 329 * Register the BtRc callbacks 330 */ 331 bt_status_t (*init)(btrc_ctrl_callbacks_t* callbacks); 332 333 /** send pass through command to target */ 334 bt_status_t (*send_pass_through_cmd)(const RawAddress& bd_addr, uint8_t key_code, 335 uint8_t key_state); 336 337 /** send group navigation command to target */ 338 bt_status_t (*send_group_navigation_cmd)(const RawAddress& bd_addr, uint8_t key_code, 339 uint8_t key_state); 340 341 /** send command to set player application setting attributes to target */ 342 bt_status_t (*set_player_app_setting_cmd)(const RawAddress& bd_addr, uint8_t num_attrib, 343 uint8_t* attrib_ids, uint8_t* attrib_vals); 344 345 /** send command to play a particular item */ 346 bt_status_t (*play_item_cmd)(const RawAddress& bd_addr, uint8_t scope, uint8_t* uid, 347 uint16_t uid_counter); 348 349 /** get the current track's media metadata */ 350 bt_status_t (*get_current_metadata_cmd)(const RawAddress& bd_addr); 351 352 /** get the playback state */ 353 bt_status_t (*get_playback_state_cmd)(const RawAddress& bd_addr); 354 355 /** get the now playing list */ 356 bt_status_t (*get_now_playing_list_cmd)(const RawAddress& bd_addr, uint32_t start, uint32_t end); 357 358 /** get the folder list */ 359 bt_status_t (*get_folder_list_cmd)(const RawAddress& bd_addr, uint32_t start, uint32_t end); 360 361 /** get the player list */ 362 bt_status_t (*get_player_list_cmd)(const RawAddress& bd_addr, uint32_t start, uint32_t end); 363 364 /** change the folder path */ 365 bt_status_t (*change_folder_path_cmd)(const RawAddress& bd_addr, uint8_t direction, uint8_t* uid); 366 367 /** set browsed player */ 368 bt_status_t (*set_browsed_player_cmd)(const RawAddress& bd_addr, uint16_t player_id); 369 370 /** set addressed player */ 371 bt_status_t (*set_addressed_player_cmd)(const RawAddress& bd_addr, uint16_t player_id); 372 373 /** send rsp to set_abs_vol received from target */ 374 bt_status_t (*set_volume_rsp)(const RawAddress& bd_addr, uint8_t abs_vol, uint8_t label); 375 376 /** send notificaiton rsp for abs vol to target */ 377 bt_status_t (*register_abs_vol_rsp)(const RawAddress& bd_addr, btrc_notification_type_t rsp_type, 378 uint8_t abs_vol, uint8_t label); 379 380 /** Closes the interface. */ 381 void (*cleanup)(void); 382 } btrc_ctrl_interface_t; 383 384 __END_DECLS 385 386 #if __has_include(<bluetooth/log.h>) 387 #include <bluetooth/log.h> 388 389 namespace std { 390 template <> 391 struct formatter<btrc_status_t> : enum_formatter<btrc_status_t> {}; 392 template <> 393 struct formatter<btrc_event_id_t> : enum_formatter<btrc_event_id_t> {}; 394 template <> 395 struct formatter<btrc_remote_features_t> : enum_formatter<btrc_remote_features_t> {}; 396 template <> 397 struct formatter<btrc_notification_type_t> : enum_formatter<btrc_notification_type_t> {}; 398 } // namespace std 399 400 #endif // __has_include(<bluetooth/log.h>) 401 402 #endif /* ANDROID_INCLUDE_BT_RC_H */ 403