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                                                                  \
65e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_DEBUG("## %s ##", __FUNCTION__);                                            \
669adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if(btif_rc_cb.rc_connected == FALSE)                                                    \
679adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {                                                                                       \
68e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        BTIF_TRACE_WARNING("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    {                                                                                          \
83e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        BTIF_TRACE_WARNING("%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
1657850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xie/* the rc_black_addr_prefix and rc_white_addr_prefix are used to correct
1667850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xie * IOP issues of absolute volume feature
1677850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xie * We encoutered A2DP headsets/carkits advertising absolute volume but buggy.
1687850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xie * We would like to blacklist those devices.
1697850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xie * But we donot have a full list of the bad devices. So as a temp fix, we
1707850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xie * are blacklisting all the devices except the devices we have well tested,
1717850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xie * the ones in the whitelist.
1727850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xie *
1737850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xie * For now, only the rc_white_addr_prefix is used in the code while
1747850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xie * rc_black_addr_prefix is kept here for future long term solution.
1757850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xie */
176a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xiestatic const UINT8 rc_black_addr_prefix[][3] = {
1777850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xie    {0x0, 0x18, 0x6B}, // LG HBS-730
178a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie    {0x0, 0x26, 0x7E}  // VW Passat
179a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie};
180a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie
1817850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xiestatic const UINT8 rc_white_addr_prefix[][3] = {
1827850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xie    {0x94, 0xCE, 0x2C}, // Sony SBH50
183c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin    {0x30, 0x17, 0xC8} // Sony wm600
184c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin};
185c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin
186c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Linstatic const char* rc_white_name[] = {
187c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin    "SBH50",
188c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin    "MW600"
1897850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xie};
1907850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xie
1919adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic void send_reject_response (UINT8 rc_handle, UINT8 label,
1929adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    UINT8 pdu, UINT8 status);
1939adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic UINT8 opcode_from_pdu(UINT8 pdu);
1949adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic void send_metamsg_rsp (UINT8 rc_handle, UINT8 label,
1959adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tBTA_AV_CODE code, tAVRC_RESPONSE *pmetamsg_resp);
196247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic void register_volumechange(UINT8 label);
197247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic void lbl_init();
198247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic void lbl_destroy();
199247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic void init_all_transactions();
200247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic bt_status_t  get_transaction(rc_transaction_t **ptransaction);
201247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic void release_transaction(UINT8 label);
202247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic rc_transaction_t* get_transaction_by_lbl(UINT8 label);
203247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic void handle_rc_metamsg_rsp(tBTA_AV_META_MSG *pmeta_msg);
2049adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic void btif_rc_upstreams_evt(UINT16 event, tAVRC_COMMAND* p_param, UINT8 ctype, UINT8 label);
205247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic void btif_rc_upstreams_rsp_evt(UINT16 event, tAVRC_RESPONSE *pavrc_resp, UINT8 ctype, UINT8 label);
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Static variables
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic btif_rc_cb_t btif_rc_cb;
2119adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic btrc_callbacks_t *bt_rc_callbacks = NULL;
2124ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwoodstatic btrc_ctrl_callbacks_t *bt_rc_ctrl_callbacks = NULL;
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Static functions
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Externs
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern BOOLEAN btif_hf_call_terminated_recently();
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern BOOLEAN check_cod(const bt_bdaddr_t *remote_bdaddr, uint32_t cod);
2239adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Functions
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**   Local uinput helper functions
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint send_event (int fd, uint16_t type, uint16_t code, int32_t value)
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    struct uinput_event event;
235e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_DEBUG("%s type:%u code:%u value:%d", __FUNCTION__,
2369adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        type, code, value);
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&event, 0, sizeof(event));
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    event.type  = type;
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    event.code  = code;
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    event.value = value;
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return write(fd, &event, sizeof(event));
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid send_key (int fd, uint16_t key, int pressed)
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
247e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_DEBUG("%s fd:%d key:%u pressed:%d", __FUNCTION__,
2489adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        fd, key, pressed);
2499adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
2509adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (fd < 0)
2519adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
255e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_DEBUG("AVRCP: Send key %d (%d) fd=%d", key, pressed, fd);
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    send_event(fd, EV_KEY, key, pressed);
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    send_event(fd, EV_SYN, SYN_REPORT, 0);
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************** uinput related functions **************/
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint uinput_driver_check()
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    uint32_t i;
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i=0; i < MAX_UINPUT_PATHS; i++)
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (access(uinput_dev_path[i], O_RDWR) == 0) {
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           return 0;
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
270e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_ERROR("%s ERROR: uinput device is not in the system", __FUNCTION__);
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return -1;
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint uinput_create(char *name)
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    struct uinput_dev dev;
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int fd, err, x = 0;
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for(x=0; x < MAX_UINPUT_PATHS; x++)
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        fd = open(uinput_dev_path[x], O_RDWR);
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (fd < 0)
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            continue;
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (x == MAX_UINPUT_PATHS) {
287e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        BTIF_TRACE_ERROR("%s ERROR: uinput device open failed", __FUNCTION__);
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return -1;
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&dev, 0, sizeof(dev));
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (name)
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        strncpy(dev.name, name, UINPUT_MAX_NAME_SIZE);
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    dev.id.bustype = BUS_BLUETOOTH;
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    dev.id.vendor  = 0x0000;
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    dev.id.product = 0x0000;
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    dev.id.version = 0x0000;
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (write(fd, &dev, sizeof(dev)) < 0) {
300e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        BTIF_TRACE_ERROR("%s Unable to write device information", __FUNCTION__);
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        close(fd);
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return -1;
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ioctl(fd, UI_SET_EVBIT, EV_KEY);
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ioctl(fd, UI_SET_EVBIT, EV_REL);
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ioctl(fd, UI_SET_EVBIT, EV_SYN);
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (x = 0; key_map[x].name != NULL; x++)
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ioctl(fd, UI_SET_KEYBIT, key_map[x].mapped_id);
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for(x = 0; x < KEY_MAX; x++)
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ioctl(fd, UI_SET_KEYBIT, x);
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (ioctl(fd, UI_DEV_CREATE, NULL) < 0) {
316e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        BTIF_TRACE_ERROR("%s Unable to create uinput device", __FUNCTION__);
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        close(fd);
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return -1;
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return fd;
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint init_uinput (void)
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char *name = "AVRCP";
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
327e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    uinput_fd = uinput_create(name);
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (uinput_fd < 0) {
330e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        BTIF_TRACE_ERROR("%s AVRCP: Failed to initialize uinput for %s (%d)",
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          __FUNCTION__, name, uinput_fd);
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    } else {
333e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        BTIF_TRACE_DEBUG("%s AVRCP: Initialized uinput for %s (fd=%d)",
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          __FUNCTION__, name, uinput_fd);
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return uinput_fd;
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid close_uinput (void)
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
341e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (uinput_fd > 0) {
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ioctl(uinput_fd, UI_DEV_DESTROY);
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        close(uinput_fd);
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        uinput_fd = -1;
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
350247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojivoid handle_rc_features()
351247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
352247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    btrc_remote_features_t rc_features = BTRC_FEAT_NONE;
353247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    bt_bdaddr_t rc_addr;
354247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    bdcpy(rc_addr.address, btif_rc_cb.rc_addr);
3559adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
356a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie    if (dev_blacklisted_for_absolute_volume(btif_rc_cb.rc_addr))
357a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie    {
358a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie        btif_rc_cb.rc_features &= ~BTA_AV_FEAT_ADV_CTRL;
359a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie    }
360a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie
361247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if (btif_rc_cb.rc_features & BTA_AV_FEAT_BROWSE)
362247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
363247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        rc_features |= BTRC_FEAT_BROWSE;
364247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
365247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if ( (btif_rc_cb.rc_features & BTA_AV_FEAT_ADV_CTRL) &&
366247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         (btif_rc_cb.rc_features & BTA_AV_FEAT_RCTG))
367247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
368247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        rc_features |= BTRC_FEAT_ABSOLUTE_VOLUME;
369247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
370247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if (btif_rc_cb.rc_features & BTA_AV_FEAT_METADATA)
371247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
372247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        rc_features |= BTRC_FEAT_METADATA;
373247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
374e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_DEBUG("%s: rc_features=0x%x", __FUNCTION__, rc_features);
375247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    HAL_CBACK(bt_rc_callbacks, remote_features_cb, &rc_addr, rc_features)
376247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
377247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji#if (AVRC_ADV_CTRL_INCLUDED == TRUE)
378e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati     BTIF_TRACE_DEBUG("Checking for feature flags in btif_rc_handler with label %d",
379247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                        btif_rc_cb.rc_vol_label);
380247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     // Register for volume change on connect
381247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji      if(btif_rc_cb.rc_features & BTA_AV_FEAT_ADV_CTRL &&
382247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         btif_rc_cb.rc_features & BTA_AV_FEAT_RCTG)
383247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji      {
384247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         rc_transaction_t *p_transaction=NULL;
385247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         bt_status_t status = BT_STATUS_NOT_READY;
386247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         if(MAX_LABEL==btif_rc_cb.rc_vol_label)
387247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         {
388247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            status=get_transaction(&p_transaction);
389247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         }
390247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         else
391247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         {
392247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            p_transaction=get_transaction_by_lbl(btif_rc_cb.rc_vol_label);
393247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            if(NULL!=p_transaction)
394247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            {
395e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati               BTIF_TRACE_DEBUG("register_volumechange already in progress for label %d",
396247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                                  btif_rc_cb.rc_vol_label);
397247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji               return;
398247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            }
399247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            else
400247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji              status=get_transaction(&p_transaction);
401247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         }
402247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
403247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         if(BT_STATUS_SUCCESS == status && NULL!=p_transaction)
404247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         {
405247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            btif_rc_cb.rc_vol_label=p_transaction->lbl;
406247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            register_volumechange(btif_rc_cb.rc_vol_label);
407247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         }
408247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji       }
409247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji#endif
410247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
4119adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Function       handle_rc_connect
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
41698497a520010fc996a8ce490665cac6c1439dd2dJohn Du *  - Argument:    tBTA_AV_RC_OPEN  RC open data structure
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  - Description: RC connection event handler
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ***************************************************************************/
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid handle_rc_connect (tBTA_AV_RC_OPEN *p_rc_open)
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
423e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_DEBUG("%s: rc_handle: %d", __FUNCTION__, p_rc_open->rc_handle);
4249adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    bt_status_t result = BT_STATUS_SUCCESS;
4259adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    int i;
4269adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    char bd_str[18];
42793912473fde12ab5ab4b1be8774bbf43d47c7ddcMike Lockwood#if (AVRC_CTLR_INCLUDED == TRUE)
42893912473fde12ab5ab4b1be8774bbf43d47c7ddcMike Lockwood    bt_bdaddr_t rc_addr;
42993912473fde12ab5ab4b1be8774bbf43d47c7ddcMike Lockwood#endif
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4319adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if(p_rc_open->status == BTA_AV_SUCCESS)
4329adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
4339adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        memcpy(btif_rc_cb.rc_addr, p_rc_open->peer_addr, sizeof(BD_ADDR));
4349adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        btif_rc_cb.rc_features = p_rc_open->peer_features;
435247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        btif_rc_cb.rc_vol_label=MAX_LABEL;
436247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        btif_rc_cb.rc_volume=MAX_VOLUME;
4379adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
4389adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        btif_rc_cb.rc_connected = TRUE;
4399adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        btif_rc_cb.rc_handle = p_rc_open->rc_handle;
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
441247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        /* on locally initiated connection we will get remote features as part of connect */
442247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        if (btif_rc_cb.rc_features != 0)
443247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            handle_rc_features();
444247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
4459adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        result = uinput_driver_check();
4469adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        if(result == BT_STATUS_SUCCESS)
4479adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
4489adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            init_uinput();
4499adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
4504ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood#if (AVRC_CTLR_INCLUDED == TRUE)
4514ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood        bdcpy(rc_addr.address, btif_rc_cb.rc_addr);
4524ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood        /* report connection state if device is AVRCP target */
4534ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood        if (btif_rc_cb.rc_features & BTA_AV_FEAT_RCTG) {
4544ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood            HAL_CBACK(bt_rc_ctrl_callbacks, connection_state_cb, TRUE, &rc_addr);
4554ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood        }
4564ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood#endif
4579adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
4589adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    else
4599adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
460e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        BTIF_TRACE_ERROR("%s Connect failed with error code: %d",
4619adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            __FUNCTION__, p_rc_open->status);
4629adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        btif_rc_cb.rc_connected = FALSE;
4639adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Function       handle_rc_disconnect
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
46998497a520010fc996a8ce490665cac6c1439dd2dJohn Du *  - Argument:    tBTA_AV_RC_CLOSE     RC close data structure
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  - Description: RC disconnection event handler
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ***************************************************************************/
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid handle_rc_disconnect (tBTA_AV_RC_CLOSE *p_rc_close)
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4764ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood#if (AVRC_CTLR_INCLUDED == TRUE)
4774ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    bt_bdaddr_t rc_addr;
4784ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    tBTA_AV_FEAT features;
4794ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood#endif
480e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_DEBUG("%s: rc_handle: %d", __FUNCTION__, p_rc_close->rc_handle);
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_rc_cb.rc_handle = 0;
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_rc_cb.rc_connected = FALSE;
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(btif_rc_cb.rc_addr, 0, sizeof(BD_ADDR));
48568c53ded6523113ddcc1932fa5bcb7d378b12209Nitin Srivastava    memset(btif_rc_cb.rc_notif, 0, sizeof(btif_rc_cb.rc_notif));
4864ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood#if (AVRC_CTLR_INCLUDED == TRUE)
4874ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    features = btif_rc_cb.rc_features;
4884ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood#endif
4899adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    btif_rc_cb.rc_features = 0;
490247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    btif_rc_cb.rc_vol_label=MAX_LABEL;
491247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    btif_rc_cb.rc_volume=MAX_VOLUME;
492247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    init_all_transactions();
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    close_uinput();
4944ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood#if (AVRC_CTLR_INCLUDED == TRUE)
4954ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    bdcpy(rc_addr.address, btif_rc_cb.rc_addr);
4964ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood#endif
4974ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    memset(btif_rc_cb.rc_addr, 0, sizeof(BD_ADDR));
4984ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood#if (AVRC_CTLR_INCLUDED == TRUE)
4994ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    /* report connection state if device is AVRCP target */
5004ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    if (features & BTA_AV_FEAT_RCTG) {
5014ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood        HAL_CBACK(bt_rc_ctrl_callbacks, connection_state_cb, FALSE, &rc_addr);
5024ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    }
5034ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood#endif
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Function       handle_rc_passthrough_cmd
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  - Argument:    tBTA_AV_RC rc_id   remote control command ID
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *                 tBTA_AV_STATE key_state status of key press
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  - Description: Remote control command handler
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ***************************************************************************/
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid handle_rc_passthrough_cmd ( tBTA_AV_REMOTE_CMD *p_remote_cmd)
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    const char *status;
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int pressed, i;
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
520e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_DEBUG("%s: p_remote_cmd->rc_id=%d", __FUNCTION__, p_remote_cmd->rc_id);
52198497a520010fc996a8ce490665cac6c1439dd2dJohn Du
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If AVRC is open and peer sends PLAY but there is no AVDT, then we queue-up this PLAY */
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_remote_cmd)
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* queue AVRC PLAY if GAVDTP Open notification to app is pending (2 second timer) */
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_remote_cmd->rc_id == BTA_AV_RC_PLAY) && (!btif_av_is_connected()))
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_remote_cmd->key_state == AVRC_STATE_PRESS)
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
530e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                APPL_TRACE_WARNING("%s: AVDT not open, queuing the PLAY command", __FUNCTION__);
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btif_rc_cb.rc_pending_play = TRUE;
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_remote_cmd->rc_id == BTA_AV_RC_PAUSE) && (btif_rc_cb.rc_pending_play))
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
538e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_WARNING("%s: Clear the pending PLAY on PAUSE received", __FUNCTION__);
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_rc_cb.rc_pending_play = FALSE;
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_remote_cmd->key_state == AVRC_STATE_RELEASE) {
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = "released";
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        pressed = 0;
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    } else {
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = "pressed";
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        pressed = 1;
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If this is Play/Pause command (press or release)  before processing, check the following
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     * a voice call has ended recently
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     * the remote device is not of type headset
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     * If the above conditions meet, drop the Play/Pause command
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     * This fix is to interop with certain carkits which sends an automatic  PLAY  or PAUSE
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     * commands right after call ends
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     */
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if((p_remote_cmd->rc_id == BTA_AV_RC_PLAY || p_remote_cmd->rc_id == BTA_AV_RC_PAUSE)&&
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       (btif_hf_call_terminated_recently() == TRUE) &&
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       (check_cod( (const bt_bdaddr_t*)&(btif_rc_cb.rc_addr), COD_AV_HEADSETS) != TRUE))
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
562e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        BTIF_TRACE_DEBUG("%s:Dropping the play/Pause command received right after call end cmd:%d",
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           __FUNCTION__,p_remote_cmd->rc_id);
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
56798497a520010fc996a8ce490665cac6c1439dd2dJohn Du    if (p_remote_cmd->rc_id == BTA_AV_RC_FAST_FOR || p_remote_cmd->rc_id == BTA_AV_RC_REWIND) {
56898497a520010fc996a8ce490665cac6c1439dd2dJohn Du        HAL_CBACK(bt_rc_callbacks, passthrough_cmd_cb, p_remote_cmd->rc_id, pressed);
56998497a520010fc996a8ce490665cac6c1439dd2dJohn Du        return;
57098497a520010fc996a8ce490665cac6c1439dd2dJohn Du    }
57198497a520010fc996a8ce490665cac6c1439dd2dJohn Du
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; key_map[i].name != NULL; i++) {
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_remote_cmd->rc_id == key_map[i].avrcp) {
574e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            BTIF_TRACE_DEBUG("%s: %s %s", __FUNCTION__, key_map[i].name, status);
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           /* MusicPlayer uses a long_press_timeout of 1 second for PLAYPAUSE button
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            * and maps that to autoshuffle. So if for some reason release for PLAY/PAUSE
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            * comes 1 second after the press, the MediaPlayer UI goes into a bad state.
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            * The reason for the delay could be sniff mode exit or some AVDTP procedure etc.
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            * The fix is to generate a release right after the press and drown the 'actual'
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            * release.
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            */
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((key_map[i].release_quirk == 1) && (pressed == 0))
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
585e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                BTIF_TRACE_DEBUG("%s: AVRC %s Release Faked earlier, drowned now",
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  __FUNCTION__, key_map[i].name);
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            send_key(uinput_fd, key_map[i].mapped_id, pressed);
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((key_map[i].release_quirk == 1) && (pressed == 1))
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                GKI_delay(30); // 30ms
593e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                BTIF_TRACE_DEBUG("%s: AVRC %s Release quirk enabled, send release now",
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  __FUNCTION__, key_map[i].name);
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                send_key(uinput_fd, key_map[i].mapped_id, 0);
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (key_map[i].name == NULL)
602e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        BTIF_TRACE_ERROR("%s AVRCP: unknown button 0x%02X %s", __FUNCTION__,
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_remote_cmd->rc_id, status);
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6064ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood/***************************************************************************
6074ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood *  Function       handle_rc_passthrough_rsp
6084ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood *
6094ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood *  - Argument:    tBTA_AV_REMOTE_RSP passthrough command response
6104ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood *
6114ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood *  - Description: Remote control passthrough response handler
6124ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood *
6134ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood ***************************************************************************/
6144ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwoodvoid handle_rc_passthrough_rsp ( tBTA_AV_REMOTE_RSP *p_remote_rsp)
6154ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood{
6164ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood#if (AVRC_CTLR_INCLUDED == TRUE)
6174ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    const char *status;
6184ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    if (btif_rc_cb.rc_features & BTA_AV_FEAT_RCTG)
6194ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    {
6204ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood        int key_state;
6214ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood        if (p_remote_rsp->key_state == AVRC_STATE_RELEASE)
6224ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood        {
6234ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood            status = "released";
6244ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood            key_state = 1;
6254ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood        }
6264ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood        else
6274ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood        {
6284ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood            status = "pressed";
6294ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood            key_state = 0;
6304ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood        }
6314ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood
632e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        BTIF_TRACE_DEBUG("%s: rc_id=%d status=%s", __FUNCTION__, p_remote_rsp->rc_id, status);
6334ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood
6344ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood        release_transaction(p_remote_rsp->label);
6354ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood        HAL_CBACK(bt_rc_ctrl_callbacks, passthrough_rsp_cb, p_remote_rsp->rc_id, key_state);
6364ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    }
6374ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    else
6384ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    {
639e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        BTIF_TRACE_ERROR("%s DUT does not support AVRCP controller role", __FUNCTION__);
6404ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    }
6414ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood#else
642e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_ERROR("%s AVRCP controller role is not enabled", __FUNCTION__);
6434ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood#endif
6444ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood}
6454ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood
6469adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanvoid handle_uid_changed_notification(tBTA_AV_META_MSG *pmeta_msg, tAVRC_COMMAND *pavrc_command)
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6489adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tAVRC_RESPONSE avrc_rsp = {0};
6499adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.rsp.pdu = pavrc_command->pdu;
6509adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.rsp.status = AVRC_STS_NO_ERROR;
6519adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.rsp.opcode = pavrc_command->cmd.opcode;
6529adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
6539adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.reg_notif.event_id = pavrc_command->reg_notif.event_id;
6549adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.reg_notif.param.uid_counter = 0;
6559adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
6569adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    send_metamsg_rsp(pmeta_msg->rc_handle, pmeta_msg->label, AVRC_RSP_INTERIM, &avrc_rsp);
6579adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    send_metamsg_rsp(pmeta_msg->rc_handle, pmeta_msg->label, AVRC_RSP_CHANGED, &avrc_rsp);
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6599adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
6609adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
6619adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
6629adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/***************************************************************************
6639adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *  Function       handle_rc_metamsg_cmd
6649adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *
6659adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *  - Argument:    tBTA_AV_VENDOR Structure containing the received
6669adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *                          metamsg command
6679adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *
6689adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *  - Description: Remote control metamsg command handler (AVRCP 1.3)
6699adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *
6709adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan ***************************************************************************/
6719adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanvoid handle_rc_metamsg_cmd (tBTA_AV_META_MSG *pmeta_msg)
6729adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
6739adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    /* Parse the metamsg command and pass it on to BTL-IFS */
6749adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    UINT8             scratch_buf[512] = {0};
6759adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tAVRC_COMMAND    avrc_command = {0};
6769adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tAVRC_STS status;
6779adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    int param_len;
6789adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
679e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_EVENT("+ %s", __FUNCTION__);
6809adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
6819adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (pmeta_msg->p_msg->hdr.opcode != AVRC_OP_VENDOR)
6829adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
683e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        BTIF_TRACE_WARNING("Invalid opcode: %x", pmeta_msg->p_msg->hdr.opcode);
6849adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        return;
6859adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
6869adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (pmeta_msg->len < 3)
6879adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
688e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        BTIF_TRACE_WARNING("Invalid length.Opcode: 0x%x, len: 0x%x", pmeta_msg->p_msg->hdr.opcode,
6899adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            pmeta_msg->len);
6909adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        return;
6919adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
6929adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
6939adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (pmeta_msg->code >= AVRC_RSP_NOT_IMPL)
6949adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
695247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji#if (AVRC_ADV_CTRL_INCLUDED == TRUE)
696247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
697247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     rc_transaction_t *transaction=NULL;
698247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     transaction=get_transaction_by_lbl(pmeta_msg->label);
699247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     if(NULL!=transaction)
700247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     {
701247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        handle_rc_metamsg_rsp(pmeta_msg);
702247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     }
703247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     else
704247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     {
705e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati         BTIF_TRACE_DEBUG("%s:Discard vendor dependent rsp. code: %d label:%d.",
706247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji             __FUNCTION__, pmeta_msg->code, pmeta_msg->label);
707247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     }
708247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     return;
709247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
710247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji#else
711247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
712e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        BTIF_TRACE_DEBUG("%s:Received vendor dependent rsp. code: %d len: %d. Not processing it.",
7139adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            __FUNCTION__, pmeta_msg->code, pmeta_msg->len);
7149adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        return;
715247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
716247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji#endif
717247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji      }
718247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
719247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    status=AVRC_ParsCommand(pmeta_msg->p_msg, &avrc_command, scratch_buf, sizeof(scratch_buf));
720e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_DEBUG("Received vendor command.code,PDU and label: %d, %d,%d",pmeta_msg->code,
721247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                       avrc_command.cmd.pdu, pmeta_msg->label);
7229adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
7239adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (status != AVRC_STS_NO_ERROR)
7249adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
7259adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        /* return error */
726e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        BTIF_TRACE_WARNING("%s: Error in parsing received metamsg command. status: 0x%02x",
7279adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            __FUNCTION__, status);
7289adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        send_reject_response(pmeta_msg->rc_handle, pmeta_msg->label, avrc_command.pdu, status);
7299adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
7309adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    else
7319adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
7329adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        /* if RegisterNotification, add it to our registered queue */
7339adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
7349adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        if (avrc_command.cmd.pdu == AVRC_PDU_REGISTER_NOTIFICATION)
7359adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
7369adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            UINT8 event_id = avrc_command.reg_notif.event_id;
7379adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            param_len = sizeof(tAVRC_REG_NOTIF_CMD);
738e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            BTIF_TRACE_EVENT("%s:New register notification received.event_id:%s,label:0x%x,code:%x",
739247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            __FUNCTION__,dump_rc_notification_event_id(event_id), pmeta_msg->label,pmeta_msg->code);
7409adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            btif_rc_cb.rc_notif[event_id-1].bNotify = TRUE;
7419adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            btif_rc_cb.rc_notif[event_id-1].label = pmeta_msg->label;
7429adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
7439adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            if(event_id == AVRC_EVT_UIDS_CHANGE)
7449adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
7459adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                handle_uid_changed_notification(pmeta_msg, &avrc_command);
7469adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                return;
7479adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
7489adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
7499adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
7509adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
751e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        BTIF_TRACE_EVENT("%s: Passing received metamsg command to app. pdu: %s",
7529adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            __FUNCTION__, dump_rc_pdu(avrc_command.cmd.pdu));
7539adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
7549adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        /* Since handle_rc_metamsg_cmd() itself is called from
7559adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            *btif context, no context switching is required. Invoke
7569adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            * btif_rc_upstreams_evt directly from here. */
7579adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        btif_rc_upstreams_evt((uint16_t)avrc_command.cmd.pdu, &avrc_command, pmeta_msg->code,
758247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                               pmeta_msg->label);
7599adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function       btif_rc_handler
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description    RC event handler
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ***************************************************************************/
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_rc_handler(tBTA_AV_EVT event, tBTA_AV *p_data)
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
771e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_DEBUG ("%s event:%s", __FUNCTION__, dump_rc_event(event));
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AV_RC_OPEN_EVT:
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
776e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            BTIF_TRACE_DEBUG("Peer_features:%x", p_data->rc_open.peer_features);
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            handle_rc_connect( &(p_data->rc_open) );
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }break;
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AV_RC_CLOSE_EVT:
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            handle_rc_disconnect( &(p_data->rc_close) );
7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }break;
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AV_REMOTE_CMD_EVT:
7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
787afa6e1abbedaad8fe854b0f43999b8aeb801af91Matthew Xie            BTIF_TRACE_DEBUG("rc_id:0x%x key_state:%d", p_data->remote_cmd.rc_id,
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               p_data->remote_cmd.key_state);
7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            handle_rc_passthrough_cmd( (&p_data->remote_cmd) );
7909adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
7919adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
79293912473fde12ab5ab4b1be8774bbf43d47c7ddcMike Lockwood#if (AVRC_CTLR_INCLUDED == TRUE)
79393912473fde12ab5ab4b1be8774bbf43d47c7ddcMike Lockwood        case BTA_AV_REMOTE_RSP_EVT:
79493912473fde12ab5ab4b1be8774bbf43d47c7ddcMike Lockwood        {
795e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            BTIF_TRACE_DEBUG("RSP: rc_id:0x%x key_state:%d", p_data->remote_rsp.rc_id,
79693912473fde12ab5ab4b1be8774bbf43d47c7ddcMike Lockwood                               p_data->remote_rsp.key_state);
79793912473fde12ab5ab4b1be8774bbf43d47c7ddcMike Lockwood            handle_rc_passthrough_rsp( (&p_data->remote_rsp) );
79893912473fde12ab5ab4b1be8774bbf43d47c7ddcMike Lockwood        }
79993912473fde12ab5ab4b1be8774bbf43d47c7ddcMike Lockwood        break;
80093912473fde12ab5ab4b1be8774bbf43d47c7ddcMike Lockwood#endif
8019adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case BTA_AV_RC_FEAT_EVT:
8029adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
803e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            BTIF_TRACE_DEBUG("Peer_features:%x", p_data->rc_feat.peer_features);
8049adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            btif_rc_cb.rc_features = p_data->rc_feat.peer_features;
805247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            handle_rc_features();
8069adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
8079adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
8089adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case BTA_AV_META_MSG_EVT:
8099adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
810e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            BTIF_TRACE_DEBUG("BTA_AV_META_MSG_EVT  code:%d label:%d", p_data->meta_msg.code,
8119adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                p_data->meta_msg.label);
812e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            BTIF_TRACE_DEBUG("  company_id:0x%x len:%d handle:%d", p_data->meta_msg.company_id,
8139adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                p_data->meta_msg.len, p_data->meta_msg.rc_handle);
8149adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            /* handle the metamsg command */
8159adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            handle_rc_metamsg_cmd(&(p_data->meta_msg));
8169adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
8179adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
819e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            BTIF_TRACE_DEBUG("Unhandled RC event : 0x%x", event);
8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************
8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function       btif_rc_get_connected_peer
8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description    Fetches the connected headset's BD_ADDR if any
8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ***************************************************************************/
8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_rc_get_connected_peer(BD_ADDR peer_addr)
8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btif_rc_cb.rc_connected == TRUE) {
8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(peer_addr, btif_rc_cb.rc_addr);
8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return TRUE;
8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return FALSE;
8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************
8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function       btif_rc_check_handle_pending_play
8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description    Clears the queued PLAY command. if bSend is TRUE, forwards to app
8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ***************************************************************************/
8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* clear the queued PLAY command. if bSend is TRUE, forward to app */
8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_rc_check_handle_pending_play (BD_ADDR peer_addr, BOOLEAN bSendToApp)
8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8505cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(peer_addr);
8515cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
852e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_DEBUG("%s: bSendToApp=%d", __FUNCTION__, bSendToApp);
8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btif_rc_cb.rc_pending_play)
8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (bSendToApp)
8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            tBTA_AV_REMOTE_CMD remote_cmd;
858e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("%s: Sending queued PLAYED event to app", __FUNCTION__);
8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset (&remote_cmd, 0, sizeof(tBTA_AV_REMOTE_CMD));
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            remote_cmd.rc_handle  = btif_rc_cb.rc_handle;
8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            remote_cmd.rc_id      = AVRC_ID_PLAY;
8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            remote_cmd.hdr.ctype  = AVRC_CMD_CTRL;
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            remote_cmd.hdr.opcode = AVRC_OP_PASS_THRU;
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* delay sending to app, else there is a timing issue in the framework,
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             ** which causes the audio to be on th device's speaker. Delay between
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             ** OPEN & RC_PLAYs
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            */
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GKI_delay (200);
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* send to app - both PRESSED & RELEASED */
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            remote_cmd.key_state  = AVRC_STATE_PRESS;
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            handle_rc_passthrough_cmd( &remote_cmd );
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GKI_delay (100);
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            remote_cmd.key_state  = AVRC_STATE_RELEASE;
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            handle_rc_passthrough_cmd( &remote_cmd );
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btif_rc_cb.rc_pending_play = FALSE;
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8849adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/* Generic reject response */
8859adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic void send_reject_response (UINT8 rc_handle, UINT8 label, UINT8 pdu, UINT8 status)
8869adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
8879adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    UINT8 ctype = AVRC_RSP_REJ;
8889adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tAVRC_RESPONSE avrc_rsp;
8899adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    BT_HDR *p_msg = NULL;
8909adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    memset (&avrc_rsp, 0, sizeof(tAVRC_RESPONSE));
8919adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
8929adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.rsp.opcode = opcode_from_pdu(pdu);
8939adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.rsp.pdu    = pdu;
8949adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.rsp.status = status;
8959adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
8969adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (AVRC_STS_NO_ERROR == (status = AVRC_BldResponse(rc_handle, &avrc_rsp, &p_msg)) )
8979adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
898e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        BTIF_TRACE_DEBUG("%s:Sending error notification to handle:%d. pdu:%s,status:0x%02x",
8999adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            __FUNCTION__, rc_handle, dump_rc_pdu(pdu), status);
9009adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        BTA_AvMetaRsp(rc_handle, label, ctype, p_msg);
9019adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
9029adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
9039adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
9049adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/***************************************************************************
9059adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *  Function       send_metamsg_rsp
9069adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *
9079adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *  - Argument:
9089adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *                  rc_handle     RC handle corresponding to the connected RC
9099adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *                  label            Label of the RC response
9109adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *                  code            Response type
9119adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *                  pmetamsg_resp    Vendor response
9129adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *
9139adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *  - Description: Remote control metamsg response handler (AVRCP 1.3)
9149adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *
9159adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan ***************************************************************************/
9169adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic void send_metamsg_rsp (UINT8 rc_handle, UINT8 label, tBTA_AV_CODE code,
9179adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tAVRC_RESPONSE *pmetamsg_resp)
9189adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
9199adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    UINT8 ctype;
9209adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tAVRC_STS status;
9219adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
9229adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (!pmetamsg_resp)
9239adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
924e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        BTIF_TRACE_WARNING("%s: Invalid response received from application", __FUNCTION__);
9259adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        return;
9269adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
9279adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
928e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_EVENT("+%s: rc_handle: %d, label: %d, code: 0x%02x, pdu: %s", __FUNCTION__,
9299adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        rc_handle, label, code, dump_rc_pdu(pmetamsg_resp->rsp.pdu));
9309adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
9319adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (pmetamsg_resp->rsp.status != AVRC_STS_NO_ERROR)
9329adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
9339adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        ctype = AVRC_RSP_REJ;
9349adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
9359adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    else
9369adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
9379adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        if ( code < AVRC_RSP_NOT_IMPL)
9389adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
9399adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            if (code == AVRC_CMD_NOTIF)
9409adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
9419adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan               ctype = AVRC_RSP_INTERIM;
9429adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
9439adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            else if (code == AVRC_CMD_STATUS)
9449adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
9459adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan               ctype = AVRC_RSP_IMPL_STBL;
9469adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
9479adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            else
9489adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
9499adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan               ctype = AVRC_RSP_ACCEPT;
9509adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
9519adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
9529adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        else
9539adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
9549adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            ctype = code;
9559adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
9569adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
9579adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    /* if response is for register_notification, make sure the rc has
9589adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    actually registered for this */
9599adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if((pmetamsg_resp->rsp.pdu == AVRC_PDU_REGISTER_NOTIFICATION) && (code == AVRC_RSP_CHANGED))
9609adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
9619adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        BOOLEAN bSent = FALSE;
9629adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        UINT8   event_id = pmetamsg_resp->reg_notif.event_id;
9639adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        BOOLEAN bNotify = (btif_rc_cb.rc_connected) && (btif_rc_cb.rc_notif[event_id-1].bNotify);
9649adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
9659adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        /* de-register this notification for a CHANGED response */
9669adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        btif_rc_cb.rc_notif[event_id-1].bNotify = FALSE;
967e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        BTIF_TRACE_DEBUG("%s rc_handle: %d. event_id: 0x%02d bNotify:%u", __FUNCTION__,
9689adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan             btif_rc_cb.rc_handle, event_id, bNotify);
9699adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        if (bNotify)
9709adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
9719adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            BT_HDR *p_msg = NULL;
9729adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            tAVRC_STS status;
9739adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
9749adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            if (AVRC_STS_NO_ERROR == (status = AVRC_BldResponse(btif_rc_cb.rc_handle,
9759adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                pmetamsg_resp, &p_msg)) )
9769adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
977e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                BTIF_TRACE_DEBUG("%s Sending notification to rc_handle: %d. event_id: 0x%02d",
9789adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                     __FUNCTION__, btif_rc_cb.rc_handle, event_id);
9799adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                bSent = TRUE;
9809adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                BTA_AvMetaRsp(btif_rc_cb.rc_handle, btif_rc_cb.rc_notif[event_id-1].label,
9819adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                    ctype, p_msg);
9829adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
9839adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            else
9849adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
985e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                BTIF_TRACE_WARNING("%s failed to build metamsg response. status: 0x%02x",
9869adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                    __FUNCTION__, status);
9879adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
9889adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
9899adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
9909adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
9919adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        if (!bSent)
9929adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
993e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            BTIF_TRACE_DEBUG("%s: Notification not sent, as there are no RC connections or the \
9949adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                CT has not subscribed for event_id: %s", __FUNCTION__, dump_rc_notification_event_id(event_id));
9959adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
9969adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
9979adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    else
9989adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
9999adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        /* All other commands go here */
10009adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
10019adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        BT_HDR *p_msg = NULL;
10029adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        tAVRC_STS status;
10039adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
10049adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        status = AVRC_BldResponse(rc_handle, pmetamsg_resp, &p_msg);
10059adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
10069adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        if (status == AVRC_STS_NO_ERROR)
10079adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
10089adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            BTA_AvMetaRsp(rc_handle, label, ctype, p_msg);
10099adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
10109adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        else
10119adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
1012e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            BTIF_TRACE_ERROR("%s: failed to build metamsg response. status: 0x%02x",
10139adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                __FUNCTION__, status);
10149adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
10159adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
10169adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
10179adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
10189adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic UINT8 opcode_from_pdu(UINT8 pdu)
10199adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
10209adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    UINT8 opcode = 0;
10219adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
10229adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    switch (pdu)
10239adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
10249adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    case AVRC_PDU_NEXT_GROUP:
10259adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    case AVRC_PDU_PREV_GROUP: /* pass thru */
10269adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        opcode  = AVRC_OP_PASS_THRU;
10279adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
10289adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
10299adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    default: /* vendor */
10309adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        opcode  = AVRC_OP_VENDOR;
10319adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
10329adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
10339adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
10349adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    return opcode;
10359adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
10369adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
10379adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/*******************************************************************************
10389adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
10399adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Function         btif_rc_upstreams_evt
10409adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
10419adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Description      Executes AVRC UPSTREAMS events in btif context.
10429adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
10439adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Returns          void
10449adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
10459adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan*******************************************************************************/
10469adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic void btif_rc_upstreams_evt(UINT16 event, tAVRC_COMMAND *pavrc_cmd, UINT8 ctype, UINT8 label)
10479adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
1048e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_EVENT("%s pdu: %s handle: 0x%x ctype:%x label:%x", __FUNCTION__,
10499adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        dump_rc_pdu(pavrc_cmd->pdu), btif_rc_cb.rc_handle, ctype, label);
10509adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
10519adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    switch (event)
10529adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
10539adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case AVRC_PDU_GET_PLAY_STATUS:
10549adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
10559adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            FILL_PDU_QUEUE(IDX_GET_PLAY_STATUS_RSP, ctype, label, TRUE)
10569adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            HAL_CBACK(bt_rc_callbacks, get_play_status_cb);
10579adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
10589adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
10599adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case AVRC_PDU_LIST_PLAYER_APP_ATTR:
10609adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case AVRC_PDU_LIST_PLAYER_APP_VALUES:
10619adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case AVRC_PDU_GET_CUR_PLAYER_APP_VALUE:
10629adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case AVRC_PDU_SET_PLAYER_APP_VALUE:
10639adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case AVRC_PDU_GET_PLAYER_APP_ATTR_TEXT:
10649adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case AVRC_PDU_GET_PLAYER_APP_VALUE_TEXT:
10659adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
10669adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            /* TODO: Add support for Application Settings */
1067081d6e548bed5a91c0ba9abda518c06a1b0ba7f5Zhihai Xu            send_reject_response (btif_rc_cb.rc_handle, label, pavrc_cmd->pdu, AVRC_STS_BAD_CMD);
10689adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
10699adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
10709adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case AVRC_PDU_GET_ELEMENT_ATTR:
10719adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
10729adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            btrc_media_attr_t element_attrs[BTRC_MAX_ELEM_ATTR_SIZE];
10739adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            UINT8 num_attr;
1074841e5b5092bcdbc1acffd6cf7255ec423fe15fdbRavi Nagarajan             memset(&element_attrs, 0, sizeof(element_attrs));
10759adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            if (pavrc_cmd->get_elem_attrs.num_attr == 0)
10769adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
10779adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                /* CT requests for all attributes */
10789adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                int attr_cnt;
1079841e5b5092bcdbc1acffd6cf7255ec423fe15fdbRavi Nagarajan                num_attr = BTRC_MAX_ELEM_ATTR_SIZE;
1080841e5b5092bcdbc1acffd6cf7255ec423fe15fdbRavi Nagarajan                for (attr_cnt = 0; attr_cnt < BTRC_MAX_ELEM_ATTR_SIZE; attr_cnt++)
10819adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                {
1082841e5b5092bcdbc1acffd6cf7255ec423fe15fdbRavi Nagarajan                    element_attrs[attr_cnt] = attr_cnt + 1;
10839adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                }
10849adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
10859adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            else if (pavrc_cmd->get_elem_attrs.num_attr == 0xFF)
10869adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
1087841e5b5092bcdbc1acffd6cf7255ec423fe15fdbRavi Nagarajan                /* 0xff indicates, no attributes requested - reject */
1088841e5b5092bcdbc1acffd6cf7255ec423fe15fdbRavi Nagarajan                send_reject_response (btif_rc_cb.rc_handle, label, pavrc_cmd->pdu,
1089841e5b5092bcdbc1acffd6cf7255ec423fe15fdbRavi Nagarajan                    AVRC_STS_BAD_PARAM);
1090841e5b5092bcdbc1acffd6cf7255ec423fe15fdbRavi Nagarajan                return;
10919adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
10929adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            else
10939adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
10949adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                num_attr = pavrc_cmd->get_elem_attrs.num_attr;
10959adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                memcpy(element_attrs, pavrc_cmd->get_elem_attrs.attrs, sizeof(UINT32)
10969adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                    *pavrc_cmd->get_elem_attrs.num_attr);
10979adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
10989adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            FILL_PDU_QUEUE(IDX_GET_ELEMENT_ATTR_RSP, ctype, label, TRUE);
10999adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            HAL_CBACK(bt_rc_callbacks, get_element_attr_cb, num_attr, element_attrs);
11009adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
11019adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
11029adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case AVRC_PDU_REGISTER_NOTIFICATION:
11039adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
11049adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            if(pavrc_cmd->reg_notif.event_id == BTRC_EVT_PLAY_POS_CHANGED &&
11059adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                pavrc_cmd->reg_notif.param == 0)
11069adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
1107e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                BTIF_TRACE_WARNING("%s Device registering position changed with illegal param 0.",
11089adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                    __FUNCTION__);
11099adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                send_reject_response (btif_rc_cb.rc_handle, label, pavrc_cmd->pdu, AVRC_STS_BAD_PARAM);
11109adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                /* de-register this notification for a rejected response */
11119adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                btif_rc_cb.rc_notif[BTRC_EVT_PLAY_POS_CHANGED - 1].bNotify = FALSE;
11129adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                return;
11139adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
11149adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            HAL_CBACK(bt_rc_callbacks, register_notification_cb, pavrc_cmd->reg_notif.event_id,
11159adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                pavrc_cmd->reg_notif.param);
11169adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
11179adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
11189adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case AVRC_PDU_INFORM_DISPLAY_CHARSET:
11199adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
11209adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            tAVRC_RESPONSE avrc_rsp;
1121e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            BTIF_TRACE_EVENT("%s() AVRC_PDU_INFORM_DISPLAY_CHARSET", __FUNCTION__);
11229adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            if(btif_rc_cb.rc_connected == TRUE)
11239adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
11249adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                memset(&(avrc_rsp.inform_charset), 0, sizeof(tAVRC_RSP));
11259adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                avrc_rsp.inform_charset.opcode=opcode_from_pdu(AVRC_PDU_INFORM_DISPLAY_CHARSET);
11269adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                avrc_rsp.inform_charset.pdu=AVRC_PDU_INFORM_DISPLAY_CHARSET;
11279adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                avrc_rsp.inform_charset.status=AVRC_STS_NO_ERROR;
11289adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                send_metamsg_rsp(btif_rc_cb.rc_handle, label, ctype, &avrc_rsp);
11299adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
11309adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
11319adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
11329adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        default:
11339adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
11349adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        send_reject_response (btif_rc_cb.rc_handle, label, pavrc_cmd->pdu,
11359adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            (pavrc_cmd->pdu == AVRC_PDU_SEARCH)?AVRC_STS_SEARCH_NOT_SUP:AVRC_STS_BAD_CMD);
11369adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        return;
11379adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
11389adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
11399adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
11409adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
11419adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
11429adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
1143247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1144247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/*******************************************************************************
1145247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1146247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Function         btif_rc_upstreams_rsp_evt
1147247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1148247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Description      Executes AVRC UPSTREAMS response events in btif context.
1149247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1150247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Returns          void
1151247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1152247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji*******************************************************************************/
1153247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic void btif_rc_upstreams_rsp_evt(UINT16 event, tAVRC_RESPONSE *pavrc_resp, UINT8 ctype, UINT8 label)
1154247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1155e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_EVENT("%s pdu: %s handle: 0x%x ctype:%x label:%x", __FUNCTION__,
1156247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        dump_rc_pdu(pavrc_resp->pdu), btif_rc_cb.rc_handle, ctype, label);
1157247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1158247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji#if (AVRC_ADV_CTRL_INCLUDED == TRUE)
1159247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    switch (event)
1160247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1161247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        case AVRC_PDU_REGISTER_NOTIFICATION:
1162247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        {
1163247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji             if(AVRC_RSP_CHANGED==ctype)
1164247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                 btif_rc_cb.rc_volume=pavrc_resp->reg_notif.param.volume;
1165247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji             HAL_CBACK(bt_rc_callbacks, volume_change_cb, pavrc_resp->reg_notif.param.volume,ctype)
1166247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        }
1167247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        break;
1168247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1169247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        case AVRC_PDU_SET_ABSOLUTE_VOLUME:
1170247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        {
1171e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            BTIF_TRACE_DEBUG("Set absolute volume change event received: volume %d,ctype %d",
1172247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                pavrc_resp->volume.volume,ctype);
1173247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            if(AVRC_RSP_ACCEPT==ctype)
1174247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                btif_rc_cb.rc_volume=pavrc_resp->volume.volume;
1175247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            HAL_CBACK(bt_rc_callbacks,volume_change_cb,pavrc_resp->volume.volume,ctype)
1176247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        }
1177247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        break;
1178247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1179247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        default:
1180247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            return;
1181247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1182247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji#endif
1183247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1184247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
11859adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/************************************************************************************
11869adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**  AVRCP API Functions
11879adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan************************************************************************************/
11889adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
11899adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/*******************************************************************************
11909adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
11919adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Function         init
11929adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
11939adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Description      Initializes the AVRC interface
11949adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
11959adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Returns          bt_status_t
11969adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
11979adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan*******************************************************************************/
11989adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic bt_status_t init(btrc_callbacks_t* callbacks )
11999adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
1200e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_EVENT("## %s ##", __FUNCTION__);
12019adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    bt_status_t result = BT_STATUS_SUCCESS;
12029adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
12039adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (bt_rc_callbacks)
12049adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        return BT_STATUS_DONE;
12059adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
12069adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    bt_rc_callbacks = callbacks;
12079adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    memset (&btif_rc_cb, 0, sizeof(btif_rc_cb));
1208247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    btif_rc_cb.rc_vol_label=MAX_LABEL;
1209247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    btif_rc_cb.rc_volume=MAX_VOLUME;
1210247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    lbl_init();
12119adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
12129adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    return result;
12139adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
12149adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
12154ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood/*******************************************************************************
12164ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood**
12174ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood** Function         init_ctrl
12184ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood**
12194ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood** Description      Initializes the AVRC interface
12204ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood**
12214ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood** Returns          bt_status_t
12224ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood**
12234ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood*******************************************************************************/
12244ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwoodstatic bt_status_t init_ctrl(btrc_ctrl_callbacks_t* callbacks )
12254ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood{
1226e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_EVENT("## %s ##", __FUNCTION__);
12274ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    bt_status_t result = BT_STATUS_SUCCESS;
12284ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood
12294ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    if (bt_rc_ctrl_callbacks)
12304ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood        return BT_STATUS_DONE;
12314ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood
12324ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    bt_rc_ctrl_callbacks = callbacks;
12334ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    memset (&btif_rc_cb, 0, sizeof(btif_rc_cb));
12344ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    btif_rc_cb.rc_vol_label=MAX_LABEL;
12354ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    btif_rc_cb.rc_volume=MAX_VOLUME;
12364ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    lbl_init();
12374ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood
12384ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    return result;
12394ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood}
12404ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood
12419adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/***************************************************************************
12429adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
12439adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Function         get_play_status_rsp
12449adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
12459adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Description      Returns the current play status.
12469adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**                      This method is called in response to
12479adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**                      GetPlayStatus request.
12489adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
12499adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Returns          bt_status_t
12509adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
12519adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan***************************************************************************/
12529adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic bt_status_t get_play_status_rsp(btrc_play_status_t play_status, uint32_t song_len,
12539adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    uint32_t song_pos)
12549adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
12559adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tAVRC_RESPONSE avrc_rsp;
12569adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    UINT32 i;
12579adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    CHECK_RC_CONNECTED
12589adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    memset(&(avrc_rsp.get_play_status), 0, sizeof(tAVRC_GET_PLAY_STATUS_RSP));
12599adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.get_play_status.song_len = song_len;
12609adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.get_play_status.song_pos = song_pos;
12619adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.get_play_status.play_status = play_status;
12629adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
12639adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.get_play_status.pdu = AVRC_PDU_GET_PLAY_STATUS;
12649adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.get_play_status.opcode = opcode_from_pdu(AVRC_PDU_GET_PLAY_STATUS);
1265b88fc6cb5636c4af17077502fe3313ffb32d93eeRavi Nagarajan    avrc_rsp.get_play_status.status = AVRC_STS_NO_ERROR;
12669adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    /* Send the response */
12679adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    SEND_METAMSG_RSP(IDX_GET_PLAY_STATUS_RSP, &avrc_rsp);
12689adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    return BT_STATUS_SUCCESS;
12699adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
12709adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
12719adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/***************************************************************************
12729adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
12739adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Function         get_element_attr_rsp
12749adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
12759adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Description      Returns the current songs' element attributes
12769adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**                      in text.
12779adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
12789adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Returns          bt_status_t
12799adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
12809adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan***************************************************************************/
12819adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic bt_status_t get_element_attr_rsp(uint8_t num_attr, btrc_element_attr_val_t *p_attrs)
12829adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
12839adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tAVRC_RESPONSE avrc_rsp;
12849adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    UINT32 i;
12859adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    uint8_t j;
12869adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tAVRC_ATTR_ENTRY element_attrs[BTRC_MAX_ELEM_ATTR_SIZE];
12879adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    CHECK_RC_CONNECTED
12889adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    memset(element_attrs, 0, sizeof(tAVRC_ATTR_ENTRY) * num_attr);
12899adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
12909adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (num_attr == 0)
12919adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
12929adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        avrc_rsp.get_play_status.status = AVRC_STS_BAD_PARAM;
12939adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
12949adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    else
12959adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
12969adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        for (i=0; i<num_attr; i++) {
12979adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            element_attrs[i].attr_id = p_attrs[i].attr_id;
12989adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            element_attrs[i].name.charset_id = AVRC_CHARSET_ID_UTF8;
12999adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            element_attrs[i].name.str_len = (UINT16)strlen((char *)p_attrs[i].text);
13009adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            element_attrs[i].name.p_str = p_attrs[i].text;
1301e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            BTIF_TRACE_DEBUG("%s attr_id:0x%x, charset_id:0x%x, str_len:%d, str:%s",
13029adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                __FUNCTION__, (unsigned int)element_attrs[i].attr_id,
13039adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                element_attrs[i].name.charset_id, element_attrs[i].name.str_len,
13049adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                element_attrs[i].name.p_str);
13059adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
13069adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        avrc_rsp.get_play_status.status = AVRC_STS_NO_ERROR;
13079adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
13089adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.get_elem_attrs.num_attr = num_attr;
13099adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.get_elem_attrs.p_attrs = element_attrs;
13109adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.get_elem_attrs.pdu = AVRC_PDU_GET_ELEMENT_ATTR;
13119adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.get_elem_attrs.opcode = opcode_from_pdu(AVRC_PDU_GET_ELEMENT_ATTR);
13129adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    /* Send the response */
13139adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    SEND_METAMSG_RSP(IDX_GET_ELEMENT_ATTR_RSP, &avrc_rsp);
13149adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    return BT_STATUS_SUCCESS;
13159adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
13169adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
13179adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/***************************************************************************
13189adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
13199adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Function         register_notification_rsp
13209adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
13219adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Description      Response to the register notification request.
13229adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**                      in text.
13239adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
13249adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Returns          bt_status_t
13259adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
13269adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan***************************************************************************/
13279adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic bt_status_t register_notification_rsp(btrc_event_id_t event_id,
13289adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    btrc_notification_type_t type, btrc_register_notification_t *p_param)
13299adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
13309adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tAVRC_RESPONSE avrc_rsp;
13319adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    CHECK_RC_CONNECTED
1332e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_EVENT("## %s ## event_id:%s", __FUNCTION__, dump_rc_notification_event_id(event_id));
133368c53ded6523113ddcc1932fa5bcb7d378b12209Nitin Srivastava    if (btif_rc_cb.rc_notif[event_id-1].bNotify == FALSE)
133468c53ded6523113ddcc1932fa5bcb7d378b12209Nitin Srivastava    {
1335e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        BTIF_TRACE_ERROR("Avrcp Event id not registered: event_id = %x", event_id);
133668c53ded6523113ddcc1932fa5bcb7d378b12209Nitin Srivastava        return BT_STATUS_NOT_READY;
133768c53ded6523113ddcc1932fa5bcb7d378b12209Nitin Srivastava    }
13389adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    memset(&(avrc_rsp.reg_notif), 0, sizeof(tAVRC_REG_NOTIF_RSP));
13399adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.reg_notif.event_id = event_id;
13409adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
13419adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    switch(event_id)
13429adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
13439adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case BTRC_EVT_PLAY_STATUS_CHANGED:
13449adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            avrc_rsp.reg_notif.param.play_status = p_param->play_status;
13459adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            break;
13469adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case BTRC_EVT_TRACK_CHANGE:
13479adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            memcpy(&(avrc_rsp.reg_notif.param.track), &(p_param->track), sizeof(btrc_uid_t));
13489adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            break;
1349b88fc6cb5636c4af17077502fe3313ffb32d93eeRavi Nagarajan        case BTRC_EVT_PLAY_POS_CHANGED:
1350b88fc6cb5636c4af17077502fe3313ffb32d93eeRavi Nagarajan            avrc_rsp.reg_notif.param.play_pos = p_param->song_pos;
1351b88fc6cb5636c4af17077502fe3313ffb32d93eeRavi Nagarajan            break;
13529adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        default:
1353e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            BTIF_TRACE_WARNING("%s : Unhandled event ID : 0x%x", __FUNCTION__, event_id);
13549adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            return BT_STATUS_UNHANDLED;
13559adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
13569adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
13579adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.reg_notif.pdu = AVRC_PDU_REGISTER_NOTIFICATION;
13589adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.reg_notif.opcode = opcode_from_pdu(AVRC_PDU_REGISTER_NOTIFICATION);
13599adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.get_play_status.status = AVRC_STS_NO_ERROR;
13609adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
13619adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    /* Send the response. */
13629adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    send_metamsg_rsp(btif_rc_cb.rc_handle, btif_rc_cb.rc_notif[event_id-1].label,
13639adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        ((type == BTRC_NOTIFICATION_TYPE_INTERIM)?AVRC_CMD_NOTIF:AVRC_RSP_CHANGED), &avrc_rsp);
13649adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    return BT_STATUS_SUCCESS;
13659adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
13669adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
13679adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/***************************************************************************
13689adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
1369247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Function         set_volume
1370247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1371247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Description      Send current volume setting to remote side.
1372247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**                  Support limited to SetAbsoluteVolume
1373247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**                  This can be enhanced to support Relative Volume (AVRCP 1.0).
1374247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**                  With RelateVolume, we will send VOLUME_UP/VOLUME_DOWN
1375247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**                  as opposed to absolute volume level
1376247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** volume: Should be in the range 0-127. bit7 is reseved and cannot be set
1377247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1378247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Returns          bt_status_t
1379247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1380247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji***************************************************************************/
1381247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic bt_status_t set_volume(uint8_t volume)
1382247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1383e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_DEBUG("%s", __FUNCTION__);
1384247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    CHECK_RC_CONNECTED
1385247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    tAVRC_STS status = BT_STATUS_UNSUPPORTED;
1386247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    rc_transaction_t *p_transaction=NULL;
1387247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1388247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if(btif_rc_cb.rc_volume==volume)
1389247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1390247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        status=BT_STATUS_DONE;
1391e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        BTIF_TRACE_ERROR("%s: volume value already set earlier: 0x%02x",__FUNCTION__, volume);
1392247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        return status;
1393247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1394247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1395247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if ((btif_rc_cb.rc_features & BTA_AV_FEAT_RCTG) &&
1396247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        (btif_rc_cb.rc_features & BTA_AV_FEAT_ADV_CTRL))
1397247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1398247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        tAVRC_COMMAND avrc_cmd = {0};
1399247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        BT_HDR *p_msg = NULL;
1400247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1401e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        BTIF_TRACE_DEBUG("%s: Peer supports absolute volume. newVolume=%d", __FUNCTION__, volume);
1402247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        avrc_cmd.volume.opcode = AVRC_OP_VENDOR;
1403247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        avrc_cmd.volume.pdu = AVRC_PDU_SET_ABSOLUTE_VOLUME;
1404247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        avrc_cmd.volume.status = AVRC_STS_NO_ERROR;
1405247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        avrc_cmd.volume.volume = volume;
1406247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1407247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        if (AVRC_BldCommand(&avrc_cmd, &p_msg) == AVRC_STS_NO_ERROR)
1408247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        {
1409247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            bt_status_t tran_status=get_transaction(&p_transaction);
1410247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            if(BT_STATUS_SUCCESS == tran_status && NULL!=p_transaction)
1411247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            {
1412e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                BTIF_TRACE_DEBUG("%s msgreq being sent out with label %d",
1413247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                                   __FUNCTION__,p_transaction->lbl);
1414247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                BTA_AvMetaCmd(btif_rc_cb.rc_handle,p_transaction->lbl, AVRC_CMD_CTRL, p_msg);
1415247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                status =  BT_STATUS_SUCCESS;
1416247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            }
1417247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            else
1418247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            {
1419247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                if(NULL!=p_msg)
1420247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                   GKI_freebuf(p_msg);
1421e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                BTIF_TRACE_ERROR("%s: failed to obtain transaction details. status: 0x%02x",
1422247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                                    __FUNCTION__, tran_status);
1423247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                status = BT_STATUS_FAIL;
1424247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            }
1425247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        }
1426247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        else
1427247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        {
1428e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            BTIF_TRACE_ERROR("%s: failed to build absolute volume command. status: 0x%02x",
1429247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                                __FUNCTION__, status);
1430247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            status = BT_STATUS_FAIL;
1431247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        }
1432247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1433247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    else
1434247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        status=BT_STATUS_NOT_READY;
1435247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    return status;
1436247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1437247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1438247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1439247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/***************************************************************************
1440247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1441247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Function         register_volumechange
1442247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1443247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Description     Register for volume change notification from remote side.
1444247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1445247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Returns          void
1446247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1447247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji***************************************************************************/
1448247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1449247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic void register_volumechange (UINT8 lbl)
1450247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1451247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    tAVRC_COMMAND avrc_cmd = {0};
1452247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    BT_HDR *p_msg = NULL;
1453247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    tAVRC_STS BldResp=AVRC_STS_BAD_CMD;
1454247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    UINT16 rv = 0;
1455247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    bt_status_t tran_status;
1456247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    rc_transaction_t *p_transaction=NULL;
1457247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1458e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_DEBUG("%s called with label:%d",__FUNCTION__,lbl);
1459247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1460247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    avrc_cmd.cmd.opcode=0x00;
1461247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    avrc_cmd.pdu = AVRC_PDU_REGISTER_NOTIFICATION;
1462247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    avrc_cmd.reg_notif.event_id = AVRC_EVT_VOLUME_CHANGE;
1463247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    avrc_cmd.reg_notif.status = AVRC_STS_NO_ERROR;
1464247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1465247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    BldResp=AVRC_BldCommand(&avrc_cmd, &p_msg);
1466247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if(AVRC_STS_NO_ERROR==BldResp && p_msg)
1467247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1468247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         p_transaction=get_transaction_by_lbl(lbl);
1469247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         if(NULL!=p_transaction)
1470247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         {
1471247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji             BTA_AvMetaCmd(btif_rc_cb.rc_handle,p_transaction->lbl, AVRC_CMD_NOTIF, p_msg);
1472e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati             BTIF_TRACE_DEBUG("%s:BTA_AvMetaCmd called",__FUNCTION__);
1473247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         }
1474247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         else
1475247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         {
1476247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            if(NULL!=p_msg)
1477247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji               GKI_freebuf(p_msg);
1478e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            BTIF_TRACE_ERROR("%s transaction not obtained with label: %d",__FUNCTION__,lbl);
1479247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         }
1480247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1481247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    else
1482e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        BTIF_TRACE_ERROR("%s failed to build command:%d",__FUNCTION__,BldResp);
1483247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1484247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1485247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1486247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/***************************************************************************
1487247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1488247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Function         handle_rc_metamsg_rsp
1489247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1490247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Description      Handle RC metamessage response
1491247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1492247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Returns          void
1493247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1494247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji***************************************************************************/
1495247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic void handle_rc_metamsg_rsp(tBTA_AV_META_MSG *pmeta_msg)
1496247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1497247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    tAVRC_RESPONSE    avrc_response = {0};
1498247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    UINT8             scratch_buf[512] = {0};
1499247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    tAVRC_STS status = BT_STATUS_UNSUPPORTED;
1500247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1501247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if(AVRC_OP_VENDOR==pmeta_msg->p_msg->hdr.opcode &&(AVRC_RSP_CHANGED==pmeta_msg->code
1502247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji      || AVRC_RSP_INTERIM==pmeta_msg->code || AVRC_RSP_ACCEPT==pmeta_msg->code
1503247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji      || AVRC_RSP_REJ==pmeta_msg->code || AVRC_RSP_NOT_IMPL==pmeta_msg->code))
1504247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1505247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        status=AVRC_ParsResponse(pmeta_msg->p_msg, &avrc_response, scratch_buf, sizeof(scratch_buf));
1506e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        BTIF_TRACE_DEBUG("%s: code %d,event ID %d,PDU %x,parsing status %d, label:%d",
1507247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji          __FUNCTION__,pmeta_msg->code,avrc_response.reg_notif.event_id,avrc_response.reg_notif.pdu,
1508247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji          status, pmeta_msg->label);
1509247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1510247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        if (status != AVRC_STS_NO_ERROR)
1511247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        {
1512247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            if(AVRC_PDU_REGISTER_NOTIFICATION==avrc_response.rsp.pdu
1513247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                && AVRC_EVT_VOLUME_CHANGE==avrc_response.reg_notif.event_id
1514247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                && btif_rc_cb.rc_vol_label==pmeta_msg->label)
1515247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            {
1516247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                btif_rc_cb.rc_vol_label=MAX_LABEL;
1517247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                release_transaction(btif_rc_cb.rc_vol_label);
1518247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            }
1519247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            else if(AVRC_PDU_SET_ABSOLUTE_VOLUME==avrc_response.rsp.pdu)
1520247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            {
1521247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                release_transaction(pmeta_msg->label);
1522247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            }
1523247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            return;
1524247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        }
1525247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        else if(AVRC_PDU_REGISTER_NOTIFICATION==avrc_response.rsp.pdu
1526247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            && AVRC_EVT_VOLUME_CHANGE==avrc_response.reg_notif.event_id
1527247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            && btif_rc_cb.rc_vol_label!=pmeta_msg->label)
1528247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            {
1529247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                // Just discard the message, if the device sends back with an incorrect label
1530e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                BTIF_TRACE_DEBUG("%s:Discarding register notfn in rsp.code: %d and label %d",
1531247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                __FUNCTION__, pmeta_msg->code, pmeta_msg->label);
1532247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                return;
1533247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            }
1534247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1535247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    else
1536247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1537e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        BTIF_TRACE_DEBUG("%s:Received vendor dependent in adv ctrl rsp. code: %d len: %d. Not processing it.",
1538247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        __FUNCTION__, pmeta_msg->code, pmeta_msg->len);
1539247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        return;
1540247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1541247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1542247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if(AVRC_PDU_REGISTER_NOTIFICATION==avrc_response.rsp.pdu
1543247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        && AVRC_EVT_VOLUME_CHANGE==avrc_response.reg_notif.event_id
1544247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        && AVRC_RSP_CHANGED==pmeta_msg->code)
1545247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     {
1546247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         /* re-register for volume change notification */
1547247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         // Do not re-register for rejected case, as it might get into endless loop
1548247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         register_volumechange(btif_rc_cb.rc_vol_label);
1549247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     }
1550247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     else if(AVRC_PDU_SET_ABSOLUTE_VOLUME==avrc_response.rsp.pdu)
1551247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     {
1552247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji          /* free up the label here */
1553247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji          release_transaction(pmeta_msg->label);
1554247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     }
1555247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1556e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati     BTIF_TRACE_EVENT("%s: Passing received metamsg response to app. pdu: %s",
1557247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji             __FUNCTION__, dump_rc_pdu(avrc_response.pdu));
1558247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     btif_rc_upstreams_rsp_evt((uint16_t)avrc_response.rsp.pdu, &avrc_response, pmeta_msg->code,
1559247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                                pmeta_msg->label);
1560247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1561247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1562247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1563247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/***************************************************************************
1564247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
15659adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Function         cleanup
15669adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
15679adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Description      Closes the AVRC interface
15689adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
15699adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Returns          void
15709adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
15719adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan***************************************************************************/
15729adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic void cleanup()
15739adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
1574e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_EVENT("## %s ##", __FUNCTION__);
15759adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    close_uinput();
15769adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (bt_rc_callbacks)
15779adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
15789adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        bt_rc_callbacks = NULL;
15799adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
15809adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    memset(&btif_rc_cb, 0, sizeof(btif_rc_cb_t));
1581247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    lbl_destroy();
15829adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
15839adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
15849adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
15854ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwoodstatic bt_status_t send_passthrough_cmd(bt_bdaddr_t *bd_addr, uint8_t key_code, uint8_t key_state)
15864ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood{
15874ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    tAVRC_STS status = BT_STATUS_UNSUPPORTED;
15884ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood#if (AVRC_CTLR_INCLUDED == TRUE)
15894ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    CHECK_RC_CONNECTED
15904ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    rc_transaction_t *p_transaction=NULL;
1591e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_DEBUG("%s: key-code: %d, key-state: %d", __FUNCTION__,
15924ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood                                                    key_code, key_state);
15934ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    if (btif_rc_cb.rc_features & BTA_AV_FEAT_RCTG)
15944ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    {
15954ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood        tAVRC_MSG_PASS avrc_cmd;
15964ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood        bt_status_t tran_status = get_transaction(&p_transaction);
15974ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood        if(BT_STATUS_SUCCESS == tran_status && NULL != p_transaction)
15984ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood        {
15994ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood            BTA_AvRemoteCmd(btif_rc_cb.rc_handle, p_transaction->lbl,
16004ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood                (tBTA_AV_RC)key_code, (tBTA_AV_STATE)key_state);
16014ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood            status =  BT_STATUS_SUCCESS;
1602e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            BTIF_TRACE_DEBUG("%s: succesfully sent passthrough command to BTA", __FUNCTION__);
16034ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood        }
16044ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood        else
16054ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood        {
16064ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood            status =  BT_STATUS_FAIL;
1607e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            BTIF_TRACE_DEBUG("%s: error in fetching transaction", __FUNCTION__);
16084ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood        }
16094ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    }
16104ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    else
16114ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    {
16124ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood        status =  BT_STATUS_FAIL;
1613e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        BTIF_TRACE_DEBUG("%s: feature not supported", __FUNCTION__);
16144ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    }
16154ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood#else
1616e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_DEBUG("%s: feature not enabled", __FUNCTION__);
16174ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood#endif
16184ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    return status;
16194ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood}
16204ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood
16219adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic const btrc_interface_t bt_rc_interface = {
16229adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    sizeof(bt_rc_interface),
16239adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    init,
16249adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    get_play_status_rsp,
16259adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    NULL, /* list_player_app_attr_rsp */
16269adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    NULL, /* list_player_app_value_rsp */
16279adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    NULL, /* get_player_app_value_rsp */
16289adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    NULL, /* get_player_app_attr_text_rsp */
16299adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    NULL, /* get_player_app_value_text_rsp */
16309adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    get_element_attr_rsp,
16319adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    NULL, /* set_player_app_value_rsp */
16329adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    register_notification_rsp,
1633247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    set_volume,
16349adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    cleanup,
16359adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan};
16369adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
16374ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwoodstatic const btrc_ctrl_interface_t bt_rc_ctrl_interface = {
16384ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    sizeof(bt_rc_ctrl_interface),
16394ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    init_ctrl,
16404ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    send_passthrough_cmd,
16414ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    cleanup,
16424ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood};
16434ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood
16449adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/*******************************************************************************
16459adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
16469adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Function         btif_rc_get_interface
16479adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
16484ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood** Description      Get the AVRCP Target callback interface
16499adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
16509adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Returns          btav_interface_t
16519adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
16529adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan*******************************************************************************/
16539adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanconst btrc_interface_t *btif_rc_get_interface(void)
16549adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
1655e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_EVENT("%s", __FUNCTION__);
16569adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    return &bt_rc_interface;
1657247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1658247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1659247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/*******************************************************************************
16604ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood**
16614ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood** Function         btif_rc_ctrl_get_interface
16624ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood**
16634ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood** Description      Get the AVRCP Controller callback interface
16644ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood**
16654ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood** Returns          btav_interface_t
16664ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood**
16674ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood*******************************************************************************/
16684ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwoodconst btrc_ctrl_interface_t *btif_rc_ctrl_get_interface(void)
16694ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood{
1670e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_EVENT("%s", __FUNCTION__);
16714ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood    return &bt_rc_ctrl_interface;
16724ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood}
16734ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood
16744ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood/*******************************************************************************
1675247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**      Function         initialize_transaction
1676247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1677247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**      Description    Initializes fields of the transaction structure
1678247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1679247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**      Returns          void
1680247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji*******************************************************************************/
1681247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic void initialize_transaction(int lbl)
1682247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1683247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutex_lock(&device.lbllock);
1684247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if(lbl < MAX_TRANSACTIONS_PER_SESSION)
1685247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1686247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji       device.transaction[lbl].lbl = lbl;
1687247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji       device.transaction[lbl].in_use=FALSE;
1688247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji       device.transaction[lbl].handle=0;
1689247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1690247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutex_unlock(&device.lbllock);
1691247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1692247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1693247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/*******************************************************************************
1694247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**      Function         lbl_init
1695247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1696247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**      Description    Initializes label structures and mutexes.
1697247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1698247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**      Returns         void
1699247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji*******************************************************************************/
1700247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojivoid lbl_init()
1701247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1702247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    memset(&device,0,sizeof(rc_device_t));
1703247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutexattr_t attr;
1704247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutexattr_init(&attr);
1705247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutex_init(&(device.lbllock), &attr);
1706247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutexattr_destroy(&attr);
1707247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    init_all_transactions();
1708247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1709247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1710247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/*******************************************************************************
1711247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1712247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Function         init_all_transactions
1713247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1714247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Description    Initializes all transactions
1715247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1716247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Returns          void
1717247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji*******************************************************************************/
1718247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojivoid init_all_transactions()
1719247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1720247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    UINT8 txn_indx=0;
1721247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    for(txn_indx=0; txn_indx < MAX_TRANSACTIONS_PER_SESSION; txn_indx++)
1722247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1723247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        initialize_transaction(txn_indx);
1724247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1725247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1726247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1727247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/*******************************************************************************
1728247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1729247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Function         get_transaction_by_lbl
1730247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1731247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Description    Will return a transaction based on the label. If not inuse
1732247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**                     will return an error.
1733247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1734247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Returns          bt_status_t
1735247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji*******************************************************************************/
1736247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojirc_transaction_t *get_transaction_by_lbl(UINT8 lbl)
1737247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1738247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    rc_transaction_t *transaction = NULL;
1739247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutex_lock(&device.lbllock);
1740247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1741247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    /* Determine if this is a valid label */
1742247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if (lbl < MAX_TRANSACTIONS_PER_SESSION)
1743247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1744247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        if (FALSE==device.transaction[lbl].in_use)
1745247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        {
1746247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            transaction = NULL;
1747247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        }
1748247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        else
1749247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        {
1750247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            transaction = &(device.transaction[lbl]);
1751e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            BTIF_TRACE_DEBUG("%s: Got transaction.label: %d",__FUNCTION__,lbl);
1752247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        }
1753247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1754247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1755247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutex_unlock(&device.lbllock);
1756247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    return transaction;
1757247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1758247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1759247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/*******************************************************************************
1760247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1761247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Function         get_transaction
1762247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1763247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Description    Obtains the transaction details.
1764247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1765247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Returns          bt_status_t
1766247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji*******************************************************************************/
1767247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1768247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojibt_status_t  get_transaction(rc_transaction_t **ptransaction)
1769247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1770247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    bt_status_t result = BT_STATUS_NOMEM;
1771247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    UINT8 i=0;
1772247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutex_lock(&device.lbllock);
1773247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1774247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    // Check for unused transactions
1775247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    for (i=0; i<MAX_TRANSACTIONS_PER_SESSION; i++)
1776247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1777247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        if (FALSE==device.transaction[i].in_use)
1778247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        {
1779e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            BTIF_TRACE_DEBUG("%s:Got transaction.label: %d",__FUNCTION__,device.transaction[i].lbl);
1780247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            device.transaction[i].in_use = TRUE;
1781247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            *ptransaction = &(device.transaction[i]);
1782247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            result = BT_STATUS_SUCCESS;
1783247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            break;
1784247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        }
1785247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1786247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1787247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutex_unlock(&device.lbllock);
1788247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    return result;
1789247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1790247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1791247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1792247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/*******************************************************************************
1793247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1794247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Function         release_transaction
1795247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1796247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Description    Will release a transaction for reuse
1797247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1798247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Returns          bt_status_t
1799247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji*******************************************************************************/
1800247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojivoid release_transaction(UINT8 lbl)
1801247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1802247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    rc_transaction_t *transaction = get_transaction_by_lbl(lbl);
1803247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1804247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    /* If the transaction is in use... */
1805247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if (transaction != NULL)
1806247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1807e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        BTIF_TRACE_DEBUG("%s: lbl: %d", __FUNCTION__, lbl);
1808247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        initialize_transaction(lbl);
1809247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1810247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1811247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1812247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/*******************************************************************************
1813247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1814247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Function         lbl_destroy
1815247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1816247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Description    Cleanup of the mutex
1817247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1818247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Returns          void
1819247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji*******************************************************************************/
1820247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojivoid lbl_destroy()
1821247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1822247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutex_destroy(&(device.lbllock));
1823247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1824a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie
1825a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie/*******************************************************************************
1826a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie**      Function       dev_blacklisted_for_absolute_volume
1827a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie**
1828a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie**      Description    Blacklist Devices that donot handle absolute volume well
18297850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xie**                     We are blacklisting all the devices that are not in whitelist
1830a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie**
1831a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie**      Returns        True if the device is in the list
1832a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie*******************************************************************************/
1833a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xiestatic BOOLEAN dev_blacklisted_for_absolute_volume(BD_ADDR peer_dev)
1834a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie{
1835a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie    int i;
1836c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin    char *dev_name_str = NULL;
18377850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xie    int whitelist_size = sizeof(rc_white_addr_prefix)/sizeof(rc_white_addr_prefix[0]);
1838c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin
18397850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xie    for (i = 0; i < whitelist_size; i++) {
18407850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xie        if (rc_white_addr_prefix[i][0] == peer_dev[0] &&
18417850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xie            rc_white_addr_prefix[i][1] == peer_dev[1] &&
18427850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xie            rc_white_addr_prefix[i][2] == peer_dev[2]) {
1843e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            BTIF_TRACE_DEBUG("whitelist absolute volume for %02x:%02x:%02x",
1844c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin                              peer_dev[0], peer_dev[1], peer_dev[2]);
18457850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xie            return FALSE;
1846a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie        }
1847a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie    }
1848c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin
1849c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin    dev_name_str = BTM_SecReadDevName(peer_dev);
1850c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin    whitelist_size = sizeof(rc_white_name)/sizeof(char*);
1851c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin    if (dev_name_str != NULL) {
1852c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin        for (i = 0; i < whitelist_size; i++) {
1853c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin            if (strcmp(dev_name_str, rc_white_name[i]) == 0) {
1854e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                BTIF_TRACE_DEBUG("whitelist absolute volume for %s", dev_name_str);
1855c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin                return FALSE;
1856c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin            }
1857c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin        }
1858c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin    }
1859c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin
1860e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_WARNING("blacklist absolute volume for %02x:%02x:%02x, name = %s",
1861c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin                        peer_dev[0], peer_dev[1], peer_dev[2], dev_name_str);
18627850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xie    return TRUE;
1863a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie}
1864