| <!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> |