@@ -39,15 +39,41 @@ static audio_dma_t* audio_dma_state[AUDIO_DMA_CHANNEL_COUNT];
39
39
40
40
// This cannot be in audio_dma_state because it's volatile.
41
41
static volatile bool audio_dma_pending [AUDIO_DMA_CHANNEL_COUNT ];
42
+ static bool audio_dma_shadow_enable [AUDIO_DMA_CHANNEL_COUNT ];
42
43
43
44
uint8_t find_free_audio_dma_channel (void ) {
44
45
uint8_t channel ;
45
46
for (channel = 0 ; channel < AUDIO_DMA_CHANNEL_COUNT ; channel ++ ) {
46
- if (!dma_channel_enabled (channel )) {
47
+ if (!dma_channel_enabled (channel ) && !audio_dma_shadow_enable [channel ]) {
48
+ mp_printf (& mp_plat_print , "find_free_audio_dma_channel() -> %d\n" , channel );
47
49
return channel ;
48
50
}
49
51
}
50
- return channel ;
52
+ return AUDIO_DMA_CHANNEL_COUNT ;
53
+ }
54
+
55
+ void audio_dma_enable_channel (uint8_t channel ) {
56
+ mp_printf (& mp_plat_print , "audio_dma_enable_channel(%d)\n" , channel );
57
+ if (channel >= AUDIO_DMA_CHANNEL_COUNT )
58
+ mp_raise_msg_varg (& mp_type_MemoryError , translate ("Internal error: enable invalid channel %d" ), channel );
59
+ bool real_enable = dma_channel_enabled (channel );
60
+ if (audio_dma_shadow_enable [channel ] != real_enable )
61
+ mp_printf (& mp_plat_print , "audio_dma_shadow mismatch: channel %d: %d vs %d\n" , channel , audio_dma_shadow_enable [channel ], real_enable );
62
+ dma_enable_channel (channel );
63
+ audio_dma_shadow_enable [channel ] = true;
64
+ if (!dma_channel_enabled (channel ))
65
+ mp_raise_msg_varg (& mp_type_MemoryError , translate ("Internal error: channel %d not active after enable" ), channel );
66
+ }
67
+
68
+ void audio_dma_disable_channel (uint8_t channel ) {
69
+ mp_printf (& mp_plat_print , "audio_dma_disable_channel(%d)\n" , channel );
70
+ if (channel >= AUDIO_DMA_CHANNEL_COUNT )
71
+ mp_raise_msg_varg (& mp_type_MemoryError , translate ("Internal error: disable invalid channel %d" ), channel );
72
+ bool real_enable = dma_channel_enabled (channel );
73
+ if (audio_dma_shadow_enable [channel ] != real_enable )
74
+ mp_printf (& mp_plat_print , "audio_dma_shadow mismatch: channel %d: %d vs %d\n" , channel , audio_dma_shadow_enable [channel ], real_enable );
75
+ audio_dma_shadow_enable [channel ] = false;
76
+ dma_disable_channel (channel );
51
77
}
52
78
53
79
void audio_dma_convert_signed (audio_dma_t * dma , uint8_t * buffer , uint32_t buffer_length ,
@@ -106,6 +132,7 @@ void audio_dma_load_next_block(audio_dma_t* dma) {
106
132
dma -> first_descriptor_free = !dma -> first_descriptor_free ;
107
133
108
134
if (get_buffer_result == GET_BUFFER_ERROR ) {
135
+ mp_printf (& mp_plat_print , "%s:%d\n" , __FILE__ , __LINE__ );
109
136
audio_dma_stop (dma );
110
137
return ;
111
138
}
@@ -153,6 +180,7 @@ audio_dma_result audio_dma_setup_playback(audio_dma_t* dma,
153
180
bool output_signed ,
154
181
uint32_t output_register_address ,
155
182
uint8_t dma_trigger_source ) {
183
+ mp_printf (& mp_plat_print , "%s:%d:\n" , __FILE__ , __LINE__ );
156
184
uint8_t dma_channel = find_free_audio_dma_channel ();
157
185
if (dma_channel >= AUDIO_DMA_CHANNEL_COUNT ) {
158
186
return AUDIO_DMA_DMA_BUSY ;
@@ -252,16 +280,19 @@ audio_dma_result audio_dma_setup_playback(audio_dma_t* dma,
252
280
}
253
281
254
282
dma_configure (dma_channel , dma_trigger_source , true);
255
- dma_enable_channel (dma_channel );
283
+ audio_dma_enable_channel (dma_channel );
256
284
257
285
return AUDIO_DMA_OK ;
258
286
}
259
287
260
288
void audio_dma_stop (audio_dma_t * dma ) {
261
- dma_disable_channel (dma -> dma_channel );
262
- disable_event_channel (dma -> event_channel );
289
+ mp_printf (& mp_plat_print , "%s:%d: audio_dma_stop(%d)\n" , __FILE__ , __LINE__ , dma -> dma_channel );
290
+ if (dma -> dma_channel < AUDIO_DMA_CHANNEL_COUNT )
291
+ {
292
+ audio_dma_disable_channel (dma -> dma_channel );
293
+ disable_event_channel (dma -> event_channel );
294
+ }
263
295
MP_STATE_PORT (playing_audio )[dma -> dma_channel ] = NULL ;
264
-
265
296
dma -> dma_channel = AUDIO_DMA_CHANNEL_COUNT ;
266
297
}
267
298
@@ -290,7 +321,8 @@ void audio_dma_reset(void) {
290
321
for (uint8_t i = 0 ; i < AUDIO_DMA_CHANNEL_COUNT ; i ++ ) {
291
322
audio_dma_state [i ] = NULL ;
292
323
audio_dma_pending [i ] = false;
293
- dma_disable_channel (i );
324
+ mp_printf (& mp_plat_print , "%s:%d\n" , __FILE__ , __LINE__ );
325
+ audio_dma_disable_channel (i );
294
326
dma_descriptor (i )-> BTCTRL .bit .VALID = false;
295
327
MP_STATE_PORT (playing_audio )[i ] = NULL ;
296
328
}
@@ -302,6 +334,7 @@ bool audio_dma_get_playing(audio_dma_t* dma) {
302
334
}
303
335
uint32_t status = dma_transfer_status (dma -> dma_channel );
304
336
if ((status & DMAC_CHINTFLAG_TCMPL ) != 0 || (status & DMAC_CHINTFLAG_TERR ) != 0 ) {
337
+ mp_printf (& mp_plat_print , "%s:%d\n" , __FILE__ , __LINE__ );
305
338
audio_dma_stop (dma );
306
339
}
307
340
0 commit comments