From a9de259963d4a31e206e1622735170585842df34 Mon Sep 17 00:00:00 2001 From: Ross Owen Date: Fri, 30 Jan 2015 16:05:58 +0000 Subject: [PATCH] Initial addition of adat sample transfer into audio core --- module_usb_audio/audio.xc | 63 +++++++++++++++++++++++++++++++++++---- 1 file changed, 57 insertions(+), 6 deletions(-) diff --git a/module_usb_audio/audio.xc b/module_usb_audio/audio.xc index c41f392f..bbea6c34 100755 --- a/module_usb_audio/audio.xc +++ b/module_usb_audio/audio.xc @@ -160,6 +160,53 @@ static inline void doI2SClocks(unsigned divide) } #endif +#define ADAT_NUM_CHANNELS 8 + +#pragma unsafe arrays +static inline void TransferAdatTxSamples(chanend c_adat_data, const unsigned samplesFromHost[], int smux) +{ + /* SMUX 1 : Send 8 channels at sample rate (i.e. 44.1/48kHz) + * SMUX 2 : Send 4 channels at sample rate (i.e. 88.2/96kHz) + * SMUX 4 : Send 2 channels at sample rate (i.e. 176.4/192kHz) + * + * so.. + * + * for (int i = 0; i < ADAT_NUM_CHANNEL/smux; i++) + * { + * outuint(c_adat_data, samplesFromHost[ADAT_TX_INDEX + i]); + * } + * + * Lets un-roll for performance.. + */ + switch (smux) + { + case 1: + #pragma loop unroll + for (int i = 0; i < ADAT_NUM_CHANNELS; i++) + { + outuint(c_adat_data, samplesFromHost[ADAT_TX_INDEX + i]); + } + break; + + case 2: + #pragma loop unroll + for (int i = 0; i < (ADAT_NUM_CHANNELS/2); i++) + { + outuint(c_adat_data, samplesFromHost[ADAT_TX_INDEX + i]); + } + break; + + case 4: + #pragma loop unroll + for (int i = 0; i < (ADAT_NUM_CHANNELS/4); i++) + { + outuint(c_adat_data, samplesFromHost[ADAT_TX_INDEX + i]); + } + break; + } +} + + #pragma unsafe arrays static inline unsigned DoSampleTransfer(chanend c_out, int readBuffNo, unsigned underflowWord) { @@ -388,6 +435,7 @@ static inline void InitPorts(unsigned divide) unsigned static deliver(chanend c_out, chanend ?c_spd_out, #ifdef ADAT_TX chanend c_adat_out, + unsigned adatSmuxMode, #endif unsigned divide, unsigned curSamFreq, #if(defined(SPDIF_RX) || defined(ADAT_RX)) @@ -409,11 +457,6 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, unsigned tmp; unsigned index; -#ifdef ADAT_TX - unsigned adatSmuxMode = 0; -#endif - - #ifdef RAMP_CHECK unsigned prev=0; int started = 0; @@ -653,6 +696,10 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out, #endif } +#if defined ADAT_TX + TransferAdatTxSamples(c_adat_out, samplesOut, adatSmuxMode); +#endif + #ifndef CODEC_MASTER #ifdef I2S_MODE_TDM if(frameCount == (I2S_CHANS_PER_FRAME-2)) @@ -1088,6 +1135,7 @@ chanend ?c_config, chanend ?c) #endif #ifdef ADAT_TX c_adat_out, + adatSmuxMode, #endif divide, curSamFreq, #if defined (ADAT_RX) || defined (SPDIF_RX) @@ -1127,10 +1175,13 @@ chanend ?c_config, chanend ?c) } } } - #ifdef SPDIF /* Notify S/PDIF thread of impending new freq... */ outct(c_spdif_out, XS1_CT_END); +#endif +#ifdef ADAT_TX + /* Notify ADAT Tx thread of impending new freq... */ + outct(c_adat_out, XS1_CT_END); #endif } }