Revert "jackdbus: Stop recurrent wakeups when no save is pending"
[jackdbus.git] / doc / jackdbus.html
blob4e6c3170674f5abab0804cfd1a24eb0334c94ff6
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
5 <meta name="generator" content="AsciiDoc 10.2.1">
6 <meta name="keywords" content="LADI, JACK, jack-audio-connection-kit, jackdbus, jack2">
7 <title>LADI JACK Audio Connection Kit</title>
8 <style type="text/css">
9 /*
10 * AsciiDoc 'ladi' theme, based on 'volnitsky' theme for xhtml11 and html5 backends.
11 * Based on css from http://volnitsky.com, which was in turn based on default
12 * theme from AsciiDoc
14 * FIXME: The styling is still a bit rough in places.
18 /* Default font. */
19 body {
20 font-family: Georgia,"Times New Roman",Times,serif;
21 font-size: 16pt;
24 /* Title font. */
25 h1, h2, h3, h4, h5, h6,
26 div.title, caption.title,
27 thead, p.table.header,
28 #toctitle,
29 #author, #revnumber, #revdate, #revremark,
30 #footer {
31 font-family: Candara,Arial,sans-serif;
34 a.image { border-bottom: 0; }
36 #toc a {
37 border-bottom: 1px dotted #999999;
38 color: #3A3A4D !important;
39 text-decoration: none !important;
41 #toc a:hover {
42 border-bottom: 1px solid #6D4100;
43 color: #6D4100 !important;
44 text-decoration: none !important;
46 a { color: #666688; text-decoration: none; border-bottom: 1px dotted #666688; }
47 a:visited { color: #615FA0; border-bottom: 1px dotted #615FA0; }
48 a:hover { color: #6D4100; border-bottom: 1px solid #6D4100; }
50 em {
51 font-style: italic;
52 color: #444466;
55 strong {
56 font-weight: bold;
57 color: #444466;
60 h1, h2, h3, h4, h5, h6 {
61 color: #666688;
62 margin-bottom: 0.5em;
63 margin-right: 1em;
64 line-height: 1.3;
65 letter-spacing:+0.15em;
68 h1, h2, h3, h4, h5, h6 {
69 margin-left: 0em;
72 /* h1 { margin-left: 2em; } */
73 h2 { margin-left: 2em; }
74 /* h3 { margin-left: 4em; } */
75 /* h4 { margin-left: 5em; } */
76 /* h5 { margin-left: 6em; } */
77 /* h6 { margin-left: 7em; } */
79 h2 { border-bottom: 4px solid #ccd; }
80 h3 { border-bottom: 2px dotted #ccd; }
81 /* h2, h3 { border-bottom: 2px solid #ccd; } */
82 /* h2 { padding-top: 0.5em; } */
83 /* h3 { float: left; } */
84 /* h3 + * { clear: left; } */
86 div.banner {
87 background: #004455;
88 text-align: center;
89 color: #C6E9AF;
90 padding: 0;
91 margin: 0;
94 div.sectionbody {
95 margin-top: 0;
96 margin-left: 3em;
97 margin-right: 1em;
98 margin-bottom: 1em;
101 hr {
102 border: 1px solid #444466;
106 margin-left: 0.5em;
107 margin-right: 0.5em;
108 margin-top: 0.5em;
109 margin-bottom: 0.5em;
112 ul, ol, li > p {
113 margin-top: 0;
116 pre {
117 padding: 0;
118 margin: 0;
121 #author {
122 color: #444466;
123 font-weight: bold;
124 font-size: 1.1em;
127 #footer {
128 font-size: small;
129 border-top: 2px solid silver;
130 margin: 0;
133 #footer-text {
134 /* float: left; */
135 padding: 1em;
136 text-align: center;
139 #footer-badges {
140 float: right;
141 padding: 0.5em;
144 #preamble {
145 margin-top: 1.5em;
146 margin-bottom: 1.5em;
149 div.tableblock, div.imageblock, div.exampleblock, div.verseblock,
150 div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
151 div.admonitionblock {
152 margin-top: 1.5em;
153 margin-bottom: 1.5em;
156 div.admonitionblock {
157 margin-top: 2.5em;
158 margin-bottom: 2.5em;
161 #content { /* Block element content. */
162 margin: 2em;
165 /* Block element titles. */
166 div.title, caption.title {
167 color: #444466;
168 font-weight: bold;
169 text-align: left;
170 margin-top: 1.0em;
171 margin-bottom: 0.5em;
173 div.title + * {
174 margin-top: 0;
177 td div.title:first-child {
178 margin-top: 0.0em;
180 div.content div.title:first-child {
181 margin-top: 0.0em;
183 div.content + div.title {
184 margin-top: 0.0em;
187 div.sidebarblock > div.content {
188 background: #ffffee;
189 border: 1px solid silver;
190 padding: 0.5em;
193 div.listingblock > div.content {
194 border: 1px solid silver;
195 background: #f4f4f4;
196 padding: 0.5em;
199 div.quoteblock {
200 padding-left: 2.0em;
201 margin-right: 10%;
203 div.quoteblock > div.attribution {
204 padding-top: 0.5em;
205 text-align: right;
208 div.verseblock {
209 padding-left: 2.0em;
210 margin-right: 10%;
212 div.verseblock > pre.content {
213 font-family: inherit;
215 div.verseblock > div.attribution {
216 padding-top: 0.75em;
217 text-align: left;
219 /* DEPRECATED: Pre version 8.2.7 verse style literal block. */
220 div.verseblock + div.attribution {
221 text-align: left;
224 div.admonitionblock .icon {
225 vertical-align: top;
226 font-size: 1.1em;
227 font-weight: bold;
228 text-decoration: underline;
229 color: #444466;
230 padding-right: 0.5em;
232 div.admonitionblock td.content {
233 padding-left: 0.5em;
234 border-left: 2px solid silver;
237 div.exampleblock > div.content {
238 border-left: 2px solid silver;
239 padding: 0.5em;
242 div.imageblock div.content { padding-left: 0; }
243 span.image img { border-style: none; }
244 a.image:visited { color: white; }
246 dl {
247 margin-top: 0.8em;
248 margin-bottom: 0.8em;
250 dt {
251 margin-top: 0.5em;
252 margin-bottom: 0;
253 font-style: normal;
254 color: #444466;
256 dd > *:first-child {
257 margin-top: 0.1em;
260 ul, ol {
261 list-style-position: outside;
263 ol.arabic {
264 list-style-type: decimal;
266 ol.loweralpha {
267 list-style-type: lower-alpha;
269 ol.upperalpha {
270 list-style-type: upper-alpha;
272 ol.lowerroman {
273 list-style-type: lower-roman;
275 ol.upperroman {
276 list-style-type: upper-roman;
279 div.compact ul, div.compact ol,
280 div.compact p, div.compact p,
281 div.compact div, div.compact div {
282 margin-top: 0.1em;
283 margin-bottom: 0.1em;
286 div.tableblock > table {
287 border: 3px solid #444466;
289 thead {
290 font-weight: bold;
291 color: #444466;
293 tfoot {
294 font-weight: bold;
296 td > div.verse {
297 white-space: pre;
299 p.table {
300 margin-top: 0;
302 /* Because the table frame attribute is overridden by CSS in most browsers. */
303 div.tableblock > table[frame="void"] {
304 border-style: none;
306 div.tableblock > table[frame="hsides"] {
307 border-left-style: none;
308 border-right-style: none;
310 div.tableblock > table[frame="vsides"] {
311 border-top-style: none;
312 border-bottom-style: none;
316 div.hdlist {
317 margin-top: 0.8em;
318 margin-bottom: 0.8em;
320 div.hdlist tr {
321 padding-bottom: 15px;
323 dt.hdlist1.strong, td.hdlist1.strong {
324 font-weight: bold;
326 td.hdlist1 {
327 vertical-align: top;
328 font-style: normal;
329 padding-right: 0.8em;
330 color: #444466;
332 td.hdlist2 {
333 vertical-align: top;
335 div.hdlist.compact tr {
336 margin: 0;
337 padding-bottom: 0;
340 .comment {
341 background: yellow;
344 @media print {
345 #footer-badges { display: none; }
348 #toctitle {
349 color: #666688;
350 font-size: 1.2em;
351 font-weight: bold;
352 margin-top: 1.0em;
353 margin-bottom: 0.1em;
356 div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 { margin-top: 0; margin-bottom: 0; }
357 div.toclevel1 { margin-top: 0.3em; margin-left: 0; font-size: 1.0em; }
358 div.toclevel2 { margin-top: 0.25em; margin-left: 2em; font-size: 0.9em; }
359 div.toclevel3 { margin-left: 4em; font-size: 0.8em; }
360 div.toclevel4 { margin-left: 6em; font-size: 0.8em; }
362 body {
363 margin: 0;
364 padding: 0;
367 .monospaced, tt, div.listingblock > div.content {
368 font-family: Consolas, "Andale Mono", "Courier New", monospace;
369 color: #004400;
370 background: #f4f4f4;
371 max-width: 80em;
372 line-height: 1.2em;
375 #header {
376 text-align: center;
377 margin: 2em;
380 #toc {
381 text-align: left;
382 margin-left: 3em;
383 max-width: 80%;
386 .paragraph p {
387 line-height: 1.5em;
388 /* margin: 1em; */
391 .paragraph p, li, dd, .content { max-width: 80em; }
392 .admonitionblock { max-width: 35em; }
394 div.sectionbody div.ulist > ul > li {
395 list-style-type: square;
396 color: #aaa;
398 div.sectionbody div.ulist > ul > li > * {
399 color: black;
400 /*font-size: 50%;*/
404 div.sectionbody div.ulist > ul > li div.ulist > ul > li {
405 color: #ccd ;
407 div.sectionbody div.ulist > ul > li div.ulist > ul > li > * {
408 color: black ;
411 em {
412 font-style: normal ! important;
413 font-weight: bold ! important;
414 color: #662222 ! important;
415 letter-spacing:+0.08em ! important;
418 span.underline { text-decoration: underline; }
419 span.overline { text-decoration: overline; }
420 span.line-through { text-decoration: line-through; }
423 * html5 specific
425 * */
427 table.tableblock {
428 margin-top: 1.0em;
429 margin-bottom: 1.5em;
431 thead, p.tableblock.header {
432 font-weight: bold;
433 color: #666688;
435 p.tableblock {
436 margin-top: 0;
438 table.tableblock {
439 border-width: 3px;
440 border-spacing: 0px;
441 border-style: solid;
442 border-color: #444466;
443 border-collapse: collapse;
445 th.tableblock, td.tableblock {
446 border-width: 1px;
447 padding: 4px;
448 border-style: solid;
449 border-color: #444466;
452 table.tableblock.frame-topbot {
453 border-left-style: hidden;
454 border-right-style: hidden;
456 table.tableblock.frame-sides {
457 border-top-style: hidden;
458 border-bottom-style: hidden;
460 table.tableblock.frame-none {
461 border-style: hidden;
464 th.tableblock.halign-left, td.tableblock.halign-left {
465 text-align: left;
467 th.tableblock.halign-center, td.tableblock.halign-center {
468 text-align: center;
470 th.tableblock.halign-right, td.tableblock.halign-right {
471 text-align: right;
474 th.tableblock.valign-top, td.tableblock.valign-top {
475 vertical-align: top;
477 th.tableblock.valign-middle, td.tableblock.valign-middle {
478 vertical-align: middle;
480 th.tableblock.valign-bottom, td.tableblock.valign-bottom {
481 vertical-align: bottom;
487 </style>
488 <script type="text/javascript">
489 /*<![CDATA[*/
490 var asciidoc = { // Namespace.
492 /////////////////////////////////////////////////////////////////////
493 // Table Of Contents generator
494 /////////////////////////////////////////////////////////////////////
496 /* Author: Mihai Bazon, September 2002
497 * http://students.infoiasi.ro/~mishoo
499 * Table Of Content generator
500 * Version: 0.4
502 * Feel free to use this script under the terms of the GNU General Public
503 * License, as long as you do not remove or alter this notice.
506 /* modified by Troy D. Hanson, September 2006. License: GPL */
507 /* modified by Stuart Rackham, 2006, 2009. License: GPL */
509 // toclevels = 1..4.
510 toc: function (toclevels) {
512 function getText(el) {
513 var text = "";
514 for (var i = el.firstChild; i != null; i = i.nextSibling) {
515 if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
516 text += i.data;
517 else if (i.firstChild != null)
518 text += getText(i);
520 return text;
523 function TocEntry(el, text, toclevel) {
524 this.element = el;
525 this.text = text;
526 this.toclevel = toclevel;
529 function tocEntries(el, toclevels) {
530 var result = new Array;
531 var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
532 // Function that scans the DOM tree for header elements (the DOM2
533 // nodeIterator API would be a better technique but not supported by all
534 // browsers).
535 var iterate = function (el) {
536 for (var i = el.firstChild; i != null; i = i.nextSibling) {
537 if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
538 var mo = re.exec(i.tagName);
539 if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
540 result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
542 iterate(i);
546 iterate(el);
547 return result;
550 var toc = document.getElementById("toc");
551 if (!toc) {
552 return;
555 // Delete existing TOC entries in case we're reloading the TOC.
556 var tocEntriesToRemove = [];
557 var i;
558 for (i = 0; i < toc.childNodes.length; i++) {
559 var entry = toc.childNodes[i];
560 if (entry.nodeName.toLowerCase() == 'div'
561 && entry.getAttribute("class")
562 && entry.getAttribute("class").match(/^toclevel/))
563 tocEntriesToRemove.push(entry);
565 for (i = 0; i < tocEntriesToRemove.length; i++) {
566 toc.removeChild(tocEntriesToRemove[i]);
569 // Rebuild TOC entries.
570 var entries = tocEntries(document.getElementById("content"), toclevels);
571 for (var i = 0; i < entries.length; ++i) {
572 var entry = entries[i];
573 if (entry.element.id == "")
574 entry.element.id = "_toc_" + i;
575 var a = document.createElement("a");
576 a.href = "#" + entry.element.id;
577 a.appendChild(document.createTextNode(entry.text));
578 var div = document.createElement("div");
579 div.appendChild(a);
580 div.className = "toclevel" + entry.toclevel;
581 toc.appendChild(div);
583 if (entries.length == 0)
584 toc.parentNode.removeChild(toc);
588 /////////////////////////////////////////////////////////////////////
589 // Footnotes generator
590 /////////////////////////////////////////////////////////////////////
592 /* Based on footnote generation code from:
593 * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
596 footnotes: function () {
597 // Delete existing footnote entries in case we're reloading the footnodes.
598 var i;
599 var noteholder = document.getElementById("footnotes");
600 if (!noteholder) {
601 return;
603 var entriesToRemove = [];
604 for (i = 0; i < noteholder.childNodes.length; i++) {
605 var entry = noteholder.childNodes[i];
606 if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
607 entriesToRemove.push(entry);
609 for (i = 0; i < entriesToRemove.length; i++) {
610 noteholder.removeChild(entriesToRemove[i]);
613 // Rebuild footnote entries.
614 var cont = document.getElementById("content");
615 var spans = cont.getElementsByTagName("span");
616 var refs = {};
617 var n = 0;
618 for (i=0; i<spans.length; i++) {
619 if (spans[i].className == "footnote") {
620 n++;
621 var note = spans[i].getAttribute("data-note");
622 if (!note) {
623 // Use [\s\S] in place of . so multi-line matches work.
624 // Because JavaScript has no s (dotall) regex flag.
625 note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
626 spans[i].innerHTML =
627 "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
628 "' title='View footnote' class='footnote'>" + n + "</a>]";
629 spans[i].setAttribute("data-note", note);
631 noteholder.innerHTML +=
632 "<div class='footnote' id='_footnote_" + n + "'>" +
633 "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
634 n + "</a>. " + note + "</div>";
635 var id =spans[i].getAttribute("id");
636 if (id != null) refs["#"+id] = n;
639 if (n == 0)
640 noteholder.parentNode.removeChild(noteholder);
641 else {
642 // Process footnoterefs.
643 for (i=0; i<spans.length; i++) {
644 if (spans[i].className == "footnoteref") {
645 var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
646 href = href.match(/#.*/)[0]; // Because IE return full URL.
647 n = refs[href];
648 spans[i].innerHTML =
649 "[<a href='#_footnote_" + n +
650 "' title='View footnote' class='footnote'>" + n + "</a>]";
656 install: function(toclevels) {
657 var timerId;
659 function reinstall() {
660 asciidoc.footnotes();
661 if (toclevels) {
662 asciidoc.toc(toclevels);
666 function reinstallAndRemoveTimer() {
667 clearInterval(timerId);
668 reinstall();
671 timerId = setInterval(reinstall, 500);
672 if (document.addEventListener)
673 document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
674 else
675 window.onload = reinstallAndRemoveTimer;
679 asciidoc.install(2);
680 /*]]>*/
681 </script>
682 <link rel="shortcut icon" type="image/x-icon" sizes="32x32" href="ladish-logo-32x32.ico" />
683 <link rel="icon" type="image/x-icon" sizes="32x32" href="ladish-logo-32x32.ico" />
684 <link rel="icon" type="image/x-icon" sizes="128x128" href="ladish-logo-128x128.png" />
685 <link rel="apple-touch-icon" type="image/x-icon" sizes="140x140" href="ladi-140x140.png" />
686 <link rel="apple-touch-icon" type="image/x-icon" sizes="128x128" href="ladish-logo-128x128.png" />
687 </head>
688 <body class="article">
690 <div id="header">
691 <h1>(LADI) jackdbus</h1>
692 <div id="toc">
693 <div id="toctitle">Table of Contents</div>
694 <noscript><p><b>JavaScript must be enabled in your browser to display the table of contents.</b></p></noscript>
695 </div>
696 </div>
697 <div id="content">
698 <div id="preamble">
699 <div class="sectionbody">
700 <div class="paragraph"><p><span class="image">
701 <a class="image" href="https://github.com/LADI/jackdbus/actions">
702 <img src="https://github.com/LADI/jackdbus/actions/workflows/build.yml/badge.svg" alt="Build status badge">
703 </a>
704 </span>
705 <span class="image">
706 <a class="image" href="https://repology.org/metapackage/jack-audio-connection-kit/versions">
707 <img src="https://repology.org/badge/tiny-repos/jack-audio-connection-kit.svg" alt="Repology bandge">
708 </a>
709 </span></p></div>
710 </div>
711 </div>
712 <div class="sect1">
713 <h2 id="_overview">Overview</h2>
714 <div class="sectionbody">
715 <div class="paragraph"><p>This software implements D-Bus endpoint for JACK server.</p></div>
716 </div>
717 </div>
718 <div class="sect1">
719 <h2 id="_brief_history">Brief History</h2>
720 <div class="sectionbody">
721 <div class="paragraph"><p>Initial version of <a href="https://github.com/LADI/jackdbus">jackdbus</a> was created
722 as part of LADI project and was ad-hoc modification of <a href="https://jackdbus.ladish.org/jack1-design.html">JACK1</a> <a href="https://github.com/jackaudio/jack1/">codebase</a>.
723 jackdbus for JACK1 was maintained first as a setup of ad-hoc patches,
724 then via Mercural and then via Git.
725 In 2008/2009, jackdbus was ported to jackdmp codebase along with an implementation
726 of the newly designed for the new need control API for JACK.
727 The result of this merge became known as
728 <a href="https://web.archive.org/web/20170106162202/http://lac.linuxaudio.org/2009/cdm/Thursday/01_Letz/01.pdf">JACK2</a>.
729 As of 2022, jackdbus is again maintained in LADI project.
730 The jackaudio.org version of jackdbus is considered older/alternative
731 implementation.</p></div>
732 <div class="paragraph"><p>For LADI specific issues, submit issues or pull request to LADI project.
733 For related discussions, you are invited to join
734 <a href="https://libera.chat/">Libera.Chat</a> channel #ladi</p></div>
735 <div class="admonitionblock">
736 <table><tr>
737 <td class="icon">
738 <img alt="Important" src="data:image/png;base64,
739 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
791 EQn3XQAAAABJRU5ErkJggg==">
792 </td>
793 <td class="content">Do not submit LADI specific issues to jackaudio project.</td>
794 </tr></table>
795 </div>
796 </div>
797 </div>
798 <div class="sect1">
799 <h2 id="_d_bus_access">D-Bus access</h2>
800 <div class="sectionbody">
801 <div class="paragraph"><p>D-Bus is an object model that provides IPC mechanism.
802 D-Bus supports autoactivation of objects,
803 thus making it simple and reliable to code a "single instance" application or daemon,
804 and to launch applications and daemons on demand when their services are needed.</p></div>
805 <div class="paragraph"><p>Improvements over classical "jackd" approach:</p></div>
806 <div class="ulist"><ul>
807 <li>
809 Simplified single thread model for control and monitor
810 applications. Various D-Bus language bindings make it trivial to
811 write control and monitor applications using scripting languages
812 like Python, Ruby, Perl, etc..
813 </p>
814 </li>
815 <li>
817 A log file is available for inspection even when autoactivation
818 happens by the first launched JACK application.
819 </p>
820 </li>
821 <li>
823 A real configuration file is used to persist settings to be
824 manipulated through configuration interface of JACK D-Bus object.
825 </p>
826 </li>
827 <li>
829 Improved graph inspection and control mechanism. JACK graph is
830 versioned. Connections, ports and clients have unique
831 (monotonically increasing) numeric IDs.
832 </p>
833 </li>
834 <li>
836 High level abstraction of JACK settings. Allows applications that
837 can configure JACK to expose parameters that were not known at
838 compile (or tarball release) time. Recent real world examples are
839 the JACK MIDI driver parameters and support for FFADO driver in
840 QJackCtl. Upgrading of JACK requires upgrade of QJackCtl in order
841 to make new settings available in the GUI.
842 </p>
843 </li>
844 </ul></div>
845 <div class="sect2">
846 <h3 id="_how_it_works">How it works</h3>
847 <div class="sect3">
848 <h4 id="_autoactivation_and_starting_stopping_jack_server">Autoactivation and starting/stopping JACK server</h4>
849 <div class="paragraph"><p>First, application that issues D-Bus method call to JACK controller object,
850 causes D-Bus session daemon to activate the object by starting the jackdbus executable.
851 Activating controller object does not start the server.
852 Instead controller object has several interfaces.
853 The most important of them is the control interface.
854 Control interface contains methods for starting and stopping JACK server,
855 loading and unloading of internal clients (netjack),
856 setting buffer size and resetting xrun counter.
857 It also contains methods for querying information required by monitoring
858 applications:</p></div>
859 <div class="ulist"><ul>
860 <li>
862 whether JACK server is started
863 </p>
864 </li>
865 <li>
867 whether JACK server is running in realtime mode
868 </p>
869 </li>
870 <li>
872 sample rate
873 </p>
874 </li>
875 <li>
877 DSP load
878 </p>
879 </li>
880 <li>
882 current buffer size
883 </p>
884 </li>
885 <li>
887 latency
888 </p>
889 </li>
890 <li>
892 xrun counter
893 </p>
894 </li>
895 </ul></div>
896 <div class="paragraph"><p>JACK server autostart is achieved by libjack calling "jack server start" method of
897 JACK control D-Bus interface.</p></div>
898 </div>
899 <div class="sect3">
900 <h4 id="_jack_settings">JACK settings</h4>
901 <div class="paragraph"><p>Applications that want to manage JACK settings can query
902 and set all settings that were traditionally specified as
903 jackd command-line parameters.
904 Interface abstraction provides virtual tree of parameter
905 containers with container leaves that contain parameters.
906 Parameters are accessed using simple addressing scheme (array of strings)
907 where address defines path to parameter, like "drivers", "alsa", "dither".</p></div>
908 <div class="paragraph"><p>Overview of the tree of standard settings' addresses:</p></div>
909 <div class="ulist"><ul>
910 <li>
912 "engine"
913 </p>
914 </li>
915 <li>
917 "engine", "driver"
918 </p>
919 </li>
920 <li>
922 "engine", "realtime"
923 </p>
924 </li>
925 <li>
927 "engine", &#8230;more engine parameters
928 </p>
929 </li>
930 <li>
932 "driver", "device"
933 </p>
934 </li>
935 <li>
937 "driver", &#8230;more driver parameters
938 </p>
939 </li>
940 <li>
942 "drivers", "alsa", "device"
943 </p>
944 </li>
945 <li>
947 "drivers", "alsa", &#8230;more alsa driver parameters
948 </p>
949 </li>
950 <li>
952 "drivers", &#8230;more drivers
953 </p>
954 </li>
955 <li>
957 "internals", "netmanager", "multicast ip"
958 </p>
959 </li>
960 <li>
962 "internals", "netmanager", &#8230;more netmanager parameters
963 </p>
964 </li>
965 <li>
967 "internals", &#8230;more internals
968 </p>
969 </li>
970 </ul></div>
971 <div class="paragraph"><p>JACK settings are persisted.
972 I.e. they are automatically saved by jackdbus when they are set.
973 Next time user starts JACK server, last saved settings will be automatically used.
974 Changing JACK settings through the configure D-Bus interface takes effect on next
975 JACK server start.
976 On the fly change of the buffer size, as available in the libjack
977 (jack.h) API, is also possible through the control D-Bus interface.</p></div>
978 </div>
979 <div class="sect3">
980 <h4 id="_jack_parameter_constraints">JACK parameter constraints</h4>
981 <div class="paragraph"><p>JACK internal modules that provide parameters visible through control API can provide
982 information about parameter valid range (like realtime priority) or
983 whether parameter should be presented as enumeration.
984 Enumeration parameters can be strict and non-strict.
985 Example of strict enum parameter is dither parameter of ALSA driver,
986 it has only predefined valid values: "shaped noise",
987 "rectangular", "triangualr" and "none".</p></div>
988 <div class="paragraph"><p>Example of non-strict parameter is device parameter of ALSA driver.
989 It is useful to provide some detected device strings as choices to user,
990 but still allow user to specify custom string that ALSA layer is supposed to
991 understand.</p></div>
992 </div>
993 <div class="sect3">
994 <h4 id="_jack_patchbay">JACK patchbay</h4>
995 <div class="paragraph"><p>In order to simplify patchbay applications, extended functionality is provided.
996 There is a method that returns the current graph state.
997 Graph state has unique monotonically increasing version number
998 and contains info about all clients, their ports and connections.
999 Connections, ports and clients have unique numeric IDs
1000 that are guaranteed not to be reused.
1001 Notifica tions about graph changes are provided using
1002 D-Bus signals.</p></div>
1003 </div>
1004 </div>
1005 <div class="sect2">
1006 <h3 id="_jack_d_bus_enabled_applications">JACK D-Bus enabled applications</h3>
1007 <div class="sect3">
1008 <h4 id="_jack_control">jack_control</h4>
1009 <div class="paragraph"><p>JACK contains "jack_control" executable, <a href="https://gitea.ladish.org/LADI/jack_control/src/branch/main/jack_control.py">a 300 lines of Python</a> exposing
1010 JACK D-Bus functionality. It allows chained execution of several commands.
1011 For example "jack control ds alsa dps midi-driver raw eps realtime on
1012 eps relatime-priority 70 start" selects ALSA driver, enables JACK MIDI
1013 raw backend, enables realtime mode, sets realtime priority to 70 and starts
1014 JACK server.</p></div>
1015 </div>
1016 <div class="sect3">
1017 <h4 id="_ladi_tools">LADI Tools</h4>
1018 <div class="paragraph"><p><a href="https://gitea.ladish.org/LADI/laditools">LADI Tools</a> is a set of programs to configure, control and monitor JACK.
1019 It provides tray icon, Window Maker style dockapp,
1020 G15 keyboard LCD display integration application,
1021 configuration utility for managing JACK settings
1022 and log file monitor application.</p></div>
1023 <div class="paragraph"><p>All tools are written in Python.</p></div>
1024 </div>
1025 <div class="sect3">
1026 <h4 id="_patchage">Patchage</h4>
1027 <div class="paragraph"><p><a href="https://drobilla.net/software/patchage.html">Patchage</a>, the ubiquitous canvas modular patch bay can be compiled to use
1028 D-Bus instead of libjack to communicate with JACK.</p></div>
1029 <div class="paragraph"><p>Doing so also enables JACK server start/stop functionality in Patchage.</p></div>
1030 <div class="paragraph"><p>Various JACK related features are implemented:</p></div>
1031 </div>
1032 <div class="sect3">
1033 <h4 id="_ladi_session_handler_ladish">LADI Session handler (LADISH)</h4>
1034 <div class="paragraph"><p><a href="https://ladish.org/">LADISH</a>, a rewrite of LASH session handler
1035 uses D-Bus to communicate with JACK.</p></div>
1036 <div class="paragraph"><p>Various JACK related features are implemented:</p></div>
1037 <div class="ulist"><ul>
1038 <li>
1040 Saving of JACK settings as part of "studio" session.
1041 </p>
1042 </li>
1043 <li>
1045 Handling of "JACK server crash" scenario: restarting JACK server,
1046 notifying JACK applications that JACK server reappeared so they
1047 can reconnect to it, and restoring JACK connections.
1048 </p>
1049 </li>
1050 </ul></div>
1051 </div>
1052 <div class="sect3">
1053 <h4 id="_qjackctl_jack_audio_connection_kit_qt_gui_interface">QjackCtl JACK Audio Connection Kit - Qt GUI Interface</h4>
1054 <div class="paragraph"><p><a href="https://qjackctl.sourceforge.io/">QjackCtl</a> is a simple Qt application
1055 to control the JACK sound server daemon, is another jackdbus frontend.</p></div>
1056 </div>
1057 <div class="sect3">
1058 <h4 id="_kxstudio_cadence">KXStudio Cadence</h4>
1059 <div class="paragraph"><p><a href="https://kx.studio/Applications:Cadence">Cadence</a>, a set of tools
1060 useful for audio production, is another jackdbus frontend.</p></div>
1061 </div>
1062 <div class="sect3">
1063 <h4 id="_studio_controls">Studio Controls</h4>
1064 <div class="paragraph"><p><a href="https://ovenwerks.github.io/studio-controls/">Studio Controls</a>, a way to
1065 configure your Linux-based audio installation for real-time audio, is
1066 another jackdbus frontend.</p></div>
1067 </div>
1068 </div>
1069 </div>
1070 </div>
1071 <div class="sect1">
1072 <h2 id="_source">Source</h2>
1073 <div class="sectionbody">
1074 <div class="paragraph"><p>Tarballs:</p></div>
1075 <div class="ulist"><ul>
1076 <li>
1078 <a href="https://dl.ladish.org/jackdbus/">https://dl.ladish.org/jackdbus/ (signed) tarballs</a>
1079 </p>
1080 </li>
1081 </ul></div>
1082 <div class="paragraph"><p>GIT repositories:</p></div>
1083 <div class="ulist"><ul>
1084 <li>
1086 <a href="https://gitea.ladish.org/LADI/jackdbus">Upstream development GIT repository</a><br>
1087 Self-hosted upstream
1088 </p>
1089 </li>
1090 <li>
1092 <a href="https://repo.or.cz/jackdbus.git">Primary backup GIT repository at repo.or.cz</a><br>
1093 Cloud hosted
1094 </p>
1095 </li>
1096 </ul></div>
1097 </div>
1098 </div>
1099 <div class="sect1">
1100 <h2 id="_packaging">Packaging</h2>
1101 <div class="sectionbody">
1102 <div class="paragraph"><p><a href="https://jackdbus.ladish.org/packaging.html">Packaging HOWTO</a></p></div>
1103 </div>
1104 </div>
1105 <div class="sect1">
1106 <h2 id="_references">References</h2>
1107 <div class="sectionbody">
1108 <div class="olist arabic"><ol class="arabic">
1109 <li>
1111 <a href="https://web.archive.org/web/20170106162202/http://lac.linuxaudio.org/2009/cdm/Thursday/01_Letz/01.pdf">What&#8217;s new in JACK2?</a>
1112 </p>
1113 </li>
1114 </ol></div>
1115 </div>
1116 </div>
1117 </div>
1118 <div id="footnotes"><hr></div>
1119 <div id="footer">
1120 <div id="footer-text">
1121 Last updated
1122 2024-06-13 19:38:05 EEST
1123 </div>
1124 </div>
1125 </body>
1126 </html>