15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2006-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 the action functions associated with the channel 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * control block state machine. 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "avdt_api.h" 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "avdt_int.h" 29911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "avdtc_api.h" 30258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h" 31911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "bt_target.h" 32911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "bt_types.h" 33911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "bt_utils.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h" 35911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson#include "btu.h" 36d7ffd64accbd50a27289a388856e56244ccbb5daMyles Watson#include "osi/include/osi.h" 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 39ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 40ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_clear_ccb 41ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 42ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function clears out certain buffers, queues, and 43ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * other data elements of a ccb. 44ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 45ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 46ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 47ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 48ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 49911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonstatic void avdt_ccb_clear_ccb(tAVDT_CCB* p_ccb) { 50911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BT_HDR* p_buf; 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 52911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* clear certain ccb variables */ 53911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb->cong = false; 54911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb->ret_count = 0; 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 56911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* free message being fragmented */ 57911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free_and_reset((void**)&p_ccb->p_curr_msg); 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 59911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* free message being reassembled */ 60911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free_and_reset((void**)&p_ccb->p_rx_msg); 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 62911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* clear out response queue */ 63911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson while ((p_buf = (BT_HDR*)fixed_queue_try_dequeue(p_ccb->rsp_q)) != NULL) 64911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free(p_buf); 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 68ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 69ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_chan_open 70ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 71ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function calls avdt_ad_open_req() to 72ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * initiate a signaling channel connection. 73ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 74ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 75ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 76ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 77ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 78911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_chan_open(tAVDT_CCB* p_ccb, UNUSED_ATTR tAVDT_CCB_EVT* p_data) { 79903c16685e62e7721d44460b9171e020f38609f5Jakub Pawlowski BTM_SetOutService(p_ccb->peer_addr, BTM_SEC_SERVICE_AVDTP, AVDT_CHAN_SIG); 80911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_ad_open_req(AVDT_CHAN_SIG, p_ccb, NULL, AVDT_INT); 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 84ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 85ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_chan_close 86ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 87ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function calls avdt_ad_close_req() to close a 88ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * signaling channel connection. 89ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 90ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 91ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 92ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 93ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 94911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_chan_close(tAVDT_CCB* p_ccb, UNUSED_ATTR tAVDT_CCB_EVT* p_data) { 95911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* close the transport channel used by this CCB */ 96911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_ad_close_req(AVDT_CHAN_SIG, p_ccb, NULL); 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 100ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 101ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_chk_close 102ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 103ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function checks for active streams on this CCB. 104ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * If there are none, it starts an idle timer. 105ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 106ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 107ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 108ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 109ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 110911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_chk_close(tAVDT_CCB* p_ccb, UNUSED_ATTR tAVDT_CCB_EVT* p_data) { 111911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int i; 112911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB* p_scb = &avdt_cb.scb[0]; 113911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 114911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* see if there are any active scbs associated with this ccb */ 115911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (i = 0; i < AVDT_NUM_SEPS; i++, p_scb++) { 116911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_scb->allocated) && (p_scb->p_ccb == p_ccb)) { 117911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 119911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 120911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 121911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if no active scbs start idle timer */ 122911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (i == AVDT_NUM_SEPS) { 123911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson alarm_cancel(p_ccb->ret_ccb_timer); 124911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson alarm_cancel(p_ccb->rsp_ccb_timer); 125911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson period_ms_t interval_ms = avdt_cb.rcb.idle_tout * 1000; 12647616530ceea2ea6432ffb35cd8a3fc0a56365b5Jakub Pawlowski alarm_set_on_mloop(p_ccb->idle_ccb_timer, interval_ms, 12747616530ceea2ea6432ffb35cd8a3fc0a56365b5Jakub Pawlowski avdt_ccb_idle_ccb_timer_timeout, p_ccb); 128911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 132ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 133ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_hdl_discover_cmd 134ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 135ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when a discover command is 136ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * received from the peer. It gathers up the stream 137ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * information for all allocated streams and initiates 138ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * sending of a discover response. 139ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 140ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 141ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 142ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 143ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 144911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_hdl_discover_cmd(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) { 145911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SEP_INFO sep_info[AVDT_NUM_SEPS]; 146911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB* p_scb = &avdt_cb.scb[0]; 147911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int i; 148911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 149911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->msg.discover_rsp.p_sep_info = sep_info; 150911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->msg.discover_rsp.num_seps = 0; 151911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 152911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* for all allocated scbs */ 153911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (i = 0; i < AVDT_NUM_SEPS; i++, p_scb++) { 154911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_scb->allocated) { 155911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* copy sep info */ 156911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson sep_info[p_data->msg.discover_rsp.num_seps].in_use = p_scb->in_use; 157911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson sep_info[p_data->msg.discover_rsp.num_seps].seid = i + 1; 158911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson sep_info[p_data->msg.discover_rsp.num_seps].media_type = 159911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_scb->cs.media_type; 160911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson sep_info[p_data->msg.discover_rsp.num_seps].tsep = p_scb->cs.tsep; 161911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 162911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->msg.discover_rsp.num_seps++; 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 164911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 166911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send response */ 167911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_ccb_event(p_ccb, AVDT_CCB_API_DISCOVER_RSP_EVT, p_data); 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 171ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 172ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_hdl_discover_rsp 173ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 174ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when a discover response or 175ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * reject is received from the peer. It calls the application 176ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * callback function with the results. 177ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 178ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 179ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 180ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 181ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 182911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_hdl_discover_rsp(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) { 183911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* we're done with procedure */ 184911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb->proc_busy = false; 185911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 186911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* call app callback with results */ 187903c16685e62e7721d44460b9171e020f38609f5Jakub Pawlowski (*p_ccb->proc_cback)(0, &p_ccb->peer_addr, AVDT_DISCOVER_CFM_EVT, 188911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (tAVDT_CTRL*)(&p_data->msg.discover_rsp)); 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 192ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 193ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_hdl_getcap_cmd 194ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 195ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when a get capabilities command 196ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * is received from the peer. It retrieves the stream 197ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * configuration for the requested stream and initiates 198ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * sending of a get capabilities response. 199ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 200ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 201ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 202ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 203ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 204911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_hdl_getcap_cmd(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) { 205911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB* p_scb; 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 207911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* look up scb for seid sent to us */ 208911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_scb = avdt_scb_by_hdl(p_data->msg.single.seid); 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 210911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->msg.svccap.p_cfg = &p_scb->cs.cfg; 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 212911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_ccb_event(p_ccb, AVDT_CCB_API_GETCAP_RSP_EVT, p_data); 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 216ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 217ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_hdl_getcap_rsp 218ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 219ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called with a get capabilities response 220ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * or reject is received from the peer. It calls the 221ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * application callback function with the results. 222ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 223ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 224ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 225ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 226ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 227911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_hdl_getcap_rsp(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) { 228911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* we're done with procedure */ 229911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb->proc_busy = false; 230911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 231911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* call app callback with results */ 232903c16685e62e7721d44460b9171e020f38609f5Jakub Pawlowski (*p_ccb->proc_cback)(0, &p_ccb->peer_addr, AVDT_GETCAP_CFM_EVT, 233911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (tAVDT_CTRL*)(&p_data->msg.svccap)); 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 237ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 238ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_hdl_start_cmd 239ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 240ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when a start command is received 241ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * from the peer. It verifies that all requested streams 242ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * are in the proper state. If so, it initiates sending of 243ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * a start response. Otherwise it sends a start reject. 244ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 245ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 246ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 247ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 248ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 249911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_hdl_start_cmd(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) { 250911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t err_code = 0; 251911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 252911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* verify all streams in the right state */ 253911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t seid = 254911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_scb_verify(p_ccb, AVDT_VERIFY_START, p_data->msg.multi.seid_list, 255911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->msg.multi.num_seps, &err_code); 256911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (seid == 0 && err_code == 0) { 257911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* we're ok, send response */ 258911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_ccb_event(p_ccb, AVDT_CCB_API_START_RSP_EVT, p_data); 259911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 260911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* not ok, send reject */ 261911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->msg.hdr.err_code = err_code; 262911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->msg.hdr.err_param = seid; 263911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_msg_send_rej(p_ccb, AVDT_SIG_START, &p_data->msg); 264911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 268ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 269ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_hdl_start_rsp 270ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 271ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when a start response or reject 272ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * is received from the peer. Using the SEIDs stored in the 273ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * current command message, it sends a start response or start 274ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * reject event to each SCB associated with the command. 275ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 276ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 277ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 278ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 279ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 280911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_hdl_start_rsp(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) { 281911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t event; 282911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int i; 283911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p; 284911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB* p_scb; 285911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 286911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* determine rsp or rej event */ 287911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson event = (p_data->msg.hdr.err_code == 0) ? AVDT_SCB_MSG_START_RSP_EVT 288911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson : AVDT_SCB_MSG_START_REJ_EVT; 289911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 290911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* get to where seid's are stashed in current cmd */ 291911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = (uint8_t*)(p_ccb->p_curr_cmd + 1); 292911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 293911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* little trick here; length of current command equals number of streams */ 294911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (i = 0; i < p_ccb->p_curr_cmd->len; i++) { 295911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_scb = avdt_scb_by_hdl(p[i]); 296911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_scb != NULL) { 297911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_scb_event(p_scb, event, (tAVDT_SCB_EVT*)&p_data->msg); 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 299911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 303ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 304ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_hdl_suspend_cmd 305ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 306ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when a suspend command is received 307ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * from the peer. It verifies that all requested streams are 308ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * in the proper state. If so, it initiates sending of a 309ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * suspend response. Otherwise it sends a suspend reject. 310ee96a3c60fca590d38025925c072d264e06493c4Myles Watson 311ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 312ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 313ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 314ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 315ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 316911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_hdl_suspend_cmd(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) { 317911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t seid; 318911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t err_code = 0; 319911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 320911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* verify all streams in the right state */ 321911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((seid = avdt_scb_verify(p_ccb, AVDT_VERIFY_SUSPEND, 322911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->msg.multi.seid_list, 323911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->msg.multi.num_seps, &err_code)) == 0 && 324911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson err_code == 0) { 325911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* we're ok, send response */ 326911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_ccb_event(p_ccb, AVDT_CCB_API_SUSPEND_RSP_EVT, p_data); 327911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 328911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* not ok, send reject */ 329911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->msg.hdr.err_code = err_code; 330911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->msg.hdr.err_param = seid; 331911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_msg_send_rej(p_ccb, AVDT_SIG_SUSPEND, &p_data->msg); 332911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 336ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 337ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_hdl_suspend_rsp 338ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 339ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when a suspend response or reject 340ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * is received from the peer. Using the SEIDs stored in the 341ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * current command message, it sends a suspend response or 3429ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * suspend reject event to each SCB associated with the 3439ca07091a1f07ea201cee0504dab6a1d7073d429Myles Watson * command. 344ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 345ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 346ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 347ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 348ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 349ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 350911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_hdl_suspend_rsp(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) { 351911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t event; 352911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int i; 353911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t* p; 354911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB* p_scb; 355911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 356911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* determine rsp or rej event */ 357911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson event = (p_data->msg.hdr.err_code == 0) ? AVDT_SCB_MSG_SUSPEND_RSP_EVT 358911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson : AVDT_SCB_MSG_SUSPEND_REJ_EVT; 359911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 360911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* get to where seid's are stashed in current cmd */ 361911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p = (uint8_t*)(p_ccb->p_curr_cmd + 1); 362911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 363911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* little trick here; length of current command equals number of streams */ 364911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (i = 0; i < p_ccb->p_curr_cmd->len; i++) { 365911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_scb = avdt_scb_by_hdl(p[i]); 366911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_scb != NULL) { 367911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_scb_event(p_scb, event, (tAVDT_SCB_EVT*)&p_data->msg); 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 369911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 373ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 374ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_snd_discover_cmd 375ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 376ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to send a discover command to the 377ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * peer. It copies variables needed for the procedure from 378ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the event to the CCB. It marks the CCB as busy and then 379ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * sends a discover command. 380ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 381ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 382ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 383ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 384ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 385911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_snd_discover_cmd(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) { 386911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* store info in ccb struct */ 387911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb->p_proc_data = p_data->discover.p_sep_info; 388911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb->proc_cback = p_data->discover.p_cback; 389911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb->proc_param = p_data->discover.num_seps; 390911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 391911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* we're busy */ 392911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb->proc_busy = true; 393911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 394911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* build and queue discover req */ 395911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_msg_send_cmd(p_ccb, NULL, AVDT_SIG_DISCOVER, NULL); 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 399ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 400ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_snd_discover_rsp 401ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 402ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to send a discover response to 403ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the peer. It takes the stream information passed in the 404ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * event and sends a discover response. 405ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 406ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 407ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 408ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 409ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 410911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_snd_discover_rsp(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) { 411911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send response */ 412911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_msg_send_rsp(p_ccb, AVDT_SIG_DISCOVER, &p_data->msg); 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 416ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 417ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_snd_getcap_cmd 418ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 419ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to send a get capabilities command 420ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * to the peer. It copies variables needed for the procedure 421ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * from the event to the CCB. It marks the CCB as busy and 422ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * then sends a get capabilities command. 423ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 424ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 425ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 426ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 427ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 428911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_snd_getcap_cmd(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) { 429911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t sig_id = AVDT_SIG_GETCAP; 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 431911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* store info in ccb struct */ 432911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb->p_proc_data = p_data->getcap.p_cfg; 433911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb->proc_cback = p_data->getcap.p_cback; 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 435911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* we're busy */ 436911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb->proc_busy = true; 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 438911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* build and queue discover req */ 439911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_data->msg.hdr.sig_id == AVDT_SIG_GET_ALLCAP) 440911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson sig_id = AVDT_SIG_GET_ALLCAP; 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 442911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_msg_send_cmd(p_ccb, NULL, sig_id, (tAVDT_MSG*)&p_data->getcap.single); 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 446ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 447ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_snd_getcap_rsp 448ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 449ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to send a get capabilities response 450ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * to the peer. It takes the stream information passed in the 451ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * event and sends a get capabilities response. 452ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 453ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 454ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 455ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 456ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 457911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_snd_getcap_rsp(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) { 458911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t sig_id = AVDT_SIG_GETCAP; 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 460911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_data->msg.hdr.sig_id == AVDT_SIG_GET_ALLCAP) 461911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson sig_id = AVDT_SIG_GET_ALLCAP; 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 463911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send response */ 464911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_msg_send_rsp(p_ccb, sig_id, &p_data->msg); 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 468ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 469ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_snd_start_cmd 470ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 471ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to send a start command to the 472ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * peer. It verifies that all requested streams are in the 473ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * proper state. If so, it sends a start command. Otherwise 474ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * send ourselves back a start reject. 475ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 476ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 477ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 478ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 479ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 480911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_snd_start_cmd(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) { 481911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int i; 482911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB* p_scb; 483911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_MSG avdt_msg; 484911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t seid_list[AVDT_NUM_SEPS]; 485911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 486c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s", __func__); 487c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 488911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* make copy of our seid list */ 489911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(seid_list, p_data->msg.multi.seid_list, p_data->msg.multi.num_seps); 490911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 491911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* verify all streams in the right state */ 492911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_msg.hdr.err_param = 493911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_scb_verify(p_ccb, AVDT_VERIFY_OPEN, p_data->msg.multi.seid_list, 494911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->msg.multi.num_seps, &avdt_msg.hdr.err_code); 495911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (avdt_msg.hdr.err_param == 0) { 496c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: AVDT_SIG_START", __func__); 497c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov 498911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* set peer seid list in messsage */ 499911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_scb_peer_seid_list(&p_data->msg.multi); 500911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 501911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send command */ 502911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_msg_send_cmd(p_ccb, seid_list, AVDT_SIG_START, &p_data->msg); 503911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 504911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* failed; send ourselves a reject for each stream */ 505911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (i = 0; i < p_data->msg.multi.num_seps; i++) { 506911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_scb = avdt_scb_by_hdl(seid_list[i]); 507911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_scb != NULL) { 508c64dc1d28496b5e917d0f82317d40d3c60e6495dPavlin Radoslavov AVDT_TRACE_DEBUG("%s: AVDT_SCB_MSG_START_REJ_EVT: i=%d", __func__, i); 5098e89469b5e223a48e1915f16862e81a3f4581259Myles Watson tAVDT_SCB_EVT avdt_scb_evt; 5108e89469b5e223a48e1915f16862e81a3f4581259Myles Watson avdt_scb_evt.msg.hdr = avdt_msg.hdr; 5118e89469b5e223a48e1915f16862e81a3f4581259Myles Watson avdt_scb_event(p_scb, AVDT_SCB_MSG_START_REJ_EVT, &avdt_scb_evt); 512911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 514911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 518ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 519ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_snd_start_rsp 520ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 521ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to send a start response to the 522ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * peer. It takes the stream information passed in the event 523ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * and sends a start response. Then it sends a start event 524ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * to the SCB for each stream. 525ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 526ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 527ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 528ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 529ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 530911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_snd_start_rsp(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) { 531911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB* p_scb; 532911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int i; 533911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 534911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send response message */ 535911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_msg_send_rsp(p_ccb, AVDT_SIG_START, &p_data->msg); 536911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 537911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send start event to each scb */ 538911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (i = 0; i < p_data->msg.multi.num_seps; i++) { 539911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_scb = avdt_scb_by_hdl(p_data->msg.multi.seid_list[i]); 540911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_scb != NULL) { 541911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_scb_event(p_scb, AVDT_SCB_MSG_START_CMD_EVT, NULL); 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 543911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 547ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 548ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_snd_suspend_cmd 549ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 550ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to send a suspend command to the 551ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * peer. It verifies that all requested streams are in the 552ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * proper state. If so, it sends a suspend command. 553ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Otherwise it calls the callback function for each requested 554ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * stream and sends a suspend confirmation with failure. 555ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 556ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 557ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 558ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 559ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 560911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_snd_suspend_cmd(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) { 561911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int i; 562911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB* p_scb; 563911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_MSG avdt_msg; 564911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t seid_list[AVDT_NUM_SEPS]; 565911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 566911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* make copy of our seid list */ 567911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(seid_list, p_data->msg.multi.seid_list, p_data->msg.multi.num_seps); 568911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 569911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* verify all streams in the right state */ 570911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_msg.hdr.err_param = 571911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_scb_verify(p_ccb, AVDT_VERIFY_STREAMING, p_data->msg.multi.seid_list, 572911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->msg.multi.num_seps, &avdt_msg.hdr.err_code); 573911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (avdt_msg.hdr.err_param == 0) { 574911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* set peer seid list in messsage */ 575911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_scb_peer_seid_list(&p_data->msg.multi); 576911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 577911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send command */ 578911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_msg_send_cmd(p_ccb, seid_list, AVDT_SIG_SUSPEND, &p_data->msg); 579911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 580911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* failed; send ourselves a reject for each stream */ 581911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (i = 0; i < p_data->msg.multi.num_seps; i++) { 582911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_scb = avdt_scb_by_hdl(seid_list[i]); 583911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_scb != NULL) { 5848e89469b5e223a48e1915f16862e81a3f4581259Myles Watson tAVDT_SCB_EVT avdt_scb_evt; 5858e89469b5e223a48e1915f16862e81a3f4581259Myles Watson avdt_scb_evt.msg.hdr = avdt_msg.hdr; 5868e89469b5e223a48e1915f16862e81a3f4581259Myles Watson avdt_scb_event(p_scb, AVDT_SCB_MSG_SUSPEND_REJ_EVT, &avdt_scb_evt); 587911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 589911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 593ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 594ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_snd_suspend_rsp 595ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 596ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to send a suspend response to the 597ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * peer. It takes the stream information passed in the event 598ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * and sends a suspend response. Then it sends a suspend event 599ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * to the SCB for each stream. 600ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 601ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 602ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 603ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 604ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 605911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_snd_suspend_rsp(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) { 606911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB* p_scb; 607911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int i; 608911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 609911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send response message */ 610911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_msg_send_rsp(p_ccb, AVDT_SIG_SUSPEND, &p_data->msg); 611911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 612911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send start event to each scb */ 613911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (i = 0; i < p_data->msg.multi.num_seps; i++) { 614911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_scb = avdt_scb_by_hdl(p_data->msg.multi.seid_list[i]); 615911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_scb != NULL) { 616911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_scb_event(p_scb, AVDT_SCB_MSG_SUSPEND_CMD_EVT, NULL); 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 618911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 622ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 623ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_clear_cmds 624ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 625ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when the signaling channel is 626ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * closed to clean up any pending commands. For each pending 627ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * command in the command queue, it frees the command and 628ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * calls the application callback function indicating failure. 629ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Certain CCB variables are also initialized. 630ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 631ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 632ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 633ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 634ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 635911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_clear_cmds(tAVDT_CCB* p_ccb, UNUSED_ATTR tAVDT_CCB_EVT* p_data) { 636911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson int i; 637911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB* p_scb = &avdt_cb.scb[0]; 638911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t err_code = AVDT_ERR_CONNECT; 639911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 640911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* clear the ccb */ 641911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_ccb_clear_ccb(p_ccb); 642911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 643911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* clear out command queue; this is a little tricky here; we need 644911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ** to handle the case where there is a command on deck in p_curr_cmd, 645911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ** plus we need to clear out the queue 646911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 647911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson do { 648911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* we know p_curr_cmd = NULL after this */ 6498e89469b5e223a48e1915f16862e81a3f4581259Myles Watson tAVDT_CCB_EVT avdt_ccb_evt; 6508e89469b5e223a48e1915f16862e81a3f4581259Myles Watson avdt_ccb_evt.err_code = err_code; 6518e89469b5e223a48e1915f16862e81a3f4581259Myles Watson avdt_ccb_cmd_fail(p_ccb, &avdt_ccb_evt); 652911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 653911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* set up next message */ 654911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb->p_curr_cmd = (BT_HDR*)fixed_queue_try_dequeue(p_ccb->cmd_q); 655911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 656911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } while (p_ccb->p_curr_cmd != NULL); 657911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 658911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* send a CC_CLOSE_EVT any active scbs associated with this ccb */ 659911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson for (i = 0; i < AVDT_NUM_SEPS; i++, p_scb++) { 660911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((p_scb->allocated) && (p_scb->p_ccb == p_ccb)) { 661911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_scb_event(p_scb, AVDT_SCB_CC_CLOSE_EVT, NULL); 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 663911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 667ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 668ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_cmd_fail 669ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 670ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when there is a response timeout. 671ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * The currently pending command is freed and we fake a 672ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * reject message back to ourselves. 673ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 674ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 675ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 676ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 677ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 678911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_cmd_fail(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) { 679911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_MSG msg; 680911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson uint8_t evt; 681911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_SCB* p_scb; 682911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 683911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_ccb->p_curr_cmd != NULL) { 684911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* set up data */ 685911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson msg.hdr.err_code = p_data->err_code; 686911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson msg.hdr.err_param = 0; 687911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson msg.hdr.ccb_idx = avdt_ccb_to_idx(p_ccb); 688911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 689911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* pretend that we received a rej message */ 690911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson evt = avdt_msg_rej_2_evt[p_ccb->p_curr_cmd->event - 1]; 691911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 692911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (evt & AVDT_CCB_MKR) { 6938e89469b5e223a48e1915f16862e81a3f4581259Myles Watson tAVDT_CCB_EVT avdt_ccb_evt; 6948e89469b5e223a48e1915f16862e81a3f4581259Myles Watson avdt_ccb_evt.msg = msg; 6958e89469b5e223a48e1915f16862e81a3f4581259Myles Watson avdt_ccb_event(p_ccb, (uint8_t)(evt & ~AVDT_CCB_MKR), &avdt_ccb_evt); 696911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 697911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* we get the scb out of the current cmd */ 698911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_scb = avdt_scb_by_hdl(*((uint8_t*)(p_ccb->p_curr_cmd + 1))); 699911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_scb != NULL) { 7008e89469b5e223a48e1915f16862e81a3f4581259Myles Watson tAVDT_SCB_EVT avdt_scb_evt; 7018e89469b5e223a48e1915f16862e81a3f4581259Myles Watson avdt_scb_evt.msg = msg; 7028e89469b5e223a48e1915f16862e81a3f4581259Myles Watson avdt_scb_event(p_scb, evt, &avdt_scb_evt); 703911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 705911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 706911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free_and_reset((void**)&p_ccb->p_curr_cmd); 707911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 711ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 712ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_free_cmd 713ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 714ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called when a response is received for a 715ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * currently pending command. The command is freed. 716ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 717ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 718ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 719ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 720ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 721911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_free_cmd(tAVDT_CCB* p_ccb, UNUSED_ATTR tAVDT_CCB_EVT* p_data) { 722911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson osi_free_and_reset((void**)&p_ccb->p_curr_cmd); 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 726ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 727ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_cong_state 728ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 729ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to set the congestion state for 730ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the CCB. 731ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 732ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 733ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 734ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 735ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 736911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_cong_state(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) { 737911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb->cong = p_data->llcong; 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 741ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 742ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_ret_cmd 743ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 744ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to retransmit the currently 745ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * pending command. The retransmission count is incremented. 746ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * If the count reaches the maximum number of retransmissions, 747ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the event is treated as a response timeout. 748ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 749ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 750ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 751ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 752ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 753911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_ret_cmd(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) { 754911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb->ret_count++; 755911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_ccb->ret_count == AVDT_RET_MAX) { 756911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* command failed */ 757911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb->ret_count = 0; 7588e89469b5e223a48e1915f16862e81a3f4581259Myles Watson tAVDT_CCB_EVT avdt_ccb_evt; 7598e89469b5e223a48e1915f16862e81a3f4581259Myles Watson avdt_ccb_evt.err_code = AVDT_ERR_TIMEOUT; 7608e89469b5e223a48e1915f16862e81a3f4581259Myles Watson avdt_ccb_cmd_fail(p_ccb, &avdt_ccb_evt); 761911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 762911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* go to next queued command */ 763911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_ccb_snd_cmd(p_ccb, p_data); 764911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 765911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if command pending and we're not congested and not sending a fragment */ 766911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((!p_ccb->cong) && (p_ccb->p_curr_msg == NULL) && 767911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_ccb->p_curr_cmd != NULL)) { 768911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* make copy of message in p_curr_cmd and send it */ 769911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BT_HDR* p_msg = (BT_HDR*)osi_malloc(AVDT_CMD_BUF_SIZE); 770911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_msg, p_ccb->p_curr_cmd, 771911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (sizeof(BT_HDR) + p_ccb->p_curr_cmd->offset + 772911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb->p_curr_cmd->len)); 773911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_msg_send(p_ccb, p_msg); 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 775911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 776911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* restart ret timer */ 777911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson alarm_cancel(p_ccb->idle_ccb_timer); 778911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson alarm_cancel(p_ccb->rsp_ccb_timer); 779911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson period_ms_t interval_ms = avdt_cb.rcb.ret_tout * 1000; 78047616530ceea2ea6432ffb35cd8a3fc0a56365b5Jakub Pawlowski alarm_set_on_mloop(p_ccb->ret_ccb_timer, interval_ms, 78147616530ceea2ea6432ffb35cd8a3fc0a56365b5Jakub Pawlowski avdt_ccb_ret_ccb_timer_timeout, p_ccb); 782911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 786ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 787ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_snd_cmd 788ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 789ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called the send the next command, 790ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * if any, in the command queue. 791ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 792ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 793ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 794ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 795ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 796911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_snd_cmd(tAVDT_CCB* p_ccb, UNUSED_ATTR tAVDT_CCB_EVT* p_data) { 797911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BT_HDR* p_msg; 798911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 799911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* do we have commands to send? send next command; make sure we're clear; 800911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson ** not congested, not sending fragment, not waiting for response 801911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 802911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if ((!p_ccb->cong) && (p_ccb->p_curr_msg == NULL) && 803911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (p_ccb->p_curr_cmd == NULL)) { 804911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_msg = (BT_HDR*)fixed_queue_try_dequeue(p_ccb->cmd_q); 805911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_msg != NULL) { 806911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* make a copy of buffer in p_curr_cmd */ 807911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb->p_curr_cmd = (BT_HDR*)osi_malloc(AVDT_CMD_BUF_SIZE); 808911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson memcpy(p_ccb->p_curr_cmd, p_msg, 809911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson (sizeof(BT_HDR) + p_msg->offset + p_msg->len)); 810911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_msg_send(p_ccb, p_msg); 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 812911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 816ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 817ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_snd_msg 818ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 819ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description 820ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 821ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 822ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 823ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 824ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 825911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_snd_msg(tAVDT_CCB* p_ccb, UNUSED_ATTR tAVDT_CCB_EVT* p_data) { 826911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BT_HDR* p_msg; 827911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 828911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* if not congested */ 829911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_ccb->cong) { 830911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* are we sending a fragmented message? continue sending fragment */ 831911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_ccb->p_curr_msg != NULL) { 832911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_msg_send(p_ccb, NULL); 833911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 834911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* do we have responses to send? send them */ 835911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson else if (!fixed_queue_is_empty(p_ccb->rsp_q)) { 836911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson while ((p_msg = (BT_HDR*)fixed_queue_try_dequeue(p_ccb->rsp_q)) != NULL) { 837911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (avdt_msg_send(p_ccb, p_msg) == true) { 838911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* break out if congested */ 839911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson break; 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 841911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 843911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 844911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* do we have commands to send? send next command */ 845911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_ccb_snd_cmd(p_ccb, NULL); 846911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 850ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 851ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_set_reconn 852ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 853ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to enable a reconnect attempt when 854ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * a channel transitions from closing to idle state. It sets 855ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * the reconn variable to true. 856ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 857ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 858ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 859ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 860ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 861911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_set_reconn(tAVDT_CCB* p_ccb, UNUSED_ATTR tAVDT_CCB_EVT* p_data) { 862911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb->reconn = true; 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 866ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 867ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_clr_reconn 868ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 869ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to clear the reconn variable. 870ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 871ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 872ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 873ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 874ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 875911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_clr_reconn(tAVDT_CCB* p_ccb, UNUSED_ATTR tAVDT_CCB_EVT* p_data) { 876911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb->reconn = false; 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 880ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 881ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_chk_reconn 882ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 883ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function is called to check if a reconnect attempt 884ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * is enabled. If enabled, it sends an AVDT_CCB_UL_OPEN_EVT 885ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * to the CCB. If disabled, the CCB is deallocated. 886ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 887ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 888ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 889ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 890ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 891911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_chk_reconn(tAVDT_CCB* p_ccb, UNUSED_ATTR tAVDT_CCB_EVT* p_data) { 892911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_ccb->reconn) { 893911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb->reconn = false; 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 895911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* clear out ccb */ 896911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_ccb_clear_ccb(p_ccb); 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 898911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* clear out current command, if any */ 8998e89469b5e223a48e1915f16862e81a3f4581259Myles Watson uint8_t err_code = AVDT_ERR_CONNECT; 9008e89469b5e223a48e1915f16862e81a3f4581259Myles Watson tAVDT_CCB_EVT avdt_ccb_evt; 9018e89469b5e223a48e1915f16862e81a3f4581259Myles Watson avdt_ccb_evt.err_code = err_code; 9028e89469b5e223a48e1915f16862e81a3f4581259Myles Watson avdt_ccb_cmd_fail(p_ccb, &avdt_ccb_evt); 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 904911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* reopen the signaling channel */ 905911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_ccb_event(p_ccb, AVDT_CCB_UL_OPEN_EVT, NULL); 906911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } else { 907911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_ccb_ll_closed(p_ccb, NULL); 908911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 912ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 913ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_chk_timer 914ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 915ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description This function stops the CCB timer if the idle timer is 916ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * running. 917ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 918ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 919ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 920ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 921ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 922911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_chk_timer(tAVDT_CCB* p_ccb, UNUSED_ATTR tAVDT_CCB_EVT* p_data) { 923911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson alarm_cancel(p_ccb->idle_ccb_timer); 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 927ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 928ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_set_conn 929ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 930ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Set CCB variables associated with AVDT_ConnectReq(). 931ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 932ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 933ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 934ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 935ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 936911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_set_conn(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) { 937911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* save callback */ 938911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb->p_conn_cback = p_data->connect.p_cback; 939911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 940911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* set security level */ 941911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson BTM_SetSecurityLevel(true, "", BTM_SEC_SERVICE_AVDTP, 942911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_data->connect.sec_mask, AVDT_PSM, BTM_SEC_PROTO_AVDT, 943911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson AVDT_CHAN_SIG); 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 947ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 948ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_set_disconn 949ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 950ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Set CCB variables associated with AVDT_DisconnectReq(). 951ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 952ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 953ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 954ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 955ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 956911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_set_disconn(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) { 957911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* 958911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson AVDT_TRACE_EVENT("avdt_ccb_set_disconn:conn:x%x, api:x%x", 959911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb->p_conn_cback, p_data->disconnect.p_cback); 960911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson */ 961911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* save callback */ 962911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_data->disconnect.p_cback) 963911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb->p_conn_cback = p_data->disconnect.p_cback; 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 967ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 968ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_do_disconn 969ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 970ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Do action associated with AVDT_DisconnectReq(). 971ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 972ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 973ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 974ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 975ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 976911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_do_disconn(tAVDT_CCB* p_ccb, UNUSED_ATTR tAVDT_CCB_EVT* p_data) { 977911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* clear any pending commands */ 978911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_ccb_clear_cmds(p_ccb, NULL); 979911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 980911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* close channel */ 981911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_ccb_chan_close(p_ccb, NULL); 9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 985ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 986ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_ll_closed 987ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 988ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Clear commands from and deallocate CCB. 989ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 990ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 991ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 992ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 993ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 994911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_ll_closed(tAVDT_CCB* p_ccb, UNUSED_ATTR tAVDT_CCB_EVT* p_data) { 995911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_CTRL_CBACK* p_cback; 996911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_CTRL avdt_ctrl; 997911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 998911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* clear any pending commands */ 999911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_ccb_clear_cmds(p_ccb, NULL); 1000911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1001911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* save callback pointer, bd addr */ 1002911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_cback = p_ccb->p_conn_cback; 1003911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_cback) p_cback = avdt_cb.p_conn_cback; 10049e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowski RawAddress bd_addr = p_ccb->peer_addr; 1005911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1006911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* dealloc ccb */ 1007911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_ccb_dealloc(p_ccb, NULL); 1008911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson 1009911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* call callback */ 1010911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_cback) { 1011911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_ctrl.hdr.err_code = 0; 1012903c16685e62e7721d44460b9171e020f38609f5Jakub Pawlowski (*p_cback)(0, &bd_addr, AVDT_DISCONNECT_IND_EVT, &avdt_ctrl); 1013911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1017ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1018ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Function avdt_ccb_ll_opened 1019ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1020ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Description Call callback on open. 1021ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1022ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1023ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * Returns void. 1024ee96a3c60fca590d38025925c072d264e06493c4Myles Watson * 1025ee96a3c60fca590d38025925c072d264e06493c4Myles Watson ******************************************************************************/ 1026911d1ae03efec2d54c3b1b605589d790d1745488Myles Watsonvoid avdt_ccb_ll_opened(tAVDT_CCB* p_ccb, tAVDT_CCB_EVT* p_data) { 1027911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson tAVDT_CTRL avdt_ctrl; 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1029911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson p_ccb->ll_opened = true; 10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1031911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (!p_ccb->p_conn_cback) p_ccb->p_conn_cback = avdt_cb.p_conn_cback; 10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1033911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson /* call callback */ 1034911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson if (p_ccb->p_conn_cback) { 1035911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_ctrl.hdr.err_code = 0; 1036911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson avdt_ctrl.hdr.err_param = p_data->msg.hdr.err_param; 1037903c16685e62e7721d44460b9171e020f38609f5Jakub Pawlowski (*p_ccb->p_conn_cback)(0, &p_ccb->peer_addr, AVDT_CONNECT_IND_EVT, 1038911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson &avdt_ctrl); 1039911d1ae03efec2d54c3b1b605589d790d1745488Myles Watson } 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1041