diff options
Diffstat (limited to 'hifi/xaf/hifi-dpf/include/xf-timebase.h')
-rw-r--r-- | hifi/xaf/hifi-dpf/include/xf-timebase.h | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/hifi/xaf/hifi-dpf/include/xf-timebase.h b/hifi/xaf/hifi-dpf/include/xf-timebase.h new file mode 100644 index 00000000..7b27d580 --- /dev/null +++ b/hifi/xaf/hifi-dpf/include/xf-timebase.h @@ -0,0 +1,132 @@ +/******************************************************************************* +* Copyright (C) 2018 Cadence Design Systems, Inc. +* +* Permission is hereby granted, free of charge, to any person obtaining +* a copy of this software and associated documentation files (the +* "Software"), to use this Software with Cadence processor cores only and +* not with any other processors and platforms, subject to +* the following conditions: +* +* The above copyright notice and this permission notice shall be included +* in all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +******************************************************************************/ + +/******************************************************************************* + * xf-timebase.h + * + * Common timebase for deadline-driven scheduler + * + *******************************************************************************/ + +#ifndef __XF_H +#error "xf-timebase.h mustn't be included directly" +#endif + +/******************************************************************************* + * Timebase for deadline-driven scheduler + ******************************************************************************/ +#ifdef XAF_ENABLE_NON_HIKEY +/* ...set internal scheduler frequency as a LCM of all supported sample rates; + * it is in general not a problem to have large number here, however it should + * be noted that maximal-size audio-buffer that we handle, when expressed in + * ticks of this virtual frequency, must not exceed 2**31 (for otherwise + * scheduler timestamp comparison function will misbehave). + */ +#define XF_TIMEBASE_FREQ (4 * 3 * 56448000U) +/* ...add paranoic check considering maximal audio-buffer duration as 0.1 sec */ +C_BUG((u32)(XF_TIMEBASE_FREQ / 10) >= (1 << 31)); +#else +/* ...set internal scheduler frequency as a LCM of all supported sample rates */ +#define XF_TIMEBASE_FREQ 56448000U +#endif +/* ...supported sampling rates */ +C_BUG(XF_TIMEBASE_FREQ % 4000); +C_BUG(XF_TIMEBASE_FREQ % 8000); +C_BUG(XF_TIMEBASE_FREQ % 11025); +C_BUG(XF_TIMEBASE_FREQ % 12000); +C_BUG(XF_TIMEBASE_FREQ % 16000); +C_BUG(XF_TIMEBASE_FREQ % 22050); +C_BUG(XF_TIMEBASE_FREQ % 24000); +C_BUG(XF_TIMEBASE_FREQ % 32000); +C_BUG(XF_TIMEBASE_FREQ % 44100); +C_BUG(XF_TIMEBASE_FREQ % 48000); +C_BUG(XF_TIMEBASE_FREQ % 64000); +C_BUG(XF_TIMEBASE_FREQ % 88200); +C_BUG(XF_TIMEBASE_FREQ % 96000); +C_BUG(XF_TIMEBASE_FREQ % 128000); +C_BUG(XF_TIMEBASE_FREQ % 176400); +C_BUG(XF_TIMEBASE_FREQ % 192000); + +/* ...calculate upsampling factor for given sample rate */ +static inline u32 xf_timebase_factor(u32 sample_rate) +{ + /* ...probably we can tolerate single division */ + switch(sample_rate) + { + case 4000: + return XF_TIMEBASE_FREQ / 4000; + case 8000: + return XF_TIMEBASE_FREQ / 8000; + case 11025: + return XF_TIMEBASE_FREQ / 11025; + case 12000: + return XF_TIMEBASE_FREQ / 11025; + case 16000: + return XF_TIMEBASE_FREQ / 16000; + case 22050: + return XF_TIMEBASE_FREQ / 22050; + case 24000: + return XF_TIMEBASE_FREQ / 24000; + case 32000: + return XF_TIMEBASE_FREQ / 32000; + case 44100: + return XF_TIMEBASE_FREQ / 44100; + case 48000: + return XF_TIMEBASE_FREQ / 48000; + case 64000: + return XF_TIMEBASE_FREQ / 64000; + case 88200: + return XF_TIMEBASE_FREQ / 88200; + case 96000: + return XF_TIMEBASE_FREQ / 96000; + case 128000: + return XF_TIMEBASE_FREQ / 128000; + case 176400: + return XF_TIMEBASE_FREQ / 176400; + case 192000: + return XF_TIMEBASE_FREQ / 192000; + default: + return 0; + } +} + +/* ...core timebase */ +static inline u32 xf_core_timebase(u32 core) +{ + xf_core_data_t *cd = XF_CORE_DATA(core); + + /* ...get local scheduler timebase */ + return xf_sched_timestamp(&cd->sched); +} + +/* ...compare timestamps */ +static inline int xf_time_after(u32 a, u32 b) +{ + return ((s32)(a - b) > 0); +} + +/* ...compare timstamps */ +static inline int xf_time_before(u32 a, u32 b) +{ + return ((s32)(a - b) < 0); +} + |