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 {
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;
};
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;
}
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;
}
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;
}
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);
/**
+ 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);
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) {
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;
/**
+ 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
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);
}
/**
+ 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
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;
}
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);
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){
/**
+ 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