src/io/sink*: add _close function, improve error messages
authorPaul Brossier <piem@piem.org>
Sun, 26 Jan 2014 19:16:59 +0000 (16:16 -0300)
committerPaul Brossier <piem@piem.org>
Sun, 26 Jan 2014 19:16:59 +0000 (16:16 -0300)
src/io/sink.c
src/io/sink.h
src/io/sink_apple_audio.c
src/io/sink_apple_audio.h
src/io/sink_sndfile.c
src/io/sink_sndfile.h
src/io/sink_wavwrite.c
src/io/sink_wavwrite.h

index 4eb6b6b..c38637e 100644 (file)
@@ -38,6 +38,7 @@ typedef void (*aubio_sink_do_multi_t)(aubio_sink_t * s, fmat_t * data, uint_t *
 typedef uint_t (*aubio_sink_get_samplerate_t)(aubio_sink_t * s);
 typedef uint_t (*aubio_sink_get_channels_t)(aubio_sink_t * s);
 #endif
+typedef uint_t (*aubio_sink_close_t)(aubio_sink_t * s);
 typedef void (*del_aubio_sink_t)(aubio_sink_t * s);
 
 struct _aubio_sink_t { 
@@ -48,6 +49,7 @@ struct _aubio_sink_t {
   aubio_sink_get_samplerate_t s_get_samplerate;
   aubio_sink_get_channels_t s_get_channels;
 #endif
+  aubio_sink_close_t s_close;
   del_aubio_sink_t s_del;
 };
 
@@ -57,6 +59,7 @@ aubio_sink_t * new_aubio_sink(char_t * uri, uint_t samplerate) {
   s->sink = (void *)new_aubio_sink_apple_audio(uri, samplerate);
   if (s->sink) {
     s->s_do = (aubio_sink_do_t)(aubio_sink_apple_audio_do);
+    s->s_close = (aubio_sink_close_t)(aubio_sink_apple_audio_close);
     s->s_del = (del_aubio_sink_t)(del_aubio_sink_apple_audio);
     return s;
   }
@@ -65,6 +68,7 @@ aubio_sink_t * new_aubio_sink(char_t * uri, uint_t samplerate) {
   s->sink = (void *)new_aubio_sink_sndfile(uri, samplerate);
   if (s->sink) {
     s->s_do = (aubio_sink_do_t)(aubio_sink_sndfile_do);
+    s->s_close = (aubio_sink_close_t)(aubio_sink_sndfile_close);
     s->s_del = (del_aubio_sink_t)(del_aubio_sink_sndfile);
     return s;
   }
@@ -73,11 +77,13 @@ aubio_sink_t * new_aubio_sink(char_t * uri, uint_t samplerate) {
   s->sink = (void *)new_aubio_sink_wavwrite(uri, samplerate);
   if (s->sink) {
     s->s_do = (aubio_sink_do_t)(aubio_sink_wavwrite_do);
+    s->s_close = (aubio_sink_close_t)(aubio_sink_wavwrite_close);
     s->s_del = (del_aubio_sink_t)(del_aubio_sink_wavwrite);
     return s;
   }
 #endif /* HAVE_WAVWRITE */
-  AUBIO_ERROR("sink: failed creating aubio sink with %s\n", uri);
+  AUBIO_ERROR("sink: failed creating %s with samplerate %dHz\n",
+      uri, samplerate);
   AUBIO_FREE(s);
   return NULL;
 }
@@ -86,6 +92,10 @@ void aubio_sink_do(aubio_sink_t * s, fvec_t * write_data, uint_t write) {
   s->s_do((void *)s->sink, write_data, write);
 }
 
+uint_t aubio_sink_close(aubio_sink_t *s) {
+  return s->s_close((void *)s->sink);
+}
+
 void del_aubio_sink(aubio_sink_t * s) {
   if (!s) return;
   s->s_del((void *)s->sink);
index ef8cd90..1b12eb8 100644 (file)
@@ -63,9 +63,20 @@ void aubio_sink_do(aubio_sink_t * s, fvec_t * write_data, uint_t write);
 
 /**
 
+  close sink
+
+  \param s sink object, created with ::new_aubio_sink
+
+  \return 0 on success, non-zero on failure
+
+*/
+uint_t aubio_sink_close(aubio_sink_t * s);
+
+/**
+
   close sink and cleanup memory
 
-  \param s source object, created with ::new_aubio_source
+  \param s sink object, created with ::new_aubio_sink
 
 */
 void del_aubio_sink(aubio_sink_t * s);
index cd030c1..ebc94a2 100644 (file)
@@ -141,11 +141,10 @@ void aubio_sink_apple_audio_do(aubio_sink_apple_audio_t * s, fvec_t * write_data
   return;
 }
 
-void del_aubio_sink_apple_audio(aubio_sink_apple_audio_t * s) {
+uint_t aubio_sink_apple_audio_close(aubio_sink_apple_audio_t * s) {
   OSStatus err = noErr;
-  if (!s || !s->audioFile) {
-    AUBIO_ERR("sink_apple_audio: failed erasing\n");
-    return;
+  if (!s->audioFile) {
+    return AUBIO_FAIL;
   }
   err = ExtAudioFileDispose(s->audioFile);
   if (err) {
@@ -155,6 +154,11 @@ void del_aubio_sink_apple_audio(aubio_sink_apple_audio_t * s) {
         getPrintableOSStatusError(errorstr, err));
   }
   s->audioFile = NULL;
+  return err;
+}
+
+void del_aubio_sink_apple_audio(aubio_sink_apple_audio_t * s) {
+  if (s->audioFile) aubio_sink_apple_audio_close (s);
   freeAudioBufferList(&s->bufferList);
   AUBIO_FREE(s);
   return;
index b26fefe..f30e3ea 100644 (file)
@@ -68,6 +68,17 @@ void aubio_sink_apple_audio_do(aubio_sink_apple_audio_t * s, fvec_t * write_data
 
 /**
 
+  close sink
+
+  \param s sink_apple_audio object, created with ::new_aubio_sink_apple_audio
+
+  \return 0 on success, non-zero on failure
+
+*/
+uint_t aubio_sink_apple_audio_close(aubio_sink_apple_audio_t * s);
+
+/**
+
   close sink and cleanup memory
 
   \param s sink, created with ::new_aubio_sink_apple_audio
index 8437e05..1114365 100644 (file)
@@ -115,11 +115,21 @@ void aubio_sink_sndfile_do(aubio_sink_sndfile_t *s, fvec_t * write_data, uint_t
   return;
 }
 
-void del_aubio_sink_sndfile(aubio_sink_sndfile_t * s){
-  if (!s) return;
+uint_t aubio_sink_sndfile_close (aubio_sink_sndfile_t *s) {
+  if (!s->handle) {
+    return AUBIO_FAIL;
+  }
   if (sf_close(s->handle)) {
     AUBIO_ERR("Error closing file %s: %s", s->path, sf_strerror (NULL));
+    return AUBIO_FAIL;
   }
+  s->handle = NULL;
+  return AUBIO_OK;
+}
+
+void del_aubio_sink_sndfile(aubio_sink_sndfile_t * s){
+  if (!s) return;
+  aubio_sink_sndfile_close(s);
   AUBIO_FREE(s->scratch_data);
   AUBIO_FREE(s);
 }
index c767e1d..ada74cb 100644 (file)
@@ -67,6 +67,17 @@ void aubio_sink_sndfile_do(aubio_sink_sndfile_t * s, fvec_t * write_data, uint_t
 
 /**
 
+  close sink
+
+  \param s sink_sndfile object, created with ::new_aubio_sink_sndfile
+
+  \return 0 on success, non-zero on failure
+
+*/
+uint_t aubio_sink_sndfile_close(aubio_sink_sndfile_t * s);
+
+/**
+
   close sink and cleanup memory
 
   \param s sink, created with ::new_aubio_sink_sndfile
index 5c1f380..908f660 100644 (file)
@@ -152,8 +152,8 @@ aubio_sink_wavwrite_t * new_aubio_sink_wavwrite(char_t * path, uint_t samplerate
   return s;
 
 beach:
-  AUBIO_ERR("sink_wavwrite: can not write %s at samplerate %dHz\n",
-      s->path, s->samplerate);
+  //AUBIO_ERR("sink_wavwrite: failed creating %s with samplerate %dHz\n",
+  //    s->path, s->samplerate);
   del_aubio_sink_wavwrite(s);
   return NULL;
 }
@@ -181,10 +181,10 @@ void aubio_sink_wavwrite_do(aubio_sink_wavwrite_t *s, fvec_t * write_data, uint_
   return;
 }
 
-void aubio_sink_wavwrite_close(aubio_sink_wavwrite_t * s) {
+uint_t aubio_sink_wavwrite_close(aubio_sink_wavwrite_t * s) {
   uint_t data_size = s->total_frames_written * s->bitspersample * s->channels / 8;
   unsigned char buf[5];
-  if (!s->fid) return;
+  if (!s->fid) return AUBIO_FAIL;
   // ChunkSize
   fseek(s->fid, 4, SEEK_SET);
   fwrite(write_little_endian(data_size + 36, buf, 4), 4, 1, s->fid);
@@ -196,6 +196,7 @@ void aubio_sink_wavwrite_close(aubio_sink_wavwrite_t * s) {
     AUBIO_ERR("sink_wavwrite: Error closing file %s (%s)\n", s->path, strerror(errno));
   }
   s->fid = NULL;
+  return AUBIO_OK;
 }
 
 void del_aubio_sink_wavwrite(aubio_sink_wavwrite_t * s){
index 9f73144..01008cd 100644 (file)
@@ -67,6 +67,17 @@ void aubio_sink_wavwrite_do(aubio_sink_wavwrite_t * s, fvec_t * write_data, uint
 
 /**
 
+  close sink
+
+  \param s sink_wavwrite object, create with ::new_aubio_sink_wavwrite
+
+  \return 0 on success, non-zero on failure
+
+*/
+uint_t aubio_sink_wavwrite_close(aubio_sink_wavwrite_t * s);
+
+/**
+
   close sink and cleanup memory
 
   \param s sink, created with ::new_aubio_sink_wavwrite