[io] sink_flac to dynamically allocate metadata
authorPaul Brossier <piem@piem.org>
Wed, 19 Dec 2018 14:47:25 +0000 (15:47 +0100)
committerPaul Brossier <piem@piem.org>
Wed, 19 Dec 2018 14:47:25 +0000 (15:47 +0100)
src/io/sink_flac.c

index 512120b..fcb42e7 100644 (file)
@@ -63,7 +63,7 @@ struct _aubio_sink_flac_t {
   FILE *fid;            // file id
   FLAC__StreamEncoder* encoder;
   FLAC__int32 *buffer;
-  FLAC__StreamMetadata *metadata[2];
+  FLAC__StreamMetadata **metadata;
 };
 
 typedef struct _aubio_sink_flac_t aubio_sink_flac_t;
@@ -167,6 +167,12 @@ uint_t aubio_sink_flac_open(aubio_sink_flac_t *s)
     goto failure;
   }
 
+  s->metadata = AUBIO_ARRAY(FLAC__StreamMetadata*, 2);
+  if (!s->metadata) {
+    AUBIO_ERR("sink_flac: failed allocating memory for %s\n", s->path);
+    goto failure;
+  }
+
   s->metadata[0] = FLAC__metadata_object_new(FLAC__METADATA_TYPE_VORBIS_COMMENT);
   if (!s->metadata[0]) {
     AUBIO_ERR("sink_flac: failed allocating vorbis comment %s\n", s->path);
@@ -323,8 +329,11 @@ uint_t aubio_sink_flac_close (aubio_sink_flac_t *s)
 
   if (s->metadata) {
     // clean up metadata after stream finished
-    FLAC__metadata_object_delete(s->metadata[0]);
-    FLAC__metadata_object_delete(s->metadata[1]);
+    if (s->metadata[0])
+      FLAC__metadata_object_delete(s->metadata[0]);
+    if (s->metadata[1])
+      FLAC__metadata_object_delete(s->metadata[1]);
+    AUBIO_FREE(s->metadata);
   }
 
   if (s->fid && fclose(s->fid)) {