@@ -164,7 +164,7 @@ uint16_t AudioOutputI2S_F32::block_left_offset = 0;
164164uint16_t AudioOutputI2S_F32::block_right_offset = 0 ;
165165bool AudioOutputI2S_F32::update_responsibility = false ;
166166DMAChannel 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];
168168// 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"
169169
170170float AudioOutputI2S_F32::sample_rate_Hz = AUDIO_SAMPLE_RATE;
@@ -199,18 +199,18 @@ void AudioOutputI2S_F32::begin(bool transferUsing32bit) {
199199 CORE_PIN22_CONFIG = PORT_PCR_MUX (6 ); // pin 22, PTC1, I2S0_TXD0
200200
201201 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 ;
205205 // dma.TCD->SLAST = -sizeof(i2s_tx_buffer);//orig from Teensy Audio Library 2020-10-31
206206 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 );
208208 dma.TCD ->DOFF = 0 ;
209209 // 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 ;
211211 dma.TCD ->DLASTSGA = 0 ;
212212 // 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 ;
214214 dma.TCD ->CSR = DMA_TCD_CSR_INTHALF | DMA_TCD_CSR_INTMAJOR;
215215 dma.triggerAtHardwareEvent (DMAMUX_SOURCE_I2S0_TX);
216216 dma.enable (); // newer location of this line in Teensy Audio library
@@ -222,19 +222,19 @@ void AudioOutputI2S_F32::begin(bool transferUsing32bit) {
222222 CORE_PIN7_CONFIG = 3 ; // 1:TX_DATA0
223223
224224 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 ;
228228 // dma.TCD->SLAST = -sizeof(i2s_tx_buffer);//orig from Teensy Audio Library 2020-10-31
229229 dma.TCD ->SLAST = -I2S_BUFFER_TO_USE_BYTES;
230230 dma.TCD ->DOFF = 0 ;
231231 // 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 ;
233233 dma.TCD ->DLASTSGA = 0 ;
234234 // 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 ;
236236 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 );
238238 dma.triggerAtHardwareEvent (DMAMUX_SOURCE_SAI1_TX);
239239 dma.enable (); // newer location of this line in Teensy Audio library
240240
@@ -253,7 +253,7 @@ void AudioOutputI2S_F32::begin(bool transferUsing32bit) {
253253void AudioOutputI2S_F32::isr (void )
254254{
255255#if defined(KINETISK) || defined(__IMXRT1062__)
256- int16_t *dest;
256+ int32_t *dest;
257257 audio_block_f32_t *blockL, *blockR;
258258 uint32_t saddr, offsetL, offsetR;
259259
@@ -264,28 +264,28 @@ void AudioOutputI2S_F32::isr(void)
264264 // DMA is transmitting the first half of the buffer
265265 // so we must fill the second half
266266 // 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
268268 if (AudioOutputI2S_F32::update_responsibility) AudioStream_F32::update_all ();
269269 } else {
270270 // DMA is transmitting the second half of the buffer
271271 // so we must fill the first half
272- dest = (int16_t *)i2s_tx_buffer;
272+ dest = (int32_t *)i2s_tx_buffer;
273273 }
274274
275275 blockL = AudioOutputI2S_F32::block_left_1st;
276276 blockR = AudioOutputI2S_F32::block_right_1st;
277277 offsetL = AudioOutputI2S_F32::block_left_offset;
278278 offsetR = AudioOutputI2S_F32::block_right_offset;
279279
280- int16_t *d = dest;
280+ int32_t *d = dest;
281281 if (blockL && blockR) {
282282 // memcpy_tointerleaveLR(dest, blockL->data + offsetL, blockR->data + offsetR);
283283 // memcpy_tointerleaveLRwLen(dest, blockL->data + offsetL, blockR->data + offsetR, audio_block_samples/2);
284284 float32_t *pL = blockL->data + offsetL;
285285 float32_t *pR = blockR->data + offsetR;
286286 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
289289 // *d++ = 0;
290290 // *d++ = 0;
291291 }
@@ -294,15 +294,15 @@ void AudioOutputI2S_F32::isr(void)
294294 } else if (blockL) {
295295 // memcpy_tointerleaveLR(dest, blockL->data + offsetL, blockR->data + offsetR);
296296 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
298298 offsetL += audio_block_samples / 2 ;
299299 } else if (blockR) {
300300 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
302302 offsetR += audio_block_samples / 2 ;
303303 } else {
304304 // memset(dest,0,AUDIO_BLOCK_SAMPLES * 2);
305- memset (dest,0 ,audio_block_samples * 2 );
305+ memset (dest,0 ,audio_block_samples * 4 );
306306 return ;
307307 }
308308
@@ -664,8 +664,8 @@ void AudioOutputI2S_F32::update(void)
664664
665665 // scale F32 to Int32
666666 // 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);
669669
670670 // count++;
671671 // if (count > 100) {
@@ -709,8 +709,8 @@ void AudioOutputI2S_F32::update(void)
709709
710710 // scale F32 to Int32
711711 // 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);
714714
715715 __disable_irq ();
716716 if (block_right_1st == NULL ) {
0 commit comments