This commit is contained in:
louis
2017-01-25 12:52:26 +00:00
3 changed files with 38 additions and 66 deletions

View File

@@ -58,27 +58,9 @@ static unsigned samplesIn[2][MAX(NUM_USB_CHAN_IN, IN_CHAN_COUNT)];
#endif #endif
static int inDownsamplingCounter = 0; static int inDownsamplingCounter = 0;
static int outDownsamplingCounter = 0; #if (I2S_DOWNSAMPLE_FACTOR_IN > 1)
#if (I2S_DOWNSAMPLE_FACTOR_IN > 1) || (I2S_DOWNSAMPLE_FACTOR_OUT > 1)
#include "src.h" #include "src.h"
static union ds3Data
{
long long doubleWordAlignmentEnsured;
/* delay lines = [Number of I2S channels][Number of samples/phases][Taps per phase] */
#if (I2S_DOWNSAMPLE_FACTOR_IN > 1)
int32_t inputDelayLine[I2S_DOWNSAMPLE_CHANS_IN][I2S_DOWNSAMPLE_FACTOR_IN][24];
#endif // (I2S_DOWNSAMPLE_FACTOR_IN > 1) #endif // (I2S_DOWNSAMPLE_FACTOR_IN > 1)
#if (I2S_DOWNSAMPLE_FACTOR_OUT > 1)
int32_t outputDelayLine[I2S_DOWNSAMPLE_CHANS_OUT][I2S_DOWNSAMPLE_FACTOR_OUT][24];
#endif // (I2S_DOWNSAMPLE_FACTOR_OUT > 1)
} ds3Data;
#if (I2S_DOWNSAMPLE_FACTOR_IN > 1)
static int64_t inputDs3Sum[I2S_DOWNSAMPLE_CHANS_IN];
#endif // (I2S_DOWNSAMPLE_FACTOR_IN > 1)
#if (I2S_DOWNSAMPLE_FACTOR_OUT > 1)
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 #ifndef I2S_UPSAMPLE_FACTOR_OUT
#define I2S_UPSAMPLE_FACTOR_OUT 1 #define I2S_UPSAMPLE_FACTOR_OUT 1
@@ -533,8 +515,15 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out,
#endif #endif
#if (I2S_DOWNSAMPLE_FACTOR_IN > 1) #if (I2S_DOWNSAMPLE_FACTOR_IN > 1)
memset(&ds3Data.inputDelayLine, 0, sizeof ds3Data); union ds3Data
#endif {
long long doubleWordAlignmentEnsured;
/* [Number of I2S channels][Number of samples/phases][Taps per phase] */
int32_t inputDelayLine[I2S_DOWNSAMPLE_CHANS_IN][I2S_DOWNSAMPLE_FACTOR_IN][24];
} ds3Data;
memset(&ds3Data.inputDelayLine, 0, sizeof ds3Data.inputDelayLine);
int64_t inputDs3Sum[I2S_DOWNSAMPLE_CHANS_IN];
#endif // (I2S_DOWNSAMPLE_FACTOR_IN > 1)
#if (I2S_UPSAMPLE_FACTOR_OUT > 1) #if (I2S_UPSAMPLE_FACTOR_OUT > 1)
memset(us3OutputDelayLine, 0, sizeof us3OutputDelayLine); memset(us3OutputDelayLine, 0, sizeof us3OutputDelayLine);
@@ -692,7 +681,7 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out,
{ {
memset(&inputDs3Sum, 0, sizeof inputDs3Sum); memset(&inputDs3Sum, 0, sizeof inputDs3Sum);
} }
#endif #endif // (I2S_DOWNSAMPLE_FACTOR_IN > 1)
#if (I2S_CHANS_ADC != 0) #if (I2S_CHANS_ADC != 0)
/* Input previous L sample into L in buffer */ /* Input previous L sample into L in buffer */
index = 0; index = 0;
@@ -759,9 +748,7 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out,
#pragma xta endpoint "i2s_output_l" #pragma xta endpoint "i2s_output_l"
#if (I2S_CHANS_DAC != 0) && (NUM_USB_CHAN_OUT != 0) #if (I2S_CHANS_DAC != 0) && (NUM_USB_CHAN_OUT != 0)
if ((I2S_DOWNSAMPLE_FACTOR_OUT - 1) == outDownsamplingCounter) index = 0;
{
index = 0;
#pragma loop unroll #pragma loop unroll
/* Output "even" channel to DAC (i.e. left) */ /* Output "even" channel to DAC (i.e. left) */
for(int i = 0; i < I2S_CHANS_DAC; i+=I2S_CHANS_PER_FRAME) for(int i = 0; i < I2S_CHANS_DAC; i+=I2S_CHANS_PER_FRAME)
@@ -782,10 +769,10 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out,
#endif #endif
#ifndef CODEC_MASTER #ifndef CODEC_MASTER
/* Clock out the LR Clock, the DAC data and Clock in the next sample into ADC */ /* Clock out the LR Clock, the DAC data and Clock in the next sample into ADC */
doI2SClocks(divide); doI2SClocks(divide);
#endif #endif // !CODEC_MASTER
}
#ifdef ADAT_TX #ifdef ADAT_TX
TransferAdatTxSamples(c_adat_out, samplesOut, adatSmuxMode, 1); TransferAdatTxSamples(c_adat_out, samplesOut, adatSmuxMode, 1);
#endif #endif
@@ -906,9 +893,7 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out,
index = 0; index = 0;
#pragma xta endpoint "i2s_output_r" #pragma xta endpoint "i2s_output_r"
#if (I2S_CHANS_DAC != 0) && (NUM_USB_CHAN_OUT != 0) #if (I2S_CHANS_DAC != 0) && (NUM_USB_CHAN_OUT != 0)
if ((I2S_DOWNSAMPLE_FACTOR_OUT - 1) == outDownsamplingCounter) /* Output "odd" channel to DAC (i.e. right) */
{
/* Output "odd" channel to DAC (i.e. right) */
#pragma loop unroll #pragma loop unroll
for(int i = 1; i < I2S_CHANS_DAC; i+=I2S_CHANS_PER_FRAME) for(int i = 1; i < I2S_CHANS_DAC; i+=I2S_CHANS_PER_FRAME)
{ {
@@ -934,8 +919,15 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out,
} }
else else
{ {
++outDownsamplingCounter; p_i2s_dac[index++] <: bitrev(samplesOut[frameCount + i]);
} }
#endif // (I2S_CHANS_DAC != 0) && (NUM_USB_CHAN_OUT != 0)
#ifndef CODEC_MASTER
doI2SClocks(divide);
#endif // !CODEC_MASTER
} // !dsdMode } // !dsdMode
#if (DSD_CHANS_DAC != 0) && (NUM_USB_CHAN_OUT > 0) #if (DSD_CHANS_DAC != 0) && (NUM_USB_CHAN_OUT > 0)

View File

@@ -134,19 +134,6 @@
#endif #endif
#endif #endif
/**
* @brief Output I2S (host to device) channels can be downsampled by a factor of 3.
*
* Default: 1 i.e. downsampling is disabled.
*/
#ifndef I2S_DOWNSAMPLE_FACTOR_OUT
#define I2S_DOWNSAMPLE_FACTOR_OUT (1)
#else
#if (I2S_DOWNSAMPLE_FACTOR_OUT != 3) && (I2S_DOWNSAMPLE_FACTOR_OUT != 1)
#error Unsupported I2S output downsampling configuration
#endif
#endif
/** /**
* @brief Only downsample one channel per input I2S frame. * @brief Only downsample one channel per input I2S frame.
* *
@@ -170,13 +157,6 @@
#define I2S_DOWNSAMPLE_CHANS_IN I2S_CHANS_ADC #define I2S_DOWNSAMPLE_CHANS_IN I2S_CHANS_ADC
#endif #endif
/**
* @brief Number of output (host to device) I2S channels to downsample.
*
* Default: The number of I2S output channels.
*/
#define I2S_DOWNSAMPLE_CHANS_OUT I2S_CHANS_ADC
/** /**
* @brief Max supported sample frequency for device (Hz). Default: 192000 * @brief Max supported sample frequency for device (Hz). Default: 192000
*/ */

View File

@@ -2320,24 +2320,24 @@ unsigned char cfgDesc_Audio1[] =
AC_LENGTH, AC_LENGTH,
UAC_CS_DESCTYPE_INTERFACE, UAC_CS_DESCTYPE_INTERFACE,
0x01, /* HEADER */ 0x01, /* HEADER */
0x00, 0x01, /* Class spec revision - 1.0 */ 0x00, 0x01, /* bcdADC */
(AC_TOTAL_LENGTH & 0xFF), /* wTotallength (Combined length of this descriptor and all Unit and Terminal Descriptors) */ (AC_TOTAL_LENGTH & 0xFF), /* wTotallength (Combined length of this descriptor and all Unit and Terminal Descriptors) */
(AC_TOTAL_LENGTH >> 8), /* wTotalLength */ (AC_TOTAL_LENGTH >> 8), /* wTotalLength */
STREAMING_INTERFACES, /* Num streaming interfaces */ STREAMING_INTERFACES, /* bInCollection (Num streaming interfaces) */
#if (NUM_USB_CHAN_OUT > 0) #if (NUM_USB_CHAN_OUT > 0)
0x01, /* AudioStreaming interface 1 belongs to AC interface */ 0x01, /* baInterfaceNr(1) AudioStreaming interface 1 belongs to AC interface */
#endif #endif
#if (NUM_USB_CHAN_IN > 0) #if (NUM_USB_CHAN_IN > 0)
(OUTPUT_INTERFACES_A1 + 1), /* AudioStreaming interface 2 belongs to AC interface */ (OUTPUT_INTERFACES_A1 + 1), /* baInterfaceNr(2) AudioStreaming interface 2 belongs to AC interface */
#endif #endif
#if (NUM_USB_CHAN_OUT > 0) #if (NUM_USB_CHAN_OUT > 0)
/* CS_Interface Input Terminal 1 Descriptor - USB streaming Host to Device */ /* CS_Interface Input Terminal 1 Descriptor - USB streaming Host to Device */
0x0C, 0x0C,
UAC_CS_DESCTYPE_INTERFACE, /* UAC_CS_DESCTYPE_INTERFACE */ UAC_CS_DESCTYPE_INTERFACE, /* bDescriptorType (UAC_CS_DESCTYPE_INTERFACE) */
0x02, /* INPUT_TERMINAL */ 0x02, /* bDescriptiorSubtype (INPUT_TERMINAL) */
0x01, /* Terminal ID */ 0x01, /* bTerminalID */
0x01, 0x01, /* Type - streaming */ 0x01, 0x01, /* wTerminalType (USB Streaming) */
0x00, /* Associated terminal - unused */ 0x00, /* Associated terminal - unused */
NUM_USB_CHAN_OUT_FS, /* bNrChannels */ NUM_USB_CHAN_OUT_FS, /* bNrChannels */
0x03, 0x00, /* wChannelConfig */ 0x03, 0x00, /* wChannelConfig */
@@ -2481,16 +2481,16 @@ unsigned char cfgDesc_Audio1[] =
/* Standard As Interface Descriptor (4.5.1) */ /* Standard As Interface Descriptor (4.5.1) */
0x09, 0x09,
0x04, /* INTERFACE */ 0x04, /* INTERFACE */
0x01, /* Interface no */ 0x01, /* bInterfaceNumber */
0x01, /* AlternateSetting */ 0x01, /* bAlternateSetting */
#if (NUM_USB_CHAN_IN == 0) || defined(UAC_FORCE_FEEDBACK_EP) #if (NUM_USB_CHAN_IN == 0) || defined(UAC_FORCE_FEEDBACK_EP)
0x02, /* bNumEndpoints 2: audio EP and feedback EP */ 0x02, /* bNumEndpoints 2: audio EP and feedback EP */
#else #else
0x01, /* bNumEndpoints */ 0x01, /* bNumEndpoints */
#endif #endif
0x01, /* Interface class - AUDIO */ 0x01, /* bInterfaceClas - AUDIO */
0x02, /* subclass - AUDIO_STREAMING */ 0x02, /* bInterfaceSubclass - AUDIO_STREAMING */
0x00, /* Unused */ 0x00, /* bInterface Protocol - Unused */
offsetof(StringDescTable_t, outputInterfaceStr_Audio1)/sizeof(char *), /* iInterface */ offsetof(StringDescTable_t, outputInterfaceStr_Audio1)/sizeof(char *), /* iInterface */
/* Class-Specific AS Interface Descriptor (4.5.2) */ /* Class-Specific AS Interface Descriptor (4.5.2) */