summaryrefslogtreecommitdiff
path: root/libs/zita-convolver/zita-convolver
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2018-10-11 00:52:37 +0200
committerRobin Gareus <robin@gareus.org>2018-10-20 00:24:38 +0200
commit8e78827deb605487ea8ca8ea27868ead32ba95c0 (patch)
tree3c1edd4b6477ac4cb09a7c51019f7a030b339858 /libs/zita-convolver/zita-convolver
parent876e780e4d93bd61b4b09e4a1bde6ac6c4530bad (diff)
NO-OP: clang-format whitespace
Diffstat (limited to 'libs/zita-convolver/zita-convolver')
-rw-r--r--libs/zita-convolver/zita-convolver/zita-convolver.h685
1 files changed, 337 insertions, 348 deletions
diff --git a/libs/zita-convolver/zita-convolver/zita-convolver.h b/libs/zita-convolver/zita-convolver/zita-convolver.h
index f8d9965f50..58253c0e5c 100644
--- a/libs/zita-convolver/zita-convolver/zita-convolver.h
+++ b/libs/zita-convolver/zita-convolver/zita-convolver.h
@@ -1,7 +1,7 @@
// ----------------------------------------------------------------------------
//
// Copyright (C) 2006-2018 Fons Adriaensen <fons@linuxaudio.org>
-//
+//
// 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 3 of the License, or
@@ -17,57 +17,73 @@
//
// ----------------------------------------------------------------------------
-
#ifndef _ZITA_CONVOLVER_H
#define _ZITA_CONVOLVER_H
+#include <fftw3.h>
#include <pthread.h>
#include <stdint.h>
-#include <fftw3.h>
#include "zita-convolver/zconvolver_visibility.h"
namespace ArdourZita {
-
#ifdef ZCSEMA_IS_IMPLEMENTED
#undef ZCSEMA_IS_IMPLEMENTED
#endif
-
-#if defined(__linux__) || defined(__GNU__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+#if defined(__linux__) || defined(__GNU__) || defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
#include <semaphore.h>
class LIBZCONVOLVER_API ZCsema
{
public:
+ ZCsema (void)
+ {
+ init (0, 0);
+ }
+
+ ~ZCsema (void)
+ {
+ sem_destroy (&_sema);
+ }
- ZCsema (void) { init (0, 0); }
- ~ZCsema (void) { sem_destroy (&_sema); }
+ ZCsema (const ZCsema&); // disabled
+ ZCsema& operator= (const ZCsema&); // disabled
- ZCsema (const ZCsema&); // disabled
- ZCsema& operator= (const ZCsema&); // disabled
+ int init (int s, int v)
+ {
+ return sem_init (&_sema, s, v);
+ }
- int init (int s, int v) { return sem_init (&_sema, s, v); }
- int post (void) { return sem_post (&_sema); }
- int wait (void) { return sem_wait (&_sema); }
- int trywait (void) { return sem_trywait (&_sema); }
+ int post (void)
+ {
+ return sem_post (&_sema);
+ }
-private:
+ int wait (void)
+ {
+ return sem_wait (&_sema);
+ }
- sem_t _sema;
+ int trywait (void)
+ {
+ return sem_trywait (&_sema);
+ }
+
+private:
+ sem_t _sema;
};
#define ZCSEMA_IS_IMPLEMENTED
#endif
-
#ifdef __APPLE__
// NOTE: ***** I DO NOT REPEAT NOT PROVIDE SUPPORT FOR OSX *****
-//
+//
// The following code partially emulates the POSIX sem_t for which
// OSX has only a crippled implementation. It may or may not compile,
// and if it compiles it may or may not work correctly. Blame APPLE
@@ -76,392 +92,365 @@ private:
class LIBZCONVOLVER_API ZCsema
{
public:
+ ZCsema (void) : _count (0)
+ {
+ init (0, 0);
+ }
- ZCsema (void) : _count (0)
- {
- init (0, 0);
- }
-
- ~ZCsema (void)
- {
- pthread_mutex_destroy (&_mutex);
- pthread_cond_destroy (&_cond);
- }
-
- ZCsema (const ZCsema&); // disabled
- ZCsema& operator= (const ZCsema&); // disabled
-
- int init (int s, int v)
- {
- _count = v;
- return pthread_mutex_init (&_mutex, 0) || pthread_cond_init (&_cond, 0);
- }
-
- int post (void)
- {
- pthread_mutex_lock (&_mutex);
- _count++;
- if (_count == 1) pthread_cond_signal (&_cond);
- pthread_mutex_unlock (&_mutex);
- return 0;
- }
-
- int wait (void)
- {
- pthread_mutex_lock (&_mutex);
- while (_count < 1) pthread_cond_wait (&_cond, &_mutex);
- _count--;
- pthread_mutex_unlock (&_mutex);
- return 0;
- }
-
- int trywait (void)
- {
- if (pthread_mutex_trylock (&_mutex)) return -1;
- if (_count < 1)
+ ~ZCsema (void)
{
- pthread_mutex_unlock (&_mutex);
- return -1;
+ pthread_mutex_destroy (&_mutex);
+ pthread_cond_destroy (&_cond);
}
- _count--;
- pthread_mutex_unlock (&_mutex);
- return 0;
- }
-private:
+ ZCsema (const ZCsema&); // disabled
+ ZCsema& operator= (const ZCsema&); // disabled
+
+ int init (int s, int v)
+ {
+ _count = v;
+ return pthread_mutex_init (&_mutex, 0) || pthread_cond_init (&_cond, 0);
+ }
+
+ int post (void)
+ {
+ pthread_mutex_lock (&_mutex);
+ _count++;
+ if (_count == 1)
+ pthread_cond_signal (&_cond);
+ pthread_mutex_unlock (&_mutex);
+ return 0;
+ }
+
+ int wait (void)
+ {
+ pthread_mutex_lock (&_mutex);
+ while (_count < 1)
+ pthread_cond_wait (&_cond, &_mutex);
+ _count--;
+ pthread_mutex_unlock (&_mutex);
+ return 0;
+ }
+
+ int trywait (void)
+ {
+ if (pthread_mutex_trylock (&_mutex))
+ return -1;
+ if (_count < 1) {
+ pthread_mutex_unlock (&_mutex);
+ return -1;
+ }
+ _count--;
+ pthread_mutex_unlock (&_mutex);
+ return 0;
+ }
- int _count;
- pthread_mutex_t _mutex;
- pthread_cond_t _cond;
+private:
+ int _count;
+ pthread_mutex_t _mutex;
+ pthread_cond_t _cond;
};
#define ZCSEMA_IS_IMPLEMENTED
#endif
-
#ifndef ZCSEMA_IS_IMPLEMENTED
#error "The ZCsema class is not implemented."
#endif
-
// ----------------------------------------------------------------------------
-
-class LIBZCONVOLVER_API Inpnode
+class LIBZCONVOLVER_API Inpnode
{
private:
+ friend class Convlevel;
- friend class Convlevel;
-
- Inpnode (uint16_t inp);
- ~Inpnode (void);
- void alloc_ffta (uint16_t npar, int32_t size);
- void free_ffta (void);
-
- Inpnode *_next;
- fftwf_complex **_ffta;
- uint16_t _npar;
- uint16_t _inp;
-};
+ Inpnode (uint16_t inp);
+ ~Inpnode (void);
+ void alloc_ffta (uint16_t npar, int32_t size);
+ void free_ffta (void);
+ Inpnode* _next;
+ fftwf_complex** _ffta;
+ uint16_t _npar;
+ uint16_t _inp;
+};
-class LIBZCONVOLVER_API Macnode
+class LIBZCONVOLVER_API Macnode
{
private:
-
- friend class Convlevel;
-
- Macnode (Inpnode *inpn);
- ~Macnode (void);
- void alloc_fftb (uint16_t npar);
- void free_fftb (void);
-
- Macnode *_next;
- Inpnode *_inpn;
- Macnode *_link;
- fftwf_complex **_fftb;
- uint16_t _npar;
+ friend class Convlevel;
+
+ Macnode (Inpnode* inpn);
+ ~Macnode (void);
+ void alloc_fftb (uint16_t npar);
+ void free_fftb (void);
+
+ Macnode* _next;
+ Inpnode* _inpn;
+ Macnode* _link;
+ fftwf_complex** _fftb;
+ uint16_t _npar;
};
-
-class LIBZCONVOLVER_API Outnode
+class LIBZCONVOLVER_API Outnode
{
private:
+ friend class Convlevel;
- friend class Convlevel;
+ Outnode (uint16_t out, int32_t size);
+ ~Outnode (void);
- Outnode (uint16_t out, int32_t size);
- ~Outnode (void);
-
- Outnode *_next;
- Macnode *_list;
- float *_buff [3];
- uint16_t _out;
+ Outnode* _next;
+ Macnode* _list;
+ float* _buff[3];
+ uint16_t _out;
};
-
class LIBZCONVOLVER_API Converror
{
public:
+ enum {
+ BAD_STATE = -1,
+ BAD_PARAM = -2,
+ MEM_ALLOC = -3
+ };
- enum
- {
- BAD_STATE = -1,
- BAD_PARAM = -2,
- MEM_ALLOC = -3
- };
-
- Converror (int error) : _error (error) {}
+ Converror (int error) : _error (error) {}
private:
-
- int _error;
+ int _error;
};
-
class LIBZCONVOLVER_API Convlevel
{
private:
-
- friend class Convproc;
-
- enum
- {
- OPT_FFTW_MEASURE = 1,
- OPT_VECTOR_MODE = 2,
- OPT_LATE_CONTIN = 4
- };
-
- enum
- {
- ST_IDLE,
- ST_TERM,
- ST_PROC
- };
-
- Convlevel (void);
- ~Convlevel (void);
-
- void configure (int prio,
- uint32_t offs,
- uint32_t npar,
- uint32_t parsize,
- uint32_t options);
-
- void impdata_write (uint32_t inp,
- uint32_t out,
- int32_t step,
- float *data,
- int32_t ind0,
- int32_t ind1,
- bool create);
-
- void impdata_clear (uint32_t inp,
- uint32_t out);
-
- void impdata_link (uint32_t inp1,
- uint32_t out1,
- uint32_t inp2,
- uint32_t out2);
-
- void reset (uint32_t inpsize,
- uint32_t outsize,
- float **inpbuff,
- float **outbuff);
-
- void start (int absprio, int policy);
-
- void process (bool sync);
-
- int readout (bool sync, uint32_t skipcnt);
-
- void stop (void);
-
- void cleanup (void);
-
- void fftswap (fftwf_complex *p);
-
- void print (FILE *F);
-
- static void *static_main (void *arg);
-
- void main (void);
-
- Macnode *findmacnode (uint32_t inp, uint32_t out, bool create);
-
-
- volatile uint32_t _stat; // current processing state
- int _prio; // relative priority
- uint32_t _offs; // offset from start of impulse response
- uint32_t _npar; // number of partitions
- uint32_t _parsize; // partition and outbut buffer size
- uint32_t _outsize; // step size for output buffer
- uint32_t _outoffs; // offset into output buffer
- uint32_t _inpsize; // size of shared input buffer
- uint32_t _inpoffs; // offset into input buffer
- uint32_t _options; // various options
- uint32_t _ptind; // rotating partition index
- uint32_t _opind; // rotating output buffer index
- int _bits; // bit identifiying this level
- int _wait; // number of unfinished cycles
- pthread_t _pthr; // posix thread executing this level
- ZCsema _trig; // sema used to trigger a cycle
- ZCsema _done; // sema used to wait for a cycle
- Inpnode *_inp_list; // linked list of active inputs
- Outnode *_out_list; // linked list of active outputs
- fftwf_plan _plan_r2c; // FFTW plan, forward FFT
- fftwf_plan _plan_c2r; // FFTW plan, inverse FFT
- float *_time_data; // workspace
- float *_prep_data; // workspace
- fftwf_complex *_freq_data; // workspace
- float **_inpbuff; // array of shared input buffers
- float **_outbuff; // array of shared output buffers
+ friend class Convproc;
+
+ enum {
+ OPT_FFTW_MEASURE = 1,
+ OPT_VECTOR_MODE = 2,
+ OPT_LATE_CONTIN = 4
+ };
+
+ enum {
+ ST_IDLE,
+ ST_TERM,
+ ST_PROC
+ };
+
+ Convlevel (void);
+ ~Convlevel (void);
+
+ void configure (int prio,
+ uint32_t offs,
+ uint32_t npar,
+ uint32_t parsize,
+ uint32_t options);
+
+ void impdata_write (uint32_t inp,
+ uint32_t out,
+ int32_t step,
+ float* data,
+ int32_t ind0,
+ int32_t ind1,
+ bool create);
+
+ void impdata_clear (uint32_t inp,
+ uint32_t out);
+
+ void impdata_link (uint32_t inp1,
+ uint32_t out1,
+ uint32_t inp2,
+ uint32_t out2);
+
+ void reset (uint32_t inpsize,
+ uint32_t outsize,
+ float** inpbuff,
+ float** outbuff);
+
+ void start (int absprio, int policy);
+
+ void process (bool sync);
+
+ int readout (bool sync, uint32_t skipcnt);
+
+ void stop (void);
+
+ void cleanup (void);
+
+ void fftswap (fftwf_complex* p);
+
+ void print (FILE* F);
+
+ static void* static_main (void* arg);
+
+ void main (void);
+
+ Macnode* findmacnode (uint32_t inp, uint32_t out, bool create);
+
+ volatile uint32_t _stat; // current processing state
+ int _prio; // relative priority
+ uint32_t _offs; // offset from start of impulse response
+ uint32_t _npar; // number of partitions
+ uint32_t _parsize; // partition and outbut buffer size
+ uint32_t _outsize; // step size for output buffer
+ uint32_t _outoffs; // offset into output buffer
+ uint32_t _inpsize; // size of shared input buffer
+ uint32_t _inpoffs; // offset into input buffer
+ uint32_t _options; // various options
+ uint32_t _ptind; // rotating partition index
+ uint32_t _opind; // rotating output buffer index
+ int _bits; // bit identifiying this level
+ int _wait; // number of unfinished cycles
+ pthread_t _pthr; // posix thread executing this level
+ ZCsema _trig; // sema used to trigger a cycle
+ ZCsema _done; // sema used to wait for a cycle
+ Inpnode* _inp_list; // linked list of active inputs
+ Outnode* _out_list; // linked list of active outputs
+ fftwf_plan _plan_r2c; // FFTW plan, forward FFT
+ fftwf_plan _plan_c2r; // FFTW plan, inverse FFT
+ float* _time_data; // workspace
+ float* _prep_data; // workspace
+ fftwf_complex* _freq_data; // workspace
+ float** _inpbuff; // array of shared input buffers
+ float** _outbuff; // array of shared output buffers
};
-
// ----------------------------------------------------------------------------
-
class LIBZCONVOLVER_API Convproc
{
public:
+ Convproc (void);
+ ~Convproc (void);
+
+ enum {
+ ST_IDLE,
+ ST_STOP,
+ ST_WAIT,
+ ST_PROC
+ };
+
+ enum {
+ FL_LATE = 0x0000FFFF,
+ FL_LOAD = 0x01000000
+ };
+
+ enum {
+ OPT_FFTW_MEASURE = Convlevel::OPT_FFTW_MEASURE,
+ OPT_VECTOR_MODE = Convlevel::OPT_VECTOR_MODE,
+ OPT_LATE_CONTIN = Convlevel::OPT_LATE_CONTIN
+ };
+
+ enum {
+ MAXINP = 64,
+ MAXOUT = 64,
+ MAXLEV = 8,
+ MINPART = 64,
+ MAXPART = 8192,
+ MAXDIVIS = 16,
+ MINQUANT = 16,
+ MAXQUANT = 8192
+ };
+
+ uint32_t state (void) const
+ {
+ return _state;
+ }
- Convproc (void);
- ~Convproc (void);
-
- enum
- {
- ST_IDLE,
- ST_STOP,
- ST_WAIT,
- ST_PROC
- };
-
- enum
- {
- FL_LATE = 0x0000FFFF,
- FL_LOAD = 0x01000000
- };
-
- enum
- {
- OPT_FFTW_MEASURE = Convlevel::OPT_FFTW_MEASURE,
- OPT_VECTOR_MODE = Convlevel::OPT_VECTOR_MODE,
- OPT_LATE_CONTIN = Convlevel::OPT_LATE_CONTIN
- };
-
- enum
- {
- MAXINP = 64,
- MAXOUT = 64,
- MAXLEV = 8,
- MINPART = 64,
- MAXPART = 8192,
- MAXDIVIS = 16,
- MINQUANT = 16,
- MAXQUANT = 8192
- };
-
- uint32_t state (void) const
- {
- return _state;
- }
-
- float *inpdata (uint32_t inp) const
- {
- return _inpbuff [inp] + _inpoffs;
- }
-
- float *outdata (uint32_t out) const
- {
- return _outbuff [out] + _outoffs;
- }
-
- int configure (uint32_t ninp,
- uint32_t nout,
- uint32_t maxsize,
- uint32_t quantum,
- uint32_t minpart,
- uint32_t maxpart,
- float density);
-
- int impdata_create (uint32_t inp,
- uint32_t out,
- int32_t step,
- float *data,
- int32_t ind0,
- int32_t ind1);
-
- int impdata_clear (uint32_t inp,
- uint32_t out);
-
- int impdata_update (uint32_t inp,
- uint32_t out,
- int32_t step,
- float *data,
- int32_t ind0,
- int32_t ind1);
-
- int impdata_link (uint32_t inp1,
- uint32_t out1,
- uint32_t inp2,
- uint32_t out2);
-
- // Deprecated, use impdata_link() instead.
- int impdata_copy (uint32_t inp1,
- uint32_t out1,
- uint32_t inp2,
- uint32_t out2)
- {
- return impdata_link (inp1, out1, inp2, out2);
- }
-
- void set_options (uint32_t options);
-
- void set_skipcnt (uint32_t skipcnt);
-
- int reset (void);
-
- int start_process (int abspri, int policy);
-
- int process (bool sync = false);
-
- int stop_process (void);
-
- bool check_stop (void);
-
- int cleanup (void);
-
- void print (FILE *F = stdout);
+ float* inpdata (uint32_t inp) const
+ {
+ return _inpbuff[inp] + _inpoffs;
+ }
-private:
+ float* outdata (uint32_t out) const
+ {
+ return _outbuff[out] + _outoffs;
+ }
- uint32_t _state; // current state
- float *_inpbuff [MAXINP]; // input buffers
- float *_outbuff [MAXOUT]; // output buffers
- uint32_t _inpoffs; // current offset in input buffers
- uint32_t _outoffs; // current offset in output buffers
- uint32_t _options; // option bits
- uint32_t _skipcnt; // number of frames to skip
- uint32_t _ninp; // number of inputs
- uint32_t _nout; // number of outputs
- uint32_t _quantum; // processing block size
- uint32_t _minpart; // smallest partition size
- uint32_t _maxpart; // largest allowed partition size
- uint32_t _nlevels; // number of partition sizes
- uint32_t _inpsize; // size of input buffers
- uint32_t _latecnt; // count of cycles ending too late
- Convlevel *_convlev [MAXLEV]; // array of processors
- void *_dummy [64];
-
- static float _mac_cost;
- static float _fft_cost;
-};
+ int configure (uint32_t ninp,
+ uint32_t nout,
+ uint32_t maxsize,
+ uint32_t quantum,
+ uint32_t minpart,
+ uint32_t maxpart,
+ float density);
+
+ int impdata_create (uint32_t inp,
+ uint32_t out,
+ int32_t step,
+ float* data,
+ int32_t ind0,
+ int32_t ind1);
+
+ int impdata_clear (uint32_t inp,
+ uint32_t out);
+
+ int impdata_update (uint32_t inp,
+ uint32_t out,
+ int32_t step,
+ float* data,
+ int32_t ind0,
+ int32_t ind1);
+
+ int impdata_link (uint32_t inp1,
+ uint32_t out1,
+ uint32_t inp2,
+ uint32_t out2);
+
+ // Deprecated, use impdata_link() instead.
+ int impdata_copy (uint32_t inp1,
+ uint32_t out1,
+ uint32_t inp2,
+ uint32_t out2)
+ {
+ return impdata_link (inp1, out1, inp2, out2);
+ }
+
+ void set_options (uint32_t options);
+
+ void set_skipcnt (uint32_t skipcnt);
+
+ int reset (void);
+ int start_process (int abspri, int policy);
+
+ int process (bool sync = false);
+
+ int stop_process (void);
+
+ bool check_stop (void);
+
+ int cleanup (void);
+
+ void print (FILE* F = stdout);
+
+private:
+ uint32_t _state; // current state
+ float* _inpbuff[MAXINP]; // input buffers
+ float* _outbuff[MAXOUT]; // output buffers
+ uint32_t _inpoffs; // current offset in input buffers
+ uint32_t _outoffs; // current offset in output buffers
+ uint32_t _options; // option bits
+ uint32_t _skipcnt; // number of frames to skip
+ uint32_t _ninp; // number of inputs
+ uint32_t _nout; // number of outputs
+ uint32_t _quantum; // processing block size
+ uint32_t _minpart; // smallest partition size
+ uint32_t _maxpart; // largest allowed partition size
+ uint32_t _nlevels; // number of partition sizes
+ uint32_t _inpsize; // size of input buffers
+ uint32_t _latecnt; // count of cycles ending too late
+ Convlevel* _convlev[MAXLEV]; // array of processors
+ void* _dummy[64];
+
+ static float _mac_cost;
+ static float _fft_cost;
+};
// ----------------------------------------------------------------------------
} /* end namespace */
#endif
-