From 422452b4197a513d074c45701419fb58816c99e6 Mon Sep 17 00:00:00 2001 From: Paul Brossier Date: Sun, 26 Jan 2014 16:19:31 -0300 Subject: [PATCH] src/io/source*: add _close function --- src/io/source.c | 10 ++++++++++ src/io/source.h | 11 +++++++++++ src/io/source_apple_audio.c | 2 +- src/io/source_apple_audio.h | 11 +++++++++++ src/io/source_avcodec.c | 25 +++++++++++++++---------- src/io/source_avcodec.h | 11 +++++++++++ src/io/source_sndfile.c | 14 +++++++++++--- src/io/source_sndfile.h | 11 +++++++++++ src/io/source_wavread.c | 9 ++++++++- src/io/source_wavread.h | 11 +++++++++++ 10 files changed, 100 insertions(+), 15 deletions(-) diff --git a/src/io/source.c b/src/io/source.c index 9dd5bdf7..a05873df 100644 --- a/src/io/source.c +++ b/src/io/source.c @@ -41,6 +41,7 @@ typedef void (*aubio_source_do_multi_t)(aubio_source_t * s, fmat_t * data, uint_ typedef uint_t (*aubio_source_get_samplerate_t)(aubio_source_t * s); typedef uint_t (*aubio_source_get_channels_t)(aubio_source_t * s); typedef uint_t (*aubio_source_seek_t)(aubio_source_t * s, uint_t seek); +typedef uint_t (*aubio_source_close_t)(aubio_source_t * s); typedef void (*del_aubio_source_t)(aubio_source_t * s); struct _aubio_source_t { @@ -50,6 +51,7 @@ struct _aubio_source_t { aubio_source_get_samplerate_t s_get_samplerate; aubio_source_get_channels_t s_get_channels; aubio_source_seek_t s_seek; + aubio_source_close_t s_close; del_aubio_source_t s_del; }; @@ -63,6 +65,7 @@ aubio_source_t * new_aubio_source(char_t * uri, uint_t samplerate, uint_t hop_si s->s_get_channels = (aubio_source_get_channels_t)(aubio_source_avcodec_get_channels); s->s_get_samplerate = (aubio_source_get_samplerate_t)(aubio_source_avcodec_get_samplerate); s->s_seek = (aubio_source_seek_t)(aubio_source_avcodec_seek); + s->s_close = (aubio_source_close_t)(aubio_source_avcodec_close); s->s_del = (del_aubio_source_t)(del_aubio_source_avcodec); return s; } @@ -75,6 +78,7 @@ aubio_source_t * new_aubio_source(char_t * uri, uint_t samplerate, uint_t hop_si s->s_get_channels = (aubio_source_get_channels_t)(aubio_source_apple_audio_get_channels); s->s_get_samplerate = (aubio_source_get_samplerate_t)(aubio_source_apple_audio_get_samplerate); s->s_seek = (aubio_source_seek_t)(aubio_source_apple_audio_seek); + s->s_close = (aubio_source_close_t)(aubio_source_apple_audio_close); s->s_del = (del_aubio_source_t)(del_aubio_source_apple_audio); return s; } @@ -87,6 +91,7 @@ aubio_source_t * new_aubio_source(char_t * uri, uint_t samplerate, uint_t hop_si s->s_get_channels = (aubio_source_get_channels_t)(aubio_source_sndfile_get_channels); s->s_get_samplerate = (aubio_source_get_samplerate_t)(aubio_source_sndfile_get_samplerate); s->s_seek = (aubio_source_seek_t)(aubio_source_sndfile_seek); + s->s_close = (aubio_source_close_t)(aubio_source_sndfile_close); s->s_del = (del_aubio_source_t)(del_aubio_source_sndfile); return s; } @@ -99,6 +104,7 @@ aubio_source_t * new_aubio_source(char_t * uri, uint_t samplerate, uint_t hop_si s->s_get_channels = (aubio_source_get_channels_t)(aubio_source_wavread_get_channels); s->s_get_samplerate = (aubio_source_get_samplerate_t)(aubio_source_wavread_get_samplerate); s->s_seek = (aubio_source_seek_t)(aubio_source_wavread_seek); + s->s_close = (aubio_source_close_t)(aubio_source_wavread_close); s->s_del = (del_aubio_source_t)(del_aubio_source_wavread); return s; } @@ -117,6 +123,10 @@ void aubio_source_do_multi(aubio_source_t * s, fmat_t * data, uint_t * read) { s->s_do_multi((void *)s->source, data, read); } +uint_t aubio_source_close(aubio_source_t * s) { + return s->s_close((void *)s->source); +} + void del_aubio_source(aubio_source_t * s) { if (!s) return; s->s_del((void *)s->source); diff --git a/src/io/source.h b/src/io/source.h index 7240b9d9..d3a9dffc 100644 --- a/src/io/source.h +++ b/src/io/source.h @@ -141,6 +141,17 @@ uint_t aubio_source_seek (aubio_source_t * s, uint_t pos); /** + close source object + + \param s source object, created with ::new_aubio_source + + \return 0 if sucessful, non-zero on failure + + */ +uint_t aubio_source_close (aubio_source_t *s); + +/** + close source and cleanup memory \param s source object, created with ::new_aubio_source diff --git a/src/io/source_apple_audio.c b/src/io/source_apple_audio.c index e28d3e5f..b0fce40f 100644 --- a/src/io/source_apple_audio.c +++ b/src/io/source_apple_audio.c @@ -257,7 +257,7 @@ beach: uint_t aubio_source_apple_audio_close (aubio_source_apple_audio_t *s) { OSStatus err = noErr; - if (!s || !s->audioFile) { return AUBIO_FAIL; } + if (!s->audioFile) { return AUBIO_FAIL; } err = ExtAudioFileDispose(s->audioFile); s->audioFile = NULL; if (err) { diff --git a/src/io/source_apple_audio.h b/src/io/source_apple_audio.h index 5cd458da..61dbeba9 100644 --- a/src/io/source_apple_audio.h +++ b/src/io/source_apple_audio.h @@ -121,6 +121,17 @@ uint_t aubio_source_apple_audio_seek (aubio_source_apple_audio_t * s, uint_t pos /** + close source + + \param s source object, created with ::new_aubio_source_apple_audio + + \return 0 if sucessful, non-zero on failure + +*/ +uint_t aubio_source_apple_audio_close(aubio_source_apple_audio_t * s); + +/** + close source and cleanup memory \param s source object, created with ::new_aubio_source_apple_audio diff --git a/src/io/source_avcodec.c b/src/io/source_avcodec.c index fbc1cd2a..772691e1 100644 --- a/src/io/source_avcodec.c +++ b/src/io/source_avcodec.c @@ -390,20 +390,12 @@ uint_t aubio_source_avcodec_seek (aubio_source_avcodec_t * s, uint_t pos) { return ret; } -void del_aubio_source_avcodec(aubio_source_avcodec_t * s){ - if (!s) return; - if (s->output != NULL) { - av_free(s->output); - } +uint_t aubio_source_avcodec_close(aubio_source_avcodec_t * s) { if (s->avr != NULL) { avresample_close( s->avr ); av_free ( s->avr ); } s->avr = NULL; - if (s->avFrame != NULL) { - avcodec_free_frame( &(s->avFrame) ); - } - s->avFrame = NULL; if (s->avCodecCtx != NULL) { avcodec_close ( s->avCodecCtx ); } @@ -411,8 +403,21 @@ void del_aubio_source_avcodec(aubio_source_avcodec_t * s){ if (s->avFormatCtx != NULL) { avformat_close_input ( &(s->avFormatCtx) ); } - s->avFrame = NULL; s->avFormatCtx = NULL; + return AUBIO_OK; +} + +void del_aubio_source_avcodec(aubio_source_avcodec_t * s){ + if (!s) return; + aubio_source_avcodec_close(s); + if (s->output != NULL) { + av_free(s->output); + } + s->output = NULL; + if (s->avFrame != NULL) { + avcodec_free_frame( &(s->avFrame) ); + } + s->avFrame = NULL; AUBIO_FREE(s); } diff --git a/src/io/source_avcodec.h b/src/io/source_avcodec.h index 4374078f..a5f6845f 100644 --- a/src/io/source_avcodec.h +++ b/src/io/source_avcodec.h @@ -120,6 +120,17 @@ uint_t aubio_source_avcodec_seek (aubio_source_avcodec_t *s, uint_t pos); /** + close source + + \param s source object, created with ::new_aubio_source_avcodec + + \return 0 if sucessful, non-zero on failure + +*/ +uint_t aubio_source_avcodec_close (aubio_source_avcodec_t *s); + +/** + close source and cleanup memory \param s source object, created with ::new_aubio_source_avcodec diff --git a/src/io/source_sndfile.c b/src/io/source_sndfile.c index ac06881b..6f089346 100644 --- a/src/io/source_sndfile.c +++ b/src/io/source_sndfile.c @@ -267,11 +267,19 @@ uint_t aubio_source_sndfile_seek (aubio_source_sndfile_t * s, uint_t pos) { return sf_seek (s->handle, resampled_pos, SEEK_SET); } -void del_aubio_source_sndfile(aubio_source_sndfile_t * s){ - if (!s) return; - if (sf_close(s->handle)) { +uint_t aubio_source_sndfile_close (aubio_source_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; } + return AUBIO_OK; +} + +void del_aubio_source_sndfile(aubio_source_sndfile_t * s){ + if (!s) return; + aubio_source_sndfile_close(s): #ifdef HAVE_SAMPLERATE if (s->resampler != NULL) { del_aubio_resampler(s->resampler); diff --git a/src/io/source_sndfile.h b/src/io/source_sndfile.h index d67269ae..54a37afe 100644 --- a/src/io/source_sndfile.h +++ b/src/io/source_sndfile.h @@ -120,6 +120,17 @@ uint_t aubio_source_sndfile_seek (aubio_source_sndfile_t *s, uint_t pos); /** + close source + + \param s source object, created with ::new_aubio_source_sndfile + + \return 0 if sucessful, non-zero on failure + +*/ +uint_t aubio_source_sndfile_close (aubio_source_sndfile_t *s); + +/** + close source and cleanup memory \param s source object, created with ::new_aubio_source_sndfile diff --git a/src/io/source_wavread.c b/src/io/source_wavread.c index 751cbc32..d5878687 100644 --- a/src/io/source_wavread.c +++ b/src/io/source_wavread.c @@ -346,9 +346,16 @@ uint_t aubio_source_wavread_seek (aubio_source_wavread_t * s, uint_t pos) { return ret; } +uint_t aubio_source_wavread_close (aubio_source_wavread_t * s) { + if (!s->fid || fclose(s->fid)) { + return AUBIO_FAIL; + } + return AUBIO_OK; +} + void del_aubio_source_wavread(aubio_source_wavread_t * s) { if (!s) return; - if (s->fid) fclose(s->fid); + aubio_source_wavread_close(s); if (s->short_output) AUBIO_FREE(s->short_output); if (s->output) del_fmat(s->output); AUBIO_FREE(s); diff --git a/src/io/source_wavread.h b/src/io/source_wavread.h index ca2fe53c..efdb88d4 100644 --- a/src/io/source_wavread.h +++ b/src/io/source_wavread.h @@ -125,6 +125,17 @@ uint_t aubio_source_wavread_seek (aubio_source_wavread_t *s, uint_t pos); /** + close source + + \param s source object, created with ::new_aubio_source_wavread + + \return 0 if sucessful, non-zero on failure + +*/ +uint_t aubio_source_wavread_close (aubio_source_wavread_t *s); + +/** + close source and cleanup memory \param s source object, created with ::new_aubio_source_wavread -- 2.11.0