-
Notifications
You must be signed in to change notification settings - Fork 81
Expand file tree
/
Copy pathtransport-design.html
More file actions
223 lines (221 loc) · 26.1 KB
/
transport-design.html
File metadata and controls
223 lines (221 loc) · 26.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://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"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.9.1"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>JACK-AUDIO-CONNECTION-KIT: JACK Transport Design</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function() { init_search(); });
/* @license-end */
</script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">JACK-AUDIO-CONNECTION-KIT
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.1 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search','.html');
/* @license-end */
</script>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main Page</span></a></li>
<li class="current"><a href="pages.html"><span>Related Pages</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data Structures</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
<li>
<div id="MSearchBox" class="MSearchBoxInactive">
<span class="left">
<img id="MSearchSelect" src="search/mag_sel.svg"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
alt=""/>
<input type="text" id="MSearchField" value="Search" accesskey="S"
onfocus="searchBox.OnSearchFieldFocus(true)"
onblur="searchBox.OnSearchFieldFocus(false)"
onkeyup="searchBox.OnSearchFieldChange(event)"/>
</span><span class="right">
<a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.svg" alt=""/></a>
</span>
</div>
</li>
</ul>
</div>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
</div><!-- top -->
<div class="PageDoc"><div class="header">
<div class="headertitle">
<div class="title">JACK Transport Design </div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><p>The <a class="el" href="index.html">JACK Audio Connection Kit</a> provides simple transport interfaces for starting, stopping and repositioning a set of clients. This document describes the overall design of these interfaces, their detailed specifications are in <<a class="el" href="transport_8h.html">jack/transport.h</a>></p>
<ul>
<li><a class="el" href="transport-design.html#requirements">Requirements</a></li>
<li><a class="el" href="transport-design.html#overview">Overview</a></li>
<li><a class="el" href="transport-design.html#timebase">Timebase Master</a></li>
<li><a class="el" href="transport-design.html#transportcontrol">Transport Control</a></li>
<li><a class="el" href="transport-design.html#transportclients">Transport Clients</a></li>
<li><a class="el" href="transport-design.html#compatibility">Compatibility</a></li>
<li><a class="el" href="transport-design.html#issues">Issues Not Addressed</a></li>
</ul>
<h1><a class="anchor" id="requirements"></a>
Requirements</h1>
<ul>
<li>We need sample-level accuracy for transport control. This implies that the transport client logic has to be part of the realtime process chain.</li>
<li>We don't want to add another context switch. So, the transport client logic has to run in the context of the client's process thread. To avoid making an extra pass through the process graph, no transport changes take effect until the following process cycle. That way, the transport info is stable throughout each cycle.</li>
<li>We want to allow multiple clients to change the transport state. This is mostly a usability issue. Any client can start or stop playback, or seek to a new location. The user need not switch windows to accomplish these tasks.</li>
<li>We want a way for clients with heavyweight state to sync up when the user presses "play", before the transport starts rolling.</li>
<li>We want to provide for ongoing binary compatibility as the transport design evolves.</li>
</ul>
<h1><a class="anchor" id="overview"></a>
Overview</h1>
<p>The former transport master role has been divided into two layers:</p>
<ul>
<li><a class="el" href="transport-design.html#timebase">Timebase Master</a> - counting beats, frames, etc. on every cycle.</li>
<li><a class="el" href="transport-design.html#transportcontrol">Transport Control</a> - start, stop and reposition the playback. <br />
</li>
</ul>
<p>Existing transport clients continue to work in compatibility mode. But, old-style timebase masters will no longer control the transport.</p>
<h1><a class="anchor" id="timebase"></a>
Timebase Master</h1>
<p>The timebase master continuously updates extended position information, counting beats, timecode, etc. Without this extended information, there is no need for this function. There is at most one master active at a time. If no client is registered as timebase master, frame numbers will be the only position information available.</p>
<p>The timebase master registers a callback that updates position information while the transport is rolling. Its output affects the following process cycle. This function is called immediately after the process callback in the same thread whenever the transport is rolling, or when any client has set a new position in the previous cycle. The first cycle after <a class="el" href="group__TransportControl.html#ga0c2f2f464f6ba1c0b2aa45e6507b7aa9">jack_set_timebase_callback()</a> is also treated as a new position, or the first cycle after <a class="el" href="group__ClientFunctions.html#ga9800d5b29bd7670d9944a15f6ea0ecf8">jack_activate()</a> if the client had been inactive.</p>
<div class="fragment"><div class="line"><span class="keyword">typedef</span> int (*<a class="code" href="group__TransportControl.html#ga27ed5006f91b931408b11a5b31150af0">JackTimebaseCallback</a>)(<a class="code" href="transport_8h.html#a66e50952a88eb087867922bfe3d0bd72">jack_transport_state_t</a> state,</div>
<div class="line"> <a class="code" href="types_8h.html#aa954df532e901ae5172e68a23f3da9b6">jack_nframes_t</a> nframes,</div>
<div class="line"> <a class="code" href="structjack__position__t.html">jack_position_t</a> *pos,</div>
<div class="line"> <span class="keywordtype">int</span> new_pos,</div>
<div class="line"> <span class="keywordtype">void</span> *arg);</div>
<div class="ttc" id="agroup__TransportControl_html_ga27ed5006f91b931408b11a5b31150af0"><div class="ttname"><a href="group__TransportControl.html#ga27ed5006f91b931408b11a5b31150af0">JackTimebaseCallback</a></div><div class="ttdeci">void(* JackTimebaseCallback)(jack_transport_state_t state, jack_nframes_t nframes, jack_position_t *pos, int new_pos, void *arg)</div><div class="ttdef"><b>Definition:</b> transport.h:327</div></div>
<div class="ttc" id="astructjack__position__t_html"><div class="ttname"><a href="structjack__position__t.html">jack_position_t</a></div><div class="ttdef"><b>Definition:</b> transport.h:68</div></div>
<div class="ttc" id="atransport_8h_html_a66e50952a88eb087867922bfe3d0bd72"><div class="ttname"><a href="transport_8h.html#a66e50952a88eb087867922bfe3d0bd72">jack_transport_state_t</a></div><div class="ttdeci">jack_transport_state_t</div><div class="ttdef"><b>Definition:</b> transport.h:34</div></div>
<div class="ttc" id="atypes_8h_html_aa954df532e901ae5172e68a23f3da9b6"><div class="ttname"><a href="types_8h.html#aa954df532e901ae5172e68a23f3da9b6">jack_nframes_t</a></div><div class="ttdeci">uint32_t jack_nframes_t</div><div class="ttdef"><b>Definition:</b> types.h:53</div></div>
</div><!-- fragment --><p>When a new client takes over, the former timebase callback is no longer called. Taking over the timebase may be done conditionally, in which case the takeover fails when there is a master already. The existing master can release it voluntarily, if desired.</p>
<div class="fragment"><div class="line"><span class="keywordtype">int</span> <a class="code" href="group__TransportControl.html#ga0c2f2f464f6ba1c0b2aa45e6507b7aa9">jack_set_timebase_callback</a> (<a class="code" href="types_8h.html#a96cf103940d2ee71b141d4b9d0c116bf">jack_client_t</a> *client,</div>
<div class="line"> <span class="keywordtype">int</span> conditional,</div>
<div class="line"> <a class="code" href="group__TransportControl.html#ga27ed5006f91b931408b11a5b31150af0">JackTimebaseCallback</a> timebase_callback,</div>
<div class="line"> <span class="keywordtype">void</span> *arg);</div>
<div class="line"> </div>
<div class="line"><span class="keywordtype">int</span> <a class="code" href="group__TransportControl.html#gaea06ff63b129ec6266b2b805b6c8216a">jack_release_timebase</a>(<a class="code" href="types_8h.html#a96cf103940d2ee71b141d4b9d0c116bf">jack_client_t</a> *client);</div>
<div class="ttc" id="agroup__TransportControl_html_ga0c2f2f464f6ba1c0b2aa45e6507b7aa9"><div class="ttname"><a href="group__TransportControl.html#ga0c2f2f464f6ba1c0b2aa45e6507b7aa9">jack_set_timebase_callback</a></div><div class="ttdeci">int jack_set_timebase_callback(jack_client_t *client, int conditional, JackTimebaseCallback timebase_callback, void *arg) JACK_OPTIONAL_WEAK_EXPORT</div></div>
<div class="ttc" id="agroup__TransportControl_html_gaea06ff63b129ec6266b2b805b6c8216a"><div class="ttname"><a href="group__TransportControl.html#gaea06ff63b129ec6266b2b805b6c8216a">jack_release_timebase</a></div><div class="ttdeci">int jack_release_timebase(jack_client_t *client) JACK_OPTIONAL_WEAK_EXPORT</div></div>
<div class="ttc" id="atypes_8h_html_a96cf103940d2ee71b141d4b9d0c116bf"><div class="ttname"><a href="types_8h.html#a96cf103940d2ee71b141d4b9d0c116bf">jack_client_t</a></div><div class="ttdeci">struct _jack_client jack_client_t</div><div class="ttdef"><b>Definition:</b> types.h:89</div></div>
</div><!-- fragment --><p>If the timebase master releases the timebase or exits the JACK graph for any reason, the JACK engine takes over at the start of the next process cycle. The transport state does not change. If rolling, it continues to play, with frame numbers as the only available position information.</p>
<h1><a class="anchor" id="transportcontrol"></a>
Transport Control</h1>
<p>The JACK engine itself manages stopping and starting of the transport. Any client can make transport control requests at any time. These requests take effect no sooner than the next process cycle, sometimes later. The transport state is always valid, initially it is <a class="el" href="group__TransportControl.html#ga66e50952a88eb087867922bfe3d0bd72a30087dc754e67549d91e78a4242393f0">JackTransportStopped</a>.</p>
<div class="fragment"><div class="line"><span class="keywordtype">void</span> <a class="code" href="group__TransportControl.html#gab7b158bec8f27c03da29795f142d1caf">jack_transport_start</a> (<a class="code" href="types_8h.html#a96cf103940d2ee71b141d4b9d0c116bf">jack_client_t</a> *client);</div>
<div class="line"><span class="keywordtype">void</span> <a class="code" href="group__TransportControl.html#ga6be6637c314bd88344826e9bcc1957b0">jack_transport_stop</a> (<a class="code" href="types_8h.html#a96cf103940d2ee71b141d4b9d0c116bf">jack_client_t</a> *client);</div>
<div class="ttc" id="agroup__TransportControl_html_ga6be6637c314bd88344826e9bcc1957b0"><div class="ttname"><a href="group__TransportControl.html#ga6be6637c314bd88344826e9bcc1957b0">jack_transport_stop</a></div><div class="ttdeci">void jack_transport_stop(jack_client_t *client) JACK_OPTIONAL_WEAK_EXPORT</div></div>
<div class="ttc" id="agroup__TransportControl_html_gab7b158bec8f27c03da29795f142d1caf"><div class="ttname"><a href="group__TransportControl.html#gab7b158bec8f27c03da29795f142d1caf">jack_transport_start</a></div><div class="ttdeci">void jack_transport_start(jack_client_t *client) JACK_OPTIONAL_WEAK_EXPORT</div></div>
</div><!-- fragment --><h2><a class="anchor" id="slowsyncclients"></a>
Slow-sync clients</h2>
<p>The engine handles polling of slow-sync clients. When someone calls <a class="el" href="group__TransportControl.html#gab7b158bec8f27c03da29795f142d1caf">jack_transport_start()</a>, the engine resets the poll bits and changes to a new state, <a class="el" href="group__TransportControl.html#ga66e50952a88eb087867922bfe3d0bd72a8c1e22fce8ef6c18baf7a5c6a69060ac">JackTransportStarting</a>. The <em>sync_callback</em> function for each slow-sync client will be invoked in the JACK process thread while the transport is starting. If it has not already done so, the client needs to initiate a seek to reach the starting position. The <em>sync_callback</em> returns false until the seek completes and the client is ready to play. When all slow-sync clients are ready, the state changes to <a class="el" href="group__TransportControl.html#ga66e50952a88eb087867922bfe3d0bd72a4077d7d6fe566f3f0441755a588ad1b2">JackTransportRolling</a>.</p>
<div class="fragment"><div class="line"><span class="keyword">typedef</span> int (*<a class="code" href="group__TransportControl.html#ga566f27eba84e0029eb05a631be52b2e5">JackSyncCallback</a>)(<a class="code" href="transport_8h.html#a66e50952a88eb087867922bfe3d0bd72">jack_transport_state_t</a> state,</div>
<div class="line"> <a class="code" href="structjack__position__t.html">jack_position_t</a> *pos, <span class="keywordtype">void</span> *arg);</div>
<div class="ttc" id="agroup__TransportControl_html_ga566f27eba84e0029eb05a631be52b2e5"><div class="ttname"><a href="group__TransportControl.html#ga566f27eba84e0029eb05a631be52b2e5">JackSyncCallback</a></div><div class="ttdeci">int(* JackSyncCallback)(jack_transport_state_t state, jack_position_t *pos, void *arg)</div><div class="ttdef"><b>Definition:</b> transport.h:250</div></div>
</div><!-- fragment --><p>This callback is a realtime function that runs in the JACK process thread.</p>
<div class="fragment"><div class="line"><span class="keywordtype">int</span> <a class="code" href="group__TransportControl.html#gae53f7ac54804d2896d51b6ad599fa93c">jack_set_sync_callback</a> (<a class="code" href="types_8h.html#a96cf103940d2ee71b141d4b9d0c116bf">jack_client_t</a> *client,</div>
<div class="line"> <a class="code" href="group__TransportControl.html#ga566f27eba84e0029eb05a631be52b2e5">JackSyncCallback</a> sync_callback, <span class="keywordtype">void</span> *arg);</div>
<div class="ttc" id="agroup__TransportControl_html_gae53f7ac54804d2896d51b6ad599fa93c"><div class="ttname"><a href="group__TransportControl.html#gae53f7ac54804d2896d51b6ad599fa93c">jack_set_sync_callback</a></div><div class="ttdeci">int jack_set_sync_callback(jack_client_t *client, JackSyncCallback sync_callback, void *arg) JACK_OPTIONAL_WEAK_EXPORT</div></div>
</div><!-- fragment --><p>Clients that don't declare a <em>sync_callback</em> are assumed to be ready immediately, any time the transport wants to start. If a client no longer requires slow-sync processing, it can set its <em>sync_callback</em> to NULL.</p>
<div class="fragment"><div class="line"><span class="keywordtype">int</span> <a class="code" href="group__TransportControl.html#ga2e89b0bb8702d34bcbbe1eac70685ab2">jack_set_sync_timeout</a> (<a class="code" href="types_8h.html#a96cf103940d2ee71b141d4b9d0c116bf">jack_client_t</a> *client,</div>
<div class="line"> <a class="code" href="types_8h.html#af9a29b8728e95cc38e2932c0ef855b7e">jack_time_t</a> usecs);</div>
<div class="ttc" id="agroup__TransportControl_html_ga2e89b0bb8702d34bcbbe1eac70685ab2"><div class="ttname"><a href="group__TransportControl.html#ga2e89b0bb8702d34bcbbe1eac70685ab2">jack_set_sync_timeout</a></div><div class="ttdeci">int jack_set_sync_timeout(jack_client_t *client, jack_time_t timeout) JACK_OPTIONAL_WEAK_EXPORT</div></div>
<div class="ttc" id="atypes_8h_html_af9a29b8728e95cc38e2932c0ef855b7e"><div class="ttname"><a href="types_8h.html#af9a29b8728e95cc38e2932c0ef855b7e">jack_time_t</a></div><div class="ttdeci">uint64_t jack_time_t</div><div class="ttdef"><b>Definition:</b> types.h:64</div></div>
</div><!-- fragment --><p>There must be a <em>timeout</em> to prevent unresponsive slow-sync clients from completely halting the transport mechanism. Two seconds is the default. When this <em>timeout</em> expires, the transport will start rolling, even if some slow-sync clients are still unready. The <em>sync_callback</em> for these clients continues being invoked, giving them an opportunity to catch up.</p>
<h2><a class="anchor" id="repositioning"></a>
Repositioning</h2>
<div class="fragment"><div class="line"><span class="keywordtype">int</span> <a class="code" href="group__TransportControl.html#ga2f371010358add3cbed8454bd0bd2ef8">jack_transport_reposition</a> (<a class="code" href="types_8h.html#a96cf103940d2ee71b141d4b9d0c116bf">jack_client_t</a> *client,</div>
<div class="line"> <a class="code" href="structjack__position__t.html">jack_position_t</a> *pos);</div>
<div class="line"><span class="keywordtype">int</span> <a class="code" href="group__TransportControl.html#gab3f52a42084aead87fd1ee75ed25b240">jack_transport_locate</a> (<a class="code" href="types_8h.html#a96cf103940d2ee71b141d4b9d0c116bf">jack_client_t</a> *client,</div>
<div class="line"> <a class="code" href="types_8h.html#aa954df532e901ae5172e68a23f3da9b6">jack_nframes_t</a> frame);</div>
<div class="ttc" id="agroup__TransportControl_html_ga2f371010358add3cbed8454bd0bd2ef8"><div class="ttname"><a href="group__TransportControl.html#ga2f371010358add3cbed8454bd0bd2ef8">jack_transport_reposition</a></div><div class="ttdeci">int jack_transport_reposition(jack_client_t *client, const jack_position_t *pos) JACK_OPTIONAL_WEAK_EXPORT</div></div>
<div class="ttc" id="agroup__TransportControl_html_gab3f52a42084aead87fd1ee75ed25b240"><div class="ttname"><a href="group__TransportControl.html#gab3f52a42084aead87fd1ee75ed25b240">jack_transport_locate</a></div><div class="ttdeci">int jack_transport_locate(jack_client_t *client, jack_nframes_t frame) JACK_OPTIONAL_WEAK_EXPORT</div></div>
</div><!-- fragment --><p>These request a new transport position. They can be called at any time by any client. Even the timebase master must use them. If the request is valid, it goes into effect in two process cycles. If there are slow-sync clients and the transport is already rolling, it will enter the <a class="el" href="group__TransportControl.html#ga66e50952a88eb087867922bfe3d0bd72a8c1e22fce8ef6c18baf7a5c6a69060ac">JackTransportStarting</a> state and begin invoking their <em>sync_callbacks</em> until ready.</p>
<h2><a class="anchor" id="transportstatetransitiondiagram"></a>
Transport State Transition Diagram</h2>
<div class="image">
<img src="fsm.png" alt=""/>
<div class="caption">
Transport State Transition Diagram</div></div>
<h1><a class="anchor" id="transportclients"></a>
Transport Clients</h1>
<p>Transport clients were formerly known as "transport slaves". We want to make it easy for almost every JACK client to be a transport client.</p>
<div class="fragment"><div class="line"><a class="code" href="transport_8h.html#a66e50952a88eb087867922bfe3d0bd72">jack_transport_state_t</a> <a class="code" href="group__TransportControl.html#ga5f08eb71a5ee5431a3d756af5729d5aa">jack_transport_query</a> (<a class="code" href="types_8h.html#a96cf103940d2ee71b141d4b9d0c116bf">jack_client_t</a> *client,</div>
<div class="line"> <a class="code" href="structjack__position__t.html">jack_position_t</a> *pos);</div>
<div class="ttc" id="agroup__TransportControl_html_ga5f08eb71a5ee5431a3d756af5729d5aa"><div class="ttname"><a href="group__TransportControl.html#ga5f08eb71a5ee5431a3d756af5729d5aa">jack_transport_query</a></div><div class="ttdeci">jack_transport_state_t jack_transport_query(const jack_client_t *client, jack_position_t *pos) JACK_OPTIONAL_WEAK_EXPORT</div></div>
</div><!-- fragment --><p>This function can be called from any thread. If called from the process thread, <em>pos</em> corresponds to the first frame of the current cycle and the state returned is valid for the entire cycle.</p>
<h1><a class="anchor" id="compatibility"></a>
Compatibility</h1>
<p>During the transition period we will support the old-style interfaces in compatibility mode as deprecated interfaces. This compatibility is not 100%, there are limitations. <br />
</p>
<p>The main reasons for doing this are:</p>
<ul>
<li>facilitate testing with clients that already have transport support</li>
<li>provide a clean migration path, so application developers are not discouraged from supporting the transport interface</li>
</ul>
<p>These deprecated interfaces continue to work:</p>
<div class="fragment"><div class="line"><span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structjack__transport__info__t.html">jack_transport_info_t</a>;</div>
<div class="line"> </div>
<div class="line"><span class="keywordtype">void</span> <a class="code" href="group__TransportControl.html#ga994ea49b518181fbdee2adc9be1ee40e">jack_get_transport_info</a> (<a class="code" href="types_8h.html#a96cf103940d2ee71b141d4b9d0c116bf">jack_client_t</a> *client,</div>
<div class="line"> <a class="code" href="structjack__transport__info__t.html">jack_transport_info_t</a> *tinfo);</div>
<div class="ttc" id="agroup__TransportControl_html_ga994ea49b518181fbdee2adc9be1ee40e"><div class="ttname"><a href="group__TransportControl.html#ga994ea49b518181fbdee2adc9be1ee40e">jack_get_transport_info</a></div><div class="ttdeci">void jack_get_transport_info(jack_client_t *client, jack_transport_info_t *tinfo) JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT</div></div>
<div class="ttc" id="astructjack__transport__info__t_html"><div class="ttname"><a href="structjack__transport__info__t.html">jack_transport_info_t</a></div><div class="ttdef"><b>Definition:</b> transport.h:483</div></div>
</div><!-- fragment --><p>Unfortunately, the old-style timebase master interface cannot coexist cleanly with such new features as <a class="el" href="group__TransportControl.html#gab3f52a42084aead87fd1ee75ed25b240">jack_transport_locate()</a> and slow-sync clients. So, these interfaces are only present as stubs:</p>
<div class="fragment"><div class="line"><span class="keywordtype">void</span> <a class="code" href="group__TransportControl.html#gad27bdf22d5642f2291ba77d7bdb2725a">jack_set_transport_info</a> (<a class="code" href="types_8h.html#a96cf103940d2ee71b141d4b9d0c116bf">jack_client_t</a> *client,</div>
<div class="line"> <a class="code" href="structjack__transport__info__t.html">jack_transport_info_t</a> *tinfo);</div>
<div class="line"><span class="keywordtype">int</span> <a class="code" href="group__ServerControl.html#ga2db0a4e9ab7b6d9984e91abba27ab71d">jack_engine_takeover_timebase</a> (<a class="code" href="types_8h.html#a96cf103940d2ee71b141d4b9d0c116bf">jack_client_t</a> *);</div>
<div class="ttc" id="agroup__ServerControl_html_ga2db0a4e9ab7b6d9984e91abba27ab71d"><div class="ttname"><a href="group__ServerControl.html#ga2db0a4e9ab7b6d9984e91abba27ab71d">jack_engine_takeover_timebase</a></div><div class="ttdeci">int jack_engine_takeover_timebase(jack_client_t *) JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT</div></div>
<div class="ttc" id="agroup__TransportControl_html_gad27bdf22d5642f2291ba77d7bdb2725a"><div class="ttname"><a href="group__TransportControl.html#gad27bdf22d5642f2291ba77d7bdb2725a">jack_set_transport_info</a></div><div class="ttdeci">void jack_set_transport_info(jack_client_t *client, jack_transport_info_t *tinfo) JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT</div></div>
</div><!-- fragment --><p>For compatibility with future changes, it would be good to avoid structures entirely. Nevertheless, the <a class="el" href="structjack__position__t.html">jack_position_t</a> structure provides a convenient way to collect timebase information in several formats that clearly all refer to a single moment. To minimize future binary compatibility problems, this structure has some padding at the end, making it possible to extend it without necessarily breaking compatibility. New fields can be allocated from the padding area, with access controlled by newly defined valid bits, all of which are currently forced to zero. That allows the structure size and offsets to remain constant.</p>
<h1><a class="anchor" id="issues"></a>
Issues Not Addressed</h1>
<p>This design currently does not address several issues. This means they will probably not be included in JACK release 1.0.</p>
<ul>
<li>variable speed</li>
<li>reverse play</li>
<li>looping </li>
</ul>
</div></div><!-- contents -->
</div><!-- PageDoc -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.1
</small></address>
</body>
</html>