15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2002-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * ommon API for the Advanced Audio Distribution Profile (A2DP) 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h" 26ff813a67d60ce1c9b5f3ea680b281bf642e69fe5Ayan Ghosh#include "bt_common.h" 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "sdpdefs.h" 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "a2d_api.h" 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "a2d_int.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "avdt_api.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Global data 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/ 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if A2D_DYNAMIC_MEMORY == FALSE 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttA2D_CB a2d_cb; 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function a2d_sdp_cback 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This is the SDP callback function used by A2D_FindService. 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** This function will be executed by SDP when the service 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** search is completed. If the search is successful, it 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** finds the first record in the database that matches the 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** UUID of the search. Then retrieves various parameters 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** from the record. When it is finished it calls the 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** application callback function. 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns Nothing. 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void a2d_sdp_cback(UINT16 status) 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSDP_DISC_REC *p_rec = NULL; 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSDP_DISC_ATTR *p_attr; 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN found = FALSE; 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tA2D_Service a2d_svc; 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSDP_PROTOCOL_ELEM elem; 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 63158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati A2D_TRACE_API("a2d_sdp_cback status: %d", status); 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == SDP_SUCCESS) 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* loop through all records we found */ 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project do 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* get next record; if none found, we're done */ 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_rec = SDP_FindServiceInDb(a2d_cb.find.p_db, 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2d_cb.find.service_uuid, p_rec)) == NULL) 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&a2d_svc, 0, sizeof(tA2D_Service)); 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* get service name */ 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_attr = SDP_FindAttributeInRec(p_rec, 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ATTR_ID_SERVICE_NAME)) != NULL) 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2d_svc.p_service_name = (char *) p_attr->attr_value.v.array; 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2d_svc.service_len = SDP_DISC_ATTR_LEN(p_attr->attr_len_type); 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* get provider name */ 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_attr = SDP_FindAttributeInRec(p_rec, 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ATTR_ID_PROVIDER_NAME)) != NULL) 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2d_svc.p_provider_name = (char *) p_attr->attr_value.v.array; 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2d_svc.provider_len = SDP_DISC_ATTR_LEN(p_attr->attr_len_type); 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* get supported features */ 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_attr = SDP_FindAttributeInRec(p_rec, 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ATTR_ID_SUPPORTED_FEATURES)) != NULL) 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2d_svc.features = p_attr->attr_value.v.u16; 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* get AVDTP version */ 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_AVDTP, &elem)) 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2d_svc.avdt_version = elem.params[0]; 105158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati A2D_TRACE_DEBUG("avdt_version: 0x%x", a2d_svc.avdt_version); 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we've got everything, we're done */ 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project found = TRUE; 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } while (TRUE); 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2d_cb.find.service_uuid = 0; 116ff813a67d60ce1c9b5f3ea680b281bf642e69fe5Ayan Ghosh osi_free_and_reset((void**)&a2d_cb.find.p_db); 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* return info from sdp record in app callback function */ 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (a2d_cb.find.p_cback != NULL) 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (*a2d_cb.find.p_cback)(found, &a2d_svc); 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function a2d_set_avdt_sdp_ver 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function allows the script wrapper to change the 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** avdt version of a2dp. 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid a2d_set_avdt_sdp_ver (UINT16 avdt_sdp_ver) 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2d_cb.avdt_sdp_ver = avdt_sdp_ver; 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function A2D_AddRecord 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by a server application to add 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** SRC or SNK information to an SDP record. Prior to 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** calling this function the application must call 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** SDP_CreateRecord() to create an SDP record. 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Input Parameters: 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** service_uuid: Indicates SRC or SNK. 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_service_name: Pointer to a null-terminated character 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** string containing the service name. 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_provider_name: Pointer to a null-terminated character 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** string containing the provider name. 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** features: Profile supported features. 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** sdp_handle: SDP handle returned by SDP_CreateRecord(). 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Output Parameters: 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** None. 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns A2D_SUCCESS if function execution succeeded, 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** A2D_INVALID_PARAMS if bad parameters are given. 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** A2D_FAIL if function execution failed. 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttA2D_STATUS A2D_AddRecord(UINT16 service_uuid, char *p_service_name, char *p_provider_name, 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 features, UINT32 sdp_handle) 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 browse_list[1]; 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN result = TRUE; 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 temp[8]; 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p; 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSDP_PROTOCOL_ELEM proto_list [A2D_NUM_PROTO_ELEMS]; 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 180158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati A2D_TRACE_API("A2D_AddRecord uuid: %x", service_uuid); 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( (sdp_handle == 0) || 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (service_uuid != UUID_SERVCLASS_AUDIO_SOURCE && service_uuid != UUID_SERVCLASS_AUDIO_SINK) ) 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return A2D_INVALID_PARAMS; 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add service class id list */ 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result &= SDP_AddServiceClassIdList(sdp_handle, 1, &service_uuid); 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset((void*) proto_list, 0 , A2D_NUM_PROTO_ELEMS*sizeof(tSDP_PROTOCOL_ELEM)); 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add protocol descriptor list */ 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project proto_list[0].protocol_uuid = UUID_PROTOCOL_L2CAP; 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project proto_list[0].num_params = 1; 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project proto_list[0].params[0] = AVDT_PSM; 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project proto_list[1].protocol_uuid = UUID_PROTOCOL_AVDTP; 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project proto_list[1].num_params = 1; 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project proto_list[1].params[0] = a2d_cb.avdt_sdp_ver; 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result &= SDP_AddProtocolList(sdp_handle, A2D_NUM_PROTO_ELEMS, proto_list); 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add profile descriptor list */ 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result &= SDP_AddProfileDescriptorList(sdp_handle, UUID_SERVCLASS_ADV_AUDIO_DISTRIBUTION, A2D_VERSION); 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add supported feature */ 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (features != 0) 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = temp; 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_BE_STREAM(p, features); 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result &= SDP_AddAttribute(sdp_handle, ATTR_ID_SUPPORTED_FEATURES, UINT_DESC_TYPE, 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (UINT32)2, (UINT8*)temp); 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add provider name */ 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_provider_name != NULL) 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result &= SDP_AddAttribute(sdp_handle, ATTR_ID_PROVIDER_NAME, TEXT_STR_DESC_TYPE, 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (UINT32)(strlen(p_provider_name)+1), (UINT8 *) p_provider_name); 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add service name */ 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_service_name != NULL) 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result &= SDP_AddAttribute(sdp_handle, ATTR_ID_SERVICE_NAME, TEXT_STR_DESC_TYPE, 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (UINT32)(strlen(p_service_name)+1), (UINT8 *) p_service_name); 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* add browse group list */ 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project browse_list[0] = UUID_SERVCLASS_PUBLIC_BROWSE_GROUP; 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result &= SDP_AddUuidSequence(sdp_handle, ATTR_ID_BROWSE_GROUP_LIST, 1, browse_list); 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (result ? A2D_SUCCESS : A2D_FAIL); 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function A2D_FindService 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called by a client application to 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** perform service discovery and retrieve SRC or SNK SDP 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** record information from a server. Information is 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** returned for the first service record found on the 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** server that matches the service UUID. The callback 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** function will be executed when service discovery is 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** complete. There can only be one outstanding call to 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** A2D_FindService() at a time; the application must wait 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** for the callback before it makes another call to 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the function. 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Input Parameters: 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** service_uuid: Indicates SRC or SNK. 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** bd_addr: BD address of the peer device. 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_db: Pointer to the information to initialize 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the discovery database. 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** p_cback: Pointer to the A2D_FindService() 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** callback function. 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Output Parameters: 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** None. 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns A2D_SUCCESS if function execution succeeded, 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** A2D_INVALID_PARAMS if bad parameters are given. 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** A2D_BUSY if discovery is already in progress. 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** A2D_FAIL if function execution failed. 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttA2D_STATUS A2D_FindService(UINT16 service_uuid, BD_ADDR bd_addr, 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tA2D_SDP_DB_PARAMS *p_db, tA2D_FIND_CBACK *p_cback) 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tSDP_UUID uuid_list; 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN result = TRUE; 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 a2d_attr_list[] = {ATTR_ID_SERVICE_CLASS_ID_LIST, /* update A2D_NUM_ATTR, if changed */ 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ATTR_ID_BT_PROFILE_DESC_LIST, 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ATTR_ID_SUPPORTED_FEATURES, 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ATTR_ID_SERVICE_NAME, 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ATTR_ID_PROTOCOL_DESC_LIST, 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ATTR_ID_PROVIDER_NAME}; 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 282158084e065230a10ffeba6b24ab2fd22b422baedSharvil Nanavati A2D_TRACE_API("A2D_FindService uuid: %x", service_uuid); 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( (service_uuid != UUID_SERVCLASS_AUDIO_SOURCE && service_uuid != UUID_SERVCLASS_AUDIO_SINK) || 284ff813a67d60ce1c9b5f3ea680b281bf642e69fe5Ayan Ghosh p_db == NULL || p_cback == NULL) 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return A2D_INVALID_PARAMS; 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if( a2d_cb.find.service_uuid == UUID_SERVCLASS_AUDIO_SOURCE || 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2d_cb.find.service_uuid == UUID_SERVCLASS_AUDIO_SINK) 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return A2D_BUSY; 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set up discovery database */ 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uuid_list.len = LEN_UUID_16; 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project uuid_list.uu.uuid16 = service_uuid; 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_db->p_attrs == NULL || p_db->num_attr == 0) 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_db->p_attrs = a2d_attr_list; 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_db->num_attr = A2D_NUM_ATTR; 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 301ff813a67d60ce1c9b5f3ea680b281bf642e69fe5Ayan Ghosh if(a2d_cb.find.p_db == NULL) 302ff813a67d60ce1c9b5f3ea680b281bf642e69fe5Ayan Ghosh a2d_cb.find.p_db = (tSDP_DISCOVERY_DB*)osi_malloc(p_db->db_len); 303ff813a67d60ce1c9b5f3ea680b281bf642e69fe5Ayan Ghosh 304ff813a67d60ce1c9b5f3ea680b281bf642e69fe5Ayan Ghosh result = SDP_InitDiscoveryDb(a2d_cb.find.p_db, p_db->db_len, 1, &uuid_list, p_db->num_attr, 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_db->p_attrs); 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (result == TRUE) 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30928dcc298f97ad10258408f2609cc7b9119ad32f6Andre Eisenbach /* store service_uuid */ 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2d_cb.find.service_uuid = service_uuid; 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2d_cb.find.p_cback = p_cback; 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* perform service search */ 314ff813a67d60ce1c9b5f3ea680b281bf642e69fe5Ayan Ghosh result = SDP_ServiceSearchAttributeRequest(bd_addr, a2d_cb.find.p_db, a2d_sdp_cback); 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(FALSE == result) 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2d_cb.find.service_uuid = 0; 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (result ? A2D_SUCCESS : A2D_FAIL); 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function A2D_SetTraceLevel 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Sets the trace level for A2D. If 0xff is passed, the 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** current trace level is returned. 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Input Parameters: 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** new_level: The level to set the A2D tracing to: 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 0xff-returns the current setting. 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 0-turns off tracing. 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** >= 1-Errors. 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** >= 2-Warnings. 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** >= 3-APIs. 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** >= 4-Events. 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** >= 5-Debug. 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns The new trace level or current trace level if 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** the input parameter is 0xff. 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 A2D_SetTraceLevel (UINT8 new_level) 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (new_level != 0xFF) 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2d_cb.trace_level = new_level; 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (a2d_cb.trace_level); 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function A2D_BitsSet 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Check the given num for the number of bits set 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns A2D_SET_ONE_BIT, if one and only one bit is set 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** A2D_SET_ZERO_BIT, if all bits clear 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** A2D_SET_MULTL_BIT, if multiple bits are set 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 A2D_BitsSet(UINT8 num) 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 count; 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN res; 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(num == 0) 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project res = A2D_SET_ZERO_BIT; 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project count = (num & (num - 1)); 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project res = ((count==0)?A2D_SET_ONE_BIT:A2D_SET_MULTL_BIT); 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return res; 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function A2D_Init 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description This function is called to initialize the control block 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** for this layer. It must be called before accessing any 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** other API functions for this layer. It is typically called 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** once during the start up of the stack. 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid A2D_Init(void) 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&a2d_cb, 0, sizeof(tA2D_CB)); 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2d_cb.avdt_sdp_ver = AVDT_VERSION; 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(A2D_INITIAL_TRACE_LEVEL) 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2d_cb.trace_level = A2D_INITIAL_TRACE_LEVEL; 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2d_cb.trace_level = BT_TRACE_LEVEL_NONE; 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 400