Skip to content

Commit fa6885d

Browse files
committed
I2S output was sending 32 bits already, but only 16 were used. Now, send all available precision.
Basically, I re-did jcj83429's pull request, which got outdated, to current code: chipaudette#8
1 parent cce309f commit fa6885d

File tree

1 file changed

+26
-26
lines changed

1 file changed

+26
-26
lines changed

output_i2s_f32.cpp

+26-26
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ uint16_t AudioOutputI2S_F32::block_left_offset = 0;
164164
uint16_t AudioOutputI2S_F32::block_right_offset = 0;
165165
bool AudioOutputI2S_F32::update_responsibility = false;
166166
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];
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

170170
float 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) {
253253
void 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

Comments
 (0)