@@ -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 ;
0 commit comments