Merge pull request #2375 from jepler/mp3-hardfault

MP3File: Bug fixes
This commit is contained in:
Scott Shawcroft 2019-12-12 10:14:11 -08:00 committed by GitHub
commit bf8796bca4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 33 additions and 22 deletions

View File

@ -151,10 +151,13 @@ void common_hal_audiomp3_mp3file_construct(audiomp3_mp3file_obj_t* self,
self->channel_count = fi.nChans; self->channel_count = fi.nChans;
self->frame_buffer_size = fi.outputSamps*sizeof(int16_t); self->frame_buffer_size = fi.outputSamps*sizeof(int16_t);
if ((intptr_t)buffer & 1) {
buffer += 1; buffer_size -= 1;
}
if (buffer_size >= 2 * self->frame_buffer_size) { if (buffer_size >= 2 * self->frame_buffer_size) {
self->len = buffer_size / 2 / self->frame_buffer_size * self->frame_buffer_size; self->len = buffer_size / 2 / self->frame_buffer_size * self->frame_buffer_size;
self->buffers[0] = buffer; self->buffers[0] = (int16_t*)(void*)buffer;
self->buffers[1] = buffer + self->len; self->buffers[1] = (int16_t*)(void*)buffer + self->len;
} else { } else {
self->len = 2 * self->frame_buffer_size; self->len = 2 * self->frame_buffer_size;
self->buffers[0] = m_malloc(self->len, false); self->buffers[0] = m_malloc(self->len, false);
@ -218,6 +221,7 @@ void audiomp3_mp3file_reset_buffer(audiomp3_mp3file_obj_t* self,
f_lseek(&self->file->fp, 0); f_lseek(&self->file->fp, 0);
self->inbuf_offset = self->inbuf_length; self->inbuf_offset = self->inbuf_length;
self->eof = 0; self->eof = 0;
self->other_channel = -1;
mp3file_update_inbuf(self); mp3file_update_inbuf(self);
mp3file_find_sync_word(self); mp3file_find_sync_word(self);
} }
@ -227,17 +231,25 @@ audioio_get_buffer_result_t audiomp3_mp3file_get_buffer(audiomp3_mp3file_obj_t*
uint8_t channel, uint8_t channel,
uint8_t** bufptr, uint8_t** bufptr,
uint32_t* buffer_length) { uint32_t* buffer_length) {
if (!self->inbuf) {
return GET_BUFFER_ERROR;
}
if (!single_channel) { if (!single_channel) {
channel = 0; channel = 0;
} }
uint16_t channel_read_count = self->channel_read_count[channel]++; *bufptr = (uint8_t*)(self->buffers[self->buffer_index] + channel);
bool need_more_data = self->read_count++ == channel_read_count;
*bufptr = self->buffers[self->buffer_index] + channel;
*buffer_length = self->frame_buffer_size; *buffer_length = self->frame_buffer_size;
if (need_more_data) { if (channel == self->other_channel) {
*bufptr = (uint8_t*)(self->buffers[self->other_buffer_index] + channel);
self->other_channel = -1;
return GET_BUFFER_MORE_DATA;
}
self->other_channel = 1-channel;
self->other_buffer_index = self->buffer_index;
self->buffer_index = !self->buffer_index; self->buffer_index = !self->buffer_index;
int16_t *buffer = (int16_t *)(void *)self->buffers[self->buffer_index]; int16_t *buffer = (int16_t *)(void *)self->buffers[self->buffer_index];
@ -251,7 +263,6 @@ audioio_get_buffer_result_t audiomp3_mp3file_get_buffer(audiomp3_mp3file_obj_t*
if (err) { if (err) {
return GET_BUFFER_DONE; return GET_BUFFER_DONE;
} }
}
return GET_BUFFER_MORE_DATA; return GET_BUFFER_MORE_DATA;
} }

View File

@ -39,7 +39,7 @@ typedef struct {
uint8_t* inbuf; uint8_t* inbuf;
uint32_t inbuf_length; uint32_t inbuf_length;
uint32_t inbuf_offset; uint32_t inbuf_offset;
uint8_t* buffers[2]; int16_t* buffers[2];
uint32_t len; uint32_t len;
uint32_t frame_buffer_size; uint32_t frame_buffer_size;
@ -50,8 +50,8 @@ typedef struct {
uint8_t channel_count; uint8_t channel_count;
bool eof; bool eof;
uint16_t read_count; int8_t other_channel;
uint16_t channel_read_count[2]; int8_t other_buffer_index;
} audiomp3_mp3file_obj_t; } audiomp3_mp3file_obj_t;
// These are not available from Python because it may be called in an interrupt. // These are not available from Python because it may be called in an interrupt.