@@ -42,14 +42,24 @@ static audio_dma_t* audio_dma_state[AUDIO_DMA_CHANNEL_COUNT];
4242// This cannot be in audio_dma_state because it's volatile.
4343static volatile bool audio_dma_pending [AUDIO_DMA_CHANNEL_COUNT ];
4444
45- uint8_t find_free_audio_dma_channel (void ) {
45+ static bool audio_dma_allocated [AUDIO_DMA_CHANNEL_COUNT ];
46+
47+ uint8_t audio_dma_allocate_channel (void ) {
4648 uint8_t channel ;
4749 for (channel = 0 ; channel < AUDIO_DMA_CHANNEL_COUNT ; channel ++ ) {
48- if (!dma_channel_enabled (channel )) {
50+ if (!audio_dma_allocated [channel ]) {
51+ audio_dma_allocated [channel ] = true;
4952 return channel ;
5053 }
5154 }
52- return channel ;
55+ return channel ; // i.e., return failure
56+ }
57+
58+ void audio_dma_free_channel (uint8_t channel ) {
59+ assert (channel < AUDIO_DMA_CHANNEL_COUNT );
60+ assert (audio_dma_allocated [channel ]);
61+ audio_dma_disable_channel (channel );
62+ audio_dma_allocated [channel ] = false;
5363}
5464
5565void audio_dma_disable_channel (uint8_t channel ) {
@@ -167,7 +177,7 @@ audio_dma_result audio_dma_setup_playback(audio_dma_t* dma,
167177 bool output_signed ,
168178 uint32_t output_register_address ,
169179 uint8_t dma_trigger_source ) {
170- uint8_t dma_channel = find_free_audio_dma_channel ();
180+ uint8_t dma_channel = audio_dma_allocate_channel ();
171181 if (dma_channel >= AUDIO_DMA_CHANNEL_COUNT ) {
172182 return AUDIO_DMA_DMA_BUSY ;
173183 }
@@ -278,6 +288,7 @@ void audio_dma_stop(audio_dma_t* dma) {
278288 disable_event_channel (dma -> event_channel );
279289 MP_STATE_PORT (playing_audio )[channel ] = NULL ;
280290 audio_dma_state [channel ] = NULL ;
291+ audio_dma_free_channel (dma -> dma_channel );
281292 }
282293 dma -> dma_channel = AUDIO_DMA_CHANNEL_COUNT ;
283294}
@@ -307,6 +318,7 @@ void audio_dma_reset(void) {
307318 for (uint8_t i = 0 ; i < AUDIO_DMA_CHANNEL_COUNT ; i ++ ) {
308319 audio_dma_state [i ] = NULL ;
309320 audio_dma_pending [i ] = false;
321+ audio_dma_allocated [i ] = false;
310322 audio_dma_disable_channel (i );
311323 dma_descriptor (i )-> BTCTRL .bit .VALID = false;
312324 MP_STATE_PORT (playing_audio )[i ] = NULL ;
0 commit comments