xref: /btstack/src/classic/avdtp_source.h (revision 77092f3ebcc4c77edcad998d920958770bedde1c)
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  */
122*77092f3eSMatthias 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
1428d93ed25SMilanka Ringwald  * @return status ERROR_CODE_SUCCESS if succesful, otherwise AVDTP_CONNECTION_DOES_NOT_EXIST
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
1498d93ed25SMilanka Ringwald  * @return status ERROR_CODE_SUCCESS if succesful, otherwise AVDTP_CONNECTION_DOES_NOT_EXIST, AVDTP_CONNECTION_IN_WRONG_STATE
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
1568d93ed25SMilanka Ringwald  * @return status ERROR_CODE_SUCCESS if succesful, otherwise AVDTP_CONNECTION_DOES_NOT_EXIST, AVDTP_CONNECTION_IN_WRONG_STATE
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
1638d93ed25SMilanka Ringwald  * @return status ERROR_CODE_SUCCESS if succesful, otherwise AVDTP_CONNECTION_DOES_NOT_EXIST, AVDTP_CONNECTION_IN_WRONG_STATE
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
1708d93ed25SMilanka Ringwald  * @return status ERROR_CODE_SUCCESS if succesful, otherwise AVDTP_CONNECTION_DOES_NOT_EXIST, AVDTP_CONNECTION_IN_WRONG_STATE, AVDTP_STREAM_ENDPOINT_DOES_NOT_EXIST, AVDTP_STREAM_ENDPOINT_IN_WRONG_STATE
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
1788d93ed25SMilanka Ringwald  * @return status ERROR_CODE_SUCCESS if succesful, otherwise AVDTP_CONNECTION_DOES_NOT_EXIST, AVDTP_CONNECTION_IN_WRONG_STATE, AVDTP_STREAM_ENDPOINT_DOES_NOT_EXIST, AVDTP_STREAM_ENDPOINT_IN_WRONG_STATE
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
1858d93ed25SMilanka Ringwald  * @return status ERROR_CODE_SUCCESS if succesful, otherwise AVDTP_CONNECTION_DOES_NOT_EXIST, AVDTP_CONNECTION_IN_WRONG_STATE
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
1948d93ed25SMilanka Ringwald  * @return status ERROR_CODE_SUCCESS if succesful, otherwise AVDTP_CONNECTION_DOES_NOT_EXIST, AVDTP_CONNECTION_IN_WRONG_STATE, AVDTP_SEID_DOES_NOT_EXIST, AVDTP_MEDIA_CONNECTION_DOES_NOT_EXIST
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
2018d93ed25SMilanka Ringwald * @return status ERROR_CODE_SUCCESS if succesful, otherwise AVDTP_CONNECTION_DOES_NOT_EXIST, AVDTP_SEID_DOES_NOT_EXIST, AVDTP_MEDIA_CONNECTION_DOES_NOT_EXIST
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
2088d93ed25SMilanka Ringwald  * @return status ERROR_CODE_SUCCESS if succesful, otherwise AVDTP_CONNECTION_DOES_NOT_EXIST, AVDTP_SEID_DOES_NOT_EXIST, AVDTP_MEDIA_CONNECTION_DOES_NOT_EXIST
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
2158d93ed25SMilanka Ringwald  * @return status ERROR_CODE_SUCCESS if succesful, otherwise AVDTP_CONNECTION_DOES_NOT_EXIST, AVDTP_SEID_DOES_NOT_EXIST, AVDTP_MEDIA_CONNECTION_DOES_NOT_EXIST,
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
2228d93ed25SMilanka Ringwald  * @return status ERROR_CODE_SUCCESS if succesful, otherwise AVDTP_CONNECTION_DOES_NOT_EXIST, AVDTP_SEID_DOES_NOT_EXIST, AVDTP_MEDIA_CONNECTION_DOES_NOT_EXIST
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 /**
2358d93ed25SMilanka Ringwald  * @brief Send media payload.
2368d93ed25SMilanka Ringwald  * @param avdtp_cid         AVDTP channel identifyer.
2378d93ed25SMilanka Ringwald  * @param local_seid        ID of a local stream endpoint.
2388d93ed25SMilanka Ringwald  * @param storage
2398d93ed25SMilanka Ringwald  * @param num_bytes_to_copy
2408d93ed25SMilanka Ringwald  * @param num_frames
2418d93ed25SMilanka Ringwald  * @param marker
2428d93ed25SMilanka Ringwald  * @return max_media_payload_size_without_media_header
2438d93ed25SMilanka Ringwald  */
24446982b0cSMilanka 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);
2458d93ed25SMilanka Ringwald 
2468d93ed25SMilanka Ringwald /**
2478d93ed25SMilanka 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.
2488d93ed25SMilanka Ringwald  * @param avdtp_cid         AVDTP channel identifyer.
2498d93ed25SMilanka Ringwald  * @param local_seid        ID of a local stream endpoint.
2508d93ed25SMilanka Ringwald  */
2518d93ed25SMilanka Ringwald void avdtp_source_stream_endpoint_request_can_send_now(uint16_t avddp_cid, uint8_t local_seid);
2528d93ed25SMilanka Ringwald 
2534cd630d9SMilanka Ringwald /**
2544cd630d9SMilanka Ringwald  * @brief Return maximal media payload size, does not include media header.
2554cd630d9SMilanka Ringwald  * @param avdtp_cid         AVDTP channel identifyer.
2564cd630d9SMilanka Ringwald  * @param local_seid        ID of a local stream endpoint.
2574cd630d9SMilanka Ringwald  */
2584cd630d9SMilanka Ringwald int avdtp_max_media_payload_size(uint16_t avdtp_cid, uint8_t local_seid);
2594cd630d9SMilanka Ringwald 
2608ef7100fSMilanka Ringwald /* API_END */
2618ef7100fSMilanka Ringwald 
2628ef7100fSMilanka Ringwald #if defined __cplusplus
2638ef7100fSMilanka Ringwald }
2648ef7100fSMilanka Ringwald #endif
2658ef7100fSMilanka Ringwald 
26680e33422SMatthias Ringwald #endif // AVDTP_SOURCE_H
267