@@ -151,10 +151,13 @@ void common_hal_audiomp3_mp3file_construct(audiomp3_mp3file_obj_t* self,
151
151
self -> channel_count = fi .nChans ;
152
152
self -> frame_buffer_size = fi .outputSamps * sizeof (int16_t );
153
153
154
+ if ((intptr_t )buffer & 1 ) {
155
+ buffer += 1 ; buffer_size -= 1 ;
156
+ }
154
157
if (buffer_size >= 2 * self -> frame_buffer_size ) {
155
158
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 ;
158
161
} else {
159
162
self -> len = 2 * self -> frame_buffer_size ;
160
163
self -> buffers [0 ] = m_malloc (self -> len , false);
@@ -218,6 +221,7 @@ void audiomp3_mp3file_reset_buffer(audiomp3_mp3file_obj_t* self,
218
221
f_lseek (& self -> file -> fp , 0 );
219
222
self -> inbuf_offset = self -> inbuf_length ;
220
223
self -> eof = 0 ;
224
+ self -> other_channel = -1 ;
221
225
mp3file_update_inbuf (self );
222
226
mp3file_find_sync_word (self );
223
227
}
@@ -227,30 +231,37 @@ audioio_get_buffer_result_t audiomp3_mp3file_get_buffer(audiomp3_mp3file_obj_t*
227
231
uint8_t channel ,
228
232
uint8_t * * bufptr ,
229
233
uint32_t * buffer_length ) {
234
+ if (!self -> inbuf ) {
235
+ return GET_BUFFER_ERROR ;
236
+ }
230
237
if (!single_channel ) {
231
238
channel = 0 ;
232
239
}
233
240
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 );
238
242
* buffer_length = self -> frame_buffer_size ;
239
243
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
+ }
243
249
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 ;
254
265
}
255
266
256
267
return GET_BUFFER_MORE_DATA ;
0 commit comments