xref: /btstack/src/classic/a2dp_sink.c (revision b442c9e6417b4d90c2e0b2328476b52ea4fd6456)
1*b442c9e6SMilanka Ringwald /*
2*b442c9e6SMilanka Ringwald  * Copyright (C) 2016 BlueKitchen GmbH
3*b442c9e6SMilanka Ringwald  *
4*b442c9e6SMilanka Ringwald  * Redistribution and use in source and binary forms, with or without
5*b442c9e6SMilanka Ringwald  * modification, are permitted provided that the following conditions
6*b442c9e6SMilanka Ringwald  * are met:
7*b442c9e6SMilanka Ringwald  *
8*b442c9e6SMilanka Ringwald  * 1. Redistributions of source code must retain the above copyright
9*b442c9e6SMilanka Ringwald  *    notice, this list of conditions and the following disclaimer.
10*b442c9e6SMilanka Ringwald  * 2. Redistributions in binary form must reproduce the above copyright
11*b442c9e6SMilanka Ringwald  *    notice, this list of conditions and the following disclaimer in the
12*b442c9e6SMilanka Ringwald  *    documentation and/or other materials provided with the distribution.
13*b442c9e6SMilanka Ringwald  * 3. Neither the name of the copyright holders nor the names of
14*b442c9e6SMilanka Ringwald  *    contributors may be used to endorse or promote products derived
15*b442c9e6SMilanka Ringwald  *    from this software without specific prior written permission.
16*b442c9e6SMilanka Ringwald  * 4. Any redistribution, use, or modification is done solely for
17*b442c9e6SMilanka Ringwald  *    personal benefit and not for any commercial purpose or for
18*b442c9e6SMilanka Ringwald  *    monetary gain.
19*b442c9e6SMilanka Ringwald  *
20*b442c9e6SMilanka Ringwald  * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
21*b442c9e6SMilanka Ringwald  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22*b442c9e6SMilanka Ringwald  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23*b442c9e6SMilanka Ringwald  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
24*b442c9e6SMilanka Ringwald  * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25*b442c9e6SMilanka Ringwald  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26*b442c9e6SMilanka Ringwald  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
27*b442c9e6SMilanka Ringwald  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28*b442c9e6SMilanka Ringwald  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29*b442c9e6SMilanka Ringwald  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
30*b442c9e6SMilanka Ringwald  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31*b442c9e6SMilanka Ringwald  * SUCH DAMAGE.
32*b442c9e6SMilanka Ringwald  *
33*b442c9e6SMilanka Ringwald  * Please inquire about commercial licensing options at
34*b442c9e6SMilanka Ringwald  * [email protected]
35*b442c9e6SMilanka Ringwald  *
36*b442c9e6SMilanka Ringwald  */
37*b442c9e6SMilanka Ringwald 
38*b442c9e6SMilanka Ringwald #define __BTSTACK_FILE__ "a2dp_sink.c"
39*b442c9e6SMilanka Ringwald 
40*b442c9e6SMilanka Ringwald #include <stdint.h>
41*b442c9e6SMilanka Ringwald #include <stdio.h>
42*b442c9e6SMilanka Ringwald #include <stdlib.h>
43*b442c9e6SMilanka Ringwald #include <string.h>
44*b442c9e6SMilanka Ringwald #include <unistd.h>
45*b442c9e6SMilanka Ringwald 
46*b442c9e6SMilanka Ringwald #include "btstack.h"
47*b442c9e6SMilanka Ringwald #include "avdtp.h"
48*b442c9e6SMilanka Ringwald #include "avdtp_util.h"
49*b442c9e6SMilanka Ringwald #include "avdtp_sink.h"
50*b442c9e6SMilanka Ringwald #include "a2dp_sink.h"
51*b442c9e6SMilanka Ringwald 
52*b442c9e6SMilanka Ringwald static const char * default_a2dp_sink_service_name = "BTstack A2DP Sink Service";
53*b442c9e6SMilanka Ringwald static const char * default_a2dp_sink_service_provider_name = "BTstack A2DP Sink Service Provider";
54*b442c9e6SMilanka Ringwald 
55*b442c9e6SMilanka Ringwald // static void packet_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size);
56*b442c9e6SMilanka Ringwald 
57*b442c9e6SMilanka Ringwald void a2dp_sink_create_sdp_record(uint8_t * service,  uint32_t service_record_handle, uint16_t supported_features, const char * service_name, const char * service_provider_name){
58*b442c9e6SMilanka Ringwald     uint8_t* attribute;
59*b442c9e6SMilanka Ringwald     de_create_sequence(service);
60*b442c9e6SMilanka Ringwald 
61*b442c9e6SMilanka Ringwald     // 0x0000 "Service Record Handle"
62*b442c9e6SMilanka Ringwald     de_add_number(service, DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_SERVICE_RECORD_HANDLE);
63*b442c9e6SMilanka Ringwald     de_add_number(service, DE_UINT, DE_SIZE_32, service_record_handle);
64*b442c9e6SMilanka Ringwald 
65*b442c9e6SMilanka Ringwald     // 0x0001 "Service Class ID List"
66*b442c9e6SMilanka Ringwald     de_add_number(service,  DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_SERVICE_CLASS_ID_LIST);
67*b442c9e6SMilanka Ringwald     attribute = de_push_sequence(service);
68*b442c9e6SMilanka Ringwald     {
69*b442c9e6SMilanka Ringwald         de_add_number(attribute, DE_UUID, DE_SIZE_16, BLUETOOTH_SERVICE_CLASS_AUDIO_SINK);
70*b442c9e6SMilanka Ringwald     }
71*b442c9e6SMilanka Ringwald     de_pop_sequence(service, attribute);
72*b442c9e6SMilanka Ringwald 
73*b442c9e6SMilanka Ringwald     // 0x0004 "Protocol Descriptor List"
74*b442c9e6SMilanka Ringwald     de_add_number(service,  DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_PROTOCOL_DESCRIPTOR_LIST);
75*b442c9e6SMilanka Ringwald     attribute = de_push_sequence(service);
76*b442c9e6SMilanka Ringwald     {
77*b442c9e6SMilanka Ringwald         uint8_t* l2cpProtocol = de_push_sequence(attribute);
78*b442c9e6SMilanka Ringwald         {
79*b442c9e6SMilanka Ringwald             de_add_number(l2cpProtocol,  DE_UUID, DE_SIZE_16, BLUETOOTH_PROTOCOL_L2CAP);
80*b442c9e6SMilanka Ringwald             de_add_number(l2cpProtocol,  DE_UINT, DE_SIZE_16, BLUETOOTH_PROTOCOL_AVDTP);
81*b442c9e6SMilanka Ringwald         }
82*b442c9e6SMilanka Ringwald         de_pop_sequence(attribute, l2cpProtocol);
83*b442c9e6SMilanka Ringwald 
84*b442c9e6SMilanka Ringwald         uint8_t* avProtocol = de_push_sequence(attribute);
85*b442c9e6SMilanka Ringwald         {
86*b442c9e6SMilanka Ringwald             de_add_number(avProtocol,  DE_UUID, DE_SIZE_16, BLUETOOTH_PROTOCOL_AVDTP);  // avProtocol_service
87*b442c9e6SMilanka Ringwald             de_add_number(avProtocol,  DE_UINT, DE_SIZE_16,  0x0103);  // version
88*b442c9e6SMilanka Ringwald         }
89*b442c9e6SMilanka Ringwald         de_pop_sequence(attribute, avProtocol);
90*b442c9e6SMilanka Ringwald     }
91*b442c9e6SMilanka Ringwald     de_pop_sequence(service, attribute);
92*b442c9e6SMilanka Ringwald 
93*b442c9e6SMilanka Ringwald     // 0x0005 "Public Browse Group"
94*b442c9e6SMilanka Ringwald     de_add_number(service,  DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_BROWSE_GROUP_LIST); // public browse group
95*b442c9e6SMilanka Ringwald     attribute = de_push_sequence(service);
96*b442c9e6SMilanka Ringwald     {
97*b442c9e6SMilanka Ringwald         de_add_number(attribute,  DE_UUID, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_PUBLIC_BROWSE_ROOT);
98*b442c9e6SMilanka Ringwald     }
99*b442c9e6SMilanka Ringwald     de_pop_sequence(service, attribute);
100*b442c9e6SMilanka Ringwald 
101*b442c9e6SMilanka Ringwald     // 0x0009 "Bluetooth Profile Descriptor List"
102*b442c9e6SMilanka Ringwald     de_add_number(service,  DE_UINT, DE_SIZE_16, BLUETOOTH_ATTRIBUTE_BLUETOOTH_PROFILE_DESCRIPTOR_LIST);
103*b442c9e6SMilanka Ringwald     attribute = de_push_sequence(service);
104*b442c9e6SMilanka Ringwald     {
105*b442c9e6SMilanka Ringwald         uint8_t *a2dProfile = de_push_sequence(attribute);
106*b442c9e6SMilanka Ringwald         {
107*b442c9e6SMilanka Ringwald             de_add_number(a2dProfile,  DE_UUID, DE_SIZE_16, BLUETOOTH_SERVICE_CLASS_ADVANCED_AUDIO_DISTRIBUTION);
108*b442c9e6SMilanka Ringwald             de_add_number(a2dProfile,  DE_UINT, DE_SIZE_16, 0x0103);
109*b442c9e6SMilanka Ringwald         }
110*b442c9e6SMilanka Ringwald         de_pop_sequence(attribute, a2dProfile);
111*b442c9e6SMilanka Ringwald     }
112*b442c9e6SMilanka Ringwald     de_pop_sequence(service, attribute);
113*b442c9e6SMilanka Ringwald 
114*b442c9e6SMilanka Ringwald 
115*b442c9e6SMilanka Ringwald     // 0x0100 "Service Name"
116*b442c9e6SMilanka Ringwald     de_add_number(service,  DE_UINT, DE_SIZE_16, 0x0100);
117*b442c9e6SMilanka Ringwald     if (service_name){
118*b442c9e6SMilanka Ringwald         de_add_data(service,  DE_STRING, strlen(service_name), (uint8_t *) service_name);
119*b442c9e6SMilanka Ringwald     } else {
120*b442c9e6SMilanka Ringwald         de_add_data(service,  DE_STRING, strlen(default_a2dp_sink_service_name), (uint8_t *) default_a2dp_sink_service_name);
121*b442c9e6SMilanka Ringwald     }
122*b442c9e6SMilanka Ringwald 
123*b442c9e6SMilanka Ringwald     // 0x0100 "Provider Name"
124*b442c9e6SMilanka Ringwald     de_add_number(service,  DE_UINT, DE_SIZE_16, 0x0102);
125*b442c9e6SMilanka Ringwald     if (service_provider_name){
126*b442c9e6SMilanka Ringwald         de_add_data(service,  DE_STRING, strlen(service_provider_name), (uint8_t *) service_provider_name);
127*b442c9e6SMilanka Ringwald     } else {
128*b442c9e6SMilanka Ringwald         de_add_data(service,  DE_STRING, strlen(default_a2dp_sink_service_provider_name), (uint8_t *) default_a2dp_sink_service_provider_name);
129*b442c9e6SMilanka Ringwald     }
130*b442c9e6SMilanka Ringwald 
131*b442c9e6SMilanka Ringwald     // 0x0311 "Supported Features"
132*b442c9e6SMilanka Ringwald     de_add_number(service, DE_UINT, DE_SIZE_16, 0x0311);
133*b442c9e6SMilanka Ringwald     de_add_number(service, DE_UINT, DE_SIZE_16, supported_features);
134*b442c9e6SMilanka Ringwald }
135