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__BEGIN_DECLS
21
22/* Change this macro to use multiple RC */
23#define BT_RC_NUM_APP 6
24
25/* Macros */
26#define BTRC_MAX_ATTR_STR_LEN (1 << 16)
27#define BTRC_UID_SIZE 8
28#define BTRC_MAX_APP_SETTINGS 8
29#define BTRC_MAX_FOLDER_DEPTH 4
30#define BTRC_MAX_APP_ATTR_SIZE 16
31#define BTRC_MAX_ELEM_ATTR_SIZE 8
32#define BTRC_FEATURE_BIT_MASK_SIZE 16
33
34/* Macros for valid scopes in get_folder_items */
35#define BTRC_SCOPE_PLAYER_LIST 0x00 /* Media Player List */
36#define BTRC_SCOPE_FILE_SYSTEM 0x01 /* Virtual File System */
37#define BTRC_SCOPE_SEARCH 0x02      /* Search */
38#define BTRC_SCOPE_NOW_PLAYING 0x03 /* Now Playing */
39
40/* Macros for supported character encoding */
41#define BTRC_CHARSET_ID_UTF8 0x006A
42
43/* Macros for item types */
44#define BTRC_ITEM_PLAYER 0x01 /* Media Player */
45#define BTRC_ITEM_FOLDER 0x02 /* Folder */
46#define BTRC_ITEM_MEDIA 0x03  /* Media File */
47
48/* Macros for media attribute IDs */
49#define BTRC_MEDIA_ATTR_ID_INVALID -1
50#define BTRC_MEDIA_ATTR_ID_TITLE 0x00000001
51#define BTRC_MEDIA_ATTR_ID_ARTIST 0x00000002
52#define BTRC_MEDIA_ATTR_ID_ALBUM 0x00000003
53#define BTRC_MEDIA_ATTR_ID_TRACK_NUM 0x00000004
54#define BTRC_MEDIA_ATTR_ID_NUM_TRACKS 0x00000005
55#define BTRC_MEDIA_ATTR_ID_GENRE 0x00000006
56#define BTRC_MEDIA_ATTR_ID_PLAYING_TIME 0x00000007 /* in miliseconds */
57
58/* Macros for folder types */
59#define BTRC_FOLDER_TYPE_MIXED 0x00
60#define BTRC_FOLDER_TYPE_TITLES 0x01
61#define BTRC_FOLDER_TYPE_ALBUMS 0x02
62#define BTRC_FOLDER_TYPE_ARTISTS 0x03
63#define BTRC_FOLDER_TYPE_GENRES 0x04
64#define BTRC_FOLDER_TYPE_PLAYLISTS 0x05
65#define BTRC_FOLDER_TYPE_YEARS 0x06
66
67/* Macros for media types */
68#define BTRC_MEDIA_TYPE_AUDIO 0x00 /* audio */
69#define BTRC_MEDIA_TYPE_VIDEO 0x01 /* video */
70
71/* Macros for num attributes */
72#define BTRC_NUM_ATTR_NONE 0xFF /* No attributes required */
73#define BTRC_NUM_ATTR_ALL 0X00  /* All attributes required */
74
75#define BTRC_HANDLE_NONE 0xFF
76
77typedef uint8_t btrc_uid_t[BTRC_UID_SIZE];
78
79typedef enum {
80  BTRC_CONNECTION_STATE_DISCONNECTED = 0,
81  BTRC_CONNECTION_STATE_CONNECTED
82} btrc_connection_state_t;
83
84typedef enum {
85  BTRC_FEAT_NONE = 0x00,            /* AVRCP 1.0 */
86  BTRC_FEAT_METADATA = 0x01,        /* AVRCP 1.3 */
87  BTRC_FEAT_ABSOLUTE_VOLUME = 0x02, /* Supports TG role and volume sync */
88  BTRC_FEAT_BROWSE = 0x04, /* AVRCP 1.4 and up, with Browsing support */
89} btrc_remote_features_t;
90
91typedef enum {
92  BTRC_PLAYSTATE_STOPPED = 0x00,  /* Stopped */
93  BTRC_PLAYSTATE_PLAYING = 0x01,  /* Playing */
94  BTRC_PLAYSTATE_PAUSED = 0x02,   /* Paused  */
95  BTRC_PLAYSTATE_FWD_SEEK = 0x03, /* Fwd Seek*/
96  BTRC_PLAYSTATE_REV_SEEK = 0x04, /* Rev Seek*/
97  BTRC_PLAYSTATE_ERROR = 0xFF,    /* Error   */
98} btrc_play_status_t;
99
100typedef enum {
101  BTRC_EVT_PLAY_STATUS_CHANGED = 0x01,
102  BTRC_EVT_TRACK_CHANGE = 0x02,
103  BTRC_EVT_TRACK_REACHED_END = 0x03,
104  BTRC_EVT_TRACK_REACHED_START = 0x04,
105  BTRC_EVT_PLAY_POS_CHANGED = 0x05,
106  BTRC_EVT_APP_SETTINGS_CHANGED = 0x08,
107  BTRC_EVT_NOW_PLAYING_CONTENT_CHANGED = 0x09,
108  BTRC_EVT_AVAL_PLAYER_CHANGE = 0x0a,
109  BTRC_EVT_ADDR_PLAYER_CHANGE = 0x0b,
110  BTRC_EVT_UIDS_CHANGED = 0x0c,
111  BTRC_EVT_VOL_CHANGED = 0x0d,
112} btrc_event_id_t;
113
114typedef enum {
115  BTRC_NOTIFICATION_TYPE_INTERIM = 0,
116  BTRC_NOTIFICATION_TYPE_CHANGED = 1,
117} btrc_notification_type_t;
118
119typedef enum {
120  BTRC_PLAYER_ATTR_EQUALIZER = 0x01,
121  BTRC_PLAYER_ATTR_REPEAT = 0x02,
122  BTRC_PLAYER_ATTR_SHUFFLE = 0x03,
123  BTRC_PLAYER_ATTR_SCAN = 0x04,
124} btrc_player_attr_t;
125
126typedef enum {
127  BTRC_MEDIA_ATTR_TITLE = 0x01,
128  BTRC_MEDIA_ATTR_ARTIST = 0x02,
129  BTRC_MEDIA_ATTR_ALBUM = 0x03,
130  BTRC_MEDIA_ATTR_TRACK_NUM = 0x04,
131  BTRC_MEDIA_ATTR_NUM_TRACKS = 0x05,
132  BTRC_MEDIA_ATTR_GENRE = 0x06,
133  BTRC_MEDIA_ATTR_PLAYING_TIME = 0x07,
134} btrc_media_attr_t;
135
136typedef enum {
137  BTRC_PLAYER_VAL_OFF_REPEAT = 0x01,
138  BTRC_PLAYER_VAL_SINGLE_REPEAT = 0x02,
139  BTRC_PLAYER_VAL_ALL_REPEAT = 0x03,
140  BTRC_PLAYER_VAL_GROUP_REPEAT = 0x04
141} btrc_player_repeat_val_t;
142
143typedef enum {
144  BTRC_PLAYER_VAL_OFF_SHUFFLE = 0x01,
145  BTRC_PLAYER_VAL_ALL_SHUFFLE = 0x02,
146  BTRC_PLAYER_VAL_GROUP_SHUFFLE = 0x03
147} btrc_player_shuffle_val_t;
148
149typedef enum {
150  BTRC_STS_BAD_CMD = 0x00,       /* Invalid command */
151  BTRC_STS_BAD_PARAM = 0x01,     /* Invalid parameter */
152  BTRC_STS_NOT_FOUND = 0x02,     /* Specified parameter is wrong or not found */
153  BTRC_STS_INTERNAL_ERR = 0x03,  /* Internal Error */
154  BTRC_STS_NO_ERROR = 0x04,      /* Operation Success */
155  BTRC_STS_UID_CHANGED = 0x05,   /* UIDs changed */
156  BTRC_STS_RESERVED = 0x06,      /* Reserved */
157  BTRC_STS_INV_DIRN = 0x07,      /* Invalid direction */
158  BTRC_STS_INV_DIRECTORY = 0x08, /* Invalid directory */
159  BTRC_STS_INV_ITEM = 0x09,      /* Invalid Item */
160  BTRC_STS_INV_SCOPE = 0x0a,     /* Invalid scope */
161  BTRC_STS_INV_RANGE = 0x0b,     /* Invalid range */
162  BTRC_STS_DIRECTORY = 0x0c,     /* UID is a directory */
163  BTRC_STS_MEDIA_IN_USE = 0x0d,  /* Media in use */
164  BTRC_STS_PLAY_LIST_FULL = 0x0e, /* Playing list full */
165  BTRC_STS_SRCH_NOT_SPRTD = 0x0f, /* Search not supported */
166  BTRC_STS_SRCH_IN_PROG = 0x10,   /* Search in progress */
167  BTRC_STS_INV_PLAYER = 0x11,     /* Invalid player */
168  BTRC_STS_PLAY_NOT_BROW = 0x12,  /* Player not browsable */
169  BTRC_STS_PLAY_NOT_ADDR = 0x13,  /* Player not addressed */
170  BTRC_STS_INV_RESULTS = 0x14,    /* Invalid results */
171  BTRC_STS_NO_AVBL_PLAY = 0x15,   /* No available players */
172  BTRC_STS_ADDR_PLAY_CHGD = 0x16, /* Addressed player changed */
173} btrc_status_t;
174
175typedef struct {
176  uint16_t player_id;
177  uint16_t uid_counter;
178} btrc_addr_player_changed_t;
179
180typedef struct {
181  uint8_t num_attr;
182  uint8_t attr_ids[BTRC_MAX_APP_SETTINGS];
183  uint8_t attr_values[BTRC_MAX_APP_SETTINGS];
184} btrc_player_settings_t;
185
186typedef struct {
187  uint8_t val;
188  uint16_t charset_id;
189  uint16_t str_len;
190  uint8_t* p_str;
191} btrc_player_app_ext_attr_val_t;
192
193typedef struct {
194  uint8_t attr_id;
195  uint16_t charset_id;
196  uint16_t str_len;
197  uint8_t* p_str;
198  uint8_t num_val;
199  btrc_player_app_ext_attr_val_t ext_attr_val[BTRC_MAX_APP_ATTR_SIZE];
200} btrc_player_app_ext_attr_t;
201
202typedef struct {
203  uint8_t attr_id;
204  uint8_t num_val;
205  uint8_t attr_val[BTRC_MAX_APP_ATTR_SIZE];
206} btrc_player_app_attr_t;
207
208typedef struct {
209  uint32_t start_item;
210  uint32_t end_item;
211  uint32_t size;
212  uint32_t attrs[BTRC_MAX_ELEM_ATTR_SIZE];
213  uint8_t attr_count;
214} btrc_getfolderitem_t;
215
216typedef struct {
217  uint16_t type;
218  uint16_t uid_counter;
219} btrc_uids_changed_t;
220
221typedef struct { uint16_t type; } btrc_now_playing_changed_t;
222
223typedef union {
224  btrc_play_status_t play_status;
225  btrc_uid_t track; /* queue position in NowPlaying */
226  uint32_t song_pos;
227  uint16_t uid_counter;
228  btrc_player_settings_t player_setting;
229  btrc_addr_player_changed_t addr_player_changed;
230  btrc_uids_changed_t uids_changed;
231  btrc_now_playing_changed_t now_playing_changed;
232} btrc_register_notification_t;
233
234typedef struct {
235  uint8_t id; /* can be attr_id or value_id */
236  uint8_t text[BTRC_MAX_ATTR_STR_LEN];
237} btrc_player_setting_text_t;
238
239typedef struct {
240  uint32_t attr_id;
241  uint8_t text[BTRC_MAX_ATTR_STR_LEN];
242} btrc_element_attr_val_t;
243
244typedef struct {
245  uint16_t player_id;
246  uint8_t major_type;
247  uint32_t sub_type;
248  uint8_t play_status;
249  uint8_t features[BTRC_FEATURE_BIT_MASK_SIZE];
250  uint16_t charset_id;
251  uint8_t name[BTRC_MAX_ATTR_STR_LEN];
252} btrc_item_player_t;
253
254typedef struct {
255  uint8_t uid[BTRC_UID_SIZE];
256  uint8_t type;
257  uint8_t playable;
258  uint16_t charset_id;
259  uint8_t name[BTRC_MAX_ATTR_STR_LEN];
260} btrc_item_folder_t;
261
262typedef struct {
263  uint8_t uid[BTRC_UID_SIZE];
264  uint8_t type;
265  uint16_t charset_id;
266  uint8_t name[BTRC_MAX_ATTR_STR_LEN];
267  int num_attrs;
268  btrc_element_attr_val_t* p_attrs;
269} btrc_item_media_t;
270
271typedef struct {
272  uint8_t item_type;
273  union {
274    btrc_item_player_t player;
275    btrc_item_folder_t folder;
276    btrc_item_media_t media;
277  };
278} btrc_folder_items_t;
279
280typedef struct {
281  uint16_t str_len;
282  uint8_t p_str[BTRC_MAX_ATTR_STR_LEN];
283} btrc_br_folder_name_t;
284
285/** Callback for the controller's supported feautres */
286typedef void (*btrc_remote_features_callback)(const RawAddress& bd_addr,
287                                              btrc_remote_features_t features);
288
289/** Callback for play status request */
290typedef void (*btrc_get_play_status_callback)(const RawAddress& bd_addr);
291
292/** Callback for list player application attributes (Shuffle, Repeat,...) */
293typedef void (*btrc_list_player_app_attr_callback)(const RawAddress& bd_addr);
294
295/** Callback for list player application attributes (Shuffle, Repeat,...) */
296typedef void (*btrc_list_player_app_values_callback)(btrc_player_attr_t attr_id,
297                                                     const RawAddress& bd_addr);
298
299/** Callback for getting the current player application settings value
300**  num_attr: specifies the number of attribute ids contained in p_attrs
301*/
302typedef void (*btrc_get_player_app_value_callback)(uint8_t num_attr,
303                                                   btrc_player_attr_t* p_attrs,
304                                                   const RawAddress& bd_addr);
305
306/** Callback for getting the player application settings attributes' text
307**  num_attr: specifies the number of attribute ids contained in p_attrs
308*/
309typedef void (*btrc_get_player_app_attrs_text_callback)(
310    uint8_t num_attr, btrc_player_attr_t* p_attrs, const RawAddress& bd_addr);
311
312/** Callback for getting the player application settings values' text
313**  num_attr: specifies the number of value ids contained in p_vals
314*/
315typedef void (*btrc_get_player_app_values_text_callback)(
316    uint8_t attr_id, uint8_t num_val, uint8_t* p_vals,
317    const RawAddress& bd_addr);
318
319/** Callback for setting the player application settings values */
320typedef void (*btrc_set_player_app_value_callback)(
321    btrc_player_settings_t* p_vals, const RawAddress& bd_addr);
322
323/** Callback to fetch the get element attributes of the current song
324**  num_attr: specifies the number of attributes requested in p_attrs
325*/
326typedef void (*btrc_get_element_attr_callback)(uint8_t num_attr,
327                                               btrc_media_attr_t* p_attrs,
328                                               const RawAddress& bd_addr);
329
330/** Callback for register notification (Play state change/track change/...)
331**  param: Is only valid if event_id is BTRC_EVT_PLAY_POS_CHANGED
332*/
333typedef void (*btrc_register_notification_callback)(btrc_event_id_t event_id,
334                                                    uint32_t param,
335                                                    const RawAddress& bd_addr);
336
337/* AVRCP 1.4 Enhancements */
338/** Callback for volume change on CT
339**  volume: Current volume setting on the CT (0-127)
340*/
341typedef void (*btrc_volume_change_callback)(uint8_t volume, uint8_t ctype,
342                                            const RawAddress& bd_addr);
343
344/** Callback for passthrough commands */
345typedef void (*btrc_passthrough_cmd_callback)(int id, int key_state,
346                                              const RawAddress& bd_addr);
347
348/** Callback for set addressed player response on TG **/
349typedef void (*btrc_set_addressed_player_callback)(uint16_t player_id,
350                                                   const RawAddress& bd_addr);
351
352/** Callback for set browsed player response on TG **/
353typedef void (*btrc_set_browsed_player_callback)(uint16_t player_id,
354                                                 const RawAddress& bd_addr);
355
356/** Callback for get folder items on TG
357**  num_attr: specifies the number of attributes requested in p_attr_ids
358*/
359typedef void (*btrc_get_folder_items_callback)(
360    uint8_t scope, uint32_t start_item, uint32_t end_item, uint8_t num_attr,
361    uint32_t* p_attr_ids, const RawAddress& bd_addr);
362
363/** Callback for changing browsed path on TG **/
364typedef void (*btrc_change_path_callback)(uint8_t direction,
365                                          uint8_t* folder_uid,
366                                          const RawAddress& bd_addr);
367
368/** Callback to fetch the get item attributes of the media item
369**  num_attr: specifies the number of attributes requested in p_attrs
370*/
371typedef void (*btrc_get_item_attr_callback)(uint8_t scope, uint8_t* uid,
372                                            uint16_t uid_counter,
373                                            uint8_t num_attr,
374                                            btrc_media_attr_t* p_attrs,
375                                            const RawAddress& bd_addr);
376
377/** Callback for play request for the media item indicated by an identifier */
378typedef void (*btrc_play_item_callback)(uint8_t scope, uint16_t uid_counter,
379                                        uint8_t* uid,
380                                        const RawAddress& bd_addr);
381
382/** Callback to fetch total number of items from a folder **/
383typedef void (*btrc_get_total_num_of_items_callback)(uint8_t scope,
384                                                     const RawAddress& bd_addr);
385
386/** Callback for conducting recursive search on a current browsed path for a
387 * specified string */
388typedef void (*btrc_search_callback)(uint16_t charset_id, uint16_t str_len,
389                                     uint8_t* p_str, const RawAddress& bd_addr);
390
391/** Callback to add a specified media item indicated by an identifier to now
392 * playing queue. */
393typedef void (*btrc_add_to_now_playing_callback)(uint8_t scope, uint8_t* uid,
394                                                 uint16_t uid_counter,
395                                                 const RawAddress& bd_addr);
396
397/** BT-RC Target callback structure. */
398typedef struct {
399  /** set to sizeof(BtRcCallbacks) */
400  size_t size;
401  btrc_remote_features_callback remote_features_cb;
402  btrc_get_play_status_callback get_play_status_cb;
403  btrc_list_player_app_attr_callback list_player_app_attr_cb;
404  btrc_list_player_app_values_callback list_player_app_values_cb;
405  btrc_get_player_app_value_callback get_player_app_value_cb;
406  btrc_get_player_app_attrs_text_callback get_player_app_attrs_text_cb;
407  btrc_get_player_app_values_text_callback get_player_app_values_text_cb;
408  btrc_set_player_app_value_callback set_player_app_value_cb;
409  btrc_get_element_attr_callback get_element_attr_cb;
410  btrc_register_notification_callback register_notification_cb;
411  btrc_volume_change_callback volume_change_cb;
412  btrc_passthrough_cmd_callback passthrough_cmd_cb;
413  btrc_set_addressed_player_callback set_addressed_player_cb;
414  btrc_set_browsed_player_callback set_browsed_player_cb;
415  btrc_get_folder_items_callback get_folder_items_cb;
416  btrc_change_path_callback change_path_cb;
417  btrc_get_item_attr_callback get_item_attr_cb;
418  btrc_play_item_callback play_item_cb;
419  btrc_get_total_num_of_items_callback get_total_num_of_items_cb;
420  btrc_search_callback search_cb;
421  btrc_add_to_now_playing_callback add_to_now_playing_cb;
422} btrc_callbacks_t;
423
424/** Represents the standard BT-RC AVRCP Target interface. */
425typedef struct {
426  /** set to sizeof(BtRcInterface) */
427  size_t size;
428  /**
429   * Register the BtRc callbacks
430   */
431  bt_status_t (*init)(btrc_callbacks_t* callbacks);
432
433  /** Respose to GetPlayStatus request. Contains the current
434  **  1. Play status
435  **  2. Song duration/length
436  **  3. Song position
437  */
438  bt_status_t (*get_play_status_rsp)(const RawAddress& bd_addr,
439                                     btrc_play_status_t play_status,
440                                     uint32_t song_len, uint32_t song_pos);
441
442  /** Lists the support player application attributes (Shuffle/Repeat/...)
443  **  num_attr: Specifies the number of attributes contained in the pointer
444  *p_attrs
445  */
446  bt_status_t (*list_player_app_attr_rsp)(const RawAddress& bd_addr,
447                                          int num_attr,
448                                          btrc_player_attr_t* p_attrs);
449
450  /** Lists the support player application attributes (Shuffle Off/On/Group)
451  **  num_val: Specifies the number of values contained in the pointer p_vals
452  */
453  bt_status_t (*list_player_app_value_rsp)(const RawAddress& bd_addr,
454                                           int num_val, uint8_t* p_vals);
455
456  /** Returns the current application attribute values for each of the specified
457   * attr_id */
458  bt_status_t (*get_player_app_value_rsp)(const RawAddress& bd_addr,
459                                          btrc_player_settings_t* p_vals);
460
461  /** Returns the application attributes text ("Shuffle"/"Repeat"/...)
462  **  num_attr: Specifies the number of attributes' text contained in the
463  *pointer p_attrs
464  */
465  bt_status_t (*get_player_app_attr_text_rsp)(
466      const RawAddress& bd_addr, int num_attr,
467      btrc_player_setting_text_t* p_attrs);
468
469  /** Returns the application attributes text ("Shuffle"/"Repeat"/...)
470  **  num_attr: Specifies the number of attribute values' text contained in the
471  *pointer p_vals
472  */
473  bt_status_t (*get_player_app_value_text_rsp)(
474      const RawAddress& bd_addr, int num_val,
475      btrc_player_setting_text_t* p_vals);
476
477  /** Returns the current songs' element attributes text
478   *("Title"/"Album"/"Artist")
479   **  num_attr: Specifies the number of attributes' text contained in the
480   *pointer p_attrs
481   */
482  bt_status_t (*get_element_attr_rsp)(const RawAddress& bd_addr,
483                                      uint8_t num_attr,
484                                      btrc_element_attr_val_t* p_attrs);
485
486  /** Response to set player attribute request ("Shuffle"/"Repeat")
487  **  rsp_status: Status of setting the player attributes for the current media
488  *player
489  */
490  bt_status_t (*set_player_app_value_rsp)(const RawAddress& bd_addr,
491                                          btrc_status_t rsp_status);
492
493  /* Response to the register notification request (Play state change/track
494   *change/...).
495   ** event_id: Refers to the event_id this notification change corresponds too
496   ** type: Response type - interim/changed
497   ** p_params: Based on the event_id, this parameter should be populated
498   */
499  bt_status_t (*register_notification_rsp)(
500      btrc_event_id_t event_id, btrc_notification_type_t type,
501      btrc_register_notification_t* p_param);
502
503  /* AVRCP 1.4 enhancements */
504
505  /**Send current volume setting to remote side. Support limited to
506   *SetAbsoluteVolume
507   ** This can be enhanced to support Relative Volume (AVRCP 1.0).
508   ** With RelateVolume, we will send VOLUME_UP/VOLUME_DOWN opposed to absolute
509   *volume level
510   ** volume: Should be in the range 0-127. bit7 is reseved and cannot be set
511   */
512  bt_status_t (*set_volume)(uint8_t volume);
513
514  /* Set addressed player response from TG to CT */
515  bt_status_t (*set_addressed_player_rsp)(const RawAddress& bd_addr,
516                                          btrc_status_t rsp_status);
517
518  /* Set browsed player response from TG to CT */
519  bt_status_t (*set_browsed_player_rsp)(const RawAddress& bd_addr,
520                                        btrc_status_t rsp_status,
521                                        uint32_t num_items, uint16_t charset_id,
522                                        uint8_t folder_depth,
523                                        btrc_br_folder_name_t* p_folders);
524
525  /* Get folder item list response from TG to CT */
526  bt_status_t (*get_folder_items_list_rsp)(const RawAddress& bd_addr,
527                                           btrc_status_t rsp_status,
528                                           uint16_t uid_counter,
529                                           uint8_t num_items,
530                                           btrc_folder_items_t* p_items);
531
532  /* Change path response from TG to CT */
533  bt_status_t (*change_path_rsp)(const RawAddress& bd_addr,
534                                 btrc_status_t rsp_status, uint32_t num_items);
535
536  /** Returns the element's attributes num_attr: Specifies the number of
537   * attributes' text contained in the pointer p_attrs
538   */
539  bt_status_t (*get_item_attr_rsp)(const RawAddress& bd_addr,
540                                   btrc_status_t rsp_status, uint8_t num_attr,
541                                   btrc_element_attr_val_t* p_attrs);
542
543  /* play media item response from TG to CT */
544  bt_status_t (*play_item_rsp)(const RawAddress& bd_addr,
545                               btrc_status_t rsp_status);
546
547  /* get total number of items response from TG to CT*/
548  bt_status_t (*get_total_num_of_items_rsp)(const RawAddress& bd_addr,
549                                            btrc_status_t rsp_status,
550                                            uint32_t uid_counter,
551                                            uint32_t num_items);
552
553  /* Search VFS response from TG to CT */
554  bt_status_t (*search_rsp)(const RawAddress& bd_addr, btrc_status_t rsp_status,
555                            uint32_t uid_counter, uint32_t num_items);
556
557  /* add_to_now playing list response from TG to CT */
558  bt_status_t (*add_to_now_playing_rsp)(const RawAddress& bd_addr,
559                                        btrc_status_t rsp_status);
560
561  /** Closes the interface. */
562  void (*cleanup)(void);
563} btrc_interface_t;
564
565typedef void (*btrc_passthrough_rsp_callback)(const RawAddress& bd_addr, int id,
566                                              int key_state);
567
568typedef void (*btrc_groupnavigation_rsp_callback)(int id, int key_state);
569
570typedef void (*btrc_connection_state_callback)(bool rc_connect, bool bt_connect,
571                                               const RawAddress& bd_addr);
572
573typedef void (*btrc_ctrl_getrcfeatures_callback)(const RawAddress& bd_addr,
574                                                 int features);
575
576typedef void (*btrc_ctrl_setabsvol_cmd_callback)(const RawAddress& bd_addr,
577                                                 uint8_t abs_vol,
578                                                 uint8_t label);
579
580typedef void (*btrc_ctrl_registernotification_abs_vol_callback)(
581    const RawAddress& bd_addr, uint8_t label);
582
583typedef void (*btrc_ctrl_setplayerapplicationsetting_rsp_callback)(
584    const RawAddress& bd_addr, uint8_t accepted);
585
586typedef void (*btrc_ctrl_playerapplicationsetting_callback)(
587    const RawAddress& bd_addr, uint8_t num_attr,
588    btrc_player_app_attr_t* app_attrs, uint8_t num_ext_attr,
589    btrc_player_app_ext_attr_t* ext_attrs);
590
591typedef void (*btrc_ctrl_playerapplicationsetting_changed_callback)(
592    const RawAddress& bd_addr, const btrc_player_settings_t& vals);
593
594typedef void (*btrc_ctrl_track_changed_callback)(
595    const RawAddress& bd_addr, uint8_t num_attr,
596    btrc_element_attr_val_t* p_attrs);
597
598typedef void (*btrc_ctrl_play_position_changed_callback)(
599    const RawAddress& bd_addr, uint32_t song_len, uint32_t song_pos);
600
601typedef void (*btrc_ctrl_play_status_changed_callback)(
602    const RawAddress& bd_addr, btrc_play_status_t play_status);
603
604typedef void (*btrc_ctrl_get_folder_items_callback)(
605    const RawAddress& bd_addr, btrc_status_t status,
606    const btrc_folder_items_t* folder_items, uint8_t count);
607
608typedef void (*btrc_ctrl_change_path_callback)(const RawAddress& bd_addr,
609                                               uint32_t count);
610
611typedef void (*btrc_ctrl_set_browsed_player_callback)(const RawAddress& bd_addr,
612                                                      uint8_t num_items,
613                                                      uint8_t depth);
614typedef void (*btrc_ctrl_set_addressed_player_callback)(
615    const RawAddress& bd_addr, uint8_t status);
616/** BT-RC Controller callback structure. */
617typedef struct {
618  /** set to sizeof(BtRcCallbacks) */
619  size_t size;
620  btrc_passthrough_rsp_callback passthrough_rsp_cb;
621  btrc_groupnavigation_rsp_callback groupnavigation_rsp_cb;
622  btrc_connection_state_callback connection_state_cb;
623  btrc_ctrl_getrcfeatures_callback getrcfeatures_cb;
624  btrc_ctrl_setplayerapplicationsetting_rsp_callback setplayerappsetting_rsp_cb;
625  btrc_ctrl_playerapplicationsetting_callback playerapplicationsetting_cb;
626  btrc_ctrl_playerapplicationsetting_changed_callback
627      playerapplicationsetting_changed_cb;
628  btrc_ctrl_setabsvol_cmd_callback setabsvol_cmd_cb;
629  btrc_ctrl_registernotification_abs_vol_callback
630      registernotification_absvol_cb;
631  btrc_ctrl_track_changed_callback track_changed_cb;
632  btrc_ctrl_play_position_changed_callback play_position_changed_cb;
633  btrc_ctrl_play_status_changed_callback play_status_changed_cb;
634  btrc_ctrl_get_folder_items_callback get_folder_items_cb;
635  btrc_ctrl_change_path_callback change_folder_path_cb;
636  btrc_ctrl_set_browsed_player_callback set_browsed_player_cb;
637  btrc_ctrl_set_addressed_player_callback set_addressed_player_cb;
638} btrc_ctrl_callbacks_t;
639
640/** Represents the standard BT-RC AVRCP Controller interface. */
641typedef struct {
642  /** set to sizeof(BtRcInterface) */
643  size_t size;
644  /**
645   * Register the BtRc callbacks
646   */
647  bt_status_t (*init)(btrc_ctrl_callbacks_t* callbacks);
648
649  /** send pass through command to target */
650  bt_status_t (*send_pass_through_cmd)(const RawAddress& bd_addr,
651                                       uint8_t key_code, uint8_t key_state);
652
653  /** send group navigation command to target */
654  bt_status_t (*send_group_navigation_cmd)(const RawAddress& bd_addr,
655                                           uint8_t key_code, uint8_t key_state);
656
657  /** send command to set player applicaiton setting attributes to target */
658  bt_status_t (*set_player_app_setting_cmd)(const RawAddress& bd_addr,
659                                            uint8_t num_attrib,
660                                            uint8_t* attrib_ids,
661                                            uint8_t* attrib_vals);
662
663  /** send command to play a particular item */
664  bt_status_t (*play_item_cmd)(const RawAddress& bd_addr, uint8_t scope,
665                               uint8_t* uid, uint16_t uid_counter);
666
667  /** get the playback state */
668  bt_status_t (*get_playback_state_cmd)(const RawAddress& bd_addr);
669
670  /** get the now playing list */
671  bt_status_t (*get_now_playing_list_cmd)(const RawAddress& bd_addr,
672                                          uint32_t start, uint32_t end);
673
674  /** get the folder list */
675  bt_status_t (*get_folder_list_cmd)(const RawAddress& bd_addr, uint32_t start,
676                                     uint32_t end);
677
678  /** get the player list */
679  bt_status_t (*get_player_list_cmd)(const RawAddress& bd_addr, uint32_t start,
680                                     uint32_t end);
681
682  /** change the folder path */
683  bt_status_t (*change_folder_path_cmd)(const RawAddress& bd_addr,
684                                        uint8_t direction, uint8_t* uid);
685
686  /** set browsed player */
687  bt_status_t (*set_browsed_player_cmd)(const RawAddress& bd_addr,
688                                        uint16_t player_id);
689
690  /** set addressed player */
691  bt_status_t (*set_addressed_player_cmd)(const RawAddress& bd_addr,
692                                          uint16_t player_id);
693
694  /** send rsp to set_abs_vol received from target */
695  bt_status_t (*set_volume_rsp)(const RawAddress& bd_addr, uint8_t abs_vol,
696                                uint8_t label);
697
698  /** send notificaiton rsp for abs vol to target */
699  bt_status_t (*register_abs_vol_rsp)(const RawAddress& bd_addr,
700                                      btrc_notification_type_t rsp_type,
701                                      uint8_t abs_vol, uint8_t label);
702
703  /** Closes the interface. */
704  void (*cleanup)(void);
705} btrc_ctrl_interface_t;
706
707__END_DECLS
708
709#endif /* ANDROID_INCLUDE_BT_RC_H */
710