Home | History | Annotate | Download | only in avdt
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 2002-2012 Broadcom Corporation
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 /******************************************************************************
     20  *
     21  *  This module contains API of the audio/video distribution transport
     22  *  protocol.
     23  *
     24  ******************************************************************************/
     25 
     26 #include <string.h>
     27 #include "data_types.h"
     28 #include "bt_target.h"
     29 #include "avdt_api.h"
     30 #include "avdtc_api.h"
     31 #include "avdt_int.h"
     32 #include "l2c_api.h"
     33 #include "btm_api.h"
     34 #include "btu.h"
     35 
     36 
     37 #if (defined BTTRC_INCLUDED && BTTRC_INCLUDED == TRUE)
     38 #include "bttrc_str_ids.h"
     39 #endif
     40 
     41 /* Control block for AVDT */
     42 #if AVDT_DYNAMIC_MEMORY == FALSE
     43 tAVDT_CB avdt_cb;
     44 #endif
     45 
     46 
     47 /*******************************************************************************
     48 **
     49 ** Function         avdt_process_timeout
     50 **
     51 ** Description      This function is called by BTU when an AVDTP timer
     52 **                  expires.  The function sends a timer event to the
     53 **                  appropriate CCB or SCB state machine.
     54 **
     55 **                  This function is for use internal to the stack only.
     56 **
     57 **
     58 ** Returns          void
     59 **
     60 *******************************************************************************/
     61 void avdt_process_timeout(TIMER_LIST_ENT *p_tle)
     62 {
     63     UINT8   event = 0;
     64     UINT8   err_code = AVDT_ERR_TIMEOUT;
     65 
     66     switch (p_tle->event)
     67     {
     68         case BTU_TTYPE_AVDT_CCB_RET:
     69             event = AVDT_CCB_RET_TOUT_EVT + AVDT_CCB_MKR;
     70             break;
     71 
     72         case BTU_TTYPE_AVDT_CCB_RSP:
     73             event = AVDT_CCB_RSP_TOUT_EVT + AVDT_CCB_MKR;
     74             break;
     75 
     76         case BTU_TTYPE_AVDT_CCB_IDLE:
     77             event = AVDT_CCB_IDLE_TOUT_EVT + AVDT_CCB_MKR;
     78             break;
     79 
     80         case BTU_TTYPE_AVDT_SCB_TC:
     81             event = AVDT_SCB_TC_TOUT_EVT;
     82             break;
     83 
     84         default:
     85             break;
     86     }
     87 
     88     if (event & AVDT_CCB_MKR)
     89     {
     90         avdt_ccb_event((tAVDT_CCB *) p_tle->param, (UINT8) (event & ~AVDT_CCB_MKR),
     91                        (tAVDT_CCB_EVT *) &err_code);
     92     }
     93     else
     94     {
     95         avdt_scb_event((tAVDT_SCB *) p_tle->param, event, NULL);
     96     }
     97 }
     98 
     99 /*******************************************************************************
    100 **
    101 ** Function         AVDT_Register
    102 **
    103 ** Description      This is the system level registration function for the
    104 **                  AVDTP protocol.  This function initializes AVDTP and
    105 **                  prepares the protocol stack for its use.  This function
    106 **                  must be called once by the system or platform using AVDTP
    107 **                  before the other functions of the API an be used.
    108 **
    109 **
    110 ** Returns          void
    111 **
    112 *******************************************************************************/
    113 void AVDT_Register(tAVDT_REG *p_reg, tAVDT_CTRL_CBACK *p_cback)
    114 {
    115 
    116     BTTRC_AVDT_API0(AVDT_TRACE_API_REGISTER);
    117 
    118     /* register PSM with L2CAP */
    119     L2CA_Register(AVDT_PSM, (tL2CAP_APPL_INFO *) &avdt_l2c_appl);
    120 
    121     /* set security level */
    122     BTM_SetSecurityLevel(TRUE, "", BTM_SEC_SERVICE_AVDTP, p_reg->sec_mask,
    123         AVDT_PSM, BTM_SEC_PROTO_AVDT, AVDT_CHAN_SIG);
    124     BTM_SetSecurityLevel(FALSE, "", BTM_SEC_SERVICE_AVDTP, p_reg->sec_mask,
    125         AVDT_PSM, BTM_SEC_PROTO_AVDT, AVDT_CHAN_SIG);
    126 
    127     /* do not use security on the media channel */
    128     BTM_SetSecurityLevel(TRUE, "", BTM_SEC_SERVICE_AVDTP_NOSEC, BTM_SEC_NONE,
    129         AVDT_PSM, BTM_SEC_PROTO_AVDT, AVDT_CHAN_MEDIA);
    130     BTM_SetSecurityLevel(FALSE, "", BTM_SEC_SERVICE_AVDTP_NOSEC, BTM_SEC_NONE,
    131         AVDT_PSM, BTM_SEC_PROTO_AVDT, AVDT_CHAN_MEDIA);
    132 
    133 #if AVDT_REPORTING == TRUE
    134     /* do not use security on the reporting channel */
    135     BTM_SetSecurityLevel(TRUE, "", BTM_SEC_SERVICE_AVDTP_NOSEC, BTM_SEC_NONE,
    136         AVDT_PSM, BTM_SEC_PROTO_AVDT, AVDT_CHAN_REPORT);
    137     BTM_SetSecurityLevel(FALSE, "", BTM_SEC_SERVICE_AVDTP_NOSEC, BTM_SEC_NONE,
    138         AVDT_PSM, BTM_SEC_PROTO_AVDT, AVDT_CHAN_REPORT);
    139 #endif
    140 
    141     /* initialize AVDTP data structures */
    142     avdt_scb_init();
    143     avdt_ccb_init();
    144     avdt_ad_init();
    145 #if defined(AVDT_INITIAL_TRACE_LEVEL)
    146     avdt_cb.trace_level = AVDT_INITIAL_TRACE_LEVEL;
    147 #else
    148     avdt_cb.trace_level = BT_TRACE_LEVEL_NONE;
    149 #endif
    150 
    151     /* copy registration struct */
    152     memcpy(&avdt_cb.rcb, p_reg, sizeof(tAVDT_REG));
    153     avdt_cb.p_conn_cback = p_cback;
    154 }
    155 
    156 /*******************************************************************************
    157 **
    158 ** Function         AVDT_Deregister
    159 **
    160 ** Description      This function is called to deregister use AVDTP protocol.
    161 **                  It is called when AVDTP is no longer being used by any
    162 **                  application in the system.  Before this function can be
    163 **                  called, all streams must be removed with AVDT_RemoveStream().
    164 **
    165 **
    166 ** Returns          void
    167 **
    168 *******************************************************************************/
    169 void AVDT_Deregister(void)
    170 {
    171     BTTRC_AVDT_API0(AVDT_TRACE_API_DEREGISTER);
    172 
    173     /* deregister PSM with L2CAP */
    174     L2CA_Deregister(AVDT_PSM);
    175 }
    176 
    177 /*******************************************************************************
    178 **
    179 ** Function         AVDT_CreateStream
    180 **
    181 ** Description      Create a stream endpoint.  After a stream endpoint is
    182 **                  created an application can initiate a connection between
    183 **                  this endpoint and an endpoint on a peer device.  In
    184 **                  addition, a peer device can discover, get the capabilities,
    185 **                  and connect to this endpoint.
    186 **
    187 **
    188 ** Returns          AVDT_SUCCESS if successful, otherwise error.
    189 **
    190 *******************************************************************************/
    191 UINT16 AVDT_CreateStream(UINT8 *p_handle, tAVDT_CS *p_cs)
    192 {
    193     UINT16      result = AVDT_SUCCESS;
    194     tAVDT_SCB   *p_scb;
    195 
    196     BTTRC_AVDT_API0(AVDT_TRACE_API_CREATESTREAM);
    197 
    198     /* Verify parameters; if invalid, return failure */
    199     if (((p_cs->cfg.psc_mask & (~AVDT_PSC)) != 0) || (p_cs->p_ctrl_cback == NULL))
    200     {
    201         result = AVDT_BAD_PARAMS;
    202     }
    203     /* Allocate scb; if no scbs, return failure */
    204     else if ((p_scb = avdt_scb_alloc(p_cs)) == NULL)
    205     {
    206         result = AVDT_NO_RESOURCES;
    207     }
    208     else
    209     {
    210         *p_handle = avdt_scb_to_hdl(p_scb);
    211     }
    212     return result;
    213 }
    214 
    215 /*******************************************************************************
    216 **
    217 ** Function         AVDT_RemoveStream
    218 **
    219 ** Description      Remove a stream endpoint.  This function is called when
    220 **                  the application is no longer using a stream endpoint.
    221 **                  If this function is called when the endpoint is connected
    222 **                  the connection is closed and then the stream endpoint
    223 **                  is removed.
    224 **
    225 **
    226 ** Returns          AVDT_SUCCESS if successful, otherwise error.
    227 **
    228 *******************************************************************************/
    229 UINT16 AVDT_RemoveStream(UINT8 handle)
    230 {
    231     UINT16      result = AVDT_SUCCESS;
    232     tAVDT_SCB   *p_scb;
    233 
    234 
    235     BTTRC_AVDT_API0(AVDT_TRACE_API_REMOVESTREAM);
    236 
    237     /* look up scb */
    238     if ((p_scb = avdt_scb_by_hdl(handle)) == NULL)
    239     {
    240         result = AVDT_BAD_HANDLE;
    241     }
    242     else
    243     {
    244         /* send remove event to scb */
    245         avdt_scb_event(p_scb, AVDT_SCB_API_REMOVE_EVT, NULL);
    246     }
    247     return result;
    248 }
    249 
    250 /*******************************************************************************
    251 **
    252 ** Function         AVDT_DiscoverReq
    253 **
    254 ** Description      This function initiates a connection to the AVDTP service
    255 **                  on the peer device, if not already present, and discovers
    256 **                  the stream endpoints on the peer device.  (Please note
    257 **                  that AVDTP discovery is unrelated to SDP discovery).
    258 **                  This function can be called at any time regardless of whether
    259 **                  there is an AVDTP connection to the peer device.
    260 **
    261 **                  When discovery is complete, an AVDT_DISCOVER_CFM_EVT
    262 **                  is sent to the application via its callback function.
    263 **                  The application must not call AVDT_GetCapReq() or
    264 **                  AVDT_DiscoverReq() again to the same device until
    265 **                  discovery is complete.
    266 **
    267 **                  The memory addressed by sep_info is allocated by the
    268 **                  application.  This memory is written to by AVDTP as part
    269 **                  of the discovery procedure.  This memory must remain
    270 **                  accessible until the application receives the
    271 **                  AVDT_DISCOVER_CFM_EVT.
    272 **
    273 ** Returns          AVDT_SUCCESS if successful, otherwise error.
    274 **
    275 *******************************************************************************/
    276 UINT16 AVDT_DiscoverReq(BD_ADDR bd_addr, tAVDT_SEP_INFO *p_sep_info,
    277                         UINT8 max_seps, tAVDT_CTRL_CBACK *p_cback)
    278 {
    279     tAVDT_CCB       *p_ccb;
    280     UINT16          result = AVDT_SUCCESS;
    281     tAVDT_CCB_EVT   evt;
    282 
    283     BTTRC_AVDT_API0(AVDT_TRACE_API_DISCOVER_REQ);
    284 
    285     /* find channel control block for this bd addr; if none, allocate one */
    286     if ((p_ccb = avdt_ccb_by_bd(bd_addr)) == NULL)
    287     {
    288         if ((p_ccb = avdt_ccb_alloc(bd_addr)) == NULL)
    289         {
    290             /* could not allocate channel control block */
    291             result = AVDT_NO_RESOURCES;
    292         }
    293     }
    294 
    295     if (result == AVDT_SUCCESS)
    296     {
    297         /* make sure no discovery or get capabilities req already in progress */
    298         if (p_ccb->proc_busy)
    299         {
    300             result = AVDT_BUSY;
    301         }
    302         /* send event to ccb */
    303         else
    304         {
    305             evt.discover.p_sep_info = p_sep_info;
    306             evt.discover.num_seps = max_seps;
    307             evt.discover.p_cback = p_cback;
    308             avdt_ccb_event(p_ccb, AVDT_CCB_API_DISCOVER_REQ_EVT, &evt);
    309         }
    310     }
    311     return result;
    312 }
    313 
    314 /*******************************************************************************
    315 **
    316 ** Function         avdt_get_cap_req
    317 **
    318 ** Description      internal function to serve both AVDT_GetCapReq and
    319 **                  AVDT_GetAllCapReq
    320 **
    321 ** Returns          AVDT_SUCCESS if successful, otherwise error.
    322 **
    323 *******************************************************************************/
    324 static UINT16 avdt_get_cap_req(BD_ADDR bd_addr, tAVDT_CCB_API_GETCAP *p_evt)
    325 {
    326     tAVDT_CCB       *p_ccb = NULL;
    327     UINT16          result = AVDT_SUCCESS;
    328 
    329     /* verify SEID */
    330     if ((p_evt->single.seid < AVDT_SEID_MIN) || (p_evt->single.seid > AVDT_SEID_MAX))
    331     {
    332         AVDT_TRACE_ERROR1("seid: %d", p_evt->single.seid);
    333         result = AVDT_BAD_PARAMS;
    334     }
    335     /* find channel control block for this bd addr; if none, allocate one */
    336     else if ((p_ccb = avdt_ccb_by_bd(bd_addr)) == NULL)
    337     {
    338         if ((p_ccb = avdt_ccb_alloc(bd_addr)) == NULL)
    339         {
    340             /* could not allocate channel control block */
    341             result = AVDT_NO_RESOURCES;
    342         }
    343     }
    344 
    345     if (result == AVDT_SUCCESS)
    346     {
    347         /* make sure no discovery or get capabilities req already in progress */
    348         if (p_ccb->proc_busy)
    349         {
    350             result = AVDT_BUSY;
    351         }
    352         /* send event to ccb */
    353         else
    354         {
    355             avdt_ccb_event(p_ccb, AVDT_CCB_API_GETCAP_REQ_EVT, (tAVDT_CCB_EVT *)p_evt);
    356         }
    357     }
    358     return result;
    359 }
    360 
    361 /*******************************************************************************
    362 **
    363 ** Function         AVDT_GetCapReq
    364 **
    365 ** Description      This function initiates a connection to the AVDTP service
    366 **                  on the peer device, if not already present, and gets the
    367 **                  capabilities of a stream endpoint on the peer device.
    368 **                  This function can be called at any time regardless of
    369 **                  whether there is an AVDTP connection to the peer device.
    370 **
    371 **                  When the procedure is complete, an AVDT_GETCAP_CFM_EVT is
    372 **                  sent to the application via its callback function.  The
    373 **                  application must not call AVDT_GetCapReq() or
    374 **                  AVDT_DiscoverReq() again until the procedure is complete.
    375 **
    376 **                  The memory pointed to by p_cfg is allocated by the
    377 **                  application.  This memory is written to by AVDTP as part
    378 **                  of the get capabilities procedure.  This memory must
    379 **                  remain accessible until the application receives
    380 **                  the AVDT_GETCAP_CFM_EVT.
    381 **
    382 ** Returns          AVDT_SUCCESS if successful, otherwise error.
    383 **
    384 *******************************************************************************/
    385 UINT16 AVDT_GetCapReq(BD_ADDR bd_addr, UINT8 seid, tAVDT_CFG *p_cfg, tAVDT_CTRL_CBACK *p_cback)
    386 {
    387     tAVDT_CCB_API_GETCAP    getcap;
    388 
    389     BTTRC_AVDT_API1(AVDT_TRACE_API_GETCAP_REQ, BTTRC_PARAM_UINT8, seid);
    390 
    391     getcap.single.seid = seid;
    392     getcap.single.sig_id = AVDT_SIG_GETCAP;
    393     getcap.p_cfg = p_cfg;
    394     getcap.p_cback = p_cback;
    395     return avdt_get_cap_req (bd_addr, &getcap);
    396 }
    397 
    398 /*******************************************************************************
    399 **
    400 ** Function         AVDT_GetAllCapReq
    401 **
    402 ** Description      This function initiates a connection to the AVDTP service
    403 **                  on the peer device, if not already present, and gets the
    404 **                  capabilities of a stream endpoint on the peer device.
    405 **                  This function can be called at any time regardless of
    406 **                  whether there is an AVDTP connection to the peer device.
    407 **
    408 **                  When the procedure is complete, an AVDT_GETCAP_CFM_EVT is
    409 **                  sent to the application via its callback function.  The
    410 **                  application must not call AVDT_GetCapReq() or
    411 **                  AVDT_DiscoverReq() again until the procedure is complete.
    412 **
    413 **                  The memory pointed to by p_cfg is allocated by the
    414 **                  application.  This memory is written to by AVDTP as part
    415 **                  of the get capabilities procedure.  This memory must
    416 **                  remain accessible until the application receives
    417 **                  the AVDT_GETCAP_CFM_EVT.
    418 **
    419 ** Returns          AVDT_SUCCESS if successful, otherwise error.
    420 **
    421 *******************************************************************************/
    422 UINT16 AVDT_GetAllCapReq(BD_ADDR bd_addr, UINT8 seid, tAVDT_CFG *p_cfg, tAVDT_CTRL_CBACK *p_cback)
    423 {
    424     tAVDT_CCB_API_GETCAP    getcap;
    425 
    426     BTTRC_AVDT_API1(AVDT_TRACE_API_GET_ALLCAP_REQ, BTTRC_PARAM_UINT8, seid);
    427 
    428     getcap.single.seid = seid;
    429     getcap.single.sig_id = AVDT_SIG_GET_ALLCAP;
    430     getcap.p_cfg = p_cfg;
    431     getcap.p_cback = p_cback;
    432     return avdt_get_cap_req (bd_addr, &getcap);
    433 }
    434 
    435 /*******************************************************************************
    436 **
    437 ** Function         AVDT_DelayReport
    438 **
    439 ** Description      This functions sends a Delay Report to the peer device
    440 **                  that is associated with a particular SEID.
    441 **                  This function is called by SNK device.
    442 **
    443 ** Returns          AVDT_SUCCESS if successful, otherwise error.
    444 **
    445 *******************************************************************************/
    446 UINT16 AVDT_DelayReport(UINT8 handle, UINT8 seid, UINT16 delay)
    447 {
    448     tAVDT_SCB       *p_scb;
    449     UINT16          result = AVDT_SUCCESS;
    450     tAVDT_SCB_EVT   evt;
    451 
    452     BTTRC_AVDT_API0(AVDT_TRACE_API_DELAY_REPORT);
    453 
    454     /* map handle to scb */
    455     if ((p_scb = avdt_scb_by_hdl(handle)) == NULL)
    456     {
    457         result = AVDT_BAD_HANDLE;
    458     }
    459     else
    460     /* send event to scb */
    461     {
    462         evt.apidelay.hdr.seid   = seid;
    463         evt.apidelay.delay      = delay;
    464         avdt_scb_event(p_scb, AVDT_SCB_API_DELAY_RPT_REQ_EVT, &evt);
    465     }
    466 
    467     return result;
    468 }
    469 
    470 /*******************************************************************************
    471 **
    472 ** Function         AVDT_OpenReq
    473 **
    474 ** Description      This function initiates a connection to the AVDTP service
    475 **                  on the peer device, if not already present, and connects
    476 **                  to a stream endpoint on a peer device.  When the connection
    477 **                  is completed, an AVDT_OPEN_CFM_EVT is sent to the
    478 **                  application via the control callback function for this handle.
    479 **
    480 ** Returns          AVDT_SUCCESS if successful, otherwise error.
    481 **
    482 *******************************************************************************/
    483 UINT16 AVDT_OpenReq(UINT8 handle, BD_ADDR bd_addr, UINT8 seid, tAVDT_CFG *p_cfg)
    484 {
    485     tAVDT_CCB       *p_ccb = NULL;
    486     tAVDT_SCB       *p_scb = NULL;
    487     UINT16          result = AVDT_SUCCESS;
    488     tAVDT_SCB_EVT   evt;
    489 
    490     BTTRC_AVDT_API0(AVDT_TRACE_API_OPEN_REQ);
    491 
    492 
    493     /* verify SEID */
    494     if ((seid < AVDT_SEID_MIN) || (seid > AVDT_SEID_MAX))
    495     {
    496         result = AVDT_BAD_PARAMS;
    497     }
    498     /* map handle to scb */
    499     else if ((p_scb = avdt_scb_by_hdl(handle)) == NULL)
    500     {
    501         result = AVDT_BAD_HANDLE;
    502     }
    503     /* find channel control block for this bd addr; if none, allocate one */
    504     else if ((p_ccb = avdt_ccb_by_bd(bd_addr)) == NULL)
    505     {
    506         if ((p_ccb = avdt_ccb_alloc(bd_addr)) == NULL)
    507         {
    508             /* could not allocate channel control block */
    509             result = AVDT_NO_RESOURCES;
    510         }
    511     }
    512 
    513     /* send event to scb */
    514     if (result == AVDT_SUCCESS)
    515     {
    516         evt.msg.config_cmd.hdr.seid = seid;
    517         evt.msg.config_cmd.hdr.ccb_idx = avdt_ccb_to_idx(p_ccb);
    518         evt.msg.config_cmd.int_seid = handle;
    519         evt.msg.config_cmd.p_cfg = p_cfg;
    520         avdt_scb_event(p_scb, AVDT_SCB_API_SETCONFIG_REQ_EVT, &evt);
    521     }
    522     return result;
    523 }
    524 
    525 /*******************************************************************************
    526 **
    527 ** Function         AVDT_ConfigRsp
    528 **
    529 ** Description      Respond to a configure request from the peer device.  This
    530 **                  function must be called if the application receives an
    531 **                  AVDT_CONFIG_IND_EVT through its control callback.
    532 **
    533 **
    534 ** Returns          AVDT_SUCCESS if successful, otherwise error.
    535 **
    536 *******************************************************************************/
    537 UINT16 AVDT_ConfigRsp(UINT8 handle, UINT8 label, UINT8 error_code, UINT8 category)
    538 {
    539     tAVDT_SCB       *p_scb;
    540     tAVDT_SCB_EVT   evt;
    541     UINT16          result = AVDT_SUCCESS;
    542     UINT8           event_code;
    543 
    544     BTTRC_AVDT_API0(AVDT_TRACE_API_CONFIG_RSP);
    545 
    546     /* map handle to scb */
    547     if ((p_scb = avdt_scb_by_hdl(handle)) == NULL)
    548     {
    549         result = AVDT_BAD_HANDLE;
    550     }
    551     /* handle special case when this function is called but peer has not send
    552     ** a configuration cmd; ignore and return error result
    553     */
    554     else if (!p_scb->in_use)
    555     {
    556         result = AVDT_BAD_HANDLE;
    557     }
    558     /* send event to scb */
    559     else
    560     {
    561         evt.msg.hdr.err_code = error_code;
    562         evt.msg.hdr.err_param = category;
    563         evt.msg.hdr.label = label;
    564         if (error_code == 0)
    565         {
    566             event_code = AVDT_SCB_API_SETCONFIG_RSP_EVT;
    567         }
    568         else
    569         {
    570             event_code = AVDT_SCB_API_SETCONFIG_REJ_EVT;
    571         }
    572         avdt_scb_event(p_scb, event_code, &evt);
    573     }
    574 
    575     return result;
    576 }
    577 
    578 /*******************************************************************************
    579 **
    580 ** Function         AVDT_StartReq
    581 **
    582 ** Description      Start one or more stream endpoints.  This initiates the
    583 **                  transfer of media packets for the streams.  All stream
    584 **                  endpoints must previously be opened.  When the streams
    585 **                  are started, an AVDT_START_CFM_EVT is sent to the
    586 **                  application via the control callback function for each stream.
    587 **
    588 **
    589 ** Returns          AVDT_SUCCESS if successful, otherwise error.
    590 **
    591 *******************************************************************************/
    592 UINT16 AVDT_StartReq(UINT8 *p_handles, UINT8 num_handles)
    593 {
    594     tAVDT_SCB       *p_scb = NULL;
    595     tAVDT_CCB_EVT   evt;
    596     UINT16          result = AVDT_SUCCESS;
    597     int             i;
    598 
    599     BTTRC_AVDT_API0(AVDT_TRACE_API_START_REQ);
    600 
    601     if ((num_handles == 0) || (num_handles > AVDT_NUM_SEPS))
    602     {
    603         result = AVDT_BAD_PARAMS;
    604     }
    605     else
    606     {
    607         /* verify handles */
    608         for (i = 0; i < num_handles; i++)
    609         {
    610             if ((p_scb = avdt_scb_by_hdl(p_handles[i])) == NULL)
    611             {
    612                 result = AVDT_BAD_HANDLE;
    613                 break;
    614             }
    615         }
    616     }
    617 
    618     if (result == AVDT_SUCCESS)
    619     {
    620         if (p_scb->p_ccb == NULL)
    621         {
    622             result = AVDT_BAD_HANDLE;
    623         }
    624         else
    625         {
    626             /* send event to ccb */
    627             memcpy(evt.msg.multi.seid_list, p_handles, num_handles);
    628             evt.msg.multi.num_seps = num_handles;
    629             avdt_ccb_event(p_scb->p_ccb, AVDT_CCB_API_START_REQ_EVT, &evt);
    630         }
    631     }
    632     return result;
    633 }
    634 
    635 /*******************************************************************************
    636 **
    637 ** Function         AVDT_SuspendReq
    638 **
    639 ** Description      Suspend one or more stream endpoints. This suspends the
    640 **                  transfer of media packets for the streams.  All stream
    641 **                  endpoints must previously be open and started.  When the
    642 **                  streams are suspended, an AVDT_SUSPEND_CFM_EVT is sent to
    643 **                  the application via the control callback function for
    644 **                  each stream.
    645 **
    646 **
    647 ** Returns          AVDT_SUCCESS if successful, otherwise error.
    648 **
    649 *******************************************************************************/
    650 UINT16 AVDT_SuspendReq(UINT8 *p_handles, UINT8 num_handles)
    651 {
    652     tAVDT_SCB       *p_scb = NULL;
    653     tAVDT_CCB_EVT   evt;
    654     UINT16          result = AVDT_SUCCESS;
    655     int             i;
    656 
    657     BTTRC_AVDT_API0(AVDT_TRACE_API_SUSPEND_REQ);
    658 
    659     if ((num_handles == 0) || (num_handles > AVDT_NUM_SEPS))
    660     {
    661         result = AVDT_BAD_PARAMS;
    662     }
    663     else
    664     {
    665         /* verify handles */
    666         for (i = 0; i < num_handles; i++)
    667         {
    668             if ((p_scb = avdt_scb_by_hdl(p_handles[i])) == NULL)
    669             {
    670                 result = AVDT_BAD_HANDLE;
    671                 break;
    672             }
    673         }
    674     }
    675 
    676     if (result == AVDT_SUCCESS)
    677     {
    678         if (p_scb->p_ccb == NULL)
    679         {
    680             result = AVDT_BAD_HANDLE;
    681         }
    682         else
    683         {
    684             /* send event to ccb */
    685             memcpy(evt.msg.multi.seid_list, p_handles, num_handles);
    686             evt.msg.multi.num_seps = num_handles;
    687             avdt_ccb_event(p_scb->p_ccb, AVDT_CCB_API_SUSPEND_REQ_EVT, &evt);
    688         }
    689     }
    690 
    691     return result;
    692 }
    693 
    694 /*******************************************************************************
    695 **
    696 ** Function         AVDT_CloseReq
    697 **
    698 ** Description      Close a stream endpoint.  This stops the transfer of media
    699 **                  packets and closes the transport channel associated with
    700 **                  this stream endpoint.  When the stream is closed, an
    701 **                  AVDT_CLOSE_CFM_EVT is sent to the application via the
    702 **                  control callback function for this handle.
    703 **
    704 **
    705 ** Returns          AVDT_SUCCESS if successful, otherwise error.
    706 **
    707 *******************************************************************************/
    708 UINT16 AVDT_CloseReq(UINT8 handle)
    709 {
    710     tAVDT_SCB       *p_scb;
    711     UINT16          result = AVDT_SUCCESS;
    712 
    713     BTTRC_AVDT_API0(AVDT_TRACE_API_CLOSE_REQ);
    714 
    715     /* map handle to scb */
    716     if ((p_scb = avdt_scb_by_hdl(handle)) == NULL)
    717     {
    718         result = AVDT_BAD_HANDLE;
    719     }
    720     else
    721     /* send event to scb */
    722     {
    723         avdt_scb_event(p_scb, AVDT_SCB_API_CLOSE_REQ_EVT, NULL);
    724     }
    725 
    726     return result;
    727 }
    728 
    729 /*******************************************************************************
    730 **
    731 ** Function         AVDT_ReconfigReq
    732 **
    733 ** Description      Reconfigure a stream endpoint.  This allows the application
    734 **                  to change the codec or content protection capabilities of
    735 **                  a stream endpoint after it has been opened.  This function
    736 **                  can only be called if the stream is opened but not started
    737 **                  or if the stream has been suspended.  When the procedure
    738 **                  is completed, an AVDT_RECONFIG_CFM_EVT is sent to the
    739 **                  application via the control callback function for this handle.
    740 **
    741 **
    742 ** Returns          AVDT_SUCCESS if successful, otherwise error.
    743 **
    744 *******************************************************************************/
    745 UINT16 AVDT_ReconfigReq(UINT8 handle, tAVDT_CFG *p_cfg)
    746 {
    747     tAVDT_SCB       *p_scb;
    748     UINT16          result = AVDT_SUCCESS;
    749     tAVDT_SCB_EVT   evt;
    750 
    751     BTTRC_AVDT_API0(AVDT_TRACE_API_RECONFIG_REQ);
    752 
    753     /* map handle to scb */
    754     if ((p_scb = avdt_scb_by_hdl(handle)) == NULL)
    755     {
    756         result = AVDT_BAD_HANDLE;
    757     }
    758     /* send event to scb */
    759     else
    760     {
    761         /* force psc_mask to zero */
    762         p_cfg->psc_mask = 0;
    763 
    764         evt.msg.reconfig_cmd.p_cfg = p_cfg;
    765         avdt_scb_event(p_scb, AVDT_SCB_API_RECONFIG_REQ_EVT, &evt);
    766     }
    767     return result;
    768 }
    769 
    770 /*******************************************************************************
    771 **
    772 ** Function         AVDT_ReconfigRsp
    773 **
    774 ** Description      Respond to a reconfigure request from the peer device.
    775 **                  This function must be called if the application receives
    776 **                  an AVDT_RECONFIG_IND_EVT through its control callback.
    777 **
    778 **
    779 ** Returns          AVDT_SUCCESS if successful, otherwise error.
    780 **
    781 *******************************************************************************/
    782 UINT16 AVDT_ReconfigRsp(UINT8 handle, UINT8 label, UINT8 error_code, UINT8 category)
    783 {
    784     tAVDT_SCB       *p_scb;
    785     tAVDT_SCB_EVT   evt;
    786     UINT16          result = AVDT_SUCCESS;
    787 
    788     BTTRC_AVDT_API0(AVDT_TRACE_API_RECONFIG_RSP);
    789 
    790     /* map handle to scb */
    791     if ((p_scb = avdt_scb_by_hdl(handle)) == NULL)
    792     {
    793         result = AVDT_BAD_HANDLE;
    794     }
    795     /* send event to scb */
    796     else
    797     {
    798         evt.msg.hdr.err_code = error_code;
    799         evt.msg.hdr.err_param = category;
    800         evt.msg.hdr.label = label;
    801         avdt_scb_event(p_scb, AVDT_SCB_API_RECONFIG_RSP_EVT, &evt);
    802     }
    803 
    804     return result;
    805 }
    806 
    807 /*******************************************************************************
    808 **
    809 ** Function         AVDT_SecurityReq
    810 **
    811 ** Description      Send a security request to the peer device.  When the
    812 **                  security procedure is completed, an AVDT_SECURITY_CFM_EVT
    813 **                  is sent to the application via the control callback function
    814 **                  for this handle.  (Please note that AVDTP security procedures
    815 **                  are unrelated to Bluetooth link level security.)
    816 **
    817 **
    818 ** Returns          AVDT_SUCCESS if successful, otherwise error.
    819 **
    820 *******************************************************************************/
    821 UINT16 AVDT_SecurityReq(UINT8 handle, UINT8 *p_data, UINT16 len)
    822 {
    823     tAVDT_SCB       *p_scb;
    824     UINT16          result = AVDT_SUCCESS;
    825     tAVDT_SCB_EVT   evt;
    826 
    827     BTTRC_AVDT_API0(AVDT_TRACE_API_SECURITY_REQ);
    828 
    829     /* map handle to scb */
    830     if ((p_scb = avdt_scb_by_hdl(handle)) == NULL)
    831     {
    832         result = AVDT_BAD_HANDLE;
    833     }
    834     /* send event to scb */
    835     else
    836     {
    837         evt.msg.security_rsp.p_data = p_data;
    838         evt.msg.security_rsp.len = len;
    839         avdt_scb_event(p_scb, AVDT_SCB_API_SECURITY_REQ_EVT, &evt);
    840     }
    841     return result;
    842 }
    843 
    844 /*******************************************************************************
    845 **
    846 ** Function         AVDT_SecurityRsp
    847 **
    848 ** Description      Respond to a security request from the peer device.
    849 **                  This function must be called if the application receives
    850 **                  an AVDT_SECURITY_IND_EVT through its control callback.
    851 **                  (Please note that AVDTP security procedures are unrelated
    852 **                  to Bluetooth link level security.)
    853 **
    854 **
    855 ** Returns          AVDT_SUCCESS if successful, otherwise error.
    856 **
    857 *******************************************************************************/
    858 UINT16 AVDT_SecurityRsp(UINT8 handle, UINT8 label, UINT8 error_code,
    859                         UINT8 *p_data, UINT16 len)
    860 {
    861     tAVDT_SCB       *p_scb;
    862     UINT16          result = AVDT_SUCCESS;
    863     tAVDT_SCB_EVT   evt;
    864 
    865     BTTRC_AVDT_API0(AVDT_TRACE_API_SECURITY_RSP);
    866 
    867     /* map handle to scb */
    868     if ((p_scb = avdt_scb_by_hdl(handle)) == NULL)
    869     {
    870         result = AVDT_BAD_HANDLE;
    871     }
    872     /* send event to scb */
    873     else
    874     {
    875         evt.msg.security_rsp.hdr.err_code = error_code;
    876         evt.msg.security_rsp.hdr.label = label;
    877         evt.msg.security_rsp.p_data = p_data;
    878         evt.msg.security_rsp.len = len;
    879         avdt_scb_event(p_scb, AVDT_SCB_API_SECURITY_RSP_EVT, &evt);
    880     }
    881     return result;
    882 }
    883 
    884 /*******************************************************************************
    885 **
    886 ** Function         AVDT_WriteReqOpt
    887 **
    888 ** Description      Send a media packet to the peer device.  The stream must
    889 **                  be started before this function is called.  Also, this
    890 **                  function can only be called if the stream is a SRC.
    891 **
    892 **                  When AVDTP has sent the media packet and is ready for the
    893 **                  next packet, an AVDT_WRITE_CFM_EVT is sent to the
    894 **                  application via the control callback.  The application must
    895 **                  wait for the AVDT_WRITE_CFM_EVT before it makes the next
    896 **                  call to AVDT_WriteReq().  If the applications calls
    897 **                  AVDT_WriteReq() before it receives the event the packet
    898 **                  will not be sent.  The application may make its first call
    899 **                  to AVDT_WriteReq() after it receives an AVDT_START_CFM_EVT
    900 **                  or AVDT_START_IND_EVT.
    901 **
    902 **                  The application passes the packet using the BT_HDR structure.
    903 **                  This structure is described in section 2.1.  The offset
    904 **                  field must be equal to or greater than AVDT_MEDIA_OFFSET
    905 **                  (if NO_RTP is specified, L2CAP_MIN_OFFSET can be used).
    906 **                  This allows enough space in the buffer for the L2CAP and
    907 **                  AVDTP headers.
    908 **
    909 **                  The memory pointed to by p_pkt must be a GKI buffer
    910 **                  allocated by the application.  This buffer will be freed
    911 **                  by the protocol stack; the application must not free
    912 **                  this buffer.
    913 **
    914 **                  The opt parameter allows passing specific options like:
    915 **                  - NO_RTP : do not add the RTP header to buffer
    916 **
    917 ** Returns          AVDT_SUCCESS if successful, otherwise error.
    918 **
    919 *******************************************************************************/
    920 UINT16 AVDT_WriteReqOpt(UINT8 handle, BT_HDR *p_pkt, UINT32 time_stamp, UINT8 m_pt, tAVDT_DATA_OPT_MASK opt)
    921 {
    922     tAVDT_SCB       *p_scb;
    923     tAVDT_SCB_EVT   evt;
    924     UINT16          result = AVDT_SUCCESS;
    925 
    926     BTTRC_AVDT_API0(AVDT_TRACE_API_WRITE_REQ);
    927 
    928     /* map handle to scb */
    929     if ((p_scb = avdt_scb_by_hdl(handle)) == NULL)
    930     {
    931         result = AVDT_BAD_HANDLE;
    932     }
    933     else
    934     {
    935         evt.apiwrite.p_buf = p_pkt;
    936         evt.apiwrite.time_stamp = time_stamp;
    937         evt.apiwrite.m_pt = m_pt;
    938         evt.apiwrite.opt = opt;
    939 #if AVDT_MULTIPLEXING == TRUE
    940         GKI_init_q (&evt.apiwrite.frag_q);
    941 #endif
    942         avdt_scb_event(p_scb, AVDT_SCB_API_WRITE_REQ_EVT, &evt);
    943     }
    944 
    945     return result;
    946 }
    947 
    948 /*******************************************************************************
    949 **
    950 ** Function         AVDT_WriteReq
    951 **
    952 ** Description      Send a media packet to the peer device.  The stream must
    953 **                  be started before this function is called.  Also, this
    954 **                  function can only be called if the stream is a SRC.
    955 **
    956 **                  When AVDTP has sent the media packet and is ready for the
    957 **                  next packet, an AVDT_WRITE_CFM_EVT is sent to the
    958 **                  application via the control callback.  The application must
    959 **                  wait for the AVDT_WRITE_CFM_EVT before it makes the next
    960 **                  call to AVDT_WriteReq().  If the applications calls
    961 **                  AVDT_WriteReq() before it receives the event the packet
    962 **                  will not be sent.  The application may make its first call
    963 **                  to AVDT_WriteReq() after it receives an AVDT_START_CFM_EVT
    964 **                  or AVDT_START_IND_EVT.
    965 **
    966 **                  The application passes the packet using the BT_HDR structure.
    967 **                  This structure is described in section 2.1.  The offset
    968 **                  field must be equal to or greater than AVDT_MEDIA_OFFSET.
    969 **                  This allows enough space in the buffer for the L2CAP and
    970 **                  AVDTP headers.
    971 **
    972 **                  The memory pointed to by p_pkt must be a GKI buffer
    973 **                  allocated by the application.  This buffer will be freed
    974 **                  by the protocol stack; the application must not free
    975 **                  this buffer.
    976 **
    977 **
    978 ** Returns          AVDT_SUCCESS if successful, otherwise error.
    979 **
    980 *******************************************************************************/
    981 UINT16 AVDT_WriteReq(UINT8 handle, BT_HDR *p_pkt, UINT32 time_stamp, UINT8 m_pt)
    982 {
    983     return AVDT_WriteReqOpt(handle, p_pkt, time_stamp, m_pt, AVDT_DATA_OPT_NONE);
    984 }
    985 
    986 /*******************************************************************************
    987 **
    988 ** Function         AVDT_ConnectReq
    989 **
    990 ** Description      This function initiates an AVDTP signaling connection
    991 **                  to the peer device.  When the connection is completed, an
    992 **                  AVDT_CONNECT_IND_EVT is sent to the application via its
    993 **                  control callback function.  If the connection attempt fails
    994 **                  an AVDT_DISCONNECT_IND_EVT is sent.  The security mask
    995 **                  parameter overrides the outgoing security mask set in
    996 **                  AVDT_Register().
    997 **
    998 ** Returns          AVDT_SUCCESS if successful, otherwise error.
    999 **
   1000 *******************************************************************************/
   1001 UINT16 AVDT_ConnectReq(BD_ADDR bd_addr, UINT8 sec_mask, tAVDT_CTRL_CBACK *p_cback)
   1002 {
   1003     tAVDT_CCB       *p_ccb = NULL;
   1004     UINT16          result = AVDT_SUCCESS;
   1005     tAVDT_CCB_EVT   evt;
   1006 
   1007     BTTRC_AVDT_API0(AVDT_TRACE_API_CONNECT_REQ);
   1008 
   1009     /* find channel control block for this bd addr; if none, allocate one */
   1010     if ((p_ccb = avdt_ccb_by_bd(bd_addr)) == NULL)
   1011     {
   1012         if ((p_ccb = avdt_ccb_alloc(bd_addr)) == NULL)
   1013         {
   1014             /* could not allocate channel control block */
   1015             result = AVDT_NO_RESOURCES;
   1016         }
   1017     }
   1018     else if (p_ccb->ll_opened == FALSE)
   1019     {
   1020         AVDT_TRACE_WARNING0("AVDT_ConnectReq: CCB LL is in the middle of opening");
   1021 
   1022         /* ccb was already allocated for the incoming signalling. */
   1023         result = AVDT_BUSY;
   1024     }
   1025 
   1026     if (result == AVDT_SUCCESS)
   1027     {
   1028         /* send event to ccb */
   1029         evt.connect.p_cback = p_cback;
   1030         evt.connect.sec_mask = sec_mask;
   1031         avdt_ccb_event(p_ccb, AVDT_CCB_API_CONNECT_REQ_EVT, &evt);
   1032     }
   1033     return result;
   1034 }
   1035 
   1036 /*******************************************************************************
   1037 **
   1038 ** Function         AVDT_DisconnectReq
   1039 **
   1040 ** Description      This function disconnect an AVDTP signaling connection
   1041 **                  to the peer device.  When disconnected an
   1042 **                  AVDT_DISCONNECT_IND_EVT is sent to the application via its
   1043 **                  control callback function.
   1044 **
   1045 ** Returns          AVDT_SUCCESS if successful, otherwise error.
   1046 **
   1047 *******************************************************************************/
   1048 UINT16 AVDT_DisconnectReq(BD_ADDR bd_addr, tAVDT_CTRL_CBACK *p_cback)
   1049 {
   1050     tAVDT_CCB       *p_ccb = NULL;
   1051     UINT16          result = AVDT_SUCCESS;
   1052     tAVDT_CCB_EVT   evt;
   1053 
   1054     BTTRC_AVDT_API0(AVDT_TRACE_API_DISCONNECT_REQ);
   1055 
   1056 
   1057     /* find channel control block for this bd addr; if none, error */
   1058     if ((p_ccb = avdt_ccb_by_bd(bd_addr)) == NULL)
   1059     {
   1060         result = AVDT_BAD_PARAMS;
   1061     }
   1062 
   1063     if (result == AVDT_SUCCESS)
   1064     {
   1065         /* send event to ccb */
   1066         evt.disconnect.p_cback = p_cback;
   1067         avdt_ccb_event(p_ccb, AVDT_CCB_API_DISCONNECT_REQ_EVT, &evt);
   1068     }
   1069     return result;
   1070 }
   1071 
   1072 /*******************************************************************************
   1073 **
   1074 ** Function         AVDT_GetL2CapChannel
   1075 **
   1076 ** Description      Get the L2CAP CID used by the handle.
   1077 **
   1078 ** Returns          CID if successful, otherwise 0.
   1079 **
   1080 *******************************************************************************/
   1081 UINT16 AVDT_GetL2CapChannel(UINT8 handle)
   1082 {
   1083     tAVDT_SCB       *p_scb;
   1084     tAVDT_CCB       *p_ccb;
   1085     UINT8           tcid;
   1086     UINT16          lcid = 0;
   1087 
   1088     /* map handle to scb */
   1089     if (((p_scb = avdt_scb_by_hdl(handle)) != NULL)
   1090      && ((p_ccb = p_scb->p_ccb) != NULL))
   1091     {
   1092         /* get tcid from type, scb */
   1093         tcid = avdt_ad_type_to_tcid(AVDT_CHAN_MEDIA, p_scb);
   1094 
   1095         lcid = avdt_cb.ad.rt_tbl[avdt_ccb_to_idx(p_ccb)][tcid].lcid;
   1096     }
   1097 
   1098     BTTRC_AVDT_API1(AVDT_TRACE_API_GET_L2CAP_CHAN, BTTRC_PARAM_UINT16, lcid);
   1099 
   1100     return (lcid);
   1101 }
   1102 
   1103 /*******************************************************************************
   1104 **
   1105 ** Function         AVDT_GetSignalChannel
   1106 **
   1107 ** Description      Get the L2CAP CID used by the signal channel of the given handle.
   1108 **
   1109 ** Returns          CID if successful, otherwise 0.
   1110 **
   1111 *******************************************************************************/
   1112 UINT16 AVDT_GetSignalChannel(UINT8 handle, BD_ADDR bd_addr)
   1113 {
   1114     tAVDT_SCB       *p_scb;
   1115     tAVDT_CCB       *p_ccb;
   1116     UINT8           tcid = 0; /* tcid is always 0 for signal channel */
   1117     UINT16          lcid = 0;
   1118 
   1119     /* map handle to scb */
   1120     if (((p_scb = avdt_scb_by_hdl(handle)) != NULL)
   1121      && ((p_ccb = p_scb->p_ccb) != NULL))
   1122     {
   1123         lcid = avdt_cb.ad.rt_tbl[avdt_ccb_to_idx(p_ccb)][tcid].lcid;
   1124     }
   1125     else if ((p_ccb = avdt_ccb_by_bd(bd_addr)) != NULL)
   1126     {
   1127         lcid = avdt_cb.ad.rt_tbl[avdt_ccb_to_idx(p_ccb)][tcid].lcid;
   1128     }
   1129 
   1130     BTTRC_AVDT_API1(AVDT_TRACE_API_GET_SIGNAL_CHAN, BTTRC_PARAM_UINT16, lcid);
   1131 
   1132     return (lcid);
   1133 }
   1134 
   1135 #if AVDT_MULTIPLEXING == TRUE
   1136 /*******************************************************************************
   1137 **
   1138 ** Function         AVDT_WriteDataReq
   1139 **
   1140 ** Description      Send a media packet to the peer device.  The stream must
   1141 **                  be started before this function is called.  Also, this
   1142 **                  function can only be called if the stream is a SRC.
   1143 **
   1144 **                  When AVDTP has sent the media packet and is ready for the
   1145 **                  next packet, an AVDT_WRITE_CFM_EVT is sent to the
   1146 **                  application via the control callback.  The application must
   1147 **                  wait for the AVDT_WRITE_CFM_EVT before it makes the next
   1148 **                  call to AVDT_WriteDataReq().  If the applications calls
   1149 **                  AVDT_WriteDataReq() before it receives the event the packet
   1150 **                  will not be sent.  The application may make its first call
   1151 **                  to AVDT_WriteDataReq() after it receives an
   1152 **                  AVDT_START_CFM_EVT or AVDT_START_IND_EVT.
   1153 **
   1154 ** Returns          AVDT_SUCCESS if successful, otherwise error.
   1155 **
   1156 *******************************************************************************/
   1157 AVDT_API extern UINT16 AVDT_WriteDataReq(UINT8 handle, UINT8 *p_data, UINT32 data_len,
   1158                                      UINT32 time_stamp, UINT8 m_pt, UINT8 marker)
   1159 {
   1160 
   1161     tAVDT_SCB       *p_scb;
   1162     tAVDT_SCB_EVT   evt;
   1163     UINT16          result = AVDT_SUCCESS;
   1164 
   1165     BTTRC_AVDT_API1(AVDT_TRACE_API_WRITE_DATA_REQ, BTTRC_PARAM_UINT32, data_len);
   1166 
   1167     do
   1168     {
   1169         /* check length of media frame */
   1170         if(data_len > AVDT_MAX_MEDIA_SIZE)
   1171         {
   1172             result = AVDT_BAD_PARAMS;
   1173             break;
   1174         }
   1175         /* map handle to scb */
   1176         if ((p_scb = avdt_scb_by_hdl(handle)) == NULL)
   1177         {
   1178             result = AVDT_BAD_HANDLE;
   1179             break;
   1180         }
   1181         AVDT_TRACE_WARNING1("mux_tsid_media:%d", p_scb->curr_cfg.mux_tsid_media);
   1182 
   1183         if (p_scb->p_pkt != NULL
   1184             || p_scb->p_ccb == NULL
   1185             || !GKI_queue_is_empty(&p_scb->frag_q)
   1186             || p_scb->frag_off != 0
   1187             || p_scb->curr_cfg.mux_tsid_media == 0)
   1188         {
   1189             result = AVDT_ERR_BAD_STATE;
   1190             AVDT_TRACE_WARNING4("p_scb->p_pkt=%x, p_scb->p_ccb=%x, IsQueueEmpty=%x, p_scb->frag_off=%x",
   1191                 p_scb->p_pkt, p_scb->p_ccb, GKI_queue_is_empty(&p_scb->frag_q), p_scb->frag_off);
   1192             break;
   1193         }
   1194         evt.apiwrite.p_buf = 0; /* it will indicate using of fragments queue frag_q */
   1195         /* create queue of media fragments */
   1196         GKI_init_q (&evt.apiwrite.frag_q);
   1197 
   1198         /* compose fragments from media payload and put fragments into gueue */
   1199         avdt_scb_queue_frags(p_scb, &p_data, &data_len, &evt.apiwrite.frag_q);
   1200 
   1201         if(GKI_queue_is_empty(&evt.apiwrite.frag_q))
   1202         {
   1203             AVDT_TRACE_WARNING0("AVDT_WriteDataReq out of GKI buffers");
   1204             result = AVDT_ERR_RESOURCE;
   1205             break;
   1206         }
   1207         evt.apiwrite.data_len = data_len;
   1208         evt.apiwrite.p_data = p_data;
   1209 
   1210         /* process the fragments queue */
   1211         evt.apiwrite.time_stamp = time_stamp;
   1212         evt.apiwrite.m_pt = m_pt | (marker<<7);
   1213         avdt_scb_event(p_scb, AVDT_SCB_API_WRITE_REQ_EVT, &evt);
   1214     } while (0);
   1215 
   1216 #if (BT_USE_TRACES == TRUE)
   1217     if(result != AVDT_SUCCESS)
   1218     {
   1219         AVDT_TRACE_WARNING1("*** AVDT_WriteDataReq failed result=%d",result);
   1220     }
   1221 #endif
   1222     return result;
   1223 }
   1224 #endif
   1225 
   1226 #if AVDT_MULTIPLEXING == TRUE
   1227 /*******************************************************************************
   1228 **
   1229 ** Function         AVDT_SetMediaBuf
   1230 **
   1231 ** Description      Assigns buffer for media packets or forbids using of assigned
   1232 **                  buffer if argument p_buf is NULL. This function can only
   1233 **                  be called if the stream is a SNK.
   1234 **
   1235 **                  AVDTP uses this buffer to reassemble fragmented media packets.
   1236 **                  When AVDTP receives a complete media packet, it calls the
   1237 **                  p_media_cback assigned by AVDT_CreateStream().
   1238 **                  This function can be called during callback to assign a
   1239 **                  different buffer for next media packet or can leave the current
   1240 **                  buffer for next packet.
   1241 **
   1242 ** Returns          AVDT_SUCCESS if successful, otherwise error.
   1243 **
   1244 *******************************************************************************/
   1245 AVDT_API extern UINT16 AVDT_SetMediaBuf(UINT8 handle, UINT8 *p_buf, UINT32 buf_len)
   1246 {
   1247     tAVDT_SCB       *p_scb;
   1248     UINT16          result = AVDT_SUCCESS;
   1249 
   1250     BTTRC_AVDT_API0(AVDT_TRACE_API_SET_MEDIABUF);
   1251 
   1252     /* map handle to scb */
   1253     if ((p_scb = avdt_scb_by_hdl(handle)) == NULL)
   1254     {
   1255         result = AVDT_BAD_HANDLE;
   1256     }
   1257     else
   1258     {
   1259         if(p_buf && p_scb->cs.p_media_cback == NULL)
   1260             result = AVDT_NO_RESOURCES;
   1261         else
   1262         {
   1263             p_scb->p_media_buf = p_buf;
   1264             p_scb->media_buf_len = buf_len;
   1265         }
   1266     }
   1267 
   1268     return result;
   1269 }
   1270 #endif
   1271 
   1272 #if AVDT_REPORTING == TRUE
   1273 /*******************************************************************************
   1274 **
   1275 ** Function         AVDT_SendReport
   1276 **
   1277 ** Description
   1278 **
   1279 **
   1280 **
   1281 ** Returns
   1282 **
   1283 *******************************************************************************/
   1284 UINT16 AVDT_SendReport(UINT8 handle, AVDT_REPORT_TYPE type,
   1285                        tAVDT_REPORT_DATA *p_data)
   1286 {
   1287     tAVDT_SCB       *p_scb;
   1288     UINT16          result = AVDT_BAD_PARAMS;
   1289     BT_HDR          *p_pkt;
   1290     tAVDT_TC_TBL    *p_tbl;
   1291     UINT8           *p, *plen, *pm1, *p_end;
   1292 #if AVDT_MULTIPLEXING == TRUE
   1293     UINT8           *p_al=NULL, u;
   1294 #endif
   1295     UINT32  ssrc;
   1296     UINT16  len;
   1297 
   1298     BTTRC_AVDT_API0(AVDT_TRACE_API_SEND_REPORT);
   1299 
   1300     /* map handle to scb && verify parameters */
   1301     if (((p_scb = avdt_scb_by_hdl(handle)) != NULL)
   1302      && (p_scb->p_ccb != NULL)
   1303      && (((type == AVDT_RTCP_PT_SR) && (p_scb->cs.tsep == AVDT_TSEP_SRC)) ||
   1304         ((type == AVDT_RTCP_PT_RR) && (p_scb->cs.tsep == AVDT_TSEP_SNK)) ||
   1305         (type == AVDT_RTCP_PT_SDES)) )
   1306     {
   1307         result = AVDT_NO_RESOURCES;
   1308 
   1309         /* build SR - assume fit in one packet */
   1310         p_tbl = avdt_ad_tc_tbl_by_type(AVDT_CHAN_REPORT, p_scb->p_ccb, p_scb);
   1311         if((p_tbl->state == AVDT_AD_ST_OPEN) &&
   1312             (p_pkt = (BT_HDR *)GKI_getbuf(p_tbl->peer_mtu)) != NULL)
   1313         {
   1314             p_pkt->offset = L2CAP_MIN_OFFSET;
   1315             p = (UINT8 *)(p_pkt + 1) + p_pkt->offset;
   1316 #if AVDT_MULTIPLEXING == TRUE
   1317             if(p_scb->curr_cfg.psc_mask & AVDT_PSC_MUX)
   1318             {
   1319                 /* Adaptation Layer header later */
   1320                 p_al = p;
   1321                 p += 2;
   1322             }
   1323 #endif
   1324             pm1 = p;
   1325             *p++ = AVDT_MEDIA_OCTET1 | 1;
   1326             *p++ = type;
   1327             /* save the location for length */
   1328             plen = p;
   1329             p+= 2;
   1330             ssrc = avdt_scb_gen_ssrc(p_scb);
   1331             UINT32_TO_BE_STREAM(p, ssrc);
   1332 
   1333             switch(type)
   1334             {
   1335             case AVDT_RTCP_PT_SR:   /* Sender Report */
   1336                 *pm1 = AVDT_MEDIA_OCTET1;
   1337                 UINT32_TO_BE_STREAM(p, p_data->sr.ntp_sec);
   1338                 UINT32_TO_BE_STREAM(p, p_data->sr.ntp_frac);
   1339                 UINT32_TO_BE_STREAM(p, p_data->sr.rtp_time);
   1340                 UINT32_TO_BE_STREAM(p, p_data->sr.pkt_count);
   1341                 UINT32_TO_BE_STREAM(p, p_data->sr.octet_count);
   1342                 break;
   1343 
   1344             case AVDT_RTCP_PT_RR:   /* Receiver Report */
   1345                 *p++ = p_data->rr.frag_lost;
   1346                 AVDT_TRACE_API1("packet_lost: %d", p_data->rr.packet_lost);
   1347                 p_data->rr.packet_lost &= 0xFFFFFF;
   1348                 AVDT_TRACE_API1("packet_lost: %d", p_data->rr.packet_lost);
   1349                 UINT24_TO_BE_STREAM(p, p_data->rr.packet_lost);
   1350                 UINT32_TO_BE_STREAM(p, p_data->rr.seq_num_rcvd);
   1351                 UINT32_TO_BE_STREAM(p, p_data->rr.jitter);
   1352                 UINT32_TO_BE_STREAM(p, p_data->rr.lsr);
   1353                 UINT32_TO_BE_STREAM(p, p_data->rr.dlsr);
   1354                 break;
   1355 
   1356             case AVDT_RTCP_PT_SDES: /* Source Description */
   1357                 *p++ = AVDT_RTCP_SDES_CNAME;
   1358                 len = strlen((char *)p_data->cname);
   1359                 if(len > AVDT_MAX_CNAME_SIZE)
   1360                     len = AVDT_MAX_CNAME_SIZE;
   1361                 *p++ = (UINT8)len;
   1362                 BCM_STRNCPY_S((char *)p, len+1, (char *)p_data->cname, len+1);
   1363                 p += len;
   1364                 break;
   1365             }
   1366             p_end = p;
   1367             len = p - pm1 - 1;
   1368             UINT16_TO_BE_STREAM(plen, len);
   1369 
   1370 #if AVDT_MULTIPLEXING == TRUE
   1371             if(p_scb->curr_cfg.psc_mask & AVDT_PSC_MUX)
   1372             {
   1373                 /* Adaptation Layer header */
   1374                 p = p_al;
   1375                 len++;
   1376                 UINT16_TO_BE_STREAM(p_al, len );
   1377                 /* TSID, no-fragment bit and coding of length(9-bit length field) */
   1378                 u = *p;
   1379                 *p = (p_scb->curr_cfg.mux_tsid_report<<3) | AVDT_ALH_LCODE_9BITM0;
   1380                 if(u)
   1381                     *p |= AVDT_ALH_LCODE_9BITM1;
   1382             }
   1383 #endif
   1384 
   1385             /* set the actual payload length */
   1386             p_pkt->len = p_end - p;
   1387             /* send the packet */
   1388             if(L2CAP_DW_FAILED != avdt_ad_write_req(AVDT_CHAN_REPORT, p_scb->p_ccb, p_scb, p_pkt))
   1389                 result = AVDT_SUCCESS;
   1390         }
   1391     }
   1392 
   1393     return result;
   1394 }
   1395 #endif
   1396 
   1397 /******************************************************************************
   1398 **
   1399 ** Function         AVDT_SetTraceLevel
   1400 **
   1401 ** Description      Sets the trace level for AVDT. If 0xff is passed, the
   1402 **                  current trace level is returned.
   1403 **
   1404 **                  Input Parameters:
   1405 **                      new_level:  The level to set the AVDT tracing to:
   1406 **                      0xff-returns the current setting.
   1407 **                      0-turns off tracing.
   1408 **                      >= 1-Errors.
   1409 **                      >= 2-Warnings.
   1410 **                      >= 3-APIs.
   1411 **                      >= 4-Events.
   1412 **                      >= 5-Debug.
   1413 **
   1414 ** Returns          The new trace level or current trace level if
   1415 **                  the input parameter is 0xff.
   1416 **
   1417 ******************************************************************************/
   1418 UINT8 AVDT_SetTraceLevel (UINT8 new_level)
   1419 {
   1420     if (new_level != 0xFF)
   1421         avdt_cb.trace_level = new_level;
   1422 
   1423     return (avdt_cb.trace_level);
   1424 }
   1425 
   1426