@@ -224,18 +224,40 @@ static void apply_window(float *x) {
224224}
225225
226226struct RNNModel {
227- unsigned char * blob ;
227+ /* Set either blob or const_blob. */
228+ const void * const_blob ;
229+ void * blob ;
228230 int blob_len ;
231+ FILE * file ;
229232};
230233
234+ RNNModel * rnnoise_model_from_buffer (const void * ptr , int len ) {
235+ RNNModel * model ;
236+ model = malloc (sizeof (* model ));
237+ model -> blob = NULL ;
238+ model -> const_blob = ptr ;
239+ model -> blob_len = len ;
240+ return model ;
241+ }
242+
243+ RNNModel * rnnoise_model_from_filename (const char * filename ) {
244+ RNNModel * model ;
245+ FILE * f = fopen (filename , "rb" );
246+ model = rnnoise_model_from_file (f );
247+ model -> file = f ;
248+ return model ;
249+ }
250+
231251RNNModel * rnnoise_model_from_file (FILE * f ) {
232252 RNNModel * model ;
233253 model = malloc (sizeof (* model ));
254+ model -> file = NULL ;
234255
235256 fseek (f , 0 , SEEK_END );
236257 model -> blob_len = ftell (f );
237258 fseek (f , 0 , SEEK_SET );
238259
260+ model -> const_blob = NULL ;
239261 model -> blob = malloc (model -> blob_len );
240262 if (fread (model -> blob , model -> blob_len , 1 , f ) != 1 )
241263 {
@@ -246,7 +268,8 @@ RNNModel *rnnoise_model_from_file(FILE *f) {
246268}
247269
248270void rnnoise_model_free (RNNModel * model ) {
249- free (model -> blob );
271+ if (model -> file != NULL ) fclose (model -> file );
272+ if (model -> blob != NULL ) free (model -> blob );
250273 free (model );
251274}
252275
@@ -264,7 +287,7 @@ int rnnoise_init(DenoiseState *st, RNNModel *model) {
264287 if (model != NULL ) {
265288 WeightArray * list ;
266289 int ret = 1 ;
267- parse_weights (& list , model -> blob , model -> blob_len );
290+ parse_weights (& list , model -> blob ? model -> blob : model -> const_blob , model -> blob_len );
268291 if (list != NULL ) {
269292 ret = init_rnnoise (& st -> model , list );
270293 opus_free (list );
0 commit comments