From 4263b9c9d42c61f4a03415dbac046ef73398d310 Mon Sep 17 00:00:00 2001 From: louis Date: Wed, 25 Jan 2017 12:50:38 +0000 Subject: [PATCH] Add ability to upsample I2S out (I2S_SAMPLE_FACTOR_OUT). Also fixed new lib_src coeff naming. --- module_usb_audio/audio_io/audio_io.xc | 55 +++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 4 deletions(-) diff --git a/module_usb_audio/audio_io/audio_io.xc b/module_usb_audio/audio_io/audio_io.xc index 9040860a..11c11702 100755 --- a/module_usb_audio/audio_io/audio_io.xc +++ b/module_usb_audio/audio_io/audio_io.xc @@ -80,6 +80,16 @@ static int64_t outputDs3Sum[I2S_DOWNSAMPLE_CHANS_OUT]; #endif // (I2S_DOWNSAMPLE_FACTOR_OUT > 1) #endif // (I2S_DOWNSAMPLE_FACTOR_IN > 1) || (I2S_DOWNSAMPLE_FACTOR_OUT > 1) +#ifndef I2S_UPSAMPLE_FACTOR_OUT +#define I2S_UPSAMPLE_FACTOR_OUT 1 +#endif + +static int outUpsamplingCounter = 0; +#if (I2S_UPSAMPLE_FACTOR_OUT > 1) +#include "src.h" +static int32_t us3OutputDelayLine[I2S_CHANS_DAC][24]; +#endif /* (I2S_UPSAMPLE_FACTOR_OUT > 1) */ + #if (DSD_CHANS_DAC != 0) extern buffered out port:32 p_dsd_dac[DSD_CHANS_DAC]; extern buffered out port:32 p_dsd_clk; @@ -526,6 +536,10 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, memset(&ds3Data.inputDelayLine, 0, sizeof ds3Data); #endif +#if (I2S_UPSAMPLE_FACTOR_OUT > 1) + memset(us3OutputDelayLine, 0, sizeof us3OutputDelayLine); +#endif + unsigned command = DoSampleTransfer(c_out, readBuffNo, underflowWord, i_audMan); #ifdef ADAT_TX @@ -565,6 +579,7 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, while (!syncError) #endif // CODEC_MASTER { + #if (DSD_CHANS_DAC != 0) && (NUM_USB_CHAN_OUT > 0) if(dsdMode == DSD_MODE_NATIVE) { @@ -711,7 +726,7 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, src_ds3_voice_add_final_sample( inputDs3Sum[((frameCount-2)&(I2S_CHANS_PER_FRAME-1))+i], ds3Data.inputDelayLine[((frameCount-2)&(I2S_CHANS_PER_FRAME-1))+i][inDownsamplingCounter], - src_ff3v_ds3_voice_coefs[inDownsamplingCounter], + src_ff3v_fir_coefs[inDownsamplingCounter], samplesIn[readBuffNo][((frameCount-2)&(I2S_CHANS_PER_FRAME-1))]); } else @@ -720,7 +735,7 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, src_ds3_voice_add_sample( inputDs3Sum[((frameCount-2)&(I2S_CHANS_PER_FRAME-1))+i], ds3Data.inputDelayLine[((frameCount-2)&(I2S_CHANS_PER_FRAME-1))+i][inDownsamplingCounter], - src_ff3v_ds3_voice_coefs[inDownsamplingCounter], + src_ff3v_fir_coefs[inDownsamplingCounter], samplesIn[readBuffNo][((frameCount-2)&(I2S_CHANS_PER_FRAME-1))]); } #endif // (I2S_DOWNSAMPLE_FACTOR_IN > 1) @@ -751,6 +766,17 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, /* Output "even" channel to DAC (i.e. left) */ for(int i = 0; i < I2S_CHANS_DAC; i+=I2S_CHANS_PER_FRAME) { +#if (I2S_UPSAMPLE_FACTOR_OUT > 1) + if(outUpsamplingCounter == 0) { + samplesOut[frameCount+i] = src_us3_voice_input_sample(us3OutputDelayLine[i], + src_ff3v_fir_coefs[2], + samplesOut[frameCount+i]); + } else { /* outUpsamplingCounter is 1 or 2 */ + samplesOut[frameCount+i] = src_us3_voice_get_next_sample(us3OutputDelayLine[i], + src_ff3v_fir_coefs[2-outUpsamplingCounter]); + } +#endif /* (I2S_UPSAMPLE_FACTOR_OUT > 1) */ + p_i2s_dac[index++] <: bitrev(samplesOut[frameCount +i]); } #endif @@ -849,7 +875,7 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, src_ds3_voice_add_final_sample( inputDs3Sum[((frameCount-1)&(I2S_CHANS_PER_FRAME-1))+i], ds3Data.inputDelayLine[((frameCount-1)&(I2S_CHANS_PER_FRAME-1))+i][inDownsamplingCounter], - src_ff3v_ds3_voice_coefs[inDownsamplingCounter], + src_ff3v_fir_coefs[inDownsamplingCounter], samplesIn[readBuffNo][((frameCount-1)&(I2S_CHANS_PER_FRAME-1))+i]); } else @@ -858,7 +884,7 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, src_ds3_voice_add_sample( inputDs3Sum[((frameCount-1)&(I2S_CHANS_PER_FRAME-1))+i], ds3Data.inputDelayLine[((frameCount-1)&(I2S_CHANS_PER_FRAME-1))+i][inDownsamplingCounter], - src_ff3v_ds3_voice_coefs[inDownsamplingCounter], + src_ff3v_fir_coefs[inDownsamplingCounter], samplesIn[readBuffNo][((frameCount-1)&(I2S_CHANS_PER_FRAME-1))+i]); } #endif // ((I2S_DOWNSAMPLE_FACTOR_IN > 1) && !I2S_DOWNSAMPLE_MONO_IN) @@ -886,6 +912,18 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, #pragma loop unroll for(int i = 1; i < I2S_CHANS_DAC; i+=I2S_CHANS_PER_FRAME) { +#if (I2S_UPSAMPLE_FACTOR_OUT > 1) + if(outUpsamplingCounter == 0) { + samplesOut[frameCount+i] = src_us3_voice_input_sample(us3OutputDelayLine[i], + src_ff3v_fir_coefs[2], + samplesOut[frameCount+i]); + } else { /* outUpsamplingCounter is 1 or 2 */ + samplesOut[frameCount+i] = src_us3_voice_get_next_sample(us3OutputDelayLine[i], + src_ff3v_fir_coefs[2-outUpsamplingCounter]); + + } +#endif /* (I2S_UPSAMPLE_FACTOR_OUT > 1) */ + p_i2s_dac[index++] <: bitrev(samplesOut[frameCount + i]); } #endif @@ -976,6 +1014,15 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, { ++inDownsamplingCounter; } + + if((I2S_UPSAMPLE_FACTOR_OUT - 1) == outUpsamplingCounter) + { + outUpsamplingCounter = 0; + } + else + { + ++outUpsamplingCounter; + } } } }