btif_rc.c revision a7ae4a15e954fe143326d4f869f8dac8e76ee8ce
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 2009-2012 Broadcom Corporation
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  you may not use this file except in compliance with the License.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  You may obtain a copy of the License at:
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  See the License for the specific language governing permissions and
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  limitations under the License.
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Filename:      btif_rc.c
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Description:   Bluetooth AVRC implementation
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *****************************************************************************/
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <hardware/bluetooth.h>
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <fcntl.h>
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_api.h"
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_av_api.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "avrc_defs.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bd.h"
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define LOG_TAG "BTIF_RC"
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btif_common.h"
379adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#include "btif_util.h"
389adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#include "btif_av.h"
399adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#include "hardware/bt_rc.h"
409adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#include "uinput.h"
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Constants & Macros
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* cod value for Headsets */
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define COD_AV_HEADSETS        0x0404
489adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/* for AVRC 1.4 need to change this */
499adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#define MAX_RC_NOTIFICATIONS AVRC_EVT_APP_SETTING_CHANGE
509adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
519adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#define IDX_GET_PLAY_STATUS_RSP   0
529adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#define IDX_LIST_APP_ATTR_RSP     1
539adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#define IDX_LIST_APP_VALUE_RSP    2
549adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#define IDX_GET_CURR_APP_VAL_RSP  3
559adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#define IDX_SET_APP_VAL_RSP       4
569adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#define IDX_GET_APP_ATTR_TXT_RSP  5
579adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#define IDX_GET_APP_VAL_TXT_RSP   6
589adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#define IDX_GET_ELEMENT_ATTR_RSP  7
59247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji#define MAX_VOLUME 128
60247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji#define MAX_LABEL 16
61247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji#define MAX_TRANSACTIONS_PER_SESSION 16
629adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#define MAX_CMD_QUEUE_LEN 8
639adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
649adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#define CHECK_RC_CONNECTED                                                                  \
659adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    BTIF_TRACE_DEBUG1("## %s ##", __FUNCTION__);                                            \
669adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if(btif_rc_cb.rc_connected == FALSE)                                                    \
679adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {                                                                                       \
689adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        BTIF_TRACE_WARNING1("Function %s() called when RC is not connected", __FUNCTION__); \
699adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        return BT_STATUS_NOT_READY;                                                         \
709adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
719adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
729adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#define FILL_PDU_QUEUE(index, ctype, label, pending)        \
739adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{                                                           \
749adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    btif_rc_cb.rc_pdu_info[index].ctype = ctype;            \
759adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    btif_rc_cb.rc_pdu_info[index].label = label;            \
769adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    btif_rc_cb.rc_pdu_info[index].is_rsp_pending = pending; \
779adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
789adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
799adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#define SEND_METAMSG_RSP(index, avrc_rsp)                                                      \
809adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{                                                                                              \
819adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if(btif_rc_cb.rc_pdu_info[index].is_rsp_pending == FALSE)                                  \
829adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {                                                                                          \
839adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        BTIF_TRACE_WARNING1("%s Not sending response as no PDU was registered", __FUNCTION__); \
849adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        return BT_STATUS_UNHANDLED;                                                            \
859adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }                                                                                          \
869adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    send_metamsg_rsp(btif_rc_cb.rc_handle, btif_rc_cb.rc_pdu_info[index].label,                \
879adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        btif_rc_cb.rc_pdu_info[index].ctype, avrc_rsp);                                        \
889adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    btif_rc_cb.rc_pdu_info[index].ctype = 0;                                                   \
899adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    btif_rc_cb.rc_pdu_info[index].label = 0;                                                   \
909adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    btif_rc_cb.rc_pdu_info[index].is_rsp_pending = FALSE;                                      \
919adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Local type definitions
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct {
979adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    UINT8 bNotify;
989adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    UINT8 label;
999adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan} btif_rc_reg_notifications_t;
1009adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
1019adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajantypedef struct
1029adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
1039adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    UINT8   label;
1049adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    UINT8   ctype;
1059adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    BOOLEAN is_rsp_pending;
1069adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan} btif_rc_cmd_ctxt_t;
1079adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
1089adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/* TODO : Merge btif_rc_reg_notifications_t and btif_rc_cmd_ctxt_t to a single struct */
1099adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajantypedef struct {
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN                     rc_connected;
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                       rc_handle;
1129adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tBTA_AV_FEAT                rc_features;
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BD_ADDR                     rc_addr;
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16                      rc_pending_play;
1159adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    btif_rc_cmd_ctxt_t          rc_pdu_info[MAX_CMD_QUEUE_LEN];
1169adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    btif_rc_reg_notifications_t rc_notif[MAX_RC_NOTIFICATIONS];
117247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    unsigned int                rc_volume;
118247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    uint8_t                     rc_vol_label;
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} btif_rc_cb_t;
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
121247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojitypedef struct {
122247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    BOOLEAN in_use;
123247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    UINT8 lbl;
124247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    UINT8 handle;
125247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji} rc_transaction_t;
126247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
127247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojitypedef struct
128247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
129247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutex_t lbllock;
130247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    rc_transaction_t transaction[MAX_TRANSACTIONS_PER_SESSION];
131247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji} rc_device_t;
132247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
133247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
134247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojirc_device_t device;
135247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define MAX_UINPUT_PATHS 3
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const char* uinput_dev_path[] =
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       {"/dev/uinput", "/dev/input/uinput", "/dev/misc/uinput" };
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int uinput_fd = -1;
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int  send_event (int fd, uint16_t type, uint16_t code, int32_t value);
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void send_key (int fd, uint16_t key, int pressed);
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int  uinput_driver_check();
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int  uinput_create(char *name);
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int  init_uinput (void);
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void close_uinput (void);
147a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xiestatic BOOLEAN dev_blacklisted_for_absolute_volume(BD_ADDR peer_dev);
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1499adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic const struct {
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    const char *name;
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    uint8_t avrcp;
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    uint16_t mapped_id;
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    uint8_t release_quirk;
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} key_map[] = {
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    { "PLAY",         AVRC_ID_PLAY,     KEY_PLAYCD,       1 },
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    { "STOP",         AVRC_ID_STOP,     KEY_STOPCD,       0 },
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    { "PAUSE",        AVRC_ID_PAUSE,    KEY_PAUSECD,      1 },
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    { "FORWARD",      AVRC_ID_FORWARD,  KEY_NEXTSONG,     0 },
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    { "BACKWARD",     AVRC_ID_BACKWARD, KEY_PREVIOUSSONG, 0 },
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    { "REWIND",       AVRC_ID_REWIND,   KEY_REWIND,       0 },
16198497a520010fc996a8ce490665cac6c1439dd2dJohn Du    { "FAST FORWARD", AVRC_ID_FAST_FOR, KEY_FAST_FORWARD, 0 },
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    { NULL,           0,                0,                0 }
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
165a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xiestatic const UINT8 rc_black_addr_prefix[][3] = {
166a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie    {0x0, 0x18, 0x6b}, // HBS-730
167a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie    {0x0, 0x26, 0x7E}  // VW Passat
168a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie};
169a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie
1709adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic void send_reject_response (UINT8 rc_handle, UINT8 label,
1719adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    UINT8 pdu, UINT8 status);
1729adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic UINT8 opcode_from_pdu(UINT8 pdu);
1739adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic void send_metamsg_rsp (UINT8 rc_handle, UINT8 label,
1749adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tBTA_AV_CODE code, tAVRC_RESPONSE *pmetamsg_resp);
175247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic void register_volumechange(UINT8 label);
176247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic void lbl_init();
177247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic void lbl_destroy();
178247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic void init_all_transactions();
179247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic bt_status_t  get_transaction(rc_transaction_t **ptransaction);
180247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic void release_transaction(UINT8 label);
181247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic rc_transaction_t* get_transaction_by_lbl(UINT8 label);
182247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic void handle_rc_metamsg_rsp(tBTA_AV_META_MSG *pmeta_msg);
1839adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic void btif_rc_upstreams_evt(UINT16 event, tAVRC_COMMAND* p_param, UINT8 ctype, UINT8 label);
184247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic void btif_rc_upstreams_rsp_evt(UINT16 event, tAVRC_RESPONSE *pavrc_resp, UINT8 ctype, UINT8 label);
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Static variables
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic btif_rc_cb_t btif_rc_cb;
1909adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic btrc_callbacks_t *bt_rc_callbacks = NULL;
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Static functions
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Externs
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern BOOLEAN btif_hf_call_terminated_recently();
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern BOOLEAN check_cod(const bt_bdaddr_t *remote_bdaddr, uint32_t cod);
2019adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Functions
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**   Local uinput helper functions
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint send_event (int fd, uint16_t type, uint16_t code, int32_t value)
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    struct uinput_event event;
2139adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    BTIF_TRACE_DEBUG4("%s type:%u code:%u value:%d", __FUNCTION__,
2149adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        type, code, value);
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&event, 0, sizeof(event));
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    event.type  = type;
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    event.code  = code;
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    event.value = value;
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return write(fd, &event, sizeof(event));
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid send_key (int fd, uint16_t key, int pressed)
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2259adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    BTIF_TRACE_DEBUG4("%s fd:%d key:%u pressed:%d", __FUNCTION__,
2269adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        fd, key, pressed);
2279adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
2289adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (fd < 0)
2299adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_TRACE_DEBUG3("AVRCP: Send key %d (%d) fd=%d", key, pressed, fd);
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    send_event(fd, EV_KEY, key, pressed);
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    send_event(fd, EV_SYN, SYN_REPORT, 0);
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************** uinput related functions **************/
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint uinput_driver_check()
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    uint32_t i;
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i=0; i < MAX_UINPUT_PATHS; i++)
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (access(uinput_dev_path[i], O_RDWR) == 0) {
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           return 0;
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_TRACE_ERROR1("%s ERROR: uinput device is not in the system", __FUNCTION__);
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return -1;
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint uinput_create(char *name)
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    struct uinput_dev dev;
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int fd, err, x = 0;
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for(x=0; x < MAX_UINPUT_PATHS; x++)
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        fd = open(uinput_dev_path[x], O_RDWR);
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (fd < 0)
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            continue;
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (x == MAX_UINPUT_PATHS) {
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTIF_TRACE_ERROR1("%s ERROR: uinput device open failed", __FUNCTION__);
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return -1;
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&dev, 0, sizeof(dev));
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (name)
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        strncpy(dev.name, name, UINPUT_MAX_NAME_SIZE);
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    dev.id.bustype = BUS_BLUETOOTH;
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    dev.id.vendor  = 0x0000;
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    dev.id.product = 0x0000;
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    dev.id.version = 0x0000;
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (write(fd, &dev, sizeof(dev)) < 0) {
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTIF_TRACE_ERROR1("%s Unable to write device information", __FUNCTION__);
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        close(fd);
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return -1;
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ioctl(fd, UI_SET_EVBIT, EV_KEY);
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ioctl(fd, UI_SET_EVBIT, EV_REL);
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ioctl(fd, UI_SET_EVBIT, EV_SYN);
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (x = 0; key_map[x].name != NULL; x++)
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ioctl(fd, UI_SET_KEYBIT, key_map[x].mapped_id);
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for(x = 0; x < KEY_MAX; x++)
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ioctl(fd, UI_SET_KEYBIT, x);
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (ioctl(fd, UI_DEV_CREATE, NULL) < 0) {
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTIF_TRACE_ERROR1("%s Unable to create uinput device", __FUNCTION__);
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        close(fd);
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return -1;
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return fd;
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint init_uinput (void)
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char *name = "AVRCP";
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    uinput_fd = uinput_create(name);
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (uinput_fd < 0) {
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTIF_TRACE_ERROR3("%s AVRCP: Failed to initialize uinput for %s (%d)",
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          __FUNCTION__, name, uinput_fd);
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    } else {
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTIF_TRACE_DEBUG3("%s AVRCP: Initialized uinput for %s (fd=%d)",
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          __FUNCTION__, name, uinput_fd);
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return uinput_fd;
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid close_uinput (void)
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (uinput_fd > 0) {
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ioctl(uinput_fd, UI_DEV_DESTROY);
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        close(uinput_fd);
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        uinput_fd = -1;
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
328247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojivoid handle_rc_features()
329247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
330247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    btrc_remote_features_t rc_features = BTRC_FEAT_NONE;
331247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    bt_bdaddr_t rc_addr;
332247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    bdcpy(rc_addr.address, btif_rc_cb.rc_addr);
3339adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
334a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie    if (dev_blacklisted_for_absolute_volume(btif_rc_cb.rc_addr))
335a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie    {
336a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie        btif_rc_cb.rc_features &= ~BTA_AV_FEAT_ADV_CTRL;
337a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie    }
338a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie
339247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if (btif_rc_cb.rc_features & BTA_AV_FEAT_BROWSE)
340247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
341247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        rc_features |= BTRC_FEAT_BROWSE;
342247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
343247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if ( (btif_rc_cb.rc_features & BTA_AV_FEAT_ADV_CTRL) &&
344247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         (btif_rc_cb.rc_features & BTA_AV_FEAT_RCTG))
345247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
346247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        rc_features |= BTRC_FEAT_ABSOLUTE_VOLUME;
347247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
348247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if (btif_rc_cb.rc_features & BTA_AV_FEAT_METADATA)
349247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
350247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        rc_features |= BTRC_FEAT_METADATA;
351247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
352247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    BTIF_TRACE_DEBUG2("%s: rc_features=0x%x", __FUNCTION__, rc_features);
353247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    HAL_CBACK(bt_rc_callbacks, remote_features_cb, &rc_addr, rc_features)
354247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
355247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji#if (AVRC_ADV_CTRL_INCLUDED == TRUE)
356247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     BTIF_TRACE_DEBUG1("Checking for feature flags in btif_rc_handler with label %d",
357247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                        btif_rc_cb.rc_vol_label);
358247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     // Register for volume change on connect
359247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji      if(btif_rc_cb.rc_features & BTA_AV_FEAT_ADV_CTRL &&
360247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         btif_rc_cb.rc_features & BTA_AV_FEAT_RCTG)
361247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji      {
362247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         rc_transaction_t *p_transaction=NULL;
363247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         bt_status_t status = BT_STATUS_NOT_READY;
364247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         if(MAX_LABEL==btif_rc_cb.rc_vol_label)
365247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         {
366247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            status=get_transaction(&p_transaction);
367247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         }
368247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         else
369247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         {
370247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            p_transaction=get_transaction_by_lbl(btif_rc_cb.rc_vol_label);
371247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            if(NULL!=p_transaction)
372247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            {
373247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji               BTIF_TRACE_DEBUG1("register_volumechange already in progress for label %d",
374247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                                  btif_rc_cb.rc_vol_label);
375247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji               return;
376247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            }
377247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            else
378247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji              status=get_transaction(&p_transaction);
379247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         }
380247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
381247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         if(BT_STATUS_SUCCESS == status && NULL!=p_transaction)
382247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         {
383247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            btif_rc_cb.rc_vol_label=p_transaction->lbl;
384247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            register_volumechange(btif_rc_cb.rc_vol_label);
385247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         }
386247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji       }
387247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji#endif
388247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
3899adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Function       handle_rc_connect
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
39498497a520010fc996a8ce490665cac6c1439dd2dJohn Du *  - Argument:    tBTA_AV_RC_OPEN  RC open data structure
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  - Description: RC connection event handler
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ***************************************************************************/
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid handle_rc_connect (tBTA_AV_RC_OPEN *p_rc_open)
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_TRACE_DEBUG2("%s: rc_handle: %d", __FUNCTION__, p_rc_open->rc_handle);
4029adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    bt_status_t result = BT_STATUS_SUCCESS;
4039adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    int i;
4049adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    char bd_str[18];
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4069adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if(p_rc_open->status == BTA_AV_SUCCESS)
4079adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
4089adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        memcpy(btif_rc_cb.rc_addr, p_rc_open->peer_addr, sizeof(BD_ADDR));
4099adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        btif_rc_cb.rc_features = p_rc_open->peer_features;
410247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        btif_rc_cb.rc_vol_label=MAX_LABEL;
411247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        btif_rc_cb.rc_volume=MAX_VOLUME;
4129adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
4139adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        btif_rc_cb.rc_connected = TRUE;
4149adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        btif_rc_cb.rc_handle = p_rc_open->rc_handle;
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
416247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        /* on locally initiated connection we will get remote features as part of connect */
417247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        if (btif_rc_cb.rc_features != 0)
418247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            handle_rc_features();
419247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
4209adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        result = uinput_driver_check();
4219adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        if(result == BT_STATUS_SUCCESS)
4229adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
4239adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            init_uinput();
4249adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
4259adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
4269adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    else
4279adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
4289adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        BTIF_TRACE_ERROR2("%s Connect failed with error code: %d",
4299adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            __FUNCTION__, p_rc_open->status);
4309adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        btif_rc_cb.rc_connected = FALSE;
4319adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Function       handle_rc_disconnect
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
43798497a520010fc996a8ce490665cac6c1439dd2dJohn Du *  - Argument:    tBTA_AV_RC_CLOSE     RC close data structure
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  - Description: RC disconnection event handler
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ***************************************************************************/
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid handle_rc_disconnect (tBTA_AV_RC_CLOSE *p_rc_close)
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_TRACE_DEBUG2("%s: rc_handle: %d", __FUNCTION__, p_rc_close->rc_handle);
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_rc_cb.rc_handle = 0;
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_rc_cb.rc_connected = FALSE;
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(btif_rc_cb.rc_addr, 0, sizeof(BD_ADDR));
4499adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    btif_rc_cb.rc_features = 0;
450247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    btif_rc_cb.rc_vol_label=MAX_LABEL;
451247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    btif_rc_cb.rc_volume=MAX_VOLUME;
452247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    init_all_transactions();
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    close_uinput();
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Function       handle_rc_passthrough_cmd
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  - Argument:    tBTA_AV_RC rc_id   remote control command ID
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *                 tBTA_AV_STATE key_state status of key press
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  - Description: Remote control command handler
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ***************************************************************************/
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid handle_rc_passthrough_cmd ( tBTA_AV_REMOTE_CMD *p_remote_cmd)
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    const char *status;
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int pressed, i;
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
47098497a520010fc996a8ce490665cac6c1439dd2dJohn Du    BTIF_TRACE_DEBUG2("%s: p_remote_cmd->rc_id=%d", __FUNCTION__, p_remote_cmd->rc_id);
47198497a520010fc996a8ce490665cac6c1439dd2dJohn Du
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If AVRC is open and peer sends PLAY but there is no AVDT, then we queue-up this PLAY */
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_remote_cmd)
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* queue AVRC PLAY if GAVDTP Open notification to app is pending (2 second timer) */
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_remote_cmd->rc_id == BTA_AV_RC_PLAY) && (!btif_av_is_connected()))
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_remote_cmd->key_state == AVRC_STATE_PRESS)
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                APPL_TRACE_WARNING1("%s: AVDT not open, queuing the PLAY command", __FUNCTION__);
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btif_rc_cb.rc_pending_play = TRUE;
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_remote_cmd->rc_id == BTA_AV_RC_PAUSE) && (btif_rc_cb.rc_pending_play))
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_WARNING1("%s: Clear the pending PLAY on PAUSE received", __FUNCTION__);
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_rc_cb.rc_pending_play = FALSE;
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_remote_cmd->key_state == AVRC_STATE_RELEASE) {
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = "released";
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        pressed = 0;
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    } else {
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = "pressed";
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        pressed = 1;
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If this is Play/Pause command (press or release)  before processing, check the following
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     * a voice call has ended recently
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     * the remote device is not of type headset
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     * If the above conditions meet, drop the Play/Pause command
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     * This fix is to interop with certain carkits which sends an automatic  PLAY  or PAUSE
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     * commands right after call ends
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     */
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if((p_remote_cmd->rc_id == BTA_AV_RC_PLAY || p_remote_cmd->rc_id == BTA_AV_RC_PAUSE)&&
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       (btif_hf_call_terminated_recently() == TRUE) &&
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       (check_cod( (const bt_bdaddr_t*)&(btif_rc_cb.rc_addr), COD_AV_HEADSETS) != TRUE))
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTIF_TRACE_DEBUG2("%s:Dropping the play/Pause command received right after call end cmd:%d",
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           __FUNCTION__,p_remote_cmd->rc_id);
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
51798497a520010fc996a8ce490665cac6c1439dd2dJohn Du    if (p_remote_cmd->rc_id == BTA_AV_RC_FAST_FOR || p_remote_cmd->rc_id == BTA_AV_RC_REWIND) {
51898497a520010fc996a8ce490665cac6c1439dd2dJohn Du        HAL_CBACK(bt_rc_callbacks, passthrough_cmd_cb, p_remote_cmd->rc_id, pressed);
51998497a520010fc996a8ce490665cac6c1439dd2dJohn Du        return;
52098497a520010fc996a8ce490665cac6c1439dd2dJohn Du    }
52198497a520010fc996a8ce490665cac6c1439dd2dJohn Du
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; key_map[i].name != NULL; i++) {
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_remote_cmd->rc_id == key_map[i].avrcp) {
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTIF_TRACE_DEBUG3("%s: %s %s", __FUNCTION__, key_map[i].name, status);
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           /* MusicPlayer uses a long_press_timeout of 1 second for PLAYPAUSE button
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            * and maps that to autoshuffle. So if for some reason release for PLAY/PAUSE
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            * comes 1 second after the press, the MediaPlayer UI goes into a bad state.
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            * The reason for the delay could be sniff mode exit or some AVDTP procedure etc.
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            * The fix is to generate a release right after the press and drown the 'actual'
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            * release.
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            */
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((key_map[i].release_quirk == 1) && (pressed == 0))
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTIF_TRACE_DEBUG2("%s: AVRC %s Release Faked earlier, drowned now",
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  __FUNCTION__, key_map[i].name);
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            send_key(uinput_fd, key_map[i].mapped_id, pressed);
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((key_map[i].release_quirk == 1) && (pressed == 1))
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                GKI_delay(30); // 30ms
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTIF_TRACE_DEBUG2("%s: AVRC %s Release quirk enabled, send release now",
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  __FUNCTION__, key_map[i].name);
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                send_key(uinput_fd, key_map[i].mapped_id, 0);
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (key_map[i].name == NULL)
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTIF_TRACE_ERROR3("%s AVRCP: unknown button 0x%02X %s", __FUNCTION__,
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_remote_cmd->rc_id, status);
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5569adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanvoid handle_uid_changed_notification(tBTA_AV_META_MSG *pmeta_msg, tAVRC_COMMAND *pavrc_command)
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5589adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tAVRC_RESPONSE avrc_rsp = {0};
5599adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.rsp.pdu = pavrc_command->pdu;
5609adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.rsp.status = AVRC_STS_NO_ERROR;
5619adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.rsp.opcode = pavrc_command->cmd.opcode;
5629adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
5639adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.reg_notif.event_id = pavrc_command->reg_notif.event_id;
5649adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.reg_notif.param.uid_counter = 0;
5659adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
5669adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    send_metamsg_rsp(pmeta_msg->rc_handle, pmeta_msg->label, AVRC_RSP_INTERIM, &avrc_rsp);
5679adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    send_metamsg_rsp(pmeta_msg->rc_handle, pmeta_msg->label, AVRC_RSP_CHANGED, &avrc_rsp);
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5699adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
5709adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
5719adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
5729adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/***************************************************************************
5739adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *  Function       handle_rc_metamsg_cmd
5749adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *
5759adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *  - Argument:    tBTA_AV_VENDOR Structure containing the received
5769adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *                          metamsg command
5779adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *
5789adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *  - Description: Remote control metamsg command handler (AVRCP 1.3)
5799adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *
5809adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan ***************************************************************************/
5819adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanvoid handle_rc_metamsg_cmd (tBTA_AV_META_MSG *pmeta_msg)
5829adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
5839adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    /* Parse the metamsg command and pass it on to BTL-IFS */
5849adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    UINT8             scratch_buf[512] = {0};
5859adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tAVRC_COMMAND    avrc_command = {0};
5869adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tAVRC_STS status;
5879adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    int param_len;
5889adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
5899adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    BTIF_TRACE_EVENT1("+ %s", __FUNCTION__);
5909adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
5919adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (pmeta_msg->p_msg->hdr.opcode != AVRC_OP_VENDOR)
5929adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
5939adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        BTIF_TRACE_WARNING1("Invalid opcode: %x", pmeta_msg->p_msg->hdr.opcode);
5949adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        return;
5959adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
5969adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (pmeta_msg->len < 3)
5979adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
5989adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        BTIF_TRACE_WARNING2("Invalid length.Opcode: 0x%x, len: 0x%x", pmeta_msg->p_msg->hdr.opcode,
5999adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            pmeta_msg->len);
6009adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        return;
6019adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
6029adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
6039adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (pmeta_msg->code >= AVRC_RSP_NOT_IMPL)
6049adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
605247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji#if (AVRC_ADV_CTRL_INCLUDED == TRUE)
606247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
607247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     rc_transaction_t *transaction=NULL;
608247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     transaction=get_transaction_by_lbl(pmeta_msg->label);
609247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     if(NULL!=transaction)
610247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     {
611247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        handle_rc_metamsg_rsp(pmeta_msg);
612247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     }
613247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     else
614247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     {
615247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         BTIF_TRACE_DEBUG3("%s:Discard vendor dependent rsp. code: %d label:%d.",
616247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji             __FUNCTION__, pmeta_msg->code, pmeta_msg->label);
617247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     }
618247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     return;
619247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
620247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji#else
621247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
6229adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        BTIF_TRACE_DEBUG3("%s:Received vendor dependent rsp. code: %d len: %d. Not processing it.",
6239adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            __FUNCTION__, pmeta_msg->code, pmeta_msg->len);
6249adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        return;
625247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
626247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji#endif
627247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji      }
628247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
629247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    status=AVRC_ParsCommand(pmeta_msg->p_msg, &avrc_command, scratch_buf, sizeof(scratch_buf));
630247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    BTIF_TRACE_DEBUG3("Received vendor command.code,PDU and label: %d, %d,%d",pmeta_msg->code,
631247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                       avrc_command.cmd.pdu, pmeta_msg->label);
6329adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
6339adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (status != AVRC_STS_NO_ERROR)
6349adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
6359adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        /* return error */
636247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        BTIF_TRACE_WARNING2("%s: Error in parsing received metamsg command. status: 0x%02x",
6379adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            __FUNCTION__, status);
6389adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        send_reject_response(pmeta_msg->rc_handle, pmeta_msg->label, avrc_command.pdu, status);
6399adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
6409adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    else
6419adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
6429adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        /* if RegisterNotification, add it to our registered queue */
6439adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
6449adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        if (avrc_command.cmd.pdu == AVRC_PDU_REGISTER_NOTIFICATION)
6459adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
6469adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            UINT8 event_id = avrc_command.reg_notif.event_id;
6479adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            param_len = sizeof(tAVRC_REG_NOTIF_CMD);
648247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            BTIF_TRACE_EVENT4("%s:New register notification received.event_id:%s,label:0x%x,code:%x",
649247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            __FUNCTION__,dump_rc_notification_event_id(event_id), pmeta_msg->label,pmeta_msg->code);
6509adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            btif_rc_cb.rc_notif[event_id-1].bNotify = TRUE;
6519adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            btif_rc_cb.rc_notif[event_id-1].label = pmeta_msg->label;
6529adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
6539adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            if(event_id == AVRC_EVT_UIDS_CHANGE)
6549adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
6559adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                handle_uid_changed_notification(pmeta_msg, &avrc_command);
6569adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                return;
6579adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
6589adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
6599adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
6609adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
6619adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        BTIF_TRACE_EVENT2("%s: Passing received metamsg command to app. pdu: %s",
6629adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            __FUNCTION__, dump_rc_pdu(avrc_command.cmd.pdu));
6639adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
6649adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        /* Since handle_rc_metamsg_cmd() itself is called from
6659adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            *btif context, no context switching is required. Invoke
6669adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            * btif_rc_upstreams_evt directly from here. */
6679adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        btif_rc_upstreams_evt((uint16_t)avrc_command.cmd.pdu, &avrc_command, pmeta_msg->code,
668247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                               pmeta_msg->label);
6699adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function       btif_rc_handler
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description    RC event handler
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ***************************************************************************/
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_rc_handler(tBTA_AV_EVT event, tBTA_AV *p_data)
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6819adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    BTIF_TRACE_DEBUG2 ("%s event:%s", __FUNCTION__, dump_rc_event(event));
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AV_RC_OPEN_EVT:
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTIF_TRACE_DEBUG1("Peer_features:%x", p_data->rc_open.peer_features);
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            handle_rc_connect( &(p_data->rc_open) );
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }break;
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AV_RC_CLOSE_EVT:
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            handle_rc_disconnect( &(p_data->rc_close) );
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }break;
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AV_REMOTE_CMD_EVT:
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTIF_TRACE_DEBUG2("rc_id:0x%x key_state:%d", p_data->remote_cmd.rc_id,
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               p_data->remote_cmd.key_state);
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            handle_rc_passthrough_cmd( (&p_data->remote_cmd) );
7009adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
7019adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
7029adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case BTA_AV_RC_FEAT_EVT:
7039adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
7049adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            BTIF_TRACE_DEBUG1("Peer_features:%x", p_data->rc_feat.peer_features);
7059adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            btif_rc_cb.rc_features = p_data->rc_feat.peer_features;
706247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            handle_rc_features();
7079adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
7089adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
7099adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case BTA_AV_META_MSG_EVT:
7109adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
7119adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            BTIF_TRACE_DEBUG2("BTA_AV_META_MSG_EVT  code:%d label:%d", p_data->meta_msg.code,
7129adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                p_data->meta_msg.label);
7139adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            BTIF_TRACE_DEBUG3("  company_id:0x%x len:%d handle:%d", p_data->meta_msg.company_id,
7149adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                p_data->meta_msg.len, p_data->meta_msg.rc_handle);
7159adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            /* handle the metamsg command */
7169adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            handle_rc_metamsg_cmd(&(p_data->meta_msg));
7179adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
7189adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
7209adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            BTIF_TRACE_DEBUG1("Unhandled RC event : 0x%x", event);
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function       btif_rc_get_connected_peer
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description    Fetches the connected headset's BD_ADDR if any
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ***************************************************************************/
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_rc_get_connected_peer(BD_ADDR peer_addr)
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btif_rc_cb.rc_connected == TRUE) {
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(peer_addr, btif_rc_cb.rc_addr);
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return TRUE;
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return FALSE;
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function       btif_rc_check_handle_pending_play
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description    Clears the queued PLAY command. if bSend is TRUE, forwards to app
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ***************************************************************************/
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* clear the queued PLAY command. if bSend is TRUE, forward to app */
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_rc_check_handle_pending_play (BD_ADDR peer_addr, BOOLEAN bSendToApp)
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7519adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    BTIF_TRACE_DEBUG2("%s: bSendToApp=%d", __FUNCTION__, bSendToApp);
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btif_rc_cb.rc_pending_play)
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (bSendToApp)
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            tBTA_AV_REMOTE_CMD remote_cmd;
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_DEBUG1("%s: Sending queued PLAYED event to app", __FUNCTION__);
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset (&remote_cmd, 0, sizeof(tBTA_AV_REMOTE_CMD));
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            remote_cmd.rc_handle  = btif_rc_cb.rc_handle;
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            remote_cmd.rc_id      = AVRC_ID_PLAY;
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            remote_cmd.hdr.ctype  = AVRC_CMD_CTRL;
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            remote_cmd.hdr.opcode = AVRC_OP_PASS_THRU;
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* delay sending to app, else there is a timing issue in the framework,
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             ** which causes the audio to be on th device's speaker. Delay between
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             ** OPEN & RC_PLAYs
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            */
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GKI_delay (200);
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* send to app - both PRESSED & RELEASED */
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            remote_cmd.key_state  = AVRC_STATE_PRESS;
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            handle_rc_passthrough_cmd( &remote_cmd );
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GKI_delay (100);
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            remote_cmd.key_state  = AVRC_STATE_RELEASE;
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            handle_rc_passthrough_cmd( &remote_cmd );
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btif_rc_cb.rc_pending_play = FALSE;
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7839adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/* Generic reject response */
7849adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic void send_reject_response (UINT8 rc_handle, UINT8 label, UINT8 pdu, UINT8 status)
7859adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
7869adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    UINT8 ctype = AVRC_RSP_REJ;
7879adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tAVRC_RESPONSE avrc_rsp;
7889adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    BT_HDR *p_msg = NULL;
7899adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    memset (&avrc_rsp, 0, sizeof(tAVRC_RESPONSE));
7909adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
7919adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.rsp.opcode = opcode_from_pdu(pdu);
7929adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.rsp.pdu    = pdu;
7939adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.rsp.status = status;
7949adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
7959adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (AVRC_STS_NO_ERROR == (status = AVRC_BldResponse(rc_handle, &avrc_rsp, &p_msg)) )
7969adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
7979adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        BTIF_TRACE_DEBUG4("%s:Sending error notification to handle:%d. pdu:%s,status:0x%02x",
7989adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            __FUNCTION__, rc_handle, dump_rc_pdu(pdu), status);
7999adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        BTA_AvMetaRsp(rc_handle, label, ctype, p_msg);
8009adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
8019adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
8029adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
8039adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/***************************************************************************
8049adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *  Function       send_metamsg_rsp
8059adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *
8069adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *  - Argument:
8079adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *                  rc_handle     RC handle corresponding to the connected RC
8089adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *                  label            Label of the RC response
8099adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *                  code            Response type
8109adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *                  pmetamsg_resp    Vendor response
8119adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *
8129adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *  - Description: Remote control metamsg response handler (AVRCP 1.3)
8139adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *
8149adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan ***************************************************************************/
8159adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic void send_metamsg_rsp (UINT8 rc_handle, UINT8 label, tBTA_AV_CODE code,
8169adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tAVRC_RESPONSE *pmetamsg_resp)
8179adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
8189adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    UINT8 ctype;
8199adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tAVRC_STS status;
8209adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
8219adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (!pmetamsg_resp)
8229adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
8239adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        BTIF_TRACE_WARNING1("%s: Invalid response received from application", __FUNCTION__);
8249adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        return;
8259adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
8269adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
8279adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    BTIF_TRACE_EVENT5("+%s: rc_handle: %d, label: %d, code: 0x%02x, pdu: %s", __FUNCTION__,
8289adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        rc_handle, label, code, dump_rc_pdu(pmetamsg_resp->rsp.pdu));
8299adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
8309adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (pmetamsg_resp->rsp.status != AVRC_STS_NO_ERROR)
8319adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
8329adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        ctype = AVRC_RSP_REJ;
8339adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
8349adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    else
8359adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
8369adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        if ( code < AVRC_RSP_NOT_IMPL)
8379adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
8389adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            if (code == AVRC_CMD_NOTIF)
8399adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
8409adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan               ctype = AVRC_RSP_INTERIM;
8419adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
8429adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            else if (code == AVRC_CMD_STATUS)
8439adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
8449adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan               ctype = AVRC_RSP_IMPL_STBL;
8459adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
8469adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            else
8479adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
8489adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan               ctype = AVRC_RSP_ACCEPT;
8499adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
8509adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
8519adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        else
8529adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
8539adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            ctype = code;
8549adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
8559adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
8569adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    /* if response is for register_notification, make sure the rc has
8579adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    actually registered for this */
8589adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if((pmetamsg_resp->rsp.pdu == AVRC_PDU_REGISTER_NOTIFICATION) && (code == AVRC_RSP_CHANGED))
8599adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
8609adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        BOOLEAN bSent = FALSE;
8619adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        UINT8   event_id = pmetamsg_resp->reg_notif.event_id;
8629adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        BOOLEAN bNotify = (btif_rc_cb.rc_connected) && (btif_rc_cb.rc_notif[event_id-1].bNotify);
8639adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
8649adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        /* de-register this notification for a CHANGED response */
8659adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        btif_rc_cb.rc_notif[event_id-1].bNotify = FALSE;
8669adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        BTIF_TRACE_DEBUG4("%s rc_handle: %d. event_id: 0x%02d bNotify:%u", __FUNCTION__,
8679adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan             btif_rc_cb.rc_handle, event_id, bNotify);
8689adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        if (bNotify)
8699adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
8709adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            BT_HDR *p_msg = NULL;
8719adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            tAVRC_STS status;
8729adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
8739adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            if (AVRC_STS_NO_ERROR == (status = AVRC_BldResponse(btif_rc_cb.rc_handle,
8749adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                pmetamsg_resp, &p_msg)) )
8759adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
8769adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                BTIF_TRACE_DEBUG3("%s Sending notification to rc_handle: %d. event_id: 0x%02d",
8779adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                     __FUNCTION__, btif_rc_cb.rc_handle, event_id);
8789adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                bSent = TRUE;
8799adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                BTA_AvMetaRsp(btif_rc_cb.rc_handle, btif_rc_cb.rc_notif[event_id-1].label,
8809adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                    ctype, p_msg);
8819adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
8829adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            else
8839adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
8849adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                BTIF_TRACE_WARNING2("%s failed to build metamsg response. status: 0x%02x",
8859adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                    __FUNCTION__, status);
8869adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
8879adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
8889adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
8899adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
8909adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        if (!bSent)
8919adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
8929adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            BTIF_TRACE_DEBUG2("%s: Notification not sent, as there are no RC connections or the \
8939adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                CT has not subscribed for event_id: %s", __FUNCTION__, dump_rc_notification_event_id(event_id));
8949adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
8959adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
8969adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    else
8979adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
8989adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        /* All other commands go here */
8999adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
9009adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        BT_HDR *p_msg = NULL;
9019adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        tAVRC_STS status;
9029adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
9039adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        status = AVRC_BldResponse(rc_handle, pmetamsg_resp, &p_msg);
9049adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
9059adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        if (status == AVRC_STS_NO_ERROR)
9069adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
9079adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            BTA_AvMetaRsp(rc_handle, label, ctype, p_msg);
9089adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
9099adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        else
9109adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
9119adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            BTIF_TRACE_ERROR2("%s: failed to build metamsg response. status: 0x%02x",
9129adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                __FUNCTION__, status);
9139adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
9149adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
9159adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
9169adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
9179adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic UINT8 opcode_from_pdu(UINT8 pdu)
9189adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
9199adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    UINT8 opcode = 0;
9209adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
9219adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    switch (pdu)
9229adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
9239adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    case AVRC_PDU_NEXT_GROUP:
9249adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    case AVRC_PDU_PREV_GROUP: /* pass thru */
9259adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        opcode  = AVRC_OP_PASS_THRU;
9269adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
9279adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
9289adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    default: /* vendor */
9299adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        opcode  = AVRC_OP_VENDOR;
9309adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
9319adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
9329adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
9339adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    return opcode;
9349adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
9359adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
9369adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/*******************************************************************************
9379adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
9389adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Function         btif_rc_upstreams_evt
9399adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
9409adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Description      Executes AVRC UPSTREAMS events in btif context.
9419adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
9429adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Returns          void
9439adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
9449adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan*******************************************************************************/
9459adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic void btif_rc_upstreams_evt(UINT16 event, tAVRC_COMMAND *pavrc_cmd, UINT8 ctype, UINT8 label)
9469adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
9479adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    BTIF_TRACE_EVENT5("%s pdu: %s handle: 0x%x ctype:%x label:%x", __FUNCTION__,
9489adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        dump_rc_pdu(pavrc_cmd->pdu), btif_rc_cb.rc_handle, ctype, label);
9499adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
9509adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    switch (event)
9519adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
9529adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case AVRC_PDU_GET_PLAY_STATUS:
9539adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
9549adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            FILL_PDU_QUEUE(IDX_GET_PLAY_STATUS_RSP, ctype, label, TRUE)
9559adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            HAL_CBACK(bt_rc_callbacks, get_play_status_cb);
9569adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
9579adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
9589adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case AVRC_PDU_LIST_PLAYER_APP_ATTR:
9599adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case AVRC_PDU_LIST_PLAYER_APP_VALUES:
9609adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case AVRC_PDU_GET_CUR_PLAYER_APP_VALUE:
9619adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case AVRC_PDU_SET_PLAYER_APP_VALUE:
9629adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case AVRC_PDU_GET_PLAYER_APP_ATTR_TEXT:
9639adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case AVRC_PDU_GET_PLAYER_APP_VALUE_TEXT:
9649adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
9659adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            /* TODO: Add support for Application Settings */
966081d6e548bed5a91c0ba9abda518c06a1b0ba7f5Zhihai Xu            send_reject_response (btif_rc_cb.rc_handle, label, pavrc_cmd->pdu, AVRC_STS_BAD_CMD);
9679adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
9689adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
9699adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case AVRC_PDU_GET_ELEMENT_ATTR:
9709adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
9719adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            btrc_media_attr_t element_attrs[BTRC_MAX_ELEM_ATTR_SIZE];
9729adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            UINT8 num_attr;
973841e5b5092bcdbc1acffd6cf7255ec423fe15fdbRavi Nagarajan             memset(&element_attrs, 0, sizeof(element_attrs));
9749adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            if (pavrc_cmd->get_elem_attrs.num_attr == 0)
9759adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
9769adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                /* CT requests for all attributes */
9779adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                int attr_cnt;
978841e5b5092bcdbc1acffd6cf7255ec423fe15fdbRavi Nagarajan                num_attr = BTRC_MAX_ELEM_ATTR_SIZE;
979841e5b5092bcdbc1acffd6cf7255ec423fe15fdbRavi Nagarajan                for (attr_cnt = 0; attr_cnt < BTRC_MAX_ELEM_ATTR_SIZE; attr_cnt++)
9809adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                {
981841e5b5092bcdbc1acffd6cf7255ec423fe15fdbRavi Nagarajan                    element_attrs[attr_cnt] = attr_cnt + 1;
9829adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                }
9839adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
9849adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            else if (pavrc_cmd->get_elem_attrs.num_attr == 0xFF)
9859adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
986841e5b5092bcdbc1acffd6cf7255ec423fe15fdbRavi Nagarajan                /* 0xff indicates, no attributes requested - reject */
987841e5b5092bcdbc1acffd6cf7255ec423fe15fdbRavi Nagarajan                send_reject_response (btif_rc_cb.rc_handle, label, pavrc_cmd->pdu,
988841e5b5092bcdbc1acffd6cf7255ec423fe15fdbRavi Nagarajan                    AVRC_STS_BAD_PARAM);
989841e5b5092bcdbc1acffd6cf7255ec423fe15fdbRavi Nagarajan                return;
9909adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
9919adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            else
9929adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
9939adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                num_attr = pavrc_cmd->get_elem_attrs.num_attr;
9949adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                memcpy(element_attrs, pavrc_cmd->get_elem_attrs.attrs, sizeof(UINT32)
9959adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                    *pavrc_cmd->get_elem_attrs.num_attr);
9969adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
9979adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            FILL_PDU_QUEUE(IDX_GET_ELEMENT_ATTR_RSP, ctype, label, TRUE);
9989adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            HAL_CBACK(bt_rc_callbacks, get_element_attr_cb, num_attr, element_attrs);
9999adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
10009adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
10019adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case AVRC_PDU_REGISTER_NOTIFICATION:
10029adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
10039adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            if(pavrc_cmd->reg_notif.event_id == BTRC_EVT_PLAY_POS_CHANGED &&
10049adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                pavrc_cmd->reg_notif.param == 0)
10059adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
10069adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                BTIF_TRACE_WARNING1("%s Device registering position changed with illegal param 0.",
10079adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                    __FUNCTION__);
10089adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                send_reject_response (btif_rc_cb.rc_handle, label, pavrc_cmd->pdu, AVRC_STS_BAD_PARAM);
10099adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                /* de-register this notification for a rejected response */
10109adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                btif_rc_cb.rc_notif[BTRC_EVT_PLAY_POS_CHANGED - 1].bNotify = FALSE;
10119adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                return;
10129adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
10139adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            HAL_CBACK(bt_rc_callbacks, register_notification_cb, pavrc_cmd->reg_notif.event_id,
10149adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                pavrc_cmd->reg_notif.param);
10159adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
10169adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
10179adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case AVRC_PDU_INFORM_DISPLAY_CHARSET:
10189adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
10199adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            tAVRC_RESPONSE avrc_rsp;
10209adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            BTIF_TRACE_EVENT1("%s() AVRC_PDU_INFORM_DISPLAY_CHARSET", __FUNCTION__);
10219adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            if(btif_rc_cb.rc_connected == TRUE)
10229adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
10239adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                memset(&(avrc_rsp.inform_charset), 0, sizeof(tAVRC_RSP));
10249adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                avrc_rsp.inform_charset.opcode=opcode_from_pdu(AVRC_PDU_INFORM_DISPLAY_CHARSET);
10259adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                avrc_rsp.inform_charset.pdu=AVRC_PDU_INFORM_DISPLAY_CHARSET;
10269adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                avrc_rsp.inform_charset.status=AVRC_STS_NO_ERROR;
10279adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                send_metamsg_rsp(btif_rc_cb.rc_handle, label, ctype, &avrc_rsp);
10289adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
10299adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
10309adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
10319adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        default:
10329adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
10339adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        send_reject_response (btif_rc_cb.rc_handle, label, pavrc_cmd->pdu,
10349adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            (pavrc_cmd->pdu == AVRC_PDU_SEARCH)?AVRC_STS_SEARCH_NOT_SUP:AVRC_STS_BAD_CMD);
10359adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        return;
10369adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
10379adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
10389adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
10399adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
10409adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
10419adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
1042247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1043247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/*******************************************************************************
1044247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1045247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Function         btif_rc_upstreams_rsp_evt
1046247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1047247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Description      Executes AVRC UPSTREAMS response events in btif context.
1048247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1049247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Returns          void
1050247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1051247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji*******************************************************************************/
1052247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic void btif_rc_upstreams_rsp_evt(UINT16 event, tAVRC_RESPONSE *pavrc_resp, UINT8 ctype, UINT8 label)
1053247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1054247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    BTIF_TRACE_EVENT5("%s pdu: %s handle: 0x%x ctype:%x label:%x", __FUNCTION__,
1055247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        dump_rc_pdu(pavrc_resp->pdu), btif_rc_cb.rc_handle, ctype, label);
1056247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1057247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji#if (AVRC_ADV_CTRL_INCLUDED == TRUE)
1058247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    switch (event)
1059247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1060247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        case AVRC_PDU_REGISTER_NOTIFICATION:
1061247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        {
1062247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji             if(AVRC_RSP_CHANGED==ctype)
1063247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                 btif_rc_cb.rc_volume=pavrc_resp->reg_notif.param.volume;
1064247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji             HAL_CBACK(bt_rc_callbacks, volume_change_cb, pavrc_resp->reg_notif.param.volume,ctype)
1065247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        }
1066247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        break;
1067247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1068247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        case AVRC_PDU_SET_ABSOLUTE_VOLUME:
1069247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        {
1070247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            BTIF_TRACE_DEBUG2("Set absolute volume change event received: volume %d,ctype %d",
1071247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                pavrc_resp->volume.volume,ctype);
1072247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            if(AVRC_RSP_ACCEPT==ctype)
1073247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                btif_rc_cb.rc_volume=pavrc_resp->volume.volume;
1074247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            HAL_CBACK(bt_rc_callbacks,volume_change_cb,pavrc_resp->volume.volume,ctype)
1075247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        }
1076247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        break;
1077247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1078247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        default:
1079247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            return;
1080247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1081247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji#endif
1082247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1083247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
10849adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/************************************************************************************
10859adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**  AVRCP API Functions
10869adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan************************************************************************************/
10879adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
10889adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/*******************************************************************************
10899adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
10909adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Function         init
10919adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
10929adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Description      Initializes the AVRC interface
10939adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
10949adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Returns          bt_status_t
10959adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
10969adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan*******************************************************************************/
10979adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic bt_status_t init(btrc_callbacks_t* callbacks )
10989adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
10999adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    BTIF_TRACE_EVENT1("## %s ##", __FUNCTION__);
11009adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    bt_status_t result = BT_STATUS_SUCCESS;
11019adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
11029adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (bt_rc_callbacks)
11039adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        return BT_STATUS_DONE;
11049adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
11059adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    bt_rc_callbacks = callbacks;
11069adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    memset (&btif_rc_cb, 0, sizeof(btif_rc_cb));
1107247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    btif_rc_cb.rc_vol_label=MAX_LABEL;
1108247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    btif_rc_cb.rc_volume=MAX_VOLUME;
1109247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    lbl_init();
11109adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
11119adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    return result;
11129adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
11139adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
11149adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/***************************************************************************
11159adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
11169adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Function         get_play_status_rsp
11179adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
11189adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Description      Returns the current play status.
11199adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**                      This method is called in response to
11209adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**                      GetPlayStatus request.
11219adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
11229adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Returns          bt_status_t
11239adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
11249adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan***************************************************************************/
11259adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic bt_status_t get_play_status_rsp(btrc_play_status_t play_status, uint32_t song_len,
11269adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    uint32_t song_pos)
11279adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
11289adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tAVRC_RESPONSE avrc_rsp;
11299adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    UINT32 i;
11309adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    CHECK_RC_CONNECTED
11319adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    memset(&(avrc_rsp.get_play_status), 0, sizeof(tAVRC_GET_PLAY_STATUS_RSP));
11329adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.get_play_status.song_len = song_len;
11339adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.get_play_status.song_pos = song_pos;
11349adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.get_play_status.play_status = play_status;
11359adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
11369adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.get_play_status.pdu = AVRC_PDU_GET_PLAY_STATUS;
11379adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.get_play_status.opcode = opcode_from_pdu(AVRC_PDU_GET_PLAY_STATUS);
1138b88fc6cb5636c4af17077502fe3313ffb32d93eeRavi Nagarajan    avrc_rsp.get_play_status.status = AVRC_STS_NO_ERROR;
11399adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    /* Send the response */
11409adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    SEND_METAMSG_RSP(IDX_GET_PLAY_STATUS_RSP, &avrc_rsp);
11419adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    return BT_STATUS_SUCCESS;
11429adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
11439adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
11449adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/***************************************************************************
11459adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
11469adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Function         get_element_attr_rsp
11479adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
11489adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Description      Returns the current songs' element attributes
11499adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**                      in text.
11509adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
11519adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Returns          bt_status_t
11529adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
11539adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan***************************************************************************/
11549adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic bt_status_t get_element_attr_rsp(uint8_t num_attr, btrc_element_attr_val_t *p_attrs)
11559adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
11569adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tAVRC_RESPONSE avrc_rsp;
11579adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    UINT32 i;
11589adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    uint8_t j;
11599adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tAVRC_ATTR_ENTRY element_attrs[BTRC_MAX_ELEM_ATTR_SIZE];
11609adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    CHECK_RC_CONNECTED
11619adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    memset(element_attrs, 0, sizeof(tAVRC_ATTR_ENTRY) * num_attr);
11629adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
11639adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (num_attr == 0)
11649adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
11659adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        avrc_rsp.get_play_status.status = AVRC_STS_BAD_PARAM;
11669adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
11679adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    else
11689adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
11699adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        for (i=0; i<num_attr; i++) {
11709adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            element_attrs[i].attr_id = p_attrs[i].attr_id;
11719adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            element_attrs[i].name.charset_id = AVRC_CHARSET_ID_UTF8;
11729adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            element_attrs[i].name.str_len = (UINT16)strlen((char *)p_attrs[i].text);
11739adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            element_attrs[i].name.p_str = p_attrs[i].text;
11749adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            BTIF_TRACE_DEBUG5("%s attr_id:0x%x, charset_id:0x%x, str_len:%d, str:%s",
11759adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                __FUNCTION__, (unsigned int)element_attrs[i].attr_id,
11769adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                element_attrs[i].name.charset_id, element_attrs[i].name.str_len,
11779adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                element_attrs[i].name.p_str);
11789adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
11799adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        avrc_rsp.get_play_status.status = AVRC_STS_NO_ERROR;
11809adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
11819adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.get_elem_attrs.num_attr = num_attr;
11829adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.get_elem_attrs.p_attrs = element_attrs;
11839adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.get_elem_attrs.pdu = AVRC_PDU_GET_ELEMENT_ATTR;
11849adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.get_elem_attrs.opcode = opcode_from_pdu(AVRC_PDU_GET_ELEMENT_ATTR);
11859adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    /* Send the response */
11869adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    SEND_METAMSG_RSP(IDX_GET_ELEMENT_ATTR_RSP, &avrc_rsp);
11879adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    return BT_STATUS_SUCCESS;
11889adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
11899adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
11909adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/***************************************************************************
11919adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
11929adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Function         register_notification_rsp
11939adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
11949adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Description      Response to the register notification request.
11959adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**                      in text.
11969adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
11979adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Returns          bt_status_t
11989adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
11999adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan***************************************************************************/
12009adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic bt_status_t register_notification_rsp(btrc_event_id_t event_id,
12019adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    btrc_notification_type_t type, btrc_register_notification_t *p_param)
12029adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
12039adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tAVRC_RESPONSE avrc_rsp;
12049adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    CHECK_RC_CONNECTED
12059adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    BTIF_TRACE_EVENT2("## %s ## event_id:%s", __FUNCTION__, dump_rc_notification_event_id(event_id));
12069adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    memset(&(avrc_rsp.reg_notif), 0, sizeof(tAVRC_REG_NOTIF_RSP));
12079adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.reg_notif.event_id = event_id;
12089adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
12099adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    switch(event_id)
12109adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
12119adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case BTRC_EVT_PLAY_STATUS_CHANGED:
12129adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            avrc_rsp.reg_notif.param.play_status = p_param->play_status;
12139adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            break;
12149adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case BTRC_EVT_TRACK_CHANGE:
12159adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            memcpy(&(avrc_rsp.reg_notif.param.track), &(p_param->track), sizeof(btrc_uid_t));
12169adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            break;
1217b88fc6cb5636c4af17077502fe3313ffb32d93eeRavi Nagarajan        case BTRC_EVT_PLAY_POS_CHANGED:
1218b88fc6cb5636c4af17077502fe3313ffb32d93eeRavi Nagarajan            avrc_rsp.reg_notif.param.play_pos = p_param->song_pos;
1219b88fc6cb5636c4af17077502fe3313ffb32d93eeRavi Nagarajan            break;
12209adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        default:
12219adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            BTIF_TRACE_WARNING2("%s : Unhandled event ID : 0x%x", __FUNCTION__, event_id);
12229adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            return BT_STATUS_UNHANDLED;
12239adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
12249adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
12259adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.reg_notif.pdu = AVRC_PDU_REGISTER_NOTIFICATION;
12269adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.reg_notif.opcode = opcode_from_pdu(AVRC_PDU_REGISTER_NOTIFICATION);
12279adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.get_play_status.status = AVRC_STS_NO_ERROR;
12289adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
12299adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    /* Send the response. */
12309adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    send_metamsg_rsp(btif_rc_cb.rc_handle, btif_rc_cb.rc_notif[event_id-1].label,
12319adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        ((type == BTRC_NOTIFICATION_TYPE_INTERIM)?AVRC_CMD_NOTIF:AVRC_RSP_CHANGED), &avrc_rsp);
12329adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    return BT_STATUS_SUCCESS;
12339adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
12349adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
12359adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/***************************************************************************
12369adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
1237247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Function         set_volume
1238247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1239247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Description      Send current volume setting to remote side.
1240247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**                  Support limited to SetAbsoluteVolume
1241247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**                  This can be enhanced to support Relative Volume (AVRCP 1.0).
1242247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**                  With RelateVolume, we will send VOLUME_UP/VOLUME_DOWN
1243247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**                  as opposed to absolute volume level
1244247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** volume: Should be in the range 0-127. bit7 is reseved and cannot be set
1245247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1246247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Returns          bt_status_t
1247247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1248247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji***************************************************************************/
1249247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic bt_status_t set_volume(uint8_t volume)
1250247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1251247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
1252247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    CHECK_RC_CONNECTED
1253247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    tAVRC_STS status = BT_STATUS_UNSUPPORTED;
1254247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    rc_transaction_t *p_transaction=NULL;
1255247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1256247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if(btif_rc_cb.rc_volume==volume)
1257247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1258247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        status=BT_STATUS_DONE;
1259247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        BTIF_TRACE_ERROR2("%s: volume value already set earlier: 0x%02x",__FUNCTION__, volume);
1260247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        return status;
1261247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1262247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1263247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if ((btif_rc_cb.rc_features & BTA_AV_FEAT_RCTG) &&
1264247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        (btif_rc_cb.rc_features & BTA_AV_FEAT_ADV_CTRL))
1265247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1266247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        tAVRC_COMMAND avrc_cmd = {0};
1267247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        BT_HDR *p_msg = NULL;
1268247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1269247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        BTIF_TRACE_DEBUG2("%s: Peer supports absolute volume. newVolume=%d", __FUNCTION__, volume);
1270247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        avrc_cmd.volume.opcode = AVRC_OP_VENDOR;
1271247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        avrc_cmd.volume.pdu = AVRC_PDU_SET_ABSOLUTE_VOLUME;
1272247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        avrc_cmd.volume.status = AVRC_STS_NO_ERROR;
1273247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        avrc_cmd.volume.volume = volume;
1274247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1275247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        if (AVRC_BldCommand(&avrc_cmd, &p_msg) == AVRC_STS_NO_ERROR)
1276247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        {
1277247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            bt_status_t tran_status=get_transaction(&p_transaction);
1278247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            if(BT_STATUS_SUCCESS == tran_status && NULL!=p_transaction)
1279247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            {
1280247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                BTIF_TRACE_DEBUG2("%s msgreq being sent out with label %d",
1281247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                                   __FUNCTION__,p_transaction->lbl);
1282247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                BTA_AvMetaCmd(btif_rc_cb.rc_handle,p_transaction->lbl, AVRC_CMD_CTRL, p_msg);
1283247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                status =  BT_STATUS_SUCCESS;
1284247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            }
1285247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            else
1286247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            {
1287247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                if(NULL!=p_msg)
1288247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                   GKI_freebuf(p_msg);
1289247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                BTIF_TRACE_ERROR2("%s: failed to obtain transaction details. status: 0x%02x",
1290247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                                    __FUNCTION__, tran_status);
1291247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                status = BT_STATUS_FAIL;
1292247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            }
1293247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        }
1294247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        else
1295247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        {
1296247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            BTIF_TRACE_ERROR2("%s: failed to build absolute volume command. status: 0x%02x",
1297247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                                __FUNCTION__, status);
1298247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            status = BT_STATUS_FAIL;
1299247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        }
1300247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1301247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    else
1302247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        status=BT_STATUS_NOT_READY;
1303247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    return status;
1304247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1305247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1306247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1307247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/***************************************************************************
1308247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1309247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Function         register_volumechange
1310247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1311247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Description     Register for volume change notification from remote side.
1312247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1313247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Returns          void
1314247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1315247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji***************************************************************************/
1316247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1317247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic void register_volumechange (UINT8 lbl)
1318247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1319247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    tAVRC_COMMAND avrc_cmd = {0};
1320247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    BT_HDR *p_msg = NULL;
1321247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    tAVRC_STS BldResp=AVRC_STS_BAD_CMD;
1322247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    UINT16 rv = 0;
1323247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    bt_status_t tran_status;
1324247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    rc_transaction_t *p_transaction=NULL;
1325247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1326247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    BTIF_TRACE_DEBUG2("%s called with label:%d",__FUNCTION__,lbl);
1327247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1328247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    avrc_cmd.cmd.opcode=0x00;
1329247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    avrc_cmd.pdu = AVRC_PDU_REGISTER_NOTIFICATION;
1330247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    avrc_cmd.reg_notif.event_id = AVRC_EVT_VOLUME_CHANGE;
1331247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    avrc_cmd.reg_notif.status = AVRC_STS_NO_ERROR;
1332247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1333247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    BldResp=AVRC_BldCommand(&avrc_cmd, &p_msg);
1334247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if(AVRC_STS_NO_ERROR==BldResp && p_msg)
1335247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1336247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         p_transaction=get_transaction_by_lbl(lbl);
1337247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         if(NULL!=p_transaction)
1338247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         {
1339247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji             BTA_AvMetaCmd(btif_rc_cb.rc_handle,p_transaction->lbl, AVRC_CMD_NOTIF, p_msg);
1340247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji             BTIF_TRACE_DEBUG1("%s:BTA_AvMetaCmd called",__FUNCTION__);
1341247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         }
1342247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         else
1343247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         {
1344247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            if(NULL!=p_msg)
1345247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji               GKI_freebuf(p_msg);
1346247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            BTIF_TRACE_ERROR2("%s transaction not obtained with label: %d",__FUNCTION__,lbl);
1347247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         }
1348247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1349247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    else
1350247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        BTIF_TRACE_ERROR2("%s failed to build command:%d",__FUNCTION__,BldResp);
1351247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1352247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1353247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1354247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/***************************************************************************
1355247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1356247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Function         handle_rc_metamsg_rsp
1357247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1358247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Description      Handle RC metamessage response
1359247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1360247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Returns          void
1361247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1362247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji***************************************************************************/
1363247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic void handle_rc_metamsg_rsp(tBTA_AV_META_MSG *pmeta_msg)
1364247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1365247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    tAVRC_RESPONSE    avrc_response = {0};
1366247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    UINT8             scratch_buf[512] = {0};
1367247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    tAVRC_STS status = BT_STATUS_UNSUPPORTED;
1368247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1369247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if(AVRC_OP_VENDOR==pmeta_msg->p_msg->hdr.opcode &&(AVRC_RSP_CHANGED==pmeta_msg->code
1370247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji      || AVRC_RSP_INTERIM==pmeta_msg->code || AVRC_RSP_ACCEPT==pmeta_msg->code
1371247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji      || AVRC_RSP_REJ==pmeta_msg->code || AVRC_RSP_NOT_IMPL==pmeta_msg->code))
1372247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1373247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        status=AVRC_ParsResponse(pmeta_msg->p_msg, &avrc_response, scratch_buf, sizeof(scratch_buf));
1374247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        BTIF_TRACE_DEBUG6("%s: code %d,event ID %d,PDU %x,parsing status %d, label:%d",
1375247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji          __FUNCTION__,pmeta_msg->code,avrc_response.reg_notif.event_id,avrc_response.reg_notif.pdu,
1376247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji          status, pmeta_msg->label);
1377247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1378247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        if (status != AVRC_STS_NO_ERROR)
1379247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        {
1380247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            if(AVRC_PDU_REGISTER_NOTIFICATION==avrc_response.rsp.pdu
1381247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                && AVRC_EVT_VOLUME_CHANGE==avrc_response.reg_notif.event_id
1382247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                && btif_rc_cb.rc_vol_label==pmeta_msg->label)
1383247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            {
1384247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                btif_rc_cb.rc_vol_label=MAX_LABEL;
1385247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                release_transaction(btif_rc_cb.rc_vol_label);
1386247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            }
1387247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            else if(AVRC_PDU_SET_ABSOLUTE_VOLUME==avrc_response.rsp.pdu)
1388247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            {
1389247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                release_transaction(pmeta_msg->label);
1390247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            }
1391247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            return;
1392247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        }
1393247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        else if(AVRC_PDU_REGISTER_NOTIFICATION==avrc_response.rsp.pdu
1394247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            && AVRC_EVT_VOLUME_CHANGE==avrc_response.reg_notif.event_id
1395247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            && btif_rc_cb.rc_vol_label!=pmeta_msg->label)
1396247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            {
1397247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                // Just discard the message, if the device sends back with an incorrect label
1398247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                BTIF_TRACE_DEBUG3("%s:Discarding register notfn in rsp.code: %d and label %d",
1399247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                __FUNCTION__, pmeta_msg->code, pmeta_msg->label);
1400247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                return;
1401247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            }
1402247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1403247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    else
1404247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1405247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        BTIF_TRACE_DEBUG3("%s:Received vendor dependent in adv ctrl rsp. code: %d len: %d. Not processing it.",
1406247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        __FUNCTION__, pmeta_msg->code, pmeta_msg->len);
1407247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        return;
1408247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1409247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1410247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if(AVRC_PDU_REGISTER_NOTIFICATION==avrc_response.rsp.pdu
1411247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        && AVRC_EVT_VOLUME_CHANGE==avrc_response.reg_notif.event_id
1412247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        && AVRC_RSP_CHANGED==pmeta_msg->code)
1413247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     {
1414247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         /* re-register for volume change notification */
1415247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         // Do not re-register for rejected case, as it might get into endless loop
1416247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         register_volumechange(btif_rc_cb.rc_vol_label);
1417247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     }
1418247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     else if(AVRC_PDU_SET_ABSOLUTE_VOLUME==avrc_response.rsp.pdu)
1419247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     {
1420247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji          /* free up the label here */
1421247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji          release_transaction(pmeta_msg->label);
1422247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     }
1423247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1424247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     BTIF_TRACE_EVENT2("%s: Passing received metamsg response to app. pdu: %s",
1425247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji             __FUNCTION__, dump_rc_pdu(avrc_response.pdu));
1426247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     btif_rc_upstreams_rsp_evt((uint16_t)avrc_response.rsp.pdu, &avrc_response, pmeta_msg->code,
1427247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                                pmeta_msg->label);
1428247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1429247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1430247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1431247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/***************************************************************************
1432247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
14339adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Function         cleanup
14349adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
14359adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Description      Closes the AVRC interface
14369adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
14379adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Returns          void
14389adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
14399adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan***************************************************************************/
14409adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic void cleanup()
14419adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
14429adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    BTIF_TRACE_EVENT1("## %s ##", __FUNCTION__);
14439adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    close_uinput();
14449adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (bt_rc_callbacks)
14459adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
14469adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        bt_rc_callbacks = NULL;
14479adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
14489adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    memset(&btif_rc_cb, 0, sizeof(btif_rc_cb_t));
1449247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    lbl_destroy();
14509adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
14519adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
14529adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
14539adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic const btrc_interface_t bt_rc_interface = {
14549adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    sizeof(bt_rc_interface),
14559adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    init,
14569adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    get_play_status_rsp,
14579adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    NULL, /* list_player_app_attr_rsp */
14589adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    NULL, /* list_player_app_value_rsp */
14599adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    NULL, /* get_player_app_value_rsp */
14609adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    NULL, /* get_player_app_attr_text_rsp */
14619adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    NULL, /* get_player_app_value_text_rsp */
14629adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    get_element_attr_rsp,
14639adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    NULL, /* set_player_app_value_rsp */
14649adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    register_notification_rsp,
1465247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    set_volume,
14669adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    cleanup,
14679adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan};
14689adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
14699adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/*******************************************************************************
14709adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
14719adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Function         btif_rc_get_interface
14729adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
14739adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Description      Get the AVRCP callback interface
14749adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
14759adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Returns          btav_interface_t
14769adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
14779adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan*******************************************************************************/
14789adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanconst btrc_interface_t *btif_rc_get_interface(void)
14799adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
14809adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    BTIF_TRACE_EVENT1("%s", __FUNCTION__);
14819adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    return &bt_rc_interface;
1482247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1483247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1484247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/*******************************************************************************
1485247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**      Function         initialize_transaction
1486247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1487247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**      Description    Initializes fields of the transaction structure
1488247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1489247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**      Returns          void
1490247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji*******************************************************************************/
1491247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic void initialize_transaction(int lbl)
1492247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1493247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutex_lock(&device.lbllock);
1494247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if(lbl < MAX_TRANSACTIONS_PER_SESSION)
1495247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1496247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji       device.transaction[lbl].lbl = lbl;
1497247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji       device.transaction[lbl].in_use=FALSE;
1498247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji       device.transaction[lbl].handle=0;
1499247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1500247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutex_unlock(&device.lbllock);
1501247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1502247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1503247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/*******************************************************************************
1504247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**      Function         lbl_init
1505247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1506247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**      Description    Initializes label structures and mutexes.
1507247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1508247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**      Returns         void
1509247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji*******************************************************************************/
1510247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojivoid lbl_init()
1511247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1512247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    memset(&device,0,sizeof(rc_device_t));
1513247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutexattr_t attr;
1514247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutexattr_init(&attr);
1515247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutex_init(&(device.lbllock), &attr);
1516247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutexattr_destroy(&attr);
1517247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    init_all_transactions();
1518247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1519247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1520247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/*******************************************************************************
1521247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1522247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Function         init_all_transactions
1523247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1524247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Description    Initializes all transactions
1525247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1526247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Returns          void
1527247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji*******************************************************************************/
1528247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojivoid init_all_transactions()
1529247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1530247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    UINT8 txn_indx=0;
1531247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    for(txn_indx=0; txn_indx < MAX_TRANSACTIONS_PER_SESSION; txn_indx++)
1532247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1533247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        initialize_transaction(txn_indx);
1534247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1535247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1536247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1537247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/*******************************************************************************
1538247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1539247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Function         get_transaction_by_lbl
1540247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1541247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Description    Will return a transaction based on the label. If not inuse
1542247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**                     will return an error.
1543247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1544247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Returns          bt_status_t
1545247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji*******************************************************************************/
1546247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojirc_transaction_t *get_transaction_by_lbl(UINT8 lbl)
1547247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1548247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    rc_transaction_t *transaction = NULL;
1549247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutex_lock(&device.lbllock);
1550247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1551247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    /* Determine if this is a valid label */
1552247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if (lbl < MAX_TRANSACTIONS_PER_SESSION)
1553247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1554247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        if (FALSE==device.transaction[lbl].in_use)
1555247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        {
1556247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            transaction = NULL;
1557247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        }
1558247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        else
1559247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        {
1560247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            transaction = &(device.transaction[lbl]);
1561247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            BTIF_TRACE_DEBUG2("%s: Got transaction.label: %d",__FUNCTION__,lbl);
1562247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        }
1563247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1564247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1565247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutex_unlock(&device.lbllock);
1566247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    return transaction;
1567247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1568247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1569247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/*******************************************************************************
1570247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1571247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Function         get_transaction
1572247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1573247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Description    Obtains the transaction details.
1574247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1575247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Returns          bt_status_t
1576247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji*******************************************************************************/
1577247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1578247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojibt_status_t  get_transaction(rc_transaction_t **ptransaction)
1579247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1580247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    bt_status_t result = BT_STATUS_NOMEM;
1581247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    UINT8 i=0;
1582247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutex_lock(&device.lbllock);
1583247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1584247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    // Check for unused transactions
1585247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    for (i=0; i<MAX_TRANSACTIONS_PER_SESSION; i++)
1586247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1587247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        if (FALSE==device.transaction[i].in_use)
1588247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        {
1589247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            BTIF_TRACE_DEBUG2("%s:Got transaction.label: %d",__FUNCTION__,device.transaction[i].lbl);
1590247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            device.transaction[i].in_use = TRUE;
1591247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            *ptransaction = &(device.transaction[i]);
1592247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            result = BT_STATUS_SUCCESS;
1593247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            break;
1594247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        }
1595247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1596247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1597247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutex_unlock(&device.lbllock);
1598247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    return result;
1599247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1600247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1601247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1602247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/*******************************************************************************
1603247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1604247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Function         release_transaction
1605247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1606247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Description    Will release a transaction for reuse
1607247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1608247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Returns          bt_status_t
1609247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji*******************************************************************************/
1610247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojivoid release_transaction(UINT8 lbl)
1611247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1612247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    rc_transaction_t *transaction = get_transaction_by_lbl(lbl);
1613247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1614247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    /* If the transaction is in use... */
1615247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if (transaction != NULL)
1616247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1617247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        BTIF_TRACE_DEBUG2("%s: lbl: %d", __FUNCTION__, lbl);
1618247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        initialize_transaction(lbl);
1619247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1620247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1621247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1622247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/*******************************************************************************
1623247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1624247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Function         lbl_destroy
1625247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1626247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Description    Cleanup of the mutex
1627247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1628247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Returns          void
1629247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji*******************************************************************************/
1630247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojivoid lbl_destroy()
1631247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1632247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutex_destroy(&(device.lbllock));
1633247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1634a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie
1635a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie/*******************************************************************************
1636a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie**      Function       dev_blacklisted_for_absolute_volume
1637a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie**
1638a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie**      Description    Blacklist Devices that donot handle absolute volume well
1639a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie**
1640a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie**      Returns        True if the device is in the list
1641a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie*******************************************************************************/
1642a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xiestatic BOOLEAN dev_blacklisted_for_absolute_volume(BD_ADDR peer_dev)
1643a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie{
1644a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie    int i;
1645a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie    int blacklist_size = sizeof(rc_black_addr_prefix)/sizeof(rc_black_addr_prefix[0]);
1646a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie    for (i = 0; i < blacklist_size; i++) {
1647a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie        if (rc_black_addr_prefix[i][0] == peer_dev[0] &&
1648a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie            rc_black_addr_prefix[i][1] == peer_dev[1] &&
1649a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie            rc_black_addr_prefix[i][2] == peer_dev[2]) {
1650a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie            BTIF_TRACE_WARNING3("blacklist absolute volume for %02x:%02x:%02x",
1651a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie                                peer_dev[0], peer_dev[1], peer_dev[2]);
1652a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie            return TRUE;
1653a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie        }
1654a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie    }
1655a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie    return FALSE;
1656a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie}
1657