Skip to content

Commit eb0ef37

Browse files
authored
Merge pull request #2552 from jepler/samd-stereo-single-dma
samd: When possible, use one DMA channel for stereo AudioOut
2 parents b36b249 + c8f969f commit eb0ef37

File tree

2 files changed

+17
-10
lines changed

2 files changed

+17
-10
lines changed

ports/atmel-samd/audio_dma.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -203,13 +203,13 @@ audio_dma_result audio_dma_setup_playback(audio_dma_t* dma,
203203
if (output_signed != samples_signed) {
204204
output_spacing = 1;
205205
max_buffer_length /= dma->spacing;
206-
dma->first_buffer = (uint8_t*) m_malloc(max_buffer_length, false);
206+
dma->first_buffer = (uint8_t*) m_realloc(dma->first_buffer, max_buffer_length);
207207
if (dma->first_buffer == NULL) {
208208
return AUDIO_DMA_MEMORY_ERROR;
209209
}
210210
dma->first_buffer_free = true;
211211
if (!single_buffer) {
212-
dma->second_buffer = (uint8_t*) m_malloc(max_buffer_length, false);
212+
dma->second_buffer = (uint8_t*) m_realloc(dma->second_buffer, max_buffer_length);
213213
if (dma->second_buffer == NULL) {
214214
return AUDIO_DMA_MEMORY_ERROR;
215215
}

ports/atmel-samd/common-hal/audioio/AudioOut.c

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -397,15 +397,22 @@ void common_hal_audioio_audioout_play(audioio_audioout_obj_t* self,
397397
if (self->right_channel == &pin_PA02) {
398398
right_channel_reg = (uint32_t) &DAC->DATABUF[0].reg;
399399
}
400-
result = audio_dma_setup_playback(&self->left_dma, sample, loop, true, 0,
401-
false /* output unsigned */,
402-
left_channel_reg,
403-
left_channel_trigger);
404-
if (right_channel_reg != 0 && result == AUDIO_DMA_OK) {
405-
result = audio_dma_setup_playback(&self->right_dma, sample, loop, true, 1,
400+
if(right_channel_reg == left_channel_reg + 2 && audiosample_bits_per_sample(sample) == 16) {
401+
result = audio_dma_setup_playback(&self->left_dma, sample, loop, false, 0,
406402
false /* output unsigned */,
407-
right_channel_reg,
408-
right_channel_trigger);
403+
left_channel_reg,
404+
left_channel_trigger);
405+
} else {
406+
result = audio_dma_setup_playback(&self->left_dma, sample, loop, true, 0,
407+
false /* output unsigned */,
408+
left_channel_reg,
409+
left_channel_trigger);
410+
if (right_channel_reg != 0 && result == AUDIO_DMA_OK) {
411+
result = audio_dma_setup_playback(&self->right_dma, sample, loop, true, 1,
412+
false /* output unsigned */,
413+
right_channel_reg,
414+
right_channel_trigger);
415+
}
409416
}
410417
#endif
411418
if (result != AUDIO_DMA_OK) {

0 commit comments

Comments
 (0)