btif_rc.c revision c9fbcde6d2077ee03dc497824cd98e4d782f7cea
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 2009-2012 Broadcom Corporation
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  you may not use this file except in compliance with the License.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  You may obtain a copy of the License at:
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  See the License for the specific language governing permissions and
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  limitations under the License.
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Filename:      btif_rc.c
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Description:   Bluetooth AVRC implementation
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *****************************************************************************/
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <hardware/bluetooth.h>
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <fcntl.h>
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_api.h"
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_av_api.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "avrc_defs.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bd.h"
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define LOG_TAG "BTIF_RC"
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btif_common.h"
379adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#include "btif_util.h"
389adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#include "btif_av.h"
399adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#include "hardware/bt_rc.h"
409adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#include "uinput.h"
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Constants & Macros
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* cod value for Headsets */
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define COD_AV_HEADSETS        0x0404
489adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/* for AVRC 1.4 need to change this */
499adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#define MAX_RC_NOTIFICATIONS AVRC_EVT_APP_SETTING_CHANGE
509adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
519adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#define IDX_GET_PLAY_STATUS_RSP   0
529adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#define IDX_LIST_APP_ATTR_RSP     1
539adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#define IDX_LIST_APP_VALUE_RSP    2
549adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#define IDX_GET_CURR_APP_VAL_RSP  3
559adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#define IDX_SET_APP_VAL_RSP       4
569adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#define IDX_GET_APP_ATTR_TXT_RSP  5
579adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#define IDX_GET_APP_VAL_TXT_RSP   6
589adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#define IDX_GET_ELEMENT_ATTR_RSP  7
59247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji#define MAX_VOLUME 128
60247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji#define MAX_LABEL 16
61247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji#define MAX_TRANSACTIONS_PER_SESSION 16
629adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#define MAX_CMD_QUEUE_LEN 8
639adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
649adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#define CHECK_RC_CONNECTED                                                                  \
659adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    BTIF_TRACE_DEBUG1("## %s ##", __FUNCTION__);                                            \
669adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if(btif_rc_cb.rc_connected == FALSE)                                                    \
679adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {                                                                                       \
689adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        BTIF_TRACE_WARNING1("Function %s() called when RC is not connected", __FUNCTION__); \
699adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        return BT_STATUS_NOT_READY;                                                         \
709adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
719adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
729adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#define FILL_PDU_QUEUE(index, ctype, label, pending)        \
739adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{                                                           \
749adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    btif_rc_cb.rc_pdu_info[index].ctype = ctype;            \
759adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    btif_rc_cb.rc_pdu_info[index].label = label;            \
769adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    btif_rc_cb.rc_pdu_info[index].is_rsp_pending = pending; \
779adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
789adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
799adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#define SEND_METAMSG_RSP(index, avrc_rsp)                                                      \
809adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{                                                                                              \
819adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if(btif_rc_cb.rc_pdu_info[index].is_rsp_pending == FALSE)                                  \
829adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {                                                                                          \
839adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        BTIF_TRACE_WARNING1("%s Not sending response as no PDU was registered", __FUNCTION__); \
849adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        return BT_STATUS_UNHANDLED;                                                            \
859adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }                                                                                          \
869adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    send_metamsg_rsp(btif_rc_cb.rc_handle, btif_rc_cb.rc_pdu_info[index].label,                \
879adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        btif_rc_cb.rc_pdu_info[index].ctype, avrc_rsp);                                        \
889adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    btif_rc_cb.rc_pdu_info[index].ctype = 0;                                                   \
899adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    btif_rc_cb.rc_pdu_info[index].label = 0;                                                   \
909adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    btif_rc_cb.rc_pdu_info[index].is_rsp_pending = FALSE;                                      \
919adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Local type definitions
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct {
979adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    UINT8 bNotify;
989adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    UINT8 label;
999adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan} btif_rc_reg_notifications_t;
1009adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
1019adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajantypedef struct
1029adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
1039adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    UINT8   label;
1049adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    UINT8   ctype;
1059adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    BOOLEAN is_rsp_pending;
1069adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan} btif_rc_cmd_ctxt_t;
1079adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
1089adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/* TODO : Merge btif_rc_reg_notifications_t and btif_rc_cmd_ctxt_t to a single struct */
1099adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajantypedef struct {
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN                     rc_connected;
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                       rc_handle;
1129adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tBTA_AV_FEAT                rc_features;
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BD_ADDR                     rc_addr;
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16                      rc_pending_play;
1159adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    btif_rc_cmd_ctxt_t          rc_pdu_info[MAX_CMD_QUEUE_LEN];
1169adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    btif_rc_reg_notifications_t rc_notif[MAX_RC_NOTIFICATIONS];
117247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    unsigned int                rc_volume;
118247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    uint8_t                     rc_vol_label;
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} btif_rc_cb_t;
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
121247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojitypedef struct {
122247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    BOOLEAN in_use;
123247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    UINT8 lbl;
124247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    UINT8 handle;
125247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji} rc_transaction_t;
126247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
127247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojitypedef struct
128247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
129247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutex_t lbllock;
130247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    rc_transaction_t transaction[MAX_TRANSACTIONS_PER_SESSION];
131247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji} rc_device_t;
132247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
133247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
134247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojirc_device_t device;
135247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define MAX_UINPUT_PATHS 3
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const char* uinput_dev_path[] =
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       {"/dev/uinput", "/dev/input/uinput", "/dev/misc/uinput" };
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int uinput_fd = -1;
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int  send_event (int fd, uint16_t type, uint16_t code, int32_t value);
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void send_key (int fd, uint16_t key, int pressed);
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int  uinput_driver_check();
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int  uinput_create(char *name);
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int  init_uinput (void);
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void close_uinput (void);
147a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xiestatic BOOLEAN dev_blacklisted_for_absolute_volume(BD_ADDR peer_dev);
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1499adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic const struct {
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    const char *name;
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    uint8_t avrcp;
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    uint16_t mapped_id;
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    uint8_t release_quirk;
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} key_map[] = {
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    { "PLAY",         AVRC_ID_PLAY,     KEY_PLAYCD,       1 },
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    { "STOP",         AVRC_ID_STOP,     KEY_STOPCD,       0 },
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    { "PAUSE",        AVRC_ID_PAUSE,    KEY_PAUSECD,      1 },
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    { "FORWARD",      AVRC_ID_FORWARD,  KEY_NEXTSONG,     0 },
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    { "BACKWARD",     AVRC_ID_BACKWARD, KEY_PREVIOUSSONG, 0 },
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    { "REWIND",       AVRC_ID_REWIND,   KEY_REWIND,       0 },
16198497a520010fc996a8ce490665cac6c1439dd2dJohn Du    { "FAST FORWARD", AVRC_ID_FAST_FOR, KEY_FAST_FORWARD, 0 },
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    { NULL,           0,                0,                0 }
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
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;
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Static functions
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Externs
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern BOOLEAN btif_hf_call_terminated_recently();
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern BOOLEAN check_cod(const bt_bdaddr_t *remote_bdaddr, uint32_t cod);
2229adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**  Functions
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**   Local uinput helper functions
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint send_event (int fd, uint16_t type, uint16_t code, int32_t value)
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    struct uinput_event event;
2349adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    BTIF_TRACE_DEBUG4("%s type:%u code:%u value:%d", __FUNCTION__,
2359adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        type, code, value);
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&event, 0, sizeof(event));
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    event.type  = type;
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    event.code  = code;
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    event.value = value;
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return write(fd, &event, sizeof(event));
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid send_key (int fd, uint16_t key, int pressed)
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2469adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    BTIF_TRACE_DEBUG4("%s fd:%d key:%u pressed:%d", __FUNCTION__,
2479adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        fd, key, pressed);
2489adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
2499adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (fd < 0)
2509adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_TRACE_DEBUG3("AVRCP: Send key %d (%d) fd=%d", key, pressed, fd);
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    send_event(fd, EV_KEY, key, pressed);
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    send_event(fd, EV_SYN, SYN_REPORT, 0);
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************** uinput related functions **************/
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint uinput_driver_check()
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    uint32_t i;
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i=0; i < MAX_UINPUT_PATHS; i++)
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (access(uinput_dev_path[i], O_RDWR) == 0) {
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           return 0;
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_TRACE_ERROR1("%s ERROR: uinput device is not in the system", __FUNCTION__);
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return -1;
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint uinput_create(char *name)
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    struct uinput_dev dev;
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int fd, err, x = 0;
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for(x=0; x < MAX_UINPUT_PATHS; x++)
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        fd = open(uinput_dev_path[x], O_RDWR);
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (fd < 0)
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            continue;
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (x == MAX_UINPUT_PATHS) {
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTIF_TRACE_ERROR1("%s ERROR: uinput device open failed", __FUNCTION__);
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return -1;
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&dev, 0, sizeof(dev));
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (name)
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        strncpy(dev.name, name, UINPUT_MAX_NAME_SIZE);
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    dev.id.bustype = BUS_BLUETOOTH;
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    dev.id.vendor  = 0x0000;
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    dev.id.product = 0x0000;
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    dev.id.version = 0x0000;
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (write(fd, &dev, sizeof(dev)) < 0) {
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTIF_TRACE_ERROR1("%s Unable to write device information", __FUNCTION__);
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        close(fd);
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return -1;
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ioctl(fd, UI_SET_EVBIT, EV_KEY);
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ioctl(fd, UI_SET_EVBIT, EV_REL);
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ioctl(fd, UI_SET_EVBIT, EV_SYN);
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (x = 0; key_map[x].name != NULL; x++)
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ioctl(fd, UI_SET_KEYBIT, key_map[x].mapped_id);
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for(x = 0; x < KEY_MAX; x++)
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ioctl(fd, UI_SET_KEYBIT, x);
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (ioctl(fd, UI_DEV_CREATE, NULL) < 0) {
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTIF_TRACE_ERROR1("%s Unable to create uinput device", __FUNCTION__);
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        close(fd);
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return -1;
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return fd;
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint init_uinput (void)
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char *name = "AVRCP";
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    uinput_fd = uinput_create(name);
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (uinput_fd < 0) {
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTIF_TRACE_ERROR3("%s AVRCP: Failed to initialize uinput for %s (%d)",
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          __FUNCTION__, name, uinput_fd);
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    } else {
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTIF_TRACE_DEBUG3("%s AVRCP: Initialized uinput for %s (fd=%d)",
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                          __FUNCTION__, name, uinput_fd);
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return uinput_fd;
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid close_uinput (void)
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (uinput_fd > 0) {
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        ioctl(uinput_fd, UI_DEV_DESTROY);
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        close(uinput_fd);
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        uinput_fd = -1;
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
349247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojivoid handle_rc_features()
350247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
351247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    btrc_remote_features_t rc_features = BTRC_FEAT_NONE;
352247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    bt_bdaddr_t rc_addr;
353247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    bdcpy(rc_addr.address, btif_rc_cb.rc_addr);
3549adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
355a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie    if (dev_blacklisted_for_absolute_volume(btif_rc_cb.rc_addr))
356a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie    {
357a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie        btif_rc_cb.rc_features &= ~BTA_AV_FEAT_ADV_CTRL;
358a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie    }
359a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie
360247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if (btif_rc_cb.rc_features & BTA_AV_FEAT_BROWSE)
361247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
362247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        rc_features |= BTRC_FEAT_BROWSE;
363247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
364247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if ( (btif_rc_cb.rc_features & BTA_AV_FEAT_ADV_CTRL) &&
365247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         (btif_rc_cb.rc_features & BTA_AV_FEAT_RCTG))
366247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
367247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        rc_features |= BTRC_FEAT_ABSOLUTE_VOLUME;
368247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
369247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if (btif_rc_cb.rc_features & BTA_AV_FEAT_METADATA)
370247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
371247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        rc_features |= BTRC_FEAT_METADATA;
372247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
373247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    BTIF_TRACE_DEBUG2("%s: rc_features=0x%x", __FUNCTION__, rc_features);
374247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    HAL_CBACK(bt_rc_callbacks, remote_features_cb, &rc_addr, rc_features)
375247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
376247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji#if (AVRC_ADV_CTRL_INCLUDED == TRUE)
377247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     BTIF_TRACE_DEBUG1("Checking for feature flags in btif_rc_handler with label %d",
378247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                        btif_rc_cb.rc_vol_label);
379247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     // Register for volume change on connect
380247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji      if(btif_rc_cb.rc_features & BTA_AV_FEAT_ADV_CTRL &&
381247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         btif_rc_cb.rc_features & BTA_AV_FEAT_RCTG)
382247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji      {
383247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         rc_transaction_t *p_transaction=NULL;
384247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         bt_status_t status = BT_STATUS_NOT_READY;
385247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         if(MAX_LABEL==btif_rc_cb.rc_vol_label)
386247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         {
387247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            status=get_transaction(&p_transaction);
388247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         }
389247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         else
390247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         {
391247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            p_transaction=get_transaction_by_lbl(btif_rc_cb.rc_vol_label);
392247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            if(NULL!=p_transaction)
393247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            {
394247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji               BTIF_TRACE_DEBUG1("register_volumechange already in progress for label %d",
395247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                                  btif_rc_cb.rc_vol_label);
396247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji               return;
397247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            }
398247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            else
399247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji              status=get_transaction(&p_transaction);
400247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         }
401247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
402247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         if(BT_STATUS_SUCCESS == status && NULL!=p_transaction)
403247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         {
404247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            btif_rc_cb.rc_vol_label=p_transaction->lbl;
405247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            register_volumechange(btif_rc_cb.rc_vol_label);
406247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         }
407247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji       }
408247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji#endif
409247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
4109adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Function       handle_rc_connect
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
41598497a520010fc996a8ce490665cac6c1439dd2dJohn Du *  - Argument:    tBTA_AV_RC_OPEN  RC open data structure
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  - Description: RC connection event handler
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ***************************************************************************/
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid handle_rc_connect (tBTA_AV_RC_OPEN *p_rc_open)
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_TRACE_DEBUG2("%s: rc_handle: %d", __FUNCTION__, p_rc_open->rc_handle);
4239adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    bt_status_t result = BT_STATUS_SUCCESS;
4249adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    int i;
4259adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    char bd_str[18];
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4279adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if(p_rc_open->status == BTA_AV_SUCCESS)
4289adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
4299adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        memcpy(btif_rc_cb.rc_addr, p_rc_open->peer_addr, sizeof(BD_ADDR));
4309adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        btif_rc_cb.rc_features = p_rc_open->peer_features;
431247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        btif_rc_cb.rc_vol_label=MAX_LABEL;
432247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        btif_rc_cb.rc_volume=MAX_VOLUME;
4339adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
4349adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        btif_rc_cb.rc_connected = TRUE;
4359adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        btif_rc_cb.rc_handle = p_rc_open->rc_handle;
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
437247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        /* on locally initiated connection we will get remote features as part of connect */
438247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        if (btif_rc_cb.rc_features != 0)
439247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            handle_rc_features();
440247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
4419adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        result = uinput_driver_check();
4429adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        if(result == BT_STATUS_SUCCESS)
4439adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
4449adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            init_uinput();
4459adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
4469adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
4479adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    else
4489adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
4499adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        BTIF_TRACE_ERROR2("%s Connect failed with error code: %d",
4509adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            __FUNCTION__, p_rc_open->status);
4519adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        btif_rc_cb.rc_connected = FALSE;
4529adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Function       handle_rc_disconnect
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
45898497a520010fc996a8ce490665cac6c1439dd2dJohn Du *  - Argument:    tBTA_AV_RC_CLOSE     RC close data structure
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  - Description: RC disconnection event handler
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ***************************************************************************/
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid handle_rc_disconnect (tBTA_AV_RC_CLOSE *p_rc_close)
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_TRACE_DEBUG2("%s: rc_handle: %d", __FUNCTION__, p_rc_close->rc_handle);
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_rc_cb.rc_handle = 0;
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_rc_cb.rc_connected = FALSE;
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(btif_rc_cb.rc_addr, 0, sizeof(BD_ADDR));
4709adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    btif_rc_cb.rc_features = 0;
471247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    btif_rc_cb.rc_vol_label=MAX_LABEL;
472247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    btif_rc_cb.rc_volume=MAX_VOLUME;
473247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    init_all_transactions();
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    close_uinput();
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Function       handle_rc_passthrough_cmd
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  - Argument:    tBTA_AV_RC rc_id   remote control command ID
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *                 tBTA_AV_STATE key_state status of key press
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  - Description: Remote control command handler
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ***************************************************************************/
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid handle_rc_passthrough_cmd ( tBTA_AV_REMOTE_CMD *p_remote_cmd)
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    const char *status;
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int pressed, i;
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
49198497a520010fc996a8ce490665cac6c1439dd2dJohn Du    BTIF_TRACE_DEBUG2("%s: p_remote_cmd->rc_id=%d", __FUNCTION__, p_remote_cmd->rc_id);
49298497a520010fc996a8ce490665cac6c1439dd2dJohn Du
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If AVRC is open and peer sends PLAY but there is no AVDT, then we queue-up this PLAY */
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_remote_cmd)
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* queue AVRC PLAY if GAVDTP Open notification to app is pending (2 second timer) */
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_remote_cmd->rc_id == BTA_AV_RC_PLAY) && (!btif_av_is_connected()))
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_remote_cmd->key_state == AVRC_STATE_PRESS)
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                APPL_TRACE_WARNING1("%s: AVDT not open, queuing the PLAY command", __FUNCTION__);
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btif_rc_cb.rc_pending_play = TRUE;
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_remote_cmd->rc_id == BTA_AV_RC_PAUSE) && (btif_rc_cb.rc_pending_play))
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_WARNING1("%s: Clear the pending PLAY on PAUSE received", __FUNCTION__);
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_rc_cb.rc_pending_play = FALSE;
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_remote_cmd->key_state == AVRC_STATE_RELEASE) {
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = "released";
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        pressed = 0;
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    } else {
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = "pressed";
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        pressed = 1;
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If this is Play/Pause command (press or release)  before processing, check the following
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     * a voice call has ended recently
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     * the remote device is not of type headset
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     * If the above conditions meet, drop the Play/Pause command
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     * This fix is to interop with certain carkits which sends an automatic  PLAY  or PAUSE
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     * commands right after call ends
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     */
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if((p_remote_cmd->rc_id == BTA_AV_RC_PLAY || p_remote_cmd->rc_id == BTA_AV_RC_PAUSE)&&
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       (btif_hf_call_terminated_recently() == TRUE) &&
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       (check_cod( (const bt_bdaddr_t*)&(btif_rc_cb.rc_addr), COD_AV_HEADSETS) != TRUE))
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTIF_TRACE_DEBUG2("%s:Dropping the play/Pause command received right after call end cmd:%d",
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           __FUNCTION__,p_remote_cmd->rc_id);
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53898497a520010fc996a8ce490665cac6c1439dd2dJohn Du    if (p_remote_cmd->rc_id == BTA_AV_RC_FAST_FOR || p_remote_cmd->rc_id == BTA_AV_RC_REWIND) {
53998497a520010fc996a8ce490665cac6c1439dd2dJohn Du        HAL_CBACK(bt_rc_callbacks, passthrough_cmd_cb, p_remote_cmd->rc_id, pressed);
54098497a520010fc996a8ce490665cac6c1439dd2dJohn Du        return;
54198497a520010fc996a8ce490665cac6c1439dd2dJohn Du    }
54298497a520010fc996a8ce490665cac6c1439dd2dJohn Du
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (i = 0; key_map[i].name != NULL; i++) {
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_remote_cmd->rc_id == key_map[i].avrcp) {
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTIF_TRACE_DEBUG3("%s: %s %s", __FUNCTION__, key_map[i].name, status);
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           /* MusicPlayer uses a long_press_timeout of 1 second for PLAYPAUSE button
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            * and maps that to autoshuffle. So if for some reason release for PLAY/PAUSE
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            * comes 1 second after the press, the MediaPlayer UI goes into a bad state.
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            * The reason for the delay could be sniff mode exit or some AVDTP procedure etc.
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            * The fix is to generate a release right after the press and drown the 'actual'
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            * release.
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            */
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((key_map[i].release_quirk == 1) && (pressed == 0))
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTIF_TRACE_DEBUG2("%s: AVRC %s Release Faked earlier, drowned now",
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  __FUNCTION__, key_map[i].name);
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            send_key(uinput_fd, key_map[i].mapped_id, pressed);
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((key_map[i].release_quirk == 1) && (pressed == 1))
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                GKI_delay(30); // 30ms
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTIF_TRACE_DEBUG2("%s: AVRC %s Release quirk enabled, send release now",
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                  __FUNCTION__, key_map[i].name);
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                send_key(uinput_fd, key_map[i].mapped_id, 0);
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (key_map[i].name == NULL)
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTIF_TRACE_ERROR3("%s AVRCP: unknown button 0x%02X %s", __FUNCTION__,
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_remote_cmd->rc_id, status);
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5779adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanvoid handle_uid_changed_notification(tBTA_AV_META_MSG *pmeta_msg, tAVRC_COMMAND *pavrc_command)
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5799adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tAVRC_RESPONSE avrc_rsp = {0};
5809adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.rsp.pdu = pavrc_command->pdu;
5819adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.rsp.status = AVRC_STS_NO_ERROR;
5829adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.rsp.opcode = pavrc_command->cmd.opcode;
5839adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
5849adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.reg_notif.event_id = pavrc_command->reg_notif.event_id;
5859adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.reg_notif.param.uid_counter = 0;
5869adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
5879adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    send_metamsg_rsp(pmeta_msg->rc_handle, pmeta_msg->label, AVRC_RSP_INTERIM, &avrc_rsp);
5889adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    send_metamsg_rsp(pmeta_msg->rc_handle, pmeta_msg->label, AVRC_RSP_CHANGED, &avrc_rsp);
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5909adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
5919adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
5929adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
5939adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/***************************************************************************
5949adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *  Function       handle_rc_metamsg_cmd
5959adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *
5969adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *  - Argument:    tBTA_AV_VENDOR Structure containing the received
5979adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *                          metamsg command
5989adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *
5999adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *  - Description: Remote control metamsg command handler (AVRCP 1.3)
6009adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *
6019adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan ***************************************************************************/
6029adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanvoid handle_rc_metamsg_cmd (tBTA_AV_META_MSG *pmeta_msg)
6039adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
6049adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    /* Parse the metamsg command and pass it on to BTL-IFS */
6059adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    UINT8             scratch_buf[512] = {0};
6069adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tAVRC_COMMAND    avrc_command = {0};
6079adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tAVRC_STS status;
6089adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    int param_len;
6099adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
6109adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    BTIF_TRACE_EVENT1("+ %s", __FUNCTION__);
6119adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
6129adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (pmeta_msg->p_msg->hdr.opcode != AVRC_OP_VENDOR)
6139adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
6149adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        BTIF_TRACE_WARNING1("Invalid opcode: %x", pmeta_msg->p_msg->hdr.opcode);
6159adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        return;
6169adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
6179adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (pmeta_msg->len < 3)
6189adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
6199adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        BTIF_TRACE_WARNING2("Invalid length.Opcode: 0x%x, len: 0x%x", pmeta_msg->p_msg->hdr.opcode,
6209adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            pmeta_msg->len);
6219adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        return;
6229adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
6239adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
6249adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (pmeta_msg->code >= AVRC_RSP_NOT_IMPL)
6259adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
626247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji#if (AVRC_ADV_CTRL_INCLUDED == TRUE)
627247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
628247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     rc_transaction_t *transaction=NULL;
629247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     transaction=get_transaction_by_lbl(pmeta_msg->label);
630247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     if(NULL!=transaction)
631247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     {
632247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        handle_rc_metamsg_rsp(pmeta_msg);
633247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     }
634247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     else
635247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     {
636247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         BTIF_TRACE_DEBUG3("%s:Discard vendor dependent rsp. code: %d label:%d.",
637247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji             __FUNCTION__, pmeta_msg->code, pmeta_msg->label);
638247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     }
639247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     return;
640247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
641247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji#else
642247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
6439adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        BTIF_TRACE_DEBUG3("%s:Received vendor dependent rsp. code: %d len: %d. Not processing it.",
6449adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            __FUNCTION__, pmeta_msg->code, pmeta_msg->len);
6459adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        return;
646247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
647247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji#endif
648247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji      }
649247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
650247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    status=AVRC_ParsCommand(pmeta_msg->p_msg, &avrc_command, scratch_buf, sizeof(scratch_buf));
651247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    BTIF_TRACE_DEBUG3("Received vendor command.code,PDU and label: %d, %d,%d",pmeta_msg->code,
652247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                       avrc_command.cmd.pdu, pmeta_msg->label);
6539adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
6549adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (status != AVRC_STS_NO_ERROR)
6559adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
6569adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        /* return error */
657247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        BTIF_TRACE_WARNING2("%s: Error in parsing received metamsg command. status: 0x%02x",
6589adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            __FUNCTION__, status);
6599adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        send_reject_response(pmeta_msg->rc_handle, pmeta_msg->label, avrc_command.pdu, status);
6609adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
6619adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    else
6629adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
6639adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        /* if RegisterNotification, add it to our registered queue */
6649adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
6659adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        if (avrc_command.cmd.pdu == AVRC_PDU_REGISTER_NOTIFICATION)
6669adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
6679adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            UINT8 event_id = avrc_command.reg_notif.event_id;
6689adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            param_len = sizeof(tAVRC_REG_NOTIF_CMD);
669247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            BTIF_TRACE_EVENT4("%s:New register notification received.event_id:%s,label:0x%x,code:%x",
670247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            __FUNCTION__,dump_rc_notification_event_id(event_id), pmeta_msg->label,pmeta_msg->code);
6719adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            btif_rc_cb.rc_notif[event_id-1].bNotify = TRUE;
6729adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            btif_rc_cb.rc_notif[event_id-1].label = pmeta_msg->label;
6739adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
6749adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            if(event_id == AVRC_EVT_UIDS_CHANGE)
6759adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
6769adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                handle_uid_changed_notification(pmeta_msg, &avrc_command);
6779adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                return;
6789adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
6799adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
6809adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
6819adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
6829adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        BTIF_TRACE_EVENT2("%s: Passing received metamsg command to app. pdu: %s",
6839adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            __FUNCTION__, dump_rc_pdu(avrc_command.cmd.pdu));
6849adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
6859adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        /* Since handle_rc_metamsg_cmd() itself is called from
6869adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            *btif context, no context switching is required. Invoke
6879adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            * btif_rc_upstreams_evt directly from here. */
6889adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        btif_rc_upstreams_evt((uint16_t)avrc_command.cmd.pdu, &avrc_command, pmeta_msg->code,
689247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                               pmeta_msg->label);
6909adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function       btif_rc_handler
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description    RC event handler
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ***************************************************************************/
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_rc_handler(tBTA_AV_EVT event, tBTA_AV *p_data)
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7029adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    BTIF_TRACE_DEBUG2 ("%s event:%s", __FUNCTION__, dump_rc_event(event));
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (event)
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AV_RC_OPEN_EVT:
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTIF_TRACE_DEBUG1("Peer_features:%x", p_data->rc_open.peer_features);
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            handle_rc_connect( &(p_data->rc_open) );
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }break;
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AV_RC_CLOSE_EVT:
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            handle_rc_disconnect( &(p_data->rc_close) );
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }break;
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTA_AV_REMOTE_CMD_EVT:
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTIF_TRACE_DEBUG2("rc_id:0x%x key_state:%d", p_data->remote_cmd.rc_id,
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                               p_data->remote_cmd.key_state);
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            handle_rc_passthrough_cmd( (&p_data->remote_cmd) );
7219adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
7229adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
7239adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case BTA_AV_RC_FEAT_EVT:
7249adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
7259adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            BTIF_TRACE_DEBUG1("Peer_features:%x", p_data->rc_feat.peer_features);
7269adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            btif_rc_cb.rc_features = p_data->rc_feat.peer_features;
727247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            handle_rc_features();
7289adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
7299adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
7309adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case BTA_AV_META_MSG_EVT:
7319adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
7329adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            BTIF_TRACE_DEBUG2("BTA_AV_META_MSG_EVT  code:%d label:%d", p_data->meta_msg.code,
7339adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                p_data->meta_msg.label);
7349adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            BTIF_TRACE_DEBUG3("  company_id:0x%x len:%d handle:%d", p_data->meta_msg.company_id,
7359adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                p_data->meta_msg.len, p_data->meta_msg.rc_handle);
7369adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            /* handle the metamsg command */
7379adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            handle_rc_metamsg_cmd(&(p_data->meta_msg));
7389adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
7399adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
7419adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            BTIF_TRACE_DEBUG1("Unhandled RC event : 0x%x", event);
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function       btif_rc_get_connected_peer
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description    Fetches the connected headset's BD_ADDR if any
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ***************************************************************************/
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_rc_get_connected_peer(BD_ADDR peer_addr)
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btif_rc_cb.rc_connected == TRUE) {
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(peer_addr, btif_rc_cb.rc_addr);
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return TRUE;
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return FALSE;
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function       btif_rc_check_handle_pending_play
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description    Clears the queued PLAY command. if bSend is TRUE, forwards to app
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ***************************************************************************/
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* clear the queued PLAY command. if bSend is TRUE, forward to app */
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_rc_check_handle_pending_play (BD_ADDR peer_addr, BOOLEAN bSendToApp)
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7725cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(peer_addr);
7735cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
7749adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    BTIF_TRACE_DEBUG2("%s: bSendToApp=%d", __FUNCTION__, bSendToApp);
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btif_rc_cb.rc_pending_play)
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (bSendToApp)
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            tBTA_AV_REMOTE_CMD remote_cmd;
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            APPL_TRACE_DEBUG1("%s: Sending queued PLAYED event to app", __FUNCTION__);
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset (&remote_cmd, 0, sizeof(tBTA_AV_REMOTE_CMD));
7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            remote_cmd.rc_handle  = btif_rc_cb.rc_handle;
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            remote_cmd.rc_id      = AVRC_ID_PLAY;
7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            remote_cmd.hdr.ctype  = AVRC_CMD_CTRL;
7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            remote_cmd.hdr.opcode = AVRC_OP_PASS_THRU;
7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* delay sending to app, else there is a timing issue in the framework,
7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             ** which causes the audio to be on th device's speaker. Delay between
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             ** OPEN & RC_PLAYs
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            */
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GKI_delay (200);
7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* send to app - both PRESSED & RELEASED */
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            remote_cmd.key_state  = AVRC_STATE_PRESS;
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            handle_rc_passthrough_cmd( &remote_cmd );
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GKI_delay (100);
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            remote_cmd.key_state  = AVRC_STATE_RELEASE;
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            handle_rc_passthrough_cmd( &remote_cmd );
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btif_rc_cb.rc_pending_play = FALSE;
8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8069adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/* Generic reject response */
8079adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic void send_reject_response (UINT8 rc_handle, UINT8 label, UINT8 pdu, UINT8 status)
8089adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
8099adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    UINT8 ctype = AVRC_RSP_REJ;
8109adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tAVRC_RESPONSE avrc_rsp;
8119adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    BT_HDR *p_msg = NULL;
8129adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    memset (&avrc_rsp, 0, sizeof(tAVRC_RESPONSE));
8139adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
8149adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.rsp.opcode = opcode_from_pdu(pdu);
8159adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.rsp.pdu    = pdu;
8169adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.rsp.status = status;
8179adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
8189adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (AVRC_STS_NO_ERROR == (status = AVRC_BldResponse(rc_handle, &avrc_rsp, &p_msg)) )
8199adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
8209adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        BTIF_TRACE_DEBUG4("%s:Sending error notification to handle:%d. pdu:%s,status:0x%02x",
8219adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            __FUNCTION__, rc_handle, dump_rc_pdu(pdu), status);
8229adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        BTA_AvMetaRsp(rc_handle, label, ctype, p_msg);
8239adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
8249adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
8259adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
8269adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/***************************************************************************
8279adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *  Function       send_metamsg_rsp
8289adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *
8299adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *  - Argument:
8309adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *                  rc_handle     RC handle corresponding to the connected RC
8319adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *                  label            Label of the RC response
8329adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *                  code            Response type
8339adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *                  pmetamsg_resp    Vendor response
8349adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *
8359adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *  - Description: Remote control metamsg response handler (AVRCP 1.3)
8369adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan *
8379adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan ***************************************************************************/
8389adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic void send_metamsg_rsp (UINT8 rc_handle, UINT8 label, tBTA_AV_CODE code,
8399adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tAVRC_RESPONSE *pmetamsg_resp)
8409adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
8419adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    UINT8 ctype;
8429adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tAVRC_STS status;
8439adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
8449adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (!pmetamsg_resp)
8459adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
8469adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        BTIF_TRACE_WARNING1("%s: Invalid response received from application", __FUNCTION__);
8479adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        return;
8489adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
8499adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
8509adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    BTIF_TRACE_EVENT5("+%s: rc_handle: %d, label: %d, code: 0x%02x, pdu: %s", __FUNCTION__,
8519adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        rc_handle, label, code, dump_rc_pdu(pmetamsg_resp->rsp.pdu));
8529adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
8539adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (pmetamsg_resp->rsp.status != AVRC_STS_NO_ERROR)
8549adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
8559adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        ctype = AVRC_RSP_REJ;
8569adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
8579adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    else
8589adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
8599adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        if ( code < AVRC_RSP_NOT_IMPL)
8609adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
8619adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            if (code == AVRC_CMD_NOTIF)
8629adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
8639adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan               ctype = AVRC_RSP_INTERIM;
8649adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
8659adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            else if (code == AVRC_CMD_STATUS)
8669adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
8679adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan               ctype = AVRC_RSP_IMPL_STBL;
8689adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
8699adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            else
8709adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
8719adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan               ctype = AVRC_RSP_ACCEPT;
8729adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
8739adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
8749adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        else
8759adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
8769adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            ctype = code;
8779adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
8789adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
8799adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    /* if response is for register_notification, make sure the rc has
8809adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    actually registered for this */
8819adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if((pmetamsg_resp->rsp.pdu == AVRC_PDU_REGISTER_NOTIFICATION) && (code == AVRC_RSP_CHANGED))
8829adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
8839adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        BOOLEAN bSent = FALSE;
8849adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        UINT8   event_id = pmetamsg_resp->reg_notif.event_id;
8859adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        BOOLEAN bNotify = (btif_rc_cb.rc_connected) && (btif_rc_cb.rc_notif[event_id-1].bNotify);
8869adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
8879adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        /* de-register this notification for a CHANGED response */
8889adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        btif_rc_cb.rc_notif[event_id-1].bNotify = FALSE;
8899adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        BTIF_TRACE_DEBUG4("%s rc_handle: %d. event_id: 0x%02d bNotify:%u", __FUNCTION__,
8909adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan             btif_rc_cb.rc_handle, event_id, bNotify);
8919adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        if (bNotify)
8929adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
8939adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            BT_HDR *p_msg = NULL;
8949adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            tAVRC_STS status;
8959adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
8969adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            if (AVRC_STS_NO_ERROR == (status = AVRC_BldResponse(btif_rc_cb.rc_handle,
8979adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                pmetamsg_resp, &p_msg)) )
8989adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
8999adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                BTIF_TRACE_DEBUG3("%s Sending notification to rc_handle: %d. event_id: 0x%02d",
9009adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                     __FUNCTION__, btif_rc_cb.rc_handle, event_id);
9019adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                bSent = TRUE;
9029adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                BTA_AvMetaRsp(btif_rc_cb.rc_handle, btif_rc_cb.rc_notif[event_id-1].label,
9039adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                    ctype, p_msg);
9049adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
9059adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            else
9069adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
9079adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                BTIF_TRACE_WARNING2("%s failed to build metamsg response. status: 0x%02x",
9089adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                    __FUNCTION__, status);
9099adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
9109adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
9119adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
9129adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
9139adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        if (!bSent)
9149adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
9159adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            BTIF_TRACE_DEBUG2("%s: Notification not sent, as there are no RC connections or the \
9169adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                CT has not subscribed for event_id: %s", __FUNCTION__, dump_rc_notification_event_id(event_id));
9179adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
9189adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
9199adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    else
9209adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
9219adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        /* All other commands go here */
9229adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
9239adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        BT_HDR *p_msg = NULL;
9249adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        tAVRC_STS status;
9259adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
9269adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        status = AVRC_BldResponse(rc_handle, pmetamsg_resp, &p_msg);
9279adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
9289adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        if (status == AVRC_STS_NO_ERROR)
9299adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
9309adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            BTA_AvMetaRsp(rc_handle, label, ctype, p_msg);
9319adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
9329adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        else
9339adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
9349adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            BTIF_TRACE_ERROR2("%s: failed to build metamsg response. status: 0x%02x",
9359adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                __FUNCTION__, status);
9369adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
9379adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
9389adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
9399adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
9409adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic UINT8 opcode_from_pdu(UINT8 pdu)
9419adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
9429adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    UINT8 opcode = 0;
9439adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
9449adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    switch (pdu)
9459adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
9469adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    case AVRC_PDU_NEXT_GROUP:
9479adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    case AVRC_PDU_PREV_GROUP: /* pass thru */
9489adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        opcode  = AVRC_OP_PASS_THRU;
9499adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
9509adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
9519adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    default: /* vendor */
9529adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        opcode  = AVRC_OP_VENDOR;
9539adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
9549adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
9559adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
9569adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    return opcode;
9579adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
9589adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
9599adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/*******************************************************************************
9609adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
9619adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Function         btif_rc_upstreams_evt
9629adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
9639adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Description      Executes AVRC UPSTREAMS events in btif context.
9649adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
9659adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Returns          void
9669adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
9679adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan*******************************************************************************/
9689adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic void btif_rc_upstreams_evt(UINT16 event, tAVRC_COMMAND *pavrc_cmd, UINT8 ctype, UINT8 label)
9699adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
9709adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    BTIF_TRACE_EVENT5("%s pdu: %s handle: 0x%x ctype:%x label:%x", __FUNCTION__,
9719adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        dump_rc_pdu(pavrc_cmd->pdu), btif_rc_cb.rc_handle, ctype, label);
9729adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
9739adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    switch (event)
9749adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
9759adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case AVRC_PDU_GET_PLAY_STATUS:
9769adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
9779adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            FILL_PDU_QUEUE(IDX_GET_PLAY_STATUS_RSP, ctype, label, TRUE)
9789adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            HAL_CBACK(bt_rc_callbacks, get_play_status_cb);
9799adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
9809adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
9819adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case AVRC_PDU_LIST_PLAYER_APP_ATTR:
9829adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case AVRC_PDU_LIST_PLAYER_APP_VALUES:
9839adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case AVRC_PDU_GET_CUR_PLAYER_APP_VALUE:
9849adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case AVRC_PDU_SET_PLAYER_APP_VALUE:
9859adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case AVRC_PDU_GET_PLAYER_APP_ATTR_TEXT:
9869adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case AVRC_PDU_GET_PLAYER_APP_VALUE_TEXT:
9879adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
9889adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            /* TODO: Add support for Application Settings */
989081d6e548bed5a91c0ba9abda518c06a1b0ba7f5Zhihai Xu            send_reject_response (btif_rc_cb.rc_handle, label, pavrc_cmd->pdu, AVRC_STS_BAD_CMD);
9909adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
9919adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
9929adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case AVRC_PDU_GET_ELEMENT_ATTR:
9939adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
9949adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            btrc_media_attr_t element_attrs[BTRC_MAX_ELEM_ATTR_SIZE];
9959adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            UINT8 num_attr;
996841e5b5092bcdbc1acffd6cf7255ec423fe15fdbRavi Nagarajan             memset(&element_attrs, 0, sizeof(element_attrs));
9979adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            if (pavrc_cmd->get_elem_attrs.num_attr == 0)
9989adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
9999adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                /* CT requests for all attributes */
10009adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                int attr_cnt;
1001841e5b5092bcdbc1acffd6cf7255ec423fe15fdbRavi Nagarajan                num_attr = BTRC_MAX_ELEM_ATTR_SIZE;
1002841e5b5092bcdbc1acffd6cf7255ec423fe15fdbRavi Nagarajan                for (attr_cnt = 0; attr_cnt < BTRC_MAX_ELEM_ATTR_SIZE; attr_cnt++)
10039adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                {
1004841e5b5092bcdbc1acffd6cf7255ec423fe15fdbRavi Nagarajan                    element_attrs[attr_cnt] = attr_cnt + 1;
10059adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                }
10069adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
10079adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            else if (pavrc_cmd->get_elem_attrs.num_attr == 0xFF)
10089adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
1009841e5b5092bcdbc1acffd6cf7255ec423fe15fdbRavi Nagarajan                /* 0xff indicates, no attributes requested - reject */
1010841e5b5092bcdbc1acffd6cf7255ec423fe15fdbRavi Nagarajan                send_reject_response (btif_rc_cb.rc_handle, label, pavrc_cmd->pdu,
1011841e5b5092bcdbc1acffd6cf7255ec423fe15fdbRavi Nagarajan                    AVRC_STS_BAD_PARAM);
1012841e5b5092bcdbc1acffd6cf7255ec423fe15fdbRavi Nagarajan                return;
10139adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
10149adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            else
10159adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
10169adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                num_attr = pavrc_cmd->get_elem_attrs.num_attr;
10179adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                memcpy(element_attrs, pavrc_cmd->get_elem_attrs.attrs, sizeof(UINT32)
10189adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                    *pavrc_cmd->get_elem_attrs.num_attr);
10199adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
10209adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            FILL_PDU_QUEUE(IDX_GET_ELEMENT_ATTR_RSP, ctype, label, TRUE);
10219adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            HAL_CBACK(bt_rc_callbacks, get_element_attr_cb, num_attr, element_attrs);
10229adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
10239adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
10249adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case AVRC_PDU_REGISTER_NOTIFICATION:
10259adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
10269adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            if(pavrc_cmd->reg_notif.event_id == BTRC_EVT_PLAY_POS_CHANGED &&
10279adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                pavrc_cmd->reg_notif.param == 0)
10289adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
10299adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                BTIF_TRACE_WARNING1("%s Device registering position changed with illegal param 0.",
10309adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                    __FUNCTION__);
10319adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                send_reject_response (btif_rc_cb.rc_handle, label, pavrc_cmd->pdu, AVRC_STS_BAD_PARAM);
10329adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                /* de-register this notification for a rejected response */
10339adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                btif_rc_cb.rc_notif[BTRC_EVT_PLAY_POS_CHANGED - 1].bNotify = FALSE;
10349adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                return;
10359adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
10369adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            HAL_CBACK(bt_rc_callbacks, register_notification_cb, pavrc_cmd->reg_notif.event_id,
10379adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                pavrc_cmd->reg_notif.param);
10389adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
10399adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
10409adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case AVRC_PDU_INFORM_DISPLAY_CHARSET:
10419adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
10429adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            tAVRC_RESPONSE avrc_rsp;
10439adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            BTIF_TRACE_EVENT1("%s() AVRC_PDU_INFORM_DISPLAY_CHARSET", __FUNCTION__);
10449adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            if(btif_rc_cb.rc_connected == TRUE)
10459adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            {
10469adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                memset(&(avrc_rsp.inform_charset), 0, sizeof(tAVRC_RSP));
10479adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                avrc_rsp.inform_charset.opcode=opcode_from_pdu(AVRC_PDU_INFORM_DISPLAY_CHARSET);
10489adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                avrc_rsp.inform_charset.pdu=AVRC_PDU_INFORM_DISPLAY_CHARSET;
10499adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                avrc_rsp.inform_charset.status=AVRC_STS_NO_ERROR;
10509adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                send_metamsg_rsp(btif_rc_cb.rc_handle, label, ctype, &avrc_rsp);
10519adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            }
10529adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
10539adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
10549adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        default:
10559adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        {
10569adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        send_reject_response (btif_rc_cb.rc_handle, label, pavrc_cmd->pdu,
10579adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            (pavrc_cmd->pdu == AVRC_PDU_SEARCH)?AVRC_STS_SEARCH_NOT_SUP:AVRC_STS_BAD_CMD);
10589adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        return;
10599adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
10609adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        break;
10619adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
10629adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
10639adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
10649adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
1065247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1066247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/*******************************************************************************
1067247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1068247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Function         btif_rc_upstreams_rsp_evt
1069247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1070247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Description      Executes AVRC UPSTREAMS response events in btif context.
1071247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1072247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Returns          void
1073247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1074247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji*******************************************************************************/
1075247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic void btif_rc_upstreams_rsp_evt(UINT16 event, tAVRC_RESPONSE *pavrc_resp, UINT8 ctype, UINT8 label)
1076247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1077247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    BTIF_TRACE_EVENT5("%s pdu: %s handle: 0x%x ctype:%x label:%x", __FUNCTION__,
1078247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        dump_rc_pdu(pavrc_resp->pdu), btif_rc_cb.rc_handle, ctype, label);
1079247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1080247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji#if (AVRC_ADV_CTRL_INCLUDED == TRUE)
1081247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    switch (event)
1082247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1083247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        case AVRC_PDU_REGISTER_NOTIFICATION:
1084247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        {
1085247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji             if(AVRC_RSP_CHANGED==ctype)
1086247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                 btif_rc_cb.rc_volume=pavrc_resp->reg_notif.param.volume;
1087247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji             HAL_CBACK(bt_rc_callbacks, volume_change_cb, pavrc_resp->reg_notif.param.volume,ctype)
1088247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        }
1089247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        break;
1090247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1091247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        case AVRC_PDU_SET_ABSOLUTE_VOLUME:
1092247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        {
1093247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            BTIF_TRACE_DEBUG2("Set absolute volume change event received: volume %d,ctype %d",
1094247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                pavrc_resp->volume.volume,ctype);
1095247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            if(AVRC_RSP_ACCEPT==ctype)
1096247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                btif_rc_cb.rc_volume=pavrc_resp->volume.volume;
1097247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            HAL_CBACK(bt_rc_callbacks,volume_change_cb,pavrc_resp->volume.volume,ctype)
1098247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        }
1099247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        break;
1100247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1101247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        default:
1102247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            return;
1103247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1104247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji#endif
1105247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1106247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
11079adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/************************************************************************************
11089adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**  AVRCP API Functions
11099adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan************************************************************************************/
11109adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
11119adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/*******************************************************************************
11129adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
11139adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Function         init
11149adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
11159adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Description      Initializes the AVRC interface
11169adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
11179adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Returns          bt_status_t
11189adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
11199adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan*******************************************************************************/
11209adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic bt_status_t init(btrc_callbacks_t* callbacks )
11219adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
11229adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    BTIF_TRACE_EVENT1("## %s ##", __FUNCTION__);
11239adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    bt_status_t result = BT_STATUS_SUCCESS;
11249adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
11259adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (bt_rc_callbacks)
11269adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        return BT_STATUS_DONE;
11279adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
11289adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    bt_rc_callbacks = callbacks;
11299adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    memset (&btif_rc_cb, 0, sizeof(btif_rc_cb));
1130247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    btif_rc_cb.rc_vol_label=MAX_LABEL;
1131247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    btif_rc_cb.rc_volume=MAX_VOLUME;
1132247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    lbl_init();
11339adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
11349adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    return result;
11359adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
11369adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
11379adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/***************************************************************************
11389adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
11399adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Function         get_play_status_rsp
11409adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
11419adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Description      Returns the current play status.
11429adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**                      This method is called in response to
11439adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**                      GetPlayStatus request.
11449adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
11459adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Returns          bt_status_t
11469adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
11479adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan***************************************************************************/
11489adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic bt_status_t get_play_status_rsp(btrc_play_status_t play_status, uint32_t song_len,
11499adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    uint32_t song_pos)
11509adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
11519adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tAVRC_RESPONSE avrc_rsp;
11529adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    UINT32 i;
11539adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    CHECK_RC_CONNECTED
11549adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    memset(&(avrc_rsp.get_play_status), 0, sizeof(tAVRC_GET_PLAY_STATUS_RSP));
11559adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.get_play_status.song_len = song_len;
11569adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.get_play_status.song_pos = song_pos;
11579adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.get_play_status.play_status = play_status;
11589adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
11599adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.get_play_status.pdu = AVRC_PDU_GET_PLAY_STATUS;
11609adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.get_play_status.opcode = opcode_from_pdu(AVRC_PDU_GET_PLAY_STATUS);
1161b88fc6cb5636c4af17077502fe3313ffb32d93eeRavi Nagarajan    avrc_rsp.get_play_status.status = AVRC_STS_NO_ERROR;
11629adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    /* Send the response */
11639adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    SEND_METAMSG_RSP(IDX_GET_PLAY_STATUS_RSP, &avrc_rsp);
11649adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    return BT_STATUS_SUCCESS;
11659adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
11669adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
11679adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/***************************************************************************
11689adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
11699adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Function         get_element_attr_rsp
11709adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
11719adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Description      Returns the current songs' element attributes
11729adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**                      in text.
11739adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
11749adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Returns          bt_status_t
11759adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
11769adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan***************************************************************************/
11779adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic bt_status_t get_element_attr_rsp(uint8_t num_attr, btrc_element_attr_val_t *p_attrs)
11789adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
11799adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tAVRC_RESPONSE avrc_rsp;
11809adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    UINT32 i;
11819adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    uint8_t j;
11829adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tAVRC_ATTR_ENTRY element_attrs[BTRC_MAX_ELEM_ATTR_SIZE];
11839adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    CHECK_RC_CONNECTED
11849adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    memset(element_attrs, 0, sizeof(tAVRC_ATTR_ENTRY) * num_attr);
11859adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
11869adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (num_attr == 0)
11879adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
11889adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        avrc_rsp.get_play_status.status = AVRC_STS_BAD_PARAM;
11899adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
11909adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    else
11919adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
11929adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        for (i=0; i<num_attr; i++) {
11939adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            element_attrs[i].attr_id = p_attrs[i].attr_id;
11949adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            element_attrs[i].name.charset_id = AVRC_CHARSET_ID_UTF8;
11959adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            element_attrs[i].name.str_len = (UINT16)strlen((char *)p_attrs[i].text);
11969adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            element_attrs[i].name.p_str = p_attrs[i].text;
11979adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            BTIF_TRACE_DEBUG5("%s attr_id:0x%x, charset_id:0x%x, str_len:%d, str:%s",
11989adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                __FUNCTION__, (unsigned int)element_attrs[i].attr_id,
11999adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                element_attrs[i].name.charset_id, element_attrs[i].name.str_len,
12009adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan                element_attrs[i].name.p_str);
12019adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        }
12029adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        avrc_rsp.get_play_status.status = AVRC_STS_NO_ERROR;
12039adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
12049adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.get_elem_attrs.num_attr = num_attr;
12059adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.get_elem_attrs.p_attrs = element_attrs;
12069adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.get_elem_attrs.pdu = AVRC_PDU_GET_ELEMENT_ATTR;
12079adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.get_elem_attrs.opcode = opcode_from_pdu(AVRC_PDU_GET_ELEMENT_ATTR);
12089adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    /* Send the response */
12099adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    SEND_METAMSG_RSP(IDX_GET_ELEMENT_ATTR_RSP, &avrc_rsp);
12109adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    return BT_STATUS_SUCCESS;
12119adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
12129adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
12139adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/***************************************************************************
12149adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
12159adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Function         register_notification_rsp
12169adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
12179adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Description      Response to the register notification request.
12189adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**                      in text.
12199adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
12209adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Returns          bt_status_t
12219adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
12229adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan***************************************************************************/
12239adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic bt_status_t register_notification_rsp(btrc_event_id_t event_id,
12249adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    btrc_notification_type_t type, btrc_register_notification_t *p_param)
12259adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
12269adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    tAVRC_RESPONSE avrc_rsp;
12279adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    CHECK_RC_CONNECTED
12289adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    BTIF_TRACE_EVENT2("## %s ## event_id:%s", __FUNCTION__, dump_rc_notification_event_id(event_id));
12299adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    memset(&(avrc_rsp.reg_notif), 0, sizeof(tAVRC_REG_NOTIF_RSP));
12309adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.reg_notif.event_id = event_id;
12319adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
12329adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    switch(event_id)
12339adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
12349adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case BTRC_EVT_PLAY_STATUS_CHANGED:
12359adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            avrc_rsp.reg_notif.param.play_status = p_param->play_status;
12369adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            break;
12379adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        case BTRC_EVT_TRACK_CHANGE:
12389adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            memcpy(&(avrc_rsp.reg_notif.param.track), &(p_param->track), sizeof(btrc_uid_t));
12399adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            break;
1240b88fc6cb5636c4af17077502fe3313ffb32d93eeRavi Nagarajan        case BTRC_EVT_PLAY_POS_CHANGED:
1241b88fc6cb5636c4af17077502fe3313ffb32d93eeRavi Nagarajan            avrc_rsp.reg_notif.param.play_pos = p_param->song_pos;
1242b88fc6cb5636c4af17077502fe3313ffb32d93eeRavi Nagarajan            break;
12439adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        default:
12449adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            BTIF_TRACE_WARNING2("%s : Unhandled event ID : 0x%x", __FUNCTION__, event_id);
12459adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan            return BT_STATUS_UNHANDLED;
12469adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
12479adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
12489adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.reg_notif.pdu = AVRC_PDU_REGISTER_NOTIFICATION;
12499adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.reg_notif.opcode = opcode_from_pdu(AVRC_PDU_REGISTER_NOTIFICATION);
12509adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    avrc_rsp.get_play_status.status = AVRC_STS_NO_ERROR;
12519adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
12529adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    /* Send the response. */
12539adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    send_metamsg_rsp(btif_rc_cb.rc_handle, btif_rc_cb.rc_notif[event_id-1].label,
12549adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        ((type == BTRC_NOTIFICATION_TYPE_INTERIM)?AVRC_CMD_NOTIF:AVRC_RSP_CHANGED), &avrc_rsp);
12559adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    return BT_STATUS_SUCCESS;
12569adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
12579adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
12589adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/***************************************************************************
12599adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
1260247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Function         set_volume
1261247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1262247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Description      Send current volume setting to remote side.
1263247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**                  Support limited to SetAbsoluteVolume
1264247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**                  This can be enhanced to support Relative Volume (AVRCP 1.0).
1265247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**                  With RelateVolume, we will send VOLUME_UP/VOLUME_DOWN
1266247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**                  as opposed to absolute volume level
1267247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** volume: Should be in the range 0-127. bit7 is reseved and cannot be set
1268247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1269247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Returns          bt_status_t
1270247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1271247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji***************************************************************************/
1272247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic bt_status_t set_volume(uint8_t volume)
1273247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1274247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
1275247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    CHECK_RC_CONNECTED
1276247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    tAVRC_STS status = BT_STATUS_UNSUPPORTED;
1277247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    rc_transaction_t *p_transaction=NULL;
1278247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1279247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if(btif_rc_cb.rc_volume==volume)
1280247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1281247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        status=BT_STATUS_DONE;
1282247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        BTIF_TRACE_ERROR2("%s: volume value already set earlier: 0x%02x",__FUNCTION__, volume);
1283247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        return status;
1284247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1285247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1286247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if ((btif_rc_cb.rc_features & BTA_AV_FEAT_RCTG) &&
1287247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        (btif_rc_cb.rc_features & BTA_AV_FEAT_ADV_CTRL))
1288247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1289247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        tAVRC_COMMAND avrc_cmd = {0};
1290247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        BT_HDR *p_msg = NULL;
1291247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1292247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        BTIF_TRACE_DEBUG2("%s: Peer supports absolute volume. newVolume=%d", __FUNCTION__, volume);
1293247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        avrc_cmd.volume.opcode = AVRC_OP_VENDOR;
1294247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        avrc_cmd.volume.pdu = AVRC_PDU_SET_ABSOLUTE_VOLUME;
1295247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        avrc_cmd.volume.status = AVRC_STS_NO_ERROR;
1296247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        avrc_cmd.volume.volume = volume;
1297247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1298247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        if (AVRC_BldCommand(&avrc_cmd, &p_msg) == AVRC_STS_NO_ERROR)
1299247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        {
1300247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            bt_status_t tran_status=get_transaction(&p_transaction);
1301247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            if(BT_STATUS_SUCCESS == tran_status && NULL!=p_transaction)
1302247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            {
1303247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                BTIF_TRACE_DEBUG2("%s msgreq being sent out with label %d",
1304247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                                   __FUNCTION__,p_transaction->lbl);
1305247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                BTA_AvMetaCmd(btif_rc_cb.rc_handle,p_transaction->lbl, AVRC_CMD_CTRL, p_msg);
1306247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                status =  BT_STATUS_SUCCESS;
1307247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            }
1308247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            else
1309247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            {
1310247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                if(NULL!=p_msg)
1311247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                   GKI_freebuf(p_msg);
1312247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                BTIF_TRACE_ERROR2("%s: failed to obtain transaction details. status: 0x%02x",
1313247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                                    __FUNCTION__, tran_status);
1314247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                status = BT_STATUS_FAIL;
1315247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            }
1316247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        }
1317247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        else
1318247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        {
1319247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            BTIF_TRACE_ERROR2("%s: failed to build absolute volume command. status: 0x%02x",
1320247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                                __FUNCTION__, status);
1321247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            status = BT_STATUS_FAIL;
1322247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        }
1323247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1324247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    else
1325247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        status=BT_STATUS_NOT_READY;
1326247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    return status;
1327247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1328247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1329247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1330247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/***************************************************************************
1331247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1332247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Function         register_volumechange
1333247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1334247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Description     Register for volume change notification from remote side.
1335247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1336247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Returns          void
1337247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1338247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji***************************************************************************/
1339247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1340247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic void register_volumechange (UINT8 lbl)
1341247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1342247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    tAVRC_COMMAND avrc_cmd = {0};
1343247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    BT_HDR *p_msg = NULL;
1344247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    tAVRC_STS BldResp=AVRC_STS_BAD_CMD;
1345247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    UINT16 rv = 0;
1346247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    bt_status_t tran_status;
1347247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    rc_transaction_t *p_transaction=NULL;
1348247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1349247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    BTIF_TRACE_DEBUG2("%s called with label:%d",__FUNCTION__,lbl);
1350247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1351247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    avrc_cmd.cmd.opcode=0x00;
1352247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    avrc_cmd.pdu = AVRC_PDU_REGISTER_NOTIFICATION;
1353247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    avrc_cmd.reg_notif.event_id = AVRC_EVT_VOLUME_CHANGE;
1354247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    avrc_cmd.reg_notif.status = AVRC_STS_NO_ERROR;
1355247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1356247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    BldResp=AVRC_BldCommand(&avrc_cmd, &p_msg);
1357247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if(AVRC_STS_NO_ERROR==BldResp && p_msg)
1358247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1359247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         p_transaction=get_transaction_by_lbl(lbl);
1360247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         if(NULL!=p_transaction)
1361247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         {
1362247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji             BTA_AvMetaCmd(btif_rc_cb.rc_handle,p_transaction->lbl, AVRC_CMD_NOTIF, p_msg);
1363247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji             BTIF_TRACE_DEBUG1("%s:BTA_AvMetaCmd called",__FUNCTION__);
1364247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         }
1365247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         else
1366247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         {
1367247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            if(NULL!=p_msg)
1368247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji               GKI_freebuf(p_msg);
1369247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            BTIF_TRACE_ERROR2("%s transaction not obtained with label: %d",__FUNCTION__,lbl);
1370247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         }
1371247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1372247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    else
1373247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        BTIF_TRACE_ERROR2("%s failed to build command:%d",__FUNCTION__,BldResp);
1374247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1375247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1376247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1377247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/***************************************************************************
1378247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1379247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Function         handle_rc_metamsg_rsp
1380247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1381247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Description      Handle RC metamessage response
1382247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1383247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Returns          void
1384247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1385247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji***************************************************************************/
1386247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic void handle_rc_metamsg_rsp(tBTA_AV_META_MSG *pmeta_msg)
1387247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1388247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    tAVRC_RESPONSE    avrc_response = {0};
1389247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    UINT8             scratch_buf[512] = {0};
1390247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    tAVRC_STS status = BT_STATUS_UNSUPPORTED;
1391247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1392247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if(AVRC_OP_VENDOR==pmeta_msg->p_msg->hdr.opcode &&(AVRC_RSP_CHANGED==pmeta_msg->code
1393247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji      || AVRC_RSP_INTERIM==pmeta_msg->code || AVRC_RSP_ACCEPT==pmeta_msg->code
1394247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji      || AVRC_RSP_REJ==pmeta_msg->code || AVRC_RSP_NOT_IMPL==pmeta_msg->code))
1395247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1396247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        status=AVRC_ParsResponse(pmeta_msg->p_msg, &avrc_response, scratch_buf, sizeof(scratch_buf));
1397247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        BTIF_TRACE_DEBUG6("%s: code %d,event ID %d,PDU %x,parsing status %d, label:%d",
1398247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji          __FUNCTION__,pmeta_msg->code,avrc_response.reg_notif.event_id,avrc_response.reg_notif.pdu,
1399247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji          status, pmeta_msg->label);
1400247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1401247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        if (status != AVRC_STS_NO_ERROR)
1402247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        {
1403247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            if(AVRC_PDU_REGISTER_NOTIFICATION==avrc_response.rsp.pdu
1404247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                && AVRC_EVT_VOLUME_CHANGE==avrc_response.reg_notif.event_id
1405247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                && btif_rc_cb.rc_vol_label==pmeta_msg->label)
1406247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            {
1407247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                btif_rc_cb.rc_vol_label=MAX_LABEL;
1408247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                release_transaction(btif_rc_cb.rc_vol_label);
1409247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            }
1410247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            else if(AVRC_PDU_SET_ABSOLUTE_VOLUME==avrc_response.rsp.pdu)
1411247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            {
1412247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                release_transaction(pmeta_msg->label);
1413247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            }
1414247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            return;
1415247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        }
1416247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        else if(AVRC_PDU_REGISTER_NOTIFICATION==avrc_response.rsp.pdu
1417247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            && AVRC_EVT_VOLUME_CHANGE==avrc_response.reg_notif.event_id
1418247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            && btif_rc_cb.rc_vol_label!=pmeta_msg->label)
1419247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            {
1420247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                // Just discard the message, if the device sends back with an incorrect label
1421247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                BTIF_TRACE_DEBUG3("%s:Discarding register notfn in rsp.code: %d and label %d",
1422247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                __FUNCTION__, pmeta_msg->code, pmeta_msg->label);
1423247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                return;
1424247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            }
1425247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1426247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    else
1427247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1428247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        BTIF_TRACE_DEBUG3("%s:Received vendor dependent in adv ctrl rsp. code: %d len: %d. Not processing it.",
1429247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        __FUNCTION__, pmeta_msg->code, pmeta_msg->len);
1430247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        return;
1431247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1432247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1433247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if(AVRC_PDU_REGISTER_NOTIFICATION==avrc_response.rsp.pdu
1434247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        && AVRC_EVT_VOLUME_CHANGE==avrc_response.reg_notif.event_id
1435247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        && AVRC_RSP_CHANGED==pmeta_msg->code)
1436247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     {
1437247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         /* re-register for volume change notification */
1438247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         // Do not re-register for rejected case, as it might get into endless loop
1439247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji         register_volumechange(btif_rc_cb.rc_vol_label);
1440247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     }
1441247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     else if(AVRC_PDU_SET_ABSOLUTE_VOLUME==avrc_response.rsp.pdu)
1442247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     {
1443247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji          /* free up the label here */
1444247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji          release_transaction(pmeta_msg->label);
1445247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     }
1446247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1447247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     BTIF_TRACE_EVENT2("%s: Passing received metamsg response to app. pdu: %s",
1448247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji             __FUNCTION__, dump_rc_pdu(avrc_response.pdu));
1449247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji     btif_rc_upstreams_rsp_evt((uint16_t)avrc_response.rsp.pdu, &avrc_response, pmeta_msg->code,
1450247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji                                pmeta_msg->label);
1451247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1452247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1453247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1454247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/***************************************************************************
1455247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
14569adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Function         cleanup
14579adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
14589adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Description      Closes the AVRC interface
14599adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
14609adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Returns          void
14619adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
14629adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan***************************************************************************/
14639adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic void cleanup()
14649adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
14659adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    BTIF_TRACE_EVENT1("## %s ##", __FUNCTION__);
14669adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    close_uinput();
14679adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    if (bt_rc_callbacks)
14689adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    {
14699adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan        bt_rc_callbacks = NULL;
14709adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    }
14719adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    memset(&btif_rc_cb, 0, sizeof(btif_rc_cb_t));
1472247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    lbl_destroy();
14739adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan}
14749adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
14759adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
14769adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanstatic const btrc_interface_t bt_rc_interface = {
14779adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    sizeof(bt_rc_interface),
14789adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    init,
14799adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    get_play_status_rsp,
14809adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    NULL, /* list_player_app_attr_rsp */
14819adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    NULL, /* list_player_app_value_rsp */
14829adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    NULL, /* get_player_app_value_rsp */
14839adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    NULL, /* get_player_app_attr_text_rsp */
14849adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    NULL, /* get_player_app_value_text_rsp */
14859adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    get_element_attr_rsp,
14869adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    NULL, /* set_player_app_value_rsp */
14879adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    register_notification_rsp,
1488247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    set_volume,
14899adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    cleanup,
14909adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan};
14919adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan
14929adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan/*******************************************************************************
14939adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
14949adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Function         btif_rc_get_interface
14959adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
14969adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Description      Get the AVRCP callback interface
14979adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
14989adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan** Returns          btav_interface_t
14999adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan**
15009adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan*******************************************************************************/
15019adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajanconst btrc_interface_t *btif_rc_get_interface(void)
15029adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan{
15039adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    BTIF_TRACE_EVENT1("%s", __FUNCTION__);
15049adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan    return &bt_rc_interface;
1505247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1506247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1507247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/*******************************************************************************
1508247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**      Function         initialize_transaction
1509247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1510247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**      Description    Initializes fields of the transaction structure
1511247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1512247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**      Returns          void
1513247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji*******************************************************************************/
1514247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojistatic void initialize_transaction(int lbl)
1515247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1516247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutex_lock(&device.lbllock);
1517247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if(lbl < MAX_TRANSACTIONS_PER_SESSION)
1518247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1519247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji       device.transaction[lbl].lbl = lbl;
1520247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji       device.transaction[lbl].in_use=FALSE;
1521247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji       device.transaction[lbl].handle=0;
1522247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1523247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutex_unlock(&device.lbllock);
1524247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1525247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1526247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/*******************************************************************************
1527247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**      Function         lbl_init
1528247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1529247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**      Description    Initializes label structures and mutexes.
1530247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1531247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**      Returns         void
1532247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji*******************************************************************************/
1533247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojivoid lbl_init()
1534247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1535247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    memset(&device,0,sizeof(rc_device_t));
1536247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutexattr_t attr;
1537247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutexattr_init(&attr);
1538247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutex_init(&(device.lbllock), &attr);
1539247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutexattr_destroy(&attr);
1540247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    init_all_transactions();
1541247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1542247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1543247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/*******************************************************************************
1544247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1545247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Function         init_all_transactions
1546247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1547247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Description    Initializes all transactions
1548247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1549247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Returns          void
1550247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji*******************************************************************************/
1551247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojivoid init_all_transactions()
1552247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1553247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    UINT8 txn_indx=0;
1554247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    for(txn_indx=0; txn_indx < MAX_TRANSACTIONS_PER_SESSION; txn_indx++)
1555247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1556247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        initialize_transaction(txn_indx);
1557247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1558247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1559247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1560247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/*******************************************************************************
1561247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1562247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Function         get_transaction_by_lbl
1563247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1564247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Description    Will return a transaction based on the label. If not inuse
1565247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**                     will return an error.
1566247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1567247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Returns          bt_status_t
1568247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji*******************************************************************************/
1569247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojirc_transaction_t *get_transaction_by_lbl(UINT8 lbl)
1570247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1571247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    rc_transaction_t *transaction = NULL;
1572247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutex_lock(&device.lbllock);
1573247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1574247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    /* Determine if this is a valid label */
1575247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if (lbl < MAX_TRANSACTIONS_PER_SESSION)
1576247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1577247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        if (FALSE==device.transaction[lbl].in_use)
1578247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        {
1579247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            transaction = NULL;
1580247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        }
1581247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        else
1582247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        {
1583247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            transaction = &(device.transaction[lbl]);
1584247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            BTIF_TRACE_DEBUG2("%s: Got transaction.label: %d",__FUNCTION__,lbl);
1585247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        }
1586247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1587247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1588247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutex_unlock(&device.lbllock);
1589247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    return transaction;
1590247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1591247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1592247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/*******************************************************************************
1593247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1594247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Function         get_transaction
1595247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1596247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Description    Obtains the transaction details.
1597247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1598247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Returns          bt_status_t
1599247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji*******************************************************************************/
1600247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1601247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojibt_status_t  get_transaction(rc_transaction_t **ptransaction)
1602247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1603247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    bt_status_t result = BT_STATUS_NOMEM;
1604247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    UINT8 i=0;
1605247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutex_lock(&device.lbllock);
1606247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1607247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    // Check for unused transactions
1608247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    for (i=0; i<MAX_TRANSACTIONS_PER_SESSION; i++)
1609247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1610247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        if (FALSE==device.transaction[i].in_use)
1611247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        {
1612247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            BTIF_TRACE_DEBUG2("%s:Got transaction.label: %d",__FUNCTION__,device.transaction[i].lbl);
1613247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            device.transaction[i].in_use = TRUE;
1614247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            *ptransaction = &(device.transaction[i]);
1615247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            result = BT_STATUS_SUCCESS;
1616247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji            break;
1617247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        }
1618247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1619247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1620247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutex_unlock(&device.lbllock);
1621247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    return result;
1622247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1623247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1624247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1625247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/*******************************************************************************
1626247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1627247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Function         release_transaction
1628247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1629247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Description    Will release a transaction for reuse
1630247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1631247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Returns          bt_status_t
1632247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji*******************************************************************************/
1633247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojivoid release_transaction(UINT8 lbl)
1634247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1635247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    rc_transaction_t *transaction = get_transaction_by_lbl(lbl);
1636247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1637247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    /* If the transaction is in use... */
1638247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    if (transaction != NULL)
1639247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    {
1640247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        BTIF_TRACE_DEBUG2("%s: lbl: %d", __FUNCTION__, lbl);
1641247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji        initialize_transaction(lbl);
1642247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    }
1643247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1644247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji
1645247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji/*******************************************************************************
1646247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1647247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Function         lbl_destroy
1648247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1649247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Description    Cleanup of the mutex
1650247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji**
1651247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji** Returns          void
1652247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji*******************************************************************************/
1653247c68fe6eee3660cbdcf4509195fe735ae25573Satya Callojivoid lbl_destroy()
1654247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji{
1655247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji    pthread_mutex_destroy(&(device.lbllock));
1656247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji}
1657a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie
1658a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie/*******************************************************************************
1659a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie**      Function       dev_blacklisted_for_absolute_volume
1660a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie**
1661a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie**      Description    Blacklist Devices that donot handle absolute volume well
16627850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xie**                     We are blacklisting all the devices that are not in whitelist
1663a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie**
1664a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie**      Returns        True if the device is in the list
1665a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie*******************************************************************************/
1666a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xiestatic BOOLEAN dev_blacklisted_for_absolute_volume(BD_ADDR peer_dev)
1667a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie{
1668a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie    int i;
1669c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin    char *dev_name_str = NULL;
16707850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xie    int whitelist_size = sizeof(rc_white_addr_prefix)/sizeof(rc_white_addr_prefix[0]);
1671c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin
16727850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xie    for (i = 0; i < whitelist_size; i++) {
16737850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xie        if (rc_white_addr_prefix[i][0] == peer_dev[0] &&
16747850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xie            rc_white_addr_prefix[i][1] == peer_dev[1] &&
16757850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xie            rc_white_addr_prefix[i][2] == peer_dev[2]) {
16767850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xie            BTIF_TRACE_DEBUG3("whitelist absolute volume for %02x:%02x:%02x",
1677c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin                              peer_dev[0], peer_dev[1], peer_dev[2]);
16787850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xie            return FALSE;
1679a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie        }
1680a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie    }
1681c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin
1682c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin    dev_name_str = BTM_SecReadDevName(peer_dev);
1683c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin    whitelist_size = sizeof(rc_white_name)/sizeof(char*);
1684c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin    if (dev_name_str != NULL) {
1685c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin        for (i = 0; i < whitelist_size; i++) {
1686c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin            if (strcmp(dev_name_str, rc_white_name[i]) == 0) {
1687c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin                BTIF_TRACE_DEBUG1("whitelist absolute volume for %s", dev_name_str);
1688c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin                return FALSE;
1689c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin            }
1690c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin        }
1691c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin    }
1692c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin
1693c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin    BTIF_TRACE_WARNING4("blacklist absolute volume for %02x:%02x:%02x, name = %s",
1694c9fbcde6d2077ee03dc497824cd98e4d782f7ceaThomas.TT_Lin                        peer_dev[0], peer_dev[1], peer_dev[2], dev_name_str);
16957850a939f3c33a0bada9b9e2cd335189614a5ef9Matthew Xie    return TRUE;
1696a7ae4a15e954fe143326d4f869f8dac8e76ee8ceMatthew Xie}
1697