37
37
#include "supervisor/shared/translate.h"
38
38
#include "lib/mp3/src/mp3common.h"
39
39
40
+ #define MAX_BUFFER_LEN (MAX_NSAMP * MAX_NGRAN * MAX_NCHAN * sizeof(int16_t))
41
+
40
42
/** Fill the input buffer if it is less than half full.
41
43
*
42
44
* 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,
165
167
// than the two 4kB output buffers, except that the alignment allows to
166
168
// never allocate that extra frame buffer.
167
169
168
- self -> file = file ;
169
170
self -> inbuf_length = 2048 ;
170
171
self -> inbuf_offset = self -> inbuf_length ;
171
172
self -> inbuf = m_malloc (self -> inbuf_length , false);
@@ -181,40 +182,49 @@ void common_hal_audiomp3_mp3file_construct(audiomp3_mp3file_obj_t* self,
181
182
translate ("Couldn't allocate decoder" ));
182
183
}
183
184
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
-
195
185
if ((intptr_t )buffer & 1 ) {
196
186
buffer += 1 ; buffer_size -= 1 ;
197
187
}
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 ) {
200
189
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 ) ;
202
191
} 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);
205
193
if (self -> buffers [0 ] == NULL ) {
206
194
common_hal_audiomp3_mp3file_deinit (self );
207
195
mp_raise_msg (& mp_type_MemoryError ,
208
196
translate ("Couldn't allocate first buffer" ));
209
197
}
210
198
211
- self -> buffers [1 ] = m_malloc (self -> len , false);
199
+ self -> buffers [1 ] = m_malloc (MAX_BUFFER_LEN , false);
212
200
if (self -> buffers [1 ] == NULL ) {
213
201
common_hal_audiomp3_mp3file_deinit (self );
214
202
mp_raise_msg (& mp_type_MemoryError ,
215
203
translate ("Couldn't allocate second buffer" ));
216
204
}
217
205
}
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 ;
218
228
}
219
229
220
230
void common_hal_audiomp3_mp3file_deinit (audiomp3_mp3file_obj_t * self ) {
0 commit comments