From: Paul Brossier Date: Fri, 13 Jul 2012 19:00:12 +0000 (-0600) Subject: src/io: moved sndfileio from examples X-Git-Tag: 0.4.0-beta1~395 X-Git-Url: https://git.aubio.org/?a=commitdiff_plain;h=eae5898461eaf335dee156fdc68c56d1b015ec2c;p=aubio.git src/io: moved sndfileio from examples --- diff --git a/examples/sndfileio.c b/examples/sndfileio.c deleted file mode 100644 index e7fb67be..00000000 --- a/examples/sndfileio.c +++ /dev/null @@ -1,254 +0,0 @@ -/* - Copyright (C) 2003-2009 Paul Brossier - - This file is part of aubio. - - aubio is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - aubio is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with aubio. If not, see . - -*/ - -#include "config.h" - -#ifdef HAVE_SNDFILE - -#include - -#include - -#include "aubio_priv.h" -#include "fvec.h" -#include "sndfileio.h" -#include "mathutils.h" - -#define MAX_CHANNELS 6 -#define MAX_SIZE 4096 - -struct _aubio_sndfile_t { - SNDFILE *handle; - int samplerate; - int channels; - int format; - float *tmpdata; /** scratch pad for interleaving/deinterleaving. */ - int size; /** store the size to check if realloc needed */ -}; - -aubio_sndfile_t * new_aubio_sndfile_ro(const char* outputname) { - aubio_sndfile_t * f = AUBIO_NEW(aubio_sndfile_t); - SF_INFO sfinfo; - AUBIO_MEMSET(&sfinfo, 0, sizeof (sfinfo)); - - f->handle = sf_open (outputname, SFM_READ, &sfinfo); - - if (f->handle == NULL) { - AUBIO_ERR("Failed opening %s: %s\n", outputname, - sf_strerror (NULL)); /* libsndfile err msg */ - return NULL; - } - - if (sfinfo.channels > MAX_CHANNELS) { - AUBIO_ERR("Not able to process more than %d channels\n", MAX_CHANNELS); - return NULL; - } - - f->size = MAX_SIZE*sfinfo.channels; - f->tmpdata = AUBIO_ARRAY(float,f->size); - /* get input specs */ - f->samplerate = sfinfo.samplerate; - f->channels = sfinfo.channels; - f->format = sfinfo.format; - - return f; -} - -int aubio_sndfile_open_wo(aubio_sndfile_t * f, const char* inputname) { - SF_INFO sfinfo; - AUBIO_MEMSET(&sfinfo, 0, sizeof (sfinfo)); - - /* define file output spec */ - sfinfo.samplerate = f->samplerate; - sfinfo.channels = f->channels; - sfinfo.format = f->format; - - if (! (f->handle = sf_open (inputname, SFM_WRITE, &sfinfo))) { - AUBIO_ERR("Not able to open output file %s.\n", inputname); - AUBIO_ERR("%s\n",sf_strerror (NULL)); /* libsndfile err msg */ - AUBIO_QUIT(AUBIO_FAIL); - } - - if (sfinfo.channels > MAX_CHANNELS) { - AUBIO_ERR("Not able to process more than %d channels\n", MAX_CHANNELS); - AUBIO_QUIT(AUBIO_FAIL); - } - f->size = MAX_SIZE*sfinfo.channels; - f->tmpdata = AUBIO_ARRAY(float,f->size); - return AUBIO_OK; -} - -/* setup file struct from existing one */ -aubio_sndfile_t * new_aubio_sndfile_wo(aubio_sndfile_t * fmodel, const char *outputname) { - aubio_sndfile_t * f = AUBIO_NEW(aubio_sndfile_t); - f->samplerate = fmodel->samplerate; - f->channels = 1; //fmodel->channels; - f->format = fmodel->format; - aubio_sndfile_open_wo(f, outputname); - return f; -} - - -/* return 0 if properly closed, 1 otherwise */ -int del_aubio_sndfile(aubio_sndfile_t * f) { - if (sf_close(f->handle)) { - AUBIO_ERR("Error closing file."); - puts (sf_strerror (NULL)); - return 1; - } - AUBIO_FREE(f->tmpdata); - AUBIO_FREE(f); - //AUBIO_DBG("File closed.\n"); - return 0; -} - -/************************************************************** - * - * Read write methods - * - */ - - -/* read frames from file in data - * return the number of frames actually read */ -int aubio_sndfile_read(aubio_sndfile_t * f, int frames, fvec_t ** read) { - sf_count_t read_frames; - int i,j, channels = f->channels; - int nsamples = frames*channels; - int aread; - smpl_t *pread; - - /* allocate data for de/interleaving reallocated when needed. */ - if (nsamples >= f->size) { - AUBIO_ERR("Maximum aubio_sndfile_read buffer size exceeded."); - return -1; - /* - AUBIO_FREE(f->tmpdata); - f->tmpdata = AUBIO_ARRAY(float,nsamples); - */ - } - //f->size = nsamples; - - /* do actual reading */ - read_frames = sf_read_float (f->handle, f->tmpdata, nsamples); - - aread = (int)FLOOR(read_frames/(float)channels); - - /* de-interleaving data */ - for (i=0; itmpdata[channels*j+i]; - } - } - return aread; -} - -int -aubio_sndfile_read_mono (aubio_sndfile_t * f, int frames, fvec_t * read) -{ - sf_count_t read_frames; - int i, j, channels = f->channels; - int nsamples = frames * channels; - int aread; - smpl_t *pread; - - /* allocate data for de/interleaving reallocated when needed. */ - if (nsamples >= f->size) { - AUBIO_ERR ("Maximum aubio_sndfile_read buffer size exceeded."); - return -1; - /* - AUBIO_FREE(f->tmpdata); - f->tmpdata = AUBIO_ARRAY(float,nsamples); - */ - } - //f->size = nsamples; - - /* do actual reading */ - read_frames = sf_read_float (f->handle, f->tmpdata, nsamples); - - aread = (int) FLOOR (read_frames / (float) channels); - - /* de-interleaving data */ - pread = (smpl_t *) fvec_get_data (read); - for (i = 0; i < channels; i++) { - for (j = 0; j < aread; j++) { - pread[j] += (smpl_t) f->tmpdata[channels * j + i]; - } - } - for (j = 0; j < aread; j++) { - pread[j] /= (smpl_t)channels; - } - - return aread; -} - -/* write 'frames' samples to file from data - * return the number of frames actually written - */ -int aubio_sndfile_write(aubio_sndfile_t * f, int frames, fvec_t ** write) { - sf_count_t written_frames = 0; - int i, j, channels = f->channels; - int nsamples = channels*frames; - smpl_t *pwrite; - - /* allocate data for de/interleaving reallocated when needed. */ - if (nsamples >= f->size) { - AUBIO_ERR("Maximum aubio_sndfile_write buffer size exceeded."); - return -1; - /* - AUBIO_FREE(f->tmpdata); - f->tmpdata = AUBIO_ARRAY(float,nsamples); - */ - } - //f->size = nsamples; - - /* interleaving data */ - for (i=0; itmpdata[channels*j+i] = (float)pwrite[j]; - } - } - written_frames = sf_write_float (f->handle, f->tmpdata, nsamples); - return written_frames/channels; -} - -/******************************************************************* - * - * Get object info - * - */ - -uint_t aubio_sndfile_channels(aubio_sndfile_t * f) { - return f->channels; -} - -uint_t aubio_sndfile_samplerate(aubio_sndfile_t * f) { - return f->samplerate; -} - -void aubio_sndfile_info(aubio_sndfile_t * f) { - AUBIO_DBG("srate : %d\n", f->samplerate); - AUBIO_DBG("channels : %d\n", f->channels); - AUBIO_DBG("format : %d\n", f->format); -} - -#endif /* HAVE_SNDFILE */ diff --git a/examples/sndfileio.h b/examples/sndfileio.h deleted file mode 100644 index a6971887..00000000 --- a/examples/sndfileio.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - Copyright (C) 2003-2009 Paul Brossier - - This file is part of aubio. - - aubio is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - aubio is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with aubio. If not, see . - -*/ - -#ifndef SNDFILEIO_H -#define SNDFILEIO_H - -/** @file - * sndfile functions - */ - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * sndfile object - */ -typedef struct _aubio_sndfile_t aubio_sndfile_t; -/** - * Open a sound file for reading - */ -aubio_sndfile_t * new_aubio_sndfile_ro (const char * inputfile); -/** - * Copy file model from previously opened sound file. - */ -aubio_sndfile_t * new_aubio_sndfile_wo(aubio_sndfile_t * existingfile, const char * outputname); -/** - * Open a sound file for writing - */ -int aubio_sndfile_open_wo (aubio_sndfile_t * file, const char * outputname); -/** - * Read frames data from file into an array of buffers - */ -int aubio_sndfile_read(aubio_sndfile_t * file, int frames, fvec_t ** read); -/** - * Read frames data from file into a single buffer - */ -int aubio_sndfile_read_mono (aubio_sndfile_t * f, int frames, fvec_t * read); -/** - * Write data of length frames to file - */ -int aubio_sndfile_write(aubio_sndfile_t * file, int frames, fvec_t ** write); -/** - * Close file and delete file object - */ -int del_aubio_sndfile(aubio_sndfile_t * file); -/** - * Return some files facts - */ -void aubio_sndfile_info(aubio_sndfile_t * file); -/** - * Return number of channel in file - */ -uint_t aubio_sndfile_channels(aubio_sndfile_t * file); -uint_t aubio_sndfile_samplerate(aubio_sndfile_t * file); - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/examples/wscript_build b/examples/wscript_build index 3e046566..6cb25ee0 100644 --- a/examples/wscript_build +++ b/examples/wscript_build @@ -1,20 +1,14 @@ # vim:set syntax=python: # build examples -sndfileio = ctx.new_task_gen(features = 'c', - includes = '../src', - source = ['sndfileio.c'], - target = 'sndfileio') - utilsio = ctx.new_task_gen(name = 'utilsio', features = 'c', includes = '../src', - add_objects = 'sndfileio', source = ['utils.c', 'jackio.c'], - uselib = ['LASH', 'JACK', 'SNDFILE'], + uselib = ['LASH', 'JACK'], target = 'utilsio') # loop over all *.c filenames in examples to build them all -for target_name in ctx.path.ant_glob('*.c', excl = ['utils.c', 'jackio.c', 'sndfileio.c']): +for target_name in ctx.path.ant_glob('*.c', excl = ['utils.c', 'jackio.c']): ctx.new_task_gen(features = 'c cprogram', add_objects = 'utilsio', includes = '../src', diff --git a/src/io/sndfileio.c b/src/io/sndfileio.c new file mode 100644 index 00000000..e7fb67be --- /dev/null +++ b/src/io/sndfileio.c @@ -0,0 +1,254 @@ +/* + Copyright (C) 2003-2009 Paul Brossier + + This file is part of aubio. + + aubio is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + aubio is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with aubio. If not, see . + +*/ + +#include "config.h" + +#ifdef HAVE_SNDFILE + +#include + +#include + +#include "aubio_priv.h" +#include "fvec.h" +#include "sndfileio.h" +#include "mathutils.h" + +#define MAX_CHANNELS 6 +#define MAX_SIZE 4096 + +struct _aubio_sndfile_t { + SNDFILE *handle; + int samplerate; + int channels; + int format; + float *tmpdata; /** scratch pad for interleaving/deinterleaving. */ + int size; /** store the size to check if realloc needed */ +}; + +aubio_sndfile_t * new_aubio_sndfile_ro(const char* outputname) { + aubio_sndfile_t * f = AUBIO_NEW(aubio_sndfile_t); + SF_INFO sfinfo; + AUBIO_MEMSET(&sfinfo, 0, sizeof (sfinfo)); + + f->handle = sf_open (outputname, SFM_READ, &sfinfo); + + if (f->handle == NULL) { + AUBIO_ERR("Failed opening %s: %s\n", outputname, + sf_strerror (NULL)); /* libsndfile err msg */ + return NULL; + } + + if (sfinfo.channels > MAX_CHANNELS) { + AUBIO_ERR("Not able to process more than %d channels\n", MAX_CHANNELS); + return NULL; + } + + f->size = MAX_SIZE*sfinfo.channels; + f->tmpdata = AUBIO_ARRAY(float,f->size); + /* get input specs */ + f->samplerate = sfinfo.samplerate; + f->channels = sfinfo.channels; + f->format = sfinfo.format; + + return f; +} + +int aubio_sndfile_open_wo(aubio_sndfile_t * f, const char* inputname) { + SF_INFO sfinfo; + AUBIO_MEMSET(&sfinfo, 0, sizeof (sfinfo)); + + /* define file output spec */ + sfinfo.samplerate = f->samplerate; + sfinfo.channels = f->channels; + sfinfo.format = f->format; + + if (! (f->handle = sf_open (inputname, SFM_WRITE, &sfinfo))) { + AUBIO_ERR("Not able to open output file %s.\n", inputname); + AUBIO_ERR("%s\n",sf_strerror (NULL)); /* libsndfile err msg */ + AUBIO_QUIT(AUBIO_FAIL); + } + + if (sfinfo.channels > MAX_CHANNELS) { + AUBIO_ERR("Not able to process more than %d channels\n", MAX_CHANNELS); + AUBIO_QUIT(AUBIO_FAIL); + } + f->size = MAX_SIZE*sfinfo.channels; + f->tmpdata = AUBIO_ARRAY(float,f->size); + return AUBIO_OK; +} + +/* setup file struct from existing one */ +aubio_sndfile_t * new_aubio_sndfile_wo(aubio_sndfile_t * fmodel, const char *outputname) { + aubio_sndfile_t * f = AUBIO_NEW(aubio_sndfile_t); + f->samplerate = fmodel->samplerate; + f->channels = 1; //fmodel->channels; + f->format = fmodel->format; + aubio_sndfile_open_wo(f, outputname); + return f; +} + + +/* return 0 if properly closed, 1 otherwise */ +int del_aubio_sndfile(aubio_sndfile_t * f) { + if (sf_close(f->handle)) { + AUBIO_ERR("Error closing file."); + puts (sf_strerror (NULL)); + return 1; + } + AUBIO_FREE(f->tmpdata); + AUBIO_FREE(f); + //AUBIO_DBG("File closed.\n"); + return 0; +} + +/************************************************************** + * + * Read write methods + * + */ + + +/* read frames from file in data + * return the number of frames actually read */ +int aubio_sndfile_read(aubio_sndfile_t * f, int frames, fvec_t ** read) { + sf_count_t read_frames; + int i,j, channels = f->channels; + int nsamples = frames*channels; + int aread; + smpl_t *pread; + + /* allocate data for de/interleaving reallocated when needed. */ + if (nsamples >= f->size) { + AUBIO_ERR("Maximum aubio_sndfile_read buffer size exceeded."); + return -1; + /* + AUBIO_FREE(f->tmpdata); + f->tmpdata = AUBIO_ARRAY(float,nsamples); + */ + } + //f->size = nsamples; + + /* do actual reading */ + read_frames = sf_read_float (f->handle, f->tmpdata, nsamples); + + aread = (int)FLOOR(read_frames/(float)channels); + + /* de-interleaving data */ + for (i=0; itmpdata[channels*j+i]; + } + } + return aread; +} + +int +aubio_sndfile_read_mono (aubio_sndfile_t * f, int frames, fvec_t * read) +{ + sf_count_t read_frames; + int i, j, channels = f->channels; + int nsamples = frames * channels; + int aread; + smpl_t *pread; + + /* allocate data for de/interleaving reallocated when needed. */ + if (nsamples >= f->size) { + AUBIO_ERR ("Maximum aubio_sndfile_read buffer size exceeded."); + return -1; + /* + AUBIO_FREE(f->tmpdata); + f->tmpdata = AUBIO_ARRAY(float,nsamples); + */ + } + //f->size = nsamples; + + /* do actual reading */ + read_frames = sf_read_float (f->handle, f->tmpdata, nsamples); + + aread = (int) FLOOR (read_frames / (float) channels); + + /* de-interleaving data */ + pread = (smpl_t *) fvec_get_data (read); + for (i = 0; i < channels; i++) { + for (j = 0; j < aread; j++) { + pread[j] += (smpl_t) f->tmpdata[channels * j + i]; + } + } + for (j = 0; j < aread; j++) { + pread[j] /= (smpl_t)channels; + } + + return aread; +} + +/* write 'frames' samples to file from data + * return the number of frames actually written + */ +int aubio_sndfile_write(aubio_sndfile_t * f, int frames, fvec_t ** write) { + sf_count_t written_frames = 0; + int i, j, channels = f->channels; + int nsamples = channels*frames; + smpl_t *pwrite; + + /* allocate data for de/interleaving reallocated when needed. */ + if (nsamples >= f->size) { + AUBIO_ERR("Maximum aubio_sndfile_write buffer size exceeded."); + return -1; + /* + AUBIO_FREE(f->tmpdata); + f->tmpdata = AUBIO_ARRAY(float,nsamples); + */ + } + //f->size = nsamples; + + /* interleaving data */ + for (i=0; itmpdata[channels*j+i] = (float)pwrite[j]; + } + } + written_frames = sf_write_float (f->handle, f->tmpdata, nsamples); + return written_frames/channels; +} + +/******************************************************************* + * + * Get object info + * + */ + +uint_t aubio_sndfile_channels(aubio_sndfile_t * f) { + return f->channels; +} + +uint_t aubio_sndfile_samplerate(aubio_sndfile_t * f) { + return f->samplerate; +} + +void aubio_sndfile_info(aubio_sndfile_t * f) { + AUBIO_DBG("srate : %d\n", f->samplerate); + AUBIO_DBG("channels : %d\n", f->channels); + AUBIO_DBG("format : %d\n", f->format); +} + +#endif /* HAVE_SNDFILE */ diff --git a/src/io/sndfileio.h b/src/io/sndfileio.h new file mode 100644 index 00000000..a6971887 --- /dev/null +++ b/src/io/sndfileio.h @@ -0,0 +1,79 @@ +/* + Copyright (C) 2003-2009 Paul Brossier + + This file is part of aubio. + + aubio is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + aubio is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with aubio. If not, see . + +*/ + +#ifndef SNDFILEIO_H +#define SNDFILEIO_H + +/** @file + * sndfile functions + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * sndfile object + */ +typedef struct _aubio_sndfile_t aubio_sndfile_t; +/** + * Open a sound file for reading + */ +aubio_sndfile_t * new_aubio_sndfile_ro (const char * inputfile); +/** + * Copy file model from previously opened sound file. + */ +aubio_sndfile_t * new_aubio_sndfile_wo(aubio_sndfile_t * existingfile, const char * outputname); +/** + * Open a sound file for writing + */ +int aubio_sndfile_open_wo (aubio_sndfile_t * file, const char * outputname); +/** + * Read frames data from file into an array of buffers + */ +int aubio_sndfile_read(aubio_sndfile_t * file, int frames, fvec_t ** read); +/** + * Read frames data from file into a single buffer + */ +int aubio_sndfile_read_mono (aubio_sndfile_t * f, int frames, fvec_t * read); +/** + * Write data of length frames to file + */ +int aubio_sndfile_write(aubio_sndfile_t * file, int frames, fvec_t ** write); +/** + * Close file and delete file object + */ +int del_aubio_sndfile(aubio_sndfile_t * file); +/** + * Return some files facts + */ +void aubio_sndfile_info(aubio_sndfile_t * file); +/** + * Return number of channel in file + */ +uint_t aubio_sndfile_channels(aubio_sndfile_t * file); +uint_t aubio_sndfile_samplerate(aubio_sndfile_t * file); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/src/wscript_build b/src/wscript_build index f3d06382..ae241da2 100644 --- a/src/wscript_build +++ b/src/wscript_build @@ -1,11 +1,14 @@ # vim:set syntax=python: -uselib = ['SAMPLERATE'] +source = ctx.path.ant_glob('*.c **/*.c') +uselib = [] + if 'HAVE_FFTW3' in conf.get_env(): - source = ctx.path.ant_glob('*.c **/*.c', excl = ['**/ooura_fft8g.c']) + source.filter(lambda x: not x.endswith('ooura_fft8g.c')) uselib += ['FFTW3', 'FFTW3F'] -else: - source = ctx.path.ant_glob('*.c **/*.c') + +if 'HAVE_SAMPLERATE': + uselib += ['SAMPLERATE'] # build libaubio ctx.shlib(