From a3a01e100c656ecde5911cb95ad5415a3dc42a06 Mon Sep 17 00:00:00 2001 From: Paul Brossier Date: Sat, 1 Dec 2007 22:51:39 +0100 Subject: [PATCH] add lvec object to store double precision vectors --- src/Makefile.am | 4 +- src/lvec.c | 63 +++++++++++++++++++++++++ src/lvec.h | 120 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 186 insertions(+), 1 deletion(-) create mode 100644 src/lvec.c create mode 100644 src/lvec.h diff --git a/src/Makefile.am b/src/Makefile.am index a26495a9..75adb933 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -5,6 +5,7 @@ noinst_HEADERS = \ pkginclude_HEADERS = aubio.h \ types.h \ fvec.h \ + lvec.h \ cvec.h \ mathutils.h @@ -53,7 +54,8 @@ pkgincludetempo_HEADERS = \ lib_LTLIBRARIES = libaubio.la libaubio_la_SOURCES = \ - fvec.c \ + fvec.c \ + lvec.c \ cvec.c \ mathutils.c \ utils/hist.c \ diff --git a/src/lvec.c b/src/lvec.c new file mode 100644 index 00000000..086e3082 --- /dev/null +++ b/src/lvec.c @@ -0,0 +1,63 @@ +/* + Copyright (C) 2003-2007 Paul Brossier + + This program 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 2 of the License, or + (at your option) any later version. + + This program 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 this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include "aubio_priv.h" +#include "lvec.h" + +lvec_t * new_lvec( uint_t length, uint_t channels) { + lvec_t * s = AUBIO_NEW(lvec_t); + uint_t i,j; + s->channels = channels; + s->length = length; + s->data = AUBIO_ARRAY(lsmp_t*,s->channels); + for (i=0; i< s->channels; i++) { + s->data[i] = AUBIO_ARRAY(lsmp_t, s->length); + for (j=0; j< s->length; j++) { + s->data[i][j]=0.; + } + } + return s; +} + +void del_lvec(lvec_t *s) { + uint_t i; + for (i=0; ichannels; i++) { + AUBIO_FREE(s->data[i]); + } + AUBIO_FREE(s->data); + AUBIO_FREE(s); +} + +void lvec_write_sample(lvec_t *s, lsmp_t data, uint_t channel, uint_t position) { + s->data[channel][position] = data; +} +lsmp_t lvec_read_sample(lvec_t *s, uint_t channel, uint_t position) { + return s->data[channel][position]; +} +void lvec_put_channel(lvec_t *s, lsmp_t * data, uint_t channel) { + s->data[channel] = data; +} +lsmp_t * lvec_get_channel(lvec_t *s, uint_t channel) { + return s->data[channel]; +} + +lsmp_t ** lvec_get_data(lvec_t *s) { + return s->data; +} + diff --git a/src/lvec.h b/src/lvec.h new file mode 100644 index 00000000..d03af876 --- /dev/null +++ b/src/lvec.h @@ -0,0 +1,120 @@ +/* + Copyright (C) 2003-2007 Paul Brossier + + This program 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 2 of the License, or + (at your option) any later version. + + This program 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 this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifndef _LVEC_H +#define _LVEC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** \file + + Real buffers + + This file specifies the lvec_t buffer type, which is used in aubio to + store double precision real data. + +*/ + +/** Sample buffer type */ +typedef struct _lvec_t lvec_t; +/** Buffer for real values */ +struct _lvec_t { + uint_t length; /**< length of buffer */ + uint_t channels; /**< number of channels */ + lsmp_t **data; /**< data array of size [length] * [channels] */ +}; +/** lvec_t buffer creation function + + \param length the length of the buffer to create + \param channels the number of channels in the buffer + +*/ +lvec_t * new_lvec(uint_t length, uint_t channels); +/** lvec_t buffer deletion function + + \param s buffer to delete as returned by new_lvec() + +*/ +void del_lvec(lvec_t *s); +/** read sample value in a buffer + + Note that this function is not used in the aubio library, since the same + result can be obtained using vec->data[channel][position]. Its purpose is to + access these values from wrappers, as created by swig. + + \param s vector to read from + \param channel channel to read from + \param position sample position to read from + +*/ +lsmp_t lvec_read_sample(lvec_t *s, uint_t channel, uint_t position); +/** write sample value in a buffer + + Note that this function is not used in the aubio library, since the same + result can be obtained by assigning vec->data[channel][position]. Its purpose + is to access these values from wrappers, as created by swig. + + \param s vector to write to + \param data value to write in s->data[channel][position] + \param channel channel to write to + \param position sample position to write to + +*/ +void lvec_write_sample(lvec_t *s, lsmp_t data, uint_t channel, uint_t position); +/** read channel vector from a buffer + + Note that this function is not used in the aubio library, since the same + result can be obtained with vec->data[channel]. Its purpose is to access + these values from wrappers, as created by swig. + + \param s vector to read from + \param channel channel to read from + +*/ +lsmp_t * lvec_get_channel(lvec_t *s, uint_t channel); +/** write channel vector into a buffer + + Note that this function is not used in the aubio library, since the same + result can be obtained by assigning vec->data[channel]. Its purpose is to + access these values from wrappers, as created by swig. + + \param s vector to write to + \param data vector of [length] values to write + \param channel channel to write to + +*/ +void lvec_put_channel(lvec_t *s, lsmp_t * data, uint_t channel); +/** read data from a buffer + + Note that this function is not used in the aubio library, since the same + result can be obtained with vec->data. Its purpose is to access these values + from wrappers, as created by swig. + + \param s vector to read from + +*/ +lsmp_t ** lvec_get_data(lvec_t *s); + +#ifdef __cplusplus +} +#endif + +#endif /* _LVEC_H */ -- 2.26.2