Home | History | Annotate | Download | only in src
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 2009-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  *
     22  *  Filename:      btif_rc.c
     23  *
     24  *  Description:   Bluetooth AVRC implementation
     25  *
     26  *****************************************************************************/
     27 #include <hardware/bluetooth.h>
     28 #include <fcntl.h>
     29 #include <string.h>
     30 #include "bta_api.h"
     31 #include "bta_av_api.h"
     32 #include "avrc_defs.h"
     33 #include "gki.h"
     34 
     35 #define LOG_TAG "bt_btif_avrc"
     36 #include "btif_common.h"
     37 #include "btif_util.h"
     38 #include "btif_av.h"
     39 #include "hardware/bt_rc.h"
     40 #include "uinput.h"
     41 
     42 /*****************************************************************************
     43 **  Constants & Macros
     44 ******************************************************************************/
     45 
     46 /* cod value for Headsets */
     47 #define COD_AV_HEADSETS        0x0404
     48 /* for AVRC 1.4 need to change this */
     49 #define MAX_RC_NOTIFICATIONS AVRC_EVT_APP_SETTING_CHANGE
     50 
     51 #define IDX_GET_PLAY_STATUS_RSP   0
     52 #define IDX_LIST_APP_ATTR_RSP     1
     53 #define IDX_LIST_APP_VALUE_RSP    2
     54 #define IDX_GET_CURR_APP_VAL_RSP  3
     55 #define IDX_SET_APP_VAL_RSP       4
     56 #define IDX_GET_APP_ATTR_TXT_RSP  5
     57 #define IDX_GET_APP_VAL_TXT_RSP   6
     58 #define IDX_GET_ELEMENT_ATTR_RSP  7
     59 #define MAX_VOLUME 128
     60 #define MAX_LABEL 16
     61 #define MAX_TRANSACTIONS_PER_SESSION 16
     62 #define MAX_CMD_QUEUE_LEN 8
     63 #define PLAY_STATUS_PLAYING 1
     64 
     65 #define CHECK_RC_CONNECTED                                                                  \
     66     BTIF_TRACE_DEBUG("## %s ##", __FUNCTION__);                                            \
     67     if(btif_rc_cb.rc_connected == FALSE)                                                    \
     68     {                                                                                       \
     69         BTIF_TRACE_WARNING("Function %s() called when RC is not connected", __FUNCTION__); \
     70         return BT_STATUS_NOT_READY;                                                         \
     71     }
     72 
     73 #define FILL_PDU_QUEUE(index, ctype, label, pending)        \
     74 {                                                           \
     75     btif_rc_cb.rc_pdu_info[index].ctype = ctype;            \
     76     btif_rc_cb.rc_pdu_info[index].label = label;            \
     77     btif_rc_cb.rc_pdu_info[index].is_rsp_pending = pending; \
     78 }
     79 
     80 #define SEND_METAMSG_RSP(index, avrc_rsp)                                                      \
     81 {                                                                                              \
     82     if(btif_rc_cb.rc_pdu_info[index].is_rsp_pending == FALSE)                                  \
     83     {                                                                                          \
     84         BTIF_TRACE_WARNING("%s Not sending response as no PDU was registered", __FUNCTION__); \
     85         return BT_STATUS_UNHANDLED;                                                            \
     86     }                                                                                          \
     87     send_metamsg_rsp(btif_rc_cb.rc_handle, btif_rc_cb.rc_pdu_info[index].label,                \
     88         btif_rc_cb.rc_pdu_info[index].ctype, avrc_rsp);                                        \
     89     btif_rc_cb.rc_pdu_info[index].ctype = 0;                                                   \
     90     btif_rc_cb.rc_pdu_info[index].label = 0;                                                   \
     91     btif_rc_cb.rc_pdu_info[index].is_rsp_pending = FALSE;                                      \
     92 }
     93 
     94 /*****************************************************************************
     95 **  Local type definitions
     96 ******************************************************************************/
     97 typedef struct {
     98     UINT8 bNotify;
     99     UINT8 label;
    100 } btif_rc_reg_notifications_t;
    101 
    102 typedef struct
    103 {
    104     UINT8   label;
    105     UINT8   ctype;
    106     BOOLEAN is_rsp_pending;
    107 } btif_rc_cmd_ctxt_t;
    108 
    109 /* TODO : Merge btif_rc_reg_notifications_t and btif_rc_cmd_ctxt_t to a single struct */
    110 typedef struct {
    111     BOOLEAN                     rc_connected;
    112     UINT8                       rc_handle;
    113     tBTA_AV_FEAT                rc_features;
    114     BD_ADDR                     rc_addr;
    115     UINT16                      rc_pending_play;
    116     btif_rc_cmd_ctxt_t          rc_pdu_info[MAX_CMD_QUEUE_LEN];
    117     btif_rc_reg_notifications_t rc_notif[MAX_RC_NOTIFICATIONS];
    118     unsigned int                rc_volume;
    119     uint8_t                     rc_vol_label;
    120 } btif_rc_cb_t;
    121 
    122 typedef struct {
    123     BOOLEAN in_use;
    124     UINT8 lbl;
    125     UINT8 handle;
    126 } rc_transaction_t;
    127 
    128 typedef struct
    129 {
    130     pthread_mutex_t lbllock;
    131     rc_transaction_t transaction[MAX_TRANSACTIONS_PER_SESSION];
    132 } rc_device_t;
    133 
    134 
    135 rc_device_t device;
    136 
    137 #define MAX_UINPUT_PATHS 3
    138 static const char* uinput_dev_path[] =
    139                        {"/dev/uinput", "/dev/input/uinput", "/dev/misc/uinput" };
    140 static int uinput_fd = -1;
    141 
    142 static int  send_event (int fd, uint16_t type, uint16_t code, int32_t value);
    143 static void send_key (int fd, uint16_t key, int pressed);
    144 static int  uinput_driver_check();
    145 static int  uinput_create(char *name);
    146 static int  init_uinput (void);
    147 static void close_uinput (void);
    148 static BOOLEAN dev_blacklisted_for_absolute_volume(BD_ADDR peer_dev);
    149 
    150 static const struct {
    151     const char *name;
    152     uint8_t avrcp;
    153     uint16_t mapped_id;
    154     uint8_t release_quirk;
    155 } key_map[] = {
    156     { "PLAY",         AVRC_ID_PLAY,     KEY_PLAYCD,       1 },
    157     { "STOP",         AVRC_ID_STOP,     KEY_STOPCD,       0 },
    158     { "PAUSE",        AVRC_ID_PAUSE,    KEY_PAUSECD,      1 },
    159     { "FORWARD",      AVRC_ID_FORWARD,  KEY_NEXTSONG,     0 },
    160     { "BACKWARD",     AVRC_ID_BACKWARD, KEY_PREVIOUSSONG, 0 },
    161     { "REWIND",       AVRC_ID_REWIND,   KEY_REWIND,       0 },
    162     { "FAST FORWARD", AVRC_ID_FAST_FOR, KEY_FAST_FORWARD, 0 },
    163     { NULL,           0,                0,                0 }
    164 };
    165 
    166 /* the rc_black_addr_prefix and rc_white_addr_prefix are used to correct
    167  * IOP issues of absolute volume feature
    168  * We encoutered A2DP headsets/carkits advertising absolute volume but buggy.
    169  * We would like to blacklist those devices.
    170  * But we donot have a full list of the bad devices. So as a temp fix, we
    171  * are blacklisting all the devices except the devices we have well tested,
    172  * the ones in the whitelist.
    173  *
    174  * For now, only the rc_white_addr_prefix is used in the code while
    175  * rc_black_addr_prefix is kept here for future long term solution.
    176  */
    177 static const UINT8 rc_white_addr_prefix[][3] = {
    178     {0x94, 0xCE, 0x2C}, // Sony SBH50
    179     {0x30, 0x17, 0xC8} // Sony wm600
    180 };
    181 
    182 static const char* rc_white_name[] = {
    183     "SBH50",
    184     "MW600"
    185 };
    186 
    187 static void send_reject_response (UINT8 rc_handle, UINT8 label,
    188     UINT8 pdu, UINT8 status);
    189 static UINT8 opcode_from_pdu(UINT8 pdu);
    190 static void send_metamsg_rsp (UINT8 rc_handle, UINT8 label,
    191     tBTA_AV_CODE code, tAVRC_RESPONSE *pmetamsg_resp);
    192 static void register_volumechange(UINT8 label);
    193 static void lbl_init();
    194 static void lbl_destroy();
    195 static void init_all_transactions();
    196 static bt_status_t  get_transaction(rc_transaction_t **ptransaction);
    197 static void release_transaction(UINT8 label);
    198 static rc_transaction_t* get_transaction_by_lbl(UINT8 label);
    199 static void handle_rc_metamsg_rsp(tBTA_AV_META_MSG *pmeta_msg);
    200 static void btif_rc_upstreams_evt(UINT16 event, tAVRC_COMMAND* p_param, UINT8 ctype, UINT8 label);
    201 static void btif_rc_upstreams_rsp_evt(UINT16 event, tAVRC_RESPONSE *pavrc_resp, UINT8 ctype, UINT8 label);
    202 
    203 /*****************************************************************************
    204 **  Static variables
    205 ******************************************************************************/
    206 static btif_rc_cb_t btif_rc_cb;
    207 static btrc_callbacks_t *bt_rc_callbacks = NULL;
    208 static btrc_ctrl_callbacks_t *bt_rc_ctrl_callbacks = NULL;
    209 
    210 /*****************************************************************************
    211 **  Static functions
    212 ******************************************************************************/
    213 
    214 /*****************************************************************************
    215 **  Externs
    216 ******************************************************************************/
    217 extern BOOLEAN btif_hf_call_terminated_recently();
    218 extern BOOLEAN check_cod(const bt_bdaddr_t *remote_bdaddr, uint32_t cod);
    219 
    220 
    221 /*****************************************************************************
    222 **  Functions
    223 ******************************************************************************/
    224 
    225 /*****************************************************************************
    226 **   Local uinput helper functions
    227 ******************************************************************************/
    228 int send_event (int fd, uint16_t type, uint16_t code, int32_t value)
    229 {
    230     struct uinput_event event;
    231     BTIF_TRACE_DEBUG("%s type:%u code:%u value:%d", __FUNCTION__,
    232         type, code, value);
    233     memset(&event, 0, sizeof(event));
    234     event.type  = type;
    235     event.code  = code;
    236     event.value = value;
    237 
    238     return write(fd, &event, sizeof(event));
    239 }
    240 
    241 void send_key (int fd, uint16_t key, int pressed)
    242 {
    243     BTIF_TRACE_DEBUG("%s fd:%d key:%u pressed:%d", __FUNCTION__,
    244         fd, key, pressed);
    245 
    246     if (fd < 0)
    247     {
    248         return;
    249     }
    250 
    251     BTIF_TRACE_DEBUG("AVRCP: Send key %d (%d) fd=%d", key, pressed, fd);
    252     send_event(fd, EV_KEY, key, pressed);
    253     send_event(fd, EV_SYN, SYN_REPORT, 0);
    254 }
    255 
    256 /************** uinput related functions **************/
    257 int uinput_driver_check()
    258 {
    259     uint32_t i;
    260     for (i=0; i < MAX_UINPUT_PATHS; i++)
    261     {
    262         if (access(uinput_dev_path[i], O_RDWR) == 0) {
    263            return 0;
    264         }
    265     }
    266     BTIF_TRACE_ERROR("%s ERROR: uinput device is not in the system", __FUNCTION__);
    267     return -1;
    268 }
    269 
    270 int uinput_create(char *name)
    271 {
    272     struct uinput_dev dev;
    273     int fd, x = 0;
    274 
    275     for(x=0; x < MAX_UINPUT_PATHS; x++)
    276     {
    277         fd = open(uinput_dev_path[x], O_RDWR);
    278         if (fd < 0)
    279             continue;
    280         break;
    281     }
    282     if (x == MAX_UINPUT_PATHS) {
    283         BTIF_TRACE_ERROR("%s ERROR: uinput device open failed", __FUNCTION__);
    284         return -1;
    285     }
    286     memset(&dev, 0, sizeof(dev));
    287     if (name)
    288         strncpy(dev.name, name, UINPUT_MAX_NAME_SIZE-1);
    289 
    290     dev.id.bustype = BUS_BLUETOOTH;
    291     dev.id.vendor  = 0x0000;
    292     dev.id.product = 0x0000;
    293     dev.id.version = 0x0000;
    294 
    295     if (write(fd, &dev, sizeof(dev)) < 0) {
    296         BTIF_TRACE_ERROR("%s Unable to write device information", __FUNCTION__);
    297         close(fd);
    298         return -1;
    299     }
    300 
    301     ioctl(fd, UI_SET_EVBIT, EV_KEY);
    302     ioctl(fd, UI_SET_EVBIT, EV_REL);
    303     ioctl(fd, UI_SET_EVBIT, EV_SYN);
    304 
    305     for (x = 0; key_map[x].name != NULL; x++)
    306         ioctl(fd, UI_SET_KEYBIT, key_map[x].mapped_id);
    307 
    308     if (ioctl(fd, UI_DEV_CREATE, NULL) < 0) {
    309         BTIF_TRACE_ERROR("%s Unable to create uinput device", __FUNCTION__);
    310         close(fd);
    311         return -1;
    312     }
    313     return fd;
    314 }
    315 
    316 int init_uinput (void)
    317 {
    318     char *name = "AVRCP";
    319 
    320     BTIF_TRACE_DEBUG("%s", __FUNCTION__);
    321     uinput_fd = uinput_create(name);
    322     if (uinput_fd < 0) {
    323         BTIF_TRACE_ERROR("%s AVRCP: Failed to initialize uinput for %s (%d)",
    324                           __FUNCTION__, name, uinput_fd);
    325     } else {
    326         BTIF_TRACE_DEBUG("%s AVRCP: Initialized uinput for %s (fd=%d)",
    327                           __FUNCTION__, name, uinput_fd);
    328     }
    329     return uinput_fd;
    330 }
    331 
    332 void close_uinput (void)
    333 {
    334     BTIF_TRACE_DEBUG("%s", __FUNCTION__);
    335     if (uinput_fd > 0) {
    336         ioctl(uinput_fd, UI_DEV_DESTROY);
    337 
    338         close(uinput_fd);
    339         uinput_fd = -1;
    340     }
    341 }
    342 
    343 void handle_rc_features()
    344 {
    345     btrc_remote_features_t rc_features = BTRC_FEAT_NONE;
    346     bt_bdaddr_t rc_addr;
    347     bdcpy(rc_addr.address, btif_rc_cb.rc_addr);
    348 
    349     if (dev_blacklisted_for_absolute_volume(btif_rc_cb.rc_addr))
    350     {
    351         btif_rc_cb.rc_features &= ~BTA_AV_FEAT_ADV_CTRL;
    352     }
    353 
    354     if (btif_rc_cb.rc_features & BTA_AV_FEAT_BROWSE)
    355     {
    356         rc_features |= BTRC_FEAT_BROWSE;
    357     }
    358     if ( (btif_rc_cb.rc_features & BTA_AV_FEAT_ADV_CTRL) &&
    359          (btif_rc_cb.rc_features & BTA_AV_FEAT_RCTG))
    360     {
    361         rc_features |= BTRC_FEAT_ABSOLUTE_VOLUME;
    362     }
    363     if (btif_rc_cb.rc_features & BTA_AV_FEAT_METADATA)
    364     {
    365         rc_features |= BTRC_FEAT_METADATA;
    366     }
    367     BTIF_TRACE_DEBUG("%s: rc_features=0x%x", __FUNCTION__, rc_features);
    368     HAL_CBACK(bt_rc_callbacks, remote_features_cb, &rc_addr, rc_features)
    369 
    370 #if (AVRC_ADV_CTRL_INCLUDED == TRUE)
    371      BTIF_TRACE_DEBUG("Checking for feature flags in btif_rc_handler with label %d",
    372                         btif_rc_cb.rc_vol_label);
    373      // Register for volume change on connect
    374       if(btif_rc_cb.rc_features & BTA_AV_FEAT_ADV_CTRL &&
    375          btif_rc_cb.rc_features & BTA_AV_FEAT_RCTG)
    376       {
    377          rc_transaction_t *p_transaction=NULL;
    378          bt_status_t status = BT_STATUS_NOT_READY;
    379          if(MAX_LABEL==btif_rc_cb.rc_vol_label)
    380          {
    381             status=get_transaction(&p_transaction);
    382          }
    383          else
    384          {
    385             p_transaction=get_transaction_by_lbl(btif_rc_cb.rc_vol_label);
    386             if(NULL!=p_transaction)
    387             {
    388                BTIF_TRACE_DEBUG("register_volumechange already in progress for label %d",
    389                                   btif_rc_cb.rc_vol_label);
    390                return;
    391             }
    392             else
    393               status=get_transaction(&p_transaction);
    394          }
    395 
    396          if(BT_STATUS_SUCCESS == status && NULL!=p_transaction)
    397          {
    398             btif_rc_cb.rc_vol_label=p_transaction->lbl;
    399             register_volumechange(btif_rc_cb.rc_vol_label);
    400          }
    401        }
    402 #endif
    403 }
    404 
    405 
    406 /***************************************************************************
    407  *  Function       handle_rc_connect
    408  *
    409  *  - Argument:    tBTA_AV_RC_OPEN  RC open data structure
    410  *
    411  *  - Description: RC connection event handler
    412  *
    413  ***************************************************************************/
    414 void handle_rc_connect (tBTA_AV_RC_OPEN *p_rc_open)
    415 {
    416     BTIF_TRACE_DEBUG("%s: rc_handle: %d", __FUNCTION__, p_rc_open->rc_handle);
    417     bt_status_t result = BT_STATUS_SUCCESS;
    418 #if (AVRC_CTLR_INCLUDED == TRUE)
    419     bt_bdaddr_t rc_addr;
    420 #endif
    421 
    422     if(p_rc_open->status == BTA_AV_SUCCESS)
    423     {
    424         //check if already some RC is connected
    425         if (btif_rc_cb.rc_connected)
    426         {
    427             BTIF_TRACE_ERROR("Got RC OPEN in connected state, Connected RC: %d \
    428                 and Current RC: %d", btif_rc_cb.rc_handle,p_rc_open->rc_handle );
    429             if ((btif_rc_cb.rc_handle != p_rc_open->rc_handle)
    430                 && (bdcmp(btif_rc_cb.rc_addr, p_rc_open->peer_addr)))
    431             {
    432                 BTIF_TRACE_DEBUG("Got RC connected for some other handle");
    433                 BTA_AvCloseRc(p_rc_open->rc_handle);
    434                 return;
    435             }
    436         }
    437         memcpy(btif_rc_cb.rc_addr, p_rc_open->peer_addr, sizeof(BD_ADDR));
    438         btif_rc_cb.rc_features = p_rc_open->peer_features;
    439         btif_rc_cb.rc_vol_label=MAX_LABEL;
    440         btif_rc_cb.rc_volume=MAX_VOLUME;
    441 
    442         btif_rc_cb.rc_connected = TRUE;
    443         btif_rc_cb.rc_handle = p_rc_open->rc_handle;
    444 
    445         /* on locally initiated connection we will get remote features as part of connect */
    446         if (btif_rc_cb.rc_features != 0)
    447             handle_rc_features();
    448 
    449         result = uinput_driver_check();
    450         if(result == BT_STATUS_SUCCESS)
    451         {
    452             init_uinput();
    453         }
    454 #if (AVRC_CTLR_INCLUDED == TRUE)
    455         bdcpy(rc_addr.address, btif_rc_cb.rc_addr);
    456         /* report connection state if device is AVRCP target */
    457         if (btif_rc_cb.rc_features & BTA_AV_FEAT_RCTG) {
    458             if (bt_rc_ctrl_callbacks != NULL) {
    459                 HAL_CBACK(bt_rc_ctrl_callbacks, connection_state_cb, TRUE, &rc_addr);
    460             }
    461         }
    462 #endif
    463     }
    464     else
    465     {
    466         BTIF_TRACE_ERROR("%s Connect failed with error code: %d",
    467             __FUNCTION__, p_rc_open->status);
    468         btif_rc_cb.rc_connected = FALSE;
    469     }
    470 }
    471 
    472 /***************************************************************************
    473  *  Function       handle_rc_disconnect
    474  *
    475  *  - Argument:    tBTA_AV_RC_CLOSE     RC close data structure
    476  *
    477  *  - Description: RC disconnection event handler
    478  *
    479  ***************************************************************************/
    480 void handle_rc_disconnect (tBTA_AV_RC_CLOSE *p_rc_close)
    481 {
    482 #if (AVRC_CTLR_INCLUDED == TRUE)
    483     bt_bdaddr_t rc_addr;
    484     tBTA_AV_FEAT features;
    485 #endif
    486     BTIF_TRACE_DEBUG("%s: rc_handle: %d", __FUNCTION__, p_rc_close->rc_handle);
    487     if ((p_rc_close->rc_handle != btif_rc_cb.rc_handle)
    488         && (bdcmp(btif_rc_cb.rc_addr, p_rc_close->peer_addr)))
    489     {
    490         BTIF_TRACE_ERROR("Got disconnect of unknown device");
    491         return;
    492     }
    493 
    494     btif_rc_cb.rc_handle = 0;
    495     btif_rc_cb.rc_connected = FALSE;
    496     memset(btif_rc_cb.rc_addr, 0, sizeof(BD_ADDR));
    497     memset(btif_rc_cb.rc_notif, 0, sizeof(btif_rc_cb.rc_notif));
    498 #if (AVRC_CTLR_INCLUDED == TRUE)
    499     features = btif_rc_cb.rc_features;
    500 #endif
    501     btif_rc_cb.rc_features = 0;
    502     btif_rc_cb.rc_vol_label=MAX_LABEL;
    503     btif_rc_cb.rc_volume=MAX_VOLUME;
    504     init_all_transactions();
    505     close_uinput();
    506 #if (AVRC_CTLR_INCLUDED == TRUE)
    507     bdcpy(rc_addr.address, btif_rc_cb.rc_addr);
    508 #endif
    509     memset(btif_rc_cb.rc_addr, 0, sizeof(BD_ADDR));
    510 #if (AVRC_CTLR_INCLUDED == TRUE)
    511     /* report connection state if device is AVRCP target */
    512     if (features & BTA_AV_FEAT_RCTG) {
    513         if (bt_rc_ctrl_callbacks != NULL) {
    514             HAL_CBACK(bt_rc_ctrl_callbacks, connection_state_cb, FALSE, &rc_addr);
    515         }
    516     }
    517 #endif
    518 }
    519 
    520 /***************************************************************************
    521  *  Function       handle_rc_passthrough_cmd
    522  *
    523  *  - Argument:    tBTA_AV_RC rc_id   remote control command ID
    524  *                 tBTA_AV_STATE key_state status of key press
    525  *
    526  *  - Description: Remote control command handler
    527  *
    528  ***************************************************************************/
    529 void handle_rc_passthrough_cmd ( tBTA_AV_REMOTE_CMD *p_remote_cmd)
    530 {
    531     const char *status;
    532     int pressed, i;
    533 
    534     BTIF_TRACE_DEBUG("%s: p_remote_cmd->rc_id=%d", __FUNCTION__, p_remote_cmd->rc_id);
    535 
    536     /* If AVRC is open and peer sends PLAY but there is no AVDT, then we queue-up this PLAY */
    537     if (p_remote_cmd)
    538     {
    539         /* queue AVRC PLAY if GAVDTP Open notification to app is pending (2 second timer) */
    540         if ((p_remote_cmd->rc_id == BTA_AV_RC_PLAY) && (!btif_av_is_connected()))
    541         {
    542             if (p_remote_cmd->key_state == AVRC_STATE_PRESS)
    543             {
    544                 APPL_TRACE_WARNING("%s: AVDT not open, queuing the PLAY command", __FUNCTION__);
    545                 btif_rc_cb.rc_pending_play = TRUE;
    546             }
    547             return;
    548         }
    549 
    550         if ((p_remote_cmd->rc_id == BTA_AV_RC_PAUSE) && (btif_rc_cb.rc_pending_play))
    551         {
    552             APPL_TRACE_WARNING("%s: Clear the pending PLAY on PAUSE received", __FUNCTION__);
    553             btif_rc_cb.rc_pending_play = FALSE;
    554             return;
    555         }
    556     }
    557 
    558     if ((p_remote_cmd->rc_id == BTA_AV_RC_STOP) && (!btif_av_stream_started_ready()))
    559     {
    560         APPL_TRACE_WARNING("%s: Stream suspended, ignore STOP cmd",__FUNCTION__);
    561         return;
    562     }
    563 
    564     if (p_remote_cmd->key_state == AVRC_STATE_RELEASE) {
    565         status = "released";
    566         pressed = 0;
    567     } else {
    568         status = "pressed";
    569         pressed = 1;
    570     }
    571 
    572     /* If this is Play/Pause command (press or release)  before processing, check the following
    573      * a voice call has ended recently
    574      * the remote device is not of type headset
    575      * If the above conditions meet, drop the Play/Pause command
    576      * This fix is to interop with certain carkits which sends an automatic  PLAY  or PAUSE
    577      * commands right after call ends
    578      */
    579     if((p_remote_cmd->rc_id == BTA_AV_RC_PLAY || p_remote_cmd->rc_id == BTA_AV_RC_PAUSE)&&
    580        (btif_hf_call_terminated_recently() == TRUE) &&
    581        (check_cod( (const bt_bdaddr_t*)&(btif_rc_cb.rc_addr), COD_AV_HEADSETS) != TRUE))
    582     {
    583         BTIF_TRACE_DEBUG("%s:Dropping the play/Pause command received right after call end cmd:%d",
    584                            __FUNCTION__,p_remote_cmd->rc_id);
    585         return;
    586     }
    587 
    588     if (p_remote_cmd->rc_id == BTA_AV_RC_FAST_FOR || p_remote_cmd->rc_id == BTA_AV_RC_REWIND) {
    589         HAL_CBACK(bt_rc_callbacks, passthrough_cmd_cb, p_remote_cmd->rc_id, pressed);
    590         return;
    591     }
    592 
    593     for (i = 0; key_map[i].name != NULL; i++) {
    594         if (p_remote_cmd->rc_id == key_map[i].avrcp) {
    595             BTIF_TRACE_DEBUG("%s: %s %s", __FUNCTION__, key_map[i].name, status);
    596 
    597            /* MusicPlayer uses a long_press_timeout of 1 second for PLAYPAUSE button
    598             * and maps that to autoshuffle. So if for some reason release for PLAY/PAUSE
    599             * comes 1 second after the press, the MediaPlayer UI goes into a bad state.
    600             * The reason for the delay could be sniff mode exit or some AVDTP procedure etc.
    601             * The fix is to generate a release right after the press and drown the 'actual'
    602             * release.
    603             */
    604             if ((key_map[i].release_quirk == 1) && (pressed == 0))
    605             {
    606                 BTIF_TRACE_DEBUG("%s: AVRC %s Release Faked earlier, drowned now",
    607                                   __FUNCTION__, key_map[i].name);
    608                 return;
    609             }
    610             send_key(uinput_fd, key_map[i].mapped_id, pressed);
    611             if ((key_map[i].release_quirk == 1) && (pressed == 1))
    612             {
    613                 GKI_delay(30); // 30ms
    614                 BTIF_TRACE_DEBUG("%s: AVRC %s Release quirk enabled, send release now",
    615                                   __FUNCTION__, key_map[i].name);
    616                 send_key(uinput_fd, key_map[i].mapped_id, 0);
    617             }
    618             break;
    619         }
    620     }
    621 
    622     if (key_map[i].name == NULL)
    623         BTIF_TRACE_ERROR("%s AVRCP: unknown button 0x%02X %s", __FUNCTION__,
    624                         p_remote_cmd->rc_id, status);
    625 }
    626 
    627 /***************************************************************************
    628  *  Function       handle_rc_passthrough_rsp
    629  *
    630  *  - Argument:    tBTA_AV_REMOTE_RSP passthrough command response
    631  *
    632  *  - Description: Remote control passthrough response handler
    633  *
    634  ***************************************************************************/
    635 void handle_rc_passthrough_rsp ( tBTA_AV_REMOTE_RSP *p_remote_rsp)
    636 {
    637 #if (AVRC_CTLR_INCLUDED == TRUE)
    638     const char *status;
    639     if (btif_rc_cb.rc_features & BTA_AV_FEAT_RCTG)
    640     {
    641         int key_state;
    642         if (p_remote_rsp->key_state == AVRC_STATE_RELEASE)
    643         {
    644             status = "released";
    645             key_state = 1;
    646         }
    647         else
    648         {
    649             status = "pressed";
    650             key_state = 0;
    651         }
    652 
    653         BTIF_TRACE_DEBUG("%s: rc_id=%d status=%s", __FUNCTION__, p_remote_rsp->rc_id, status);
    654 
    655         release_transaction(p_remote_rsp->label);
    656         if (bt_rc_ctrl_callbacks != NULL) {
    657             HAL_CBACK(bt_rc_ctrl_callbacks, passthrough_rsp_cb, p_remote_rsp->rc_id, key_state);
    658         }
    659     }
    660     else
    661     {
    662         BTIF_TRACE_ERROR("%s DUT does not support AVRCP controller role", __FUNCTION__);
    663     }
    664 #else
    665     BTIF_TRACE_ERROR("%s AVRCP controller role is not enabled", __FUNCTION__);
    666 #endif
    667 }
    668 
    669 void handle_uid_changed_notification(tBTA_AV_META_MSG *pmeta_msg, tAVRC_COMMAND *pavrc_command)
    670 {
    671     tAVRC_RESPONSE avrc_rsp = {0};
    672     avrc_rsp.rsp.pdu = pavrc_command->pdu;
    673     avrc_rsp.rsp.status = AVRC_STS_NO_ERROR;
    674     avrc_rsp.rsp.opcode = pavrc_command->cmd.opcode;
    675 
    676     avrc_rsp.reg_notif.event_id = pavrc_command->reg_notif.event_id;
    677     avrc_rsp.reg_notif.param.uid_counter = 0;
    678 
    679     send_metamsg_rsp(pmeta_msg->rc_handle, pmeta_msg->label, AVRC_RSP_INTERIM, &avrc_rsp);
    680     send_metamsg_rsp(pmeta_msg->rc_handle, pmeta_msg->label, AVRC_RSP_CHANGED, &avrc_rsp);
    681 
    682 }
    683 
    684 
    685 /***************************************************************************
    686  *  Function       handle_rc_metamsg_cmd
    687  *
    688  *  - Argument:    tBTA_AV_VENDOR Structure containing the received
    689  *                          metamsg command
    690  *
    691  *  - Description: Remote control metamsg command handler (AVRCP 1.3)
    692  *
    693  ***************************************************************************/
    694 void handle_rc_metamsg_cmd (tBTA_AV_META_MSG *pmeta_msg)
    695 {
    696     /* Parse the metamsg command and pass it on to BTL-IFS */
    697     UINT8             scratch_buf[512] = {0};
    698     tAVRC_COMMAND    avrc_command = {0};
    699     tAVRC_STS status;
    700 
    701     BTIF_TRACE_EVENT("+ %s", __FUNCTION__);
    702 
    703     if (pmeta_msg->p_msg->hdr.opcode != AVRC_OP_VENDOR)
    704     {
    705         BTIF_TRACE_WARNING("Invalid opcode: %x", pmeta_msg->p_msg->hdr.opcode);
    706         return;
    707     }
    708     if (pmeta_msg->len < 3)
    709     {
    710         BTIF_TRACE_WARNING("Invalid length.Opcode: 0x%x, len: 0x%x", pmeta_msg->p_msg->hdr.opcode,
    711             pmeta_msg->len);
    712         return;
    713     }
    714 
    715     if (pmeta_msg->code >= AVRC_RSP_NOT_IMPL)
    716     {
    717 #if (AVRC_ADV_CTRL_INCLUDED == TRUE)
    718 {
    719      rc_transaction_t *transaction=NULL;
    720      transaction=get_transaction_by_lbl(pmeta_msg->label);
    721      if(NULL!=transaction)
    722      {
    723         handle_rc_metamsg_rsp(pmeta_msg);
    724      }
    725      else
    726      {
    727          BTIF_TRACE_DEBUG("%s:Discard vendor dependent rsp. code: %d label:%d.",
    728              __FUNCTION__, pmeta_msg->code, pmeta_msg->label);
    729      }
    730      return;
    731 }
    732 #else
    733 {
    734         BTIF_TRACE_DEBUG("%s:Received vendor dependent rsp. code: %d len: %d. Not processing it.",
    735             __FUNCTION__, pmeta_msg->code, pmeta_msg->len);
    736         return;
    737 }
    738 #endif
    739       }
    740 
    741     status=AVRC_ParsCommand(pmeta_msg->p_msg, &avrc_command, scratch_buf, sizeof(scratch_buf));
    742     BTIF_TRACE_DEBUG("Received vendor command.code,PDU and label: %d, %d,%d",pmeta_msg->code,
    743                        avrc_command.cmd.pdu, pmeta_msg->label);
    744 
    745     if (status != AVRC_STS_NO_ERROR)
    746     {
    747         /* return error */
    748         BTIF_TRACE_WARNING("%s: Error in parsing received metamsg command. status: 0x%02x",
    749             __FUNCTION__, status);
    750         send_reject_response(pmeta_msg->rc_handle, pmeta_msg->label, avrc_command.pdu, status);
    751     }
    752     else
    753     {
    754         /* if RegisterNotification, add it to our registered queue */
    755 
    756         if (avrc_command.cmd.pdu == AVRC_PDU_REGISTER_NOTIFICATION)
    757         {
    758             UINT8 event_id = avrc_command.reg_notif.event_id;
    759             BTIF_TRACE_EVENT("%s:New register notification received.event_id:%s,label:0x%x,code:%x",
    760             __FUNCTION__,dump_rc_notification_event_id(event_id), pmeta_msg->label,pmeta_msg->code);
    761             btif_rc_cb.rc_notif[event_id-1].bNotify = TRUE;
    762             btif_rc_cb.rc_notif[event_id-1].label = pmeta_msg->label;
    763 
    764             if(event_id == AVRC_EVT_UIDS_CHANGE)
    765             {
    766                 handle_uid_changed_notification(pmeta_msg, &avrc_command);
    767                 return;
    768             }
    769 
    770         }
    771 
    772         BTIF_TRACE_EVENT("%s: Passing received metamsg command to app. pdu: %s",
    773             __FUNCTION__, dump_rc_pdu(avrc_command.cmd.pdu));
    774 
    775         /* Since handle_rc_metamsg_cmd() itself is called from
    776             *btif context, no context switching is required. Invoke
    777             * btif_rc_upstreams_evt directly from here. */
    778         btif_rc_upstreams_evt((uint16_t)avrc_command.cmd.pdu, &avrc_command, pmeta_msg->code,
    779                                pmeta_msg->label);
    780     }
    781 }
    782 
    783 /***************************************************************************
    784  **
    785  ** Function       btif_rc_handler
    786  **
    787  ** Description    RC event handler
    788  **
    789  ***************************************************************************/
    790 void btif_rc_handler(tBTA_AV_EVT event, tBTA_AV *p_data)
    791 {
    792     BTIF_TRACE_DEBUG ("%s event:%s", __FUNCTION__, dump_rc_event(event));
    793     switch (event)
    794     {
    795         case BTA_AV_RC_OPEN_EVT:
    796         {
    797             BTIF_TRACE_DEBUG("Peer_features:%x", p_data->rc_open.peer_features);
    798             handle_rc_connect( &(p_data->rc_open) );
    799         }break;
    800 
    801         case BTA_AV_RC_CLOSE_EVT:
    802         {
    803             handle_rc_disconnect( &(p_data->rc_close) );
    804         }break;
    805 
    806         case BTA_AV_REMOTE_CMD_EVT:
    807         {
    808             BTIF_TRACE_DEBUG("rc_id:0x%x key_state:%d", p_data->remote_cmd.rc_id,
    809                                p_data->remote_cmd.key_state);
    810             handle_rc_passthrough_cmd( (&p_data->remote_cmd) );
    811         }
    812         break;
    813 #if (AVRC_CTLR_INCLUDED == TRUE)
    814         case BTA_AV_REMOTE_RSP_EVT:
    815         {
    816             BTIF_TRACE_DEBUG("RSP: rc_id:0x%x key_state:%d", p_data->remote_rsp.rc_id,
    817                                p_data->remote_rsp.key_state);
    818             handle_rc_passthrough_rsp( (&p_data->remote_rsp) );
    819         }
    820         break;
    821 #endif
    822         case BTA_AV_RC_FEAT_EVT:
    823         {
    824             BTIF_TRACE_DEBUG("Peer_features:%x", p_data->rc_feat.peer_features);
    825             btif_rc_cb.rc_features = p_data->rc_feat.peer_features;
    826             handle_rc_features();
    827         }
    828         break;
    829         case BTA_AV_META_MSG_EVT:
    830         {
    831             BTIF_TRACE_DEBUG("BTA_AV_META_MSG_EVT  code:%d label:%d", p_data->meta_msg.code,
    832                 p_data->meta_msg.label);
    833             BTIF_TRACE_DEBUG("  company_id:0x%x len:%d handle:%d", p_data->meta_msg.company_id,
    834                 p_data->meta_msg.len, p_data->meta_msg.rc_handle);
    835             /* handle the metamsg command */
    836             handle_rc_metamsg_cmd(&(p_data->meta_msg));
    837         }
    838         break;
    839         default:
    840             BTIF_TRACE_DEBUG("Unhandled RC event : 0x%x", event);
    841     }
    842 }
    843 
    844 /***************************************************************************
    845  **
    846  ** Function       btif_rc_get_connected_peer
    847  **
    848  ** Description    Fetches the connected headset's BD_ADDR if any
    849  **
    850  ***************************************************************************/
    851 BOOLEAN btif_rc_get_connected_peer(BD_ADDR peer_addr)
    852 {
    853     if (btif_rc_cb.rc_connected == TRUE) {
    854         bdcpy(peer_addr, btif_rc_cb.rc_addr);
    855         return TRUE;
    856     }
    857     return FALSE;
    858 }
    859 
    860 /***************************************************************************
    861  **
    862  ** Function       btif_rc_check_handle_pending_play
    863  **
    864  ** Description    Clears the queued PLAY command. if bSend is TRUE, forwards to app
    865  **
    866  ***************************************************************************/
    867 
    868 /* clear the queued PLAY command. if bSend is TRUE, forward to app */
    869 void btif_rc_check_handle_pending_play (BD_ADDR peer_addr, BOOLEAN bSendToApp)
    870 {
    871     UNUSED(peer_addr);
    872 
    873     BTIF_TRACE_DEBUG("%s: bSendToApp=%d", __FUNCTION__, bSendToApp);
    874     if (btif_rc_cb.rc_pending_play)
    875     {
    876         if (bSendToApp)
    877         {
    878             tBTA_AV_REMOTE_CMD remote_cmd;
    879             APPL_TRACE_DEBUG("%s: Sending queued PLAYED event to app", __FUNCTION__);
    880 
    881             memset (&remote_cmd, 0, sizeof(tBTA_AV_REMOTE_CMD));
    882             remote_cmd.rc_handle  = btif_rc_cb.rc_handle;
    883             remote_cmd.rc_id      = AVRC_ID_PLAY;
    884             remote_cmd.hdr.ctype  = AVRC_CMD_CTRL;
    885             remote_cmd.hdr.opcode = AVRC_OP_PASS_THRU;
    886 
    887             /* delay sending to app, else there is a timing issue in the framework,
    888              ** which causes the audio to be on th device's speaker. Delay between
    889              ** OPEN & RC_PLAYs
    890             */
    891             GKI_delay (200);
    892             /* send to app - both PRESSED & RELEASED */
    893             remote_cmd.key_state  = AVRC_STATE_PRESS;
    894             handle_rc_passthrough_cmd( &remote_cmd );
    895 
    896             GKI_delay (100);
    897 
    898             remote_cmd.key_state  = AVRC_STATE_RELEASE;
    899             handle_rc_passthrough_cmd( &remote_cmd );
    900         }
    901         btif_rc_cb.rc_pending_play = FALSE;
    902     }
    903 }
    904 
    905 /* Generic reject response */
    906 static void send_reject_response (UINT8 rc_handle, UINT8 label, UINT8 pdu, UINT8 status)
    907 {
    908     UINT8 ctype = AVRC_RSP_REJ;
    909     tAVRC_RESPONSE avrc_rsp;
    910     BT_HDR *p_msg = NULL;
    911     memset (&avrc_rsp, 0, sizeof(tAVRC_RESPONSE));
    912 
    913     avrc_rsp.rsp.opcode = opcode_from_pdu(pdu);
    914     avrc_rsp.rsp.pdu    = pdu;
    915     avrc_rsp.rsp.status = status;
    916 
    917     if (AVRC_STS_NO_ERROR == (status = AVRC_BldResponse(rc_handle, &avrc_rsp, &p_msg)) )
    918     {
    919         BTIF_TRACE_DEBUG("%s:Sending error notification to handle:%d. pdu:%s,status:0x%02x",
    920             __FUNCTION__, rc_handle, dump_rc_pdu(pdu), status);
    921         BTA_AvMetaRsp(rc_handle, label, ctype, p_msg);
    922     }
    923 }
    924 
    925 /***************************************************************************
    926  *  Function       send_metamsg_rsp
    927  *
    928  *  - Argument:
    929  *                  rc_handle     RC handle corresponding to the connected RC
    930  *                  label            Label of the RC response
    931  *                  code            Response type
    932  *                  pmetamsg_resp    Vendor response
    933  *
    934  *  - Description: Remote control metamsg response handler (AVRCP 1.3)
    935  *
    936  ***************************************************************************/
    937 static void send_metamsg_rsp (UINT8 rc_handle, UINT8 label, tBTA_AV_CODE code,
    938     tAVRC_RESPONSE *pmetamsg_resp)
    939 {
    940     UINT8 ctype;
    941 
    942     if (!pmetamsg_resp)
    943     {
    944         BTIF_TRACE_WARNING("%s: Invalid response received from application", __FUNCTION__);
    945         return;
    946     }
    947 
    948     BTIF_TRACE_EVENT("+%s: rc_handle: %d, label: %d, code: 0x%02x, pdu: %s", __FUNCTION__,
    949         rc_handle, label, code, dump_rc_pdu(pmetamsg_resp->rsp.pdu));
    950 
    951     if (pmetamsg_resp->rsp.status != AVRC_STS_NO_ERROR)
    952     {
    953         ctype = AVRC_RSP_REJ;
    954     }
    955     else
    956     {
    957         if ( code < AVRC_RSP_NOT_IMPL)
    958         {
    959             if (code == AVRC_CMD_NOTIF)
    960             {
    961                ctype = AVRC_RSP_INTERIM;
    962             }
    963             else if (code == AVRC_CMD_STATUS)
    964             {
    965                ctype = AVRC_RSP_IMPL_STBL;
    966             }
    967             else
    968             {
    969                ctype = AVRC_RSP_ACCEPT;
    970             }
    971         }
    972         else
    973         {
    974             ctype = code;
    975         }
    976     }
    977     /* if response is for register_notification, make sure the rc has
    978     actually registered for this */
    979     if((pmetamsg_resp->rsp.pdu == AVRC_PDU_REGISTER_NOTIFICATION) && (code == AVRC_RSP_CHANGED))
    980     {
    981         BOOLEAN bSent = FALSE;
    982         UINT8   event_id = pmetamsg_resp->reg_notif.event_id;
    983         BOOLEAN bNotify = (btif_rc_cb.rc_connected) && (btif_rc_cb.rc_notif[event_id-1].bNotify);
    984 
    985         /* de-register this notification for a CHANGED response */
    986         btif_rc_cb.rc_notif[event_id-1].bNotify = FALSE;
    987         BTIF_TRACE_DEBUG("%s rc_handle: %d. event_id: 0x%02d bNotify:%u", __FUNCTION__,
    988              btif_rc_cb.rc_handle, event_id, bNotify);
    989         if (bNotify)
    990         {
    991             BT_HDR *p_msg = NULL;
    992             tAVRC_STS status;
    993 
    994             if (AVRC_STS_NO_ERROR == (status = AVRC_BldResponse(btif_rc_cb.rc_handle,
    995                 pmetamsg_resp, &p_msg)) )
    996             {
    997                 BTIF_TRACE_DEBUG("%s Sending notification to rc_handle: %d. event_id: 0x%02d",
    998                      __FUNCTION__, btif_rc_cb.rc_handle, event_id);
    999                 bSent = TRUE;
   1000                 BTA_AvMetaRsp(btif_rc_cb.rc_handle, btif_rc_cb.rc_notif[event_id-1].label,
   1001                     ctype, p_msg);
   1002             }
   1003             else
   1004             {
   1005                 BTIF_TRACE_WARNING("%s failed to build metamsg response. status: 0x%02x",
   1006                     __FUNCTION__, status);
   1007             }
   1008 
   1009         }
   1010 
   1011         if (!bSent)
   1012         {
   1013             BTIF_TRACE_DEBUG("%s: Notification not sent, as there are no RC connections or the \
   1014                 CT has not subscribed for event_id: %s", __FUNCTION__, dump_rc_notification_event_id(event_id));
   1015         }
   1016     }
   1017     else
   1018     {
   1019         /* All other commands go here */
   1020 
   1021         BT_HDR *p_msg = NULL;
   1022         tAVRC_STS status;
   1023 
   1024         status = AVRC_BldResponse(rc_handle, pmetamsg_resp, &p_msg);
   1025 
   1026         if (status == AVRC_STS_NO_ERROR)
   1027         {
   1028             BTA_AvMetaRsp(rc_handle, label, ctype, p_msg);
   1029         }
   1030         else
   1031         {
   1032             BTIF_TRACE_ERROR("%s: failed to build metamsg response. status: 0x%02x",
   1033                 __FUNCTION__, status);
   1034         }
   1035     }
   1036 }
   1037 
   1038 static UINT8 opcode_from_pdu(UINT8 pdu)
   1039 {
   1040     UINT8 opcode = 0;
   1041 
   1042     switch (pdu)
   1043     {
   1044     case AVRC_PDU_NEXT_GROUP:
   1045     case AVRC_PDU_PREV_GROUP: /* pass thru */
   1046         opcode  = AVRC_OP_PASS_THRU;
   1047         break;
   1048 
   1049     default: /* vendor */
   1050         opcode  = AVRC_OP_VENDOR;
   1051         break;
   1052     }
   1053 
   1054     return opcode;
   1055 }
   1056 
   1057 /*******************************************************************************
   1058 **
   1059 ** Function         btif_rc_upstreams_evt
   1060 **
   1061 ** Description      Executes AVRC UPSTREAMS events in btif context.
   1062 **
   1063 ** Returns          void
   1064 **
   1065 *******************************************************************************/
   1066 static void btif_rc_upstreams_evt(UINT16 event, tAVRC_COMMAND *pavrc_cmd, UINT8 ctype, UINT8 label)
   1067 {
   1068     BTIF_TRACE_EVENT("%s pdu: %s handle: 0x%x ctype:%x label:%x", __FUNCTION__,
   1069         dump_rc_pdu(pavrc_cmd->pdu), btif_rc_cb.rc_handle, ctype, label);
   1070 
   1071     switch (event)
   1072     {
   1073         case AVRC_PDU_GET_PLAY_STATUS:
   1074         {
   1075             FILL_PDU_QUEUE(IDX_GET_PLAY_STATUS_RSP, ctype, label, TRUE)
   1076             HAL_CBACK(bt_rc_callbacks, get_play_status_cb);
   1077         }
   1078         break;
   1079         case AVRC_PDU_LIST_PLAYER_APP_ATTR:
   1080         case AVRC_PDU_LIST_PLAYER_APP_VALUES:
   1081         case AVRC_PDU_GET_CUR_PLAYER_APP_VALUE:
   1082         case AVRC_PDU_SET_PLAYER_APP_VALUE:
   1083         case AVRC_PDU_GET_PLAYER_APP_ATTR_TEXT:
   1084         case AVRC_PDU_GET_PLAYER_APP_VALUE_TEXT:
   1085         {
   1086             /* TODO: Add support for Application Settings */
   1087             send_reject_response (btif_rc_cb.rc_handle, label, pavrc_cmd->pdu, AVRC_STS_BAD_CMD);
   1088         }
   1089         break;
   1090         case AVRC_PDU_GET_ELEMENT_ATTR:
   1091         {
   1092             btrc_media_attr_t element_attrs[BTRC_MAX_ELEM_ATTR_SIZE];
   1093             UINT8 num_attr;
   1094              memset(&element_attrs, 0, sizeof(element_attrs));
   1095             if (pavrc_cmd->get_elem_attrs.num_attr == 0)
   1096             {
   1097                 /* CT requests for all attributes */
   1098                 int attr_cnt;
   1099                 num_attr = BTRC_MAX_ELEM_ATTR_SIZE;
   1100                 for (attr_cnt = 0; attr_cnt < BTRC_MAX_ELEM_ATTR_SIZE; attr_cnt++)
   1101                 {
   1102                     element_attrs[attr_cnt] = attr_cnt + 1;
   1103                 }
   1104             }
   1105             else if (pavrc_cmd->get_elem_attrs.num_attr == 0xFF)
   1106             {
   1107                 /* 0xff indicates, no attributes requested - reject */
   1108                 send_reject_response (btif_rc_cb.rc_handle, label, pavrc_cmd->pdu,
   1109                     AVRC_STS_BAD_PARAM);
   1110                 return;
   1111             }
   1112             else
   1113             {
   1114                 int attr_cnt, filled_attr_count;
   1115 
   1116                 num_attr = 0;
   1117                 /* Attribute IDs from 1 to AVRC_MAX_NUM_MEDIA_ATTR_ID are only valid,
   1118                  * hence HAL definition limits the attributes to AVRC_MAX_NUM_MEDIA_ATTR_ID.
   1119                  * Fill only valid entries.
   1120                  */
   1121                 for (attr_cnt = 0; (attr_cnt < pavrc_cmd->get_elem_attrs.num_attr) &&
   1122                     (num_attr < AVRC_MAX_NUM_MEDIA_ATTR_ID); attr_cnt++)
   1123                 {
   1124                     if ((pavrc_cmd->get_elem_attrs.attrs[attr_cnt] > 0) &&
   1125                         (pavrc_cmd->get_elem_attrs.attrs[attr_cnt] <= AVRC_MAX_NUM_MEDIA_ATTR_ID))
   1126                     {
   1127                         /* Skip the duplicate entries : PTS sends duplicate entries for Fragment cases
   1128                          */
   1129                         for (filled_attr_count = 0; filled_attr_count < num_attr; filled_attr_count++)
   1130                         {
   1131                             if (element_attrs[filled_attr_count] == pavrc_cmd->get_elem_attrs.attrs[attr_cnt])
   1132                                 break;
   1133                         }
   1134                         if (filled_attr_count == num_attr)
   1135                         {
   1136                             element_attrs[num_attr] = pavrc_cmd->get_elem_attrs.attrs[attr_cnt];
   1137                             num_attr++;
   1138                         }
   1139                     }
   1140                 }
   1141             }
   1142             FILL_PDU_QUEUE(IDX_GET_ELEMENT_ATTR_RSP, ctype, label, TRUE);
   1143             HAL_CBACK(bt_rc_callbacks, get_element_attr_cb, num_attr, element_attrs);
   1144         }
   1145         break;
   1146         case AVRC_PDU_REGISTER_NOTIFICATION:
   1147         {
   1148             if(pavrc_cmd->reg_notif.event_id == BTRC_EVT_PLAY_POS_CHANGED &&
   1149                 pavrc_cmd->reg_notif.param == 0)
   1150             {
   1151                 BTIF_TRACE_WARNING("%s Device registering position changed with illegal param 0.",
   1152                     __FUNCTION__);
   1153                 send_reject_response (btif_rc_cb.rc_handle, label, pavrc_cmd->pdu, AVRC_STS_BAD_PARAM);
   1154                 /* de-register this notification for a rejected response */
   1155                 btif_rc_cb.rc_notif[BTRC_EVT_PLAY_POS_CHANGED - 1].bNotify = FALSE;
   1156                 return;
   1157             }
   1158             HAL_CBACK(bt_rc_callbacks, register_notification_cb, pavrc_cmd->reg_notif.event_id,
   1159                 pavrc_cmd->reg_notif.param);
   1160         }
   1161         break;
   1162         case AVRC_PDU_INFORM_DISPLAY_CHARSET:
   1163         {
   1164             tAVRC_RESPONSE avrc_rsp;
   1165             BTIF_TRACE_EVENT("%s() AVRC_PDU_INFORM_DISPLAY_CHARSET", __FUNCTION__);
   1166             if(btif_rc_cb.rc_connected == TRUE)
   1167             {
   1168                 memset(&(avrc_rsp.inform_charset), 0, sizeof(tAVRC_RSP));
   1169                 avrc_rsp.inform_charset.opcode=opcode_from_pdu(AVRC_PDU_INFORM_DISPLAY_CHARSET);
   1170                 avrc_rsp.inform_charset.pdu=AVRC_PDU_INFORM_DISPLAY_CHARSET;
   1171                 avrc_rsp.inform_charset.status=AVRC_STS_NO_ERROR;
   1172                 send_metamsg_rsp(btif_rc_cb.rc_handle, label, ctype, &avrc_rsp);
   1173             }
   1174         }
   1175         break;
   1176         default:
   1177         {
   1178         send_reject_response (btif_rc_cb.rc_handle, label, pavrc_cmd->pdu,
   1179             (pavrc_cmd->pdu == AVRC_PDU_SEARCH)?AVRC_STS_SEARCH_NOT_SUP:AVRC_STS_BAD_CMD);
   1180         return;
   1181         }
   1182         break;
   1183     }
   1184 
   1185 }
   1186 
   1187 
   1188 /*******************************************************************************
   1189 **
   1190 ** Function         btif_rc_upstreams_rsp_evt
   1191 **
   1192 ** Description      Executes AVRC UPSTREAMS response events in btif context.
   1193 **
   1194 ** Returns          void
   1195 **
   1196 *******************************************************************************/
   1197 static void btif_rc_upstreams_rsp_evt(UINT16 event, tAVRC_RESPONSE *pavrc_resp, UINT8 ctype, UINT8 label)
   1198 {
   1199     BTIF_TRACE_EVENT("%s pdu: %s handle: 0x%x ctype:%x label:%x", __FUNCTION__,
   1200         dump_rc_pdu(pavrc_resp->pdu), btif_rc_cb.rc_handle, ctype, label);
   1201 
   1202 #if (AVRC_ADV_CTRL_INCLUDED == TRUE)
   1203     switch (event)
   1204     {
   1205         case AVRC_PDU_REGISTER_NOTIFICATION:
   1206         {
   1207              if(AVRC_RSP_CHANGED==ctype)
   1208                  btif_rc_cb.rc_volume=pavrc_resp->reg_notif.param.volume;
   1209              HAL_CBACK(bt_rc_callbacks, volume_change_cb, pavrc_resp->reg_notif.param.volume,ctype)
   1210         }
   1211         break;
   1212 
   1213         case AVRC_PDU_SET_ABSOLUTE_VOLUME:
   1214         {
   1215             BTIF_TRACE_DEBUG("Set absolute volume change event received: volume %d,ctype %d",
   1216                 pavrc_resp->volume.volume,ctype);
   1217             if(AVRC_RSP_ACCEPT==ctype)
   1218                 btif_rc_cb.rc_volume=pavrc_resp->volume.volume;
   1219             HAL_CBACK(bt_rc_callbacks,volume_change_cb,pavrc_resp->volume.volume,ctype)
   1220         }
   1221         break;
   1222 
   1223         default:
   1224             return;
   1225     }
   1226 #endif
   1227 }
   1228 
   1229 /************************************************************************************
   1230 **  AVRCP API Functions
   1231 ************************************************************************************/
   1232 
   1233 /*******************************************************************************
   1234 **
   1235 ** Function         init
   1236 **
   1237 ** Description      Initializes the AVRC interface
   1238 **
   1239 ** Returns          bt_status_t
   1240 **
   1241 *******************************************************************************/
   1242 static bt_status_t init(btrc_callbacks_t* callbacks )
   1243 {
   1244     BTIF_TRACE_EVENT("## %s ##", __FUNCTION__);
   1245     bt_status_t result = BT_STATUS_SUCCESS;
   1246 
   1247     if (bt_rc_callbacks)
   1248         return BT_STATUS_DONE;
   1249 
   1250     bt_rc_callbacks = callbacks;
   1251     memset (&btif_rc_cb, 0, sizeof(btif_rc_cb));
   1252     btif_rc_cb.rc_vol_label=MAX_LABEL;
   1253     btif_rc_cb.rc_volume=MAX_VOLUME;
   1254     lbl_init();
   1255 
   1256     return result;
   1257 }
   1258 
   1259 /*******************************************************************************
   1260 **
   1261 ** Function         init_ctrl
   1262 **
   1263 ** Description      Initializes the AVRC interface
   1264 **
   1265 ** Returns          bt_status_t
   1266 **
   1267 *******************************************************************************/
   1268 static bt_status_t init_ctrl(btrc_ctrl_callbacks_t* callbacks )
   1269 {
   1270     BTIF_TRACE_EVENT("## %s ##", __FUNCTION__);
   1271     bt_status_t result = BT_STATUS_SUCCESS;
   1272 
   1273     if (bt_rc_ctrl_callbacks)
   1274         return BT_STATUS_DONE;
   1275 
   1276     bt_rc_ctrl_callbacks = callbacks;
   1277     memset (&btif_rc_cb, 0, sizeof(btif_rc_cb));
   1278     btif_rc_cb.rc_vol_label=MAX_LABEL;
   1279     btif_rc_cb.rc_volume=MAX_VOLUME;
   1280     lbl_init();
   1281 
   1282     return result;
   1283 }
   1284 
   1285 /***************************************************************************
   1286 **
   1287 ** Function         get_play_status_rsp
   1288 **
   1289 ** Description      Returns the current play status.
   1290 **                      This method is called in response to
   1291 **                      GetPlayStatus request.
   1292 **
   1293 ** Returns          bt_status_t
   1294 **
   1295 ***************************************************************************/
   1296 static bt_status_t get_play_status_rsp(btrc_play_status_t play_status, uint32_t song_len,
   1297     uint32_t song_pos)
   1298 {
   1299     tAVRC_RESPONSE avrc_rsp;
   1300     CHECK_RC_CONNECTED
   1301     memset(&(avrc_rsp.get_play_status), 0, sizeof(tAVRC_GET_PLAY_STATUS_RSP));
   1302     avrc_rsp.get_play_status.song_len = song_len;
   1303     avrc_rsp.get_play_status.song_pos = song_pos;
   1304     avrc_rsp.get_play_status.play_status = play_status;
   1305 
   1306     avrc_rsp.get_play_status.pdu = AVRC_PDU_GET_PLAY_STATUS;
   1307     avrc_rsp.get_play_status.opcode = opcode_from_pdu(AVRC_PDU_GET_PLAY_STATUS);
   1308     avrc_rsp.get_play_status.status = AVRC_STS_NO_ERROR;
   1309     /* Send the response */
   1310     SEND_METAMSG_RSP(IDX_GET_PLAY_STATUS_RSP, &avrc_rsp);
   1311     return BT_STATUS_SUCCESS;
   1312 }
   1313 
   1314 /***************************************************************************
   1315 **
   1316 ** Function         get_element_attr_rsp
   1317 **
   1318 ** Description      Returns the current songs' element attributes
   1319 **                      in text.
   1320 **
   1321 ** Returns          bt_status_t
   1322 **
   1323 ***************************************************************************/
   1324 static bt_status_t get_element_attr_rsp(uint8_t num_attr, btrc_element_attr_val_t *p_attrs)
   1325 {
   1326     tAVRC_RESPONSE avrc_rsp;
   1327     UINT32 i;
   1328     tAVRC_ATTR_ENTRY element_attrs[BTRC_MAX_ELEM_ATTR_SIZE];
   1329     CHECK_RC_CONNECTED
   1330     memset(element_attrs, 0, sizeof(tAVRC_ATTR_ENTRY) * num_attr);
   1331 
   1332     if (num_attr == 0)
   1333     {
   1334         avrc_rsp.get_play_status.status = AVRC_STS_BAD_PARAM;
   1335     }
   1336     else
   1337     {
   1338         for (i=0; i<num_attr; i++) {
   1339             element_attrs[i].attr_id = p_attrs[i].attr_id;
   1340             element_attrs[i].name.charset_id = AVRC_CHARSET_ID_UTF8;
   1341             element_attrs[i].name.str_len = (UINT16)strlen((char *)p_attrs[i].text);
   1342             element_attrs[i].name.p_str = p_attrs[i].text;
   1343             BTIF_TRACE_DEBUG("%s attr_id:0x%x, charset_id:0x%x, str_len:%d, str:%s",
   1344                 __FUNCTION__, (unsigned int)element_attrs[i].attr_id,
   1345                 element_attrs[i].name.charset_id, element_attrs[i].name.str_len,
   1346                 element_attrs[i].name.p_str);
   1347         }
   1348         avrc_rsp.get_play_status.status = AVRC_STS_NO_ERROR;
   1349     }
   1350     avrc_rsp.get_elem_attrs.num_attr = num_attr;
   1351     avrc_rsp.get_elem_attrs.p_attrs = element_attrs;
   1352     avrc_rsp.get_elem_attrs.pdu = AVRC_PDU_GET_ELEMENT_ATTR;
   1353     avrc_rsp.get_elem_attrs.opcode = opcode_from_pdu(AVRC_PDU_GET_ELEMENT_ATTR);
   1354     /* Send the response */
   1355     SEND_METAMSG_RSP(IDX_GET_ELEMENT_ATTR_RSP, &avrc_rsp);
   1356     return BT_STATUS_SUCCESS;
   1357 }
   1358 
   1359 /***************************************************************************
   1360 **
   1361 ** Function         register_notification_rsp
   1362 **
   1363 ** Description      Response to the register notification request.
   1364 **                      in text.
   1365 **
   1366 ** Returns          bt_status_t
   1367 **
   1368 ***************************************************************************/
   1369 static bt_status_t register_notification_rsp(btrc_event_id_t event_id,
   1370     btrc_notification_type_t type, btrc_register_notification_t *p_param)
   1371 {
   1372     tAVRC_RESPONSE avrc_rsp;
   1373     CHECK_RC_CONNECTED
   1374     BTIF_TRACE_EVENT("## %s ## event_id:%s", __FUNCTION__, dump_rc_notification_event_id(event_id));
   1375     if (btif_rc_cb.rc_notif[event_id-1].bNotify == FALSE)
   1376     {
   1377         BTIF_TRACE_ERROR("Avrcp Event id not registered: event_id = %x", event_id);
   1378         return BT_STATUS_NOT_READY;
   1379     }
   1380     memset(&(avrc_rsp.reg_notif), 0, sizeof(tAVRC_REG_NOTIF_RSP));
   1381     avrc_rsp.reg_notif.event_id = event_id;
   1382 
   1383     switch(event_id)
   1384     {
   1385         case BTRC_EVT_PLAY_STATUS_CHANGED:
   1386             avrc_rsp.reg_notif.param.play_status = p_param->play_status;
   1387             if (avrc_rsp.reg_notif.param.play_status == PLAY_STATUS_PLAYING)
   1388                 btif_av_clear_remote_suspend_flag();
   1389             break;
   1390         case BTRC_EVT_TRACK_CHANGE:
   1391             memcpy(&(avrc_rsp.reg_notif.param.track), &(p_param->track), sizeof(btrc_uid_t));
   1392             break;
   1393         case BTRC_EVT_PLAY_POS_CHANGED:
   1394             avrc_rsp.reg_notif.param.play_pos = p_param->song_pos;
   1395             break;
   1396         default:
   1397             BTIF_TRACE_WARNING("%s : Unhandled event ID : 0x%x", __FUNCTION__, event_id);
   1398             return BT_STATUS_UNHANDLED;
   1399     }
   1400 
   1401     avrc_rsp.reg_notif.pdu = AVRC_PDU_REGISTER_NOTIFICATION;
   1402     avrc_rsp.reg_notif.opcode = opcode_from_pdu(AVRC_PDU_REGISTER_NOTIFICATION);
   1403     avrc_rsp.get_play_status.status = AVRC_STS_NO_ERROR;
   1404 
   1405     /* Send the response. */
   1406     send_metamsg_rsp(btif_rc_cb.rc_handle, btif_rc_cb.rc_notif[event_id-1].label,
   1407         ((type == BTRC_NOTIFICATION_TYPE_INTERIM)?AVRC_CMD_NOTIF:AVRC_RSP_CHANGED), &avrc_rsp);
   1408     return BT_STATUS_SUCCESS;
   1409 }
   1410 
   1411 /***************************************************************************
   1412 **
   1413 ** Function         set_volume
   1414 **
   1415 ** Description      Send current volume setting to remote side.
   1416 **                  Support limited to SetAbsoluteVolume
   1417 **                  This can be enhanced to support Relative Volume (AVRCP 1.0).
   1418 **                  With RelateVolume, we will send VOLUME_UP/VOLUME_DOWN
   1419 **                  as opposed to absolute volume level
   1420 ** volume: Should be in the range 0-127. bit7 is reseved and cannot be set
   1421 **
   1422 ** Returns          bt_status_t
   1423 **
   1424 ***************************************************************************/
   1425 static bt_status_t set_volume(uint8_t volume)
   1426 {
   1427     BTIF_TRACE_DEBUG("%s", __FUNCTION__);
   1428     CHECK_RC_CONNECTED
   1429     tAVRC_STS status = BT_STATUS_UNSUPPORTED;
   1430     rc_transaction_t *p_transaction=NULL;
   1431 
   1432     if(btif_rc_cb.rc_volume==volume)
   1433     {
   1434         status=BT_STATUS_DONE;
   1435         BTIF_TRACE_ERROR("%s: volume value already set earlier: 0x%02x",__FUNCTION__, volume);
   1436         return status;
   1437     }
   1438 
   1439     if ((btif_rc_cb.rc_features & BTA_AV_FEAT_RCTG) &&
   1440         (btif_rc_cb.rc_features & BTA_AV_FEAT_ADV_CTRL))
   1441     {
   1442         tAVRC_COMMAND avrc_cmd = {0};
   1443         BT_HDR *p_msg = NULL;
   1444 
   1445         BTIF_TRACE_DEBUG("%s: Peer supports absolute volume. newVolume=%d", __FUNCTION__, volume);
   1446         avrc_cmd.volume.opcode = AVRC_OP_VENDOR;
   1447         avrc_cmd.volume.pdu = AVRC_PDU_SET_ABSOLUTE_VOLUME;
   1448         avrc_cmd.volume.status = AVRC_STS_NO_ERROR;
   1449         avrc_cmd.volume.volume = volume;
   1450 
   1451         if (AVRC_BldCommand(&avrc_cmd, &p_msg) == AVRC_STS_NO_ERROR)
   1452         {
   1453             bt_status_t tran_status=get_transaction(&p_transaction);
   1454             if(BT_STATUS_SUCCESS == tran_status && NULL!=p_transaction)
   1455             {
   1456                 BTIF_TRACE_DEBUG("%s msgreq being sent out with label %d",
   1457                                    __FUNCTION__,p_transaction->lbl);
   1458                 BTA_AvMetaCmd(btif_rc_cb.rc_handle,p_transaction->lbl, AVRC_CMD_CTRL, p_msg);
   1459                 status =  BT_STATUS_SUCCESS;
   1460             }
   1461             else
   1462             {
   1463                 if(NULL!=p_msg)
   1464                    GKI_freebuf(p_msg);
   1465                 BTIF_TRACE_ERROR("%s: failed to obtain transaction details. status: 0x%02x",
   1466                                     __FUNCTION__, tran_status);
   1467                 status = BT_STATUS_FAIL;
   1468             }
   1469         }
   1470         else
   1471         {
   1472             BTIF_TRACE_ERROR("%s: failed to build absolute volume command. status: 0x%02x",
   1473                                 __FUNCTION__, status);
   1474             status = BT_STATUS_FAIL;
   1475         }
   1476     }
   1477     else
   1478         status=BT_STATUS_NOT_READY;
   1479     return status;
   1480 }
   1481 
   1482 
   1483 /***************************************************************************
   1484 **
   1485 ** Function         register_volumechange
   1486 **
   1487 ** Description     Register for volume change notification from remote side.
   1488 **
   1489 ** Returns          void
   1490 **
   1491 ***************************************************************************/
   1492 
   1493 static void register_volumechange (UINT8 lbl)
   1494 {
   1495     tAVRC_COMMAND avrc_cmd = {0};
   1496     BT_HDR *p_msg = NULL;
   1497     tAVRC_STS BldResp=AVRC_STS_BAD_CMD;
   1498     rc_transaction_t *p_transaction=NULL;
   1499 
   1500     BTIF_TRACE_DEBUG("%s called with label:%d",__FUNCTION__,lbl);
   1501 
   1502     avrc_cmd.cmd.opcode=0x00;
   1503     avrc_cmd.pdu = AVRC_PDU_REGISTER_NOTIFICATION;
   1504     avrc_cmd.reg_notif.event_id = AVRC_EVT_VOLUME_CHANGE;
   1505     avrc_cmd.reg_notif.status = AVRC_STS_NO_ERROR;
   1506 
   1507     BldResp=AVRC_BldCommand(&avrc_cmd, &p_msg);
   1508     if(AVRC_STS_NO_ERROR==BldResp && p_msg)
   1509     {
   1510          p_transaction=get_transaction_by_lbl(lbl);
   1511          if(NULL!=p_transaction)
   1512          {
   1513              BTA_AvMetaCmd(btif_rc_cb.rc_handle,p_transaction->lbl, AVRC_CMD_NOTIF, p_msg);
   1514              BTIF_TRACE_DEBUG("%s:BTA_AvMetaCmd called",__FUNCTION__);
   1515          }
   1516          else
   1517          {
   1518             if(NULL!=p_msg)
   1519                GKI_freebuf(p_msg);
   1520             BTIF_TRACE_ERROR("%s transaction not obtained with label: %d",__FUNCTION__,lbl);
   1521          }
   1522     }
   1523     else
   1524         BTIF_TRACE_ERROR("%s failed to build command:%d",__FUNCTION__,BldResp);
   1525 }
   1526 
   1527 
   1528 /***************************************************************************
   1529 **
   1530 ** Function         handle_rc_metamsg_rsp
   1531 **
   1532 ** Description      Handle RC metamessage response
   1533 **
   1534 ** Returns          void
   1535 **
   1536 ***************************************************************************/
   1537 static void handle_rc_metamsg_rsp(tBTA_AV_META_MSG *pmeta_msg)
   1538 {
   1539     tAVRC_RESPONSE    avrc_response = {0};
   1540     UINT8             scratch_buf[512] = {0};
   1541     tAVRC_STS status = BT_STATUS_UNSUPPORTED;
   1542 
   1543     if(AVRC_OP_VENDOR==pmeta_msg->p_msg->hdr.opcode &&(AVRC_RSP_CHANGED==pmeta_msg->code
   1544       || AVRC_RSP_INTERIM==pmeta_msg->code || AVRC_RSP_ACCEPT==pmeta_msg->code
   1545       || AVRC_RSP_REJ==pmeta_msg->code || AVRC_RSP_NOT_IMPL==pmeta_msg->code))
   1546     {
   1547         status=AVRC_ParsResponse(pmeta_msg->p_msg, &avrc_response, scratch_buf, sizeof(scratch_buf));
   1548         BTIF_TRACE_DEBUG("%s: code %d,event ID %d,PDU %x,parsing status %d, label:%d",
   1549           __FUNCTION__,pmeta_msg->code,avrc_response.reg_notif.event_id,avrc_response.reg_notif.pdu,
   1550           status, pmeta_msg->label);
   1551 
   1552         if (status != AVRC_STS_NO_ERROR)
   1553         {
   1554             if(AVRC_PDU_REGISTER_NOTIFICATION==avrc_response.rsp.pdu
   1555                 && AVRC_EVT_VOLUME_CHANGE==avrc_response.reg_notif.event_id
   1556                 && btif_rc_cb.rc_vol_label==pmeta_msg->label)
   1557             {
   1558                 btif_rc_cb.rc_vol_label=MAX_LABEL;
   1559                 release_transaction(btif_rc_cb.rc_vol_label);
   1560             }
   1561             else if(AVRC_PDU_SET_ABSOLUTE_VOLUME==avrc_response.rsp.pdu)
   1562             {
   1563                 release_transaction(pmeta_msg->label);
   1564             }
   1565             return;
   1566         }
   1567         else if(AVRC_PDU_REGISTER_NOTIFICATION==avrc_response.rsp.pdu
   1568             && AVRC_EVT_VOLUME_CHANGE==avrc_response.reg_notif.event_id
   1569             && btif_rc_cb.rc_vol_label!=pmeta_msg->label)
   1570             {
   1571                 // Just discard the message, if the device sends back with an incorrect label
   1572                 BTIF_TRACE_DEBUG("%s:Discarding register notfn in rsp.code: %d and label %d",
   1573                 __FUNCTION__, pmeta_msg->code, pmeta_msg->label);
   1574                 return;
   1575             }
   1576     }
   1577     else
   1578     {
   1579         BTIF_TRACE_DEBUG("%s:Received vendor dependent in adv ctrl rsp. code: %d len: %d. Not processing it.",
   1580         __FUNCTION__, pmeta_msg->code, pmeta_msg->len);
   1581         return;
   1582     }
   1583 
   1584     if(AVRC_PDU_REGISTER_NOTIFICATION==avrc_response.rsp.pdu
   1585         && AVRC_EVT_VOLUME_CHANGE==avrc_response.reg_notif.event_id
   1586         && AVRC_RSP_CHANGED==pmeta_msg->code)
   1587      {
   1588          /* re-register for volume change notification */
   1589          // Do not re-register for rejected case, as it might get into endless loop
   1590          register_volumechange(btif_rc_cb.rc_vol_label);
   1591      }
   1592      else if(AVRC_PDU_SET_ABSOLUTE_VOLUME==avrc_response.rsp.pdu)
   1593      {
   1594           /* free up the label here */
   1595           release_transaction(pmeta_msg->label);
   1596      }
   1597 
   1598      BTIF_TRACE_EVENT("%s: Passing received metamsg response to app. pdu: %s",
   1599              __FUNCTION__, dump_rc_pdu(avrc_response.pdu));
   1600      btif_rc_upstreams_rsp_evt((uint16_t)avrc_response.rsp.pdu, &avrc_response, pmeta_msg->code,
   1601                                 pmeta_msg->label);
   1602 }
   1603 
   1604 
   1605 /***************************************************************************
   1606 **
   1607 ** Function         cleanup
   1608 **
   1609 ** Description      Closes the AVRC interface
   1610 **
   1611 ** Returns          void
   1612 **
   1613 ***************************************************************************/
   1614 static void cleanup()
   1615 {
   1616     BTIF_TRACE_EVENT("## %s ##", __FUNCTION__);
   1617     close_uinput();
   1618     if (bt_rc_callbacks)
   1619     {
   1620         bt_rc_callbacks = NULL;
   1621     }
   1622     memset(&btif_rc_cb, 0, sizeof(btif_rc_cb_t));
   1623     lbl_destroy();
   1624     BTIF_TRACE_EVENT("## %s ## completed", __FUNCTION__);
   1625 }
   1626 
   1627 /***************************************************************************
   1628 **
   1629 ** Function         cleanup_ctrl
   1630 **
   1631 ** Description      Closes the AVRC Controller interface
   1632 **
   1633 ** Returns          void
   1634 **
   1635 ***************************************************************************/
   1636 static void cleanup_ctrl()
   1637 {
   1638     BTIF_TRACE_EVENT("## %s ##", __FUNCTION__);
   1639 
   1640     if (bt_rc_ctrl_callbacks)
   1641     {
   1642         bt_rc_ctrl_callbacks = NULL;
   1643     }
   1644     memset(&btif_rc_cb, 0, sizeof(btif_rc_cb_t));
   1645     lbl_destroy();
   1646     BTIF_TRACE_EVENT("## %s ## completed", __FUNCTION__);
   1647 }
   1648 
   1649 static bt_status_t send_passthrough_cmd(bt_bdaddr_t *bd_addr, uint8_t key_code, uint8_t key_state)
   1650 {
   1651     tAVRC_STS status = BT_STATUS_UNSUPPORTED;
   1652 #if (AVRC_CTLR_INCLUDED == TRUE)
   1653     CHECK_RC_CONNECTED
   1654     rc_transaction_t *p_transaction=NULL;
   1655     BTIF_TRACE_DEBUG("%s: key-code: %d, key-state: %d", __FUNCTION__,
   1656                                                     key_code, key_state);
   1657     if (btif_rc_cb.rc_features & BTA_AV_FEAT_RCTG)
   1658     {
   1659         bt_status_t tran_status = get_transaction(&p_transaction);
   1660         if(BT_STATUS_SUCCESS == tran_status && NULL != p_transaction)
   1661         {
   1662             BTA_AvRemoteCmd(btif_rc_cb.rc_handle, p_transaction->lbl,
   1663                 (tBTA_AV_RC)key_code, (tBTA_AV_STATE)key_state);
   1664             status =  BT_STATUS_SUCCESS;
   1665             BTIF_TRACE_DEBUG("%s: succesfully sent passthrough command to BTA", __FUNCTION__);
   1666         }
   1667         else
   1668         {
   1669             status =  BT_STATUS_FAIL;
   1670             BTIF_TRACE_DEBUG("%s: error in fetching transaction", __FUNCTION__);
   1671         }
   1672     }
   1673     else
   1674     {
   1675         status =  BT_STATUS_FAIL;
   1676         BTIF_TRACE_DEBUG("%s: feature not supported", __FUNCTION__);
   1677     }
   1678 #else
   1679     BTIF_TRACE_DEBUG("%s: feature not enabled", __FUNCTION__);
   1680 #endif
   1681     return status;
   1682 }
   1683 
   1684 static const btrc_interface_t bt_rc_interface = {
   1685     sizeof(bt_rc_interface),
   1686     init,
   1687     get_play_status_rsp,
   1688     NULL, /* list_player_app_attr_rsp */
   1689     NULL, /* list_player_app_value_rsp */
   1690     NULL, /* get_player_app_value_rsp */
   1691     NULL, /* get_player_app_attr_text_rsp */
   1692     NULL, /* get_player_app_value_text_rsp */
   1693     get_element_attr_rsp,
   1694     NULL, /* set_player_app_value_rsp */
   1695     register_notification_rsp,
   1696     set_volume,
   1697     cleanup,
   1698 };
   1699 
   1700 static const btrc_ctrl_interface_t bt_rc_ctrl_interface = {
   1701     sizeof(bt_rc_ctrl_interface),
   1702     init_ctrl,
   1703     send_passthrough_cmd,
   1704     cleanup_ctrl,
   1705 };
   1706 
   1707 /*******************************************************************************
   1708 **
   1709 ** Function         btif_rc_get_interface
   1710 **
   1711 ** Description      Get the AVRCP Target callback interface
   1712 **
   1713 ** Returns          btav_interface_t
   1714 **
   1715 *******************************************************************************/
   1716 const btrc_interface_t *btif_rc_get_interface(void)
   1717 {
   1718     BTIF_TRACE_EVENT("%s", __FUNCTION__);
   1719     return &bt_rc_interface;
   1720 }
   1721 
   1722 /*******************************************************************************
   1723 **
   1724 ** Function         btif_rc_ctrl_get_interface
   1725 **
   1726 ** Description      Get the AVRCP Controller callback interface
   1727 **
   1728 ** Returns          btav_interface_t
   1729 **
   1730 *******************************************************************************/
   1731 const btrc_ctrl_interface_t *btif_rc_ctrl_get_interface(void)
   1732 {
   1733     BTIF_TRACE_EVENT("%s", __FUNCTION__);
   1734     return &bt_rc_ctrl_interface;
   1735 }
   1736 
   1737 /*******************************************************************************
   1738 **      Function         initialize_transaction
   1739 **
   1740 **      Description    Initializes fields of the transaction structure
   1741 **
   1742 **      Returns          void
   1743 *******************************************************************************/
   1744 static void initialize_transaction(int lbl)
   1745 {
   1746     pthread_mutex_lock(&device.lbllock);
   1747     if(lbl < MAX_TRANSACTIONS_PER_SESSION)
   1748     {
   1749        device.transaction[lbl].lbl = lbl;
   1750        device.transaction[lbl].in_use=FALSE;
   1751        device.transaction[lbl].handle=0;
   1752     }
   1753     pthread_mutex_unlock(&device.lbllock);
   1754 }
   1755 
   1756 /*******************************************************************************
   1757 **      Function         lbl_init
   1758 **
   1759 **      Description    Initializes label structures and mutexes.
   1760 **
   1761 **      Returns         void
   1762 *******************************************************************************/
   1763 void lbl_init()
   1764 {
   1765     memset(&device,0,sizeof(rc_device_t));
   1766     pthread_mutexattr_t attr;
   1767     pthread_mutexattr_init(&attr);
   1768     pthread_mutex_init(&(device.lbllock), &attr);
   1769     pthread_mutexattr_destroy(&attr);
   1770     init_all_transactions();
   1771 }
   1772 
   1773 /*******************************************************************************
   1774 **
   1775 ** Function         init_all_transactions
   1776 **
   1777 ** Description    Initializes all transactions
   1778 **
   1779 ** Returns          void
   1780 *******************************************************************************/
   1781 void init_all_transactions()
   1782 {
   1783     UINT8 txn_indx=0;
   1784     for(txn_indx=0; txn_indx < MAX_TRANSACTIONS_PER_SESSION; txn_indx++)
   1785     {
   1786         initialize_transaction(txn_indx);
   1787     }
   1788 }
   1789 
   1790 /*******************************************************************************
   1791 **
   1792 ** Function         get_transaction_by_lbl
   1793 **
   1794 ** Description    Will return a transaction based on the label. If not inuse
   1795 **                     will return an error.
   1796 **
   1797 ** Returns          bt_status_t
   1798 *******************************************************************************/
   1799 rc_transaction_t *get_transaction_by_lbl(UINT8 lbl)
   1800 {
   1801     rc_transaction_t *transaction = NULL;
   1802     pthread_mutex_lock(&device.lbllock);
   1803 
   1804     /* Determine if this is a valid label */
   1805     if (lbl < MAX_TRANSACTIONS_PER_SESSION)
   1806     {
   1807         if (FALSE==device.transaction[lbl].in_use)
   1808         {
   1809             transaction = NULL;
   1810         }
   1811         else
   1812         {
   1813             transaction = &(device.transaction[lbl]);
   1814             BTIF_TRACE_DEBUG("%s: Got transaction.label: %d",__FUNCTION__,lbl);
   1815         }
   1816     }
   1817 
   1818     pthread_mutex_unlock(&device.lbllock);
   1819     return transaction;
   1820 }
   1821 
   1822 /*******************************************************************************
   1823 **
   1824 ** Function         get_transaction
   1825 **
   1826 ** Description    Obtains the transaction details.
   1827 **
   1828 ** Returns          bt_status_t
   1829 *******************************************************************************/
   1830 
   1831 bt_status_t  get_transaction(rc_transaction_t **ptransaction)
   1832 {
   1833     bt_status_t result = BT_STATUS_NOMEM;
   1834     UINT8 i=0;
   1835     pthread_mutex_lock(&device.lbllock);
   1836 
   1837     // Check for unused transactions
   1838     for (i=0; i<MAX_TRANSACTIONS_PER_SESSION; i++)
   1839     {
   1840         if (FALSE==device.transaction[i].in_use)
   1841         {
   1842             BTIF_TRACE_DEBUG("%s:Got transaction.label: %d",__FUNCTION__,device.transaction[i].lbl);
   1843             device.transaction[i].in_use = TRUE;
   1844             *ptransaction = &(device.transaction[i]);
   1845             result = BT_STATUS_SUCCESS;
   1846             break;
   1847         }
   1848     }
   1849 
   1850     pthread_mutex_unlock(&device.lbllock);
   1851     return result;
   1852 }
   1853 
   1854 
   1855 /*******************************************************************************
   1856 **
   1857 ** Function         release_transaction
   1858 **
   1859 ** Description    Will release a transaction for reuse
   1860 **
   1861 ** Returns          bt_status_t
   1862 *******************************************************************************/
   1863 void release_transaction(UINT8 lbl)
   1864 {
   1865     rc_transaction_t *transaction = get_transaction_by_lbl(lbl);
   1866 
   1867     /* If the transaction is in use... */
   1868     if (transaction != NULL)
   1869     {
   1870         BTIF_TRACE_DEBUG("%s: lbl: %d", __FUNCTION__, lbl);
   1871         initialize_transaction(lbl);
   1872     }
   1873 }
   1874 
   1875 /*******************************************************************************
   1876 **
   1877 ** Function         lbl_destroy
   1878 **
   1879 ** Description    Cleanup of the mutex
   1880 **
   1881 ** Returns          void
   1882 *******************************************************************************/
   1883 void lbl_destroy()
   1884 {
   1885     pthread_mutex_destroy(&(device.lbllock));
   1886 }
   1887 
   1888 /*******************************************************************************
   1889 **      Function       dev_blacklisted_for_absolute_volume
   1890 **
   1891 **      Description    Blacklist Devices that donot handle absolute volume well
   1892 **                     We are blacklisting all the devices that are not in whitelist
   1893 **
   1894 **      Returns        True if the device is in the list
   1895 *******************************************************************************/
   1896 static BOOLEAN dev_blacklisted_for_absolute_volume(BD_ADDR peer_dev)
   1897 {
   1898     int i;
   1899     char *dev_name_str = NULL;
   1900     int whitelist_size = sizeof(rc_white_addr_prefix)/sizeof(rc_white_addr_prefix[0]);
   1901 
   1902     for (i = 0; i < whitelist_size; i++) {
   1903         if (rc_white_addr_prefix[i][0] == peer_dev[0] &&
   1904             rc_white_addr_prefix[i][1] == peer_dev[1] &&
   1905             rc_white_addr_prefix[i][2] == peer_dev[2]) {
   1906             BTIF_TRACE_DEBUG("whitelist absolute volume for %02x:%02x:%02x",
   1907                               peer_dev[0], peer_dev[1], peer_dev[2]);
   1908             return FALSE;
   1909         }
   1910     }
   1911 
   1912     dev_name_str = BTM_SecReadDevName(peer_dev);
   1913     whitelist_size = sizeof(rc_white_name)/sizeof(char*);
   1914     if (dev_name_str != NULL) {
   1915         for (i = 0; i < whitelist_size; i++) {
   1916             if (strcmp(dev_name_str, rc_white_name[i]) == 0) {
   1917                 BTIF_TRACE_DEBUG("whitelist absolute volume for %s", dev_name_str);
   1918                 return FALSE;
   1919             }
   1920         }
   1921     }
   1922 
   1923     BTIF_TRACE_WARNING("blacklist absolute volume for %02x:%02x:%02x, name = %s",
   1924                         peer_dev[0], peer_dev[1], peer_dev[2], dev_name_str);
   1925     return TRUE;
   1926 }
   1927