Sophie

Sophie

distrib > Fedora > 15 > i386 > by-pkgid > 17b3b183e611d5215dd0c74920f6f6d9 > files > 50

jack-audio-connection-kit-devel-1.9.7-1.fc15.i686.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>Jack2: JackControlAPI.cpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.3 -->
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td style="padding-left: 0.5em;">
   <div id="projectname">Jack2&#160;<span id="projectnumber">1.9.7</span></div>
  </td>
 </tr>
 </tbody>
</table>
</div>
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
      <li><a href="modules.html"><span>Modules</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
    </ul>
  </div>
  <div id="navrow2" class="tabs2">
    <ul class="tablist">
      <li><a href="files.html"><span>File&#160;List</span></a></li>
      <li><a href="globals.html"><span>File&#160;Members</span></a></li>
    </ul>
  </div>
<div class="header">
  <div class="headertitle">
<h1>JackControlAPI.cpp</h1>  </div>
</div>
<div class="contents">
<div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// u/* -*- Mode: C++ ; c-basic-offset: 4 -*- */</span>
<a name="l00002"></a>00002 <span class="comment">/*</span>
<a name="l00003"></a>00003 <span class="comment">  JACK control API implementation</span>
<a name="l00004"></a>00004 <span class="comment"></span>
<a name="l00005"></a>00005 <span class="comment">  Copyright (C) 2008 Nedko Arnaudov</span>
<a name="l00006"></a>00006 <span class="comment">  Copyright (C) 2008 Grame</span>
<a name="l00007"></a>00007 <span class="comment"></span>
<a name="l00008"></a>00008 <span class="comment">  This program is free software; you can redistribute it and/or modify</span>
<a name="l00009"></a>00009 <span class="comment">  it under the terms of the GNU General Public License as published by</span>
<a name="l00010"></a>00010 <span class="comment">  the Free Software Foundation; version 2 of the License.</span>
<a name="l00011"></a>00011 <span class="comment"></span>
<a name="l00012"></a>00012 <span class="comment">  This program is distributed in the hope that it will be useful,</span>
<a name="l00013"></a>00013 <span class="comment">  but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<a name="l00014"></a>00014 <span class="comment">  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span>
<a name="l00015"></a>00015 <span class="comment">  GNU General Public License for more details.</span>
<a name="l00016"></a>00016 <span class="comment"></span>
<a name="l00017"></a>00017 <span class="comment">  You should have received a copy of the GNU General Public License</span>
<a name="l00018"></a>00018 <span class="comment">  along with this program; if not, write to the Free Software</span>
<a name="l00019"></a>00019 <span class="comment">  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.</span>
<a name="l00020"></a>00020 <span class="comment"></span>
<a name="l00021"></a>00021 <span class="comment">*/</span>
<a name="l00022"></a>00022 
<a name="l00023"></a>00023 <span class="preprocessor">#ifndef WIN32</span>
<a name="l00024"></a>00024 <span class="preprocessor"></span><span class="preprocessor">#include &lt;stdint.h&gt;</span>
<a name="l00025"></a>00025 <span class="preprocessor">#include &lt;dirent.h&gt;</span>
<a name="l00026"></a>00026 <span class="preprocessor">#include &lt;pthread.h&gt;</span>
<a name="l00027"></a>00027 <span class="preprocessor">#endif</span>
<a name="l00028"></a>00028 <span class="preprocessor"></span>
<a name="l00029"></a>00029 <span class="preprocessor">#include &quot;types.h&quot;</span>
<a name="l00030"></a>00030 <span class="preprocessor">#include &lt;string.h&gt;</span>
<a name="l00031"></a>00031 <span class="preprocessor">#include &lt;errno.h&gt;</span>
<a name="l00032"></a>00032 <span class="preprocessor">#include &lt;stdio.h&gt;</span>
<a name="l00033"></a>00033 <span class="preprocessor">#include &lt;assert.h&gt;</span>
<a name="l00034"></a>00034 <span class="preprocessor">#include &lt;signal.h&gt;</span>
<a name="l00035"></a>00035 <span class="preprocessor">#include &lt;sys/utsname.h&gt;</span>
<a name="l00036"></a>00036 
<a name="l00037"></a>00037 <span class="preprocessor">#include &quot;jslist.h&quot;</span>
<a name="l00038"></a>00038 <span class="preprocessor">#include &quot;driver_interface.h&quot;</span>
<a name="l00039"></a>00039 <span class="preprocessor">#include &quot;JackError.h&quot;</span>
<a name="l00040"></a>00040 <span class="preprocessor">#include &quot;JackServer.h&quot;</span>
<a name="l00041"></a>00041 <span class="preprocessor">#include &quot;shm.h&quot;</span>
<a name="l00042"></a>00042 <span class="preprocessor">#include &quot;JackTools.h&quot;</span>
<a name="l00043"></a>00043 <span class="preprocessor">#include &quot;JackControlAPI.h&quot;</span>
<a name="l00044"></a>00044 <span class="preprocessor">#include &quot;JackLockedEngine.h&quot;</span>
<a name="l00045"></a>00045 <span class="preprocessor">#include &quot;JackConstants.h&quot;</span>
<a name="l00046"></a>00046 <span class="preprocessor">#include &quot;JackDriverLoader.h&quot;</span>
<a name="l00047"></a>00047 <span class="preprocessor">#include &quot;JackServerGlobals.h&quot;</span>
<a name="l00048"></a>00048 
<a name="l00049"></a>00049 <span class="keyword">using namespace </span>Jack;
<a name="l00050"></a>00050 
<a name="l00051"></a><a class="code" href="structjackctl__server.html">00051</a> <span class="keyword">struct </span><a class="code" href="structjackctl__server.html">jackctl_server</a>
<a name="l00052"></a>00052 {
<a name="l00053"></a>00053     <a class="code" href="struct__JSList.html">JSList</a> * drivers;
<a name="l00054"></a>00054     <a class="code" href="struct__JSList.html">JSList</a> * internals;
<a name="l00055"></a>00055     <a class="code" href="struct__JSList.html">JSList</a> * parameters;
<a name="l00056"></a>00056 
<a name="l00057"></a>00057     <span class="keyword">class </span><a class="code" href="classJack_1_1JackServer.html" title="The Jack server.">JackServer</a> * engine;
<a name="l00058"></a>00058 
<a name="l00059"></a>00059     <span class="comment">/* string, server name */</span>
<a name="l00060"></a>00060     <span class="keyword">union </span><a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> name;
<a name="l00061"></a>00061     <span class="keyword">union </span><a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> default_name;
<a name="l00062"></a>00062 
<a name="l00063"></a>00063     <span class="comment">/* bool, whether to be &quot;realtime&quot; */</span>
<a name="l00064"></a>00064     <span class="keyword">union </span><a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> realtime;
<a name="l00065"></a>00065     <span class="keyword">union </span><a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> default_realtime;
<a name="l00066"></a>00066 
<a name="l00067"></a>00067     <span class="comment">/* int32_t */</span>
<a name="l00068"></a>00068     <span class="keyword">union </span><a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> realtime_priority;
<a name="l00069"></a>00069     <span class="keyword">union </span><a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> default_realtime_priority;
<a name="l00070"></a>00070 
<a name="l00071"></a>00071     <span class="comment">/* bool, whether to exit once all clients have closed their connections */</span>
<a name="l00072"></a>00072     <span class="keyword">union </span><a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> temporary;
<a name="l00073"></a>00073     <span class="keyword">union </span><a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> default_temporary;
<a name="l00074"></a>00074 
<a name="l00075"></a>00075     <span class="comment">/* bool, whether to be verbose */</span>
<a name="l00076"></a>00076     <span class="keyword">union </span><a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> verbose;
<a name="l00077"></a>00077     <span class="keyword">union </span><a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> default_verbose;
<a name="l00078"></a>00078 
<a name="l00079"></a>00079     <span class="comment">/* int32_t, msecs; if zero, use period size. */</span>
<a name="l00080"></a>00080     <span class="keyword">union </span><a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> client_timeout;
<a name="l00081"></a>00081     <span class="keyword">union </span><a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> default_client_timeout;
<a name="l00082"></a>00082 
<a name="l00083"></a>00083     <span class="comment">/* uint32_t, clock source type */</span>
<a name="l00084"></a>00084     <span class="keyword">union </span><a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> clock_source;
<a name="l00085"></a>00085     <span class="keyword">union </span><a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> default_clock_source;
<a name="l00086"></a>00086 
<a name="l00087"></a>00087     <span class="comment">/* uint32_t, max port number */</span>
<a name="l00088"></a>00088     <span class="keyword">union </span><a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> port_max;
<a name="l00089"></a>00089     <span class="keyword">union </span><a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> default_port_max;
<a name="l00090"></a>00090 
<a name="l00091"></a>00091     <span class="comment">/* bool */</span>
<a name="l00092"></a>00092     <span class="keyword">union </span><a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> replace_registry;
<a name="l00093"></a>00093     <span class="keyword">union </span><a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> default_replace_registry;
<a name="l00094"></a>00094 
<a name="l00095"></a>00095     <span class="comment">/* bool, synchronous or asynchronous engine mode */</span>
<a name="l00096"></a>00096     <span class="keyword">union </span><a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> sync;
<a name="l00097"></a>00097     <span class="keyword">union </span><a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> default_sync;
<a name="l00098"></a>00098 };
<a name="l00099"></a>00099 
<a name="l00100"></a><a class="code" href="structjackctl__driver.html">00100</a> <span class="keyword">struct </span><a class="code" href="structjackctl__driver.html">jackctl_driver</a>
<a name="l00101"></a>00101 {
<a name="l00102"></a>00102     <a class="code" href="structjack__driver__desc__t.html">jack_driver_desc_t</a> * desc_ptr;
<a name="l00103"></a>00103     <a class="code" href="struct__JSList.html">JSList</a> * parameters;
<a name="l00104"></a>00104     <a class="code" href="struct__JSList.html">JSList</a> * set_parameters;
<a name="l00105"></a>00105     <a class="code" href="classJackDriverInfo.html">JackDriverInfo</a>* info;
<a name="l00106"></a>00106 };
<a name="l00107"></a>00107 
<a name="l00108"></a><a class="code" href="structjackctl__internal.html">00108</a> <span class="keyword">struct </span><a class="code" href="structjackctl__internal.html">jackctl_internal</a>
<a name="l00109"></a>00109 {
<a name="l00110"></a>00110     <a class="code" href="structjack__driver__desc__t.html">jack_driver_desc_t</a> * desc_ptr;
<a name="l00111"></a>00111     <a class="code" href="struct__JSList.html">JSList</a> * parameters;
<a name="l00112"></a>00112     <a class="code" href="struct__JSList.html">JSList</a> * set_parameters;
<a name="l00113"></a>00113     <span class="keywordtype">int</span> refnum;
<a name="l00114"></a>00114 };
<a name="l00115"></a>00115 
<a name="l00116"></a><a class="code" href="structjackctl__parameter.html">00116</a> <span class="keyword">struct </span><a class="code" href="structjackctl__parameter.html">jackctl_parameter</a>
<a name="l00117"></a>00117 {
<a name="l00118"></a>00118     <span class="keyword">const</span> <span class="keywordtype">char</span> * name;
<a name="l00119"></a>00119     <span class="keyword">const</span> <span class="keywordtype">char</span> * short_description;
<a name="l00120"></a>00120     <span class="keyword">const</span> <span class="keywordtype">char</span> * long_description;
<a name="l00121"></a>00121     jackctl_param_type_t type;
<a name="l00122"></a>00122     <span class="keywordtype">bool</span> is_set;
<a name="l00123"></a>00123     <span class="keyword">union </span><a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> * value_ptr;
<a name="l00124"></a>00124     <span class="keyword">union </span><a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> * default_value_ptr;
<a name="l00125"></a>00125 
<a name="l00126"></a>00126     <span class="keyword">union </span><a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> value;
<a name="l00127"></a>00127     <span class="keyword">union </span><a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> default_value;
<a name="l00128"></a>00128     <span class="keyword">struct </span><a class="code" href="structjackctl__driver.html">jackctl_driver</a> * driver_ptr;
<a name="l00129"></a>00129     <span class="keywordtype">char</span> id;
<a name="l00130"></a>00130     <a class="code" href="structjack__driver__param__t.html">jack_driver_param_t</a> * driver_parameter_ptr;
<a name="l00131"></a>00131     <a class="code" href="structjack__driver__param__constraint__desc__t.html">jack_driver_param_constraint_desc_t</a> * constraint_ptr;
<a name="l00132"></a>00132 };
<a name="l00133"></a>00133 
<a name="l00134"></a>00134 <span class="keyword">static</span>
<a name="l00135"></a>00135 <span class="keyword">struct </span><a class="code" href="structjackctl__parameter.html">jackctl_parameter</a> *
<a name="l00136"></a>00136 jackctl_add_parameter(
<a name="l00137"></a>00137     <a class="code" href="struct__JSList.html">JSList</a> ** parameters_list_ptr_ptr,
<a name="l00138"></a>00138     <span class="keyword">const</span> <span class="keywordtype">char</span> * name,
<a name="l00139"></a>00139     <span class="keyword">const</span> <span class="keywordtype">char</span> * short_description,
<a name="l00140"></a>00140     <span class="keyword">const</span> <span class="keywordtype">char</span> * long_description,
<a name="l00141"></a>00141     jackctl_param_type_t type,
<a name="l00142"></a>00142     <span class="keyword">union</span> <a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> * value_ptr,
<a name="l00143"></a>00143     <span class="keyword">union</span> <a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> * default_value_ptr,
<a name="l00144"></a>00144     <span class="keyword">union</span> <a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> value,
<a name="l00145"></a>00145     <a class="code" href="structjack__driver__param__constraint__desc__t.html">jack_driver_param_constraint_desc_t</a> * constraint_ptr = NULL)
<a name="l00146"></a>00146 {
<a name="l00147"></a>00147     <span class="keyword">struct </span><a class="code" href="structjackctl__parameter.html">jackctl_parameter</a> * parameter_ptr;
<a name="l00148"></a>00148 
<a name="l00149"></a>00149     parameter_ptr = (<span class="keyword">struct </span><a class="code" href="structjackctl__parameter.html">jackctl_parameter</a> *)malloc(<span class="keyword">sizeof</span>(<span class="keyword">struct</span> <a class="code" href="structjackctl__parameter.html">jackctl_parameter</a>));
<a name="l00150"></a>00150     <span class="keywordflow">if</span> (parameter_ptr == NULL)
<a name="l00151"></a>00151     {
<a name="l00152"></a>00152         <a class="code" href="group__ServerControl.html#gac6448626e0b75fc6d9da1ccbdca0355e">jack_error</a>(<span class="stringliteral">&quot;Cannot allocate memory for jackctl_parameter structure.&quot;</span>);
<a name="l00153"></a>00153         <span class="keywordflow">goto</span> fail;
<a name="l00154"></a>00154     }
<a name="l00155"></a>00155 
<a name="l00156"></a>00156     parameter_ptr-&gt;name = name;
<a name="l00157"></a>00157     parameter_ptr-&gt;short_description = short_description;
<a name="l00158"></a>00158     parameter_ptr-&gt;long_description = long_description;
<a name="l00159"></a>00159     parameter_ptr-&gt;type = type;
<a name="l00160"></a>00160     parameter_ptr-&gt;is_set = <span class="keyword">false</span>;
<a name="l00161"></a>00161 
<a name="l00162"></a>00162     <span class="keywordflow">if</span> (value_ptr == NULL)
<a name="l00163"></a>00163     {
<a name="l00164"></a>00164         value_ptr = &amp;parameter_ptr-&gt;value;
<a name="l00165"></a>00165     }
<a name="l00166"></a>00166 
<a name="l00167"></a>00167     <span class="keywordflow">if</span> (default_value_ptr == NULL)
<a name="l00168"></a>00168     {
<a name="l00169"></a>00169         default_value_ptr = &amp;parameter_ptr-&gt;default_value;
<a name="l00170"></a>00170     }
<a name="l00171"></a>00171 
<a name="l00172"></a>00172     parameter_ptr-&gt;value_ptr = value_ptr;
<a name="l00173"></a>00173     parameter_ptr-&gt;default_value_ptr = default_value_ptr;
<a name="l00174"></a>00174 
<a name="l00175"></a>00175     *value_ptr = *default_value_ptr = value;
<a name="l00176"></a>00176 
<a name="l00177"></a>00177     parameter_ptr-&gt;driver_ptr = NULL;
<a name="l00178"></a>00178     parameter_ptr-&gt;driver_parameter_ptr = NULL;
<a name="l00179"></a>00179     parameter_ptr-&gt;id = 0;
<a name="l00180"></a>00180     parameter_ptr-&gt;constraint_ptr = constraint_ptr;
<a name="l00181"></a>00181 
<a name="l00182"></a>00182     *parameters_list_ptr_ptr = jack_slist_append(*parameters_list_ptr_ptr, parameter_ptr);
<a name="l00183"></a>00183 
<a name="l00184"></a>00184     <span class="keywordflow">return</span> parameter_ptr;
<a name="l00185"></a>00185 
<a name="l00186"></a>00186 fail:
<a name="l00187"></a>00187     <span class="keywordflow">return</span> NULL;
<a name="l00188"></a>00188 }
<a name="l00189"></a>00189 
<a name="l00190"></a>00190 <span class="keyword">static</span>
<a name="l00191"></a>00191 <span class="keywordtype">void</span>
<a name="l00192"></a>00192 jackctl_free_driver_parameters(
<a name="l00193"></a>00193     <span class="keyword">struct</span> <a class="code" href="structjackctl__driver.html">jackctl_driver</a> * driver_ptr)
<a name="l00194"></a>00194 {
<a name="l00195"></a>00195     <a class="code" href="struct__JSList.html">JSList</a> * next_node_ptr;
<a name="l00196"></a>00196 
<a name="l00197"></a>00197     <span class="keywordflow">while</span> (driver_ptr-&gt;parameters)
<a name="l00198"></a>00198     {
<a name="l00199"></a>00199         next_node_ptr = driver_ptr-&gt;parameters-&gt;next;
<a name="l00200"></a>00200         free(driver_ptr-&gt;parameters-&gt;data);
<a name="l00201"></a>00201         free(driver_ptr-&gt;parameters);
<a name="l00202"></a>00202         driver_ptr-&gt;parameters = next_node_ptr;
<a name="l00203"></a>00203     }
<a name="l00204"></a>00204 
<a name="l00205"></a>00205     <span class="keywordflow">while</span> (driver_ptr-&gt;set_parameters)
<a name="l00206"></a>00206     {
<a name="l00207"></a>00207         next_node_ptr = driver_ptr-&gt;set_parameters-&gt;next;
<a name="l00208"></a>00208         free(driver_ptr-&gt;set_parameters-&gt;data);
<a name="l00209"></a>00209         free(driver_ptr-&gt;set_parameters);
<a name="l00210"></a>00210         driver_ptr-&gt;set_parameters = next_node_ptr;
<a name="l00211"></a>00211     }
<a name="l00212"></a>00212 }
<a name="l00213"></a>00213 
<a name="l00214"></a>00214 <span class="keyword">static</span>
<a name="l00215"></a>00215 <span class="keywordtype">bool</span>
<a name="l00216"></a>00216 jackctl_add_driver_parameters(
<a name="l00217"></a>00217     <span class="keyword">struct</span> <a class="code" href="structjackctl__driver.html">jackctl_driver</a> * driver_ptr)
<a name="l00218"></a>00218 {
<a name="l00219"></a>00219     uint32_t i;
<a name="l00220"></a>00220     <span class="keyword">union </span><a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> jackctl_value;
<a name="l00221"></a>00221     jackctl_param_type_t jackctl_type;
<a name="l00222"></a>00222     <span class="keyword">struct </span><a class="code" href="structjackctl__parameter.html">jackctl_parameter</a> * parameter_ptr;
<a name="l00223"></a>00223     <a class="code" href="structjack__driver__param__desc__t.html">jack_driver_param_desc_t</a> * descriptor_ptr;
<a name="l00224"></a>00224 
<a name="l00225"></a>00225     <span class="keywordflow">for</span> (i = 0 ; i &lt; driver_ptr-&gt;desc_ptr-&gt;<a class="code" href="structjack__driver__desc__t.html#a2efc65ee5c526f37589ff715861227f5">nparams</a> ; i++)
<a name="l00226"></a>00226     {
<a name="l00227"></a>00227         descriptor_ptr = driver_ptr-&gt;desc_ptr-&gt;<a class="code" href="structjack__driver__desc__t.html#a4adfdb11fdfa44a5154da9ac971bb44c">params</a> + i;
<a name="l00228"></a>00228 
<a name="l00229"></a>00229         <span class="keywordflow">switch</span> (descriptor_ptr-&gt;<a class="code" href="structjack__driver__param__desc__t.html#a1f7d08207a0c3285329a0bc7a7e6c59e">type</a>)
<a name="l00230"></a>00230         {
<a name="l00231"></a>00231         <span class="keywordflow">case</span> JackDriverParamInt:
<a name="l00232"></a>00232             jackctl_type = <a class="code" href="control_8h.html#ac71832cf5445a694a178d15345d67840a257077c62b40f8c7c6b253c21fcaa5e6" title="value type is a signed integer">JackParamInt</a>;
<a name="l00233"></a>00233             jackctl_value.i = descriptor_ptr-&gt;<a class="code" href="structjack__driver__param__desc__t.html#a817eb04d0ccf7203345e55e608a7495f">value</a>.i;
<a name="l00234"></a>00234             <span class="keywordflow">break</span>;
<a name="l00235"></a>00235         <span class="keywordflow">case</span> JackDriverParamUInt:
<a name="l00236"></a>00236             jackctl_type = <a class="code" href="control_8h.html#ac71832cf5445a694a178d15345d67840a574c962072518406c2aebf6b3d6ddc71" title="value type is an unsigned integer">JackParamUInt</a>;
<a name="l00237"></a>00237             jackctl_value.ui = descriptor_ptr-&gt;<a class="code" href="structjack__driver__param__desc__t.html#a817eb04d0ccf7203345e55e608a7495f">value</a>.ui;
<a name="l00238"></a>00238             <span class="keywordflow">break</span>;
<a name="l00239"></a>00239         <span class="keywordflow">case</span> JackDriverParamChar:
<a name="l00240"></a>00240             jackctl_type = <a class="code" href="control_8h.html#ac71832cf5445a694a178d15345d67840aab44adbfbb163aa6b6ad52eac90b2bfb" title="value type is a char">JackParamChar</a>;
<a name="l00241"></a>00241             jackctl_value.c = descriptor_ptr-&gt;<a class="code" href="structjack__driver__param__desc__t.html#a817eb04d0ccf7203345e55e608a7495f">value</a>.c;
<a name="l00242"></a>00242             <span class="keywordflow">break</span>;
<a name="l00243"></a>00243         <span class="keywordflow">case</span> JackDriverParamString:
<a name="l00244"></a>00244             jackctl_type = <a class="code" href="control_8h.html#ac71832cf5445a694a178d15345d67840aabd8d7557b32d28d8bc7c22449a74b0b" title="value type is a string with max size of JACK_PARAM_STRING_MAX+1 chars">JackParamString</a>;
<a name="l00245"></a>00245             strcpy(jackctl_value.str, descriptor_ptr-&gt;<a class="code" href="structjack__driver__param__desc__t.html#a817eb04d0ccf7203345e55e608a7495f">value</a>.str);
<a name="l00246"></a>00246             <span class="keywordflow">break</span>;
<a name="l00247"></a>00247         <span class="keywordflow">case</span> JackDriverParamBool:
<a name="l00248"></a>00248             jackctl_type = <a class="code" href="control_8h.html#ac71832cf5445a694a178d15345d67840a766feed3831809abe9b67872086f241f" title="value type is a boolean">JackParamBool</a>;
<a name="l00249"></a>00249             jackctl_value.b = descriptor_ptr-&gt;<a class="code" href="structjack__driver__param__desc__t.html#a817eb04d0ccf7203345e55e608a7495f">value</a>.i;
<a name="l00250"></a>00250             <span class="keywordflow">break</span>;
<a name="l00251"></a>00251         <span class="keywordflow">default</span>:
<a name="l00252"></a>00252             <a class="code" href="group__ServerControl.html#gac6448626e0b75fc6d9da1ccbdca0355e">jack_error</a>(<span class="stringliteral">&quot;unknown driver parameter type %i&quot;</span>, (<span class="keywordtype">int</span>)descriptor_ptr-&gt;<a class="code" href="structjack__driver__param__desc__t.html#a1f7d08207a0c3285329a0bc7a7e6c59e">type</a>);
<a name="l00253"></a>00253             assert(0);
<a name="l00254"></a>00254             <span class="keywordflow">goto</span> fail;
<a name="l00255"></a>00255         }
<a name="l00256"></a>00256 
<a name="l00257"></a>00257         parameter_ptr = jackctl_add_parameter(
<a name="l00258"></a>00258             &amp;driver_ptr-&gt;parameters,
<a name="l00259"></a>00259             descriptor_ptr-&gt;<a class="code" href="structjack__driver__param__desc__t.html#a4cf775ccfc72358ffbec7adf2800e532">name</a>,
<a name="l00260"></a>00260             descriptor_ptr-&gt;<a class="code" href="structjack__driver__param__desc__t.html#acf46bb8d0507e06d2cae119eb87babe4">short_desc</a>,
<a name="l00261"></a>00261             descriptor_ptr-&gt;<a class="code" href="structjack__driver__param__desc__t.html#ac853d853d09f7fa3363b1f23b7bae5f1">long_desc</a>,
<a name="l00262"></a>00262             jackctl_type,
<a name="l00263"></a>00263             NULL,
<a name="l00264"></a>00264             NULL,
<a name="l00265"></a>00265             jackctl_value,
<a name="l00266"></a>00266             descriptor_ptr-&gt;<a class="code" href="structjack__driver__param__desc__t.html#a41d19796d0b7342bd6ab2ecf3251f5d7">constraint</a>);
<a name="l00267"></a>00267 
<a name="l00268"></a>00268         <span class="keywordflow">if</span> (parameter_ptr == NULL)
<a name="l00269"></a>00269         {
<a name="l00270"></a>00270             <span class="keywordflow">goto</span> fail;
<a name="l00271"></a>00271         }
<a name="l00272"></a>00272 
<a name="l00273"></a>00273         parameter_ptr-&gt;driver_ptr = driver_ptr;
<a name="l00274"></a>00274         parameter_ptr-&gt;id = descriptor_ptr-&gt;<a class="code" href="structjack__driver__param__desc__t.html#a0d80d0f9092d4fdaba7a3e37f82f3313">character</a>;
<a name="l00275"></a>00275     }
<a name="l00276"></a>00276 
<a name="l00277"></a>00277     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00278"></a>00278 
<a name="l00279"></a>00279 fail:
<a name="l00280"></a>00280     jackctl_free_driver_parameters(driver_ptr);
<a name="l00281"></a>00281 
<a name="l00282"></a>00282     <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00283"></a>00283 }
<a name="l00284"></a>00284 
<a name="l00285"></a>00285 <span class="keyword">static</span> <span class="keywordtype">int</span>
<a name="l00286"></a>00286 jackctl_drivers_load(
<a name="l00287"></a>00287     <span class="keyword">struct</span> <a class="code" href="structjackctl__server.html">jackctl_server</a> * server_ptr)
<a name="l00288"></a>00288 {
<a name="l00289"></a>00289     <span class="keyword">struct </span><a class="code" href="structjackctl__driver.html">jackctl_driver</a> * driver_ptr;
<a name="l00290"></a>00290     <a class="code" href="struct__JSList.html">JSList</a> *node_ptr;
<a name="l00291"></a>00291     <a class="code" href="struct__JSList.html">JSList</a> *descriptor_node_ptr;
<a name="l00292"></a>00292 
<a name="l00293"></a>00293     descriptor_node_ptr = jack_drivers_load(NULL);
<a name="l00294"></a>00294     <span class="keywordflow">if</span> (descriptor_node_ptr == NULL)
<a name="l00295"></a>00295     {
<a name="l00296"></a>00296         <a class="code" href="group__ServerControl.html#gac6448626e0b75fc6d9da1ccbdca0355e">jack_error</a>(<span class="stringliteral">&quot;could not find any drivers in driver directory!&quot;</span>);
<a name="l00297"></a>00297         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00298"></a>00298     }
<a name="l00299"></a>00299 
<a name="l00300"></a>00300     <span class="keywordflow">while</span> (descriptor_node_ptr != NULL)
<a name="l00301"></a>00301     {
<a name="l00302"></a>00302         driver_ptr = (<span class="keyword">struct </span><a class="code" href="structjackctl__driver.html">jackctl_driver</a> *)malloc(<span class="keyword">sizeof</span>(<span class="keyword">struct</span> <a class="code" href="structjackctl__driver.html">jackctl_driver</a>));
<a name="l00303"></a>00303         <span class="keywordflow">if</span> (driver_ptr == NULL)
<a name="l00304"></a>00304         {
<a name="l00305"></a>00305             <a class="code" href="group__ServerControl.html#gac6448626e0b75fc6d9da1ccbdca0355e">jack_error</a>(<span class="stringliteral">&quot;memory allocation of jackctl_driver structure failed.&quot;</span>);
<a name="l00306"></a>00306             <span class="keywordflow">goto</span> next;
<a name="l00307"></a>00307         }
<a name="l00308"></a>00308 
<a name="l00309"></a>00309         driver_ptr-&gt;desc_ptr = (<a class="code" href="structjack__driver__desc__t.html">jack_driver_desc_t</a> *)descriptor_node_ptr-&gt;data;
<a name="l00310"></a>00310         driver_ptr-&gt;parameters = NULL;
<a name="l00311"></a>00311         driver_ptr-&gt;set_parameters = NULL;
<a name="l00312"></a>00312 
<a name="l00313"></a>00313         if (!jackctl_add_driver_parameters(driver_ptr))
<a name="l00314"></a>00314         {
<a name="l00315"></a>00315             assert(driver_ptr-&gt;parameters == NULL);
<a name="l00316"></a>00316             free(driver_ptr);
<a name="l00317"></a>00317             <span class="keywordflow">goto</span> next;
<a name="l00318"></a>00318         }
<a name="l00319"></a>00319 
<a name="l00320"></a>00320         server_ptr-&gt;drivers = jack_slist_append(server_ptr-&gt;drivers, driver_ptr);
<a name="l00321"></a>00321 
<a name="l00322"></a>00322     next:
<a name="l00323"></a>00323         node_ptr = descriptor_node_ptr;
<a name="l00324"></a>00324         descriptor_node_ptr = descriptor_node_ptr-&gt;next;
<a name="l00325"></a>00325         free(node_ptr);
<a name="l00326"></a>00326     }
<a name="l00327"></a>00327 
<a name="l00328"></a>00328     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00329"></a>00329 }
<a name="l00330"></a>00330 
<a name="l00331"></a>00331 <span class="keyword">static</span>
<a name="l00332"></a>00332 <span class="keywordtype">void</span>
<a name="l00333"></a>00333 jackctl_server_free_drivers(
<a name="l00334"></a>00334     <span class="keyword">struct</span> <a class="code" href="structjackctl__server.html">jackctl_server</a> * server_ptr)
<a name="l00335"></a>00335 {
<a name="l00336"></a>00336     <a class="code" href="struct__JSList.html">JSList</a> * next_node_ptr;
<a name="l00337"></a>00337     <span class="keyword">struct </span><a class="code" href="structjackctl__driver.html">jackctl_driver</a> * driver_ptr;
<a name="l00338"></a>00338 
<a name="l00339"></a>00339     <span class="keywordflow">while</span> (server_ptr-&gt;drivers)
<a name="l00340"></a>00340     {
<a name="l00341"></a>00341         next_node_ptr = server_ptr-&gt;drivers-&gt;next;
<a name="l00342"></a>00342         driver_ptr = (<span class="keyword">struct </span><a class="code" href="structjackctl__driver.html">jackctl_driver</a> *)server_ptr-&gt;drivers-&gt;data;
<a name="l00343"></a>00343 
<a name="l00344"></a>00344         jackctl_free_driver_parameters(driver_ptr);
<a name="l00345"></a>00345         free(driver_ptr-&gt;desc_ptr-&gt;<a class="code" href="structjack__driver__desc__t.html#a4adfdb11fdfa44a5154da9ac971bb44c">params</a>);
<a name="l00346"></a>00346         free(driver_ptr-&gt;desc_ptr);
<a name="l00347"></a>00347         free(driver_ptr);
<a name="l00348"></a>00348 
<a name="l00349"></a>00349         free(server_ptr-&gt;drivers);
<a name="l00350"></a>00350         server_ptr-&gt;drivers = next_node_ptr;
<a name="l00351"></a>00351     }
<a name="l00352"></a>00352 }
<a name="l00353"></a>00353 
<a name="l00354"></a>00354 <span class="keyword">static</span> <span class="keywordtype">int</span>
<a name="l00355"></a>00355 jackctl_internals_load(
<a name="l00356"></a>00356     <span class="keyword">struct</span> <a class="code" href="structjackctl__server.html">jackctl_server</a> * server_ptr)
<a name="l00357"></a>00357 {
<a name="l00358"></a>00358     <span class="keyword">struct </span><a class="code" href="structjackctl__internal.html">jackctl_internal</a> * internal_ptr;
<a name="l00359"></a>00359     <a class="code" href="struct__JSList.html">JSList</a> *node_ptr;
<a name="l00360"></a>00360     <a class="code" href="struct__JSList.html">JSList</a> *descriptor_node_ptr;
<a name="l00361"></a>00361 
<a name="l00362"></a>00362     descriptor_node_ptr = jack_internals_load(NULL);
<a name="l00363"></a>00363     <span class="keywordflow">if</span> (descriptor_node_ptr == NULL)
<a name="l00364"></a>00364     {
<a name="l00365"></a>00365         <a class="code" href="group__ServerControl.html#gac6448626e0b75fc6d9da1ccbdca0355e">jack_error</a>(<span class="stringliteral">&quot;could not find any internals in driver directory!&quot;</span>);
<a name="l00366"></a>00366         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00367"></a>00367     }
<a name="l00368"></a>00368 
<a name="l00369"></a>00369     <span class="keywordflow">while</span> (descriptor_node_ptr != NULL)
<a name="l00370"></a>00370     {
<a name="l00371"></a>00371         internal_ptr = (<span class="keyword">struct </span><a class="code" href="structjackctl__internal.html">jackctl_internal</a> *)malloc(<span class="keyword">sizeof</span>(<span class="keyword">struct</span> <a class="code" href="structjackctl__internal.html">jackctl_internal</a>));
<a name="l00372"></a>00372         <span class="keywordflow">if</span> (internal_ptr == NULL)
<a name="l00373"></a>00373         {
<a name="l00374"></a>00374             <a class="code" href="group__ServerControl.html#gac6448626e0b75fc6d9da1ccbdca0355e">jack_error</a>(<span class="stringliteral">&quot;memory allocation of jackctl_driver structure failed.&quot;</span>);
<a name="l00375"></a>00375             <span class="keywordflow">goto</span> next;
<a name="l00376"></a>00376         }
<a name="l00377"></a>00377 
<a name="l00378"></a>00378         internal_ptr-&gt;desc_ptr = (<a class="code" href="structjack__driver__desc__t.html">jack_driver_desc_t</a> *)descriptor_node_ptr-&gt;data;
<a name="l00379"></a>00379         internal_ptr-&gt;parameters = NULL;
<a name="l00380"></a>00380         internal_ptr-&gt;set_parameters = NULL;
<a name="l00381"></a>00381 
<a name="l00382"></a>00382         if (!jackctl_add_driver_parameters((<span class="keyword">struct</span> <a class="code" href="structjackctl__driver.html">jackctl_driver</a> *)internal_ptr))
<a name="l00383"></a>00383         {
<a name="l00384"></a>00384             assert(internal_ptr-&gt;parameters == NULL);
<a name="l00385"></a>00385             free(internal_ptr);
<a name="l00386"></a>00386             <span class="keywordflow">goto</span> next;
<a name="l00387"></a>00387         }
<a name="l00388"></a>00388 
<a name="l00389"></a>00389         server_ptr-&gt;internals = jack_slist_append(server_ptr-&gt;internals, internal_ptr);
<a name="l00390"></a>00390 
<a name="l00391"></a>00391     next:
<a name="l00392"></a>00392         node_ptr = descriptor_node_ptr;
<a name="l00393"></a>00393         descriptor_node_ptr = descriptor_node_ptr-&gt;next;
<a name="l00394"></a>00394         free(node_ptr);
<a name="l00395"></a>00395     }
<a name="l00396"></a>00396 
<a name="l00397"></a>00397     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00398"></a>00398 }
<a name="l00399"></a>00399 
<a name="l00400"></a>00400 <span class="keyword">static</span>
<a name="l00401"></a>00401 <span class="keywordtype">void</span>
<a name="l00402"></a>00402 jackctl_server_free_internals(
<a name="l00403"></a>00403     <span class="keyword">struct</span> <a class="code" href="structjackctl__server.html">jackctl_server</a> * server_ptr)
<a name="l00404"></a>00404 {
<a name="l00405"></a>00405     <a class="code" href="struct__JSList.html">JSList</a> * next_node_ptr;
<a name="l00406"></a>00406     <span class="keyword">struct </span><a class="code" href="structjackctl__internal.html">jackctl_internal</a> * internal_ptr;
<a name="l00407"></a>00407 
<a name="l00408"></a>00408     <span class="keywordflow">while</span> (server_ptr-&gt;internals)
<a name="l00409"></a>00409     {
<a name="l00410"></a>00410         next_node_ptr = server_ptr-&gt;internals-&gt;next;
<a name="l00411"></a>00411         internal_ptr = (<span class="keyword">struct </span><a class="code" href="structjackctl__internal.html">jackctl_internal</a> *)server_ptr-&gt;internals-&gt;data;
<a name="l00412"></a>00412 
<a name="l00413"></a>00413         jackctl_free_driver_parameters((<span class="keyword">struct</span> <a class="code" href="structjackctl__driver.html">jackctl_driver</a> *)internal_ptr);
<a name="l00414"></a>00414         free(internal_ptr-&gt;desc_ptr-&gt;<a class="code" href="structjack__driver__desc__t.html#a4adfdb11fdfa44a5154da9ac971bb44c">params</a>);
<a name="l00415"></a>00415         free(internal_ptr-&gt;desc_ptr);
<a name="l00416"></a>00416         free(internal_ptr);
<a name="l00417"></a>00417 
<a name="l00418"></a>00418         free(server_ptr-&gt;internals);
<a name="l00419"></a>00419         server_ptr-&gt;internals = next_node_ptr;
<a name="l00420"></a>00420     }
<a name="l00421"></a>00421 }
<a name="l00422"></a>00422 
<a name="l00423"></a>00423 <span class="keyword">static</span>
<a name="l00424"></a>00424 <span class="keywordtype">void</span>
<a name="l00425"></a>00425 jackctl_server_free_parameters(
<a name="l00426"></a>00426     <span class="keyword">struct</span> <a class="code" href="structjackctl__server.html">jackctl_server</a> * server_ptr)
<a name="l00427"></a>00427 {
<a name="l00428"></a>00428     <a class="code" href="struct__JSList.html">JSList</a> * next_node_ptr;
<a name="l00429"></a>00429 
<a name="l00430"></a>00430     <span class="keywordflow">while</span> (server_ptr-&gt;parameters)
<a name="l00431"></a>00431     {
<a name="l00432"></a>00432         next_node_ptr = server_ptr-&gt;parameters-&gt;next;
<a name="l00433"></a>00433         free(server_ptr-&gt;parameters-&gt;data);
<a name="l00434"></a>00434         free(server_ptr-&gt;parameters);
<a name="l00435"></a>00435         server_ptr-&gt;parameters = next_node_ptr;
<a name="l00436"></a>00436     }
<a name="l00437"></a>00437 }
<a name="l00438"></a>00438 
<a name="l00439"></a>00439 <span class="preprocessor">#ifdef WIN32</span>
<a name="l00440"></a>00440 <span class="preprocessor"></span>
<a name="l00441"></a>00441 <span class="keyword">static</span> HANDLE waitEvent;
<a name="l00442"></a>00442 
<a name="l00443"></a>00443 <span class="keyword">static</span> <span class="keywordtype">void</span> do_nothing_handler(<span class="keywordtype">int</span> signum)
<a name="l00444"></a>00444 {
<a name="l00445"></a>00445     printf(<span class="stringliteral">&quot;jack main caught signal %d\n&quot;</span>, signum);
<a name="l00446"></a>00446     (void) signal(SIGINT, SIG_DFL);
<a name="l00447"></a>00447     SetEvent(waitEvent);
<a name="l00448"></a>00448 }
<a name="l00449"></a>00449 
<a name="l00450"></a>00450 sigset_t
<a name="l00451"></a>00451 <a class="code" href="group__ServerControl.html#gaaf1bee06690f756a6ffb463580590518">jackctl_setup_signals</a>(
<a name="l00452"></a>00452     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> flags)
<a name="l00453"></a>00453 {
<a name="l00454"></a>00454     <span class="keywordflow">if</span> ((waitEvent = CreateEvent(NULL, FALSE, FALSE, NULL)) == NULL) {
<a name="l00455"></a>00455         <a class="code" href="group__ServerControl.html#gac6448626e0b75fc6d9da1ccbdca0355e">jack_error</a>(<span class="stringliteral">&quot;CreateEvent fails err = %ld&quot;</span>, GetLastError());
<a name="l00456"></a>00456         <span class="keywordflow">return</span> 0;
<a name="l00457"></a>00457     }
<a name="l00458"></a>00458 
<a name="l00459"></a>00459     (void) signal(SIGINT, do_nothing_handler);
<a name="l00460"></a>00460     (void) signal(SIGABRT, do_nothing_handler);
<a name="l00461"></a>00461     (void) signal(SIGTERM, do_nothing_handler);
<a name="l00462"></a>00462 
<a name="l00463"></a>00463     <span class="keywordflow">return</span> (sigset_t)waitEvent;
<a name="l00464"></a>00464 }
<a name="l00465"></a>00465 
<a name="l00466"></a>00466 <span class="keywordtype">void</span> <a class="code" href="group__ServerControl.html#ga90d8e0221779a24483fe4f4cce775d51">jackctl_wait_signals</a>(sigset_t signals)
<a name="l00467"></a>00467 {
<a name="l00468"></a>00468     <span class="keywordflow">if</span> (WaitForSingleObject(waitEvent, INFINITE) != WAIT_OBJECT_0) {
<a name="l00469"></a>00469         <a class="code" href="group__ServerControl.html#gac6448626e0b75fc6d9da1ccbdca0355e">jack_error</a>(<span class="stringliteral">&quot;WaitForSingleObject fails err = %ld&quot;</span>, GetLastError());
<a name="l00470"></a>00470     }
<a name="l00471"></a>00471 }
<a name="l00472"></a>00472 
<a name="l00473"></a>00473 <span class="preprocessor">#else</span>
<a name="l00474"></a>00474 <span class="preprocessor"></span>
<a name="l00475"></a>00475 <span class="keyword">static</span>
<a name="l00476"></a>00476 <span class="keywordtype">void</span>
<a name="l00477"></a>00477 do_nothing_handler(<span class="keywordtype">int</span> sig)
<a name="l00478"></a>00478 {
<a name="l00479"></a>00479     <span class="comment">/* this is used by the child (active) process, but it never</span>
<a name="l00480"></a>00480 <span class="comment">       gets called unless we are already shutting down after</span>
<a name="l00481"></a>00481 <span class="comment">       another signal.</span>
<a name="l00482"></a>00482 <span class="comment">    */</span>
<a name="l00483"></a>00483     <span class="keywordtype">char</span> buf[64];
<a name="l00484"></a>00484     snprintf (buf, <span class="keyword">sizeof</span>(buf), <span class="stringliteral">&quot;received signal %d during shutdown (ignored)\n&quot;</span>, sig);
<a name="l00485"></a>00485 }
<a name="l00486"></a>00486 
<a name="l00487"></a>00487 EXPORT sigset_t
<a name="l00488"></a><a class="code" href="group__ServerControl.html#gaaf1bee06690f756a6ffb463580590518">00488</a> <a class="code" href="group__ServerControl.html#gaaf1bee06690f756a6ffb463580590518">jackctl_setup_signals</a>(
<a name="l00489"></a>00489     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> flags)
<a name="l00490"></a>00490 {
<a name="l00491"></a>00491     sigset_t signals;
<a name="l00492"></a>00492     sigset_t allsignals;
<a name="l00493"></a>00493     <span class="keyword">struct </span>sigaction action;
<a name="l00494"></a>00494     <span class="keywordtype">int</span> i;
<a name="l00495"></a>00495 
<a name="l00496"></a>00496     <span class="comment">/* ensure that we are in our own process group so that</span>
<a name="l00497"></a>00497 <span class="comment">       kill (SIG, -pgrp) does the right thing.</span>
<a name="l00498"></a>00498 <span class="comment">    */</span>
<a name="l00499"></a>00499 
<a name="l00500"></a>00500     setsid();
<a name="l00501"></a>00501 
<a name="l00502"></a>00502     pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
<a name="l00503"></a>00503 
<a name="l00504"></a>00504     <span class="comment">/* what&#39;s this for?</span>
<a name="l00505"></a>00505 <span class="comment"></span>
<a name="l00506"></a>00506 <span class="comment">       POSIX says that signals are delivered like this:</span>
<a name="l00507"></a>00507 <span class="comment"></span>
<a name="l00508"></a>00508 <span class="comment">       * if a thread has blocked that signal, it is not</span>
<a name="l00509"></a>00509 <span class="comment">           a candidate to receive the signal.</span>
<a name="l00510"></a>00510 <span class="comment">           * of all threads not blocking the signal, pick</span>
<a name="l00511"></a>00511 <span class="comment">           one at random, and deliver the signal.</span>
<a name="l00512"></a>00512 <span class="comment"></span>
<a name="l00513"></a>00513 <span class="comment">           this means that a simple-minded multi-threaded program can</span>
<a name="l00514"></a>00514 <span class="comment">           expect to get POSIX signals delivered randomly to any one</span>
<a name="l00515"></a>00515 <span class="comment">           of its threads,</span>
<a name="l00516"></a>00516 <span class="comment"></span>
<a name="l00517"></a>00517 <span class="comment">       here, we block all signals that we think we might receive</span>
<a name="l00518"></a>00518 <span class="comment">       and want to catch. all &quot;child&quot; threads will inherit this</span>
<a name="l00519"></a>00519 <span class="comment">       setting. if we create a thread that calls sigwait() on the</span>
<a name="l00520"></a>00520 <span class="comment">       same set of signals, implicitly unblocking all those</span>
<a name="l00521"></a>00521 <span class="comment">       signals. any of those signals that are delivered to the</span>
<a name="l00522"></a>00522 <span class="comment">       process will be delivered to that thread, and that thread</span>
<a name="l00523"></a>00523 <span class="comment">       alone. this makes cleanup for a signal-driven exit much</span>
<a name="l00524"></a>00524 <span class="comment">       easier, since we know which thread is doing it and more</span>
<a name="l00525"></a>00525 <span class="comment">       importantly, we are free to call async-unsafe functions,</span>
<a name="l00526"></a>00526 <span class="comment">       because the code is executing in normal thread context</span>
<a name="l00527"></a>00527 <span class="comment">       after a return from sigwait().</span>
<a name="l00528"></a>00528 <span class="comment">    */</span>
<a name="l00529"></a>00529 
<a name="l00530"></a>00530     sigemptyset(&amp;signals);
<a name="l00531"></a>00531     sigaddset(&amp;signals, SIGHUP);
<a name="l00532"></a>00532     sigaddset(&amp;signals, SIGINT);
<a name="l00533"></a>00533     sigaddset(&amp;signals, SIGQUIT);
<a name="l00534"></a>00534     sigaddset(&amp;signals, SIGPIPE);
<a name="l00535"></a>00535     sigaddset(&amp;signals, SIGTERM);
<a name="l00536"></a>00536     sigaddset(&amp;signals, SIGUSR1);
<a name="l00537"></a>00537     sigaddset(&amp;signals, SIGUSR2);
<a name="l00538"></a>00538 
<a name="l00539"></a>00539     <span class="comment">/* all child threads will inherit this mask unless they</span>
<a name="l00540"></a>00540 <span class="comment">     * explicitly reset it</span>
<a name="l00541"></a>00541 <span class="comment">     */</span>
<a name="l00542"></a>00542 
<a name="l00543"></a>00543     pthread_sigmask(SIG_BLOCK, &amp;signals, 0);
<a name="l00544"></a>00544 
<a name="l00545"></a>00545     <span class="comment">/* install a do-nothing handler because otherwise pthreads</span>
<a name="l00546"></a>00546 <span class="comment">       behaviour is undefined when we enter sigwait.</span>
<a name="l00547"></a>00547 <span class="comment">    */</span>
<a name="l00548"></a>00548 
<a name="l00549"></a>00549     sigfillset(&amp;allsignals);
<a name="l00550"></a>00550     action.sa_handler = do_nothing_handler;
<a name="l00551"></a>00551     action.sa_mask = allsignals;
<a name="l00552"></a>00552     action.sa_flags = SA_RESTART|SA_RESETHAND;
<a name="l00553"></a>00553 
<a name="l00554"></a>00554     <span class="keywordflow">for</span> (i = 1; i &lt; NSIG; i++)
<a name="l00555"></a>00555     {
<a name="l00556"></a>00556         <span class="keywordflow">if</span> (sigismember (&amp;signals, i))
<a name="l00557"></a>00557         {
<a name="l00558"></a>00558             sigaction(i, &amp;action, 0);
<a name="l00559"></a>00559         }
<a name="l00560"></a>00560     }
<a name="l00561"></a>00561 
<a name="l00562"></a>00562     <span class="keywordflow">return</span> signals;
<a name="l00563"></a>00563 }
<a name="l00564"></a>00564 
<a name="l00565"></a>00565 EXPORT <span class="keywordtype">void</span>
<a name="l00566"></a><a class="code" href="group__ServerControl.html#ga90d8e0221779a24483fe4f4cce775d51">00566</a> <a class="code" href="group__ServerControl.html#ga90d8e0221779a24483fe4f4cce775d51">jackctl_wait_signals</a>(sigset_t signals)
<a name="l00567"></a>00567 {
<a name="l00568"></a>00568     <span class="keywordtype">int</span> sig;
<a name="l00569"></a>00569     <span class="keywordtype">bool</span> waiting = <span class="keyword">true</span>;
<a name="l00570"></a>00570 
<a name="l00571"></a>00571     <span class="keywordflow">while</span> (waiting) {
<a name="l00572"></a>00572 <span class="preprocessor">    #if defined(sun) &amp;&amp; !defined(__sun__) // SUN compiler only, to check</span>
<a name="l00573"></a>00573 <span class="preprocessor"></span>        sigwait(&amp;signals);
<a name="l00574"></a>00574 <span class="preprocessor">    #else</span>
<a name="l00575"></a>00575 <span class="preprocessor"></span>        sigwait(&amp;signals, &amp;sig);
<a name="l00576"></a>00576 <span class="preprocessor">    #endif</span>
<a name="l00577"></a>00577 <span class="preprocessor"></span>        fprintf(stderr, <span class="stringliteral">&quot;jack main caught signal %d\n&quot;</span>, sig);
<a name="l00578"></a>00578 
<a name="l00579"></a>00579         <span class="keywordflow">switch</span> (sig) {
<a name="l00580"></a>00580             <span class="keywordflow">case</span> SIGUSR1:
<a name="l00581"></a>00581                 <span class="comment">//jack_dump_configuration(engine, 1);</span>
<a name="l00582"></a>00582                 <span class="keywordflow">break</span>;
<a name="l00583"></a>00583             <span class="keywordflow">case</span> SIGUSR2:
<a name="l00584"></a>00584                 <span class="comment">// driver exit</span>
<a name="l00585"></a>00585                 waiting = <span class="keyword">false</span>;
<a name="l00586"></a>00586                 <span class="keywordflow">break</span>;
<a name="l00587"></a>00587             <span class="keywordflow">case</span> SIGTTOU:
<a name="l00588"></a>00588                 <span class="keywordflow">break</span>;
<a name="l00589"></a>00589             <span class="keywordflow">default</span>:
<a name="l00590"></a>00590                 waiting = <span class="keyword">false</span>;
<a name="l00591"></a>00591                 <span class="keywordflow">break</span>;
<a name="l00592"></a>00592         }
<a name="l00593"></a>00593     }
<a name="l00594"></a>00594 
<a name="l00595"></a>00595     <span class="keywordflow">if</span> (sig != SIGSEGV) {
<a name="l00596"></a>00596         <span class="comment">// unblock signals so we can see them during shutdown.</span>
<a name="l00597"></a>00597         <span class="comment">// this will help prod developers not to lose sight of</span>
<a name="l00598"></a>00598         <span class="comment">// bugs that cause segfaults etc. during shutdown.</span>
<a name="l00599"></a>00599         sigprocmask(SIG_UNBLOCK, &amp;signals, 0);
<a name="l00600"></a>00600     }
<a name="l00601"></a>00601 }
<a name="l00602"></a>00602 <span class="preprocessor">#endif</span>
<a name="l00603"></a>00603 <span class="preprocessor"></span>
<a name="l00604"></a>00604 <span class="keyword">static</span>
<a name="l00605"></a>00605 <a class="code" href="structjack__driver__param__constraint__desc__t.html">jack_driver_param_constraint_desc_t</a> *
<a name="l00606"></a>00606 get_realtime_priority_constraint()
<a name="l00607"></a>00607 {
<a name="l00608"></a>00608     <a class="code" href="structjack__driver__param__constraint__desc__t.html">jack_driver_param_constraint_desc_t</a> * constraint_ptr;
<a name="l00609"></a>00609     <span class="keywordtype">int</span> min, max;
<a name="l00610"></a>00610 
<a name="l00611"></a>00611     <span class="keywordflow">if</span> (!jack_get_thread_realtime_priority_range(&amp;min, &amp;max))
<a name="l00612"></a>00612     {
<a name="l00613"></a>00613         <span class="keywordflow">return</span> NULL;
<a name="l00614"></a>00614     }
<a name="l00615"></a>00615 
<a name="l00616"></a>00616     <span class="comment">//jack_info(&quot;realtime priority range is (%d,%d)&quot;, min, max);</span>
<a name="l00617"></a>00617 
<a name="l00618"></a>00618     constraint_ptr = (<a class="code" href="structjack__driver__param__constraint__desc__t.html">jack_driver_param_constraint_desc_t</a> *)calloc(1, <span class="keyword">sizeof</span>(<a class="code" href="structjack__driver__param__value__enum__t.html">jack_driver_param_value_enum_t</a>));
<a name="l00619"></a>00619     <span class="keywordflow">if</span> (constraint_ptr == NULL)
<a name="l00620"></a>00620     {
<a name="l00621"></a>00621         <a class="code" href="group__ServerControl.html#gac6448626e0b75fc6d9da1ccbdca0355e">jack_error</a>(<span class="stringliteral">&quot;Cannot allocate memory for jack_driver_param_constraint_desc_t structure.&quot;</span>);
<a name="l00622"></a>00622         <span class="keywordflow">return</span> NULL;
<a name="l00623"></a>00623     }
<a name="l00624"></a>00624     constraint_ptr-&gt;<a class="code" href="structjack__driver__param__constraint__desc__t.html#aedd94c67d95bdfbaafc4e90931804c2a">flags</a> = JACK_CONSTRAINT_FLAG_RANGE;
<a name="l00625"></a>00625 
<a name="l00626"></a>00626     constraint_ptr-&gt;constraint.<a class="code" href="structjack__driver__param__constraint__desc__t.html#ad4093c0243f0c28f2350cdfbf41ca96e">range</a>.min.i = min;
<a name="l00627"></a>00627     constraint_ptr-&gt;constraint.<a class="code" href="structjack__driver__param__constraint__desc__t.html#ad4093c0243f0c28f2350cdfbf41ca96e">range</a>.max.i = max;
<a name="l00628"></a>00628 
<a name="l00629"></a>00629     <span class="keywordflow">return</span> constraint_ptr;
<a name="l00630"></a>00630 }
<a name="l00631"></a>00631 
<a name="l00632"></a><a class="code" href="group__ServerControl.html#ga8b8c36f1be47c0d582e36ee2ea21e7bb">00632</a> EXPORT <a class="code" href="structjackctl__server.html">jackctl_server_t</a> * <a class="code" href="group__ServerControl.html#ga8b8c36f1be47c0d582e36ee2ea21e7bb">jackctl_server_create</a>(
<a name="l00633"></a>00633     <span class="keywordtype">bool</span> (* on_device_acquire)(<span class="keyword">const</span> <span class="keywordtype">char</span> * device_name),
<a name="l00634"></a>00634     <span class="keywordtype">void</span> (* on_device_release)(<span class="keyword">const</span> <span class="keywordtype">char</span> * device_name))
<a name="l00635"></a>00635 {
<a name="l00636"></a>00636     <span class="keyword">struct </span><a class="code" href="structjackctl__server.html">jackctl_server</a> * server_ptr;
<a name="l00637"></a>00637     <span class="keyword">union </span><a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> value;
<a name="l00638"></a>00638 
<a name="l00639"></a>00639     server_ptr = (<span class="keyword">struct </span><a class="code" href="structjackctl__server.html">jackctl_server</a> *)malloc(<span class="keyword">sizeof</span>(<span class="keyword">struct</span> <a class="code" href="structjackctl__server.html">jackctl_server</a>));
<a name="l00640"></a>00640     <span class="keywordflow">if</span> (server_ptr == NULL)
<a name="l00641"></a>00641     {
<a name="l00642"></a>00642         <a class="code" href="group__ServerControl.html#gac6448626e0b75fc6d9da1ccbdca0355e">jack_error</a>(<span class="stringliteral">&quot;Cannot allocate memory for jackctl_server structure.&quot;</span>);
<a name="l00643"></a>00643         <span class="keywordflow">goto</span> fail;
<a name="l00644"></a>00644     }
<a name="l00645"></a>00645 
<a name="l00646"></a>00646     server_ptr-&gt;drivers = NULL;
<a name="l00647"></a>00647     server_ptr-&gt;internals = NULL;
<a name="l00648"></a>00648     server_ptr-&gt;parameters = NULL;
<a name="l00649"></a>00649     server_ptr-&gt;engine = NULL;
<a name="l00650"></a>00650 
<a name="l00651"></a>00651     strcpy(value.<a class="code" href="unionjackctl__parameter__value.html#adb7c766a89a9d377f11395fb9cc9c53b" title="member used for JackParamString">str</a>, JACK_DEFAULT_SERVER_NAME);
<a name="l00652"></a>00652     <span class="keywordflow">if</span> (jackctl_add_parameter(
<a name="l00653"></a>00653             &amp;server_ptr-&gt;parameters,
<a name="l00654"></a>00654             <span class="stringliteral">&quot;name&quot;</span>,
<a name="l00655"></a>00655             <span class="stringliteral">&quot;Server name to use.&quot;</span>,
<a name="l00656"></a>00656             <span class="stringliteral">&quot;&quot;</span>,
<a name="l00657"></a>00657             <a class="code" href="control_8h.html#ac71832cf5445a694a178d15345d67840aabd8d7557b32d28d8bc7c22449a74b0b" title="value type is a string with max size of JACK_PARAM_STRING_MAX+1 chars">JackParamString</a>,
<a name="l00658"></a>00658             &amp;server_ptr-&gt;name,
<a name="l00659"></a>00659             &amp;server_ptr-&gt;default_name,
<a name="l00660"></a>00660             value) == NULL)
<a name="l00661"></a>00661     {
<a name="l00662"></a>00662         <span class="keywordflow">goto</span> fail_free_parameters;
<a name="l00663"></a>00663     }
<a name="l00664"></a>00664 
<a name="l00665"></a>00665     value.<a class="code" href="unionjackctl__parameter__value.html#a9765ef8c57c7b9993c645e985cc4a75d" title="member used for JackParamBool">b</a> = <span class="keyword">false</span>;
<a name="l00666"></a>00666     <span class="keywordflow">if</span> (jackctl_add_parameter(
<a name="l00667"></a>00667             &amp;server_ptr-&gt;parameters,
<a name="l00668"></a>00668             <span class="stringliteral">&quot;realtime&quot;</span>,
<a name="l00669"></a>00669             <span class="stringliteral">&quot;Whether to use realtime mode.&quot;</span>,
<a name="l00670"></a>00670             <span class="stringliteral">&quot;Use realtime scheduling. This is needed for reliable low-latency performance. On most systems, it requires JACK to run with special scheduler and memory allocation privileges, which may be obtained in several ways. On Linux you should use PAM.&quot;</span>,
<a name="l00671"></a>00671             <a class="code" href="control_8h.html#ac71832cf5445a694a178d15345d67840a766feed3831809abe9b67872086f241f" title="value type is a boolean">JackParamBool</a>,
<a name="l00672"></a>00672             &amp;server_ptr-&gt;realtime,
<a name="l00673"></a>00673             &amp;server_ptr-&gt;default_realtime,
<a name="l00674"></a>00674             value) == NULL)
<a name="l00675"></a>00675     {
<a name="l00676"></a>00676         <span class="keywordflow">goto</span> fail_free_parameters;
<a name="l00677"></a>00677     }
<a name="l00678"></a>00678 
<a name="l00679"></a>00679     <span class="keyword">struct </span>utsname utsname;
<a name="l00680"></a>00680     <span class="keywordtype">int</span> success;
<a name="l00681"></a>00681     success = uname( &amp;utsname );
<a name="l00682"></a>00682     <span class="keywordflow">if</span>( success == 0 &amp;&amp; strstr( utsname.version, <span class="stringliteral">&quot;PREEMPT RT&quot;</span> ) )
<a name="l00683"></a>00683         value.<a class="code" href="unionjackctl__parameter__value.html#a34bd19127b1d1f1b45dd62557052ed3f" title="member used for JackParamInt">i</a> = 60;
<a name="l00684"></a>00684     <span class="keywordflow">else</span>
<a name="l00685"></a>00685         value.<a class="code" href="unionjackctl__parameter__value.html#a34bd19127b1d1f1b45dd62557052ed3f" title="member used for JackParamInt">i</a> = 20;
<a name="l00686"></a>00686     <span class="keywordflow">if</span> (jackctl_add_parameter(
<a name="l00687"></a>00687             &amp;server_ptr-&gt;parameters,
<a name="l00688"></a>00688             <span class="stringliteral">&quot;realtime-priority&quot;</span>,
<a name="l00689"></a>00689             <span class="stringliteral">&quot;Scheduler priority when running in realtime mode.&quot;</span>,
<a name="l00690"></a>00690             <span class="stringliteral">&quot;&quot;</span>,
<a name="l00691"></a>00691             <a class="code" href="control_8h.html#ac71832cf5445a694a178d15345d67840a257077c62b40f8c7c6b253c21fcaa5e6" title="value type is a signed integer">JackParamInt</a>,
<a name="l00692"></a>00692             &amp;server_ptr-&gt;realtime_priority,
<a name="l00693"></a>00693             &amp;server_ptr-&gt;default_realtime_priority,
<a name="l00694"></a>00694             value,
<a name="l00695"></a>00695             get_realtime_priority_constraint()) == NULL)
<a name="l00696"></a>00696     {
<a name="l00697"></a>00697         <span class="keywordflow">goto</span> fail_free_parameters;
<a name="l00698"></a>00698     }
<a name="l00699"></a>00699 
<a name="l00700"></a>00700     value.<a class="code" href="unionjackctl__parameter__value.html#a9765ef8c57c7b9993c645e985cc4a75d" title="member used for JackParamBool">b</a> = <span class="keyword">false</span>;
<a name="l00701"></a>00701     <span class="keywordflow">if</span> (jackctl_add_parameter(
<a name="l00702"></a>00702             &amp;server_ptr-&gt;parameters,
<a name="l00703"></a>00703             <span class="stringliteral">&quot;temporary&quot;</span>,
<a name="l00704"></a>00704             <span class="stringliteral">&quot;Exit once all clients have closed their connections.&quot;</span>,
<a name="l00705"></a>00705             <span class="stringliteral">&quot;&quot;</span>,
<a name="l00706"></a>00706             <a class="code" href="control_8h.html#ac71832cf5445a694a178d15345d67840a766feed3831809abe9b67872086f241f" title="value type is a boolean">JackParamBool</a>,
<a name="l00707"></a>00707             &amp;server_ptr-&gt;temporary,
<a name="l00708"></a>00708             &amp;server_ptr-&gt;default_temporary,
<a name="l00709"></a>00709             value) == NULL)
<a name="l00710"></a>00710     {
<a name="l00711"></a>00711         <span class="keywordflow">goto</span> fail_free_parameters;
<a name="l00712"></a>00712     }
<a name="l00713"></a>00713 
<a name="l00714"></a>00714     value.<a class="code" href="unionjackctl__parameter__value.html#a9765ef8c57c7b9993c645e985cc4a75d" title="member used for JackParamBool">b</a> = <span class="keyword">false</span>;
<a name="l00715"></a>00715     <span class="keywordflow">if</span> (jackctl_add_parameter(
<a name="l00716"></a>00716             &amp;server_ptr-&gt;parameters,
<a name="l00717"></a>00717             <span class="stringliteral">&quot;verbose&quot;</span>,
<a name="l00718"></a>00718             <span class="stringliteral">&quot;Verbose mode.&quot;</span>,
<a name="l00719"></a>00719             <span class="stringliteral">&quot;&quot;</span>,
<a name="l00720"></a>00720             <a class="code" href="control_8h.html#ac71832cf5445a694a178d15345d67840a766feed3831809abe9b67872086f241f" title="value type is a boolean">JackParamBool</a>,
<a name="l00721"></a>00721             &amp;server_ptr-&gt;verbose,
<a name="l00722"></a>00722             &amp;server_ptr-&gt;default_verbose,
<a name="l00723"></a>00723             value) == NULL)
<a name="l00724"></a>00724     {
<a name="l00725"></a>00725         <span class="keywordflow">goto</span> fail_free_parameters;
<a name="l00726"></a>00726     }
<a name="l00727"></a>00727 
<a name="l00728"></a>00728     value.<a class="code" href="unionjackctl__parameter__value.html#a34bd19127b1d1f1b45dd62557052ed3f" title="member used for JackParamInt">i</a> = 0;
<a name="l00729"></a>00729     <span class="keywordflow">if</span> (jackctl_add_parameter(
<a name="l00730"></a>00730             &amp;server_ptr-&gt;parameters,
<a name="l00731"></a>00731             <span class="stringliteral">&quot;client-timeout&quot;</span>,
<a name="l00732"></a>00732             <span class="stringliteral">&quot;Client timeout limit in milliseconds.&quot;</span>,
<a name="l00733"></a>00733             <span class="stringliteral">&quot;&quot;</span>,
<a name="l00734"></a>00734             <a class="code" href="control_8h.html#ac71832cf5445a694a178d15345d67840a257077c62b40f8c7c6b253c21fcaa5e6" title="value type is a signed integer">JackParamInt</a>,
<a name="l00735"></a>00735             &amp;server_ptr-&gt;client_timeout,
<a name="l00736"></a>00736             &amp;server_ptr-&gt;default_client_timeout,
<a name="l00737"></a>00737             value) == NULL)
<a name="l00738"></a>00738     {
<a name="l00739"></a>00739         <span class="keywordflow">goto</span> fail_free_parameters;
<a name="l00740"></a>00740     }
<a name="l00741"></a>00741 
<a name="l00742"></a>00742     value.<a class="code" href="unionjackctl__parameter__value.html#aff0227f8e7a6959b93886febe576d0be" title="member used for JackParamUInt">ui</a> = 0;
<a name="l00743"></a>00743     <span class="keywordflow">if</span> (jackctl_add_parameter(
<a name="l00744"></a>00744             &amp;server_ptr-&gt;parameters,
<a name="l00745"></a>00745             <span class="stringliteral">&quot;clock-source&quot;</span>,
<a name="l00746"></a>00746             <span class="stringliteral">&quot;Clocksource type : c(ycle) | h(pet) | s(ystem).&quot;</span>,
<a name="l00747"></a>00747             <span class="stringliteral">&quot;&quot;</span>,
<a name="l00748"></a>00748             <a class="code" href="control_8h.html#ac71832cf5445a694a178d15345d67840a574c962072518406c2aebf6b3d6ddc71" title="value type is an unsigned integer">JackParamUInt</a>,
<a name="l00749"></a>00749             &amp;server_ptr-&gt;clock_source,
<a name="l00750"></a>00750             &amp;server_ptr-&gt;default_clock_source,
<a name="l00751"></a>00751             value) == NULL)
<a name="l00752"></a>00752     {
<a name="l00753"></a>00753         <span class="keywordflow">goto</span> fail_free_parameters;
<a name="l00754"></a>00754     }
<a name="l00755"></a>00755 
<a name="l00756"></a>00756     value.<a class="code" href="unionjackctl__parameter__value.html#aff0227f8e7a6959b93886febe576d0be" title="member used for JackParamUInt">ui</a> = PORT_NUM;
<a name="l00757"></a>00757     <span class="keywordflow">if</span> (jackctl_add_parameter(
<a name="l00758"></a>00758           &amp;server_ptr-&gt;parameters,
<a name="l00759"></a>00759           <span class="stringliteral">&quot;port-max&quot;</span>,
<a name="l00760"></a>00760           <span class="stringliteral">&quot;Maximum number of ports.&quot;</span>,
<a name="l00761"></a>00761           <span class="stringliteral">&quot;&quot;</span>,
<a name="l00762"></a>00762           <a class="code" href="control_8h.html#ac71832cf5445a694a178d15345d67840a574c962072518406c2aebf6b3d6ddc71" title="value type is an unsigned integer">JackParamUInt</a>,
<a name="l00763"></a>00763           &amp;server_ptr-&gt;port_max,
<a name="l00764"></a>00764           &amp;server_ptr-&gt;default_port_max,
<a name="l00765"></a>00765           value) == NULL)
<a name="l00766"></a>00766     {
<a name="l00767"></a>00767         <span class="keywordflow">goto</span> fail_free_parameters;
<a name="l00768"></a>00768     }
<a name="l00769"></a>00769 
<a name="l00770"></a>00770     value.<a class="code" href="unionjackctl__parameter__value.html#a9765ef8c57c7b9993c645e985cc4a75d" title="member used for JackParamBool">b</a> = <span class="keyword">false</span>;
<a name="l00771"></a>00771     <span class="keywordflow">if</span> (jackctl_add_parameter(
<a name="l00772"></a>00772             &amp;server_ptr-&gt;parameters,
<a name="l00773"></a>00773             <span class="stringliteral">&quot;replace-registry&quot;</span>,
<a name="l00774"></a>00774             <span class="stringliteral">&quot;Replace shared memory registry.&quot;</span>,
<a name="l00775"></a>00775             <span class="stringliteral">&quot;&quot;</span>,
<a name="l00776"></a>00776             <a class="code" href="control_8h.html#ac71832cf5445a694a178d15345d67840a766feed3831809abe9b67872086f241f" title="value type is a boolean">JackParamBool</a>,
<a name="l00777"></a>00777             &amp;server_ptr-&gt;replace_registry,
<a name="l00778"></a>00778             &amp;server_ptr-&gt;default_replace_registry,
<a name="l00779"></a>00779             value) == NULL)
<a name="l00780"></a>00780     {
<a name="l00781"></a>00781         <span class="keywordflow">goto</span> fail_free_parameters;
<a name="l00782"></a>00782     }
<a name="l00783"></a>00783 
<a name="l00784"></a>00784     value.<a class="code" href="unionjackctl__parameter__value.html#a9765ef8c57c7b9993c645e985cc4a75d" title="member used for JackParamBool">b</a> = <span class="keyword">false</span>;
<a name="l00785"></a>00785     <span class="keywordflow">if</span> (jackctl_add_parameter(
<a name="l00786"></a>00786             &amp;server_ptr-&gt;parameters,
<a name="l00787"></a>00787             <span class="stringliteral">&quot;sync&quot;</span>,
<a name="l00788"></a>00788             <span class="stringliteral">&quot;Use server synchronous mode.&quot;</span>,
<a name="l00789"></a>00789             <span class="stringliteral">&quot;&quot;</span>,
<a name="l00790"></a>00790             <a class="code" href="control_8h.html#ac71832cf5445a694a178d15345d67840a766feed3831809abe9b67872086f241f" title="value type is a boolean">JackParamBool</a>,
<a name="l00791"></a>00791             &amp;server_ptr-&gt;sync,
<a name="l00792"></a>00792             &amp;server_ptr-&gt;default_sync,
<a name="l00793"></a>00793             value) == NULL)
<a name="l00794"></a>00794     {
<a name="l00795"></a>00795         <span class="keywordflow">goto</span> fail_free_parameters;
<a name="l00796"></a>00796     }
<a name="l00797"></a>00797 
<a name="l00798"></a>00798     JackServerGlobals::on_device_acquire = on_device_acquire;
<a name="l00799"></a>00799     JackServerGlobals::on_device_release = on_device_release;
<a name="l00800"></a>00800 
<a name="l00801"></a>00801     <span class="keywordflow">if</span> (!jackctl_drivers_load(server_ptr))
<a name="l00802"></a>00802     {
<a name="l00803"></a>00803         <span class="keywordflow">goto</span> fail_free_parameters;
<a name="l00804"></a>00804     }
<a name="l00805"></a>00805 
<a name="l00806"></a>00806     <span class="comment">/* Allowed to fail */</span>
<a name="l00807"></a>00807     jackctl_internals_load(server_ptr);
<a name="l00808"></a>00808 
<a name="l00809"></a>00809     <span class="keywordflow">return</span> server_ptr;
<a name="l00810"></a>00810 
<a name="l00811"></a>00811 fail_free_parameters:
<a name="l00812"></a>00812     jackctl_server_free_parameters(server_ptr);
<a name="l00813"></a>00813 
<a name="l00814"></a>00814     free(server_ptr);
<a name="l00815"></a>00815 
<a name="l00816"></a>00816 fail:
<a name="l00817"></a>00817     <span class="keywordflow">return</span> NULL;
<a name="l00818"></a>00818 }
<a name="l00819"></a>00819 
<a name="l00820"></a><a class="code" href="group__ServerControl.html#gab6f848f11e9853f49d82f253c1df1121">00820</a> EXPORT <span class="keywordtype">void</span> <a class="code" href="group__ServerControl.html#gab6f848f11e9853f49d82f253c1df1121">jackctl_server_destroy</a>(<a class="code" href="structjackctl__server.html">jackctl_server</a> *server_ptr)
<a name="l00821"></a>00821 {
<a name="l00822"></a>00822     jackctl_server_free_drivers(server_ptr);
<a name="l00823"></a>00823     jackctl_server_free_internals(server_ptr);
<a name="l00824"></a>00824     jackctl_server_free_parameters(server_ptr);
<a name="l00825"></a>00825     free(server_ptr);
<a name="l00826"></a>00826 }
<a name="l00827"></a>00827 
<a name="l00828"></a><a class="code" href="group__ServerControl.html#ga3edd82a413260dc1f4de2862f0a6a669">00828</a> EXPORT <span class="keyword">const</span> <a class="code" href="struct__JSList.html">JSList</a> * <a class="code" href="group__ServerControl.html#ga3edd82a413260dc1f4de2862f0a6a669">jackctl_server_get_drivers_list</a>(<a class="code" href="structjackctl__server.html">jackctl_server</a> *server_ptr)
<a name="l00829"></a>00829 {
<a name="l00830"></a>00830     <span class="keywordflow">return</span> server_ptr-&gt;drivers;
<a name="l00831"></a>00831 }
<a name="l00832"></a>00832 
<a name="l00833"></a><a class="code" href="group__ServerControl.html#gaf71c3fbc808e15305277e667ca6cfac4">00833</a> EXPORT <span class="keywordtype">bool</span> <a class="code" href="group__ServerControl.html#gaf71c3fbc808e15305277e667ca6cfac4">jackctl_server_stop</a>(<a class="code" href="structjackctl__server.html">jackctl_server</a> *server_ptr)
<a name="l00834"></a>00834 {
<a name="l00835"></a>00835     server_ptr-&gt;engine-&gt;Stop();
<a name="l00836"></a>00836     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00837"></a>00837 }
<a name="l00838"></a>00838 
<a name="l00839"></a><a class="code" href="group__ServerControl.html#gab09dea0a3ffc38e439cbceaa33951a2c">00839</a> EXPORT <span class="keywordtype">bool</span> <a class="code" href="group__ServerControl.html#gab09dea0a3ffc38e439cbceaa33951a2c">jackctl_server_close</a>(<a class="code" href="structjackctl__server.html">jackctl_server</a> *server_ptr)
<a name="l00840"></a>00840 {
<a name="l00841"></a>00841     server_ptr-&gt;engine-&gt;Close();
<a name="l00842"></a>00842     <span class="keyword">delete</span> server_ptr-&gt;engine;
<a name="l00843"></a>00843 
<a name="l00844"></a>00844     <span class="comment">/* clean up shared memory and files from this server instance */</span>
<a name="l00845"></a>00845     <a class="code" href="group__ServerControl.html#ga35f69faaee3bb9b958ed8c9a5f62246c">jack_log</a>(<span class="stringliteral">&quot;cleaning up shared memory&quot;</span>);
<a name="l00846"></a>00846 
<a name="l00847"></a>00847     jack_cleanup_shm();
<a name="l00848"></a>00848 
<a name="l00849"></a>00849     <a class="code" href="group__ServerControl.html#ga35f69faaee3bb9b958ed8c9a5f62246c">jack_log</a>(<span class="stringliteral">&quot;cleaning up files&quot;</span>);
<a name="l00850"></a>00850 
<a name="l00851"></a>00851     JackTools::CleanupFiles(server_ptr-&gt;name.<a class="code" href="unionjackctl__parameter__value.html#adb7c766a89a9d377f11395fb9cc9c53b" title="member used for JackParamString">str</a>);
<a name="l00852"></a>00852 
<a name="l00853"></a>00853     <a class="code" href="group__ServerControl.html#ga35f69faaee3bb9b958ed8c9a5f62246c">jack_log</a>(<span class="stringliteral">&quot;unregistering server `%s&#39;&quot;</span>, server_ptr-&gt;name.<a class="code" href="unionjackctl__parameter__value.html#adb7c766a89a9d377f11395fb9cc9c53b" title="member used for JackParamString">str</a>);
<a name="l00854"></a>00854 
<a name="l00855"></a>00855     jack_unregister_server(server_ptr-&gt;name.<a class="code" href="unionjackctl__parameter__value.html#adb7c766a89a9d377f11395fb9cc9c53b" title="member used for JackParamString">str</a>);
<a name="l00856"></a>00856 
<a name="l00857"></a>00857     server_ptr-&gt;engine = NULL;
<a name="l00858"></a>00858 
<a name="l00859"></a>00859     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00860"></a>00860 }
<a name="l00861"></a>00861 
<a name="l00862"></a><a class="code" href="group__ServerControl.html#gaeaefa3144a6a9d843467d4951ca71f70">00862</a> EXPORT <span class="keyword">const</span> <a class="code" href="struct__JSList.html">JSList</a> * <a class="code" href="group__ServerControl.html#gaeaefa3144a6a9d843467d4951ca71f70">jackctl_server_get_parameters</a>(<a class="code" href="structjackctl__server.html">jackctl_server</a> *server_ptr)
<a name="l00863"></a>00863 {
<a name="l00864"></a>00864     <span class="keywordflow">return</span> server_ptr-&gt;parameters;
<a name="l00865"></a>00865 }
<a name="l00866"></a>00866 
<a name="l00867"></a>00867 EXPORT <span class="keywordtype">bool</span>
<a name="l00868"></a><a class="code" href="group__ServerControl.html#gad2b438d61acdadc96368ff2dd4e9e62f">00868</a> <a class="code" href="group__ServerControl.html#gad2b438d61acdadc96368ff2dd4e9e62f">jackctl_server_open</a>(
<a name="l00869"></a>00869     <a class="code" href="structjackctl__server.html">jackctl_server</a> *server_ptr,
<a name="l00870"></a>00870     <a class="code" href="structjackctl__driver.html">jackctl_driver</a> *driver_ptr)
<a name="l00871"></a>00871 {
<a name="l00872"></a>00872     <span class="keywordtype">int</span> rc;
<a name="l00873"></a>00873 
<a name="l00874"></a>00874     rc = jack_register_server(server_ptr-&gt;name.<a class="code" href="unionjackctl__parameter__value.html#adb7c766a89a9d377f11395fb9cc9c53b" title="member used for JackParamString">str</a>, server_ptr-&gt;replace_registry.<a class="code" href="unionjackctl__parameter__value.html#a9765ef8c57c7b9993c645e985cc4a75d" title="member used for JackParamBool">b</a>);
<a name="l00875"></a>00875     <span class="keywordflow">switch</span> (rc)
<a name="l00876"></a>00876     {
<a name="l00877"></a>00877     <span class="keywordflow">case</span> EEXIST:
<a name="l00878"></a>00878         <a class="code" href="group__ServerControl.html#gac6448626e0b75fc6d9da1ccbdca0355e">jack_error</a>(<span class="stringliteral">&quot;`%s&#39; server already active&quot;</span>, server_ptr-&gt;name.<a class="code" href="unionjackctl__parameter__value.html#adb7c766a89a9d377f11395fb9cc9c53b" title="member used for JackParamString">str</a>);
<a name="l00879"></a>00879         <span class="keywordflow">goto</span> fail;
<a name="l00880"></a>00880     <span class="keywordflow">case</span> ENOSPC:
<a name="l00881"></a>00881         <a class="code" href="group__ServerControl.html#gac6448626e0b75fc6d9da1ccbdca0355e">jack_error</a>(<span class="stringliteral">&quot;too many servers already active&quot;</span>);
<a name="l00882"></a>00882         <span class="keywordflow">goto</span> fail;
<a name="l00883"></a>00883     <span class="keywordflow">case</span> ENOMEM:
<a name="l00884"></a>00884         <a class="code" href="group__ServerControl.html#gac6448626e0b75fc6d9da1ccbdca0355e">jack_error</a>(<span class="stringliteral">&quot;no access to shm registry&quot;</span>);
<a name="l00885"></a>00885         <span class="keywordflow">goto</span> fail;
<a name="l00886"></a>00886     }
<a name="l00887"></a>00887 
<a name="l00888"></a>00888     <a class="code" href="group__ServerControl.html#ga35f69faaee3bb9b958ed8c9a5f62246c">jack_log</a>(<span class="stringliteral">&quot;server `%s&#39; registered&quot;</span>, server_ptr-&gt;name.<a class="code" href="unionjackctl__parameter__value.html#adb7c766a89a9d377f11395fb9cc9c53b" title="member used for JackParamString">str</a>);
<a name="l00889"></a>00889 
<a name="l00890"></a>00890     <span class="comment">/* clean up shared memory and files from any previous</span>
<a name="l00891"></a>00891 <span class="comment">     * instance of this server name */</span>
<a name="l00892"></a>00892     jack_cleanup_shm();
<a name="l00893"></a>00893     JackTools::CleanupFiles(server_ptr-&gt;name.<a class="code" href="unionjackctl__parameter__value.html#adb7c766a89a9d377f11395fb9cc9c53b" title="member used for JackParamString">str</a>);
<a name="l00894"></a>00894 
<a name="l00895"></a>00895     <span class="keywordflow">if</span> (!server_ptr-&gt;realtime.<a class="code" href="unionjackctl__parameter__value.html#a9765ef8c57c7b9993c645e985cc4a75d" title="member used for JackParamBool">b</a> &amp;&amp; server_ptr-&gt;client_timeout.<a class="code" href="unionjackctl__parameter__value.html#a34bd19127b1d1f1b45dd62557052ed3f" title="member used for JackParamInt">i</a> == 0)
<a name="l00896"></a>00896         server_ptr-&gt;client_timeout.<a class="code" href="unionjackctl__parameter__value.html#a34bd19127b1d1f1b45dd62557052ed3f" title="member used for JackParamInt">i</a> = 500; <span class="comment">/* 0.5 sec; usable when non realtime. */</span>
<a name="l00897"></a>00897 
<a name="l00898"></a>00898     <span class="comment">/* check port max value before allocating server */</span>
<a name="l00899"></a>00899     <span class="keywordflow">if</span> (server_ptr-&gt;port_max.<a class="code" href="unionjackctl__parameter__value.html#aff0227f8e7a6959b93886febe576d0be" title="member used for JackParamUInt">ui</a> &gt; PORT_NUM_MAX) {
<a name="l00900"></a>00900         <a class="code" href="group__ServerControl.html#gac6448626e0b75fc6d9da1ccbdca0355e">jack_error</a>(<span class="stringliteral">&quot;JACK server started with too much ports %d (when port max can be %d)&quot;</span>, server_ptr-&gt;port_max.<a class="code" href="unionjackctl__parameter__value.html#aff0227f8e7a6959b93886febe576d0be" title="member used for JackParamUInt">ui</a>, PORT_NUM_MAX);
<a name="l00901"></a>00901         <span class="keywordflow">goto</span> fail;
<a name="l00902"></a>00902     }
<a name="l00903"></a>00903 
<a name="l00904"></a>00904     <span class="comment">/* get the engine/driver started */</span>
<a name="l00905"></a>00905     server_ptr-&gt;engine = <span class="keyword">new</span> <a class="code" href="classJack_1_1JackServer.html" title="The Jack server.">JackServer</a>(
<a name="l00906"></a>00906         server_ptr-&gt;sync.<a class="code" href="unionjackctl__parameter__value.html#a9765ef8c57c7b9993c645e985cc4a75d" title="member used for JackParamBool">b</a>,
<a name="l00907"></a>00907         server_ptr-&gt;temporary.<a class="code" href="unionjackctl__parameter__value.html#a9765ef8c57c7b9993c645e985cc4a75d" title="member used for JackParamBool">b</a>,
<a name="l00908"></a>00908         server_ptr-&gt;client_timeout.<a class="code" href="unionjackctl__parameter__value.html#a34bd19127b1d1f1b45dd62557052ed3f" title="member used for JackParamInt">i</a>,
<a name="l00909"></a>00909         server_ptr-&gt;realtime.<a class="code" href="unionjackctl__parameter__value.html#a9765ef8c57c7b9993c645e985cc4a75d" title="member used for JackParamBool">b</a>,
<a name="l00910"></a>00910         server_ptr-&gt;realtime_priority.<a class="code" href="unionjackctl__parameter__value.html#a34bd19127b1d1f1b45dd62557052ed3f" title="member used for JackParamInt">i</a>,
<a name="l00911"></a>00911         server_ptr-&gt;port_max.<a class="code" href="unionjackctl__parameter__value.html#aff0227f8e7a6959b93886febe576d0be" title="member used for JackParamUInt">ui</a>,
<a name="l00912"></a>00912         server_ptr-&gt;verbose.<a class="code" href="unionjackctl__parameter__value.html#a9765ef8c57c7b9993c645e985cc4a75d" title="member used for JackParamBool">b</a>,
<a name="l00913"></a>00913         (jack_timer_type_t)server_ptr-&gt;clock_source.<a class="code" href="unionjackctl__parameter__value.html#aff0227f8e7a6959b93886febe576d0be" title="member used for JackParamUInt">ui</a>,
<a name="l00914"></a>00914         server_ptr-&gt;name.<a class="code" href="unionjackctl__parameter__value.html#adb7c766a89a9d377f11395fb9cc9c53b" title="member used for JackParamString">str</a>);
<a name="l00915"></a>00915     <span class="keywordflow">if</span> (server_ptr-&gt;engine == NULL)
<a name="l00916"></a>00916     {
<a name="l00917"></a>00917         <a class="code" href="group__ServerControl.html#gac6448626e0b75fc6d9da1ccbdca0355e">jack_error</a>(<span class="stringliteral">&quot;Failed to create new JackServer object&quot;</span>);
<a name="l00918"></a>00918         <span class="keywordflow">goto</span> fail_unregister;
<a name="l00919"></a>00919     }
<a name="l00920"></a>00920 
<a name="l00921"></a>00921     rc = server_ptr-&gt;engine-&gt;Open(driver_ptr-&gt;desc_ptr, driver_ptr-&gt;set_parameters);
<a name="l00922"></a>00922     <span class="keywordflow">if</span> (rc &lt; 0)
<a name="l00923"></a>00923     {
<a name="l00924"></a>00924         <a class="code" href="group__ServerControl.html#gac6448626e0b75fc6d9da1ccbdca0355e">jack_error</a>(<span class="stringliteral">&quot;JackServer::Open() failed with %d&quot;</span>, rc);
<a name="l00925"></a>00925         <span class="keywordflow">goto</span> fail_delete;
<a name="l00926"></a>00926     }
<a name="l00927"></a>00927 
<a name="l00928"></a>00928     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00929"></a>00929 
<a name="l00930"></a>00930 fail_delete:
<a name="l00931"></a>00931     <span class="keyword">delete</span> server_ptr-&gt;engine;
<a name="l00932"></a>00932     server_ptr-&gt;engine = NULL;
<a name="l00933"></a>00933 
<a name="l00934"></a>00934 fail_unregister:
<a name="l00935"></a>00935     <a class="code" href="group__ServerControl.html#ga35f69faaee3bb9b958ed8c9a5f62246c">jack_log</a>(<span class="stringliteral">&quot;cleaning up shared memory&quot;</span>);
<a name="l00936"></a>00936 
<a name="l00937"></a>00937     jack_cleanup_shm();
<a name="l00938"></a>00938 
<a name="l00939"></a>00939     <a class="code" href="group__ServerControl.html#ga35f69faaee3bb9b958ed8c9a5f62246c">jack_log</a>(<span class="stringliteral">&quot;cleaning up files&quot;</span>);
<a name="l00940"></a>00940 
<a name="l00941"></a>00941     JackTools::CleanupFiles(server_ptr-&gt;name.<a class="code" href="unionjackctl__parameter__value.html#adb7c766a89a9d377f11395fb9cc9c53b" title="member used for JackParamString">str</a>);
<a name="l00942"></a>00942 
<a name="l00943"></a>00943     <a class="code" href="group__ServerControl.html#ga35f69faaee3bb9b958ed8c9a5f62246c">jack_log</a>(<span class="stringliteral">&quot;unregistering server `%s&#39;&quot;</span>, server_ptr-&gt;name.<a class="code" href="unionjackctl__parameter__value.html#adb7c766a89a9d377f11395fb9cc9c53b" title="member used for JackParamString">str</a>);
<a name="l00944"></a>00944 
<a name="l00945"></a>00945     jack_unregister_server(server_ptr-&gt;name.<a class="code" href="unionjackctl__parameter__value.html#adb7c766a89a9d377f11395fb9cc9c53b" title="member used for JackParamString">str</a>);
<a name="l00946"></a>00946 
<a name="l00947"></a>00947 fail:
<a name="l00948"></a>00948     <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00949"></a>00949 }
<a name="l00950"></a>00950 
<a name="l00951"></a>00951 EXPORT <span class="keywordtype">bool</span>
<a name="l00952"></a><a class="code" href="group__ServerControl.html#gaa573e4c5e35e853d199cf5b7368700b5">00952</a> <a class="code" href="group__ServerControl.html#gaa573e4c5e35e853d199cf5b7368700b5">jackctl_server_start</a>(
<a name="l00953"></a>00953     <a class="code" href="structjackctl__server.html">jackctl_server</a> *server_ptr)
<a name="l00954"></a>00954 {
<a name="l00955"></a>00955     <span class="keywordtype">int</span> rc = server_ptr-&gt;engine-&gt;Start();
<a name="l00956"></a>00956     <span class="keywordtype">bool</span> result = rc &gt;= 0;
<a name="l00957"></a>00957     <span class="keywordflow">if</span> (! result)
<a name="l00958"></a>00958     {
<a name="l00959"></a>00959         <a class="code" href="group__ServerControl.html#gac6448626e0b75fc6d9da1ccbdca0355e">jack_error</a>(<span class="stringliteral">&quot;JackServer::Start() failed with %d&quot;</span>, rc);
<a name="l00960"></a>00960     }
<a name="l00961"></a>00961     <span class="keywordflow">return</span> result;
<a name="l00962"></a>00962 }
<a name="l00963"></a>00963 
<a name="l00964"></a><a class="code" href="group__ServerControl.html#ga9e28945c015f343e7a82c4e76e9cb1b4">00964</a> EXPORT <span class="keyword">const</span> <span class="keywordtype">char</span> * <a class="code" href="group__ServerControl.html#ga9e28945c015f343e7a82c4e76e9cb1b4">jackctl_driver_get_name</a>(<a class="code" href="structjackctl__driver.html">jackctl_driver</a> *driver_ptr)
<a name="l00965"></a>00965 {
<a name="l00966"></a>00966     <span class="keywordflow">return</span> driver_ptr-&gt;desc_ptr-&gt;<a class="code" href="structjack__driver__desc__t.html#a42ee3aae5d4587330cb03879eacc760b">name</a>;
<a name="l00967"></a>00967 }
<a name="l00968"></a>00968 
<a name="l00969"></a><a class="code" href="group__ServerControl.html#ga0f73cfb0c40a401ca6aa617073303e72">00969</a> EXPORT <span class="keyword">const</span> <a class="code" href="struct__JSList.html">JSList</a> * <a class="code" href="group__ServerControl.html#ga0f73cfb0c40a401ca6aa617073303e72">jackctl_driver_get_parameters</a>(<a class="code" href="structjackctl__driver.html">jackctl_driver</a> *driver_ptr)
<a name="l00970"></a>00970 {
<a name="l00971"></a>00971     <span class="keywordflow">return</span> driver_ptr-&gt;parameters;
<a name="l00972"></a>00972 }
<a name="l00973"></a>00973 
<a name="l00974"></a>00974 EXPORT <a class="code" href="structjack__driver__desc__t.html">jack_driver_desc_t</a> * jackctl_driver_get_desc(<a class="code" href="structjackctl__driver.html">jackctl_driver</a> *driver_ptr)
<a name="l00975"></a>00975 {
<a name="l00976"></a>00976     <span class="keywordflow">return</span> driver_ptr-&gt;desc_ptr;
<a name="l00977"></a>00977 }
<a name="l00978"></a>00978 
<a name="l00979"></a><a class="code" href="group__ServerControl.html#ga3a123ee66e7605b1f17db88d4f5b8ac8">00979</a> EXPORT <span class="keyword">const</span> <span class="keywordtype">char</span> * <a class="code" href="group__ServerControl.html#ga3a123ee66e7605b1f17db88d4f5b8ac8">jackctl_parameter_get_name</a>(<a class="code" href="structjackctl__parameter.html">jackctl_parameter</a> *parameter_ptr)
<a name="l00980"></a>00980 {
<a name="l00981"></a>00981     <span class="keywordflow">return</span> parameter_ptr-&gt;name;
<a name="l00982"></a>00982 }
<a name="l00983"></a>00983 
<a name="l00984"></a><a class="code" href="group__ServerControl.html#gaac9fe5577753455308a53f5569fe3106">00984</a> EXPORT <span class="keyword">const</span> <span class="keywordtype">char</span> * <a class="code" href="group__ServerControl.html#gaac9fe5577753455308a53f5569fe3106">jackctl_parameter_get_short_description</a>(<a class="code" href="structjackctl__parameter.html">jackctl_parameter</a> *parameter_ptr)
<a name="l00985"></a>00985 {
<a name="l00986"></a>00986     <span class="keywordflow">return</span> parameter_ptr-&gt;short_description;
<a name="l00987"></a>00987 }
<a name="l00988"></a>00988 
<a name="l00989"></a><a class="code" href="group__ServerControl.html#ga97aae5c29e16539b71bc7dc2bddafc4b">00989</a> EXPORT <span class="keyword">const</span> <span class="keywordtype">char</span> * <a class="code" href="group__ServerControl.html#ga97aae5c29e16539b71bc7dc2bddafc4b">jackctl_parameter_get_long_description</a>(<a class="code" href="structjackctl__parameter.html">jackctl_parameter</a> *parameter_ptr)
<a name="l00990"></a>00990 {
<a name="l00991"></a>00991     <span class="keywordflow">return</span> parameter_ptr-&gt;long_description;
<a name="l00992"></a>00992 }
<a name="l00993"></a>00993 
<a name="l00994"></a><a class="code" href="group__ServerControl.html#gae7228c1726b5ecaae6458134bf4ab4d7">00994</a> EXPORT <span class="keywordtype">bool</span> <a class="code" href="group__ServerControl.html#gae7228c1726b5ecaae6458134bf4ab4d7">jackctl_parameter_has_range_constraint</a>(<a class="code" href="structjackctl__parameter.html">jackctl_parameter</a> *parameter_ptr)
<a name="l00995"></a>00995 {
<a name="l00996"></a>00996     <span class="keywordflow">return</span> parameter_ptr-&gt;constraint_ptr != NULL &amp;&amp; (parameter_ptr-&gt;constraint_ptr-&gt;<a class="code" href="structjack__driver__param__constraint__desc__t.html#aedd94c67d95bdfbaafc4e90931804c2a">flags</a> &amp; JACK_CONSTRAINT_FLAG_RANGE) != 0;
<a name="l00997"></a>00997 }
<a name="l00998"></a>00998 
<a name="l00999"></a><a class="code" href="group__ServerControl.html#ga823ae164d023267b57002226444fe708">00999</a> EXPORT <span class="keywordtype">bool</span> <a class="code" href="group__ServerControl.html#ga823ae164d023267b57002226444fe708">jackctl_parameter_has_enum_constraint</a>(<a class="code" href="structjackctl__parameter.html">jackctl_parameter</a> *parameter_ptr)
<a name="l01000"></a>01000 {
<a name="l01001"></a>01001     <span class="keywordflow">return</span> parameter_ptr-&gt;constraint_ptr != NULL &amp;&amp; (parameter_ptr-&gt;constraint_ptr-&gt;<a class="code" href="structjack__driver__param__constraint__desc__t.html#aedd94c67d95bdfbaafc4e90931804c2a">flags</a> &amp; JACK_CONSTRAINT_FLAG_RANGE) == 0;
<a name="l01002"></a>01002 }
<a name="l01003"></a>01003 
<a name="l01004"></a><a class="code" href="group__ServerControl.html#ga1578b61842cf7a7cfb0d8fe54cf286ff">01004</a> EXPORT uint32_t <a class="code" href="group__ServerControl.html#ga1578b61842cf7a7cfb0d8fe54cf286ff">jackctl_parameter_get_enum_constraints_count</a>(<a class="code" href="structjackctl__parameter.html">jackctl_parameter</a> *parameter_ptr)
<a name="l01005"></a>01005 {
<a name="l01006"></a>01006     <span class="keywordflow">if</span> (!<a class="code" href="group__ServerControl.html#ga823ae164d023267b57002226444fe708">jackctl_parameter_has_enum_constraint</a>(parameter_ptr))
<a name="l01007"></a>01007     {
<a name="l01008"></a>01008         <span class="keywordflow">return</span> 0;
<a name="l01009"></a>01009     }
<a name="l01010"></a>01010 
<a name="l01011"></a>01011     <span class="keywordflow">return</span> parameter_ptr-&gt;constraint_ptr-&gt;constraint.<a class="code" href="structjack__driver__param__constraint__desc__t.html#a67423626dbe6bbe914e79c187677cec6">enumeration</a>.count;
<a name="l01012"></a>01012 }
<a name="l01013"></a>01013 
<a name="l01014"></a><a class="code" href="group__ServerControl.html#ga12fbe98c92f84dcfbd2de23421181567">01014</a> EXPORT <span class="keyword">union </span><a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> <a class="code" href="group__ServerControl.html#ga12fbe98c92f84dcfbd2de23421181567">jackctl_parameter_get_enum_constraint_value</a>(<a class="code" href="structjackctl__parameter.html">jackctl_parameter</a> *parameter_ptr, uint32_t index)
<a name="l01015"></a>01015 {
<a name="l01016"></a>01016     <a class="code" href="unionjack__driver__param__value__t.html">jack_driver_param_value_t</a> * value_ptr;
<a name="l01017"></a>01017     <span class="keyword">union </span><a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> jackctl_value;
<a name="l01018"></a>01018 
<a name="l01019"></a>01019     value_ptr = &amp;parameter_ptr-&gt;constraint_ptr-&gt;constraint.<a class="code" href="structjack__driver__param__constraint__desc__t.html#a67423626dbe6bbe914e79c187677cec6">enumeration</a>.possible_values_array[index].value;
<a name="l01020"></a>01020 
<a name="l01021"></a>01021     <span class="keywordflow">switch</span> (parameter_ptr-&gt;type)
<a name="l01022"></a>01022     {
<a name="l01023"></a>01023     <span class="keywordflow">case</span> <a class="code" href="control_8h.html#ac71832cf5445a694a178d15345d67840a257077c62b40f8c7c6b253c21fcaa5e6" title="value type is a signed integer">JackParamInt</a>:
<a name="l01024"></a>01024         jackctl_value.<a class="code" href="unionjackctl__parameter__value.html#a34bd19127b1d1f1b45dd62557052ed3f" title="member used for JackParamInt">i</a> = value_ptr-&gt;i;
<a name="l01025"></a>01025         <span class="keywordflow">break</span>;
<a name="l01026"></a>01026     <span class="keywordflow">case</span> <a class="code" href="control_8h.html#ac71832cf5445a694a178d15345d67840a574c962072518406c2aebf6b3d6ddc71" title="value type is an unsigned integer">JackParamUInt</a>:
<a name="l01027"></a>01027         jackctl_value.<a class="code" href="unionjackctl__parameter__value.html#aff0227f8e7a6959b93886febe576d0be" title="member used for JackParamUInt">ui</a> = value_ptr-&gt;ui;
<a name="l01028"></a>01028         <span class="keywordflow">break</span>;
<a name="l01029"></a>01029     <span class="keywordflow">case</span> <a class="code" href="control_8h.html#ac71832cf5445a694a178d15345d67840aab44adbfbb163aa6b6ad52eac90b2bfb" title="value type is a char">JackParamChar</a>:
<a name="l01030"></a>01030         jackctl_value.<a class="code" href="unionjackctl__parameter__value.html#a818569c9b5ff786af53e83607e46127c" title="member used for JackParamChar">c</a> = value_ptr-&gt;c;
<a name="l01031"></a>01031         <span class="keywordflow">break</span>;
<a name="l01032"></a>01032     <span class="keywordflow">case</span> <a class="code" href="control_8h.html#ac71832cf5445a694a178d15345d67840aabd8d7557b32d28d8bc7c22449a74b0b" title="value type is a string with max size of JACK_PARAM_STRING_MAX+1 chars">JackParamString</a>:
<a name="l01033"></a>01033         strcpy(jackctl_value.<a class="code" href="unionjackctl__parameter__value.html#adb7c766a89a9d377f11395fb9cc9c53b" title="member used for JackParamString">str</a>, value_ptr-&gt;str);
<a name="l01034"></a>01034         <span class="keywordflow">break</span>;
<a name="l01035"></a>01035     <span class="keywordflow">default</span>:
<a name="l01036"></a>01036         <a class="code" href="group__ServerControl.html#gac6448626e0b75fc6d9da1ccbdca0355e">jack_error</a>(<span class="stringliteral">&quot;bad driver parameter type %i (enum constraint)&quot;</span>, (<span class="keywordtype">int</span>)parameter_ptr-&gt;type);
<a name="l01037"></a>01037         assert(0);
<a name="l01038"></a>01038     }
<a name="l01039"></a>01039 
<a name="l01040"></a>01040     <span class="keywordflow">return</span> jackctl_value;
<a name="l01041"></a>01041 }
<a name="l01042"></a>01042 
<a name="l01043"></a><a class="code" href="group__ServerControl.html#gadbaa1566bcd829aa4233aac9234125ed">01043</a> EXPORT <span class="keyword">const</span> <span class="keywordtype">char</span> * <a class="code" href="group__ServerControl.html#gadbaa1566bcd829aa4233aac9234125ed">jackctl_parameter_get_enum_constraint_description</a>(<a class="code" href="structjackctl__parameter.html">jackctl_parameter</a> *parameter_ptr, uint32_t index)
<a name="l01044"></a>01044 {
<a name="l01045"></a>01045     <span class="keywordflow">return</span> parameter_ptr-&gt;constraint_ptr-&gt;constraint.<a class="code" href="structjack__driver__param__constraint__desc__t.html#a67423626dbe6bbe914e79c187677cec6">enumeration</a>.possible_values_array[index].short_desc;
<a name="l01046"></a>01046 }
<a name="l01047"></a>01047 
<a name="l01048"></a><a class="code" href="group__ServerControl.html#ga132d53b3fe319e84baf5a2381bd50fc6">01048</a> EXPORT <span class="keywordtype">void</span> <a class="code" href="group__ServerControl.html#ga132d53b3fe319e84baf5a2381bd50fc6">jackctl_parameter_get_range_constraint</a>(<a class="code" href="structjackctl__parameter.html">jackctl_parameter</a> *parameter_ptr, <span class="keyword">union</span> <a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> * min_ptr, <span class="keyword">union</span> <a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> * max_ptr)
<a name="l01049"></a>01049 {
<a name="l01050"></a>01050     <span class="keywordflow">switch</span> (parameter_ptr-&gt;type)
<a name="l01051"></a>01051     {
<a name="l01052"></a>01052     <span class="keywordflow">case</span> <a class="code" href="control_8h.html#ac71832cf5445a694a178d15345d67840a257077c62b40f8c7c6b253c21fcaa5e6" title="value type is a signed integer">JackParamInt</a>:
<a name="l01053"></a>01053         min_ptr-&gt;<a class="code" href="unionjackctl__parameter__value.html#a34bd19127b1d1f1b45dd62557052ed3f" title="member used for JackParamInt">i</a> = parameter_ptr-&gt;constraint_ptr-&gt;constraint.<a class="code" href="structjack__driver__param__constraint__desc__t.html#ad4093c0243f0c28f2350cdfbf41ca96e">range</a>.min.i;
<a name="l01054"></a>01054         max_ptr-&gt;<a class="code" href="unionjackctl__parameter__value.html#a34bd19127b1d1f1b45dd62557052ed3f" title="member used for JackParamInt">i</a> = parameter_ptr-&gt;constraint_ptr-&gt;constraint.<a class="code" href="structjack__driver__param__constraint__desc__t.html#ad4093c0243f0c28f2350cdfbf41ca96e">range</a>.max.i;
<a name="l01055"></a>01055         <span class="keywordflow">return</span>;
<a name="l01056"></a>01056     <span class="keywordflow">case</span> <a class="code" href="control_8h.html#ac71832cf5445a694a178d15345d67840a574c962072518406c2aebf6b3d6ddc71" title="value type is an unsigned integer">JackParamUInt</a>:
<a name="l01057"></a>01057         min_ptr-&gt;<a class="code" href="unionjackctl__parameter__value.html#aff0227f8e7a6959b93886febe576d0be" title="member used for JackParamUInt">ui</a> = parameter_ptr-&gt;constraint_ptr-&gt;constraint.<a class="code" href="structjack__driver__param__constraint__desc__t.html#ad4093c0243f0c28f2350cdfbf41ca96e">range</a>.min.ui;
<a name="l01058"></a>01058         max_ptr-&gt;<a class="code" href="unionjackctl__parameter__value.html#aff0227f8e7a6959b93886febe576d0be" title="member used for JackParamUInt">ui</a> = parameter_ptr-&gt;constraint_ptr-&gt;constraint.<a class="code" href="structjack__driver__param__constraint__desc__t.html#ad4093c0243f0c28f2350cdfbf41ca96e">range</a>.max.ui;
<a name="l01059"></a>01059         <span class="keywordflow">return</span>;
<a name="l01060"></a>01060     <span class="keywordflow">default</span>:
<a name="l01061"></a>01061         <a class="code" href="group__ServerControl.html#gac6448626e0b75fc6d9da1ccbdca0355e">jack_error</a>(<span class="stringliteral">&quot;bad driver parameter type %i (range constraint)&quot;</span>, (<span class="keywordtype">int</span>)parameter_ptr-&gt;type);
<a name="l01062"></a>01062         assert(0);
<a name="l01063"></a>01063     }
<a name="l01064"></a>01064 }
<a name="l01065"></a>01065 
<a name="l01066"></a><a class="code" href="group__ServerControl.html#gac1d74fdcc7125293b7c2d329c0b09e9a">01066</a> EXPORT <span class="keywordtype">bool</span> <a class="code" href="group__ServerControl.html#gac1d74fdcc7125293b7c2d329c0b09e9a">jackctl_parameter_constraint_is_strict</a>(<a class="code" href="structjackctl__parameter.html">jackctl_parameter_t</a> * parameter_ptr)
<a name="l01067"></a>01067 {
<a name="l01068"></a>01068     <span class="keywordflow">return</span> parameter_ptr-&gt;constraint_ptr != NULL &amp;&amp; (parameter_ptr-&gt;constraint_ptr-&gt;<a class="code" href="structjack__driver__param__constraint__desc__t.html#aedd94c67d95bdfbaafc4e90931804c2a">flags</a> &amp; JACK_CONSTRAINT_FLAG_STRICT) != 0;
<a name="l01069"></a>01069 }
<a name="l01070"></a>01070 
<a name="l01071"></a><a class="code" href="group__ServerControl.html#gafd1b5bc48305a978135692997abc8996">01071</a> EXPORT <span class="keywordtype">bool</span> <a class="code" href="group__ServerControl.html#gafd1b5bc48305a978135692997abc8996">jackctl_parameter_constraint_is_fake_value</a>(<a class="code" href="structjackctl__parameter.html">jackctl_parameter_t</a> * parameter_ptr)
<a name="l01072"></a>01072 {
<a name="l01073"></a>01073     <span class="keywordflow">return</span> parameter_ptr-&gt;constraint_ptr != NULL &amp;&amp; (parameter_ptr-&gt;constraint_ptr-&gt;<a class="code" href="structjack__driver__param__constraint__desc__t.html#aedd94c67d95bdfbaafc4e90931804c2a">flags</a> &amp; JACK_CONSTRAINT_FLAG_FAKE_VALUE) != 0;
<a name="l01074"></a>01074 }
<a name="l01075"></a>01075 
<a name="l01076"></a><a class="code" href="group__ServerControl.html#ga37fe25ce3d3fdbc631a12cab91c460bb">01076</a> EXPORT jackctl_param_type_t <a class="code" href="group__ServerControl.html#ga37fe25ce3d3fdbc631a12cab91c460bb">jackctl_parameter_get_type</a>(<a class="code" href="structjackctl__parameter.html">jackctl_parameter</a> *parameter_ptr)
<a name="l01077"></a>01077 {
<a name="l01078"></a>01078     <span class="keywordflow">return</span> parameter_ptr-&gt;type;
<a name="l01079"></a>01079 }
<a name="l01080"></a>01080 
<a name="l01081"></a><a class="code" href="group__ServerControl.html#ga864ee9036a98736910f264b1a62f0fe9">01081</a> EXPORT <span class="keywordtype">char</span> <a class="code" href="group__ServerControl.html#ga864ee9036a98736910f264b1a62f0fe9">jackctl_parameter_get_id</a>(<a class="code" href="structjackctl__parameter.html">jackctl_parameter_t</a> * parameter_ptr)
<a name="l01082"></a>01082 {
<a name="l01083"></a>01083     <span class="keywordflow">return</span> parameter_ptr-&gt;id;
<a name="l01084"></a>01084 }
<a name="l01085"></a>01085 
<a name="l01086"></a><a class="code" href="group__ServerControl.html#ga439234cd9c8cb1ff35a8bffef526f04b">01086</a> EXPORT <span class="keywordtype">bool</span> <a class="code" href="group__ServerControl.html#ga439234cd9c8cb1ff35a8bffef526f04b">jackctl_parameter_is_set</a>(<a class="code" href="structjackctl__parameter.html">jackctl_parameter</a> *parameter_ptr)
<a name="l01087"></a>01087 {
<a name="l01088"></a>01088     <span class="keywordflow">return</span> parameter_ptr-&gt;is_set;
<a name="l01089"></a>01089 }
<a name="l01090"></a>01090 
<a name="l01091"></a><a class="code" href="group__ServerControl.html#ga9881e66c9c235484e5b8879ce27bc9f2">01091</a> EXPORT <span class="keyword">union </span><a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> <a class="code" href="group__ServerControl.html#ga9881e66c9c235484e5b8879ce27bc9f2">jackctl_parameter_get_value</a>(<a class="code" href="structjackctl__parameter.html">jackctl_parameter</a> *parameter_ptr)
<a name="l01092"></a>01092 {
<a name="l01093"></a>01093     <span class="keywordflow">return</span> *parameter_ptr-&gt;value_ptr;
<a name="l01094"></a>01094 }
<a name="l01095"></a>01095 
<a name="l01096"></a><a class="code" href="group__ServerControl.html#gac75904b4d63158841b6f4667a7928788">01096</a> EXPORT <span class="keywordtype">bool</span> <a class="code" href="group__ServerControl.html#gac75904b4d63158841b6f4667a7928788">jackctl_parameter_reset</a>(<a class="code" href="structjackctl__parameter.html">jackctl_parameter</a> *parameter_ptr)
<a name="l01097"></a>01097 {
<a name="l01098"></a>01098     <span class="keywordflow">if</span> (!parameter_ptr-&gt;is_set)
<a name="l01099"></a>01099     {
<a name="l01100"></a>01100         <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l01101"></a>01101     }
<a name="l01102"></a>01102 
<a name="l01103"></a>01103     parameter_ptr-&gt;is_set = <span class="keyword">false</span>;
<a name="l01104"></a>01104 
<a name="l01105"></a>01105     *parameter_ptr-&gt;value_ptr = *parameter_ptr-&gt;default_value_ptr;
<a name="l01106"></a>01106 
<a name="l01107"></a>01107     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l01108"></a>01108 }
<a name="l01109"></a>01109 
<a name="l01110"></a><a class="code" href="group__ServerControl.html#gab769622731339e7d35e3b7093db347e6">01110</a> EXPORT <span class="keywordtype">bool</span> <a class="code" href="group__ServerControl.html#gab769622731339e7d35e3b7093db347e6">jackctl_parameter_set_value</a>(<a class="code" href="structjackctl__parameter.html">jackctl_parameter</a> *parameter_ptr, <span class="keyword">const</span> <span class="keyword">union</span> <a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> * value_ptr)
<a name="l01111"></a>01111 {
<a name="l01112"></a>01112     <span class="keywordtype">bool</span> new_driver_parameter;
<a name="l01113"></a>01113 
<a name="l01114"></a>01114     <span class="comment">/* for driver parameters, set the parameter by adding jack_driver_param_t in the set_parameters list */</span>
<a name="l01115"></a>01115     <span class="keywordflow">if</span> (parameter_ptr-&gt;driver_ptr != NULL)
<a name="l01116"></a>01116     {
<a name="l01117"></a>01117 <span class="comment">/*      jack_info(&quot;setting driver parameter %p ...&quot;, parameter_ptr); */</span>
<a name="l01118"></a>01118         new_driver_parameter = parameter_ptr-&gt;driver_parameter_ptr == NULL;
<a name="l01119"></a>01119         <span class="keywordflow">if</span> (new_driver_parameter)
<a name="l01120"></a>01120         {
<a name="l01121"></a>01121 <span class="comment">/*          jack_info(&quot;new driver parameter...&quot;); */</span>
<a name="l01122"></a>01122             parameter_ptr-&gt;driver_parameter_ptr = (<a class="code" href="structjack__driver__param__t.html">jack_driver_param_t</a> *)malloc(<span class="keyword">sizeof</span>(<a class="code" href="structjack__driver__param__t.html">jack_driver_param_t</a>));
<a name="l01123"></a>01123             <span class="keywordflow">if</span> (parameter_ptr-&gt;driver_parameter_ptr == NULL)
<a name="l01124"></a>01124             {
<a name="l01125"></a>01125                 <a class="code" href="group__ServerControl.html#gac6448626e0b75fc6d9da1ccbdca0355e">jack_error</a> (<span class="stringliteral">&quot;Allocation of jack_driver_param_t structure failed&quot;</span>);
<a name="l01126"></a>01126                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01127"></a>01127             }
<a name="l01128"></a>01128 
<a name="l01129"></a>01129            parameter_ptr-&gt;driver_parameter_ptr-&gt;character = parameter_ptr-&gt;id;
<a name="l01130"></a>01130            parameter_ptr-&gt;driver_ptr-&gt;set_parameters = jack_slist_append(parameter_ptr-&gt;driver_ptr-&gt;set_parameters, parameter_ptr-&gt;driver_parameter_ptr);
<a name="l01131"></a>01131         }
<a name="l01132"></a>01132 
<a name="l01133"></a>01133         <span class="keywordflow">switch</span> (parameter_ptr-&gt;type)
<a name="l01134"></a>01134         {
<a name="l01135"></a>01135         <span class="keywordflow">case</span> <a class="code" href="control_8h.html#ac71832cf5445a694a178d15345d67840a257077c62b40f8c7c6b253c21fcaa5e6" title="value type is a signed integer">JackParamInt</a>:
<a name="l01136"></a>01136             parameter_ptr-&gt;driver_parameter_ptr-&gt;value.i = value_ptr-&gt;<a class="code" href="unionjackctl__parameter__value.html#a34bd19127b1d1f1b45dd62557052ed3f" title="member used for JackParamInt">i</a>;
<a name="l01137"></a>01137             <span class="keywordflow">break</span>;
<a name="l01138"></a>01138         <span class="keywordflow">case</span> <a class="code" href="control_8h.html#ac71832cf5445a694a178d15345d67840a574c962072518406c2aebf6b3d6ddc71" title="value type is an unsigned integer">JackParamUInt</a>:
<a name="l01139"></a>01139             parameter_ptr-&gt;driver_parameter_ptr-&gt;value.ui = value_ptr-&gt;<a class="code" href="unionjackctl__parameter__value.html#aff0227f8e7a6959b93886febe576d0be" title="member used for JackParamUInt">ui</a>;
<a name="l01140"></a>01140             <span class="keywordflow">break</span>;
<a name="l01141"></a>01141         <span class="keywordflow">case</span> <a class="code" href="control_8h.html#ac71832cf5445a694a178d15345d67840aab44adbfbb163aa6b6ad52eac90b2bfb" title="value type is a char">JackParamChar</a>:
<a name="l01142"></a>01142             parameter_ptr-&gt;driver_parameter_ptr-&gt;value.c = value_ptr-&gt;<a class="code" href="unionjackctl__parameter__value.html#a818569c9b5ff786af53e83607e46127c" title="member used for JackParamChar">c</a>;
<a name="l01143"></a>01143             <span class="keywordflow">break</span>;
<a name="l01144"></a>01144         <span class="keywordflow">case</span> <a class="code" href="control_8h.html#ac71832cf5445a694a178d15345d67840aabd8d7557b32d28d8bc7c22449a74b0b" title="value type is a string with max size of JACK_PARAM_STRING_MAX+1 chars">JackParamString</a>:
<a name="l01145"></a>01145             strcpy(parameter_ptr-&gt;driver_parameter_ptr-&gt;value.str, value_ptr-&gt;<a class="code" href="unionjackctl__parameter__value.html#adb7c766a89a9d377f11395fb9cc9c53b" title="member used for JackParamString">str</a>);
<a name="l01146"></a>01146             <span class="keywordflow">break</span>;
<a name="l01147"></a>01147         <span class="keywordflow">case</span> <a class="code" href="control_8h.html#ac71832cf5445a694a178d15345d67840a766feed3831809abe9b67872086f241f" title="value type is a boolean">JackParamBool</a>:
<a name="l01148"></a>01148             parameter_ptr-&gt;driver_parameter_ptr-&gt;value.i = value_ptr-&gt;<a class="code" href="unionjackctl__parameter__value.html#a9765ef8c57c7b9993c645e985cc4a75d" title="member used for JackParamBool">b</a>;
<a name="l01149"></a>01149             <span class="keywordflow">break</span>;
<a name="l01150"></a>01150         <span class="keywordflow">default</span>:
<a name="l01151"></a>01151             <a class="code" href="group__ServerControl.html#gac6448626e0b75fc6d9da1ccbdca0355e">jack_error</a>(<span class="stringliteral">&quot;unknown parameter type %i&quot;</span>, (<span class="keywordtype">int</span>)parameter_ptr-&gt;type);
<a name="l01152"></a>01152             assert(0);
<a name="l01153"></a>01153 
<a name="l01154"></a>01154             <span class="keywordflow">if</span> (new_driver_parameter)
<a name="l01155"></a>01155             {
<a name="l01156"></a>01156                 parameter_ptr-&gt;driver_ptr-&gt;set_parameters = jack_slist_remove(parameter_ptr-&gt;driver_ptr-&gt;set_parameters, parameter_ptr-&gt;driver_parameter_ptr);
<a name="l01157"></a>01157             }
<a name="l01158"></a>01158 
<a name="l01159"></a>01159             <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01160"></a>01160         }
<a name="l01161"></a>01161     }
<a name="l01162"></a>01162 
<a name="l01163"></a>01163     parameter_ptr-&gt;is_set = <span class="keyword">true</span>;
<a name="l01164"></a>01164     *parameter_ptr-&gt;value_ptr = *value_ptr;
<a name="l01165"></a>01165 
<a name="l01166"></a>01166     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l01167"></a>01167 }
<a name="l01168"></a>01168 
<a name="l01169"></a><a class="code" href="group__ServerControl.html#gaa71bfc637794e50ccd5c39d0449b982a">01169</a> EXPORT <span class="keyword">union </span><a class="code" href="unionjackctl__parameter__value.html" title="Type for parameter value.">jackctl_parameter_value</a> <a class="code" href="group__ServerControl.html#gaa71bfc637794e50ccd5c39d0449b982a">jackctl_parameter_get_default_value</a>(<a class="code" href="structjackctl__parameter.html">jackctl_parameter</a> *parameter_ptr)
<a name="l01170"></a>01170 {
<a name="l01171"></a>01171     <span class="keywordflow">return</span> *parameter_ptr-&gt;default_value_ptr;
<a name="l01172"></a>01172 }
<a name="l01173"></a>01173 
<a name="l01174"></a>01174 <span class="comment">// Internals clients</span>
<a name="l01175"></a>01175 
<a name="l01176"></a><a class="code" href="group__ServerControl.html#gacf1e2a650fec3f019bb36e49ffacde4f">01176</a> EXPORT <span class="keyword">const</span> <a class="code" href="struct__JSList.html">JSList</a> * <a class="code" href="group__ServerControl.html#gacf1e2a650fec3f019bb36e49ffacde4f">jackctl_server_get_internals_list</a>(<a class="code" href="structjackctl__server.html">jackctl_server</a> *server_ptr)
<a name="l01177"></a>01177 {
<a name="l01178"></a>01178     <span class="keywordflow">return</span> server_ptr-&gt;internals;
<a name="l01179"></a>01179 }
<a name="l01180"></a>01180 
<a name="l01181"></a><a class="code" href="group__ServerControl.html#ga4d14a6526174de9d085b203a7b7d632a">01181</a> EXPORT <span class="keyword">const</span> <span class="keywordtype">char</span> * <a class="code" href="group__ServerControl.html#ga4d14a6526174de9d085b203a7b7d632a">jackctl_internal_get_name</a>(<a class="code" href="structjackctl__internal.html">jackctl_internal</a> *internal_ptr)
<a name="l01182"></a>01182 {
<a name="l01183"></a>01183     <span class="keywordflow">return</span> internal_ptr-&gt;desc_ptr-&gt;<a class="code" href="structjack__driver__desc__t.html#a42ee3aae5d4587330cb03879eacc760b">name</a>;
<a name="l01184"></a>01184 }
<a name="l01185"></a>01185 
<a name="l01186"></a><a class="code" href="group__ServerControl.html#gade591618ee972b92724be7ee87a3943a">01186</a> EXPORT <span class="keyword">const</span> <a class="code" href="struct__JSList.html">JSList</a> * <a class="code" href="group__ServerControl.html#gade591618ee972b92724be7ee87a3943a">jackctl_internal_get_parameters</a>(<a class="code" href="structjackctl__internal.html">jackctl_internal</a> *internal_ptr)
<a name="l01187"></a>01187 {
<a name="l01188"></a>01188     <span class="keywordflow">return</span> internal_ptr-&gt;parameters;
<a name="l01189"></a>01189 }
<a name="l01190"></a>01190 
<a name="l01191"></a><a class="code" href="group__ServerControl.html#ga338effc099ff0cf03648971df51f9086">01191</a> EXPORT <span class="keywordtype">bool</span> <a class="code" href="group__ServerControl.html#ga338effc099ff0cf03648971df51f9086">jackctl_server_load_internal</a>(
<a name="l01192"></a>01192     <a class="code" href="structjackctl__server.html">jackctl_server</a> * server_ptr,
<a name="l01193"></a>01193     <a class="code" href="structjackctl__internal.html">jackctl_internal</a> * <span class="keyword">internal</span>)
<a name="l01194"></a>01194 {
<a name="l01195"></a>01195     <span class="keywordtype">int</span> status;
<a name="l01196"></a>01196     <span class="keywordflow">if</span> (server_ptr-&gt;engine != NULL) {
<a name="l01197"></a>01197         server_ptr-&gt;engine-&gt;InternalClientLoad2(internal-&gt;desc_ptr-&gt;name, internal-&gt;desc_ptr-&gt;name, internal-&gt;set_parameters, JackNullOption, &amp;internal-&gt;refnum, -1, &amp;status);
<a name="l01198"></a>01198         <span class="keywordflow">return</span> (internal-&gt;refnum &gt; 0);
<a name="l01199"></a>01199     } <span class="keywordflow">else</span> {
<a name="l01200"></a>01200         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01201"></a>01201     }
<a name="l01202"></a>01202 }
<a name="l01203"></a>01203 
<a name="l01204"></a><a class="code" href="group__ServerControl.html#gac0d0b9b2c5323da9193db9a0aa84bdf9">01204</a> EXPORT <span class="keywordtype">bool</span> <a class="code" href="group__ServerControl.html#gac0d0b9b2c5323da9193db9a0aa84bdf9">jackctl_server_unload_internal</a>(
<a name="l01205"></a>01205     <a class="code" href="structjackctl__server.html">jackctl_server</a> * server_ptr,
<a name="l01206"></a>01206     <a class="code" href="structjackctl__internal.html">jackctl_internal</a> * <span class="keyword">internal</span>)
<a name="l01207"></a>01207 {
<a name="l01208"></a>01208     <span class="keywordtype">int</span> status;
<a name="l01209"></a>01209     <span class="keywordflow">if</span> (server_ptr-&gt;engine != NULL &amp;&amp; internal-&gt;refnum &gt; 0) {
<a name="l01210"></a>01210         <span class="comment">// Client object is internally kept in JackEngine, and will be desallocated in InternalClientUnload</span>
<a name="l01211"></a>01211         <span class="keywordflow">return</span> ((server_ptr-&gt;engine-&gt;GetEngine()-&gt;InternalClientUnload(internal-&gt;refnum, &amp;status)) == 0);
<a name="l01212"></a>01212     } <span class="keywordflow">else</span> {
<a name="l01213"></a>01213         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01214"></a>01214     }
<a name="l01215"></a>01215 }
<a name="l01216"></a>01216 
<a name="l01217"></a><a class="code" href="group__ServerControl.html#gadacbb19d2f9e614ce33c8aedaa04fda1">01217</a> EXPORT <span class="keywordtype">bool</span> <a class="code" href="group__ServerControl.html#gadacbb19d2f9e614ce33c8aedaa04fda1">jackctl_server_add_slave</a>(<a class="code" href="structjackctl__server.html">jackctl_server</a> * server_ptr, <a class="code" href="structjackctl__driver.html">jackctl_driver</a> * driver_ptr)
<a name="l01218"></a>01218 {
<a name="l01219"></a>01219     <span class="keywordflow">if</span> (server_ptr-&gt;engine != NULL) {
<a name="l01220"></a>01220         <span class="keywordflow">if</span> (server_ptr-&gt;engine-&gt;IsRunning()) {
<a name="l01221"></a>01221             <a class="code" href="group__ServerControl.html#gac6448626e0b75fc6d9da1ccbdca0355e">jack_error</a>(<span class="stringliteral">&quot;cannot add a slave in a running server&quot;</span>);
<a name="l01222"></a>01222             <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01223"></a>01223         } <span class="keywordflow">else</span> {
<a name="l01224"></a>01224             driver_ptr-&gt;info = server_ptr-&gt;engine-&gt;AddSlave(driver_ptr-&gt;desc_ptr, driver_ptr-&gt;set_parameters);
<a name="l01225"></a>01225             <span class="keywordflow">return</span> (driver_ptr-&gt;info != 0);
<a name="l01226"></a>01226         }
<a name="l01227"></a>01227     } <span class="keywordflow">else</span> {
<a name="l01228"></a>01228         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01229"></a>01229     }
<a name="l01230"></a>01230 }
<a name="l01231"></a>01231 
<a name="l01232"></a><a class="code" href="group__ServerControl.html#gac71a7c5d85e891a51a57f2575aea627c">01232</a> EXPORT <span class="keywordtype">bool</span> <a class="code" href="group__ServerControl.html#gac71a7c5d85e891a51a57f2575aea627c">jackctl_server_remove_slave</a>(<a class="code" href="structjackctl__server.html">jackctl_server</a> * server_ptr, <a class="code" href="structjackctl__driver.html">jackctl_driver</a> * driver_ptr)
<a name="l01233"></a>01233 {
<a name="l01234"></a>01234     <span class="keywordflow">if</span> (server_ptr-&gt;engine != NULL) {
<a name="l01235"></a>01235         <span class="keywordflow">if</span> (server_ptr-&gt;engine-&gt;IsRunning()) {
<a name="l01236"></a>01236             <a class="code" href="group__ServerControl.html#gac6448626e0b75fc6d9da1ccbdca0355e">jack_error</a>(<span class="stringliteral">&quot;cannot remove a slave from a running server&quot;</span>);
<a name="l01237"></a>01237             <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01238"></a>01238         } <span class="keywordflow">else</span> {
<a name="l01239"></a>01239             server_ptr-&gt;engine-&gt;RemoveSlave(driver_ptr-&gt;info);
<a name="l01240"></a>01240             <span class="keyword">delete</span> driver_ptr-&gt;info;
<a name="l01241"></a>01241             <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l01242"></a>01242         }
<a name="l01243"></a>01243     } <span class="keywordflow">else</span> {
<a name="l01244"></a>01244         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01245"></a>01245     }
<a name="l01246"></a>01246 }
<a name="l01247"></a>01247 
<a name="l01248"></a><a class="code" href="group__ServerControl.html#ga3bfe5d4befb9d9bab8f05e13d37ca7b3">01248</a> EXPORT <span class="keywordtype">bool</span> <a class="code" href="group__ServerControl.html#ga3bfe5d4befb9d9bab8f05e13d37ca7b3">jackctl_server_switch_master</a>(<a class="code" href="structjackctl__server.html">jackctl_server</a> * server_ptr, <a class="code" href="structjackctl__driver.html">jackctl_driver</a> * driver_ptr)
<a name="l01249"></a>01249 {
<a name="l01250"></a>01250     <span class="keywordflow">if</span> (server_ptr-&gt;engine != NULL) {
<a name="l01251"></a>01251         <span class="keywordflow">return</span> (server_ptr-&gt;engine-&gt;<a class="code" href="classJack_1_1JackServer.html#a61d163dbe6766491096c1e28564a69c8">SwitchMaster</a>(driver_ptr-&gt;desc_ptr, driver_ptr-&gt;set_parameters) == 0);
<a name="l01252"></a>01252     } <span class="keywordflow">else</span> {
<a name="l01253"></a>01253         <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l01254"></a>01254     }
<a name="l01255"></a>01255 }
<a name="l01256"></a>01256 
</pre></div></div>
</div>
<hr size="1"><address style="text-align: right;"><small>
Generated for Jack2 by <a href="http://www.doxygen.org/
index.html"><img src="doxygen.png" alt="doxygen" align="middle" border="0"></a>
1.7.3</small></address>
</body>
</html>