advanced-dparams.xml 4.18 KB
Newer Older
1
<chapter id="chapter-dparams">
2
  <title>Dynamic Controllable Parameters</title>
3
  
4 5
  <sect1 id="section-dparams-getting-started">
    <title>Getting Started</title>
6 7 8 9
    <para>
      The controller subsystem offers a lightweight way to adjust gobject
      properties over stream-time. Normaly these properties are changed using
      <function>g_object_set()</function>. Timing those calls reliably so that
Piotr Fusik's avatar
Piotr Fusik committed
10
      the changes affect certain stream times is close to impossible. The
11 12 13 14 15 16
      controller takes time into account. It works by attaching control-sources
      to properties. Control-sources can provide new values for the properties
      for a given timestamp. At run-time the elements continously pull values
      changes for the current stream-time. GStreamer includes a few different
      control-sources, but applications can define their own by subclassing.
    </para>
17 18
    <para>
      This subsystem is contained within the
Stefan Kost's avatar
Stefan Kost committed
19
      <filename>gstcontroller</filename> library.
20 21 22 23 24
      You need to include the header in your application's source file:
    </para>
    <programlisting>
...
#include &lt;gst/gst.h&gt;
25
#include &lt;gst/controller/gstcontroller.h&gt;
26 27 28
...
    </programlisting>
    <para>
29
      Your application should link to the shared library <filename>gstreamer-controller</filename>.
30 31
    </para>
    <para>
32
      The <filename>gstreamer-controller</filename> library needs to be initialized
Piotr Fusik's avatar
Piotr Fusik committed
33
      when your application is run.  This can be done after the GStreamer
34 35 36 37
      library has been initialized.
    </para>
    <programlisting>
  ...
Stefan Kost's avatar
Stefan Kost committed
38 39
  gst_init (&amp;argc, &amp;argv);
  gst_controller_init (&amp;argc, &amp;argv);
40 41 42
  ...
    </programlisting>
  </sect1>
43 44
  
  <sect1 id="section-dparams-parameters">
Stefan Kost's avatar
Stefan Kost committed
45
    <title>Setting up parameter control</title>
46
    <para>
Stefan Kost's avatar
Stefan Kost committed
47 48 49
      The first step is to select the parameters that should be controlled.
      This returns a controller object that is needed to further adjust the
      behaviour.      
50 51
    </para>
    <programlisting>
52
  controller = gst_object_control_properties(object, "prop1", "prop2",...);
53 54
    </programlisting>
    <para>
55 56
      Next we attach a control-source to each parameter. Lets use an 
      interpolation control-source:
57 58
    </para>
    <programlisting>
59 60
  csource = gst_interpolation_control_source_new ();
  gst_interpolation_control_source_set_interpolation_mode(csource, GST_INTERPOLATE_LINEAR);
61 62
    </programlisting>
    <para>
63 64 65 66 67 68 69
      This control-source takes new property values from a list of time-stamped
      parameter changes. The source can e.g. fill gaps by smoothing parameter
      changes. This behaviour can be configured by setting the 
      interpolation-mode.
    </para>
    <para>
      Now we can set some control points. These are time-stamped GValues.
70 71
      The values become active when the timestamp is reached. They still stay
      in the list. If e.g. the pipeline runs a loop (using a segmented seek),
72 73 74 75 76 77 78 79 80 81
      the control-curve gets repeated as well. Other control-sources have
      different functions to specify the control-changes over time.
    </para>
    <programlisting>
  gst_interpolation_control_source_set (csource, 0 * GST_SECOND, value1);
  gst_interpolation_control_source_set (csource, 1 * GST_SECOND, value2);
    </programlisting>
    <para>
      Finally we need to assign the control-source to the gobject property. One 
      control source can only be assigned to one property.
82 83
    </para>
    <programlisting>
84
      gst_controller_set_control_source (controller, "prop1", csource);
85 86
    </programlisting>
    <para>
87 88 89 90
      Now everything is ready to play. One final note - the controller subsystem
      has a builtin live-mode. Even though a property has a control-source
      assigned one can change the GObject property through the 
      <function>g_object_set()</function>.
91
      This is highly useful when binding the GObject properties to GUI widgets.
92
      When the user adjusts the value with the widget, one can set the GObject
93 94 95 96
      property and this remains active until the next programmed control-source
      value overrides it. This also works with smoothed parameters. It might not
      work for control-sources that constantly update the property (e.g. the lfo
      control-source).
97 98 99 100
    </para>
  </sect1>
  
</chapter>