avdt_api.cc revision f33b6f434f086b20fabe5913016bc423ac975057
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 <string.h> 2783e2c342e8b40009f3509425722d309c0b8189b9Chris Manton#include "bt_types.h" 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "avdt_api.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "avdtc_api.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "avdt_int.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 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 4078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovvoid avdt_ccb_idle_ccb_timer_timeout(void *data) 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov tAVDT_CCB *p_ccb = (tAVDT_CCB *)data; 4378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov uint8_t avdt_event = AVDT_CCB_IDLE_TOUT_EVT; 4478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov uint8_t err_code = AVDT_ERR_TIMEOUT; 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov avdt_ccb_event(p_ccb, avdt_event, (tAVDT_CCB_EVT *)&err_code); 4778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov} 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovvoid avdt_ccb_ret_ccb_timer_timeout(void *data) 5078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov{ 5178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov tAVDT_CCB *p_ccb = (tAVDT_CCB *)data; 5278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov uint8_t avdt_event = AVDT_CCB_RET_TOUT_EVT; 5378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov uint8_t err_code = AVDT_ERR_TIMEOUT; 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov avdt_ccb_event(p_ccb, avdt_event, (tAVDT_CCB_EVT *)&err_code); 5678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov} 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovvoid avdt_ccb_rsp_ccb_timer_timeout(void *data) 5978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov{ 6078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov tAVDT_CCB *p_ccb = (tAVDT_CCB *)data; 6178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov uint8_t avdt_event = AVDT_CCB_RSP_TOUT_EVT; 6278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov uint8_t err_code = AVDT_ERR_TIMEOUT; 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov avdt_ccb_event(p_ccb, avdt_event, (tAVDT_CCB_EVT *)&err_code); 6578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov} 6678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov 6778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovvoid avdt_scb_transport_channel_timer_timeout(void *data) 6878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov{ 6978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov tAVDT_SCB *p_scb = (tAVDT_SCB *)data; 7078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov uint8_t avdt_event = AVDT_SCB_TC_TOUT_EVT; 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov avdt_scb_event(p_scb, avdt_event, NULL); 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function AVDT_Register 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the system level registration function for the 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** AVDTP protocol. This function initializes AVDTP and 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** prepares the protocol stack for its use. This function 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** must be called once by the system or platform using AVDTP 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** before the other functions of the API an be used. 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid AVDT_Register(tAVDT_REG *p_reg, tAVDT_CTRL_CBACK *p_cback) 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* register PSM with L2CAP */ 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_Register(AVDT_PSM, (tL2CAP_APPL_INFO *) &avdt_l2c_appl); 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set security level */ 95d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen BTM_SetSecurityLevel(true, "", BTM_SEC_SERVICE_AVDTP, p_reg->sec_mask, 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_PSM, BTM_SEC_PROTO_AVDT, AVDT_CHAN_SIG); 97d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen BTM_SetSecurityLevel(false, "", BTM_SEC_SERVICE_AVDTP, p_reg->sec_mask, 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_PSM, BTM_SEC_PROTO_AVDT, AVDT_CHAN_SIG); 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* do not use security on the media channel */ 101d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen BTM_SetSecurityLevel(true, "", BTM_SEC_SERVICE_AVDTP_NOSEC, BTM_SEC_NONE, 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_PSM, BTM_SEC_PROTO_AVDT, AVDT_CHAN_MEDIA); 103d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen BTM_SetSecurityLevel(false, "", BTM_SEC_SERVICE_AVDTP_NOSEC, BTM_SEC_NONE, 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_PSM, BTM_SEC_PROTO_AVDT, AVDT_CHAN_MEDIA); 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 106d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (AVDT_REPORTING == TRUE) 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* do not use security on the reporting channel */ 108d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen BTM_SetSecurityLevel(true, "", BTM_SEC_SERVICE_AVDTP_NOSEC, BTM_SEC_NONE, 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_PSM, BTM_SEC_PROTO_AVDT, AVDT_CHAN_REPORT); 110d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen BTM_SetSecurityLevel(false, "", BTM_SEC_SERVICE_AVDTP_NOSEC, BTM_SEC_NONE, 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project AVDT_PSM, BTM_SEC_PROTO_AVDT, AVDT_CHAN_REPORT); 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* initialize AVDTP data structures */ 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_scb_init(); 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_ccb_init(); 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_ad_init(); 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* copy registration struct */ 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&avdt_cb.rcb, p_reg, sizeof(tAVDT_REG)); 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_cb.p_conn_cback = p_cback; 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function AVDT_Deregister 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to deregister use AVDTP protocol. 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** It is called when AVDTP is no longer being used by any 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** application in the system. Before this function can be 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** called, all streams must be removed with AVDT_RemoveStream(). 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid AVDT_Deregister(void) 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* deregister PSM with L2CAP */ 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project L2CA_Deregister(AVDT_PSM); 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 143d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenvoid AVDT_AbortReq(uint8_t handle) 1446a27776c488dd5ce2d29bce543ee42a12dfad60bAnubhav Gupta{ 1456a27776c488dd5ce2d29bce543ee42a12dfad60bAnubhav Gupta AVDT_TRACE_ERROR("%s", __func__); 1466a27776c488dd5ce2d29bce543ee42a12dfad60bAnubhav Gupta 1476a27776c488dd5ce2d29bce543ee42a12dfad60bAnubhav Gupta tAVDT_SCB *p_scb = avdt_scb_by_hdl(handle); 1486a27776c488dd5ce2d29bce543ee42a12dfad60bAnubhav Gupta if (p_scb != NULL) 1496a27776c488dd5ce2d29bce543ee42a12dfad60bAnubhav Gupta { 1506a27776c488dd5ce2d29bce543ee42a12dfad60bAnubhav Gupta avdt_scb_event(p_scb, AVDT_SCB_API_ABORT_REQ_EVT, NULL); 1516a27776c488dd5ce2d29bce543ee42a12dfad60bAnubhav Gupta } else { 1526a27776c488dd5ce2d29bce543ee42a12dfad60bAnubhav Gupta AVDT_TRACE_ERROR("%s Improper SCB, can not abort the stream", __func__); 1536a27776c488dd5ce2d29bce543ee42a12dfad60bAnubhav Gupta } 1546a27776c488dd5ce2d29bce543ee42a12dfad60bAnubhav Gupta} 1556a27776c488dd5ce2d29bce543ee42a12dfad60bAnubhav Gupta 156cc35559160745c60b42ae182002a59337d844d09Hemant Gupta/******************************************************************************* 157cc35559160745c60b42ae182002a59337d844d09Hemant Gupta** 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function AVDT_CreateStream 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Create a stream endpoint. After a stream endpoint is 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** created an application can initiate a connection between 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** this endpoint and an endpoint on a peer device. In 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** addition, a peer device can discover, get the capabilities, 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** and connect to this endpoint. 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns AVDT_SUCCESS if successful, otherwise error. 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 170d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint16_t AVDT_CreateStream(uint8_t *p_handle, tAVDT_CS *p_cs) 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 172d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen uint16_t result = AVDT_SUCCESS; 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SCB *p_scb; 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Verify parameters; if invalid, return failure */ 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((p_cs->cfg.psc_mask & (~AVDT_PSC)) != 0) || (p_cs->p_ctrl_cback == NULL)) 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVDT_BAD_PARAMS; 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Allocate scb; if no scbs, return failure */ 181f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen else { 182f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_scb = avdt_scb_alloc(p_cs); 183f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p_scb == NULL) 184f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen { 185f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen result = AVDT_NO_RESOURCES; 186f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen } 187f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen else 188f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen { 189f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen *p_handle = avdt_scb_to_hdl(p_scb); 190f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen } 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function AVDT_RemoveStream 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Remove a stream endpoint. This function is called when 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the application is no longer using a stream endpoint. 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** If this function is called when the endpoint is connected 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the connection is closed and then the stream endpoint 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is removed. 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns AVDT_SUCCESS if successful, otherwise error. 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 209d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint16_t AVDT_RemoveStream(uint8_t handle) 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 211d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen uint16_t result = AVDT_SUCCESS; 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SCB *p_scb; 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* look up scb */ 215f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_scb = avdt_scb_by_hdl(handle); 216f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p_scb == NULL) 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVDT_BAD_HANDLE; 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send remove event to scb */ 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_scb_event(p_scb, AVDT_SCB_API_REMOVE_EVT, NULL); 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function AVDT_DiscoverReq 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function initiates a connection to the AVDTP service 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** on the peer device, if not already present, and discovers 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the stream endpoints on the peer device. (Please note 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** that AVDTP discovery is unrelated to SDP discovery). 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** This function can be called at any time regardless of whether 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** there is an AVDTP connection to the peer device. 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** When discovery is complete, an AVDT_DISCOVER_CFM_EVT 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is sent to the application via its callback function. 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** The application must not call AVDT_GetCapReq() or 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** AVDT_DiscoverReq() again to the same device until 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** discovery is complete. 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** The memory addressed by sep_info is allocated by the 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** application. This memory is written to by AVDTP as part 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** of the discovery procedure. This memory must remain 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** accessible until the application receives the 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** AVDT_DISCOVER_CFM_EVT. 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns AVDT_SUCCESS if successful, otherwise error. 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 254d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint16_t AVDT_DiscoverReq(BD_ADDR bd_addr, tAVDT_SEP_INFO *p_sep_info, 255d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen uint8_t max_seps, tAVDT_CTRL_CBACK *p_cback) 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_CCB *p_ccb; 258d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen uint16_t result = AVDT_SUCCESS; 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_CCB_EVT evt; 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* find channel control block for this bd addr; if none, allocate one */ 262f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_ccb = avdt_ccb_by_bd(bd_addr); 263f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p_ccb == NULL) 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 265f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_ccb = avdt_ccb_alloc(bd_addr); 266f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p_ccb == NULL) 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* could not allocate channel control block */ 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVDT_NO_RESOURCES; 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result == AVDT_SUCCESS) 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* make sure no discovery or get capabilities req already in progress */ 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_ccb->proc_busy) 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVDT_BUSY; 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send event to ccb */ 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.discover.p_sep_info = p_sep_info; 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.discover.num_seps = max_seps; 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.discover.p_cback = p_cback; 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_ccb_event(p_ccb, AVDT_CCB_API_DISCOVER_REQ_EVT, &evt); 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function avdt_get_cap_req 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description internal function to serve both AVDT_GetCapReq and 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** AVDT_GetAllCapReq 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns AVDT_SUCCESS if successful, otherwise error. 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 302d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenstatic uint16_t avdt_get_cap_req(BD_ADDR bd_addr, tAVDT_CCB_API_GETCAP *p_evt) 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_CCB *p_ccb = NULL; 305d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen uint16_t result = AVDT_SUCCESS; 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* verify SEID */ 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_evt->single.seid < AVDT_SEID_MIN) || (p_evt->single.seid > AVDT_SEID_MAX)) 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 310158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati AVDT_TRACE_ERROR("seid: %d", p_evt->single.seid); 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVDT_BAD_PARAMS; 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* find channel control block for this bd addr; if none, allocate one */ 314f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen else { 315f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_ccb = avdt_ccb_by_bd(bd_addr); 316f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p_ccb == NULL) 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 318f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_ccb = avdt_ccb_alloc(bd_addr); 319f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p_ccb == NULL) 320f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen { 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* could not allocate channel control block */ 322f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen result = AVDT_NO_RESOURCES; 323f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen } 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result == AVDT_SUCCESS) 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* make sure no discovery or get capabilities req already in progress */ 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_ccb->proc_busy) 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVDT_BUSY; 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send event to ccb */ 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_ccb_event(p_ccb, AVDT_CCB_API_GETCAP_REQ_EVT, (tAVDT_CCB_EVT *)p_evt); 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function AVDT_GetCapReq 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function initiates a connection to the AVDTP service 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** on the peer device, if not already present, and gets the 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** capabilities of a stream endpoint on the peer device. 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** This function can be called at any time regardless of 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** whether there is an AVDTP connection to the peer device. 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** When the procedure is complete, an AVDT_GETCAP_CFM_EVT is 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** sent to the application via its callback function. The 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** application must not call AVDT_GetCapReq() or 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** AVDT_DiscoverReq() again until the procedure is complete. 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** The memory pointed to by p_cfg is allocated by the 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** application. This memory is written to by AVDTP as part 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** of the get capabilities procedure. This memory must 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** remain accessible until the application receives 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the AVDT_GETCAP_CFM_EVT. 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns AVDT_SUCCESS if successful, otherwise error. 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 367d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint16_t AVDT_GetCapReq(BD_ADDR bd_addr, uint8_t seid, tAVDT_CFG *p_cfg, tAVDT_CTRL_CBACK *p_cback) 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_CCB_API_GETCAP getcap; 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project getcap.single.seid = seid; 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project getcap.single.sig_id = AVDT_SIG_GETCAP; 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project getcap.p_cfg = p_cfg; 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project getcap.p_cback = p_cback; 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return avdt_get_cap_req (bd_addr, &getcap); 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function AVDT_GetAllCapReq 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function initiates a connection to the AVDTP service 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** on the peer device, if not already present, and gets the 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** capabilities of a stream endpoint on the peer device. 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** This function can be called at any time regardless of 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** whether there is an AVDTP connection to the peer device. 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** When the procedure is complete, an AVDT_GETCAP_CFM_EVT is 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** sent to the application via its callback function. The 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** application must not call AVDT_GetCapReq() or 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** AVDT_DiscoverReq() again until the procedure is complete. 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** The memory pointed to by p_cfg is allocated by the 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** application. This memory is written to by AVDTP as part 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** of the get capabilities procedure. This memory must 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** remain accessible until the application receives 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the AVDT_GETCAP_CFM_EVT. 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns AVDT_SUCCESS if successful, otherwise error. 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 402d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint16_t AVDT_GetAllCapReq(BD_ADDR bd_addr, uint8_t seid, tAVDT_CFG *p_cfg, tAVDT_CTRL_CBACK *p_cback) 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_CCB_API_GETCAP getcap; 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project getcap.single.seid = seid; 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project getcap.single.sig_id = AVDT_SIG_GET_ALLCAP; 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project getcap.p_cfg = p_cfg; 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project getcap.p_cback = p_cback; 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return avdt_get_cap_req (bd_addr, &getcap); 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function AVDT_DelayReport 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This functions sends a Delay Report to the peer device 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** that is associated with a particular SEID. 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** This function is called by SNK device. 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns AVDT_SUCCESS if successful, otherwise error. 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 424d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint16_t AVDT_DelayReport(uint8_t handle, uint8_t seid, uint16_t delay) 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SCB *p_scb; 427d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen uint16_t result = AVDT_SUCCESS; 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SCB_EVT evt; 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* map handle to scb */ 431f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_scb = avdt_scb_by_hdl(handle); 432f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p_scb == NULL) 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVDT_BAD_HANDLE; 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send event to scb */ 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.apidelay.hdr.seid = seid; 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.apidelay.delay = delay; 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_scb_event(p_scb, AVDT_SCB_API_DELAY_RPT_REQ_EVT, &evt); 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function AVDT_OpenReq 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function initiates a connection to the AVDTP service 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** on the peer device, if not already present, and connects 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** to a stream endpoint on a peer device. When the connection 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is completed, an AVDT_OPEN_CFM_EVT is sent to the 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** application via the control callback function for this handle. 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns AVDT_SUCCESS if successful, otherwise error. 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 460d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint16_t AVDT_OpenReq(uint8_t handle, BD_ADDR bd_addr, uint8_t seid, tAVDT_CFG *p_cfg) 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_CCB *p_ccb = NULL; 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SCB *p_scb = NULL; 464d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen uint16_t result = AVDT_SUCCESS; 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SCB_EVT evt; 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* verify SEID */ 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((seid < AVDT_SEID_MIN) || (seid > AVDT_SEID_MAX)) 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVDT_BAD_PARAMS; 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* map handle to scb */ 473f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen else { 474f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_scb = avdt_scb_by_hdl(handle); 475f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p_scb == NULL) 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 477f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen result = AVDT_BAD_HANDLE; 478f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen } 479f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen /* find channel control block for this bd addr; if none, allocate one */ 480f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen else { 481f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_ccb = avdt_ccb_by_bd(bd_addr); 482f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p_ccb == NULL) 483f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen { 484f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_ccb = avdt_ccb_alloc(bd_addr); 485f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p_ccb == NULL) 486f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen { 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* could not allocate channel control block */ 488f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen result = AVDT_NO_RESOURCES; 489f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen } 490f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen } 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send event to scb */ 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result == AVDT_SUCCESS) 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.msg.config_cmd.hdr.seid = seid; 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.msg.config_cmd.hdr.ccb_idx = avdt_ccb_to_idx(p_ccb); 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.msg.config_cmd.int_seid = handle; 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.msg.config_cmd.p_cfg = p_cfg; 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_scb_event(p_scb, AVDT_SCB_API_SETCONFIG_REQ_EVT, &evt); 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function AVDT_ConfigRsp 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Respond to a configure request from the peer device. This 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** function must be called if the application receives an 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** AVDT_CONFIG_IND_EVT through its control callback. 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns AVDT_SUCCESS if successful, otherwise error. 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 518d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint16_t AVDT_ConfigRsp(uint8_t handle, uint8_t label, uint8_t error_code, uint8_t category) 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SCB *p_scb; 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SCB_EVT evt; 522d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen uint16_t result = AVDT_SUCCESS; 523d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen uint8_t event_code; 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* map handle to scb */ 526f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_scb = avdt_scb_by_hdl(handle); 527f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p_scb == NULL) 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVDT_BAD_HANDLE; 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* handle special case when this function is called but peer has not send 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** a configuration cmd; ignore and return error result 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (!p_scb->in_use) 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVDT_BAD_HANDLE; 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send event to scb */ 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.msg.hdr.err_code = error_code; 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.msg.hdr.err_param = category; 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.msg.hdr.label = label; 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (error_code == 0) 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event_code = AVDT_SCB_API_SETCONFIG_RSP_EVT; 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event_code = AVDT_SCB_API_SETCONFIG_REJ_EVT; 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_scb_event(p_scb, event_code, &evt); 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function AVDT_StartReq 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Start one or more stream endpoints. This initiates the 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** transfer of media packets for the streams. All stream 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** endpoints must previously be opened. When the streams 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** are started, an AVDT_START_CFM_EVT is sent to the 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** application via the control callback function for each stream. 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns AVDT_SUCCESS if successful, otherwise error. 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 572d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint16_t AVDT_StartReq(uint8_t *p_handles, uint8_t num_handles) 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SCB *p_scb = NULL; 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_CCB_EVT evt; 576d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen uint16_t result = AVDT_SUCCESS; 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((num_handles == 0) || (num_handles > AVDT_NUM_SEPS)) 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVDT_BAD_PARAMS; 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* verify handles */ 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < num_handles; i++) 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 588f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_scb = avdt_scb_by_hdl(p_handles[i]); 589f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p_scb == NULL) 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVDT_BAD_HANDLE; 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result == AVDT_SUCCESS) 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->p_ccb == NULL) 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVDT_BAD_HANDLE; 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send event to ccb */ 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(evt.msg.multi.seid_list, p_handles, num_handles); 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.msg.multi.num_seps = num_handles; 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_ccb_event(p_scb->p_ccb, AVDT_CCB_API_START_REQ_EVT, &evt); 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function AVDT_SuspendReq 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Suspend one or more stream endpoints. This suspends the 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** transfer of media packets for the streams. All stream 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** endpoints must previously be open and started. When the 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** streams are suspended, an AVDT_SUSPEND_CFM_EVT is sent to 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the application via the control callback function for 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** each stream. 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns AVDT_SUCCESS if successful, otherwise error. 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 629d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint16_t AVDT_SuspendReq(uint8_t *p_handles, uint8_t num_handles) 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SCB *p_scb = NULL; 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_CCB_EVT evt; 633d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen uint16_t result = AVDT_SUCCESS; 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((num_handles == 0) || (num_handles > AVDT_NUM_SEPS)) 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVDT_BAD_PARAMS; 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* verify handles */ 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (i = 0; i < num_handles; i++) 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 645f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_scb = avdt_scb_by_hdl(p_handles[i]); 646f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p_scb == NULL) 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVDT_BAD_HANDLE; 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result == AVDT_SUCCESS) 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_scb->p_ccb == NULL) 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVDT_BAD_HANDLE; 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send event to ccb */ 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(evt.msg.multi.seid_list, p_handles, num_handles); 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.msg.multi.num_seps = num_handles; 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_ccb_event(p_scb->p_ccb, AVDT_CCB_API_SUSPEND_REQ_EVT, &evt); 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function AVDT_CloseReq 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Close a stream endpoint. This stops the transfer of media 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** packets and closes the transport channel associated with 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** this stream endpoint. When the stream is closed, an 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** AVDT_CLOSE_CFM_EVT is sent to the application via the 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** control callback function for this handle. 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns AVDT_SUCCESS if successful, otherwise error. 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 686d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint16_t AVDT_CloseReq(uint8_t handle) 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SCB *p_scb; 689d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen uint16_t result = AVDT_SUCCESS; 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* map handle to scb */ 692f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_scb = avdt_scb_by_hdl(handle); 693f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p_scb == NULL) 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVDT_BAD_HANDLE; 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send event to scb */ 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_scb_event(p_scb, AVDT_SCB_API_CLOSE_REQ_EVT, NULL); 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function AVDT_ReconfigReq 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Reconfigure a stream endpoint. This allows the application 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** to change the codec or content protection capabilities of 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** a stream endpoint after it has been opened. This function 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** can only be called if the stream is opened but not started 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** or if the stream has been suspended. When the procedure 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is completed, an AVDT_RECONFIG_CFM_EVT is sent to the 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** application via the control callback function for this handle. 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns AVDT_SUCCESS if successful, otherwise error. 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 722d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint16_t AVDT_ReconfigReq(uint8_t handle, tAVDT_CFG *p_cfg) 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SCB *p_scb; 725d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen uint16_t result = AVDT_SUCCESS; 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SCB_EVT evt; 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* map handle to scb */ 729f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_scb = avdt_scb_by_hdl(handle); 730f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p_scb == NULL) 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVDT_BAD_HANDLE; 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send event to scb */ 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* force psc_mask to zero */ 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cfg->psc_mask = 0; 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.msg.reconfig_cmd.p_cfg = p_cfg; 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_scb_event(p_scb, AVDT_SCB_API_RECONFIG_REQ_EVT, &evt); 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function AVDT_ReconfigRsp 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Respond to a reconfigure request from the peer device. 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** This function must be called if the application receives 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** an AVDT_RECONFIG_IND_EVT through its control callback. 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns AVDT_SUCCESS if successful, otherwise error. 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 758d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint16_t AVDT_ReconfigRsp(uint8_t handle, uint8_t label, uint8_t error_code, uint8_t category) 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SCB *p_scb; 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SCB_EVT evt; 762d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen uint16_t result = AVDT_SUCCESS; 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* map handle to scb */ 765f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_scb = avdt_scb_by_hdl(handle); 766f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p_scb == NULL) 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVDT_BAD_HANDLE; 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send event to scb */ 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.msg.hdr.err_code = error_code; 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.msg.hdr.err_param = category; 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.msg.hdr.label = label; 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_scb_event(p_scb, AVDT_SCB_API_RECONFIG_RSP_EVT, &evt); 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function AVDT_SecurityReq 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send a security request to the peer device. When the 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** security procedure is completed, an AVDT_SECURITY_CFM_EVT 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** is sent to the application via the control callback function 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** for this handle. (Please note that AVDTP security procedures 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** are unrelated to Bluetooth link level security.) 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns AVDT_SUCCESS if successful, otherwise error. 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 796d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint16_t AVDT_SecurityReq(uint8_t handle, uint8_t *p_data, uint16_t len) 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SCB *p_scb; 799d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen uint16_t result = AVDT_SUCCESS; 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SCB_EVT evt; 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* map handle to scb */ 803f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_scb = avdt_scb_by_hdl(handle); 804f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p_scb == NULL) 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVDT_BAD_HANDLE; 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send event to scb */ 8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.msg.security_rsp.p_data = p_data; 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.msg.security_rsp.len = len; 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_scb_event(p_scb, AVDT_SCB_API_SECURITY_REQ_EVT, &evt); 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function AVDT_SecurityRsp 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Respond to a security request from the peer device. 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** This function must be called if the application receives 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** an AVDT_SECURITY_IND_EVT through its control callback. 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** (Please note that AVDTP security procedures are unrelated 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** to Bluetooth link level security.) 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns AVDT_SUCCESS if successful, otherwise error. 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 832d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint16_t AVDT_SecurityRsp(uint8_t handle, uint8_t label, uint8_t error_code, 833d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen uint8_t *p_data, uint16_t len) 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SCB *p_scb; 836d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen uint16_t result = AVDT_SUCCESS; 8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SCB_EVT evt; 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* map handle to scb */ 840f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_scb = avdt_scb_by_hdl(handle); 841f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p_scb == NULL) 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVDT_BAD_HANDLE; 8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send event to scb */ 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.msg.security_rsp.hdr.err_code = error_code; 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.msg.security_rsp.hdr.label = label; 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.msg.security_rsp.p_data = p_data; 8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.msg.security_rsp.len = len; 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_scb_event(p_scb, AVDT_SCB_API_SECURITY_RSP_EVT, &evt); 8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 859ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function AVDT_WriteReqOpt 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send a media packet to the peer device. The stream must 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** be started before this function is called. Also, this 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** function can only be called if the stream is a SRC. 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** When AVDTP has sent the media packet and is ready for the 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** next packet, an AVDT_WRITE_CFM_EVT is sent to the 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** application via the control callback. The application must 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** wait for the AVDT_WRITE_CFM_EVT before it makes the next 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** call to AVDT_WriteReq(). If the applications calls 8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** AVDT_WriteReq() before it receives the event the packet 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** will not be sent. The application may make its first call 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** to AVDT_WriteReq() after it receives an AVDT_START_CFM_EVT 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** or AVDT_START_IND_EVT. 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** The application passes the packet using the BT_HDR structure. 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** This structure is described in section 2.1. The offset 877ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** field must be equal to or greater than AVDT_MEDIA_OFFSET 878ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** (if NO_RTP is specified, L2CAP_MIN_OFFSET can be used). 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** This allows enough space in the buffer for the L2CAP and 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** AVDTP headers. 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** The memory pointed to by p_pkt must be a GKI buffer 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** allocated by the application. This buffer will be freed 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** by the protocol stack; the application must not free 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** this buffer. 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 887ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** The opt parameter allows passing specific options like: 888ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** - NO_RTP : do not add the RTP header to buffer 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns AVDT_SUCCESS if successful, otherwise error. 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 893d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint16_t AVDT_WriteReqOpt(uint8_t handle, BT_HDR *p_pkt, uint32_t time_stamp, uint8_t m_pt, tAVDT_DATA_OPT_MASK opt) 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SCB *p_scb; 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SCB_EVT evt; 897d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen uint16_t result = AVDT_SUCCESS; 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* map handle to scb */ 900f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_scb = avdt_scb_by_hdl(handle); 901f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p_scb == NULL) 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVDT_BAD_HANDLE; 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.apiwrite.p_buf = p_pkt; 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.apiwrite.time_stamp = time_stamp; 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.apiwrite.m_pt = m_pt; 910ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta evt.apiwrite.opt = opt; 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_scb_event(p_scb, AVDT_SCB_API_WRITE_REQ_EVT, &evt); 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 919ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Function AVDT_WriteReq 920ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 921ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Description Send a media packet to the peer device. The stream must 922ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** be started before this function is called. Also, this 923ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** function can only be called if the stream is a SRC. 924ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 925ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** When AVDTP has sent the media packet and is ready for the 926ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** next packet, an AVDT_WRITE_CFM_EVT is sent to the 927ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** application via the control callback. The application must 928ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** wait for the AVDT_WRITE_CFM_EVT before it makes the next 929ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** call to AVDT_WriteReq(). If the applications calls 930ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** AVDT_WriteReq() before it receives the event the packet 931ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** will not be sent. The application may make its first call 932ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** to AVDT_WriteReq() after it receives an AVDT_START_CFM_EVT 933ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** or AVDT_START_IND_EVT. 934ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 935ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** The application passes the packet using the BT_HDR structure. 936ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** This structure is described in section 2.1. The offset 937ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** field must be equal to or greater than AVDT_MEDIA_OFFSET. 938ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** This allows enough space in the buffer for the L2CAP and 939ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** AVDTP headers. 940ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 941ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** The memory pointed to by p_pkt must be a GKI buffer 942ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** allocated by the application. This buffer will be freed 943ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** by the protocol stack; the application must not free 944ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** this buffer. 945ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 946ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 947ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** Returns AVDT_SUCCESS if successful, otherwise error. 948ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 949ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta*******************************************************************************/ 950d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint16_t AVDT_WriteReq(uint8_t handle, BT_HDR *p_pkt, uint32_t time_stamp, uint8_t m_pt) 951ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta{ 952ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta return AVDT_WriteReqOpt(handle, p_pkt, time_stamp, m_pt, AVDT_DATA_OPT_NONE); 953ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta} 954ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 955ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/******************************************************************************* 956ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta** 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function AVDT_ConnectReq 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function initiates an AVDTP signaling connection 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** to the peer device. When the connection is completed, an 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** AVDT_CONNECT_IND_EVT is sent to the application via its 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** control callback function. If the connection attempt fails 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** an AVDT_DISCONNECT_IND_EVT is sent. The security mask 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** parameter overrides the outgoing security mask set in 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** AVDT_Register(). 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns AVDT_SUCCESS if successful, otherwise error. 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 970d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint16_t AVDT_ConnectReq(BD_ADDR bd_addr, uint8_t sec_mask, tAVDT_CTRL_CBACK *p_cback) 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_CCB *p_ccb = NULL; 973d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen uint16_t result = AVDT_SUCCESS; 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_CCB_EVT evt; 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* find channel control block for this bd addr; if none, allocate one */ 977f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_ccb = avdt_ccb_by_bd(bd_addr); 978f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p_ccb == NULL) 9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 980f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_ccb = avdt_ccb_alloc(bd_addr); 981f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p_ccb == NULL) 9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* could not allocate channel control block */ 9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVDT_NO_RESOURCES; 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 987d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen else if (p_ccb->ll_opened == false) 9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 989158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati AVDT_TRACE_WARNING("AVDT_ConnectReq: CCB LL is in the middle of opening"); 9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* ccb was already allocated for the incoming signalling. */ 9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVDT_BUSY; 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result == AVDT_SUCCESS) 9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send event to ccb */ 9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.connect.p_cback = p_cback; 9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.connect.sec_mask = sec_mask; 10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_ccb_event(p_ccb, AVDT_CCB_API_CONNECT_REQ_EVT, &evt); 10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function AVDT_DisconnectReq 10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function disconnect an AVDTP signaling connection 10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** to the peer device. When disconnected an 10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** AVDT_DISCONNECT_IND_EVT is sent to the application via its 10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** control callback function. 10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns AVDT_SUCCESS if successful, otherwise error. 10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1017d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint16_t AVDT_DisconnectReq(BD_ADDR bd_addr, tAVDT_CTRL_CBACK *p_cback) 10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_CCB *p_ccb = NULL; 1020d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen uint16_t result = AVDT_SUCCESS; 10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_CCB_EVT evt; 10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* find channel control block for this bd addr; if none, error */ 1024f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_ccb = avdt_ccb_by_bd(bd_addr); 1025f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p_ccb == NULL) 10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVDT_BAD_PARAMS; 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result == AVDT_SUCCESS) 10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send event to ccb */ 10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project evt.disconnect.p_cback = p_cback; 10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_ccb_event(p_ccb, AVDT_CCB_API_DISCONNECT_REQ_EVT, &evt); 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function AVDT_GetL2CapChannel 10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Get the L2CAP CID used by the handle. 10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns CID if successful, otherwise 0. 10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1048d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint16_t AVDT_GetL2CapChannel(uint8_t handle) 10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SCB *p_scb; 10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_CCB *p_ccb; 1052d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen uint8_t tcid; 1053d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen uint16_t lcid = 0; 10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* map handle to scb */ 10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((p_scb = avdt_scb_by_hdl(handle)) != NULL) 10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && ((p_ccb = p_scb->p_ccb) != NULL)) 10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* get tcid from type, scb */ 10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tcid = avdt_ad_type_to_tcid(AVDT_CHAN_MEDIA, p_scb); 10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project lcid = avdt_cb.ad.rt_tbl[avdt_ccb_to_idx(p_ccb)][tcid].lcid; 10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (lcid); 10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function AVDT_GetSignalChannel 10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Get the L2CAP CID used by the signal channel of the given handle. 10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns CID if successful, otherwise 0. 10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1077d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint16_t AVDT_GetSignalChannel(uint8_t handle, BD_ADDR bd_addr) 10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SCB *p_scb; 10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_CCB *p_ccb; 1081d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen uint8_t tcid = 0; /* tcid is always 0 for signal channel */ 1082d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen uint16_t lcid = 0; 10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* map handle to scb */ 10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((p_scb = avdt_scb_by_hdl(handle)) != NULL) 10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && ((p_ccb = p_scb->p_ccb) != NULL)) 10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project lcid = avdt_cb.ad.rt_tbl[avdt_ccb_to_idx(p_ccb)][tcid].lcid; 10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1090f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen else { 1091f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen p_ccb = avdt_ccb_by_bd(bd_addr); 1092f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen if (p_ccb != NULL) 1093f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen { 1094f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen lcid = avdt_cb.ad.rt_tbl[avdt_ccb_to_idx(p_ccb)][tcid].lcid; 1095f33b6f434f086b20fabe5913016bc423ac975057Marie Janssen } 10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (lcid); 10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1101d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen#if (AVDT_REPORTING == TRUE) 11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function AVDT_SendReport 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1113d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint16_t AVDT_SendReport(uint8_t handle, AVDT_REPORT_TYPE type, 11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_REPORT_DATA *p_data) 11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_SCB *p_scb; 1117d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen uint16_t result = AVDT_BAD_PARAMS; 11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tAVDT_TC_TBL *p_tbl; 1119d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen uint8_t *p, *plen, *pm1, *p_end; 1120d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen uint32_t ssrc; 1121d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen uint16_t len; 11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* map handle to scb && verify parameters */ 11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (((p_scb = avdt_scb_by_hdl(handle)) != NULL) 11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_scb->p_ccb != NULL) 11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (((type == AVDT_RTCP_PT_SR) && (p_scb->cs.tsep == AVDT_TSEP_SRC)) || 11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((type == AVDT_RTCP_PT_RR) && (p_scb->cs.tsep == AVDT_TSEP_SNK)) || 11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (type == AVDT_RTCP_PT_SDES)) ) 11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVDT_NO_RESOURCES; 11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* build SR - assume fit in one packet */ 11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_tbl = avdt_ad_tc_tbl_by_type(AVDT_CHAN_REPORT, p_scb->p_ccb, p_scb); 1134717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov if (p_tbl->state == AVDT_AD_ST_OPEN) { 1135717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov BT_HDR *p_pkt = (BT_HDR *)osi_malloc(p_tbl->peer_mtu); 1136717a4a9f3a044f264ec2482c2d1806ec3093707aPavlin Radoslavov 11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_pkt->offset = L2CAP_MIN_OFFSET; 1138d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen p = (uint8_t *)(p_pkt + 1) + p_pkt->offset; 11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pm1 = p; 11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = AVDT_MEDIA_OCTET1 | 1; 11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = type; 11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* save the location for length */ 11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project plen = p; 11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p+= 2; 11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ssrc = avdt_scb_gen_ssrc(p_scb); 11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32_TO_BE_STREAM(p, ssrc); 11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(type) 11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case AVDT_RTCP_PT_SR: /* Sender Report */ 11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *pm1 = AVDT_MEDIA_OCTET1; 11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32_TO_BE_STREAM(p, p_data->sr.ntp_sec); 11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32_TO_BE_STREAM(p, p_data->sr.ntp_frac); 11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32_TO_BE_STREAM(p, p_data->sr.rtp_time); 11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32_TO_BE_STREAM(p, p_data->sr.pkt_count); 11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32_TO_BE_STREAM(p, p_data->sr.octet_count); 11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case AVDT_RTCP_PT_RR: /* Receiver Report */ 11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = p_data->rr.frag_lost; 1161158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati AVDT_TRACE_API("packet_lost: %d", p_data->rr.packet_lost); 11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_data->rr.packet_lost &= 0xFFFFFF; 1163158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati AVDT_TRACE_API("packet_lost: %d", p_data->rr.packet_lost); 11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT24_TO_BE_STREAM(p, p_data->rr.packet_lost); 11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32_TO_BE_STREAM(p, p_data->rr.seq_num_rcvd); 11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32_TO_BE_STREAM(p, p_data->rr.jitter); 11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32_TO_BE_STREAM(p, p_data->rr.lsr); 11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32_TO_BE_STREAM(p, p_data->rr.dlsr); 11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case AVDT_RTCP_PT_SDES: /* Source Description */ 11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = AVDT_RTCP_SDES_CNAME; 11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len = strlen((char *)p_data->cname); 11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(len > AVDT_MAX_CNAME_SIZE) 11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len = AVDT_MAX_CNAME_SIZE; 1176d19e0785e662e640191a075eda07acce61c2aedaMarie Janssen *p++ = (uint8_t)len; 11775b9462d9694bdb9c51130a39a9d85c936ecce46fAndre Eisenbach strlcpy((char *)p, (char *)p_data->cname, len+1); 11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += len; 11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_end = p; 11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project len = p - pm1 - 1; 11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_BE_STREAM(plen, len); 11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set the actual payload length */ 11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_pkt->len = p_end - p; 11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send the packet */ 11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(L2CAP_DW_FAILED != avdt_ad_write_req(AVDT_CHAN_REPORT, p_scb->p_ccb, p_scb, p_pkt)) 11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = AVDT_SUCCESS; 11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function AVDT_SetTraceLevel 12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Sets the trace level for AVDT. If 0xff is passed, the 12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** current trace level is returned. 12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Input Parameters: 12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** new_level: The level to set the AVDT tracing to: 12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 0xff-returns the current setting. 12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 0-turns off tracing. 12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** >= 1-Errors. 12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** >= 2-Warnings. 12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** >= 3-APIs. 12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** >= 4-Events. 12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** >= 5-Debug. 12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns The new trace level or current trace level if 12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the input parameter is 0xff. 12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 1218d19e0785e662e640191a075eda07acce61c2aedaMarie Janssenuint8_t AVDT_SetTraceLevel (uint8_t new_level) 12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (new_level != 0xFF) 12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project avdt_cb.trace_level = new_level; 12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (avdt_cb.trace_level); 12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1225