bta_av_act.c revision 54db2c249efa91082c5a167a924a527ec73ff38d
18ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen/****************************************************************************** 28ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen * 38ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen * Copyright (C) 2004-2012 Broadcom Corporation 48ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen * 58ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen * Licensed under the Apache License, Version 2.0 (the "License"); 68ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen * you may not use this file except in compliance with the License. 78ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen * You may obtain a copy of the License at: 88ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen * 98ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen * http://www.apache.org/licenses/LICENSE-2.0 108ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen * 118ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen * Unless required by applicable law or agreed to in writing, software 128ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen * distributed under the License is distributed on an "AS IS" BASIS, 138ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 148ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen * See the License for the specific language governing permissions and 158ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen * limitations under the License. 164670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen * 178ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen ******************************************************************************/ 18789d5d85ba6e9259a8e0f0bcfbd06a59ad164512Pete Cooper 19d68f458244b9d9a6644a9550dd5cee60331c9e7dJakob Stoklund Olesen/****************************************************************************** 20f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen * 21c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen * This file contains action functions for advanced audio/video main state 228ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen * machine. 231ead68d769f27f6d68d4aaeffe4199fa2cacbc95Jakob Stoklund Olesen * 248ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen ******************************************************************************/ 258ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen 266a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen#include "bt_target.h" 276a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen#if defined(BTA_AV_INCLUDED) && (BTA_AV_INCLUDED == TRUE) 288ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen 298ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen#include <string.h> 308ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen#include "bta_av_api.h" 31dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "bta_av_int.h" 32dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "avdt_api.h" 334670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen#include "bd.h" 344670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen#include "utl.h" 35e9bd4ea5fda4957c373a3bbc14803d9670041dccJakob Stoklund Olesen#include "l2c_api.h" 36e9bd4ea5fda4957c373a3bbc14803d9670041dccJakob Stoklund Olesen#if( defined BTA_AR_INCLUDED ) && (BTA_AR_INCLUDED == TRUE) 37bdda37d7fbafe6876f248341837423a4100f95a5Jakob Stoklund Olesen#include "bta_ar_api.h" 384670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen#endif 398ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen 408ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen/***************************************************************************** 418ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen** Constants 428ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen*****************************************************************************/ 431b847deb26b52051de39f4cbecd224c9fbd0d1c2Jakob Stoklund Olesen/* the timer in milliseconds to wait for open req after setconfig for incoming connections */ 44f2c6e367c1c0d8797e62e58a3ccdb8cceee27987Jakob Stoklund Olesen#ifndef BTA_AV_SIG_TIME_VAL 45f2c6e367c1c0d8797e62e58a3ccdb8cceee27987Jakob Stoklund Olesen#define BTA_AV_SIG_TIME_VAL 8000 461b847deb26b52051de39f4cbecd224c9fbd0d1c2Jakob Stoklund Olesen#endif 471b847deb26b52051de39f4cbecd224c9fbd0d1c2Jakob Stoklund Olesen 48078628465b73348b5608ec6aa2d7181679543903Jakob Stoklund Olesen/* In millisec to wait for signalling from SNK when it is initiated from SNK. */ 49078628465b73348b5608ec6aa2d7181679543903Jakob Stoklund Olesen/* If not, we will start signalling from SRC. */ 501b847deb26b52051de39f4cbecd224c9fbd0d1c2Jakob Stoklund Olesen#ifndef BTA_AV_ACP_SIG_TIME_VAL 51dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define BTA_AV_ACP_SIG_TIME_VAL 2000 521a7744501a80351ce31fcecad42c8e35823bc081Jakob Stoklund Olesen#endif 538ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen 548ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesenstatic void bta_av_acp_sig_timer_cback (TIMER_LIST_ENT *p_tle); 55b5fa9333431673aac2ced8dea80152349a85cf6fJakob Stoklund Olesen 56db529a8a5d071610f3a8b467693bc40b073e68efJakob Stoklund Olesen/******************************************************************************* 57db529a8a5d071610f3a8b467693bc40b073e68efJakob Stoklund Olesen** 58dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines** Function bta_av_get_rcb_by_shdl 597d6b6a05b549da70b4473f015c97954c2a422724Jakob Stoklund Olesen** 608ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen** Description find the RCB associated with the given SCB handle. 618ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen** 621a7744501a80351ce31fcecad42c8e35823bc081Jakob Stoklund Olesen** Returns tBTA_AV_RCB 631a7744501a80351ce31fcecad42c8e35823bc081Jakob Stoklund Olesen** 641a7744501a80351ce31fcecad42c8e35823bc081Jakob Stoklund Olesen*******************************************************************************/ 651a7744501a80351ce31fcecad42c8e35823bc081Jakob Stoklund OlesentBTA_AV_RCB * bta_av_get_rcb_by_shdl(UINT8 shdl) 662aad2f6e601328d15033944ea51ad6f66a7f3c0aJakob Stoklund Olesen{ 671a7744501a80351ce31fcecad42c8e35823bc081Jakob Stoklund Olesen tBTA_AV_RCB *p_rcb = NULL; 681a7744501a80351ce31fcecad42c8e35823bc081Jakob Stoklund Olesen int i; 691a7744501a80351ce31fcecad42c8e35823bc081Jakob Stoklund Olesen 701a7744501a80351ce31fcecad42c8e35823bc081Jakob Stoklund Olesen for (i=0; i<BTA_AV_NUM_RCB; i++) 711a7744501a80351ce31fcecad42c8e35823bc081Jakob Stoklund Olesen { 721a7744501a80351ce31fcecad42c8e35823bc081Jakob Stoklund Olesen if (bta_av_cb.rcb[i].shdl == shdl && bta_av_cb.rcb[i].handle != BTA_AV_RC_HANDLE_NONE) 732aad2f6e601328d15033944ea51ad6f66a7f3c0aJakob Stoklund Olesen { 741a7744501a80351ce31fcecad42c8e35823bc081Jakob Stoklund Olesen p_rcb = &bta_av_cb.rcb[i]; 751a7744501a80351ce31fcecad42c8e35823bc081Jakob Stoklund Olesen break; 761a7744501a80351ce31fcecad42c8e35823bc081Jakob Stoklund Olesen } 771a7744501a80351ce31fcecad42c8e35823bc081Jakob Stoklund Olesen } 781a7744501a80351ce31fcecad42c8e35823bc081Jakob Stoklund Olesen return p_rcb; 791a7744501a80351ce31fcecad42c8e35823bc081Jakob Stoklund Olesen} 801a7744501a80351ce31fcecad42c8e35823bc081Jakob Stoklund Olesen#define BTA_AV_STS_NO_RSP 0xFF /* a number not used by tAVRC_STS */ 811a7744501a80351ce31fcecad42c8e35823bc081Jakob Stoklund Olesen 821e0bd63477da6e9b1dc5111bafba2b1cf143bfbaJakob Stoklund Olesen/******************************************************************************* 831e0bd63477da6e9b1dc5111bafba2b1cf143bfbaJakob Stoklund Olesen** 841e0bd63477da6e9b1dc5111bafba2b1cf143bfbaJakob Stoklund Olesen** Function bta_av_del_rc 855a96b3dad2f634c9081c8b2b6c2575441dc5a2bdEvan Cheng** 861a7744501a80351ce31fcecad42c8e35823bc081Jakob Stoklund Olesen** Description delete the given AVRC handle. 871a7744501a80351ce31fcecad42c8e35823bc081Jakob Stoklund Olesen** 881a7744501a80351ce31fcecad42c8e35823bc081Jakob Stoklund Olesen** Returns void 891e0bd63477da6e9b1dc5111bafba2b1cf143bfbaJakob Stoklund Olesen** 901a7744501a80351ce31fcecad42c8e35823bc081Jakob Stoklund Olesen*******************************************************************************/ 911a7744501a80351ce31fcecad42c8e35823bc081Jakob Stoklund Olesenvoid bta_av_del_rc(tBTA_AV_RCB *p_rcb) 921a7744501a80351ce31fcecad42c8e35823bc081Jakob Stoklund Olesen{ 931a7744501a80351ce31fcecad42c8e35823bc081Jakob Stoklund Olesen tBTA_AV_SCB *p_scb; 942aad2f6e601328d15033944ea51ad6f66a7f3c0aJakob Stoklund Olesen UINT8 rc_handle; /* connected AVRCP handle */ 951a7744501a80351ce31fcecad42c8e35823bc081Jakob Stoklund Olesen 962aad2f6e601328d15033944ea51ad6f66a7f3c0aJakob Stoklund Olesen if(p_rcb->handle != BTA_AV_RC_HANDLE_NONE) 972aad2f6e601328d15033944ea51ad6f66a7f3c0aJakob Stoklund Olesen { 982aad2f6e601328d15033944ea51ad6f66a7f3c0aJakob Stoklund Olesen if(p_rcb->shdl) 992aad2f6e601328d15033944ea51ad6f66a7f3c0aJakob Stoklund Olesen { 1002aad2f6e601328d15033944ea51ad6f66a7f3c0aJakob Stoklund Olesen p_scb = bta_av_cb.p_scb[p_rcb->shdl - 1]; 1012aad2f6e601328d15033944ea51ad6f66a7f3c0aJakob Stoklund Olesen if(p_scb) 1022aad2f6e601328d15033944ea51ad6f66a7f3c0aJakob Stoklund Olesen { 1032aad2f6e601328d15033944ea51ad6f66a7f3c0aJakob Stoklund Olesen APPL_TRACE_DEBUG3("bta_av_del_rc shdl:%d, srch:%d rc_handle:%d", p_rcb->shdl, 1042aad2f6e601328d15033944ea51ad6f66a7f3c0aJakob Stoklund Olesen p_scb->rc_handle, p_rcb->handle); 1052aad2f6e601328d15033944ea51ad6f66a7f3c0aJakob Stoklund Olesen if(p_scb->rc_handle == p_rcb->handle) 1062aad2f6e601328d15033944ea51ad6f66a7f3c0aJakob Stoklund Olesen p_scb->rc_handle = BTA_AV_RC_HANDLE_NONE; 1072aad2f6e601328d15033944ea51ad6f66a7f3c0aJakob Stoklund Olesen /* just in case the RC timer is active 1082aad2f6e601328d15033944ea51ad6f66a7f3c0aJakob Stoklund Olesen if(bta_av_cb.features & BTA_AV_FEAT_RCCT && p_scb->chnl == BTA_AV_CHNL_AUDIO) */ 1092aad2f6e601328d15033944ea51ad6f66a7f3c0aJakob Stoklund Olesen bta_sys_stop_timer(&p_scb->timer); 1102aad2f6e601328d15033944ea51ad6f66a7f3c0aJakob Stoklund Olesen } 1112aad2f6e601328d15033944ea51ad6f66a7f3c0aJakob Stoklund Olesen } 1126a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen 1136a0dc079efe7acf7e71cc4c0948fe814f35ba091Jakob Stoklund Olesen APPL_TRACE_EVENT4("bta_av_del_rc handle: %d status=0x%x, rc_acp_handle:%d, idx:%d", 11474c4f97a466513e45e66e04469973fdcd5865300Jakob Stoklund Olesen p_rcb->handle, p_rcb->status, bta_av_cb.rc_acp_handle, bta_av_cb.rc_acp_idx); 11574c4f97a466513e45e66e04469973fdcd5865300Jakob Stoklund Olesen rc_handle = p_rcb->handle; 11674c4f97a466513e45e66e04469973fdcd5865300Jakob Stoklund Olesen if(!(p_rcb->status & BTA_AV_RC_CONN_MASK) || 11774c4f97a466513e45e66e04469973fdcd5865300Jakob Stoklund Olesen ((p_rcb->status & BTA_AV_RC_ROLE_MASK) == BTA_AV_RC_ROLE_INT) ) 11874c4f97a466513e45e66e04469973fdcd5865300Jakob Stoklund Olesen { 11974c4f97a466513e45e66e04469973fdcd5865300Jakob Stoklund Olesen p_rcb->status = 0; 12074c4f97a466513e45e66e04469973fdcd5865300Jakob Stoklund Olesen p_rcb->handle = BTA_AV_RC_HANDLE_NONE; 12174c4f97a466513e45e66e04469973fdcd5865300Jakob Stoklund Olesen p_rcb->shdl = 0; 122078628465b73348b5608ec6aa2d7181679543903Jakob Stoklund Olesen p_rcb->lidx = 0; 123abff28087fd6be8150ff0e69def7de7312b2f76bJakob Stoklund Olesen } 124a2948ef5accab638371615f539ea9f9ec5ff5d03Jakob Stoklund Olesen /* else ACP && connected. do not clear the handle yet */ 125a2948ef5accab638371615f539ea9f9ec5ff5d03Jakob Stoklund Olesen AVRC_Close(rc_handle); 126a2948ef5accab638371615f539ea9f9ec5ff5d03Jakob Stoklund Olesen if (rc_handle == bta_av_cb.rc_acp_handle) 127a2948ef5accab638371615f539ea9f9ec5ff5d03Jakob Stoklund Olesen bta_av_cb.rc_acp_handle = BTA_AV_RC_HANDLE_NONE; 128a2948ef5accab638371615f539ea9f9ec5ff5d03Jakob Stoklund Olesen APPL_TRACE_EVENT4("end del_rc handle: %d status=0x%x, rc_acp_handle:%d, lidx:%d", 129a2948ef5accab638371615f539ea9f9ec5ff5d03Jakob Stoklund Olesen p_rcb->handle, p_rcb->status, bta_av_cb.rc_acp_handle, p_rcb->lidx); 130a2948ef5accab638371615f539ea9f9ec5ff5d03Jakob Stoklund Olesen } 131a2948ef5accab638371615f539ea9f9ec5ff5d03Jakob Stoklund Olesen} 132a2948ef5accab638371615f539ea9f9ec5ff5d03Jakob Stoklund Olesen 133a2948ef5accab638371615f539ea9f9ec5ff5d03Jakob Stoklund Olesen 134078628465b73348b5608ec6aa2d7181679543903Jakob Stoklund Olesen/******************************************************************************* 13536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines** 13636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines** Function bta_av_close_all_rc 13736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines** 138a2948ef5accab638371615f539ea9f9ec5ff5d03Jakob Stoklund Olesen** Description close the all AVRC handle. 139b5fa9333431673aac2ced8dea80152349a85cf6fJakob Stoklund Olesen** 1402b0f9e73d8623b21fc14335ef6208deab2629cdfJakob Stoklund Olesen** Returns void 141a2948ef5accab638371615f539ea9f9ec5ff5d03Jakob Stoklund Olesen** 142a2948ef5accab638371615f539ea9f9ec5ff5d03Jakob Stoklund Olesen*******************************************************************************/ 143a2948ef5accab638371615f539ea9f9ec5ff5d03Jakob Stoklund Olesenstatic void bta_av_close_all_rc(tBTA_AV_CB *p_cb) 144a2948ef5accab638371615f539ea9f9ec5ff5d03Jakob Stoklund Olesen{ 145a2948ef5accab638371615f539ea9f9ec5ff5d03Jakob Stoklund Olesen int i; 146a2948ef5accab638371615f539ea9f9ec5ff5d03Jakob Stoklund Olesen 1472b0f9e73d8623b21fc14335ef6208deab2629cdfJakob Stoklund Olesen for(i=0; i<BTA_AV_NUM_RCB; i++) 1482b0f9e73d8623b21fc14335ef6208deab2629cdfJakob Stoklund Olesen { 1492b0f9e73d8623b21fc14335ef6208deab2629cdfJakob Stoklund Olesen if ((p_cb->disabling == TRUE) || (bta_av_cb.rcb[i].shdl != 0)) 1505b220213bfe9c37c2bb41a7ae0804e06a14f1007Rafael Espindola bta_av_del_rc(&bta_av_cb.rcb[i]); 1517d6b6a05b549da70b4473f015c97954c2a422724Jakob Stoklund Olesen } 152bdda37d7fbafe6876f248341837423a4100f95a5Jakob Stoklund Olesen} 1532b0f9e73d8623b21fc14335ef6208deab2629cdfJakob Stoklund Olesen 1542b0f9e73d8623b21fc14335ef6208deab2629cdfJakob Stoklund Olesen/******************************************************************************* 1552b0f9e73d8623b21fc14335ef6208deab2629cdfJakob Stoklund Olesen** 156db529a8a5d071610f3a8b467693bc40b073e68efJakob Stoklund Olesen** Function bta_av_del_sdp_rec 157db529a8a5d071610f3a8b467693bc40b073e68efJakob Stoklund Olesen** 1582b0f9e73d8623b21fc14335ef6208deab2629cdfJakob Stoklund Olesen** Description delete the given SDP record handle. 1592b0f9e73d8623b21fc14335ef6208deab2629cdfJakob Stoklund Olesen** 1602b0f9e73d8623b21fc14335ef6208deab2629cdfJakob Stoklund Olesen** Returns void 1612b0f9e73d8623b21fc14335ef6208deab2629cdfJakob Stoklund Olesen** 1622b0f9e73d8623b21fc14335ef6208deab2629cdfJakob Stoklund Olesen*******************************************************************************/ 163ef1f5ccca7efaa18209523b31019d356d302f635Jakob Stoklund Olesenstatic void bta_av_del_sdp_rec(UINT32 *p_sdp_handle) 164db529a8a5d071610f3a8b467693bc40b073e68efJakob Stoklund Olesen{ 165db529a8a5d071610f3a8b467693bc40b073e68efJakob Stoklund Olesen if(*p_sdp_handle != 0) 166f4afdfc501b7185d24a0ef184fe3d0c0bbe22e0cJakob Stoklund Olesen { 1678ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen SDP_DeleteRecord(*p_sdp_handle); 1688ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen *p_sdp_handle = 0; 169f0ac26c51173a9a1d6e5b5794107dccc4c5b5792Jakob Stoklund Olesen } 170f0ac26c51173a9a1d6e5b5794107dccc4c5b5792Jakob Stoklund Olesen} 1712b0f9e73d8623b21fc14335ef6208deab2629cdfJakob Stoklund Olesen 172f4afdfc501b7185d24a0ef184fe3d0c0bbe22e0cJakob Stoklund Olesen/******************************************************************************* 173a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen** 174f0ac26c51173a9a1d6e5b5794107dccc4c5b5792Jakob Stoklund Olesen** Function bta_av_avrc_sdp_cback 1752b0f9e73d8623b21fc14335ef6208deab2629cdfJakob Stoklund Olesen** 176f0ac26c51173a9a1d6e5b5794107dccc4c5b5792Jakob Stoklund Olesen** Description AVRCP service discovery callback. 177f0ac26c51173a9a1d6e5b5794107dccc4c5b5792Jakob Stoklund Olesen** 178f0ac26c51173a9a1d6e5b5794107dccc4c5b5792Jakob Stoklund Olesen** Returns void 179f0ac26c51173a9a1d6e5b5794107dccc4c5b5792Jakob Stoklund Olesen** 180f0ac26c51173a9a1d6e5b5794107dccc4c5b5792Jakob Stoklund Olesen*******************************************************************************/ 181f0ac26c51173a9a1d6e5b5794107dccc4c5b5792Jakob Stoklund Olesenstatic void bta_av_avrc_sdp_cback(UINT16 status) 182f0ac26c51173a9a1d6e5b5794107dccc4c5b5792Jakob Stoklund Olesen{ 183f0ac26c51173a9a1d6e5b5794107dccc4c5b5792Jakob Stoklund Olesen BT_HDR *p_msg; 184f0ac26c51173a9a1d6e5b5794107dccc4c5b5792Jakob Stoklund Olesen UNUSED(status); 185f0ac26c51173a9a1d6e5b5794107dccc4c5b5792Jakob Stoklund Olesen 186f0ac26c51173a9a1d6e5b5794107dccc4c5b5792Jakob Stoklund Olesen if ((p_msg = (BT_HDR *) GKI_getbuf(sizeof(BT_HDR))) != NULL) 187f0ac26c51173a9a1d6e5b5794107dccc4c5b5792Jakob Stoklund Olesen { 188f0ac26c51173a9a1d6e5b5794107dccc4c5b5792Jakob Stoklund Olesen p_msg->event = BTA_AV_SDP_AVRC_DISC_EVT; 1896c8afd728eb02742ce320ecd39bcf3774d8423b7Jakob Stoklund Olesen bta_sys_sendmsg(p_msg); 19036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 191f0ac26c51173a9a1d6e5b5794107dccc4c5b5792Jakob Stoklund Olesen} 192a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen 1935b220213bfe9c37c2bb41a7ae0804e06a14f1007Rafael Espindola/******************************************************************************* 194a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen** 195a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen** Function bta_av_rc_ctrl_cback 196a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen** 197a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen** Description AVRCP control callback. 198a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen** 199a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen** Returns void 200a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen** 201a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen*******************************************************************************/ 202a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesenstatic void bta_av_rc_ctrl_cback(UINT8 handle, UINT8 event, UINT16 result, BD_ADDR peer_addr) 203a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen{ 204fe62d92b7bbaf73e576bec0c0b11cfa6c191aa87Jakob Stoklund Olesen tBTA_AV_RC_CONN_CHG *p_msg; 205fe62d92b7bbaf73e576bec0c0b11cfa6c191aa87Jakob Stoklund Olesen UINT16 msg_event = 0; 206f0ac26c51173a9a1d6e5b5794107dccc4c5b5792Jakob Stoklund Olesen UNUSED(result); 2076c8afd728eb02742ce320ecd39bcf3774d8423b7Jakob Stoklund Olesen 208fe62d92b7bbaf73e576bec0c0b11cfa6c191aa87Jakob Stoklund Olesen#if (defined(BTA_AV_MIN_DEBUG_TRACES) && BTA_AV_MIN_DEBUG_TRACES == TRUE) 209fe62d92b7bbaf73e576bec0c0b11cfa6c191aa87Jakob Stoklund Olesen APPL_TRACE_EVENT2("rc_ctrl handle: %d event=0x%x", handle, event); 210f0ac26c51173a9a1d6e5b5794107dccc4c5b5792Jakob Stoklund Olesen#else 211a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen APPL_TRACE_EVENT2("bta_av_rc_ctrl_cback handle: %d event=0x%x", handle, event); 212a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen#endif 213a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen if (event == AVRC_OPEN_IND_EVT) 21477ee1140a3297e6fbd6cb7cf586872af6d00d07eJakob Stoklund Olesen { 21577ee1140a3297e6fbd6cb7cf586872af6d00d07eJakob Stoklund Olesen /* save handle of opened connection 216331de11a0acc6a095b98914b5f05ff242c9d7819Matthias Braun bta_av_cb.rc_handle = handle;*/ 217fe62d92b7bbaf73e576bec0c0b11cfa6c191aa87Jakob Stoklund Olesen 218fe62d92b7bbaf73e576bec0c0b11cfa6c191aa87Jakob Stoklund Olesen msg_event = BTA_AV_AVRC_OPEN_EVT; 21977ee1140a3297e6fbd6cb7cf586872af6d00d07eJakob Stoklund Olesen } 22077ee1140a3297e6fbd6cb7cf586872af6d00d07eJakob Stoklund Olesen else if (event == AVRC_CLOSE_IND_EVT) 221a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen { 222a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen msg_event = BTA_AV_AVRC_CLOSE_EVT; 223a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen } 224a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen 225a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen if (msg_event) 226a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen { 227fe62d92b7bbaf73e576bec0c0b11cfa6c191aa87Jakob Stoklund Olesen if ((p_msg = (tBTA_AV_RC_CONN_CHG *) GKI_getbuf(sizeof(tBTA_AV_RC_CONN_CHG))) != NULL) 228a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen { 229a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen p_msg->hdr.event = msg_event; 23077ee1140a3297e6fbd6cb7cf586872af6d00d07eJakob Stoklund Olesen p_msg->handle = handle; 231a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen if(peer_addr) 232a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen bdcpy(p_msg->peer_addr, peer_addr); 233a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen bta_sys_sendmsg(p_msg); 234a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen } 235a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen } 236a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen} 237a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen 238a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen/******************************************************************************* 239fe62d92b7bbaf73e576bec0c0b11cfa6c191aa87Jakob Stoklund Olesen** 240a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen** Function bta_av_rc_msg_cback 241a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen** 242a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen** Description AVRCP message callback. 243a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen** 244fe62d92b7bbaf73e576bec0c0b11cfa6c191aa87Jakob Stoklund Olesen** Returns void 245a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen** 24677ee1140a3297e6fbd6cb7cf586872af6d00d07eJakob Stoklund Olesen*******************************************************************************/ 247331de11a0acc6a095b98914b5f05ff242c9d7819Matthias Braunstatic void bta_av_rc_msg_cback(UINT8 handle, UINT8 label, UINT8 opcode, tAVRC_MSG *p_msg) 248331de11a0acc6a095b98914b5f05ff242c9d7819Matthias Braun{ 24977ee1140a3297e6fbd6cb7cf586872af6d00d07eJakob Stoklund Olesen tBTA_AV_RC_MSG *p_buf; 25077ee1140a3297e6fbd6cb7cf586872af6d00d07eJakob Stoklund Olesen UINT8 *p_data = NULL; 251f0ac26c51173a9a1d6e5b5794107dccc4c5b5792Jakob Stoklund Olesen UINT8 **p_p_data = NULL; 252f0ac26c51173a9a1d6e5b5794107dccc4c5b5792Jakob Stoklund Olesen UINT16 data_len = 0; 253db529a8a5d071610f3a8b467693bc40b073e68efJakob Stoklund Olesen 254626d6fb1903e74337b257c5e165944bcd1273e65Jakob Stoklund Olesen#if (defined(BTA_AV_MIN_DEBUG_TRACES) && BTA_AV_MIN_DEBUG_TRACES == TRUE) 255a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen APPL_TRACE_ERROR2("rc_msg handle: %d opcode=0x%x", handle, opcode); 256a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen#else 257a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen APPL_TRACE_EVENT2("bta_av_rc_msg_cback handle: %d opcode=0x%x", handle, opcode); 258a2e79ef908e0f4179cda9e85e2f75057181bf321Jakob Stoklund Olesen#endif 259f0ac26c51173a9a1d6e5b5794107dccc4c5b5792Jakob Stoklund Olesen /* determine size of buffer we need */ 260f0ac26c51173a9a1d6e5b5794107dccc4c5b5792Jakob Stoklund Olesen if (opcode == AVRC_OP_VENDOR && p_msg->vendor.p_vendor_data != NULL) 2616c8afd728eb02742ce320ecd39bcf3774d8423b7Jakob Stoklund Olesen { 262f0ac26c51173a9a1d6e5b5794107dccc4c5b5792Jakob Stoklund Olesen p_data = p_msg->vendor.p_vendor_data; 263f0ac26c51173a9a1d6e5b5794107dccc4c5b5792Jakob Stoklund Olesen p_p_data = &p_msg->vendor.p_vendor_data; 264f0ac26c51173a9a1d6e5b5794107dccc4c5b5792Jakob Stoklund Olesen data_len = (UINT16) p_msg->vendor.vendor_len; 2656c8afd728eb02742ce320ecd39bcf3774d8423b7Jakob Stoklund Olesen } 266f0ac26c51173a9a1d6e5b5794107dccc4c5b5792Jakob Stoklund Olesen else if (opcode == AVRC_OP_PASS_THRU && p_msg->pass.p_pass_data != NULL) 267f0ac26c51173a9a1d6e5b5794107dccc4c5b5792Jakob Stoklund Olesen { 268f0ac26c51173a9a1d6e5b5794107dccc4c5b5792Jakob Stoklund Olesen p_data = p_msg->pass.p_pass_data; 269f0ac26c51173a9a1d6e5b5794107dccc4c5b5792Jakob Stoklund Olesen p_p_data = &p_msg->pass.p_pass_data; 270b2abfa0bf30edf292a27a06e091d03983e644c9bJakob Stoklund Olesen data_len = (UINT16) p_msg->pass.pass_len; 271b2abfa0bf30edf292a27a06e091d03983e644c9bJakob Stoklund Olesen } 2722b0f9e73d8623b21fc14335ef6208deab2629cdfJakob Stoklund Olesen 273f0ac26c51173a9a1d6e5b5794107dccc4c5b5792Jakob Stoklund Olesen if ((p_buf = (tBTA_AV_RC_MSG *) GKI_getbuf((UINT16) (sizeof(tBTA_AV_RC_MSG) + data_len))) != NULL) 274f0ac26c51173a9a1d6e5b5794107dccc4c5b5792Jakob Stoklund Olesen { 2759f4b893b84d9c2b56aa2abc3c96ce1e5ccc465e5Jakob Stoklund Olesen p_buf->hdr.event = BTA_AV_AVRC_MSG_EVT; 2769f4b893b84d9c2b56aa2abc3c96ce1e5ccc465e5Jakob Stoklund Olesen p_buf->handle = handle; 2779f4b893b84d9c2b56aa2abc3c96ce1e5ccc465e5Jakob Stoklund Olesen p_buf->label = label; 2789f4b893b84d9c2b56aa2abc3c96ce1e5ccc465e5Jakob Stoklund Olesen p_buf->opcode = opcode; 2799f4b893b84d9c2b56aa2abc3c96ce1e5ccc465e5Jakob Stoklund Olesen memcpy(&p_buf->msg, p_msg, sizeof(tAVRC_MSG)); 2809f4b893b84d9c2b56aa2abc3c96ce1e5ccc465e5Jakob Stoklund Olesen if (p_data != NULL) 2819f4b893b84d9c2b56aa2abc3c96ce1e5ccc465e5Jakob Stoklund Olesen { 2829f4b893b84d9c2b56aa2abc3c96ce1e5ccc465e5Jakob Stoklund Olesen memcpy((UINT8 *)(p_buf + 1), p_data, data_len); 2839f4b893b84d9c2b56aa2abc3c96ce1e5ccc465e5Jakob Stoklund Olesen *p_p_data = (UINT8 *)(p_buf + 1); 2849f4b893b84d9c2b56aa2abc3c96ce1e5ccc465e5Jakob Stoklund Olesen } 2859f4b893b84d9c2b56aa2abc3c96ce1e5ccc465e5Jakob Stoklund Olesen bta_sys_sendmsg(p_buf); 2869f4b893b84d9c2b56aa2abc3c96ce1e5ccc465e5Jakob Stoklund Olesen } 2879f4b893b84d9c2b56aa2abc3c96ce1e5ccc465e5Jakob Stoklund Olesen} 2889f4b893b84d9c2b56aa2abc3c96ce1e5ccc465e5Jakob Stoklund Olesen 2899f4b893b84d9c2b56aa2abc3c96ce1e5ccc465e5Jakob Stoklund Olesen/******************************************************************************* 2909f4b893b84d9c2b56aa2abc3c96ce1e5ccc465e5Jakob Stoklund Olesen** 2919f4b893b84d9c2b56aa2abc3c96ce1e5ccc465e5Jakob Stoklund Olesen** Function bta_av_rc_create 2929f4b893b84d9c2b56aa2abc3c96ce1e5ccc465e5Jakob Stoklund Olesen** 2939f4b893b84d9c2b56aa2abc3c96ce1e5ccc465e5Jakob Stoklund Olesen** Description alloc RCB and call AVRC_Open 2949f4b893b84d9c2b56aa2abc3c96ce1e5ccc465e5Jakob Stoklund Olesen** 2959f4b893b84d9c2b56aa2abc3c96ce1e5ccc465e5Jakob Stoklund Olesen** Returns the created rc handle 2969f4b893b84d9c2b56aa2abc3c96ce1e5ccc465e5Jakob Stoklund Olesen** 2979f4b893b84d9c2b56aa2abc3c96ce1e5ccc465e5Jakob Stoklund Olesen*******************************************************************************/ 29806c0f25499fd502668ca720b0fea4a4dfe6eb44aJakob Stoklund OlesenUINT8 bta_av_rc_create(tBTA_AV_CB *p_cb, UINT8 role, UINT8 shdl, UINT8 lidx) 29906c0f25499fd502668ca720b0fea4a4dfe6eb44aJakob Stoklund Olesen{ 30006c0f25499fd502668ca720b0fea4a4dfe6eb44aJakob Stoklund Olesen tAVRC_CONN_CB ccb; 30106c0f25499fd502668ca720b0fea4a4dfe6eb44aJakob Stoklund Olesen BD_ADDR_PTR bda = (BD_ADDR_PTR)bd_addr_any; 30206c0f25499fd502668ca720b0fea4a4dfe6eb44aJakob Stoklund Olesen UINT8 status = BTA_AV_RC_ROLE_ACP; 30306c0f25499fd502668ca720b0fea4a4dfe6eb44aJakob Stoklund Olesen tBTA_AV_SCB *p_scb = p_cb->p_scb[shdl - 1]; 30406c0f25499fd502668ca720b0fea4a4dfe6eb44aJakob Stoklund Olesen int i; 30506c0f25499fd502668ca720b0fea4a4dfe6eb44aJakob Stoklund Olesen UINT8 rc_handle; 30606c0f25499fd502668ca720b0fea4a4dfe6eb44aJakob Stoklund Olesen tBTA_AV_RCB *p_rcb; 30706c0f25499fd502668ca720b0fea4a4dfe6eb44aJakob Stoklund Olesen 30806c0f25499fd502668ca720b0fea4a4dfe6eb44aJakob Stoklund Olesen if(role == AVCT_INT) 30906c0f25499fd502668ca720b0fea4a4dfe6eb44aJakob Stoklund Olesen { 31006c0f25499fd502668ca720b0fea4a4dfe6eb44aJakob Stoklund Olesen bda = p_scb->peer_addr; 31106c0f25499fd502668ca720b0fea4a4dfe6eb44aJakob Stoklund Olesen status = BTA_AV_RC_ROLE_INT; 3128ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen } 3138ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen else 314078628465b73348b5608ec6aa2d7181679543903Jakob Stoklund Olesen { 315abff28087fd6be8150ff0e69def7de7312b2f76bJakob Stoklund Olesen if ((p_rcb = bta_av_get_rcb_by_shdl(shdl)) != NULL ) 3168ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen { 3178ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen APPL_TRACE_ERROR1("bta_av_rc_create ACP handle exist for shdl:%d", shdl); 318697483addf056595c997302f1316cc59244eefaaJakob Stoklund Olesen return p_rcb->handle; 319f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen } 3201c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen } 3211407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen 3221407c84242688dbcdbaa5b0296c18f46d102f25aJakob Stoklund Olesen ccb.p_ctrl_cback = bta_av_rc_ctrl_cback; 3231c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen ccb.p_msg_cback = bta_av_rc_msg_cback; 3241c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen ccb.company_id = p_bta_av_cfg->company_id; 3251c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen ccb.conn = role; 3261c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen /* note: BTA_AV_FEAT_RCTG = AVRC_CT_TARGET, BTA_AV_FEAT_RCCT = AVRC_CT_CONTROL */ 3274eed756153b84c211114a3e9186bf0cb55d4b394Benjamin Kramer ccb.control = p_cb->features & (BTA_AV_FEAT_RCTG | BTA_AV_FEAT_RCCT | AVRC_CT_PASSIVE); 3284eed756153b84c211114a3e9186bf0cb55d4b394Benjamin Kramer 3291c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen 3301c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen if (AVRC_Open(&rc_handle, &ccb, bda) != AVRC_SUCCESS) 3311c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen return BTA_AV_RC_HANDLE_NONE; 3321c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen 3331c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen i = rc_handle; 3344eed756153b84c211114a3e9186bf0cb55d4b394Benjamin Kramer p_rcb = &p_cb->rcb[i]; 335dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 3361c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen if (p_rcb->handle != BTA_AV_RC_HANDLE_NONE) 337708d06f7fb5dfd9c8559aea07b042a88c65645f8Jakob Stoklund Olesen { 3381c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen APPL_TRACE_ERROR1("bta_av_rc_create found duplicated handle:%d", rc_handle); 339bece06f0c6936527e2b1c72d09f7d3a949af9a47Jakob Stoklund Olesen } 340bece06f0c6936527e2b1c72d09f7d3a949af9a47Jakob Stoklund Olesen 341708d06f7fb5dfd9c8559aea07b042a88c65645f8Jakob Stoklund Olesen p_rcb->handle = rc_handle; 342708d06f7fb5dfd9c8559aea07b042a88c65645f8Jakob Stoklund Olesen p_rcb->status = status; 343708d06f7fb5dfd9c8559aea07b042a88c65645f8Jakob Stoklund Olesen p_rcb->shdl = shdl; 344bece06f0c6936527e2b1c72d09f7d3a949af9a47Jakob Stoklund Olesen p_rcb->lidx = lidx; 345bece06f0c6936527e2b1c72d09f7d3a949af9a47Jakob Stoklund Olesen p_rcb->peer_features = 0; 346bece06f0c6936527e2b1c72d09f7d3a949af9a47Jakob Stoklund Olesen if(lidx == (BTA_AV_NUM_LINKS + 1)) 347c1c622ef0dd29d1bafd580790aec5231af50abf2Jakob Stoklund Olesen { 348c1c622ef0dd29d1bafd580790aec5231af50abf2Jakob Stoklund Olesen /* this LIDX is reserved for the AVRCP ACP connection */ 349631390e3c26fe5581ee9468b04593cedf48cc908Jakob Stoklund Olesen p_cb->rc_acp_handle = p_rcb->handle; 350631390e3c26fe5581ee9468b04593cedf48cc908Jakob Stoklund Olesen p_cb->rc_acp_idx = (i + 1); 351c1c622ef0dd29d1bafd580790aec5231af50abf2Jakob Stoklund Olesen APPL_TRACE_DEBUG2("rc_acp_handle:%d idx:%d", p_cb->rc_acp_handle, p_cb->rc_acp_idx); 352631390e3c26fe5581ee9468b04593cedf48cc908Jakob Stoklund Olesen } 353631390e3c26fe5581ee9468b04593cedf48cc908Jakob Stoklund Olesen APPL_TRACE_DEBUG6("create %d, role: %d, shdl:%d, rc_handle:%d, lidx:%d, status:0x%x", 354bece06f0c6936527e2b1c72d09f7d3a949af9a47Jakob Stoklund Olesen i, role, shdl, p_rcb->handle, lidx, p_rcb->status); 3551c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen 3561c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen return rc_handle; 357dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines} 3581c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen 3591c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen/******************************************************************************* 360b720be6a50f4e1b3280d2b029ee38dda14577525Manman Ren** 3611c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen** Function bta_av_valid_group_navi_msg 3621c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen** 3631c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen** Description Check if it is Group Navigation Msg for Metadata 3641c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen** 3651c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen** Returns BTA_AV_RSP_ACCEPT or BTA_AV_RSP_NOT_IMPL. 3661c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen** 3671c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen*******************************************************************************/ 3681c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesenstatic tBTA_AV_CODE bta_av_group_navi_supported(UINT8 len, UINT8 *p_data, BOOLEAN is_inquiry) 3691c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen{ 370b3e9681cc0ea2d52a1f8cd09880656780dce4073Jakob Stoklund Olesen tBTA_AV_CODE ret=BTA_AV_RSP_NOT_IMPL; 37177e300e8f0b8db8eec448cae9c87d7c5bfad9757Manman Ren UINT8 *p_ptr = p_data; 372b3e9681cc0ea2d52a1f8cd09880656780dce4073Jakob Stoklund Olesen UINT16 u16; 3731c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen UINT32 u32; 3741c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen 3751c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen if (p_bta_av_cfg->avrc_group && len == BTA_GROUP_NAVI_MSG_OP_DATA_LEN) 3761c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen { 3771c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen BTA_AV_BE_STREAM_TO_CO_ID(u32, p_ptr); 378a2cae58411b36a58f658f9402e8d039add31ae4dJakob Stoklund Olesen BE_STREAM_TO_UINT16(u16, p_ptr); 3791feb5854aeeda897e9318c8193d187673c8576b8Mark Lacey 3801c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen if (u32 == AVRC_CO_METADATA) 3811c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen { 3823b1088a2cc15a39c7a7b8dd95a56143f1dda6863Jakob Stoklund Olesen if (is_inquiry) 3831c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen { 3841c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen if (u16 <= AVRC_PDU_PREV_GROUP) 3851c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen ret = BTA_AV_RSP_IMPL_STBL; 386393bfcb263fa46e4badc73c6aa56306986f94dcfJakob Stoklund Olesen } 387393bfcb263fa46e4badc73c6aa56306986f94dcfJakob Stoklund Olesen else 3881c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen { 3891c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen if (u16 <= AVRC_PDU_PREV_GROUP) 3901c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen ret = BTA_AV_RSP_ACCEPT; 3911c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen else 3921c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen ret = BTA_AV_RSP_REJ; 3931c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen } 3941c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen } 395393bfcb263fa46e4badc73c6aa56306986f94dcfJakob Stoklund Olesen } 3961c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen 397331de11a0acc6a095b98914b5f05ff242c9d7819Matthias Braun return ret; 398393bfcb263fa46e4badc73c6aa56306986f94dcfJakob Stoklund Olesen} 399393bfcb263fa46e4badc73c6aa56306986f94dcfJakob Stoklund Olesen 4001c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen/******************************************************************************* 4011c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen** 4021c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen** Function bta_av_op_supported 4031c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen** 404331de11a0acc6a095b98914b5f05ff242c9d7819Matthias Braun** Description Check if remote control operation is supported. 4051c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen** 4061c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen** Returns BTA_AV_RSP_ACCEPT of supported, BTA_AV_RSP_NOT_IMPL if not. 4079ca2aeb2d223d11fd01b0bb8f13fe7f3a969714dJakob Stoklund Olesen** 4089ca2aeb2d223d11fd01b0bb8f13fe7f3a969714dJakob Stoklund Olesen*******************************************************************************/ 409393bfcb263fa46e4badc73c6aa56306986f94dcfJakob Stoklund Olesenstatic tBTA_AV_CODE bta_av_op_supported(tBTA_AV_RC rc_id, BOOLEAN is_inquiry) 4101c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen{ 411393bfcb263fa46e4badc73c6aa56306986f94dcfJakob Stoklund Olesen tBTA_AV_CODE ret_code = BTA_AV_RSP_NOT_IMPL; 412393bfcb263fa46e4badc73c6aa56306986f94dcfJakob Stoklund Olesen 4131c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen if (p_bta_av_rc_id) 414393bfcb263fa46e4badc73c6aa56306986f94dcfJakob Stoklund Olesen { 415393bfcb263fa46e4badc73c6aa56306986f94dcfJakob Stoklund Olesen if (is_inquiry) 416393bfcb263fa46e4badc73c6aa56306986f94dcfJakob Stoklund Olesen { 417393bfcb263fa46e4badc73c6aa56306986f94dcfJakob Stoklund Olesen if (p_bta_av_rc_id[rc_id >> 4] & (1 << (rc_id & 0x0F))) 4181c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen { 419393bfcb263fa46e4badc73c6aa56306986f94dcfJakob Stoklund Olesen ret_code = BTA_AV_RSP_IMPL_STBL; 4201c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen } 4211c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen } 4221c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen else 4231c38ba6355a019b7fc3baa0d0ab31e8ba11f7db1Jakob Stoklund Olesen { 4241feb5854aeeda897e9318c8193d187673c8576b8Mark Lacey if (p_bta_av_rc_id[rc_id >> 4] & (1 << (rc_id & 0x0F))) 425331de11a0acc6a095b98914b5f05ff242c9d7819Matthias Braun { 426393bfcb263fa46e4badc73c6aa56306986f94dcfJakob Stoklund Olesen ret_code = BTA_AV_RSP_ACCEPT; 427dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 428e5a2e366322ef5f0d597b1fb8dbf55f2cf36cf15Jakob Stoklund Olesen else if ((p_bta_av_cfg->rc_pass_rsp == BTA_AV_RSP_INTERIM) && p_bta_av_rc_id_ac) 429e5a2e366322ef5f0d597b1fb8dbf55f2cf36cf15Jakob Stoklund Olesen { 4300f43811903f10394f7088f4634c0b4f9668cbac0Eric Christopher if (p_bta_av_rc_id_ac[rc_id >> 4] & (1 << (rc_id & 0x0F))) 431cfa7134a9c33c0c7f8dda359c89dc6763a258e07Jakob Stoklund Olesen { 432cfa7134a9c33c0c7f8dda359c89dc6763a258e07Jakob Stoklund Olesen ret_code = BTA_AV_RSP_INTERIM; 433cfa7134a9c33c0c7f8dda359c89dc6763a258e07Jakob Stoklund Olesen } 434cfa7134a9c33c0c7f8dda359c89dc6763a258e07Jakob Stoklund Olesen } 435dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 436cfa7134a9c33c0c7f8dda359c89dc6763a258e07Jakob Stoklund Olesen 4371feb5854aeeda897e9318c8193d187673c8576b8Mark Lacey } 438cfa7134a9c33c0c7f8dda359c89dc6763a258e07Jakob Stoklund Olesen return ret_code; 439bb30dd40ed0873e39fec4dfa321091a0c8d1abfcJakob Stoklund Olesen} 440bb30dd40ed0873e39fec4dfa321091a0c8d1abfcJakob Stoklund Olesen 441bb30dd40ed0873e39fec4dfa321091a0c8d1abfcJakob Stoklund Olesen/******************************************************************************* 442bb30dd40ed0873e39fec4dfa321091a0c8d1abfcJakob Stoklund Olesen** 443cfa7134a9c33c0c7f8dda359c89dc6763a258e07Jakob Stoklund Olesen** Function bta_av_find_lcb 444cfa7134a9c33c0c7f8dda359c89dc6763a258e07Jakob Stoklund Olesen** 4458a06af96698537377275dd7848db69915638dd26Pete Cooper** Description Given BD_addr, find the associated LCB. 4468a06af96698537377275dd7848db69915638dd26Pete Cooper** 447e9bd4ea5fda4957c373a3bbc14803d9670041dccJakob Stoklund Olesen** Returns NULL, if not found. 448cfa7134a9c33c0c7f8dda359c89dc6763a258e07Jakob Stoklund Olesen** 449cfa7134a9c33c0c7f8dda359c89dc6763a258e07Jakob Stoklund Olesen*******************************************************************************/ 4500f43811903f10394f7088f4634c0b4f9668cbac0Eric ChristophertBTA_AV_LCB * bta_av_find_lcb(BD_ADDR addr, UINT8 op) 451a2cae58411b36a58f658f9402e8d039add31ae4dJakob Stoklund Olesen{ 452bb30dd40ed0873e39fec4dfa321091a0c8d1abfcJakob Stoklund Olesen tBTA_AV_CB *p_cb = &bta_av_cb; 4532debd48ca790ac01be6e12e094fdf4fdcadc8364Jakob Stoklund Olesen int xx; 454e9bd4ea5fda4957c373a3bbc14803d9670041dccJakob Stoklund Olesen UINT8 mask; 455cfa7134a9c33c0c7f8dda359c89dc6763a258e07Jakob Stoklund Olesen tBTA_AV_LCB *p_lcb = NULL; 456cfa7134a9c33c0c7f8dda359c89dc6763a258e07Jakob Stoklund Olesen 457cfa7134a9c33c0c7f8dda359c89dc6763a258e07Jakob Stoklund Olesen for(xx=0; xx<BTA_AV_NUM_LINKS; xx++) 4583b1088a2cc15a39c7a7b8dd95a56143f1dda6863Jakob Stoklund Olesen { 459cfa7134a9c33c0c7f8dda359c89dc6763a258e07Jakob Stoklund Olesen mask = 1 << xx; /* the used mask for this lcb */ 460cfa7134a9c33c0c7f8dda359c89dc6763a258e07Jakob Stoklund Olesen if((mask & p_cb->conn_lcb) && 0 ==( bdcmp(p_cb->lcb[xx].addr, addr))) 461f6a129a24b866635c3c51edf08749755f952b5f2Jakob Stoklund Olesen { 462e1b43c3b4000ee7201fcac8d1c8e75bb9fb547e3Jakob Stoklund Olesen p_lcb = &p_cb->lcb[xx]; 4630f43811903f10394f7088f4634c0b4f9668cbac0Eric Christopher if(op == BTA_AV_LCB_FREE) 464a2cae58411b36a58f658f9402e8d039add31ae4dJakob Stoklund Olesen { 465e742d687369f79702894b6cf302e1f222c5d7432Mark Lacey p_cb->conn_lcb &= ~mask; /* clear the connect mask */ 4660f43811903f10394f7088f4634c0b4f9668cbac0Eric Christopher APPL_TRACE_DEBUG1("conn_lcb: 0x%x", p_cb->conn_lcb); 4670f43811903f10394f7088f4634c0b4f9668cbac0Eric Christopher } 468a2cae58411b36a58f658f9402e8d039add31ae4dJakob Stoklund Olesen break; 469e742d687369f79702894b6cf302e1f222c5d7432Mark Lacey } 470e1b43c3b4000ee7201fcac8d1c8e75bb9fb547e3Jakob Stoklund Olesen } 471e1b43c3b4000ee7201fcac8d1c8e75bb9fb547e3Jakob Stoklund Olesen return p_lcb; 472e1b43c3b4000ee7201fcac8d1c8e75bb9fb547e3Jakob Stoklund Olesen} 473e1b43c3b4000ee7201fcac8d1c8e75bb9fb547e3Jakob Stoklund Olesen 474e1b43c3b4000ee7201fcac8d1c8e75bb9fb547e3Jakob Stoklund Olesen/******************************************************************************* 475e1b43c3b4000ee7201fcac8d1c8e75bb9fb547e3Jakob Stoklund Olesen** 47687360f73ae205854f100ba5fb7eef7b90ac3bc27Jakob Stoklund Olesen** Function bta_av_rc_opened 477e1b43c3b4000ee7201fcac8d1c8e75bb9fb547e3Jakob Stoklund Olesen** 478f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen** Description Set AVRCP state to opened. 479f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen** 480207c868c9210663d401b7f5ce5cae7c3e0943849Jakob Stoklund Olesen** Returns void 4810f43811903f10394f7088f4634c0b4f9668cbac0Eric Christopher** 4829b24afe41e06572f901edf2e78ef71fb228db29eJakob Stoklund Olesen*******************************************************************************/ 483207c868c9210663d401b7f5ce5cae7c3e0943849Jakob Stoklund Olesenvoid bta_av_rc_opened(tBTA_AV_CB *p_cb, tBTA_AV_DATA *p_data) 484a2cae58411b36a58f658f9402e8d039add31ae4dJakob Stoklund Olesen{ 485f6a129a24b866635c3c51edf08749755f952b5f2Jakob Stoklund Olesen tBTA_AV_RC_OPEN rc_open; 4869b24afe41e06572f901edf2e78ef71fb228db29eJakob Stoklund Olesen tBTA_AV_SCB *p_scb; 487207c868c9210663d401b7f5ce5cae7c3e0943849Jakob Stoklund Olesen int i; 488f1b05f2b0ef48cb80b064e2f792b38c626822fc0Jakob Stoklund Olesen UINT8 shdl = 0; 489207c868c9210663d401b7f5ce5cae7c3e0943849Jakob Stoklund Olesen tBTA_AV_LCB *p_lcb; 490078628465b73348b5608ec6aa2d7181679543903Jakob Stoklund Olesen tBTA_AV_RCB *p_rcb; 491f6a129a24b866635c3c51edf08749755f952b5f2Jakob Stoklund Olesen UINT8 tmp; 492cfa7134a9c33c0c7f8dda359c89dc6763a258e07Jakob Stoklund Olesen UINT8 disc = 0; 493207c868c9210663d401b7f5ce5cae7c3e0943849Jakob Stoklund Olesen 494207c868c9210663d401b7f5ce5cae7c3e0943849Jakob Stoklund Olesen /* find the SCB & stop the timer */ 495f1b05f2b0ef48cb80b064e2f792b38c626822fc0Jakob Stoklund Olesen for(i=0; i<BTA_AV_NUM_STRS; i++) 496f1b05f2b0ef48cb80b064e2f792b38c626822fc0Jakob Stoklund Olesen { 49787360f73ae205854f100ba5fb7eef7b90ac3bc27Jakob Stoklund Olesen p_scb = p_cb->p_scb[i]; 49887360f73ae205854f100ba5fb7eef7b90ac3bc27Jakob Stoklund Olesen if(p_scb && bdcmp(p_scb->peer_addr, p_data->rc_conn_chg.peer_addr) == 0) 49987360f73ae205854f100ba5fb7eef7b90ac3bc27Jakob Stoklund Olesen { 50087360f73ae205854f100ba5fb7eef7b90ac3bc27Jakob Stoklund Olesen p_scb->rc_handle = p_data->rc_conn_chg.handle; 50187360f73ae205854f100ba5fb7eef7b90ac3bc27Jakob Stoklund Olesen APPL_TRACE_DEBUG2("bta_av_rc_opened shdl:%d, srch %d", i + 1, p_scb->rc_handle); 50287360f73ae205854f100ba5fb7eef7b90ac3bc27Jakob Stoklund Olesen shdl = i+1; 50387360f73ae205854f100ba5fb7eef7b90ac3bc27Jakob Stoklund Olesen APPL_TRACE_ERROR1("use_rc:%d", p_scb->use_rc); 50487360f73ae205854f100ba5fb7eef7b90ac3bc27Jakob Stoklund Olesen bta_sys_stop_timer(&p_scb->timer); 50587360f73ae205854f100ba5fb7eef7b90ac3bc27Jakob Stoklund Olesen disc = p_scb->hndl; 50687360f73ae205854f100ba5fb7eef7b90ac3bc27Jakob Stoklund Olesen break; 50787360f73ae205854f100ba5fb7eef7b90ac3bc27Jakob Stoklund Olesen } 50887360f73ae205854f100ba5fb7eef7b90ac3bc27Jakob Stoklund Olesen } 50987360f73ae205854f100ba5fb7eef7b90ac3bc27Jakob Stoklund Olesen 51087360f73ae205854f100ba5fb7eef7b90ac3bc27Jakob Stoklund Olesen i = p_data->rc_conn_chg.handle; 51136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if (p_cb->rcb[i].handle == BTA_AV_RC_HANDLE_NONE) 51287360f73ae205854f100ba5fb7eef7b90ac3bc27Jakob Stoklund Olesen { 51387360f73ae205854f100ba5fb7eef7b90ac3bc27Jakob Stoklund Olesen APPL_TRACE_ERROR1("not a valid handle:%d any more", i); 51487360f73ae205854f100ba5fb7eef7b90ac3bc27Jakob Stoklund Olesen return; 515207c868c9210663d401b7f5ce5cae7c3e0943849Jakob Stoklund Olesen } 5160f43811903f10394f7088f4634c0b4f9668cbac0Eric Christopher 517207c868c9210663d401b7f5ce5cae7c3e0943849Jakob Stoklund Olesen 518207c868c9210663d401b7f5ce5cae7c3e0943849Jakob Stoklund Olesen if (p_cb->rcb[i].lidx == (BTA_AV_NUM_LINKS + 1) && shdl != 0) 519207c868c9210663d401b7f5ce5cae7c3e0943849Jakob Stoklund Olesen { 520a2cae58411b36a58f658f9402e8d039add31ae4dJakob Stoklund Olesen /* rc is opened on the RC only ACP channel, but is for a specific 521f6a129a24b866635c3c51edf08749755f952b5f2Jakob Stoklund Olesen * SCB -> need to switch RCBs */ 5229b24afe41e06572f901edf2e78ef71fb228db29eJakob Stoklund Olesen p_rcb = bta_av_get_rcb_by_shdl(shdl); 523207c868c9210663d401b7f5ce5cae7c3e0943849Jakob Stoklund Olesen if (p_rcb) 524f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen { 5259b24afe41e06572f901edf2e78ef71fb228db29eJakob Stoklund Olesen p_rcb->shdl = p_cb->rcb[i].shdl; 526207c868c9210663d401b7f5ce5cae7c3e0943849Jakob Stoklund Olesen tmp = p_rcb->lidx; 52774c4f97a466513e45e66e04469973fdcd5865300Jakob Stoklund Olesen p_rcb->lidx = p_cb->rcb[i].lidx; 528207c868c9210663d401b7f5ce5cae7c3e0943849Jakob Stoklund Olesen p_cb->rcb[i].lidx = tmp; 5290f43811903f10394f7088f4634c0b4f9668cbac0Eric Christopher p_cb->rc_acp_handle = p_rcb->handle; 530207c868c9210663d401b7f5ce5cae7c3e0943849Jakob Stoklund Olesen p_cb->rc_acp_idx = (p_rcb - p_cb->rcb) + 1; 531f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen APPL_TRACE_DEBUG2("switching RCB rc_acp_handle:%d idx:%d", 532f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen p_cb->rc_acp_handle, p_cb->rc_acp_idx); 533078628465b73348b5608ec6aa2d7181679543903Jakob Stoklund Olesen } 5347536f72a97ad25c3652fdfe26d392fd78b6ea7b9Jakob Stoklund Olesen } 535078628465b73348b5608ec6aa2d7181679543903Jakob Stoklund Olesen 536f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen p_cb->rcb[i].shdl = shdl; 537f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen rc_open.rc_handle = i; 5387536f72a97ad25c3652fdfe26d392fd78b6ea7b9Jakob Stoklund Olesen APPL_TRACE_ERROR4("bta_av_rc_opened rcb[%d] shdl:%d lidx:%d/%d", 5390f43811903f10394f7088f4634c0b4f9668cbac0Eric Christopher i, shdl, p_cb->rcb[i].lidx, p_cb->lcb[BTA_AV_NUM_LINKS].lidx); 5400f43811903f10394f7088f4634c0b4f9668cbac0Eric Christopher p_cb->rcb[i].status |= BTA_AV_RC_CONN_MASK; 5410f43811903f10394f7088f4634c0b4f9668cbac0Eric Christopher 5420f43811903f10394f7088f4634c0b4f9668cbac0Eric Christopher if(!shdl && 0 == p_cb->lcb[BTA_AV_NUM_LINKS].lidx) 543f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen { 544f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen /* no associated SCB -> connected to an RC only device 545207c868c9210663d401b7f5ce5cae7c3e0943849Jakob Stoklund Olesen * update the index to the extra LCB */ 5460f43811903f10394f7088f4634c0b4f9668cbac0Eric Christopher p_lcb = &p_cb->lcb[BTA_AV_NUM_LINKS]; 5479b24afe41e06572f901edf2e78ef71fb228db29eJakob Stoklund Olesen bdcpy(p_lcb->addr, p_data->rc_conn_chg.peer_addr); 548f1b05f2b0ef48cb80b064e2f792b38c626822fc0Jakob Stoklund Olesen APPL_TRACE_DEBUG6("rc_only bd_addr:%02x-%02x-%02x-%02x-%02x-%02x", 549f6a129a24b866635c3c51edf08749755f952b5f2Jakob Stoklund Olesen p_lcb->addr[0], p_lcb->addr[1], 550ebac0c1747d20e48f359d76dd454444107080d83Jakob Stoklund Olesen p_lcb->addr[2], p_lcb->addr[3], 551ebac0c1747d20e48f359d76dd454444107080d83Jakob Stoklund Olesen p_lcb->addr[4], p_lcb->addr[5]); 552f6a129a24b866635c3c51edf08749755f952b5f2Jakob Stoklund Olesen p_lcb->lidx = BTA_AV_NUM_LINKS + 1; 5539b24afe41e06572f901edf2e78ef71fb228db29eJakob Stoklund Olesen p_cb->rcb[i].lidx = p_lcb->lidx; 554ebac0c1747d20e48f359d76dd454444107080d83Jakob Stoklund Olesen p_lcb->conn_msk = 1; 555f1b05f2b0ef48cb80b064e2f792b38c626822fc0Jakob Stoklund Olesen APPL_TRACE_ERROR3("rcb[%d].lidx=%d, lcb.conn_msk=x%x", 556207c868c9210663d401b7f5ce5cae7c3e0943849Jakob Stoklund Olesen i, p_cb->rcb[i].lidx, p_lcb->conn_msk); 557ebac0c1747d20e48f359d76dd454444107080d83Jakob Stoklund Olesen disc = p_data->rc_conn_chg.handle|BTA_AV_CHNL_MSK; 55801cb34b0111a1e8792f327b56c51bc3bbaf83acaJakob Stoklund Olesen } 559ebac0c1747d20e48f359d76dd454444107080d83Jakob Stoklund Olesen 560ebac0c1747d20e48f359d76dd454444107080d83Jakob Stoklund Olesen bdcpy(rc_open.peer_addr, p_data->rc_conn_chg.peer_addr); 561ebac0c1747d20e48f359d76dd454444107080d83Jakob Stoklund Olesen rc_open.peer_features = p_cb->rcb[i].peer_features; 562ebac0c1747d20e48f359d76dd454444107080d83Jakob Stoklund Olesen rc_open.status = BTA_AV_SUCCESS; 563ebac0c1747d20e48f359d76dd454444107080d83Jakob Stoklund Olesen APPL_TRACE_DEBUG2("local features:x%x peer_features:x%x", p_cb->features, 564ebac0c1747d20e48f359d76dd454444107080d83Jakob Stoklund Olesen rc_open.peer_features); 565ebac0c1747d20e48f359d76dd454444107080d83Jakob Stoklund Olesen if(rc_open.peer_features == 0) 566ebac0c1747d20e48f359d76dd454444107080d83Jakob Stoklund Olesen { 567ebac0c1747d20e48f359d76dd454444107080d83Jakob Stoklund Olesen /* we have not done SDP on peer RC capabilities. 568ebac0c1747d20e48f359d76dd454444107080d83Jakob Stoklund Olesen * peer must have initiated the RC connection */ 569ebac0c1747d20e48f359d76dd454444107080d83Jakob Stoklund Olesen rc_open.peer_features = BTA_AV_FEAT_RCCT; 570ebac0c1747d20e48f359d76dd454444107080d83Jakob Stoklund Olesen bta_av_rc_disc(disc); 571ebac0c1747d20e48f359d76dd454444107080d83Jakob Stoklund Olesen } 57236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines (*p_cb->p_cback)(BTA_AV_RC_OPEN_EVT, (tBTA_AV *) &rc_open); 573207c868c9210663d401b7f5ce5cae7c3e0943849Jakob Stoklund Olesen 574f1b05f2b0ef48cb80b064e2f792b38c626822fc0Jakob Stoklund Olesen} 575f1b05f2b0ef48cb80b064e2f792b38c626822fc0Jakob Stoklund Olesen 5769b057771ba22441b8d312404204433477b4be657Jakob Stoklund Olesen 5779b057771ba22441b8d312404204433477b4be657Jakob Stoklund Olesen/******************************************************************************* 5789b057771ba22441b8d312404204433477b4be657Jakob Stoklund Olesen** 5799b057771ba22441b8d312404204433477b4be657Jakob Stoklund Olesen** Function bta_av_rc_remote_cmd 5809b057771ba22441b8d312404204433477b4be657Jakob Stoklund Olesen** 581fc47933db5c8fea9bc89470d83cc5af7ca36f2a3Jakob Stoklund Olesen** Description Send an AVRCP remote control command. 582a2cae58411b36a58f658f9402e8d039add31ae4dJakob Stoklund Olesen** 5839b057771ba22441b8d312404204433477b4be657Jakob Stoklund Olesen** Returns void 5849b057771ba22441b8d312404204433477b4be657Jakob Stoklund Olesen** 5859b057771ba22441b8d312404204433477b4be657Jakob Stoklund Olesen*******************************************************************************/ 5869b057771ba22441b8d312404204433477b4be657Jakob Stoklund Olesenvoid bta_av_rc_remote_cmd(tBTA_AV_CB *p_cb, tBTA_AV_DATA *p_data) 5879b057771ba22441b8d312404204433477b4be657Jakob Stoklund Olesen{ 5889b057771ba22441b8d312404204433477b4be657Jakob Stoklund Olesen tBTA_AV_RCB *p_rcb; 5899b057771ba22441b8d312404204433477b4be657Jakob Stoklund Olesen if (p_cb->features & BTA_AV_FEAT_RCCT) 5909b057771ba22441b8d312404204433477b4be657Jakob Stoklund Olesen { 5919b057771ba22441b8d312404204433477b4be657Jakob Stoklund Olesen if(p_data->hdr.layer_specific < BTA_AV_NUM_RCB) 5929b057771ba22441b8d312404204433477b4be657Jakob Stoklund Olesen { 5939b057771ba22441b8d312404204433477b4be657Jakob Stoklund Olesen p_rcb = &p_cb->rcb[p_data->hdr.layer_specific]; 5949b057771ba22441b8d312404204433477b4be657Jakob Stoklund Olesen if(p_rcb->status & BTA_AV_RC_CONN_MASK) 595207c868c9210663d401b7f5ce5cae7c3e0943849Jakob Stoklund Olesen { 5960f43811903f10394f7088f4634c0b4f9668cbac0Eric Christopher AVRC_PassCmd(p_rcb->handle, p_data->api_remote_cmd.label, 597078628465b73348b5608ec6aa2d7181679543903Jakob Stoklund Olesen &p_data->api_remote_cmd.msg); 5989b24afe41e06572f901edf2e78ef71fb228db29eJakob Stoklund Olesen } 5997536f72a97ad25c3652fdfe26d392fd78b6ea7b9Jakob Stoklund Olesen } 600a2cae58411b36a58f658f9402e8d039add31ae4dJakob Stoklund Olesen } 601f6a129a24b866635c3c51edf08749755f952b5f2Jakob Stoklund Olesen} 6029b24afe41e06572f901edf2e78ef71fb228db29eJakob Stoklund Olesen 603207c868c9210663d401b7f5ce5cae7c3e0943849Jakob Stoklund Olesen/******************************************************************************* 6047536f72a97ad25c3652fdfe26d392fd78b6ea7b9Jakob Stoklund Olesen** 6057536f72a97ad25c3652fdfe26d392fd78b6ea7b9Jakob Stoklund Olesen** Function bta_av_rc_vendor_cmd 6060f43811903f10394f7088f4634c0b4f9668cbac0Eric Christopher** 607cfa7134a9c33c0c7f8dda359c89dc6763a258e07Jakob Stoklund Olesen** Description Send an AVRCP vendor specific command. 6080f43811903f10394f7088f4634c0b4f9668cbac0Eric Christopher** 6090f43811903f10394f7088f4634c0b4f9668cbac0Eric Christopher** Returns void 610207c868c9210663d401b7f5ce5cae7c3e0943849Jakob Stoklund Olesen** 611f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen*******************************************************************************/ 612f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesenvoid bta_av_rc_vendor_cmd(tBTA_AV_CB *p_cb, tBTA_AV_DATA *p_data) 6135c716bdccce2fa504e1aa0b67226165d181d2459Jakob Stoklund Olesen{ 6145c716bdccce2fa504e1aa0b67226165d181d2459Jakob Stoklund Olesen tBTA_AV_RCB *p_rcb; 615a2cae58411b36a58f658f9402e8d039add31ae4dJakob Stoklund Olesen if ( (p_cb->features & (BTA_AV_FEAT_RCCT | BTA_AV_FEAT_VENDOR)) == 616194eb71a11a77c7fb576780783a77e64924dfb10Jakob Stoklund Olesen (BTA_AV_FEAT_RCCT | BTA_AV_FEAT_VENDOR)) 6175c716bdccce2fa504e1aa0b67226165d181d2459Jakob Stoklund Olesen { 6185c716bdccce2fa504e1aa0b67226165d181d2459Jakob Stoklund Olesen if(p_data->hdr.layer_specific < BTA_AV_NUM_RCB) 6195c716bdccce2fa504e1aa0b67226165d181d2459Jakob Stoklund Olesen { 6205c716bdccce2fa504e1aa0b67226165d181d2459Jakob Stoklund Olesen p_rcb = &p_cb->rcb[p_data->hdr.layer_specific]; 621abcc73e8ba3131c7c4f198840ece31453a0101acJakob Stoklund Olesen AVRC_VendorCmd(p_rcb->handle, p_data->api_vendor.label, &p_data->api_vendor.msg); 622b3dd82670aa60cacba81f090d292722c3ef44354Jakob Stoklund Olesen } 623393bfcb263fa46e4badc73c6aa56306986f94dcfJakob Stoklund Olesen } 6245c716bdccce2fa504e1aa0b67226165d181d2459Jakob Stoklund Olesen} 6255c716bdccce2fa504e1aa0b67226165d181d2459Jakob Stoklund Olesen 6265c716bdccce2fa504e1aa0b67226165d181d2459Jakob Stoklund Olesen/******************************************************************************* 6275c716bdccce2fa504e1aa0b67226165d181d2459Jakob Stoklund Olesen** 6285c716bdccce2fa504e1aa0b67226165d181d2459Jakob Stoklund Olesen** Function bta_av_rc_vendor_rsp 629b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen** 630b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen** Description Send an AVRCP vendor specific response. 631b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen** 632b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen** Returns void 633b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen** 6341feb5854aeeda897e9318c8193d187673c8576b8Mark Lacey*******************************************************************************/ 635b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesenvoid bta_av_rc_vendor_rsp(tBTA_AV_CB *p_cb, tBTA_AV_DATA *p_data) 636b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen{ 637b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen tBTA_AV_RCB *p_rcb; 638b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen if ( (p_cb->features & (BTA_AV_FEAT_RCTG | BTA_AV_FEAT_VENDOR)) == 639b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen (BTA_AV_FEAT_RCTG | BTA_AV_FEAT_VENDOR)) 640b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen { 641b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen if(p_data->hdr.layer_specific < BTA_AV_NUM_RCB) 642b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen { 643b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen p_rcb = &p_cb->rcb[p_data->hdr.layer_specific]; 644b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen AVRC_VendorRsp(p_rcb->handle, p_data->api_vendor.label, &p_data->api_vendor.msg); 645b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen } 646b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen } 647b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen} 648b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen 649b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen/******************************************************************************* 650b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen** 651b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen** Function bta_av_rc_meta_rsp 652b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen** 653b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen** Description Send an AVRCP metadata/advanced control command/response. 654b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen** 655b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen** Returns void 656b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen** 657b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen*******************************************************************************/ 658b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesenvoid bta_av_rc_meta_rsp(tBTA_AV_CB *p_cb, tBTA_AV_DATA *p_data) 6591599a64277f3a01619b5614974be9bec662c7ec0Jakob Stoklund Olesen{ 660b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen tBTA_AV_RCB *p_rcb; 661b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen BOOLEAN free = TRUE; 662b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen 663b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen if ((p_cb->features & BTA_AV_FEAT_METADATA) && (p_data->hdr.layer_specific < BTA_AV_NUM_RCB)) 664b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen { 665b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen if ((p_data->api_meta_rsp.is_rsp && (p_cb->features & BTA_AV_FEAT_RCTG)) || 666b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen (!p_data->api_meta_rsp.is_rsp && (p_cb->features & BTA_AV_FEAT_RCCT)) ) 667b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen { 668393bfcb263fa46e4badc73c6aa56306986f94dcfJakob Stoklund Olesen p_rcb = &p_cb->rcb[p_data->hdr.layer_specific]; 669b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen if (p_rcb->handle != BTA_AV_RC_HANDLE_NONE) { 6702debd48ca790ac01be6e12e094fdf4fdcadc8364Jakob Stoklund Olesen AVRC_MsgReq(p_rcb->handle, p_data->api_meta_rsp.label, 671b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen p_data->api_meta_rsp.rsp_code, 672b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen p_data->api_meta_rsp.p_pkt); 673b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen free = FALSE; 674b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen } 675b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen } 676b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen } 677c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen 678c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen if (free) 679c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen GKI_freebuf (p_data->api_meta_rsp.p_pkt); 680c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen} 681c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen 682c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen/******************************************************************************* 683c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen** 684c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen** Function bta_av_rc_free_rsp 685c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen** 686c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen** Description free an AVRCP metadata command buffer. 687c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen** 688c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen** Returns void 689c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen** 690c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen*******************************************************************************/ 691c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesenvoid bta_av_rc_free_rsp (tBTA_AV_CB *p_cb, tBTA_AV_DATA *p_data) 692c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen{ 693c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen UNUSED(p_cb); 694c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen 695c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen GKI_freebuf (p_data->api_meta_rsp.p_pkt); 696c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen} 697c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen 698c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen/******************************************************************************* 699c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen** 700c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen** Function bta_av_rc_meta_req 701c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen** 702c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen** Description Send an AVRCP metadata command. 703c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen** 704c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen** Returns void 705c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen** 706c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen*******************************************************************************/ 707c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesenvoid bta_av_rc_free_msg (tBTA_AV_CB *p_cb, tBTA_AV_DATA *p_data) 708c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen{ 709c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen UNUSED(p_cb); 710c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen UNUSED(p_data); 711c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen} 712c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen 713c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen 714c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen 715c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen/******************************************************************************* 716c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen** 717c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen** Function bta_av_chk_notif_evt_id 718c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen** 719c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen** Description make sure the requested player id is valid. 720c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen** 721c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen** Returns BTA_AV_STS_NO_RSP, if no error 722c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen** 723c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen*******************************************************************************/ 724c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesenstatic tAVRC_STS bta_av_chk_notif_evt_id(tAVRC_MSG_VENDOR *p_vendor) 725c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen{ 726c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen tAVRC_STS status = BTA_AV_STS_NO_RSP; 727c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen UINT8 xx; 728c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen UINT16 u16; 729c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen UINT8 *p = p_vendor->p_vendor_data + 2; 730c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen 731b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen BE_STREAM_TO_UINT16 (u16, p); 732b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen /* double check the fixed length */ 7331feb5854aeeda897e9318c8193d187673c8576b8Mark Lacey if ((u16 != 5) || (p_vendor->vendor_len != 9)) 734b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen { 735b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen status = AVRC_STS_INTERNAL_ERR; 736b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen } 737b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen else 738b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen { 739b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen /* make sure the player_id is valid */ 740b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen for (xx=0; xx<p_bta_av_cfg->num_evt_ids; xx++) 741b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen { 742b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen if (*p == p_bta_av_cfg->p_meta_evt_ids[xx]) 743b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen { 744b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen break; 745b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen } 7461599a64277f3a01619b5614974be9bec662c7ec0Jakob Stoklund Olesen } 7471599a64277f3a01619b5614974be9bec662c7ec0Jakob Stoklund Olesen if (xx == p_bta_av_cfg->num_evt_ids) 748b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen { 749b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen status = AVRC_STS_BAD_PARAM; 750b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen } 751b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen } 752b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen 753b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen return status; 754b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen} 755b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen 756b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen/******************************************************************************* 757b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen** 758b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen** Function bta_av_proc_meta_cmd 759b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen** 760b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen** Description Process an AVRCP metadata command from the peer. 761b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen** 762b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen** Returns TRUE to respond immediately 763b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen** 764b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen*******************************************************************************/ 765b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund OlesentBTA_AV_EVT bta_av_proc_meta_cmd(tAVRC_RESPONSE *p_rc_rsp, tBTA_AV_RC_MSG *p_msg, UINT8 *p_ctype) 766b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen{ 767b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen tBTA_AV_EVT evt = BTA_AV_META_MSG_EVT; 768b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen UINT8 u8, pdu, *p; 769393bfcb263fa46e4badc73c6aa56306986f94dcfJakob Stoklund Olesen UINT16 u16; 770b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen tAVRC_MSG_VENDOR *p_vendor = &p_msg->msg.vendor; 771b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen 772b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen#if (AVRC_METADATA_INCLUDED == TRUE) 773b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen 774b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen pdu = *(p_vendor->p_vendor_data); 775b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen p_rc_rsp->pdu = pdu; 776b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen *p_ctype = AVRC_RSP_REJ; 777b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen /* Metadata messages only use PANEL sub-unit type */ 778b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen if (p_vendor->hdr.subunit_type != AVRC_SUB_PANEL) 779b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen { 780b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen APPL_TRACE_DEBUG0("SUBUNIT must be PANEL"); 781b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen /* reject it */ 782b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen evt=0; 783b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen p_vendor->hdr.ctype = BTA_AV_RSP_NOT_IMPL; 784b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen AVRC_VendorRsp(p_msg->handle, p_msg->label, &p_msg->msg.vendor); 785b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen } 786b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen else if (!AVRC_IsValidAvcType(pdu, p_vendor->hdr.ctype) ) 787b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen { 788b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen APPL_TRACE_DEBUG2("Invalid pdu/ctype: 0x%x, %d", pdu, p_vendor->hdr.ctype); 789b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen /* reject invalid message without reporting to app */ 790b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen evt = 0; 791b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen p_rc_rsp->rsp.status = AVRC_STS_BAD_CMD; 792b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen } 793b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen else 794b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen { 795b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen switch (pdu) 796b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen { 797b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen case AVRC_PDU_GET_CAPABILITIES: 798b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen /* process GetCapabilities command without reporting the event to app */ 799b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen evt = 0; 800b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen u8 = *(p_vendor->p_vendor_data + 4); 801b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen p = p_vendor->p_vendor_data + 2; 802b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen p_rc_rsp->get_caps.capability_id = u8; 803b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen BE_STREAM_TO_UINT16 (u16, p); 804c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen if ((u16 != 1) || (p_vendor->vendor_len != 5)) 805c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen { 806c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen p_rc_rsp->get_caps.status = AVRC_STS_INTERNAL_ERR; 807c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen } 808c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen else 809b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen { 810b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen p_rc_rsp->get_caps.status = AVRC_STS_NO_ERROR; 811c4c633852fbb8ab9ef2679b679d2862746d2fa3eJakob Stoklund Olesen if (u8 == AVRC_CAP_COMPANY_ID) 81274c4f97a466513e45e66e04469973fdcd5865300Jakob Stoklund Olesen { 813b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen *p_ctype = AVRC_RSP_IMPL_STBL; 814b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen p_rc_rsp->get_caps.count = p_bta_av_cfg->num_co_ids; 815b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen memcpy(p_rc_rsp->get_caps.param.company_id, p_bta_av_cfg->p_meta_co_ids, 816b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen (p_bta_av_cfg->num_co_ids << 2)); 817b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen } 818b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen else if (u8 == AVRC_CAP_EVENTS_SUPPORTED) 819b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen { 820b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen *p_ctype = AVRC_RSP_IMPL_STBL; 8211599a64277f3a01619b5614974be9bec662c7ec0Jakob Stoklund Olesen p_rc_rsp->get_caps.count = p_bta_av_cfg->num_evt_ids; 8221599a64277f3a01619b5614974be9bec662c7ec0Jakob Stoklund Olesen memcpy(p_rc_rsp->get_caps.param.event_id, p_bta_av_cfg->p_meta_evt_ids, 823b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen p_bta_av_cfg->num_evt_ids); 824b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen } 825b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen else 826b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen { 827b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen APPL_TRACE_DEBUG1("Invalid capability ID: 0x%x", u8); 828393bfcb263fa46e4badc73c6aa56306986f94dcfJakob Stoklund Olesen /* reject - unknown capability ID */ 829b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen p_rc_rsp->get_caps.status = AVRC_STS_BAD_PARAM; 830b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen } 831b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen } 832b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen break; 833b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen 83444b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen 835abcc73e8ba3131c7c4f198840ece31453a0101acJakob Stoklund Olesen case AVRC_PDU_REGISTER_NOTIFICATION: 83644b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen /* make sure the event_id is implemented */ 8374670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen p_rc_rsp->rsp.status = bta_av_chk_notif_evt_id (p_vendor); 8384670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen if (p_rc_rsp->rsp.status != BTA_AV_STS_NO_RSP) 839a2cae58411b36a58f658f9402e8d039add31ae4dJakob Stoklund Olesen evt = 0; 840a2cae58411b36a58f658f9402e8d039add31ae4dJakob Stoklund Olesen break; 8414670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen 8424670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen } 8434670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen } 8444670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen#else 8454670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen APPL_TRACE_DEBUG0("AVRCP 1.3 Metadata not supporteed. Reject command."); 8464670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen /* reject invalid message without reporting to app */ 8474670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen evt = 0; 8484670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen p_rc_rsp->rsp.status = AVRC_STS_BAD_CMD; 8494670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen#endif 8504670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen 8514670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen return evt; 8524670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen} 8534670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen 8544670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen 8554670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen/******************************************************************************* 8564670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen** 8574670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen** Function bta_av_rc_msg 8584670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen** 8594670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen** Description Process an AVRCP message from the peer. 8604670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen** 86144b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen** Returns void 86244b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen** 8634670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen*******************************************************************************/ 864e25dde550baec1f79caf2fc06edd74e7ae6ffa33Matthias Braunvoid bta_av_rc_msg(tBTA_AV_CB *p_cb, tBTA_AV_DATA *p_data) 86544b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen{ 86644b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen tBTA_AV_EVT evt = 0; 867393bfcb263fa46e4badc73c6aa56306986f94dcfJakob Stoklund Olesen tBTA_AV av; 868393bfcb263fa46e4badc73c6aa56306986f94dcfJakob Stoklund Olesen BT_HDR *p_pkt = NULL; 8694670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen tAVRC_MSG_VENDOR *p_vendor = &p_data->rc_msg.msg.vendor; 870e25dde550baec1f79caf2fc06edd74e7ae6ffa33Matthias Braun BOOLEAN is_inquiry = ((p_data->rc_msg.msg.hdr.ctype == AVRC_CMD_SPEC_INQ) || p_data->rc_msg.msg.hdr.ctype == AVRC_CMD_GEN_INQ); 87144b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen#if (AVRC_METADATA_INCLUDED == TRUE) 87244b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen tAVRC_STS res; 87344b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen UINT8 ctype; 87444b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen tAVRC_RESPONSE rc_rsp; 875393bfcb263fa46e4badc73c6aa56306986f94dcfJakob Stoklund Olesen 876393bfcb263fa46e4badc73c6aa56306986f94dcfJakob Stoklund Olesen rc_rsp.rsp.status = BTA_AV_STS_NO_RSP; 877393bfcb263fa46e4badc73c6aa56306986f94dcfJakob Stoklund Olesen#endif 8784670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen 87944b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen if (p_data->rc_msg.opcode == AVRC_OP_PASS_THRU) 88044b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen { 88144b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen /* if this is a pass thru command */ 88244b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen if ((p_data->rc_msg.msg.hdr.ctype == AVRC_CMD_CTRL) || 883c1c622ef0dd29d1bafd580790aec5231af50abf2Jakob Stoklund Olesen (p_data->rc_msg.msg.hdr.ctype == AVRC_CMD_SPEC_INQ) || 884c1c622ef0dd29d1bafd580790aec5231af50abf2Jakob Stoklund Olesen (p_data->rc_msg.msg.hdr.ctype == AVRC_CMD_GEN_INQ) 88544b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen ) 88644b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen { 88744b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen /* check if operation is supported */ 88844b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen if (p_data->rc_msg.msg.pass.op_id == AVRC_ID_VENDOR) 88944b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen { 89036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines p_data->rc_msg.msg.hdr.ctype = BTA_AV_RSP_NOT_IMPL; 89144b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen#if (AVRC_METADATA_INCLUDED == TRUE) 89244b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen if (p_cb->features & BTA_AV_FEAT_METADATA) 89344b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen p_data->rc_msg.msg.hdr.ctype = 894e25dde550baec1f79caf2fc06edd74e7ae6ffa33Matthias Braun bta_av_group_navi_supported(p_data->rc_msg.msg.pass.pass_len, 89544b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen p_data->rc_msg.msg.pass.p_pass_data, is_inquiry); 89644b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen#endif 89744b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen } 898b5a457c4cbc71db6ae313ef1bf8eadac65767ab0Jakob Stoklund Olesen else 899c1c622ef0dd29d1bafd580790aec5231af50abf2Jakob Stoklund Olesen { 900b5a457c4cbc71db6ae313ef1bf8eadac65767ab0Jakob Stoklund Olesen p_data->rc_msg.msg.hdr.ctype = bta_av_op_supported(p_data->rc_msg.msg.pass.op_id, is_inquiry); 90144b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen } 90244b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen 90344b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen APPL_TRACE_DEBUG1("ctype %d",p_data->rc_msg.msg.hdr.ctype) 90444b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen 90544b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen /* send response */ 90644b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen if (p_data->rc_msg.msg.hdr.ctype != BTA_AV_RSP_INTERIM) 90744b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen AVRC_PassRsp(p_data->rc_msg.handle, p_data->rc_msg.label, &p_data->rc_msg.msg.pass); 90844b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen 90944b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen /* set up for callback if supported */ 91044b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen if (p_data->rc_msg.msg.hdr.ctype == BTA_AV_RSP_ACCEPT || p_data->rc_msg.msg.hdr.ctype == BTA_AV_RSP_INTERIM) 91144b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen { 91244b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen evt = BTA_AV_REMOTE_CMD_EVT; 91344b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen av.remote_cmd.rc_id = p_data->rc_msg.msg.pass.op_id; 914e25dde550baec1f79caf2fc06edd74e7ae6ffa33Matthias Braun av.remote_cmd.key_state = p_data->rc_msg.msg.pass.state; 91544b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen av.remote_cmd.p_data = p_data->rc_msg.msg.pass.p_pass_data; 916b5a457c4cbc71db6ae313ef1bf8eadac65767ab0Jakob Stoklund Olesen av.remote_cmd.len = p_data->rc_msg.msg.pass.pass_len; 917c1c622ef0dd29d1bafd580790aec5231af50abf2Jakob Stoklund Olesen memcpy(&av.remote_cmd.hdr, &p_data->rc_msg.msg.hdr, sizeof (tAVRC_HDR)); 91844b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen av.remote_cmd.label = p_data->rc_msg.label; 919b5a457c4cbc71db6ae313ef1bf8eadac65767ab0Jakob Stoklund Olesen } 920b5a457c4cbc71db6ae313ef1bf8eadac65767ab0Jakob Stoklund Olesen } 92144b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen /* else if this is a pass thru response */ 922e25dde550baec1f79caf2fc06edd74e7ae6ffa33Matthias Braun else if (p_data->rc_msg.msg.hdr.ctype >= AVRC_RSP_ACCEPT) 92344b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen { 924b5a457c4cbc71db6ae313ef1bf8eadac65767ab0Jakob Stoklund Olesen /* set up for callback */ 925e25dde550baec1f79caf2fc06edd74e7ae6ffa33Matthias Braun evt = BTA_AV_REMOTE_RSP_EVT; 926dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines av.remote_rsp.rc_id = p_data->rc_msg.msg.pass.op_id; 92744b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen av.remote_rsp.key_state = p_data->rc_msg.msg.pass.state; 92844b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen av.remote_rsp.rsp_code = p_data->rc_msg.msg.hdr.ctype; 92944b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen av.remote_rsp.label = p_data->rc_msg.label; 93044b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen } 93144b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen /* must be a bad ctype -> reject*/ 9324670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen else 9334670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen { 9344670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen p_data->rc_msg.msg.hdr.ctype = BTA_AV_RSP_REJ; 9354670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen AVRC_PassRsp(p_data->rc_msg.handle, p_data->rc_msg.label, &p_data->rc_msg.msg.pass); 93644b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen } 937631390e3c26fe5581ee9468b04593cedf48cc908Jakob Stoklund Olesen } 938c1c622ef0dd29d1bafd580790aec5231af50abf2Jakob Stoklund Olesen /* else if this is a vendor specific command or response */ 939631390e3c26fe5581ee9468b04593cedf48cc908Jakob Stoklund Olesen else if (p_data->rc_msg.opcode == AVRC_OP_VENDOR) 94044b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen { 9414670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen /* set up for callback */ 9424670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen av.vendor_cmd.code = p_data->rc_msg.msg.hdr.ctype; 9434670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen av.vendor_cmd.company_id = p_vendor->company_id; 944e2dc0c978e2435dbbb55cb7fca7750034c3e292aJakob Stoklund Olesen av.vendor_cmd.label = p_data->rc_msg.label; 945e2dc0c978e2435dbbb55cb7fca7750034c3e292aJakob Stoklund Olesen av.vendor_cmd.p_data = p_vendor->p_vendor_data; 946a2cae58411b36a58f658f9402e8d039add31ae4dJakob Stoklund Olesen av.vendor_cmd.len = p_vendor->vendor_len; 947a2cae58411b36a58f658f9402e8d039add31ae4dJakob Stoklund Olesen 948e2dc0c978e2435dbbb55cb7fca7750034c3e292aJakob Stoklund Olesen /* if configured to support vendor specific and it's a command */ 949e2dc0c978e2435dbbb55cb7fca7750034c3e292aJakob Stoklund Olesen if ((p_cb->features & BTA_AV_FEAT_VENDOR) && 950e2dc0c978e2435dbbb55cb7fca7750034c3e292aJakob Stoklund Olesen p_data->rc_msg.msg.hdr.ctype <= AVRC_CMD_GEN_INQ) 951e2dc0c978e2435dbbb55cb7fca7750034c3e292aJakob Stoklund Olesen { 952e25dde550baec1f79caf2fc06edd74e7ae6ffa33Matthias Braun#if (AVRC_METADATA_INCLUDED == TRUE) 953abcc73e8ba3131c7c4f198840ece31453a0101acJakob Stoklund Olesen if ((p_cb->features & BTA_AV_FEAT_METADATA) && 954e2dc0c978e2435dbbb55cb7fca7750034c3e292aJakob Stoklund Olesen (p_vendor->company_id == AVRC_CO_METADATA)) 955e2dc0c978e2435dbbb55cb7fca7750034c3e292aJakob Stoklund Olesen { 956e2dc0c978e2435dbbb55cb7fca7750034c3e292aJakob Stoklund Olesen av.meta_msg.p_msg = &p_data->rc_msg.msg; 957abcc73e8ba3131c7c4f198840ece31453a0101acJakob Stoklund Olesen evt = bta_av_proc_meta_cmd (&rc_rsp, &p_data->rc_msg, &ctype); 958abcc73e8ba3131c7c4f198840ece31453a0101acJakob Stoklund Olesen } 959e2dc0c978e2435dbbb55cb7fca7750034c3e292aJakob Stoklund Olesen else 960e2dc0c978e2435dbbb55cb7fca7750034c3e292aJakob Stoklund Olesen#endif 961abcc73e8ba3131c7c4f198840ece31453a0101acJakob Stoklund Olesen evt = BTA_AV_VENDOR_CMD_EVT; 962abcc73e8ba3131c7c4f198840ece31453a0101acJakob Stoklund Olesen } 963e2dc0c978e2435dbbb55cb7fca7750034c3e292aJakob Stoklund Olesen /* else if configured to support vendor specific and it's a response */ 964e25dde550baec1f79caf2fc06edd74e7ae6ffa33Matthias Braun else if ((p_cb->features & BTA_AV_FEAT_VENDOR) && 965e2dc0c978e2435dbbb55cb7fca7750034c3e292aJakob Stoklund Olesen p_data->rc_msg.msg.hdr.ctype >= AVRC_RSP_ACCEPT) 966e2dc0c978e2435dbbb55cb7fca7750034c3e292aJakob Stoklund Olesen { 967e2dc0c978e2435dbbb55cb7fca7750034c3e292aJakob Stoklund Olesen#if (AVRC_METADATA_INCLUDED == TRUE) 968e2dc0c978e2435dbbb55cb7fca7750034c3e292aJakob Stoklund Olesen if ((p_cb->features & BTA_AV_FEAT_METADATA) && 969e2dc0c978e2435dbbb55cb7fca7750034c3e292aJakob Stoklund Olesen (p_vendor->company_id == AVRC_CO_METADATA)) 970a2cae58411b36a58f658f9402e8d039add31ae4dJakob Stoklund Olesen { 9714670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen av.meta_msg.p_msg = &p_data->rc_msg.msg; 972a2cae58411b36a58f658f9402e8d039add31ae4dJakob Stoklund Olesen evt = BTA_AV_META_MSG_EVT; 973078628465b73348b5608ec6aa2d7181679543903Jakob Stoklund Olesen } 97436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines else 9757466927b1af264b359c860cb9f7d1f3b275cc5cdJakob Stoklund Olesen#endif 9767466927b1af264b359c860cb9f7d1f3b275cc5cdJakob Stoklund Olesen evt = BTA_AV_VENDOR_RSP_EVT; 9770f43811903f10394f7088f4634c0b4f9668cbac0Eric Christopher 9787466927b1af264b359c860cb9f7d1f3b275cc5cdJakob Stoklund Olesen } 9797466927b1af264b359c860cb9f7d1f3b275cc5cdJakob Stoklund Olesen /* else if not configured to support vendor specific and it's a command */ 9807466927b1af264b359c860cb9f7d1f3b275cc5cdJakob Stoklund Olesen else if (!(p_cb->features & BTA_AV_FEAT_VENDOR) && 9817466927b1af264b359c860cb9f7d1f3b275cc5cdJakob Stoklund Olesen p_data->rc_msg.msg.hdr.ctype <= AVRC_CMD_GEN_INQ) 9827466927b1af264b359c860cb9f7d1f3b275cc5cdJakob Stoklund Olesen { 983a372d16f92392bb4cd4184783466f0300a51a9aeJakob Stoklund Olesen if(p_data->rc_msg.msg.vendor.p_vendor_data[0] == AVRC_PDU_INVALID) 984b09701db9e74298912164d988ddf40bb1b5ec19bJakob Stoklund Olesen { 985b09701db9e74298912164d988ddf40bb1b5ec19bJakob Stoklund Olesen /* reject it */ 986b09701db9e74298912164d988ddf40bb1b5ec19bJakob Stoklund Olesen p_data->rc_msg.msg.hdr.ctype = BTA_AV_RSP_REJ; 987078628465b73348b5608ec6aa2d7181679543903Jakob Stoklund Olesen p_data->rc_msg.msg.vendor.p_vendor_data[4] = AVRC_STS_BAD_CMD; 988b09701db9e74298912164d988ddf40bb1b5ec19bJakob Stoklund Olesen } 9892debd48ca790ac01be6e12e094fdf4fdcadc8364Jakob Stoklund Olesen else 9900f43811903f10394f7088f4634c0b4f9668cbac0Eric Christopher p_data->rc_msg.msg.hdr.ctype = BTA_AV_RSP_NOT_IMPL; 9910f43811903f10394f7088f4634c0b4f9668cbac0Eric Christopher AVRC_VendorRsp(p_data->rc_msg.handle, p_data->rc_msg.label, &p_data->rc_msg.msg.vendor); 9920f43811903f10394f7088f4634c0b4f9668cbac0Eric Christopher } 9931feb5854aeeda897e9318c8193d187673c8576b8Mark Lacey } 994abcc73e8ba3131c7c4f198840ece31453a0101acJakob Stoklund Olesen#if (AVRC_METADATA_INCLUDED == TRUE) 9950f43811903f10394f7088f4634c0b4f9668cbac0Eric Christopher if (evt == 0 && rc_rsp.rsp.status != BTA_AV_STS_NO_RSP) 9960f43811903f10394f7088f4634c0b4f9668cbac0Eric Christopher { 9970f43811903f10394f7088f4634c0b4f9668cbac0Eric Christopher if (!p_pkt) 9987cec179a647bff132d7af36d91df877056880c5eJakob Stoklund Olesen { 99981d686edbe6effe624add9394673bd571d89bfb7Jakob Stoklund Olesen rc_rsp.rsp.opcode = p_data->rc_msg.opcode; 10007cec179a647bff132d7af36d91df877056880c5eJakob Stoklund Olesen res = AVRC_BldResponse (0, &rc_rsp, &p_pkt); 10017cec179a647bff132d7af36d91df877056880c5eJakob Stoklund Olesen } 10027cec179a647bff132d7af36d91df877056880c5eJakob Stoklund Olesen if (p_pkt) 10037cec179a647bff132d7af36d91df877056880c5eJakob Stoklund Olesen AVRC_MsgReq (p_data->rc_msg.handle, p_data->rc_msg.label, ctype, p_pkt); 10047cec179a647bff132d7af36d91df877056880c5eJakob Stoklund Olesen } 10057cec179a647bff132d7af36d91df877056880c5eJakob Stoklund Olesen#endif 10067cec179a647bff132d7af36d91df877056880c5eJakob Stoklund Olesen 10077cec179a647bff132d7af36d91df877056880c5eJakob Stoklund Olesen /* call callback */ 10087cec179a647bff132d7af36d91df877056880c5eJakob Stoklund Olesen if (evt != 0) 10097cec179a647bff132d7af36d91df877056880c5eJakob Stoklund Olesen { 10107cec179a647bff132d7af36d91df877056880c5eJakob Stoklund Olesen av.remote_cmd.rc_handle = p_data->rc_msg.handle; 10117cec179a647bff132d7af36d91df877056880c5eJakob Stoklund Olesen (*p_cb->p_cback)(evt, &av); 10122debd48ca790ac01be6e12e094fdf4fdcadc8364Jakob Stoklund Olesen } 10137cec179a647bff132d7af36d91df877056880c5eJakob Stoklund Olesen} 1014e25dde550baec1f79caf2fc06edd74e7ae6ffa33Matthias Braun 10157466927b1af264b359c860cb9f7d1f3b275cc5cdJakob Stoklund Olesen/******************************************************************************* 10167466927b1af264b359c860cb9f7d1f3b275cc5cdJakob Stoklund Olesen** 10177466927b1af264b359c860cb9f7d1f3b275cc5cdJakob Stoklund Olesen** Function bta_av_rc_close 10185881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen** 10195881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen** Description close the specified AVRC handle. 10202dc455a366e26d8c1085ef617651232304ee097eJakob Stoklund Olesen** 10211feb5854aeeda897e9318c8193d187673c8576b8Mark Lacey** Returns void 10222dc455a366e26d8c1085ef617651232304ee097eJakob Stoklund Olesen** 10232dc455a366e26d8c1085ef617651232304ee097eJakob Stoklund Olesen*******************************************************************************/ 10241f81e316b042c02c841801a71e7439e166ffa2a0Jakob Stoklund Olesenvoid bta_av_rc_close (tBTA_AV_CB *p_cb, tBTA_AV_DATA *p_data) 10251f81e316b042c02c841801a71e7439e166ffa2a0Jakob Stoklund Olesen{ 10262dc455a366e26d8c1085ef617651232304ee097eJakob Stoklund Olesen UINT16 handle = p_data->hdr.layer_specific; 10272dc455a366e26d8c1085ef617651232304ee097eJakob Stoklund Olesen tBTA_AV_SCB *p_scb; 10282dc455a366e26d8c1085ef617651232304ee097eJakob Stoklund Olesen tBTA_AV_RCB *p_rcb; 10292dc455a366e26d8c1085ef617651232304ee097eJakob Stoklund Olesen 10305881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen if(handle < BTA_AV_NUM_RCB) 10312dc455a366e26d8c1085ef617651232304ee097eJakob Stoklund Olesen { 10322dc455a366e26d8c1085ef617651232304ee097eJakob Stoklund Olesen p_rcb = &p_cb->rcb[handle]; 10335881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen 10342dc455a366e26d8c1085ef617651232304ee097eJakob Stoklund Olesen APPL_TRACE_DEBUG2("bta_av_rc_close handle: %d, status=0x%x", p_rcb->handle, p_rcb->status); 10352dc455a366e26d8c1085ef617651232304ee097eJakob Stoklund Olesen if(p_rcb->handle != BTA_AV_RC_HANDLE_NONE) 10362dc455a366e26d8c1085ef617651232304ee097eJakob Stoklund Olesen { 10375881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen if(p_rcb->shdl) 10385881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen { 10395881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen p_scb = bta_av_cb.p_scb[p_rcb->shdl - 1]; 10405881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen if(p_scb) 10415881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen { 10428a06af96698537377275dd7848db69915638dd26Pete Cooper /* just in case the RC timer is active 10435881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen if(bta_av_cb.features & BTA_AV_FEAT_RCCT && 10445881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen p_scb->chnl == BTA_AV_CHNL_AUDIO) */ 10455928046306d8bbe7db35707c294689f515f90e56Jakob Stoklund Olesen bta_sys_stop_timer(&p_scb->timer); 10464670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen } 10470f43811903f10394f7088f4634c0b4f9668cbac0Eric Christopher } 10480f43811903f10394f7088f4634c0b4f9668cbac0Eric Christopher 10490f43811903f10394f7088f4634c0b4f9668cbac0Eric Christopher AVRC_Close(p_rcb->handle); 10500f43811903f10394f7088f4634c0b4f9668cbac0Eric Christopher } 10510f43811903f10394f7088f4634c0b4f9668cbac0Eric Christopher } 1052a2cae58411b36a58f658f9402e8d039add31ae4dJakob Stoklund Olesen} 1053a2cae58411b36a58f658f9402e8d039add31ae4dJakob Stoklund Olesen 10540f43811903f10394f7088f4634c0b4f9668cbac0Eric Christopher/******************************************************************************* 10559ecd1e71973f555cab00ee862b6f509d0126025aJakob Stoklund Olesen** 10569ecd1e71973f555cab00ee862b6f509d0126025aJakob Stoklund Olesen** Function bta_av_get_shdl 1057670ccd18ae1ecec3b3c92885d5b64b21859001c4Jakob Stoklund Olesen** 1058b18d779b35909cd5b753871f8bf2ff4f6c17ace1Jakob Stoklund Olesen** Returns The index to p_scb[] 105929ef87599c86b28db94d57705ab2901768253cadJakob Stoklund Olesen** 1060393bfcb263fa46e4badc73c6aa56306986f94dcfJakob Stoklund Olesen*******************************************************************************/ 10614670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesenstatic UINT8 bta_av_get_shdl(tBTA_AV_SCB *p_scb) 1062a2cae58411b36a58f658f9402e8d039add31ae4dJakob Stoklund Olesen{ 1063a2cae58411b36a58f658f9402e8d039add31ae4dJakob Stoklund Olesen int i; 1064393bfcb263fa46e4badc73c6aa56306986f94dcfJakob Stoklund Olesen UINT8 shdl = 0; 10655fa42a45a1845046dde84089fb4d8e1e1b329b65Jakob Stoklund Olesen /* find the SCB & stop the timer */ 1066c95c1465fdba059f6cbf24d1d9fd84f442c60fe4Jakob Stoklund Olesen for(i=0; i<BTA_AV_NUM_STRS; i++) 1067b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen { 1068b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen if(p_scb == bta_av_cb.p_scb[i]) 1069b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen { 1070b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen shdl = i+1; 1071b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen break; 1072b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen } 1073b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen } 1074b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen return shdl; 1075b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen} 1076b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen 1077b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen/******************************************************************************* 1078b21abfed813fa46976f896439ca2f9fbd2eba9baJakob Stoklund Olesen** 107944b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen** Function bta_av_stream_chg 108044b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen** 108144b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen** Description audio streaming status changed. 10824670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen** 10834670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen** Returns void 10844670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen** 10854670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesen*******************************************************************************/ 10864670353a21fbc6e8159a129cda965f256e73a451Jakob Stoklund Olesenvoid bta_av_stream_chg(tBTA_AV_SCB *p_scb, BOOLEAN started) 108744b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen{ 1088463a2977b1d9e6679f859db9f32e9e783b075c10Eric Christopher UINT8 started_msk; 10895881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen int i; 109044b7ae2355a32035ea286555736d173755a1c5e2Jakob Stoklund Olesen UINT8 *p_streams; 10915881799d0cccbd814ec1b0f0509df9be1f63c6cbJakob Stoklund Olesen BOOLEAN no_streams = FALSE; 10925fa42a45a1845046dde84089fb4d8e1e1b329b65Jakob Stoklund Olesen tBTA_AV_SCB *p_scbi; 10930253df9a897ce541d56146699cedd79c464bda5eJakob Stoklund Olesen 10941feb5854aeeda897e9318c8193d187673c8576b8Mark Lacey started_msk = BTA_AV_HNDL_TO_MSK(p_scb->hdi); 10951feb5854aeeda897e9318c8193d187673c8576b8Mark Lacey APPL_TRACE_DEBUG3 ("bta_av_stream_chg started:%d started_msk:x%x chnl:x%x", started, 10961feb5854aeeda897e9318c8193d187673c8576b8Mark Lacey started_msk, p_scb->chnl); 10971feb5854aeeda897e9318c8193d187673c8576b8Mark Lacey if (BTA_AV_CHNL_AUDIO == p_scb->chnl) 10980253df9a897ce541d56146699cedd79c464bda5eJakob Stoklund Olesen p_streams = &bta_av_cb.audio_streams; 10995928046306d8bbe7db35707c294689f515f90e56Jakob Stoklund Olesen else 11005928046306d8bbe7db35707c294689f515f90e56Jakob Stoklund Olesen p_streams = &bta_av_cb.video_streams; 11015928046306d8bbe7db35707c294689f515f90e56Jakob Stoklund Olesen 11025928046306d8bbe7db35707c294689f515f90e56Jakob Stoklund Olesen if (started) 11035928046306d8bbe7db35707c294689f515f90e56Jakob Stoklund Olesen { 11045928046306d8bbe7db35707c294689f515f90e56Jakob Stoklund Olesen /* Let L2CAP know this channel is processed with high priority */ 11055928046306d8bbe7db35707c294689f515f90e56Jakob Stoklund Olesen L2CA_SetAclPriority(p_scb->peer_addr, L2CAP_PRIORITY_HIGH); 11063a0e0715a5691e26ca70bc853d6d3d116e5949b8Jakob Stoklund Olesen (*p_streams) |= started_msk; 1107078628465b73348b5608ec6aa2d7181679543903Jakob Stoklund Olesen } 1108a2cae58411b36a58f658f9402e8d039add31ae4dJakob Stoklund Olesen else 11093a0e0715a5691e26ca70bc853d6d3d116e5949b8Jakob Stoklund Olesen { 11101feb5854aeeda897e9318c8193d187673c8576b8Mark Lacey (*p_streams) &= ~started_msk; 11113a0e0715a5691e26ca70bc853d6d3d116e5949b8Jakob Stoklund Olesen } 11123a0e0715a5691e26ca70bc853d6d3d116e5949b8Jakob Stoklund Olesen 11133a0e0715a5691e26ca70bc853d6d3d116e5949b8Jakob Stoklund Olesen if (!started) 11143a0e0715a5691e26ca70bc853d6d3d116e5949b8Jakob Stoklund Olesen { 11153a0e0715a5691e26ca70bc853d6d3d116e5949b8Jakob Stoklund Olesen i=0; 11163a0e0715a5691e26ca70bc853d6d3d116e5949b8Jakob Stoklund Olesen if (BTA_AV_CHNL_AUDIO == p_scb->chnl) 1117ae5fbeec23cff833cad9e6b2a638efd1f48bef49Matt Beaumont-Gay { 1118e742d687369f79702894b6cf302e1f222c5d7432Mark Lacey if (bta_av_cb.video_streams == 0) 11192254227791ea267426b9ac674fc6d87decb65bc1Jakob Stoklund Olesen no_streams = TRUE; 11205928046306d8bbe7db35707c294689f515f90e56Jakob Stoklund Olesen } 11215928046306d8bbe7db35707c294689f515f90e56Jakob Stoklund Olesen else 11225928046306d8bbe7db35707c294689f515f90e56Jakob Stoklund Olesen { 11233a0e0715a5691e26ca70bc853d6d3d116e5949b8Jakob Stoklund Olesen no_streams = TRUE; 11243a0e0715a5691e26ca70bc853d6d3d116e5949b8Jakob Stoklund Olesen if ( bta_av_cb.audio_streams ) 112508e93b14c37277ab40b835de340f89ba357d3332Jakob Stoklund Olesen { 11264eed756153b84c211114a3e9186bf0cb55d4b394Benjamin Kramer for (; i<BTA_AV_NUM_STRS; i++) 11275928046306d8bbe7db35707c294689f515f90e56Jakob Stoklund Olesen { 11285928046306d8bbe7db35707c294689f515f90e56Jakob Stoklund Olesen p_scbi = bta_av_cb.p_scb[i]; 1129f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen /* scb is used and started */ 1130f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen if ( p_scbi && (bta_av_cb.audio_streams & BTA_AV_HNDL_TO_MSK(i)) 1131f0179004e94259a8adab6c48f295ea9ab18af4c3Jakob Stoklund Olesen && bdcmp(p_scbi->peer_addr, p_scb->peer_addr) == 0) 11328ae0263471cc29c5f8278ee1ea5b678042ec6dceJakob Stoklund Olesen { 1133f1b05f2b0ef48cb80b064e2f792b38c626822fc0Jakob Stoklund Olesen no_streams = FALSE; 1134f1b05f2b0ef48cb80b064e2f792b38c626822fc0Jakob Stoklund Olesen break; 1135f1b05f2b0ef48cb80b064e2f792b38c626822fc0Jakob Stoklund Olesen } 11362d6d86be84ee355223ccd20b7f87a0c9971c50c9Jakob Stoklund Olesen } 11372d6d86be84ee355223ccd20b7f87a0c9971c50c9Jakob Stoklund Olesen 11382d6d86be84ee355223ccd20b7f87a0c9971c50c9Jakob Stoklund Olesen } 11392d6d86be84ee355223ccd20b7f87a0c9971c50c9Jakob Stoklund Olesen } 11402d6d86be84ee355223ccd20b7f87a0c9971c50c9Jakob Stoklund Olesen 11412d6d86be84ee355223ccd20b7f87a0c9971c50c9Jakob Stoklund Olesen APPL_TRACE_DEBUG4 ("no_streams:%d i:%d, audio_streams:x%x, video_streams:x%x", no_streams, i, 11422d6d86be84ee355223ccd20b7f87a0c9971c50c9Jakob Stoklund Olesen bta_av_cb.audio_streams, bta_av_cb.video_streams); 11432d6d86be84ee355223ccd20b7f87a0c9971c50c9Jakob Stoklund Olesen if (no_streams) 11442d6d86be84ee355223ccd20b7f87a0c9971c50c9Jakob Stoklund Olesen { 11452d6d86be84ee355223ccd20b7f87a0c9971c50c9Jakob Stoklund Olesen /* Let L2CAP know this channel is processed with low priority */ 11462d6d86be84ee355223ccd20b7f87a0c9971c50c9Jakob Stoklund Olesen L2CA_SetAclPriority(p_scb->peer_addr, L2CAP_PRIORITY_NORMAL); 11472d6d86be84ee355223ccd20b7f87a0c9971c50c9Jakob Stoklund Olesen } 11482d6d86be84ee355223ccd20b7f87a0c9971c50c9Jakob Stoklund Olesen } 11492d6d86be84ee355223ccd20b7f87a0c9971c50c9Jakob Stoklund Olesen} 11502d6d86be84ee355223ccd20b7f87a0c9971c50c9Jakob Stoklund Olesen 11512d6d86be84ee355223ccd20b7f87a0c9971c50c9Jakob Stoklund Olesen 11522d6d86be84ee355223ccd20b7f87a0c9971c50c9Jakob Stoklund Olesen/******************************************************************************* 11532d6d86be84ee355223ccd20b7f87a0c9971c50c9Jakob Stoklund Olesen** 1154fd5c51342a429ecab86a645282d0b36b216c0256Jakob Stoklund Olesen** Function bta_av_conn_chg 1155fd5c51342a429ecab86a645282d0b36b216c0256Jakob Stoklund Olesen** 1156fd5c51342a429ecab86a645282d0b36b216c0256Jakob Stoklund Olesen** Description connetion status changed. 1157fe62d92b7bbaf73e576bec0c0b11cfa6c191aa87Jakob Stoklund Olesen** Open an AVRCP acceptor channel, if new conn. 1158fd5c51342a429ecab86a645282d0b36b216c0256Jakob Stoklund Olesen** 1159fe62d92b7bbaf73e576bec0c0b11cfa6c191aa87Jakob Stoklund Olesen** Returns void 1160fe62d92b7bbaf73e576bec0c0b11cfa6c191aa87Jakob Stoklund Olesen** 1161fd5c51342a429ecab86a645282d0b36b216c0256Jakob Stoklund Olesen*******************************************************************************/ 1162fd5c51342a429ecab86a645282d0b36b216c0256Jakob Stoklund Olesenvoid bta_av_conn_chg(tBTA_AV_DATA *p_data) 1163fd5c51342a429ecab86a645282d0b36b216c0256Jakob Stoklund Olesen{ 1164fd5c51342a429ecab86a645282d0b36b216c0256Jakob Stoklund Olesen tBTA_AV_CB *p_cb = &bta_av_cb; 1165fe62d92b7bbaf73e576bec0c0b11cfa6c191aa87Jakob Stoklund Olesen tBTA_AV_SCB *p_scb; 1166fd5c51342a429ecab86a645282d0b36b216c0256Jakob Stoklund Olesen tBTA_AV_SCB *p_scbi; 1167fd5c51342a429ecab86a645282d0b36b216c0256Jakob Stoklund Olesen UINT8 mask; 1168fd5c51342a429ecab86a645282d0b36b216c0256Jakob Stoklund Olesen UINT8 conn_msk; 1169b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen UINT8 old_msk; 1170b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen int i; 1171b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen int index = (p_data->hdr.layer_specific & BTA_AV_HNDL_MSK) - 1; 1172b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen tBTA_AV_LCB *p_lcb; 1173b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen tBTA_AV_LCB *p_lcb_rc; 1174b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen tBTA_AV_RCB *p_rcb, *p_rcb2; 1175b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen BOOLEAN chk_restore = FALSE; 1176b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen 1177b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen p_scb = p_cb->p_scb[index]; 1178b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen 1179b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen mask = BTA_AV_HNDL_TO_MSK(index); 1180b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen p_lcb = bta_av_find_lcb(p_data->conn_chg.peer_addr, BTA_AV_LCB_FIND); 1181b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen conn_msk = 1 << (index + 1); 1182b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen if(p_data->conn_chg.is_up) 1183b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen { 1184b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen /* set the conned mask for this channel */ 118536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines if(p_scb) 1186b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen { 1187b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen if(p_lcb) 1188b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen { 1189b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen p_lcb->conn_msk |= conn_msk; 1190b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen for (i=0; i<BTA_AV_NUM_RCB; i++) 1191b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen { 1192b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen if (bta_av_cb.rcb[i].lidx == p_lcb->lidx) 1193fe9b2d142a0feb87b06579509479957f25d7d0a4Jakob Stoklund Olesen { 1194fe9b2d142a0feb87b06579509479957f25d7d0a4Jakob Stoklund Olesen bta_av_cb.rcb[i].shdl = index + 1; 1195fe9b2d142a0feb87b06579509479957f25d7d0a4Jakob Stoklund Olesen APPL_TRACE_DEBUG5("conn_chg up[%d]: %d, status=0x%x, shdl:%d, lidx:%d", i, 1196fe9b2d142a0feb87b06579509479957f25d7d0a4Jakob Stoklund Olesen bta_av_cb.rcb[i].handle, bta_av_cb.rcb[i].status, 1197fe9b2d142a0feb87b06579509479957f25d7d0a4Jakob Stoklund Olesen bta_av_cb.rcb[i].shdl, bta_av_cb.rcb[i].lidx); 1198fe9b2d142a0feb87b06579509479957f25d7d0a4Jakob Stoklund Olesen break; 1199b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen } 1200b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen } 1201b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen } 1202b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen if (p_scb->chnl == BTA_AV_CHNL_AUDIO) 1203b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen { 1204b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen old_msk = p_cb->conn_audio; 1205b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen p_cb->conn_audio |= mask; 1206b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen } 1207b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen else 1208b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen { 1209b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen old_msk = p_cb->conn_video; 1210b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen p_cb->conn_video |= mask; 1211b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen } 1212b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen 1213b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen if ((old_msk & mask) == 0) 1214b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen { 1215b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen /* increase the audio open count, if not set yet */ 1216b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen bta_av_cb.audio_open_cnt++; 1217b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen } 1218b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen 1219b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen 1220b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen APPL_TRACE_DEBUG2("rc_acp_handle:%d rc_acp_idx:%d", p_cb->rc_acp_handle, p_cb->rc_acp_idx); 1221b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen /* check if the AVRCP ACP channel is already connected */ 1222b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen if(p_lcb && p_cb->rc_acp_handle != BTA_AV_RC_HANDLE_NONE && p_cb->rc_acp_idx) 1223b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen { 1224b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen p_lcb_rc = &p_cb->lcb[BTA_AV_NUM_LINKS]; 1225b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen APPL_TRACE_DEBUG1("rc_acp is connected && conn_chg on same addr p_lcb_rc->conn_msk:x%x", 1226b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen p_lcb_rc->conn_msk); 1227b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen /* check if the RC is connected to the scb addr */ 1228b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen APPL_TRACE_DEBUG6 ("p_lcb_rc->addr: %02x:%02x:%02x:%02x:%02x:%02x", 1229b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen p_lcb_rc->addr[0], p_lcb_rc->addr[1], p_lcb_rc->addr[2], p_lcb_rc->addr[3], 1230b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen p_lcb_rc->addr[4], p_lcb_rc->addr[5]); 1231b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen APPL_TRACE_DEBUG6 ("conn_chg.peer_addr: %02x:%02x:%02x:%02x:%02x:%02x", 1232b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen p_data->conn_chg.peer_addr[0], p_data->conn_chg.peer_addr[1], 1233b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen p_data->conn_chg.peer_addr[2], 1234b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen p_data->conn_chg.peer_addr[3], p_data->conn_chg.peer_addr[4], 1235b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen p_data->conn_chg.peer_addr[5]); 1236b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen if (p_lcb_rc->conn_msk && bdcmp(p_lcb_rc->addr, p_data->conn_chg.peer_addr) == 0) 1237b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen { 1238b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen /* AVRCP is already connected. 1239b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen * need to update the association betwen SCB and RCB */ 1240fe9b2d142a0feb87b06579509479957f25d7d0a4Jakob Stoklund Olesen p_lcb_rc->conn_msk = 0; /* indicate RC ONLY is not connected */ 1241b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen p_lcb_rc->lidx = 0; 1242b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen p_scb->rc_handle = p_cb->rc_acp_handle; 1243b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen p_rcb = &p_cb->rcb[p_cb->rc_acp_idx - 1]; 1244b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen p_rcb->shdl = bta_av_get_shdl(p_scb); 1245b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen APPL_TRACE_DEBUG3("update rc_acp shdl:%d/%d srch:%d", index + 1, p_rcb->shdl, 1246b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen p_scb->rc_handle ); 1247b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen 1248b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen p_rcb2 = bta_av_get_rcb_by_shdl(p_rcb->shdl); 1249b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen if (p_rcb2) 1250b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen { 1251fe9b2d142a0feb87b06579509479957f25d7d0a4Jakob Stoklund Olesen /* found the RCB that was created to associated with this SCB */ 1252fe9b2d142a0feb87b06579509479957f25d7d0a4Jakob Stoklund Olesen p_cb->rc_acp_handle = p_rcb2->handle; 1253fe9b2d142a0feb87b06579509479957f25d7d0a4Jakob Stoklund Olesen p_cb->rc_acp_idx = (p_rcb2 - p_cb->rcb) + 1; 1254fe9b2d142a0feb87b06579509479957f25d7d0a4Jakob Stoklund Olesen APPL_TRACE_DEBUG2("new rc_acp_handle:%d, idx:%d", p_cb->rc_acp_handle, 1255fe9b2d142a0feb87b06579509479957f25d7d0a4Jakob Stoklund Olesen p_cb->rc_acp_idx); 1256fe9b2d142a0feb87b06579509479957f25d7d0a4Jakob Stoklund Olesen p_rcb2->lidx = (BTA_AV_NUM_LINKS + 1); 1257fe9b2d142a0feb87b06579509479957f25d7d0a4Jakob Stoklund Olesen APPL_TRACE_DEBUG3("rc2 handle:%d lidx:%d/%d",p_rcb2->handle, p_rcb2->lidx, 1258b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen p_cb->lcb[p_rcb2->lidx-1].lidx); 1259b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen } 1260b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen p_rcb->lidx = p_lcb->lidx; 1261b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen APPL_TRACE_DEBUG3("rc handle:%d lidx:%d/%d",p_rcb->handle, p_rcb->lidx, 1262b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen p_cb->lcb[p_rcb->lidx-1].lidx); 1263b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen } 1264b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen } 1265b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen } 1266b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen } 1267b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen else 1268b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen { 1269b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen if ((p_cb->conn_audio & mask) && bta_av_cb.audio_open_cnt) 1270b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen { 1271b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen /* this channel is still marked as open. decrease the count */ 1272b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen bta_av_cb.audio_open_cnt--; 1273b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen } 1274b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen 1275b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen /* clear the conned mask for this channel */ 1276b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen p_cb->conn_audio &= ~mask; 1277b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen p_cb->conn_video &= ~mask; 1278b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen if(p_scb) 1279b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen { 1280b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen /* the stream is closed. 1281b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen * clear the peer address, so it would not mess up the AVRCP for the next round of operation */ 1282b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen bdcpy(p_scb->peer_addr, bd_addr_null); 1283b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen if(p_scb->chnl == BTA_AV_CHNL_AUDIO) 1284b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen { 1285b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen if(p_lcb) 1286b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen { 1287b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen p_lcb->conn_msk &= ~conn_msk; 128836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 1289b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen /* audio channel is down. make sure the INT channel is down */ 1290b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen /* just in case the RC timer is active 1291fe62d92b7bbaf73e576bec0c0b11cfa6c191aa87Jakob Stoklund Olesen if(p_cb->features & BTA_AV_FEAT_RCCT) */ 1292b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen { 1293b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen bta_sys_stop_timer(&p_scb->timer); 1294b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen } 1295b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen /* one audio channel goes down. check if we need to restore high priority */ 1296b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen chk_restore = TRUE; 1297b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen } 1298b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen } 1299fe62d92b7bbaf73e576bec0c0b11cfa6c191aa87Jakob Stoklund Olesen 1300b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen APPL_TRACE_DEBUG1("bta_av_conn_chg shdl:%d", index + 1); 1301b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen for (i=0; i<BTA_AV_NUM_RCB; i++) 1302b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen { 1303b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen APPL_TRACE_DEBUG5("conn_chg dn[%d]: %d, status=0x%x, shdl:%d, lidx:%d", i, 1304b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen bta_av_cb.rcb[i].handle, bta_av_cb.rcb[i].status, 1305b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen bta_av_cb.rcb[i].shdl, bta_av_cb.rcb[i].lidx); 1306b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen if(bta_av_cb.rcb[i].shdl == index + 1) 1307fe62d92b7bbaf73e576bec0c0b11cfa6c191aa87Jakob Stoklund Olesen { 1308b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen bta_av_del_rc(&bta_av_cb.rcb[i]); 1309b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen break; 1310b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen } 1311b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen } 1312b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen 1313fe62d92b7bbaf73e576bec0c0b11cfa6c191aa87Jakob Stoklund Olesen if(p_cb->conn_audio == 0 && p_cb->conn_video == 0) 1314b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen { 1315b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen /* if both channels are not connected, 1316b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen * close all RC channels */ 1317b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen bta_av_close_all_rc(p_cb); 1318b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen } 1319b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen 1320b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen /* if the AVRCP is no longer listening, create the listening channel */ 1321b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen if (bta_av_cb.rc_acp_handle == BTA_AV_RC_HANDLE_NONE && bta_av_cb.features & BTA_AV_FEAT_RCTG) 1322b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen bta_av_rc_create(&bta_av_cb, AVCT_ACP, 0, BTA_AV_NUM_LINKS + 1); 1323b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen } 1324fe62d92b7bbaf73e576bec0c0b11cfa6c191aa87Jakob Stoklund Olesen 1325b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen APPL_TRACE_DEBUG6("bta_av_conn_chg audio:%x video:%x up:%d conn_msk:0x%x chk_restore:%d audio_open_cnt:%d", 1326b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen p_cb->conn_audio, p_cb->conn_video, p_data->conn_chg.is_up, conn_msk, chk_restore, p_cb->audio_open_cnt); 1327fe62d92b7bbaf73e576bec0c0b11cfa6c191aa87Jakob Stoklund Olesen 1328b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen if (chk_restore) 1329b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen { 1330b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen if (p_cb->audio_open_cnt == 1) 1331b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen { 1332b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen /* one audio channel goes down and there's one audio channel remains open. 1333af4e40c2f41a7d60b86958e034b00542d551b5f2Jakob Stoklund Olesen * restore the switch role in default link policy */ 1334fe62d92b7bbaf73e576bec0c0b11cfa6c191aa87Jakob Stoklund Olesen bta_sys_set_default_policy(BTA_ID_AV, HCI_ENABLE_MASTER_SLAVE_SWITCH); 1335b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen /* allow role switch, if this is the last connection */ 1336b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen bta_av_restore_switch(); 1337b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen } 1338b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen if (p_cb->audio_open_cnt) 1339b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen { 1340b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen /* adjust flush timeout settings to longer period */ 1341b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen for (i=0; i<BTA_AV_NUM_STRS; i++) 1342b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen { 1343b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen p_scbi = bta_av_cb.p_scb[i]; 1344b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen if (p_scbi && p_scbi->chnl == BTA_AV_CHNL_AUDIO && p_scbi->co_started) 1345f9d7fb6b3c45abc64ad52cd8a9a8a7dd5aa9f4bbMatt Beaumont-Gay { 1346b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen /* may need to update the flush timeout of this already started stream */ 1347b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen if (p_scbi->co_started != bta_av_cb.audio_open_cnt) 1348fe62d92b7bbaf73e576bec0c0b11cfa6c191aa87Jakob Stoklund Olesen { 1349b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen p_scbi->co_started = bta_av_cb.audio_open_cnt; 1350b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen L2CA_SetFlushTimeout(p_scbi->peer_addr, p_bta_av_cfg->p_audio_flush_to[p_scbi->co_started - 1] ); 1351b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen } 1352b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen } 1353b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen } 1354fe62d92b7bbaf73e576bec0c0b11cfa6c191aa87Jakob Stoklund Olesen } 1355b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen } 1356b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen} 1357b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen 1358b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen/******************************************************************************* 1359b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen** 1360b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen** Function bta_av_disable 1361b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen** 1362b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen** Description disable AV. 1363b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen** 1364b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen** Returns void 1365b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen** 1366b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen*******************************************************************************/ 1367b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesenvoid bta_av_disable(tBTA_AV_CB *p_cb, tBTA_AV_DATA *p_data) 1368b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen{ 1369fe62d92b7bbaf73e576bec0c0b11cfa6c191aa87Jakob Stoklund Olesen BT_HDR hdr; 1370b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen UINT16 xx; 1371b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen UNUSED(p_data); 1372b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen 1373b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen p_cb->disabling = TRUE; 1374b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen 1375b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen bta_av_close_all_rc(p_cb); 1376b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen 1377b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen utl_freebuf((void **) &p_cb->p_disc_db); 1378b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen 1379b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen /* disable audio/video - de-register all channels, 138036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines * expect BTA_AV_DEREG_COMP_EVT when deregister is complete */ 1381b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen for(xx=0; xx<BTA_AV_NUM_STRS; xx++) 1382b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen { 1383fe62d92b7bbaf73e576bec0c0b11cfa6c191aa87Jakob Stoklund Olesen hdr.layer_specific = xx + 1; 1384b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen bta_av_api_deregister((tBTA_AV_DATA *)&hdr); 1385b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen } 1386b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen} 1387b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen 1388b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen/******************************************************************************* 1389b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen** 1390b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen** Function bta_av_api_disconnect 1391b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen** 1392b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen** Description . 1393fe62d92b7bbaf73e576bec0c0b11cfa6c191aa87Jakob Stoklund Olesen** 1394b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen** Returns void 1395b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen** 1396b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen*******************************************************************************/ 1397b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesenvoid bta_av_api_disconnect(tBTA_AV_DATA *p_data) 1398b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen{ 1399b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen AVDT_DisconnectReq(p_data->api_discnt.bd_addr, bta_av_conn_cback); 1400b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen bta_sys_stop_timer(&bta_av_cb.sig_tmr); 1401fe62d92b7bbaf73e576bec0c0b11cfa6c191aa87Jakob Stoklund Olesen} 1402b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen 1403b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen/******************************************************************************* 1404b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen** 1405fe62d92b7bbaf73e576bec0c0b11cfa6c191aa87Jakob Stoklund Olesen** Function bta_av_sig_chg 1406b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen** 1407b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen** Description process AVDT signal channel up/down. 1408b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen** 1409b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen** Returns void 1410b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen** 1411b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen*******************************************************************************/ 1412b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesenvoid bta_av_sig_chg(tBTA_AV_DATA *p_data) 1413fe62d92b7bbaf73e576bec0c0b11cfa6c191aa87Jakob Stoklund Olesen{ 1414b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen UINT16 event = p_data->str_msg.hdr.layer_specific; 1415b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen tBTA_AV_CB *p_cb = &bta_av_cb; 1416b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen int xx; 1417b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen UINT8 mask; 1418b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen tBTA_AV_LCB *p_lcb = NULL; 1419b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen 1420b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen APPL_TRACE_DEBUG1("bta_av_sig_chg event: %d", event); 1421b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen if(event == AVDT_CONNECT_IND_EVT) 1422b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen { 1423b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen p_lcb = bta_av_find_lcb(p_data->str_msg.bd_addr, BTA_AV_LCB_FIND); 1424b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen if(!p_lcb) 1425b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen { 1426b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen /* if the address does not have an LCB yet, alloc one */ 1427b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen for(xx=0; xx<BTA_AV_NUM_LINKS; xx++) 1428b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen { 1429b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen mask = 1 << xx; 1430b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen APPL_TRACE_DEBUG1("conn_lcb: 0x%x", p_cb->conn_lcb); 1431b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen 1432b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen /* look for a p_lcb with its p_scb registered */ 1433b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen if((!(mask & p_cb->conn_lcb)) && (p_cb->p_scb[xx] != NULL)) 1434fe62d92b7bbaf73e576bec0c0b11cfa6c191aa87Jakob Stoklund Olesen { 1435b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen p_lcb = &p_cb->lcb[xx]; 1436b4ddedce599183362b0f0333922c2fe0e163a129Jakob Stoklund Olesen p_lcb->lidx = xx + 1; 1437 bdcpy(p_lcb->addr, p_data->str_msg.bd_addr); 1438 p_lcb->conn_msk = 0; /* clear the connect mask */ 1439 /* start listening when the signal channel is open */ 1440 if (p_cb->features & BTA_AV_FEAT_RCTG) 1441 { 1442 bta_av_rc_create(p_cb, AVCT_ACP, 0, p_lcb->lidx); 1443 } 1444 /* this entry is not used yet. */ 1445 p_cb->conn_lcb |= mask; /* mark it as used */ 1446 APPL_TRACE_DEBUG1("start sig timer %d", p_data->hdr.offset); 1447 if (p_data->hdr.offset == AVDT_ACP) 1448 { 1449 APPL_TRACE_DEBUG1("Incoming L2CAP acquired, set state as incoming", NULL); 1450 bdcpy(p_cb->p_scb[xx]->peer_addr, p_data->str_msg.bd_addr); 1451 p_cb->p_scb[xx]->use_rc = TRUE; /* allowing RC for incoming connection */ 1452 bta_av_ssm_execute(p_cb->p_scb[xx], BTA_AV_ACP_CONNECT_EVT, p_data); 1453 1454 /* The Pending Event should be sent as soon as the L2CAP signalling channel 1455 * is set up, which is NOW. Earlier this was done only after 1456 * BTA_AV_SIG_TIME_VAL milliseconds. 1457 * The following function shall send the event and start the recurring timer 1458 */ 1459 bta_av_sig_timer(NULL); 1460 1461 /* Possible collision : need to avoid outgoing processing while the timer is running */ 1462 p_cb->p_scb[xx]->coll_mask = BTA_AV_COLL_INC_TMR; 1463 1464 p_cb->acp_sig_tmr.param = (UINT32)xx; 1465 p_cb->acp_sig_tmr.p_cback = (TIMER_CBACK*)&bta_av_acp_sig_timer_cback; 1466 bta_sys_start_timer(&p_cb->acp_sig_tmr, 0, BTA_AV_ACP_SIG_TIME_VAL); 1467 } 1468 break; 1469 } 1470 } 1471 1472 /* check if we found something */ 1473 if (xx == BTA_AV_NUM_LINKS) 1474 { 1475 /* We do not have scb for this avdt connection. */ 1476 /* Silently close the connection. */ 1477 APPL_TRACE_ERROR0("av scb not available for avdt connection"); 1478 AVDT_DisconnectReq (p_data->str_msg.bd_addr, NULL); 1479 return; 1480 } 1481 } 1482 } 1483#if( defined BTA_AR_INCLUDED ) && (BTA_AR_INCLUDED == TRUE) 1484 else if (event == BTA_AR_AVDT_CONN_EVT) 1485 { 1486 bta_sys_stop_timer(&bta_av_cb.sig_tmr); 1487 } 1488#endif 1489 else 1490 { 1491 /* disconnected. */ 1492 p_lcb = bta_av_find_lcb(p_data->str_msg.bd_addr, BTA_AV_LCB_FREE); 1493 if(p_lcb && p_lcb->conn_msk) 1494 { 1495 APPL_TRACE_DEBUG1("conn_msk: 0x%x", p_lcb->conn_msk); 1496 /* clean up ssm */ 1497 for(xx=0; xx < BTA_AV_NUM_STRS; xx++) 1498 { 1499 mask = 1 << (xx + 1); 1500 if ((mask & p_lcb->conn_msk) && (p_cb->p_scb[xx]) && 1501 (bdcmp(p_cb->p_scb[xx]->peer_addr, p_data->str_msg.bd_addr) == 0)) 1502 { 1503 bta_av_ssm_execute(p_cb->p_scb[xx], BTA_AV_AVDT_DISCONNECT_EVT, NULL); 1504 } 1505 } 1506 } 1507 } 1508 APPL_TRACE_DEBUG1("conn_lcb: 0x%x", p_cb->conn_lcb); 1509} 1510 1511/******************************************************************************* 1512** 1513** Function bta_av_sig_timer 1514** 1515** Description process the signal channel timer. This timer is started 1516** when the AVDTP signal channel is connected. If no profile 1517** is connected, the timer goes off every BTA_AV_SIG_TIME_VAL 1518** 1519** Returns void 1520** 1521*******************************************************************************/ 1522void bta_av_sig_timer(tBTA_AV_DATA *p_data) 1523{ 1524 tBTA_AV_CB *p_cb = &bta_av_cb; 1525 int xx; 1526 UINT8 mask; 1527 tBTA_AV_LCB *p_lcb = NULL; 1528 tBTA_AV_PEND pend; 1529 UNUSED(p_data); 1530 1531 APPL_TRACE_DEBUG0("bta_av_sig_timer"); 1532 for(xx=0; xx<BTA_AV_NUM_LINKS; xx++) 1533 { 1534 mask = 1 << xx; 1535 if(mask & p_cb->conn_lcb) 1536 { 1537 /* this entry is used. check if it is connected */ 1538 p_lcb = &p_cb->lcb[xx]; 1539 if(!p_lcb->conn_msk) 1540 { 1541 bta_sys_start_timer(&p_cb->sig_tmr, BTA_AV_SIG_TIMER_EVT, BTA_AV_SIG_TIME_VAL); 1542 bdcpy(pend.bd_addr, p_lcb->addr); 1543 (*p_cb->p_cback)(BTA_AV_PENDING_EVT, (tBTA_AV *) &pend); 1544 } 1545 } 1546 } 1547} 1548 1549/******************************************************************************* 1550** 1551** Function bta_av_acp_sig_timer_cback 1552** 1553** Description Process the timeout when SRC is accepting connection 1554** and SNK did not start signalling. 1555** 1556** Returns void 1557** 1558*******************************************************************************/ 1559static void bta_av_acp_sig_timer_cback (TIMER_LIST_ENT *p_tle) 1560{ 1561 UINT8 inx = (UINT8)p_tle->param; 1562 tBTA_AV_CB *p_cb = &bta_av_cb; 1563 tBTA_AV_SCB *p_scb = p_cb->p_scb[inx]; 1564 tBTA_AV_API_OPEN *p_buf; 1565 1566 if (p_scb) 1567 { 1568 APPL_TRACE_DEBUG1("bta_av_acp_sig_timer_cback, coll_mask = 0x%02X", p_scb->coll_mask); 1569 1570 if (p_scb->coll_mask & BTA_AV_COLL_INC_TMR) 1571 { 1572 p_scb->coll_mask &= ~BTA_AV_COLL_INC_TMR; 1573 1574 if (bta_av_is_scb_opening(p_scb)) 1575 { 1576 if (p_scb->p_disc_db) 1577 { 1578 /* We are still doing SDP. Run the timer again. */ 1579 p_scb->coll_mask |= BTA_AV_COLL_INC_TMR; 1580 1581 p_cb->acp_sig_tmr.param = (UINT32)inx; 1582 p_cb->acp_sig_tmr.p_cback = (TIMER_CBACK *)&bta_av_acp_sig_timer_cback; 1583 bta_sys_start_timer(&p_cb->acp_sig_tmr, 0, BTA_AV_ACP_SIG_TIME_VAL); 1584 } 1585 else 1586 { 1587 /* SNK did not start signalling, resume signalling process. */ 1588 bta_av_discover_req (p_scb, NULL); 1589 } 1590 } 1591 else if (bta_av_is_scb_incoming(p_scb)) 1592 { 1593 /* Stay in incoming state if SNK does not start signalling */ 1594 1595 /* API open was called right after SNK opened L2C connection. */ 1596 if (p_scb->coll_mask & BTA_AV_COLL_API_CALLED) 1597 { 1598 p_scb->coll_mask &= ~BTA_AV_COLL_API_CALLED; 1599 1600 /* BTA_AV_API_OPEN_EVT */ 1601 if ((p_buf = (tBTA_AV_API_OPEN *) GKI_getbuf(sizeof(tBTA_AV_API_OPEN))) != NULL) 1602 { 1603 memcpy(p_buf, &(p_scb->open_api), sizeof(tBTA_AV_API_OPEN)); 1604 bta_sys_sendmsg(p_buf); 1605 } 1606 } 1607 } 1608 } 1609 } 1610} 1611 1612/******************************************************************************* 1613** 1614** Function bta_av_check_peer_features 1615** 1616** Description check supported features on the peer device from the SDP record 1617** and return the feature mask 1618** 1619** Returns tBTA_AV_FEAT peer device feature mask 1620** 1621*******************************************************************************/ 1622tBTA_AV_FEAT bta_av_check_peer_features (UINT16 service_uuid) 1623{ 1624 tBTA_AV_FEAT peer_features = 0; 1625 tBTA_AV_CB *p_cb = &bta_av_cb; 1626 tSDP_DISC_REC *p_rec = NULL; 1627 tSDP_DISC_ATTR *p_attr; 1628 UINT16 peer_rc_version=0; 1629 UINT16 categories = 0; 1630 1631 APPL_TRACE_DEBUG1("bta_av_check_peer_features service_uuid:x%x", service_uuid); 1632 /* loop through all records we found */ 1633 while (TRUE) 1634 { 1635 /* get next record; if none found, we're done */ 1636 if ((p_rec = SDP_FindServiceInDb(p_cb->p_disc_db, service_uuid, p_rec)) == NULL) 1637 { 1638 break; 1639 } 1640 1641 if (( SDP_FindAttributeInRec(p_rec, ATTR_ID_SERVICE_CLASS_ID_LIST)) != NULL) 1642 { 1643 /* find peer features */ 1644 if (SDP_FindServiceInDb(p_cb->p_disc_db, UUID_SERVCLASS_AV_REMOTE_CONTROL, NULL)) 1645 { 1646 peer_features |= BTA_AV_FEAT_RCCT; 1647 } 1648 if (SDP_FindServiceInDb(p_cb->p_disc_db, UUID_SERVCLASS_AV_REM_CTRL_TARGET, NULL)) 1649 { 1650 peer_features |= BTA_AV_FEAT_RCTG; 1651 } 1652 } 1653 1654 if (( SDP_FindAttributeInRec(p_rec, ATTR_ID_BT_PROFILE_DESC_LIST)) != NULL) 1655 { 1656 /* get profile version (if failure, version parameter is not updated) */ 1657 SDP_FindProfileVersionInRec(p_rec, UUID_SERVCLASS_AV_REMOTE_CONTROL, &peer_rc_version); 1658 APPL_TRACE_DEBUG1("peer_rc_version 0x%x", peer_rc_version); 1659 1660 if (peer_rc_version >= AVRC_REV_1_3) 1661 peer_features |= (BTA_AV_FEAT_VENDOR | BTA_AV_FEAT_METADATA); 1662 1663 if (peer_rc_version >= AVRC_REV_1_4) 1664 { 1665 peer_features |= (BTA_AV_FEAT_ADV_CTRL); 1666 /* get supported categories */ 1667 if ((p_attr = SDP_FindAttributeInRec(p_rec, 1668 ATTR_ID_SUPPORTED_FEATURES)) != NULL) 1669 { 1670 categories = p_attr->attr_value.v.u16; 1671 if (categories & AVRC_SUPF_CT_BROWSE) 1672 peer_features |= (BTA_AV_FEAT_BROWSE); 1673 } 1674 } 1675 } 1676 } 1677 APPL_TRACE_DEBUG1("peer_features:x%x", peer_features); 1678 return peer_features; 1679} 1680 1681/******************************************************************************* 1682** 1683** Function bta_av_rc_disc_done 1684** 1685** Description Handle AVRCP service discovery results. If matching 1686** service found, open AVRCP connection. 1687** 1688** Returns void 1689** 1690*******************************************************************************/ 1691void bta_av_rc_disc_done(tBTA_AV_DATA *p_data) 1692{ 1693 tBTA_AV_CB *p_cb = &bta_av_cb; 1694 tBTA_AV_SCB *p_scb = NULL; 1695 tBTA_AV_LCB *p_lcb; 1696 tBTA_AV_RC_OPEN rc_open; 1697 tBTA_AV_RC_FEAT rc_feat; 1698 UINT8 rc_handle; 1699 tBTA_AV_FEAT peer_features; /* peer features mask */ 1700 UNUSED(p_data); 1701 1702 APPL_TRACE_DEBUG1("bta_av_rc_disc_done disc:x%x", p_cb->disc); 1703 if (!p_cb->disc) 1704 { 1705 return; 1706 } 1707 1708 if ((p_cb->disc & BTA_AV_CHNL_MSK) == BTA_AV_CHNL_MSK) 1709 { 1710 /* this is the rc handle/index to tBTA_AV_RCB */ 1711 rc_handle = p_cb->disc & (~BTA_AV_CHNL_MSK); 1712 } 1713 else 1714 { 1715 p_scb = p_cb->p_scb[(p_cb->disc & BTA_AV_HNDL_MSK) - 1]; 1716 if (p_scb) 1717 rc_handle = p_scb->rc_handle; 1718 else 1719 { 1720 p_cb->disc = 0; 1721 return; 1722 } 1723 } 1724 1725 APPL_TRACE_DEBUG1("rc_handle %d", rc_handle); 1726 /* check peer version and whether support CT and TG role */ 1727 peer_features = bta_av_check_peer_features (UUID_SERVCLASS_AV_REMOTE_CONTROL); 1728 if ((p_cb->features & BTA_AV_FEAT_ADV_CTRL) && ((peer_features&BTA_AV_FEAT_ADV_CTRL) == 0)) 1729 { 1730 /* if we support advance control and peer does not, check their support on TG role 1731 * some implementation uses 1.3 on CT ans 1.4 on TG */ 1732 peer_features |= bta_av_check_peer_features (UUID_SERVCLASS_AV_REM_CTRL_TARGET); 1733 } 1734 1735 p_cb->disc = 0; 1736 utl_freebuf((void **) &p_cb->p_disc_db); 1737 1738 APPL_TRACE_DEBUG2("peer_features 0x%x, features 0x%x", peer_features, p_cb->features); 1739 1740 /* if we have no rc connection */ 1741 if (rc_handle == BTA_AV_RC_HANDLE_NONE) 1742 { 1743 if (p_scb) 1744 { 1745 /* if peer remote control service matches ours and USE_RC is TRUE */ 1746 if ((((p_cb->features & BTA_AV_FEAT_RCCT) && (peer_features & BTA_AV_FEAT_RCTG)) || 1747 ((p_cb->features & BTA_AV_FEAT_RCTG) && (peer_features & BTA_AV_FEAT_RCCT))) ) 1748 { 1749 p_lcb = bta_av_find_lcb(p_scb->peer_addr, BTA_AV_LCB_FIND); 1750 if(p_lcb) 1751 { 1752 rc_handle = bta_av_rc_create(p_cb, AVCT_INT, (UINT8)(p_scb->hdi + 1), p_lcb->lidx); 1753 p_cb->rcb[rc_handle].peer_features = peer_features; 1754 } 1755#if (BT_USE_TRACES == TRUE || BT_TRACE_APPL == TRUE) 1756 else 1757 { 1758 APPL_TRACE_ERROR0("can not find LCB!!"); 1759 } 1760#endif 1761 } 1762 else if(p_scb->use_rc) 1763 { 1764 /* can not find AVRC on peer device. report failure */ 1765 p_scb->use_rc = FALSE; 1766 bdcpy(rc_open.peer_addr, p_scb->peer_addr); 1767 rc_open.peer_features = 0; 1768 rc_open.status = BTA_AV_FAIL_SDP; 1769 (*p_cb->p_cback)(BTA_AV_RC_OPEN_EVT, (tBTA_AV *) &rc_open); 1770 } 1771 } 1772 } 1773 else 1774 { 1775 p_cb->rcb[rc_handle].peer_features = peer_features; 1776 rc_feat.rc_handle = rc_handle; 1777 rc_feat.peer_features = peer_features; 1778 (*p_cb->p_cback)(BTA_AV_RC_FEAT_EVT, (tBTA_AV *) &rc_feat); 1779 } 1780} 1781 1782/******************************************************************************* 1783** 1784** Function bta_av_rc_closed 1785** 1786** Description Set AVRCP state to closed. 1787** 1788** Returns void 1789** 1790*******************************************************************************/ 1791void bta_av_rc_closed(tBTA_AV_DATA *p_data) 1792{ 1793 tBTA_AV_CB *p_cb = &bta_av_cb; 1794 tBTA_AV_RC_CLOSE rc_close; 1795 tBTA_AV_RC_CONN_CHG *p_msg = (tBTA_AV_RC_CONN_CHG *)p_data; 1796 tBTA_AV_RCB *p_rcb; 1797 tBTA_AV_SCB *p_scb; 1798 int i; 1799 BOOLEAN conn = FALSE; 1800 tBTA_AV_LCB *p_lcb; 1801 1802 rc_close.rc_handle = BTA_AV_RC_HANDLE_NONE; 1803 APPL_TRACE_DEBUG1("bta_av_rc_closed rc_handle:%d", p_msg->handle); 1804 for(i=0; i<BTA_AV_NUM_RCB; i++) 1805 { 1806 p_rcb = &p_cb->rcb[i]; 1807 APPL_TRACE_DEBUG3("bta_av_rc_closed rcb[%d] rc_handle:%d, status=0x%x", i, p_rcb->handle, p_rcb->status); 1808 if(p_rcb->handle == p_msg->handle) 1809 { 1810 rc_close.rc_handle = i; 1811 p_rcb->status &= ~BTA_AV_RC_CONN_MASK; 1812 p_rcb->peer_features = 0; 1813 APPL_TRACE_DEBUG2(" shdl:%d, lidx:%d", p_rcb->shdl, p_rcb->lidx); 1814 if(p_rcb->shdl) 1815 { 1816 p_scb = bta_av_cb.p_scb[p_rcb->shdl - 1]; 1817 if(p_scb) 1818 { 1819 bdcpy(rc_close.peer_addr, p_scb->peer_addr); 1820 if(p_scb->rc_handle == p_rcb->handle) 1821 p_scb->rc_handle = BTA_AV_RC_HANDLE_NONE; 1822 APPL_TRACE_DEBUG2("shdl:%d, srch:%d", p_rcb->shdl, p_scb->rc_handle); 1823 } 1824 p_rcb->shdl = 0; 1825 } 1826 else if(p_rcb->lidx == (BTA_AV_NUM_LINKS + 1) ) 1827 { 1828 /* if the RCB uses the extra LCB, use the addr for event and clean it */ 1829 p_lcb = &p_cb->lcb[BTA_AV_NUM_LINKS]; 1830 bdcpy(rc_close.peer_addr, p_msg->peer_addr); 1831 APPL_TRACE_DEBUG6("rc_only closed bd_addr:%02x-%02x-%02x-%02x-%02x-%02x", 1832 p_msg->peer_addr[0], p_msg->peer_addr[1], 1833 p_msg->peer_addr[2], p_msg->peer_addr[3], 1834 p_msg->peer_addr[4], p_msg->peer_addr[5]); 1835 p_lcb->conn_msk = 0; 1836 p_lcb->lidx = 0; 1837 } 1838 p_rcb->lidx = 0; 1839 1840 if((p_rcb->status & BTA_AV_RC_ROLE_MASK) == BTA_AV_RC_ROLE_INT) 1841 { 1842 /* AVCT CCB is deallocated */ 1843 p_rcb->handle = BTA_AV_RC_HANDLE_NONE; 1844 p_rcb->status = 0; 1845 } 1846 else 1847 { 1848 /* AVCT CCB is still there. dealloc */ 1849 bta_av_del_rc(p_rcb); 1850 1851 /* if the AVRCP is no longer listening, create the listening channel */ 1852 if (bta_av_cb.rc_acp_handle == BTA_AV_RC_HANDLE_NONE && bta_av_cb.features & BTA_AV_FEAT_RCTG) 1853 bta_av_rc_create(&bta_av_cb, AVCT_ACP, 0, BTA_AV_NUM_LINKS + 1); 1854 } 1855 } 1856 else if((p_rcb->handle != BTA_AV_RC_HANDLE_NONE) && (p_rcb->status & BTA_AV_RC_CONN_MASK)) 1857 { 1858 /* at least one channel is still connected */ 1859 conn = TRUE; 1860 } 1861 } 1862 1863 if(!conn) 1864 { 1865 /* no AVRC channels are connected, go back to INIT state */ 1866 bta_av_sm_execute(p_cb, BTA_AV_AVRC_NONE_EVT, NULL); 1867 } 1868 1869 if (rc_close.rc_handle == BTA_AV_RC_HANDLE_NONE) 1870 { 1871 rc_close.rc_handle = p_msg->handle; 1872 bdcpy(rc_close.peer_addr, p_msg->peer_addr); 1873 } 1874 (*p_cb->p_cback)(BTA_AV_RC_CLOSE_EVT, (tBTA_AV *) &rc_close); 1875} 1876 1877/******************************************************************************* 1878** 1879** Function bta_av_rc_disc 1880** 1881** Description start AVRC SDP discovery. 1882** 1883** Returns void 1884** 1885*******************************************************************************/ 1886void bta_av_rc_disc(UINT8 disc) 1887{ 1888 tBTA_AV_CB *p_cb = &bta_av_cb; 1889 tAVRC_SDP_DB_PARAMS db_params; 1890 UINT16 attr_list[] = {ATTR_ID_SERVICE_CLASS_ID_LIST, 1891 ATTR_ID_BT_PROFILE_DESC_LIST, 1892 ATTR_ID_SUPPORTED_FEATURES}; 1893 UINT8 hdi; 1894 tBTA_AV_SCB *p_scb; 1895 UINT8 *p_addr = NULL; 1896 UINT8 rc_handle; 1897 1898 APPL_TRACE_DEBUG2("bta_av_rc_disc 0x%x, %d", disc, bta_av_cb.disc); 1899 if ((bta_av_cb.disc != 0) || (disc == 0)) 1900 return; 1901 1902 if ((disc & BTA_AV_CHNL_MSK) == BTA_AV_CHNL_MSK) 1903 { 1904 /* this is the rc handle/index to tBTA_AV_RCB */ 1905 rc_handle = disc & (~BTA_AV_CHNL_MSK); 1906 if (p_cb->rcb[rc_handle].lidx) 1907 { 1908 p_addr = p_cb->lcb[p_cb->rcb[rc_handle].lidx-1].addr; 1909 } 1910 } 1911 else 1912 { 1913 hdi = (disc & BTA_AV_HNDL_MSK) - 1; 1914 p_scb = p_cb->p_scb[hdi]; 1915 1916 if (p_scb) 1917 { 1918 APPL_TRACE_DEBUG1("rc_handle %d", p_scb->rc_handle); 1919 p_addr = p_scb->peer_addr; 1920 } 1921 } 1922 1923 if (p_addr) 1924 { 1925 /* allocate discovery database */ 1926 if (p_cb->p_disc_db == NULL) 1927 { 1928 p_cb->p_disc_db = (tSDP_DISCOVERY_DB *) GKI_getbuf(BTA_AV_DISC_BUF_SIZE); 1929 } 1930 1931 if (p_cb->p_disc_db) 1932 { 1933 /* set up parameters */ 1934 db_params.db_len = BTA_AV_DISC_BUF_SIZE; 1935 db_params.num_attr = 3; 1936 db_params.p_db = p_cb->p_disc_db; 1937 db_params.p_attrs = attr_list; 1938 1939 /* searching for UUID_SERVCLASS_AV_REMOTE_CONTROL gets both TG and CT */ 1940 if (AVRC_FindService(UUID_SERVCLASS_AV_REMOTE_CONTROL, p_addr, &db_params, 1941 bta_av_avrc_sdp_cback) == AVRC_SUCCESS) 1942 { 1943 p_cb->disc = disc; 1944 APPL_TRACE_DEBUG1("disc %d", p_cb->disc); 1945 } 1946 } 1947 } 1948} 1949 1950/******************************************************************************* 1951** 1952** Function bta_av_dereg_comp 1953** 1954** Description deregister complete. free the stream control block. 1955** 1956** Returns void 1957** 1958*******************************************************************************/ 1959void bta_av_dereg_comp(tBTA_AV_DATA *p_data) 1960{ 1961 tBTA_AV_CB *p_cb = &bta_av_cb; 1962 tBTA_AV_SCB *p_scb; 1963 tBTA_UTL_COD cod; 1964 UINT8 mask; 1965 BT_HDR *p_buf; 1966 1967 /* find the stream control block */ 1968 p_scb = bta_av_hndl_to_scb(p_data->hdr.layer_specific); 1969 1970 if(p_scb) 1971 { 1972 APPL_TRACE_DEBUG2("deregistered %d(h%d)", p_scb->chnl, p_scb->hndl); 1973 mask = BTA_AV_HNDL_TO_MSK(p_scb->hdi); 1974 if(p_scb->chnl == BTA_AV_CHNL_AUDIO) 1975 { 1976 p_cb->reg_audio &= ~mask; 1977 if ((p_cb->conn_audio & mask) && bta_av_cb.audio_open_cnt) 1978 { 1979 /* this channel is still marked as open. decrease the count */ 1980 bta_av_cb.audio_open_cnt--; 1981 } 1982 p_cb->conn_audio &= ~mask; 1983 1984 if (p_scb->q_tag == BTA_AV_Q_TAG_STREAM) 1985 { 1986 /* make sure no buffers are in q_info.a2d */ 1987 while((p_buf = (BT_HDR*)GKI_dequeue (&p_scb->q_info.a2d)) != NULL) 1988 GKI_freebuf(p_buf); 1989 } 1990 1991 /* remove the A2DP SDP record, if no more audio stream is left */ 1992 if(!p_cb->reg_audio) 1993 { 1994#if( defined BTA_AR_INCLUDED ) && (BTA_AR_INCLUDED == TRUE) 1995 bta_ar_dereg_avrc (UUID_SERVCLASS_AV_REMOTE_CONTROL, BTA_ID_AV); 1996#endif 1997 bta_av_del_sdp_rec(&p_cb->sdp_a2d_handle); 1998 bta_sys_remove_uuid(UUID_SERVCLASS_AUDIO_SOURCE); 1999 } 2000 } 2001 else 2002 { 2003 p_cb->reg_video &= ~mask; 2004 /* make sure that this channel is not connected */ 2005 p_cb->conn_video &= ~mask; 2006 /* remove the VDP SDP record, (only one video stream at most) */ 2007 bta_av_del_sdp_rec(&p_cb->sdp_vdp_handle); 2008 bta_sys_remove_uuid(UUID_SERVCLASS_VIDEO_SOURCE); 2009 } 2010 2011 /* make sure that the timer is not active */ 2012 bta_sys_stop_timer(&p_scb->timer); 2013 utl_freebuf((void **)&p_cb->p_scb[p_scb->hdi]); 2014 } 2015 2016 APPL_TRACE_DEBUG3("audio 0x%x, video: 0x%x, disable:%d", 2017 p_cb->reg_audio, p_cb->reg_video, p_cb->disabling); 2018 /* if no stream control block is active */ 2019 if((p_cb->reg_audio + p_cb->reg_video) == 0) 2020 { 2021#if( defined BTA_AR_INCLUDED ) && (BTA_AR_INCLUDED == TRUE) 2022 /* deregister from AVDT */ 2023 bta_ar_dereg_avdt(BTA_ID_AV); 2024 2025 /* deregister from AVCT */ 2026 bta_ar_dereg_avrc (UUID_SERVCLASS_AV_REM_CTRL_TARGET, BTA_ID_AV); 2027 bta_ar_dereg_avct(BTA_ID_AV); 2028#endif 2029 2030 if(p_cb->disabling) 2031 { 2032 p_cb->disabling = FALSE; 2033 bta_av_cb.features = 0; 2034 } 2035 2036 /* Clear the Capturing service class bit */ 2037 cod.service = BTM_COD_SERVICE_CAPTURING; 2038 utl_set_device_class(&cod, BTA_UTL_CLR_COD_SERVICE_CLASS); 2039 } 2040} 2041#endif /* BTA_AV_INCLUDED */ 2042