+ if (aubio_sink_wavwrite_open(s) != AUBIO_OK) {
+ // open failed, abort
+ goto beach;
+ }
+
+ return s;
+beach:
+ //AUBIO_ERR("sink_wavwrite: failed creating %s with samplerate %dHz\n",
+ // s->path, s->samplerate);
+ del_aubio_sink_wavwrite(s);
+ return NULL;
+}
+
+uint_t aubio_sink_wavwrite_preset_samplerate(aubio_sink_wavwrite_t *s, uint_t samplerate)
+{
+ if (aubio_io_validate_samplerate("sink_wavwrite", s->path, samplerate)) {
+ return AUBIO_FAIL;
+ }
+ s->samplerate = samplerate;
+ // automatically open when both samplerate and channels have been set
+ if (/* s->samplerate != 0 && */ s->channels != 0) {
+ return aubio_sink_wavwrite_open(s);
+ }
+ return AUBIO_OK;
+}
+
+uint_t aubio_sink_wavwrite_preset_channels(aubio_sink_wavwrite_t *s, uint_t channels)
+{
+ if (aubio_io_validate_channels("sink_wavwrite", s->path, channels)) {
+ return AUBIO_FAIL;
+ }
+ s->channels = channels;
+ // automatically open when both samplerate and channels have been set
+ if (s->samplerate != 0 /* && s->channels != 0 */) {
+ return aubio_sink_wavwrite_open(s);
+ }
+ return AUBIO_OK;
+}
+
+uint_t aubio_sink_wavwrite_get_samplerate(const aubio_sink_wavwrite_t *s)
+{
+ return s->samplerate;
+}
+
+uint_t aubio_sink_wavwrite_get_channels(const aubio_sink_wavwrite_t *s)
+{
+ return s->channels;
+}
+
+uint_t aubio_sink_wavwrite_open(aubio_sink_wavwrite_t *s) {
+ unsigned char buf[5];
+ uint_t byterate, blockalign;
+ size_t written = 0;
+
+ /* open output file */
+ s->fid = fopen((const char *)s->path, "wb");