3737#include "supervisor/shared/translate.h"
3838#include "lib/mp3/src/mp3common.h"
3939
40+ #define MAX_BUFFER_LEN (MAX_NSAMP * MAX_NGRAN * MAX_NCHAN * sizeof(int16_t))
41+
4042/** Fill the input buffer if it is less than half full.
4143 *
4244 * Returns true if the input buffer contains any useful data,
@@ -165,7 +167,6 @@ void common_hal_audiomp3_mp3file_construct(audiomp3_mp3file_obj_t* self,
165167 // than the two 4kB output buffers, except that the alignment allows to
166168 // never allocate that extra frame buffer.
167169
168- self -> file = file ;
169170 self -> inbuf_length = 2048 ;
170171 self -> inbuf_offset = self -> inbuf_length ;
171172 self -> inbuf = m_malloc (self -> inbuf_length , false);
@@ -181,40 +182,49 @@ void common_hal_audiomp3_mp3file_construct(audiomp3_mp3file_obj_t* self,
181182 translate ("Couldn't allocate decoder" ));
182183 }
183184
184- mp3file_find_sync_word (self );
185- MP3FrameInfo fi ;
186- if (!mp3file_get_next_frame_info (self , & fi )) {
187- mp_raise_msg (& mp_type_RuntimeError ,
188- translate ("Failed to parse MP3 file" ));
189- }
190-
191- self -> sample_rate = fi .samprate ;
192- self -> channel_count = fi .nChans ;
193- self -> frame_buffer_size = fi .outputSamps * sizeof (int16_t );
194-
195185 if ((intptr_t )buffer & 1 ) {
196186 buffer += 1 ; buffer_size -= 1 ;
197187 }
198- if (buffer_size >= 2 * self -> frame_buffer_size ) {
199- self -> len = buffer_size / 2 / self -> frame_buffer_size * self -> frame_buffer_size ;
188+ if (buffer_size >= 2 * MAX_BUFFER_LEN ) {
200189 self -> buffers [0 ] = (int16_t * )(void * )buffer ;
201- self -> buffers [1 ] = (int16_t * )(void * )buffer + self -> len ;
190+ self -> buffers [1 ] = (int16_t * )(void * )( buffer + MAX_BUFFER_LEN ) ;
202191 } else {
203- self -> len = 2 * self -> frame_buffer_size ;
204- self -> buffers [0 ] = m_malloc (self -> len , false);
192+ self -> buffers [0 ] = m_malloc (MAX_BUFFER_LEN , false);
205193 if (self -> buffers [0 ] == NULL ) {
206194 common_hal_audiomp3_mp3file_deinit (self );
207195 mp_raise_msg (& mp_type_MemoryError ,
208196 translate ("Couldn't allocate first buffer" ));
209197 }
210198
211- self -> buffers [1 ] = m_malloc (self -> len , false);
199+ self -> buffers [1 ] = m_malloc (MAX_BUFFER_LEN , false);
212200 if (self -> buffers [1 ] == NULL ) {
213201 common_hal_audiomp3_mp3file_deinit (self );
214202 mp_raise_msg (& mp_type_MemoryError ,
215203 translate ("Couldn't allocate second buffer" ));
216204 }
217205 }
206+
207+ common_hal_audiomp3_mp3file_set_file (self , file );
208+ }
209+
210+ void common_hal_audiomp3_mp3file_set_file (audiomp3_mp3file_obj_t * self , pyb_file_obj_t * file ) {
211+ self -> file = file ;
212+ f_lseek (& self -> file -> fp , 0 );
213+ self -> inbuf_offset = self -> inbuf_length ;
214+ self -> eof = 0 ;
215+ self -> other_channel = -1 ;
216+ mp3file_update_inbuf (self );
217+ mp3file_find_sync_word (self );
218+ MP3FrameInfo fi ;
219+ if (!mp3file_get_next_frame_info (self , & fi )) {
220+ mp_raise_msg (& mp_type_RuntimeError ,
221+ translate ("Failed to parse MP3 file" ));
222+ }
223+
224+ self -> sample_rate = fi .samprate ;
225+ self -> channel_count = fi .nChans ;
226+ self -> frame_buffer_size = fi .outputSamps * sizeof (int16_t );
227+ self -> len = 2 * self -> frame_buffer_size ;
218228}
219229
220230void common_hal_audiomp3_mp3file_deinit (audiomp3_mp3file_obj_t * self ) {
0 commit comments