16ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/****************************************************************************** 26ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 36ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Copyright (C) 2002-2012 Broadcom Corporation 46ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 56ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Licensed under the Apache License, Version 2.0 (the "License"); 66ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * you may not use this file except in compliance with the License. 76ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * You may obtain a copy of the License at: 86ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 96ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * http://www.apache.org/licenses/LICENSE-2.0 106ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 116ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Unless required by applicable law or agreed to in writing, software 126ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * distributed under the License is distributed on an "AS IS" BASIS, 136ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 146ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * See the License for the specific language governing permissions and 156ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * limitations under the License. 166ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 176ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ******************************************************************************/ 186ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 196ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/****************************************************************************** 206ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 216ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * ommon API for the Advanced Audio Distribution Profile (A2DP) 226ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * 236ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ******************************************************************************/ 24e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include <string.h> 25e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bt_target.h" 26e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "sdpdefs.h" 27e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "a2d_api.h" 28e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "a2d_int.h" 29e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "avdt_api.h" 30e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 31e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/***************************************************************************** 32e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Global data 33e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*****************************************************************************/ 34e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if A2D_DYNAMIC_MEMORY == FALSE 35e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtA2D_CB a2d_cb; 36e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 37e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 38e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 39e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/****************************************************************************** 40e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 41e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function a2d_sdp_cback 42e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 43e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This is the SDP callback function used by A2D_FindService. 44e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** This function will be executed by SDP when the service 45e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** search is completed. If the search is successful, it 46e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** finds the first record in the database that matches the 47e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** UUID of the search. Then retrieves various parameters 48e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** from the record. When it is finished it calls the 49e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** application callback function. 50e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 51e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns Nothing. 52e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 53e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach******************************************************************************/ 54e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void a2d_sdp_cback(UINT16 status) 55e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 56e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tSDP_DISC_REC *p_rec = NULL; 57e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tSDP_DISC_ATTR *p_attr; 58e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BOOLEAN found = FALSE; 59e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tA2D_Service a2d_svc; 60e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tSDP_PROTOCOL_ELEM elem; 61e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 62e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach A2D_TRACE_API1("a2d_sdp_cback status: %d", status); 63e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 64e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (status == SDP_SUCCESS) 65e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 66e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* loop through all records we found */ 67e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach do 68e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 69e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* get next record; if none found, we're done */ 706ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if ((p_rec = SDP_FindServiceInDb(a2d_cb.find.p_db, 71e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach a2d_cb.find.service_uuid, p_rec)) == NULL) 72e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 73e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 74e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 75e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(&a2d_svc, 0, sizeof(tA2D_Service)); 76e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 77e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* get service name */ 78e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_attr = SDP_FindAttributeInRec(p_rec, 79e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ATTR_ID_SERVICE_NAME)) != NULL) 80e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 81e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach a2d_svc.p_service_name = (char *) p_attr->attr_value.v.array; 82e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach a2d_svc.service_len = SDP_DISC_ATTR_LEN(p_attr->attr_len_type); 83e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 84e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 85e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* get provider name */ 86e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_attr = SDP_FindAttributeInRec(p_rec, 87e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ATTR_ID_PROVIDER_NAME)) != NULL) 88e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 89e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach a2d_svc.p_provider_name = (char *) p_attr->attr_value.v.array; 90e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach a2d_svc.provider_len = SDP_DISC_ATTR_LEN(p_attr->attr_len_type); 91e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 92e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 93e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* get supported features */ 94e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if ((p_attr = SDP_FindAttributeInRec(p_rec, 95e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ATTR_ID_SUPPORTED_FEATURES)) != NULL) 96e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 97e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach a2d_svc.features = p_attr->attr_value.v.u16; 98e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 99e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 100e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* get AVDTP version */ 101e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (SDP_FindProtocolListElemInRec(p_rec, UUID_PROTOCOL_AVDTP, &elem)) 102e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 103e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach a2d_svc.avdt_version = elem.params[0]; 104e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach A2D_TRACE_DEBUG1("avdt_version: 0x%x", a2d_svc.avdt_version); 105e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 106e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 107e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* we've got everything, we're done */ 108e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach found = TRUE; 109e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach break; 110e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 111e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } while (TRUE); 112e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 113e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 114e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach a2d_cb.find.service_uuid = 0; 115e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* return info from sdp record in app callback function */ 116e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (a2d_cb.find.p_cback != NULL) 117e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 118e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (*a2d_cb.find.p_cback)(found, &a2d_svc); 119e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 120e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 121e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return; 122e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 123e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 124e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 125e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 126e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function a2d_set_avdt_sdp_ver 127e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 1286ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** Description This function allows the script wrapper to change the 129e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** avdt version of a2dp. 130e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 131e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns None 132e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 133e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 134e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid a2d_set_avdt_sdp_ver (UINT16 avdt_sdp_ver) 135e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 136e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach a2d_cb.avdt_sdp_ver = avdt_sdp_ver; 137e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 138e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 139e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/****************************************************************************** 140e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 141e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function A2D_AddRecord 142e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 143e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function is called by a server application to add 144e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** SRC or SNK information to an SDP record. Prior to 145e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** calling this function the application must call 146e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** SDP_CreateRecord() to create an SDP record. 147e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 148e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Input Parameters: 149e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** service_uuid: Indicates SRC or SNK. 150e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 151e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** p_service_name: Pointer to a null-terminated character 152e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** string containing the service name. 153e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 154e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** p_provider_name: Pointer to a null-terminated character 155e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** string containing the provider name. 156e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 157e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** features: Profile supported features. 158e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 159e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** sdp_handle: SDP handle returned by SDP_CreateRecord(). 160e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 161e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Output Parameters: 162e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** None. 163e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 164e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns A2D_SUCCESS if function execution succeeded, 165e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** A2D_INVALID_PARAMS if bad parameters are given. 166e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** A2D_FAIL if function execution failed. 167e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 168e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach******************************************************************************/ 169e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtA2D_STATUS A2D_AddRecord(UINT16 service_uuid, char *p_service_name, char *p_provider_name, 170e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 features, UINT32 sdp_handle) 171e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 172e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 browse_list[1]; 173e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BOOLEAN result = TRUE; 174e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 temp[8]; 175e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 *p; 176e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tSDP_PROTOCOL_ELEM proto_list [A2D_NUM_PROTO_ELEMS]; 177e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 178e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach A2D_TRACE_API1("A2D_AddRecord uuid: %x", service_uuid); 179e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 180e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if( (sdp_handle == 0) || 181e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (service_uuid != UUID_SERVCLASS_AUDIO_SOURCE && service_uuid != UUID_SERVCLASS_AUDIO_SINK) ) 182e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return A2D_INVALID_PARAMS; 183e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 184e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* add service class id list */ 185e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach result &= SDP_AddServiceClassIdList(sdp_handle, 1, &service_uuid); 186e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 187e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset((void*) proto_list, 0 , A2D_NUM_PROTO_ELEMS*sizeof(tSDP_PROTOCOL_ELEM)); 1886ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 189e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* add protocol descriptor list */ 190e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach proto_list[0].protocol_uuid = UUID_PROTOCOL_L2CAP; 191e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach proto_list[0].num_params = 1; 192e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach proto_list[0].params[0] = AVDT_PSM; 193e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach proto_list[1].protocol_uuid = UUID_PROTOCOL_AVDTP; 194e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach proto_list[1].num_params = 1; 195e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach proto_list[1].params[0] = a2d_cb.avdt_sdp_ver; 196e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 197e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach result &= SDP_AddProtocolList(sdp_handle, A2D_NUM_PROTO_ELEMS, proto_list); 198e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 199e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* add profile descriptor list */ 200e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach result &= SDP_AddProfileDescriptorList(sdp_handle, UUID_SERVCLASS_ADV_AUDIO_DISTRIBUTION, A2D_VERSION); 201e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 202e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* add supported feature */ 203e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (features != 0) 204e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 205e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p = temp; 206e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16_TO_BE_STREAM(p, features); 207e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach result &= SDP_AddAttribute(sdp_handle, ATTR_ID_SUPPORTED_FEATURES, UINT_DESC_TYPE, 208e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (UINT32)2, (UINT8*)temp); 209e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 210e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 211e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* add provider name */ 212e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_provider_name != NULL) 213e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 214e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach result &= SDP_AddAttribute(sdp_handle, ATTR_ID_PROVIDER_NAME, TEXT_STR_DESC_TYPE, 215e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (UINT32)(strlen(p_provider_name)+1), (UINT8 *) p_provider_name); 216e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 217e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 218e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* add service name */ 219e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (p_service_name != NULL) 220e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 221e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach result &= SDP_AddAttribute(sdp_handle, ATTR_ID_SERVICE_NAME, TEXT_STR_DESC_TYPE, 222e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach (UINT32)(strlen(p_service_name)+1), (UINT8 *) p_service_name); 223e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 224e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 225e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* add browse group list */ 226e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach browse_list[0] = UUID_SERVCLASS_PUBLIC_BROWSE_GROUP; 227e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach result &= SDP_AddUuidSequence(sdp_handle, ATTR_ID_BROWSE_GROUP_LIST, 1, browse_list); 228e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 229e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 230e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (result ? A2D_SUCCESS : A2D_FAIL); 231e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 232e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 233e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/****************************************************************************** 234e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 235e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function A2D_FindService 236e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 237e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function is called by a client application to 238e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** perform service discovery and retrieve SRC or SNK SDP 239e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** record information from a server. Information is 240e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** returned for the first service record found on the 241e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** server that matches the service UUID. The callback 242e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** function will be executed when service discovery is 243e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** complete. There can only be one outstanding call to 244e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** A2D_FindService() at a time; the application must wait 245e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** for the callback before it makes another call to 246e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** the function. 247e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 248e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Input Parameters: 249e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** service_uuid: Indicates SRC or SNK. 250e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 251e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** bd_addr: BD address of the peer device. 252e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 253e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** p_db: Pointer to the information to initialize 254e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** the discovery database. 2556ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** 256e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** p_cback: Pointer to the A2D_FindService() 257e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** callback function. 258e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 259e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Output Parameters: 260e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** None. 261e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 262e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns A2D_SUCCESS if function execution succeeded, 263e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** A2D_INVALID_PARAMS if bad parameters are given. 264e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** A2D_BUSY if discovery is already in progress. 265e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** A2D_FAIL if function execution failed. 266e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 267e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach******************************************************************************/ 268e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachtA2D_STATUS A2D_FindService(UINT16 service_uuid, BD_ADDR bd_addr, 269e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tA2D_SDP_DB_PARAMS *p_db, tA2D_FIND_CBACK *p_cback) 270e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 271e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach tSDP_UUID uuid_list; 272e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BOOLEAN result = TRUE; 273e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT16 a2d_attr_list[] = {ATTR_ID_SERVICE_CLASS_ID_LIST, /* update A2D_NUM_ATTR, if changed */ 274e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ATTR_ID_BT_PROFILE_DESC_LIST, 275e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ATTR_ID_SUPPORTED_FEATURES, 276e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ATTR_ID_SERVICE_NAME, 277e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ATTR_ID_PROTOCOL_DESC_LIST, 278e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ATTR_ID_PROVIDER_NAME}; 279e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 280e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach A2D_TRACE_API1("A2D_FindService uuid: %x", service_uuid); 281e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if( (service_uuid != UUID_SERVCLASS_AUDIO_SOURCE && service_uuid != UUID_SERVCLASS_AUDIO_SINK) || 282e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_db == NULL || p_db->p_db == NULL || p_cback == NULL) 283e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return A2D_INVALID_PARAMS; 284e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 2856ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach if( a2d_cb.find.service_uuid == UUID_SERVCLASS_AUDIO_SOURCE || 286e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach a2d_cb.find.service_uuid == UUID_SERVCLASS_AUDIO_SINK) 287e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return A2D_BUSY; 288e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 289e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* set up discovery database */ 290e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach uuid_list.len = LEN_UUID_16; 291e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach uuid_list.uu.uuid16 = service_uuid; 292e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 293e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(p_db->p_attrs == NULL || p_db->num_attr == 0) 294e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 295e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_db->p_attrs = a2d_attr_list; 296e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_db->num_attr = A2D_NUM_ATTR; 297e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 298e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 299e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach result = SDP_InitDiscoveryDb(p_db->p_db, p_db->db_len, 1, &uuid_list, p_db->num_attr, 300e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach p_db->p_attrs); 301e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 302e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (result == TRUE) 303e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 304e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* store service_uuid and discovery db pointer */ 305e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach a2d_cb.find.p_db = p_db->p_db; 306e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach a2d_cb.find.service_uuid = service_uuid; 307e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach a2d_cb.find.p_cback = p_cback; 308e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 309e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach /* perform service search */ 310e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach result = SDP_ServiceSearchAttributeRequest(bd_addr, p_db->p_db, a2d_sdp_cback); 311e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(FALSE == result) 312e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 313e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach a2d_cb.find.service_uuid = 0; 314e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 315e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 316e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 317e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (result ? A2D_SUCCESS : A2D_FAIL); 318e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 319e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 320e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/****************************************************************************** 321e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 322e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function A2D_SetTraceLevel 323e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 324e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Sets the trace level for A2D. If 0xff is passed, the 325e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** current trace level is returned. 326e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 327e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Input Parameters: 328e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** new_level: The level to set the A2D tracing to: 329e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 0xff-returns the current setting. 330e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 0-turns off tracing. 331e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** >= 1-Errors. 332e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** >= 2-Warnings. 333e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** >= 3-APIs. 334e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** >= 4-Events. 335e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** >= 5-Debug. 336e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 337e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns The new trace level or current trace level if 338e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** the input parameter is 0xff. 339e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 340e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach******************************************************************************/ 341e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachUINT8 A2D_SetTraceLevel (UINT8 new_level) 342e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 343e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if (new_level != 0xFF) 344e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach a2d_cb.trace_level = new_level; 345e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 346e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return (a2d_cb.trace_level); 347e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 348e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 349e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/****************************************************************************** 350e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function A2D_BitsSet 351e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 352e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description Check the given num for the number of bits set 353e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns A2D_SET_ONE_BIT, if one and only one bit is set 354e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** A2D_SET_ZERO_BIT, if all bits clear 355e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** A2D_SET_MULTL_BIT, if multiple bits are set 356e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach******************************************************************************/ 357e448862a47c08eb23185aaed574b39264f5005fcAndre EisenbachUINT8 A2D_BitsSet(UINT8 num) 358e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 359e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach UINT8 count; 360e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach BOOLEAN res; 361e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach if(num == 0) 362e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach res = A2D_SET_ZERO_BIT; 363e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach else 364e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach { 365e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach count = (num & (num - 1)); 366e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach res = ((count==0)?A2D_SET_ONE_BIT:A2D_SET_MULTL_BIT); 367e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach } 368e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach return res; 369e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 370e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 371e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/******************************************************************************* 372e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 373e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function A2D_Init 374e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 375e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description This function is called to initialize the control block 3766ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** for this layer. It must be called before accessing any 377e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** other API functions for this layer. It is typically called 3786ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach** once during the start up of the stack. 379e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 380e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns void 381e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** 382e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/ 383e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid A2D_Init(void) 384e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{ 385e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach memset(&a2d_cb, 0, sizeof(tA2D_CB)); 386e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 387e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach a2d_cb.avdt_sdp_ver = AVDT_VERSION; 3886ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach 389e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if defined(A2D_INITIAL_TRACE_LEVEL) 390e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach a2d_cb.trace_level = A2D_INITIAL_TRACE_LEVEL; 391e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#else 392e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach a2d_cb.trace_level = BT_TRACE_LEVEL_NONE; 393e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif 394e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} 395e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach 396