| <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> | 
 | <html> | 
 | <head> | 
 | <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> | 
 | <title>audiofirfilter: GStreamer Good Plugins 1.0 Plugins Reference Manual</title> | 
 | <meta name="generator" content="DocBook XSL Stylesheets V1.79.1"> | 
 | <link rel="home" href="index.html" title="GStreamer Good Plugins 1.0 Plugins Reference Manual"> | 
 | <link rel="up" href="ch01.html" title="gst-plugins-good Elements"> | 
 | <link rel="prev" href="gst-plugins-good-plugins-audioecho.html" title="audioecho"> | 
 | <link rel="next" href="gst-plugins-good-plugins-audioiirfilter.html" title="audioiirfilter"> | 
 | <meta name="generator" content="GTK-Doc V1.25 (XML mode)"> | 
 | <link rel="stylesheet" href="style.css" type="text/css"> | 
 | </head> | 
 | <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> | 
 | <table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle"> | 
 | <td width="100%" align="left" class="shortcuts"> | 
 | <a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span>  | 
 |                   <a href="#gst-plugins-good-plugins-audiofirfilter.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span>  | 
 |                   <a href="#gst-plugins-good-plugins-audiofirfilter.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_properties">  <span class="dim">|</span>  | 
 |                   <a href="#gst-plugins-good-plugins-audiofirfilter.properties" class="shortcut">Properties</a></span><span id="nav_signals">  <span class="dim">|</span>  | 
 |                   <a href="#gst-plugins-good-plugins-audiofirfilter.signals" class="shortcut">Signals</a></span> | 
 | </td> | 
 | <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td> | 
 | <td><a accesskey="u" href="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td> | 
 | <td><a accesskey="p" href="gst-plugins-good-plugins-audioecho.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td> | 
 | <td><a accesskey="n" href="gst-plugins-good-plugins-audioiirfilter.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td> | 
 | </tr></table> | 
 | <div class="refentry"> | 
 | <a name="gst-plugins-good-plugins-audiofirfilter"></a><div class="titlepage"></div> | 
 | <div class="refnamediv"><table width="100%"><tr> | 
 | <td valign="top"> | 
 | <h2><span class="refentrytitle"><a name="gst-plugins-good-plugins-audiofirfilter.top_of_page"></a>audiofirfilter</span></h2> | 
 | <p>audiofirfilter</p> | 
 | </td> | 
 | <td class="gallery_image" valign="top" align="right"></td> | 
 | </tr></table></div> | 
 | <div class="refsect1"> | 
 | <a name="gst-plugins-good-plugins-audiofirfilter.properties"></a><h2>Properties</h2> | 
 | <div class="informaltable"><table class="informaltable" border="0"> | 
 | <colgroup> | 
 | <col width="150px" class="properties_type"> | 
 | <col width="300px" class="properties_name"> | 
 | <col width="200px" class="properties_flags"> | 
 | </colgroup> | 
 | <tbody> | 
 | <tr> | 
 | <td class="property_type"> | 
 | <a href="/usr/share/gtk-doc/html/gobjectgobject-Value-arrays.html#GValueArray"><span class="type">GValueArray</span></a> *</td> | 
 | <td class="property_name"><a class="link" href="gst-plugins-good-plugins-audiofirfilter.html#GstAudioFIRFilter--kernel" title="The “kernel” property">kernel</a></td> | 
 | <td class="property_flags">Read / Write</td> | 
 | </tr> | 
 | <tr> | 
 | <td class="property_type"><a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint64"><span class="type">guint64</span></a></td> | 
 | <td class="property_name"><a class="link" href="gst-plugins-good-plugins-audiofirfilter.html#GstAudioFIRFilter--latency" title="The “latency” property">latency</a></td> | 
 | <td class="property_flags">Read / Write</td> | 
 | </tr> | 
 | </tbody> | 
 | </table></div> | 
 | </div> | 
 | <div class="refsect1"> | 
 | <a name="gst-plugins-good-plugins-audiofirfilter.signals"></a><h2>Signals</h2> | 
 | <div class="informaltable"><table class="informaltable" border="0"> | 
 | <colgroup> | 
 | <col width="150px" class="signals_return"> | 
 | <col width="300px" class="signals_name"> | 
 | <col width="200px" class="signals_flags"> | 
 | </colgroup> | 
 | <tbody><tr> | 
 | <td class="signal_type"><span class="returnvalue">void</span></td> | 
 | <td class="signal_name"><a class="link" href="gst-plugins-good-plugins-audiofirfilter.html#GstAudioFIRFilter-rate-changed" title="The “rate-changed” signal">rate-changed</a></td> | 
 | <td class="signal_flags"><a href="/usr/share/gtk-doc/html/gobjectgobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS">Run Last</a></td> | 
 | </tr></tbody> | 
 | </table></div> | 
 | </div> | 
 | <a name="GstAudioFIRFilter"></a><div class="refsect1"> | 
 | <a name="gst-plugins-good-plugins-audiofirfilter.other"></a><h2>Types and Values</h2> | 
 | <div class="informaltable"><table class="informaltable" width="100%" border="0"> | 
 | <colgroup> | 
 | <col width="150px" class="name"> | 
 | <col class="description"> | 
 | </colgroup> | 
 | <tbody><tr> | 
 | <td class="datatype_keyword">struct</td> | 
 | <td class="function_name"><a class="link" href="gst-plugins-good-plugins-audiofirfilter.html#GstAudioFIRFilter-struct" title="struct GstAudioFIRFilter">GstAudioFIRFilter</a></td> | 
 | </tr></tbody> | 
 | </table></div> | 
 | </div> | 
 | <div class="refsect1"> | 
 | <a name="gst-plugins-good-plugins-audiofirfilter.object-hierarchy"></a><h2>Object Hierarchy</h2> | 
 | <pre class="screen">    <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GObject-struct">GObject</a> | 
 |     <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a> | 
 |         <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#GstObject-struct">GstObject</a> | 
 |             <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#GstElement-struct">GstElement</a> | 
 |                 <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gstreamer-libs-1.0GstBaseTransform.html#GstBaseTransform-struct">GstBaseTransform</a> | 
 |                     <span class="lineart">╰──</span> <a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-plugins-base-libs-gstaudiofilter.html#GstAudioFilter-struct">GstAudioFilter</a> | 
 |                         <span class="lineart">╰──</span> GstAudioFXBaseFIRFilter | 
 |                             <span class="lineart">╰──</span> GstAudioFIRFilter | 
 | </pre> | 
 | </div> | 
 | <div class="refsect1"> | 
 | <a name="gst-plugins-good-plugins-audiofirfilter.description"></a><h2>Description</h2> | 
 | <p>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 | 
 | "kernel" property has to be set to the filter kernel that should be | 
 | used and the "latency" property has to be set to the latency (in samples) | 
 | that is introduced by the filter kernel. Setting a latency of n samples | 
 | will lead to the first n samples being dropped from the output and | 
 | n samples added to the end.</p> | 
 | <p>The filter kernel describes the impulse response of the filter. To | 
 | calculate the frequency response of the filter you have to calculate | 
 | the Fourier Transform of the impulse response.</p> | 
 | <p>To change the filter kernel whenever the sampling rate changes the | 
 | "rate-changed" signal can be used. This should be done for most | 
 | FIR filters as they're depending on the sampling rate.</p> | 
 | <div class="refsect2"> | 
 | <a name="id-1.2.21.8.5"></a><h3>Example application</h3> | 
 | <div class="informalexample"> | 
 |   <table class="listing_frame" border="0" cellpadding="0" cellspacing="0"> | 
 |     <tbody> | 
 |       <tr> | 
 |         <td class="listing_lines" align="right"><pre>1 | 
 | 2 | 
 | 3 | 
 | 4 | 
 | 5 | 
 | 6 | 
 | 7 | 
 | 8 | 
 | 9 | 
 | 10 | 
 | 11 | 
 | 12 | 
 | 13 | 
 | 14 | 
 | 15 | 
 | 16 | 
 | 17 | 
 | 18 | 
 | 19 | 
 | 20 | 
 | 21 | 
 | 22 | 
 | 23 | 
 | 24 | 
 | 25 | 
 | 26 | 
 | 27 | 
 | 28 | 
 | 29 | 
 | 30 | 
 | 31 | 
 | 32 | 
 | 33 | 
 | 34 | 
 | 35 | 
 | 36 | 
 | 37 | 
 | 38 | 
 | 39 | 
 | 40 | 
 | 41 | 
 | 42 | 
 | 43 | 
 | 44 | 
 | 45 | 
 | 46 | 
 | 47 | 
 | 48 | 
 | 49 | 
 | 50 | 
 | 51 | 
 | 52 | 
 | 53 | 
 | 54 | 
 | 55 | 
 | 56 | 
 | 57 | 
 | 58 | 
 | 59 | 
 | 60 | 
 | 61 | 
 | 62 | 
 | 63 | 
 | 64 | 
 | 65 | 
 | 66 | 
 | 67 | 
 | 68 | 
 | 69 | 
 | 70 | 
 | 71 | 
 | 72 | 
 | 73 | 
 | 74 | 
 | 75 | 
 | 76 | 
 | 77 | 
 | 78 | 
 | 79 | 
 | 80 | 
 | 81 | 
 | 82 | 
 | 83 | 
 | 84 | 
 | 85 | 
 | 86 | 
 | 87 | 
 | 88 | 
 | 89 | 
 | 90 | 
 | 91 | 
 | 92 | 
 | 93 | 
 | 94 | 
 | 95 | 
 | 96 | 
 | 97 | 
 | 98 | 
 | 99 | 
 | 100 | 
 | 101 | 
 | 102 | 
 | 103 | 
 | 104 | 
 | 105 | 
 | 106 | 
 | 107 | 
 | 108 | 
 | 109 | 
 | 110 | 
 | 111 | 
 | 112 | 
 | 113 | 
 | 114 | 
 | 115 | 
 | 116 | 
 | 117 | 
 | 118 | 
 | 119 | 
 | 120 | 
 | 121 | 
 | 122 | 
 | 123 | 
 | 124 | 
 | 125 | 
 | 126 | 
 | 127 | 
 | 128 | 
 | 129 | 
 | 130 | 
 | 131 | 
 | 132 | 
 | 133 | 
 | 134 | 
 | 135 | 
 | 136 | 
 | 137 | 
 | 138 | 
 | 139 | 
 | 140 | 
 | 141 | 
 | 142 | 
 | 143 | 
 | 144 | 
 | 145 | 
 | 146 | 
 | 147 | 
 | 148 | 
 | 149 | 
 | 150 | 
 | 151 | 
 | 152 | 
 | 153 | 
 | 154 | 
 | 155 | 
 | 156 | 
 | 157 | 
 | 158 | 
 | 159 | 
 | 160 | 
 | 161 | 
 | 162 | 
 | 163 | 
 | 164 | 
 | 165</pre></td> | 
 |         <td class="listing_code"><pre class="programlisting"><span class="comment">/* GStreamer</span> | 
 | <span class="comment"> * Copyright (C) 2009 Sebastian Droege <sebastian.droege@collabora.co.uk></span> | 
 | <span class="comment"> *</span> | 
 | <span class="comment"> * This library is free software; you can redistribute it and/or</span> | 
 | <span class="comment"> * modify it under the terms of the GNU Library General Public</span> | 
 | <span class="comment"> * License as published by the Free Software Foundation; either</span> | 
 | <span class="comment"> * version 2 of the License, or (at your option) any later version.</span> | 
 | <span class="comment"> *</span> | 
 | <span class="comment"> * This library is distributed in the hope that it will be useful,</span> | 
 | <span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span> | 
 | <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</span> | 
 | <span class="comment"> * Library General Public License for more details.</span> | 
 | <span class="comment"> *</span> | 
 | <span class="comment"> * You should have received a copy of the GNU Library General Public</span> | 
 | <span class="comment"> * License along with this library; if not, write to the</span> | 
 | <span class="comment"> * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,</span> | 
 | <span class="comment"> * Boston, MA 02110-1301, USA.</span> | 
 | <span class="comment"> */</span> | 
 |  | 
 | <span class="comment">/* This small sample application creates a bandpass FIR filter</span> | 
 | <span class="comment"> * by transforming the frequency response to the filter kernel.</span> | 
 | <span class="comment"> */</span> | 
 |  | 
 | <span class="comment">/* FIXME 0.11: suppress warnings for deprecated API such as GValueArray</span> | 
 | <span class="comment"> * with newer GLib versions (>= 2.31.0) */</span> | 
 | <span class="gtkdoc ppc">#define GLIB_DISABLE_DEPRECATION_WARNINGS</span> | 
 |  | 
 | <span class="gtkdoc ppc">#include <string.h></span> | 
 | <span class="gtkdoc ppc">#include <math.h></span> | 
 |  | 
 | <span class="gtkdoc ppc">#include <gst/gst.h></span> | 
 | <span class="gtkdoc ppc">#include <gst/fft/gstfftf64.h></span> | 
 |  | 
 | <span class="gtkdoc kwb">static</span> gboolean | 
 | <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> | 
 | <span class="gtkdoc opt">{</span> | 
 |   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> | 
 |  | 
 |   <span class="keyword">switch</span> <span class="gtkdoc opt">(</span><span class="function"><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstMessage.html#GST-MESSAGE-TYPE:CAPS">GST_MESSAGE_TYPE</a></span> <span class="gtkdoc opt">(</span>message<span class="gtkdoc opt">)) {</span> | 
 |     <span class="keyword">case</span> GST_MESSAGE_ERROR<span class="gtkdoc opt">:</span> | 
 |       <span class="function"><a href="/usr/share/gtk-doc/html/glibglib-Message-Logging.html#g-error">g_error</a></span> <span class="gtkdoc opt">(</span><span class="string">"Got ERROR"</span><span class="gtkdoc opt">);</span> | 
 |       <span class="function"><a href="/usr/share/gtk-doc/html/glibglib-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> | 
 |       <span class="keyword">break</span><span class="gtkdoc opt">;</span> | 
 |     <span class="keyword">case</span> GST_MESSAGE_WARNING<span class="gtkdoc opt">:</span> | 
 |       <span class="function"><a href="/usr/share/gtk-doc/html/glibglib-Message-Logging.html#g-warning">g_warning</a></span> <span class="gtkdoc opt">(</span><span class="string">"Got WARNING"</span><span class="gtkdoc opt">);</span> | 
 |       <span class="function"><a href="/usr/share/gtk-doc/html/glibglib-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> | 
 |       <span class="keyword">break</span><span class="gtkdoc opt">;</span> | 
 |     <span class="keyword">case</span> GST_MESSAGE_EOS<span class="gtkdoc opt">:</span> | 
 |       <span class="function"><a href="/usr/share/gtk-doc/html/glibglib-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> | 
 |       <span class="keyword">break</span><span class="gtkdoc opt">;</span> | 
 |     <span class="keyword">default</span><span class="gtkdoc opt">:</span> | 
 |       <span class="keyword">break</span><span class="gtkdoc opt">;</span> | 
 |   <span class="gtkdoc opt">}</span> | 
 |  | 
 |   <span class="keyword">return</span> TRUE<span class="gtkdoc opt">;</span> | 
 | <span class="gtkdoc opt">}</span> | 
 |  | 
 | <span class="gtkdoc kwb">static void</span> | 
 | <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> | 
 | <span class="gtkdoc opt">{</span> | 
 |   GValueArray <span class="gtkdoc opt">*</span>va<span class="gtkdoc opt">;</span> | 
 |   GValue v <span class="gtkdoc opt">= {</span> <span class="number">0</span><span class="gtkdoc opt">, };</span> | 
 |   GstFFTF64 <span class="gtkdoc opt">*</span>fft<span class="gtkdoc opt">;</span> | 
 |   GstFFTF64Complex frequency_response<span class="gtkdoc opt">[</span><span class="number">17</span><span class="gtkdoc opt">];</span> | 
 |   gdouble tmp<span class="gtkdoc opt">[</span><span class="number">32</span><span class="gtkdoc opt">];</span> | 
 |   gdouble filter_kernel<span class="gtkdoc opt">[</span><span class="number">32</span><span class="gtkdoc opt">];</span> | 
 |   guint i<span class="gtkdoc opt">;</span> | 
 |  | 
 |   <span class="comment">/* Create the frequency response: zero outside</span> | 
 | <span class="comment">   * a small frequency band */</span> | 
 |   <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"><</span> <span class="number">17</span><span class="gtkdoc opt">;</span> i<span class="gtkdoc opt">++) {</span> | 
 |     <span class="keyword">if</span> <span class="gtkdoc opt">(</span>i <span class="gtkdoc opt"><</span> <span class="number">5</span> <span class="gtkdoc opt">||</span> i <span class="gtkdoc opt">></span> <span class="number">11</span><span class="gtkdoc opt">)</span> | 
 |       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> | 
 |     <span class="keyword">else</span> | 
 |       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> | 
 |  | 
 |     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> | 
 |   <span class="gtkdoc opt">}</span> | 
 |  | 
 |   <span class="comment">/* Calculate the inverse FT of the frequency response */</span> | 
 |   fft <span class="gtkdoc opt">=</span> <span class="function"><a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-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> | 
 |   <span class="function"><a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-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> | 
 |   <span class="function"><a href="/usr/share/gtk-doc/html/gst-plugins-base-libs-1.0gst-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> | 
 |  | 
 |   <span class="comment">/* Shift the inverse FT of the frequency response by 16,</span> | 
 | <span class="comment">   * i.e. the half of the kernel length to get the</span> | 
 | <span class="comment">   * impulse response. See http://www.dspguide.com/ch17/1.htm</span> | 
 | <span class="comment">   * for more information.</span> | 
 | <span class="comment">   */</span> | 
 |   <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"><</span> <span class="number">32</span><span class="gtkdoc opt">;</span> i<span class="gtkdoc opt">++)</span> | 
 |     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> | 
 |  | 
 |   <span class="comment">/* Apply the hamming window to the impulse response to get</span> | 
 | <span class="comment">   * a better result than given from the rectangular window</span> | 
 | <span class="comment">   */</span> | 
 |   <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"><</span> <span class="number">32</span><span class="gtkdoc opt">;</span> i<span class="gtkdoc opt">++)</span> | 
 |     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> | 
 |  | 
 |   va <span class="gtkdoc opt">=</span> <span class="function"><a href="/usr/share/gtk-doc/html/gobjectgobject-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> | 
 |  | 
 |   <span class="function"><a href="/usr/share/gtk-doc/html/gobjectgobject-Generic-values.html#g-value-init">g_value_init</a></span> <span class="gtkdoc opt">(&</span>v<span class="gtkdoc opt">,</span> G_TYPE_DOUBLE<span class="gtkdoc opt">);</span> | 
 |   <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"><</span> <span class="number">32</span><span class="gtkdoc opt">;</span> i<span class="gtkdoc opt">++) {</span> | 
 |     <span class="function"><a href="/usr/share/gtk-doc/html/gobjectgobject-Standard-Parameter-and-Value-Types.html#g-value-set-double">g_value_set_double</a></span> <span class="gtkdoc opt">(&</span>v<span class="gtkdoc opt">,</span> filter_kernel<span class="gtkdoc opt">[</span>i<span class="gtkdoc opt">]);</span> | 
 |     <span class="function"><a href="/usr/share/gtk-doc/html/gobjectgobject-Value-arrays.html#g-value-array-append">g_value_array_append</a></span> <span class="gtkdoc opt">(</span>va<span class="gtkdoc opt">, &</span>v<span class="gtkdoc opt">);</span> | 
 |     <span class="function"><a href="/usr/share/gtk-doc/html/gobjectgobject-Generic-values.html#g-value-reset">g_value_reset</a></span> <span class="gtkdoc opt">(&</span>v<span class="gtkdoc opt">);</span> | 
 |   <span class="gtkdoc opt">}</span> | 
 |   <span class="function"><a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#g-object-set">g_object_set</a></span> <span class="gtkdoc opt">(</span><span class="function"><a href="/usr/share/gtk-doc/html/gobjectgobject-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">"kernel"</span><span class="gtkdoc opt">,</span> va<span class="gtkdoc opt">,</span> NULL<span class="gtkdoc opt">);</span> | 
 |   <span class="comment">/* Latency is 1/2 of the kernel length for this method of</span> | 
 | <span class="comment">   * calculating a filter kernel from the frequency response</span> | 
 | <span class="comment">   */</span> | 
 |   <span class="function"><a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#g-object-set">g_object_set</a></span> <span class="gtkdoc opt">(</span><span class="function"><a href="/usr/share/gtk-doc/html/gobjectgobject-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">"latency"</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> | 
 |   <span class="function"><a href="/usr/share/gtk-doc/html/gobjectgobject-Value-arrays.html#g-value-array-free">g_value_array_free</a></span> <span class="gtkdoc opt">(</span>va<span class="gtkdoc opt">);</span> | 
 | <span class="gtkdoc opt">}</span> | 
 |  | 
 | gint | 
 | <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> | 
 | <span class="gtkdoc opt">{</span> | 
 |   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> | 
 |   GstBus <span class="gtkdoc opt">*</span>bus<span class="gtkdoc opt">;</span> | 
 |   GMainLoop <span class="gtkdoc opt">*</span>loop<span class="gtkdoc opt">;</span> | 
 |  | 
 |   <span class="function"><a href="/usr/share/gtk-doc/html/gstreamer-1.0gstreamer-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> | 
 |  | 
 |   pipeline <span class="gtkdoc opt">=</span> <span class="function"><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElementFactory.html#gst-element-factory-make">gst_element_factory_make</a></span> <span class="gtkdoc opt">(</span><span class="string">"pipeline"</span><span class="gtkdoc opt">,</span> NULL<span class="gtkdoc opt">);</span> | 
 |  | 
 |   src <span class="gtkdoc opt">=</span> <span class="function"><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElementFactory.html#gst-element-factory-make">gst_element_factory_make</a></span> <span class="gtkdoc opt">(</span><span class="string">"audiotestsrc"</span><span class="gtkdoc opt">,</span> NULL<span class="gtkdoc opt">);</span> | 
 |   <span class="function"><a href="/usr/share/gtk-doc/html/gobjectgobject-The-Base-Object-Type.html#g-object-set">g_object_set</a></span> <span class="gtkdoc opt">(</span><span class="function"><a href="/usr/share/gtk-doc/html/gobjectgobject-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">"wave"</span><span class="gtkdoc opt">,</span> <span class="number">5</span><span class="gtkdoc opt">,</span> NULL<span class="gtkdoc opt">);</span> | 
 |  | 
 |   filter <span class="gtkdoc opt">=</span> <span class="function"><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElementFactory.html#gst-element-factory-make">gst_element_factory_make</a></span> <span class="gtkdoc opt">(</span><span class="string">"audiofirfilter"</span><span class="gtkdoc opt">,</span> NULL<span class="gtkdoc opt">);</span> | 
 |   <span class="function"><a href="/usr/share/gtk-doc/html/gobjectgobject-Signals.html#g-signal-connect">g_signal_connect</a></span> <span class="gtkdoc opt">(</span><span class="function"><a href="/usr/share/gtk-doc/html/gobjectgobject-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">"rate-changed"</span><span class="gtkdoc opt">,</span> | 
 |       <span class="function"><a href="/usr/share/gtk-doc/html/gobjectgobject-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> | 
 |  | 
 |   conv <span class="gtkdoc opt">=</span> <span class="function"><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElementFactory.html#gst-element-factory-make">gst_element_factory_make</a></span> <span class="gtkdoc opt">(</span><span class="string">"audioconvert"</span><span class="gtkdoc opt">,</span> NULL<span class="gtkdoc opt">);</span> | 
 |  | 
 |   sink <span class="gtkdoc opt">=</span> <span class="function"><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElementFactory.html#gst-element-factory-make">gst_element_factory_make</a></span> <span class="gtkdoc opt">(</span><span class="string">"autoaudiosink"</span><span class="gtkdoc opt">,</span> NULL<span class="gtkdoc opt">);</span> | 
 |   <span class="function"><a href="/usr/share/gtk-doc/html/glibglib-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> | 
 |  | 
 |   <span class="function"><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstBin.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> | 
 |   <span class="keyword">if</span> <span class="gtkdoc opt">(!</span><span class="function"><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.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> | 
 |     <span class="function"><a href="/usr/share/gtk-doc/html/glibglib-Message-Logging.html#g-error">g_error</a></span> <span class="gtkdoc opt">(</span><span class="string">"Failed to link elements"</span><span class="gtkdoc opt">);</span> | 
 |     <span class="keyword">return</span> <span class="gtkdoc opt">-</span><span class="number">2</span><span class="gtkdoc opt">;</span> | 
 |   <span class="gtkdoc opt">}</span> | 
 |  | 
 |   loop <span class="gtkdoc opt">=</span> <span class="function"><a href="/usr/share/gtk-doc/html/glibglib-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> | 
 |  | 
 |   bus <span class="gtkdoc opt">=</span> <span class="function"><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstPipeline.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> | 
 |   <span class="function"><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstBus.html#gst-bus-add-signal-watch">gst_bus_add_signal_watch</a></span> <span class="gtkdoc opt">(</span>bus<span class="gtkdoc opt">);</span> | 
 |   <span class="function"><a href="/usr/share/gtk-doc/html/gobjectgobject-Signals.html#g-signal-connect">g_signal_connect</a></span> <span class="gtkdoc opt">(</span><span class="function"><a href="/usr/share/gtk-doc/html/gobjectgobject-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">"message"</span><span class="gtkdoc opt">,</span> <span class="function"><a href="/usr/share/gtk-doc/html/gobjectgobject-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> | 
 |   <span class="function"><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.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> | 
 |  | 
 |   <span class="keyword">if</span> <span class="gtkdoc opt">(</span><span class="function"><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.html#gst-element-set-state">gst_element_set_state</a></span> <span class="gtkdoc opt">(</span>pipeline<span class="gtkdoc opt">,</span> | 
 |           GST_STATE_PLAYING<span class="gtkdoc opt">) ==</span> GST_STATE_CHANGE_FAILURE<span class="gtkdoc opt">) {</span> | 
 |     <span class="function"><a href="/usr/share/gtk-doc/html/glibglib-Message-Logging.html#g-error">g_error</a></span> <span class="gtkdoc opt">(</span><span class="string">"Failed to go into PLAYING state"</span><span class="gtkdoc opt">);</span> | 
 |     <span class="keyword">return</span> <span class="gtkdoc opt">-</span><span class="number">3</span><span class="gtkdoc opt">;</span> | 
 |   <span class="gtkdoc opt">}</span> | 
 |  | 
 |   <span class="function"><a href="/usr/share/gtk-doc/html/glibglib-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> | 
 |  | 
 |   <span class="function"><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstElement.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> | 
 |  | 
 |   <span class="function"><a href="/usr/share/gtk-doc/html/glibglib-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> | 
 |   <span class="function"><a href="/usr/share/gtk-doc/html/gstreamer-1.0GstObject.html#gst-object-unref">gst_object_unref</a></span> <span class="gtkdoc opt">(</span>pipeline<span class="gtkdoc opt">);</span> | 
 |  | 
 |   <span class="keyword">return</span> <span class="number">0</span><span class="gtkdoc opt">;</span> | 
 | <span class="gtkdoc opt">}</span></pre></td> | 
 |       </tr> | 
 |     </tbody> | 
 |   </table> | 
 | </div> | 
 |  | 
 | </div> | 
 | <div class="refsynopsisdiv"> | 
 | <h2>Synopsis</h2> | 
 | <div class="refsect2"> | 
 | <a name="id-1.2.21.8.6.1"></a><h3>Element Information</h3> | 
 | <div class="variablelist"><table border="0" class="variablelist"> | 
 | <colgroup> | 
 | <col align="left" valign="top"> | 
 | <col> | 
 | </colgroup> | 
 | <tbody> | 
 | <tr> | 
 | <td><p><span class="term">plugin</span></p></td> | 
 | <td> | 
 |             <a class="link" href="gst-plugins-good-plugins-plugin-audiofx.html#plugin-audiofx">audiofx</a> | 
 |           </td> | 
 | </tr> | 
 | <tr> | 
 | <td><p><span class="term">author</span></p></td> | 
 | <td>Sebastian Dröge <sebastian.droege@collabora.co.uk></td> | 
 | </tr> | 
 | <tr> | 
 | <td><p><span class="term">class</span></p></td> | 
 | <td>Filter/Effect/Audio</td> | 
 | </tr> | 
 | </tbody> | 
 | </table></div> | 
 | </div> | 
 | <hr> | 
 | <div class="refsect2"> | 
 | <a name="id-1.2.21.8.6.2"></a><h3>Element Pads</h3> | 
 | <div class="variablelist"><table border="0" class="variablelist"> | 
 | <colgroup> | 
 | <col align="left" valign="top"> | 
 | <col> | 
 | </colgroup> | 
 | <tbody> | 
 | <tr> | 
 | <td><p><span class="term">name</span></p></td> | 
 | <td>sink</td> | 
 | </tr> | 
 | <tr> | 
 | <td><p><span class="term">direction</span></p></td> | 
 | <td>sink</td> | 
 | </tr> | 
 | <tr> | 
 | <td><p><span class="term">presence</span></p></td> | 
 | <td>always</td> | 
 | </tr> | 
 | <tr> | 
 | <td><p><span class="term">details</span></p></td> | 
 | <td>audio/x-raw, format=(string){ F32LE, F64LE }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], layout=(string)interleaved</td> | 
 | </tr> | 
 | </tbody> | 
 | </table></div> | 
 | <div class="variablelist"><table border="0" class="variablelist"> | 
 | <colgroup> | 
 | <col align="left" valign="top"> | 
 | <col> | 
 | </colgroup> | 
 | <tbody> | 
 | <tr> | 
 | <td><p><span class="term">name</span></p></td> | 
 | <td>src</td> | 
 | </tr> | 
 | <tr> | 
 | <td><p><span class="term">direction</span></p></td> | 
 | <td>source</td> | 
 | </tr> | 
 | <tr> | 
 | <td><p><span class="term">presence</span></p></td> | 
 | <td>always</td> | 
 | </tr> | 
 | <tr> | 
 | <td><p><span class="term">details</span></p></td> | 
 | <td>audio/x-raw, format=(string){ F32LE, F64LE }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], layout=(string)interleaved</td> | 
 | </tr> | 
 | </tbody> | 
 | </table></div> | 
 | </div> | 
 | </div> | 
 | </div> | 
 | <div class="refsect1"> | 
 | <a name="gst-plugins-good-plugins-audiofirfilter.functions_details"></a><h2>Functions</h2> | 
 | <p></p> | 
 | </div> | 
 | <div class="refsect1"> | 
 | <a name="gst-plugins-good-plugins-audiofirfilter.other_details"></a><h2>Types and Values</h2> | 
 | <div class="refsect2"> | 
 | <a name="GstAudioFIRFilter-struct"></a><h3>struct GstAudioFIRFilter</h3> | 
 | <pre class="programlisting">struct GstAudioFIRFilter;</pre> | 
 | <p>Opaque data structure.</p> | 
 | </div> | 
 | </div> | 
 | <div class="refsect1"> | 
 | <a name="gst-plugins-good-plugins-audiofirfilter.property-details"></a><h2>Property Details</h2> | 
 | <div class="refsect2"> | 
 | <a name="GstAudioFIRFilter--kernel"></a><h3>The <code class="literal">“kernel”</code> property</h3> | 
 | <pre class="programlisting">  “kernel”                   <a href="/usr/share/gtk-doc/html/gobjectgobject-Value-arrays.html#GValueArray"><span class="type">GValueArray</span></a> *</pre> | 
 | <p>Filter kernel for the FIR filter.</p> | 
 | <p>Flags: Read / Write</p> | 
 | </div> | 
 | <hr> | 
 | <div class="refsect2"> | 
 | <a name="GstAudioFIRFilter--latency"></a><h3>The <code class="literal">“latency”</code> property</h3> | 
 | <pre class="programlisting">  “latency”                  <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#guint64"><span class="type">guint64</span></a></pre> | 
 | <p>Filter latency in samples.</p> | 
 | <p>Flags: Read / Write</p> | 
 | <p>Default value: 0</p> | 
 | </div> | 
 | </div> | 
 | <div class="refsect1"> | 
 | <a name="gst-plugins-good-plugins-audiofirfilter.signal-details"></a><h2>Signal Details</h2> | 
 | <div class="refsect2"> | 
 | <a name="GstAudioFIRFilter-rate-changed"></a><h3>The <code class="literal">“rate-changed”</code> signal</h3> | 
 | <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, | 
 |                <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gint"><span class="type">gint</span></a>               rate, | 
 |                <a href="/usr/share/gtk-doc/html/glibglib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>           user_data)</pre> | 
 | <p>Will be emitted when the sampling rate changes. The callbacks | 
 | will be called from the streaming thread and processing will | 
 | stop until the event is handled.</p> | 
 | <div class="refsect3"> | 
 | <a name="GstAudioFIRFilter-rate-changed.parameters"></a><h4>Parameters</h4> | 
 | <div class="informaltable"><table class="informaltable" width="100%" border="0"> | 
 | <colgroup> | 
 | <col width="150px" class="parameters_name"> | 
 | <col class="parameters_description"> | 
 | <col width="200px" class="parameters_annotations"> | 
 | </colgroup> | 
 | <tbody> | 
 | <tr> | 
 | <td class="parameter_name"><p>filter</p></td> | 
 | <td class="parameter_description"><p>the filter on which the signal is emitted</p></td> | 
 | <td class="parameter_annotations"> </td> | 
 | </tr> | 
 | <tr> | 
 | <td class="parameter_name"><p>rate</p></td> | 
 | <td class="parameter_description"><p>the new sampling rate</p></td> | 
 | <td class="parameter_annotations"> </td> | 
 | </tr> | 
 | <tr> | 
 | <td class="parameter_name"><p>user_data</p></td> | 
 | <td class="parameter_description"><p>user data set when the signal handler was connected.</p></td> | 
 | <td class="parameter_annotations"> </td> | 
 | </tr> | 
 | </tbody> | 
 | </table></div> | 
 | </div> | 
 | <p>Flags: <a href="/usr/share/gtk-doc/html/gobjectgobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS">Run Last</a></p> | 
 | </div> | 
 | </div> | 
 | </div> | 
 | <div class="footer"> | 
 | <hr>Generated by GTK-Doc V1.25</div> | 
 | </body> | 
 | </html> |