@@ -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