xref: /btstack/src/classic/avdtp_source.h (revision 3790661c7fabc68f1184c82d49b0890c731b178c)
18ef7100fSMilanka Ringwald /*
28ef7100fSMilanka Ringwald  * Copyright (C) 2016 BlueKitchen GmbH
38ef7100fSMilanka Ringwald  *
48ef7100fSMilanka Ringwald  * Redistribution and use in source and binary forms, with or without
58ef7100fSMilanka Ringwald  * modification, are permitted provided that the following conditions
68ef7100fSMilanka Ringwald  * are met:
78ef7100fSMilanka Ringwald  *
88ef7100fSMilanka Ringwald  * 1. Redistributions of source code must retain the above copyright
98ef7100fSMilanka Ringwald  *    notice, this list of conditions and the following disclaimer.
108ef7100fSMilanka Ringwald  * 2. Redistributions in binary form must reproduce the above copyright
118ef7100fSMilanka Ringwald  *    notice, this list of conditions and the following disclaimer in the
128ef7100fSMilanka Ringwald  *    documentation and/or other materials provided with the distribution.
138ef7100fSMilanka Ringwald  * 3. Neither the name of the copyright holders nor the names of
148ef7100fSMilanka Ringwald  *    contributors may be used to endorse or promote products derived
158ef7100fSMilanka Ringwald  *    from this software without specific prior written permission.
168ef7100fSMilanka Ringwald  * 4. Any redistribution, use, or modification is done solely for
178ef7100fSMilanka Ringwald  *    personal benefit and not for any commercial purpose or for
188ef7100fSMilanka Ringwald  *    monetary gain.
198ef7100fSMilanka Ringwald  *
208ef7100fSMilanka Ringwald  * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
218ef7100fSMilanka Ringwald  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
228ef7100fSMilanka Ringwald  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
238ef7100fSMilanka Ringwald  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
248ef7100fSMilanka Ringwald  * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
258ef7100fSMilanka Ringwald  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
268ef7100fSMilanka Ringwald  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
278ef7100fSMilanka Ringwald  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
288ef7100fSMilanka Ringwald  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
298ef7100fSMilanka Ringwald  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
308ef7100fSMilanka Ringwald  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
318ef7100fSMilanka Ringwald  * SUCH DAMAGE.
328ef7100fSMilanka Ringwald  *
338ef7100fSMilanka Ringwald  * Please inquire about commercial licensing options at
348ef7100fSMilanka Ringwald  * [email protected]
358ef7100fSMilanka Ringwald  *
368ef7100fSMilanka Ringwald  */
378ef7100fSMilanka Ringwald 
388ef7100fSMilanka Ringwald /*
398ef7100fSMilanka Ringwald  * avdtp_source.h
408ef7100fSMilanka Ringwald  *
418ef7100fSMilanka Ringwald  * Audio/Video Distribution Transport Protocol Source
428ef7100fSMilanka Ringwald  *
438ef7100fSMilanka Ringwald  * AVDTP Source is a device that streames media data.
448ef7100fSMilanka Ringwald  */
458ef7100fSMilanka Ringwald 
4680e33422SMatthias Ringwald #ifndef AVDTP_SOURCE_H
4780e33422SMatthias Ringwald #define AVDTP_SOURCE_H
488ef7100fSMilanka Ringwald 
498ef7100fSMilanka Ringwald #include <stdint.h>
503311c2d5SMatthias Ringwald #include "classic/avdtp.h"
518ef7100fSMilanka Ringwald 
528ef7100fSMilanka Ringwald #if defined __cplusplus
538ef7100fSMilanka Ringwald extern "C" {
548ef7100fSMilanka Ringwald #endif
558ef7100fSMilanka Ringwald 
568ef7100fSMilanka Ringwald /* API_START */
578ef7100fSMilanka Ringwald 
588d93ed25SMilanka Ringwald /**
598d93ed25SMilanka Ringwald  * @brief Register media transport category with local stream endpoint identified by seid
608d93ed25SMilanka Ringwald  * @param seid
618d93ed25SMilanka Ringwald  */
62747ec646SMilanka Ringwald void avdtp_source_register_media_transport_category(uint8_t seid);
638d93ed25SMilanka Ringwald 
648d93ed25SMilanka Ringwald /**
658d93ed25SMilanka Ringwald  * @brief Register reporting category with local stream endpoint identified by seid
668d93ed25SMilanka Ringwald  * @param seid
678d93ed25SMilanka Ringwald  */
68747ec646SMilanka Ringwald void avdtp_source_register_reporting_category(uint8_t seid);
698d93ed25SMilanka Ringwald 
708d93ed25SMilanka Ringwald /**
718d93ed25SMilanka Ringwald  * @brief Register delay reporting category with local stream endpoint identified by seid
728d93ed25SMilanka Ringwald  * @param seid
738d93ed25SMilanka Ringwald  */
74747ec646SMilanka Ringwald void avdtp_source_register_delay_reporting_category(uint8_t seid);
758d93ed25SMilanka Ringwald 
768d93ed25SMilanka Ringwald /**
778d93ed25SMilanka Ringwald  * @brief Register recovery category with local stream endpoint identified by seid
788d93ed25SMilanka Ringwald  * @param seid
798d93ed25SMilanka Ringwald  * @param maximum_recovery_window_size
808d93ed25SMilanka Ringwald  * @param maximum_number_media_packets
818d93ed25SMilanka Ringwald  */
82747ec646SMilanka Ringwald void avdtp_source_register_recovery_category(uint8_t seid, uint8_t maximum_recovery_window_size, uint8_t maximum_number_media_packets);
838d93ed25SMilanka Ringwald 
848d93ed25SMilanka Ringwald /**
858d93ed25SMilanka Ringwald  * @brief Register content protection category with local stream endpoint identified by seid
868d93ed25SMilanka Ringwald  * @param seid
878d93ed25SMilanka Ringwald  * @param cp_type
888d93ed25SMilanka Ringwald  * @param cp_type_value
898d93ed25SMilanka Ringwald  * @param cp_type_value_len
908d93ed25SMilanka Ringwald  */
91747ec646SMilanka Ringwald void avdtp_source_register_content_protection_category(uint8_t seid, uint16_t cp_type, const uint8_t * cp_type_value, uint8_t cp_type_value_len);
928d93ed25SMilanka Ringwald 
938d93ed25SMilanka Ringwald /**
948d93ed25SMilanka Ringwald  * @brief Register header compression category with local stream endpoint identified by seid
958d93ed25SMilanka Ringwald  * @param seid
968d93ed25SMilanka Ringwald  * @param back_ch
978d93ed25SMilanka Ringwald  * @param media
988d93ed25SMilanka Ringwald  * @param recovery
998d93ed25SMilanka Ringwald  */
100747ec646SMilanka Ringwald void avdtp_source_register_header_compression_category(uint8_t seid, uint8_t back_ch, uint8_t media, uint8_t recovery);
1018d93ed25SMilanka Ringwald 
1028d93ed25SMilanka Ringwald /**
1038d93ed25SMilanka Ringwald  * @brief Register media codec category with local stream endpoint identified by seid
1048d93ed25SMilanka Ringwald  * @param seid
1058d93ed25SMilanka Ringwald  * @param media_type
1068d93ed25SMilanka Ringwald  * @param media_codec_type
1078d93ed25SMilanka Ringwald  * @param media_codec_info
1088d93ed25SMilanka Ringwald  * @param media_codec_info_len
1098d93ed25SMilanka Ringwald  */
11078d08d09SMilanka Ringwald void avdtp_source_register_media_codec_category(uint8_t seid, avdtp_media_type_t media_type, avdtp_media_codec_type_t media_codec_type, uint8_t * media_codec_info, uint16_t media_codec_info_len);
1118d93ed25SMilanka Ringwald 
1128d93ed25SMilanka Ringwald /**
1138d93ed25SMilanka Ringwald  * @brief Register multiplexing category with local stream endpoint identified by seid
1148d93ed25SMilanka Ringwald  * @param seid
1158d93ed25SMilanka Ringwald  * @param fragmentation
1168d93ed25SMilanka Ringwald  */
117747ec646SMilanka Ringwald void avdtp_source_register_multiplexing_category(uint8_t seid, uint8_t fragmentation);
118747ec646SMilanka Ringwald 
1198d93ed25SMilanka Ringwald /**
1208d93ed25SMilanka Ringwald  * @brief Initialize up AVDTP Source device.
1218d93ed25SMilanka Ringwald  */
12277092f3eSMatthias Ringwald void avdtp_source_init(void);
1238d93ed25SMilanka Ringwald 
1248d93ed25SMilanka Ringwald /**
1258d93ed25SMilanka Ringwald  * @brief Register callback for the AVDTP Source client. See btstack_defines.h for AVDTP_SUBEVENT_* events
1268d93ed25SMilanka Ringwald  *
1278d93ed25SMilanka Ringwald  * @param callback
1288d93ed25SMilanka Ringwald  */
129747ec646SMilanka Ringwald void avdtp_source_register_packet_handler(btstack_packet_handler_t callback);
130747ec646SMilanka Ringwald 
131747ec646SMilanka Ringwald /**
132747ec646SMilanka Ringwald  * @brief Connect to device with a bluetooth address. (and perform configuration?)
133747ec646SMilanka Ringwald  * @param bd_addr
1344ccacc40SMilanka Ringwald  * @param avdtp_cid Assigned avdtp cid
1358d93ed25SMilanka Ringwald  * @return status ERROR_CODE_SUCCESS if succesful, otherwise BTSTACK_MEMORY_ALLOC_FAILED, SDP_QUERY_BUSY
136747ec646SMilanka Ringwald  */
1374ccacc40SMilanka Ringwald uint8_t avdtp_source_connect(bd_addr_t bd_addr, uint16_t * avdtp_cid);
138747ec646SMilanka Ringwald 
139747ec646SMilanka Ringwald /**
140747ec646SMilanka Ringwald  * @brief Disconnect from device with connection handle.
141f9bca1f3SMilanka Ringwald  * @param avdtp_cid
14223edb87eSMilanka Ringwald  * @return status ERROR_CODE_SUCCESS if succesful, otherwise ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER
143747ec646SMilanka Ringwald  */
1444ccacc40SMilanka Ringwald uint8_t avdtp_source_disconnect(uint16_t avdtp_cid);
145747ec646SMilanka Ringwald 
146747ec646SMilanka Ringwald /**
147747ec646SMilanka Ringwald  * @brief Discover stream endpoints
148f9bca1f3SMilanka Ringwald  * @param avdtp_cid
14923edb87eSMilanka Ringwald  * @return status ERROR_CODE_SUCCESS if succesful, otherwise ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, ERROR_CODE_COMMAND_DISALLOWED
150747ec646SMilanka Ringwald  */
1519974aee0SMilanka Ringwald uint8_t avdtp_source_discover_stream_endpoints(uint16_t avdtp_cid);
152747ec646SMilanka Ringwald 
153747ec646SMilanka Ringwald /**
154747ec646SMilanka Ringwald  * @brief Get capabilities
155f9bca1f3SMilanka Ringwald  * @param avdtp_cid
15623edb87eSMilanka Ringwald  * @return status ERROR_CODE_SUCCESS if succesful, otherwise ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, ERROR_CODE_COMMAND_DISALLOWED
157747ec646SMilanka Ringwald  */
1589974aee0SMilanka Ringwald uint8_t avdtp_source_get_capabilities(uint16_t avdtp_cid, uint8_t acp_seid);
159747ec646SMilanka Ringwald 
160747ec646SMilanka Ringwald /**
161747ec646SMilanka Ringwald  * @brief Get all capabilities
162f9bca1f3SMilanka Ringwald  * @param avdtp_cid
16323edb87eSMilanka Ringwald  * @return status ERROR_CODE_SUCCESS if succesful, otherwise ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, ERROR_CODE_COMMAND_DISALLOWED
164747ec646SMilanka Ringwald  */
1659974aee0SMilanka Ringwald uint8_t avdtp_source_get_all_capabilities(uint16_t avdtp_cid, uint8_t acp_seid);
166747ec646SMilanka Ringwald 
167747ec646SMilanka Ringwald /**
168747ec646SMilanka Ringwald  * @brief Set configuration
169f9bca1f3SMilanka Ringwald  * @param avdtp_cid
17023edb87eSMilanka Ringwald  * @return status ERROR_CODE_SUCCESS if succesful, otherwise ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, ERROR_CODE_COMMAND_DISALLOWED
171747ec646SMilanka Ringwald  */
1729974aee0SMilanka Ringwald uint8_t avdtp_source_set_configuration(uint16_t avdtp_cid, uint8_t int_seid, uint8_t acp_seid, uint16_t configured_services_bitmap, avdtp_capabilities_t configuration);
173747ec646SMilanka Ringwald 
174747ec646SMilanka Ringwald /**
175747ec646SMilanka Ringwald  * @brief Reconfigure stream
176f9bca1f3SMilanka Ringwald  * @param avdtp_cid
177747ec646SMilanka Ringwald  * @param seid
17823edb87eSMilanka Ringwald  * @return status ERROR_CODE_SUCCESS if succesful, otherwise ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, ERROR_CODE_COMMAND_DISALLOWED
179747ec646SMilanka Ringwald  */
1809974aee0SMilanka Ringwald uint8_t avdtp_source_reconfigure(uint16_t avdtp_cid, uint8_t int_seid, uint8_t acp_seid, uint16_t configured_services_bitmap, avdtp_capabilities_t configuration);
181747ec646SMilanka Ringwald 
182747ec646SMilanka Ringwald /**
183747ec646SMilanka Ringwald  * @brief Get configuration
184f9bca1f3SMilanka Ringwald  * @param avdtp_cid
18523edb87eSMilanka Ringwald  * @return status ERROR_CODE_SUCCESS if succesful, otherwise ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, ERROR_CODE_COMMAND_DISALLOWED
186747ec646SMilanka Ringwald  */
1879974aee0SMilanka Ringwald uint8_t avdtp_source_get_configuration(uint16_t avdtp_cid, uint8_t acp_seid);
188747ec646SMilanka Ringwald 
189747ec646SMilanka Ringwald 
190747ec646SMilanka Ringwald /**
191747ec646SMilanka Ringwald  * @brief Open stream
192f9bca1f3SMilanka Ringwald  * @param avdtp_cid
193747ec646SMilanka Ringwald  * @param seid
19423edb87eSMilanka Ringwald  * @return status ERROR_CODE_SUCCESS if succesful, otherwise ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, ERROR_CODE_COMMAND_DISALLOWED
195747ec646SMilanka Ringwald  */
1964ccacc40SMilanka Ringwald uint8_t avdtp_source_open_stream(uint16_t avdtp_cid, uint8_t int_seid, uint8_t acp_seid);
197747ec646SMilanka Ringwald 
198747ec646SMilanka Ringwald /**
199747ec646SMilanka Ringwald  * @brief Start stream
20060ec20d0SMilanka Ringwald  * @param local_seid
20123edb87eSMilanka Ringwald * @return status ERROR_CODE_SUCCESS if succesful, otherwise ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, ERROR_CODE_COMMAND_DISALLOWED
202747ec646SMilanka Ringwald  */
2034ccacc40SMilanka Ringwald uint8_t avdtp_source_start_stream(uint16_t avdtp_cid, uint8_t local_seid);
20460ec20d0SMilanka Ringwald 
20560ec20d0SMilanka Ringwald /**
20660ec20d0SMilanka Ringwald  * @brief Abort stream
20760ec20d0SMilanka Ringwald  * @param local_seid
20823edb87eSMilanka Ringwald  * @return status ERROR_CODE_SUCCESS if succesful, otherwise ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, ERROR_CODE_COMMAND_DISALLOWED
20960ec20d0SMilanka Ringwald  */
2104ccacc40SMilanka Ringwald uint8_t avdtp_source_abort_stream(uint16_t avdtp_cid, uint8_t local_seid);
211747ec646SMilanka Ringwald 
212747ec646SMilanka Ringwald /**
213747ec646SMilanka Ringwald  * @brief Start stream
21460ec20d0SMilanka Ringwald  * @param local_seid
21523edb87eSMilanka Ringwald  * @return status ERROR_CODE_SUCCESS if succesful, otherwise ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, ERROR_CODE_COMMAND_DISALLOWED
216747ec646SMilanka Ringwald  */
2174ccacc40SMilanka Ringwald uint8_t avdtp_source_stop_stream(uint16_t avdtp_cid, uint8_t local_seid);
218747ec646SMilanka Ringwald 
219747ec646SMilanka Ringwald /**
22060ec20d0SMilanka Ringwald  * @brief Suspend stream
22160ec20d0SMilanka Ringwald  * @param local_seid
22223edb87eSMilanka Ringwald  * @return status ERROR_CODE_SUCCESS if succesful, otherwise ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, ERROR_CODE_COMMAND_DISALLOWED
223747ec646SMilanka Ringwald  */
2244ccacc40SMilanka Ringwald uint8_t avdtp_source_suspend(uint16_t avdtp_cid, uint8_t local_seid);
22560ec20d0SMilanka Ringwald 
2268d93ed25SMilanka Ringwald /**
2278d93ed25SMilanka Ringwald  * @brief Create stream endpoint
2288d93ed25SMilanka Ringwald  * @param sep_type          AVDTP_SOURCE or AVDTP_SINK, see avdtp.h
2298d93ed25SMilanka Ringwald  * @param media_type        AVDTP_AUDIO, AVDTP_VIDEO or AVDTP_MULTIMEDIA, see avdtp.h
2308d93ed25SMilanka Ringwald  * @return pointer to newly created stream endpoint, or NULL if allocation failed
2318d93ed25SMilanka Ringwald  */
232747ec646SMilanka Ringwald avdtp_stream_endpoint_t * avdtp_source_create_stream_endpoint(avdtp_sep_type_t sep_type, avdtp_media_type_t media_type);
233747ec646SMilanka Ringwald 
2348d93ed25SMilanka Ringwald /**
23517ddf501SMatthias Ringwald  *  @brief Unregister stream endpoint and free it's memory
23617ddf501SMatthias Ringwald  *  @param stream_endpoint created by avdtp_sink_create_stream_endpoint
23717ddf501SMatthias Ringwald  */
23817ddf501SMatthias Ringwald void avdtp_source_finalize_stream_endpoint(avdtp_stream_endpoint_t * stream_endpoint);
23917ddf501SMatthias Ringwald 
24017ddf501SMatthias Ringwald /**
241*3790661cSMatthias Ringwald  * @brief Send media packet
242*3790661cSMatthias Ringwald  * @param avdtp_cid         AVDTP channel identifyer.
243*3790661cSMatthias Ringwald  * @param local_seid        ID of a local stream endpoint.
244*3790661cSMatthias Ringwald  * @param packet
245*3790661cSMatthias Ringwald  * @param size
246*3790661cSMatthias Ringwald  * @return status
247*3790661cSMatthias Ringwald  */
248*3790661cSMatthias Ringwald uint8_t avdtp_source_stream_send_media_packet(uint16_t avdtp_cid, uint8_t local_seid, const uint8_t * packet, uint16_t size);
249*3790661cSMatthias Ringwald 
250*3790661cSMatthias Ringwald /**
251*3790661cSMatthias Ringwald  * @brief Send media payload including RTP header
252*3790661cSMatthias Ringwald  * @param avdtp_cid         AVDTP channel identifyer.
253*3790661cSMatthias Ringwald  * @param local_seid        ID of a local stream endpoint.
254*3790661cSMatthias Ringwald  * @param marker
255*3790661cSMatthias Ringwald  * @param payload
256*3790661cSMatthias Ringwald  * @param size
257*3790661cSMatthias Ringwald  * @return status
258*3790661cSMatthias Ringwald  */
259*3790661cSMatthias Ringwald uint8_t avdtp_source_stream_send_media_payload_rtp(uint16_t avdtp_cid, uint8_t local_seid, uint8_t marker, uint8_t * payload, uint16_t size);
260*3790661cSMatthias Ringwald 
261*3790661cSMatthias Ringwald /**
262*3790661cSMatthias Ringwald  * @brief Send media payload including RTP header and the SBC media header
263*3790661cSMatthias Ringwald  * @deprecated Please use avdtp_source_stream_send_media_payload_rtp
2648d93ed25SMilanka Ringwald  * @param avdtp_cid         AVDTP channel identifyer.
2658d93ed25SMilanka Ringwald  * @param local_seid        ID of a local stream endpoint.
2668d93ed25SMilanka Ringwald  * @param storage
2678d93ed25SMilanka Ringwald  * @param num_bytes_to_copy
2688d93ed25SMilanka Ringwald  * @param num_frames
2698d93ed25SMilanka Ringwald  * @param marker
2708d93ed25SMilanka Ringwald  * @return max_media_payload_size_without_media_header
2718d93ed25SMilanka Ringwald  */
27246982b0cSMilanka Ringwald int avdtp_source_stream_send_media_payload(uint16_t avdtp_cid, uint8_t local_seid, uint8_t * storage, int num_bytes_to_copy, uint8_t num_frames, uint8_t marker);
2738d93ed25SMilanka Ringwald 
274*3790661cSMatthias Ringwald 
2755695c5ccSMatthias Ringwald 
2765695c5ccSMatthias Ringwald /**
2778d93ed25SMilanka Ringwald  * @brief Request to send a media packet. Packet can be then sent on reception of AVDTP_SUBEVENT_STREAMING_CAN_SEND_MEDIA_PACKET_NOW event.
2788d93ed25SMilanka Ringwald  * @param avdtp_cid         AVDTP channel identifyer.
2798d93ed25SMilanka Ringwald  * @param local_seid        ID of a local stream endpoint.
2808d93ed25SMilanka Ringwald  */
2818d93ed25SMilanka Ringwald void avdtp_source_stream_endpoint_request_can_send_now(uint16_t avddp_cid, uint8_t local_seid);
2828d93ed25SMilanka Ringwald 
2834cd630d9SMilanka Ringwald /**
2844cd630d9SMilanka Ringwald  * @brief Return maximal media payload size, does not include media header.
2854cd630d9SMilanka Ringwald  * @param avdtp_cid         AVDTP channel identifyer.
2864cd630d9SMilanka Ringwald  * @param local_seid        ID of a local stream endpoint.
2874cd630d9SMilanka Ringwald  */
2884cd630d9SMilanka Ringwald int avdtp_max_media_payload_size(uint16_t avdtp_cid, uint8_t local_seid);
2894cd630d9SMilanka Ringwald 
2908ef7100fSMilanka Ringwald /* API_END */
2918ef7100fSMilanka Ringwald 
2928ef7100fSMilanka Ringwald #if defined __cplusplus
2938ef7100fSMilanka Ringwald }
2948ef7100fSMilanka Ringwald #endif
2958ef7100fSMilanka Ringwald 
29680e33422SMatthias Ringwald #endif // AVDTP_SOURCE_H
297