1- // Copyright 2016-2021 XMOS LIMITED.
1+ // Copyright 2016-2023 XMOS LIMITED.
22// This Software is subject to the terms of the XMOS Public Licence: Version 1.
33// General includes
44#include <stdlib.h>
@@ -23,21 +23,21 @@ static void asrc_error(int code)
2323}
2424
2525
26- unsigned asrc_init (const fs_code_t sr_in , const fs_code_t sr_out , asrc_ctrl_t asrc_ctrl [], const unsigned n_channels_per_instance ,
26+ uint64_t asrc_init (const fs_code_t sr_in , const fs_code_t sr_out , asrc_ctrl_t asrc_ctrl [], const unsigned n_channels_per_instance ,
2727 const unsigned n_in_samples , const dither_flag_t dither_on_off )
2828{
2929 unsigned ui ;
3030
3131 ASRCReturnCodes_t ret_code ;
3232
3333 ret_code = ASRC_prepare_coefs ();
34+
3435 if (ret_code != ASRC_NO_ERROR ) asrc_error (10 );
3536
3637 //Check to see if n_channels_per_instance, n_in_samples are reasonable
3738 if ((n_in_samples & 0x1 ) || (n_in_samples < 4 )) asrc_error (100 );
3839 if (n_channels_per_instance < 1 ) asrc_error (101 );
3940
40-
4141 for (ui = 0 ; ui < n_channels_per_instance ; ui ++ )
4242 {
4343 // Set number of channels per instance
@@ -56,47 +56,54 @@ unsigned asrc_init(const fs_code_t sr_in, const fs_code_t sr_out, asrc_ctrl_t as
5656
5757 // Init ASRC instances
5858 ret_code = ASRC_init (& asrc_ctrl [ui ]);
59+
5960 if (ret_code != ASRC_NO_ERROR ) asrc_error (11 );
6061 }
6162
6263 // Sync
6364 // ----
6465 // Sync ASRC. This is just to show that the function works and returns success
66+
6567 for (ui = 0 ; ui < n_channels_per_instance ; ui ++ ) {
6668 ret_code = ASRC_sync (& asrc_ctrl [ui ]);
6769 if (ret_code != ASRC_NO_ERROR ) asrc_error (12 );
6870 }
6971
70- return (asrc_ctrl [0 ].uiFsRatio );
72+ return (uint64_t )(((( uint64_t ) asrc_ctrl [0 ].uiFsRatio ) << 32 ) | asrc_ctrl [ 0 ]. uiFsRatio_lo );
7173}
7274
73- unsigned asrc_process (int * in_buff , int * out_buff , unsigned fs_ratio , asrc_ctrl_t asrc_ctrl []){
75+ unsigned asrc_process (int * in_buff , int * out_buff , uint64_t fs_ratio , asrc_ctrl_t asrc_ctrl []){
7476
7577 int ui , uj ; //General counters
7678 int uiSplCntr ; //Spline counter
7779
7880 // Get the number of channels per instance from first channel
7981 const unsigned n_channels_per_instance = asrc_ctrl [0 ].uiNchannels ;
8082
83+ uint32_t fs_ratio_hi = (uint32_t )(fs_ratio >> 32 );
84+ uint32_t fs_ratio_lo = (uint32_t )(fs_ratio );
8185
8286 for (ui = 0 ; ui < n_channels_per_instance ; ui ++ )
8387 {
8488 // Update Fs Ratio
85- asrc_ctrl [ui ].uiFsRatio = fs_ratio ;
89+ asrc_ctrl [ui ].uiFsRatio = fs_ratio_hi ;
90+ asrc_ctrl [ui ].uiFsRatio_lo = fs_ratio_lo ;
8691
8792#if DO_FS_BOUNDS_CHECK
8893 // Check for bounds of new Fs ratio
89- if ( (fs_ratio < sFsRatioConfigs [asrc_ctrl [ui ].eInFs ][asrc_ctrl [ui ].eOutFs ].uiMinFsRatio ) ||
90- (fs_ratio > sFsRatioConfigs [asrc_ctrl [ui ].eInFs ][asrc_ctrl [ui ].eOutFs ].uiMaxFsRatio ) )
94+ if ( (fs_ratio_hi < sFsRatioConfigs [asrc_ctrl [ui ].eInFs ][asrc_ctrl [ui ].eOutFs ].uiMinFsRatio ) ||
95+ (fs_ratio_hi > sFsRatioConfigs [asrc_ctrl [ui ].eInFs ][asrc_ctrl [ui ].eOutFs ].uiMaxFsRatio ) )
9196 {
92- //debug_printf("Passed = %x, Nominal = 0x%x\n", fs_ratio, sFsRatioConfigs[asrc_ctrl[ui].eInFs][asrc_ctrl[ui].eOutFs].uiNominalFsRatio);
93- fs_ratio = sFsRatioConfigs [asrc_ctrl [ui ].eInFs ][asrc_ctrl [ui ].eOutFs ].uiNominalFsRatio ; //Important to prevent buffer overflow if fs_ratio requests too many samples.
97+ //debug_printf("Passed = %x, Nominal = 0x%x\n", fs_ratio_hi, sFsRatioConfigs[asrc_ctrl[ui].eInFs][asrc_ctrl[ui].eOutFs].uiNominalFsRatio);
98+ fs_ratio_hi = sFsRatioConfigs [asrc_ctrl [ui ].eInFs ][asrc_ctrl [ui ].eOutFs ].uiNominalFsRatio ; //Important to prevent buffer overflow if fs_ratio requests too many samples.
99+ fs_ratio_lo = sFsRatioConfigs [asrc_ctrl [ui ].eInFs ][asrc_ctrl [ui ].eOutFs ].uiNominalFsRatio_lo ;
94100 //debug_printf("!");
95101 }
96102#endif
97103 // Apply shift to time ratio to build integer and fractional parts of time step
98- asrc_ctrl [ui ].iTimeStepInt = fs_ratio >> (sFsRatioConfigs [asrc_ctrl [ui ].eInFs ][asrc_ctrl [ui ].eOutFs ].iFsRatioShift );
99- asrc_ctrl [ui ].uiTimeStepFract = fs_ratio << (32 - sFsRatioConfigs [asrc_ctrl [ui ].eInFs ][asrc_ctrl [ui ].eOutFs ].iFsRatioShift );
104+ asrc_ctrl [ui ].iTimeStepInt = fs_ratio_hi >> (sFsRatioConfigs [asrc_ctrl [ui ].eInFs ][asrc_ctrl [ui ].eOutFs ].iFsRatioShift );
105+ asrc_ctrl [ui ].uiTimeStepFract = fs_ratio_hi << (32 - sFsRatioConfigs [asrc_ctrl [ui ].eInFs ][asrc_ctrl [ui ].eOutFs ].iFsRatioShift );
106+ asrc_ctrl [ui ].uiTimeStepFract |= (uint32_t )(fs_ratio_lo >> sFsRatioConfigs [asrc_ctrl [ui ].eInFs ][asrc_ctrl [ui ].eOutFs ].iFsRatioShift );
100107
101108
102109
0 commit comments