1 #ifndef _digital_filter__hpp__included__
2 #define _digital_filter__hpp__included__
10 #define AMPLIFIER_GAIN_LINEAR 0
11 #define AMPLIFIER_GAIN_DB 1
12 #define AMPLIFIER_ATTENUATION_LINEAR 2
13 #define AMPLIFIER_ATTENUATION_DB 3
16 struct field_characteristics
18 typedef field_characteristics
<T
> self
;
19 static const T additive_identity
;
20 static const T multiplicative_identity
;
21 static const bool limited
;
22 static const T clip_min
;
23 static const T clip_max
;
29 typedef typename field_characteristics
<T
>::self characteristics
;
34 x
= field_characteristics
<T
>::additive_identity
;
35 y
= field_characteristics
<T
>::additive_identity
;
54 static npair
<T
> zero()
56 return npair(field_characteristics
<T
>::additive_identity
);
61 return npair(field_characteristics
<T
>::multiplicative_identity
);
74 npair
<T
> operator+(npair
<T
> another
)
76 return npair(x
+ another
.x
, y
+ another
.y
);
79 npair
<T
> operator-(npair
<T
> another
)
81 return npair(x
- another
.x
, y
- another
.y
);
89 npair
<T
> operator*(npair
<T
> another
)
91 return npair(x
* another
.x
, y
* another
.y
);
94 npair
<T
> operator*(base_type another
)
96 return npair(x
* another
, y
* another
);
99 npair
<T
> operator/(npair
<T
> another
)
101 return npair(x
/ another
.x
, y
/ another
.y
);
110 std::ostream
& operator<< (std::ostream
& os
, const npair
<T
>& pair
)
112 return os
<< "(" << pair
.get_x() << "," << pair
.get_y() << ")";
116 npair
<T
> operator*(T another
, npair
<T
> _this
)
118 return npair
<T
>(another
* _this
.get_x(), another
* _this
.get_y());
122 typedef npair
<double> filter_number_t
;
123 typedef npair
<short> sample_number_t
;
128 virtual filter_number_t
operator()(filter_number_t input
) = 0;
132 //a0*y0+a1*y1+...+an*yn = b0*x0+b1*x1+...+bm*xm
133 struct digital_filter
: public filter
135 digital_filter(const std::vector
<filter_number_t
>& num
);
136 digital_filter(const std::vector
<filter_number_t
>& num
, const std::vector
<filter_number_t
>& denum
);
138 filter_number_t
operator()(filter_number_t input
);
140 void init_numerator(const std::vector
<filter_number_t
>& num
);
141 void init_denumerator(const std::vector
<filter_number_t
>& num
);
142 std::vector
<filter_number_t
> filter_numerator
;
143 std::vector
<filter_number_t
> filter_denumerator
;
144 std::vector
<filter_number_t
> old_input
;
145 std::vector
<filter_number_t
> old_output
;
146 uint64_t sample_count
;
149 struct amplifier
: public filter
151 amplifier(filter_number_t::base_type amount
, int type
);
153 filter_number_t
operator()(filter_number_t input
);
155 filter_number_t::base_type linear_gain
;
158 struct silencer
: public filter
162 filter_number_t
operator()(filter_number_t input
);
165 struct composite_filter
: public filter
169 //Filt is deleted when composite_filter is destroyed.
170 void add(filter
& filt
);
171 filter_number_t
operator()(filter_number_t input
);
173 std::list
<filter
*> filters
;
176 struct trivial_filter
: public filter
180 filter_number_t
operator()(filter_number_t input
);
183 extern trivial_filter trivial
;
185 sample_number_t
downconvert(filter_number_t input
, uint64_t& clipped
);
186 filter_number_t
upconvert(sample_number_t input
);
193 //These release filter on destroy (except for trivial filter).
194 void set_input_filter(uint32_t permchan
, filter
& f
);
195 void set_output_filter(filter
& f
);
197 void set_channel_volume(uint32_t permchan
, filter_number_t volume
);
198 void send_sample(uint32_t permchan
, sample_number_t sample
);
199 sample_number_t
recv_sample();
201 uint64_t get_clip_count();
203 filter
& get_input_filter(uint32_t permchan
);
204 filter_number_t
get_input_volume(uint32_t permchan
);
205 filter_number_t accumulator
;
206 std::map
<uint32_t, filter_number_t
> input_volumes
;
207 std::map
<uint32_t, filter
*> input_filters
;
208 filter
* output_filter
;