Skip to content

Commit bf8796b

Browse files
authored
Merge pull request #2375 from jepler/mp3-hardfault
MP3File: Bug fixes
2 parents b220bef + 1cdac3f commit bf8796b

File tree

2 files changed

+33
-22
lines changed

2 files changed

+33
-22
lines changed

shared-module/audiomp3/MP3File.c

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -151,10 +151,13 @@ void common_hal_audiomp3_mp3file_construct(audiomp3_mp3file_obj_t* self,
151151
self->channel_count = fi.nChans;
152152
self->frame_buffer_size = fi.outputSamps*sizeof(int16_t);
153153

154+
if ((intptr_t)buffer & 1) {
155+
buffer += 1; buffer_size -= 1;
156+
}
154157
if (buffer_size >= 2 * self->frame_buffer_size) {
155158
self->len = buffer_size / 2 / self->frame_buffer_size * self->frame_buffer_size;
156-
self->buffers[0] = buffer;
157-
self->buffers[1] = buffer + self->len;
159+
self->buffers[0] = (int16_t*)(void*)buffer;
160+
self->buffers[1] = (int16_t*)(void*)buffer + self->len;
158161
} else {
159162
self->len = 2 * self->frame_buffer_size;
160163
self->buffers[0] = m_malloc(self->len, false);
@@ -218,6 +221,7 @@ void audiomp3_mp3file_reset_buffer(audiomp3_mp3file_obj_t* self,
218221
f_lseek(&self->file->fp, 0);
219222
self->inbuf_offset = self->inbuf_length;
220223
self->eof = 0;
224+
self->other_channel = -1;
221225
mp3file_update_inbuf(self);
222226
mp3file_find_sync_word(self);
223227
}
@@ -227,30 +231,37 @@ audioio_get_buffer_result_t audiomp3_mp3file_get_buffer(audiomp3_mp3file_obj_t*
227231
uint8_t channel,
228232
uint8_t** bufptr,
229233
uint32_t* buffer_length) {
234+
if (!self->inbuf) {
235+
return GET_BUFFER_ERROR;
236+
}
230237
if (!single_channel) {
231238
channel = 0;
232239
}
233240

234-
uint16_t channel_read_count = self->channel_read_count[channel]++;
235-
bool need_more_data = self->read_count++ == channel_read_count;
236-
237-
*bufptr = self->buffers[self->buffer_index] + channel;
241+
*bufptr = (uint8_t*)(self->buffers[self->buffer_index] + channel);
238242
*buffer_length = self->frame_buffer_size;
239243

240-
if (need_more_data) {
241-
self->buffer_index = !self->buffer_index;
242-
int16_t *buffer = (int16_t *)(void *)self->buffers[self->buffer_index];
244+
if (channel == self->other_channel) {
245+
*bufptr = (uint8_t*)(self->buffers[self->other_buffer_index] + channel);
246+
self->other_channel = -1;
247+
return GET_BUFFER_MORE_DATA;
248+
}
243249

244-
if (!mp3file_find_sync_word(self)) {
245-
return self->eof ? GET_BUFFER_DONE : GET_BUFFER_ERROR;
246-
}
247-
int bytes_left = BYTES_LEFT(self);
248-
uint8_t *inbuf = READ_PTR(self);
249-
int err = MP3Decode(self->decoder, &inbuf, &bytes_left, buffer, 0);
250-
CONSUME(self, BYTES_LEFT(self) - bytes_left);
251-
if (err) {
252-
return GET_BUFFER_DONE;
253-
}
250+
self->other_channel = 1-channel;
251+
self->other_buffer_index = self->buffer_index;
252+
253+
self->buffer_index = !self->buffer_index;
254+
int16_t *buffer = (int16_t *)(void *)self->buffers[self->buffer_index];
255+
256+
if (!mp3file_find_sync_word(self)) {
257+
return self->eof ? GET_BUFFER_DONE : GET_BUFFER_ERROR;
258+
}
259+
int bytes_left = BYTES_LEFT(self);
260+
uint8_t *inbuf = READ_PTR(self);
261+
int err = MP3Decode(self->decoder, &inbuf, &bytes_left, buffer, 0);
262+
CONSUME(self, BYTES_LEFT(self) - bytes_left);
263+
if (err) {
264+
return GET_BUFFER_DONE;
254265
}
255266

256267
return GET_BUFFER_MORE_DATA;

shared-module/audiomp3/MP3File.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ typedef struct {
3939
uint8_t* inbuf;
4040
uint32_t inbuf_length;
4141
uint32_t inbuf_offset;
42-
uint8_t* buffers[2];
42+
int16_t* buffers[2];
4343
uint32_t len;
4444
uint32_t frame_buffer_size;
4545

@@ -50,8 +50,8 @@ typedef struct {
5050
uint8_t channel_count;
5151
bool eof;
5252

53-
uint16_t read_count;
54-
uint16_t channel_read_count[2];
53+
int8_t other_channel;
54+
int8_t other_buffer_index;
5555
} audiomp3_mp3file_obj_t;
5656

5757
// These are not available from Python because it may be called in an interrupt.

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy