From a9fd272915d06287c5e0b9384c383fb1468ddb60 Mon Sep 17 00:00:00 2001 From: Paul Brossier Date: Sun, 26 Jan 2014 16:16:59 -0300 Subject: [PATCH] src/io/sink*: add _close function, improve error messages --- src/io/sink.c | 12 +++++++++++- src/io/sink.h | 13 ++++++++++++- src/io/sink_apple_audio.c | 12 ++++++++---- src/io/sink_apple_audio.h | 11 +++++++++++ src/io/sink_sndfile.c | 14 ++++++++++++-- src/io/sink_sndfile.h | 11 +++++++++++ src/io/sink_wavwrite.c | 9 +++++---- src/io/sink_wavwrite.h | 11 +++++++++++ 8 files changed, 81 insertions(+), 12 deletions(-) diff --git a/src/io/sink.c b/src/io/sink.c index 4eb6b6b4..c38637ef 100644 --- a/src/io/sink.c +++ b/src/io/sink.c @@ -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); diff --git a/src/io/sink.h b/src/io/sink.h index ef8cd905..1b12eb80 100644 --- a/src/io/sink.h +++ b/src/io/sink.h @@ -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); diff --git a/src/io/sink_apple_audio.c b/src/io/sink_apple_audio.c index cd030c15..ebc94a27 100644 --- a/src/io/sink_apple_audio.c +++ b/src/io/sink_apple_audio.c @@ -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; diff --git a/src/io/sink_apple_audio.h b/src/io/sink_apple_audio.h index b26fefec..f30e3ead 100644 --- a/src/io/sink_apple_audio.h +++ b/src/io/sink_apple_audio.h @@ -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 diff --git a/src/io/sink_sndfile.c b/src/io/sink_sndfile.c index 8437e053..11143652 100644 --- a/src/io/sink_sndfile.c +++ b/src/io/sink_sndfile.c @@ -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); } diff --git a/src/io/sink_sndfile.h b/src/io/sink_sndfile.h index c767e1db..ada74cb1 100644 --- a/src/io/sink_sndfile.h +++ b/src/io/sink_sndfile.h @@ -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 diff --git a/src/io/sink_wavwrite.c b/src/io/sink_wavwrite.c index 5c1f380d..908f660f 100644 --- a/src/io/sink_wavwrite.c +++ b/src/io/sink_wavwrite.c @@ -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){ diff --git a/src/io/sink_wavwrite.h b/src/io/sink_wavwrite.h index 9f73144b..01008cd3 100644 --- a/src/io/sink_wavwrite.h +++ b/src/io/sink_wavwrite.h @@ -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 -- 2.11.0