|
|
|
@ -35,6 +35,8 @@
|
|
|
|
|
#include "py/mpstate.h"
|
|
|
|
|
#include "py/runtime.h"
|
|
|
|
|
|
|
|
|
|
#if CIRCUITPY_AUDIOIO || CIRCUITPY_AUDIOBUSIO
|
|
|
|
|
|
|
|
|
|
static audio_dma_t* audio_dma_state[AUDIO_DMA_CHANNEL_COUNT];
|
|
|
|
|
|
|
|
|
|
// This cannot be in audio_dma_state because it's volatile.
|
|
|
|
@ -50,6 +52,18 @@ uint8_t find_free_audio_dma_channel(void) {
|
|
|
|
|
return channel;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void audio_dma_disable_channel(uint8_t channel) {
|
|
|
|
|
if (channel >= AUDIO_DMA_CHANNEL_COUNT)
|
|
|
|
|
return;
|
|
|
|
|
dma_disable_channel(channel);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void audio_dma_enable_channel(uint8_t channel) {
|
|
|
|
|
if (channel >= AUDIO_DMA_CHANNEL_COUNT)
|
|
|
|
|
return;
|
|
|
|
|
dma_enable_channel(channel);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void audio_dma_convert_signed(audio_dma_t* dma, uint8_t* buffer, uint32_t buffer_length,
|
|
|
|
|
uint8_t** output_buffer, uint32_t* output_buffer_length,
|
|
|
|
|
uint8_t* output_spacing) {
|
|
|
|
@ -252,16 +266,19 @@ audio_dma_result audio_dma_setup_playback(audio_dma_t* dma,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
dma_configure(dma_channel, dma_trigger_source, true);
|
|
|
|
|
dma_enable_channel(dma_channel);
|
|
|
|
|
audio_dma_enable_channel(dma_channel);
|
|
|
|
|
|
|
|
|
|
return AUDIO_DMA_OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void audio_dma_stop(audio_dma_t* dma) {
|
|
|
|
|
dma_disable_channel(dma->dma_channel);
|
|
|
|
|
disable_event_channel(dma->event_channel);
|
|
|
|
|
MP_STATE_PORT(playing_audio)[dma->dma_channel] = NULL;
|
|
|
|
|
|
|
|
|
|
uint8_t channel = dma->dma_channel;
|
|
|
|
|
if (channel < AUDIO_DMA_CHANNEL_COUNT) {
|
|
|
|
|
audio_dma_disable_channel(channel);
|
|
|
|
|
disable_event_channel(dma->event_channel);
|
|
|
|
|
MP_STATE_PORT(playing_audio)[channel] = NULL;
|
|
|
|
|
audio_dma_state[channel] = NULL;
|
|
|
|
|
}
|
|
|
|
|
dma->dma_channel = AUDIO_DMA_CHANNEL_COUNT;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -290,7 +307,7 @@ void audio_dma_reset(void) {
|
|
|
|
|
for (uint8_t i = 0; i < AUDIO_DMA_CHANNEL_COUNT; i++) {
|
|
|
|
|
audio_dma_state[i] = NULL;
|
|
|
|
|
audio_dma_pending[i] = false;
|
|
|
|
|
dma_disable_channel(i);
|
|
|
|
|
audio_dma_disable_channel(i);
|
|
|
|
|
dma_descriptor(i)->BTCTRL.bit.VALID = false;
|
|
|
|
|
MP_STATE_PORT(playing_audio)[i] = NULL;
|
|
|
|
|
}
|
|
|
|
@ -333,3 +350,4 @@ void audio_dma_background(void) {
|
|
|
|
|
audio_dma_pending[i] = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|