From: Paul Brossier Date: Sun, 23 Feb 2014 16:29:42 +0000 (-0300) Subject: src/io/sink_sndfile.c: add missing do_multi X-Git-Tag: 0.4.1~30 X-Git-Url: https://git.aubio.org/?a=commitdiff_plain;h=2eccf22c76ecb7e80b3d1678147b0451cee34ad5;p=aubio.git src/io/sink_sndfile.c: add missing do_multi --- diff --git a/src/io/sink_sndfile.c b/src/io/sink_sndfile.c index 2824e741..5fae2cfd 100644 --- a/src/io/sink_sndfile.c +++ b/src/io/sink_sndfile.c @@ -26,8 +26,9 @@ #include #include "aubio_priv.h" -#include "sink_sndfile.h" #include "fvec.h" +#include "fmat.h" +#include "io/sink_sndfile.h" #define MAX_CHANNELS 6 #define MAX_SIZE 4096 @@ -166,6 +167,34 @@ void aubio_sink_sndfile_do(aubio_sink_sndfile_t *s, fvec_t * write_data, uint_t return; } +void aubio_sink_sndfile_do_multi(aubio_sink_sndfile_t *s, fmat_t * write_data, uint_t write){ + uint_t i, j, channels = s->channels; + int nsamples = channels*write; + smpl_t *pwrite; + sf_count_t written_frames; + + if (write > s->max_size) { + AUBIO_WRN("trying to write %d frames, but only %d can be written at a time", + write, s->max_size); + write = s->max_size; + } + + /* interleaving data */ + for ( i = 0; i < write_data->height; i++) { + pwrite = (smpl_t *)write_data->data[i]; + for (j = 0; j < write; j++) { + s->scratch_data[channels*j+i] = pwrite[j]; + } + } + + written_frames = sf_write_float (s->handle, s->scratch_data, nsamples); + if (written_frames/channels != write) { + AUBIO_WRN("sink_sndfile: trying to write %d frames to %s, but only %d could be written", + write, s->path, (uint_t)written_frames); + } + return; +} + uint_t aubio_sink_sndfile_close (aubio_sink_sndfile_t *s) { if (!s->handle) { return AUBIO_FAIL;