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 232fca4dadSMilanka Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN 242fca4dadSMilanka Ringwald * GMBH 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 38fe5a6c4eSMilanka Ringwald /** 39fe5a6c4eSMilanka Ringwald * @title AVDTP Source 408ef7100fSMilanka Ringwald * 41fe5a6c4eSMilanka Ringwald * Audio/Video Distribution Transport Protocol (AVDTP) Source is a device that streames media data. 428ef7100fSMilanka Ringwald * 438ef7100fSMilanka Ringwald */ 448ef7100fSMilanka Ringwald 4580e33422SMatthias Ringwald #ifndef AVDTP_SOURCE_H 4680e33422SMatthias Ringwald #define AVDTP_SOURCE_H 478ef7100fSMilanka Ringwald 488ef7100fSMilanka Ringwald #include <stdint.h> 493311c2d5SMatthias Ringwald #include "classic/avdtp.h" 508ef7100fSMilanka Ringwald 518ef7100fSMilanka Ringwald #if defined __cplusplus 528ef7100fSMilanka Ringwald extern "C" { 538ef7100fSMilanka Ringwald #endif 548ef7100fSMilanka Ringwald 558ef7100fSMilanka Ringwald /* API_START */ 568ef7100fSMilanka Ringwald 578d93ed25SMilanka Ringwald /** 588d93ed25SMilanka Ringwald * @brief Register media transport category with local stream endpoint identified by seid 598d93ed25SMilanka Ringwald * @param seid 608d93ed25SMilanka Ringwald */ 61747ec646SMilanka Ringwald void avdtp_source_register_media_transport_category(uint8_t seid); 628d93ed25SMilanka Ringwald 638d93ed25SMilanka Ringwald /** 648d93ed25SMilanka Ringwald * @brief Register reporting category with local stream endpoint identified by seid 658d93ed25SMilanka Ringwald * @param seid 668d93ed25SMilanka Ringwald */ 67747ec646SMilanka Ringwald void avdtp_source_register_reporting_category(uint8_t seid); 688d93ed25SMilanka Ringwald 698d93ed25SMilanka Ringwald /** 708d93ed25SMilanka Ringwald * @brief Register delay reporting category with local stream endpoint identified by seid 718d93ed25SMilanka Ringwald * @param seid 728d93ed25SMilanka Ringwald */ 73747ec646SMilanka Ringwald void avdtp_source_register_delay_reporting_category(uint8_t seid); 748d93ed25SMilanka Ringwald 758d93ed25SMilanka Ringwald /** 768d93ed25SMilanka Ringwald * @brief Register recovery category with local stream endpoint identified by seid 778d93ed25SMilanka Ringwald * @param seid 788d93ed25SMilanka Ringwald * @param maximum_recovery_window_size 798d93ed25SMilanka Ringwald * @param maximum_number_media_packets 808d93ed25SMilanka Ringwald */ 81747ec646SMilanka Ringwald void avdtp_source_register_recovery_category(uint8_t seid, uint8_t maximum_recovery_window_size, uint8_t maximum_number_media_packets); 828d93ed25SMilanka Ringwald 838d93ed25SMilanka Ringwald /** 848d93ed25SMilanka Ringwald * @brief Register content protection category with local stream endpoint identified by seid 858d93ed25SMilanka Ringwald * @param seid 868d93ed25SMilanka Ringwald * @param cp_type 878d93ed25SMilanka Ringwald * @param cp_type_value 888d93ed25SMilanka Ringwald * @param cp_type_value_len 898d93ed25SMilanka Ringwald */ 90747ec646SMilanka 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); 918d93ed25SMilanka Ringwald 928d93ed25SMilanka Ringwald /** 938d93ed25SMilanka Ringwald * @brief Register header compression category with local stream endpoint identified by seid 948d93ed25SMilanka Ringwald * @param seid 958d93ed25SMilanka Ringwald * @param back_ch 968d93ed25SMilanka Ringwald * @param media 978d93ed25SMilanka Ringwald * @param recovery 988d93ed25SMilanka Ringwald */ 99747ec646SMilanka Ringwald void avdtp_source_register_header_compression_category(uint8_t seid, uint8_t back_ch, uint8_t media, uint8_t recovery); 1008d93ed25SMilanka Ringwald 1018d93ed25SMilanka Ringwald /** 1028d93ed25SMilanka Ringwald * @brief Register media codec category with local stream endpoint identified by seid 1038d93ed25SMilanka Ringwald * @param seid 1048d93ed25SMilanka Ringwald * @param media_type 1058d93ed25SMilanka Ringwald * @param media_codec_type 1068d93ed25SMilanka Ringwald * @param media_codec_info 1078d93ed25SMilanka Ringwald * @param media_codec_info_len 1088d93ed25SMilanka Ringwald */ 1093e6cf581SMatthias 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, const uint8_t *media_codec_info, uint16_t media_codec_info_len); 1108d93ed25SMilanka Ringwald 1118d93ed25SMilanka Ringwald /** 1128d93ed25SMilanka Ringwald * @brief Register multiplexing category with local stream endpoint identified by seid 1138d93ed25SMilanka Ringwald * @param seid 1148d93ed25SMilanka Ringwald * @param fragmentation 1158d93ed25SMilanka Ringwald */ 116747ec646SMilanka Ringwald void avdtp_source_register_multiplexing_category(uint8_t seid, uint8_t fragmentation); 117747ec646SMilanka Ringwald 1188d93ed25SMilanka Ringwald /** 1198d93ed25SMilanka Ringwald * @brief Initialize up AVDTP Source device. 1208d93ed25SMilanka Ringwald */ 12177092f3eSMatthias Ringwald void avdtp_source_init(void); 1228d93ed25SMilanka Ringwald 1238d93ed25SMilanka Ringwald /** 1248d93ed25SMilanka Ringwald * @brief Register callback for the AVDTP Source client. See btstack_defines.h for AVDTP_SUBEVENT_* events 1258d93ed25SMilanka Ringwald * 1268d93ed25SMilanka Ringwald * @param callback 1278d93ed25SMilanka Ringwald */ 128747ec646SMilanka Ringwald void avdtp_source_register_packet_handler(btstack_packet_handler_t callback); 129747ec646SMilanka Ringwald 130747ec646SMilanka Ringwald /** 131747ec646SMilanka Ringwald * @brief Connect to device with a bluetooth address. (and perform configuration?) 132747ec646SMilanka Ringwald * @param bd_addr 1334ccacc40SMilanka Ringwald * @param avdtp_cid Assigned avdtp cid 1348d93ed25SMilanka Ringwald * @return status ERROR_CODE_SUCCESS if succesful, otherwise BTSTACK_MEMORY_ALLOC_FAILED, SDP_QUERY_BUSY 135747ec646SMilanka Ringwald */ 1364ccacc40SMilanka Ringwald uint8_t avdtp_source_connect(bd_addr_t bd_addr, uint16_t * avdtp_cid); 137747ec646SMilanka Ringwald 138747ec646SMilanka Ringwald /** 139747ec646SMilanka Ringwald * @brief Disconnect from device with connection handle. 140f9bca1f3SMilanka Ringwald * @param avdtp_cid 14123edb87eSMilanka Ringwald * @return status ERROR_CODE_SUCCESS if succesful, otherwise ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER 142747ec646SMilanka Ringwald */ 1434ccacc40SMilanka Ringwald uint8_t avdtp_source_disconnect(uint16_t avdtp_cid); 144747ec646SMilanka Ringwald 145747ec646SMilanka Ringwald /** 146747ec646SMilanka Ringwald * @brief Discover stream endpoints 147f9bca1f3SMilanka Ringwald * @param avdtp_cid 14823edb87eSMilanka Ringwald * @return status ERROR_CODE_SUCCESS if succesful, otherwise ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, ERROR_CODE_COMMAND_DISALLOWED 149747ec646SMilanka Ringwald */ 1509974aee0SMilanka Ringwald uint8_t avdtp_source_discover_stream_endpoints(uint16_t avdtp_cid); 151747ec646SMilanka Ringwald 152747ec646SMilanka Ringwald /** 153747ec646SMilanka Ringwald * @brief Get capabilities 154f9bca1f3SMilanka Ringwald * @param avdtp_cid 15523edb87eSMilanka Ringwald * @return status ERROR_CODE_SUCCESS if succesful, otherwise ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, ERROR_CODE_COMMAND_DISALLOWED 156747ec646SMilanka Ringwald */ 1579974aee0SMilanka Ringwald uint8_t avdtp_source_get_capabilities(uint16_t avdtp_cid, uint8_t acp_seid); 158747ec646SMilanka Ringwald 159747ec646SMilanka Ringwald /** 160747ec646SMilanka Ringwald * @brief Get all capabilities 161f9bca1f3SMilanka Ringwald * @param avdtp_cid 16223edb87eSMilanka Ringwald * @return status ERROR_CODE_SUCCESS if succesful, otherwise ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, ERROR_CODE_COMMAND_DISALLOWED 163747ec646SMilanka Ringwald */ 1649974aee0SMilanka Ringwald uint8_t avdtp_source_get_all_capabilities(uint16_t avdtp_cid, uint8_t acp_seid); 165747ec646SMilanka Ringwald 166747ec646SMilanka Ringwald /** 167747ec646SMilanka Ringwald * @brief Set configuration 168f9bca1f3SMilanka Ringwald * @param avdtp_cid 16923edb87eSMilanka Ringwald * @return status ERROR_CODE_SUCCESS if succesful, otherwise ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, ERROR_CODE_COMMAND_DISALLOWED 170747ec646SMilanka Ringwald */ 1719974aee0SMilanka 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); 172747ec646SMilanka Ringwald 173747ec646SMilanka Ringwald /** 174747ec646SMilanka Ringwald * @brief Reconfigure stream 175f9bca1f3SMilanka Ringwald * @param avdtp_cid 176747ec646SMilanka Ringwald * @param seid 17723edb87eSMilanka Ringwald * @return status ERROR_CODE_SUCCESS if succesful, otherwise ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, ERROR_CODE_COMMAND_DISALLOWED 178747ec646SMilanka Ringwald */ 1799974aee0SMilanka 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); 180747ec646SMilanka Ringwald 181747ec646SMilanka Ringwald /** 182747ec646SMilanka Ringwald * @brief Get configuration 183f9bca1f3SMilanka Ringwald * @param avdtp_cid 18423edb87eSMilanka Ringwald * @return status ERROR_CODE_SUCCESS if succesful, otherwise ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, ERROR_CODE_COMMAND_DISALLOWED 185747ec646SMilanka Ringwald */ 1869974aee0SMilanka Ringwald uint8_t avdtp_source_get_configuration(uint16_t avdtp_cid, uint8_t acp_seid); 187747ec646SMilanka Ringwald 188747ec646SMilanka Ringwald 189747ec646SMilanka Ringwald /** 190747ec646SMilanka Ringwald * @brief Open stream 191f9bca1f3SMilanka Ringwald * @param avdtp_cid 192747ec646SMilanka Ringwald * @param seid 19323edb87eSMilanka Ringwald * @return status ERROR_CODE_SUCCESS if succesful, otherwise ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, ERROR_CODE_COMMAND_DISALLOWED 194747ec646SMilanka Ringwald */ 1954ccacc40SMilanka Ringwald uint8_t avdtp_source_open_stream(uint16_t avdtp_cid, uint8_t int_seid, uint8_t acp_seid); 196747ec646SMilanka Ringwald 197747ec646SMilanka Ringwald /** 198747ec646SMilanka Ringwald * @brief Start stream 19960ec20d0SMilanka Ringwald * @param local_seid 20023edb87eSMilanka Ringwald * @return status ERROR_CODE_SUCCESS if succesful, otherwise ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, ERROR_CODE_COMMAND_DISALLOWED 201747ec646SMilanka Ringwald */ 2024ccacc40SMilanka Ringwald uint8_t avdtp_source_start_stream(uint16_t avdtp_cid, uint8_t local_seid); 20360ec20d0SMilanka Ringwald 20460ec20d0SMilanka Ringwald /** 20560ec20d0SMilanka Ringwald * @brief Abort stream 20660ec20d0SMilanka Ringwald * @param local_seid 20723edb87eSMilanka Ringwald * @return status ERROR_CODE_SUCCESS if succesful, otherwise ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, ERROR_CODE_COMMAND_DISALLOWED 20860ec20d0SMilanka Ringwald */ 2094ccacc40SMilanka Ringwald uint8_t avdtp_source_abort_stream(uint16_t avdtp_cid, uint8_t local_seid); 210747ec646SMilanka Ringwald 211747ec646SMilanka Ringwald /** 212747ec646SMilanka Ringwald * @brief Start stream 21360ec20d0SMilanka Ringwald * @param local_seid 21423edb87eSMilanka Ringwald * @return status ERROR_CODE_SUCCESS if succesful, otherwise ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, ERROR_CODE_COMMAND_DISALLOWED 215747ec646SMilanka Ringwald */ 2164ccacc40SMilanka Ringwald uint8_t avdtp_source_stop_stream(uint16_t avdtp_cid, uint8_t local_seid); 217747ec646SMilanka Ringwald 218747ec646SMilanka Ringwald /** 21960ec20d0SMilanka Ringwald * @brief Suspend stream 22060ec20d0SMilanka Ringwald * @param local_seid 22123edb87eSMilanka Ringwald * @return status ERROR_CODE_SUCCESS if succesful, otherwise ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, ERROR_CODE_COMMAND_DISALLOWED 222747ec646SMilanka Ringwald */ 2234ccacc40SMilanka Ringwald uint8_t avdtp_source_suspend(uint16_t avdtp_cid, uint8_t local_seid); 22460ec20d0SMilanka Ringwald 2258d93ed25SMilanka Ringwald /** 2268d93ed25SMilanka Ringwald * @brief Create stream endpoint 2278d93ed25SMilanka Ringwald * @param sep_type AVDTP_SOURCE or AVDTP_SINK, see avdtp.h 2288d93ed25SMilanka Ringwald * @param media_type AVDTP_AUDIO, AVDTP_VIDEO or AVDTP_MULTIMEDIA, see avdtp.h 2298d93ed25SMilanka Ringwald * @return pointer to newly created stream endpoint, or NULL if allocation failed 2308d93ed25SMilanka Ringwald */ 231747ec646SMilanka Ringwald avdtp_stream_endpoint_t * avdtp_source_create_stream_endpoint(avdtp_sep_type_t sep_type, avdtp_media_type_t media_type); 232747ec646SMilanka Ringwald 2338d93ed25SMilanka Ringwald /** 23417ddf501SMatthias Ringwald * @brief Unregister stream endpoint and free it's memory 23517ddf501SMatthias Ringwald * @param stream_endpoint created by avdtp_sink_create_stream_endpoint 23617ddf501SMatthias Ringwald */ 23717ddf501SMatthias Ringwald void avdtp_source_finalize_stream_endpoint(avdtp_stream_endpoint_t * stream_endpoint); 23817ddf501SMatthias Ringwald 23917ddf501SMatthias Ringwald /** 2403790661cSMatthias Ringwald * @brief Send media packet 24148ce193cSMilanka Ringwald * @param avdtp_cid AVDTP channel identifier. 2423790661cSMatthias Ringwald * @param local_seid ID of a local stream endpoint. 2433790661cSMatthias Ringwald * @param packet 2443790661cSMatthias Ringwald * @param size 2453790661cSMatthias Ringwald * @return status 2463790661cSMatthias Ringwald */ 2473790661cSMatthias Ringwald uint8_t avdtp_source_stream_send_media_packet(uint16_t avdtp_cid, uint8_t local_seid, const uint8_t * packet, uint16_t size); 2483790661cSMatthias Ringwald 2493790661cSMatthias Ringwald /** 2503790661cSMatthias Ringwald * @brief Send media payload including RTP header 25148ce193cSMilanka Ringwald * @param avdtp_cid AVDTP channel identifier. 2523790661cSMatthias Ringwald * @param local_seid ID of a local stream endpoint. 2533790661cSMatthias Ringwald * @param marker 25442780893SMatthias Ringwald * @param timestamp in sample rate units 2553790661cSMatthias Ringwald * @param payload 2563790661cSMatthias Ringwald * @param size 2573790661cSMatthias Ringwald * @return status 2583790661cSMatthias Ringwald */ 259*43a6ebd4SMilanka Ringwald uint8_t avdtp_source_stream_send_media_payload_rtp(uint16_t avdtp_cid, uint8_t local_seid, uint8_t marker, uint32_t timestamp, 26042780893SMatthias Ringwald const uint8_t *payload, uint16_t size); 2613790661cSMatthias Ringwald 2623790661cSMatthias Ringwald /** 2638d93ed25SMilanka 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. 26448ce193cSMilanka Ringwald * @param avdtp_cid AVDTP channel identifier. 2658d93ed25SMilanka Ringwald * @param local_seid ID of a local stream endpoint. 2668d93ed25SMilanka Ringwald */ 2678d93ed25SMilanka Ringwald void avdtp_source_stream_endpoint_request_can_send_now(uint16_t avddp_cid, uint8_t local_seid); 2688d93ed25SMilanka Ringwald 2694cd630d9SMilanka Ringwald /** 2704cd630d9SMilanka Ringwald * @brief Return maximal media payload size, does not include media header. 27148ce193cSMilanka Ringwald * @param avdtp_cid AVDTP channel identifier. 2724cd630d9SMilanka Ringwald * @param local_seid ID of a local stream endpoint. 2734cd630d9SMilanka Ringwald */ 2744cd630d9SMilanka Ringwald int avdtp_max_media_payload_size(uint16_t avdtp_cid, uint8_t local_seid); 2754cd630d9SMilanka Ringwald 27657fb24ffSMatthias Ringwald /** 2776a737fb6SMatthias Ringwald * @brief Register media configuration validator. Can reject insuitable configuration or report stream endpoint as currently busy 2786a737fb6SMatthias Ringwald * @note validator has to return AVDTP error codes like: AVDTP_ERROR_CODE_SEP_IN_USE or AVDTP_ERROR_CODE_UNSUPPORTED_CONFIGURATION 2796a737fb6SMatthias Ringwald * the callback receives the media configuration in the same format as the existing AVDTP_SUBEVENT_SIGNALING_MEDIA_CODEC_SBC_CONFIGURATION 2806a737fb6SMatthias Ringwald * and similar 2816a737fb6SMatthias Ringwald * @param callback 2826a737fb6SMatthias Ringwald */ 2836a737fb6SMatthias Ringwald void avdtp_source_register_media_config_validator(uint8_t (*callback)(const avdtp_stream_endpoint_t * stream_endpoint, const uint8_t * event, uint16_t size)); 2846a737fb6SMatthias Ringwald 2856a737fb6SMatthias Ringwald /** 28657fb24ffSMatthias Ringwald * @brief De-Init AVDTP Source. 28757fb24ffSMatthias Ringwald */ 28857fb24ffSMatthias Ringwald void avdtp_source_deinit(void); 28957fb24ffSMatthias 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