diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 85366856..5a46b8fe 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -3,8 +3,11 @@ sc_usb_audio Change Log 6.15.1 ------ + - ADDED: Ability to offset DAC data from ADC data. Useful if ADC and DAC do not agree + on TDM formats as on the xCORE-200-MC-AUDIO board. See I2S_ADC_TO_DAC_SAMP_OFFSET - RESOLVED: DAC data mis-alignment issue in TDM slave mode + 6.15.0 ------ - CHANGE: Removed 32kHz sample-rate support when PDM microphones enabled (lib_mic_array diff --git a/module_usb_audio/audio.xc b/module_usb_audio/audio.xc index e33166f7..ac1b3168 100755 --- a/module_usb_audio/audio.xc +++ b/module_usb_audio/audio.xc @@ -106,6 +106,12 @@ extern void device_reboot(void); #define MAX_DIVIDE (MAX_DIVIDE_48) #endif +/* Useful for correcting a difference in sample clock polarity between DAC and ADC */ +#ifndef I2S_ADC_TO_DAC_SAMP_OFFSET +#define I2S_ADC_TO_DAC_SAMP_OFFSET 0 +#endif + + #ifndef CODEC_MASTER static inline void doI2SClocks(unsigned divide) { @@ -656,7 +662,7 @@ 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) { - p_i2s_dac[index++] <: bitrev(samplesOut[(frameCount)+i]); + p_i2s_dac[index++] <: bitrev(samplesOut[((frameCount+I2S_ADC_TO_DAC_SAMP_OFFSET)&(I2S_CHANS_PER_FRAME-1))+i]); } #endif @@ -761,7 +767,7 @@ 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) { - p_i2s_dac[index++] <: bitrev(samplesOut[frameCount+i]); + p_i2s_dac[index++] <: bitrev(samplesOut[(frameCount+i+I2S_ADC_TO_DAC_SAMP_OFFSET)&(I2S_CHANS_PER_FRAME-1)]); } #endif