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