1082 lines
31 KiB
HTML
1082 lines
31 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
|
<meta name="generator" content="AsciiDoc 10.2.0">
|
|
<title>(LADI) jackdbus</title>
|
|
<style type="text/css">
|
|
/*
|
|
* AsciiDoc 'ladi' theme, based on 'volnitsky' theme for xhtml11 and html5 backends.
|
|
* Based on css from http://volnitsky.com, which was in turn based on default
|
|
* theme from AsciiDoc
|
|
*
|
|
* FIXME: The styling is still a bit rough in places.
|
|
*
|
|
*/
|
|
|
|
/* Default font. */
|
|
body {
|
|
font-family: Georgia,"Times New Roman",Times,serif;
|
|
font-size: 16pt;
|
|
}
|
|
|
|
/* Title font. */
|
|
h1, h2, h3, h4, h5, h6,
|
|
div.title, caption.title,
|
|
thead, p.table.header,
|
|
#toctitle,
|
|
#author, #revnumber, #revdate, #revremark,
|
|
#footer {
|
|
font-family: Candara,Arial,sans-serif;
|
|
}
|
|
|
|
a.image { border-bottom: 0; }
|
|
|
|
#toc a {
|
|
border-bottom: 1px dotted #999999;
|
|
color: #3A3A4D !important;
|
|
text-decoration: none !important;
|
|
}
|
|
#toc a:hover {
|
|
border-bottom: 1px solid #6D4100;
|
|
color: #6D4100 !important;
|
|
text-decoration: none !important;
|
|
}
|
|
a { color: #666688; text-decoration: none; border-bottom: 1px dotted #666688; }
|
|
a:visited { color: #615FA0; border-bottom: 1px dotted #615FA0; }
|
|
a:hover { color: #6D4100; border-bottom: 1px solid #6D4100; }
|
|
|
|
em {
|
|
font-style: italic;
|
|
color: #444466;
|
|
}
|
|
|
|
strong {
|
|
font-weight: bold;
|
|
color: #444466;
|
|
}
|
|
|
|
h1, h2, h3, h4, h5, h6 {
|
|
color: #666688;
|
|
margin-bottom: 0.5em;
|
|
margin-right: 1em;
|
|
line-height: 1.3;
|
|
letter-spacing:+0.15em;
|
|
}
|
|
|
|
h1, h2, h3, h4, h5, h6 {
|
|
margin-left: 0em;
|
|
}
|
|
|
|
/* h1 { margin-left: 2em; } */
|
|
h2 { margin-left: 2em; }
|
|
/* h3 { margin-left: 4em; } */
|
|
/* h4 { margin-left: 5em; } */
|
|
/* h5 { margin-left: 6em; } */
|
|
/* h6 { margin-left: 7em; } */
|
|
|
|
h2 { border-bottom: 4px solid #ccd; }
|
|
h3 { border-bottom: 2px dotted #ccd; }
|
|
/* h2, h3 { border-bottom: 2px solid #ccd; } */
|
|
/* h2 { padding-top: 0.5em; } */
|
|
/* h3 { float: left; } */
|
|
/* h3 + * { clear: left; } */
|
|
|
|
div.banner {
|
|
background: #004455;
|
|
text-align: center;
|
|
color: #C6E9AF;
|
|
padding: 0;
|
|
margin: 0;
|
|
}
|
|
|
|
div.sectionbody {
|
|
margin-top: 0;
|
|
margin-left: 3em;
|
|
margin-right: 1em;
|
|
margin-bottom: 1em;
|
|
}
|
|
|
|
hr {
|
|
border: 1px solid #444466;
|
|
}
|
|
|
|
p {
|
|
margin-left: 0.5em;
|
|
margin-right: 0.5em;
|
|
margin-top: 0.5em;
|
|
margin-bottom: 0.5em;
|
|
}
|
|
|
|
ul, ol, li > p {
|
|
margin-top: 0;
|
|
}
|
|
|
|
pre {
|
|
padding: 0;
|
|
margin: 0;
|
|
}
|
|
|
|
#author {
|
|
color: #444466;
|
|
font-weight: bold;
|
|
font-size: 1.1em;
|
|
}
|
|
|
|
#footer {
|
|
font-size: small;
|
|
border-top: 2px solid silver;
|
|
margin: 0;
|
|
}
|
|
|
|
#footer-text {
|
|
/* float: left; */
|
|
padding: 1em;
|
|
text-align: center;
|
|
}
|
|
|
|
#footer-badges {
|
|
float: right;
|
|
padding: 0.5em;
|
|
}
|
|
|
|
#preamble {
|
|
margin-top: 1.5em;
|
|
margin-bottom: 1.5em;
|
|
}
|
|
|
|
div.tableblock, div.imageblock, div.exampleblock, div.verseblock,
|
|
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
|
|
div.admonitionblock {
|
|
margin-top: 1.5em;
|
|
margin-bottom: 1.5em;
|
|
}
|
|
|
|
div.admonitionblock {
|
|
margin-top: 2.5em;
|
|
margin-bottom: 2.5em;
|
|
}
|
|
|
|
#content { /* Block element content. */
|
|
margin: 2em;
|
|
}
|
|
|
|
/* Block element titles. */
|
|
div.title, caption.title {
|
|
color: #444466;
|
|
font-weight: bold;
|
|
text-align: left;
|
|
margin-top: 1.0em;
|
|
margin-bottom: 0.5em;
|
|
}
|
|
div.title + * {
|
|
margin-top: 0;
|
|
}
|
|
|
|
td div.title:first-child {
|
|
margin-top: 0.0em;
|
|
}
|
|
div.content div.title:first-child {
|
|
margin-top: 0.0em;
|
|
}
|
|
div.content + div.title {
|
|
margin-top: 0.0em;
|
|
}
|
|
|
|
div.sidebarblock > div.content {
|
|
background: #ffffee;
|
|
border: 1px solid silver;
|
|
padding: 0.5em;
|
|
}
|
|
|
|
div.listingblock > div.content {
|
|
border: 1px solid silver;
|
|
background: #f4f4f4;
|
|
padding: 0.5em;
|
|
}
|
|
|
|
div.quoteblock {
|
|
padding-left: 2.0em;
|
|
margin-right: 10%;
|
|
}
|
|
div.quoteblock > div.attribution {
|
|
padding-top: 0.5em;
|
|
text-align: right;
|
|
}
|
|
|
|
div.verseblock {
|
|
padding-left: 2.0em;
|
|
margin-right: 10%;
|
|
}
|
|
div.verseblock > pre.content {
|
|
font-family: inherit;
|
|
}
|
|
div.verseblock > div.attribution {
|
|
padding-top: 0.75em;
|
|
text-align: left;
|
|
}
|
|
/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
|
|
div.verseblock + div.attribution {
|
|
text-align: left;
|
|
}
|
|
|
|
div.admonitionblock .icon {
|
|
vertical-align: top;
|
|
font-size: 1.1em;
|
|
font-weight: bold;
|
|
text-decoration: underline;
|
|
color: #444466;
|
|
padding-right: 0.5em;
|
|
}
|
|
div.admonitionblock td.content {
|
|
padding-left: 0.5em;
|
|
border-left: 2px solid silver;
|
|
}
|
|
|
|
div.exampleblock > div.content {
|
|
border-left: 2px solid silver;
|
|
padding: 0.5em;
|
|
}
|
|
|
|
div.imageblock div.content { padding-left: 0; }
|
|
span.image img { border-style: none; }
|
|
a.image:visited { color: white; }
|
|
|
|
dl {
|
|
margin-top: 0.8em;
|
|
margin-bottom: 0.8em;
|
|
}
|
|
dt {
|
|
margin-top: 0.5em;
|
|
margin-bottom: 0;
|
|
font-style: normal;
|
|
color: #444466;
|
|
}
|
|
dd > *:first-child {
|
|
margin-top: 0.1em;
|
|
}
|
|
|
|
ul, ol {
|
|
list-style-position: outside;
|
|
}
|
|
ol.arabic {
|
|
list-style-type: decimal;
|
|
}
|
|
ol.loweralpha {
|
|
list-style-type: lower-alpha;
|
|
}
|
|
ol.upperalpha {
|
|
list-style-type: upper-alpha;
|
|
}
|
|
ol.lowerroman {
|
|
list-style-type: lower-roman;
|
|
}
|
|
ol.upperroman {
|
|
list-style-type: upper-roman;
|
|
}
|
|
|
|
div.compact ul, div.compact ol,
|
|
div.compact p, div.compact p,
|
|
div.compact div, div.compact div {
|
|
margin-top: 0.1em;
|
|
margin-bottom: 0.1em;
|
|
}
|
|
|
|
div.tableblock > table {
|
|
border: 3px solid #444466;
|
|
}
|
|
thead {
|
|
font-weight: bold;
|
|
color: #444466;
|
|
}
|
|
tfoot {
|
|
font-weight: bold;
|
|
}
|
|
td > div.verse {
|
|
white-space: pre;
|
|
}
|
|
p.table {
|
|
margin-top: 0;
|
|
}
|
|
/* Because the table frame attribute is overridden by CSS in most browsers. */
|
|
div.tableblock > table[frame="void"] {
|
|
border-style: none;
|
|
}
|
|
div.tableblock > table[frame="hsides"] {
|
|
border-left-style: none;
|
|
border-right-style: none;
|
|
}
|
|
div.tableblock > table[frame="vsides"] {
|
|
border-top-style: none;
|
|
border-bottom-style: none;
|
|
}
|
|
|
|
|
|
div.hdlist {
|
|
margin-top: 0.8em;
|
|
margin-bottom: 0.8em;
|
|
}
|
|
div.hdlist tr {
|
|
padding-bottom: 15px;
|
|
}
|
|
dt.hdlist1.strong, td.hdlist1.strong {
|
|
font-weight: bold;
|
|
}
|
|
td.hdlist1 {
|
|
vertical-align: top;
|
|
font-style: normal;
|
|
padding-right: 0.8em;
|
|
color: #444466;
|
|
}
|
|
td.hdlist2 {
|
|
vertical-align: top;
|
|
}
|
|
div.hdlist.compact tr {
|
|
margin: 0;
|
|
padding-bottom: 0;
|
|
}
|
|
|
|
.comment {
|
|
background: yellow;
|
|
}
|
|
|
|
@media print {
|
|
#footer-badges { display: none; }
|
|
}
|
|
|
|
#toctitle {
|
|
color: #666688;
|
|
font-size: 1.2em;
|
|
font-weight: bold;
|
|
margin-top: 1.0em;
|
|
margin-bottom: 0.1em;
|
|
}
|
|
|
|
div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 { margin-top: 0; margin-bottom: 0; }
|
|
div.toclevel1 { margin-top: 0.3em; margin-left: 0; font-size: 1.0em; }
|
|
div.toclevel2 { margin-top: 0.25em; margin-left: 2em; font-size: 0.9em; }
|
|
div.toclevel3 { margin-left: 4em; font-size: 0.8em; }
|
|
div.toclevel4 { margin-left: 6em; font-size: 0.8em; }
|
|
|
|
body {
|
|
margin: 0;
|
|
padding: 0;
|
|
}
|
|
|
|
.monospaced, tt, div.listingblock > div.content {
|
|
font-family: Consolas, "Andale Mono", "Courier New", monospace;
|
|
color: #004400;
|
|
background: #f4f4f4;
|
|
max-width: 80em;
|
|
line-height: 1.2em;
|
|
}
|
|
|
|
#header {
|
|
text-align: center;
|
|
margin: 2em;
|
|
}
|
|
|
|
#toc {
|
|
text-align: left;
|
|
margin-left: 3em;
|
|
max-width: 80%;
|
|
}
|
|
|
|
.paragraph p {
|
|
line-height: 1.5em;
|
|
/* margin: 1em; */
|
|
}
|
|
|
|
.paragraph p, li, dd, .content { max-width: 80em; }
|
|
.admonitionblock { max-width: 35em; }
|
|
|
|
div.sectionbody div.ulist > ul > li {
|
|
list-style-type: square;
|
|
color: #aaa;
|
|
}
|
|
div.sectionbody div.ulist > ul > li > * {
|
|
color: black;
|
|
/*font-size: 50%;*/
|
|
}
|
|
|
|
|
|
div.sectionbody div.ulist > ul > li div.ulist > ul > li {
|
|
color: #ccd ;
|
|
}
|
|
div.sectionbody div.ulist > ul > li div.ulist > ul > li > * {
|
|
color: black ;
|
|
}
|
|
|
|
em {
|
|
font-style: normal ! important;
|
|
font-weight: bold ! important;
|
|
color: #662222 ! important;
|
|
letter-spacing:+0.08em ! important;
|
|
}
|
|
|
|
span.underline { text-decoration: underline; }
|
|
span.overline { text-decoration: overline; }
|
|
span.line-through { text-decoration: line-through; }
|
|
|
|
/*
|
|
* html5 specific
|
|
*
|
|
* */
|
|
|
|
table.tableblock {
|
|
margin-top: 1.0em;
|
|
margin-bottom: 1.5em;
|
|
}
|
|
thead, p.tableblock.header {
|
|
font-weight: bold;
|
|
color: #666688;
|
|
}
|
|
p.tableblock {
|
|
margin-top: 0;
|
|
}
|
|
table.tableblock {
|
|
border-width: 3px;
|
|
border-spacing: 0px;
|
|
border-style: solid;
|
|
border-color: #444466;
|
|
border-collapse: collapse;
|
|
}
|
|
th.tableblock, td.tableblock {
|
|
border-width: 1px;
|
|
padding: 4px;
|
|
border-style: solid;
|
|
border-color: #444466;
|
|
}
|
|
|
|
table.tableblock.frame-topbot {
|
|
border-left-style: hidden;
|
|
border-right-style: hidden;
|
|
}
|
|
table.tableblock.frame-sides {
|
|
border-top-style: hidden;
|
|
border-bottom-style: hidden;
|
|
}
|
|
table.tableblock.frame-none {
|
|
border-style: hidden;
|
|
}
|
|
|
|
th.tableblock.halign-left, td.tableblock.halign-left {
|
|
text-align: left;
|
|
}
|
|
th.tableblock.halign-center, td.tableblock.halign-center {
|
|
text-align: center;
|
|
}
|
|
th.tableblock.halign-right, td.tableblock.halign-right {
|
|
text-align: right;
|
|
}
|
|
|
|
th.tableblock.valign-top, td.tableblock.valign-top {
|
|
vertical-align: top;
|
|
}
|
|
th.tableblock.valign-middle, td.tableblock.valign-middle {
|
|
vertical-align: middle;
|
|
}
|
|
th.tableblock.valign-bottom, td.tableblock.valign-bottom {
|
|
vertical-align: bottom;
|
|
}
|
|
|
|
|
|
|
|
|
|
</style>
|
|
<script type="text/javascript">
|
|
/*<![CDATA[*/
|
|
var asciidoc = { // Namespace.
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
// Table Of Contents generator
|
|
/////////////////////////////////////////////////////////////////////
|
|
|
|
/* Author: Mihai Bazon, September 2002
|
|
* http://students.infoiasi.ro/~mishoo
|
|
*
|
|
* Table Of Content generator
|
|
* Version: 0.4
|
|
*
|
|
* Feel free to use this script under the terms of the GNU General Public
|
|
* License, as long as you do not remove or alter this notice.
|
|
*/
|
|
|
|
/* modified by Troy D. Hanson, September 2006. License: GPL */
|
|
/* modified by Stuart Rackham, 2006, 2009. License: GPL */
|
|
|
|
// toclevels = 1..4.
|
|
toc: function (toclevels) {
|
|
|
|
function getText(el) {
|
|
var text = "";
|
|
for (var i = el.firstChild; i != null; i = i.nextSibling) {
|
|
if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
|
|
text += i.data;
|
|
else if (i.firstChild != null)
|
|
text += getText(i);
|
|
}
|
|
return text;
|
|
}
|
|
|
|
function TocEntry(el, text, toclevel) {
|
|
this.element = el;
|
|
this.text = text;
|
|
this.toclevel = toclevel;
|
|
}
|
|
|
|
function tocEntries(el, toclevels) {
|
|
var result = new Array;
|
|
var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
|
|
// Function that scans the DOM tree for header elements (the DOM2
|
|
// nodeIterator API would be a better technique but not supported by all
|
|
// browsers).
|
|
var iterate = function (el) {
|
|
for (var i = el.firstChild; i != null; i = i.nextSibling) {
|
|
if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
|
|
var mo = re.exec(i.tagName);
|
|
if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
|
|
result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
|
|
}
|
|
iterate(i);
|
|
}
|
|
}
|
|
}
|
|
iterate(el);
|
|
return result;
|
|
}
|
|
|
|
var toc = document.getElementById("toc");
|
|
if (!toc) {
|
|
return;
|
|
}
|
|
|
|
// Delete existing TOC entries in case we're reloading the TOC.
|
|
var tocEntriesToRemove = [];
|
|
var i;
|
|
for (i = 0; i < toc.childNodes.length; i++) {
|
|
var entry = toc.childNodes[i];
|
|
if (entry.nodeName.toLowerCase() == 'div'
|
|
&& entry.getAttribute("class")
|
|
&& entry.getAttribute("class").match(/^toclevel/))
|
|
tocEntriesToRemove.push(entry);
|
|
}
|
|
for (i = 0; i < tocEntriesToRemove.length; i++) {
|
|
toc.removeChild(tocEntriesToRemove[i]);
|
|
}
|
|
|
|
// Rebuild TOC entries.
|
|
var entries = tocEntries(document.getElementById("content"), toclevels);
|
|
for (var i = 0; i < entries.length; ++i) {
|
|
var entry = entries[i];
|
|
if (entry.element.id == "")
|
|
entry.element.id = "_toc_" + i;
|
|
var a = document.createElement("a");
|
|
a.href = "#" + entry.element.id;
|
|
a.appendChild(document.createTextNode(entry.text));
|
|
var div = document.createElement("div");
|
|
div.appendChild(a);
|
|
div.className = "toclevel" + entry.toclevel;
|
|
toc.appendChild(div);
|
|
}
|
|
if (entries.length == 0)
|
|
toc.parentNode.removeChild(toc);
|
|
},
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////
|
|
// Footnotes generator
|
|
/////////////////////////////////////////////////////////////////////
|
|
|
|
/* Based on footnote generation code from:
|
|
* http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
|
|
*/
|
|
|
|
footnotes: function () {
|
|
// Delete existing footnote entries in case we're reloading the footnodes.
|
|
var i;
|
|
var noteholder = document.getElementById("footnotes");
|
|
if (!noteholder) {
|
|
return;
|
|
}
|
|
var entriesToRemove = [];
|
|
for (i = 0; i < noteholder.childNodes.length; i++) {
|
|
var entry = noteholder.childNodes[i];
|
|
if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
|
|
entriesToRemove.push(entry);
|
|
}
|
|
for (i = 0; i < entriesToRemove.length; i++) {
|
|
noteholder.removeChild(entriesToRemove[i]);
|
|
}
|
|
|
|
// Rebuild footnote entries.
|
|
var cont = document.getElementById("content");
|
|
var spans = cont.getElementsByTagName("span");
|
|
var refs = {};
|
|
var n = 0;
|
|
for (i=0; i<spans.length; i++) {
|
|
if (spans[i].className == "footnote") {
|
|
n++;
|
|
var note = spans[i].getAttribute("data-note");
|
|
if (!note) {
|
|
// Use [\s\S] in place of . so multi-line matches work.
|
|
// Because JavaScript has no s (dotall) regex flag.
|
|
note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
|
|
spans[i].innerHTML =
|
|
"[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
|
|
"' title='View footnote' class='footnote'>" + n + "</a>]";
|
|
spans[i].setAttribute("data-note", note);
|
|
}
|
|
noteholder.innerHTML +=
|
|
"<div class='footnote' id='_footnote_" + n + "'>" +
|
|
"<a href='#_footnoteref_" + n + "' title='Return to text'>" +
|
|
n + "</a>. " + note + "</div>";
|
|
var id =spans[i].getAttribute("id");
|
|
if (id != null) refs["#"+id] = n;
|
|
}
|
|
}
|
|
if (n == 0)
|
|
noteholder.parentNode.removeChild(noteholder);
|
|
else {
|
|
// Process footnoterefs.
|
|
for (i=0; i<spans.length; i++) {
|
|
if (spans[i].className == "footnoteref") {
|
|
var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
|
|
href = href.match(/#.*/)[0]; // Because IE return full URL.
|
|
n = refs[href];
|
|
spans[i].innerHTML =
|
|
"[<a href='#_footnote_" + n +
|
|
"' title='View footnote' class='footnote'>" + n + "</a>]";
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
install: function(toclevels) {
|
|
var timerId;
|
|
|
|
function reinstall() {
|
|
asciidoc.footnotes();
|
|
if (toclevels) {
|
|
asciidoc.toc(toclevels);
|
|
}
|
|
}
|
|
|
|
function reinstallAndRemoveTimer() {
|
|
clearInterval(timerId);
|
|
reinstall();
|
|
}
|
|
|
|
timerId = setInterval(reinstall, 500);
|
|
if (document.addEventListener)
|
|
document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
|
|
else
|
|
window.onload = reinstallAndRemoveTimer;
|
|
}
|
|
|
|
}
|
|
asciidoc.install();
|
|
/*]]>*/
|
|
</script>
|
|
</head>
|
|
<body class="article">
|
|
<div id="header">
|
|
<h1>(LADI) jackdbus</h1>
|
|
</div>
|
|
<div id="content">
|
|
<div id="preamble">
|
|
<div class="sectionbody">
|
|
<div class="paragraph"><p><span class="image">
|
|
<a class="image" href="https://github.com/LADI/jackdbus/actions">
|
|
<img src="https://github.com/LADI/jackdbus/actions/workflows/build.yml/badge.svg" alt="Build status badge">
|
|
</a>
|
|
</span>
|
|
<span class="image">
|
|
<a class="image" href="https://repology.org/metapackage/jack-audio-connection-kit/versions">
|
|
<img src="https://repology.org/badge/tiny-repos/jack-audio-connection-kit.svg" alt="Repology bandge">
|
|
</a>
|
|
</span></p></div>
|
|
</div>
|
|
</div>
|
|
<div class="sect1">
|
|
<h2 id="_overview">Overview</h2>
|
|
<div class="sectionbody">
|
|
<div class="paragraph"><p>This software implements D-Bus endpoint for JACK server.</p></div>
|
|
</div>
|
|
</div>
|
|
<div class="sect1">
|
|
<h2 id="_brief_history">Brief History</h2>
|
|
<div class="sectionbody">
|
|
<div class="paragraph"><p>Initial version of <a href="https://github.com/LADI/jackdbus">jackdbus</a> was created
|
|
as part of LADI project and was ad-hoc modification of JACK1 codebase.
|
|
jackdbus for JACK1 was maintained first as a setup of ad-hoc patches,
|
|
then via Mercural and then via Git.
|
|
In 2008/2009, jackdbus was ported to jackdmp codebase along with an implementation
|
|
of the newly designed for the new need control API for JACK.
|
|
The result of this merge became known as
|
|
<a href="https://web.archive.org/web/20170106162202/http://lac.linuxaudio.org/2009/cdm/Thursday/01_Letz/01.pdf">JACK2</a>.
|
|
As of 2022, jackdbus is again maintained in LADI project.
|
|
The jackaudio.org version of jackdbus is considered older/alternative
|
|
implementation.</p></div>
|
|
<div class="paragraph"><p>For LADI specific issues, submit issues or pull request to LADI project.
|
|
For related discussions, you are invited to join
|
|
<a href="https://libera.chat/">Libera.Chat</a> channel #ladi</p></div>
|
|
<div class="admonitionblock">
|
|
<table><tr>
|
|
<td class="icon">
|
|
<img alt="Important" src="data:image/png;base64,
|
|
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
|
|
EQn3XQAAAABJRU5ErkJggg==">
|
|
</td>
|
|
<td class="content">Do not submit LADI specific issues to jackaudio project.</td>
|
|
</tr></table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="sect1">
|
|
<h2 id="_d_bus_access">D-Bus access</h2>
|
|
<div class="sectionbody">
|
|
<div class="paragraph"><p>D-Bus is an object model that provides IPC mechanism.
|
|
D-Bus supports autoactivation of objects,
|
|
thus making it simple and reliable to code a "single instance" application or daemon,
|
|
and to launch applications and daemons on demand when their services are needed.</p></div>
|
|
<div class="paragraph"><p>Improvements over classical "jackd" approach:</p></div>
|
|
<div class="ulist"><ul>
|
|
<li>
|
|
<p>
|
|
Simplified single thread model for control and monitor
|
|
applications. Various D-Bus language bindings make it trivial to
|
|
write control and monitor applications using scripting languages
|
|
like Python, Ruby, Perl, etc..
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
A log file is available for inspection even when autoactivation
|
|
happens by the first launched JACK application.
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
A real configuration file is used to persist settings to be
|
|
manipulated through configuration interface of JACK D-Bus object.
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
Improved graph inspection and control mechanism. JACK graph is
|
|
versioned. Connections, ports and clients have unique
|
|
(monotonically increasing) numeric IDs.
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
High level abstraction of JACK settings. Allows applications that
|
|
can configure JACK to expose parameters that were not known at
|
|
compile (or tarball release) time. Recent real world examples are
|
|
the JACK MIDI driver parameters and support for FFADO driver in
|
|
QJackCtl. Upgrading of JACK requires upgrade of QJackCtl in order
|
|
to make new settings available in the GUI.
|
|
</p>
|
|
</li>
|
|
</ul></div>
|
|
<div class="sect2">
|
|
<h3 id="_how_it_works">How it works</h3>
|
|
<div class="sect3">
|
|
<h4 id="_autoactivation_and_starting_stopping_jack_server">Autoactivation and starting/stopping JACK server</h4>
|
|
<div class="paragraph"><p>First, application that issues D-Bus method call to JACK controller object,
|
|
causes D-Bus session daemon to activate the object by starting the jackdbus executable.
|
|
Activating controller object does not start the server.
|
|
Instead controller object has several interfaces.
|
|
The most important of them is the control interface.
|
|
Control interface contains methods for starting and stopping JACK server,
|
|
loading and unloading of internal clients (netjack),
|
|
setting buffer size and resetting xrun counter.
|
|
It also contains methods for querying information required by monitoring
|
|
applications:</p></div>
|
|
<div class="ulist"><ul>
|
|
<li>
|
|
<p>
|
|
whether JACK server is started
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
whether JACK server is running in realtime mode
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
sample rate
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
DSP load
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
current buffer size
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
latency
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
xrun counter
|
|
</p>
|
|
</li>
|
|
</ul></div>
|
|
<div class="paragraph"><p>JACK server autostart is achieved by libjack calling "jack server start" method of
|
|
JACK control D-Bus interface.</p></div>
|
|
</div>
|
|
<div class="sect3">
|
|
<h4 id="_jack_settings">JACK settings</h4>
|
|
<div class="paragraph"><p>Applications that want to manage JACK settings can query
|
|
and set all settings that were traditionally specified as
|
|
jackd command-line parameters.
|
|
Interface abstraction provides virtual tree of parameter
|
|
containers with container leaves that contain parameters.
|
|
Parameters are accessed using simple addressing scheme (array of strings)
|
|
where address defines path to parameter, like "drivers", "alsa", "dither".</p></div>
|
|
<div class="paragraph"><p>Overview of the tree of standard settings' addresses:</p></div>
|
|
<div class="ulist"><ul>
|
|
<li>
|
|
<p>
|
|
"engine"
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
"engine", "driver"
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
"engine", "realtime"
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
"engine", …more engine parameters
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
"driver", "device"
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
"driver", …more driver parameters
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
"drivers", "alsa", "device"
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
"drivers", "alsa", …more alsa driver parameters
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
"drivers", …more drivers
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
"internals", "netmanager", "multicast ip"
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
"internals", "netmanager", …more netmanager parameters
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
"internals", …more internals
|
|
</p>
|
|
</li>
|
|
</ul></div>
|
|
<div class="paragraph"><p>JACK settings are persisted.
|
|
I.e. they are automatically saved by jackdbus when they are set.
|
|
Next time user starts JACK server, last saved settings will be automatically used.
|
|
Changing JACK settings through the configure D-Bus interface takes effect on next
|
|
JACK server start.
|
|
On the fly change of the buffer size, as available in the libjack
|
|
(jack.h) API, is also possible through the control D-Bus interface.</p></div>
|
|
</div>
|
|
<div class="sect3">
|
|
<h4 id="_jack_parameter_constraints">JACK parameter constraints</h4>
|
|
<div class="paragraph"><p>JACK internal modules that provide parameters visible through control API can provide
|
|
information about parameter valid range (like realtime priority) or
|
|
whether parameter should be presented as enumeration.
|
|
Enumeration parameters can be strict and non-strict.
|
|
Example of strict enum parameter is dither parameter of ALSA driver,
|
|
it has only predefined valid values: "shaped noise",
|
|
"rectangular", "triangualr" and "none".</p></div>
|
|
<div class="paragraph"><p>Example of non-strict parameter is device parameter of ALSA driver.
|
|
It is useful to provide some detected device strings as choices to user,
|
|
but still allow user to specify custom string that ALSA layer is supposed to
|
|
understand.</p></div>
|
|
</div>
|
|
<div class="sect3">
|
|
<h4 id="_jack_patchbay">JACK patchbay</h4>
|
|
<div class="paragraph"><p>In order to simplify patchbay applications, extended functionality is provided.
|
|
There is a method that returns the current graph state.
|
|
Graph state has unique monotonically increasing version number
|
|
and contains info about all clients, their ports and connections.
|
|
Connections, ports and clients have unique numeric IDs
|
|
that are guaranteed not to be reused.
|
|
Notifica tions about graph changes are provided using
|
|
D-Bus signals.</p></div>
|
|
</div>
|
|
</div>
|
|
<div class="sect2">
|
|
<h3 id="_jack_d_bus_enabled_applications">JACK D-Bus enabled applications</h3>
|
|
<div class="sect3">
|
|
<h4 id="_jack_control">jack_control</h4>
|
|
<div class="paragraph"><p>JACK contains "jack_control" executable, <a href="https://gitea.ladish.org/LADI/jackdbus/src/branch/stable/dbus/jack_control">a 300 lines of Python</a> exposing
|
|
JACK D-Bus functionality. It allows chained execution of several commands.
|
|
For example "jack control ds alsa dps midi-driver raw eps realtime on
|
|
eps relatime-priority 70 start" selects ALSA driver, enables JACK MIDI
|
|
raw backend, enables realtime mode, sets realtime priority to 70 and starts
|
|
JACK server.</p></div>
|
|
</div>
|
|
<div class="sect3">
|
|
<h4 id="_ladi_tools">LADI Tools</h4>
|
|
<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.
|
|
It provides tray icon, Window Maker style dockapp,
|
|
G15 keyboard LCD display integration application,
|
|
configuration utility for managing JACK settings
|
|
and log file monitor application.</p></div>
|
|
<div class="paragraph"><p>All tools are written in Python.</p></div>
|
|
</div>
|
|
<div class="sect3">
|
|
<h4 id="_patchage">Patchage</h4>
|
|
<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
|
|
D-Bus instead of libjack to communicate with JACK.</p></div>
|
|
<div class="paragraph"><p>Doing so also enables JACK server start/stop functionality in Patchage.</p></div>
|
|
<div class="paragraph"><p>Various JACK related features are implemented:</p></div>
|
|
</div>
|
|
<div class="sect3">
|
|
<h4 id="_ladi_session_handler_ladish">LADI Session handler (LADISH)</h4>
|
|
<div class="paragraph"><p><a href="https://ladish.org/">LADISH</a>, a rewrite of LASH session handler
|
|
uses D-Bus to communicate with JACK.</p></div>
|
|
<div class="paragraph"><p>Various JACK related features are implemented:</p></div>
|
|
<div class="ulist"><ul>
|
|
<li>
|
|
<p>
|
|
Saving of JACK settings as part of "studio" session.
|
|
</p>
|
|
</li>
|
|
<li>
|
|
<p>
|
|
Handling of "JACK server crash" scenario: restarting JACK server,
|
|
notifying JACK applications that JACK server reappeared so they
|
|
can reconnect to it, and restoring JACK connections.
|
|
</p>
|
|
</li>
|
|
</ul></div>
|
|
</div>
|
|
<div class="sect3">
|
|
<h4 id="_qjackctl_jack_audio_connection_kit_qt_gui_interface">QjackCtl JACK Audio Connection Kit - Qt GUI Interface</h4>
|
|
<div class="paragraph"><p><a href="https://qjackctl.sourceforge.io/">QjackCtl</a> is a simple Qt application
|
|
to control the JACK sound server daemon, is another jackdbus frontend.</p></div>
|
|
</div>
|
|
<div class="sect3">
|
|
<h4 id="_kxstudio_cadence">KXStudio Cadence</h4>
|
|
<div class="paragraph"><p><a href="https://kx.studio/Applications:Cadence">Cadence</a>, a set of tools
|
|
useful for audio production, is another jackdbus frontend.</p></div>
|
|
</div>
|
|
<div class="sect3">
|
|
<h4 id="_studio_controls">Studio Controls</h4>
|
|
<div class="paragraph"><p><a href="https://ovenwerks.github.io/studio-controls/">Studio Controls</a>, a way to
|
|
configure your Linux-based audio installation for real-time audio, is
|
|
another jackdbus frontend.</p></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="sect1">
|
|
<h2 id="_references">References</h2>
|
|
<div class="sectionbody">
|
|
<div class="olist arabic"><ol class="arabic">
|
|
<li>
|
|
<p>
|
|
<a href="https://web.archive.org/web/20170106162202/http://lac.linuxaudio.org/2009/cdm/Thursday/01_Letz/01.pdf">What’s new in JACK2?</a>
|
|
</p>
|
|
</li>
|
|
</ol></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div id="footnotes"><hr></div>
|
|
<div id="footer">
|
|
<div id="footer-text">
|
|
Last updated
|
|
2023-05-15 23:20:46 EEST
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|