@@ -159,9 +159,13 @@ static void audio_dma_load_next_block(audio_dma_t *dma, size_t buffer_idx) {
159
159
!dma_channel_is_busy (dma -> channel [1 ])) {
160
160
// No data has been read, and both DMA channels have now finished, so it's safe to stop.
161
161
audio_dma_stop (dma );
162
+ dma -> dma_result = AUDIO_DMA_OK ;
163
+ return ;
162
164
}
163
165
}
164
166
}
167
+ // Enable the channel so that it can be played.
168
+ dma_hw -> ch [dma_channel ].al1_ctrl |= DMA_CH1_CTRL_TRIG_EN_BITS ;
165
169
dma -> dma_result = AUDIO_DMA_OK ;
166
170
}
167
171
@@ -495,18 +499,26 @@ static void dma_callback_fun(void *arg) {
495
499
496
500
// Load the blocks for the requested channels.
497
501
uint32_t channel = 0 ;
502
+ size_t filled_count = 0 ;
498
503
while (channels_to_load_mask ) {
499
504
if (channels_to_load_mask & 1 ) {
500
505
if (dma -> channel [0 ] == channel ) {
501
506
audio_dma_load_next_block (dma , 0 );
507
+ filled_count ++ ;
502
508
}
503
509
if (dma -> channel [1 ] == channel ) {
504
510
audio_dma_load_next_block (dma , 1 );
511
+ filled_count ++ ;
505
512
}
506
513
}
507
514
channels_to_load_mask >>= 1 ;
508
515
channel ++ ;
509
516
}
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
+ }
510
522
}
511
523
512
524
void __not_in_flash_func (isr_dma_0 )(void ) {
@@ -524,6 +536,8 @@ void __not_in_flash_func(isr_dma_0)(void) {
524
536
audio_dma_t * dma = MP_STATE_PORT (playing_audio )[i ];
525
537
// Record all channels whose DMA has completed; they need loading.
526
538
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 ;
527
541
background_callback_add (& dma -> callback , dma_callback_fun , (void * )dma );
528
542
}
529
543
if (MP_STATE_PORT (background_pio_read )[i ] != NULL ) {
0 commit comments