12fd68da2SMatthias Ringwald /* 22fd68da2SMatthias Ringwald * Copyright (C) 2022 BlueKitchen GmbH 32fd68da2SMatthias Ringwald * 42fd68da2SMatthias Ringwald * Redistribution and use in source and binary forms, with or without 52fd68da2SMatthias Ringwald * modification, are permitted provided that the following conditions 62fd68da2SMatthias Ringwald * are met: 72fd68da2SMatthias Ringwald * 82fd68da2SMatthias Ringwald * 1. Redistributions of source code must retain the above copyright 92fd68da2SMatthias Ringwald * notice, this list of conditions and the following disclaimer. 102fd68da2SMatthias Ringwald * 2. Redistributions in binary form must reproduce the above copyright 112fd68da2SMatthias Ringwald * notice, this list of conditions and the following disclaimer in the 122fd68da2SMatthias Ringwald * documentation and/or other materials provided with the distribution. 132fd68da2SMatthias Ringwald * 3. Neither the name of the copyright holders nor the names of 142fd68da2SMatthias Ringwald * contributors may be used to endorse or promote products derived 152fd68da2SMatthias Ringwald * from this software without specific prior written permission. 162fd68da2SMatthias Ringwald * 172fd68da2SMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS 182fd68da2SMatthias Ringwald * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 192fd68da2SMatthias Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 202fd68da2SMatthias Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN 212fd68da2SMatthias Ringwald * GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 222fd68da2SMatthias Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 232fd68da2SMatthias Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 242fd68da2SMatthias Ringwald * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 252fd68da2SMatthias Ringwald * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 262fd68da2SMatthias Ringwald * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 272fd68da2SMatthias Ringwald * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 282fd68da2SMatthias Ringwald * SUCH DAMAGE. 292fd68da2SMatthias Ringwald * 302fd68da2SMatthias Ringwald */ 312fd68da2SMatthias Ringwald 322fd68da2SMatthias Ringwald /** 332fd68da2SMatthias Ringwald * @title LC3 Interface 342fd68da2SMatthias Ringwald * 352fd68da2SMatthias Ringwald * Interface for LC3 implementations 362fd68da2SMatthias Ringwald * 372fd68da2SMatthias Ringwald */ 382fd68da2SMatthias Ringwald 392fd68da2SMatthias Ringwald #ifndef BTSTACK_LC3_H 402fd68da2SMatthias Ringwald #define BTSTACK_LC3_H 412fd68da2SMatthias Ringwald 422fd68da2SMatthias Ringwald #include <stdint.h> 432fd68da2SMatthias Ringwald 442fd68da2SMatthias Ringwald #if defined __cplusplus 452fd68da2SMatthias Ringwald extern "C" { 462fd68da2SMatthias Ringwald #endif 472fd68da2SMatthias Ringwald 482fd68da2SMatthias Ringwald /* API_START */ 492fd68da2SMatthias Ringwald 502fd68da2SMatthias Ringwald typedef enum { 512fd68da2SMatthias Ringwald BTSTACK_LC3_FRAME_DURATION_10000US, 522fd68da2SMatthias Ringwald BTSTACK_LC3_FRAME_DURATION_7500US 532fd68da2SMatthias Ringwald } btstack_lc3_frame_duration_t; 542fd68da2SMatthias Ringwald 552fd68da2SMatthias Ringwald typedef struct { 562fd68da2SMatthias Ringwald 572fd68da2SMatthias Ringwald /** 582fd68da2SMatthias Ringwald * Configure Decoder 592fd68da2SMatthias Ringwald * @param context 602fd68da2SMatthias Ringwald * @param sample_rate 612fd68da2SMatthias Ringwald * @param frame_duration 62da364eecSMatthias Ringwald * @param octets_per_frame 632fd68da2SMatthias Ringwald * @return status 642fd68da2SMatthias Ringwald */ 65da364eecSMatthias Ringwald uint8_t (*configure)(void * context, uint32_t sample_rate, btstack_lc3_frame_duration_t frame_duration, uint16_t octets_per_frame); 662fd68da2SMatthias Ringwald 672fd68da2SMatthias Ringwald /** 682fd68da2SMatthias Ringwald * Get number of octets per LC3 frame for bitrate 692fd68da2SMatthias Ringwald * @param context 702fd68da2SMatthias Ringwald * @param bitrate 712fd68da2SMatthias Ringwald * @return octets_per_frame 722fd68da2SMatthias Ringwald */ 732fd68da2SMatthias Ringwald uint16_t (*get_number_octets_for_bitrate)(void * context, uint32_t bitrate); 742fd68da2SMatthias Ringwald 752fd68da2SMatthias Ringwald /** 762fd68da2SMatthias Ringwald * Get number of samples per LC3 frame 772fd68da2SMatthias Ringwald * @param context 782fd68da2SMatthias Ringwald * @return number of samples 792fd68da2SMatthias Ringwald */ 802fd68da2SMatthias Ringwald uint16_t (*get_number_samples_per_frame)(void * context); 812fd68da2SMatthias Ringwald 822fd68da2SMatthias Ringwald /** 839b947857SMatthias Ringwald * Decode LC3 Frame into signed 16-bit samples 842fd68da2SMatthias Ringwald * @param context 852fd68da2SMatthias Ringwald * @param bytes 862fd68da2SMatthias Ringwald * @param BFI Bad Frame Indication flags 872fd68da2SMatthias Ringwald * @param pcm_out buffer for decoded PCM samples 88ca41a3bdSMatthias Ringwald * @param stride count between two consecutive samples 892fd68da2SMatthias Ringwald * @param BEC_detect Bit Error Detected flag 902fd68da2SMatthias Ringwald * @return status 912fd68da2SMatthias Ringwald */ 92da364eecSMatthias Ringwald uint8_t (*decode_signed_16)(void * context, const uint8_t *bytes, uint8_t BFI, 93ca41a3bdSMatthias Ringwald int16_t* pcm_out, uint16_t stride, uint8_t * BEC_detect); 942fd68da2SMatthias Ringwald 959b947857SMatthias Ringwald /** 969b947857SMatthias Ringwald * Decode LC3 Frame into signed 24-bit samples, sign-extended to 32-bit 979b947857SMatthias Ringwald * @param context 989b947857SMatthias Ringwald * @param bytes 999b947857SMatthias Ringwald * @param BFI Bad Frame Indication flags 1009b947857SMatthias Ringwald * @param pcm_out buffer for decoded PCM samples 1019b947857SMatthias Ringwald * @param stride count between two consecutive samples 1029b947857SMatthias Ringwald * @param BEC_detect Bit Error Detected flag 1039b947857SMatthias Ringwald * @return status 1049b947857SMatthias Ringwald */ 105da364eecSMatthias Ringwald uint8_t (*decode_signed_24)(void * context, const uint8_t *bytes, uint8_t BFI, 1069b947857SMatthias Ringwald int32_t* pcm_out, uint16_t stride, uint8_t * BEC_detect); 1079b947857SMatthias Ringwald 1082fd68da2SMatthias Ringwald } btstack_lc3_decoder_t; 1092fd68da2SMatthias Ringwald 1102fd68da2SMatthias Ringwald typedef struct { 1112fd68da2SMatthias Ringwald /** 1122fd68da2SMatthias Ringwald * Configure Decoder 1132fd68da2SMatthias Ringwald * @param context 1142fd68da2SMatthias Ringwald * @param sample_rate 1152fd68da2SMatthias Ringwald * @param frame_duration 116da364eecSMatthias Ringwald * @param octets_per_frame 1172fd68da2SMatthias Ringwald * @return status 1182fd68da2SMatthias Ringwald */ 119da364eecSMatthias Ringwald uint8_t (*configure)(void * context, uint32_t sample_rate, btstack_lc3_frame_duration_t frame_duration, uint16_t octets_per_frame); 1202fd68da2SMatthias Ringwald 1212fd68da2SMatthias Ringwald /** 1222fd68da2SMatthias Ringwald * Get bitrate from number of octets per LC3 frame 1232fd68da2SMatthias Ringwald * @param context 1242fd68da2SMatthias Ringwald * @param number_of_octets 1252fd68da2SMatthias Ringwald * @return bitrate 1262fd68da2SMatthias Ringwald */ 1272fd68da2SMatthias Ringwald uint32_t (*get_bitrate_for_number_of_octets)(void * context, uint16_t number_of_octets); 1282fd68da2SMatthias Ringwald 1292fd68da2SMatthias Ringwald /** 1302fd68da2SMatthias Ringwald * Get number of samples per LC3 frame 1312fd68da2SMatthias Ringwald * @param context 1322fd68da2SMatthias Ringwald * @return number of samples 1332fd68da2SMatthias Ringwald */ 1342fd68da2SMatthias Ringwald uint16_t (*get_number_samples_per_frame)(void * context); 1352fd68da2SMatthias Ringwald 1362fd68da2SMatthias Ringwald /** 1379b947857SMatthias Ringwald * Encode LC3 Frame with 16-bit signed PCM samples 1382fd68da2SMatthias Ringwald * @param context 1392fd68da2SMatthias Ringwald * @param pcm_in buffer for decoded PCM samples 140ca41a3bdSMatthias Ringwald * @param stride count between two consecutive samples 1412fd68da2SMatthias Ringwald * @param bytes 1422fd68da2SMatthias Ringwald * @return status 1432fd68da2SMatthias Ringwald */ 144da364eecSMatthias Ringwald uint8_t (*encode_signed_16)(void * context, const int16_t* pcm_in, uint16_t stride, uint8_t *bytes); 1459b947857SMatthias Ringwald 1469b947857SMatthias Ringwald /** 1479b947857SMatthias Ringwald * Encode LC3 Frame with 24-bit signed PCM samples, sign-extended to 32 bit 1489b947857SMatthias Ringwald * @param context 1499b947857SMatthias Ringwald * @param pcm_in buffer for decoded PCM samples 1509b947857SMatthias Ringwald * @param stride count between two consecutive samples 1519b947857SMatthias Ringwald * @param bytes 1529b947857SMatthias Ringwald * @return status 1539b947857SMatthias Ringwald */ 154da364eecSMatthias Ringwald uint8_t (*encode_signed_24)(void * context, const int32_t* pcm_in, uint16_t stride, uint8_t *bytes); 1552fd68da2SMatthias Ringwald 1562fd68da2SMatthias Ringwald } btstack_lc3_encoder_t; 1572fd68da2SMatthias Ringwald 158*65113a0cSMatthias Ringwald /** 159*65113a0cSMatthias Ringwald * @brief Map enum to ISO Interval in us 160*65113a0cSMatthias Ringwald * @param frame_duration enum 161*65113a0cSMatthias Ringwald * @return frame_duratoin in us 162*65113a0cSMatthias Ringwald */ 163*65113a0cSMatthias Ringwald uint16_t btstack_lc3_frame_duration_in_us(btstack_lc3_frame_duration_t frame_duration); 164*65113a0cSMatthias Ringwald 165*65113a0cSMatthias Ringwald /** 166*65113a0cSMatthias Ringwald * @bbrief Calculate number of samples per ISO Interval 167*65113a0cSMatthias Ringwald * @param sample_rate 168*65113a0cSMatthias Ringwald * @param frame_duration 169*65113a0cSMatthias Ringwald * @return 170*65113a0cSMatthias Ringwald */ 171*65113a0cSMatthias Ringwald uint16_t btstack_lc3_samples_per_frame(uint32_t sample_rate, btstack_lc3_frame_duration_t frame_duration); 172*65113a0cSMatthias Ringwald 1732fd68da2SMatthias Ringwald /* API_END */ 1742fd68da2SMatthias Ringwald 1752fd68da2SMatthias Ringwald #if defined __cplusplus 1762fd68da2SMatthias Ringwald } 1772fd68da2SMatthias Ringwald #endif 1782fd68da2SMatthias Ringwald #endif // LC3_H 179