@@ -40,27 +40,18 @@ void BoxDAC::logDmaIrqChanges() {
40
40
}
41
41
}
42
42
43
- void BoxDAC::logAudioBuffer () {/*
44
- Log.info("Log audioBuffer=%X", audioBuffer);
45
- Log.info(" dataBuffer=%X", dataBuffer);
46
- Log.info(" *pucBufferStartPtr=%X", buffer->pucBufferStartPtr);
47
- Log.info(" *pucBufferEndPtr=%X", buffer->pucBufferEndPtr);
48
- Log.info(" *pucReadPtr=%X", buffer->pucReadPtr - buffer->pucBufferStartPtr);
49
- Log.info(" *pucWritePtr=%X", buffer->pucWritePtr - buffer->pucBufferStartPtr);
50
- Log.info(" *GetBufferSize()=%X", GetBufferBlockSize(buffer));
51
- Log.info(" ulBufferSize=%X", buffer->ulBufferSize);*/
52
- }
53
-
54
43
void dma_irq () {
55
44
Box.boxDAC .dmaPingPingComplete ();
56
45
}
57
46
58
47
void BoxDAC::begin () {
59
48
Log.info (" Initialize DAC..." );
60
49
audioBuffer.init (dataBuffer, PLAY_BUFFER_SIZE);
50
+ audioBuffer.logState ();
61
51
fillBuffer (25 );
52
+ audioBuffer.logState ();
62
53
63
- uint32_t clock ; // (Num of bytes * STEREO * sampling)
54
+ uint32_t clock ; // (Num of bits * STEREO * sampling)
64
55
clock = 16 *2 *16000 ;
65
56
66
57
MAP_PinTypeI2S (PIN_50, PIN_MODE_4); // I2S Data0 (DIN)
@@ -74,7 +65,6 @@ void BoxDAC::begin() {
74
65
initDACI2C ();
75
66
76
67
Log.info (" DMA" );
77
- logAudioBuffer ();
78
68
79
69
UDMAInit ();
80
70
UDMAChannelSelect (UDMA_CH5_I2S_TX, NULL );
@@ -138,6 +128,9 @@ void BoxDAC::begin() {
138
128
setInterval (0 );
139
129
140
130
Log.info (" sample[0]=%i" , sample[0 ]);
131
+ setVolume (current_volume);
132
+ send (ADDR::PAGE_CONTROL, PAGE::SERIAL_IO);
133
+ send (ADDR_P0_SERIAL::DAC_VOL_CTRL, 0x00 );
141
134
142
135
Log.info (" ...initialized" );
143
136
}
@@ -186,8 +179,7 @@ void BoxDAC::fillBuffer(uint16_t timeoutMs) {
186
179
}
187
180
188
181
void BoxDAC::dmaPingPingComplete () {
189
- if (audioBuffer.isWriting )
190
- return ;
182
+ MAP_I2SIntClear (I2S_BASE, I2S_INT_XDMA);
191
183
192
184
unsigned long intStatus = MAP_uDMAIntStatus ();
193
185
unsigned int bytesReadable = audioBuffer.getBytesReadable ();
@@ -196,6 +188,7 @@ void BoxDAC::dmaPingPingComplete() {
196
188
197
189
dmaIRQcount++;
198
190
if (intStatus & 0x20 ) { // TX IRQ I2S_INT_XDMA?
191
+ // MAP_I2SIntClear(I2S_BASE, I2S_INT_XDMA);
199
192
200
193
tDMAControlTable *pControlTable;
201
194
pControlTable = (tDMAControlTable*)MAP_uDMAControlBaseGet ();
@@ -206,38 +199,33 @@ void BoxDAC::dmaPingPingComplete() {
206
199
unsigned long bufferSize = audioBuffer.getBytesReadableBlock ();
207
200
unsigned long size = bufferSize > I2S_PACKET_SIZE ? I2S_PACKET_SIZE : bufferSize;
208
201
unsigned long elements = size / 2 ;
209
-
210
- if (size == 1 ) {
211
- audioBuffer.updateReadPointer (1 ); // Workaround
212
- }
213
202
size = elements * 2 ;
214
203
215
204
if (MAP_uDMAChannelModeGet (UDMA_CH5_I2S_TX | UDMA_PRI_SELECT) == UDMA_MODE_STOP) {
216
205
// if((pControlTable[ulPrimaryIndexRx].ulControl & UDMA_CHCTL_XFERMODE_M) == 0) {
217
- if (elements<4 ) {
218
- ulPrimaryIndexRxEmpty++;
206
+ if (audioBuffer.noIRQ || elements<I2S_PACKET_ELEMENTS) {
219
207
MAP_uDMAChannelTransferSet (UDMA_CH5_I2S_TX, UDMA_MODE_PINGPONG, (void *)aZeroBuffer, (void *)I2S_TX_DMA_PORT, I2S_PACKET_ELEMENTS);
208
+ ulPrimaryIndexRxEmpty++;
220
209
} else {
221
- ulPrimaryIndexRxFilled++;
222
210
MAP_uDMAChannelTransferSet (UDMA_CH5_I2S_TX, UDMA_MODE_PINGPONG, (void *)audioBuffer.getReadPointer (), (void *)I2S_TX_DMA_PORT, elements);
223
211
audioBuffer.updateReadPointer (size);
212
+ ulPrimaryIndexRxFilled++;
224
213
}
225
214
MAP_uDMAChannelEnable (UDMA_CH5_I2S_TX);
226
215
} else if (MAP_uDMAChannelModeGet (UDMA_CH5_I2S_TX | UDMA_ALT_SELECT) == UDMA_MODE_STOP) {
227
216
// } else if((pControlTable[ulAltIndexRx].ulControl & UDMA_CHCTL_XFERMODE_M) == 0) {
228
- if (elements<0 ) {
229
- ulAltIndexRxEmpty++;
217
+ if (audioBuffer.noIRQ || elements<I2S_PACKET_ELEMENTS) {
230
218
MAP_uDMAChannelTransferSet (UDMA_CH5_I2S_TX|UDMA_ALT_SELECT, UDMA_MODE_PINGPONG, (void *)aZeroBuffer, (void *)I2S_TX_DMA_PORT, I2S_PACKET_ELEMENTS);
219
+ ulAltIndexRxEmpty++;
231
220
} else {
232
- ulAltIndexRxFilled++;
233
221
MAP_uDMAChannelTransferSet (UDMA_CH5_I2S_TX|UDMA_ALT_SELECT, UDMA_MODE_PINGPONG, (void *)audioBuffer.getReadPointer (), (void *)I2S_TX_DMA_PORT, elements);
234
222
audioBuffer.updateReadPointer (size);
223
+ ulAltIndexRxFilled++;
235
224
}
236
225
MAP_uDMAChannelEnable (UDMA_CH5_I2S_TX|UDMA_ALT_SELECT);
237
226
}
238
- MAP_I2SIntClear (I2S_BASE, I2S_INT_XDMA);
239
227
} else {
240
- Log.error (" Unintended intStatus=%X" , intStatus);
228
+ // Log.error("Unintended intStatus=%X", intStatus);
241
229
}
242
230
}
243
231
0 commit comments