tizen 2.0 init
[framework/multimedia/gst-plugins-good0.10.git] / docs / plugins / html / gst-plugins-good-plugins-audiofirfilter.html
1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
2 <html>
3 <head>
4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
5 <title>audiofirfilter</title>
6 <meta name="generator" content="DocBook XSL Stylesheets V1.76.1">
7 <link rel="home" href="index.html" title="GStreamer Good Plugins 0.10 Plugins Reference Manual">
8 <link rel="up" href="ch01.html" title="gst-plugins-good Elements">
9 <link rel="prev" href="gst-plugins-good-plugins-audiocheblimit.html" title="audiocheblimit">
10 <link rel="next" href="gst-plugins-good-plugins-audioiirfilter.html" title="audioiirfilter">
11 <meta name="generator" content="GTK-Doc V1.18 (XML mode)">
12 <link rel="stylesheet" href="style.css" type="text/css">
13 </head>
14 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
15 <table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="2">
16 <tr valign="middle">
17 <td><a accesskey="p" href="gst-plugins-good-plugins-audiocheblimit.html"><img src="left.png" width="24" height="24" border="0" alt="Prev"></a></td>
18 <td><a accesskey="u" href="ch01.html"><img src="up.png" width="24" height="24" border="0" alt="Up"></a></td>
19 <td><a accesskey="h" href="index.html"><img src="home.png" width="24" height="24" border="0" alt="Home"></a></td>
20 <th width="100%" align="center">GStreamer Good Plugins 0.10 Plugins Reference Manual</th>
21 <td><a accesskey="n" href="gst-plugins-good-plugins-audioiirfilter.html"><img src="right.png" width="24" height="24" border="0" alt="Next"></a></td>
22 </tr>
23 <tr><td colspan="5" class="shortcuts">
24 <a href="#gst-plugins-good-plugins-audiofirfilter.synopsis" class="shortcut">Top</a>
25                    | 
26                   <a href="#gst-plugins-good-plugins-audiofirfilter.description" class="shortcut">Description</a>
27                    | 
28                   <a href="#gst-plugins-good-plugins-audiofirfilter.object-hierarchy" class="shortcut">Object Hierarchy</a>
29                    | 
30                   <a href="#gst-plugins-good-plugins-audiofirfilter.properties" class="shortcut">Properties</a>
31                    | 
32                   <a href="#gst-plugins-good-plugins-audiofirfilter.signals" class="shortcut">Signals</a>
33 </td></tr>
34 </table>
35 <div class="refentry">
36 <a name="gst-plugins-good-plugins-audiofirfilter"></a><div class="titlepage"></div>
37 <div class="refnamediv"><table width="100%"><tr>
38 <td valign="top">
39 <h2><span class="refentrytitle"><a name="gst-plugins-good-plugins-audiofirfilter.top_of_page"></a>audiofirfilter</span></h2>
40 <p>audiofirfilter — Generic audio FIR filter with custom filter kernel</p>
41 </td>
42 <td valign="top" align="right"></td>
43 </tr></table></div>
44 <div class="refsynopsisdiv">
45 <a name="gst-plugins-good-plugins-audiofirfilter.synopsis"></a><h2>Synopsis</h2>
46 <a name="GstAudioFIRFilter"></a><pre class="synopsis">struct              <a class="link" href="gst-plugins-good-plugins-audiofirfilter.html#GstAudioFIRFilter-struct" title="struct GstAudioFIRFilter">GstAudioFIRFilter</a>;
47 </pre>
48 </div>
49 <div class="refsect1">
50 <a name="gst-plugins-good-plugins-audiofirfilter.object-hierarchy"></a><h2>Object Hierarchy</h2>
51 <pre class="synopsis">
52   <a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
53    +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
54          +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
55                +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseTransform.html">GstBaseTransform</a>
56                      +----<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstaudiofilter.html#GstAudioFilter">GstAudioFilter</a>
57                            +----GstAudioFXBaseFIRFilter
58                                  +----GstAudioFIRFilter
59 </pre>
60 </div>
61 <div class="refsect1">
62 <a name="gst-plugins-good-plugins-audiofirfilter.properties"></a><h2>Properties</h2>
63 <pre class="synopsis">
64   "<a class="link" href="gst-plugins-good-plugins-audiofirfilter.html#GstAudioFIRFilter--kernel" title='The "kernel" property'>kernel</a>"                   <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Value-arrays.html#GValueArray"><span class="type">GValueArray</span></a>*          : Read / Write
65   "<a class="link" href="gst-plugins-good-plugins-audiofirfilter.html#GstAudioFIRFilter--latency" title='The "latency" property'>latency</a>"                  <span class="type">guint64</span>               : Read / Write
66 </pre>
67 </div>
68 <div class="refsect1">
69 <a name="gst-plugins-good-plugins-audiofirfilter.signals"></a><h2>Signals</h2>
70 <pre class="synopsis">
71   "<a class="link" href="gst-plugins-good-plugins-audiofirfilter.html#GstAudioFIRFilter-rate-changed" title='The "rate-changed" signal'>rate-changed</a>"                                   : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a>
72 </pre>
73 </div>
74 <div class="refsect1">
75 <a name="gst-plugins-good-plugins-audiofirfilter.description"></a><h2>Description</h2>
76 <p>
77 audiofirfilter implements a generic audio <a class="ulink" href="http://en.wikipedia.org/wiki/Finite_impulse_response" target="_top">FIR filter</a>. Before usage the
78 "kernel" property has to be set to the filter kernel that should be
79 used and the "latency" property has to be set to the latency (in samples)
80 that is introduced by the filter kernel. Setting a latency of n samples
81 will lead to the first n samples being dropped from the output and
82 n samples added to the end.
83 </p>
84 <p>
85 The filter kernel describes the impulse response of the filter. To
86 calculate the frequency response of the filter you have to calculate
87 the Fourier Transform of the impulse response.
88 </p>
89 <p>
90 To change the filter kernel whenever the sampling rate changes the
91 "rate-changed" signal can be used. This should be done for most
92 FIR filters as they're depending on the sampling rate.
93 </p>
94 <p>
95 </p>
96 <div class="refsect2">
97 <a name="idp6117040"></a><h3>Example application</h3>
98 <div class="informalexample">
99   <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
100     <tbody>
101       <tr>
102         <td class="listing_lines" align="right"><pre>1
103 2
104 3
105 4
106 5
107 6
108 7
109 8
110 9
111 10
112 11
113 12
114 13
115 14
116 15
117 16
118 17
119 18
120 19
121 20
122 21
123 22
124 23
125 24
126 25
127 26
128 27
129 28
130 29
131 30
132 31
133 32
134 33
135 34
136 35
137 36
138 37
139 38
140 39
141 40
142 41
143 42
144 43
145 44
146 45
147 46
148 47
149 48
150 49
151 50
152 51
153 52
154 53
155 54
156 55
157 56
158 57
159 58
160 59
161 60
162 61
163 62
164 63
165 64
166 65
167 66
168 67
169 68
170 69
171 70
172 71
173 72
174 73
175 74
176 75
177 76
178 77
179 78
180 79
181 80
182 81
183 82
184 83
185 84
186 85
187 86
188 87
189 88
190 89
191 90
192 91
193 92
194 93
195 94
196 95
197 96
198 97
199 98
200 99
201 100
202 101
203 102
204 103
205 104
206 105
207 106
208 107
209 108
210 109
211 110
212 111
213 112
214 113
215 114
216 115
217 116
218 117
219 118
220 119
221 120
222 121
223 122
224 123
225 124
226 125
227 126
228 127
229 128
230 129
231 130
232 131
233 132
234 133
235 134
236 135
237 136
238 137
239 138
240 139
241 140
242 141
243 142
244 143
245 144
246 145
247 146
248 147
249 148
250 149
251 150
252 151
253 152
254 153
255 154
256 155
257 156
258 157
259 158
260 159
261 160
262 161</pre></td>
263         <td class="listing_code"><pre class="programlisting"><span class="comment">/* GStreamer</span>
264 <span class="comment"> * Copyright (C) 2009 Sebastian Droege &lt;sebastian.droege&#64;collabora.co.uk&gt;</span>
265 <span class="comment"> *</span>
266 <span class="comment"> * This library is free software; you can redistribute it and/or</span>
267 <span class="comment"> * modify it under the terms of the GNU Library General Public</span>
268 <span class="comment"> * License as published by the Free Software Foundation; either</span>
269 <span class="comment"> * version 2 of the License, or (at your option) any later version.</span>
270 <span class="comment"> *</span>
271 <span class="comment"> * This library is distributed in the hope that it will be useful,</span>
272 <span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
273 <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</span>
274 <span class="comment"> * Library General Public License for more details.</span>
275 <span class="comment"> *</span>
276 <span class="comment"> * You should have received a copy of the GNU Library General Public</span>
277 <span class="comment"> * License along with this library; if not, write to the</span>
278 <span class="comment"> * Free Software Foundation, Inc., 59 Temple Place - Suite 330,</span>
279 <span class="comment"> * Boston, MA 02111-1307, USA.</span>
280 <span class="comment"> */</span>
281
282 <span class="comment">/* This small sample application creates a bandpass FIR filter</span>
283 <span class="comment"> * by transforming the frequency response to the filter kernel.</span>
284 <span class="comment"> */</span>
285
286 <span class="gtkdoc ppc">#include &lt;string.h&gt;</span>
287 <span class="gtkdoc ppc">#include &lt;math.h&gt;</span>
288
289 <span class="gtkdoc ppc">#include &lt;gst/gst.h&gt;</span>
290 <span class="gtkdoc ppc">#include &lt;gst/fft/gstfftf64.h&gt;</span>
291
292 <span class="gtkdoc kwb">static</span> gboolean
293 <span class="function">on_message</span> <span class="gtkdoc opt">(</span>GstBus <span class="gtkdoc opt">*</span> bus<span class="gtkdoc opt">,</span> GstMessage <span class="gtkdoc opt">*</span> message<span class="gtkdoc opt">,</span> gpointer user_data<span class="gtkdoc opt">)</span>
294 <span class="gtkdoc opt">{</span>
295   GMainLoop <span class="gtkdoc opt">*</span>loop <span class="gtkdoc opt">= (</span>GMainLoop <span class="gtkdoc opt">*)</span> user_data<span class="gtkdoc opt">;</span>
296
297   <span class="keyword">switch</span> <span class="gtkdoc opt">(</span><span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-GstMessage.html#GST-MESSAGE-TYPE:CAPS">GST_MESSAGE_TYPE</a></span> <span class="gtkdoc opt">(</span>message<span class="gtkdoc opt">)) {</span>
298     <span class="keyword">case</span> GST_MESSAGE_ERROR<span class="gtkdoc opt">:</span>
299       <span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Message-Logging.html#g-error">g_error</a></span> <span class="gtkdoc opt">(</span><span class="string">&quot;Got ERROR&quot;</span><span class="gtkdoc opt">);</span>
300       <span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#g-main-loop-quit">g_main_loop_quit</a></span> <span class="gtkdoc opt">(</span>loop<span class="gtkdoc opt">);</span>
301       <span class="keyword">break</span><span class="gtkdoc opt">;</span>
302     <span class="keyword">case</span> GST_MESSAGE_WARNING<span class="gtkdoc opt">:</span>
303       <span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Message-Logging.html#g-warning">g_warning</a></span> <span class="gtkdoc opt">(</span><span class="string">&quot;Got WARNING&quot;</span><span class="gtkdoc opt">);</span>
304       <span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#g-main-loop-quit">g_main_loop_quit</a></span> <span class="gtkdoc opt">(</span>loop<span class="gtkdoc opt">);</span>
305       <span class="keyword">break</span><span class="gtkdoc opt">;</span>
306     <span class="keyword">case</span> GST_MESSAGE_EOS<span class="gtkdoc opt">:</span>
307       <span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#g-main-loop-quit">g_main_loop_quit</a></span> <span class="gtkdoc opt">(</span>loop<span class="gtkdoc opt">);</span>
308       <span class="keyword">break</span><span class="gtkdoc opt">;</span>
309     <span class="keyword">default</span><span class="gtkdoc opt">:</span>
310       <span class="keyword">break</span><span class="gtkdoc opt">;</span>
311   <span class="gtkdoc opt">}</span>
312
313   <span class="keyword">return</span> TRUE<span class="gtkdoc opt">;</span>
314 <span class="gtkdoc opt">}</span>
315
316 <span class="gtkdoc kwb">static void</span>
317 <span class="function">on_rate_changed</span> <span class="gtkdoc opt">(</span>GstElement <span class="gtkdoc opt">*</span> element<span class="gtkdoc opt">,</span> gint rate<span class="gtkdoc opt">,</span> gpointer user_data<span class="gtkdoc opt">)</span>
318 <span class="gtkdoc opt">{</span>
319   GValueArray <span class="gtkdoc opt">*</span>va<span class="gtkdoc opt">;</span>
320   GValue v <span class="gtkdoc opt">= {</span> <span class="number">0</span><span class="gtkdoc opt">, };</span>
321   GstFFTF64 <span class="gtkdoc opt">*</span>fft<span class="gtkdoc opt">;</span>
322   GstFFTF64Complex frequency_response<span class="gtkdoc opt">[</span><span class="number">17</span><span class="gtkdoc opt">];</span>
323   gdouble tmp<span class="gtkdoc opt">[</span><span class="number">32</span><span class="gtkdoc opt">];</span>
324   gdouble filter_kernel<span class="gtkdoc opt">[</span><span class="number">32</span><span class="gtkdoc opt">];</span>
325   guint i<span class="gtkdoc opt">;</span>
326
327   <span class="comment">/* Create the frequency response: zero outside</span>
328 <span class="comment">   * a small frequency band */</span>
329   <span class="keyword">for</span> <span class="gtkdoc opt">(</span>i <span class="gtkdoc opt">=</span> <span class="number">0</span><span class="gtkdoc opt">;</span> i <span class="gtkdoc opt">&lt;</span> <span class="number">17</span><span class="gtkdoc opt">;</span> i<span class="gtkdoc opt">++) {</span>
330     <span class="keyword">if</span> <span class="gtkdoc opt">(</span>i <span class="gtkdoc opt">&lt;</span> <span class="number">5</span> <span class="gtkdoc opt">||</span> i <span class="gtkdoc opt">&gt;</span> <span class="number">11</span><span class="gtkdoc opt">)</span>
331       frequency_response<span class="gtkdoc opt">[</span>i<span class="gtkdoc opt">].</span>r <span class="gtkdoc opt">=</span> <span class="number">0.0</span><span class="gtkdoc opt">;</span>
332     <span class="keyword">else</span>
333       frequency_response<span class="gtkdoc opt">[</span>i<span class="gtkdoc opt">].</span>r <span class="gtkdoc opt">=</span> <span class="number">1.0</span><span class="gtkdoc opt">;</span>
334
335     frequency_response<span class="gtkdoc opt">[</span>i<span class="gtkdoc opt">].</span>i <span class="gtkdoc opt">=</span> <span class="number">0.0</span><span class="gtkdoc opt">;</span>
336   <span class="gtkdoc opt">}</span>
337
338   <span class="comment">/* Calculate the inverse FT of the frequency response */</span>
339   fft <span class="gtkdoc opt">=</span> <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstfftf64.html#gst-fft-f64-new">gst_fft_f64_new</a></span> <span class="gtkdoc opt">(</span><span class="number">32</span><span class="gtkdoc opt">,</span> TRUE<span class="gtkdoc opt">);</span>
340   <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstfftf64.html#gst-fft-f64-inverse-fft">gst_fft_f64_inverse_fft</a></span> <span class="gtkdoc opt">(</span>fft<span class="gtkdoc opt">,</span> frequency_response<span class="gtkdoc opt">,</span> tmp<span class="gtkdoc opt">);</span>
341   <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstfftf64.html#gst-fft-f64-free">gst_fft_f64_free</a></span> <span class="gtkdoc opt">(</span>fft<span class="gtkdoc opt">);</span>
342
343   <span class="comment">/* Shift the inverse FT of the frequency response by 16,</span>
344 <span class="comment">   * i.e. the half of the kernel length to get the</span>
345 <span class="comment">   * impulse response. See http://www.dspguide.com/ch17/1.htm</span>
346 <span class="comment">   * for more information.</span>
347 <span class="comment">   */</span>
348   <span class="keyword">for</span> <span class="gtkdoc opt">(</span>i <span class="gtkdoc opt">=</span> <span class="number">0</span><span class="gtkdoc opt">;</span> i <span class="gtkdoc opt">&lt;</span> <span class="number">32</span><span class="gtkdoc opt">;</span> i<span class="gtkdoc opt">++)</span>
349     filter_kernel<span class="gtkdoc opt">[</span>i<span class="gtkdoc opt">] =</span> tmp<span class="gtkdoc opt">[(</span>i <span class="gtkdoc opt">+</span> <span class="number">16</span><span class="gtkdoc opt">) %</span> <span class="number">32</span><span class="gtkdoc opt">];</span>
350
351   <span class="comment">/* Apply the hamming window to the impulse response to get</span>
352 <span class="comment">   * a better result than given from the rectangular window</span>
353 <span class="comment">   */</span>
354   <span class="keyword">for</span> <span class="gtkdoc opt">(</span>i <span class="gtkdoc opt">=</span> <span class="number">0</span><span class="gtkdoc opt">;</span> i <span class="gtkdoc opt">&lt;</span> <span class="number">32</span><span class="gtkdoc opt">;</span> i<span class="gtkdoc opt">++)</span>
355     filter_kernel<span class="gtkdoc opt">[</span>i<span class="gtkdoc opt">] *= (</span><span class="number">0.54</span> <span class="gtkdoc opt">-</span> <span class="number">0.46</span> <span class="gtkdoc opt">*</span> <span class="function">cos</span> <span class="gtkdoc opt">(</span><span class="number">2</span> <span class="gtkdoc opt">*</span> G_PI <span class="gtkdoc opt">*</span> i <span class="gtkdoc opt">/</span> <span class="number">32</span><span class="gtkdoc opt">));</span>
356
357   va <span class="gtkdoc opt">=</span> <span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Value-arrays.html#g-value-array-new">g_value_array_new</a></span> <span class="gtkdoc opt">(</span><span class="number">1</span><span class="gtkdoc opt">);</span>
358
359   <span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#g-value-init">g_value_init</a></span> <span class="gtkdoc opt">(&amp;</span>v<span class="gtkdoc opt">,</span> G_TYPE_DOUBLE<span class="gtkdoc opt">);</span>
360   <span class="keyword">for</span> <span class="gtkdoc opt">(</span>i <span class="gtkdoc opt">=</span> <span class="number">0</span><span class="gtkdoc opt">;</span> i <span class="gtkdoc opt">&lt;</span> <span class="number">32</span><span class="gtkdoc opt">;</span> i<span class="gtkdoc opt">++) {</span>
361     <span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Standard-Parameter-and-Value-Types.html#g-value-set-double">g_value_set_double</a></span> <span class="gtkdoc opt">(&amp;</span>v<span class="gtkdoc opt">,</span> filter_kernel<span class="gtkdoc opt">[</span>i<span class="gtkdoc opt">]);</span>
362     <span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Value-arrays.html#g-value-array-append">g_value_array_append</a></span> <span class="gtkdoc opt">(</span>va<span class="gtkdoc opt">, &amp;</span>v<span class="gtkdoc opt">);</span>
363     <span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Generic-values.html#g-value-reset">g_value_reset</a></span> <span class="gtkdoc opt">(&amp;</span>v<span class="gtkdoc opt">);</span>
364   <span class="gtkdoc opt">}</span>
365   <span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#g-object-set">g_object_set</a></span> <span class="gtkdoc opt">(</span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#G-OBJECT:CAPS">G_OBJECT</a></span> <span class="gtkdoc opt">(</span>element<span class="gtkdoc opt">),</span> <span class="string">&quot;kernel&quot;</span><span class="gtkdoc opt">,</span> va<span class="gtkdoc opt">,</span> NULL<span class="gtkdoc opt">);</span>
366   <span class="comment">/* Latency is 1/2 of the kernel length for this method of</span>
367 <span class="comment">   * calculating a filter kernel from the frequency response</span>
368 <span class="comment">   */</span>
369   <span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#g-object-set">g_object_set</a></span> <span class="gtkdoc opt">(</span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#G-OBJECT:CAPS">G_OBJECT</a></span> <span class="gtkdoc opt">(</span>element<span class="gtkdoc opt">),</span> <span class="string">&quot;latency&quot;</span><span class="gtkdoc opt">, (</span>gint64<span class="gtkdoc opt">) (</span><span class="number">32</span> <span class="gtkdoc opt">/</span> <span class="number">2</span><span class="gtkdoc opt">),</span> NULL<span class="gtkdoc opt">);</span>
370   <span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Value-arrays.html#g-value-array-free">g_value_array_free</a></span> <span class="gtkdoc opt">(</span>va<span class="gtkdoc opt">);</span>
371 <span class="gtkdoc opt">}</span>
372
373 gint
374 <span class="function">main</span> <span class="gtkdoc opt">(</span>gint argc<span class="gtkdoc opt">,</span> gchar <span class="gtkdoc opt">*</span> argv<span class="gtkdoc opt">[])</span>
375 <span class="gtkdoc opt">{</span>
376   GstElement <span class="gtkdoc opt">*</span>pipeline<span class="gtkdoc opt">, *</span>src<span class="gtkdoc opt">, *</span>filter<span class="gtkdoc opt">, *</span>conv<span class="gtkdoc opt">, *</span>sink<span class="gtkdoc opt">;</span>
377   GstBus <span class="gtkdoc opt">*</span>bus<span class="gtkdoc opt">;</span>
378   GMainLoop <span class="gtkdoc opt">*</span>loop<span class="gtkdoc opt">;</span>
379
380   <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/gstreamer-Gst.html#gst-init">gst_init</a></span> <span class="gtkdoc opt">(</span>NULL<span class="gtkdoc opt">,</span> NULL<span class="gtkdoc opt">);</span>
381
382   pipeline <span class="gtkdoc opt">=</span> <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElementFactory.html#gst-element-factory-make">gst_element_factory_make</a></span> <span class="gtkdoc opt">(</span><span class="string">&quot;pipeline&quot;</span><span class="gtkdoc opt">,</span> NULL<span class="gtkdoc opt">);</span>
383
384   src <span class="gtkdoc opt">=</span> <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElementFactory.html#gst-element-factory-make">gst_element_factory_make</a></span> <span class="gtkdoc opt">(</span><span class="string">&quot;audiotestsrc&quot;</span><span class="gtkdoc opt">,</span> NULL<span class="gtkdoc opt">);</span>
385   <span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#g-object-set">g_object_set</a></span> <span class="gtkdoc opt">(</span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#G-OBJECT:CAPS">G_OBJECT</a></span> <span class="gtkdoc opt">(</span>src<span class="gtkdoc opt">),</span> <span class="string">&quot;wave&quot;</span><span class="gtkdoc opt">,</span> <span class="number">5</span><span class="gtkdoc opt">,</span> NULL<span class="gtkdoc opt">);</span>
386
387   filter <span class="gtkdoc opt">=</span> <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElementFactory.html#gst-element-factory-make">gst_element_factory_make</a></span> <span class="gtkdoc opt">(</span><span class="string">&quot;audiofirfilter&quot;</span><span class="gtkdoc opt">,</span> NULL<span class="gtkdoc opt">);</span>
388   <span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#g-signal-connect">g_signal_connect</a></span> <span class="gtkdoc opt">(</span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#G-OBJECT:CAPS">G_OBJECT</a></span> <span class="gtkdoc opt">(</span>filter<span class="gtkdoc opt">),</span> <span class="string">&quot;rate-changed&quot;</span><span class="gtkdoc opt">,</span>
389       <span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Closures.html#G-CALLBACK:CAPS">G_CALLBACK</a></span> <span class="gtkdoc opt">(</span>on_rate_changed<span class="gtkdoc opt">),</span> NULL<span class="gtkdoc opt">);</span>
390
391   conv <span class="gtkdoc opt">=</span> <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElementFactory.html#gst-element-factory-make">gst_element_factory_make</a></span> <span class="gtkdoc opt">(</span><span class="string">&quot;audioconvert&quot;</span><span class="gtkdoc opt">,</span> NULL<span class="gtkdoc opt">);</span>
392
393   sink <span class="gtkdoc opt">=</span> <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElementFactory.html#gst-element-factory-make">gst_element_factory_make</a></span> <span class="gtkdoc opt">(</span><span class="string">&quot;autoaudiosink&quot;</span><span class="gtkdoc opt">,</span> NULL<span class="gtkdoc opt">);</span>
394   <span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Warnings-and-Assertions.html#g-return-val-if-fail">g_return_val_if_fail</a></span> <span class="gtkdoc opt">(</span>sink <span class="gtkdoc opt">!=</span> NULL<span class="gtkdoc opt">, -</span><span class="number">1</span><span class="gtkdoc opt">);</span>
395
396   <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBin.html#gst-bin-add-many">gst_bin_add_many</a></span> <span class="gtkdoc opt">(</span><span class="function">GST_BIN</span> <span class="gtkdoc opt">(</span>pipeline<span class="gtkdoc opt">),</span> src<span class="gtkdoc opt">,</span> filter<span class="gtkdoc opt">,</span> conv<span class="gtkdoc opt">,</span> sink<span class="gtkdoc opt">,</span> NULL<span class="gtkdoc opt">);</span>
397   <span class="keyword">if</span> <span class="gtkdoc opt">(!</span><span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#gst-element-link-many">gst_element_link_many</a></span> <span class="gtkdoc opt">(</span>src<span class="gtkdoc opt">,</span> filter<span class="gtkdoc opt">,</span> conv<span class="gtkdoc opt">,</span> sink<span class="gtkdoc opt">,</span> NULL<span class="gtkdoc opt">)) {</span>
398     <span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Message-Logging.html#g-error">g_error</a></span> <span class="gtkdoc opt">(</span><span class="string">&quot;Failed to link elements&quot;</span><span class="gtkdoc opt">);</span>
399     <span class="keyword">return</span> <span class="gtkdoc opt">-</span><span class="number">2</span><span class="gtkdoc opt">;</span>
400   <span class="gtkdoc opt">}</span>
401
402   loop <span class="gtkdoc opt">=</span> <span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#g-main-loop-new">g_main_loop_new</a></span> <span class="gtkdoc opt">(</span>NULL<span class="gtkdoc opt">,</span> FALSE<span class="gtkdoc opt">);</span>
403
404   bus <span class="gtkdoc opt">=</span> <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPipeline.html#gst-pipeline-get-bus">gst_pipeline_get_bus</a></span> <span class="gtkdoc opt">(</span><span class="function">GST_PIPELINE</span> <span class="gtkdoc opt">(</span>pipeline<span class="gtkdoc opt">));</span>
405   <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBus.html#gst-bus-add-signal-watch">gst_bus_add_signal_watch</a></span> <span class="gtkdoc opt">(</span>bus<span class="gtkdoc opt">);</span>
406   <span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#g-signal-connect">g_signal_connect</a></span> <span class="gtkdoc opt">(</span><span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-The-Base-Object-Type.html#G-OBJECT:CAPS">G_OBJECT</a></span> <span class="gtkdoc opt">(</span>bus<span class="gtkdoc opt">),</span> <span class="string">&quot;message&quot;</span><span class="gtkdoc opt">,</span> <span class="function"><a href="http://library.gnome.org/devel/gobject/unstable/gobject-Closures.html#G-CALLBACK:CAPS">G_CALLBACK</a></span> <span class="gtkdoc opt">(</span>on_message<span class="gtkdoc opt">),</span> loop<span class="gtkdoc opt">);</span>
407   <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html#gst-object-unref">gst_object_unref</a></span> <span class="gtkdoc opt">(</span><span class="function">GST_OBJECT</span> <span class="gtkdoc opt">(</span>bus<span class="gtkdoc opt">));</span>
408
409   <span class="keyword">if</span> <span class="gtkdoc opt">(</span><span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#gst-element-set-state">gst_element_set_state</a></span> <span class="gtkdoc opt">(</span>pipeline<span class="gtkdoc opt">,</span>
410           GST_STATE_PLAYING<span class="gtkdoc opt">) ==</span> GST_STATE_CHANGE_FAILURE<span class="gtkdoc opt">) {</span>
411     <span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-Message-Logging.html#g-error">g_error</a></span> <span class="gtkdoc opt">(</span><span class="string">&quot;Failed to go into PLAYING state&quot;</span><span class="gtkdoc opt">);</span>
412     <span class="keyword">return</span> <span class="gtkdoc opt">-</span><span class="number">3</span><span class="gtkdoc opt">;</span>
413   <span class="gtkdoc opt">}</span>
414
415   <span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#g-main-loop-run">g_main_loop_run</a></span> <span class="gtkdoc opt">(</span>loop<span class="gtkdoc opt">);</span>
416
417   <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html#gst-element-set-state">gst_element_set_state</a></span> <span class="gtkdoc opt">(</span>pipeline<span class="gtkdoc opt">,</span> GST_STATE_NULL<span class="gtkdoc opt">);</span>
418
419   <span class="function"><a href="http://library.gnome.org/devel/glib/unstable/glib-The-Main-Event-Loop.html#g-main-loop-unref">g_main_loop_unref</a></span> <span class="gtkdoc opt">(</span>loop<span class="gtkdoc opt">);</span>
420   <span class="function"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html#gst-object-unref">gst_object_unref</a></span> <span class="gtkdoc opt">(</span>pipeline<span class="gtkdoc opt">);</span>
421
422   <span class="keyword">return</span> <span class="number">0</span><span class="gtkdoc opt">;</span>
423 <span class="gtkdoc opt">}</span></pre></td>
424       </tr>
425     </tbody>
426   </table>
427 </div>
428
429 </div>
430 <p>
431 </p>
432 <div class="refsynopsisdiv">
433 <h2>Synopsis</h2>
434 <div class="refsect2">
435 <a name="idp6786656"></a><h3>Element Information</h3>
436 <div class="variablelist"><table border="0">
437 <col align="left" valign="top">
438 <tbody>
439 <tr>
440 <td><p><span class="term">plugin</span></p></td>
441 <td>
442             <a class="link" href="gst-plugins-good-plugins-plugin-audiofx.html#plugin-audiofx">audiofx</a>
443           </td>
444 </tr>
445 <tr>
446 <td><p><span class="term">author</span></p></td>
447 <td>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;</td>
448 </tr>
449 <tr>
450 <td><p><span class="term">class</span></p></td>
451 <td>Filter/Effect/Audio</td>
452 </tr>
453 </tbody>
454 </table></div>
455 </div>
456 <hr>
457 <div class="refsect2">
458 <a name="idp8574016"></a><h3>Element Pads</h3>
459 <div class="variablelist"><table border="0">
460 <col align="left" valign="top">
461 <tbody>
462 <tr>
463 <td><p><span class="term">name</span></p></td>
464 <td>sink</td>
465 </tr>
466 <tr>
467 <td><p><span class="term">direction</span></p></td>
468 <td>sink</td>
469 </tr>
470 <tr>
471 <td><p><span class="term">presence</span></p></td>
472 <td>always</td>
473 </tr>
474 <tr>
475 <td><p><span class="term">details</span></p></td>
476 <td>audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]</td>
477 </tr>
478 </tbody>
479 </table></div>
480 <div class="variablelist"><table border="0">
481 <col align="left" valign="top">
482 <tbody>
483 <tr>
484 <td><p><span class="term">name</span></p></td>
485 <td>src</td>
486 </tr>
487 <tr>
488 <td><p><span class="term">direction</span></p></td>
489 <td>source</td>
490 </tr>
491 <tr>
492 <td><p><span class="term">presence</span></p></td>
493 <td>always</td>
494 </tr>
495 <tr>
496 <td><p><span class="term">details</span></p></td>
497 <td>audio/x-raw-float, width=(int){ 32, 64 }, endianness=(int)1234, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]</td>
498 </tr>
499 </tbody>
500 </table></div>
501 </div>
502 </div>
503 <p>
504 </p>
505 </div>
506 <div class="refsect1">
507 <a name="gst-plugins-good-plugins-audiofirfilter.details"></a><h2>Details</h2>
508 <div class="refsect2">
509 <a name="GstAudioFIRFilter-struct"></a><h3>struct GstAudioFIRFilter</h3>
510 <pre class="programlisting">struct GstAudioFIRFilter;</pre>
511 <p>
512 Opaque data structure.
513 </p>
514 </div>
515 </div>
516 <div class="refsect1">
517 <a name="gst-plugins-good-plugins-audiofirfilter.property-details"></a><h2>Property Details</h2>
518 <div class="refsect2">
519 <a name="GstAudioFIRFilter--kernel"></a><h3>The <code class="literal">"kernel"</code> property</h3>
520 <pre class="programlisting">  "kernel"                   <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Value-arrays.html#GValueArray"><span class="type">GValueArray</span></a>*          : Read / Write</pre>
521 <p>Filter kernel for the FIR filter.</p>
522 </div>
523 <hr>
524 <div class="refsect2">
525 <a name="GstAudioFIRFilter--latency"></a><h3>The <code class="literal">"latency"</code> property</h3>
526 <pre class="programlisting">  "latency"                  <span class="type">guint64</span>               : Read / Write</pre>
527 <p>Filter latency in samples.</p>
528 <p>Default value: 0</p>
529 </div>
530 </div>
531 <div class="refsect1">
532 <a name="gst-plugins-good-plugins-audiofirfilter.signal-details"></a><h2>Signal Details</h2>
533 <div class="refsect2">
534 <a name="GstAudioFIRFilter-rate-changed"></a><h3>The <code class="literal">"rate-changed"</code> signal</h3>
535 <pre class="programlisting"><span class="returnvalue">void</span>                user_function                      (<a class="link" href="gst-plugins-good-plugins-audiofirfilter.html#GstAudioFIRFilter"><span class="type">GstAudioFIRFilter</span></a> *filter,
536                                                         <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a>               rate,
537                                                         <a href="http://library.gnome.org/devel/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>           user_data)      : <a href="http://library.gnome.org/devel/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS"><code class="literal">Run Last</code></a></pre>
538 <p>
539 Will be emitted when the sampling rate changes. The callbacks
540 will be called from the streaming thread and processing will
541 stop until the event is handled.
542 </p>
543 <div class="variablelist"><table border="0">
544 <col align="left" valign="top">
545 <tbody>
546 <tr>
547 <td><p><span class="term"><em class="parameter"><code>filter</code></em> :</span></p></td>
548 <td>the filter on which the signal is emitted</td>
549 </tr>
550 <tr>
551 <td><p><span class="term"><em class="parameter"><code>rate</code></em> :</span></p></td>
552 <td>the new sampling rate</td>
553 </tr>
554 <tr>
555 <td><p><span class="term"><em class="parameter"><code>user_data</code></em> :</span></p></td>
556 <td>user data set when the signal handler was connected.</td>
557 </tr>
558 </tbody>
559 </table></div>
560 </div>
561 </div>
562 </div>
563 <div class="footer">
564 <hr>
565           Generated by GTK-Doc V1.18</div>
566 </body>
567 </html>