All input samples now run through the double buffer to allow for the UserBufferManagement function. samplesIn now 2D to make this a bit easier. DSP code now in app space.

This commit is contained in:
Ross Owen
2016-04-21 18:21:08 +01:00
parent 845ed8f001
commit 8e1b71f70c
2 changed files with 27 additions and 96 deletions

View File

@@ -33,17 +33,13 @@
#include "xc_ptr.h" #include "xc_ptr.h"
#ifdef RUN_DSP_TASK #ifdef RUN_DSP_TASK
#include "dsp.h" #include "xua_dsp.h"
#endif #endif
#include "print.h"
static unsigned samplesOut[NUM_USB_CHAN_OUT]; static unsigned samplesOut[NUM_USB_CHAN_OUT];
/* Two buffers for ADC data to allow for DAC and ADC ports being offset */ /* Two buffers for ADC data to allow for DAC and ADC ports being offset */
static unsigned samplesIn_0[NUM_USB_CHAN_IN]; static unsigned samplesIn[2][NUM_USB_CHAN_IN];
static unsigned samplesIn_1[I2S_CHANS_ADC];
#if (DSD_CHANS_DAC != 0) #if (DSD_CHANS_DAC != 0)
extern buffered out port:32 p_dsd_dac[DSD_CHANS_DAC]; extern buffered out port:32 p_dsd_dac[DSD_CHANS_DAC];
@@ -229,59 +225,13 @@ static inline void TransferAdatTxSamples(chanend c_adat_out, const unsigned samp
} }
#endif #endif
//TODO /* sampsFromUsbToAudio: The sample frame the device has recived from the host and is going to play to the output audio interfaces */
#define NUM_MIC_INPUTS 2 /* sampsFromAudioToUsb: The sample frame that was received from the audio interfaces and that the device is going to send to the host */
#define DSP_BLOCK_SIZE 160 void UserBufferManagement(unsigned sampsFromUsbToAudio[], unsigned sampsFromAudioToUsb[], client dsp_if i_dsp);
/* DSP data double buffered */
int dspBuffer_in_adc[2][DSP_BLOCK_SIZE * NUM_MIC_INPUTS]; // TODO
int dspBuffer_in_usb[2][DSP_BLOCK_SIZE];
int dspBuffer_out_usb[2][DSP_BLOCK_SIZE];
int dspBuffer_out_dac[2][DSP_BLOCK_SIZE];
/* TODO could this be a general channel management call? */
/* usbSamples: the sample frame the device is going to play to the output audio interfaces */
/* adcSamples: the sample frame the device is going to send to the host */
#pragma unsafe arrays
unsigned DspBufferManagement(int dspBuffer_in_adc[], int dspBuffer_in_usb[],
int dspBuffer_out_usb[], int dspBuffer_out_dac[],
unsigned usbSamples[], unsigned adcSamples[],
unsigned sampleCount)
{
/* Add samples to DSP buffers */
dspBuffer_in_adc[(sampleCount * NUM_MIC_INPUTS)] = adcSamples[PDM_MIC_INDEX];
dspBuffer_in_adc[(sampleCount * NUM_MIC_INPUTS) + 1] = adcSamples[PDM_MIC_INDEX+1];
dspBuffer_in_usb[sampleCount] = 0; // TODO
/* Read out of DSP buffer */
adcSamples[0] = dspBuffer_out_usb[sampleCount];
adcSamples[1] = dspBuffer_out_usb[sampleCount];
return sampleCount+1;
}
#pragma unsafe arrays #pragma unsafe arrays
static inline unsigned DoSampleTransfer(chanend c_out, const int readBuffNo, const unsigned underflowWord, client dsp_if i_dsp) static inline unsigned DoSampleTransfer(chanend c_out, const int readBuffNo, const unsigned underflowWord, client dsp_if i_dsp)
{ {
static unsigned dspSampleCount = 0;
static unsigned dspBufferNo = 0;
#if 1
/* Add samples to DSP buffer */
/* TODO need to use samplesIn_1 and samplesIn_0 using readBuffNo */
dspSampleCount = DspBufferManagement(dspBuffer_in_adc[dspBufferNo], dspBuffer_in_usb[dspBufferNo],
dspBuffer_out_usb[dspBufferNo], dspBuffer_out_dac[dspBufferNo],
samplesOut, samplesIn_0, dspSampleCount);
if(dspSampleCount >= DSP_BLOCK_SIZE)
unsafe{
i_dsp.transfer_buffers((int * unsafe) dspBuffer_in_adc[dspBufferNo], (int * unsafe) dspBuffer_in_usb[dspBufferNo],
(int * unsafe) dspBuffer_out_usb[dspBufferNo], (int * unsafe) dspBuffer_out_dac[dspBufferNo]);
dspSampleCount = 0;
dspBufferNo = 1-dspBufferNo;
}
#endif
outuint(c_out, underflowWord); outuint(c_out, underflowWord);
@@ -323,28 +273,19 @@ static inline unsigned DoSampleTransfer(chanend c_out, const int readBuffNo, con
#else #else
inuint(c_out); inuint(c_out);
#endif #endif
UserBufferManagement(samplesOut, samplesIn[readBuffNo], i_dsp);
#if NUM_USB_CHAN_IN > 0 #if NUM_USB_CHAN_IN > 0
#pragma loop unroll #pragma loop unroll
#if NUM_USB_CHAN_IN < I2S_CHANS_ADC
for(int i = 0; i < NUM_USB_CHAN_IN; i++) for(int i = 0; i < NUM_USB_CHAN_IN; i++)
#else
for(int i = 0; i < I2S_CHANS_ADC; i++)
#endif
{ {
if(readBuffNo) outuint(c_out, samplesIn[readBuffNo][i]);
outuint(c_out, samplesIn_1[i]); }
else
outuint(c_out, samplesIn_0[i]);
}
/* Send over the digi channels - no odd buffering required */
#pragma loop unroll
for(int i = I2S_CHANS_ADC; i < NUM_USB_CHAN_IN; i++)
{
outuint(c_out, samplesIn_0[i]);
}
#endif #endif
} }
return 0; return 0;
} }
@@ -481,8 +422,6 @@ static inline void InitPorts(unsigned divide)
#endif #endif
} }
/* I2S delivery thread */ /* I2S delivery thread */
#pragma unsafe arrays #pragma unsafe arrays
unsigned static deliver(chanend c_out, chanend ?c_spd_out, unsigned static deliver(chanend c_out, chanend ?c_spd_out,
@@ -556,7 +495,6 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out,
/* Main Audio I/O loop */ /* Main Audio I/O loop */
while (1) while (1)
{ {
#if (DSD_CHANS_DAC != 0) && (NUM_USB_CHAN_OUT > 0) #if (DSD_CHANS_DAC != 0) && (NUM_USB_CHAN_OUT > 0)
if(dsdMode == DSD_MODE_NATIVE) if(dsdMode == DSD_MODE_NATIVE)
{ {
@@ -680,10 +618,7 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out,
asm volatile("in %0, res[%1]" : "=r"(sample) : "r"(p_i2s_adc[index++])); asm volatile("in %0, res[%1]" : "=r"(sample) : "r"(p_i2s_adc[index++]));
/* Note the use of readBuffNo changes based on frameCount */ /* Note the use of readBuffNo changes based on frameCount */
if(buffIndex) samplesIn[buffIndex][((frameCount-2)&(I2S_CHANS_PER_FRAME-1))+i] = bitrev(sample); // channels 0, 2, 4.. on each line.
samplesIn_1[((frameCount-2)&(I2S_CHANS_PER_FRAME-1))+i] = bitrev(sample); // channels 0, 2, 4.. on each line.
else
samplesIn_0[((frameCount-2)&(I2S_CHANS_PER_FRAME-1))+i] = bitrev(sample);
} }
#endif #endif
@@ -730,22 +665,21 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out,
/* Sync with clockgen */ /* Sync with clockgen */
inuint(c_dig_rx); inuint(c_dig_rx);
/* Note, digi-data we just store in samplesIn_0 - we only double buffer the I2S input data */ /* Note, digi-data we just store in samplesIn[readBuffNo] - we only double buffer the I2S input data */
#endif #endif
#ifdef SPDIF_RX #ifdef SPDIF_RX
asm("ldw %0, dp[g_digData]":"=r"(samplesIn_0[SPDIF_RX_INDEX + 0])); asm("ldw %0, dp[g_digData]" :"=r"(samplesIn[readBuffNo][SPDIF_RX_INDEX + 0]));
asm("ldw %0, dp[g_digData+4]":"=r"(samplesIn_0[SPDIF_RX_INDEX + 1])); asm("ldw %0, dp[g_digData+4]":"=r"(samplesIn[readBuffNo][SPDIF_RX_INDEX + 1]));
#endif #endif
#ifdef ADAT_RX #ifdef ADAT_RX
asm("ldw %0, dp[g_digData+8]":"=r"(samplesIn_0[ADAT_RX_INDEX])); asm("ldw %0, dp[g_digData+8]" :"=r"(samplesIn[readBuffNo][ADAT_RX_INDEX]));
asm("ldw %0, dp[g_digData+12]":"=r"(samplesIn_0[ADAT_RX_INDEX + 1])); asm("ldw %0, dp[g_digData+12]":"=r"(samplesIn[readBuffNo][ADAT_RX_INDEX + 1]));
asm("ldw %0, dp[g_digData+16]":"=r"(samplesIn_0[ADAT_RX_INDEX + 2])); asm("ldw %0, dp[g_digData+16]":"=r"(samplesIn[readBuffNo][ADAT_RX_INDEX + 2]));
asm("ldw %0, dp[g_digData+20]":"=r"(samplesIn_0[ADAT_RX_INDEX + 3])); asm("ldw %0, dp[g_digData+20]":"=r"(samplesIn[readBuffNo][ADAT_RX_INDEX + 3]));
asm("ldw %0, dp[g_digData+24]":"=r"(samplesIn_0[ADAT_RX_INDEX + 4])); asm("ldw %0, dp[g_digData+24]":"=r"(samplesIn[readBuffNo][ADAT_RX_INDEX + 4]));
asm("ldw %0, dp[g_digData+28]":"=r"(samplesIn_0[ADAT_RX_INDEX + 5])); asm("ldw %0, dp[g_digData+28]":"=r"(samplesIn[readBuffNo][ADAT_RX_INDEX + 5]));
asm("ldw %0, dp[g_digData+32]":"=r"(samplesIn_0[ADAT_RX_INDEX + 6])); asm("ldw %0, dp[g_digData+32]":"=r"(samplesIn[readBuffNo][ADAT_RX_INDEX + 6]));
asm("ldw %0, dp[g_digData+36]":"=r"(samplesIn_0[ADAT_RX_INDEX + 7])); asm("ldw %0, dp[g_digData+36]":"=r"(samplesIn[readBuffNo][ADAT_RX_INDEX + 7]));
#endif #endif
#if defined(SPDIF_RX) || defined(ADAT_RX) #if defined(SPDIF_RX) || defined(ADAT_RX)
@@ -764,7 +698,7 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out,
#pragma loop unroll #pragma loop unroll
for(int i = 0; i < NUM_PDM_MICS; i++) for(int i = 0; i < NUM_PDM_MICS; i++)
{ {
c_pdm_pcm :> samplesIn_0[i]; c_pdm_pcm :> samplesIn[readBuffNo][i];
} }
#endif #endif
} }
@@ -780,10 +714,7 @@ unsigned static deliver(chanend c_out, chanend ?c_spd_out,
unsigned sample; unsigned sample;
asm volatile("in %0, res[%1]" : "=r"(sample) : "r"(p_i2s_adc[index++])); asm volatile("in %0, res[%1]" : "=r"(sample) : "r"(p_i2s_adc[index++]));
if(buffIndex) samplesIn[buffIndex][((frameCount-1)&(I2S_CHANS_PER_FRAME-1))+i] = bitrev(sample); // channels 1, 3, 5.. on each line.
samplesIn_1[((frameCount-1)&(I2S_CHANS_PER_FRAME-1))+i] = bitrev(sample); // channels 1, 3, 5.. on each line.
else
samplesIn_0[((frameCount-1)&(I2S_CHANS_PER_FRAME-1))+i] = bitrev(sample); // channels 1, 3, 5.. on each line.
} }
#endif #endif

View File

@@ -3,7 +3,7 @@
#include "devicedefines.h" #include "devicedefines.h"
#include "dfu_interface.h" #include "dfu_interface.h"
#include "dsp.h" #include "xua_dsp.h"
/** The audio driver thread. /** The audio driver thread.
* *