xref: /btstack/src/btstack_lc3.h (revision 65113a0c455b2dca58bc1507bcd217185db35d47)
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