ref: 422452b4197a513d074c45701419fb58816c99e6
parent: a9fd272915d06287c5e0b9384c383fb1468ddb60
author: Paul Brossier <piem@piem.org>
date: Sun Jan 26 11:19:31 EST 2014
src/io/source*: add _close function
--- a/src/io/source.c
+++ b/src/io/source.c
@@ -41,6 +41,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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;
}
@@ -115,6 +121,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) {
--- a/src/io/source.h
+++ b/src/io/source.h
@@ -141,6 +141,17 @@
/**
+ 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
--- a/src/io/source_apple_audio.c
+++ b/src/io/source_apple_audio.c
@@ -257,7 +257,7 @@
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) {
--- a/src/io/source_apple_audio.h
+++ b/src/io/source_apple_audio.h
@@ -121,6 +121,17 @@
/**
+ 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
--- a/src/io/source_avcodec.c
+++ b/src/io/source_avcodec.c
@@ -390,20 +390,12 @@
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 @@
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);
}
--- a/src/io/source_avcodec.h
+++ b/src/io/source_avcodec.h
@@ -120,6 +120,17 @@
/**
+ 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
--- a/src/io/source_sndfile.c
+++ b/src/io/source_sndfile.c
@@ -267,11 +267,19 @@
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);
--- a/src/io/source_sndfile.h
+++ b/src/io/source_sndfile.h
@@ -120,6 +120,17 @@
/**
+ 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
--- a/src/io/source_wavread.c
+++ b/src/io/source_wavread.c
@@ -346,9 +346,16 @@
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);
--- a/src/io/source_wavread.h
+++ b/src/io/source_wavread.h
@@ -125,6 +125,17 @@
/**
+ 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
--
⑨