3737
3838#if CIRCUITPY_AUDIOPWMIO || CIRCUITPY_AUDIOBUSIO
3939
40- #define AUDIO_DMA_CHANNEL_COUNT NUM_DMA_CHANNELS
41-
4240void audio_dma_reset (void ) {
43- for (size_t channel = 0 ; channel < AUDIO_DMA_CHANNEL_COUNT ; channel ++ ) {
41+ for (size_t channel = 0 ; channel < NUM_DMA_CHANNELS ; channel ++ ) {
4442 if (MP_STATE_PORT (playing_audio )[channel ] == NULL ) {
4543 continue ;
4644 }
@@ -171,6 +169,7 @@ void audio_dma_load_next_block(audio_dma_t *dma) {
171169 !dma_channel_is_busy (dma -> channel [1 ])) {
172170 // No data has been read, and both DMA channels have now finished, so it's safe to stop.
173171 audio_dma_stop (dma );
172+ dma -> playing_in_progress = false;
174173 } else {
175174 // Set channel trigger to ourselves so we don't keep going.
176175 dma_channel_hw_t * c = & dma_hw -> ch [dma_channel ];
@@ -318,14 +317,22 @@ audio_dma_result audio_dma_setup_playback(audio_dma_t *dma,
318317 irq_set_mask_enabled (1 << DMA_IRQ_0 , true);
319318 }
320319
320+ dma -> playing_in_progress = true;
321321 dma_channel_start (dma -> channel [0 ]);
322322
323323 return AUDIO_DMA_OK ;
324324}
325325
326326void audio_dma_stop (audio_dma_t * dma ) {
327327 // Disable our interrupts.
328- dma_hw -> inte0 &= ~((1 << dma -> channel [0 ]) | (1 << dma -> channel [1 ]));
328+ uint32_t channel_mask = 0 ;
329+ if (dma -> channel [0 ] < NUM_DMA_CHANNELS ) {
330+ channel_mask |= 1 << dma -> channel [0 ];
331+ }
332+ if (dma -> channel [1 ] < NUM_DMA_CHANNELS ) {
333+ channel_mask |= 1 << dma -> channel [1 ];
334+ }
335+ dma_hw -> inte0 &= ~channel_mask ;
329336 irq_set_mask_enabled (1 << DMA_IRQ_0 , false);
330337
331338 // Run any remaining audio tasks because we remove ourselves from
@@ -334,6 +341,10 @@ void audio_dma_stop(audio_dma_t *dma) {
334341
335342 for (size_t i = 0 ; i < 2 ; i ++ ) {
336343 size_t channel = dma -> channel [i ];
344+ if (channel == NUM_DMA_CHANNELS ) {
345+ // Channel not in use.
346+ continue ;
347+ }
337348
338349 dma_channel_config c = dma_channel_get_default_config (dma -> channel [i ]);
339350 channel_config_set_enable (& c , false);
@@ -357,6 +368,7 @@ void audio_dma_stop(audio_dma_t *dma) {
357368 MP_STATE_PORT (playing_audio )[channel ] = NULL ;
358369 dma -> channel [i ] = NUM_DMA_CHANNELS ;
359370 }
371+ dma -> playing_in_progress = false;
360372
361373 // Hold onto our buffers.
362374}
@@ -381,7 +393,7 @@ void audio_dma_resume(audio_dma_t *dma) {
381393}
382394
383395bool audio_dma_get_paused (audio_dma_t * dma ) {
384- if (dma -> channel [0 ] >= AUDIO_DMA_CHANNEL_COUNT ) {
396+ if (dma -> channel [0 ] >= NUM_DMA_CHANNELS ) {
385397 return false;
386398 }
387399 uint32_t control = dma_hw -> ch [dma -> channel [0 ]].ctrl_trig ;
@@ -408,12 +420,7 @@ bool audio_dma_get_playing(audio_dma_t *dma) {
408420 if (dma -> channel [0 ] == NUM_DMA_CHANNELS ) {
409421 return false;
410422 }
411- if (!dma_channel_is_busy (dma -> channel [0 ]) &&
412- !dma_channel_is_busy (dma -> channel [1 ])) {
413- return false;
414- }
415-
416- return true;
423+ return dma -> playing_in_progress ;
417424}
418425
419426// WARN(tannewt): DO NOT print from here, or anything it calls. Printing calls
0 commit comments