1 /* 2 * Copyright (C) 2023 BlueKitchen GmbH 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. Neither the name of the copyright holders nor the names of 14 * contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 4. Any redistribution, use, or modification is done solely for 17 * personal benefit and not for any commercial purpose or for 18 * monetary gain. 19 * 20 * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS 21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN 24 * GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 26 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 27 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 28 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 29 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 30 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * 33 * Please inquire about commercial licensing options at 34 * [email protected] 35 * 36 */ 37 38 39 #ifndef BTSTACK_SAMPLE_RATE_COMPENSATION_H_ 40 #define BTSTACK_SAMPLE_RATE_COMPENSATION_H_ 41 42 #include <stdint.h> 43 44 #if defined __cplusplus 45 extern "C" { 46 #endif 47 48 #define FLOAT_TO_Q15(a) ((signed)((a)*(UINT16_C(1)<<15)+0.5f)) 49 #define FLOAT_TO_Q8(a) ((signed)((a)*(UINT16_C(1)<<8)+0.5f)) 50 #define FLOAT_TO_Q7(a) ((signed)((a)*(UINT16_C(1)<<7)+0.5f)) 51 52 #define Q16_TO_FLOAT(a) ((float)(a)/(UINT32_C(1)<<16)) 53 #define Q15_TO_FLOAT(a) ((float)(a)/(UINT32_C(1)<<15)) 54 #define Q8_TO_FLOAT(a) ((float)(a)/(UINT32_C(1)<<8)) 55 #define Q7_TO_FLOAT(a) ((float)(a)/(UINT32_C(1)<<7)) 56 57 //#define DEBUG_RATIO_CALCULATION 58 59 typedef struct { 60 uint32_t count; // 17bit are usable to count samples, recommended for max 96kHz 61 uint32_t last; // time stamp of last measurement 62 uint32_t rate_state; // unsigned Q17.8 63 uint32_t ratio_state; // unsigned Q16.16 64 uint32_t constant_playback_sample_rate; // playback sample rate if no real one is available 65 #ifdef DEBUG_RATIO_CALCULATION 66 double sample_rate; 67 double ratio; 68 #endif 69 } btstack_sample_rate_compensation_t; 70 71 void btstack_sample_rate_compensation_reset( btstack_sample_rate_compensation_t *self, uint32_t timestamp_ms ); 72 void btstack_sample_rate_compensation_init( btstack_sample_rate_compensation_t *self, uint32_t timestamp_ms, uint32_t sample_rate, uint32_t ratioQ15 ); 73 uint32_t btstack_sample_rate_compensation_update( btstack_sample_rate_compensation_t *self, uint32_t timestamp_ms, uint32_t samples, uint32_t playback_sample_rate ); 74 75 #if defined __cplusplus 76 } 77 #endif 78 79 #endif /* BTSTACK_SAMPLE_RATE_COMPENSATION_H_ */ 80