Guitarix
gx_convolver.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2009, 2010 Hermann Meyer, James Warden, Andreas Degert
3  * Copyright (C) 2011 Pete Shorthose
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18  * --------------------------------------------------------------------------
19  */
20 
21 /* ------- This is the guitarix convolution Engine ------- */
22 
23 #pragma once
24 
25 #ifndef SRC_HEADERS_GX_CONVOLVER_H_
26 #define SRC_HEADERS_GX_CONVOLVER_H_
27 
28 #include <zita-convolver.h>
29 #include <gxwmm/gainline.h>
30 
31 #include <sndfile.hh>
32 
33 namespace gx_engine {
34 
35 /* GxConvolver */
36 
37 class Audiofile {
38 public:
39 
40  enum {
45  TYPE_AMB
46  };
47 
48  enum {
54  };
55 
56  enum {
57  ERR_NONE = 0,
58  ERR_MODE = -1,
59  ERR_TYPE = -2,
60  ERR_FORM = -3,
61  ERR_OPEN = -4,
62  ERR_SEEK = -5,
63  ERR_DATA = -6,
64  ERR_READ = -7,
65  ERR_WRITE = -8
66  };
67 
68  Audiofile(void);
69  ~Audiofile(void);
70 
71  int type(void) const { return _type; }
72  int form(void) const { return _form; }
73  int rate(void) const { return _rate; }
74  int chan(void) const { return _chan; }
75  unsigned int size(void) const { return _size; }
76 
77  int open_read(string name);
78  int close(void);
79 
80  int seek(unsigned int posit);
81  int read(float *data, unsigned int frames);
82 
83 private:
84 
85  void reset(void);
86 
87  SNDFILE *_sndfile;
88  int _type;
89  int _form;
90  int _rate;
91  int _chan;
92  unsigned int _size;
93 };
94 
95 bool read_audio(const std::string& filename, unsigned int *audio_size, int *audio_chan,
96  int *audio_type, int *audio_form, int *audio_rate, float **buffer);
97 
98 class GxConvolverBase: protected Convproc {
99 protected:
100  volatile bool ready;
101  bool sync;
102  void adjust_values(unsigned int audio_size, unsigned int& count, unsigned int& offset,
103  unsigned int& delay, unsigned int& ldelay, unsigned int& length,
104  unsigned int& size, unsigned int& bufsize);
105  unsigned int buffersize;
106  unsigned int samplerate;
107  GxConvolverBase(): ready(false), sync(false), buffersize(), samplerate() {}
109 public:
110  inline void set_buffersize(unsigned int sz) { buffersize = sz; }
111  inline unsigned int get_buffersize() { return buffersize; }
112  inline void set_samplerate(unsigned int sr) { samplerate = sr; }
113  inline unsigned int get_samplerate() { return samplerate; }
114  bool checkstate();
115  using Convproc::state;
116  inline void set_not_runnable() { ready = false; }
117  inline bool is_runnable() { return ready; }
118  bool start(int policy, int priority);
119  using Convproc::stop_process;
120  inline void set_sync(bool val) { sync = val; }
121 };
122 
124 private:
126  bool read_sndfile(Audiofile& audio, int nchan, int samplerate, const float *gain,
127  unsigned int *delay, unsigned int offset, unsigned int length,
128  const Gainline& points);
129 public:
131  bool configure(
132  string fname, float gain, float lgain,
133  unsigned int delay, unsigned int ldelay, unsigned int offset,
134  unsigned int length, unsigned int size, unsigned int bufsize,
135  const Gainline& gainline);
136  bool compute(int count, float* input1, float *input2, float *output1, float *output2);
137  bool configure(string fname, float gain, unsigned int delay, unsigned int offset,
138  unsigned int length, unsigned int size, unsigned int bufsize,
139  const Gainline& gainline);
140  bool compute(int count, float* input, float *output);
141  static void compute_interpolation(double& fct, double& gp, unsigned int& idx,
142  const Gainline& points, int offset);
143 };
144 
146  double& fct, double& gp, unsigned int& idx, const Gainline& points, int offset) {
147  fct = (points[idx+1].g-points[idx].g)/(20*(points[idx+1].i-points[idx].i));
148  gp = points[idx].g/20 + fct * (offset-points[idx].i);
149  idx++;
150 }
151 
152 
154 private:
156 public:
158  : GxConvolverBase(), resamp(resamp_) {}
159  bool configure(int count, float *impresp, unsigned int imprate);
160  bool update(int count, float *impresp, unsigned int imprate);
161  bool compute(int count, float* input, float *output);
162  bool compute(int count, float* buffer) {
163  return is_runnable() ? compute(count, buffer, buffer) : true;
164  }
165 
166  bool configure_stereo(int count, float *impresp, unsigned int imprate);
167  bool update_stereo(int count, float *impresp, unsigned int imprate);
168  bool compute_stereo(int count, float* input, float* input1, float *output, float *output1);
169  bool compute_stereo(int count, float* buffer, float* buffer1)
170  {
171  return is_runnable() ? compute_stereo(count, buffer, buffer1, buffer, buffer1) : true;
172  }
173 };
174 
175 } /* end of gx_engine namespace */
176 #endif // SRC_HEADERS_GX_CONVOLVER_H_
gx_engine::GxConvolver::compute
bool compute(int count, float *input1, float *input2, float *output1, float *output2)
gx_engine::Audiofile
Definition: gx_convolver.h:37
gx_engine::GxConvolverBase::set_sync
void set_sync(bool val)
Definition: gx_convolver.h:120
gx_engine::GxSimpleConvolver::configure
bool configure(int count, float *impresp, unsigned int imprate)
gx_engine::Audiofile::FORM_32BIT
@ FORM_32BIT
Definition: gx_convolver.h:52
gx_engine::Audiofile::read
int read(float *data, unsigned int frames)
gx_engine::GxConvolverBase::get_buffersize
unsigned int get_buffersize()
Definition: gx_convolver.h:111
gx_engine::GxConvolverBase::~GxConvolverBase
~GxConvolverBase()
gx_engine::Audiofile::~Audiofile
~Audiofile(void)
gx_resample::StreamingResampler
Definition: gx_resampler.h:50
gx_engine::Audiofile::ERR_OPEN
@ ERR_OPEN
Definition: gx_convolver.h:61
gx_engine::Audiofile::ERR_READ
@ ERR_READ
Definition: gx_convolver.h:64
gx_engine::Audiofile::Audiofile
Audiofile(void)
gx_engine::Audiofile::ERR_WRITE
@ ERR_WRITE
Definition: gx_convolver.h:65
gx_engine::Audiofile::_sndfile
SNDFILE * _sndfile
Definition: gx_convolver.h:87
gx_engine::GxSimpleConvolver::update_stereo
bool update_stereo(int count, float *impresp, unsigned int imprate)
gx_engine::Audiofile::FORM_16BIT
@ FORM_16BIT
Definition: gx_convolver.h:50
gx_engine::Audiofile::chan
int chan(void) const
Definition: gx_convolver.h:74
gx_engine::GxConvolver::configure
bool configure(string fname, float gain, float lgain, unsigned int delay, unsigned int ldelay, unsigned int offset, unsigned int length, unsigned int size, unsigned int bufsize, const Gainline &gainline)
gx_engine::GxConvolverBase::set_samplerate
void set_samplerate(unsigned int sr)
Definition: gx_convolver.h:112
gx_engine::Audiofile::seek
int seek(unsigned int posit)
gx_engine::GxConvolverBase::start
bool start(int policy, int priority)
gx_engine::GxConvolver::compute
bool compute(int count, float *input, float *output)
gx_engine::Audiofile::type
int type(void) const
Definition: gx_convolver.h:71
gx_engine::Audiofile::TYPE_CAF
@ TYPE_CAF
Definition: gx_convolver.h:42
gx_engine::Audiofile::_chan
int _chan
Definition: gx_convolver.h:91
gx_engine::GxConvolver::resamp
gx_resample::StreamingResampler resamp
Definition: gx_convolver.h:125
gx_engine::GxConvolverBase::sync
bool sync
Definition: gx_convolver.h:101
gx_engine::Audiofile::TYPE_AIFF
@ TYPE_AIFF
Definition: gx_convolver.h:44
gx_engine::Audiofile::ERR_DATA
@ ERR_DATA
Definition: gx_convolver.h:63
gx_resample::BufferResampler
Definition: gx_resampler.h:45
gx_engine::Audiofile::FORM_OTHER
@ FORM_OTHER
Definition: gx_convolver.h:49
gx_engine::Audiofile::_type
int _type
Definition: gx_convolver.h:88
gx_engine::GxSimpleConvolver::compute
bool compute(int count, float *input, float *output)
gx_engine::GxConvolver::compute_interpolation
static void compute_interpolation(double &fct, double &gp, unsigned int &idx, const Gainline &points, int offset)
Definition: gx_convolver.h:145
gx_engine::GxConvolverBase::GxConvolverBase
GxConvolverBase()
Definition: gx_convolver.h:107
gx_engine::GxConvolverBase::buffersize
unsigned int buffersize
Definition: gx_convolver.h:105
gx_engine::GxSimpleConvolver::GxSimpleConvolver
GxSimpleConvolver(gx_resample::BufferResampler &resamp_)
Definition: gx_convolver.h:157
gx_engine::Audiofile::ERR_MODE
@ ERR_MODE
Definition: gx_convolver.h:58
gx_engine
Definition: gx_convolver.h:33
gx_engine::Audiofile::TYPE_AMB
@ TYPE_AMB
Definition: gx_convolver.h:45
gx_engine::Audiofile::ERR_TYPE
@ ERR_TYPE
Definition: gx_convolver.h:59
gx_engine::GxConvolverBase
Definition: gx_convolver.h:98
gx_engine::GxConvolverBase::is_runnable
bool is_runnable()
Definition: gx_convolver.h:117
gx_engine::GxConvolver::configure
bool configure(string fname, float gain, unsigned int delay, unsigned int offset, unsigned int length, unsigned int size, unsigned int bufsize, const Gainline &gainline)
gx_engine::Audiofile::size
unsigned int size(void) const
Definition: gx_convolver.h:75
gx_engine::Audiofile::ERR_SEEK
@ ERR_SEEK
Definition: gx_convolver.h:62
gx_engine::GxSimpleConvolver::compute_stereo
bool compute_stereo(int count, float *buffer, float *buffer1)
Definition: gx_convolver.h:169
gx_engine::Audiofile::TYPE_WAV
@ TYPE_WAV
Definition: gx_convolver.h:43
gx_engine::Audiofile::FORM_24BIT
@ FORM_24BIT
Definition: gx_convolver.h:51
gx_engine::Audiofile::TYPE_OTHER
@ TYPE_OTHER
Definition: gx_convolver.h:41
gx_engine::GxSimpleConvolver::configure_stereo
bool configure_stereo(int count, float *impresp, unsigned int imprate)
gx_engine::Audiofile::_form
int _form
Definition: gx_convolver.h:89
gx_engine::Audiofile::_rate
int _rate
Definition: gx_convolver.h:90
gx_engine::Audiofile::ERR_NONE
@ ERR_NONE
Definition: gx_convolver.h:57
gx_engine::GxConvolverBase::set_buffersize
void set_buffersize(unsigned int sz)
Definition: gx_convolver.h:110
gx_engine::GxSimpleConvolver::update
bool update(int count, float *impresp, unsigned int imprate)
gx_engine::Audiofile::reset
void reset(void)
gx_engine::GxConvolver::GxConvolver
GxConvolver()
Definition: gx_convolver.h:130
gx_engine::GxConvolverBase::samplerate
unsigned int samplerate
Definition: gx_convolver.h:106
gx_engine::GxConvolverBase::ready
volatile bool ready
Definition: gx_convolver.h:100
gx_engine::GxConvolver::read_sndfile
bool read_sndfile(Audiofile &audio, int nchan, int samplerate, const float *gain, unsigned int *delay, unsigned int offset, unsigned int length, const Gainline &points)
gx_engine::read_audio
bool read_audio(const std::string &filename, unsigned int *audio_size, int *audio_chan, int *audio_type, int *audio_form, int *audio_rate, float **buffer)
gx_engine::GxSimpleConvolver::compute
bool compute(int count, float *buffer)
Definition: gx_convolver.h:162
gx_engine::GxConvolverBase::set_not_runnable
void set_not_runnable()
Definition: gx_convolver.h:116
gx_engine::GxConvolverBase::get_samplerate
unsigned int get_samplerate()
Definition: gx_convolver.h:113
gx_engine::GxSimpleConvolver::compute_stereo
bool compute_stereo(int count, float *input, float *input1, float *output, float *output1)
gx_engine::Audiofile::FORM_FLOAT
@ FORM_FLOAT
Definition: gx_convolver.h:53
gx_engine::GxConvolver
Definition: gx_convolver.h:123
gx_engine::GxConvolverBase::adjust_values
void adjust_values(unsigned int audio_size, unsigned int &count, unsigned int &offset, unsigned int &delay, unsigned int &ldelay, unsigned int &length, unsigned int &size, unsigned int &bufsize)
gx_engine::Audiofile::ERR_FORM
@ ERR_FORM
Definition: gx_convolver.h:60
gx_engine::Audiofile::close
int close(void)
gx_engine::GxConvolverBase::checkstate
bool checkstate()
gx_engine::Audiofile::rate
int rate(void) const
Definition: gx_convolver.h:73
gx_engine::GxSimpleConvolver::resamp
gx_resample::BufferResampler & resamp
Definition: gx_convolver.h:155
gx_engine::GxSimpleConvolver
Definition: gx_convolver.h:153
gx_engine::Audiofile::_size
unsigned int _size
Definition: gx_convolver.h:92
gx_engine::Audiofile::form
int form(void) const
Definition: gx_convolver.h:72
gx_engine::Audiofile::open_read
int open_read(string name)