• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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