4040#include < arm_math.h>
4141
4242// DMAMEM __attribute__((aligned(32)))
43- static uint32_t i2s_rx_buffer[AUDIO_BLOCK_SAMPLES]; // good for 16-bit audio samples coming in from teh AIC. 32-bit transfers will need this to be bigger .
43+ static uint64_t i2s_rx_buffer[AUDIO_BLOCK_SAMPLES]; // Two 32-bit transfers per sample .
4444audio_block_f32_t * AudioInputI2S_F32::block_left_f32 = NULL ;
4545audio_block_f32_t * AudioInputI2S_F32::block_right_f32 = NULL ;
4646uint16_t AudioInputI2S_F32::block_offset = 0 ;
@@ -60,7 +60,7 @@ int AudioInputI2S_F32::audio_block_samples = AUDIO_BLOCK_SAMPLES;
6060// #define I2S_BUFFER_TO_USE_BYTES (AudioOutputI2S_F32::audio_block_samples*2*sizeof(i2s_rx_buffer[0]))
6161
6262void AudioInputI2S_F32::begin (void ) {
63- bool transferUsing32bit = false ;
63+ bool transferUsing32bit = true ; // be official, although this is not cared about
6464 begin (transferUsing32bit);
6565}
6666
@@ -78,19 +78,19 @@ void AudioInputI2S_F32::begin(bool transferUsing32bit) {
7878
7979#if defined(KINETISK)
8080 CORE_PIN13_CONFIG = PORT_PCR_MUX (4 ); // pin 13, PTC5, I2S0_RXD0
81- dma.TCD ->SADDR = (void *)((uint32_t )&I2S0_RDR0 + 2 ); // From Teensy Audio Library...but why "+ 2" (Chip 2020-10-31 )
81+ dma.TCD ->SADDR = (void *)((uint32_t )&I2S0_RDR0 + 0 ); // take the full 32 bit (not just upper half )
8282 dma.TCD ->SOFF = 0 ;
83- dma.TCD ->ATTR = DMA_TCD_ATTR_SSIZE (1 ) | DMA_TCD_ATTR_DSIZE (1 );
84- dma.TCD ->NBYTES_MLNO = 2 ;
83+ dma.TCD ->ATTR = DMA_TCD_ATTR_SSIZE (2 ) | DMA_TCD_ATTR_DSIZE (2 );
84+ dma.TCD ->NBYTES_MLNO = 4 ;
8585 dma.TCD ->SLAST = 0 ;
8686 dma.TCD ->DADDR = i2s_rx_buffer;
87- dma.TCD ->DOFF = 2 ;
87+ dma.TCD ->DOFF = 4 ;
8888 // dma.TCD->CITER_ELINKNO = sizeof(i2s_rx_buffer) / 2; //original from Teensy Audio Library
89- dma.TCD ->CITER_ELINKNO = I2S_BUFFER_TO_USE_BYTES / 2 ;
89+ dma.TCD ->CITER_ELINKNO = I2S_BUFFER_TO_USE_BYTES / 4 ;
9090 // dma.TCD->DLASTSGA = -sizeof(i2s_rx_buffer); //original from Teensy Audio Library
9191 dma.TCD ->DLASTSGA = -I2S_BUFFER_TO_USE_BYTES;
9292 // dma.TCD->BITER_ELINKNO = sizeof(i2s_rx_buffer) / 2; //original from Teensy Audio Library
93- dma.TCD ->BITER_ELINKNO = I2S_BUFFER_TO_USE_BYTES / 2 ;
93+ dma.TCD ->BITER_ELINKNO = I2S_BUFFER_TO_USE_BYTES / 4 ;
9494 dma.TCD ->CSR = DMA_TCD_CSR_INTHALF | DMA_TCD_CSR_INTMAJOR;
9595 dma.triggerAtHardwareEvent (DMAMUX_SOURCE_I2S0_RX);
9696
@@ -101,19 +101,19 @@ void AudioInputI2S_F32::begin(bool transferUsing32bit) {
101101 CORE_PIN8_CONFIG = 3 ; // 1:RX_DATA0
102102 IOMUXC_SAI1_RX_DATA0_SELECT_INPUT = 2 ;
103103
104- dma.TCD ->SADDR = (void *)((uint32_t )&I2S1_RDR0 + 2 );
104+ dma.TCD ->SADDR = (void *)((uint32_t )&I2S1_RDR0 + 0 );
105105 dma.TCD ->SOFF = 0 ;
106- dma.TCD ->ATTR = DMA_TCD_ATTR_SSIZE (1 ) | DMA_TCD_ATTR_DSIZE (1 );
107- dma.TCD ->NBYTES_MLNO = 2 ;
106+ dma.TCD ->ATTR = DMA_TCD_ATTR_SSIZE (2 ) | DMA_TCD_ATTR_DSIZE (2 );
107+ dma.TCD ->NBYTES_MLNO = 4 ;
108108 dma.TCD ->SLAST = 0 ;
109109 dma.TCD ->DADDR = i2s_rx_buffer;
110- dma.TCD ->DOFF = 2 ;
110+ dma.TCD ->DOFF = 4 ;
111111 // dma.TCD->CITER_ELINKNO = sizeof(i2s_rx_buffer) / 2; //original from Teensy Audio Library
112- dma.TCD ->CITER_ELINKNO = I2S_BUFFER_TO_USE_BYTES / 2 ;
112+ dma.TCD ->CITER_ELINKNO = I2S_BUFFER_TO_USE_BYTES / 4 ;
113113 // dma.TCD->DLASTSGA = -sizeof(i2s_rx_buffer); //original from Teensy Audio Library
114114 dma.TCD ->DLASTSGA = -I2S_BUFFER_TO_USE_BYTES;
115115 // dma.TCD->BITER_ELINKNO = sizeof(i2s_rx_buffer) / 2; //original from Teensy Audio Library
116- dma.TCD ->BITER_ELINKNO = I2S_BUFFER_TO_USE_BYTES / 2 ;
116+ dma.TCD ->BITER_ELINKNO = I2S_BUFFER_TO_USE_BYTES / 4 ;
117117 dma.TCD ->CSR = DMA_TCD_CSR_INTHALF | DMA_TCD_CSR_INTMAJOR;
118118 dma.triggerAtHardwareEvent (DMAMUX_SOURCE_SAI1_RX);
119119
@@ -265,7 +265,7 @@ void AudioInputI2S_F32::begin(bool transferUsing32bit) {
265265void AudioInputI2S_F32::isr (void )
266266{
267267 uint32_t daddr, offset;
268- const int16_t *src, *end;
268+ const int32_t *src, *end;
269269 // int16_t *dest_left, *dest_right;
270270 // audio_block_t *left, *right;
271271 float32_t *dest_left_f32, *dest_right_f32;
@@ -283,16 +283,16 @@ void AudioInputI2S_F32::isr(void)
283283 // need to remove data from the second half
284284 // src = (int16_t *)&i2s_rx_buffer[AUDIO_BLOCK_SAMPLES/2]; //original Teensy Audio Library
285285 // end = (int16_t *)&i2s_rx_buffer[AUDIO_BLOCK_SAMPLES]; //original Teensy Audio Library
286- src = (int16_t *)&i2s_rx_buffer[audio_block_samples/2 ];
287- end = (int16_t *)&i2s_rx_buffer[audio_block_samples];
286+ src = (int32_t *)&i2s_rx_buffer[audio_block_samples/2 ];
287+ end = (int32_t *)&i2s_rx_buffer[audio_block_samples];
288288 update_counter++; // let's increment the counter here to ensure that we get every ISR resulting in audio
289289 if (AudioInputI2S_F32::update_responsibility) AudioStream_F32::update_all ();
290290 } else {
291291 // DMA is receiving to the second half of the buffer
292292 // need to remove data from the first half
293- src = (int16_t *)&i2s_rx_buffer[0 ];
293+ src = (int32_t *)&i2s_rx_buffer[0 ];
294294 // end = (int16_t *)&i2s_rx_buffer[AUDIO_BLOCK_SAMPLES/2]; //original Teensy Audio Library
295- end = (int16_t *)&i2s_rx_buffer[audio_block_samples/2 ];
295+ end = (int32_t *)&i2s_rx_buffer[audio_block_samples/2 ];
296296 }
297297 left_f32 = AudioInputI2S_F32::block_left_f32;
298298 right_f32 = AudioInputI2S_F32::block_right_f32;
@@ -480,8 +480,8 @@ void AudioInputI2S_F32::scale_i32_to_f32( float32_t *p_i32, float32_t *p_f32, in
480480 if (!out_f32) return ;
481481
482482 // scale the float values so that the maximum possible audio values span -1.0 to + 1.0
483- // scale_i32_to_f32(out_f32->data, out_f32->data, audio_block_samples);
484- scale_i16_to_f32 (out_f32->data , out_f32->data , audio_block_samples);
483+ scale_i32_to_f32 (out_f32->data , out_f32->data , audio_block_samples);
484+ // scale_i16_to_f32(out_f32->data, out_f32->data, audio_block_samples);
485485
486486 // prepare to transmit by setting the update_counter (which helps tell if data is skipped or out-of-order)
487487 out_f32->id = update_counter;
@@ -564,16 +564,16 @@ void AudioInputI2Sslave_F32::begin(void)
564564#if defined(KINETISK)
565565 CORE_PIN13_CONFIG = PORT_PCR_MUX (4 ); // pin 13, PTC5, I2S0_RXD0
566566
567- dma.TCD ->SADDR = (void *)((uint32_t )&I2S0_RDR0 + 2 );
567+ dma.TCD ->SADDR = (void *)((uint32_t )&I2S0_RDR0 + 0 );
568568 dma.TCD ->SOFF = 0 ;
569- dma.TCD ->ATTR = DMA_TCD_ATTR_SSIZE (1 ) | DMA_TCD_ATTR_DSIZE (1 );
570- dma.TCD ->NBYTES_MLNO = 2 ;
569+ dma.TCD ->ATTR = DMA_TCD_ATTR_SSIZE (2 ) | DMA_TCD_ATTR_DSIZE (2 );
570+ dma.TCD ->NBYTES_MLNO = 4 ;
571571 dma.TCD ->SLAST = 0 ;
572572 dma.TCD ->DADDR = i2s_rx_buffer;
573- dma.TCD ->DOFF = 2 ;
574- dma.TCD ->CITER_ELINKNO = sizeof (i2s_rx_buffer) / 2 ;
573+ dma.TCD ->DOFF = 4 ;
574+ dma.TCD ->CITER_ELINKNO = sizeof (i2s_rx_buffer) / 4 ;
575575 dma.TCD ->DLASTSGA = -sizeof (i2s_rx_buffer);
576- dma.TCD ->BITER_ELINKNO = sizeof (i2s_rx_buffer) / 2 ;
576+ dma.TCD ->BITER_ELINKNO = sizeof (i2s_rx_buffer) / 4 ;
577577 dma.TCD ->CSR = DMA_TCD_CSR_INTHALF | DMA_TCD_CSR_INTMAJOR;
578578
579579 dma.triggerAtHardwareEvent (DMAMUX_SOURCE_I2S0_RX);
0 commit comments