@@ -159,9 +159,13 @@ static void audio_dma_load_next_block(audio_dma_t *dma, size_t buffer_idx) {
159159 !dma_channel_is_busy (dma -> channel [1 ])) {
160160 // No data has been read, and both DMA channels have now finished, so it's safe to stop.
161161 audio_dma_stop (dma );
162+ dma -> dma_result = AUDIO_DMA_OK ;
163+ return ;
162164 }
163165 }
164166 }
167+ // Enable the channel so that it can be played.
168+ dma_hw -> ch [dma_channel ].al1_ctrl |= DMA_CH1_CTRL_TRIG_EN_BITS ;
165169 dma -> dma_result = AUDIO_DMA_OK ;
166170}
167171
@@ -495,18 +499,26 @@ static void dma_callback_fun(void *arg) {
495499
496500 // Load the blocks for the requested channels.
497501 uint32_t channel = 0 ;
502+ size_t filled_count = 0 ;
498503 while (channels_to_load_mask ) {
499504 if (channels_to_load_mask & 1 ) {
500505 if (dma -> channel [0 ] == channel ) {
501506 audio_dma_load_next_block (dma , 0 );
507+ filled_count ++ ;
502508 }
503509 if (dma -> channel [1 ] == channel ) {
504510 audio_dma_load_next_block (dma , 1 );
511+ filled_count ++ ;
505512 }
506513 }
507514 channels_to_load_mask >>= 1 ;
508515 channel ++ ;
509516 }
517+ // If we had to fill both buffers, then we missed the trigger from the other
518+ // buffer. So restart the DMA.
519+ if (filled_count == 2 ) {
520+ dma_channel_start (dma -> channel [0 ]);
521+ }
510522}
511523
512524void __not_in_flash_func (isr_dma_0 )(void ) {
@@ -524,6 +536,8 @@ void __not_in_flash_func(isr_dma_0)(void) {
524536 audio_dma_t * dma = MP_STATE_PORT (playing_audio )[i ];
525537 // Record all channels whose DMA has completed; they need loading.
526538 dma -> channels_to_load_mask |= mask ;
539+ // Disable the channel so that we don't play it without filling it.
540+ dma_hw -> ch [i ].al1_ctrl &= ~DMA_CH0_CTRL_TRIG_EN_BITS ;
527541 background_callback_add (& dma -> callback , dma_callback_fun , (void * )dma );
528542 }
529543 if (MP_STATE_PORT (background_pio_read )[i ] != NULL ) {
0 commit comments