@@ -164,7 +164,7 @@ uint16_t AudioOutputI2S_F32::block_left_offset = 0;
164
164
uint16_t AudioOutputI2S_F32::block_right_offset = 0 ;
165
165
bool AudioOutputI2S_F32::update_responsibility = false ;
166
166
DMAChannel AudioOutputI2S_F32::dma (false );
167
- DMAMEM __attribute__ ((aligned(32 ))) static uint32_t i2s_tx_buffer[AUDIO_BLOCK_SAMPLES];
167
+ DMAMEM __attribute__ ((aligned(32 ))) static uint64_t i2s_tx_buffer[AUDIO_BLOCK_SAMPLES];
168
168
// DMAMEM static int32_t i2s_tx_buffer[2*AUDIO_BLOCK_SAMPLES]; //2 channels at 32-bits per sample. Local "audio_block_samples" should be no larger than global "AUDIO_BLOCK_SAMPLES"
169
169
170
170
float AudioOutputI2S_F32::sample_rate_Hz = AUDIO_SAMPLE_RATE;
@@ -199,18 +199,18 @@ void AudioOutputI2S_F32::begin(bool transferUsing32bit) {
199
199
CORE_PIN22_CONFIG = PORT_PCR_MUX (6 ); // pin 22, PTC1, I2S0_TXD0
200
200
201
201
dma.TCD ->SADDR = i2s_tx_buffer;
202
- dma.TCD ->SOFF = 2 ;
203
- dma.TCD ->ATTR = DMA_TCD_ATTR_SSIZE (1 ) | DMA_TCD_ATTR_DSIZE (1 );
204
- dma.TCD ->NBYTES_MLNO = 2 ;
202
+ dma.TCD ->SOFF = 4 ;
203
+ dma.TCD ->ATTR = DMA_TCD_ATTR_SSIZE (2 ) | DMA_TCD_ATTR_DSIZE (2 );
204
+ dma.TCD ->NBYTES_MLNO = 4 ;
205
205
// dma.TCD->SLAST = -sizeof(i2s_tx_buffer);//orig from Teensy Audio Library 2020-10-31
206
206
dma.TCD ->SLAST = -I2S_BUFFER_TO_USE_BYTES;
207
- dma.TCD ->DADDR = (void *)((uint32_t )&I2S0_TDR0 + 2 );
207
+ dma.TCD ->DADDR = (void *)((uint32_t )&I2S0_TDR0 + 0 );
208
208
dma.TCD ->DOFF = 0 ;
209
209
// dma.TCD->CITER_ELINKNO = sizeof(i2s_tx_buffer) / 2; //orig from Teensy Audio Library 2020-10-31
210
- dma.TCD ->CITER_ELINKNO = I2S_BUFFER_TO_USE_BYTES / 2 ;
210
+ dma.TCD ->CITER_ELINKNO = I2S_BUFFER_TO_USE_BYTES / 4 ;
211
211
dma.TCD ->DLASTSGA = 0 ;
212
212
// dma.TCD->BITER_ELINKNO = sizeof(i2s_tx_buffer) / 2;//orig from Teensy Audio Library 2020-10-31
213
- dma.TCD ->BITER_ELINKNO = I2S_BUFFER_TO_USE_BYTES / 2 ;
213
+ dma.TCD ->BITER_ELINKNO = I2S_BUFFER_TO_USE_BYTES / 4 ;
214
214
dma.TCD ->CSR = DMA_TCD_CSR_INTHALF | DMA_TCD_CSR_INTMAJOR;
215
215
dma.triggerAtHardwareEvent (DMAMUX_SOURCE_I2S0_TX);
216
216
dma.enable (); // newer location of this line in Teensy Audio library
@@ -222,19 +222,19 @@ void AudioOutputI2S_F32::begin(bool transferUsing32bit) {
222
222
CORE_PIN7_CONFIG = 3 ; // 1:TX_DATA0
223
223
224
224
dma.TCD ->SADDR = i2s_tx_buffer;
225
- dma.TCD ->SOFF = 2 ;
226
- dma.TCD ->ATTR = DMA_TCD_ATTR_SSIZE (1 ) | DMA_TCD_ATTR_DSIZE (1 );
227
- dma.TCD ->NBYTES_MLNO = 2 ;
225
+ dma.TCD ->SOFF = 4 ;
226
+ dma.TCD ->ATTR = DMA_TCD_ATTR_SSIZE (2 ) | DMA_TCD_ATTR_DSIZE (2 );
227
+ dma.TCD ->NBYTES_MLNO = 4 ;
228
228
// dma.TCD->SLAST = -sizeof(i2s_tx_buffer);//orig from Teensy Audio Library 2020-10-31
229
229
dma.TCD ->SLAST = -I2S_BUFFER_TO_USE_BYTES;
230
230
dma.TCD ->DOFF = 0 ;
231
231
// dma.TCD->CITER_ELINKNO = sizeof(i2s_tx_buffer) / 2; //orig from Teensy Audio Library 2020-10-31
232
- dma.TCD ->CITER_ELINKNO = I2S_BUFFER_TO_USE_BYTES / 2 ;
232
+ dma.TCD ->CITER_ELINKNO = I2S_BUFFER_TO_USE_BYTES / 4 ;
233
233
dma.TCD ->DLASTSGA = 0 ;
234
234
// dma.TCD->BITER_ELINKNO = sizeof(i2s_tx_buffer) / 2;//orig from Teensy Audio Library 2020-10-31
235
- dma.TCD ->BITER_ELINKNO = I2S_BUFFER_TO_USE_BYTES / 2 ;
235
+ dma.TCD ->BITER_ELINKNO = I2S_BUFFER_TO_USE_BYTES / 4 ;
236
236
dma.TCD ->CSR = DMA_TCD_CSR_INTHALF | DMA_TCD_CSR_INTMAJOR;
237
- dma.TCD ->DADDR = (void *)((uint32_t )&I2S1_TDR0 + 2 );
237
+ dma.TCD ->DADDR = (void *)((uint32_t )&I2S1_TDR0 + 0 );
238
238
dma.triggerAtHardwareEvent (DMAMUX_SOURCE_SAI1_TX);
239
239
dma.enable (); // newer location of this line in Teensy Audio library
240
240
@@ -253,7 +253,7 @@ void AudioOutputI2S_F32::begin(bool transferUsing32bit) {
253
253
void AudioOutputI2S_F32::isr (void )
254
254
{
255
255
#if defined(KINETISK) || defined(__IMXRT1062__)
256
- int16_t *dest;
256
+ int32_t *dest;
257
257
audio_block_f32_t *blockL, *blockR;
258
258
uint32_t saddr, offsetL, offsetR;
259
259
@@ -264,28 +264,28 @@ void AudioOutputI2S_F32::isr(void)
264
264
// DMA is transmitting the first half of the buffer
265
265
// so we must fill the second half
266
266
// dest = (int16_t *)&i2s_tx_buffer[AUDIO_BLOCK_SAMPLES/2]; //original Teensy Audio
267
- dest = (int16_t *)&i2s_tx_buffer[audio_block_samples/2 ]; // this will be diff if we were to do 32-bit samples
267
+ dest = (int32_t *)&i2s_tx_buffer[audio_block_samples/2 ]; // this will be diff if we were to do 32-bit samples
268
268
if (AudioOutputI2S_F32::update_responsibility) AudioStream_F32::update_all ();
269
269
} else {
270
270
// DMA is transmitting the second half of the buffer
271
271
// so we must fill the first half
272
- dest = (int16_t *)i2s_tx_buffer;
272
+ dest = (int32_t *)i2s_tx_buffer;
273
273
}
274
274
275
275
blockL = AudioOutputI2S_F32::block_left_1st;
276
276
blockR = AudioOutputI2S_F32::block_right_1st;
277
277
offsetL = AudioOutputI2S_F32::block_left_offset;
278
278
offsetR = AudioOutputI2S_F32::block_right_offset;
279
279
280
- int16_t *d = dest;
280
+ int32_t *d = dest;
281
281
if (blockL && blockR) {
282
282
// memcpy_tointerleaveLR(dest, blockL->data + offsetL, blockR->data + offsetR);
283
283
// memcpy_tointerleaveLRwLen(dest, blockL->data + offsetL, blockR->data + offsetR, audio_block_samples/2);
284
284
float32_t *pL = blockL->data + offsetL;
285
285
float32_t *pR = blockR->data + offsetR;
286
286
for (int i=0 ; i < audio_block_samples/2 ; i++) {
287
- *d++ = (int16_t ) *pL++;
288
- *d++ = (int16_t ) *pR++; // interleave
287
+ *d++ = (int32_t ) *pL++;
288
+ *d++ = (int32_t ) *pR++; // interleave
289
289
// *d++ = 0;
290
290
// *d++ = 0;
291
291
}
@@ -294,15 +294,15 @@ void AudioOutputI2S_F32::isr(void)
294
294
} else if (blockL) {
295
295
// memcpy_tointerleaveLR(dest, blockL->data + offsetL, blockR->data + offsetR);
296
296
float32_t *pL = blockL->data + offsetL;
297
- for (int i=0 ; i < audio_block_samples / 2 * 2 ; i+=2 ) { *(d+i) = (int16_t ) *pL++; } // interleave
297
+ for (int i=0 ; i < audio_block_samples / 2 * 2 ; i+=2 ) { *(d+i) = (int32_t ) *pL++; } // interleave
298
298
offsetL += audio_block_samples / 2 ;
299
299
} else if (blockR) {
300
300
float32_t *pR = blockR->data + offsetR;
301
- for (int i=0 ; i < audio_block_samples /2 * 2 ; i+=2 ) { *(d+i) = (int16_t ) *pR++; } // interleave
301
+ for (int i=0 ; i < audio_block_samples /2 * 2 ; i+=2 ) { *(d+i) = (int32_t ) *pR++; } // interleave
302
302
offsetR += audio_block_samples / 2 ;
303
303
} else {
304
304
// memset(dest,0,AUDIO_BLOCK_SAMPLES * 2);
305
- memset (dest,0 ,audio_block_samples * 2 );
305
+ memset (dest,0 ,audio_block_samples * 4 );
306
306
return ;
307
307
}
308
308
@@ -664,8 +664,8 @@ void AudioOutputI2S_F32::update(void)
664
664
665
665
// scale F32 to Int32
666
666
// block_f32_scaled = AudioStream_F32::allocate_f32();
667
- // scale_f32_to_i32(block_f32->data, block_f32_scaled->data, audio_block_samples);
668
- scale_f32_to_i16 (block_f32->data , block_f32_scaled->data , audio_block_samples);
667
+ scale_f32_to_i32 (block_f32->data , block_f32_scaled->data , audio_block_samples);
668
+ // scale_f32_to_i16(block_f32->data, block_f32_scaled->data, audio_block_samples);
669
669
670
670
// count++;
671
671
// if (count > 100) {
@@ -709,8 +709,8 @@ void AudioOutputI2S_F32::update(void)
709
709
710
710
// scale F32 to Int32
711
711
// block_f32_scaled = AudioStream_F32::allocate_f32();
712
- // scale_f32_to_i32(block_f32->data, block_f32_scaled->data, audio_block_samples);
713
- scale_f32_to_i16 (block_f32->data , block_f32_scaled->data , audio_block_samples);
712
+ scale_f32_to_i32 (block_f32->data , block_f32_scaled->data , audio_block_samples);
713
+ // scale_f32_to_i16(block_f32->data, block_f32_scaled->data, audio_block_samples);
714
714
715
715
__disable_irq ();
716
716
if (block_right_1st == NULL ) {
0 commit comments