commit: 6caf0c2264f48e4ae7156c733875764c3c724997
parent 1ca8e42757ead82d117e03d7777d0e1680e58b94
Author: Haelwenn (lanodan) Monnier <contact@hacktivis.me>
Date: Sat, 11 Sep 2021 08:06:29 +0200
linux audio output: Add legend
Diffstat:
7 files changed, 747 insertions(+), 655 deletions(-)
diff --git a/articles/linux-audio-output.xhtml b/articles/linux-audio-output.xhtml
@@ -2,7 +2,7 @@
<a href="/articles/linux-audio-output"><h1>Linux Audio Output APIs</h1></a>
<p>About a month ago I took a long afternoon being like "Okay whatever let's see how deep the rabbit hole of linux audio playback goes" (<a href="https://queer.hacktivis.me/objects/33fc99e9-c901-4764-8b75-27d78bf7cc7d">previously</a>, <a href="https://queer.hacktivis.me/objects/3a5e4919-e8ee-4e4c-b50c-899f4afac678">previously</a>). That was a mistake I guess but let's at least avoid others from doing the same and so share what I did as it's fairly complete (patches with reference/citations welcome btw).</p>
<p>I consider here as an Audio Output API any reused code which takes a PCM audio stream as input and which is designed to end up to the sound card at some point. In a simple system there should just be some decoders and cross-platform librairies going to the system native API (ones which are nicely desgined being SunAudio and Plan9 audio).</p>
-<figure><img loading="lazy" title="Linux Audio Output APIs" src="/images/linux-audio-output.svg?serial=2021091103" /></figure>
+<figure><img loading="lazy" title="Linux Audio Output APIs" src="/images/linux-audio-output.svg?serial=2021091104" /></figure>
<p>You'll definitely need a large screen if you want to see the whole thing at once.</p>
<h3>Other formats</h3>
<ul>
@@ -19,12 +19,13 @@
<li>Removed "network card" target, it should be redone per-protocol, in probably a dedicated graph</li>
<li>Removed "filesystem" and "null" targets, this is more for diagnostics purposes and graphviz doesn't have layers</li>
<li>Removed "?" target, in favor of going nowhere</li>
+ <li>Added Legend</li>
</ul>
</dt>
</dl>
<h2>Cleaned out variant</h2>
<p>This is a variant which only contains APIs/software which is available in current distributions rather than including all the paths that are technically still present in codebases.</p>
-<figure><img loading="lazy" title="Linux Audio Output APIs" src="/images/linux-audio-output-current.svg?serial=2021091102" /></figure>
+<figure><img loading="lazy" title="Linux Audio Output APIs" src="/images/linux-audio-output-current.svg?serial=2021091103" /></figure>
<h3>Other formats</h3>
<ul>
<li><a href="/images/linux-audio-output-current.dot">Graphviz DOT</a>: source, has comments and URLs</li>
diff --git a/images/linux-audio-output-current.dot b/images/linux-audio-output-current.dot
@@ -1,12 +1,25 @@
digraph "Linux Audio Output APIs (current-only)" {
node [ shape=ellipse style=filled ];
+
label="Linux Audio Output APIs (current-only)
CC-BY 4.0 © 2020-2021 Haelwenn (lanodan) Monnier
https://hacktivis.me/articles/linux-audio-output";
-
- "sound card" [ shape=box fillcolor=cyan ];
+ labelURL="https://hacktivis.me/articles/linux-audio-output"
+
+ subgraph cluster_legend {
+ label="Legend"
+ server [ shape=octagon fillcolor=orange ];
+ driver [ shape=hexagon fillcolor=yellow ];
+ hardware [ shape=box fillcolor=cyan ];
+ //{ rank=same hardware driver server }
+ }
+
+
+ { rank=same "sound card" "phone modem" bluetooth }
+
+ "sound card" [ shape=box fillcolor=cyan ];
"phone modem" [ shape=box fillcolor=cyan ];
- "Bluetooth card" [ shape=box fillcolor=cyan ];
+ bluetooth [ shape=box fillcolor=cyan ];
portaudio [ URL="https://app.assembla.com/spaces/portaudio/git/source/master/src/hostapi/" ];
portaudio -> ALSA;
@@ -15,7 +28,7 @@ digraph "Linux Audio Output APIs (current-only)" {
portaudio -> sndio;
// https://rudd-o.com/linux-and-free-software/how-pulseaudio-works
- PulseAudio [ URL="https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/Modules/" ];
+ PulseAudio [ shape=octagon fillcolor=orange URL="https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/Modules/" ];
PulseAudio -> ALSA;
PulseAudio -> "sound card" [ color=green ];
PulseAudio -> JACK;
@@ -23,19 +36,19 @@ digraph "Linux Audio Output APIs (current-only)" {
PulseAudio -> ofono;
"X11 bell" -> PulseAudio;
- PipeWire [ URL="http://pipewire.org/" ];
+ PipeWire [ shape=octagon fillcolor=orange URL="http://pipewire.org/" ];
PulseAudio -> PipeWire [ dir=both ];
ALSA -> PipeWire [ dir=both ];
JACK -> PipeWire [ dir=both ];
PipeWire -> bluez;
gstreamer -> PipeWire;
- ofono [ shape=octagon fillcolor=yellow ];
+ ofono [ shape=hexagon fillcolor=yellow ];
ofono -> "phone modem" [ color=green ];
- bluez [ label="BlueZ" shape=octagon fillcolor=yellow ];
+ bluez [ label="BlueZ" shape=hexagon fillcolor=yellow ];
ALSA -> bluez;
- bluez -> "Bluetooth card" [ color=green ];
+ bluez -> bluetooth [ color=green ];
sox [ URL="http://sox.sourceforge.net/Docs/Features" ];
sox -> libao;
@@ -61,7 +74,7 @@ digraph "Linux Audio Output APIs (current-only)" {
libcanberra -> ALSA;
libcanberra -> gstreamer;
- sndio [ URL="http://www.sndio.org/" ];
+ sndio [ shape=octagon fillcolor=orange URL="http://www.sndio.org/" ];
sndio -> ALSA [ dir=both ];
PulseAudio -> sndio;
gstreamer -> sndio;
@@ -88,10 +101,10 @@ digraph "Linux Audio Output APIs (current-only)" {
JUCE -> ALSA;
JUCE -> JACK;
- ALSA [ shape=octagon URL="https://alsa-project.org/wiki/Asoundrc#Plugins" fillcolor=yellow ];
+ ALSA [ shape=hexagon URL="https://alsa-project.org/wiki/Asoundrc#Plugins" fillcolor=yellow ];
ALSA -> "sound card" [ color=green ];
ALSA -> PulseAudio;
- ALSA -> JACK;
+ ALSA -> JACK [ dir=both ];
// https://wiki.libsdl.org/FAQUsingSDL
@@ -106,7 +119,7 @@ digraph "Linux Audio Output APIs (current-only)" {
// And then where the hell does it goes?
- NAS [ label="Network Audio System/Server" URL="http://radscan.com/nas.html" ]
+ NAS [ shape=octagon fillcolor=orange label="Network Audio System/Server" URL="http://radscan.com/nas.html" ]
gstreamer -> ALSA;
gstreamer -> JACK;
@@ -135,4 +148,6 @@ digraph "Linux Audio Output APIs (current-only)" {
pcaudiolib [ URL="https://github.com/espeak-ng/pcaudiolib" ];
pcaudiolib -> ALSA;
pcaudiolib -> PulseAudio;
+
+ JACK [ shape=octagon fillcolor=orange URL="https://jackaudio.org/" ];
}
diff --git a/images/linux-audio-output-current.png b/images/linux-audio-output-current.png
Binary files differ.
diff --git a/images/linux-audio-output-current.svg b/images/linux-audio-output-current.svg
@@ -4,685 +4,712 @@
<!-- Generated by graphviz version 2.47.1 (20210417.1919)
-->
<!-- Title: Linux Audio Output APIs (current-only) Pages: 1 -->
-<svg width="1894pt" height="695pt"
- viewBox="0.00 0.00 1893.60 695.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 691)">
+<svg width="1809pt" height="734pt"
+ viewBox="0.00 0.00 1808.57 734.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 730)">
<title>Linux Audio Output APIs (current-only)</title>
-<polygon fill="white" stroke="transparent" points="-4,4 -4,-691 1889.6,-691 1889.6,4 -4,4"/>
-<text text-anchor="middle" x="942.8" y="-37.8" font-family="Times,serif" font-size="14.00">Linux Audio Output APIs (current-only)</text>
-<text text-anchor="middle" x="942.8" y="-22.8" font-family="Times,serif" font-size="14.00"> CC-BY 4.0 © 2020-2021 Haelwenn (lanodan) Monnier</text>
-<text text-anchor="middle" x="942.8" y="-7.8" font-family="Times,serif" font-size="14.00"> https://hacktivis.me/articles/linux-audio-output</text>
-<!-- sound card -->
+<polygon fill="white" stroke="transparent" points="-4,4 -4,-730 1804.57,-730 1804.57,4 -4,4"/>
+<text text-anchor="middle" x="900.29" y="-37.8" font-family="Times,serif" font-size="14.00">Linux Audio Output APIs (current-only)</text>
+<text text-anchor="middle" x="900.29" y="-22.8" font-family="Times,serif" font-size="14.00"> CC-BY 4.0 © 2020-2021 Haelwenn (lanodan) Monnier</text>
+<text text-anchor="middle" x="900.29" y="-7.8" font-family="Times,serif" font-size="14.00"> https://hacktivis.me/articles/linux-audio-output</text>
+<g id="clust1" class="cluster">
+<title>cluster_legend</title>
+<polygon fill="none" stroke="black" points="556,-643 556,-718 872,-718 872,-643 556,-643"/>
+<text text-anchor="middle" x="714" y="-702.8" font-family="Times,serif" font-size="14.00">Legend</text>
+</g>
+<!-- server -->
<g id="node1" class="node">
+<title>server</title>
+<polygon fill="orange" stroke="black" points="863.73,-661.54 863.73,-676.46 838.11,-687 801.89,-687 776.27,-676.46 776.27,-661.54 801.89,-651 838.11,-651 863.73,-661.54"/>
+<text text-anchor="middle" x="820" y="-665.3" font-family="Times,serif" font-size="14.00">server</text>
+</g>
+<!-- driver -->
+<g id="node2" class="node">
+<title>driver</title>
+<polygon fill="yellow" stroke="black" points="758.06,-669 735.53,-687 690.47,-687 667.94,-669 690.47,-651 735.53,-651 758.06,-669"/>
+<text text-anchor="middle" x="713" y="-665.3" font-family="Times,serif" font-size="14.00">driver</text>
+</g>
+<!-- hardware -->
+<g id="node3" class="node">
+<title>hardware</title>
+<polygon fill="cyan" stroke="black" points="649.5,-687 564.5,-687 564.5,-651 649.5,-651 649.5,-687"/>
+<text text-anchor="middle" x="607" y="-665.3" font-family="Times,serif" font-size="14.00">hardware</text>
+</g>
+<!-- sound card -->
+<g id="node4" class="node">
<title>sound card</title>
-<polygon fill="cyan" stroke="black" points="1330.5,-322 1235.5,-322 1235.5,-286 1330.5,-286 1330.5,-322"/>
-<text text-anchor="middle" x="1283" y="-300.3" font-family="Times,serif" font-size="14.00">sound card</text>
+<polygon fill="cyan" stroke="black" points="1072.5,-89 977.5,-89 977.5,-53 1072.5,-53 1072.5,-89"/>
+<text text-anchor="middle" x="1025" y="-67.3" font-family="Times,serif" font-size="14.00">sound card</text>
</g>
<!-- phone modem -->
-<g id="node2" class="node">
+<g id="node5" class="node">
<title>phone modem</title>
-<polygon fill="cyan" stroke="black" points="1853.5,-235 1736.5,-235 1736.5,-199 1853.5,-199 1853.5,-235"/>
-<text text-anchor="middle" x="1795" y="-213.3" font-family="Times,serif" font-size="14.00">phone modem</text>
+<polygon fill="cyan" stroke="black" points="1356.5,-89 1239.5,-89 1239.5,-53 1356.5,-53 1356.5,-89"/>
+<text text-anchor="middle" x="1298" y="-67.3" font-family="Times,serif" font-size="14.00">phone modem</text>
</g>
-<!-- Bluetooth card -->
-<g id="node3" class="node">
-<title>Bluetooth card</title>
-<polygon fill="cyan" stroke="black" points="1368,-89 1246,-89 1246,-53 1368,-53 1368,-89"/>
-<text text-anchor="middle" x="1307" y="-67.3" font-family="Times,serif" font-size="14.00">Bluetooth card</text>
+<!-- bluetooth -->
+<g id="node6" class="node">
+<title>bluetooth</title>
+<polygon fill="cyan" stroke="black" points="1181.5,-89 1096.5,-89 1096.5,-53 1181.5,-53 1181.5,-89"/>
+<text text-anchor="middle" x="1139" y="-67.3" font-family="Times,serif" font-size="14.00">bluetooth</text>
</g>
<!-- portaudio -->
-<g id="node4" class="node">
+<g id="node7" class="node">
<title>portaudio</title>
-<g id="a_node4"><a xlink:href="https://app.assembla.com/spaces/portaudio/git/source/master/src/hostapi/" xlink:title="portaudio">
-<ellipse fill="lightgrey" stroke="black" cx="661" cy="-523" rx="55.79" ry="18"/>
-<text text-anchor="middle" x="661" y="-519.3" font-family="Times,serif" font-size="14.00">portaudio</text>
+<g id="a_node7"><a xlink:href="https://app.assembla.com/spaces/portaudio/git/source/master/src/hostapi/" xlink:title="portaudio">
+<ellipse fill="lightgrey" stroke="black" cx="681" cy="-523" rx="55.79" ry="18"/>
+<text text-anchor="middle" x="681" y="-519.3" font-family="Times,serif" font-size="14.00">portaudio</text>
</a>
</g>
</g>
<!-- ALSA -->
-<g id="node5" class="node">
+<g id="node8" class="node">
<title>ALSA</title>
-<g id="a_node5"><a xlink:href="https://alsa-project.org/wiki/Asoundrc#Plugins" xlink:title="ALSA">
-<polygon fill="yellow" stroke="black" points="1023.89,-442.54 1023.89,-457.46 1001.11,-468 968.89,-468 946.11,-457.46 946.11,-442.54 968.89,-432 1001.11,-432 1023.89,-442.54"/>
-<text text-anchor="middle" x="985" y="-446.3" font-family="Times,serif" font-size="14.00">ALSA</text>
+<g id="a_node8"><a xlink:href="https://alsa-project.org/wiki/Asoundrc#Plugins" xlink:title="ALSA">
+<polygon fill="yellow" stroke="black" points="1136.05,-450 1115.53,-468 1074.47,-468 1053.95,-450 1074.47,-432 1115.53,-432 1136.05,-450"/>
+<text text-anchor="middle" x="1095" y="-446.3" font-family="Times,serif" font-size="14.00">ALSA</text>
</a>
</g>
</g>
<!-- portaudio->ALSA -->
<g id="edge1" class="edge">
<title>portaudio->ALSA</title>
-<path fill="none" stroke="black" d="M702.15,-510.75C710.04,-508.73 718.26,-506.72 726,-505 769.23,-495.39 780.61,-495.83 824,-487 863.25,-479.01 907.67,-469 939.9,-461.57"/>
-<polygon fill="black" stroke="black" points="940.95,-464.92 949.91,-459.25 939.38,-458.1 940.95,-464.92"/>
+<path fill="none" stroke="black" d="M729.18,-513.84C746.45,-510.97 766.09,-507.77 784,-505 812.4,-500.6 1011.96,-474.32 1040,-468 1045.36,-466.79 1050.96,-465.32 1056.44,-463.75"/>
+<polygon fill="black" stroke="black" points="1057.54,-467.07 1066.11,-460.86 1055.53,-460.37 1057.54,-467.07"/>
</g>
<!-- JACK -->
-<g id="node6" class="node">
+<g id="node9" class="node">
<title>JACK</title>
-<ellipse fill="lightgrey" stroke="black" cx="1172" cy="-304" rx="34.39" ry="18"/>
-<text text-anchor="middle" x="1172" y="-300.3" font-family="Times,serif" font-size="14.00">JACK</text>
+<g id="a_node9"><a xlink:href="https://jackaudio.org/" xlink:title="JACK">
+<polygon fill="orange" stroke="black" points="1428.07,-296.54 1428.07,-311.46 1406.36,-322 1375.64,-322 1353.93,-311.46 1353.93,-296.54 1375.64,-286 1406.36,-286 1428.07,-296.54"/>
+<text text-anchor="middle" x="1391" y="-300.3" font-family="Times,serif" font-size="14.00">JACK</text>
+</a>
+</g>
</g>
<!-- portaudio->JACK -->
<g id="edge2" class="edge">
<title>portaudio->JACK</title>
-<path fill="none" stroke="black" d="M683.24,-506.37C729.95,-474.24 842.58,-400.32 947,-359 1008.12,-334.82 1083.03,-319.49 1129.13,-311.57"/>
-<polygon fill="black" stroke="black" points="1129.79,-315.01 1139.08,-309.9 1128.63,-308.11 1129.79,-315.01"/>
+<path fill="none" stroke="black" d="M703.38,-506.41C732.39,-486.8 785.05,-453.12 834,-432 940.67,-385.97 971.85,-385.36 1085,-359 1175.64,-337.89 1283.08,-320.71 1343.52,-311.75"/>
+<polygon fill="black" stroke="black" points="1344.14,-315.19 1353.52,-310.27 1343.12,-308.27 1344.14,-315.19"/>
</g>
<!-- sndio -->
-<g id="node7" class="node">
+<g id="node10" class="node">
<title>sndio</title>
-<g id="a_node7"><a xlink:href="http://www.sndio.org/" xlink:title="sndio">
-<ellipse fill="lightgrey" stroke="black" cx="677" cy="-304" rx="36" ry="18"/>
-<text text-anchor="middle" x="677" y="-300.3" font-family="Times,serif" font-size="14.00">sndio</text>
+<g id="a_node10"><a xlink:href="http://www.sndio.org/" xlink:title="sndio">
+<polygon fill="orange" stroke="black" points="727.89,-296.54 727.89,-311.46 705.11,-322 672.89,-322 650.11,-311.46 650.11,-296.54 672.89,-286 705.11,-286 727.89,-296.54"/>
+<text text-anchor="middle" x="689" y="-300.3" font-family="Times,serif" font-size="14.00">sndio</text>
</a>
</g>
</g>
<!-- portaudio->sndio -->
<g id="edge3" class="edge">
<title>portaudio->sndio</title>
-<path fill="none" stroke="black" d="M678.01,-505.67C683.06,-500.12 688.24,-493.64 692,-487 696.36,-479.29 696.65,-476.75 698,-468 705.34,-420.37 693.85,-364.63 685.19,-332.22"/>
-<polygon fill="black" stroke="black" points="688.44,-330.87 682.39,-322.17 681.7,-332.74 688.44,-330.87"/>
+<path fill="none" stroke="black" d="M682.9,-505C684,-494.38 685.31,-480.41 686,-468 688.65,-420.27 689.11,-364.56 689.11,-332.19"/>
+<polygon fill="black" stroke="black" points="692.61,-332.14 689.1,-322.15 685.61,-332.15 692.61,-332.14"/>
</g>
<!-- ALSA->sound card -->
<g id="edge49" class="edge">
<title>ALSA->sound card</title>
-<path fill="none" stroke="green" d="M1010.92,-436.47C1061.7,-411.94 1174.81,-357.28 1238.04,-326.73"/>
-<polygon fill="green" stroke="green" points="1239.88,-329.72 1247.36,-322.22 1236.84,-323.42 1239.88,-329.72"/>
+<path fill="none" stroke="green" d="M1065.7,-439.19C1040.1,-428.54 1007,-408.82 1007,-378 1007,-378 1007,-378 1007,-157 1007,-137.33 1011.67,-115.63 1016.26,-99.09"/>
+<polygon fill="green" stroke="green" points="1019.75,-99.61 1019.21,-89.03 1013.03,-97.64 1019.75,-99.61"/>
</g>
<!-- ALSA->JACK -->
<g id="edge51" class="edge">
<title>ALSA->JACK</title>
-<path fill="none" stroke="black" d="M1001.88,-431.79C1024.67,-409.11 1067.15,-368.72 1108,-340 1117.52,-333.31 1128.45,-326.91 1138.55,-321.46"/>
-<polygon fill="black" stroke="black" points="1140.31,-324.49 1147.53,-316.74 1137.05,-318.29 1140.31,-324.49"/>
+<path fill="none" stroke="black" d="M1138.71,-441.38C1156.47,-438.35 1177.2,-434.9 1196,-432 1252.78,-423.23 1275.94,-445.47 1324,-414 1339.61,-403.78 1363.59,-360.03 1378.23,-331.16"/>
+<polygon fill="black" stroke="black" points="1137.89,-437.97 1128.63,-443.11 1139.08,-444.87 1137.89,-437.97"/>
+<polygon fill="black" stroke="black" points="1381.46,-332.52 1382.81,-322.01 1375.2,-329.38 1381.46,-332.52"/>
</g>
<!-- PulseAudio -->
-<g id="node8" class="node">
+<g id="node11" class="node">
<title>PulseAudio</title>
-<g id="a_node8"><a xlink:href="https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/Modules/" xlink:title="PulseAudio">
-<ellipse fill="lightgrey" stroke="black" cx="1335" cy="-377" rx="62.29" ry="18"/>
-<text text-anchor="middle" x="1335" y="-373.3" font-family="Times,serif" font-size="14.00">PulseAudio</text>
+<g id="a_node11"><a xlink:href="https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/Modules/" xlink:title="PulseAudio">
+<polygon fill="orange" stroke="black" points="1229.57,-369.54 1229.57,-384.46 1189.99,-395 1134.01,-395 1094.43,-384.46 1094.43,-369.54 1134.01,-359 1189.99,-359 1229.57,-369.54"/>
+<text text-anchor="middle" x="1162" y="-373.3" font-family="Times,serif" font-size="14.00">PulseAudio</text>
</a>
</g>
</g>
<!-- ALSA->PulseAudio -->
<g id="edge50" class="edge">
<title>ALSA->PulseAudio</title>
-<path fill="none" stroke="black" d="M1023.8,-442.83C1065.24,-436.65 1132.38,-426.31 1190,-414 1219.57,-407.68 1252.34,-399.06 1279.33,-391.83"/>
-<polygon fill="black" stroke="black" points="1280.24,-395.21 1288.99,-389.24 1278.42,-388.45 1280.24,-395.21"/>
+<path fill="none" stroke="black" d="M1105.34,-431.81C1112.8,-422.92 1123.01,-411.91 1132.76,-402.17"/>
+<polygon fill="black" stroke="black" points="1135.36,-404.52 1140.07,-395.03 1130.47,-399.51 1135.36,-404.52"/>
</g>
<!-- bluez -->
-<g id="node9" class="node">
+<g id="node12" class="node">
<title>bluez</title>
-<polygon fill="yellow" stroke="black" points="1348.51,-136.54 1348.51,-151.46 1324.19,-162 1289.81,-162 1265.49,-151.46 1265.49,-136.54 1289.81,-126 1324.19,-126 1348.51,-136.54"/>
-<text text-anchor="middle" x="1307" y="-140.3" font-family="Times,serif" font-size="14.00">BlueZ</text>
+<polygon fill="yellow" stroke="black" points="1183.06,-158 1161.03,-176 1116.97,-176 1094.94,-158 1116.97,-140 1161.03,-140 1183.06,-158"/>
+<text text-anchor="middle" x="1139" y="-154.3" font-family="Times,serif" font-size="14.00">BlueZ</text>
</g>
<!-- ALSA->bluez -->
<g id="edge16" class="edge">
<title>ALSA->bluez</title>
-<path fill="none" stroke="black" d="M946.16,-449.5C894.61,-447.89 810,-436.36 810,-378 810,-378 810,-378 810,-216 810,-171.39 1127.91,-152.72 1255.21,-147.03"/>
-<polygon fill="black" stroke="black" points="1255.64,-150.52 1265.48,-146.58 1255.34,-143.52 1255.64,-150.52"/>
+<path fill="none" stroke="black" d="M1089.32,-431.86C1079.37,-399.21 1061.25,-326.06 1077,-267 1085.19,-236.29 1104.42,-205.24 1119.3,-184.36"/>
+<polygon fill="black" stroke="black" points="1122.29,-186.21 1125.38,-176.07 1116.64,-182.07 1122.29,-186.21"/>
</g>
<!-- PipeWire -->
-<g id="node12" class="node">
+<g id="node15" class="node">
<title>PipeWire</title>
-<g id="a_node12"><a xlink:href="http://pipewire.org/" xlink:title="PipeWire">
-<ellipse fill="lightgrey" stroke="black" cx="1307" cy="-217" rx="53.09" ry="18"/>
-<text text-anchor="middle" x="1307" y="-213.3" font-family="Times,serif" font-size="14.00">PipeWire</text>
+<g id="a_node15"><a xlink:href="http://pipewire.org/" xlink:title="PipeWire">
+<polygon fill="orange" stroke="black" points="1406.87,-223.54 1406.87,-238.46 1372.97,-249 1325.03,-249 1291.13,-238.46 1291.13,-223.54 1325.03,-213 1372.97,-213 1406.87,-223.54"/>
+<text text-anchor="middle" x="1349" y="-227.3" font-family="Times,serif" font-size="14.00">PipeWire</text>
</a>
</g>
</g>
<!-- ALSA->PipeWire -->
<g id="edge11" class="edge">
<title>ALSA->PipeWire</title>
-<path fill="none" stroke="black" d="M996.56,-422.6C1005.62,-403.68 1019.44,-378.25 1036,-359 1094.97,-290.45 1195.61,-250.66 1256.25,-231.74"/>
-<polygon fill="black" stroke="black" points="993.31,-421.29 992.27,-431.83 999.66,-424.24 993.31,-421.29"/>
-<polygon fill="black" stroke="black" points="1257.44,-235.03 1265.99,-228.77 1255.4,-228.33 1257.44,-235.03"/>
+<path fill="none" stroke="black" d="M1137.26,-439.52C1167.59,-431.27 1208.36,-417.1 1239,-395 1288.1,-359.58 1321.96,-295.02 1338.13,-258.69"/>
+<polygon fill="black" stroke="black" points="1136.19,-436.18 1127.4,-442.1 1137.96,-442.95 1136.19,-436.18"/>
+<polygon fill="black" stroke="black" points="1341.46,-259.8 1342.22,-249.23 1335.04,-257.02 1341.46,-259.8"/>
</g>
<!-- JACK->PipeWire -->
<g id="edge12" class="edge">
<title>JACK->PipeWire</title>
-<path fill="none" stroke="black" d="M1201.6,-284.37C1223.02,-270.87 1251.99,-252.63 1274.14,-238.69"/>
-<polygon fill="black" stroke="black" points="1199.69,-281.43 1193.09,-289.72 1203.42,-287.35 1199.69,-281.43"/>
-<polygon fill="black" stroke="black" points="1276.27,-241.49 1282.86,-233.2 1272.54,-235.56 1276.27,-241.49"/>
+<path fill="none" stroke="black" d="M1375.57,-276.92C1371.87,-270.67 1367.93,-264 1364.24,-257.76"/>
+<polygon fill="black" stroke="black" points="1372.73,-278.99 1380.83,-285.81 1378.75,-275.42 1372.73,-278.99"/>
+<polygon fill="black" stroke="black" points="1367.18,-255.85 1359.07,-249.03 1361.15,-259.42 1367.18,-255.85"/>
</g>
<!-- sndio->ALSA -->
<g id="edge32" class="edge">
<title>sndio->ALSA</title>
-<path fill="none" stroke="black" d="M699.5,-327.82C728.21,-356.43 776.78,-403.06 799,-414 842.3,-435.32 897.14,-443.7 936.02,-446.97"/>
-<polygon fill="black" stroke="black" points="701.86,-325.23 692.32,-320.62 696.91,-330.17 701.86,-325.23"/>
-<polygon fill="black" stroke="black" points="935.81,-450.46 946.05,-447.72 936.34,-443.48 935.81,-450.46"/>
+<path fill="none" stroke="black" d="M728.21,-319.25C786.06,-340.24 897.73,-380.58 993,-414 1013.91,-421.34 1037.29,-429.37 1056.39,-435.89"/>
+<polygon fill="black" stroke="black" points="729.32,-315.93 718.73,-315.81 726.93,-322.51 729.32,-315.93"/>
+<polygon fill="black" stroke="black" points="1055.35,-439.23 1065.95,-439.15 1057.61,-432.61 1055.35,-439.23"/>
</g>
<!-- PulseAudio->sound card -->
<g id="edge5" class="edge">
<title>PulseAudio->sound card</title>
-<path fill="none" stroke="green" d="M1322.68,-359.17C1316.36,-350.55 1308.53,-339.86 1301.51,-330.27"/>
-<polygon fill="green" stroke="green" points="1304.33,-328.2 1295.6,-322.2 1298.68,-332.33 1304.33,-328.2"/>
+<path fill="none" stroke="green" d="M1154.24,-358.78C1131.4,-308.1 1064.28,-159.16 1036.87,-98.33"/>
+<polygon fill="green" stroke="green" points="1039.97,-96.71 1032.67,-89.03 1033.59,-99.58 1039.97,-96.71"/>
</g>
<!-- PulseAudio->ALSA -->
<g id="edge4" class="edge">
<title>PulseAudio->ALSA</title>
-<path fill="none" stroke="black" d="M1296.91,-391.36C1271.78,-398.68 1238.22,-407.55 1208,-414 1148.79,-426.65 1079.51,-437.22 1033.95,-443.33"/>
-<polygon fill="black" stroke="black" points="1033.49,-439.86 1024.04,-444.64 1034.41,-446.8 1033.49,-439.86"/>
+<path fill="none" stroke="black" d="M1151.51,-395.37C1143.92,-404.4 1133.55,-415.56 1123.71,-425.36"/>
+<polygon fill="black" stroke="black" points="1121.07,-423.05 1116.34,-432.53 1125.95,-428.07 1121.07,-423.05"/>
</g>
<!-- PulseAudio->JACK -->
<g id="edge6" class="edge">
<title>PulseAudio->JACK</title>
-<path fill="none" stroke="black" d="M1302.01,-361.63C1274.47,-349.63 1235.3,-332.57 1207.17,-320.32"/>
-<polygon fill="black" stroke="black" points="1208.28,-316.98 1197.71,-316.2 1205.48,-323.4 1208.28,-316.98"/>
+<path fill="none" stroke="black" d="M1213.03,-365.05C1239.78,-358.85 1272.94,-350.46 1302,-341 1319.72,-335.23 1338.94,-327.64 1354.96,-320.91"/>
+<polygon fill="black" stroke="black" points="1356.66,-323.99 1364.49,-316.86 1353.91,-317.55 1356.66,-323.99"/>
</g>
<!-- PulseAudio->sndio -->
<g id="edge33" class="edge">
<title>PulseAudio->sndio</title>
-<path fill="none" stroke="black" d="M1277.76,-369.82C1148.77,-355.9 837.61,-322.33 721.59,-309.81"/>
-<polygon fill="black" stroke="black" points="721.95,-306.33 711.63,-308.74 721.2,-313.29 721.95,-306.33"/>
+<path fill="none" stroke="black" d="M1103.05,-367.15C1008.6,-352.97 825.11,-325.43 737.64,-312.3"/>
+<polygon fill="black" stroke="black" points="738.12,-308.83 727.71,-310.81 737.08,-315.76 738.12,-308.83"/>
</g>
<!-- PulseAudio->bluez -->
<g id="edge7" class="edge">
<title>PulseAudio->bluez</title>
-<path fill="none" stroke="black" d="M1346.37,-359.18C1349.64,-353.61 1352.9,-347.23 1355,-341 1375.26,-280.91 1395.27,-256.72 1369,-199 1362.81,-185.41 1351.33,-173.91 1339.91,-165.06"/>
-<polygon fill="black" stroke="black" points="1341.84,-162.13 1331.69,-159.09 1337.73,-167.8 1341.84,-162.13"/>
+<path fill="none" stroke="black" d="M1160.2,-358.97C1156.22,-321.51 1146.7,-231.68 1141.89,-186.26"/>
+<polygon fill="black" stroke="black" points="1145.36,-185.82 1140.83,-176.25 1138.4,-186.56 1145.36,-185.82"/>
</g>
<!-- ofono -->
-<g id="node10" class="node">
+<g id="node13" class="node">
<title>ofono</title>
-<polygon fill="yellow" stroke="black" points="1758.29,-296.54 1758.29,-311.46 1735.28,-322 1702.72,-322 1679.71,-311.46 1679.71,-296.54 1702.72,-286 1735.28,-286 1758.29,-296.54"/>
-<text text-anchor="middle" x="1719" y="-300.3" font-family="Times,serif" font-size="14.00">ofono</text>
+<polygon fill="yellow" stroke="black" points="1260.05,-304 1239.03,-322 1196.97,-322 1175.95,-304 1196.97,-286 1239.03,-286 1260.05,-304"/>
+<text text-anchor="middle" x="1218" y="-300.3" font-family="Times,serif" font-size="14.00">ofono</text>
</g>
<!-- PulseAudio->ofono -->
<g id="edge8" class="edge">
<title>PulseAudio->ofono</title>
-<path fill="none" stroke="black" d="M1395.43,-372.51C1475.12,-367.38 1610.76,-356.68 1658,-341 1668.99,-337.35 1680.15,-331.52 1689.87,-325.6"/>
-<polygon fill="black" stroke="black" points="1691.79,-328.52 1698.34,-320.2 1688.02,-322.62 1691.79,-328.52"/>
+<path fill="none" stroke="black" d="M1185.96,-358.8C1192.08,-353.59 1198.26,-347.51 1203,-341 1205.1,-338.12 1206.96,-334.91 1208.61,-331.61"/>
+<polygon fill="black" stroke="black" points="1211.86,-332.91 1212.66,-322.35 1205.45,-330.11 1211.86,-332.91"/>
</g>
<!-- PulseAudio->PipeWire -->
<g id="edge10" class="edge">
<title>PulseAudio->PipeWire</title>
-<path fill="none" stroke="black" d="M1340.43,-348.74C1343.07,-330.71 1344.75,-306.68 1340,-286 1336.6,-271.22 1329.55,-255.93 1322.83,-243.6"/>
-<polygon fill="black" stroke="black" points="1336.94,-348.4 1338.76,-358.84 1343.84,-349.54 1336.94,-348.4"/>
-<polygon fill="black" stroke="black" points="1325.82,-241.77 1317.83,-234.81 1319.73,-245.23 1325.82,-241.77"/>
+<path fill="none" stroke="black" d="M1209.45,-357.51C1229.06,-348.53 1251.31,-336.52 1269,-322 1292.98,-302.31 1291.12,-289.95 1312,-267 1315.25,-263.43 1318.8,-259.79 1322.37,-256.27"/>
+<polygon fill="black" stroke="black" points="1207.78,-354.42 1200.06,-361.67 1210.62,-360.82 1207.78,-354.42"/>
+<polygon fill="black" stroke="black" points="1324.86,-258.73 1329.64,-249.28 1320.01,-253.69 1324.86,-258.73"/>
</g>
-<!-- bluez->Bluetooth card -->
+<!-- bluez->bluetooth -->
<g id="edge17" class="edge">
-<title>bluez->Bluetooth card</title>
-<path fill="none" stroke="green" d="M1307,-125.81C1307,-117.79 1307,-108.05 1307,-99.07"/>
-<polygon fill="green" stroke="green" points="1310.5,-99.03 1307,-89.03 1303.5,-99.03 1310.5,-99.03"/>
+<title>bluez->bluetooth</title>
+<path fill="none" stroke="green" d="M1139,-139.8C1139,-128.16 1139,-112.55 1139,-99.24"/>
+<polygon fill="green" stroke="green" points="1142.5,-99.18 1139,-89.18 1135.5,-99.18 1142.5,-99.18"/>
</g>
<!-- ofono->phone modem -->
<g id="edge15" class="edge">
<title>ofono->phone modem</title>
-<path fill="none" stroke="green" d="M1734.38,-285.8C1745.4,-273.47 1760.42,-256.68 1772.75,-242.89"/>
-<polygon fill="green" stroke="green" points="1775.59,-244.96 1779.64,-235.18 1770.37,-240.3 1775.59,-244.96"/>
+<path fill="none" stroke="green" d="M1228.93,-285.74C1241.03,-267.1 1261.54,-236.88 1282,-213 1297.34,-195.1 1310.83,-197.72 1320,-176 1330.64,-150.79 1321.57,-119.89 1312.06,-98.35"/>
+<polygon fill="green" stroke="green" points="1315.16,-96.72 1307.72,-89.17 1308.83,-99.7 1315.16,-96.72"/>
</g>
<!-- X11 bell -->
-<g id="node11" class="node">
+<g id="node14" class="node">
<title>X11 bell</title>
-<ellipse fill="lightgrey" stroke="black" cx="1389" cy="-450" rx="48.99" ry="18"/>
-<text text-anchor="middle" x="1389" y="-446.3" font-family="Times,serif" font-size="14.00">X11 bell</text>
+<ellipse fill="lightgrey" stroke="black" cx="982" cy="-450" rx="48.99" ry="18"/>
+<text text-anchor="middle" x="982" y="-446.3" font-family="Times,serif" font-size="14.00">X11 bell</text>
</g>
<!-- X11 bell->PulseAudio -->
<g id="edge9" class="edge">
<title>X11 bell->PulseAudio</title>
-<path fill="none" stroke="black" d="M1376.48,-432.53C1369.82,-423.79 1361.51,-412.86 1354.07,-403.08"/>
-<polygon fill="black" stroke="black" points="1356.67,-400.71 1347.83,-394.87 1351.1,-404.95 1356.67,-400.71"/>
+<path fill="none" stroke="black" d="M1014.18,-436.31C1042.31,-425.21 1083.52,-408.96 1115.28,-396.43"/>
+<polygon fill="black" stroke="black" points="1116.8,-399.59 1124.81,-392.67 1114.23,-393.08 1116.8,-399.59"/>
</g>
<!-- PipeWire->bluez -->
<g id="edge13" class="edge">
<title>PipeWire->bluez</title>
-<path fill="none" stroke="black" d="M1307,-198.81C1307,-190.79 1307,-181.05 1307,-172.07"/>
-<polygon fill="black" stroke="black" points="1310.5,-172.03 1307,-162.03 1303.5,-172.03 1310.5,-172.03"/>
+<path fill="none" stroke="black" d="M1310.97,-217.14C1273.76,-204.56 1217.28,-185.46 1179.3,-172.63"/>
+<polygon fill="black" stroke="black" points="1180.18,-169.23 1169.59,-169.34 1177.94,-175.86 1180.18,-169.23"/>
</g>
<!-- gstreamer -->
-<g id="node13" class="node">
+<g id="node16" class="node">
<title>gstreamer</title>
-<ellipse fill="lightgrey" stroke="black" cx="1590" cy="-523" rx="59.29" ry="18"/>
-<text text-anchor="middle" x="1590" y="-519.3" font-family="Times,serif" font-size="14.00">gstreamer</text>
+<ellipse fill="lightgrey" stroke="black" cx="1726" cy="-523" rx="59.29" ry="18"/>
+<text text-anchor="middle" x="1726" y="-519.3" font-family="Times,serif" font-size="14.00">gstreamer</text>
</g>
<!-- gstreamer->ALSA -->
<g id="edge57" class="edge">
<title>gstreamer->ALSA</title>
-<path fill="none" stroke="black" d="M1536.35,-515.39C1509.28,-512.12 1475.91,-508.2 1446,-505 1362.98,-496.1 1341.96,-496.44 1259,-487 1180.18,-478.03 1088.88,-465.63 1034.09,-457.97"/>
-<polygon fill="black" stroke="black" points="1034.36,-454.48 1023.97,-456.55 1033.39,-461.41 1034.36,-454.48"/>
+<path fill="none" stroke="black" d="M1675.94,-513.38C1658.29,-510.49 1638.29,-507.41 1620,-505 1443.96,-481.85 1233.61,-462.81 1141.76,-454.92"/>
+<polygon fill="black" stroke="black" points="1141.94,-451.42 1131.68,-454.05 1141.35,-458.39 1141.94,-451.42"/>
</g>
<!-- gstreamer->JACK -->
<g id="edge58" class="edge">
<title>gstreamer->JACK</title>
-<path fill="none" stroke="black" d="M1615.51,-506.69C1622.11,-501.36 1628.38,-494.74 1632,-487 1646.16,-456.76 1645.16,-433.75 1619,-413 1478.88,-301.84 1401.45,-361.47 1227,-322 1221.46,-320.75 1215.66,-319.21 1210,-317.58"/>
-<polygon fill="black" stroke="black" points="1210.62,-314.11 1200.04,-314.58 1208.6,-320.81 1210.62,-314.11"/>
+<path fill="none" stroke="black" d="M1727.44,-504.77C1729.46,-468.2 1728.43,-382.64 1680,-340 1645.11,-309.28 1511.14,-304.64 1438.5,-304.46"/>
+<polygon fill="black" stroke="black" points="1438.24,-300.96 1428.24,-304.46 1438.24,-307.96 1438.24,-300.96"/>
</g>
<!-- gstreamer->sndio -->
<g id="edge34" class="edge">
<title>gstreamer->sndio</title>
-<path fill="none" stroke="black" d="M1585.48,-504.97C1578.41,-481.37 1562.61,-438.72 1535,-413 1489.52,-370.64 1466.44,-373.48 1406,-359 1372.67,-351.01 876.44,-318.05 722.31,-307.95"/>
-<polygon fill="black" stroke="black" points="722.45,-304.45 712.24,-307.29 721.99,-311.44 722.45,-304.45"/>
+<path fill="none" stroke="black" d="M1695.88,-507.36C1627.81,-474.95 1456.2,-397.04 1304,-359 1098.21,-307.57 843.04,-303.39 737.84,-304.13"/>
+<polygon fill="black" stroke="black" points="737.8,-300.64 727.84,-304.22 737.87,-307.63 737.8,-300.64"/>
</g>
<!-- gstreamer->PulseAudio -->
<g id="edge59" class="edge">
<title>gstreamer->PulseAudio</title>
-<path fill="none" stroke="black" d="M1558.07,-507.77C1547.75,-502.23 1536.73,-495.21 1528,-487 1499.44,-460.15 1511.99,-435.65 1480,-413 1458.17,-397.54 1430.35,-388.86 1404.93,-384"/>
-<polygon fill="black" stroke="black" points="1405.4,-380.53 1394.95,-382.26 1404.2,-387.43 1405.4,-380.53"/>
+<path fill="none" stroke="black" d="M1679.48,-511.73C1633.65,-501.41 1561.72,-484.69 1500,-468 1418.43,-445.95 1399.72,-434.49 1318,-413 1287.14,-404.89 1252.54,-397 1223.79,-390.78"/>
+<polygon fill="black" stroke="black" points="1224.39,-387.33 1213.87,-388.65 1222.91,-394.17 1224.39,-387.33"/>
</g>
<!-- gstreamer->PipeWire -->
<g id="edge14" class="edge">
<title>gstreamer->PipeWire</title>
-<path fill="none" stroke="black" d="M1621.55,-507.58C1630.49,-502.2 1639.54,-495.34 1646,-487 1661.06,-467.56 1661.41,-454.72 1652,-432 1625.25,-367.42 1432.83,-274.44 1347.53,-235.84"/>
-<polygon fill="black" stroke="black" points="1348.72,-232.54 1338.16,-231.63 1345.85,-238.92 1348.72,-232.54"/>
+<path fill="none" stroke="black" d="M1732.05,-505.03C1736.58,-490.79 1742,-469.83 1742,-451 1742,-451 1742,-451 1742,-303 1742,-270.39 1529.77,-247.37 1417.23,-237.45"/>
+<polygon fill="black" stroke="black" points="1417.25,-233.94 1406.99,-236.56 1416.65,-240.91 1417.25,-233.94"/>
</g>
<!-- sox -->
-<g id="node14" class="node">
+<g id="node17" class="node">
<title>sox</title>
-<g id="a_node14"><a xlink:href="http://sox.sourceforge.net/Docs/Features" xlink:title="sox">
-<ellipse fill="lightgrey" stroke="black" cx="527" cy="-596" rx="27" ry="18"/>
-<text text-anchor="middle" x="527" y="-592.3" font-family="Times,serif" font-size="14.00">sox</text>
+<g id="a_node17"><a xlink:href="http://sox.sourceforge.net/Docs/Features" xlink:title="sox">
+<ellipse fill="lightgrey" stroke="black" cx="546" cy="-596" rx="27" ry="18"/>
+<text text-anchor="middle" x="546" y="-592.3" font-family="Times,serif" font-size="14.00">sox</text>
</a>
</g>
</g>
<!-- sox->ALSA -->
<g id="edge20" class="edge">
<title>sox->ALSA</title>
-<path fill="none" stroke="black" d="M554.06,-594.2C610.37,-591.74 743.41,-581.72 846,-541 872.81,-530.36 875.83,-520.73 900,-505 917.8,-493.41 937.85,-480.66 954.01,-470.46"/>
-<polygon fill="black" stroke="black" points="955.95,-473.37 962.54,-465.08 952.22,-467.45 955.95,-473.37"/>
+<path fill="none" stroke="black" d="M572.81,-593.22C647.52,-587.91 856.63,-570.74 918,-541 938.94,-530.85 936.34,-517.45 956,-505 973.12,-494.16 1021.28,-476.38 1056.12,-464.21"/>
+<polygon fill="black" stroke="black" points="1057.7,-467.36 1066,-460.78 1055.41,-460.75 1057.7,-467.36"/>
</g>
<!-- sox->sndio -->
<g id="edge21" class="edge">
<title>sox->sndio</title>
-<path fill="none" stroke="black" d="M499.78,-594.23C391.86,-590.82 0,-574.95 0,-524 0,-524 0,-524 0,-376 0,-312.45 477.9,-305.57 630.65,-304.99"/>
-<polygon fill="black" stroke="black" points="631.09,-308.49 641.08,-304.96 631.07,-301.49 631.09,-308.49"/>
+<path fill="none" stroke="black" d="M518.92,-594.36C408.75,-591.42 0,-576.93 0,-524 0,-524 0,-524 0,-376 0,-311.64 481.83,-305.27 639.63,-304.91"/>
+<polygon fill="black" stroke="black" points="639.99,-308.41 649.98,-304.89 639.98,-301.41 639.99,-308.41"/>
</g>
<!-- sox->PulseAudio -->
<g id="edge19" class="edge">
<title>sox->PulseAudio</title>
-<path fill="none" stroke="black" d="M539.98,-569.82C551.84,-549.3 571.29,-521.18 596,-505 652.5,-468.01 824.87,-445.67 891,-432 941.3,-421.6 954.1,-419.93 1005,-413 1095,-400.74 1199.31,-390.3 1266.16,-384.1"/>
-<polygon fill="black" stroke="black" points="536.88,-568.2 535.07,-578.64 542.99,-571.6 536.88,-568.2"/>
-<polygon fill="black" stroke="black" points="1266.52,-387.58 1276.16,-383.18 1265.88,-380.61 1266.52,-387.58"/>
+<path fill="none" stroke="black" d="M559.79,-569.94C572.09,-549.75 591.86,-522 616,-505 626.61,-497.52 825.46,-435.35 838,-432 878.34,-421.24 888.9,-420.34 930,-413 983.68,-403.41 1044.67,-394.28 1090.63,-387.75"/>
+<polygon fill="black" stroke="black" points="556.73,-568.23 554.67,-578.62 562.77,-571.78 556.73,-568.23"/>
+<polygon fill="black" stroke="black" points="1091.38,-391.18 1100.79,-386.32 1090.4,-384.25 1091.38,-391.18"/>
</g>
<!-- libao -->
-<g id="node15" class="node">
+<g id="node18" class="node">
<title>libao</title>
-<g id="a_node15"><a xlink:href="https://www.xiph.org/ao/" xlink:title="libao">
-<ellipse fill="lightgrey" stroke="black" cx="478" cy="-523" rx="33.29" ry="18"/>
-<text text-anchor="middle" x="478" y="-519.3" font-family="Times,serif" font-size="14.00">libao</text>
+<g id="a_node18"><a xlink:href="https://www.xiph.org/ao/" xlink:title="libao">
+<ellipse fill="lightgrey" stroke="black" cx="498" cy="-523" rx="33.29" ry="18"/>
+<text text-anchor="middle" x="498" y="-519.3" font-family="Times,serif" font-size="14.00">libao</text>
</a>
</g>
</g>
<!-- sox->libao -->
<g id="edge18" class="edge">
<title>sox->libao</title>
-<path fill="none" stroke="black" d="M516.13,-579.24C509.93,-570.27 502.04,-558.83 495.04,-548.69"/>
-<polygon fill="black" stroke="black" points="497.74,-546.45 489.18,-540.21 491.98,-550.42 497.74,-546.45"/>
+<path fill="none" stroke="black" d="M535.35,-579.24C529.28,-570.27 521.55,-558.83 514.69,-548.69"/>
+<polygon fill="black" stroke="black" points="517.46,-546.53 508.96,-540.21 511.66,-550.45 517.46,-546.53"/>
</g>
<!-- libao->ALSA -->
<g id="edge22" class="edge">
<title>libao->ALSA</title>
-<path fill="none" stroke="black" d="M509.52,-517.23C533.27,-513.69 566.65,-508.84 596,-505 663.89,-496.12 681.15,-496.16 749,-487 813.86,-478.24 888.5,-466.59 936.18,-458.95"/>
-<polygon fill="black" stroke="black" points="936.9,-462.38 946.22,-457.33 935.79,-455.46 936.9,-462.38"/>
+<path fill="none" stroke="black" d="M529.49,-516.97C553.22,-513.3 586.6,-508.4 616,-505 709.95,-494.14 947.18,-486.18 1040,-468 1045.46,-466.93 1051.14,-465.52 1056.69,-463.98"/>
+<polygon fill="black" stroke="black" points="1057.87,-467.28 1066.46,-461.08 1055.88,-460.57 1057.87,-467.28"/>
</g>
<!-- libao->sndio -->
<g id="edge26" class="edge">
<title>libao->sndio</title>
-<path fill="none" stroke="black" d="M476.57,-504.71C475.82,-485.5 477.18,-454.27 491,-432 525.99,-375.64 596.3,-338.2 639.75,-319.36"/>
-<polygon fill="black" stroke="black" points="641.26,-322.52 649.11,-315.4 638.54,-316.07 641.26,-322.52"/>
+<path fill="none" stroke="black" d="M498.12,-504.74C499,-485.57 502.77,-454.36 517,-432 550.22,-379.82 613.07,-341.76 652.9,-321.55"/>
+<polygon fill="black" stroke="black" points="654.6,-324.61 662.01,-317.03 651.5,-318.34 654.6,-324.61"/>
</g>
<!-- libao->PulseAudio -->
<g id="edge23" class="edge">
<title>libao->PulseAudio</title>
-<path fill="none" stroke="black" d="M504.15,-511.85C510.88,-509.43 518.16,-506.97 525,-505 709.44,-451.79 757.26,-442.12 947,-413 1057.04,-396.11 1185.99,-386.47 1264.03,-381.74"/>
-<polygon fill="black" stroke="black" points="1264.46,-385.22 1274.23,-381.13 1264.04,-378.23 1264.46,-385.22"/>
+<path fill="none" stroke="black" d="M524.78,-512.11C531.37,-509.73 538.43,-507.23 545,-505 608.81,-483.31 768.04,-426.87 834,-413 918.49,-395.23 1017.22,-386.25 1084.12,-381.87"/>
+<polygon fill="black" stroke="black" points="1084.4,-385.36 1094.16,-381.24 1083.96,-378.38 1084.4,-385.36"/>
</g>
<!-- NAS -->
-<g id="node16" class="node">
+<g id="node19" class="node">
<title>NAS</title>
-<g id="a_node16"><a xlink:href="http://radscan.com/nas.html" xlink:title="Network Audio System/Server">
-<ellipse fill="lightgrey" stroke="black" cx="293" cy="-450" rx="151.37" ry="18"/>
-<text text-anchor="middle" x="293" y="-446.3" font-family="Times,serif" font-size="14.00">Network Audio System/Server</text>
+<g id="a_node19"><a xlink:href="http://radscan.com/nas.html" xlink:title="Network Audio System/Server">
+<polygon fill="orange" stroke="black" points="469.83,-442.54 469.83,-457.46 373.86,-468 238.14,-468 142.17,-457.46 142.17,-442.54 238.14,-432 373.86,-432 469.83,-442.54"/>
+<text text-anchor="middle" x="306" y="-446.3" font-family="Times,serif" font-size="14.00">Network Audio System/Server</text>
</a>
</g>
</g>
<!-- libao->NAS -->
<g id="edge24" class="edge">
<title>libao->NAS</title>
-<path fill="none" stroke="black" d="M451.49,-511.83C423.82,-501.21 379.71,-484.28 345.04,-470.97"/>
-<polygon fill="black" stroke="black" points="346.13,-467.64 335.54,-467.32 343.62,-474.18 346.13,-467.64"/>
+<path fill="none" stroke="black" d="M471.3,-512.13C443.02,-501.67 397.56,-484.86 361.46,-471.51"/>
+<polygon fill="black" stroke="black" points="362.62,-468.21 352.03,-468.02 360.19,-474.77 362.62,-468.21"/>
</g>
<!-- RoarAudio -->
-<g id="node17" class="node">
+<g id="node20" class="node">
<title>RoarAudio</title>
-<g id="a_node17"><a xlink:href="http://roaraudio.keep-cool.org/" xlink:title="RoarAudio">
-<ellipse fill="lightgrey" stroke="black" cx="559" cy="-450" rx="59.29" ry="18"/>
-<text text-anchor="middle" x="559" y="-446.3" font-family="Times,serif" font-size="14.00">RoarAudio</text>
+<g id="a_node20"><a xlink:href="http://roaraudio.keep-cool.org/" xlink:title="RoarAudio">
+<ellipse fill="lightgrey" stroke="black" cx="585" cy="-450" rx="59.29" ry="18"/>
+<text text-anchor="middle" x="585" y="-446.3" font-family="Times,serif" font-size="14.00">RoarAudio</text>
</a>
</g>
</g>
<!-- libao->RoarAudio -->
<g id="edge25" class="edge">
<title>libao->RoarAudio</title>
-<path fill="none" stroke="black" d="M494.78,-507.29C505.73,-497.69 520.25,-484.97 532.71,-474.04"/>
-<polygon fill="black" stroke="black" points="535.33,-476.4 540.54,-467.18 530.72,-471.14 535.33,-476.4"/>
+<path fill="none" stroke="black" d="M515.61,-507.63C527.53,-497.9 543.54,-484.84 557.17,-473.71"/>
+<polygon fill="black" stroke="black" points="559.76,-476.11 565.3,-467.08 555.34,-470.69 559.76,-476.11"/>
</g>
<!-- RoarAudio->sndio -->
<g id="edge27" class="edge">
<title>RoarAudio->sndio</title>
-<path fill="none" stroke="black" d="M571.21,-432.37C587.31,-410.66 616.81,-371.69 644,-340 647.45,-335.98 651.21,-331.81 654.92,-327.8"/>
-<polygon fill="black" stroke="black" points="657.59,-330.07 661.9,-320.39 652.49,-325.28 657.59,-330.07"/>
+<path fill="none" stroke="black" d="M594.71,-432.12C607.63,-410.14 631.7,-370.88 656,-340 658.81,-336.43 661.91,-332.8 665.05,-329.3"/>
+<polygon fill="black" stroke="black" points="667.68,-331.61 671.91,-321.9 662.55,-326.85 667.68,-331.61"/>
</g>
<!-- RoarAudio->PulseAudio -->
<g id="edge28" class="edge">
<title>RoarAudio->PulseAudio</title>
-<path fill="none" stroke="black" d="M602.41,-437.75C612.09,-435.56 622.35,-433.48 632,-432 860.81,-396.78 1135.24,-384.13 1262.99,-379.92"/>
-<polygon fill="black" stroke="black" points="1263.16,-383.42 1273.05,-379.6 1262.94,-376.42 1263.16,-383.42"/>
+<path fill="none" stroke="black" d="M632.98,-439.29C673.8,-431.3 734.05,-420.18 787,-413 889.26,-399.14 1007.97,-389.07 1083.97,-383.38"/>
+<polygon fill="black" stroke="black" points="1084.69,-386.84 1094.4,-382.61 1084.17,-379.85 1084.69,-386.84"/>
</g>
<!-- libcanberra -->
-<g id="node18" class="node">
+<g id="node21" class="node">
<title>libcanberra</title>
-<g id="a_node18"><a xlink:href="http://git.0pointer.net/libcanberra.git/tree/src/driver-order.c" xlink:title="libcanberra">
-<ellipse fill="lightgrey" stroke="black" cx="1503" cy="-596" rx="63.89" ry="18"/>
-<text text-anchor="middle" x="1503" y="-592.3" font-family="Times,serif" font-size="14.00">libcanberra</text>
+<g id="a_node21"><a xlink:href="http://git.0pointer.net/libcanberra.git/tree/src/driver-order.c" xlink:title="libcanberra">
+<ellipse fill="lightgrey" stroke="black" cx="1577" cy="-596" rx="63.89" ry="18"/>
+<text text-anchor="middle" x="1577" y="-592.3" font-family="Times,serif" font-size="14.00">libcanberra</text>
</a>
</g>
</g>
<!-- libcanberra->ALSA -->
<g id="edge30" class="edge">
<title>libcanberra->ALSA</title>
-<path fill="none" stroke="black" d="M1440.19,-592.37C1336.18,-587.15 1133.35,-573.1 1070,-541 1062.13,-537.01 1029.38,-501.1 1006.9,-475.87"/>
-<polygon fill="black" stroke="black" points="1009.27,-473.26 1000.01,-468.1 1004.03,-477.91 1009.27,-473.26"/>
+<path fill="none" stroke="black" d="M1513.25,-594.22C1407.27,-591.76 1200.7,-581.72 1142,-541 1120.69,-526.22 1108.35,-498.69 1101.71,-477.96"/>
+<polygon fill="black" stroke="black" points="1104.99,-476.73 1098.81,-468.13 1098.28,-478.71 1104.99,-476.73"/>
</g>
<!-- libcanberra->PulseAudio -->
<g id="edge29" class="edge">
<title>libcanberra->PulseAudio</title>
-<path fill="none" stroke="black" d="M1501.78,-577.8C1498.56,-545.1 1487.09,-473.57 1447,-432 1430.5,-414.89 1407.46,-402.51 1386.57,-393.95"/>
-<polygon fill="black" stroke="black" points="1387.75,-390.65 1377.16,-390.29 1385.21,-397.17 1387.75,-390.65"/>
+<path fill="none" stroke="black" d="M1567.16,-578.21C1554.21,-557.65 1529.48,-523.32 1499,-505 1467.54,-486.08 1370.35,-485.35 1338,-468 1317.5,-457.01 1317.87,-446.89 1300,-432 1289,-422.84 1286.78,-419.44 1274,-413 1257.27,-404.57 1238.11,-397.67 1220.42,-392.31"/>
+<polygon fill="black" stroke="black" points="1221.34,-388.93 1210.76,-389.48 1219.38,-395.65 1221.34,-388.93"/>
</g>
<!-- libcanberra->gstreamer -->
<g id="edge31" class="edge">
<title>libcanberra->gstreamer</title>
-<path fill="none" stroke="black" d="M1523.18,-578.53C1534.79,-569.06 1549.55,-557.01 1562.24,-546.65"/>
-<polygon fill="black" stroke="black" points="1564.7,-549.17 1570.23,-540.13 1560.27,-543.74 1564.7,-549.17"/>
+<path fill="none" stroke="black" d="M1608.24,-580.12C1631.01,-569.26 1662.04,-554.48 1686.53,-542.81"/>
+<polygon fill="black" stroke="black" points="1688.05,-545.96 1695.57,-538.5 1685.04,-539.64 1688.05,-545.96"/>
</g>
<!-- OpenAL -->
-<g id="node19" class="node">
+<g id="node22" class="node">
<title>OpenAL</title>
-<g id="a_node19"><a xlink:href="https://www.openal-soft.org/" xlink:title="OpenAL">
-<ellipse fill="lightgrey" stroke="black" cx="890" cy="-596" rx="47.39" ry="18"/>
-<text text-anchor="middle" x="890" y="-592.3" font-family="Times,serif" font-size="14.00">OpenAL</text>
+<g id="a_node22"><a xlink:href="https://www.openal-soft.org/" xlink:title="OpenAL">
+<ellipse fill="lightgrey" stroke="black" cx="925" cy="-596" rx="47.39" ry="18"/>
+<text text-anchor="middle" x="925" y="-592.3" font-family="Times,serif" font-size="14.00">OpenAL</text>
</a>
</g>
</g>
<!-- OpenAL->portaudio -->
<g id="edge38" class="edge">
<title>OpenAL->portaudio</title>
-<path fill="none" stroke="black" d="M854.22,-583.91C815.36,-571.86 753.05,-552.54 709.73,-539.11"/>
-<polygon fill="black" stroke="black" points="710.56,-535.7 699.98,-536.08 708.49,-542.39 710.56,-535.7"/>
+<path fill="none" stroke="black" d="M880.48,-589.51C844.78,-584.29 793.75,-574.97 751,-560 738.91,-555.77 726.28,-549.81 715.14,-543.95"/>
+<polygon fill="black" stroke="black" points="716.63,-540.78 706.17,-539.1 713.3,-546.93 716.63,-540.78"/>
</g>
<!-- OpenAL->ALSA -->
<g id="edge36" class="edge">
<title>OpenAL->ALSA</title>
-<path fill="none" stroke="black" d="M892.96,-578.02C896.97,-558.81 905.58,-527.3 922,-505 929.9,-494.26 935.75,-495.53 946,-487 950.63,-483.15 955.43,-478.91 960.02,-474.75"/>
-<polygon fill="black" stroke="black" points="962.5,-477.23 967.48,-467.88 957.75,-472.08 962.5,-477.23"/>
+<path fill="none" stroke="black" d="M968.42,-588.56C999.53,-581.78 1040.31,-568.12 1066,-541 1082.17,-523.93 1089.33,-497.78 1092.49,-478.06"/>
+<polygon fill="black" stroke="black" points="1095.96,-478.52 1093.84,-468.14 1089.02,-477.58 1095.96,-478.52"/>
</g>
<!-- OpenAL->JACK -->
<g id="edge39" class="edge">
<title>OpenAL->JACK</title>
-<path fill="none" stroke="black" d="M937.68,-595.7C1030.68,-595.94 1230.94,-590.54 1274,-541 1303.13,-507.48 1225.35,-383.48 1189.26,-329.91"/>
-<polygon fill="black" stroke="black" points="1191.96,-327.66 1183.44,-321.36 1186.17,-331.59 1191.96,-327.66"/>
+<path fill="none" stroke="black" d="M972.48,-594.95C1122.04,-594.3 1576.13,-588.41 1620,-541 1668.19,-488.93 1652.02,-469.76 1542,-359 1514.26,-331.08 1471.11,-317.52 1438.03,-310.99"/>
+<polygon fill="black" stroke="black" points="1438.58,-307.53 1428.11,-309.18 1437.32,-314.42 1438.58,-307.53"/>
</g>
<!-- OpenAL->sndio -->
<g id="edge40" class="edge">
<title>OpenAL->sndio</title>
-<path fill="none" stroke="black" d="M843,-593.41C768.09,-589.79 626.89,-578.08 596,-541 585.76,-528.71 590.53,-520.04 596,-505 603.33,-484.84 616.76,-486.85 627,-468 651.22,-423.4 665.42,-365.43 672.17,-332"/>
-<polygon fill="black" stroke="black" points="675.63,-332.54 674.1,-322.06 668.75,-331.21 675.63,-332.54"/>
+<path fill="none" stroke="black" d="M877.84,-593.88C799.74,-590.91 648.89,-580.14 616,-541 605.71,-528.75 609.88,-519.78 616,-505 624.9,-483.51 641.82,-488.39 653,-468 665.69,-444.85 678.55,-372.07 684.91,-332.05"/>
+<polygon fill="black" stroke="black" points="688.37,-332.58 686.46,-322.16 681.46,-331.5 688.37,-332.58"/>
</g>
<!-- OpenAL->PulseAudio -->
<g id="edge35" class="edge">
<title>OpenAL->PulseAudio</title>
-<path fill="none" stroke="black" d="M937.35,-594.04C1065.69,-590.93 1412.8,-579.04 1446,-541 1507.34,-470.71 1368.26,-519.14 1331,-468 1317.88,-450 1320.6,-424.18 1325.59,-404.8"/>
-<polygon fill="black" stroke="black" points="1328.99,-405.64 1328.42,-395.07 1322.27,-403.69 1328.99,-405.64"/>
+<path fill="none" stroke="black" d="M879.25,-590.78C846.75,-585.11 805.24,-571.88 784,-541 774.93,-527.82 776.54,-519.15 784,-505 797.56,-479.26 814.19,-484.72 838,-468 860.41,-452.26 863.32,-443.87 888,-432 950.04,-402.17 1027.54,-388.82 1084.27,-382.84"/>
+<polygon fill="black" stroke="black" points="1084.65,-386.32 1094.26,-381.84 1083.96,-379.35 1084.65,-386.32"/>
</g>
<!-- SoundIO -->
-<g id="node20" class="node">
+<g id="node23" class="node">
<title>SoundIO</title>
-<g id="a_node20"><a xlink:href="http://libsound.io/" xlink:title="SoundIO">
-<ellipse fill="lightgrey" stroke="black" cx="786" cy="-523" rx="50.89" ry="18"/>
-<text text-anchor="middle" x="786" y="-519.3" font-family="Times,serif" font-size="14.00">SoundIO</text>
+<g id="a_node23"><a xlink:href="http://libsound.io/" xlink:title="SoundIO">
+<ellipse fill="lightgrey" stroke="black" cx="1202" cy="-523" rx="50.89" ry="18"/>
+<text text-anchor="middle" x="1202" y="-519.3" font-family="Times,serif" font-size="14.00">SoundIO</text>
</a>
</g>
</g>
<!-- OpenAL->SoundIO -->
<g id="edge37" class="edge">
<title>OpenAL->SoundIO</title>
-<path fill="none" stroke="black" d="M880.45,-578.09C876.09,-571.49 870.46,-564.26 864,-559 854.47,-551.24 842.94,-544.83 831.71,-539.72"/>
-<polygon fill="black" stroke="black" points="832.96,-536.45 822.39,-535.73 830.21,-542.89 832.96,-536.45"/>
+<path fill="none" stroke="black" d="M967.93,-588.06C1003.39,-581.93 1054.87,-572.09 1099,-560 1119.13,-554.49 1141.02,-547.05 1159.42,-540.36"/>
+<polygon fill="black" stroke="black" points="1160.79,-543.59 1168.97,-536.85 1158.37,-537.02 1160.79,-543.59"/>
</g>
<!-- SoundIO->ALSA -->
<g id="edge43" class="edge">
<title>SoundIO->ALSA</title>
-<path fill="none" stroke="black" d="M823.66,-510.8C845.01,-504.25 872.15,-495.6 896,-487 913.14,-480.82 931.87,-473.35 947.71,-466.82"/>
-<polygon fill="black" stroke="black" points="949.26,-469.97 957.15,-462.9 946.57,-463.5 949.26,-469.97"/>
+<path fill="none" stroke="black" d="M1179.03,-506.86C1169.7,-500.71 1158.83,-493.52 1149,-487 1141.64,-482.12 1133.73,-476.85 1126.3,-471.9"/>
+<polygon fill="black" stroke="black" points="1128.11,-468.9 1117.84,-466.26 1124.22,-474.72 1128.11,-468.9"/>
</g>
<!-- SoundIO->JACK -->
<g id="edge41" class="edge">
<title>SoundIO->JACK</title>
-<path fill="none" stroke="black" d="M801.65,-505.55C820.59,-486.27 854.06,-454.14 887,-432 968.22,-377.42 1076.73,-336.63 1133.58,-317.34"/>
-<polygon fill="black" stroke="black" points="1134.87,-320.6 1143.24,-314.1 1132.64,-313.96 1134.87,-320.6"/>
+<path fill="none" stroke="black" d="M1230.25,-507.89C1267.33,-487.89 1331.83,-447.8 1367,-395 1379.5,-376.24 1385.5,-351.22 1388.38,-332.32"/>
+<polygon fill="black" stroke="black" points="1391.87,-332.64 1389.71,-322.27 1384.93,-331.72 1391.87,-332.64"/>
</g>
<!-- SoundIO->PulseAudio -->
<g id="edge42" class="edge">
<title>SoundIO->PulseAudio</title>
-<path fill="none" stroke="black" d="M816.25,-508.32C837.69,-498.17 866.83,-483.47 891,-468 912.86,-454 913.08,-442.1 937,-432 994.62,-407.67 1166.94,-390.92 1264.9,-383.08"/>
-<polygon fill="black" stroke="black" points="1265.32,-386.55 1275.02,-382.28 1264.77,-379.58 1265.32,-386.55"/>
+<path fill="none" stroke="black" d="M1197.25,-504.92C1190.4,-480.23 1177.65,-434.35 1169.51,-405.04"/>
+<polygon fill="black" stroke="black" points="1172.79,-403.76 1166.74,-395.06 1166.04,-405.63 1172.79,-403.76"/>
</g>
<!-- RtAudio -->
-<g id="node21" class="node">
+<g id="node24" class="node">
<title>RtAudio</title>
-<g id="a_node21"><a xlink:href="https://www.music.mcgill.ca/~gary/rtaudio/apinotes.html" xlink:title="RtAudio">
-<ellipse fill="lightgrey" stroke="black" cx="1217" cy="-523" rx="48.19" ry="18"/>
-<text text-anchor="middle" x="1217" y="-519.3" font-family="Times,serif" font-size="14.00">RtAudio</text>
+<g id="a_node24"><a xlink:href="https://www.music.mcgill.ca/~gary/rtaudio/apinotes.html" xlink:title="RtAudio">
+<ellipse fill="lightgrey" stroke="black" cx="1319" cy="-523" rx="48.19" ry="18"/>
+<text text-anchor="middle" x="1319" y="-519.3" font-family="Times,serif" font-size="14.00">RtAudio</text>
</a>
</g>
</g>
<!-- RtAudio->ALSA -->
<g id="edge44" class="edge">
<title>RtAudio->ALSA</title>
-<path fill="none" stroke="black" d="M1180.9,-510.93C1173.98,-508.89 1166.78,-506.83 1160,-505 1127.33,-496.16 1118.43,-496.7 1086,-487 1065.04,-480.73 1042.04,-472.63 1023.29,-465.71"/>
-<polygon fill="black" stroke="black" points="1024.5,-462.42 1013.91,-462.2 1022.05,-468.98 1024.5,-462.42"/>
+<path fill="none" stroke="black" d="M1283.51,-510.75C1242.85,-497.86 1176.42,-476.81 1134.25,-463.44"/>
+<polygon fill="black" stroke="black" points="1135.19,-460.07 1124.6,-460.38 1133.08,-466.74 1135.19,-460.07"/>
</g>
<!-- RtAudio->JACK -->
<g id="edge45" class="edge">
<title>RtAudio->JACK</title>
-<path fill="none" stroke="black" d="M1213.47,-504.97C1205.68,-467.42 1186.98,-377.23 1177.58,-331.93"/>
-<polygon fill="black" stroke="black" points="1180.97,-331.03 1175.51,-321.95 1174.12,-332.45 1180.97,-331.03"/>
+<path fill="none" stroke="black" d="M1341.83,-506.92C1367.42,-488.5 1407.47,-454.71 1424,-414 1435.24,-386.31 1421.7,-353.31 1408.72,-330.93"/>
+<polygon fill="black" stroke="black" points="1411.66,-329.03 1403.46,-322.33 1405.69,-332.68 1411.66,-329.03"/>
</g>
<!-- RtAudio->PulseAudio -->
<g id="edge46" class="edge">
<title>RtAudio->PulseAudio</title>
-<path fill="none" stroke="black" d="M1228.96,-505.29C1244.76,-483.49 1273.79,-444.42 1301,-413 1304.23,-409.27 1307.74,-405.43 1311.25,-401.72"/>
-<polygon fill="black" stroke="black" points="1313.92,-404 1318.34,-394.37 1308.88,-399.14 1313.92,-404"/>
+<path fill="none" stroke="black" d="M1301.6,-506.04C1274.22,-480.93 1220.89,-432.01 1188.65,-402.45"/>
+<polygon fill="black" stroke="black" points="1190.68,-399.55 1180.94,-395.37 1185.95,-404.71 1190.68,-399.55"/>
</g>
<!-- JUCE -->
-<g id="node22" class="node">
+<g id="node25" class="node">
<title>JUCE</title>
-<ellipse fill="lightgrey" stroke="black" cx="1115" cy="-523" rx="36" ry="18"/>
-<text text-anchor="middle" x="1115" y="-519.3" font-family="Times,serif" font-size="14.00">JUCE</text>
+<ellipse fill="lightgrey" stroke="black" cx="1421" cy="-523" rx="36" ry="18"/>
+<text text-anchor="middle" x="1421" y="-519.3" font-family="Times,serif" font-size="14.00">JUCE</text>
</g>
<!-- JUCE->ALSA -->
<g id="edge47" class="edge">
<title>JUCE->ALSA</title>
-<path fill="none" stroke="black" d="M1091.76,-509.31C1071.35,-498.16 1041.41,-481.81 1018.42,-469.25"/>
-<polygon fill="black" stroke="black" points="1019.82,-466.03 1009.36,-464.31 1016.46,-472.17 1019.82,-466.03"/>
+<path fill="none" stroke="black" d="M1394.12,-510.99C1388.22,-508.81 1381.95,-506.68 1376,-505 1293.87,-481.78 1195.42,-465.41 1139.54,-457.15"/>
+<polygon fill="black" stroke="black" points="1140.02,-453.68 1129.61,-455.7 1139,-460.61 1140.02,-453.68"/>
</g>
<!-- JUCE->JACK -->
<g id="edge48" class="edge">
<title>JUCE->JACK</title>
-<path fill="none" stroke="black" d="M1119.47,-504.97C1129.36,-467.34 1153.13,-376.85 1165,-331.64"/>
-<polygon fill="black" stroke="black" points="1168.39,-332.51 1167.55,-321.95 1161.62,-330.73 1168.39,-332.51"/>
+<path fill="none" stroke="black" d="M1442.08,-508.42C1468.12,-489.74 1508.27,-453.78 1502,-413 1496.83,-379.38 1502.16,-364.92 1479,-340 1467.98,-328.14 1452.43,-320.23 1437.45,-314.98"/>
+<polygon fill="black" stroke="black" points="1438.34,-311.59 1427.75,-311.9 1436.22,-318.26 1438.34,-311.59"/>
</g>
<!-- SDL2 -->
-<g id="node23" class="node">
+<g id="node26" class="node">
<title>SDL2</title>
-<g id="a_node23"><a xlink:href="https://hg.libsdl.org/SDL/file/355a4f94a782" xlink:title="libSDL-2.0">
-<ellipse fill="lightgrey" stroke="black" cx="101" cy="-523" rx="59.59" ry="18"/>
-<text text-anchor="middle" x="101" y="-519.3" font-family="Times,serif" font-size="14.00">libSDL-2.0</text>
+<g id="a_node26"><a xlink:href="https://hg.libsdl.org/SDL/file/355a4f94a782" xlink:title="libSDL-2.0">
+<ellipse fill="lightgrey" stroke="black" cx="210" cy="-523" rx="59.59" ry="18"/>
+<text text-anchor="middle" x="210" y="-519.3" font-family="Times,serif" font-size="14.00">libSDL-2.0</text>
</a>
</g>
</g>
<!-- SDL2->ALSA -->
<g id="edge52" class="edge">
<title>SDL2->ALSA</title>
-<path fill="none" stroke="black" d="M157.98,-517.42C320.37,-504.38 783.61,-467.18 935.85,-454.95"/>
-<polygon fill="black" stroke="black" points="936.58,-458.4 946.27,-454.11 936.02,-451.42 936.58,-458.4"/>
+<path fill="none" stroke="black" d="M267.65,-517.92C317.5,-514.42 391.5,-509.27 456,-505 585.75,-496.41 912.1,-491.48 1040,-468 1045.47,-467 1051.16,-465.63 1056.71,-464.1"/>
+<polygon fill="black" stroke="black" points="1057.89,-467.4 1066.49,-461.21 1055.91,-460.68 1057.89,-467.4"/>
</g>
<!-- SDL2->JACK -->
<g id="edge53" class="edge">
<title>SDL2->JACK</title>
-<path fill="none" stroke="black" d="M96.03,-504.81C91.32,-484.49 87.44,-451.06 106,-432 178.59,-357.48 935.39,-316.34 1127.73,-307.04"/>
-<polygon fill="black" stroke="black" points="1127.95,-310.54 1137.77,-306.56 1127.61,-303.54 1127.95,-310.54"/>
+<path fill="none" stroke="black" d="M170.67,-509.4C151.97,-501.02 131.8,-487.82 123,-468 116.51,-453.38 112.25,-443.85 123,-432 208.95,-337.26 1141.95,-336.92 1269,-322 1293.68,-319.1 1321.09,-315.33 1343.67,-312.08"/>
+<polygon fill="black" stroke="black" points="1344.28,-315.53 1353.68,-310.63 1343.28,-308.6 1344.28,-315.53"/>
</g>
<!-- SDL2->sndio -->
<g id="edge56" class="edge">
<title>SDL2->sndio</title>
-<path fill="none" stroke="black" d="M77.28,-506.37C71.15,-501.02 65.34,-494.48 62,-487 52.04,-464.68 46.56,-450.95 62,-432 134.24,-343.32 501.19,-314.69 631.23,-307.25"/>
-<polygon fill="black" stroke="black" points="631.47,-310.74 641.26,-306.69 631.08,-303.75 631.47,-310.74"/>
+<path fill="none" stroke="black" d="M154.62,-516.05C117.58,-510.8 73.59,-501.65 62,-487 46.83,-467.83 46.53,-450.92 62,-432 135.32,-342.34 505.35,-314.48 639.95,-307.23"/>
+<polygon fill="black" stroke="black" points="640.18,-310.72 649.98,-306.7 639.81,-303.73 640.18,-310.72"/>
</g>
<!-- SDL2->PulseAudio -->
<g id="edge55" class="edge">
<title>SDL2->PulseAudio</title>
-<path fill="none" stroke="black" d="M101.67,-504.77C103.51,-483.76 110.07,-448.97 133,-432 155.81,-415.12 1006.43,-387.97 1262.68,-380.17"/>
-<polygon fill="black" stroke="black" points="1263.1,-383.65 1272.99,-379.85 1262.89,-376.66 1263.1,-383.65"/>
+<path fill="none" stroke="black" d="M176.75,-507.85C160.4,-498.98 142.27,-485.82 133,-468 125.62,-453.81 121.99,-443.61 133,-432 149.34,-414.78 846.54,-388.97 1083.86,-380.67"/>
+<polygon fill="black" stroke="black" points="1084.26,-384.16 1094.13,-380.31 1084.02,-377.17 1084.26,-384.16"/>
</g>
<!-- SDL2->NAS -->
<g id="edge54" class="edge">
<title>SDL2->NAS</title>
-<path fill="none" stroke="black" d="M137.11,-508.65C165.98,-497.97 206.88,-482.85 239.55,-470.77"/>
-<polygon fill="black" stroke="black" points="240.79,-474.04 248.96,-467.29 238.37,-467.47 240.79,-474.04"/>
+<path fill="none" stroke="black" d="M231.78,-505.89C244.43,-496.54 260.57,-484.6 274.57,-474.24"/>
+<polygon fill="black" stroke="black" points="277,-476.8 282.96,-468.04 272.84,-471.17 277,-476.8"/>
</g>
<!-- phonon -->
-<g id="node24" class="node">
+<g id="node27" class="node">
<title>phonon</title>
-<ellipse fill="lightgrey" stroke="black" cx="1697" cy="-596" rx="44.69" ry="18"/>
-<text text-anchor="middle" x="1697" y="-592.3" font-family="Times,serif" font-size="14.00">phonon</text>
+<ellipse fill="lightgrey" stroke="black" cx="1726" cy="-596" rx="44.69" ry="18"/>
+<text text-anchor="middle" x="1726" y="-592.3" font-family="Times,serif" font-size="14.00">phonon</text>
</g>
<!-- phonon->PulseAudio -->
<g id="edge62" class="edge">
<title>phonon->PulseAudio</title>
-<path fill="none" stroke="black" d="M1713.03,-579.15C1729.95,-560.44 1752.1,-528.86 1736,-505 1697.75,-448.32 1500.89,-406.61 1397.93,-388.29"/>
-<polygon fill="black" stroke="black" points="1398.42,-384.83 1387.97,-386.54 1397.21,-391.72 1398.42,-384.83"/>
+<path fill="none" stroke="black" d="M1753.01,-581.46C1768.08,-572.3 1785.48,-558.65 1794,-541 1800.96,-526.59 1804.05,-517.45 1794,-505 1725.33,-419.92 1393.33,-390.73 1239.97,-381.68"/>
+<polygon fill="black" stroke="black" points="1239.87,-378.17 1229.68,-381.09 1239.47,-385.16 1239.87,-378.17"/>
</g>
<!-- phonon->gstreamer -->
<g id="edge60" class="edge">
<title>phonon->gstreamer</title>
-<path fill="none" stroke="black" d="M1674.83,-580.29C1659.61,-570.19 1639.16,-556.62 1622.16,-545.34"/>
-<polygon fill="black" stroke="black" points="1623.89,-542.29 1613.63,-539.68 1620.02,-548.12 1623.89,-542.29"/>
+<path fill="none" stroke="black" d="M1726,-577.81C1726,-569.79 1726,-560.05 1726,-551.07"/>
+<polygon fill="black" stroke="black" points="1729.5,-551.03 1726,-541.03 1722.5,-551.03 1729.5,-551.03"/>
</g>
<!-- VLC -->
-<g id="node25" class="node">
+<g id="node28" class="node">
<title>VLC</title>
-<g id="a_node25"><a xlink:href="https://code.videolan.org/videolan/vlc/-/tree/master/modules/audio_output" xlink:title="VLC">
-<ellipse fill="lightgrey" stroke="black" cx="1697" cy="-523" rx="29.8" ry="18"/>
-<text text-anchor="middle" x="1697" y="-519.3" font-family="Times,serif" font-size="14.00">VLC</text>
+<g id="a_node28"><a xlink:href="https://code.videolan.org/videolan/vlc/-/tree/master/modules/audio_output" xlink:title="VLC">
+<ellipse fill="lightgrey" stroke="black" cx="1581" cy="-523" rx="29.8" ry="18"/>
+<text text-anchor="middle" x="1581" y="-519.3" font-family="Times,serif" font-size="14.00">VLC</text>
</a>
</g>
</g>
<!-- phonon->VLC -->
<g id="edge61" class="edge">
<title>phonon->VLC</title>
-<path fill="none" stroke="black" d="M1697,-577.81C1697,-569.79 1697,-560.05 1697,-551.07"/>
-<polygon fill="black" stroke="black" points="1700.5,-551.03 1697,-541.03 1693.5,-551.03 1700.5,-551.03"/>
+<path fill="none" stroke="black" d="M1698.73,-581.65C1674.28,-569.68 1638.42,-552.12 1612.71,-539.53"/>
+<polygon fill="black" stroke="black" points="1613.92,-536.22 1603.4,-534.97 1610.84,-542.51 1613.92,-536.22"/>
</g>
<!-- VLC->ALSA -->
<g id="edge68" class="edge">
<title>VLC->ALSA</title>
-<path fill="none" stroke="black" d="M1674.76,-510.8C1669.39,-508.53 1663.59,-506.4 1658,-505 1597.96,-489.95 1178.87,-462.98 1034.07,-454"/>
-<polygon fill="black" stroke="black" points="1033.92,-450.48 1023.73,-453.36 1033.49,-457.47 1033.92,-450.48"/>
+<path fill="none" stroke="black" d="M1552.17,-517.72C1528.92,-514.27 1495.35,-509.31 1466,-505 1348.08,-487.7 1209.05,-467.52 1139.43,-457.43"/>
+<polygon fill="black" stroke="black" points="1139.67,-453.93 1129.27,-455.96 1138.67,-460.86 1139.67,-453.93"/>
</g>
<!-- VLC->JACK -->
<g id="edge69" class="edge">
<title>VLC->JACK</title>
-<path fill="none" stroke="black" d="M1720.21,-511.57C1730.05,-505.84 1740.5,-497.69 1746,-487 1757.19,-465.26 1759.47,-452.4 1746,-432 1700.46,-363.04 1654.52,-381.47 1575,-359 1425.32,-316.7 1379.72,-351.48 1227,-322 1221.22,-320.88 1215.18,-319.38 1209.32,-317.73"/>
-<polygon fill="black" stroke="black" points="1210.26,-314.36 1199.68,-314.85 1208.26,-321.06 1210.26,-314.36"/>
+<path fill="none" stroke="black" d="M1578.56,-504.97C1572.2,-467.61 1551.35,-378.71 1493,-340 1475.94,-328.68 1454.84,-320.65 1436.27,-315.16"/>
+<polygon fill="black" stroke="black" points="1437.12,-311.76 1426.54,-312.44 1435.23,-318.5 1437.12,-311.76"/>
</g>
<!-- VLC->sndio -->
<g id="edge71" class="edge">
<title>VLC->sndio</title>
-<path fill="none" stroke="black" d="M1682.53,-506.69C1649.32,-472.73 1563.52,-391.55 1473,-359 1402.45,-333.63 881.8,-312.54 722.91,-306.65"/>
-<polygon fill="black" stroke="black" points="722.66,-303.13 712.54,-306.26 722.41,-310.13 722.66,-303.13"/>
+<path fill="none" stroke="black" d="M1561.16,-509.47C1510.07,-477.92 1368.9,-395.14 1239,-359 1145.23,-332.92 854.66,-314.26 738.11,-307.64"/>
+<polygon fill="black" stroke="black" points="738.22,-304.14 728.04,-307.08 737.83,-311.13 738.22,-304.14"/>
</g>
<!-- VLC->PulseAudio -->
<g id="edge70" class="edge">
<title>VLC->PulseAudio</title>
-<path fill="none" stroke="black" d="M1674.2,-511.14C1668.96,-508.91 1663.35,-506.71 1658,-505 1621.22,-493.22 1606.86,-505.57 1573,-487 1530.82,-463.87 1537.66,-433.2 1494,-413 1465.32,-399.73 1431.35,-391.38 1402.2,-386.17"/>
-<polygon fill="black" stroke="black" points="1402.55,-382.68 1392.1,-384.46 1401.38,-389.58 1402.55,-382.68"/>
+<path fill="none" stroke="black" d="M1556.99,-512.08C1550.56,-509.6 1543.56,-507.06 1537,-505 1471.08,-484.28 1448.46,-497.55 1386,-468 1361.89,-456.6 1360.53,-446.27 1338,-432 1322.72,-422.32 1318.9,-419.46 1302,-413 1277.63,-403.68 1249.91,-396.15 1225.61,-390.5"/>
+<polygon fill="black" stroke="black" points="1226.31,-387.06 1215.78,-388.27 1224.76,-393.89 1226.31,-387.06"/>
</g>
<!-- ClanLib -->
-<g id="node26" class="node">
+<g id="node29" class="node">
<title>ClanLib</title>
-<g id="a_node26"><a xlink:href="https://github.com/sphair/ClanLib/tree/master/Sources/Sound/Platform/Linux" xlink:title="ClanLib">
-<ellipse fill="lightgrey" stroke="black" cx="977" cy="-523" rx="46.29" ry="18"/>
-<text text-anchor="middle" x="977" y="-519.3" font-family="Times,serif" font-size="14.00">ClanLib</text>
+<g id="a_node29"><a xlink:href="https://github.com/sphair/ClanLib/tree/master/Sources/Sound/Platform/Linux" xlink:title="ClanLib">
+<ellipse fill="lightgrey" stroke="black" cx="1011" cy="-523" rx="46.29" ry="18"/>
+<text text-anchor="middle" x="1011" y="-519.3" font-family="Times,serif" font-size="14.00">ClanLib</text>
</a>
</g>
</g>
<!-- ClanLib->ALSA -->
<g id="edge63" class="edge">
<title>ClanLib->ALSA</title>
-<path fill="none" stroke="black" d="M978.94,-504.81C979.84,-496.79 980.94,-487.05 981.95,-478.07"/>
-<polygon fill="black" stroke="black" points="985.44,-478.36 983.08,-468.03 978.48,-477.57 985.44,-478.36"/>
+<path fill="none" stroke="black" d="M1029.64,-506.24C1040.59,-496.99 1054.63,-485.12 1066.89,-474.76"/>
+<polygon fill="black" stroke="black" points="1069.27,-477.33 1074.65,-468.2 1064.75,-471.99 1069.27,-477.33"/>
</g>
<!-- allegro -->
-<g id="node27" class="node">
+<g id="node30" class="node">
<title>allegro</title>
-<g id="a_node27"><a xlink:href="https://github.com/liballeg/allegro5/tree/master/addons/audio" xlink:title="allegro">
-<ellipse fill="lightgrey" stroke="black" cx="890" cy="-669" rx="42.79" ry="18"/>
-<text text-anchor="middle" x="890" y="-665.3" font-family="Times,serif" font-size="14.00">allegro</text>
+<g id="a_node30"><a xlink:href="https://github.com/liballeg/allegro5/tree/master/addons/audio" xlink:title="allegro">
+<ellipse fill="lightgrey" stroke="black" cx="925" cy="-669" rx="42.79" ry="18"/>
+<text text-anchor="middle" x="925" y="-665.3" font-family="Times,serif" font-size="14.00">allegro</text>
</a>
</g>
</g>
<!-- allegro->PulseAudio -->
<g id="edge65" class="edge">
<title>allegro->PulseAudio</title>
-<path fill="none" stroke="black" d="M932.74,-666.96C1113.76,-662.29 1808,-641.48 1808,-597 1808,-597 1808,-597 1808,-449 1808,-408.89 1538.56,-388.88 1406.39,-381.48"/>
-<polygon fill="black" stroke="black" points="1406.53,-377.98 1396.35,-380.93 1406.14,-384.97 1406.53,-377.98"/>
+<path fill="none" stroke="black" d="M966.68,-664.72C1082.42,-654.66 1403.38,-620.02 1466,-541 1475.94,-528.46 1476.01,-517.48 1466,-505 1454.18,-490.26 1317.04,-476.17 1300,-468 1276.9,-456.93 1276.13,-446.47 1255,-432 1238.1,-420.43 1218.61,-408.86 1201.85,-399.42"/>
+<polygon fill="black" stroke="black" points="1203.29,-396.21 1192.86,-394.4 1199.89,-402.33 1203.29,-396.21"/>
</g>
<!-- allegro->OpenAL -->
<g id="edge64" class="edge">
<title>allegro->OpenAL</title>
-<path fill="none" stroke="black" d="M890,-650.81C890,-642.79 890,-633.05 890,-624.07"/>
-<polygon fill="black" stroke="black" points="893.5,-624.03 890,-614.03 886.5,-624.03 893.5,-624.03"/>
+<path fill="none" stroke="black" d="M925,-650.81C925,-642.79 925,-633.05 925,-624.07"/>
+<polygon fill="black" stroke="black" points="928.5,-624.03 925,-614.03 921.5,-624.03 928.5,-624.03"/>
</g>
<!-- allegro->SDL2 -->
<g id="edge66" class="edge">
<title>allegro->SDL2</title>
-<path fill="none" stroke="black" d="M848.73,-663.69C776.1,-655.81 620.79,-637.71 491,-614 369.89,-591.88 229.62,-557.27 154.72,-538.05"/>
-<polygon fill="black" stroke="black" points="155.15,-534.55 144.59,-535.45 153.4,-541.33 155.15,-534.55"/>
+<path fill="none" stroke="black" d="M901.84,-653.83C893.92,-649.63 884.82,-645.49 876,-643 718.97,-598.62 670.38,-644.06 510,-614 417.8,-596.72 313.62,-561.86 255.48,-540.96"/>
+<polygon fill="black" stroke="black" points="256.46,-537.59 245.87,-537.48 254.08,-544.17 256.46,-537.59"/>
</g>
<!-- telepathy -->
-<g id="node28" class="node">
+<g id="node31" class="node">
<title>telepathy</title>
-<ellipse fill="lightgrey" stroke="black" cx="1831" cy="-304" rx="54.69" ry="18"/>
-<text text-anchor="middle" x="1831" y="-300.3" font-family="Times,serif" font-size="14.00">telepathy</text>
+<ellipse fill="lightgrey" stroke="black" cx="1256" cy="-158" rx="54.69" ry="18"/>
+<text text-anchor="middle" x="1256" y="-154.3" font-family="Times,serif" font-size="14.00">telepathy</text>
</g>
<!-- telepathy->phone modem -->
<g id="edge67" class="edge">
<title>telepathy->phone modem</title>
-<path fill="none" stroke="black" d="M1823.71,-285.8C1818.69,-273.93 1811.91,-257.93 1806.2,-244.45"/>
-<polygon fill="black" stroke="black" points="1809.4,-243.02 1802.27,-235.18 1802.95,-245.75 1809.4,-243.02"/>
-<text text-anchor="middle" x="1819" y="-256.8" font-family="Times,serif" font-size="14.00" fill="red">?</text>
+<path fill="none" stroke="black" d="M1264.3,-140.21C1270.24,-128.18 1278.36,-111.75 1285.14,-98.03"/>
+<polygon fill="black" stroke="black" points="1288.28,-99.57 1289.58,-89.05 1282.01,-96.46 1288.28,-99.57"/>
+<text text-anchor="middle" x="1284" y="-110.8" font-family="Times,serif" font-size="14.00" fill="red">?</text>
</g>
<!-- pcaudiolib -->
-<g id="node29" class="node">
+<g id="node32" class="node">
<title>pcaudiolib</title>
-<g id="a_node29"><a xlink:href="https://github.com/espeak-ng/pcaudiolib" xlink:title="pcaudiolib">
-<ellipse fill="lightgrey" stroke="black" cx="1379" cy="-523" rx="58.49" ry="18"/>
-<text text-anchor="middle" x="1379" y="-519.3" font-family="Times,serif" font-size="14.00">pcaudiolib</text>
+<g id="a_node32"><a xlink:href="https://github.com/espeak-ng/pcaudiolib" xlink:title="pcaudiolib">
+<ellipse fill="lightgrey" stroke="black" cx="851" cy="-523" rx="58.49" ry="18"/>
+<text text-anchor="middle" x="851" y="-519.3" font-family="Times,serif" font-size="14.00">pcaudiolib</text>
</a>
</g>
</g>
<!-- pcaudiolib->ALSA -->
<g id="edge72" class="edge">
<title>pcaudiolib->ALSA</title>
-<path fill="none" stroke="black" d="M1329.9,-513.15C1253.95,-499.46 1108.88,-473.32 1033.37,-459.72"/>
-<polygon fill="black" stroke="black" points="1033.66,-456.21 1023.19,-457.88 1032.42,-463.1 1033.66,-456.21"/>
+<path fill="none" stroke="black" d="M878.8,-506.93C893.37,-499.61 911.74,-491.27 929,-486 976.8,-471.39 991.34,-479.41 1040,-468 1045.35,-466.75 1050.94,-465.25 1056.42,-463.66"/>
+<polygon fill="black" stroke="black" points="1057.52,-466.99 1066.09,-460.76 1055.51,-460.28 1057.52,-466.99"/>
</g>
<!-- pcaudiolib->PulseAudio -->
<g id="edge73" class="edge">
<title>pcaudiolib->PulseAudio</title>
-<path fill="none" stroke="black" d="M1344.07,-508.26C1326.89,-499.51 1307.81,-486.33 1298,-468 1286.59,-446.69 1299.5,-421.08 1313.1,-402.64"/>
-<polygon fill="black" stroke="black" points="1315.9,-404.74 1319.31,-394.72 1310.39,-400.43 1315.9,-404.74"/>
+<path fill="none" stroke="black" d="M862.69,-505.05C879.11,-481.72 908.71,-441.51 924,-432 972.21,-402.03 1035.14,-388.64 1084.18,-382.68"/>
+<polygon fill="black" stroke="black" points="1084.88,-386.13 1094.42,-381.52 1084.09,-379.17 1084.88,-386.13"/>
</g>
</g>
</svg>
diff --git a/images/linux-audio-output.dot b/images/linux-audio-output.dot
@@ -1,25 +1,37 @@
digraph "Linux Audio Output APIs (available code)" {
node [ shape=ellipse style=filled ];
+
label="Linux Audio Output APIs (available code)
CC-BY 4.0 © 2020-2021 Haelwenn (lanodan) Monnier
https://hacktivis.me/articles/linux-audio-output";
-
- "sound card" [ shape=box fillcolor=cyan ];
+ labelURL="https://hacktivis.me/articles/linux-audio-output"
+
+ subgraph cluster_legend {
+ label="Legend"
+ server [ shape=octagon fillcolor=orange ];
+ driver [ shape=hexagon fillcolor=yellow ];
+ hardware [ shape=box fillcolor=cyan ];
+ }
+
+
+ { rank=same "sound card" "phone modem" bluetooth }
+
+ "sound card" [ shape=box fillcolor=cyan ];
"phone modem" [ shape=box fillcolor=cyan ];
- "Bluetooth card" [ shape=box fillcolor=cyan ];
+ bluetooth [ shape=box fillcolor=cyan ];
portaudio [ URL="https://app.assembla.com/spaces/portaudio/git/source/master/src/hostapi/" ];
portaudio -> ALSA;
portaudio -> JACK;
portaudio -> OSS;
portaudio -> asihpi;
- asihpi [ shape=octagon fillcolor=yellow ];
+ asihpi [ shape=hexagon fillcolor=yellow ];
asihpi -> "sound card" [ color=green ];
// through a patch
portaudio -> sndio;
// https://rudd-o.com/linux-and-free-software/how-pulseaudio-works
- PulseAudio [ URL="https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/Modules/" ];
+ PulseAudio [ shape=octagon fillcolor=orange URL="https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/Modules/" ];
PulseAudio -> ALSA;
PulseAudio -> "sound card" [ color=green ];
PulseAudio -> OSS [ dir=both ];
@@ -28,19 +40,19 @@ digraph "Linux Audio Output APIs (available code)" {
PulseAudio -> ofono;
"X11 bell" -> PulseAudio;
- PipeWire [ URL="http://pipewire.org/" ];
+ PipeWire [ shape=octagon fillcolor=orange URL="http://pipewire.org/" ];
PulseAudio -> PipeWire [ dir=both ];
ALSA -> PipeWire [ dir=both ];
JACK -> PipeWire [ dir=both ];
PipeWire -> bluez;
gstreamer -> PipeWire;
- ofono [ shape=octagon fillcolor=yellow ];
+ ofono [ shape=hexagon fillcolor=yellow ];
ofono -> "phone modem" [ color=green ];
- bluez [ label="BlueZ" shape=octagon fillcolor=yellow ];
+ bluez [ label="BlueZ" shape=hexagon fillcolor=yellow ];
ALSA -> bluez;
- bluez -> "Bluetooth card" [ color=green ];
+ bluez -> bluetooth [ color=green ];
sox [ URL="http://sox.sourceforge.net/Docs/Features" ];
sox -> libao;
@@ -66,6 +78,7 @@ digraph "Linux Audio Output APIs (available code)" {
RoarAudio -> aRts;
// Probably incomplete, need some proper documentation
+ ESD [ shape=octagon fillcolor=orange ];
ESD -> OSS;
ESD -> ALSA;
@@ -75,7 +88,7 @@ digraph "Linux Audio Output APIs (available code)" {
libcanberra -> ALSA;
libcanberra -> gstreamer;
- sndio [ URL="http://www.sndio.org/" ];
+ sndio [ shape=octagon fillcolor=orange URL="http://www.sndio.org/" ];
sndio -> ALSA [ dir=both ];
PulseAudio -> sndio;
gstreamer -> sndio;
@@ -104,14 +117,14 @@ digraph "Linux Audio Output APIs (available code)" {
JUCE -> ALSA;
JUCE -> JACK;
- ALSA [ shape=octagon URL="https://alsa-project.org/wiki/Asoundrc#Plugins" fillcolor=yellow ];
+ ALSA [ shape=hexagon URL="https://alsa-project.org/wiki/Asoundrc#Plugins" fillcolor=yellow ];
ALSA -> "sound card" [ color=green ];
ALSA -> PulseAudio;
- ALSA -> JACK;
+ ALSA -> JACK [ dir=both ];
ALSA -> aRts;
OSS -> ALSA;
- OSS [ shape=octagon fillcolor=yellow ];
+ OSS [ shape=hexagon fillcolor=yellow ];
OSS -> "sound card" [ color=green fontcolor=green label="third-party drivers from opensound.com" ];
// OSS -> "sound card"; Got removed in the linux kernel
@@ -139,7 +152,7 @@ digraph "Linux Audio Output APIs (available code)" {
FusionSound [ label="DirectFB/FusionSound\n[dead]" fillcolor=red ];
// And then where the hell does it goes?
- NAS [ label="Network Audio System/Server" URL="http://radscan.com/nas.html" ]
+ NAS [ shape=octagon fillcolor=orange label="Network Audio System/Server" URL="http://radscan.com/nas.html" ]
gstreamer -> ALSA;
gstreamer -> OSS;
@@ -174,4 +187,7 @@ digraph "Linux Audio Output APIs (available code)" {
pcaudiolib -> ALSA;
pcaudiolib -> OSS;
pcaudiolib -> PulseAudio;
+
+ JACK [ shape=octagon fillcolor=orange URL="https://jackaudio.org/" ];
+ JACK -> OSS;
}
\ No newline at end of file
diff --git a/images/linux-audio-output.png b/images/linux-audio-output.png
Binary files differ.
diff --git a/images/linux-audio-output.svg b/images/linux-audio-output.svg
@@ -4,932 +4,965 @@
<!-- Generated by graphviz version 2.47.1 (20210417.1919)
-->
<!-- Title: Linux Audio Output APIs (available code) Pages: 1 -->
-<svg width="2679pt" height="748pt"
- viewBox="0.00 0.00 2679.00 747.74" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 743.74)">
+<svg width="2681pt" height="926pt"
+ viewBox="0.00 0.00 2681.00 925.74" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 921.74)">
<title>Linux Audio Output APIs (available code)</title>
-<polygon fill="white" stroke="transparent" points="-4,4 -4,-743.74 2675,-743.74 2675,4 -4,4"/>
-<text text-anchor="middle" x="1335.5" y="-37.8" font-family="Times,serif" font-size="14.00">Linux Audio Output APIs (available code)</text>
-<text text-anchor="middle" x="1335.5" y="-22.8" font-family="Times,serif" font-size="14.00"> CC-BY 4.0 © 2020-2021 Haelwenn (lanodan) Monnier</text>
-<text text-anchor="middle" x="1335.5" y="-7.8" font-family="Times,serif" font-size="14.00"> https://hacktivis.me/articles/linux-audio-output</text>
-<!-- sound card -->
+<polygon fill="white" stroke="transparent" points="-4,4 -4,-921.74 2677,-921.74 2677,4 -4,4"/>
+<text text-anchor="middle" x="1336.5" y="-37.8" font-family="Times,serif" font-size="14.00">Linux Audio Output APIs (available code)</text>
+<text text-anchor="middle" x="1336.5" y="-22.8" font-family="Times,serif" font-size="14.00"> CC-BY 4.0 © 2020-2021 Haelwenn (lanodan) Monnier</text>
+<text text-anchor="middle" x="1336.5" y="-7.8" font-family="Times,serif" font-size="14.00"> https://hacktivis.me/articles/linux-audio-output</text>
+<g id="clust1" class="cluster">
+<title>cluster_legend</title>
+<polygon fill="none" stroke="black" points="897,-834.74 897,-909.74 1213,-909.74 1213,-834.74 897,-834.74"/>
+<text text-anchor="middle" x="1055" y="-894.54" font-family="Times,serif" font-size="14.00">Legend</text>
+</g>
+<!-- server -->
<g id="node1" class="node">
+<title>server</title>
+<polygon fill="orange" stroke="black" points="1204.73,-853.28 1204.73,-868.2 1179.11,-878.74 1142.89,-878.74 1117.27,-868.2 1117.27,-853.28 1142.89,-842.74 1179.11,-842.74 1204.73,-853.28"/>
+<text text-anchor="middle" x="1161" y="-857.04" font-family="Times,serif" font-size="14.00">server</text>
+</g>
+<!-- driver -->
+<g id="node2" class="node">
+<title>driver</title>
+<polygon fill="yellow" stroke="black" points="1099.06,-860.74 1076.53,-878.74 1031.47,-878.74 1008.94,-860.74 1031.47,-842.74 1076.53,-842.74 1099.06,-860.74"/>
+<text text-anchor="middle" x="1054" y="-857.04" font-family="Times,serif" font-size="14.00">driver</text>
+</g>
+<!-- hardware -->
+<g id="node3" class="node">
+<title>hardware</title>
+<polygon fill="cyan" stroke="black" points="990.5,-878.74 905.5,-878.74 905.5,-842.74 990.5,-842.74 990.5,-878.74"/>
+<text text-anchor="middle" x="948" y="-857.04" font-family="Times,serif" font-size="14.00">hardware</text>
+</g>
+<!-- sound card -->
+<g id="node4" class="node">
<title>sound card</title>
-<polygon fill="cyan" stroke="black" points="1305.5,-235 1210.5,-235 1210.5,-199 1305.5,-199 1305.5,-235"/>
-<text text-anchor="middle" x="1258" y="-213.3" font-family="Times,serif" font-size="14.00">sound card</text>
+<polygon fill="cyan" stroke="black" points="1674.5,-89 1579.5,-89 1579.5,-53 1674.5,-53 1674.5,-89"/>
+<text text-anchor="middle" x="1627" y="-67.3" font-family="Times,serif" font-size="14.00">sound card</text>
</g>
<!-- phone modem -->
-<g id="node2" class="node">
+<g id="node5" class="node">
<title>phone modem</title>
-<polygon fill="cyan" stroke="black" points="836.5,-235 719.5,-235 719.5,-199 836.5,-199 836.5,-235"/>
-<text text-anchor="middle" x="778" y="-213.3" font-family="Times,serif" font-size="14.00">phone modem</text>
+<polygon fill="cyan" stroke="black" points="2566.5,-89 2449.5,-89 2449.5,-53 2566.5,-53 2566.5,-89"/>
+<text text-anchor="middle" x="2508" y="-67.3" font-family="Times,serif" font-size="14.00">phone modem</text>
</g>
-<!-- Bluetooth card -->
-<g id="node3" class="node">
-<title>Bluetooth card</title>
-<polygon fill="cyan" stroke="black" points="714,-89 592,-89 592,-53 714,-53 714,-89"/>
-<text text-anchor="middle" x="653" y="-67.3" font-family="Times,serif" font-size="14.00">Bluetooth card</text>
+<!-- bluetooth -->
+<g id="node6" class="node">
+<title>bluetooth</title>
+<polygon fill="cyan" stroke="black" points="2070.5,-89 1985.5,-89 1985.5,-53 2070.5,-53 2070.5,-89"/>
+<text text-anchor="middle" x="2028" y="-67.3" font-family="Times,serif" font-size="14.00">bluetooth</text>
</g>
<!-- portaudio -->
-<g id="node4" class="node">
+<g id="node7" class="node">
<title>portaudio</title>
-<g id="a_node4"><a xlink:href="https://app.assembla.com/spaces/portaudio/git/source/master/src/hostapi/" xlink:title="portaudio">
-<ellipse fill="lightgrey" stroke="black" cx="1104" cy="-575.74" rx="55.79" ry="18"/>
-<text text-anchor="middle" x="1104" y="-572.04" font-family="Times,serif" font-size="14.00">portaudio</text>
+<g id="a_node7"><a xlink:href="https://app.assembla.com/spaces/portaudio/git/source/master/src/hostapi/" xlink:title="portaudio">
+<ellipse fill="lightgrey" stroke="black" cx="1426" cy="-714.74" rx="55.79" ry="18"/>
+<text text-anchor="middle" x="1426" y="-711.04" font-family="Times,serif" font-size="14.00">portaudio</text>
</a>
</g>
</g>
<!-- ALSA -->
-<g id="node5" class="node">
+<g id="node8" class="node">
<title>ALSA</title>
-<g id="a_node5"><a xlink:href="https://alsa-project.org/wiki/Asoundrc#Plugins" xlink:title="ALSA">
-<polygon fill="yellow" stroke="black" points="1058.89,-486.41 1058.89,-501.33 1036.11,-511.87 1003.89,-511.87 981.11,-501.33 981.11,-486.41 1003.89,-475.87 1036.11,-475.87 1058.89,-486.41"/>
-<text text-anchor="middle" x="1020" y="-490.17" font-family="Times,serif" font-size="14.00">ALSA</text>
+<g id="a_node8"><a xlink:href="https://alsa-project.org/wiki/Asoundrc#Plugins" xlink:title="ALSA">
+<polygon fill="yellow" stroke="black" points="1830.05,-632.87 1809.53,-650.87 1768.47,-650.87 1747.95,-632.87 1768.47,-614.87 1809.53,-614.87 1830.05,-632.87"/>
+<text text-anchor="middle" x="1789" y="-629.17" font-family="Times,serif" font-size="14.00">ALSA</text>
</a>
</g>
</g>
<!-- portaudio->ALSA -->
<g id="edge1" class="edge">
<title>portaudio->ALSA</title>
-<path fill="none" stroke="black" d="M1087,-558.58C1074.98,-547.15 1058.66,-531.63 1045.14,-518.77"/>
-<polygon fill="black" stroke="black" points="1047.21,-515.91 1037.55,-511.56 1042.39,-520.99 1047.21,-515.91"/>
+<path fill="none" stroke="black" d="M1466.73,-702.23C1474.73,-700.21 1483.1,-698.27 1491,-696.74 1553.02,-684.72 1570.12,-691.46 1632,-678.74 1672.97,-670.32 1718.86,-656.7 1750.39,-646.68"/>
+<polygon fill="black" stroke="black" points="1751.65,-649.95 1760.1,-643.56 1749.51,-643.28 1751.65,-649.95"/>
</g>
<!-- JACK -->
-<g id="node6" class="node">
+<g id="node9" class="node">
<title>JACK</title>
-<ellipse fill="lightgrey" stroke="black" cx="440" cy="-304" rx="34.39" ry="18"/>
-<text text-anchor="middle" x="440" y="-300.3" font-family="Times,serif" font-size="14.00">JACK</text>
+<g id="a_node9"><a xlink:href="https://jackaudio.org/" xlink:title="JACK">
+<polygon fill="orange" stroke="black" points="2068.07,-529.54 2068.07,-544.46 2046.36,-555 2015.64,-555 1993.93,-544.46 1993.93,-529.54 2015.64,-519 2046.36,-519 2068.07,-529.54"/>
+<text text-anchor="middle" x="2031" y="-533.3" font-family="Times,serif" font-size="14.00">JACK</text>
+</a>
+</g>
</g>
<!-- portaudio->JACK -->
<g id="edge2" class="edge">
<title>portaudio->JACK</title>
-<path fill="none" stroke="black" d="M1049.6,-571.13C954.91,-564.23 764.06,-547.45 703,-520.74 668.66,-505.72 669.04,-488.01 638,-467 624.17,-457.63 618.64,-458.65 605,-449 556.2,-414.45 550.23,-398.11 505,-359 492.2,-347.93 477.73,-335.87 465.7,-325.96"/>
-<polygon fill="black" stroke="black" points="467.76,-323.12 457.81,-319.48 463.32,-328.53 467.76,-323.12"/>
+<path fill="none" stroke="black" d="M1462.42,-700.97C1538.94,-674.17 1711.63,-613.88 1739,-606 1825.12,-581.22 1927.47,-559.02 1985.27,-547.13"/>
+<polygon fill="black" stroke="black" points="1986.09,-550.53 1995.19,-545.1 1984.69,-543.68 1986.09,-550.53"/>
</g>
<!-- OSS -->
-<g id="node7" class="node">
+<g id="node10" class="node">
<title>OSS</title>
-<polygon fill="yellow" stroke="black" points="1392.13,-296.54 1392.13,-311.46 1372.72,-322 1345.28,-322 1325.87,-311.46 1325.87,-296.54 1345.28,-286 1372.72,-286 1392.13,-296.54"/>
-<text text-anchor="middle" x="1359" y="-300.3" font-family="Times,serif" font-size="14.00">OSS</text>
+<polygon fill="yellow" stroke="black" points="1527.05,-464 1509.52,-482 1474.48,-482 1456.95,-464 1474.48,-446 1509.52,-446 1527.05,-464"/>
+<text text-anchor="middle" x="1492" y="-460.3" font-family="Times,serif" font-size="14.00">OSS</text>
</g>
<!-- portaudio->OSS -->
<g id="edge3" class="edge">
<title>portaudio->OSS</title>
-<path fill="none" stroke="black" d="M1134.54,-560.57C1155.86,-550.31 1184.73,-535.67 1209,-520.74 1243.62,-499.44 1250.06,-490.82 1283,-467 1294.09,-458.98 1299.78,-459.95 1308,-449 1322.12,-430.17 1341.18,-368.24 1351.54,-332.02"/>
-<polygon fill="black" stroke="black" points="1354.98,-332.68 1354.34,-322.11 1348.25,-330.78 1354.98,-332.68"/>
+<path fill="none" stroke="black" d="M1430.54,-696.64C1441.82,-654.13 1471.2,-543.38 1484.85,-491.96"/>
+<polygon fill="black" stroke="black" points="1488.25,-492.78 1487.43,-482.22 1481.48,-490.98 1488.25,-492.78"/>
</g>
<!-- asihpi -->
-<g id="node8" class="node">
+<g id="node11" class="node">
<title>asihpi</title>
-<polygon fill="yellow" stroke="black" points="1306.51,-423.54 1306.51,-438.46 1282.19,-449 1247.81,-449 1223.49,-438.46 1223.49,-423.54 1247.81,-413 1282.19,-413 1306.51,-423.54"/>
-<text text-anchor="middle" x="1265" y="-427.3" font-family="Times,serif" font-size="14.00">asihpi</text>
+<polygon fill="yellow" stroke="black" points="1570.06,-632.87 1548.03,-650.87 1503.97,-650.87 1481.94,-632.87 1503.97,-614.87 1548.03,-614.87 1570.06,-632.87"/>
+<text text-anchor="middle" x="1526" y="-629.17" font-family="Times,serif" font-size="14.00">asihpi</text>
</g>
<!-- portaudio->asihpi -->
<g id="edge4" class="edge">
<title>portaudio->asihpi</title>
-<path fill="none" stroke="black" d="M1122.16,-558.64C1150.59,-533.44 1205.75,-484.53 1238.58,-455.42"/>
-<polygon fill="black" stroke="black" points="1241.25,-457.73 1246.42,-448.48 1236.61,-452.49 1241.25,-457.73"/>
+<path fill="none" stroke="black" d="M1446.24,-697.58C1460.62,-686.09 1480.18,-670.47 1496.32,-657.57"/>
+<polygon fill="black" stroke="black" points="1498.78,-660.09 1504.41,-651.11 1494.41,-654.62 1498.78,-660.09"/>
</g>
<!-- sndio -->
-<g id="node9" class="node">
+<g id="node12" class="node">
<title>sndio</title>
-<g id="a_node9"><a xlink:href="http://www.sndio.org/" xlink:title="sndio">
-<ellipse fill="lightgrey" stroke="black" cx="1067" cy="-144" rx="36" ry="18"/>
-<text text-anchor="middle" x="1067" y="-140.3" font-family="Times,serif" font-size="14.00">sndio</text>
+<g id="a_node12"><a xlink:href="http://www.sndio.org/" xlink:title="sndio">
+<polygon fill="orange" stroke="black" points="1245.89,-223.54 1245.89,-238.46 1223.11,-249 1190.89,-249 1168.11,-238.46 1168.11,-223.54 1190.89,-213 1223.11,-213 1245.89,-223.54"/>
+<text text-anchor="middle" x="1207" y="-227.3" font-family="Times,serif" font-size="14.00">sndio</text>
</a>
</g>
</g>
<!-- portaudio->sndio -->
<g id="edge6" class="edge">
<title>portaudio->sndio</title>
-<path fill="none" stroke="black" d="M1112.94,-557.97C1130.42,-525.09 1167.58,-454.84 1169,-449 1172.78,-433.45 1171.89,-428.74 1169,-413 1151.9,-319.98 1104,-217.42 1080.44,-170.71"/>
-<polygon fill="black" stroke="black" points="1083.46,-168.94 1075.8,-161.62 1077.22,-172.12 1083.46,-168.94"/>
+<path fill="none" stroke="black" d="M1424.99,-696.35C1422.99,-669.27 1417.31,-615.7 1402,-573 1356.55,-446.21 1265.16,-312.09 1225.77,-257.42"/>
+<polygon fill="black" stroke="black" points="1228.4,-255.08 1219.69,-249.04 1222.73,-259.19 1228.4,-255.08"/>
</g>
<!-- ALSA->sound card -->
<g id="edge64" class="edge">
<title>ALSA->sound card</title>
-<path fill="none" stroke="green" d="M1053.62,-483.68C1074.26,-476.74 1100.25,-465.55 1119,-449 1136.58,-433.49 1211.78,-300.77 1243.64,-243.81"/>
-<polygon fill="green" stroke="green" points="1246.72,-245.47 1248.54,-235.03 1240.61,-242.05 1246.72,-245.47"/>
+<path fill="none" stroke="green" d="M1784.57,-614.62C1778.84,-592.45 1768.47,-552.77 1759,-519 1714.1,-358.93 1656.25,-167.88 1635.16,-98.68"/>
+<polygon fill="green" stroke="green" points="1638.47,-97.55 1632.2,-89 1631.77,-99.59 1638.47,-97.55"/>
</g>
<!-- ALSA->JACK -->
<g id="edge66" class="edge">
<title>ALSA->JACK</title>
-<path fill="none" stroke="black" d="M988.82,-482.77C890.34,-450.87 586.18,-352.35 478.37,-317.43"/>
-<polygon fill="black" stroke="black" points="479.16,-314 468.56,-314.25 477,-320.66 479.16,-314"/>
+<path fill="none" stroke="black" d="M1827.68,-618.86C1852.25,-610.43 1884.66,-599.01 1913,-588 1940.77,-577.22 1971.76,-564.04 1995.02,-553.92"/>
+<polygon fill="black" stroke="black" points="1826.33,-615.62 1818,-622.17 1828.59,-622.25 1826.33,-615.62"/>
+<polygon fill="black" stroke="black" points="1996.71,-557 2004.48,-549.78 1993.91,-550.58 1996.71,-557"/>
</g>
<!-- PulseAudio -->
-<g id="node10" class="node">
+<g id="node13" class="node">
<title>PulseAudio</title>
-<g id="a_node10"><a xlink:href="https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/Modules/" xlink:title="PulseAudio">
-<ellipse fill="lightgrey" stroke="black" cx="851" cy="-377" rx="62.29" ry="18"/>
-<text text-anchor="middle" x="851" y="-373.3" font-family="Times,serif" font-size="14.00">PulseAudio</text>
+<g id="a_node13"><a xlink:href="https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/Modules/" xlink:title="PulseAudio">
+<polygon fill="orange" stroke="black" points="2095.57,-310.54 2095.57,-325.46 2055.99,-336 2000.01,-336 1960.43,-325.46 1960.43,-310.54 2000.01,-300 2055.99,-300 2095.57,-310.54"/>
+<text text-anchor="middle" x="2028" y="-314.3" font-family="Times,serif" font-size="14.00">PulseAudio</text>
</a>
</g>
</g>
<!-- ALSA->PulseAudio -->
<g id="edge65" class="edge">
<title>ALSA->PulseAudio</title>
-<path fill="none" stroke="black" d="M997.49,-478.4C971.31,-458.39 930.43,-423.55 914,-413 905.58,-407.59 896.2,-402.46 887.27,-397.88"/>
-<polygon fill="black" stroke="black" points="888.69,-394.67 878.18,-393.31 885.54,-400.93 888.69,-394.67"/>
+<path fill="none" stroke="black" d="M1813.74,-618.21C1828.49,-610.73 1846.81,-600.44 1861,-588 1934.95,-523.2 1946.92,-496.89 1991,-409 2001.15,-388.76 2008.51,-364.1 2014.55,-345.72"/>
+<polygon fill="black" stroke="black" points="2017.87,-346.82 2017.78,-336.22 2011.25,-344.56 2017.87,-346.82"/>
</g>
<!-- bluez -->
-<g id="node11" class="node">
+<g id="node14" class="node">
<title>bluez</title>
-<polygon fill="yellow" stroke="black" points="694.51,-136.54 694.51,-151.46 670.19,-162 635.81,-162 611.49,-151.46 611.49,-136.54 635.81,-126 670.19,-126 694.51,-136.54"/>
-<text text-anchor="middle" x="653" y="-140.3" font-family="Times,serif" font-size="14.00">BlueZ</text>
+<polygon fill="yellow" stroke="black" points="2072.06,-158 2050.03,-176 2005.97,-176 1983.94,-158 2005.97,-140 2050.03,-140 2072.06,-158"/>
+<text text-anchor="middle" x="2028" y="-154.3" font-family="Times,serif" font-size="14.00">BlueZ</text>
</g>
<!-- ALSA->bluez -->
<g id="edge20" class="edge">
<title>ALSA->bluez</title>
-<path fill="none" stroke="black" d="M1016.61,-475.75C1009.92,-446.75 992.12,-388.27 953,-359 912.04,-328.35 873.8,-363.58 844,-322 812.15,-277.56 879.04,-242.56 846,-199 828.9,-176.46 755.61,-160.76 704.45,-152.31"/>
-<polygon fill="black" stroke="black" points="704.96,-148.85 694.53,-150.72 703.85,-155.76 704.96,-148.85"/>
+<path fill="none" stroke="black" d="M1802.57,-614.51C1808.35,-606.66 1814.92,-597.13 1820,-588 1827.75,-574.08 1828.68,-570.02 1834,-555 1845.28,-523.18 1845.99,-514.54 1855,-482 1868.37,-433.69 1863.28,-418.65 1884,-373 1917.56,-299.08 1975.8,-222.53 2006.94,-184.15"/>
+<polygon fill="black" stroke="black" points="2009.89,-186.07 2013.52,-176.12 2004.47,-181.64 2009.89,-186.07"/>
</g>
<!-- PipeWire -->
-<g id="node14" class="node">
+<g id="node17" class="node">
<title>PipeWire</title>
-<g id="a_node14"><a xlink:href="http://pipewire.org/" xlink:title="PipeWire">
-<ellipse fill="lightgrey" stroke="black" cx="440" cy="-217" rx="53.09" ry="18"/>
-<text text-anchor="middle" x="440" y="-213.3" font-family="Times,serif" font-size="14.00">PipeWire</text>
+<g id="a_node17"><a xlink:href="http://pipewire.org/" xlink:title="PipeWire">
+<polygon fill="orange" stroke="black" points="2405.87,-223.54 2405.87,-238.46 2371.97,-249 2324.03,-249 2290.13,-238.46 2290.13,-223.54 2324.03,-213 2371.97,-213 2405.87,-223.54"/>
+<text text-anchor="middle" x="2348" y="-227.3" font-family="Times,serif" font-size="14.00">PipeWire</text>
</a>
</g>
</g>
<!-- ALSA->PipeWire -->
<g id="edge15" class="edge">
<title>ALSA->PipeWire</title>
-<path fill="none" stroke="black" d="M1004.61,-467.09C983.1,-431.98 944.19,-372 922,-359 839.47,-310.65 802.18,-347.53 710,-322 625.92,-298.71 531.64,-259.15 479.71,-236.12"/>
-<polygon fill="black" stroke="black" points="1001.75,-469.13 1009.93,-475.86 1007.73,-465.49 1001.75,-469.13"/>
-<polygon fill="black" stroke="black" points="481.08,-232.89 470.52,-232.02 478.23,-239.29 481.08,-232.89"/>
+<path fill="none" stroke="black" d="M1797.37,-604.77C1815.48,-546.9 1858.73,-413.28 1884,-373 1907.41,-335.7 1912.33,-321.07 1951,-300 2006.6,-269.7 2182.19,-248.24 2280.2,-238.28"/>
+<polygon fill="black" stroke="black" points="1793.92,-604.06 1794.29,-614.65 1800.6,-606.15 1793.92,-604.06"/>
+<polygon fill="black" stroke="black" points="2280.7,-241.74 2290.3,-237.26 2280,-234.78 2280.7,-241.74"/>
</g>
<!-- aRts -->
-<g id="node18" class="node">
+<g id="node21" class="node">
<title>aRts</title>
-<ellipse fill="lightgrey" stroke="black" cx="1813" cy="-144" rx="31.7" ry="18"/>
-<text text-anchor="middle" x="1813" y="-140.3" font-family="Times,serif" font-size="14.00">aRts</text>
+<ellipse fill="lightgrey" stroke="black" cx="844" cy="-318" rx="31.7" ry="18"/>
+<text text-anchor="middle" x="844" y="-314.3" font-family="Times,serif" font-size="14.00">aRts</text>
</g>
<!-- ALSA->aRts -->
<g id="edge67" class="edge">
<title>ALSA->aRts</title>
-<path fill="none" stroke="black" d="M1036.9,-476.13C1044.41,-468.25 1053.1,-458.51 1060,-449 1135.07,-345.59 1093.85,-267.05 1202,-199 1252.43,-167.27 1678.04,-170.58 1737,-162 1749.44,-160.19 1762.87,-157.45 1774.92,-154.7"/>
-<polygon fill="black" stroke="black" points="1775.75,-158.1 1784.68,-152.4 1774.14,-151.29 1775.75,-158.1"/>
+<path fill="none" stroke="black" d="M1776.48,-614.84C1755.77,-587.02 1714.83,-533.46 1696,-519 1634,-471.4 1610.45,-469.82 1536,-446 1411.81,-406.27 1013.47,-344.48 884.62,-325.05"/>
+<polygon fill="black" stroke="black" points="884.81,-321.54 874.4,-323.52 883.77,-328.47 884.81,-321.54"/>
+</g>
+<!-- JACK->OSS -->
+<g id="edge108" class="edge">
+<title>JACK->OSS</title>
+<path fill="none" stroke="black" d="M1993.59,-532.33C1935.12,-526.48 1818.54,-514.32 1720,-501 1653.68,-492.04 1576.87,-479.45 1531.47,-471.78"/>
+<polygon fill="black" stroke="black" points="1531.9,-468.3 1521.45,-470.08 1530.73,-475.2 1531.9,-468.3"/>
</g>
<!-- JACK->PipeWire -->
<g id="edge16" class="edge">
<title>JACK->PipeWire</title>
-<path fill="none" stroke="black" d="M440,-275.73C440,-266.06 440,-255.17 440,-245.48"/>
-<polygon fill="black" stroke="black" points="436.5,-275.8 440,-285.8 443.5,-275.8 436.5,-275.8"/>
-<polygon fill="black" stroke="black" points="443.5,-245.18 440,-235.18 436.5,-245.18 443.5,-245.18"/>
+<path fill="none" stroke="black" d="M2078.33,-528.35C2150.32,-514.77 2288.86,-480.85 2383,-409 2406.62,-390.97 2428.91,-382.64 2421,-354 2410.87,-317.34 2386.49,-280.62 2368.68,-257.18"/>
+<polygon fill="black" stroke="black" points="2077.41,-524.96 2068.21,-530.2 2078.68,-531.84 2077.41,-524.96"/>
+<polygon fill="black" stroke="black" points="2371.36,-254.92 2362.46,-249.18 2365.83,-259.22 2371.36,-254.92"/>
</g>
<!-- OSS->sound card -->
<g id="edge69" class="edge">
<title>OSS->sound card</title>
-<path fill="none" stroke="green" d="M1325.8,-300.87C1303.01,-297.49 1274.22,-289 1259,-268 1254.32,-261.55 1252.87,-253.29 1252.93,-245.36"/>
-<polygon fill="green" stroke="green" points="1256.43,-245.54 1253.74,-235.3 1249.45,-244.98 1256.43,-245.54"/>
-<text text-anchor="middle" x="1403" y="-256.8" font-family="Times,serif" font-size="14.00" fill="green">third-party drivers from opensound.com</text>
+<path fill="none" stroke="green" d="M1467.34,-453.25C1405.39,-427.24 1251.54,-352.32 1300,-267 1357.92,-165.03 1492.61,-110.74 1569.85,-87.02"/>
+<polygon fill="green" stroke="green" points="1570.86,-90.37 1579.43,-84.14 1568.85,-83.67 1570.86,-90.37"/>
+<text text-anchor="middle" x="1444" y="-270.8" font-family="Times,serif" font-size="14.00" fill="green">third-party drivers from opensound.com</text>
</g>
<!-- OSS->ALSA -->
<g id="edge68" class="edge">
<title>OSS->ALSA</title>
-<path fill="none" stroke="black" d="M1333.74,-315.76C1295.86,-332.7 1223.3,-368.3 1172,-413 1156.72,-426.32 1160.44,-437.14 1144,-449 1130.69,-458.6 1093.23,-471.25 1062.94,-480.5"/>
-<polygon fill="black" stroke="black" points="1061.55,-477.26 1052.98,-483.5 1063.57,-483.97 1061.55,-477.26"/>
+<path fill="none" stroke="black" d="M1519.43,-472.32C1538.05,-478.07 1562.7,-487.25 1582,-500 1627.63,-530.15 1622.03,-558.38 1668,-588 1692.35,-603.69 1723.07,-614.74 1747.46,-621.82"/>
+<polygon fill="black" stroke="black" points="1746.58,-625.21 1757.15,-624.53 1748.46,-618.47 1746.58,-625.21"/>
</g>
<!-- RoarAudio -->
-<g id="node21" class="node">
+<g id="node24" class="node">
<title>RoarAudio</title>
-<g id="a_node21"><a xlink:href="http://roaraudio.keep-cool.org/" xlink:title="RoarAudio">
-<ellipse fill="lightgrey" stroke="black" cx="1574" cy="-217" rx="59.29" ry="18"/>
-<text text-anchor="middle" x="1574" y="-213.3" font-family="Times,serif" font-size="14.00">RoarAudio</text>
+<g id="a_node24"><a xlink:href="http://roaraudio.keep-cool.org/" xlink:title="RoarAudio">
+<ellipse fill="lightgrey" stroke="black" cx="1091" cy="-391" rx="59.29" ry="18"/>
+<text text-anchor="middle" x="1091" y="-387.3" font-family="Times,serif" font-size="14.00">RoarAudio</text>
</a>
</g>
</g>
<!-- OSS->RoarAudio -->
<g id="edge34" class="edge">
<title>OSS->RoarAudio</title>
-<path fill="none" stroke="black" d="M1392.2,-303.21C1451.28,-302.81 1570.93,-298.18 1597,-268 1603.28,-260.73 1601.08,-251.47 1596.1,-242.89"/>
-<polygon fill="black" stroke="black" points="1598.96,-240.88 1590.39,-234.64 1593.2,-244.86 1598.96,-240.88"/>
+<path fill="none" stroke="black" d="M1462.84,-457.84C1397.48,-446.26 1238.17,-418.06 1150.78,-402.58"/>
+<polygon fill="black" stroke="black" points="1151.21,-399.11 1140.75,-400.81 1149.99,-406 1151.21,-399.11"/>
</g>
<!-- asihpi->sound card -->
<g id="edge5" class="edge">
<title>asihpi->sound card</title>
-<path fill="none" stroke="green" d="M1263.67,-412.77C1262.52,-398.39 1260.78,-377.35 1259,-359 1255.06,-318.5 1251.23,-308.63 1249,-268 1248.64,-261.34 1248.16,-259.61 1249,-253 1249.32,-250.44 1249.78,-247.8 1250.31,-245.17"/>
-<polygon fill="green" stroke="green" points="1253.75,-245.82 1252.64,-235.28 1246.94,-244.21 1253.75,-245.82"/>
+<path fill="none" stroke="green" d="M1535.75,-614.69C1555.8,-578.22 1601.14,-489.79 1617,-409 1620.08,-393.3 1619.16,-388.85 1617,-373 1613.64,-348.32 1602,-343.91 1602,-319 1602,-319 1602,-319 1602,-157 1602,-136.87 1608.53,-115.12 1614.92,-98.65"/>
+<polygon fill="green" stroke="green" points="1618.26,-99.73 1618.81,-89.15 1611.78,-97.07 1618.26,-99.73"/>
</g>
<!-- sndio->ALSA -->
<g id="edge45" class="edge">
<title>sndio->ALSA</title>
-<path fill="none" stroke="black" d="M1063.26,-172.66C1054.45,-237.89 1032.45,-400.73 1023.69,-465.58"/>
-<polygon fill="black" stroke="black" points="1066.78,-172.73 1064.66,-162.36 1059.85,-171.8 1066.78,-172.73"/>
-<polygon fill="black" stroke="black" points="1020.2,-465.24 1022.33,-475.62 1027.14,-466.18 1020.2,-465.24"/>
+<path fill="none" stroke="black" d="M1256.12,-233.79C1348.27,-237.59 1539.94,-247.73 1563,-267 1594.2,-293.07 1572.69,-317.33 1588,-355 1626.03,-448.59 1631.88,-476.93 1696,-555 1713.72,-576.57 1738.2,-596.52 1757.59,-610.68"/>
+<polygon fill="black" stroke="black" points="1256.05,-230.29 1245.92,-233.38 1255.77,-237.28 1256.05,-230.29"/>
+<polygon fill="black" stroke="black" points="1755.66,-613.61 1765.83,-616.58 1759.73,-607.91 1755.66,-613.61"/>
</g>
<!-- PulseAudio->sound card -->
<g id="edge8" class="edge">
<title>PulseAudio->sound card</title>
-<path fill="none" stroke="green" d="M877.22,-360.56C889.38,-353.76 904.18,-345.96 918,-340 941.23,-329.98 948.12,-330.34 972,-322 1056.43,-292.52 1076.94,-283.51 1161,-253 1174,-248.28 1187.99,-243.22 1201.18,-238.46"/>
-<polygon fill="green" stroke="green" points="1202.41,-241.74 1210.62,-235.05 1200.03,-235.16 1202.41,-241.74"/>
+<path fill="none" stroke="green" d="M2000.12,-299.97C1929.4,-256.76 1743.03,-142.89 1663.65,-94.39"/>
+<polygon fill="green" stroke="green" points="1665.32,-91.31 1654.96,-89.08 1661.67,-97.28 1665.32,-91.31"/>
</g>
<!-- PulseAudio->ALSA -->
<g id="edge7" class="edge">
<title>PulseAudio->ALSA</title>
-<path fill="none" stroke="black" d="M890.28,-391.11C904.03,-397.12 919.13,-404.74 932,-413 945.98,-421.97 977.66,-448.54 999.13,-468.59"/>
-<polygon fill="black" stroke="black" points="996.87,-471.27 1006.53,-475.63 1001.7,-466.2 996.87,-471.27"/>
+<path fill="none" stroke="black" d="M2031.05,-336.22C2029.14,-354.82 2021.03,-385.01 2009,-409 1964.92,-496.89 1952.95,-523.2 1879,-588 1864.42,-600.78 1845.49,-611.29 1828.64,-618.82"/>
+<polygon fill="black" stroke="black" points="1826.85,-615.77 1819.01,-622.9 1829.58,-622.22 1826.85,-615.77"/>
</g>
<!-- PulseAudio->JACK -->
<g id="edge10" class="edge">
<title>PulseAudio->JACK</title>
-<path fill="none" stroke="black" d="M793.47,-369.97C723.35,-362.43 609,-349.49 567,-341 536.79,-334.9 503.28,-325.27 478.27,-317.51"/>
-<polygon fill="black" stroke="black" points="479.03,-314.08 468.44,-314.42 476.93,-320.76 479.03,-314.08"/>
+<path fill="none" stroke="black" d="M2066.96,-333.33C2075.72,-338.47 2083.92,-345.23 2089,-354 2116.32,-401.17 2115.32,-458.17 2082,-501 2077.04,-507.38 2070.59,-513.03 2063.95,-517.83"/>
+<polygon fill="black" stroke="black" points="2061.92,-514.98 2055.55,-523.45 2065.81,-520.8 2061.92,-514.98"/>
</g>
<!-- PulseAudio->OSS -->
<g id="edge9" class="edge">
<title>PulseAudio->OSS</title>
-<path fill="none" stroke="black" d="M915.77,-366.95C1020.97,-352.25 1226.19,-323.56 1315.61,-311.06"/>
-<polygon fill="black" stroke="black" points="915.27,-363.48 905.85,-368.33 916.24,-370.42 915.27,-363.48"/>
-<polygon fill="black" stroke="black" points="1316.26,-314.51 1325.68,-309.66 1315.29,-307.58 1316.26,-314.51"/>
+<path fill="none" stroke="black" d="M1954.31,-327.91C1912.51,-333.74 1859.44,-342.42 1813,-354 1706.11,-380.65 1583.93,-426.6 1525.95,-449.38"/>
+<polygon fill="black" stroke="black" points="1954.97,-331.36 1964.41,-326.53 1954.02,-324.42 1954.97,-331.36"/>
+<polygon fill="black" stroke="black" points="1524.57,-446.16 1516.55,-453.09 1527.14,-452.67 1524.57,-446.16"/>
</g>
<!-- PulseAudio->sndio -->
<g id="edge46" class="edge">
<title>PulseAudio->sndio</title>
-<path fill="none" stroke="black" d="M794.05,-369.58C763.72,-362.93 728.87,-349.43 710,-322 697.41,-303.7 682.09,-232.23 711,-199 750.72,-153.34 934.02,-145.86 1020.97,-144.92"/>
-<polygon fill="black" stroke="black" points="1021.11,-148.42 1031.09,-144.84 1021.06,-141.42 1021.11,-148.42"/>
+<path fill="none" stroke="black" d="M1964.73,-309.3C1879.78,-299.06 1724.13,-280.68 1591,-267 1470.72,-254.64 1329.02,-242.3 1255.99,-236.1"/>
+<polygon fill="black" stroke="black" points="1255.99,-232.59 1245.73,-235.23 1255.4,-239.56 1255.99,-232.59"/>
</g>
<!-- PulseAudio->bluez -->
<g id="edge11" class="edge">
<title>PulseAudio->bluez</title>
-<path fill="none" stroke="black" d="M791.6,-371.4C747.48,-366.69 692.39,-357.62 677,-341 634.25,-294.84 640.46,-214.13 647.4,-172.13"/>
-<polygon fill="black" stroke="black" points="650.88,-172.56 649.2,-162.09 643.99,-171.32 650.88,-172.56"/>
+<path fill="none" stroke="black" d="M2028,-299.79C2028,-272.48 2028,-218.99 2028,-186.38"/>
+<polygon fill="black" stroke="black" points="2031.5,-186.19 2028,-176.19 2024.5,-186.19 2031.5,-186.19"/>
</g>
<!-- ofono -->
-<g id="node12" class="node">
+<g id="node15" class="node">
<title>ofono</title>
-<polygon fill="yellow" stroke="black" points="797.29,-296.54 797.29,-311.46 774.28,-322 741.72,-322 718.71,-311.46 718.71,-296.54 741.72,-286 774.28,-286 797.29,-296.54"/>
-<text text-anchor="middle" x="758" y="-300.3" font-family="Times,serif" font-size="14.00">ofono</text>
+<polygon fill="yellow" stroke="black" points="2508.05,-231 2487.03,-249 2444.97,-249 2423.95,-231 2444.97,-213 2487.03,-213 2508.05,-231"/>
+<text text-anchor="middle" x="2466" y="-227.3" font-family="Times,serif" font-size="14.00">ofono</text>
</g>
<!-- PulseAudio->ofono -->
<g id="edge12" class="edge">
<title>PulseAudio->ofono</title>
-<path fill="none" stroke="black" d="M829.9,-359.89C817.03,-350.06 800.41,-337.38 786.4,-326.68"/>
-<polygon fill="black" stroke="black" points="788.14,-323.6 778.06,-320.32 783.89,-329.17 788.14,-323.6"/>
+<path fill="none" stroke="black" d="M2089.92,-309C2166.84,-298.4 2301.75,-277.66 2415,-249 2419.07,-247.97 2423.29,-246.78 2427.47,-245.51"/>
+<polygon fill="black" stroke="black" points="2428.62,-248.82 2437.09,-242.46 2426.5,-242.14 2428.62,-248.82"/>
</g>
<!-- PulseAudio->PipeWire -->
<g id="edge14" class="edge">
<title>PulseAudio->PipeWire</title>
-<path fill="none" stroke="black" d="M781.71,-369.87C739.68,-364.85 685.39,-356.04 639,-341 571.4,-319.08 503.24,-269.66 466.87,-240.58"/>
-<polygon fill="black" stroke="black" points="781.51,-373.37 791.84,-371.03 782.31,-366.41 781.51,-373.37"/>
-<polygon fill="black" stroke="black" points="468.73,-237.57 458.75,-234 464.32,-243.01 468.73,-237.57"/>
+<path fill="none" stroke="black" d="M2083.98,-302.13C2143.66,-286.28 2237.42,-261.37 2295.67,-245.9"/>
+<polygon fill="black" stroke="black" points="2082.96,-298.78 2074.19,-304.73 2084.75,-305.55 2082.96,-298.78"/>
+<polygon fill="black" stroke="black" points="2296.64,-249.26 2305.4,-243.31 2294.84,-242.5 2296.64,-249.26"/>
</g>
-<!-- bluez->Bluetooth card -->
+<!-- bluez->bluetooth -->
<g id="edge21" class="edge">
-<title>bluez->Bluetooth card</title>
-<path fill="none" stroke="green" d="M653,-125.81C653,-117.79 653,-108.05 653,-99.07"/>
-<polygon fill="green" stroke="green" points="656.5,-99.03 653,-89.03 649.5,-99.03 656.5,-99.03"/>
+<title>bluez->bluetooth</title>
+<path fill="none" stroke="green" d="M2028,-139.8C2028,-128.16 2028,-112.55 2028,-99.24"/>
+<polygon fill="green" stroke="green" points="2031.5,-99.18 2028,-89.18 2024.5,-99.18 2031.5,-99.18"/>
</g>
<!-- ofono->phone modem -->
<g id="edge19" class="edge">
<title>ofono->phone modem</title>
-<path fill="none" stroke="green" d="M762.05,-285.8C764.79,-274.16 768.46,-258.55 771.59,-245.24"/>
-<polygon fill="green" stroke="green" points="775.08,-245.71 773.96,-235.18 768.26,-244.11 775.08,-245.71"/>
+<path fill="none" stroke="green" d="M2468.98,-212.94C2472.31,-194.73 2478.13,-165.11 2485,-140 2488.75,-126.29 2493.73,-111.3 2498.09,-98.89"/>
+<polygon fill="green" stroke="green" points="2501.5,-99.75 2501.57,-89.15 2494.91,-97.39 2501.5,-99.75"/>
</g>
<!-- X11 bell -->
-<g id="node13" class="node">
+<g id="node16" class="node">
<title>X11 bell</title>
-<ellipse fill="lightgrey" stroke="black" cx="761" cy="-493.87" rx="48.99" ry="18"/>
-<text text-anchor="middle" x="761" y="-490.17" font-family="Times,serif" font-size="14.00">X11 bell</text>
+<ellipse fill="lightgrey" stroke="black" cx="1942" cy="-391" rx="48.99" ry="18"/>
+<text text-anchor="middle" x="1942" y="-387.3" font-family="Times,serif" font-size="14.00">X11 bell</text>
</g>
<!-- X11 bell->PulseAudio -->
<g id="edge13" class="edge">
<title>X11 bell->PulseAudio</title>
-<path fill="none" stroke="black" d="M773.75,-476.29C786.24,-460.1 805.83,-434.78 823,-413 825.66,-409.63 828.47,-406.09 831.24,-402.61"/>
-<polygon fill="black" stroke="black" points="834.05,-404.69 837.56,-394.7 828.59,-400.32 834.05,-404.69"/>
+<path fill="none" stroke="black" d="M1961.09,-374.24C1972.29,-364.99 1986.67,-353.12 1999.23,-342.76"/>
+<polygon fill="black" stroke="black" points="2001.68,-345.27 2007.16,-336.2 1997.22,-339.87 2001.68,-345.27"/>
</g>
<!-- PipeWire->bluez -->
<g id="edge17" class="edge">
<title>PipeWire->bluez</title>
-<path fill="none" stroke="black" d="M476.62,-203.79C514.12,-191.29 572.32,-171.89 611.5,-158.83"/>
-<polygon fill="black" stroke="black" points="612.65,-162.14 621.03,-155.66 610.44,-155.5 612.65,-162.14"/>
+<path fill="none" stroke="black" d="M2301.81,-219.75C2240.29,-206.1 2132.23,-182.13 2071.89,-168.74"/>
+<polygon fill="black" stroke="black" points="2072.44,-165.28 2061.92,-166.53 2070.92,-172.11 2072.44,-165.28"/>
</g>
<!-- gstreamer -->
-<g id="node15" class="node">
+<g id="node18" class="node">
<title>gstreamer</title>
-<ellipse fill="lightgrey" stroke="black" cx="114" cy="-575.74" rx="59.29" ry="18"/>
-<text text-anchor="middle" x="114" y="-572.04" font-family="Times,serif" font-size="14.00">gstreamer</text>
+<ellipse fill="lightgrey" stroke="black" cx="2399" cy="-714.74" rx="59.29" ry="18"/>
+<text text-anchor="middle" x="2399" y="-711.04" font-family="Times,serif" font-size="14.00">gstreamer</text>
</g>
<!-- gstreamer->ALSA -->
<g id="edge85" class="edge">
<title>gstreamer->ALSA</title>
-<path fill="none" stroke="black" d="M169.28,-569.22C246.42,-561.65 390.75,-547.92 514,-538.74 649.42,-528.65 683.8,-533.41 819,-520.74 871.15,-515.85 930.63,-507.9 971.27,-502.1"/>
-<polygon fill="black" stroke="black" points="971.78,-505.56 981.18,-500.67 970.78,-498.63 971.78,-505.56"/>
+<path fill="none" stroke="black" d="M2345.93,-706.79C2227.72,-691.31 1944.45,-654.22 1834.09,-639.77"/>
+<polygon fill="black" stroke="black" points="1834.33,-636.28 1823.96,-638.45 1833.42,-643.22 1834.33,-636.28"/>
</g>
<!-- gstreamer->JACK -->
<g id="edge87" class="edge">
<title>gstreamer->JACK</title>
-<path fill="none" stroke="black" d="M105.67,-557.69C103.36,-552.1 101.16,-545.78 100,-539.74 93.89,-507.99 87.63,-496.87 100,-467 112.99,-435.64 128.32,-435.2 154,-413 195.09,-377.48 202.24,-361.76 252,-340 298.49,-319.67 356.48,-311.14 395.67,-307.57"/>
-<polygon fill="black" stroke="black" points="396.03,-311.05 405.7,-306.72 395.44,-304.07 396.03,-311.05"/>
+<path fill="none" stroke="black" d="M2350.69,-704.32C2317.73,-696.26 2274.21,-682.31 2241,-659.74 2199.09,-631.26 2209.98,-599.84 2167,-573 2140.32,-556.34 2105.99,-547.58 2078.5,-542.99"/>
+<polygon fill="black" stroke="black" points="2078.74,-539.49 2068.32,-541.43 2077.68,-546.41 2078.74,-539.49"/>
</g>
<!-- gstreamer->OSS -->
<g id="edge86" class="edge">
<title>gstreamer->OSS</title>
-<path fill="none" stroke="black" d="M120.53,-557.48C130.19,-534.03 150.42,-492.15 180,-467 276.57,-384.87 322.7,-395.85 444,-359 484.37,-346.74 495.12,-345.11 537,-340 729.07,-316.56 778.68,-330.25 972,-322 1096.63,-316.68 1243.81,-310.15 1315.45,-306.95"/>
-<polygon fill="black" stroke="black" points="1316.04,-310.43 1325.87,-306.48 1315.72,-303.43 1316.04,-310.43"/>
+<path fill="none" stroke="black" d="M2386.26,-696.99C2354.28,-656.56 2265.87,-554.36 2164,-519 2047.31,-478.5 1666.24,-468.07 1536.06,-465.66"/>
+<polygon fill="black" stroke="black" points="1535.74,-462.16 1525.68,-465.48 1535.62,-469.16 1535.74,-462.16"/>
</g>
<!-- gstreamer->sndio -->
<g id="edge47" class="edge">
<title>gstreamer->sndio</title>
-<path fill="none" stroke="black" d="M70.58,-563.3C38.36,-551.88 0,-530.76 0,-494.87 0,-494.87 0,-494.87 0,-216 0,-203 817.68,-158.35 1021.44,-147.43"/>
-<polygon fill="black" stroke="black" points="1021.7,-150.92 1031.5,-146.89 1021.33,-143.93 1021.7,-150.92"/>
+<path fill="none" stroke="black" d="M2437.73,-701.03C2485.08,-682.76 2559,-644.2 2559,-581.5 2559,-581.5 2559,-581.5 2559,-427 2559,-292.64 1499.42,-243.35 1256.3,-233.81"/>
+<polygon fill="black" stroke="black" points="1256.13,-230.3 1246,-233.41 1255.86,-237.29 1256.13,-230.3"/>
</g>
<!-- gstreamer->PulseAudio -->
<g id="edge88" class="edge">
<title>gstreamer->PulseAudio</title>
-<path fill="none" stroke="black" d="M133.22,-558.53C175.14,-524.29 279.29,-445.07 382,-413 453.9,-390.55 665.75,-382.28 778.49,-379.41"/>
-<polygon fill="black" stroke="black" points="778.84,-382.91 788.75,-379.16 778.67,-375.91 778.84,-382.91"/>
+<path fill="none" stroke="black" d="M2402.74,-696.66C2414.3,-638.77 2443.1,-448.34 2345,-354 2328.04,-337.69 2193.89,-327.61 2105.62,-322.68"/>
+<polygon fill="black" stroke="black" points="2105.81,-319.18 2095.63,-322.13 2105.42,-326.17 2105.81,-319.18"/>
</g>
<!-- gstreamer->PipeWire -->
<g id="edge18" class="edge">
<title>gstreamer->PipeWire</title>
-<path fill="none" stroke="black" d="M103.51,-557.98C97.77,-547.68 91.36,-533.96 89,-520.74 80.55,-473.35 74.4,-453.76 100,-413 165.98,-307.94 310.42,-253.62 388.11,-231.05"/>
-<polygon fill="black" stroke="black" points="389.49,-234.3 398.16,-228.2 387.58,-227.57 389.49,-234.3"/>
+<path fill="none" stroke="black" d="M2441.17,-702.01C2491.36,-687.84 2568.95,-665.23 2573,-659.74 2648.59,-557.14 2592.41,-498.95 2573,-373 2571.65,-364.25 2572.6,-360.86 2567,-354 2522.64,-299.62 2447.28,-265.34 2397.56,-247.42"/>
+<polygon fill="black" stroke="black" points="2398.58,-244.06 2387.98,-244.05 2396.25,-250.67 2398.58,-244.06"/>
</g>
<!-- sox -->
-<g id="node16" class="node">
+<g id="node19" class="node">
<title>sox</title>
-<g id="a_node16"><a xlink:href="http://sox.sourceforge.net/Docs/Features" xlink:title="sox">
-<ellipse fill="lightgrey" stroke="black" cx="1490" cy="-648.74" rx="27" ry="18"/>
-<text text-anchor="middle" x="1490" y="-645.04" font-family="Times,serif" font-size="14.00">sox</text>
+<g id="a_node19"><a xlink:href="http://sox.sourceforge.net/Docs/Features" xlink:title="sox">
+<ellipse fill="lightgrey" stroke="black" cx="1188" cy="-787.74" rx="27" ry="18"/>
+<text text-anchor="middle" x="1188" y="-784.04" font-family="Times,serif" font-size="14.00">sox</text>
</a>
</g>
</g>
<!-- sox->ALSA -->
<g id="edge24" class="edge">
<title>sox->ALSA</title>
-<path fill="none" stroke="black" d="M1463.01,-646.34C1370.5,-641.3 1070.19,-622.8 1039,-593.74 1019.77,-575.82 1016.57,-544.83 1017.21,-522.32"/>
-<polygon fill="black" stroke="black" points="1020.72,-522.22 1017.78,-512.04 1013.73,-521.83 1020.72,-522.22"/>
+<path fill="none" stroke="black" d="M1214.87,-785.57C1318.99,-780.83 1692.26,-761.93 1736,-732.74 1760.84,-716.17 1774.93,-683.98 1782.25,-660.83"/>
+<polygon fill="black" stroke="black" points="1785.61,-661.81 1785.06,-651.23 1778.89,-659.84 1785.61,-661.81"/>
</g>
<!-- sox->sndio -->
<g id="edge25" class="edge">
<title>sox->sndio</title>
-<path fill="none" stroke="black" d="M1495.57,-630.98C1517.53,-563.57 1594.58,-312.92 1547,-253 1533.19,-235.61 1225.03,-175.2 1109.89,-153.14"/>
-<polygon fill="black" stroke="black" points="1110.48,-149.69 1100,-151.25 1109.17,-156.57 1110.48,-149.69"/>
+<path fill="none" stroke="black" d="M1182.07,-770.02C1175.53,-751.85 1164.54,-722.02 1154,-696.74 1080.5,-520.48 875.84,-453.83 989,-300 1027.57,-247.56 1106.34,-234.42 1157.88,-231.73"/>
+<polygon fill="black" stroke="black" points="1158.27,-235.22 1168.12,-231.32 1157.99,-228.23 1158.27,-235.22"/>
</g>
<!-- sox->PulseAudio -->
<g id="edge23" class="edge">
<title>sox->PulseAudio</title>
-<path fill="none" stroke="black" d="M1474.82,-623.55C1461.12,-603.45 1439.26,-575.39 1414,-557.74 1256.8,-447.88 1029.02,-402.63 917.53,-386.2"/>
-<polygon fill="black" stroke="black" points="1471.91,-625.49 1480.36,-631.88 1477.74,-621.62 1471.91,-625.49"/>
-<polygon fill="black" stroke="black" points="917.83,-382.71 907.43,-384.75 916.83,-389.64 917.83,-382.71"/>
+<path fill="none" stroke="black" d="M1195.74,-759.93C1213.35,-700.14 1257.27,-558.11 1288,-519 1297.29,-507.18 1302.75,-507.11 1316,-500 1371.86,-470.04 1389.23,-469.74 1448,-446 1468.3,-437.8 1609.83,-378.57 1631,-373 1661.55,-364.96 1848.61,-341.14 1954.7,-327.99"/>
+<polygon fill="black" stroke="black" points="1192.31,-759.19 1192.86,-769.77 1199.03,-761.15 1192.31,-759.19"/>
+<polygon fill="black" stroke="black" points="1955.22,-331.45 1964.71,-326.75 1954.36,-324.5 1955.22,-331.45"/>
</g>
<!-- libao -->
-<g id="node17" class="node">
+<g id="node20" class="node">
<title>libao</title>
-<g id="a_node17"><a xlink:href="https://www.xiph.org/ao/" xlink:title="libao">
-<ellipse fill="lightgrey" stroke="black" cx="1570" cy="-575.74" rx="33.29" ry="18"/>
-<text text-anchor="middle" x="1570" y="-572.04" font-family="Times,serif" font-size="14.00">libao</text>
+<g id="a_node20"><a xlink:href="https://www.xiph.org/ao/" xlink:title="libao">
+<ellipse fill="lightgrey" stroke="black" cx="1112" cy="-714.74" rx="33.29" ry="18"/>
+<text text-anchor="middle" x="1112" y="-711.04" font-family="Times,serif" font-size="14.00">libao</text>
</a>
</g>
</g>
<!-- sox->libao -->
<g id="edge22" class="edge">
<title>sox->libao</title>
-<path fill="none" stroke="black" d="M1505.81,-633.71C1517.19,-623.61 1532.77,-609.78 1545.73,-598.28"/>
-<polygon fill="black" stroke="black" points="1548.25,-600.73 1553.4,-591.47 1543.6,-595.49 1548.25,-600.73"/>
+<path fill="none" stroke="black" d="M1172.98,-772.71C1162.34,-762.77 1147.84,-749.22 1135.65,-737.83"/>
+<polygon fill="black" stroke="black" points="1137.73,-734.99 1128.03,-730.72 1132.95,-740.1 1137.73,-734.99"/>
</g>
<!-- libao->ALSA -->
<g id="edge27" class="edge">
<title>libao->ALSA</title>
-<path fill="none" stroke="black" d="M1538.45,-570.16C1446.8,-556.85 1180.02,-518.11 1069.18,-502.01"/>
-<polygon fill="black" stroke="black" points="1069.35,-498.5 1058.95,-500.53 1068.34,-505.43 1069.35,-498.5"/>
+<path fill="none" stroke="black" d="M1144.28,-710.09C1220.15,-701.5 1415.7,-679.24 1579,-659.74 1635.95,-652.94 1701.54,-644.81 1744.05,-639.51"/>
+<polygon fill="black" stroke="black" points="1744.59,-642.97 1754.08,-638.25 1743.73,-636.02 1744.59,-642.97"/>
</g>
<!-- libao->OSS -->
<g id="edge26" class="edge">
<title>libao->OSS</title>
-<path fill="none" stroke="black" d="M1557.94,-558.65C1550.32,-548.15 1540.54,-533.97 1533,-520.74 1489.15,-443.78 1513.61,-400.59 1449,-340 1436.04,-327.84 1418.38,-319.75 1402.14,-314.45"/>
-<polygon fill="black" stroke="black" points="1402.84,-311.01 1392.26,-311.49 1400.84,-317.71 1402.84,-311.01"/>
+<path fill="none" stroke="black" d="M1135.61,-701.72C1154.4,-691.65 1180.95,-676.3 1202,-659.74 1237.5,-631.8 1246.29,-623.67 1274,-588 1301.87,-552.12 1289.09,-526.49 1326,-500 1361.39,-474.6 1411.3,-466.87 1447.13,-464.87"/>
+<polygon fill="black" stroke="black" points="1447.46,-468.36 1457.31,-464.43 1447.16,-461.36 1447.46,-468.36"/>
</g>
<!-- libao->sndio -->
<g id="edge33" class="edge">
<title>libao->sndio</title>
-<path fill="none" stroke="black" d="M1596.32,-564.79C1623.2,-552.71 1661,-529.55 1661,-494.87 1661,-494.87 1661,-494.87 1661,-259.5 1661,-231.32 1663.91,-216.72 1642,-199 1601.2,-166 1242.55,-150.86 1113.23,-146.44"/>
-<polygon fill="black" stroke="black" points="1112.99,-142.93 1102.88,-146.09 1112.76,-149.92 1112.99,-142.93"/>
+<path fill="none" stroke="black" d="M1085.57,-703.43C1060.3,-693.28 1021.37,-676.85 989,-659.74 949.15,-638.68 941.32,-629.73 903,-606 827.18,-559.04 732,-590.18 732,-501 732,-501 732,-501 732,-317 732,-274.06 1036.67,-245.38 1158,-235.66"/>
+<polygon fill="black" stroke="black" points="1158.44,-239.14 1168.13,-234.86 1157.88,-232.16 1158.44,-239.14"/>
</g>
<!-- libao->PulseAudio -->
<g id="edge29" class="edge">
<title>libao->PulseAudio</title>
-<path fill="none" stroke="black" d="M1544.08,-564.18C1520.65,-554.21 1485.56,-538.22 1457,-520.74 1389.73,-479.58 1389.71,-441.06 1316,-413 1306.91,-409.54 1049.11,-391.53 921.37,-382.78"/>
-<polygon fill="black" stroke="black" points="921.5,-379.28 911.29,-382.09 921.02,-386.27 921.5,-379.28"/>
+<path fill="none" stroke="black" d="M1118.69,-696.9C1136.82,-651.91 1187.55,-530.33 1218,-500 1256.59,-461.57 1277.12,-465.42 1328,-446 1356.13,-435.26 1559.49,-378.98 1589,-373 1654.43,-359.75 1671.75,-362.22 1738,-354 1811.47,-344.88 1895.45,-334.78 1954.06,-327.78"/>
+<polygon fill="black" stroke="black" points="1954.83,-331.22 1964.34,-326.56 1954,-324.27 1954.83,-331.22"/>
</g>
<!-- libao->aRts -->
<g id="edge28" class="edge">
<title>libao->aRts</title>
-<path fill="none" stroke="black" d="M1602.84,-572.31C1636.22,-567.9 1686.4,-555.52 1711,-520.74 1790.14,-408.84 1807.9,-238.48 1811.87,-172.47"/>
-<polygon fill="black" stroke="black" points="1815.39,-172.26 1812.43,-162.09 1808.4,-171.89 1815.39,-172.26"/>
+<path fill="none" stroke="black" d="M1089.04,-701.38C1072.54,-691.67 1050.55,-676.94 1035,-659.74 943.64,-558.69 878.05,-406.42 854.05,-345.53"/>
+<polygon fill="black" stroke="black" points="857.19,-343.96 850.3,-335.91 850.67,-346.5 857.19,-343.96"/>
</g>
<!-- ESD -->
-<g id="node19" class="node">
+<g id="node22" class="node">
<title>ESD</title>
-<ellipse fill="lightgrey" stroke="black" cx="1697" cy="-144" rx="31.4" ry="18"/>
-<text text-anchor="middle" x="1697" y="-140.3" font-family="Times,serif" font-size="14.00">ESD</text>
+<polygon fill="orange" stroke="black" points="1065.54,-310.54 1065.54,-325.46 1045.89,-336 1018.11,-336 998.46,-325.46 998.46,-310.54 1018.11,-300 1045.89,-300 1065.54,-310.54"/>
+<text text-anchor="middle" x="1032" y="-314.3" font-family="Times,serif" font-size="14.00">ESD</text>
</g>
<!-- libao->ESD -->
<g id="edge30" class="edge">
<title>libao->ESD</title>
-<path fill="none" stroke="black" d="M1602.52,-571.19C1624.82,-567.12 1653.6,-558.41 1672,-539.74 1704.62,-506.65 1737,-387.47 1737,-341 1737,-341 1737,-341 1737,-216 1737,-198.36 1727.51,-181.06 1717.78,-167.95"/>
-<polygon fill="black" stroke="black" points="1720.4,-165.63 1711.44,-159.99 1714.92,-169.99 1720.4,-165.63"/>
+<path fill="none" stroke="black" d="M1099.41,-697.88C1073.48,-664.11 1014.84,-581.55 994,-501 979.81,-446.16 1002.93,-380.97 1018.88,-345.4"/>
+<polygon fill="black" stroke="black" points="1022.12,-346.73 1023.15,-336.19 1015.77,-343.79 1022.12,-346.73"/>
</g>
<!-- NAS -->
-<g id="node20" class="node">
+<g id="node23" class="node">
<title>NAS</title>
-<g id="a_node20"><a xlink:href="http://radscan.com/nas.html" xlink:title="Network Audio System/Server">
-<ellipse fill="lightgrey" stroke="black" cx="1954" cy="-493.87" rx="151.37" ry="18"/>
-<text text-anchor="middle" x="1954" y="-490.17" font-family="Times,serif" font-size="14.00">Network Audio System/Server</text>
+<g id="a_node23"><a xlink:href="http://radscan.com/nas.html" xlink:title="Network Audio System/Server">
+<polygon fill="orange" stroke="black" points="893.83,-625.41 893.83,-640.33 797.86,-650.87 662.14,-650.87 566.17,-640.33 566.17,-625.41 662.14,-614.87 797.86,-614.87 893.83,-625.41"/>
+<text text-anchor="middle" x="730" y="-629.17" font-family="Times,serif" font-size="14.00">Network Audio System/Server</text>
</a>
</g>
</g>
<!-- libao->NAS -->
<g id="edge31" class="edge">
<title>libao->NAS</title>
-<path fill="none" stroke="black" d="M1600.45,-568.41C1658.64,-556.3 1787.38,-529.53 1872.39,-511.84"/>
-<polygon fill="black" stroke="black" points="1873.2,-515.25 1882.27,-509.79 1871.77,-508.4 1873.2,-515.25"/>
+<path fill="none" stroke="black" d="M1081.71,-707.41C1025.1,-695.57 901.35,-669.7 816.83,-652.02"/>
+<polygon fill="black" stroke="black" points="817.48,-648.59 806.98,-649.96 816.05,-655.44 817.48,-648.59"/>
</g>
<!-- libao->RoarAudio -->
<g id="edge32" class="edge">
<title>libao->RoarAudio</title>
-<path fill="none" stroke="black" d="M1573.2,-557.53C1581.64,-511.05 1604.44,-379.01 1612,-268 1612.45,-261.35 1614.68,-259.11 1612,-253 1610.13,-248.73 1607.44,-244.74 1604.36,-241.11"/>
-<polygon fill="black" stroke="black" points="1606.63,-238.42 1597.12,-233.74 1601.63,-243.33 1606.63,-238.42"/>
+<path fill="none" stroke="black" d="M1110.87,-696.44C1107.42,-643.63 1097.02,-484.18 1092.8,-419.6"/>
+<polygon fill="black" stroke="black" points="1096.28,-419.13 1092.13,-409.38 1089.29,-419.59 1096.28,-419.13"/>
</g>
<!-- ESD->ALSA -->
<g id="edge40" class="edge">
<title>ESD->ALSA</title>
-<path fill="none" stroke="black" d="M1665.68,-145.98C1566.37,-149.43 1259.67,-162.81 1168,-199 1052.08,-244.76 1085.18,-332.47 1041,-449 1038.81,-454.77 1036.17,-460.81 1033.5,-466.51"/>
-<polygon fill="black" stroke="black" points="1030.28,-465.13 1029.07,-475.66 1036.58,-468.19 1030.28,-465.13"/>
+<path fill="none" stroke="black" d="M1065.74,-319.73C1161.99,-323.09 1444.06,-341.78 1647,-446 1691.9,-469.06 1702.93,-479.22 1734,-519 1745.16,-533.29 1765.05,-576.68 1777.6,-605.31"/>
+<polygon fill="black" stroke="black" points="1774.51,-606.98 1781.71,-614.75 1780.93,-604.19 1774.51,-606.98"/>
</g>
<!-- ESD->OSS -->
<g id="edge39" class="edge">
<title>ESD->OSS</title>
-<path fill="none" stroke="black" d="M1666.7,-149.11C1617.9,-156.43 1525.39,-173.37 1506,-199 1496.35,-211.76 1497.03,-221.75 1506,-235 1516.61,-250.68 1574.77,-239.51 1551,-268 1532.42,-290.27 1452.82,-298.41 1402.12,-301.35"/>
-<polygon fill="black" stroke="black" points="1401.89,-297.86 1392.09,-301.89 1402.26,-304.85 1401.89,-297.86"/>
+<path fill="none" stroke="black" d="M1060.9,-328.05C1141.34,-353.23 1367.68,-424.08 1456.03,-451.74"/>
+<polygon fill="black" stroke="black" points="1455.03,-455.09 1465.62,-454.74 1457.12,-448.41 1455.03,-455.09"/>
</g>
<!-- RoarAudio->sndio -->
<g id="edge35" class="edge">
<title>RoarAudio->sndio</title>
-<path fill="none" stroke="black" d="M1521.18,-208.6C1420.7,-194.53 1203.81,-164.16 1110.8,-151.13"/>
-<polygon fill="black" stroke="black" points="1111.27,-147.67 1100.88,-149.74 1110.3,-154.6 1111.27,-147.67"/>
+<path fill="none" stroke="black" d="M1103.41,-373.09C1123.8,-345.32 1164.49,-289.9 1188.36,-257.4"/>
+<polygon fill="black" stroke="black" points="1191.23,-259.4 1194.32,-249.27 1185.58,-255.26 1191.23,-259.4"/>
</g>
<!-- RoarAudio->PulseAudio -->
<g id="edge36" class="edge">
<title>RoarAudio->PulseAudio</title>
-<path fill="none" stroke="black" d="M1515.9,-220.67C1450.44,-224.5 1341.14,-233.4 1249,-253 1151.25,-273.79 1130.51,-292.59 1035,-322 990.94,-335.57 940.71,-350.26 903.87,-360.89"/>
-<polygon fill="black" stroke="black" points="902.49,-357.64 893.85,-363.77 904.43,-364.37 902.49,-357.64"/>
+<path fill="none" stroke="black" d="M1134.39,-378.65C1144.08,-376.46 1154.34,-374.42 1164,-373 1451.82,-330.79 1798.31,-321.54 1950.23,-319.54"/>
+<polygon fill="black" stroke="black" points="1950.43,-323.04 1960.39,-319.41 1950.34,-316.04 1950.43,-323.04"/>
</g>
<!-- RoarAudio->aRts -->
<g id="edge38" class="edge">
<title>RoarAudio->aRts</title>
-<path fill="none" stroke="black" d="M1614.81,-203.88C1659.96,-190.46 1732.08,-169.04 1775.74,-156.07"/>
-<polygon fill="black" stroke="black" points="1776.82,-159.4 1785.4,-153.2 1774.82,-152.69 1776.82,-159.4"/>
+<path fill="none" stroke="black" d="M1049.66,-378.12C1002.67,-364.61 926.65,-342.76 881.38,-329.74"/>
+<polygon fill="black" stroke="black" points="882.24,-326.35 871.66,-326.95 880.3,-333.08 882.24,-326.35"/>
</g>
<!-- RoarAudio->ESD -->
<g id="edge37" class="edge">
<title>RoarAudio->ESD</title>
-<path fill="none" stroke="black" d="M1600.39,-200.77C1619.85,-189.53 1646.38,-174.22 1666.71,-162.49"/>
-<polygon fill="black" stroke="black" points="1668.66,-165.4 1675.57,-157.37 1665.16,-159.34 1668.66,-165.4"/>
+<path fill="none" stroke="black" d="M1077.02,-373.17C1069.78,-364.46 1060.79,-353.65 1052.76,-343.98"/>
+<polygon fill="black" stroke="black" points="1055.37,-341.65 1046.29,-336.2 1049.99,-346.13 1055.37,-341.65"/>
</g>
<!-- libcanberra -->
-<g id="node22" class="node">
+<g id="node25" class="node">
<title>libcanberra</title>
-<g id="a_node22"><a xlink:href="http://git.0pointer.net/libcanberra.git/tree/src/driver-order.c" xlink:title="libcanberra">
-<ellipse fill="lightgrey" stroke="black" cx="573" cy="-648.74" rx="63.89" ry="18"/>
-<text text-anchor="middle" x="573" y="-645.04" font-family="Times,serif" font-size="14.00">libcanberra</text>
+<g id="a_node25"><a xlink:href="http://git.0pointer.net/libcanberra.git/tree/src/driver-order.c" xlink:title="libcanberra">
+<ellipse fill="lightgrey" stroke="black" cx="2271" cy="-787.74" rx="63.89" ry="18"/>
+<text text-anchor="middle" x="2271" y="-784.04" font-family="Times,serif" font-size="14.00">libcanberra</text>
</a>
</g>
</g>
<!-- libcanberra->ALSA -->
<g id="edge43" class="edge">
<title>libcanberra->ALSA</title>
-<path fill="none" stroke="black" d="M635.9,-645.5C701.09,-641.24 804.76,-628.98 887,-593.74 929.24,-575.64 970.54,-541.64 995.64,-518.63"/>
-<polygon fill="black" stroke="black" points="998.27,-520.96 1003.19,-511.58 993.49,-515.84 998.27,-520.96"/>
+<path fill="none" stroke="black" d="M2226.43,-774.79C2190.92,-764.82 2140.17,-749.57 2097,-732.74 2062.18,-719.17 2056.06,-709.68 2021,-696.74 1956.26,-672.85 1878.35,-653.59 1831.3,-642.95"/>
+<polygon fill="black" stroke="black" points="1831.99,-639.51 1821.46,-640.75 1830.46,-646.35 1831.99,-639.51"/>
</g>
<!-- libcanberra->OSS -->
<g id="edge42" class="edge">
<title>libcanberra->OSS</title>
-<path fill="none" stroke="black" d="M552.78,-631.54C542.33,-621.83 530.62,-608.51 525,-593.74 508.07,-549.2 490.81,-479.13 539,-413 574.64,-364.09 605.38,-374.03 664,-359 788.27,-327.13 1183.37,-311.01 1315.49,-306.41"/>
-<polygon fill="black" stroke="black" points="1315.76,-309.91 1325.64,-306.06 1315.52,-302.91 1315.76,-309.91"/>
+<path fill="none" stroke="black" d="M2267.73,-769.75C2259.61,-731.15 2235.41,-635.37 2185,-573 2178.26,-564.66 2115.11,-522.58 2105,-519 1999.7,-481.66 1657.28,-469.29 1535.49,-466.01"/>
+<polygon fill="black" stroke="black" points="1535.5,-462.51 1525.41,-465.75 1535.32,-469.51 1535.5,-462.51"/>
</g>
<!-- libcanberra->PulseAudio -->
<g id="edge41" class="edge">
<title>libcanberra->PulseAudio</title>
-<path fill="none" stroke="black" d="M597.1,-631.82C610.64,-622.02 627.14,-608.52 639,-593.74 678.5,-544.53 660.26,-513.43 703,-467 732.02,-435.48 774.75,-411.42 806.85,-396.31"/>
-<polygon fill="black" stroke="black" points="808.39,-399.45 816.02,-392.1 805.47,-393.09 808.39,-399.45"/>
+<path fill="none" stroke="black" d="M2282.57,-769.71C2300,-742.35 2331,-686.33 2331,-633.87 2331,-633.87 2331,-633.87 2331,-390 2331,-367.37 2315.3,-364 2295,-354 2262.69,-338.08 2172.54,-328.64 2105.89,-323.65"/>
+<polygon fill="black" stroke="black" points="2106.05,-320.16 2095.82,-322.92 2105.54,-327.14 2106.05,-320.16"/>
</g>
<!-- libcanberra->gstreamer -->
<g id="edge44" class="edge">
<title>libcanberra->gstreamer</title>
-<path fill="none" stroke="black" d="M514.86,-641.26C439.08,-632.43 302.59,-615.24 187,-593.74 180.87,-592.6 174.48,-591.29 168.14,-589.92"/>
-<polygon fill="black" stroke="black" points="168.78,-586.47 158.26,-587.72 167.26,-593.31 168.78,-586.47"/>
+<path fill="none" stroke="black" d="M2298.77,-771.33C2317.52,-760.94 2342.45,-747.11 2362.75,-735.85"/>
+<polygon fill="black" stroke="black" points="2364.67,-738.78 2371.72,-730.87 2361.28,-732.66 2364.67,-738.78"/>
</g>
<!-- OpenAL -->
-<g id="node23" class="node">
+<g id="node26" class="node">
<title>OpenAL</title>
-<g id="a_node23"><a xlink:href="https://www.openal-soft.org/" xlink:title="OpenAL">
-<ellipse fill="lightgrey" stroke="black" cx="963" cy="-648.74" rx="47.39" ry="18"/>
-<text text-anchor="middle" x="963" y="-645.04" font-family="Times,serif" font-size="14.00">OpenAL</text>
+<g id="a_node26"><a xlink:href="https://www.openal-soft.org/" xlink:title="OpenAL">
+<ellipse fill="lightgrey" stroke="black" cx="1668" cy="-787.74" rx="47.39" ry="18"/>
+<text text-anchor="middle" x="1668" y="-784.04" font-family="Times,serif" font-size="14.00">OpenAL</text>
</a>
</g>
</g>
<!-- OpenAL->portaudio -->
<g id="edge52" class="edge">
<title>OpenAL->portaudio</title>
-<path fill="none" stroke="black" d="M990.52,-633.88C1012.03,-623.05 1042.17,-607.88 1065.98,-595.88"/>
-<polygon fill="black" stroke="black" points="1067.74,-598.92 1075.09,-591.3 1064.59,-592.67 1067.74,-598.92"/>
+<path fill="none" stroke="black" d="M1631.77,-776.11C1590.37,-763.97 1522.37,-744.01 1475.96,-730.4"/>
+<polygon fill="black" stroke="black" points="1476.69,-726.97 1466.11,-727.51 1474.72,-733.68 1476.69,-726.97"/>
</g>
<!-- OpenAL->ALSA -->
<g id="edge49" class="edge">
<title>OpenAL->ALSA</title>
-<path fill="none" stroke="black" d="M969.32,-630.8C979.2,-604.28 998.41,-552.77 1010.13,-521.33"/>
-<polygon fill="black" stroke="black" points="1013.44,-522.48 1013.65,-511.89 1006.88,-520.04 1013.44,-522.48"/>
+<path fill="none" stroke="black" d="M1712.84,-781.59C1732.86,-776.97 1755.03,-768.24 1769,-751.74 1790.34,-726.54 1792.88,-687.14 1791.75,-660.93"/>
+<polygon fill="black" stroke="black" points="1795.24,-660.67 1791.11,-650.91 1788.25,-661.11 1795.24,-660.67"/>
</g>
<!-- OpenAL->JACK -->
<g id="edge53" class="edge">
<title>OpenAL->JACK</title>
-<path fill="none" stroke="black" d="M916.64,-644.79C768.15,-635.22 313.43,-605.05 303,-593.74 231.56,-516.22 268.7,-439.3 337,-359 353.79,-339.26 379.63,-325.74 401.23,-317.17"/>
-<polygon fill="black" stroke="black" points="402.68,-320.36 410.81,-313.57 400.22,-313.81 402.68,-320.36"/>
+<path fill="none" stroke="black" d="M1715.67,-786.58C1802.48,-785.19 1981.08,-776.89 2021,-732.74 2042.59,-708.86 2037.62,-612.98 2033.64,-565.26"/>
+<polygon fill="black" stroke="black" points="2037.1,-564.7 2032.74,-555.04 2030.13,-565.31 2037.1,-564.7"/>
</g>
<!-- OpenAL->OSS -->
<g id="edge50" class="edge">
<title>OpenAL->OSS</title>
-<path fill="none" stroke="black" d="M1009.98,-645.58C1120.07,-640.05 1387.47,-623.64 1414,-593.74 1430.82,-574.78 1451.99,-733.68 1391,-359 1389.61,-350.48 1390.68,-347.8 1387,-340 1385.29,-336.38 1383.14,-332.81 1380.79,-329.4"/>
-<polygon fill="black" stroke="black" points="1383.53,-327.21 1374.7,-321.36 1377.95,-331.44 1383.53,-327.21"/>
+<path fill="none" stroke="black" d="M1620.83,-785.56C1543.14,-782.5 1393.62,-771.6 1361,-732.74 1332.29,-698.54 1357.75,-652.59 1402,-573 1419.56,-541.41 1446.92,-510.23 1466.86,-489.55"/>
+<polygon fill="black" stroke="black" points="1469.61,-491.76 1474.11,-482.17 1464.61,-486.86 1469.61,-491.76"/>
</g>
<!-- OpenAL->sndio -->
<g id="edge54" class="edge">
<title>OpenAL->sndio</title>
-<path fill="none" stroke="black" d="M916.31,-645.28C775.4,-637.68 360.53,-613.82 303,-593.74 183.94,-552.17 117.69,-451.82 176,-340 226.63,-242.92 274.92,-235.9 378,-199 438.27,-177.42 876.87,-154.29 1021.14,-147.19"/>
-<polygon fill="black" stroke="black" points="1021.59,-150.68 1031.41,-146.69 1021.25,-143.69 1021.59,-150.68"/>
+<path fill="none" stroke="black" d="M1620.97,-785.09C1541.22,-781.31 1384.26,-769.31 1345,-732.74 1258.42,-652.1 1244.1,-615.42 1214,-501 1205.74,-469.61 1216,-460.46 1216,-428 1216,-428 1216,-428 1216,-317 1216,-297.64 1213.66,-275.95 1211.37,-259.32"/>
+<polygon fill="black" stroke="black" points="1214.8,-258.59 1209.9,-249.2 1207.88,-259.6 1214.8,-258.59"/>
</g>
<!-- OpenAL->PulseAudio -->
<g id="edge48" class="edge">
<title>OpenAL->PulseAudio</title>
-<path fill="none" stroke="black" d="M961.74,-630.59C958,-589.61 944.02,-484.13 896,-413 892.88,-408.39 888.97,-404.11 884.75,-400.25"/>
-<polygon fill="black" stroke="black" points="886.86,-397.45 876.94,-393.75 882.39,-402.84 886.86,-397.45"/>
+<path fill="none" stroke="black" d="M1714.91,-784.91C1839.57,-779.67 2172.25,-762.97 2211,-732.74 2283.52,-676.17 2281,-629.97 2281,-538 2281,-538 2281,-538 2281,-390 2281,-353.18 2180.42,-334.57 2106.1,-325.84"/>
+<polygon fill="black" stroke="black" points="2106.13,-322.32 2095.8,-324.67 2105.34,-329.27 2106.13,-322.32"/>
</g>
<!-- SoundIO -->
-<g id="node24" class="node">
+<g id="node27" class="node">
<title>SoundIO</title>
-<g id="a_node24"><a xlink:href="http://libsound.io/" xlink:title="SoundIO">
-<ellipse fill="lightgrey" stroke="black" cx="827" cy="-575.74" rx="50.89" ry="18"/>
-<text text-anchor="middle" x="827" y="-572.04" font-family="Times,serif" font-size="14.00">SoundIO</text>
+<g id="a_node27"><a xlink:href="http://libsound.io/" xlink:title="SoundIO">
+<ellipse fill="lightgrey" stroke="black" cx="1872" cy="-714.74" rx="50.89" ry="18"/>
+<text text-anchor="middle" x="1872" y="-711.04" font-family="Times,serif" font-size="14.00">SoundIO</text>
</a>
</g>
</g>
<!-- OpenAL->SoundIO -->
<g id="edge51" class="edge">
<title>OpenAL->SoundIO</title>
-<path fill="none" stroke="black" d="M936.13,-633.71C915.31,-622.84 886.25,-607.67 863.35,-595.72"/>
-<polygon fill="black" stroke="black" points="864.76,-592.51 854.28,-590.98 861.52,-598.71 864.76,-592.51"/>
+<path fill="none" stroke="black" d="M1709.94,-779.14C1737.99,-773.34 1775.41,-764.22 1807,-751.74 1817.93,-747.42 1829.31,-741.62 1839.44,-735.93"/>
+<polygon fill="black" stroke="black" points="1841.44,-738.82 1848.34,-730.79 1837.93,-732.76 1841.44,-738.82"/>
</g>
<!-- SoundIO->ALSA -->
<g id="edge57" class="edge">
<title>SoundIO->ALSA</title>
-<path fill="none" stroke="black" d="M858.87,-561.55C892.73,-547.54 946.24,-525.39 982.2,-510.51"/>
-<polygon fill="black" stroke="black" points="983.95,-513.58 991.85,-506.52 981.27,-507.11 983.95,-513.58"/>
+<path fill="none" stroke="black" d="M1855.2,-697.58C1843.48,-686.3 1827.63,-671.04 1814.37,-658.29"/>
+<polygon fill="black" stroke="black" points="1816.55,-655.53 1806.92,-651.11 1811.7,-660.57 1816.55,-655.53"/>
</g>
<!-- SoundIO->JACK -->
<g id="edge55" class="edge">
<title>SoundIO->JACK</title>
-<path fill="none" stroke="black" d="M787.91,-564.13C755.51,-554.66 708.66,-539.44 670,-520.74 616.78,-495 602.44,-487.99 558,-449 516.21,-412.33 477.3,-359.92 456.27,-329.48"/>
-<polygon fill="black" stroke="black" points="459.11,-327.43 450.58,-321.15 453.33,-331.38 459.11,-327.43"/>
+<path fill="none" stroke="black" d="M1897.84,-699.17C1906.92,-693.42 1916.89,-686.37 1925,-678.74 1944.93,-660.01 1988.75,-598.76 2013.35,-563.54"/>
+<polygon fill="black" stroke="black" points="2016.32,-565.4 2019.16,-555.19 2010.58,-561.4 2016.32,-565.4"/>
</g>
<!-- SoundIO->PulseAudio -->
<g id="edge56" class="edge">
<title>SoundIO->PulseAudio</title>
-<path fill="none" stroke="black" d="M853.05,-560.09C866.79,-550.78 882.36,-537.36 890,-520.74 907.92,-481.78 885.89,-432.93 868.38,-403.66"/>
-<polygon fill="black" stroke="black" points="871.18,-401.52 862.92,-394.88 865.23,-405.22 871.18,-401.52"/>
+<path fill="none" stroke="black" d="M1882.95,-697C1911.72,-652.24 1990.09,-525.24 2031,-409 2039.31,-385.4 2048.03,-378.51 2043,-354 2042.45,-351.3 2041.67,-348.55 2040.77,-345.84"/>
+<polygon fill="black" stroke="black" points="2043.97,-344.4 2037.08,-336.35 2037.44,-346.94 2043.97,-344.4"/>
</g>
<!-- RtAudio -->
-<g id="node25" class="node">
+<g id="node28" class="node">
<title>RtAudio</title>
-<g id="a_node25"><a xlink:href="https://www.music.mcgill.ca/~gary/rtaudio/apinotes.html" xlink:title="RtAudio">
-<ellipse fill="lightgrey" stroke="black" cx="582" cy="-575.74" rx="48.19" ry="18"/>
-<text text-anchor="middle" x="582" y="-572.04" font-family="Times,serif" font-size="14.00">RtAudio</text>
+<g id="a_node28"><a xlink:href="https://www.music.mcgill.ca/~gary/rtaudio/apinotes.html" xlink:title="RtAudio">
+<ellipse fill="lightgrey" stroke="black" cx="2154" cy="-714.74" rx="48.19" ry="18"/>
+<text text-anchor="middle" x="2154" y="-711.04" font-family="Times,serif" font-size="14.00">RtAudio</text>
</a>
</g>
</g>
<!-- RtAudio->ALSA -->
<g id="edge59" class="edge">
<title>RtAudio->ALSA</title>
-<path fill="none" stroke="black" d="M624.4,-567.01C706.3,-552.07 885.78,-519.35 971.96,-503.63"/>
-<polygon fill="black" stroke="black" points="972.78,-507.04 981.99,-501.8 971.53,-500.15 972.78,-507.04"/>
+<path fill="none" stroke="black" d="M2113.54,-704.89C2043.84,-689.64 1901.79,-658.55 1831.02,-643.07"/>
+<polygon fill="black" stroke="black" points="1831.63,-639.62 1821.12,-640.9 1830.14,-646.45 1831.63,-639.62"/>
</g>
<!-- RtAudio->JACK -->
<g id="edge60" class="edge">
<title>RtAudio->JACK</title>
-<path fill="none" stroke="black" d="M569.16,-558.29C564.83,-552.53 560.06,-545.95 556,-539.74 500.21,-454.56 470.94,-438.63 442,-341 441.17,-338.19 440.57,-335.2 440.15,-332.19"/>
-<polygon fill="black" stroke="black" points="443.64,-331.81 439.34,-322.13 436.66,-332.38 443.64,-331.81"/>
+<path fill="none" stroke="black" d="M2121.24,-701.52C2109.85,-695.98 2097.76,-688.45 2089,-678.74 2073.33,-661.37 2051.6,-600.72 2039.68,-564.96"/>
+<polygon fill="black" stroke="black" points="2042.91,-563.56 2036.45,-555.16 2036.26,-565.75 2042.91,-563.56"/>
</g>
<!-- RtAudio->OSS -->
<g id="edge58" class="edge">
<title>RtAudio->OSS</title>
-<path fill="none" stroke="black" d="M584.51,-557.7C590.13,-525.31 606.63,-454.41 648,-413 692.8,-368.16 718.44,-374.11 780,-359 975.82,-310.94 1218.51,-305 1315.75,-304.71"/>
-<polygon fill="black" stroke="black" points="1315.79,-308.21 1325.79,-304.7 1315.79,-301.21 1315.79,-308.21"/>
-<text text-anchor="middle" x="683" y="-427.3" font-family="Times,serif" font-size="14.00">OSS 4.0+</text>
+<path fill="none" stroke="black" d="M2139.53,-697.47C2135.05,-691.83 2130.4,-685.27 2127,-678.74 2092.63,-612.76 2135.63,-564.79 2077,-519 2050.07,-497.97 1804.02,-504.2 1770,-501 1685.05,-493.02 1586.08,-479.09 1532.13,-471.1"/>
+<polygon fill="black" stroke="black" points="1532.36,-467.59 1521.95,-469.58 1531.33,-474.52 1532.36,-467.59"/>
+<text text-anchor="middle" x="2146" y="-576.8" font-family="Times,serif" font-size="14.00">OSS 4.0+</text>
</g>
<!-- RtAudio->PulseAudio -->
<g id="edge61" class="edge">
<title>RtAudio->PulseAudio</title>
-<path fill="none" stroke="black" d="M624.97,-567.5C689.49,-556.25 805.33,-534.45 819,-520.74 834.95,-504.74 844.19,-442.02 848.34,-405.26"/>
-<polygon fill="black" stroke="black" points="851.83,-405.52 849.42,-395.2 844.87,-404.77 851.83,-405.52"/>
+<path fill="none" stroke="black" d="M2161.92,-696.96C2173.36,-670.69 2192.37,-618.19 2185,-573 2169.91,-480.48 2162.59,-455.46 2118,-373 2112.88,-363.54 2111.44,-360.68 2103,-354 2095.06,-347.71 2085.8,-342.23 2076.56,-337.6"/>
+<polygon fill="black" stroke="black" points="2077.9,-334.36 2067.37,-333.24 2074.9,-340.68 2077.9,-334.36"/>
</g>
<!-- JUCE -->
-<g id="node26" class="node">
+<g id="node29" class="node">
<title>JUCE</title>
-<ellipse fill="lightgrey" stroke="black" cx="426" cy="-575.74" rx="36" ry="18"/>
-<text text-anchor="middle" x="426" y="-572.04" font-family="Times,serif" font-size="14.00">JUCE</text>
+<ellipse fill="lightgrey" stroke="black" cx="1976" cy="-714.74" rx="36" ry="18"/>
+<text text-anchor="middle" x="1976" y="-711.04" font-family="Times,serif" font-size="14.00">JUCE</text>
</g>
<!-- JUCE->ALSA -->
<g id="edge62" class="edge">
<title>JUCE->ALSA</title>
-<path fill="none" stroke="black" d="M458.94,-568.7C478.17,-565.27 502.92,-561.02 525,-557.74 655.26,-538.37 688.36,-537.37 819,-520.74 870.96,-514.13 930.47,-506.46 971.17,-501.19"/>
-<polygon fill="black" stroke="black" points="971.63,-504.66 981.1,-499.91 970.73,-497.72 971.63,-504.66"/>
+<path fill="none" stroke="black" d="M1948.64,-702.84C1943.16,-700.75 1937.41,-698.62 1932,-696.74 1906.51,-687.87 1898.93,-689.08 1874,-678.74 1856.39,-671.43 1837.56,-661.71 1822.11,-653.18"/>
+<polygon fill="black" stroke="black" points="1823.41,-649.89 1812.97,-648.06 1819.98,-656 1823.41,-649.89"/>
</g>
<!-- JUCE->JACK -->
<g id="edge63" class="edge">
<title>JUCE->JACK</title>
-<path fill="none" stroke="black" d="M424.74,-557.74C421.98,-519.21 415.5,-422.25 414,-341 413.99,-340.56 413.86,-340.42 414,-340 415.27,-336.15 417.15,-332.38 419.33,-328.82"/>
-<polygon fill="black" stroke="black" points="422.29,-330.69 425.18,-320.49 416.57,-326.66 422.29,-330.69"/>
+<path fill="none" stroke="black" d="M1980.11,-696.62C1986.7,-669.9 2000.46,-616.81 2016,-573 2016.97,-570.25 2018.06,-567.42 2019.18,-564.6"/>
+<polygon fill="black" stroke="black" points="2022.45,-565.85 2023.08,-555.27 2015.99,-563.15 2022.45,-565.85"/>
</g>
<!-- SDL1 -->
-<g id="node27" class="node">
+<g id="node30" class="node">
<title>SDL1</title>
-<g id="a_node27"><a xlink:href="https://hg.libsdl.org/SDL/file/fba40d9f4a73/src/audio" xlink:title="libSDL-1.2">
-<ellipse fill="lightgrey" stroke="black" cx="1773" cy="-575.74" rx="59.59" ry="18"/>
-<text text-anchor="middle" x="1773" y="-572.04" font-family="Times,serif" font-size="14.00">libSDL-1.2</text>
+<g id="a_node30"><a xlink:href="https://hg.libsdl.org/SDL/file/fba40d9f4a73/src/audio" xlink:title="libSDL-1.2">
+<ellipse fill="lightgrey" stroke="black" cx="922" cy="-714.74" rx="59.59" ry="18"/>
+<text text-anchor="middle" x="922" y="-711.04" font-family="Times,serif" font-size="14.00">libSDL-1.2</text>
</a>
</g>
</g>
<!-- SDL1->ALSA -->
<g id="edge70" class="edge">
<title>SDL1->ALSA</title>
-<path fill="none" stroke="black" d="M1717.63,-568.87C1576.12,-553.86 1202.95,-514.27 1068.85,-500.05"/>
-<polygon fill="black" stroke="black" points="1069.18,-496.57 1058.87,-498.99 1068.44,-503.53 1069.18,-496.57"/>
+<path fill="none" stroke="black" d="M976.07,-706.98C1004.07,-703.62 1038.84,-699.66 1070,-696.74 1295.83,-675.57 1353.26,-681.84 1579,-659.74 1636.25,-654.14 1702.03,-645.71 1744.49,-640.01"/>
+<polygon fill="black" stroke="black" points="1745.06,-643.46 1754.5,-638.66 1744.12,-636.53 1745.06,-643.46"/>
</g>
<!-- SDL1->OSS -->
<g id="edge74" class="edge">
<title>SDL1->OSS</title>
-<path fill="none" stroke="black" d="M1756.4,-558.45C1712.4,-516.14 1587.59,-401.79 1463,-340 1442.94,-330.05 1419.39,-321.86 1399.77,-315.91"/>
-<polygon fill="black" stroke="black" points="1400.49,-312.48 1389.91,-313.01 1398.51,-319.19 1400.49,-312.48"/>
+<path fill="none" stroke="black" d="M945.67,-697.92C1005.82,-658.42 1170.57,-554.74 1322,-500 1364.63,-484.59 1415.86,-475.2 1450.87,-470.08"/>
+<polygon fill="black" stroke="black" points="1451.77,-473.49 1461.18,-468.63 1450.79,-466.56 1451.77,-473.49"/>
</g>
<!-- SDL1->PulseAudio -->
<g id="edge75" class="edge">
<title>SDL1->PulseAudio</title>
-<path fill="none" stroke="black" d="M1732.21,-562.42C1698.81,-552.06 1650.48,-536.47 1609,-520.74 1495.87,-477.84 1476.58,-441.51 1359,-413 1348.51,-410.46 1058.19,-391.41 921.24,-382.53"/>
-<polygon fill="black" stroke="black" points="921.46,-379.04 911.25,-381.89 921.01,-386.03 921.46,-379.04"/>
+<path fill="none" stroke="black" d="M932.32,-696.72C946.45,-674.29 973.46,-634.36 1003,-606 1093.36,-519.26 1123.04,-502.15 1235,-446 1325.58,-400.57 1351.79,-393.66 1451,-373 1543.58,-353.72 1568.83,-363.64 1663,-355 1762.62,-345.86 1877.44,-334.38 1951.28,-326.87"/>
+<polygon fill="black" stroke="black" points="1951.83,-330.34 1961.42,-325.84 1951.12,-323.37 1951.83,-330.34"/>
</g>
<!-- SDL1->aRts -->
<g id="edge71" class="edge">
<title>SDL1->aRts</title>
-<path fill="none" stroke="black" d="M1830.74,-570.89C1964.64,-560.37 2285,-525.43 2285,-432 2285,-432 2285,-432 2285,-216 2285,-172.71 1970.47,-152.78 1854.93,-146.92"/>
-<polygon fill="black" stroke="black" points="1854.86,-143.42 1844.7,-146.42 1854.52,-150.41 1854.86,-143.42"/>
+<path fill="none" stroke="black" d="M862.45,-712.76C770.9,-710.51 600.37,-703.07 545,-678.74 533.48,-673.68 529.11,-671.24 524,-659.74 453.68,-501.3 770,-511.33 770,-501 770,-501 770,-501 770,-390 770,-365.61 791.2,-346.99 810.9,-334.95"/>
+<polygon fill="black" stroke="black" points="812.82,-337.88 819.77,-329.88 809.35,-331.8 812.82,-337.88"/>
</g>
<!-- SDL1->ESD -->
<g id="edge72" class="edge">
<title>SDL1->ESD</title>
-<path fill="none" stroke="black" d="M1776.25,-557.55C1786.27,-504.32 1816.04,-345.41 1815,-340 1800.52,-264.79 1799.64,-239.16 1751,-180 1744.96,-172.65 1736.95,-166.31 1728.97,-161.13"/>
-<polygon fill="black" stroke="black" points="1730.77,-158.14 1720.4,-155.97 1727.16,-164.13 1730.77,-158.14"/>
+<path fill="none" stroke="black" d="M862.05,-714.48C737.21,-714.14 468.03,-702.58 557,-606 590.08,-570.09 730.17,-604.84 776,-588 837.98,-565.22 964.71,-406.63 1012.86,-344.18"/>
+<polygon fill="black" stroke="black" points="1015.8,-346.1 1019.12,-336.04 1010.25,-341.83 1015.8,-346.1"/>
</g>
<!-- SDL1->NAS -->
<g id="edge73" class="edge">
<title>SDL1->NAS</title>
-<path fill="none" stroke="black" d="M1805.36,-560.46C1833.77,-547.92 1875.44,-529.54 1907.44,-515.42"/>
-<polygon fill="black" stroke="black" points="1908.87,-518.61 1916.61,-511.37 1906.05,-512.21 1908.87,-518.61"/>
+<path fill="none" stroke="black" d="M888.12,-699.64C858.2,-687.2 814.18,-668.89 780.18,-654.75"/>
+<polygon fill="black" stroke="black" points="781.46,-651.48 770.88,-650.88 778.77,-657.95 781.46,-651.48"/>
</g>
<!-- SDL2 -->
-<g id="node28" class="node">
+<g id="node31" class="node">
<title>SDL2</title>
-<g id="a_node28"><a xlink:href="https://hg.libsdl.org/SDL/file/355a4f94a782" xlink:title="libSDL-2.0">
-<ellipse fill="lightgrey" stroke="black" cx="2190" cy="-575.74" rx="59.59" ry="18"/>
-<text text-anchor="middle" x="2190" y="-572.04" font-family="Times,serif" font-size="14.00">libSDL-2.0</text>
+<g id="a_node31"><a xlink:href="https://hg.libsdl.org/SDL/file/355a4f94a782" xlink:title="libSDL-2.0">
+<ellipse fill="lightgrey" stroke="black" cx="440" cy="-714.74" rx="59.59" ry="18"/>
+<text text-anchor="middle" x="440" y="-711.04" font-family="Times,serif" font-size="14.00">libSDL-2.0</text>
</a>
</g>
</g>
<!-- SDL2->ALSA -->
<g id="edge76" class="edge">
<title>SDL2->ALSA</title>
-<path fill="none" stroke="black" d="M2132.38,-570.81C1930.37,-557.02 1256.41,-511.01 1068.82,-498.2"/>
-<polygon fill="black" stroke="black" points="1068.93,-494.7 1058.71,-497.51 1068.45,-501.69 1068.93,-494.7"/>
+<path fill="none" stroke="black" d="M498.85,-711.21C716.82,-701.8 1471.19,-668.92 1579,-659.74 1636.31,-654.86 1702.08,-646.27 1744.52,-640.34"/>
+<polygon fill="black" stroke="black" points="1745.11,-643.79 1754.52,-638.92 1744.13,-636.86 1745.11,-643.79"/>
</g>
<!-- SDL2->JACK -->
<g id="edge80" class="edge">
<title>SDL2->JACK</title>
-<path fill="none" stroke="black" d="M2188.22,-557.38C2184.65,-532.59 2174.16,-487.76 2144,-467 2101.04,-437.43 1726.6,-456.58 1675,-449 1611.86,-439.72 1598.83,-424.16 1536,-413 1327.89,-376.03 661.74,-322.36 483.96,-308.41"/>
-<polygon fill="black" stroke="black" points="484.17,-304.92 473.93,-307.63 483.62,-311.9 484.17,-304.92"/>
+<path fill="none" stroke="black" d="M455.31,-697.08C481.17,-669.4 533.03,-615.96 557,-606 599.42,-588.37 924.11,-590.08 970,-588 1361.73,-570.23 1834.75,-547.48 1983.72,-540.29"/>
+<polygon fill="black" stroke="black" points="1984.06,-543.78 1993.88,-539.8 1983.73,-536.78 1984.06,-543.78"/>
</g>
<!-- SDL2->OSS -->
<g id="edge82" class="edge">
<title>SDL2->OSS</title>
-<path fill="none" stroke="black" d="M2195.35,-557.8C2201.7,-533.94 2208.69,-490.71 2185,-467 2154.88,-436.87 1843.84,-457 1802,-449 1681.07,-425.88 1657.18,-396.78 1540,-359 1491.5,-343.36 1435.19,-326.81 1398.42,-316.22"/>
-<polygon fill="black" stroke="black" points="1399.17,-312.79 1388.59,-313.4 1397.24,-319.52 1399.17,-312.79"/>
+<path fill="none" stroke="black" d="M442.48,-696.4C447.04,-671.64 459.29,-626.84 490,-606 519.56,-585.94 775.52,-592.2 811,-588 981.46,-567.82 1022.08,-549.49 1191,-519 1284.94,-502.04 1395.41,-482.27 1452.85,-472"/>
+<polygon fill="black" stroke="black" points="1453.71,-475.4 1462.94,-470.19 1452.48,-468.51 1453.71,-475.4"/>
</g>
<!-- SDL2->sndio -->
<g id="edge84" class="edge">
<title>SDL2->sndio</title>
-<path fill="none" stroke="black" d="M2203.86,-557.94C2207.57,-552.47 2211.08,-546.15 2213,-539.74 2222.3,-508.66 2225.42,-493.7 2207,-467 2090.59,-298.31 1975.64,-356.96 1791,-268 1760.74,-253.42 1752.42,-251.21 1723,-235 1696.43,-220.36 1692.86,-211 1665,-199 1634.6,-185.91 1625.66,-185.35 1593,-180 1417.32,-151.25 1204.96,-145.98 1113.06,-145.11"/>
-<polygon fill="black" stroke="black" points="1113.01,-141.61 1102.99,-145.03 1112.96,-148.61 1113.01,-141.61"/>
+<path fill="none" stroke="black" d="M380.45,-712.41C287.9,-709.65 114.22,-701.53 57,-678.74 27.05,-666.81 0,-666.11 0,-633.87 0,-633.87 0,-633.87 0,-317 0,-257.94 931.8,-237.04 1157.98,-232.84"/>
+<polygon fill="black" stroke="black" points="1158.27,-236.34 1168.21,-232.65 1158.15,-229.34 1158.27,-236.34"/>
</g>
<!-- SDL2->PulseAudio -->
<g id="edge83" class="edge">
<title>SDL2->PulseAudio</title>
-<path fill="none" stroke="black" d="M2173.09,-558.32C2167.67,-552.67 2161.82,-546.15 2157,-539.74 2134.42,-509.73 2146.27,-486.2 2114,-467 2066.99,-439.03 1676.39,-454.88 1622,-449 1532.64,-439.33 1512.25,-423.66 1423,-413 1287.73,-396.84 1252.98,-403.34 1117,-395 1050.61,-390.93 974.92,-386.07 921.3,-382.59"/>
-<polygon fill="black" stroke="black" points="921.42,-379.09 911.21,-381.94 920.96,-386.08 921.42,-379.09"/>
+<path fill="none" stroke="black" d="M435.92,-696.55C431.48,-673.18 427.58,-631.39 449,-606 591.07,-437.58 716.36,-539.72 929,-482 1014.4,-458.82 1224.88,-388.52 1312,-373 1541.65,-332.09 1818.13,-322.14 1950.28,-319.74"/>
+<polygon fill="black" stroke="black" points="1950.37,-323.24 1960.31,-319.57 1950.25,-316.24 1950.37,-323.24"/>
</g>
<!-- SDL2->aRts -->
<g id="edge77" class="edge">
<title>SDL2->aRts</title>
-<path fill="none" stroke="black" d="M2249.34,-573.29C2351.32,-569.8 2554.63,-558.23 2614,-520.74 2653.63,-495.71 2671,-478.88 2671,-432 2671,-432 2671,-432 2671,-216 2671,-174.57 2027.33,-151.64 1855,-146.25"/>
-<polygon fill="black" stroke="black" points="1854.91,-142.74 1844.81,-145.93 1854.7,-149.74 1854.91,-142.74"/>
+<path fill="none" stroke="black" d="M381.21,-711.34C281.61,-706.83 87.95,-695.96 62,-678.74 43.16,-666.23 38,-656.49 38,-633.87 38,-633.87 38,-633.87 38,-390 38,-351.3 635.48,-326.61 801.6,-320.49"/>
+<polygon fill="black" stroke="black" points="802.04,-323.98 811.91,-320.12 801.79,-316.98 802.04,-323.98"/>
</g>
<!-- SDL2->ESD -->
<g id="edge78" class="edge">
<title>SDL2->ESD</title>
-<path fill="none" stroke="black" d="M2239.9,-565.68C2277.64,-555.61 2323,-535.14 2323,-494.87 2323,-494.87 2323,-494.87 2323,-216 2323,-154.48 1832.73,-171.82 1772,-162 1759.87,-160.04 1746.77,-157.29 1734.96,-154.57"/>
-<polygon fill="black" stroke="black" points="1735.51,-151.11 1724.97,-152.22 1733.9,-157.92 1735.51,-151.11"/>
+<path fill="none" stroke="black" d="M380.18,-714.15C261.54,-712.99 14.55,-699.64 95,-606 195.93,-488.52 640.91,-560.27 784,-501 872.69,-464.26 880.56,-429.74 958,-373 973.3,-361.79 990.4,-349.31 1004.31,-339.17"/>
+<polygon fill="black" stroke="black" points="1006.49,-341.91 1012.51,-333.19 1002.37,-336.25 1006.49,-341.91"/>
</g>
<!-- SDL2->NAS -->
<g id="edge81" class="edge">
<title>SDL2->NAS</title>
-<path fill="none" stroke="black" d="M2151.82,-561.82C2113.86,-548.97 2055.15,-529.1 2011.54,-514.34"/>
-<polygon fill="black" stroke="black" points="2012.51,-510.98 2001.92,-511.09 2010.27,-517.61 2012.51,-510.98"/>
+<path fill="none" stroke="black" d="M482.48,-702.04C528.64,-689.33 603.17,-668.8 658.4,-653.59"/>
+<polygon fill="black" stroke="black" points="659.42,-656.94 668.13,-650.91 657.56,-650.19 659.42,-656.94"/>
</g>
<!-- FusionSound -->
-<g id="node29" class="node">
+<g id="node32" class="node">
<title>FusionSound</title>
-<ellipse fill="red" stroke="black" cx="2478" cy="-493.87" rx="126.64" ry="26.74"/>
-<text text-anchor="middle" x="2478" y="-497.67" font-family="Times,serif" font-size="14.00">DirectFB/FusionSound</text>
-<text text-anchor="middle" x="2478" y="-482.67" font-family="Times,serif" font-size="14.00">[dead]</text>
+<ellipse fill="red" stroke="black" cx="231" cy="-632.87" rx="126.64" ry="26.74"/>
+<text text-anchor="middle" x="231" y="-636.67" font-family="Times,serif" font-size="14.00">DirectFB/FusionSound</text>
+<text text-anchor="middle" x="231" y="-621.67" font-family="Times,serif" font-size="14.00">[dead]</text>
</g>
<!-- SDL2->FusionSound -->
<g id="edge79" class="edge">
<title>SDL2->FusionSound</title>
-<path fill="none" stroke="red" d="M2236.9,-564.51C2265.88,-557.95 2303.76,-548.97 2337,-539.74 2358.46,-533.78 2381.57,-526.71 2402.73,-519.96"/>
-<polygon fill="red" stroke="red" points="2403.86,-523.28 2412.31,-516.89 2401.72,-516.61 2403.86,-523.28"/>
+<path fill="none" stroke="red" d="M404.55,-700.19C376.12,-689.33 335.36,-673.75 300.49,-660.43"/>
+<polygon fill="red" stroke="red" points="301.41,-657.03 290.82,-656.73 298.91,-663.57 301.41,-657.03"/>
</g>
<!-- phonon -->
-<g id="node30" class="node">
+<g id="node33" class="node">
<title>phonon</title>
-<ellipse fill="lightgrey" stroke="black" cx="239" cy="-648.74" rx="44.69" ry="18"/>
-<text text-anchor="middle" x="239" y="-645.04" font-family="Times,serif" font-size="14.00">phonon</text>
+<ellipse fill="lightgrey" stroke="black" cx="2506" cy="-787.74" rx="44.69" ry="18"/>
+<text text-anchor="middle" x="2506" y="-784.04" font-family="Times,serif" font-size="14.00">phonon</text>
</g>
<!-- phonon->PulseAudio -->
<g id="edge91" class="edge">
<title>phonon->PulseAudio</title>
-<path fill="none" stroke="black" d="M248.72,-630.98C260.22,-611.98 280.65,-580.67 303,-557.74 349.93,-509.61 366.39,-501.63 424,-467 472.4,-437.91 484.66,-428.35 539,-413 619.16,-390.35 714.8,-382.27 778.88,-379.44"/>
-<polygon fill="black" stroke="black" points="779.03,-382.93 788.88,-379.03 778.74,-375.94 779.03,-382.93"/>
+<path fill="none" stroke="black" d="M2521.68,-770.77C2530.39,-760.75 2540.37,-747.04 2545,-732.74 2549.92,-717.52 2547.67,-712.52 2545,-696.74 2519.05,-543.54 2526.04,-479.62 2413,-373 2369.98,-332.42 2205.47,-322.1 2105.94,-319.62"/>
+<polygon fill="black" stroke="black" points="2106,-316.12 2095.92,-319.39 2105.84,-323.12 2106,-316.12"/>
</g>
<!-- phonon->gstreamer -->
<g id="edge89" class="edge">
<title>phonon->gstreamer</title>
-<path fill="none" stroke="black" d="M214.3,-633.71C195.83,-623.22 170.31,-608.72 149.63,-596.98"/>
-<polygon fill="black" stroke="black" points="151.23,-593.86 140.81,-591.97 147.78,-599.95 151.23,-593.86"/>
+<path fill="none" stroke="black" d="M2483.83,-772.03C2468.61,-761.93 2448.16,-748.36 2431.16,-737.08"/>
+<polygon fill="black" stroke="black" points="2432.89,-734.03 2422.63,-731.42 2429.02,-739.86 2432.89,-734.03"/>
</g>
<!-- VLC -->
-<g id="node31" class="node">
+<g id="node34" class="node">
<title>VLC</title>
-<g id="a_node31"><a xlink:href="https://code.videolan.org/videolan/vlc/-/tree/master/modules/audio_output" xlink:title="VLC">
-<ellipse fill="lightgrey" stroke="black" cx="342" cy="-575.74" rx="29.8" ry="18"/>
-<text text-anchor="middle" x="342" y="-572.04" font-family="Times,serif" font-size="14.00">VLC</text>
+<g id="a_node34"><a xlink:href="https://code.videolan.org/videolan/vlc/-/tree/master/modules/audio_output" xlink:title="VLC">
+<ellipse fill="lightgrey" stroke="black" cx="2506" cy="-714.74" rx="29.8" ry="18"/>
+<text text-anchor="middle" x="2506" y="-711.04" font-family="Times,serif" font-size="14.00">VLC</text>
</a>
</g>
</g>
<!-- phonon->VLC -->
<g id="edge90" class="edge">
<title>phonon->VLC</title>
-<path fill="none" stroke="black" d="M260.84,-632.68C276.53,-621.87 297.79,-607.21 314.62,-595.62"/>
-<polygon fill="black" stroke="black" points="316.71,-598.42 322.96,-589.87 312.74,-592.66 316.71,-598.42"/>
+<path fill="none" stroke="black" d="M2506,-769.55C2506,-761.53 2506,-751.79 2506,-742.81"/>
+<polygon fill="black" stroke="black" points="2509.5,-742.77 2506,-732.77 2502.5,-742.77 2509.5,-742.77"/>
</g>
<!-- VLC->ALSA -->
<g id="edge100" class="edge">
<title>VLC->ALSA</title>
-<path fill="none" stroke="black" d="M364.24,-563.56C369.61,-561.28 375.41,-559.15 381,-557.74 475.7,-533.79 721.87,-531.09 819,-520.74 871.09,-515.19 930.57,-507.35 971.23,-501.75"/>
-<polygon fill="black" stroke="black" points="971.72,-505.22 981.15,-500.38 970.77,-498.28 971.72,-505.22"/>
+<path fill="none" stroke="black" d="M2483.75,-702.59C2478.38,-700.31 2472.58,-698.18 2467,-696.74 2347.45,-665.99 1971.73,-643.57 1837.37,-636.35"/>
+<polygon fill="black" stroke="black" points="1837.17,-632.84 1827,-635.8 1836.79,-639.83 1837.17,-632.84"/>
</g>
<!-- VLC->JACK -->
<g id="edge101" class="edge">
<title>VLC->JACK</title>
-<path fill="none" stroke="black" d="M336.08,-557.87C326.45,-527.54 310.42,-462.36 331,-413 346.93,-374.78 383.7,-343.16 410.13,-324.21"/>
-<polygon fill="black" stroke="black" points="412.44,-326.87 418.65,-318.28 408.44,-321.12 412.44,-326.87"/>
+<path fill="none" stroke="black" d="M2484.47,-702.25C2434.33,-675.93 2305.37,-610.62 2191,-573 2153.83,-560.77 2110.39,-551.58 2078.16,-545.69"/>
+<polygon fill="black" stroke="black" points="2078.57,-542.21 2068.11,-543.89 2077.34,-549.1 2078.57,-542.21"/>
</g>
<!-- VLC->OSS -->
<g id="edge102" class="edge">
<title>VLC->OSS</title>
-<path fill="none" stroke="black" d="M348.16,-558.05C364.42,-516.51 412.81,-408.32 492,-359 539.7,-329.29 561.08,-345.55 617,-340 651.85,-336.54 1161.96,-313.74 1315.56,-306.92"/>
-<polygon fill="black" stroke="black" points="1315.73,-310.42 1325.57,-306.48 1315.42,-303.43 1315.73,-310.42"/>
+<path fill="none" stroke="black" d="M2490.01,-699.32C2448.17,-662.47 2330.63,-564.59 2214,-519 2089.63,-470.39 1674.39,-465.27 1536.75,-464.94"/>
+<polygon fill="black" stroke="black" points="1536.57,-461.44 1526.57,-464.92 1536.56,-468.44 1536.57,-461.44"/>
</g>
<!-- VLC->sndio -->
<g id="edge104" class="edge">
<title>VLC->sndio</title>
-<path fill="none" stroke="black" d="M317.58,-565.18C274.61,-546.57 190,-501.14 190,-432 190,-432 190,-432 190,-216 190,-194.94 841.26,-157.45 1021.34,-147.49"/>
-<polygon fill="black" stroke="black" points="1021.74,-150.97 1031.53,-146.93 1021.36,-143.98 1021.74,-150.97"/>
+<path fill="none" stroke="black" d="M2531.79,-705.22C2553.25,-696.86 2583.08,-682.09 2601,-659.74 2604.52,-655.35 2647.66,-510.18 2649,-501 2653.77,-468.41 2665.08,-453.11 2645,-427 2612.53,-384.77 2587.75,-392.05 2538,-373 2421.91,-328.54 2390.33,-322.1 2268,-300 2069.55,-264.14 1436.89,-239.96 1255.84,-233.64"/>
+<polygon fill="black" stroke="black" points="1255.92,-230.14 1245.81,-233.29 1255.68,-237.14 1255.92,-230.14"/>
</g>
<!-- VLC->PulseAudio -->
<g id="edge103" class="edge">
<title>VLC->PulseAudio</title>
-<path fill="none" stroke="black" d="M361.68,-562.14C418.64,-525.77 581.23,-422.61 608,-413 663.43,-393.1 729.81,-384.49 779.18,-380.77"/>
-<polygon fill="black" stroke="black" points="779.72,-384.24 789.45,-380.05 779.22,-377.26 779.72,-384.24"/>
+<path fill="none" stroke="black" d="M2504.13,-696.52C2497.53,-642.9 2470.96,-476.35 2387,-373 2352.63,-330.7 2200.85,-320.91 2105.99,-319.01"/>
+<polygon fill="black" stroke="black" points="2105.91,-315.5 2095.85,-318.83 2105.79,-322.5 2105.91,-315.5"/>
</g>
<!-- ClanLib -->
-<g id="node32" class="node">
+<g id="node35" class="node">
<title>ClanLib</title>
-<g id="a_node32"><a xlink:href="https://github.com/sphair/ClanLib/tree/master/Sources/Sound/Platform/Linux" xlink:title="ClanLib">
-<ellipse fill="lightgrey" stroke="black" cx="1359" cy="-575.74" rx="46.29" ry="18"/>
-<text text-anchor="middle" x="1359" y="-572.04" font-family="Times,serif" font-size="14.00">ClanLib</text>
+<g id="a_node35"><a xlink:href="https://github.com/sphair/ClanLib/tree/master/Sources/Sound/Platform/Linux" xlink:title="ClanLib">
+<ellipse fill="lightgrey" stroke="black" cx="1546" cy="-714.74" rx="46.29" ry="18"/>
+<text text-anchor="middle" x="1546" y="-711.04" font-family="Times,serif" font-size="14.00">ClanLib</text>
</a>
</g>
</g>
<!-- ClanLib->ALSA -->
<g id="edge92" class="edge">
<title>ClanLib->ALSA</title>
-<path fill="none" stroke="black" d="M1324.17,-563.72C1317.18,-561.63 1309.88,-559.55 1303,-557.74 1220.74,-536.15 1123.77,-515.67 1067.35,-504.24"/>
-<polygon fill="black" stroke="black" points="1067.8,-500.76 1057.3,-502.21 1066.41,-507.62 1067.8,-500.76"/>
+<path fill="none" stroke="black" d="M1580.84,-702.73C1587.82,-700.65 1595.12,-698.55 1602,-696.74 1637.24,-687.44 1647.28,-689.83 1682,-678.74 1706.52,-670.91 1733.21,-659.72 1753.81,-650.47"/>
+<polygon fill="black" stroke="black" points="1755.45,-653.57 1763.1,-646.25 1752.55,-647.2 1755.45,-653.57"/>
</g>
<!-- ClanLib->OSS -->
<g id="edge93" class="edge">
<title>ClanLib->OSS</title>
-<path fill="none" stroke="black" d="M1362.87,-557.76C1371.12,-518.84 1388.48,-420.38 1373,-340 1372.47,-337.26 1371.73,-334.47 1370.87,-331.71"/>
-<polygon fill="black" stroke="black" points="1374.05,-330.24 1367.33,-322.05 1367.48,-332.65 1374.05,-330.24"/>
+<path fill="none" stroke="black" d="M1559.3,-697.37C1566.68,-687.2 1575.13,-673.49 1579,-659.74 1585.47,-636.75 1585.52,-628.98 1579,-606 1578.09,-602.8 1533.02,-530.53 1508.12,-490.73"/>
+<polygon fill="black" stroke="black" points="1510.97,-488.69 1502.7,-482.07 1505.04,-492.4 1510.97,-488.69"/>
</g>
<!-- allegro -->
-<g id="node33" class="node">
+<g id="node36" class="node">
<title>allegro</title>
-<g id="a_node33"><a xlink:href="https://github.com/liballeg/allegro5/tree/master/addons/audio" xlink:title="allegro">
-<ellipse fill="lightgrey" stroke="black" cx="1773" cy="-721.74" rx="42.79" ry="18"/>
-<text text-anchor="middle" x="1773" y="-718.04" font-family="Times,serif" font-size="14.00">allegro</text>
+<g id="a_node36"><a xlink:href="https://github.com/liballeg/allegro5/tree/master/addons/audio" xlink:title="allegro">
+<ellipse fill="lightgrey" stroke="black" cx="1266" cy="-860.74" rx="42.79" ry="18"/>
+<text text-anchor="middle" x="1266" y="-857.04" font-family="Times,serif" font-size="14.00">allegro</text>
</a>
</g>
</g>
<!-- allegro->OSS -->
<g id="edge94" class="edge">
<title>allegro->OSS</title>
-<path fill="none" stroke="black" d="M1815.65,-719.48C1989.18,-714.07 2633,-691.22 2633,-649.74 2633,-649.74 2633,-649.74 2633,-538.74 2633,-505.76 2638.79,-488.75 2614,-467 2567.16,-425.91 1617.38,-330.39 1402.12,-309.21"/>
-<polygon fill="black" stroke="black" points="1402.44,-305.72 1392.14,-308.23 1401.75,-312.69 1402.44,-305.72"/>
+<path fill="none" stroke="black" d="M1268.61,-842.74C1277.82,-788.35 1313.55,-616.46 1410,-519 1424.53,-504.31 1443.69,-491.43 1459.83,-481.93"/>
+<polygon fill="black" stroke="black" points="1461.97,-484.74 1468.93,-476.74 1458.51,-478.66 1461.97,-484.74"/>
</g>
<!-- allegro->PulseAudio -->
<g id="edge96" class="edge">
<title>allegro->PulseAudio</title>
-<path fill="none" stroke="black" d="M1730.05,-720.42C1577.81,-718.9 1064.55,-710.59 907,-666.74 839.4,-647.92 803.38,-653.74 767,-593.74 758.7,-580.06 758.55,-571.33 767,-557.74 786.63,-526.17 821.08,-551.46 842,-520.74 865.38,-486.41 862.05,-436 856.93,-405.18"/>
-<polygon fill="black" stroke="black" points="860.34,-404.36 855.09,-395.16 853.45,-405.62 860.34,-404.36"/>
+<path fill="none" stroke="black" d="M1308.88,-859.87C1544.68,-860.32 2673,-858.83 2673,-788.74 2673,-788.74 2673,-788.74 2673,-677.74 2673,-594.92 2665.22,-567.34 2617,-500 2561.47,-422.45 2527.79,-418.58 2444,-373 2423.12,-361.64 2417.21,-359.15 2394,-354 2287.41,-330.36 2257.56,-347.6 2149,-336 2131.9,-334.17 2113.49,-331.8 2096.32,-329.4"/>
+<polygon fill="black" stroke="black" points="2096.76,-325.93 2086.37,-328 2095.78,-332.86 2096.76,-325.93"/>
</g>
<!-- allegro->OpenAL -->
<g id="edge95" class="edge">
<title>allegro->OpenAL</title>
-<path fill="none" stroke="black" d="M1731.44,-717.1C1596.7,-705.29 1171.86,-668.05 1018.72,-654.62"/>
-<polygon fill="black" stroke="black" points="1018.87,-651.12 1008.6,-653.74 1018.26,-658.1 1018.87,-651.12"/>
+<path fill="none" stroke="black" d="M1304.91,-852.87C1377.57,-840.04 1533.89,-812.43 1615.69,-797.98"/>
+<polygon fill="black" stroke="black" points="1616.52,-801.39 1625.76,-796.2 1615.3,-794.49 1616.52,-801.39"/>
</g>
<!-- allegro->SDL1 -->
<g id="edge97" class="edge">
<title>allegro->SDL1</title>
-<path fill="none" stroke="black" d="M1773,-703.66C1773,-679.08 1773,-633.49 1773,-604.17"/>
-<polygon fill="black" stroke="black" points="1776.5,-603.8 1773,-593.8 1769.5,-603.8 1776.5,-603.8"/>
+<path fill="none" stroke="black" d="M1240.52,-846.2C1233.01,-842.36 1224.73,-838.26 1217,-834.74 1130.3,-795.23 1026.48,-754.93 967.99,-732.85"/>
+<polygon fill="black" stroke="black" points="968.9,-729.45 958.31,-729.2 966.43,-736 968.9,-729.45"/>
</g>
<!-- allegro->SDL2 -->
<g id="edge98" class="edge">
<title>allegro->SDL2</title>
-<path fill="none" stroke="black" d="M1805.03,-709.68C1878.02,-684.47 2057.02,-622.66 2142.74,-593.06"/>
-<polygon fill="black" stroke="black" points="2143.92,-596.36 2152.23,-589.78 2141.63,-589.74 2143.92,-596.36"/>
+<path fill="none" stroke="black" d="M1242.23,-845.69C1234.42,-841.6 1225.54,-837.49 1217,-834.74 1182.9,-823.75 681.67,-750.68 502.82,-724.8"/>
+<polygon fill="black" stroke="black" points="503.18,-721.32 492.78,-723.35 502.17,-728.25 503.18,-721.32"/>
</g>
<!-- telepathy -->
-<g id="node34" class="node">
+<g id="node37" class="node">
<title>telepathy</title>
-<ellipse fill="lightgrey" stroke="black" cx="908" cy="-304" rx="54.69" ry="18"/>
-<text text-anchor="middle" x="908" y="-300.3" font-family="Times,serif" font-size="14.00">telepathy</text>
+<ellipse fill="lightgrey" stroke="black" cx="2549" cy="-158" rx="54.69" ry="18"/>
+<text text-anchor="middle" x="2549" y="-154.3" font-family="Times,serif" font-size="14.00">telepathy</text>
</g>
<!-- telepathy->phone modem -->
<g id="edge99" class="edge">
<title>telepathy->phone modem</title>
-<path fill="none" stroke="black" d="M884.46,-287.61C864.43,-274.51 835.4,-255.53 812.71,-240.69"/>
-<polygon fill="black" stroke="black" points="814.33,-237.57 804.04,-235.03 810.5,-243.43 814.33,-237.57"/>
-<text text-anchor="middle" x="854" y="-256.8" font-family="Times,serif" font-size="14.00" fill="red">?</text>
+<path fill="none" stroke="black" d="M2540.7,-139.8C2534.98,-127.93 2527.26,-111.93 2520.76,-98.45"/>
+<polygon fill="black" stroke="black" points="2523.78,-96.66 2516.28,-89.18 2517.48,-99.7 2523.78,-96.66"/>
+<text text-anchor="middle" x="2534" y="-110.8" font-family="Times,serif" font-size="14.00" fill="red">?</text>
</g>
<!-- pcaudiolib -->
-<g id="node35" class="node">
+<g id="node38" class="node">
<title>pcaudiolib</title>
-<g id="a_node35"><a xlink:href="https://github.com/espeak-ng/pcaudiolib" xlink:title="pcaudiolib">
-<ellipse fill="lightgrey" stroke="black" cx="1236" cy="-575.74" rx="58.49" ry="18"/>
-<text text-anchor="middle" x="1236" y="-572.04" font-family="Times,serif" font-size="14.00">pcaudiolib</text>
+<g id="a_node38"><a xlink:href="https://github.com/espeak-ng/pcaudiolib" xlink:title="pcaudiolib">
+<ellipse fill="lightgrey" stroke="black" cx="1669" cy="-714.74" rx="58.49" ry="18"/>
+<text text-anchor="middle" x="1669" y="-711.04" font-family="Times,serif" font-size="14.00">pcaudiolib</text>
</a>
</g>
</g>
<!-- pcaudiolib->ALSA -->
<g id="edge105" class="edge">
<title>pcaudiolib->ALSA</title>
-<path fill="none" stroke="black" d="M1199.85,-561.37C1160.9,-546.97 1099.15,-524.14 1059.1,-509.33"/>
-<polygon fill="black" stroke="black" points="1060.25,-506.02 1049.66,-505.84 1057.83,-512.59 1060.25,-506.02"/>
+<path fill="none" stroke="black" d="M1696.28,-698.7C1706.68,-692.74 1718.54,-685.67 1729,-678.74 1739.23,-671.96 1750.07,-664.08 1759.68,-656.84"/>
+<polygon fill="black" stroke="black" points="1761.93,-659.52 1767.77,-650.68 1757.69,-653.96 1761.93,-659.52"/>
</g>
<!-- pcaudiolib->OSS -->
<g id="edge106" class="edge">
<title>pcaudiolib->OSS</title>
-<path fill="none" stroke="black" d="M1253.11,-558.19C1275.28,-535.66 1313.42,-493.1 1333,-449 1349.99,-410.74 1355.88,-362.08 1357.92,-332.26"/>
-<polygon fill="black" stroke="black" points="1361.42,-332.36 1358.51,-322.17 1354.43,-331.95 1361.42,-332.36"/>
+<path fill="none" stroke="black" d="M1660.83,-696.8C1643.43,-661.65 1600.28,-579.05 1551,-519 1541.59,-507.54 1529.77,-496.24 1519.18,-486.97"/>
+<polygon fill="black" stroke="black" points="1521.26,-484.14 1511.39,-480.3 1516.71,-489.46 1521.26,-484.14"/>
</g>
<!-- pcaudiolib->PulseAudio -->
<g id="edge107" class="edge">
<title>pcaudiolib->PulseAudio</title>
-<path fill="none" stroke="black" d="M1214.62,-558.73C1170.69,-526.55 1066.15,-453.68 968,-413 948.4,-404.88 926.24,-397.75 906.52,-392.09"/>
-<polygon fill="black" stroke="black" points="907.33,-388.68 896.75,-389.35 905.44,-395.42 907.33,-388.68"/>
+<path fill="none" stroke="black" d="M1675.23,-696.48C1696.01,-641.3 1768.19,-467.29 1884,-373 1907.7,-353.71 1938.98,-340.87 1966.34,-332.58"/>
+<polygon fill="black" stroke="black" points="1967.59,-335.86 1976.22,-329.72 1965.64,-329.13 1967.59,-335.86"/>
</g>
</g>
</svg>