partial buffer mgmt fix
This commit is contained in:
parent
f6d7b87bd8
commit
fd71d924d2
@ -214,21 +214,23 @@ audio_dma_result audio_dma_setup_playback(audio_dma_t *dma,
|
||||
if (output_signed != samples_signed) {
|
||||
output_spacing = 1;
|
||||
max_buffer_length /= dma->spacing;
|
||||
dma->first_buffer = (uint8_t *)m_realloc(dma->first_buffer, max_buffer_length);
|
||||
if (dma->first_buffer == NULL) {
|
||||
}
|
||||
|
||||
dma->first_buffer = (uint8_t *)m_realloc(dma->first_buffer, max_buffer_length);
|
||||
if (dma->first_buffer == NULL) {
|
||||
return AUDIO_DMA_MEMORY_ERROR;
|
||||
}
|
||||
dma->first_buffer_free = true;
|
||||
if (!single_buffer) {
|
||||
dma->second_buffer = (uint8_t *)m_realloc(dma->second_buffer, max_buffer_length);
|
||||
if (dma->second_buffer == NULL) {
|
||||
return AUDIO_DMA_MEMORY_ERROR;
|
||||
}
|
||||
dma->first_buffer_free = true;
|
||||
if (!single_buffer) {
|
||||
dma->second_buffer = (uint8_t *)m_realloc(dma->second_buffer, max_buffer_length);
|
||||
if (dma->second_buffer == NULL) {
|
||||
return AUDIO_DMA_MEMORY_ERROR;
|
||||
}
|
||||
}
|
||||
dma->signed_to_unsigned = !output_signed && samples_signed;
|
||||
dma->unsigned_to_signed = output_signed && !samples_signed;
|
||||
}
|
||||
|
||||
dma->signed_to_unsigned = !output_signed && samples_signed;
|
||||
dma->unsigned_to_signed = output_signed && !samples_signed;
|
||||
|
||||
dma->event_channel = 0xff;
|
||||
if (!single_buffer) {
|
||||
dma->second_descriptor = (DmacDescriptor *)m_malloc(sizeof(DmacDescriptor), false);
|
||||
|
@ -71,7 +71,7 @@
|
||||
void i2sout_reset(void) {
|
||||
// Make sure the I2S peripheral is running so we can see if the resources we need are free.
|
||||
#ifdef SAM_D5X_E5X
|
||||
// Connect the clock units to the 2mhz clock. It can't disable without it.
|
||||
// Connect the clock units to the 2MHz clock. It can't disable without it.
|
||||
connect_gclk_to_peripheral(5, I2S_GCLK_ID_0);
|
||||
connect_gclk_to_peripheral(5, I2S_GCLK_ID_1);
|
||||
#endif
|
||||
@ -83,7 +83,7 @@ void i2sout_reset(void) {
|
||||
|
||||
// Make sure the I2S peripheral is running so we can see if the resources we need are free.
|
||||
#ifdef SAM_D5X_E5X
|
||||
// Connect the clock units to the 2mhz clock by default. They can't reset without it.
|
||||
// Connect the clock units to the 2MHz clock by default. They can't reset without it.
|
||||
disconnect_gclk_from_peripheral(5, I2S_GCLK_ID_0);
|
||||
disconnect_gclk_from_peripheral(5, I2S_GCLK_ID_1);
|
||||
|
||||
@ -222,7 +222,6 @@ void common_hal_audiobusio_i2sout_deinit(audiobusio_i2sout_obj_t *self) {
|
||||
reset_pin_number(self->word_select->number);
|
||||
self->word_select = NULL;
|
||||
reset_pin_number(self->data->number);
|
||||
self->data = NULL;
|
||||
}
|
||||
|
||||
void common_hal_audiobusio_i2sout_play(audiobusio_i2sout_obj_t *self,
|
||||
@ -288,7 +287,7 @@ void common_hal_audiobusio_i2sout_play(audiobusio_i2sout_obj_t *self,
|
||||
I2S->TXCTRL.reg = serctrl;
|
||||
#endif
|
||||
|
||||
// The DFLL is always a 48mhz clock
|
||||
// The DFLL is always a 48MHz clock
|
||||
enable_clock_generator(self->gclk, CLOCK_48MHZ, divisor);
|
||||
connect_gclk_to_peripheral(self->gclk, I2S_GCLK_ID_0 + self->clock_unit);
|
||||
|
||||
@ -380,7 +379,7 @@ void common_hal_audiobusio_i2sout_stop(audiobusio_i2sout_obj_t *self) {
|
||||
}
|
||||
#endif
|
||||
disconnect_gclk_from_peripheral(self->gclk, I2S_GCLK_ID_0 + self->clock_unit);
|
||||
disable_clock_generator(self->gclk);
|
||||
disable_gclk(self->gclk);
|
||||
|
||||
#ifdef SAM_D5X_E5X
|
||||
connect_gclk_to_peripheral(5, I2S_GCLK_ID_0 + self->clock_unit);
|
||||
|
@ -135,12 +135,21 @@ void audio_dma_load_next_block(audio_dma_t *dma) {
|
||||
audio_dma_stop(dma);
|
||||
return;
|
||||
}
|
||||
bool busy0 = dma_channel_is_busy(dma->channel[0]);
|
||||
bool busy1 = dma_channel_is_busy(dma->channel[1]);
|
||||
if (busy0 == busy1) {
|
||||
mp_printf(&mp_plat_print, "busy: %d %d\n", busy0, busy1);
|
||||
}
|
||||
|
||||
if (buffer_length < 256) {
|
||||
mp_printf(&mp_plat_print, "%d length: %d\n", dma->first_channel_free, buffer_length);
|
||||
}
|
||||
audio_dma_convert_signed(dma, buffer, buffer_length, &output_buffer, &output_buffer_length);
|
||||
|
||||
// If we don't have an output buffer, save the pointer to first_buffer for use in the single
|
||||
// buffer special case.
|
||||
if (dma->first_buffer == NULL) {
|
||||
mp_printf(&mp_plat_print,"no first buffer\n");
|
||||
dma->first_buffer = output_buffer;
|
||||
}
|
||||
|
||||
@ -210,22 +219,24 @@ audio_dma_result audio_dma_setup_playback(audio_dma_t *dma,
|
||||
dma->sample_spacing > 1 ||
|
||||
(dma->sample_resolution != dma->output_resolution)) {
|
||||
max_buffer_length /= dma->sample_spacing;
|
||||
dma->first_buffer = (uint8_t *)m_realloc(dma->first_buffer, max_buffer_length);
|
||||
if (dma->first_buffer == NULL) {
|
||||
}
|
||||
|
||||
dma->first_buffer = (uint8_t *)m_realloc(dma->first_buffer, max_buffer_length);
|
||||
if (dma->first_buffer == NULL) {
|
||||
return AUDIO_DMA_MEMORY_ERROR;
|
||||
}
|
||||
|
||||
dma->first_buffer_free = true;
|
||||
if (!single_buffer) {
|
||||
dma->second_buffer = (uint8_t *)m_realloc(dma->second_buffer, max_buffer_length);
|
||||
if (dma->second_buffer == NULL) {
|
||||
return AUDIO_DMA_MEMORY_ERROR;
|
||||
}
|
||||
|
||||
dma->first_buffer_free = true;
|
||||
if (!single_buffer) {
|
||||
dma->second_buffer = (uint8_t *)m_realloc(dma->second_buffer, max_buffer_length);
|
||||
if (dma->second_buffer == NULL) {
|
||||
return AUDIO_DMA_MEMORY_ERROR;
|
||||
}
|
||||
}
|
||||
dma->signed_to_unsigned = !output_signed && samples_signed;
|
||||
dma->unsigned_to_signed = output_signed && !samples_signed;
|
||||
}
|
||||
|
||||
dma->signed_to_unsigned = !output_signed && samples_signed;
|
||||
dma->unsigned_to_signed = output_signed && !samples_signed;
|
||||
|
||||
if (output_resolution > 8) {
|
||||
dma->output_size = 2;
|
||||
} else {
|
||||
|
@ -117,7 +117,8 @@ void common_hal_audiobusio_i2sout_construct(audiobusio_i2sout_obj_t *self,
|
||||
}
|
||||
|
||||
// Use the state machine to manage pins.
|
||||
common_hal_rp2pio_statemachine_construct(&self->state_machine,
|
||||
common_hal_rp2pio_statemachine_construct(
|
||||
&self->state_machine,
|
||||
program, program_len,
|
||||
44100 * 32 * 6, // Clock at 44.1 khz to warm the DAC up.
|
||||
NULL, 0,
|
||||
|
Loading…
Reference in New Issue
Block a user