Merge pull request #2552 from jepler/samd-stereo-single-dma
samd: When possible, use one DMA channel for stereo AudioOut
This commit is contained in:
commit
eb0ef3726f
@ -203,13 +203,13 @@ audio_dma_result audio_dma_setup_playback(audio_dma_t* dma,
|
|||||||
if (output_signed != samples_signed) {
|
if (output_signed != samples_signed) {
|
||||||
output_spacing = 1;
|
output_spacing = 1;
|
||||||
max_buffer_length /= dma->spacing;
|
max_buffer_length /= dma->spacing;
|
||||||
dma->first_buffer = (uint8_t*) m_malloc(max_buffer_length, false);
|
dma->first_buffer = (uint8_t*) m_realloc(dma->first_buffer, max_buffer_length);
|
||||||
if (dma->first_buffer == NULL) {
|
if (dma->first_buffer == NULL) {
|
||||||
return AUDIO_DMA_MEMORY_ERROR;
|
return AUDIO_DMA_MEMORY_ERROR;
|
||||||
}
|
}
|
||||||
dma->first_buffer_free = true;
|
dma->first_buffer_free = true;
|
||||||
if (!single_buffer) {
|
if (!single_buffer) {
|
||||||
dma->second_buffer = (uint8_t*) m_malloc(max_buffer_length, false);
|
dma->second_buffer = (uint8_t*) m_realloc(dma->second_buffer, max_buffer_length);
|
||||||
if (dma->second_buffer == NULL) {
|
if (dma->second_buffer == NULL) {
|
||||||
return AUDIO_DMA_MEMORY_ERROR;
|
return AUDIO_DMA_MEMORY_ERROR;
|
||||||
}
|
}
|
||||||
|
@ -397,15 +397,22 @@ void common_hal_audioio_audioout_play(audioio_audioout_obj_t* self,
|
|||||||
if (self->right_channel == &pin_PA02) {
|
if (self->right_channel == &pin_PA02) {
|
||||||
right_channel_reg = (uint32_t) &DAC->DATABUF[0].reg;
|
right_channel_reg = (uint32_t) &DAC->DATABUF[0].reg;
|
||||||
}
|
}
|
||||||
result = audio_dma_setup_playback(&self->left_dma, sample, loop, true, 0,
|
if(right_channel_reg == left_channel_reg + 2 && audiosample_bits_per_sample(sample) == 16) {
|
||||||
false /* output unsigned */,
|
result = audio_dma_setup_playback(&self->left_dma, sample, loop, false, 0,
|
||||||
left_channel_reg,
|
|
||||||
left_channel_trigger);
|
|
||||||
if (right_channel_reg != 0 && result == AUDIO_DMA_OK) {
|
|
||||||
result = audio_dma_setup_playback(&self->right_dma, sample, loop, true, 1,
|
|
||||||
false /* output unsigned */,
|
false /* output unsigned */,
|
||||||
right_channel_reg,
|
left_channel_reg,
|
||||||
right_channel_trigger);
|
left_channel_trigger);
|
||||||
|
} else {
|
||||||
|
result = audio_dma_setup_playback(&self->left_dma, sample, loop, true, 0,
|
||||||
|
false /* output unsigned */,
|
||||||
|
left_channel_reg,
|
||||||
|
left_channel_trigger);
|
||||||
|
if (right_channel_reg != 0 && result == AUDIO_DMA_OK) {
|
||||||
|
result = audio_dma_setup_playback(&self->right_dma, sample, loop, true, 1,
|
||||||
|
false /* output unsigned */,
|
||||||
|
right_channel_reg,
|
||||||
|
right_channel_trigger);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (result != AUDIO_DMA_OK) {
|
if (result != AUDIO_DMA_OK) {
|
||||||
|
Loading…
Reference in New Issue
Block a user