1065 lines
30 KiB
HTML
1065 lines
30 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 imlements 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 300 lines of Python 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>LADI Tools 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>Patchage, 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>
|
||
<div class="sect3">
|
||
<h4 id="_ladi_session_handler_ladish">LADI Session handler (LADISH)</h4>
|
||
<div class="paragraph"><p>LADISH, 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>
|
||
</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-03-08 10:15:31 EET
|
||
</div>
|
||
</div>
|
||
</body>
|
||
</html>
|