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