15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2002-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * This module contains API of the audio/video distribution transport 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * protocol. 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "avdt_api.h" 27911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include <string.h> 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "avdt_int.h" 29911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "avdtc_api.h" 30911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "bt_target.h" 31911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "bt_types.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h" 34911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "l2c_api.h" 35c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov#include "stack/include/a2dp_codec_api.h" 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Control block for AVDT */ 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttAVDT_CB avdt_cb; 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 40911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_idle_ccb_timer_timeout(void* data) { 41911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_CCB* p_ccb = (tAVDT_CCB*)data; 42911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t avdt_event = AVDT_CCB_IDLE_TOUT_EVT; 43911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t err_code = AVDT_ERR_TIMEOUT; 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 458e89469b5e223a48e1915f16862e81a3f4581259Myles Watson tAVDT_CCB_EVT avdt_ccb_evt; 468e89469b5e223a48e1915f16862e81a3f4581259Myles Watson avdt_ccb_evt.err_code = err_code; 478e89469b5e223a48e1915f16862e81a3f4581259Myles Watson avdt_ccb_event(p_ccb, avdt_event, &avdt_ccb_evt); 4878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov} 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 50911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_ret_ccb_timer_timeout(void* data) { 51911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_CCB* p_ccb = (tAVDT_CCB*)data; 52911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t avdt_event = AVDT_CCB_RET_TOUT_EVT; 53911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t err_code = AVDT_ERR_TIMEOUT; 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 558e89469b5e223a48e1915f16862e81a3f4581259Myles Watson tAVDT_CCB_EVT avdt_ccb_evt; 568e89469b5e223a48e1915f16862e81a3f4581259Myles Watson avdt_ccb_evt.err_code = err_code; 578e89469b5e223a48e1915f16862e81a3f4581259Myles Watson avdt_ccb_event(p_ccb, avdt_event, &avdt_ccb_evt); 5878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov} 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 60911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_rsp_ccb_timer_timeout(void* data) { 61911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_CCB* p_ccb = (tAVDT_CCB*)data; 62911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t avdt_event = AVDT_CCB_RSP_TOUT_EVT; 63911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t err_code = AVDT_ERR_TIMEOUT; 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 658e89469b5e223a48e1915f16862e81a3f4581259Myles Watson tAVDT_CCB_EVT avdt_ccb_evt; 668e89469b5e223a48e1915f16862e81a3f4581259Myles Watson avdt_ccb_evt.err_code = err_code; 678e89469b5e223a48e1915f16862e81a3f4581259Myles Watson avdt_ccb_event(p_ccb, avdt_event, &avdt_ccb_evt); 6878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov} 6978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov 70911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_scb_transport_channel_timer_timeout(void* data) { 71911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB* p_scb = (tAVDT_SCB*)data; 72911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t avdt_event = AVDT_SCB_TC_TOUT_EVT; 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 74911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_scb_event(p_scb, avdt_event, NULL); 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 78ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 79ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function AVDT_Register 80ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 81ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This is the system level registration function for the 82ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * AVDTP protocol. This function initializes AVDTP and 83ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * prepares the protocol stack for its use. This function 84ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * must be called once by the system or platform using AVDTP 85ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * before the other functions of the API an be used. 86ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 87ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 88ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 89ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 90ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 91911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid AVDT_Register(tAVDT_REG* p_reg, tAVDT_CTRL_CBACK* p_cback) { 92911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* register PSM with L2CAP */ 93911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson L2CA_Register(AVDT_PSM, (tL2CAP_APPL_INFO*)&avdt_l2c_appl); 94911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 95911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* set security level */ 96911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SetSecurityLevel(true, "", BTM_SEC_SERVICE_AVDTP, p_reg->sec_mask, 97911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson AVDT_PSM, BTM_SEC_PROTO_AVDT, AVDT_CHAN_SIG); 98911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SetSecurityLevel(false, "", BTM_SEC_SERVICE_AVDTP, p_reg->sec_mask, 99911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson AVDT_PSM, BTM_SEC_PROTO_AVDT, AVDT_CHAN_SIG); 100911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 101911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* do not use security on the media channel */ 102911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SetSecurityLevel(true, "", BTM_SEC_SERVICE_AVDTP_NOSEC, BTM_SEC_NONE, 103911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson AVDT_PSM, BTM_SEC_PROTO_AVDT, AVDT_CHAN_MEDIA); 104911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SetSecurityLevel(false, "", BTM_SEC_SERVICE_AVDTP_NOSEC, BTM_SEC_NONE, 105911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson AVDT_PSM, BTM_SEC_PROTO_AVDT, AVDT_CHAN_MEDIA); 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 107d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (AVDT_REPORTING == TRUE) 108911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* do not use security on the reporting channel */ 109911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SetSecurityLevel(true, "", BTM_SEC_SERVICE_AVDTP_NOSEC, BTM_SEC_NONE, 110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson AVDT_PSM, BTM_SEC_PROTO_AVDT, AVDT_CHAN_REPORT); 111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SetSecurityLevel(false, "", BTM_SEC_SERVICE_AVDTP_NOSEC, BTM_SEC_NONE, 112911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson AVDT_PSM, BTM_SEC_PROTO_AVDT, AVDT_CHAN_REPORT); 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 115911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* initialize AVDTP data structures */ 116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_scb_init(); 117911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_ccb_init(); 118911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_ad_init(); 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 120911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* copy registration struct */ 121911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(&avdt_cb.rcb, p_reg, sizeof(tAVDT_REG)); 122911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_cb.p_conn_cback = p_cback; 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 126ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 127ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function AVDT_Deregister 128ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 129ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to deregister use AVDTP protocol. 130ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * It is called when AVDTP is no longer being used by any 131ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * application in the system. Before this function can be 1329ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * called, all streams must be removed with 1339ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * AVDT_RemoveStream(). 134ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 135ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 136ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void 137ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 138ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid AVDT_Deregister(void) { 140911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* deregister PSM with L2CAP */ 141911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson L2CA_Deregister(AVDT_PSM); 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid AVDT_AbortReq(uint8_t handle) { 145c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_WARNING("%s: handle=%d", __func__, handle); 1466a27776c488dd5ce2d29bce543ee42a12dfad60bAnubhav Gupta 147911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB* p_scb = avdt_scb_by_hdl(handle); 148911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_scb != NULL) { 149911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_scb_event(p_scb, AVDT_SCB_API_ABORT_REQ_EVT, NULL); 150911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 151911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson AVDT_TRACE_ERROR("%s Improper SCB, can not abort the stream", __func__); 152911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1536a27776c488dd5ce2d29bce543ee42a12dfad60bAnubhav Gupta} 1546a27776c488dd5ce2d29bce543ee42a12dfad60bAnubhav Gupta 155cc35559160745c60b42ae182002a59337d844d09Hemant Gupta/******************************************************************************* 156ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 157ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function AVDT_CreateStream 158ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 159ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Create a stream endpoint. After a stream endpoint is 160ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * created an application can initiate a connection between 161ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * this endpoint and an endpoint on a peer device. In 162ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * addition, a peer device can discover, get the capabilities, 163ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * and connect to this endpoint. 164ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 165ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 166ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns AVDT_SUCCESS if successful, otherwise error. 167ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 168ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 169911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t AVDT_CreateStream(uint8_t* p_handle, tAVDT_CS* p_cs) { 170911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t result = AVDT_SUCCESS; 171911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB* p_scb; 172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 173c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s", __func__); 174c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Verify parameters; if invalid, return failure */ 176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (((p_cs->cfg.psc_mask & (~AVDT_PSC)) != 0) || 177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_cs->p_ctrl_cback == NULL)) { 178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = AVDT_BAD_PARAMS; 179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 180911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* Allocate scb; if no scbs, return failure */ 181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else { 182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_scb = avdt_scb_alloc(p_cs); 183911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_scb == NULL) { 184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = AVDT_NO_RESOURCES; 185911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 186911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p_handle = avdt_scb_to_hdl(p_scb); 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 189c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 190c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: result=%d", __func__, result); 191c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 192911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return result; 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 196ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 197ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function AVDT_RemoveStream 198ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 199ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Remove a stream endpoint. This function is called when 200ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the application is no longer using a stream endpoint. 201ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * If this function is called when the endpoint is connected 202ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the connection is closed and then the stream endpoint 203ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * is removed. 204ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 205ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 206ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns AVDT_SUCCESS if successful, otherwise error. 207ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 208ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 209911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t AVDT_RemoveStream(uint8_t handle) { 210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t result = AVDT_SUCCESS; 211911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB* p_scb; 212911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 213c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: handle=%d", __func__, handle); 214c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 215911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* look up scb */ 216911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_scb = avdt_scb_by_hdl(handle); 217911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_scb == NULL) { 218911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = AVDT_BAD_HANDLE; 219911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 220911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send remove event to scb */ 221911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_scb_event(p_scb, AVDT_SCB_API_REMOVE_EVT, NULL); 222911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 223c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 224c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: result=%d", __func__, result); 225c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 226911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return result; 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 230ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 231ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function AVDT_DiscoverReq 232ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 233ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function initiates a connection to the AVDTP service 234ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * on the peer device, if not already present, and discovers 235ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the stream endpoints on the peer device. (Please note 236ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * that AVDTP discovery is unrelated to SDP discovery). 2379ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * This function can be called at any time regardless of 2389ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * whether there is an AVDTP connection to the peer device. 239ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 240ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * When discovery is complete, an AVDT_DISCOVER_CFM_EVT 241ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * is sent to the application via its callback function. 242ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * The application must not call AVDT_GetCapReq() or 243ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * AVDT_DiscoverReq() again to the same device until 244ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * discovery is complete. 245ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 246ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * The memory addressed by sep_info is allocated by the 247ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * application. This memory is written to by AVDTP as part 248ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * of the discovery procedure. This memory must remain 249ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * accessible until the application receives the 250ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * AVDT_DISCOVER_CFM_EVT. 251ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 252ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns AVDT_SUCCESS if successful, otherwise error. 253ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 254ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 2559e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskiuint16_t AVDT_DiscoverReq(const RawAddress& bd_addr, tAVDT_SEP_INFO* p_sep_info, 2569e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowski uint8_t max_seps, tAVDT_CTRL_CBACK* p_cback) { 257911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_CCB* p_ccb; 258911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t result = AVDT_SUCCESS; 259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_CCB_EVT evt; 260911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 261c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s", __func__); 262c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* find channel control block for this bd addr; if none, allocate one */ 264911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb = avdt_ccb_by_bd(bd_addr); 265911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_ccb == NULL) { 266911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb = avdt_ccb_alloc(bd_addr); 267911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_ccb == NULL) { 268911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* could not allocate channel control block */ 269911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = AVDT_NO_RESOURCES; 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 271911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 273911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (result == AVDT_SUCCESS) { 274911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* make sure no discovery or get capabilities req already in progress */ 275911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_ccb->proc_busy) { 276911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = AVDT_BUSY; 277911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 278911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send event to ccb */ 279911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else { 280911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt.discover.p_sep_info = p_sep_info; 281911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt.discover.num_seps = max_seps; 282911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt.discover.p_cback = p_cback; 283911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_ccb_event(p_ccb, AVDT_CCB_API_DISCOVER_REQ_EVT, &evt); 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 285911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 286c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 287c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: result=%d", __func__, result); 288c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 289911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return result; 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 293ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 294ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_get_cap_req 295ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 296ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description internal function to serve both AVDT_GetCapReq and 297ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * AVDT_GetAllCapReq 298ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 299ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns AVDT_SUCCESS if successful, otherwise error. 300ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 301ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 3029e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskistatic uint16_t avdt_get_cap_req(const RawAddress& bd_addr, 303903c16685e62e7721d44460b9171e020f38609f5Jakub Pawlowski tAVDT_CCB_API_GETCAP* p_evt) { 304911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_CCB* p_ccb = NULL; 305911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t result = AVDT_SUCCESS; 306911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 307c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s", __func__); 308c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 309911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* verify SEID */ 310911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_evt->single.seid < AVDT_SEID_MIN) || 311911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_evt->single.seid > AVDT_SEID_MAX)) { 312911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson AVDT_TRACE_ERROR("seid: %d", p_evt->single.seid); 313911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = AVDT_BAD_PARAMS; 314911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 315911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* find channel control block for this bd addr; if none, allocate one */ 316911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else { 317911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb = avdt_ccb_by_bd(bd_addr); 318911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_ccb == NULL) { 319911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb = avdt_ccb_alloc(bd_addr); 320911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_ccb == NULL) { 321911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* could not allocate channel control block */ 322911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = AVDT_NO_RESOURCES; 323911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 325911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 327911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (result == AVDT_SUCCESS) { 328911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* make sure no discovery or get capabilities req already in progress */ 329911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_ccb->proc_busy) { 330911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = AVDT_BUSY; 331911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 332911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send event to ccb */ 333911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else { 334911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_ccb_event(p_ccb, AVDT_CCB_API_GETCAP_REQ_EVT, (tAVDT_CCB_EVT*)p_evt); 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 336911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 337c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 338c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: result=%d", __func__, result); 339c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 340911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return result; 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 344ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 345ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function AVDT_GetCapReq 346ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 347ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function initiates a connection to the AVDTP service 348ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * on the peer device, if not already present, and gets the 349ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * capabilities of a stream endpoint on the peer device. 350ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * This function can be called at any time regardless of 351ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * whether there is an AVDTP connection to the peer device. 352ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 353ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * When the procedure is complete, an AVDT_GETCAP_CFM_EVT is 354ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * sent to the application via its callback function. The 355ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * application must not call AVDT_GetCapReq() or 356ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * AVDT_DiscoverReq() again until the procedure is complete. 357ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 358ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * The memory pointed to by p_cfg is allocated by the 359ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * application. This memory is written to by AVDTP as part 360ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * of the get capabilities procedure. This memory must 361ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * remain accessible until the application receives 362ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the AVDT_GETCAP_CFM_EVT. 363ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 364ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns AVDT_SUCCESS if successful, otherwise error. 365ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 366ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 3679e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskiuint16_t AVDT_GetCapReq(const RawAddress& bd_addr, uint8_t seid, 368903c16685e62e7721d44460b9171e020f38609f5Jakub Pawlowski tAVDT_CFG* p_cfg, tAVDT_CTRL_CBACK* p_cback) { 369911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_CCB_API_GETCAP getcap; 370c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov uint16_t result = AVDT_SUCCESS; 371c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 372c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s", __func__); 373911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 374911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson getcap.single.seid = seid; 375911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson getcap.single.sig_id = AVDT_SIG_GETCAP; 376911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson getcap.p_cfg = p_cfg; 377911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson getcap.p_cback = p_cback; 378c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov result = avdt_get_cap_req(bd_addr, &getcap); 379c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 380c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: result=%d", __func__, result); 381c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 382c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov return result; 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 386ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 387ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function AVDT_GetAllCapReq 388ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 389ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function initiates a connection to the AVDTP service 390ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * on the peer device, if not already present, and gets the 391ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * capabilities of a stream endpoint on the peer device. 392ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * This function can be called at any time regardless of 393ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * whether there is an AVDTP connection to the peer device. 394ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 395ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * When the procedure is complete, an AVDT_GETCAP_CFM_EVT is 396ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * sent to the application via its callback function. The 397ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * application must not call AVDT_GetCapReq() or 398ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * AVDT_DiscoverReq() again until the procedure is complete. 399ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 400ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * The memory pointed to by p_cfg is allocated by the 401ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * application. This memory is written to by AVDTP as part 402ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * of the get capabilities procedure. This memory must 403ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * remain accessible until the application receives 404ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the AVDT_GETCAP_CFM_EVT. 405ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 406ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns AVDT_SUCCESS if successful, otherwise error. 407ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 408ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 4099e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskiuint16_t AVDT_GetAllCapReq(const RawAddress& bd_addr, uint8_t seid, 410903c16685e62e7721d44460b9171e020f38609f5Jakub Pawlowski tAVDT_CFG* p_cfg, tAVDT_CTRL_CBACK* p_cback) { 411911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_CCB_API_GETCAP getcap; 412c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov uint16_t result = AVDT_SUCCESS; 413c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 414c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s", __func__); 415911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 416911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson getcap.single.seid = seid; 417911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson getcap.single.sig_id = AVDT_SIG_GET_ALLCAP; 418911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson getcap.p_cfg = p_cfg; 419911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson getcap.p_cback = p_cback; 420c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov result = avdt_get_cap_req(bd_addr, &getcap); 421c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 422c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: result=%d", __func__, result); 423c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 424c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov return result; 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 428ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 429ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function AVDT_DelayReport 430ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 431ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This functions sends a Delay Report to the peer device 432ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * that is associated with a particular SEID. 433ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * This function is called by SNK device. 434ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 435ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns AVDT_SUCCESS if successful, otherwise error. 436ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 437ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 438911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t AVDT_DelayReport(uint8_t handle, uint8_t seid, uint16_t delay) { 439911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB* p_scb; 440911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t result = AVDT_SUCCESS; 441911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB_EVT evt; 442911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 443c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: handle=%d ceid=%d delay=%d", __func__, handle, seid, 444c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov delay); 445c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 446911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* map handle to scb */ 447911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_scb = avdt_scb_by_hdl(handle); 448911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_scb == NULL) { 449911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = AVDT_BAD_HANDLE; 450911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 451911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send event to scb */ 452911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 453911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt.apidelay.hdr.seid = seid; 454911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt.apidelay.delay = delay; 455911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_scb_event(p_scb, AVDT_SCB_API_DELAY_RPT_REQ_EVT, &evt); 456911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 457911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 458c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: result=%d", __func__, result); 459c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 460911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return result; 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 464ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 465ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function AVDT_OpenReq 466ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 467ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function initiates a connection to the AVDTP service 468ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * on the peer device, if not already present, and connects 469ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * to a stream endpoint on a peer device. When the connection 470ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * is completed, an AVDT_OPEN_CFM_EVT is sent to the 4719ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * application via the control callback function for this 4729ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * handle. 473ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 474ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns AVDT_SUCCESS if successful, otherwise error. 475ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 476ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 4779e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskiuint16_t AVDT_OpenReq(uint8_t handle, const RawAddress& bd_addr, uint8_t seid, 478911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_CFG* p_cfg) { 479911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_CCB* p_ccb = NULL; 480911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB* p_scb = NULL; 481911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t result = AVDT_SUCCESS; 482911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB_EVT evt; 483911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 484c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: handle=%d seid=%d", __func__, handle, seid); 485c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 486911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* verify SEID */ 487911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((seid < AVDT_SEID_MIN) || (seid > AVDT_SEID_MAX)) { 488911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = AVDT_BAD_PARAMS; 489911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 490911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* map handle to scb */ 491911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else { 492911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_scb = avdt_scb_by_hdl(handle); 493911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_scb == NULL) { 494911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = AVDT_BAD_HANDLE; 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 496f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen /* find channel control block for this bd addr; if none, allocate one */ 497911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else { 498911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb = avdt_ccb_by_bd(bd_addr); 499911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_ccb == NULL) { 500911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb = avdt_ccb_alloc(bd_addr); 501911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_ccb == NULL) { 502911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* could not allocate channel control block */ 503911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = AVDT_NO_RESOURCES; 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 505911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 507911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 508911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 509911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send event to scb */ 510911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (result == AVDT_SUCCESS) { 511c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov A2DP_DumpCodecInfo(p_cfg->codec_info); 512c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 513911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt.msg.config_cmd.hdr.seid = seid; 514911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt.msg.config_cmd.hdr.ccb_idx = avdt_ccb_to_idx(p_ccb); 515911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt.msg.config_cmd.int_seid = handle; 516911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt.msg.config_cmd.p_cfg = p_cfg; 517911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_scb_event(p_scb, AVDT_SCB_API_SETCONFIG_REQ_EVT, &evt); 518911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 519c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 520c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: result=%d", __func__, result); 521c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 522911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return result; 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 526ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 527ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function AVDT_ConfigRsp 528ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 529ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Respond to a configure request from the peer device. This 530ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * function must be called if the application receives an 531ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * AVDT_CONFIG_IND_EVT through its control callback. 532ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 533ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 534ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns AVDT_SUCCESS if successful, otherwise error. 535ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 536ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 537911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t AVDT_ConfigRsp(uint8_t handle, uint8_t label, uint8_t error_code, 538911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t category) { 539911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB* p_scb; 540911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB_EVT evt; 541911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t result = AVDT_SUCCESS; 542911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t event_code; 543911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 544c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: handle=%d label=%d error_code=%d category=%d", __func__, 545c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov handle, label, error_code, category); 546c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 547911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* map handle to scb */ 548911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_scb = avdt_scb_by_hdl(handle); 549911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_scb == NULL) { 550911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = AVDT_BAD_HANDLE; 551911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 552911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* handle special case when this function is called but peer has not send 553911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ** a configuration cmd; ignore and return error result 554911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 555911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else if (!p_scb->in_use) { 556911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = AVDT_BAD_HANDLE; 557911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 558911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send event to scb */ 559911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else { 560911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt.msg.hdr.err_code = error_code; 561911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt.msg.hdr.err_param = category; 562911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt.msg.hdr.label = label; 563911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (error_code == 0) { 564911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson event_code = AVDT_SCB_API_SETCONFIG_RSP_EVT; 565911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 566911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson event_code = AVDT_SCB_API_SETCONFIG_REJ_EVT; 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 568911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_scb_event(p_scb, event_code, &evt); 569911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 571c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: result=%d", __func__, result); 572c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 573911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return result; 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 577ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 578ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function AVDT_StartReq 579ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 580ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Start one or more stream endpoints. This initiates the 581ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * transfer of media packets for the streams. All stream 582ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * endpoints must previously be opened. When the streams 583ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * are started, an AVDT_START_CFM_EVT is sent to the 5849ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * application via the control callback function for each 5859ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * stream. 586ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 587ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 588ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns AVDT_SUCCESS if successful, otherwise error. 589ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 590ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 591911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t AVDT_StartReq(uint8_t* p_handles, uint8_t num_handles) { 592911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB* p_scb = NULL; 593911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_CCB_EVT evt; 594911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t result = AVDT_SUCCESS; 595911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int i; 596911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 597c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: num_handles=%d", __func__, num_handles); 598c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 599911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((num_handles == 0) || (num_handles > AVDT_NUM_SEPS)) { 600911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = AVDT_BAD_PARAMS; 601911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 602911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* verify handles */ 603911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (i = 0; i < num_handles; i++) { 604911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_scb = avdt_scb_by_hdl(p_handles[i]); 605911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_scb == NULL) { 606911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = AVDT_BAD_HANDLE; 607911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 608911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 610911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 612911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (result == AVDT_SUCCESS) { 613911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_scb->p_ccb == NULL) { 614911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = AVDT_BAD_HANDLE; 615911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 616911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send event to ccb */ 617911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(evt.msg.multi.seid_list, p_handles, num_handles); 618911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt.msg.multi.num_seps = num_handles; 619911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_ccb_event(p_scb->p_ccb, AVDT_CCB_API_START_REQ_EVT, &evt); 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 621911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 622c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 623c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: result=%d", __func__, result); 624c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 625911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return result; 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 629ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 630ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function AVDT_SuspendReq 631ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 632ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Suspend one or more stream endpoints. This suspends the 633ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * transfer of media packets for the streams. All stream 634ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * endpoints must previously be open and started. When the 635ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * streams are suspended, an AVDT_SUSPEND_CFM_EVT is sent to 636ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the application via the control callback function for 637ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * each stream. 638ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 639ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 640ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns AVDT_SUCCESS if successful, otherwise error. 641ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 642ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 643911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t AVDT_SuspendReq(uint8_t* p_handles, uint8_t num_handles) { 644911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB* p_scb = NULL; 645911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_CCB_EVT evt; 646911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t result = AVDT_SUCCESS; 647911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int i; 648911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 649c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: num_handles=%d", __func__, num_handles); 650c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 651911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((num_handles == 0) || (num_handles > AVDT_NUM_SEPS)) { 652911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = AVDT_BAD_PARAMS; 653911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 654911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* verify handles */ 655911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (i = 0; i < num_handles; i++) { 656911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_scb = avdt_scb_by_hdl(p_handles[i]); 657911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_scb == NULL) { 658911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = AVDT_BAD_HANDLE; 659911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 660911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 662911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 664911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (result == AVDT_SUCCESS) { 665911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_scb->p_ccb == NULL) { 666911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = AVDT_BAD_HANDLE; 667911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 668911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send event to ccb */ 669911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(evt.msg.multi.seid_list, p_handles, num_handles); 670911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt.msg.multi.num_seps = num_handles; 671911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_ccb_event(p_scb->p_ccb, AVDT_CCB_API_SUSPEND_REQ_EVT, &evt); 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 673911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 675c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: result=%d", __func__, result); 676c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 677911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return result; 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 681ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 682ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function AVDT_CloseReq 683ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 684ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Close a stream endpoint. This stops the transfer of media 685ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * packets and closes the transport channel associated with 686ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * this stream endpoint. When the stream is closed, an 687ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * AVDT_CLOSE_CFM_EVT is sent to the application via the 688ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * control callback function for this handle. 689ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 690ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 691ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns AVDT_SUCCESS if successful, otherwise error. 692ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 693ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 694911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t AVDT_CloseReq(uint8_t handle) { 695911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB* p_scb; 696911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t result = AVDT_SUCCESS; 697911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 698c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: handle=%d", __func__, handle); 699c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 700911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* map handle to scb */ 701911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_scb = avdt_scb_by_hdl(handle); 702911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_scb == NULL) { 703911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = AVDT_BAD_HANDLE; 704911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else 705911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send event to scb */ 706911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson { 707911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_scb_event(p_scb, AVDT_SCB_API_CLOSE_REQ_EVT, NULL); 708911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 709911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 710c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: result=%d", __func__, result); 711c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 712911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return result; 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 716ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 717ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function AVDT_ReconfigReq 718ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 719ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Reconfigure a stream endpoint. This allows the application 720ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * to change the codec or content protection capabilities of 721ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * a stream endpoint after it has been opened. This function 722ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * can only be called if the stream is opened but not started 723ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * or if the stream has been suspended. When the procedure 724ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * is completed, an AVDT_RECONFIG_CFM_EVT is sent to the 7259ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * application via the control callback function for this 7269ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * handle. 727ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 728ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 729ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns AVDT_SUCCESS if successful, otherwise error. 730ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 731ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 732911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t AVDT_ReconfigReq(uint8_t handle, tAVDT_CFG* p_cfg) { 733911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB* p_scb; 734911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t result = AVDT_SUCCESS; 735911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB_EVT evt; 736911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 737c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: handle=%d", __func__, handle); 738c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 739911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* map handle to scb */ 740911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_scb = avdt_scb_by_hdl(handle); 741911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_scb == NULL) { 742911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = AVDT_BAD_HANDLE; 743911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 744911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send event to scb */ 745911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else { 746911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* force psc_mask to zero */ 747911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cfg->psc_mask = 0; 748911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt.msg.reconfig_cmd.p_cfg = p_cfg; 749911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_scb_event(p_scb, AVDT_SCB_API_RECONFIG_REQ_EVT, &evt); 750911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 751c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 752c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: result=%d", __func__, result); 753c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 754911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return result; 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 758ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 759ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function AVDT_ReconfigRsp 760ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 761ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Respond to a reconfigure request from the peer device. 762ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * This function must be called if the application receives 763ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * an AVDT_RECONFIG_IND_EVT through its control callback. 764ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 765ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 766ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns AVDT_SUCCESS if successful, otherwise error. 767ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 768ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 769911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t AVDT_ReconfigRsp(uint8_t handle, uint8_t label, uint8_t error_code, 770911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t category) { 771911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB* p_scb; 772911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB_EVT evt; 773911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t result = AVDT_SUCCESS; 774911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 775c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: handle=%d label=%d error_code=%d category=%d", __func__, 776c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov handle, label, error_code, category); 777c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 778911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* map handle to scb */ 779911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_scb = avdt_scb_by_hdl(handle); 780911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_scb == NULL) { 781911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = AVDT_BAD_HANDLE; 782911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 783911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send event to scb */ 784911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else { 785911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt.msg.hdr.err_code = error_code; 786911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt.msg.hdr.err_param = category; 787911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt.msg.hdr.label = label; 788911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_scb_event(p_scb, AVDT_SCB_API_RECONFIG_RSP_EVT, &evt); 789911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 790911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 791c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: result=%d", __func__, result); 792c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 793911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return result; 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 797ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 798ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function AVDT_SecurityReq 799ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 800ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Send a security request to the peer device. When the 801ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * security procedure is completed, an AVDT_SECURITY_CFM_EVT 802ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * is sent to the application via the control callback function 8039ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * for this handle. (Please note that AVDTP security 8049ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * procedures are unrelated to Bluetooth link level security.) 805ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 806ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 807ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns AVDT_SUCCESS if successful, otherwise error. 808ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 809ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 810911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t AVDT_SecurityReq(uint8_t handle, uint8_t* p_data, uint16_t len) { 811911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB* p_scb; 812911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t result = AVDT_SUCCESS; 813911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB_EVT evt; 814911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 815c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: handle=%d len=%d", __func__, handle, len); 816c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 817911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* map handle to scb */ 818911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_scb = avdt_scb_by_hdl(handle); 819911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_scb == NULL) { 820911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = AVDT_BAD_HANDLE; 821911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 822911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send event to scb */ 823911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else { 824911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt.msg.security_rsp.p_data = p_data; 825911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt.msg.security_rsp.len = len; 826911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_scb_event(p_scb, AVDT_SCB_API_SECURITY_REQ_EVT, &evt); 827911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 828c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 829c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: result=%d", __func__, result); 830c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 831911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return result; 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 835ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 836ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function AVDT_SecurityRsp 837ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 838ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Respond to a security request from the peer device. 839ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * This function must be called if the application receives 840ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * an AVDT_SECURITY_IND_EVT through its control callback. 841ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * (Please note that AVDTP security procedures are unrelated 842ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * to Bluetooth link level security.) 843ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 844ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 845ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns AVDT_SUCCESS if successful, otherwise error. 846ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 847ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 848d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint16_t AVDT_SecurityRsp(uint8_t handle, uint8_t label, uint8_t error_code, 849911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p_data, uint16_t len) { 850911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB* p_scb; 851911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t result = AVDT_SUCCESS; 852911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB_EVT evt; 853911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 854c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: handle=%d label=%d error_code=%d len=%d", __func__, 855c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov handle, label, error_code, len); 856c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 857911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* map handle to scb */ 858911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_scb = avdt_scb_by_hdl(handle); 859911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_scb == NULL) { 860911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = AVDT_BAD_HANDLE; 861911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 862911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send event to scb */ 863911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else { 864911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt.msg.security_rsp.hdr.err_code = error_code; 865911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt.msg.security_rsp.hdr.label = label; 866911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt.msg.security_rsp.p_data = p_data; 867911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt.msg.security_rsp.len = len; 868911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_scb_event(p_scb, AVDT_SCB_API_SECURITY_RSP_EVT, &evt); 869911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 870c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 871c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: result=%d", __func__, result); 872c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 873911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return result; 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 877ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 878ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function AVDT_WriteReqOpt 879ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 880ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Send a media packet to the peer device. The stream must 881ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * be started before this function is called. Also, this 882ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * function can only be called if the stream is a SRC. 883ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 884ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * When AVDTP has sent the media packet and is ready for the 885ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * next packet, an AVDT_WRITE_CFM_EVT is sent to the 886ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * application via the control callback. The application must 887ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * wait for the AVDT_WRITE_CFM_EVT before it makes the next 888ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * call to AVDT_WriteReq(). If the applications calls 889ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * AVDT_WriteReq() before it receives the event the packet 890ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * will not be sent. The application may make its first call 891ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * to AVDT_WriteReq() after it receives an AVDT_START_CFM_EVT 892ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * or AVDT_START_IND_EVT. 893ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 8949ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * The application passes the packet using the BT_HDR 8959ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * structure. 896ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * This structure is described in section 2.1. The offset 897ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * field must be equal to or greater than AVDT_MEDIA_OFFSET 898ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * (if NO_RTP is specified, L2CAP_MIN_OFFSET can be used). 899ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * This allows enough space in the buffer for the L2CAP and 900ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * AVDTP headers. 901ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 902ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * The memory pointed to by p_pkt must be a GKI buffer 903ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * allocated by the application. This buffer will be freed 904ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * by the protocol stack; the application must not free 905ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * this buffer. 906ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 907ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * The opt parameter allows passing specific options like: 908ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * - NO_RTP : do not add the RTP header to buffer 909ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 910ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns AVDT_SUCCESS if successful, otherwise error. 911ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 912ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 913911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t AVDT_WriteReqOpt(uint8_t handle, BT_HDR* p_pkt, uint32_t time_stamp, 914911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t m_pt, tAVDT_DATA_OPT_MASK opt) { 915911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB* p_scb; 916911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB_EVT evt; 917911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t result = AVDT_SUCCESS; 918911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 919c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: handle=%d timestamp=%d m_pt=0x%x opt=0x%x", __func__, 920c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov handle, time_stamp, m_pt, opt); 921c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 922911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* map handle to scb */ 923911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_scb = avdt_scb_by_hdl(handle); 924911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_scb == NULL) { 925911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = AVDT_BAD_HANDLE; 926911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 927911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt.apiwrite.p_buf = p_pkt; 928911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt.apiwrite.time_stamp = time_stamp; 929911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt.apiwrite.m_pt = m_pt; 930911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt.apiwrite.opt = opt; 931911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_scb_event(p_scb, AVDT_SCB_API_WRITE_REQ_EVT, &evt); 932911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 933911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 934c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: result=%d", __func__, result); 935c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 936911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return result; 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 940ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 941ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function AVDT_WriteReq 942ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 943ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Send a media packet to the peer device. The stream must 944ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * be started before this function is called. Also, this 945ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * function can only be called if the stream is a SRC. 946ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 947ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * When AVDTP has sent the media packet and is ready for the 948ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * next packet, an AVDT_WRITE_CFM_EVT is sent to the 949ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * application via the control callback. The application must 950ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * wait for the AVDT_WRITE_CFM_EVT before it makes the next 951ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * call to AVDT_WriteReq(). If the applications calls 952ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * AVDT_WriteReq() before it receives the event the packet 953ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * will not be sent. The application may make its first call 954ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * to AVDT_WriteReq() after it receives an AVDT_START_CFM_EVT 955ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * or AVDT_START_IND_EVT. 956ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 9579ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * The application passes the packet using the BT_HDR 9589ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * structure. 959ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * This structure is described in section 2.1. The offset 960ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * field must be equal to or greater than AVDT_MEDIA_OFFSET. 961ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * This allows enough space in the buffer for the L2CAP and 962ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * AVDTP headers. 963ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 964ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * The memory pointed to by p_pkt must be a GKI buffer 965ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * allocated by the application. This buffer will be freed 966ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * by the protocol stack; the application must not free 967ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * this buffer. 968ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 969ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 970ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns AVDT_SUCCESS if successful, otherwise error. 971ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 972ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 973911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t AVDT_WriteReq(uint8_t handle, BT_HDR* p_pkt, uint32_t time_stamp, 974911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t m_pt) { 975911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return AVDT_WriteReqOpt(handle, p_pkt, time_stamp, m_pt, AVDT_DATA_OPT_NONE); 976ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 977ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 978ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 979ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 980ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function AVDT_ConnectReq 981ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 982ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function initiates an AVDTP signaling connection 983ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * to the peer device. When the connection is completed, an 984ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * AVDT_CONNECT_IND_EVT is sent to the application via its 985ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * control callback function. If the connection attempt fails 986ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * an AVDT_DISCONNECT_IND_EVT is sent. The security mask 987ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * parameter overrides the outgoing security mask set in 988ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * AVDT_Register(). 989ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 990ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns AVDT_SUCCESS if successful, otherwise error. 991ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 992ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 9939e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskiuint16_t AVDT_ConnectReq(const RawAddress& bd_addr, uint8_t sec_mask, 994911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_CTRL_CBACK* p_cback) { 995911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_CCB* p_ccb = NULL; 996911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t result = AVDT_SUCCESS; 997911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_CCB_EVT evt; 998911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 999c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: sec_mask=0x%x", __func__, sec_mask); 1000c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 1001911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* find channel control block for this bd addr; if none, allocate one */ 1002911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb = avdt_ccb_by_bd(bd_addr); 1003911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_ccb == NULL) { 1004911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb = avdt_ccb_alloc(bd_addr); 1005911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_ccb == NULL) { 1006911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* could not allocate channel control block */ 1007911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = AVDT_NO_RESOURCES; 10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1009911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else if (p_ccb->ll_opened == false) { 1010911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson AVDT_TRACE_WARNING("AVDT_ConnectReq: CCB LL is in the middle of opening"); 1011911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1012911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* ccb was already allocated for the incoming signalling. */ 1013911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = AVDT_BUSY; 1014911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1015911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1016911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (result == AVDT_SUCCESS) { 1017911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send event to ccb */ 1018911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt.connect.p_cback = p_cback; 1019911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt.connect.sec_mask = sec_mask; 1020911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_ccb_event(p_ccb, AVDT_CCB_API_CONNECT_REQ_EVT, &evt); 1021911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1022c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 1023c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: result=%d", __func__, result); 1024c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 1025911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return result; 10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1029ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1030ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function AVDT_DisconnectReq 1031ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1032ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function disconnect an AVDTP signaling connection 1033ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * to the peer device. When disconnected an 1034ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * AVDT_DISCONNECT_IND_EVT is sent to the application via its 1035ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * control callback function. 1036ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1037ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns AVDT_SUCCESS if successful, otherwise error. 1038ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1039ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 10409e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskiuint16_t AVDT_DisconnectReq(const RawAddress& bd_addr, 1041903c16685e62e7721d44460b9171e020f38609f5Jakub Pawlowski tAVDT_CTRL_CBACK* p_cback) { 1042911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_CCB* p_ccb = NULL; 1043911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t result = AVDT_SUCCESS; 1044911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_CCB_EVT evt; 1045911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 10466c6d2f6a14847ee75c72b1366449c45ab66feb00Pavlin Radoslavov AVDT_TRACE_WARNING("%s: address=%s", __func__, bd_addr.ToString().c_str()); 1047c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 1048911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* find channel control block for this bd addr; if none, error */ 1049911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb = avdt_ccb_by_bd(bd_addr); 1050911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_ccb == NULL) { 1051911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = AVDT_BAD_PARAMS; 1052911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1053911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1054911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (result == AVDT_SUCCESS) { 1055911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send event to ccb */ 1056911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt.disconnect.p_cback = p_cback; 1057911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_ccb_event(p_ccb, AVDT_CCB_API_DISCONNECT_REQ_EVT, &evt); 1058911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1059c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 10606c6d2f6a14847ee75c72b1366449c45ab66feb00Pavlin Radoslavov AVDT_TRACE_DEBUG("%s: address=%s result=%d", __func__, 10616c6d2f6a14847ee75c72b1366449c45ab66feb00Pavlin Radoslavov bd_addr.ToString().c_str(), result); 1062c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 1063911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return result; 10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1067ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1068ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function AVDT_GetL2CapChannel 1069ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1070ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Get the L2CAP CID used by the handle. 1071ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1072ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns CID if successful, otherwise 0. 1073ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1074ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1075911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint16_t AVDT_GetL2CapChannel(uint8_t handle) { 1076911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB* p_scb; 1077911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_CCB* p_ccb; 1078911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t tcid; 1079911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t lcid = 0; 1080911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1081911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* map handle to scb */ 1082911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (((p_scb = avdt_scb_by_hdl(handle)) != NULL) && 1083911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((p_ccb = p_scb->p_ccb) != NULL)) { 1084911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* get tcid from type, scb */ 1085911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tcid = avdt_ad_type_to_tcid(AVDT_CHAN_MEDIA, p_scb); 1086911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1087911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson lcid = avdt_cb.ad.rt_tbl[avdt_ccb_to_idx(p_ccb)][tcid].lcid; 1088911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1089911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1090911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (lcid); 10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1094ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1095ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function AVDT_GetSignalChannel 1096ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 10979ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * Description Get the L2CAP CID used by the signal channel of the given 10989ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * handle. 1099ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1100ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns CID if successful, otherwise 0. 1101ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1102ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 11039e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowskiuint16_t AVDT_GetSignalChannel(uint8_t handle, const RawAddress& bd_addr) { 1104911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB* p_scb; 1105911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_CCB* p_ccb; 1106911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t tcid = 0; /* tcid is always 0 for signal channel */ 1107911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t lcid = 0; 1108911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1109911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* map handle to scb */ 1110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (((p_scb = avdt_scb_by_hdl(handle)) != NULL) && 1111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((p_ccb = p_scb->p_ccb) != NULL)) { 1112911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson lcid = avdt_cb.ad.rt_tbl[avdt_ccb_to_idx(p_ccb)][tcid].lcid; 1113911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 1114911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb = avdt_ccb_by_bd(bd_addr); 1115911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_ccb != NULL) { 1116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson lcid = avdt_cb.ad.rt_tbl[avdt_ccb_to_idx(p_ccb)][tcid].lcid; 11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1118911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1120911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (lcid); 11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1123d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (AVDT_REPORTING == TRUE) 11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1125ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1126ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function AVDT_SendReport 1127ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1128ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description 1129ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1130ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1131ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1132ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns 1133ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1134ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1135d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint16_t AVDT_SendReport(uint8_t handle, AVDT_REPORT_TYPE type, 1136911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_REPORT_DATA* p_data) { 1137911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB* p_scb; 1138911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t result = AVDT_BAD_PARAMS; 1139911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_TC_TBL* p_tbl; 1140911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t *p, *plen, *pm1, *p_end; 1141911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint32_t ssrc; 1142911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint16_t len; 1143911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1144c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: handle=%d type=%d", __func__, handle, type); 1145c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 1146911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* map handle to scb && verify parameters */ 1147911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (((p_scb = avdt_scb_by_hdl(handle)) != NULL) && (p_scb->p_ccb != NULL) && 1148911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (((type == AVDT_RTCP_PT_SR) && (p_scb->cs.tsep == AVDT_TSEP_SRC)) || 1149911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ((type == AVDT_RTCP_PT_RR) && (p_scb->cs.tsep == AVDT_TSEP_SNK)) || 1150911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (type == AVDT_RTCP_PT_SDES))) { 1151911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = AVDT_NO_RESOURCES; 1152911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1153911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* build SR - assume fit in one packet */ 1154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_tbl = avdt_ad_tc_tbl_by_type(AVDT_CHAN_REPORT, p_scb->p_ccb, p_scb); 1155911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_tbl->state == AVDT_AD_ST_OPEN) { 1156d88838a7237cd672d87b6b9cc8d56fff625fd1d5Pavlin Radoslavov BT_HDR* p_pkt = (BT_HDR*)osi_malloc(p_tbl->peer_mtu + sizeof(BT_HDR)); 1157911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1158911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_pkt->offset = L2CAP_MIN_OFFSET; 1159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = (uint8_t*)(p_pkt + 1) + p_pkt->offset; 1160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson pm1 = p; 1161911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p++ = AVDT_MEDIA_OCTET1 | 1; 1162911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p++ = type; 1163911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* save the location for length */ 1164911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson plen = p; 1165911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p += 2; 1166911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ssrc = avdt_scb_gen_ssrc(p_scb); 1167911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT32_TO_BE_STREAM(p, ssrc); 1168911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1169911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson switch (type) { 1170911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case AVDT_RTCP_PT_SR: /* Sender Report */ 1171911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *pm1 = AVDT_MEDIA_OCTET1; 1172911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT32_TO_BE_STREAM(p, p_data->sr.ntp_sec); 1173911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT32_TO_BE_STREAM(p, p_data->sr.ntp_frac); 1174911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT32_TO_BE_STREAM(p, p_data->sr.rtp_time); 1175911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT32_TO_BE_STREAM(p, p_data->sr.pkt_count); 1176911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT32_TO_BE_STREAM(p, p_data->sr.octet_count); 1177911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1178911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1179911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case AVDT_RTCP_PT_RR: /* Receiver Report */ 1180911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p++ = p_data->rr.frag_lost; 1181911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson AVDT_TRACE_API("packet_lost: %d", p_data->rr.packet_lost); 1182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->rr.packet_lost &= 0xFFFFFF; 1183911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson AVDT_TRACE_API("packet_lost: %d", p_data->rr.packet_lost); 1184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT24_TO_BE_STREAM(p, p_data->rr.packet_lost); 1185911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT32_TO_BE_STREAM(p, p_data->rr.seq_num_rcvd); 1186911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT32_TO_BE_STREAM(p, p_data->rr.jitter); 1187911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT32_TO_BE_STREAM(p, p_data->rr.lsr); 1188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT32_TO_BE_STREAM(p, p_data->rr.dlsr); 1189911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1190911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1191911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson case AVDT_RTCP_PT_SDES: /* Source Description */ 1192911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p++ = AVDT_RTCP_SDES_CNAME; 1193911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson len = strlen((char*)p_data->cname); 1194911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (len > AVDT_MAX_CNAME_SIZE) len = AVDT_MAX_CNAME_SIZE; 1195911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson *p++ = (uint8_t)len; 1196911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson strlcpy((char*)p, (char*)p_data->cname, len + 1); 1197911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p += len; 1198911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1199911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1200911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_end = p; 1201911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson len = p - pm1 - 1; 1202911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson UINT16_TO_BE_STREAM(plen, len); 1203911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1204911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* set the actual payload length */ 1205911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_pkt->len = p_end - p; 1206911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send the packet */ 1207911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (L2CAP_DW_FAILED != 1208911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_ad_write_req(AVDT_CHAN_REPORT, p_scb->p_ccb, p_scb, p_pkt)) 1209911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson result = AVDT_SUCCESS; 12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1211911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1213c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: result=%d", __func__, result); 1214c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 1215911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return result; 12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 1220ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1221ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function AVDT_SetTraceLevel 1222ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1223ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Sets the trace level for AVDT. If 0xff is passed, the 1224ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * current trace level is returned. 1225ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1226ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Input Parameters: 1227ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * new_level: The level to set the AVDT tracing to: 1228ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 0xff-returns the current setting. 1229ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 0-turns off tracing. 1230ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * >= 1-Errors. 1231ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * >= 2-Warnings. 1232ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * >= 3-APIs. 1233ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * >= 4-Events. 1234ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * >= 5-Debug. 1235ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1236ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns The new trace level or current trace level if 1237ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the input parameter is 0xff. 1238ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1239ee96a3c60fca590d38025925c072d264e06493c4Myles Watson *****************************************************************************/ 1240911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonuint8_t AVDT_SetTraceLevel(uint8_t new_level) { 1241911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (new_level != 0xFF) avdt_cb.trace_level = new_level; 12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1243911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson return (avdt_cb.trace_level); 12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1245