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