clap

CLAP Audio Plugin API
Log | Files | Refs | README | LICENSE

commit afa99b2ce86d24bc16cba9a47cf35f700b963c5e
parent 43edca7ee8fd9853425ce5cc4e093da7f3d05252
Author: Alexandre Bique <bique.alexandre@gmail.com>
Date:   Wed, 12 Oct 2016 09:03:14 +0200

Re-organize doc

Diffstat:
Mspec.html | 1089++++++++++++++++++++++++++++++++++++++-----------------------------------------
Mspec.rst | 54++++++++++++++++++++++++------------------------------
2 files changed, 550 insertions(+), 593 deletions(-)

diff --git a/spec.html b/spec.html @@ -125,71 +125,65 @@ tt.docutils { <li><a class="reference internal" href="#instantiate-a-plugin" id="id13">Instantiate a plugin</a><ul> <li><a class="reference internal" href="#precautions" id="id14">Precautions</a></li> <li><a class="reference internal" href="#release-a-plugin" id="id15">Release a plugin</a></li> -<li><a class="reference internal" href="#plugins-collection" id="id16">Plugins collection</a><ul> -<li><a class="reference internal" href="#sample-plugin-loader" id="id17">Sample plugin loader</a></li> +<li><a class="reference internal" href="#plugins-collection" id="id16">Plugins collection</a></li> +<li><a class="reference internal" href="#plugin-description" id="id17">Plugin description</a></li> +<li><a class="reference internal" href="#extension-system" id="id18">Extension system</a></li> +<li><a class="reference internal" href="#audio-ports-configuration" id="id19">Audio ports configuration</a><ul> +<li><a class="reference internal" href="#pin-layout" id="id20">Pin layout</a></li> +<li><a class="reference internal" href="#configurations" id="id21">Configurations</a></li> +<li><a class="reference internal" href="#getting-the-ports-configurations" id="id22">Getting the ports configurations</a></li> +<li><a class="reference internal" href="#selecting-a-configuration" id="id23">Selecting a configuration</a></li> +<li><a class="reference internal" href="#repeatable-channels" id="id24">Repeatable channels</a></li> </ul> </li> -<li><a class="reference internal" href="#plugin-description" id="id18">Plugin description</a></li> -<li><a class="reference internal" href="#extension-system" id="id19">Extension system</a></li> -<li><a class="reference internal" href="#audio-ports-configuration" id="id20">Audio ports configuration</a><ul> -<li><a class="reference internal" href="#pin-layout" id="id21">Pin layout</a></li> -<li><a class="reference internal" href="#configurations" id="id22">Configurations</a></li> -<li><a class="reference internal" href="#getting-the-ports-configurations" id="id23">Getting the ports configurations</a></li> -<li><a class="reference internal" href="#selecting-a-configuration" id="id24">Selecting a configuration</a></li> -<li><a class="reference internal" href="#repeatable-channels" id="id25">Repeatable channels</a></li> </ul> </li> +<li><a class="reference internal" href="#activation" id="id25">Activation</a></li> +<li><a class="reference internal" href="#processing" id="id26">Processing</a><ul> +<li><a class="reference internal" href="#audio-buffers" id="id27">Audio buffers</a></li> +<li><a class="reference internal" href="#events" id="id28">Events</a><ul> +<li><a class="reference internal" href="#notes" id="id29">Notes</a></li> +<li><a class="reference internal" href="#parameters" id="id30">Parameters</a></li> </ul> </li> -<li><a class="reference internal" href="#activation" id="id26">Activation</a></li> -<li><a class="reference internal" href="#processing" id="id27">Processing</a><ul> -<li><a class="reference internal" href="#audio-buffers" id="id28">Audio buffers</a></li> -<li><a class="reference internal" href="#events" id="id29">Events</a><ul> -<li><a class="reference internal" href="#notes" id="id30">Notes</a></li> -<li><a class="reference internal" href="#parameters" id="id31">Parameters</a></li> </ul> </li> +<li><a class="reference internal" href="#id1" id="id31">Parameters</a><ul> +<li><a class="reference internal" href="#types" id="id32">Types</a></li> +<li><a class="reference internal" href="#scales" id="id33">Scales</a></li> +<li><a class="reference internal" href="#automation" id="id34">Automation</a></li> </ul> </li> -<li><a class="reference internal" href="#id1" id="id32">Parameters</a><ul> -<li><a class="reference internal" href="#types" id="id33">Types</a></li> -<li><a class="reference internal" href="#scales" id="id34">Scales</a></li> -<li><a class="reference internal" href="#automation" id="id35">Automation</a></li> +<li><a class="reference internal" href="#graphical-user-interface" id="id35">Graphical User Interface</a><ul> +<li><a class="reference internal" href="#showing-the-gui" id="id36">Showing the GUI</a></li> +<li><a class="reference internal" href="#sending-events-to-the-host" id="id37">Sending events to the host</a></li> +<li><a class="reference internal" href="#hiding-the-gui" id="id38">Hiding the GUI</a></li> +<li><a class="reference internal" href="#embedding" id="id39">Embedding</a><ul> +<li><a class="reference internal" href="#example-on-windows" id="id40">Example on Windows</a></li> +<li><a class="reference internal" href="#resizing-the-window" id="id41">Resizing the window</a></li> </ul> </li> -<li><a class="reference internal" href="#graphical-user-interface" id="id36">Graphical User Interface</a><ul> -<li><a class="reference internal" href="#showing-the-gui" id="id37">Showing the GUI</a></li> -<li><a class="reference internal" href="#sending-events-to-the-host" id="id38">Sending events to the host</a></li> -<li><a class="reference internal" href="#hiding-the-gui" id="id39">Hiding the GUI</a></li> -<li><a class="reference internal" href="#embedding" id="id40">Embedding</a><ul> -<li><a class="reference internal" href="#example-on-windows" id="id41">Example on Windows</a></li> -<li><a class="reference internal" href="#resizing-the-window" id="id42">Resizing the window</a></li> </ul> </li> +<li><a class="reference internal" href="#presets" id="id42">Presets</a><ul> +<li><a class="reference internal" href="#list-plugin-s-presets" id="id43">List plugin's presets</a></li> +<li><a class="reference internal" href="#load-a-preset" id="id44">Load a preset</a></li> </ul> </li> -<li><a class="reference internal" href="#presets" id="id43">Presets</a><ul> -<li><a class="reference internal" href="#list-plugin-s-presets" id="id44">List plugin's presets</a></li> -<li><a class="reference internal" href="#load-a-preset" id="id45">Load a preset</a></li> +<li><a class="reference internal" href="#save-and-restore-plugin-s-state" id="id45">Save and restore plugin's state</a></li> </ul> </li> -<li><a class="reference internal" href="#save-and-restore-plugin-s-state" id="id46">Save and restore plugin's state</a></li> -</ul> -</li> -<li><a class="reference internal" href="#examples" id="id47">Examples</a><ul> -<li><a class="reference internal" href="#examples-clap-info-clap-info-c" id="id48">examples/clap-info/clap-info.c</a></li> -</ul> -</li> -<li><a class="reference internal" href="#references" id="id49">References</a><ul> -<li><a class="reference internal" href="#clap-clap-h" id="id50">clap/clap.h</a></li> -<li><a class="reference internal" href="#clap-ext-ports-h" id="id51">clap/ext/ports.h</a></li> -<li><a class="reference internal" href="#clap-ext-gui-h" id="id52">clap/ext/gui.h</a></li> -<li><a class="reference internal" href="#clap-ext-state-h" id="id53">clap/ext/state.h</a></li> -<li><a class="reference internal" href="#clap-ext-params-h" id="id54">clap/ext/params.h</a></li> -<li><a class="reference internal" href="#clap-ext-presets-h" id="id55">clap/ext/presets.h</a></li> -<li><a class="reference internal" href="#clap-ext-embed-h" id="id56">clap/ext/embed.h</a></li> -<li><a class="reference internal" href="#clap-ext-embed-win32-h" id="id57">clap/ext/embed-win32.h</a></li> -<li><a class="reference internal" href="#clap-ext-embed-xlib-h" id="id58">clap/ext/embed-xlib.h</a></li> +<li><a class="reference internal" href="#references" id="id46">References</a><ul> +<li><a class="reference internal" href="#clap-clap-h" id="id47">clap/clap.h</a></li> +<li><a class="reference internal" href="#clap-ext-state-h" id="id48">clap/ext/state.h</a></li> +<li><a class="reference internal" href="#clap-ext-ports-h" id="id49">clap/ext/ports.h</a></li> +<li><a class="reference internal" href="#clap-ext-params-h" id="id50">clap/ext/params.h</a></li> +<li><a class="reference internal" href="#clap-ext-gui-h" id="id51">clap/ext/gui.h</a></li> +<li><a class="reference internal" href="#clap-ext-embed-h" id="id52">clap/ext/embed.h</a></li> +<li><a class="reference internal" href="#clap-ext-embed-win32-h" id="id53">clap/ext/embed-win32.h</a></li> +<li><a class="reference internal" href="#clap-ext-embed-x11-h" id="id54">clap/ext/embed-x11.h</a></li> +<li><a class="reference internal" href="#clap-ext-embed-cocoa-h" id="id55">clap/ext/embed-cocoa.h</a></li> +<li><a class="reference internal" href="#clap-ext-presets-h" id="id56">clap/ext/presets.h</a></li> </ul> </li> </ul> @@ -197,15 +191,15 @@ tt.docutils { <div class="section" id="goals"> <h1><a class="toc-backref" href="#id2">Goals</a></h1> <ul class="simple"> -<li>Make a free digital instrument and effect plugin format</li> +<li>Make a free digital instrument and effect plugin interface</li> <li>Be easy to understand and implement</li> -<li>Bring new features missed in VST 2.4</li> +<li>Don't require alien technology</li> <li>Designed to work on any operating system and processor architecture</li> <li>Be event oriented</li> <li>Be extensible</li> <li>Be easy to bridge</li> -<li>Support dynamic configuration: let a modular plugin dynamically -add new parameters, new outputs/inputs, etc...</li> +<li>Support dynamic configuration: let a plugin dynamically +add new parameters, io ports, etc...</li> </ul> <div class="section" id="design-choice"> <h2><a class="toc-backref" href="#id3">Design choice</a></h2> @@ -328,13 +322,9 @@ into the parameter <tt class="docutils literal">*plugins_count</tt>. After that of them by using an <tt class="docutils literal">index</tt> between <tt class="docutils literal">0</tt> and <tt class="docutils literal">*plugins_count</tt>.</p> <p><tt class="docutils literal">clap_create</tt> returns <tt class="docutils literal">NULL</tt> if the plugin creation failed or if <tt class="docutils literal">plugin_index &gt;= plugin_count</tt>.</p> -<div class="section" id="sample-plugin-loader"> -<h4><a class="toc-backref" href="#id17">Sample plugin loader</a></h4> -<p>See <a class="reference internal" href="#examples-clap-info-clap-info-c">examples/clap-info/clap-info.c</a></p> -</div> </div> <div class="section" id="plugin-description"> -<h3><a class="toc-backref" href="#id18">Plugin description</a></h3> +<h3><a class="toc-backref" href="#id17">Plugin description</a></h3> <p><tt class="docutils literal">struct clap_plugin</tt> only contains a interger <tt class="docutils literal">clap_version</tt> which indicates which version of the clap interface has been used to build the plugin, and a few methods. This attribute must be initialized by the plugin with @@ -407,7 +397,7 @@ the DAW's task scheduling.</td> </table> </div> <div class="section" id="extension-system"> -<h3><a class="toc-backref" href="#id19">Extension system</a></h3> +<h3><a class="toc-backref" href="#id18">Extension system</a></h3> <p>To extend clap's functionnality, there is a pretty simple mechanism:</p> <pre class="code c literal-block"> <span class="kt">void</span> <span class="o">*</span><span class="n">plug_ext</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">-&gt;</span><span class="n">extension</span><span class="p">(</span><span class="n">plug</span><span class="p">,</span> <span class="s">&quot;company/ext-name&quot;</span><span class="p">);</span> @@ -416,7 +406,7 @@ the DAW's task scheduling.</td> <p>If the extension is not supported, the plugin should return <tt class="docutils literal">NULL</tt>.</p> </div> <div class="section" id="audio-ports-configuration"> -<h3><a class="toc-backref" href="#id20">Audio ports configuration</a></h3> +<h3><a class="toc-backref" href="#id19">Audio ports configuration</a></h3> <p>A plugin may have multiple audio ports, and so multiple audio ports layout or configurations.</p> <p>An audio port has a type: mono, stereo, surround and a role: main @@ -424,7 +414,7 @@ input/output or sidechain. We might add a feedback role in the futur if there is a need for it. Also, an instrument/effect can load and host clap effects for its feedback loops.</p> <div class="section" id="pin-layout"> -<h4><a class="toc-backref" href="#id21">Pin layout</a></h4> +<h4><a class="toc-backref" href="#id20">Pin layout</a></h4> <table border="1" class="docutils"> <colgroup> <col width="28%" /> @@ -478,7 +468,7 @@ clap effects for its feedback loops.</p> </table> </div> <div class="section" id="configurations"> -<h4><a class="toc-backref" href="#id22">Configurations</a></h4> +<h4><a class="toc-backref" href="#id21">Configurations</a></h4> <p>After the call to <tt class="docutils literal">clap_create()</tt> the new plugin uses the default ports configuration: 1 stereo input and 1 stereo output. So if you're fine with it, there is nothing more to do.</p> @@ -538,9 +528,9 @@ during the plugin activation (<tt class="docutils literal"><span class="pre">plu </table> </div> <div class="section" id="getting-the-ports-configurations"> -<h4><a class="toc-backref" href="#id23">Getting the ports configurations</a></h4> +<h4><a class="toc-backref" href="#id22">Getting the ports configurations</a></h4> <pre class="code c literal-block"> -<span class="cp">#include &lt;clap/ext/ports.h&gt; +<span class="cp">#include</span> <span class="cpf">&lt;clap/ext/ports.h&gt;</span><span class="cp"> </span> <span class="k">struct</span> <span class="n">clap_plugin_ports</span> <span class="o">*</span><span class="n">ports</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">-&gt;</span><span class="n">extension</span><span class="p">(</span><span class="n">plugin</span><span class="p">,</span> <span class="n">CLAP_EXT_PORTS</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">ports</span><span class="p">)</span> @@ -562,13 +552,13 @@ you have to call <tt class="docutils literal"><span class="pre">ports-&gt;get_info(plugin,</span> config_index, port_index, &amp;port);</tt>.</p> </div> <div class="section" id="selecting-a-configuration"> -<h4><a class="toc-backref" href="#id24">Selecting a configuration</a></h4> +<h4><a class="toc-backref" href="#id23">Selecting a configuration</a></h4> <p>Selecting an audio configuration has to be done when the plugin is deactivated. It is done by calling <tt class="docutils literal"><span class="pre">plugin-&gt;set_port_config(plugin,</span> config_index)</tt>. If the call returns false, then the plugin is in failed state.</p> </div> <div class="section" id="repeatable-channels"> -<h4><a class="toc-backref" href="#id25">Repeatable channels</a></h4> +<h4><a class="toc-backref" href="#id24">Repeatable channels</a></h4> <p>Repeatable channels are a special case. A channel can be identified as repeatable if <tt class="docutils literal"><span class="pre">channel-&gt;is_repeatable</span> == true</tt>.</p> <p>A useful case is for an analyzer. Imagine a spectroscope, to which you want to @@ -585,7 +575,7 @@ the call.</p> </div> </div> <div class="section" id="activation"> -<h2><a class="toc-backref" href="#id26">Activation</a></h2> +<h2><a class="toc-backref" href="#id25">Activation</a></h2> <p>Before doing any processing, the plugin must be activated by calling <tt class="docutils literal">bool succeed = <span class="pre">plugin-&gt;activate(plugin);</span></tt>.</p> <p>If <tt class="docutils literal">succeed == true</tt> then the activation succeed. If the activation failed, @@ -602,7 +592,7 @@ thread as it may take time.</p> <p>The host must de-activate the plugin before destroying it.</p> </div> <div class="section" id="processing"> -<h2><a class="toc-backref" href="#id27">Processing</a></h2> +<h2><a class="toc-backref" href="#id26">Processing</a></h2> <p>The processing is done in one call: <tt class="docutils literal"><span class="pre">plugin-&gt;process(plugin,</span> process);</tt>. The data structure process regroup everything needed by the plugin:</p> <ul class="simple"> @@ -638,7 +628,7 @@ which can be:</p> (see <tt class="docutils literal">CLAP_EVENT_PARAM_RAMP</tt> event), then the host must send a <tt class="docutils literal">CLAP_EVENT_PARAM_SET</tt> or <tt class="docutils literal">CLAP_EVENT_PARAM_RAMP</tt> for those parameters at the next call to process.</p> <div class="section" id="audio-buffers"> -<h3><a class="toc-backref" href="#id28">Audio buffers</a></h3> +<h3><a class="toc-backref" href="#id27">Audio buffers</a></h3> <ul class="simple"> <li>The audio buffers are allocated by the host. They must be aligned by the maximum requirement of the vector instructions currently available.</li> @@ -650,14 +640,14 @@ if the plugin has the attribute <tt class="docutils literal">CLAP_ATTR_SUPPORTS_ </ul> </div> <div class="section" id="events"> -<h3><a class="toc-backref" href="#id29">Events</a></h3> +<h3><a class="toc-backref" href="#id28">Events</a></h3> <ul class="simple"> <li>Event's time must be within the process duration: <tt class="docutils literal"><span class="pre">[process-&gt;steady_time</span> .. <span class="pre">process-&gt;steady_time</span> + <span class="pre">process-&gt;nb_sambles]</span></tt>.</li> <li>The plugin must not modify the events.</li> </ul> <div class="section" id="notes"> -<h4><a class="toc-backref" href="#id30">Notes</a></h4> +<h4><a class="toc-backref" href="#id29">Notes</a></h4> <p>A note is identified by a key. A key correspond to the keys of a midi keyboard (128 keys). If the plugin supports tuning then it should use the <tt class="docutils literal"><span class="pre">event-&gt;note.pitch</span></tt> as the note frequency.</p> @@ -687,7 +677,7 @@ a note with a pitch of 54Hz</li> it can quickly figure which voice is playing the given key.</p> </div> <div class="section" id="parameters"> -<h4><a class="toc-backref" href="#id31">Parameters</a></h4> +<h4><a class="toc-backref" href="#id30">Parameters</a></h4> <p>Parameters can be automated by the host using <tt class="docutils literal">CLAP_EVENT_PARAM_SET</tt> or <tt class="docutils literal">CLAP_EVENT_PARAM_RAMP</tt>.</p> <p>When using <tt class="docutils literal">CLAP_EVENT_PARAM_RAMP</tt>, the parameter is set to <tt class="docutils literal"><span class="pre">ev-&gt;param.value</span></tt> @@ -698,7 +688,7 @@ for the sample at <tt class="docutils literal"><span class="pre">ev-&gt;steady_t </div> </div> <div class="section" id="id1"> -<h2><a class="toc-backref" href="#id32">Parameters</a></h2> +<h2><a class="toc-backref" href="#id31">Parameters</a></h2> <p>The host can get the plugin's parameters tree by using the params extension:</p> <ul class="simple"> <li><tt class="docutils literal"><span class="pre">params-&gt;count(plugin);</span></tt> to know the number of parameters</li> @@ -706,7 +696,7 @@ for the sample at <tt class="docutils literal"><span class="pre">ev-&gt;steady_t value and description</li> </ul> <pre class="code c literal-block"> -<span class="cp">#include &lt;clap/ext/params.h&gt; +<span class="cp">#include</span> <span class="cpf">&lt;clap/ext/params.h&gt;</span><span class="cp"> </span> <span class="k">struct</span> <span class="n">clap_plugin_params</span> <span class="o">*</span><span class="n">params</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">-&gt;</span><span class="n">extension</span><span class="p">(</span><span class="n">plugin</span><span class="p">,</span> <span class="n">CLAP_EXT_PARAMS</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">params</span><span class="p">)</span> @@ -775,7 +765,7 @@ types.</td> </tbody> </table> <div class="section" id="types"> -<h3><a class="toc-backref" href="#id33">Types</a></h3> +<h3><a class="toc-backref" href="#id32">Types</a></h3> <p>There are a few parameter types:</p> <table border="1" class="docutils"> <colgroup> @@ -817,14 +807,14 @@ should rely on <tt class="docutils literal">display_text</tt> to show its value. </table> </div> <div class="section" id="scales"> -<h3><a class="toc-backref" href="#id34">Scales</a></h3> +<h3><a class="toc-backref" href="#id33">Scales</a></h3> <p>The plugin can inform the host, which scale to use for the parameter's UI (knob, slider, ...). <tt class="docutils literal"><span class="pre">clap_param-&gt;scale</span></tt> can be set to <tt class="docutils literal">CLAP_PARAM_LINEAR</tt> or <tt class="docutils literal">CLAP_PARAM_LOG</tt>. A logarithmic scale is convinient for a frequency parameter.</p> </div> <div class="section" id="automation"> -<h3><a class="toc-backref" href="#id35">Automation</a></h3> +<h3><a class="toc-backref" href="#id34">Automation</a></h3> <p>When a parameter is modified by the GUI, the plugin should send a <tt class="docutils literal">CLAP_EVENT_PARAM_SET</tt> event must be sent to the host, using <tt class="docutils literal"><span class="pre">host-&gt;events(host,</span> plugin, events);</tt> so the host can record the automation.</p> @@ -836,14 +826,14 @@ To do that the plugin uses <tt class="docutils literal"><span class="pre">clap_e </div> </div> <div class="section" id="graphical-user-interface"> -<h2><a class="toc-backref" href="#id36">Graphical User Interface</a></h2> +<h2><a class="toc-backref" href="#id35">Graphical User Interface</a></h2> <div class="section" id="showing-the-gui"> -<h3><a class="toc-backref" href="#id37">Showing the GUI</a></h3> +<h3><a class="toc-backref" href="#id36">Showing the GUI</a></h3> <p>To show the plugin's GUI, you need to use the gui extension: <tt class="docutils literal"><span class="pre">gui-&gt;open(plugin)</span></tt>. If the plugin succeed to show the GUI, it returns <tt class="docutils literal">true</tt>, <tt class="docutils literal">false</tt> otherwise.</p> <pre class="code c literal-block"> -<span class="cp">#include &lt;clap/ext/gui.h&gt; +<span class="cp">#include</span> <span class="cpf">&lt;clap/ext/gui.h&gt;</span><span class="cp"> </span> <span class="k">struct</span> <span class="n">clap_plugin_gui</span> <span class="o">*</span><span class="n">gui</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">-&gt;</span><span class="n">extension</span><span class="p">(</span><span class="n">plugin</span><span class="p">,</span> <span class="n">CLAP_EXT_GUI</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="n">gui</span><span class="p">)</span> @@ -852,7 +842,7 @@ otherwise.</p> <p>See <a class="reference internal" href="#clap-ext-gui-h">clap/ext/gui.h</a>.</p> </div> <div class="section" id="sending-events-to-the-host"> -<h3><a class="toc-backref" href="#id38">Sending events to the host</a></h3> +<h3><a class="toc-backref" href="#id37">Sending events to the host</a></h3> <p>The plugin can notify the host of parameter changes by sending events to: <tt class="docutils literal"><span class="pre">host-&gt;events(host,</span> plugin, events);</tt>.</p> <p>Events sent to the host should be stamped:</p> @@ -864,7 +854,7 @@ otherwise.</p> </pre> </div> <div class="section" id="hiding-the-gui"> -<h3><a class="toc-backref" href="#id39">Hiding the GUI</a></h3> +<h3><a class="toc-backref" href="#id38">Hiding the GUI</a></h3> <p>The plugin should hide the GUI after a call to <tt class="docutils literal"><span class="pre">gui-&gt;close(plugin)</span></tt>. If the plugin window has been closed by the user, then the plugin should send an event <tt class="docutils literal">CLAP_EVENT_GUI_CLOSED</tt> to the host.</p> @@ -877,7 +867,7 @@ send an event <tt class="docutils literal">CLAP_EVENT_GUI_CLOSED</tt> to the hos </pre> </div> <div class="section" id="embedding"> -<h3><a class="toc-backref" href="#id40">Embedding</a></h3> +<h3><a class="toc-backref" href="#id39">Embedding</a></h3> <p>Some host are designed to embed plugin's window. As embedding is not a requirement and is OS specific, it is then offered as an extension.</p> @@ -907,18 +897,23 @@ an extension.</p> <td>For the plugin</td> </tr> <tr><td>X11</td> -<td><a class="reference internal" href="#clap-ext-embed-xlib-h">clap/ext/embed-xlib.h</a></td> -<td><tt class="docutils literal">CLAP_EMBED_XLIB</tt></td> +<td><a class="reference internal" href="#clap-ext-embed-x11-h">clap/ext/embed-x11.h</a></td> +<td><tt class="docutils literal">CLAP_EMBED_X11</tt></td> +<td>For the plugin</td> +</tr> +<tr><td>Cocoa</td> +<td><a class="reference internal" href="#clap-ext-embed-cocoa-h">clap/ext/embed-cocoa.h</a></td> +<td><tt class="docutils literal">CLAP_EMBED_COCOA</tt></td> <td>For the plugin</td> </tr> </tbody> </table> <div class="section" id="example-on-windows"> -<h4><a class="toc-backref" href="#id41">Example on Windows</a></h4> +<h4><a class="toc-backref" href="#id40">Example on Windows</a></h4> <pre class="code c literal-block"> -<span class="cp">#include &lt;clap/clap.h&gt; -#include &lt;clap/ext/gui.h&gt; -#include &lt;clap/ext/embed-win32.h&gt; +<span class="cp">#include</span> <span class="cpf">&lt;clap/clap.h&gt;</span><span class="cp"> +#include</span> <span class="cpf">&lt;clap/ext/gui.h&gt;</span><span class="cp"> +#include</span> <span class="cpf">&lt;clap/ext/embed-win32.h&gt;</span><span class="cp"> </span> <span class="k">struct</span> <span class="n">clap_plugin_embed_win32</span> <span class="o">*</span><span class="n">embed</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">-&gt;</span><span class="n">get_extension</span><span class="p">(</span><span class="n">plugin</span><span class="p">,</span> <span class="n">CLAP_EMBED_WIN32</span><span class="p">);</span> <span class="k">if</span> <span class="p">(</span><span class="n">embed</span><span class="p">)</span> @@ -930,10 +925,10 @@ an extension.</p> </pre> </div> <div class="section" id="resizing-the-window"> -<h4><a class="toc-backref" href="#id42">Resizing the window</a></h4> +<h4><a class="toc-backref" href="#id41">Resizing the window</a></h4> <pre class="code c literal-block"> -<span class="cp">#include &lt;clap/clap.h&gt; -#include &lt;clap/ext/embed.h&gt; +<span class="cp">#include</span> <span class="cpf">&lt;clap/clap.h&gt;</span><span class="cp"> +#include</span> <span class="cpf">&lt;clap/ext/embed.h&gt;</span><span class="cp"> </span> <span class="c1">// plugin code </span><span class="k">struct</span> <span class="n">clap_host_embed</span> <span class="o">*</span><span class="n">embed</span> <span class="o">=</span> <span class="n">host</span><span class="o">-&gt;</span><span class="n">get_extension</span><span class="p">(</span><span class="n">plugin</span><span class="p">,</span> <span class="n">CLAP_EMBED</span><span class="p">);</span> @@ -945,13 +940,13 @@ an extension.</p> </div> </div> <div class="section" id="presets"> -<h2><a class="toc-backref" href="#id43">Presets</a></h2> +<h2><a class="toc-backref" href="#id42">Presets</a></h2> <div class="section" id="list-plugin-s-presets"> -<h3><a class="toc-backref" href="#id44">List plugin's presets</a></h3> +<h3><a class="toc-backref" href="#id43">List plugin's presets</a></h3> <p>The host can browse the plugin's presets by using the preset extension:</p> <pre class="code c literal-block"> -<span class="cp">#include &lt;clap/clap.h&gt; -#include &lt;clap/ext/presets.h&gt; +<span class="cp">#include</span> <span class="cpf">&lt;clap/clap.h&gt;</span><span class="cp"> +#include</span> <span class="cpf">&lt;clap/ext/presets.h&gt;</span><span class="cp"> </span> <span class="k">struct</span> <span class="n">clap_plugin_presets</span> <span class="o">*</span><span class="n">presets</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">-&gt;</span><span class="n">get_extension</span><span class="p">(</span><span class="n">plugin</span><span class="p">,</span> <span class="n">CLAP_PRESETS</span><span class="p">);</span> <span class="k">struct</span> <span class="n">clap_preset_iterator</span> <span class="o">*</span><span class="n">iter</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span> @@ -972,7 +967,7 @@ an extension.</p> <p>See <a class="reference internal" href="#clap-ext-presets-h">clap/ext/presets.h</a>.</p> </div> <div class="section" id="load-a-preset"> -<h3><a class="toc-backref" href="#id45">Load a preset</a></h3> +<h3><a class="toc-backref" href="#id44">Load a preset</a></h3> <p>To load a preset, the host have to send an event <tt class="docutils literal">CLAP_EVENT_PRESET_SET</tt> to the plugin.</p> <p>When a preset is loaded from the plugin's GUI, the plugin must send a @@ -980,11 +975,11 @@ the plugin.</p> </div> </div> <div class="section" id="save-and-restore-plugin-s-state"> -<h2><a class="toc-backref" href="#id46">Save and restore plugin's state</a></h2> +<h2><a class="toc-backref" href="#id45">Save and restore plugin's state</a></h2> <p>Saving the plugin's state is done by using the state extension:</p> <pre class="code c literal-block"> -<span class="cp">#include &lt;clap/clap.h&gt; -#include &lt;clap/ext/state.h&gt; +<span class="cp">#include</span> <span class="cpf">&lt;clap/clap.h&gt;</span><span class="cp"> +#include</span> <span class="cpf">&lt;clap/ext/state.h&gt;</span><span class="cp"> </span> <span class="kt">void</span> <span class="o">*</span><span class="n">buffer</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span> <span class="kt">size_t</span> <span class="n">size</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> @@ -1008,182 +1003,16 @@ big endian machine, it should load again successfully.</p> plugin's parameters and restore them.</p> </div> </div> -<div class="section" id="examples"> -<h1><a class="toc-backref" href="#id47">Examples</a></h1> -<div class="section" id="examples-clap-info-clap-info-c"> -<h2><a class="toc-backref" href="#id48">examples/clap-info/clap-info.c</a></h2> -<pre class="code c literal-block"> -<span class="cp">#include &lt;stdio.h&gt; -#include &lt;dlfcn.h&gt; -</span> -<span class="cp">#include &lt;clap/clap.h&gt; -#include &lt;clap/ext/params.h&gt; -</span> -<span class="k">static</span> <span class="kt">void</span> <span class="nf">host_events</span><span class="p">(</span><span class="k">struct</span> <span class="n">clap_host</span> <span class="o">*</span><span class="n">host</span><span class="p">,</span> - <span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> - <span class="k">struct</span> <span class="n">clap_event</span> <span class="o">*</span><span class="n">events</span><span class="p">)</span> -<span class="p">{</span> -<span class="p">}</span> - -<span class="k">static</span> <span class="kt">void</span> <span class="o">*</span><span class="nf">host_extension</span><span class="p">(</span><span class="k">struct</span> <span class="n">clap_host</span> <span class="o">*</span><span class="n">host</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">extension_id</span><span class="p">)</span> -<span class="p">{</span> - <span class="k">return</span> <span class="nb">NULL</span><span class="p">;</span> -<span class="p">}</span> - -<span class="k">static</span> <span class="kt">void</span> <span class="nf">initialize_host</span><span class="p">(</span><span class="k">struct</span> <span class="n">clap_host</span> <span class="o">*</span><span class="n">host</span><span class="p">)</span> -<span class="p">{</span> - <span class="k">static</span> <span class="kt">uint64_t</span> <span class="n">steady_time</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> - - <span class="n">host</span><span class="o">-&gt;</span><span class="n">clap_version</span> <span class="o">=</span> <span class="n">CLAP_VERSION</span><span class="p">;</span> - <span class="n">host</span><span class="o">-&gt;</span><span class="n">events</span> <span class="o">=</span> <span class="n">host_events</span><span class="p">;</span> - <span class="n">host</span><span class="o">-&gt;</span><span class="n">steady_time</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">steady_time</span><span class="p">;</span> - <span class="n">host</span><span class="o">-&gt;</span><span class="n">extension</span> <span class="o">=</span> <span class="n">host_extension</span><span class="p">;</span> -<span class="p">}</span> - -<span class="k">static</span> <span class="kt">void</span> <span class="nf">print_attr</span><span class="p">(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">)</span> -<span class="p">{</span> - <span class="kt">char</span> <span class="n">buffer</span><span class="p">[</span><span class="mi">256</span><span class="p">];</span> - -<span class="cp">#define prt_attr(Attr) \ - do { \ - int size = plugin-&gt;get_attribute( \ - plugin, CLAP_ATTR_##Attr, buffer, sizeof (buffer)); \ - if (size &gt; 0) \ - fprintf(stdout, &quot; %s: %s\n&quot;, CLAP_ATTR_##Attr, buffer); \ - } while (0) -</span> - <span class="n">fprintf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="s">&quot;Attributes:</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span> - <span class="n">prt_attr</span><span class="p">(</span><span class="n">ID</span><span class="p">);</span> - <span class="n">prt_attr</span><span class="p">(</span><span class="n">NAME</span><span class="p">);</span> - <span class="n">prt_attr</span><span class="p">(</span><span class="n">DESCRIPTION</span><span class="p">);</span> - <span class="n">prt_attr</span><span class="p">(</span><span class="n">MANUFACTURER</span><span class="p">);</span> - <span class="n">prt_attr</span><span class="p">(</span><span class="n">VERSION</span><span class="p">);</span> - <span class="n">prt_attr</span><span class="p">(</span><span class="n">URL</span><span class="p">);</span> - <span class="n">prt_attr</span><span class="p">(</span><span class="n">SUPPORT</span><span class="p">);</span> - <span class="n">prt_attr</span><span class="p">(</span><span class="n">LICENSE</span><span class="p">);</span> - <span class="n">prt_attr</span><span class="p">(</span><span class="n">CATEGORIES</span><span class="p">);</span> - <span class="n">prt_attr</span><span class="p">(</span><span class="n">TYPE</span><span class="p">);</span> - <span class="n">prt_attr</span><span class="p">(</span><span class="n">CHUNK_SIZE</span><span class="p">);</span> - <span class="n">prt_attr</span><span class="p">(</span><span class="n">LATENCY</span><span class="p">);</span> - <span class="n">prt_attr</span><span class="p">(</span><span class="n">SUPPORTS_TUNING</span><span class="p">);</span> - <span class="n">prt_attr</span><span class="p">(</span><span class="n">SUPPORTS_IN_PLACE_PROCESSING</span><span class="p">);</span> - <span class="n">prt_attr</span><span class="p">(</span><span class="n">IS_REMOTE_PROCESSING</span><span class="p">);</span> - - <span class="n">fprintf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="s">&quot;-------------------</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span> - -<span class="cp">#undef print_attr -</span><span class="p">}</span> - -<span class="k">static</span> <span class="kt">void</span> <span class="nf">print_params</span><span class="p">(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">)</span> -<span class="p">{</span> - <span class="k">struct</span> <span class="n">clap_plugin_params</span> <span class="o">*</span><span class="n">params</span> <span class="o">=</span> <span class="n">plugin</span><span class="o">-&gt;</span><span class="n">extension</span><span class="p">(</span><span class="n">plugin</span><span class="p">,</span> <span class="n">CLAP_EXT_PARAMS</span><span class="p">);</span> - - <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">params</span><span class="p">)</span> <span class="p">{</span> - <span class="n">fprintf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="s">&quot;no parameter extension</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span> - <span class="k">return</span><span class="p">;</span> - <span class="p">}</span> - - <span class="kt">uint32_t</span> <span class="n">count</span> <span class="o">=</span> <span class="n">params</span><span class="o">-&gt;</span><span class="n">count</span><span class="p">(</span><span class="n">plugin</span><span class="p">);</span> - <span class="n">fprintf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="s">&quot;parameters count: %d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">count</span><span class="p">);</span> - - <span class="k">struct</span> <span class="n">clap_param</span> <span class="n">param</span><span class="p">;</span> - <span class="k">for</span> <span class="p">(</span><span class="kt">uint32_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">count</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span> - <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">params</span><span class="o">-&gt;</span><span class="n">get</span><span class="p">(</span><span class="n">plugin</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">param</span><span class="p">))</span> - <span class="k">continue</span><span class="p">;</span> - - <span class="n">fprintf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="s">&quot; =&gt; {id: %s, name: %s, desc: %s, display: %s, &quot;</span> - <span class="s">&quot;is_per_note: %d, is_used: %d, is_periodic: %d&quot;</span><span class="p">,</span> - <span class="n">param</span><span class="p">.</span><span class="n">id</span><span class="p">,</span> <span class="n">param</span><span class="p">.</span><span class="n">name</span><span class="p">,</span> <span class="n">param</span><span class="p">.</span><span class="n">desc</span><span class="p">,</span> <span class="n">param</span><span class="p">.</span><span class="n">display</span><span class="p">,</span> - <span class="n">param</span><span class="p">.</span><span class="n">is_per_note</span><span class="p">,</span> <span class="n">param</span><span class="p">.</span><span class="n">is_used</span><span class="p">,</span> <span class="n">param</span><span class="p">.</span><span class="n">is_periodic</span><span class="p">);</span> - - <span class="k">switch</span> <span class="p">(</span><span class="n">param</span><span class="p">.</span><span class="n">type</span><span class="p">)</span> <span class="p">{</span> - <span class="k">case</span> <span class="nl">CLAP_PARAM_FLOAT</span><span class="p">:</span> - <span class="n">fprintf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="s">&quot;, type: float, value: %f, min: %f, max: %f, default: %f&quot;</span><span class="p">,</span> - <span class="n">param</span><span class="p">.</span><span class="n">value</span><span class="p">.</span><span class="n">f</span><span class="p">,</span> <span class="n">param</span><span class="p">.</span><span class="n">min</span><span class="p">.</span><span class="n">f</span><span class="p">,</span> <span class="n">param</span><span class="p">.</span><span class="n">max</span><span class="p">.</span><span class="n">f</span><span class="p">,</span> <span class="n">param</span><span class="p">.</span><span class="n">deflt</span><span class="p">.</span><span class="n">f</span><span class="p">);</span> - <span class="k">break</span><span class="p">;</span> - - <span class="k">case</span> <span class="nl">CLAP_PARAM_INT</span><span class="p">:</span> - <span class="n">fprintf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="s">&quot;, type: int, value: %d, min: %d, max: %d, default: %d&quot;</span><span class="p">,</span> - <span class="n">param</span><span class="p">.</span><span class="n">value</span><span class="p">.</span><span class="n">i</span><span class="p">,</span> <span class="n">param</span><span class="p">.</span><span class="n">min</span><span class="p">.</span><span class="n">i</span><span class="p">,</span> <span class="n">param</span><span class="p">.</span><span class="n">max</span><span class="p">.</span><span class="n">i</span><span class="p">,</span> <span class="n">param</span><span class="p">.</span><span class="n">deflt</span><span class="p">.</span><span class="n">i</span><span class="p">);</span> - <span class="k">break</span><span class="p">;</span> - - <span class="k">case</span> <span class="nl">CLAP_PARAM_ENUM</span><span class="p">:</span> - <span class="n">fprintf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="s">&quot;, type: enum, value: %d, min: %d, max: %d, default: %d&quot;</span><span class="p">,</span> - <span class="n">param</span><span class="p">.</span><span class="n">value</span><span class="p">.</span><span class="n">i</span><span class="p">,</span> <span class="n">param</span><span class="p">.</span><span class="n">min</span><span class="p">.</span><span class="n">i</span><span class="p">,</span> <span class="n">param</span><span class="p">.</span><span class="n">max</span><span class="p">.</span><span class="n">i</span><span class="p">,</span> <span class="n">param</span><span class="p">.</span><span class="n">deflt</span><span class="p">.</span><span class="n">i</span><span class="p">);</span> - <span class="k">break</span><span class="p">;</span> - - <span class="k">case</span> <span class="nl">CLAP_PARAM_BOOL</span><span class="p">:</span> - <span class="n">fprintf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="s">&quot;, type: bool, value: %d, min: %d, max: %d, default: %d&quot;</span><span class="p">,</span> - <span class="n">param</span><span class="p">.</span><span class="n">value</span><span class="p">.</span><span class="n">i</span><span class="p">,</span> <span class="n">param</span><span class="p">.</span><span class="n">min</span><span class="p">.</span><span class="n">i</span><span class="p">,</span> <span class="n">param</span><span class="p">.</span><span class="n">max</span><span class="p">.</span><span class="n">i</span><span class="p">,</span> <span class="n">param</span><span class="p">.</span><span class="n">deflt</span><span class="p">.</span><span class="n">i</span><span class="p">);</span> - <span class="k">break</span><span class="p">;</span> - - <span class="k">case</span> <span class="nl">CLAP_PARAM_GROUP</span><span class="p">:</span> - <span class="n">fprintf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="s">&quot;, type: group&quot;</span><span class="p">);</span> - <span class="k">break</span><span class="p">;</span> - <span class="p">}</span> - - <span class="n">fprintf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="s">&quot;}</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span> - <span class="p">}</span> - - <span class="n">fprintf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,</span> <span class="s">&quot;-------------------</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span> -<span class="p">}</span> - -<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">**</span><span class="n">argv</span><span class="p">)</span> -<span class="p">{</span> - <span class="k">struct</span> <span class="n">clap_host</span> <span class="n">host</span><span class="p">;</span> - <span class="n">initialize_host</span><span class="p">(</span><span class="o">&amp;</span><span class="n">host</span><span class="p">);</span> - - <span class="kt">void</span> <span class="o">*</span> <span class="n">handle</span> <span class="o">=</span> <span class="n">dlopen</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">RTLD_NOW</span> <span class="o">|</span> <span class="n">RTLD_LOCAL</span><span class="p">);</span> - <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">handle</span><span class="p">)</span> <span class="p">{</span> - <span class="n">fprintf</span><span class="p">(</span><span class="n">stderr</span><span class="p">,</span> <span class="s">&quot;failed to load %s: %s</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">dlerror</span><span class="p">());</span> - <span class="k">return</span> <span class="mi">1</span><span class="p">;</span> - <span class="p">}</span> - - <span class="k">union</span> <span class="p">{</span> - <span class="kt">void</span> <span class="o">*</span><span class="n">ptr</span><span class="p">;</span> - <span class="n">clap_create_f</span> <span class="n">clap_create</span><span class="p">;</span> - <span class="p">}</span> <span class="n">symbol</span><span class="p">;</span> - - <span class="n">symbol</span><span class="p">.</span><span class="n">ptr</span> <span class="o">=</span> <span class="n">dlsym</span><span class="p">(</span><span class="n">handle</span><span class="p">,</span> <span class="s">&quot;clap_create&quot;</span><span class="p">);</span> - <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">symbol</span><span class="p">.</span><span class="n">ptr</span><span class="p">)</span> <span class="p">{</span> - <span class="n">fprintf</span><span class="p">(</span><span class="n">stderr</span><span class="p">,</span> <span class="s">&quot;symbol not found: clap_create</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span> - <span class="k">return</span> <span class="mi">1</span><span class="p">;</span> - <span class="p">}</span> - - <span class="kt">uint32_t</span> <span class="n">plugin_count</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span> - <span class="k">for</span> <span class="p">(</span><span class="kt">uint32_t</span> <span class="n">index</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">index</span> <span class="o">&lt;</span> <span class="n">plugin_count</span><span class="p">;</span> <span class="o">++</span><span class="n">index</span><span class="p">)</span> <span class="p">{</span> - <span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span> <span class="o">=</span> <span class="n">symbol</span><span class="p">.</span><span class="n">clap_create</span><span class="p">(</span> - <span class="n">index</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">host</span><span class="p">,</span> <span class="mi">48000</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">plugin_count</span><span class="p">);</span> - - <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">plugin</span><span class="p">)</span> <span class="p">{</span> - <span class="n">fprintf</span><span class="p">(</span><span class="n">stderr</span><span class="p">,</span> <span class="s">&quot;failed to create plugin index %d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">index</span><span class="p">);</span> - <span class="k">continue</span><span class="p">;</span> - <span class="p">}</span> - - <span class="n">print_attr</span><span class="p">(</span><span class="n">plugin</span><span class="p">);</span> - <span class="n">print_params</span><span class="p">(</span><span class="n">plugin</span><span class="p">);</span> - - <span class="c1">// destroy the plugin -</span> <span class="n">plugin</span><span class="o">-&gt;</span><span class="n">destroy</span><span class="p">(</span><span class="n">plugin</span><span class="p">);</span> - <span class="p">}</span> - - <span class="n">dlclose</span><span class="p">(</span><span class="n">handle</span><span class="p">);</span> - - <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> -<span class="p">}</span> -</pre> -</div> -</div> <div class="section" id="references"> -<h1><a class="toc-backref" href="#id49">References</a></h1> +<h1><a class="toc-backref" href="#id46">References</a></h1> <div class="section" id="clap-clap-h"> -<h2><a class="toc-backref" href="#id50">clap/clap.h</a></h2> +<h2><a class="toc-backref" href="#id47">clap/clap.h</a></h2> <pre class="code c literal-block"> <span class="cm">/* - * CLAP - CLever Audio Plugin (&lt;--- needs to find a marketing ok name) + * CLAP - CLever Audio Plugin * ~~~~~~~~~~~~~~~~~~~~~~~~~~ * - * Copyright (c) 2014 Alexandre BIQUE &lt;bique.alexandre&#64;gmail.com&gt; + * Copyright (c) 2014...2016 Alexandre BIQUE &lt;bique.alexandre&#64;gmail.com&gt; * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the &quot;Software&quot;), to deal @@ -1217,11 +1046,25 @@ plugin's parameters and restore them.</p> </span> <span class="cp"># define CLAP_VERSION_MAKE(Major, Minor, Revision) \ ((((Major) &amp; 0xff) &lt;&lt; 16) | (((Minor) &amp; 0xff) &lt;&lt; 8) | ((Revision) &amp; 0xff)) -# define CLAP_VERSION CLAP_VERSION_MAKE(0, 1, 0) +# define CLAP_VERSION CLAP_VERSION_MAKE(0, 2, 0) # define CLAP_VERSION_MAJ(Version) (((Version) &gt;&gt; 16) &amp; 0xff) # define CLAP_VERSION_MIN(Version) (((Version) &gt;&gt; 8) &amp; 0xff) # define CLAP_VERSION_REV(Version) ((Version) &amp; 0xff) </span> +<span class="cp">#if defined _WIN32 || defined __CYGWIN__ +# ifdef __GNUC__ +# define CLAP_EXPORT __attribute__ ((dllexport)) +# else +# define CLAP_EXPORT __declspec(dllexport) +# endif +#else +# if __GNUC__ &gt;= 4 +# define CLAP_EXPORT __attribute__ ((visibility (&quot;default&quot;))) +# else +# define CLAP_EXPORT +# endif +#endif +</span> <span class="c1">/////////////////////////// // FORWARD DELCLARATIONS // /////////////////////////// @@ -1231,12 +1074,11 @@ plugin's parameters and restore them.</p> <span class="k">enum</span> <span class="n">clap_string_size</span> <span class="p">{</span> - <span class="n">CLAP_ID_SIZE</span> <span class="o">=</span> <span class="mi">48</span><span class="p">,</span> - <span class="n">CLAP_NAME_SIZE</span> <span class="o">=</span> <span class="mi">32</span><span class="p">,</span> + <span class="n">CLAP_ID_SIZE</span> <span class="o">=</span> <span class="mi">64</span><span class="p">,</span> + <span class="n">CLAP_NAME_SIZE</span> <span class="o">=</span> <span class="mi">64</span><span class="p">,</span> <span class="n">CLAP_DESC_SIZE</span> <span class="o">=</span> <span class="mi">256</span><span class="p">,</span> - <span class="n">CLAP_DISPLAY_SIZE</span> <span class="o">=</span> <span class="mi">32</span><span class="p">,</span> - <span class="n">CLAP_TAGS_SIZE</span> <span class="o">=</span> <span class="mi">128</span><span class="p">,</span> - <span class="n">CLAP_URL_SIZE</span> <span class="o">=</span> <span class="mi">256</span><span class="p">,</span> + <span class="n">CLAP_DISPLAY_SIZE</span> <span class="o">=</span> <span class="mi">64</span><span class="p">,</span> + <span class="n">CLAP_TAGS_SIZE</span> <span class="o">=</span> <span class="mi">256</span><span class="p">,</span> <span class="p">};</span> <span class="k">enum</span> <span class="n">clap_log_severity</span> @@ -1259,10 +1101,9 @@ plugin's parameters and restore them.</p> # define CLAP_ATTR_CATEGORIES &quot;clap/categories&quot; # define CLAP_ATTR_TYPE &quot;clap/type&quot; # define CLAP_ATTR_CHUNK_SIZE &quot;clap/chunk_size&quot; -# define CLAP_ATTR_LATENCY &quot;clap/latency&quot; </span><span class="c1">// Should be &quot;1&quot; if the plugin supports tunning. </span><span class="cp"># define CLAP_ATTR_SUPPORTS_TUNING &quot;clap/supports_tuning&quot; -</span><span class="c1">// Shoudl be &quot;1&quot; if the plugin is doing remote processing. +</span><span class="c1">// Should be &quot;1&quot; if the plugin is doing remote processing. // This is a hint for the host to optimize task scheduling. </span><span class="cp"># define CLAP_ATTR_IS_REMOTE_PROCESSING &quot;clap/is_remote_processing&quot; </span><span class="c1">// Should be &quot;1&quot; if the plugin supports in place processing. @@ -1285,108 +1126,103 @@ plugin's parameters and restore them.</p> </span> <span class="k">enum</span> <span class="n">clap_event_type</span> <span class="p">{</span> - <span class="n">CLAP_EVENT_NOTE_ON</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="c1">// note attribute -</span> <span class="n">CLAP_EVENT_NOTE_OFF</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="c1">// note attribute -</span> - <span class="n">CLAP_EVENT_PARAM_SET</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span> <span class="c1">// param attribute -</span> <span class="n">CLAP_EVENT_PARAM_RAMP</span> <span class="o">=</span> <span class="mi">3</span><span class="p">,</span> <span class="c1">// param attribute -</span> <span class="n">CLAP_EVENT_PRESET_SET</span> <span class="o">=</span> <span class="mi">4</span><span class="p">,</span> <span class="c1">// preset attribute -</span> - <span class="n">CLAP_EVENT_MIDI</span> <span class="o">=</span> <span class="mi">5</span><span class="p">,</span> <span class="c1">// midi attribute -</span> <span class="n">CLAP_EVENT_CONTROL</span> <span class="o">=</span> <span class="mi">6</span><span class="p">,</span> <span class="c1">// control attribute + <span class="n">CLAP_EVENT_NOTE_ON</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="c1">// note attribute +</span> <span class="n">CLAP_EVENT_NOTE_OFF</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="c1">// note attribute +</span> <span class="n">CLAP_EVENT_NOTE_CHOKE</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span> <span class="c1">// note attribute </span> - <span class="n">CLAP_EVENT_GUI_OPENED</span> <span class="o">=</span> <span class="mi">7</span><span class="p">,</span> <span class="c1">// plugin to host, no attribute -</span> <span class="n">CLAP_EVENT_GUI_CLOSED</span> <span class="o">=</span> <span class="mi">8</span><span class="p">,</span> <span class="c1">// plugin to host, no attribute + <span class="n">CLAP_EVENT_PARAM_SET</span> <span class="o">=</span> <span class="mi">3</span><span class="p">,</span> <span class="c1">// param attribute +</span> <span class="n">CLAP_EVENT_PARAM_RAMP</span> <span class="o">=</span> <span class="mi">4</span><span class="p">,</span> <span class="c1">// param attribute </span> - <span class="n">CLAP_EVENT_NEW_PRESETS</span> <span class="o">=</span> <span class="mi">9</span><span class="p">,</span> <span class="c1">// plugin to host, no attribute -</span> <span class="n">CLAP_EVENT_NEW_PORTS_CONFIGS</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span> <span class="c1">// plugin to host, no attribute -</span> - <span class="n">CLAP_EVENT_LATENCY_CHANGED</span> <span class="o">=</span> <span class="mi">11</span><span class="p">,</span> <span class="c1">// plugin to host, latency attribute + <span class="n">CLAP_EVENT_CONTROL</span> <span class="o">=</span> <span class="mi">5</span><span class="p">,</span> <span class="c1">// control attribute +</span> <span class="n">CLAP_EVENT_MIDI</span> <span class="o">=</span> <span class="mi">6</span><span class="p">,</span> <span class="c1">// midi attribute </span> <span class="n">CLAP_EVENT_PLAY</span> <span class="o">=</span> <span class="mi">12</span><span class="p">,</span> <span class="c1">// no attribute </span> <span class="n">CLAP_EVENT_PAUSE</span> <span class="o">=</span> <span class="mi">13</span><span class="p">,</span> <span class="c1">// no attribute </span> <span class="n">CLAP_EVENT_STOP</span> <span class="o">=</span> <span class="mi">14</span><span class="p">,</span> <span class="c1">// no attribute +</span> <span class="n">CLAP_EVENT_JUMP</span> <span class="o">=</span> <span class="mi">15</span><span class="p">,</span> <span class="c1">// attribute jump </span> - <span class="n">CLAP_EVENT_JUMP</span> <span class="o">=</span> <span class="mi">15</span><span class="p">,</span> <span class="c1">// attribute jump -</span><span class="p">};</span> - -<span class="k">struct</span> <span class="n">clap_event_note</span> -<span class="p">{</span> - <span class="kt">uint8_t</span> <span class="n">key</span><span class="p">;</span> - <span class="kt">float</span> <span class="n">pitch</span><span class="p">;</span> - <span class="kt">float</span> <span class="n">velocity</span><span class="p">;</span> <span class="c1">// 0..1 + <span class="n">CLAP_EVENT_PROGRAM</span> <span class="o">=</span> <span class="mi">16</span><span class="p">,</span> <span class="c1">// program attribute </span><span class="p">};</span> <span class="k">struct</span> <span class="n">clap_event_param</span> <span class="p">{</span> - <span class="cm">/* key/voice index */</span> - <span class="kt">bool</span> <span class="n">is_global</span><span class="p">;</span> <span class="c1">// is this event global? -</span> <span class="kt">uint8_t</span> <span class="n">key</span><span class="p">;</span> <span class="c1">// if !is_global, target key + <span class="cm">/* key/channel index */</span> + <span class="kt">int8_t</span> <span class="n">key</span><span class="p">;</span> <span class="c1">// 0..127 +</span> <span class="kt">int8_t</span> <span class="n">channel</span><span class="p">;</span> <span class="c1">// 0..16 </span> <span class="cm">/* parameter */</span> - <span class="kt">uint32_t</span> <span class="n">index</span><span class="p">;</span> <span class="c1">// parameter index + <span class="kt">int32_t</span> <span class="n">index</span><span class="p">;</span> <span class="c1">// parameter index </span> <span class="k">union</span> <span class="n">clap_param_value</span> <span class="n">value</span><span class="p">;</span> - <span class="kt">float</span> <span class="n">increment</span><span class="p">;</span> <span class="c1">// for param ramp -</span> <span class="kt">char</span> <span class="n">display_text</span><span class="p">[</span><span class="n">CLAP_DISPLAY_SIZE</span><span class="p">];</span> <span class="c1">// use this for display. -</span> <span class="kt">bool</span> <span class="n">is_recordable</span><span class="p">;</span> <span class="c1">// used to tell the host if this event -</span> <span class="c1">// can be recorded -</span> <span class="kt">bool</span> <span class="n">is_used</span><span class="p">;</span> <span class="c1">// is the parameter used in the patch? + <span class="kt">float</span> <span class="n">increment</span><span class="p">;</span> <span class="c1">// for param ramp </span><span class="p">};</span> -<span class="k">struct</span> <span class="n">clap_event_control</span> +<span class="cm">/** Note On/Off event. */</span> +<span class="k">struct</span> <span class="n">clap_event_note</span> <span class="p">{</span> - <span class="cm">/* voice/key index */</span> - <span class="kt">bool</span> <span class="n">is_global</span><span class="p">;</span> <span class="c1">// is this event global? -</span> <span class="kt">uint8_t</span> <span class="n">key</span><span class="p">;</span> <span class="c1">// if !is_global, target key -</span> - <span class="cm">/* control */</span> - <span class="kt">uint32_t</span> <span class="n">index</span><span class="p">;</span> - <span class="kt">float</span> <span class="n">value</span><span class="p">;</span> <span class="c1">// 0 .. 1.0f + <span class="kt">int8_t</span> <span class="n">key</span><span class="p">;</span> <span class="c1">// 0..127 +</span> <span class="kt">int8_t</span> <span class="n">channel</span><span class="p">;</span> <span class="c1">// 0..15 +</span> <span class="kt">float</span> <span class="n">pitch</span><span class="p">;</span> <span class="c1">// hertz +</span> <span class="kt">float</span> <span class="n">velocity</span><span class="p">;</span> <span class="c1">// 0..1 </span><span class="p">};</span> -<span class="k">struct</span> <span class="n">clap_event_preset</span> +<span class="k">struct</span> <span class="n">clap_event_control</span> <span class="p">{</span> - <span class="kt">char</span> <span class="n">url</span><span class="p">[</span><span class="n">CLAP_URL_SIZE</span><span class="p">];</span> <span class="c1">// the url to the preset + <span class="kt">int8_t</span> <span class="n">key</span><span class="p">;</span> <span class="c1">// 0..127 +</span> <span class="kt">int8_t</span> <span class="n">channel</span><span class="p">;</span> <span class="c1">// 0..15 +</span> <span class="kt">int8_t</span> <span class="n">control</span><span class="p">;</span> <span class="c1">// 0..127 +</span> <span class="kt">float</span> <span class="n">value</span><span class="p">;</span> <span class="c1">// 0..1 </span><span class="p">};</span> <span class="k">struct</span> <span class="n">clap_event_midi</span> <span class="p">{</span> - <span class="cm">/* voice/key index */</span> - <span class="kt">bool</span> <span class="n">is_global</span><span class="p">;</span> <span class="c1">// is this event global? -</span> <span class="kt">uint8_t</span> <span class="n">key</span><span class="p">;</span> <span class="c1">// if !is_global, target key -</span> <span class="cm">/* midi event */</span> <span class="k">const</span> <span class="kt">uint8_t</span> <span class="o">*</span><span class="n">buffer</span><span class="p">;</span> - <span class="kt">uint32_t</span> <span class="n">size</span><span class="p">;</span> + <span class="kt">int32_t</span> <span class="n">size</span><span class="p">;</span> <span class="p">};</span> -<span class="k">struct</span> <span class="n">clap_event_latency</span> +<span class="k">struct</span> <span class="n">clap_event_jump</span> <span class="p">{</span> - <span class="kt">uint32_t</span> <span class="n">latency</span><span class="p">;</span> -<span class="p">};</span> + <span class="kt">int32_t</span> <span class="n">tempo</span><span class="p">;</span> <span class="c1">// tempo in samples +</span> <span class="kt">int32_t</span> <span class="n">bar</span><span class="p">;</span> <span class="c1">// the bar number +</span> <span class="kt">int32_t</span> <span class="n">bar_offset</span><span class="p">;</span> <span class="c1">// 0 &lt;= bar_offset &lt; tsig_denom * tempo +</span> <span class="kt">int64_t</span> <span class="n">song_time</span><span class="p">;</span> <span class="c1">// song time in micro seconds +</span> <span class="kt">int32_t</span> <span class="n">tsig_num</span><span class="p">;</span> <span class="c1">// time signature numerator +</span> <span class="kt">int32_t</span> <span class="n">tsig_denom</span><span class="p">;</span> <span class="c1">// time signature denominator +</span><span class="p">};</span> -<span class="k">struct</span> <span class="n">clap_event_jump</span> +<span class="cm">/** + * Asks the plugin to load a program. + * This is analogue to the midi program set: + * bank msb goes into bank0 + * bank lsb goes into bank1 + * program goes into program + * + * Clap is not limited to 127. + * + * The main advantage of setting a program instead of loading + * a preset, is that the program should already be in the plugin's + * memory, and can be set instantly. If the plugin has to load + * a preset from the filesystem, then parse it, do memory allocation, + * there is no guarentee that the preset will be loaded in time. + */</span> +<span class="k">struct</span> <span class="n">clap_event_program</span> <span class="p">{</span> - <span class="kt">uint32_t</span> <span class="n">tempo</span><span class="p">;</span> <span class="c1">// tempo in samples -</span> <span class="kt">uint32_t</span> <span class="n">bar</span><span class="p">;</span> <span class="c1">// the bar number -</span> <span class="kt">uint32_t</span> <span class="n">bar_offset</span><span class="p">;</span> <span class="c1">// 0 &lt;= cycle_offset &lt; tsig_denom * tempo -</span> <span class="kt">uint32_t</span> <span class="n">tsig_num</span><span class="p">;</span> <span class="c1">// time signature numerator -</span> <span class="kt">uint32_t</span> <span class="n">tsig_denom</span><span class="p">;</span> <span class="c1">// time signature denominator + <span class="kt">int32_t</span> <span class="n">bank0</span><span class="p">;</span> <span class="c1">// 0..0x7FFFFFFF +</span> <span class="kt">int32_t</span> <span class="n">bank1</span><span class="p">;</span> <span class="c1">// 0..0x7FFFFFFF +</span> <span class="kt">int32_t</span> <span class="n">program</span><span class="p">;</span> <span class="c1">// 0..0x7FFFFFFF </span><span class="p">};</span> <span class="k">struct</span> <span class="n">clap_event</span> <span class="p">{</span> <span class="k">struct</span> <span class="n">clap_event</span> <span class="o">*</span><span class="n">next</span><span class="p">;</span> <span class="c1">// linked list, NULL on end </span> <span class="k">enum</span> <span class="n">clap_event_type</span> <span class="n">type</span><span class="p">;</span> - <span class="kt">uint64_t</span> <span class="n">steady_time</span><span class="p">;</span> <span class="c1">// steady_time of the event, see host-&gt;steady_time(host) + <span class="kt">int64_t</span> <span class="n">time</span><span class="p">;</span> <span class="c1">// offset from the first sample in the process block </span> <span class="k">union</span> <span class="p">{</span> <span class="k">struct</span> <span class="n">clap_event_note</span> <span class="n">note</span><span class="p">;</span> + <span class="k">struct</span> <span class="n">clap_event_control</span> <span class="n">control</span><span class="p">;</span> <span class="k">struct</span> <span class="n">clap_event_param</span> <span class="n">param</span><span class="p">;</span> - <span class="k">struct</span> <span class="n">clap_event_preset</span> <span class="n">preset</span><span class="p">;</span> <span class="k">struct</span> <span class="n">clap_event_midi</span> <span class="n">midi</span><span class="p">;</span> - <span class="k">struct</span> <span class="n">clap_event_control</span> <span class="n">control</span><span class="p">;</span> - <span class="k">struct</span> <span class="n">clap_event_latency</span> <span class="n">latency</span><span class="p">;</span> <span class="k">struct</span> <span class="n">clap_event_jump</span> <span class="n">jump</span><span class="p">;</span> <span class="p">};</span> <span class="p">};</span> @@ -1404,20 +1240,19 @@ plugin's parameters and restore them.</p> <span class="n">CLAP_PROCESS_CONTINUE</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="cm">/* Processing succeed, but no more processing is required, until next event. */</span> - <span class="n">CLAP_PROCESS_STOP</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span> + <span class="n">CLAP_PROCESS_SLEEP</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span> <span class="p">};</span> <span class="k">struct</span> <span class="n">clap_process</span> <span class="p">{</span> - <span class="cm">/* audio buffers */</span> - <span class="kt">float</span> <span class="o">**</span><span class="n">inputs</span><span class="p">;</span> - <span class="kt">float</span> <span class="o">**</span><span class="n">outputs</span><span class="p">;</span> - <span class="kt">uint32_t</span> <span class="n">samples_count</span><span class="p">;</span> + <span class="cm">/* number of frame to process */</span> + <span class="kt">int32_t</span> <span class="n">frames_count</span><span class="p">;</span> <span class="cm">/* process info */</span> - <span class="kt">uint64_t</span> <span class="n">steady_time</span><span class="p">;</span> <span class="c1">// the steady time in samples + <span class="kt">int64_t</span> <span class="n">steady_time</span><span class="p">;</span> <span class="c1">// the steady time in samples </span> - <span class="cm">/* events */</span> + <span class="cm">/* Linked list of events + * The plugin must not modify those events. */</span> <span class="k">struct</span> <span class="n">clap_event</span> <span class="o">*</span><span class="n">events</span><span class="p">;</span> <span class="p">};</span> @@ -1427,23 +1262,15 @@ plugin's parameters and restore them.</p> </span> <span class="k">struct</span> <span class="n">clap_host</span> <span class="p">{</span> - <span class="kt">uint32_t</span> <span class="n">clap_version</span><span class="p">;</span> <span class="c1">// initialized to CLAP_VERSION + <span class="kt">int32_t</span> <span class="n">clap_version</span><span class="p">;</span> <span class="c1">// initialized to CLAP_VERSION +</span> + <span class="kt">void</span> <span class="o">*</span><span class="n">host_data</span><span class="p">;</span> <span class="c1">// reserved pointer for the host </span> <span class="cm">/* returns the size of the original string, 0 if not string */</span> - <span class="kt">uint32_t</span> <span class="p">(</span><span class="o">*</span><span class="n">get_attribute</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_host</span> <span class="o">*</span><span class="n">host</span><span class="p">,</span> - <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">attr</span><span class="p">,</span> - <span class="kt">char</span> <span class="o">*</span><span class="n">buffer</span><span class="p">,</span> - <span class="kt">uint32_t</span> <span class="n">size</span><span class="p">);</span> - - <span class="cm">/* for events generated by the plugin. */</span> - <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">events</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_host</span> <span class="o">*</span><span class="n">host</span><span class="p">,</span> - <span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> - <span class="k">struct</span> <span class="n">clap_event</span> <span class="o">*</span><span class="n">events</span><span class="p">);</span> - - <span class="cm">/* The time in samples, this clock is monotonicaly increasing, - * it means that each time you read the value, it must be greater - * or equal to the previous one. */</span> - <span class="k">const</span> <span class="kt">uint64_t</span> <span class="o">*</span><span class="n">steady_time</span><span class="p">;</span> + <span class="kt">int32_t</span> <span class="p">(</span><span class="o">*</span><span class="n">get_attribute</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_host</span> <span class="o">*</span><span class="n">host</span><span class="p">,</span> + <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">attr</span><span class="p">,</span> + <span class="kt">char</span> <span class="o">*</span><span class="n">buffer</span><span class="p">,</span> + <span class="kt">int32_t</span> <span class="n">size</span><span class="p">);</span> <span class="cm">/* Log a message through the host. */</span> <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">log</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_host</span> <span class="o">*</span><span class="n">host</span><span class="p">,</span> @@ -1451,7 +1278,7 @@ plugin's parameters and restore them.</p> <span class="k">enum</span> <span class="n">clap_log_severity</span> <span class="n">severity</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">msg</span><span class="p">);</span> - <span class="cm">/* feature extensions */</span> + <span class="cm">/* query an extension */</span> <span class="kt">void</span> <span class="o">*</span><span class="p">(</span><span class="o">*</span><span class="n">extension</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_host</span> <span class="o">*</span><span class="n">host</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">extention_id</span><span class="p">);</span> <span class="p">};</span> @@ -1463,14 +1290,16 @@ plugin's parameters and restore them.</p> </span><span class="k">enum</span> <span class="n">clap_plugin_type</span> <span class="p">{</span> <span class="n">CLAP_PLUGIN_INSTRUMENT</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="mi">0</span><span class="p">),</span> - <span class="n">CLAP_PLUGIN_EFFECT</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="mi">1</span><span class="p">),</span> + <span class="n">CLAP_PLUGIN_AUDIO_EFFECT</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="mi">1</span><span class="p">),</span> <span class="n">CLAP_PLUGIN_EVENT_EFFECT</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="mi">2</span><span class="p">),</span> <span class="c1">// can be seen as midi effect </span> <span class="n">CLAP_PLUGIN_ANALYZER</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="mi">3</span><span class="p">),</span> + <span class="n">CLAP_PLUGIN_PATCHER</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="mi">4</span><span class="p">),</span> + <span class="n">CLAP_PLUGIN_STREAMER</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="mi">5</span><span class="p">),</span> <span class="p">};</span> <span class="k">struct</span> <span class="n">clap_plugin</span> <span class="p">{</span> - <span class="kt">uint32_t</span> <span class="n">clap_version</span><span class="p">;</span> <span class="c1">// initialized to CALP_VERSION + <span class="kt">int32_t</span> <span class="n">clap_version</span><span class="p">;</span> <span class="c1">// initialized to CLAP_VERSION </span> <span class="kt">void</span> <span class="o">*</span><span class="n">host_data</span><span class="p">;</span> <span class="c1">// reserved pointer for the host </span> <span class="kt">void</span> <span class="o">*</span><span class="n">plugin_data</span><span class="p">;</span> <span class="c1">// reserved pointer for the plugin @@ -1483,40 +1312,43 @@ plugin's parameters and restore them.</p> * This function must place a '\0' byte at the end of the string. * Returns the size of the original string or 0 if there is no * value for this attributes. */</span> - <span class="kt">uint32_t</span> <span class="p">(</span><span class="o">*</span><span class="n">get_attribute</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> - <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">attr</span><span class="p">,</span> - <span class="kt">char</span> <span class="o">*</span><span class="n">buffer</span><span class="p">,</span> - <span class="kt">uint32_t</span> <span class="n">size</span><span class="p">);</span> + <span class="kt">int32_t</span> <span class="p">(</span><span class="o">*</span><span class="n">get_attribute</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> + <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">attr</span><span class="p">,</span> + <span class="kt">char</span> <span class="o">*</span><span class="n">buffer</span><span class="p">,</span> + <span class="kt">int32_t</span> <span class="n">size</span><span class="p">);</span> <span class="cm">/* activation */</span> <span class="kt">bool</span> <span class="p">(</span><span class="o">*</span><span class="n">activate</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">);</span> <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">deactivate</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">);</span> - <span class="cm">/* process */</span> + <span class="cm">/* process audio, events, ... */</span> <span class="k">enum</span> <span class="nf">clap_process_status</span> <span class="p">(</span><span class="o">*</span><span class="n">process</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> <span class="k">struct</span> <span class="n">clap_process</span> <span class="o">*</span><span class="n">process</span><span class="p">);</span> - <span class="cm">/* features extensions */</span> + <span class="cm">/* query an extension */</span> <span class="kt">void</span> <span class="o">*</span><span class="p">(</span><span class="o">*</span><span class="n">extension</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">id</span><span class="p">);</span> <span class="p">};</span> <span class="cm">/* typedef for dlsym() cast */</span> -<span class="k">typedef</span> <span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="p">(</span><span class="o">*</span><span class="n">clap_create_f</span><span class="p">)(</span><span class="kt">uint32_t</span> <span class="n">plugin_index</span><span class="p">,</span> +<span class="k">typedef</span> <span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="p">(</span><span class="o">*</span><span class="n">clap_create_f</span><span class="p">)(</span><span class="kt">int32_t</span> <span class="n">plugin_index</span><span class="p">,</span> <span class="k">struct</span> <span class="n">clap_host</span> <span class="o">*</span><span class="n">host</span><span class="p">,</span> - <span class="kt">uint32_t</span> <span class="n">sample_rate</span><span class="p">,</span> - <span class="kt">uint32_t</span> <span class="o">*</span><span class="n">plugins_count</span><span class="p">);</span> + <span class="kt">int32_t</span> <span class="n">sample_rate</span><span class="p">,</span> + <span class="kt">int32_t</span> <span class="o">*</span><span class="n">plugins_count</span><span class="p">);</span> <span class="cm">/* Plugin entry point. If plugins_count is not null, then clap_create has * to store the number of plugins available in *plugins_count. * If clap_create failed to create a plugin, it returns NULL. * The return value has to be freed by calling plugin-&gt;destroy(plugin). * + * Common sample rate values are: 44100, 48000, 88200, 96000, + * 176400, 192000. + * * This function must be thread-safe. */</span> -<span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span> -<span class="nf">clap_create</span><span class="p">(</span><span class="kt">uint32_t</span> <span class="n">plugin_index</span><span class="p">,</span> +<span class="n">CLAP_EXPORT</span> <span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span> +<span class="nf">clap_create</span><span class="p">(</span><span class="kt">int32_t</span> <span class="n">plugin_index</span><span class="p">,</span> <span class="k">struct</span> <span class="n">clap_host</span> <span class="o">*</span><span class="n">host</span><span class="p">,</span> - <span class="kt">uint32_t</span> <span class="n">sample_rate</span><span class="p">,</span> - <span class="kt">uint32_t</span> <span class="o">*</span><span class="n">plugins_count</span><span class="p">);</span> + <span class="kt">int32_t</span> <span class="n">sample_rate</span><span class="p">,</span> + <span class="kt">int32_t</span> <span class="o">*</span><span class="n">plugins_count</span><span class="p">);</span> <span class="cp"># ifdef __cplusplus </span><span class="p">}</span> @@ -1525,117 +1357,134 @@ plugin's parameters and restore them.</p> <span class="cp">#endif </span><span class="cm">/* !CLAP_H */</span> </pre> </div> -<div class="section" id="clap-ext-ports-h"> -<h2><a class="toc-backref" href="#id51">clap/ext/ports.h</a></h2> +<div class="section" id="clap-ext-state-h"> +<h2><a class="toc-backref" href="#id48">clap/ext/state.h</a></h2> <pre class="code c literal-block"> -<span class="cp">#ifndef CLAP_EXT_PORTS_H -# define CLAP_EXT_PORTS_H +<span class="cp">#ifndef CLAP_EXT_STATE_H +# define CLAP_EXT_STATE_H </span> <span class="cp"># include &quot;../clap.h&quot; </span> -<span class="cp"># define CLAP_EXT_PORTS &quot;clap/ports&quot; +<span class="cp"># define CLAP_EXT_STATE &quot;clap/state&quot; </span> -<span class="k">enum</span> <span class="n">clap_port_type</span> +<span class="k">struct</span> <span class="n">clap_plugin_state</span> <span class="p">{</span> - <span class="n">CLAP_PORT_MONO</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> - <span class="n">CLAP_PORT_STEREO</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> - <span class="n">CLAP_PORT_SURROUND</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span> + <span class="cm">/* The plugin has to allocate and save its state into *buffer. + * The plugin is also responsible to free the buffer on the + * next call to save() or when the plugin is destroyed. */</span> + <span class="kt">bool</span> <span class="p">(</span><span class="o">*</span><span class="n">save</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> <span class="kt">void</span> <span class="o">**</span><span class="n">buffer</span><span class="p">,</span> <span class="kt">int32_t</span> <span class="o">*</span><span class="n">size</span><span class="p">);</span> + <span class="kt">bool</span> <span class="p">(</span><span class="o">*</span><span class="n">restore</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> <span class="k">const</span> <span class="kt">void</span> <span class="o">*</span><span class="n">buffer</span><span class="p">,</span> <span class="kt">int32_t</span> <span class="n">size</span><span class="p">);</span> <span class="p">};</span> -<span class="k">enum</span> <span class="n">clap_port_role</span> +<span class="cp">#endif </span><span class="cm">/* !CLAP_EXT_STATE_H */</span> +</pre> +</div> +<div class="section" id="clap-ext-ports-h"> +<h2><a class="toc-backref" href="#id49">clap/ext/ports.h</a></h2> +<pre class="code c literal-block"> +<span class="cp">#ifndef CLAP_EXT_AUDIO_PORTS_H +# define CLAP_EXT_AUDIO_PORTS_H +</span> +<span class="cp"># include &quot;../clap.h&quot; +</span> +<span class="cp"># define CLAP_EXT_AUDIO_PORTS &quot;clap/audio-ports&quot; +</span> +<span class="k">enum</span> <span class="n">clap_audio_port_channel_mapping</span> <span class="p">{</span> - <span class="n">CLAP_PORT_INOUT</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> - <span class="n">CLAP_PORT_SIDECHAIN</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> + <span class="n">CLAP_AUDIO_PORT_UNSPECIFIED</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> + <span class="n">CLAP_AUDIO_PORT_MONO</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> + + <span class="c1">// left, right +</span> <span class="n">CLAP_AUDIO_PORT_STEREO</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span> + + <span class="c1">// front left, front right, center, low, surround left, surround right +</span> <span class="c1">// surround back left, surround back right +</span> <span class="n">CLAP_AUDIO_PORT_SURROUND</span> <span class="o">=</span> <span class="mi">3</span><span class="p">,</span> <span class="p">};</span> -<span class="k">struct</span> <span class="n">clap_port_info</span> +<span class="k">enum</span> <span class="n">clap_audio_port_role</span> <span class="p">{</span> - <span class="k">enum</span> <span class="n">clap_port_type</span> <span class="n">type</span><span class="p">;</span> - <span class="k">enum</span> <span class="n">clap_port_role</span> <span class="n">role</span><span class="p">;</span> - <span class="kt">char</span> <span class="n">name</span><span class="p">[</span><span class="n">CLAP_NAME_SIZE</span><span class="p">];</span> - <span class="kt">bool</span> <span class="n">is_repeatable</span><span class="p">;</span> + <span class="n">CLAP_AUDIO_PORT_INOUT</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> + <span class="n">CLAP_AUDIO_PORT_SIDECHAIN</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> + <span class="n">CLAP_AUDIO_PORT_MODULATION</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span> <span class="p">};</span> -<span class="k">struct</span> <span class="n">clap_ports_config</span> +<span class="k">struct</span> <span class="n">clap_audio_port_info</span> <span class="p">{</span> - <span class="kt">char</span> <span class="n">name</span><span class="p">[</span><span class="n">CLAP_NAME_SIZE</span><span class="p">];</span> - <span class="kt">uint32_t</span> <span class="n">inputs_count</span><span class="p">;</span> - <span class="kt">uint32_t</span> <span class="n">outputs_count</span><span class="p">;</span> + <span class="kt">int32_t</span> <span class="n">id</span><span class="p">;</span> + <span class="kt">bool</span> <span class="n">is_input</span><span class="p">;</span> + <span class="kt">int32_t</span> <span class="n">channel_count</span><span class="p">;</span> + <span class="k">enum</span> <span class="n">clap_audio_port_channel_mapping</span> <span class="n">channel_mapping</span><span class="p">;</span> + <span class="k">enum</span> <span class="n">clap_audio_port_role</span> <span class="n">role</span><span class="p">;</span> + <span class="kt">char</span> <span class="n">name</span><span class="p">[</span><span class="n">CLAP_NAME_SIZE</span><span class="p">];</span> + + <span class="cm">/* If false, then the port can be connected only once. + * If true, then this is a virtual port which can be cloned + * and connected multiple times. */</span> + <span class="kt">bool</span> <span class="n">is_repeatable</span><span class="p">;</span> <span class="p">};</span> -<span class="cm">/* The audio ports configuration has to be done while the plugin is - * deactivated. */</span> -<span class="k">struct</span> <span class="n">clap_plugin_ports</span> +<span class="k">struct</span> <span class="n">clap_audio_port</span> <span class="p">{</span> - <span class="cm">/* Returns the number of available configurations */</span> - <span class="kt">uint32_t</span> <span class="p">(</span><span class="o">*</span><span class="n">get_configs_count</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">);</span> - <span class="kt">bool</span> <span class="p">(</span><span class="o">*</span><span class="n">get_config</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> - <span class="kt">uint32_t</span> <span class="n">config_index</span><span class="p">,</span> - <span class="k">struct</span> <span class="n">clap_ports_config</span> <span class="o">*</span><span class="n">config</span><span class="p">);</span> - <span class="kt">bool</span> <span class="p">(</span><span class="o">*</span><span class="n">get_info</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> - <span class="kt">uint32_t</span> <span class="n">config_index</span><span class="p">,</span> - <span class="kt">uint32_t</span> <span class="n">port_index</span><span class="p">,</span> - <span class="k">struct</span> <span class="n">clap_port_info</span> <span class="o">*</span><span class="n">port</span><span class="p">);</span> - <span class="kt">bool</span> <span class="p">(</span><span class="o">*</span><span class="n">set_config</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> - <span class="kt">uint32_t</span> <span class="n">config_index</span><span class="p">);</span> - <span class="kt">bool</span> <span class="p">(</span><span class="o">*</span><span class="n">set_repeat</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> - <span class="kt">uint32_t</span> <span class="n">port_index</span><span class="p">,</span> - <span class="kt">uint32_t</span> <span class="n">count</span><span class="p">);</span> + <span class="kt">int32_t</span> <span class="n">channel_count</span><span class="p">;</span> + <span class="k">enum</span> <span class="n">clap_audio_port_channel_mapping</span> <span class="n">channel_mapping</span><span class="p">;</span> + <span class="kt">float</span> <span class="o">**</span><span class="n">data</span><span class="p">;</span> <span class="p">};</span> -<span class="cp">#endif </span><span class="cm">/* !CLAP_EXT_PORT_H */</span> -</pre> -</div> -<div class="section" id="clap-ext-gui-h"> -<h2><a class="toc-backref" href="#id52">clap/ext/gui.h</a></h2> -<pre class="code c literal-block"> -<span class="cp">#ifndef CLAP_EXT_GUI_H -# define CLAP_EXT_GUI_H -</span> -<span class="cp"># include &quot;../clap.h&quot; -</span> -<span class="cp"># define CLAP_EXT_GUI &quot;clap/gui&quot; -</span> -<span class="k">struct</span> <span class="n">clap_plugin_gui</span> +<span class="cm">/* The audio ports configuration has to be done while the plugin is + * deactivated. */</span> +<span class="k">struct</span> <span class="n">clap_plugin_audio_ports</span> <span class="p">{</span> - <span class="cm">/* gui */</span> - <span class="kt">bool</span> <span class="p">(</span><span class="o">*</span><span class="n">open</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">);</span> - <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">close</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">);</span> + <span class="cm">/* number of ports, including inputs and outputs */</span> + <span class="kt">int32_t</span> <span class="p">(</span><span class="o">*</span><span class="n">get_count</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">);</span> + + <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">get_info</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> + <span class="kt">int32_t</span> <span class="n">index</span><span class="p">,</span> + <span class="k">struct</span> <span class="n">clap_audio_port_info</span> <span class="o">*</span><span class="n">info</span><span class="p">);</span> + + <span class="cm">/* Connect the given port to the plugin's port at index. + * user_name is the name of the peer port given by the host/user. + * It can be useful especialy for repeatable ports. + * Returns the id of the port. In case of repeatable port, + * make sure that each connected port has a different id. + * Returns -1 if the connection failed. */</span> + <span class="kt">int32_t</span> <span class="p">(</span><span class="o">*</span><span class="n">connect</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> + <span class="kt">int32_t</span> <span class="n">port_id</span><span class="p">,</span> + <span class="k">const</span> <span class="k">struct</span> <span class="n">clap_audio_port</span> <span class="o">*</span><span class="n">port</span><span class="p">,</span> + <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">user_name</span><span class="p">);</span> + + <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">disconnect</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> + <span class="kt">int32_t</span> <span class="n">port_id</span><span class="p">);</span> + + <span class="cm">/* Returns the absolute port latency in samples. */</span> + <span class="kt">int32_t</span> <span class="p">(</span><span class="o">*</span><span class="n">get_latency</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> + <span class="kt">int32_t</span> <span class="n">port_id</span><span class="p">);</span> <span class="p">};</span> -<span class="cp">#endif </span><span class="cm">/* !CLAP_EXT_GUI_H */</span> -</pre> -</div> -<div class="section" id="clap-ext-state-h"> -<h2><a class="toc-backref" href="#id53">clap/ext/state.h</a></h2> -<pre class="code c literal-block"> -<span class="cp">#ifndef CLAP_EXT_STATE_H -# define CLAP_EXT_STATE_H -</span> -<span class="cp"># include &quot;../clap.h&quot; -</span> -<span class="cp"># define CLAP_EXT_STATE &quot;clap/state&quot; -</span> -<span class="k">struct</span> <span class="n">clap_plugin_state</span> +<span class="k">struct</span> <span class="n">clap_host_audio_ports</span> <span class="p">{</span> - <span class="cm">/* The plugin has to allocate and save its state into *buffer. - * The plugin is also responsible to free the buffer on the - * next call to save() or when the plugin is destroyed. */</span> - <span class="kt">bool</span> <span class="p">(</span><span class="o">*</span><span class="n">save</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> <span class="kt">void</span> <span class="o">**</span><span class="n">buffer</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="o">*</span><span class="n">size</span><span class="p">);</span> - <span class="kt">bool</span> <span class="p">(</span><span class="o">*</span><span class="n">restore</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> <span class="k">const</span> <span class="kt">void</span> <span class="o">*</span><span class="n">buffer</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">size</span><span class="p">);</span> + <span class="cm">/* Tell the host that the plugin ports has changed. + * The host shall scan the ports again. */</span> + <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">changed</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_host</span> <span class="o">*</span><span class="n">host</span><span class="p">,</span> + <span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">);</span> + + <span class="cm">/* Tell the host that the latency changed. The host should + * call get_port_latency on each ports. */</span> + <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">latency_changed</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_host</span> <span class="o">*</span><span class="n">host</span><span class="p">,</span> + <span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">);</span> <span class="p">};</span> -<span class="cp">#endif </span><span class="cm">/* !CLAP_EXT_STATE_H */</span> +<span class="cp">#endif </span><span class="cm">/* !CLAP_EXT_PORT_H */</span> </pre> </div> <div class="section" id="clap-ext-params-h"> -<h2><a class="toc-backref" href="#id54">clap/ext/params.h</a></h2> +<h2><a class="toc-backref" href="#id50">clap/ext/params.h</a></h2> <pre class="code c literal-block"> <span class="cp">#ifndef CLAP_EXT_PARAMS_H # define CLAP_EXT_PARAMS_H </span> <span class="cp"># include &quot;../clap.h&quot; -# include &quot;../serialize/serialize.h&quot; +# include &quot;ports.h&quot; </span> <span class="cp">#ifdef __cplusplus </span><span class="k">extern</span> <span class="s">&quot;C&quot;</span> <span class="p">{</span> @@ -1645,78 +1494,111 @@ plugin's parameters and restore them.</p> </span> <span class="k">enum</span> <span class="n">clap_param_type</span> <span class="p">{</span> - <span class="n">CLAP_PARAM_GROUP</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="c1">// no value for this one + <span class="n">CLAP_PARAM_FLOAT</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="c1">// uses value.f </span> <span class="n">CLAP_PARAM_BOOL</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="c1">// uses value.b -</span> <span class="n">CLAP_PARAM_FLOAT</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span> <span class="c1">// uses value.f -</span> <span class="n">CLAP_PARAM_INT</span> <span class="o">=</span> <span class="mi">3</span><span class="p">,</span> <span class="c1">// uses value.i -</span> <span class="n">CLAP_PARAM_ENUM</span> <span class="o">=</span> <span class="mi">4</span><span class="p">,</span> <span class="c1">// uses value.i +</span> <span class="n">CLAP_PARAM_INT</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span> <span class="c1">// uses value.i +</span> <span class="n">CLAP_PARAM_ENUM</span> <span class="o">=</span> <span class="mi">3</span><span class="p">,</span> <span class="c1">// uses value.i </span><span class="p">};</span> <span class="k">enum</span> <span class="n">clap_param_scale</span> <span class="p">{</span> - <span class="n">CLAP_PARAM_LINEAR</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> - <span class="n">CLAP_PARAM_LOG</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> + <span class="n">CLAP_PARAM_SCALE_LINEAR</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> + <span class="n">CLAP_PARAM_SCALE_LOG</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> + <span class="n">CLAP_PARAM_SCALE_EXP</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span> <span class="p">};</span> +<span class="cm">/* This describes the parameter and provides the current value */</span> <span class="k">struct</span> <span class="n">clap_param</span> <span class="p">{</span> - <span class="cm">/* tree fields */</span> - <span class="kt">uint32_t</span> <span class="n">index</span><span class="p">;</span> <span class="c1">// parameter's index -</span> <span class="kt">uint32_t</span> <span class="n">parent</span><span class="p">;</span> <span class="c1">// parent's index, -1 for no parent + <span class="kt">int32_t</span> <span class="n">index</span><span class="p">;</span> <span class="c1">// parameter's index </span> <span class="cm">/* param info */</span> + <span class="kt">char</span> <span class="n">module_id</span><span class="p">[</span><span class="n">CLAP_ID_SIZE</span><span class="p">];</span> <span class="kt">char</span> <span class="n">id</span><span class="p">[</span><span class="n">CLAP_ID_SIZE</span><span class="p">];</span> <span class="c1">// a string which identify the param </span> <span class="kt">char</span> <span class="n">name</span><span class="p">[</span><span class="n">CLAP_NAME_SIZE</span><span class="p">];</span> <span class="c1">// the display name </span> <span class="kt">char</span> <span class="n">desc</span><span class="p">[</span><span class="n">CLAP_DESC_SIZE</span><span class="p">];</span> <span class="kt">char</span> <span class="n">display</span><span class="p">[</span><span class="n">CLAP_DISPLAY_SIZE</span><span class="p">];</span> <span class="c1">// the text used to display the value -</span> <span class="k">enum</span> <span class="n">clap_param_type</span> <span class="n">type</span><span class="p">;</span> - <span class="kt">bool</span> <span class="n">is_per_note</span><span class="p">;</span> - <span class="kt">bool</span> <span class="n">is_used</span><span class="p">;</span> <span class="c1">// is this parameter used by the patch? -</span> <span class="kt">bool</span> <span class="n">is_periodic</span><span class="p">;</span> - <span class="kt">bool</span> <span class="n">is_locked</span><span class="p">;</span> <span class="c1">// if true, the parameter can't be changed by +</span> <span class="kt">bool</span> <span class="n">is_per_note</span><span class="p">;</span> + <span class="kt">bool</span> <span class="n">is_per_channel</span><span class="p">;</span> + <span class="kt">bool</span> <span class="n">is_used</span><span class="p">;</span> <span class="c1">// is this parameter used by the patch? +</span> <span class="kt">bool</span> <span class="n">is_periodic</span><span class="p">;</span> <span class="c1">// after the last value, go back to the first one +</span> <span class="kt">bool</span> <span class="n">is_locked</span><span class="p">;</span> <span class="c1">// if true, the parameter can't be changed by </span> <span class="c1">// the host -</span> <span class="k">union</span> <span class="n">clap_param_value</span> <span class="n">value</span><span class="p">;</span> - <span class="k">union</span> <span class="n">clap_param_value</span> <span class="n">min</span><span class="p">;</span> - <span class="k">union</span> <span class="n">clap_param_value</span> <span class="n">max</span><span class="p">;</span> - <span class="k">union</span> <span class="n">clap_param_value</span> <span class="n">deflt</span><span class="p">;</span> <span class="c1">// default value -</span> <span class="k">enum</span> <span class="n">clap_param_scale</span> <span class="n">scale</span><span class="p">;</span> +</span> + <span class="cm">/* Can the parameter be automated at sample rate by an audio buffer? */</span> + <span class="kt">bool</span> <span class="n">supports_audio_automation</span><span class="p">;</span> + + <span class="cm">/* Can the parameter be automated by automation events? */</span> + <span class="kt">bool</span> <span class="n">supports_events_automation</span><span class="p">;</span> + <span class="kt">bool</span> <span class="n">supports_ramp_events</span><span class="p">;</span> + + <span class="cm">/* value */</span> + <span class="k">enum</span> <span class="n">clap_param_type</span> <span class="n">type</span><span class="p">;</span> + <span class="k">union</span> <span class="n">clap_param_value</span> <span class="n">value</span><span class="p">;</span> <span class="c1">// current value +</span> <span class="k">union</span> <span class="n">clap_param_value</span> <span class="n">min</span><span class="p">;</span> <span class="c1">// minimum value +</span> <span class="k">union</span> <span class="n">clap_param_value</span> <span class="n">max</span><span class="p">;</span> <span class="c1">// maximum value +</span> <span class="k">union</span> <span class="n">clap_param_value</span> <span class="n">deflt</span><span class="p">;</span> <span class="c1">// default value +</span> <span class="k">enum</span> <span class="n">clap_param_scale</span> <span class="n">scale</span><span class="p">;</span> <span class="c1">// scaling of the knob in the UI. +</span><span class="p">};</span> + +<span class="k">struct</span> <span class="n">clap_param_module</span> +<span class="p">{</span> + <span class="kt">char</span> <span class="n">id</span><span class="p">[</span><span class="n">CLAP_ID_SIZE</span><span class="p">];</span> + <span class="kt">char</span> <span class="n">parent_id</span><span class="p">[</span><span class="n">CLAP_ID_SIZE</span><span class="p">];</span> + <span class="kt">char</span> <span class="n">name</span><span class="p">[</span><span class="n">CLAP_NAME_SIZE</span><span class="p">];</span> + <span class="kt">char</span> <span class="n">desc</span><span class="p">[</span><span class="n">CLAP_DESC_SIZE</span><span class="p">];</span> <span class="p">};</span> <span class="k">struct</span> <span class="n">clap_plugin_params</span> <span class="p">{</span> <span class="cm">/* Returns the number of parameters. */</span> - <span class="kt">uint32_t</span> <span class="p">(</span><span class="o">*</span><span class="n">count</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">);</span> + <span class="kt">int32_t</span> <span class="p">(</span><span class="o">*</span><span class="n">count</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">);</span> <span class="cm">/* Copies the parameter's info to param and returns true. * If index is greater or equal to the number then return false. */</span> - <span class="kt">bool</span> <span class="p">(</span><span class="o">*</span><span class="n">get</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> - <span class="kt">uint32_t</span> <span class="n">index</span><span class="p">,</span> - <span class="k">struct</span> <span class="n">clap_param</span> <span class="o">*</span><span class="n">param</span><span class="p">);</span> + <span class="kt">bool</span> <span class="p">(</span><span class="o">*</span><span class="n">get_param</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> + <span class="kt">int32_t</span> <span class="n">index</span><span class="p">,</span> + <span class="k">struct</span> <span class="n">clap_param</span> <span class="o">*</span><span class="n">param</span><span class="p">);</span> + + <span class="cm">/* Copies the module's info to module and returns true. + * If module_id is NULL or invalid then return false. */</span> + <span class="kt">bool</span> <span class="p">(</span><span class="o">*</span><span class="n">get_module</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> + <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">module_id</span><span class="p">,</span> + <span class="k">struct</span> <span class="n">clap_param_module</span> <span class="o">*</span><span class="n">module</span><span class="p">);</span> + + <span class="cm">/* Use an audio buffer to automate a parameter at sample rate. + * Once a parameter is automated by an audio buffer, concurrent + * automation event shall be ignored in favor of the audio rate + * automation. + * + * To disconnect the automation, set buffer to NULL. */</span> + <span class="kt">bool</span> <span class="p">(</span><span class="o">*</span><span class="n">set_param_buffer</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> + <span class="kt">int32_t</span> <span class="n">param_index</span><span class="p">,</span> + <span class="kt">int32_t</span> <span class="n">channel</span><span class="p">,</span> + <span class="kt">int32_t</span> <span class="n">note</span><span class="p">,</span> + <span class="k">struct</span> <span class="n">clap_audio_port</span> <span class="o">*</span><span class="n">port</span><span class="p">);</span> <span class="p">};</span> -<span class="cm">/* Helper that will serialize the plugin's parameters value into the buffer. - * (*size) must be set to the size of the buffer. - * At return, (*size) contains the number of bytes used and returns true on - * success, the only possible error is that the buffer is too small. - */</span> -<span class="k">static</span> <span class="kr">inline</span> <span class="kt">bool</span> -<span class="nf">clap_plugin_params_save</span><span class="p">(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> - <span class="kt">uint8_t</span> <span class="o">*</span><span class="n">buffer</span><span class="p">,</span> - <span class="kt">uint32_t</span> <span class="o">*</span><span class="n">size</span><span class="p">);</span> - -<span class="cm">/* Helper that will deserialize parameters value from the buffer - * and send CLAP_EVENT_PARAM_SET to the plugin to restore them. - * The steady_time is required because the plugin can discard - * events from the past. - */</span> -<span class="k">static</span> <span class="kr">inline</span> <span class="kt">void</span> -<span class="nf">clap_plugin_params_restore</span><span class="p">(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> - <span class="k">const</span> <span class="kt">uint8_t</span> <span class="o">*</span><span class="n">buffer</span><span class="p">,</span> - <span class="kt">uint32_t</span> <span class="n">size</span><span class="p">,</span> - <span class="kt">uint64_t</span> <span class="n">steady_time</span><span class="p">);</span> +<span class="k">struct</span> <span class="n">clap_host_params</span> +<span class="p">{</span> + <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">touch_begin</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_host</span> <span class="o">*</span><span class="n">host</span><span class="p">,</span> + <span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> + <span class="kt">int32_t</span> <span class="n">index</span><span class="p">);</span> + + <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">touch_end</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_host</span> <span class="o">*</span><span class="n">host</span><span class="p">,</span> + <span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> + <span class="kt">int32_t</span> <span class="n">index</span><span class="p">);</span> + + <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">changed</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_host</span> <span class="o">*</span><span class="n">host</span><span class="p">,</span> + <span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> + <span class="kt">int32_t</span> <span class="n">index</span><span class="p">,</span> + <span class="k">union</span> <span class="n">clap_param_value</span> <span class="n">value</span><span class="p">,</span> + <span class="kt">bool</span> <span class="n">is_recordable</span><span class="p">);</span> + + <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">rescan</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_host</span> <span class="o">*</span><span class="n">host</span><span class="p">,</span> + <span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">);</span> +<span class="p">};</span> -<span class="cp"># include &quot;params.c&quot; -</span> <span class="cp">#ifdef __cplusplus </span><span class="p">}</span> <span class="cp">#endif @@ -1724,72 +1606,41 @@ plugin's parameters and restore them.</p> <span class="cp">#endif </span><span class="cm">/* !CLAP_EXT_PARAMS_H */</span> </pre> </div> -<div class="section" id="clap-ext-presets-h"> -<h2><a class="toc-backref" href="#id55">clap/ext/presets.h</a></h2> +<div class="section" id="clap-ext-gui-h"> +<h2><a class="toc-backref" href="#id51">clap/ext/gui.h</a></h2> <pre class="code c literal-block"> -<span class="cp">#ifndef CLAP_EXT_PRESETS_H -# define CLAP_EXT_PRESETS_H +<span class="cp">#ifndef CLAP_EXT_GUI_H +# define CLAP_EXT_GUI_H </span> <span class="cp"># include &quot;../clap.h&quot; </span> -<span class="cp"># define CLAP_EXT_PRESETS &quot;clap/presets&quot; +<span class="cp"># define CLAP_EXT_GUI &quot;clap/gui&quot; </span> -<span class="k">struct</span> <span class="n">clap_preset</span> +<span class="k">struct</span> <span class="n">clap_plugin_gui</span> <span class="p">{</span> - <span class="kt">char</span> <span class="n">url</span><span class="p">[</span><span class="n">CLAP_URL_SIZE</span><span class="p">];</span> <span class="c1">// location to the patch -</span> <span class="kt">char</span> <span class="n">name</span><span class="p">[</span><span class="n">CLAP_NAME_SIZE</span><span class="p">];</span> <span class="c1">// display name -</span> <span class="kt">char</span> <span class="n">desc</span><span class="p">[</span><span class="n">CLAP_DESC_SIZE</span><span class="p">];</span> <span class="c1">// desc and how to use it -</span> <span class="kt">char</span> <span class="n">author</span><span class="p">[</span><span class="n">CLAP_NAME_SIZE</span><span class="p">];</span> - <span class="kt">char</span> <span class="n">tags</span><span class="p">[</span><span class="n">CLAP_TAGS_SIZE</span><span class="p">];</span> <span class="c1">// &quot;tag1;tag2;tag3;...&quot; -</span> <span class="kt">uint8_t</span> <span class="n">score</span><span class="p">;</span> <span class="c1">// 0 = garbage, ..., 4 = favorite -</span><span class="p">};</span> - -<span class="k">struct</span> <span class="n">clap_preset_iterator</span><span class="p">;</span> + <span class="cm">/* gui */</span> + <span class="kt">bool</span> <span class="p">(</span><span class="o">*</span><span class="n">open</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">);</span> + <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">hide</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">);</span> + <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">close</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">);</span> +<span class="p">};</span> -<span class="k">struct</span> <span class="n">clap_plugin_presets</span> +<span class="k">struct</span> <span class="n">clap_host_gui</span> <span class="p">{</span> - <span class="cm">/* Allocate a new preset iterator positioned at the beginning of the - * preset collection, store its pointer into (*iter). - * Returns true on success, false otherwise. - * If the collection is empty, then it must return false and (*iter) - * should be NULL. */</span> - <span class="kt">bool</span> <span class="p">(</span><span class="o">*</span><span class="n">iter_begin</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> - <span class="k">struct</span> <span class="n">clap_preset_iterator</span> <span class="o">**</span><span class="n">iter</span><span class="p">);</span> - - <span class="cm">/* Iterate to the next value. If the iterator reached the end of the - * collection, returns false. - * Returns true on success. */</span> - <span class="kt">bool</span> <span class="p">(</span><span class="o">*</span><span class="n">iter_next</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> - <span class="k">struct</span> <span class="n">clap_preset_iterator</span> <span class="o">*</span><span class="n">iter</span><span class="p">);</span> - - <span class="cm">/* Release the iterator. - * If iter is NULL, then do nothing. */</span> - <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">iter_destroy</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> - <span class="k">struct</span> <span class="n">clap_preset_iterator</span> <span class="o">*</span><span class="n">iter</span><span class="p">);</span> - - <span class="cm">/* Get preset at the current iterator position. - * Returns true on success, false otherwise. */</span> - <span class="kt">bool</span> <span class="p">(</span><span class="o">*</span><span class="n">iter_get</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> - <span class="k">struct</span> <span class="n">clap_preset_iterator</span> <span class="o">*</span><span class="n">iter</span><span class="p">,</span> - <span class="k">struct</span> <span class="n">clap_preset</span> <span class="o">*</span><span class="n">preset</span><span class="p">);</span> - - <span class="cm">/* Get a preset info by its URL and returns true. - * If the preset is not found, then it should return false. */</span> - <span class="kt">bool</span> <span class="p">(</span><span class="o">*</span><span class="n">get</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> - <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">url</span><span class="p">,</span> - <span class="k">struct</span> <span class="n">clap_preset</span> <span class="o">*</span><span class="n">preset</span><span class="p">);</span> - - <span class="cm">/* Set the preset score. */</span> - <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">set_score</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> - <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">url</span><span class="p">,</span> - <span class="kt">uint8_t</span> <span class="n">score</span><span class="p">);</span> + <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">gui_opened</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_host</span> <span class="o">*</span><span class="n">host</span><span class="p">,</span> + <span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">);</span> + + <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">gui_hidden</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_host</span> <span class="o">*</span><span class="n">host</span><span class="p">,</span> + <span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">);</span> + + <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">gui_closed</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_host</span> <span class="o">*</span><span class="n">host</span><span class="p">,</span> + <span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">);</span> <span class="p">};</span> -<span class="cp">#endif </span><span class="cm">/* !CLAP_EXT_PRESETS_H */</span> +<span class="cp">#endif </span><span class="cm">/* !CLAP_EXT_GUI_H */</span> </pre> </div> <div class="section" id="clap-ext-embed-h"> -<h2><a class="toc-backref" href="#id56">clap/ext/embed.h</a></h2> +<h2><a class="toc-backref" href="#id52">clap/ext/embed.h</a></h2> <pre class="code c literal-block"> <span class="cp">#ifndef CLAP_EXT_EMBED_H # define CLAP_EXT_EMBED_H @@ -1802,14 +1653,14 @@ plugin's parameters and restore them.</p> <span class="p">{</span> <span class="cm">/* Request the host to resize the client area to width, height. * Return true on success, false otherwise. */</span> - <span class="kt">bool</span> <span class="p">(</span><span class="o">*</span><span class="n">resize</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_host</span> <span class="o">*</span><span class="n">host</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">width</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="n">height</span><span class="p">);</span> + <span class="kt">bool</span> <span class="p">(</span><span class="o">*</span><span class="n">resize</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_host</span> <span class="o">*</span><span class="n">host</span><span class="p">,</span> <span class="kt">int32_t</span> <span class="n">width</span><span class="p">,</span> <span class="kt">int32_t</span> <span class="n">height</span><span class="p">);</span> <span class="p">};</span> <span class="cp">#endif </span><span class="cm">/* !CLAP_EXT_EMBED_H */</span> </pre> </div> <div class="section" id="clap-ext-embed-win32-h"> -<h2><a class="toc-backref" href="#id57">clap/ext/embed-win32.h</a></h2> +<h2><a class="toc-backref" href="#id53">clap/ext/embed-win32.h</a></h2> <pre class="code c literal-block"> <span class="cp">#ifndef CLAP_EXT_EMBED_WIN32_H # define CLAP_EXT_EMBED_WIN32_H @@ -1823,7 +1674,9 @@ plugin's parameters and restore them.</p> </span> <span class="k">struct</span> <span class="n">clap_plugin_embed_win32</span> <span class="p">{</span> - <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">get_size</span><span class="p">)(</span><span class="kt">uint32_t</span> <span class="o">*</span><span class="n">width</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="o">*</span><span class="n">height</span><span class="p">);</span> + <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">get_size</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> + <span class="kt">int32_t</span> <span class="o">*</span><span class="n">width</span><span class="p">,</span> + <span class="kt">int32_t</span> <span class="o">*</span><span class="n">height</span><span class="p">);</span> <span class="kt">bool</span> <span class="p">(</span><span class="o">*</span><span class="n">attach</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> <span class="n">HWND</span> <span class="n">window</span><span class="p">);</span> <span class="kt">bool</span> <span class="p">(</span><span class="o">*</span><span class="n">detach</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">);</span> <span class="p">};</span> @@ -1831,22 +1684,22 @@ plugin's parameters and restore them.</p> <span class="cp">#endif </span><span class="cm">/* !CLAP_EXT_EMBED_WIN32_H */</span> </pre> </div> -<div class="section" id="clap-ext-embed-xlib-h"> -<h2><a class="toc-backref" href="#id58">clap/ext/embed-xlib.h</a></h2> +<div class="section" id="clap-ext-embed-x11-h"> +<h2><a class="toc-backref" href="#id54">clap/ext/embed-x11.h</a></h2> <pre class="code c literal-block"> -<span class="cp">#ifndef CLAP_EXT_EMBED_XLIB_H -# define CLAP_EXT_EMBED_XLIB_H -</span> -<span class="cp"># include &lt;X11/Xlib.h&gt; +<span class="cp">#ifndef CLAP_EXT_EMBED_X11_H +# define CLAP_EXT_EMBED_X11_H </span> <span class="cp"># include &quot;../clap.h&quot; # include &quot;embed.h&quot; </span> -<span class="cp"># define CLAP_EXT_EMBED_XLIB &quot;clap/embed/xlib&quot; +<span class="cp"># define CLAP_EXT_EMBED_X11 &quot;clap/embed/x11&quot; </span> -<span class="k">struct</span> <span class="n">clap_plugin_embed_xlib</span> +<span class="k">struct</span> <span class="n">clap_plugin_embed_x11</span> <span class="p">{</span> - <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">get_size</span><span class="p">)(</span><span class="kt">uint32_t</span> <span class="o">*</span><span class="n">width</span><span class="p">,</span> <span class="kt">uint32_t</span> <span class="o">*</span><span class="n">height</span><span class="p">);</span> + <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">get_size</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> + <span class="kt">int32_t</span> <span class="o">*</span><span class="n">width</span><span class="p">,</span> + <span class="kt">int32_t</span> <span class="o">*</span><span class="n">height</span><span class="p">);</span> <span class="cm">/* Note for the client, you can get a Display* by calling * XOpenDisplay(display_name). @@ -1854,14 +1707,124 @@ plugin's parameters and restore them.</p> * Note for the host, the display_name can be retrieved from your own * display-&gt;display_name. */</span> <span class="kt">bool</span> <span class="p">(</span><span class="o">*</span><span class="n">attach</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> - <span class="n">Window</span> <span class="n">window</span><span class="p">,</span> - <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">display_name</span><span class="p">);</span> + <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">display_name</span><span class="p">,</span> + <span class="kt">unsigned</span> <span class="kt">long</span> <span class="n">window</span><span class="p">);</span> <span class="kt">bool</span> <span class="p">(</span><span class="o">*</span><span class="n">detach</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">);</span> <span class="p">};</span> <span class="cp">#endif </span><span class="cm">/* !CLAP_EMBED_XLIB_H */</span> </pre> </div> +<div class="section" id="clap-ext-embed-cocoa-h"> +<h2><a class="toc-backref" href="#id55">clap/ext/embed-cocoa.h</a></h2> +<pre class="code c literal-block"> +<span class="cp">#ifndef CLAP_EXT_EMBED_COCOA_H +# define CLAP_EXT_EMBED_COCOA_H +</span> +<span class="cp"># include &quot;../clap.h&quot; +# include &quot;embed.h&quot; +</span> +<span class="cp"># define CLAP_EXT_EMBED_COCOA &quot;clap/embed/cocoa&quot; +</span> +<span class="k">struct</span> <span class="n">clap_plugin_embed_cocoa</span> +<span class="p">{</span> + <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">get_size</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> + <span class="kt">int32_t</span> <span class="o">*</span><span class="n">width</span><span class="p">,</span> + <span class="kt">int32_t</span> <span class="o">*</span><span class="n">height</span><span class="p">);</span> + + <span class="cm">/* Note for the client, you can get a Display* by calling + * XOpenDisplay(display_name). + * + * Note for the host, the display_name can be retrieved from your own + * display-&gt;display_name. */</span> + <span class="kt">bool</span> <span class="p">(</span><span class="o">*</span><span class="n">attach</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> + <span class="kt">void</span> <span class="o">*</span><span class="n">nsView</span><span class="p">);</span> + <span class="kt">bool</span> <span class="p">(</span><span class="o">*</span><span class="n">detach</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">);</span> +<span class="p">};</span> + +<span class="cp">#endif </span><span class="cm">/* !CLAP_EXT_EMBED_COCOA_H */</span> +</pre> +</div> +<div class="section" id="clap-ext-presets-h"> +<h2><a class="toc-backref" href="#id56">clap/ext/presets.h</a></h2> +<pre class="code c literal-block"> +<span class="cp">#ifndef CLAP_EXT_PRESETS_H +# define CLAP_EXT_PRESETS_H +</span> +<span class="cp"># include &quot;../clap.h&quot; +</span> +<span class="cp"># define CLAP_EXT_PRESETS &quot;clap/presets&quot; +</span> +<span class="k">struct</span> <span class="n">clap_preset_info</span> +<span class="p">{</span> + <span class="kt">char</span> <span class="n">plugin_id</span><span class="p">[</span><span class="n">CLAP_ID_SIZE</span><span class="p">];</span> <span class="c1">// used to identify which plugin can load the preset +</span> <span class="kt">char</span> <span class="n">id</span><span class="p">[</span><span class="n">CLAP_ID_SIZE</span><span class="p">];</span> <span class="c1">// used to identify a preset in a preset bank +</span> <span class="kt">char</span> <span class="n">name</span><span class="p">[</span><span class="n">CLAP_NAME_SIZE</span><span class="p">];</span> <span class="c1">// display name +</span> <span class="kt">char</span> <span class="n">desc</span><span class="p">[</span><span class="n">CLAP_DESC_SIZE</span><span class="p">];</span> <span class="c1">// desc and how to use it +</span> <span class="kt">char</span> <span class="n">author</span><span class="p">[</span><span class="n">CLAP_NAME_SIZE</span><span class="p">];</span> + <span class="kt">char</span> <span class="n">categories</span><span class="p">[</span><span class="n">CLAP_TAGS_SIZE</span><span class="p">];</span> <span class="c1">// &quot;cat1;cat2;cat3;...&quot; +</span> <span class="kt">char</span> <span class="n">tags</span><span class="p">[</span><span class="n">CLAP_TAGS_SIZE</span><span class="p">];</span> <span class="c1">// &quot;tag1;tag2;tag3;...&quot; +</span> <span class="kt">int8_t</span> <span class="n">score</span><span class="p">;</span> <span class="c1">// 0 = garbage, ..., 100 = best, -1 = no score +</span><span class="p">};</span> + +<span class="cm">/* Interface implemented by the plugin */</span> +<span class="k">struct</span> <span class="n">clap_plugin_preset</span> +<span class="p">{</span> + <span class="cm">/* Create a preset library for this plugin */</span> + <span class="k">struct</span> <span class="n">clap_preset_library</span> <span class="o">*</span><span class="p">(</span><span class="o">*</span><span class="n">create_preset_library</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">);</span> + + <span class="cm">/* Get the current preset info */</span> + <span class="kt">bool</span> <span class="p">(</span><span class="o">*</span><span class="n">get_current_preset_info</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> + <span class="k">struct</span> <span class="n">clap_preset_info</span> <span class="o">*</span><span class="n">preset</span><span class="p">);</span> + + <span class="cm">/* Load a preset from a bank file */</span> + <span class="kt">bool</span> <span class="p">(</span><span class="o">*</span><span class="n">load_preset</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_plugin</span> <span class="o">*</span><span class="n">plugin</span><span class="p">,</span> + <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">path</span><span class="p">,</span> + <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">preset_id</span><span class="p">);</span> +<span class="p">};</span> + +<span class="cm">/* opaque type */</span> +<span class="k">struct</span> <span class="n">clap_bank_handle</span><span class="p">;</span> + +<span class="cm">/* The principle behind this extension is that the host gets a list of + * directories to scan recursively, and then for each files, it can ask + * the interface to load the preset. + * + * Every file are considered as preset bank, so they can contain between + * 0 and many presets. */</span> +<span class="k">struct</span> <span class="n">clap_preset_library</span> +<span class="p">{</span> + <span class="cm">/* Copies at most *path_size bytes into path. + * If directory_index is bigger than the number of directories, + * then return false. */</span> + <span class="kt">bool</span> <span class="p">(</span><span class="o">*</span><span class="n">get_directory</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_preset_library</span> <span class="o">*</span><span class="n">library</span><span class="p">,</span> + <span class="kt">int</span> <span class="n">directory_index</span><span class="p">,</span> + <span class="kt">char</span> <span class="o">*</span><span class="n">path</span><span class="p">,</span> + <span class="kt">int32_t</span> <span class="o">*</span><span class="n">path_size</span><span class="p">);</span> + + <span class="kt">bool</span> <span class="p">(</span><span class="o">*</span><span class="n">open_bank</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_preset_library</span> <span class="o">*</span><span class="n">library</span><span class="p">,</span> + <span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">path</span><span class="p">,</span> + <span class="k">struct</span> <span class="n">clap_bank_handle</span> <span class="o">*</span><span class="n">handle</span><span class="p">);</span> + + <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="n">close_bank</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_preset_library</span> <span class="o">*</span><span class="n">library</span><span class="p">,</span> + <span class="k">struct</span> <span class="n">clap_bank_handle</span> <span class="o">*</span><span class="n">handle</span><span class="p">);</span> + + <span class="kt">int32_t</span> <span class="p">(</span><span class="o">*</span><span class="n">get_bank_size</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_preset_library</span> <span class="o">*</span><span class="n">library</span><span class="p">,</span> + <span class="k">struct</span> <span class="n">clap_bank_handle</span> <span class="o">*</span><span class="n">handle</span><span class="p">);</span> + + <span class="cm">/* Get a preset info from its path and returns true. + * In case of a preset bank file, index is used, and *has_next + * should be set to false when index reaches the last preset. + * If the preset is not found, then it should return false. */</span> + <span class="kt">bool</span> <span class="p">(</span><span class="o">*</span><span class="n">get_bank_preset</span><span class="p">)(</span><span class="k">struct</span> <span class="n">clap_preset_library</span> <span class="o">*</span><span class="n">library</span><span class="p">,</span> + <span class="k">struct</span> <span class="n">clap_bank_handle</span> <span class="o">*</span><span class="n">handle</span><span class="p">,</span> + <span class="k">struct</span> <span class="n">clap_preset_info</span> <span class="o">*</span><span class="n">preset_info</span><span class="p">,</span> + <span class="kt">int32_t</span> <span class="n">index</span><span class="p">);</span> +<span class="p">};</span> + +<span class="cp">#endif </span><span class="cm">/* !CLAP_EXT_PRESETS_H */</span> +</pre> +</div> </div> </div> </body> diff --git a/spec.rst b/spec.rst @@ -133,11 +133,6 @@ of them by using an ``index`` between ``0`` and ``*plugins_count``. ``clap_create`` returns ``NULL`` if the plugin creation failed or if ``plugin_index >= plugin_count``. -Sample plugin loader -```````````````````` - -See `examples/clap-info/clap-info.c`_ - Plugin description ~~~~~~~~~~~~~~~~~~ @@ -609,7 +604,9 @@ an extension. +------------+---------------------------+----------------------+----------------+ | Windows | `clap/ext/embed-win32.h`_ | ``CLAP_EMBED_WIN32`` | For the plugin | +------------+---------------------------+----------------------+----------------+ -| X11 | `clap/ext/embed-xlib.h`_ | ``CLAP_EMBED_XLIB`` | For the plugin | +| X11 | `clap/ext/embed-x11.h`_ | ``CLAP_EMBED_X11`` | For the plugin | ++------------+---------------------------+----------------------+----------------+ +| Cocoa | `clap/ext/embed-cocoa.h`_ | ``CLAP_EMBED_COCOA`` | For the plugin | +------------+---------------------------+----------------------+----------------+ Example on Windows @@ -719,15 +716,6 @@ See `clap/ext/state.h`_. Note: if the plugin do not have the state extension, the host can save the plugin's parameters and restore them. -Examples -======== - -examples/clap-info/clap-info.c ------------------------------- - -.. include:: tools/clap-info/clap-info.c - :code: c - References ========== @@ -737,22 +725,16 @@ clap/clap.h .. include:: include/clap/clap.h :code: c -clap/ext/ports.h +clap/ext/state.h ---------------- -.. include:: include/clap/ext/ports.h - :code: c - -clap/ext/gui.h --------------- - -.. include:: include/clap/ext/gui.h +.. include:: include/clap/ext/state.h :code: c -clap/ext/state.h +clap/ext/ports.h ---------------- -.. include:: include/clap/ext/state.h +.. include:: include/clap/ext/ports.h :code: c clap/ext/params.h @@ -761,10 +743,10 @@ clap/ext/params.h .. include:: include/clap/ext/params.h :code: c -clap/ext/presets.h ------------------- +clap/ext/gui.h +-------------- -.. include:: include/clap/ext/presets.h +.. include:: include/clap/ext/gui.h :code: c clap/ext/embed.h @@ -779,8 +761,20 @@ clap/ext/embed-win32.h .. include:: include/clap/ext/embed-win32.h :code: c -clap/ext/embed-xlib.h +clap/ext/embed-x11.h --------------------- -.. include:: include/clap/ext/embed-xlib.h +.. include:: include/clap/ext/embed-x11.h + :code: c + +clap/ext/embed-cocoa.h +---------------------- + +.. include:: include/clap/ext/embed-cocoa.h + :code: c + +clap/ext/presets.h +------------------ + +.. include:: include/clap/ext/presets.h :code: c