|  | <!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.78.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.24 (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 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="https://developer.gnome.org/gobject/unstable/gobject-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"><span class="type">guint64</span></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 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="https://developer.gnome.org/gobject/unstable/gobject-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 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="https://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a> | 
|  | <span class="lineart">╰──</span> <a href="https://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a> | 
|  | <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a> | 
|  | <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a> | 
|  | <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseTransform.html">GstBaseTransform</a> | 
|  | <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstaudiofilter.html#GstAudioFilter">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.20.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="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstMessage.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="https://developer.gnome.org/glib/unstable/glib-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="https://developer.gnome.org/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> | 
|  | <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="https://developer.gnome.org/glib/unstable/glib-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="https://developer.gnome.org/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> | 
|  | <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="https://developer.gnome.org/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> | 
|  | <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="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> | 
|  | <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> | 
|  | <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> | 
|  |  | 
|  | <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="https://developer.gnome.org/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> | 
|  |  | 
|  | <span class="function"><a href="https://developer.gnome.org/gobject/unstable/gobject-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="https://developer.gnome.org/gobject/unstable/gobject-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="https://developer.gnome.org/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">, &</span>v<span class="gtkdoc opt">);</span> | 
|  | <span class="function"><a href="https://developer.gnome.org/gobject/unstable/gobject-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="https://developer.gnome.org/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="https://developer.gnome.org/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">"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="https://developer.gnome.org/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="https://developer.gnome.org/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">"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="https://developer.gnome.org/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> | 
|  | <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="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> | 
|  |  | 
|  | 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">"pipeline"</span><span class="gtkdoc opt">,</span> NULL<span class="gtkdoc opt">);</span> | 
|  |  | 
|  | 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">"audiotestsrc"</span><span class="gtkdoc opt">,</span> NULL<span class="gtkdoc opt">);</span> | 
|  | <span class="function"><a href="https://developer.gnome.org/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="https://developer.gnome.org/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">"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="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">"audiofirfilter"</span><span class="gtkdoc opt">,</span> NULL<span class="gtkdoc opt">);</span> | 
|  | <span class="function"><a href="https://developer.gnome.org/gobject/unstable/gobject-Signals.html#g-signal-connect">g_signal_connect</a></span> <span class="gtkdoc opt">(</span><span class="function"><a href="https://developer.gnome.org/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">"rate-changed"</span><span class="gtkdoc opt">,</span> | 
|  | <span class="function"><a href="https://developer.gnome.org/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> | 
|  |  | 
|  | 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">"audioconvert"</span><span class="gtkdoc opt">,</span> NULL<span class="gtkdoc opt">);</span> | 
|  |  | 
|  | 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">"autoaudiosink"</span><span class="gtkdoc opt">,</span> NULL<span class="gtkdoc opt">);</span> | 
|  | <span class="function"><a href="https://developer.gnome.org/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> | 
|  |  | 
|  | <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> | 
|  | <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> | 
|  | <span class="function"><a href="https://developer.gnome.org/glib/unstable/glib-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="https://developer.gnome.org/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> | 
|  |  | 
|  | 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> | 
|  | <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> | 
|  | <span class="function"><a href="https://developer.gnome.org/gobject/unstable/gobject-Signals.html#g-signal-connect">g_signal_connect</a></span> <span class="gtkdoc opt">(</span><span class="function"><a href="https://developer.gnome.org/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">"message"</span><span class="gtkdoc opt">,</span> <span class="function"><a href="https://developer.gnome.org/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> | 
|  | <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> | 
|  |  | 
|  | <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> | 
|  | GST_STATE_PLAYING<span class="gtkdoc opt">) ==</span> GST_STATE_CHANGE_FAILURE<span class="gtkdoc opt">) {</span> | 
|  | <span class="function"><a href="https://developer.gnome.org/glib/unstable/glib-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="https://developer.gnome.org/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> | 
|  |  | 
|  | <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> | 
|  |  | 
|  | <span class="function"><a href="https://developer.gnome.org/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> | 
|  | <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> | 
|  |  | 
|  | <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.20.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.20.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="https://developer.gnome.org/gobject/unstable/gobject-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”                  <span class="type">guint64</span></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="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a>               rate, | 
|  | <a href="https://developer.gnome.org/glib/unstable/glib-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="id-1.2.20.12.2.5"></a><h4>Parameters</h4> | 
|  | <div class="informaltable"><table 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="https://developer.gnome.org/gobject/unstable/gobject-Signals.html#G-SIGNAL-RUN-LAST:CAPS">Run Last</a></p> | 
|  | </div> | 
|  | </div> | 
|  | </div> | 
|  | <div class="footer"> | 
|  | <hr>Generated by GTK-Doc V1.24</div> | 
|  | </body> | 
|  | </html> |