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