unify include guard defines, __$FILENAME__
[blender-staging.git] / intern / audaspace / FX / AUD_BaseIIRFilterReader.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * Copyright 2009-2011 Jörg Hermann Müller
5  *
6  * This file is part of AudaSpace.
7  *
8  * Audaspace is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * AudaSpace is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with Audaspace; if not, write to the Free Software Foundation,
20  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21  *
22  * ***** END GPL LICENSE BLOCK *****
23  */
24
25 /** \file audaspace/FX/AUD_BaseIIRFilterReader.h
26  *  \ingroup audfx
27  */
28
29
30 #ifndef __AUD_BASEIIRFILTERREADER_H__
31 #define __AUD_BASEIIRFILTERREADER_H__
32
33 #include "AUD_EffectReader.h"
34 #include "AUD_Buffer.h"
35
36 /**
37  * This class is a base class for infinite impulse response filters.
38  */
39 class AUD_BaseIIRFilterReader : public AUD_EffectReader
40 {
41 private:
42         /**
43          * Specs.
44          */
45         AUD_Specs m_specs;
46
47         /**
48          * Length of input samples needed.
49          */
50         int m_xlen;
51
52         /**
53          * Length of output samples needed.
54          */
55         int m_ylen;
56
57         /**
58          * The last in samples array.
59          */
60         sample_t* m_x;
61
62         /**
63          * The last out samples array.
64          */
65         sample_t* m_y;
66
67         /**
68          * Position of the current input sample in the input array.
69          */
70         int m_xpos;
71
72         /**
73          * Position of the current output sample in the output array.
74          */
75         int m_ypos;
76
77         /**
78          * Current channel.
79          */
80         int m_channel;
81
82         // hide copy constructor and operator=
83         AUD_BaseIIRFilterReader(const AUD_BaseIIRFilterReader&);
84         AUD_BaseIIRFilterReader& operator=(const AUD_BaseIIRFilterReader&);
85
86 protected:
87         /**
88          * Creates a new base IIR filter reader.
89          * \param reader The reader to read from.
90          * \param in The count of past input samples needed.
91          * \param out The count of past output samples needed.
92          */
93         AUD_BaseIIRFilterReader(AUD_Reference<AUD_IReader> reader, int in, int out);
94
95         void setLengths(int in, int out);
96
97 public:
98         /**
99          * Retrieves the last input samples.
100          * \param pos The position, valid are 0 (current) or negative values.
101          * \return The sample value.
102          */
103         inline sample_t x(int pos)
104         {
105                 return m_x[(m_xpos + pos + m_xlen) % m_xlen * m_specs.channels + m_channel];
106         }
107
108         /**
109          * Retrieves the last output samples.
110          * \param pos The position, valid are negative values.
111          * \return The sample value.
112          */
113         inline sample_t y(int pos)
114         {
115                 return m_y[(m_ypos + pos + m_ylen) % m_ylen * m_specs.channels + m_channel];
116         }
117
118         virtual ~AUD_BaseIIRFilterReader();
119
120         virtual void read(int& length, bool& eos, sample_t* buffer);
121
122         /**
123          * Runs the filtering function.
124          * \return The current output sample value.
125          */
126         virtual sample_t filter()=0;
127
128         /**
129          * Notifies the filter about a sample rate change.
130          * \param rate The new sample rate.
131          */
132         virtual void sampleRateChanged(AUD_SampleRate rate);
133 };
134
135 #endif //__AUD_BASEIIRFILTERREADER_H__