commit: cb3dfe5a55fa8eb87d2922171358cd2f39f76c8e
parent a7179ece2ec9d2bf285c5a2e821056312670a5f5
Author: Haelwenn (lanodan) Monnier <contact@hacktivis.me>
Date: Tue, 30 Jun 2020 09:41:15 +0200
New Article: linux-audio-output
Diffstat:
8 files changed, 1366 insertions(+), 2 deletions(-)
diff --git a/articles/linux-audio-output.shtml b/articles/linux-audio-output.shtml
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+<!--#include file="/templates/head.shtml" -->
+ <meta property="og:type" content="article"/>
+ <meta property="og:title" content="linux-audio-output"/>
+ <title>Linux Audio Output APIs — Cyber-home of lanodan</title>
+ </head>
+ <body>
+<!--#include file="/templates/en/nav.shtml" -->
+<!--#include file="/articles/linux-audio-output.xhtml"-->
+ <a href="/articles/linux-audio-output.xhtml">article only(plain XHTML)</a>
+<!--#include file="/templates/en/footer.shtml" -->
+ </body>
+</html>
diff --git a/articles/linux-audio-output.xhtml b/articles/linux-audio-output.xhtml
@@ -0,0 +1,13 @@
+<article xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" class="h-entry">
+<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>
+<figure><img title="Linux Audio Output APIs" src="/images/linux-audio-output.png" /></figure>
+<p>You'll definitely need a large screen if you want to see the whole thing at once.</p>
+<h2>Other formats</h2>
+<ul>
+ <li><a href="/images/linux-audio-output.dot">Graphviz DOT</a>: source, has comments and URLs</li>
+ <li><a href="/images/linux-audio-output.svg">SVG</a>: access to URLs and can hover lines to see origin and destination</li>
+ <li><a href="/images/linux-audio-output.png">PNG</a></li>
+</ul>
+<p><!--<a href="">Fediverse post for comments</a>-->, published on 2020-06-30T07:10:20Z, last updated on 2020-06-30T07:10:20Z</p>
+</article>
diff --git a/css/index.css b/css/index.css
@@ -120,8 +120,8 @@ figure {
max-width: 95vw;
max-height: 95vh;
object-fit: scale-down;
- width: auto;
- height: auto;
+ width: 100%;
+ height: 100%;
}
nav, footer {
diff --git a/feed.atom b/feed.atom
@@ -11,6 +11,17 @@
<!-- new.sh: new articles here -->
<entry>
+ <title>Linux Audio Output APIs</title>
+ <link rel="alternate" type="text/html" href="/articles/linux-audio-output"/>
+ <id>https://hacktivis.me/articles/linux-audio-output</id>
+ <published>2020-06-30T07:10:20Z</published>
+ <updated>2020-06-30T07:10:20Z</updated>
+ <content type="xhtml"><div xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<!--#include file="/articles/linux-audio-output.xhtml"-->
+ </div></content>
+ </entry>
+
+ <entry>
<title>2020-05 Summary</title>
<link rel="alternate" type="text/html" href="/articles/2020-05%20Summary"/>
<id>https://hacktivis.me/articles/2020-05%20Summary</id>
diff --git a/home.shtml b/home.shtml
@@ -7,6 +7,7 @@
<body>
<!--#set var="transPageUrl" value='accueil' --><!--#set var="feedURL" value='/feed.atom'--><!--#include file="templates/en/nav.shtml" -->
+<!--#include file="/articles/linux-audio-output.xhtml"-->
<!--#include file="/articles/2020-05 Summary.xhtml"-->
<!--#include file="/articles/blocking cloudflare IP-range be like.xhtml"-->
<!--#include file="/articles/2020-04 Summary.xhtml"-->
diff --git a/images/linux-audio-output.dot b/images/linux-audio-output.dot
@@ -0,0 +1,207 @@
+digraph "Linux Audio Output APIs" {
+ node [ shape=ellipse style=filled ];
+ label="Linux Audio Output APIs
+ CC-BY 4.0 © 2020 Haelwenn (lanodan) Monnier
+ https://hacktivis.me/articles/linux-audio-output";
+
+ "network card" [ shape=box fillcolor=cyan ];
+ "sound card" [ shape=box fillcolor=cyan ];
+ "phone modem" [ shape=box fillcolor=cyan ];
+ "Bluetooth card" [ shape=box fillcolor=cyan ];
+ filesystem [ shape=octagon fillcolor=yellow ];
+ null [ shape=diamond fillcolor=red ];
+ "?" [ shape=circle fillcolor=red ];
+
+ 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 -> "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 -> ALSA;
+ PulseAudio -> OSS [ dir=both ];
+ PulseAudio -> "network card" [ label="DLNA, RTP, SDP, SAP, RAOP, Tunnel, HTTP" dir=both color=green fontcolor=green ];
+ PulseAudio -> null [ color=red ];
+ PulseAudio -> "sound card" [ color=green ];
+ PulseAudio -> JACK;
+ PulseAudio -> bluez;
+ PulseAudio -> ofono;
+ PulseAudio -> sox;
+ "X11 bell" -> PulseAudio;
+
+ ofono [ shape=octagon fillcolor=yellow ];
+ ofono -> "phone modem" [ color=green ];
+
+ bluez [ label="BlueZ" shape=octagon fillcolor=yellow ];
+ ALSA -> bluez;
+ bluez -> "Bluetooth card" [ color=green ];
+
+ sox [ URL="http://sox.sourceforge.net/Docs/Features" ];
+ sox -> filesystem;
+ sox -> null [ color=red ];
+ sox -> libao;
+ sox -> PulseAudio;
+ sox -> ALSA;
+
+ libao [ URL="https://www.xiph.org/ao/" ];
+ libao -> filesystem;
+ libao -> OSS;
+ libao -> ALSA;
+ libao -> aRts;
+ libao -> PulseAudio;
+ libao -> ESD;
+ libao -> null [ color=red ];
+ libao -> NAS;
+ libao -> RoarAudio;
+ libao -> sndio;
+
+ RoarAudio [ URL="http://roaraudio.keep-cool.org/" ];
+ OSS -> RoarAudio;
+ RoarAudio -> sndio;
+ RoarAudio -> PulseAudio;
+ RoarAudio -> ESD;
+ RoarAudio -> aRts;
+ RoarAudio -> "network card" [ label="IPv4, DECnet, OpenSLP" dir=both ];
+
+ // Probably incomplete, need some proper documentation
+ ESD -> OSS;
+ ESD -> ALSA;
+ ESD -> "network card";
+
+ libcanberra [ URL="http://git.0pointer.net/libcanberra.git/tree/src/driver-order.c" ];
+ libcanberra -> PulseAudio;
+ libcanberra -> OSS;
+ libcanberra -> ALSA;
+ libcanberra -> gstreamer;
+ libcanberra -> null [ color=red ];
+
+ PipeWire [ URL="http://pipewire.org/" ];
+ PulseAudio -> PipeWire [ dir=both ];
+ ALSA -> PipeWire;
+ JACK -> PipeWire;
+ gstreamer -> PipeWire;
+ PipeWire -> "?" [ color=red ];
+
+ sndio [ URL="http://www.sndio.org/" ];
+ sndio -> ALSA;
+ sndio -> "network card" [ dir=both ];
+ PulseAudio -> sndio;
+ ALSA -> sndio;
+ gstreamer -> sndio;
+
+ OpenAL [ URL="https://www.openal-soft.org/" ];
+ OpenAL -> PulseAudio;
+ OpenAL -> ALSA;
+ OpenAL -> OSS;
+ OpenAL -> SoundIO;
+ OpenAL -> portaudio;
+ OpenAL -> JACK;
+ OpenAL -> filesystem;
+ OpenAL -> null [ color=red ];
+
+ SoundIO [ URL="http://libsound.io/" ];
+ SoundIO -> JACK;
+ SoundIO -> PulseAudio;
+ SoundIO -> ALSA;
+ SoundIO -> null [ color=red ];
+
+ RtAudio [ URL="https://www.music.mcgill.ca/~gary/rtaudio/apinotes.html" ];
+ RtAudio -> OSS [ label="OSS 4.0+" ];
+ RtAudio -> ALSA;
+ RtAudio -> JACK;
+ RtAudio -> PulseAudio;
+
+ // This shit is the hardest to find any documentation for
+ JUCE -> ALSA;
+ JUCE -> JACK;
+ JUCE -> "?" [ color=red ];
+
+ ALSA [ shape=octagon URL="https://alsa-project.org/wiki/Asoundrc#Plugins" fillcolor=yellow ];
+ ALSA -> "sound card" [ color=green ];
+ ALSA -> "network card" [ color=green ];
+ ALSA -> PulseAudio;
+ ALSA -> JACK;
+ ALSA -> aRts;
+ ALSA -> null [ color=red ];
+ ALSA -> filesystem;
+ OSS -> ALSA;
+
+ OSS [ shape=octagon 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
+
+ // https://wiki.libsdl.org/FAQUsingSDL
+ SDL1 [ label="libSDL-1.2" URL="https://hg.libsdl.org/SDL/file/fba40d9f4a73/src/audio" ];
+ SDL1 -> ALSA;
+ SDL1 -> aRts;
+ SDL1 -> ESD;
+ SDL1 -> filesystem;
+ SDL1 -> NAS;
+ SDL1 -> OSS;
+ SDL1 -> PulseAudio;
+ SDL1 -> null [ color=red ];
+
+ SDL2 [ label="libSDL-2.0" URL="https://hg.libsdl.org/SDL/file/355a4f94a782" ];
+ SDL2 -> ALSA;
+ SDL2 -> aRts;
+ SDL2 -> ESD;
+ SDL2 -> filesystem;
+ SDL2 -> FusionSound [ color=red ];
+ SDL2 -> JACK;
+ SDL2 -> NAS;
+ SDL2 -> "OpenSL ES"; // Gonna have to check again on the others
+ // Maybe SDL2 -> "NaCL";
+ SDL2 -> null [ color=red ];
+ SDL2 -> OSS;
+ SDL2 -> PulseAudio;
+ SDL2 -> sndio;
+
+ FusionSound [ label="DirectFB/FusionSound\n[dead]" fillcolor=red ];
+ FusionSound -> "?" [ color=red ];
+
+ // And then where the hell does it goes?
+ NAS [ label="Network Audio Server" ]
+ NAS -> "network card";
+
+ gstreamer -> ALSA;
+ gstreamer -> OSS;
+ gstreamer -> JACK;
+ gstreamer -> PulseAudio;
+
+ phonon -> gstreamer;
+ phonon -> VLC;
+ phonon -> PulseAudio;
+
+ ClanLib [ URL="https://github.com/sphair/ClanLib/tree/master/Sources/Sound/Platform/Linux" ];
+ ClanLib -> ALSA;
+ ClanLib -> OSS;
+
+ allegro [ URL="https://github.com/liballeg/allegro5/tree/master/addons/audio" ];
+ allegro -> OSS;
+ allegro -> OpenAL;
+ allegro -> PulseAudio;
+ allegro -> "OpenSL ES";
+ allegro -> SDL1;
+ allegro -> SDL2;
+
+ telepathy -> "phone modem" [ label="?" fontcolor=red ];
+ telepathy -> "?" [ color=red ];
+
+ VLC [ URL="https://code.videolan.org/videolan/vlc/-/tree/master/modules/audio_output" ];
+ VLC -> null [ color=red ];
+ VLC -> ALSA;
+ VLC -> filesystem;
+ VLC -> JACK;
+ VLC -> "OpenSL ES";
+ VLC -> OSS;
+ VLC -> PulseAudio;
+ VLC -> sndio;
+
+ "OpenSL ES" -> "?" [ color=red ];
+}
+\ 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
@@ -0,0 +1,1116 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.42.3 (20191010.1750)
+ -->
+<!-- Title: Linux Audio Output APIs Pages: 1 -->
+<svg width="2637pt" height="943pt"
+ viewBox="0.00 0.00 2637.00 942.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 938.74)">
+<title>Linux Audio Output APIs</title>
+<polygon fill="white" stroke="transparent" points="-4,4 -4,-938.74 2633,-938.74 2633,4 -4,4"/>
+<text text-anchor="middle" x="1314.5" y="-37.8" font-family="Times,serif" font-size="14.00">Linux Audio Output APIs</text>
+<text text-anchor="middle" x="1314.5" y="-22.8" font-family="Times,serif" font-size="14.00"> CC-BY 4.0 © 2020 Haelwenn (lanodan) Monnier</text>
+<text text-anchor="middle" x="1314.5" y="-7.8" font-family="Times,serif" font-size="14.00"> https://hacktivis.me/articles/linux-audio-output</text>
+<!-- network card -->
+<g id="node1" class="node">
+<title>network card</title>
+<polygon fill="cyan" stroke="black" points="998,-89 910,-89 910,-53 998,-53 998,-89"/>
+<text text-anchor="middle" x="954" y="-67.3" font-family="Times,serif" font-size="14.00">network card</text>
+</g>
+<!-- sound card -->
+<g id="node2" class="node">
+<title>sound card</title>
+<polygon fill="cyan" stroke="black" points="1561,-235 1485,-235 1485,-199 1561,-199 1561,-235"/>
+<text text-anchor="middle" x="1523" y="-213.3" font-family="Times,serif" font-size="14.00">sound card</text>
+</g>
+<!-- phone modem -->
+<g id="node3" class="node">
+<title>phone modem</title>
+<polygon fill="cyan" stroke="black" points="1509.5,-395 1414.5,-395 1414.5,-359 1509.5,-359 1509.5,-395"/>
+<text text-anchor="middle" x="1462" y="-373.3" font-family="Times,serif" font-size="14.00">phone modem</text>
+</g>
+<!-- Bluetooth card -->
+<g id="node4" class="node">
+<title>Bluetooth card</title>
+<polygon fill="cyan" stroke="black" points="1396.5,-395 1299.5,-395 1299.5,-359 1396.5,-359 1396.5,-395"/>
+<text text-anchor="middle" x="1348" y="-373.3" font-family="Times,serif" font-size="14.00">Bluetooth card</text>
+</g>
+<!-- filesystem -->
+<g id="node5" class="node">
+<title>filesystem</title>
+<polygon fill="yellow" stroke="black" points="1383.21,-296.54 1383.21,-311.46 1353.21,-322 1310.79,-322 1280.79,-311.46 1280.79,-296.54 1310.79,-286 1353.21,-286 1383.21,-296.54"/>
+<text text-anchor="middle" x="1332" y="-300.3" font-family="Times,serif" font-size="14.00">filesystem</text>
+</g>
+<!-- null -->
+<g id="node6" class="node">
+<title>null</title>
+<polygon fill="red" stroke="black" points="1832,-322 1797.14,-304 1832,-286 1866.86,-304 1832,-322"/>
+<text text-anchor="middle" x="1832" y="-300.3" font-family="Times,serif" font-size="14.00">null</text>
+</g>
+<!-- ? -->
+<g id="node7" class="node">
+<title>?</title>
+<ellipse fill="red" stroke="black" cx="168" cy="-304" rx="18" ry="18"/>
+<text text-anchor="middle" x="168" y="-300.3" font-family="Times,serif" font-size="14.00">?</text>
+</g>
+<!-- portaudio -->
+<g id="node8" class="node">
+<title>portaudio</title>
+<g id="a_node8"><a xlink:href="https://app.assembla.com/spaces/portaudio/git/source/master/src/hostapi/" xlink:title="portaudio">
+<ellipse fill="lightgrey" stroke="black" cx="2037" cy="-770.74" rx="44.39" ry="18"/>
+<text text-anchor="middle" x="2037" y="-767.04" font-family="Times,serif" font-size="14.00">portaudio</text>
+</a>
+</g>
+</g>
+<!-- ALSA -->
+<g id="node9" class="node">
+<title>ALSA</title>
+<g id="a_node9"><a xlink:href="https://alsa-project.org/wiki/Asoundrc#Plugins" xlink:title="ALSA">
+<polygon fill="yellow" stroke="black" points="1245.66,-690.28 1245.66,-705.2 1224.19,-715.74 1193.81,-715.74 1172.34,-705.2 1172.34,-690.28 1193.81,-679.74 1224.19,-679.74 1245.66,-690.28"/>
+<text text-anchor="middle" x="1209" y="-694.04" 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="M1996.06,-763.87C1970.26,-760.31 1936.23,-755.87 1906,-752.74 1661.86,-727.46 1368.5,-708.42 1256.02,-701.54"/>
+<polygon fill="black" stroke="black" points="1255.91,-698.03 1245.71,-700.91 1255.48,-705.01 1255.91,-698.03"/>
+</g>
+<!-- JACK -->
+<g id="node10" class="node">
+<title>JACK</title>
+<ellipse fill="lightgrey" stroke="black" cx="1540" cy="-464" rx="32.49" ry="18"/>
+<text text-anchor="middle" x="1540" y="-460.3" font-family="Times,serif" font-size="14.00">JACK</text>
+</g>
+<!-- portaudio->JACK -->
+<g id="edge2" class="edge">
+<title>portaudio->JACK</title>
+<path fill="none" stroke="black" d="M1995.71,-764.21C1901.65,-751.52 1679.07,-721.04 1673,-715.74 1616.6,-666.51 1667.27,-616.45 1626,-554 1619.04,-543.46 1612.82,-545.04 1604,-536 1589.85,-521.49 1589.52,-515.1 1576,-500 1572.15,-495.7 1567.88,-491.28 1563.67,-487.09"/>
+<polygon fill="black" stroke="black" points="1565.86,-484.34 1556.25,-479.88 1560.98,-489.36 1565.86,-484.34"/>
+</g>
+<!-- OSS -->
+<g id="node11" class="node">
+<title>OSS</title>
+<polygon fill="yellow" stroke="black" points="939.69,-296.54 939.69,-311.46 922.88,-322 899.12,-322 882.31,-311.46 882.31,-296.54 899.12,-286 922.88,-286 939.69,-296.54"/>
+<text text-anchor="middle" x="911" y="-300.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="M2033.97,-752.55C2020.9,-684.49 1962.22,-433.86 1796,-359 1776.42,-350.18 1118.16,-315.69 949.87,-307"/>
+<polygon fill="black" stroke="black" points="949.89,-303.49 939.73,-306.47 949.53,-310.48 949.89,-303.49"/>
+</g>
+<!-- asihpi -->
+<g id="node12" class="node">
+<title>asihpi</title>
+<polygon fill="yellow" stroke="black" points="2258.44,-510.54 2258.44,-525.46 2238.27,-536 2209.73,-536 2189.56,-525.46 2189.56,-510.54 2209.73,-500 2238.27,-500 2258.44,-510.54"/>
+<text text-anchor="middle" x="2224" y="-514.3" 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="M2060.87,-755.49C2076.45,-745.52 2096.65,-731.25 2112,-715.74 2162.45,-664.74 2197.9,-586.45 2214.09,-545.71"/>
+<polygon fill="black" stroke="black" points="2217.42,-546.79 2217.79,-536.2 2210.9,-544.25 2217.42,-546.79"/>
+</g>
+<!-- sndio -->
+<g id="node13" class="node">
+<title>sndio</title>
+<g id="a_node13"><a xlink:href="http://www.sndio.org/" xlink:title="sndio">
+<ellipse fill="lightgrey" stroke="black" cx="1417" cy="-144" rx="29.8" ry="18"/>
+<text text-anchor="middle" x="1417" y="-140.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="M2066.12,-756.94C2087.4,-747.01 2116.52,-732.19 2140,-715.74 2251.15,-637.85 2655.9,-394.23 2574,-286 2488.17,-172.57 2403.57,-235.17 2266,-199 2231.49,-189.93 2223.32,-185.05 2188,-180 2044.67,-159.49 1593.85,-148.66 1456.87,-145.79"/>
+<polygon fill="black" stroke="black" points="1456.88,-142.29 1446.81,-145.58 1456.74,-149.29 1456.88,-142.29"/>
+</g>
+<!-- ALSA->network card -->
+<g id="edge79" class="edge">
+<title>ALSA->network card</title>
+<path fill="none" stroke="green" d="M1172.29,-695.93C1106.7,-693.86 972.64,-686.62 934,-661.74 886.78,-631.34 693.14,-239.59 692,-235 667.98,-138.46 816.67,-96.21 900.15,-80.28"/>
+<polygon fill="green" stroke="green" points="900.79,-83.73 909.99,-78.47 899.52,-76.84 900.79,-83.73"/>
+</g>
+<!-- ALSA->sound card -->
+<g id="edge78" class="edge">
+<title>ALSA->sound card</title>
+<path fill="none" stroke="green" d="M1181.39,-685.84C1168.76,-679.96 1154.16,-671.83 1143,-661.74 1061.6,-588.18 977.03,-545.63 1023,-446 1078.11,-326.56 1145.37,-321.63 1272,-286 1360.04,-261.23 1394.94,-308.38 1477,-268 1488.46,-262.36 1498.45,-252.55 1506.17,-243.1"/>
+<polygon fill="green" stroke="green" points="1509.07,-245.08 1512.35,-235 1503.5,-240.83 1509.07,-245.08"/>
+</g>
+<!-- ALSA->filesystem -->
+<g id="edge84" class="edge">
+<title>ALSA->filesystem</title>
+<path fill="none" stroke="black" d="M1182.45,-685.15C1172.96,-679.54 1163.3,-671.81 1158,-661.74 1126.03,-601.02 1174.05,-410.86 1219,-359 1235.44,-340.04 1260.02,-327.19 1282.07,-318.81"/>
+<polygon fill="black" stroke="black" points="1283.42,-322.04 1291.65,-315.38 1281.06,-315.45 1283.42,-322.04"/>
+</g>
+<!-- ALSA->null -->
+<g id="edge83" class="edge">
+<title>ALSA->null</title>
+<path fill="none" stroke="red" d="M1204.93,-679.39C1192.88,-623.2 1163.81,-444.9 1257,-359 1296.04,-323.01 1664.16,-309.61 1790.03,-306.05"/>
+<polygon fill="red" stroke="red" points="1790.51,-309.54 1800.41,-305.77 1790.32,-302.54 1790.51,-309.54"/>
+</g>
+<!-- ALSA->JACK -->
+<g id="edge81" class="edge">
+<title>ALSA->JACK</title>
+<path fill="none" stroke="black" d="M1245.69,-693.18C1271.65,-689.1 1306.14,-680.37 1331,-661.74 1353.62,-644.79 1345.17,-628.14 1365,-608 1406,-566.37 1432.03,-575.6 1475,-536 1489.9,-522.26 1489.38,-515.01 1503,-500 1507.04,-495.55 1511.53,-491 1515.97,-486.72"/>
+<polygon fill="black" stroke="black" points="1518.4,-489.23 1523.27,-479.82 1513.59,-484.14 1518.4,-489.23"/>
+</g>
+<!-- ALSA->sndio -->
+<g id="edge57" class="edge">
+<title>ALSA->sndio</title>
+<path fill="none" stroke="black" d="M1190.27,-681.36C1186.3,-675.47 1182.9,-668.53 1181,-661.74 1132.04,-486.33 1098.28,-396.82 1210,-253 1252.86,-197.83 1332.14,-167.1 1379.32,-153.55"/>
+<polygon fill="black" stroke="black" points="1380.44,-156.87 1389.15,-150.84 1378.58,-150.12 1380.44,-156.87"/>
+</g>
+<!-- PulseAudio -->
+<g id="node14" class="node">
+<title>PulseAudio</title>
+<g id="a_node14"><a xlink:href="https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/Modules/" xlink:title="PulseAudio">
+<ellipse fill="lightgrey" stroke="black" cx="1796" cy="-572" rx="51.99" ry="18"/>
+<text text-anchor="middle" x="1796" y="-568.3" font-family="Times,serif" font-size="14.00">PulseAudio</text>
+</a>
+</g>
+</g>
+<!-- ALSA->PulseAudio -->
+<g id="edge80" class="edge">
+<title>ALSA->PulseAudio</title>
+<path fill="none" stroke="black" d="M1245.69,-690.14C1266.84,-686.93 1293.8,-683.06 1318,-679.74 1379.28,-671.33 1397.57,-682.02 1456,-661.74 1500.01,-646.47 1502.1,-623.59 1546,-608 1607.44,-586.18 1682.32,-577.95 1734.11,-574.85"/>
+<polygon fill="black" stroke="black" points="1734.36,-578.34 1744.15,-574.3 1733.97,-571.35 1734.36,-578.34"/>
+</g>
+<!-- bluez -->
+<g id="node15" class="node">
+<title>bluez</title>
+<polygon fill="yellow" stroke="black" points="1452.35,-456.54 1452.35,-471.46 1431.64,-482 1402.36,-482 1381.65,-471.46 1381.65,-456.54 1402.36,-446 1431.64,-446 1452.35,-456.54"/>
+<text text-anchor="middle" x="1417" y="-460.3" font-family="Times,serif" font-size="14.00">BlueZ</text>
+</g>
+<!-- ALSA->bluez -->
+<g id="edge18" class="edge">
+<title>ALSA->bluez</title>
+<path fill="none" stroke="black" d="M1243.84,-689.21C1262.1,-683.91 1283.96,-675.27 1300,-661.74 1314.8,-649.25 1374.9,-541.71 1402.73,-491.11"/>
+<polygon fill="black" stroke="black" points="1405.95,-492.53 1407.69,-482.08 1399.81,-489.16 1405.95,-492.53"/>
+</g>
+<!-- aRts -->
+<g id="node20" class="node">
+<title>aRts</title>
+<ellipse fill="lightgrey" stroke="black" cx="472" cy="-144" rx="27" ry="18"/>
+<text text-anchor="middle" x="472" y="-140.3" font-family="Times,serif" font-size="14.00">aRts</text>
+</g>
+<!-- ALSA->aRts -->
+<g id="edge82" class="edge">
+<title>ALSA->aRts</title>
+<path fill="none" stroke="black" d="M1172.38,-695.56C1090.99,-692.57 897.43,-683.36 836,-661.74 744.58,-629.56 472,-518.42 472,-421.5 472,-421.5 472,-421.5 472,-216 472,-201.65 472,-185.67 472,-172.51"/>
+<polygon fill="black" stroke="black" points="475.5,-172.22 472,-162.22 468.5,-172.22 475.5,-172.22"/>
+</g>
+<!-- PipeWire -->
+<g id="node26" class="node">
+<title>PipeWire</title>
+<g id="a_node26"><a xlink:href="http://pipewire.org/" xlink:title="PipeWire">
+<ellipse fill="lightgrey" stroke="black" cx="1572" cy="-377" rx="44.39" ry="18"/>
+<text text-anchor="middle" x="1572" y="-373.3" font-family="Times,serif" font-size="14.00">PipeWire</text>
+</a>
+</g>
+</g>
+<!-- ALSA->PipeWire -->
+<g id="edge50" class="edge">
+<title>ALSA->PipeWire</title>
+<path fill="none" stroke="black" d="M1212.54,-679.73C1223.04,-633.89 1258.45,-507.12 1340,-446 1406.19,-396.39 1439.83,-418.97 1519,-395 1522.29,-394 1525.69,-392.96 1529.1,-391.89"/>
+<polygon fill="black" stroke="black" points="1530.21,-395.21 1538.69,-388.87 1528.1,-388.54 1530.21,-395.21"/>
+</g>
+<!-- JACK->PipeWire -->
+<g id="edge51" class="edge">
+<title>JACK->PipeWire</title>
+<path fill="none" stroke="black" d="M1546.32,-446.21C1550.81,-434.29 1556.92,-418.06 1562.05,-404.42"/>
+<polygon fill="black" stroke="black" points="1565.33,-405.64 1565.58,-395.05 1558.78,-403.17 1565.33,-405.64"/>
+</g>
+<!-- OSS->sound card -->
+<g id="edge86" class="edge">
+<title>OSS->sound card</title>
+<path fill="none" stroke="green" d="M939.7,-299.01C1036.71,-285.54 1353.17,-241.59 1474.79,-224.7"/>
+<polygon fill="green" stroke="green" points="1475.49,-228.13 1484.91,-223.29 1474.53,-221.2 1475.49,-228.13"/>
+<text text-anchor="middle" x="1363" y="-256.8" font-family="Times,serif" font-size="14.00" fill="green">third-party drivers from opensound.com</text>
+</g>
+<!-- OSS->ALSA -->
+<g id="edge85" class="edge">
+<title>OSS->ALSA</title>
+<path fill="none" stroke="black" d="M913.95,-322.1C919.66,-354 933.35,-424.55 952,-482 955.35,-492.31 1019.58,-654.92 1028,-661.74 1048.17,-678.08 1115.47,-687.77 1162.06,-692.67"/>
+<polygon fill="black" stroke="black" points="1161.94,-696.18 1172.24,-693.7 1162.65,-689.21 1161.94,-696.18"/>
+</g>
+<!-- RoarAudio -->
+<g id="node23" class="node">
+<title>RoarAudio</title>
+<g id="a_node23"><a xlink:href="http://roaraudio.keep-cool.org/" xlink:title="RoarAudio">
+<ellipse fill="lightgrey" stroke="black" cx="993" cy="-217" rx="50.09" ry="18"/>
+<text text-anchor="middle" x="993" y="-213.3" font-family="Times,serif" font-size="14.00">RoarAudio</text>
+</a>
+</g>
+</g>
+<!-- OSS->RoarAudio -->
+<g id="edge35" class="edge">
+<title>OSS->RoarAudio</title>
+<path fill="none" stroke="black" d="M926.04,-287.41C938.4,-274.59 956.12,-256.23 970.22,-241.61"/>
+<polygon fill="black" stroke="black" points="972.79,-243.99 977.22,-234.36 967.75,-239.13 972.79,-243.99"/>
+</g>
+<!-- asihpi->sound card -->
+<g id="edge5" class="edge">
+<title>asihpi->sound card</title>
+<path fill="none" stroke="green" d="M2225.83,-499.66C2229.91,-450.44 2233.73,-309.79 2152,-253 2104.79,-220.19 1710.77,-217.67 1571.52,-217.81"/>
+<polygon fill="green" stroke="green" points="1571.16,-214.31 1561.16,-217.83 1571.17,-221.31 1571.16,-214.31"/>
+</g>
+<!-- sndio->network card -->
+<g id="edge55" class="edge">
+<title>sndio->network card</title>
+<path fill="none" stroke="black" d="M1378.33,-137.07C1295.86,-124.42 1102.53,-94.78 1007.98,-80.28"/>
+<polygon fill="black" stroke="black" points="1377.97,-140.56 1388.39,-138.61 1379.03,-133.64 1377.97,-140.56"/>
+<polygon fill="black" stroke="black" points="1008.47,-76.81 998.05,-78.76 1007.41,-83.73 1008.47,-76.81"/>
+</g>
+<!-- sndio->ALSA -->
+<g id="edge54" class="edge">
+<title>sndio->ALSA</title>
+<path fill="none" stroke="black" d="M1391.29,-153.52C1350.22,-167.07 1270.88,-197.8 1228,-253 1116.28,-396.82 1150.04,-486.33 1199,-661.74 1199.8,-664.61 1200.87,-667.51 1202.06,-670.34"/>
+<polygon fill="black" stroke="black" points="1198.94,-671.96 1206.29,-679.6 1205.31,-669.05 1198.94,-671.96"/>
+</g>
+<!-- PulseAudio->network card -->
+<g id="edge9" class="edge">
+<title>PulseAudio->network card</title>
+<path fill="none" stroke="green" d="M1855.34,-564.87C1890.01,-559.9 1934.08,-551.13 1971,-536 2161.14,-458.08 2405.21,-331.14 2266,-180 2179.51,-86.1 1244.61,-73.84 1008.11,-72.24"/>
+<polygon fill="green" stroke="green" points="1854.8,-561.41 1845.36,-566.24 1855.74,-568.35 1854.8,-561.41"/>
+<polygon fill="green" stroke="green" points="1008.05,-68.74 998.03,-72.18 1008.01,-75.74 1008.05,-68.74"/>
+<text text-anchor="middle" x="2437.5" y="-300.3" font-family="Times,serif" font-size="14.00" fill="green">DLNA, RTP, SDP, SAP, RAOP, Tunnel, HTTP</text>
+</g>
+<!-- PulseAudio->sound card -->
+<g id="edge11" class="edge">
+<title>PulseAudio->sound card</title>
+<path fill="none" stroke="green" d="M1847.06,-568.47C1878.01,-564.78 1916.99,-556.11 1946,-536 1956.7,-528.58 2072.23,-353.46 2076,-341 2076.13,-340.57 2076.26,-340.36 2076,-340 2017.6,-257.27 1695.12,-228.69 1571.37,-220.68"/>
+<polygon fill="green" stroke="green" points="1571.27,-217.16 1561.07,-220.03 1570.83,-224.15 1571.27,-217.16"/>
+</g>
+<!-- PulseAudio->null -->
+<g id="edge10" class="edge">
+<title>PulseAudio->null</title>
+<path fill="none" stroke="red" d="M1826.61,-557.37C1835.08,-552 1843.24,-544.93 1848,-536 1884.2,-468 1857.24,-372.36 1841.39,-328.57"/>
+<polygon fill="red" stroke="red" points="1844.62,-327.21 1837.83,-319.08 1838.07,-329.67 1844.62,-327.21"/>
+</g>
+<!-- PulseAudio->ALSA -->
+<g id="edge7" class="edge">
+<title>PulseAudio->ALSA</title>
+<path fill="none" stroke="black" d="M1744.67,-575.08C1696.71,-578.35 1623.96,-586.7 1564,-608 1520.1,-623.59 1518.01,-646.47 1474,-661.74 1415.57,-682.02 1397.28,-671.33 1336,-679.74 1309.54,-683.37 1279.76,-687.66 1255.59,-691.03"/>
+<polygon fill="black" stroke="black" points="1255.03,-687.57 1245.6,-692.4 1255.99,-694.5 1255.03,-687.57"/>
+</g>
+<!-- PulseAudio->JACK -->
+<g id="edge12" class="edge">
+<title>PulseAudio->JACK</title>
+<path fill="none" stroke="black" d="M1755.11,-560.74C1738.23,-555.21 1719.12,-547.18 1704,-536 1687.7,-523.95 1693.3,-510.57 1676,-500 1639.33,-477.59 1622.18,-494.29 1581,-482 1578.69,-481.31 1576.34,-480.54 1573.99,-479.71"/>
+<polygon fill="black" stroke="black" points="1575.01,-476.36 1564.42,-476.09 1572.53,-482.9 1575.01,-476.36"/>
+</g>
+<!-- PulseAudio->OSS -->
+<g id="edge8" class="edge">
+<title>PulseAudio->OSS</title>
+<path fill="none" stroke="black" d="M1808.66,-544.54C1819.31,-518.24 1830.54,-477.4 1815,-446 1786.74,-388.87 1761.01,-380.47 1701,-359 1647.82,-339.97 1249.29,-345.58 1193,-341 1105.84,-333.91 1004.24,-319.39 949.94,-311.12"/>
+<polygon fill="black" stroke="black" points="1805.39,-543.28 1804.66,-553.85 1811.82,-546.04 1805.39,-543.28"/>
+<polygon fill="black" stroke="black" points="950.15,-307.61 939.73,-309.55 949.09,-314.53 950.15,-307.61"/>
+</g>
+<!-- PulseAudio->sndio -->
+<g id="edge56" class="edge">
+<title>PulseAudio->sndio</title>
+<path fill="none" stroke="black" d="M1847.35,-568.51C1884.11,-564.95 1933.83,-556.41 1973,-536 2083.95,-478.2 2176,-466.1 2176,-341 2176,-341 2176,-341 2176,-216 2176,-143.15 1614.49,-143.09 1457.4,-144.5"/>
+<polygon fill="black" stroke="black" points="1457.19,-141 1447.22,-144.6 1457.26,-148 1457.19,-141"/>
+</g>
+<!-- PulseAudio->bluez -->
+<g id="edge13" class="edge">
+<title>PulseAudio->bluez</title>
+<path fill="none" stroke="black" d="M1756.87,-560.06C1684.71,-539.87 1531.35,-496.98 1457.89,-476.44"/>
+<polygon fill="black" stroke="black" points="1458.64,-473.01 1448.07,-473.69 1456.76,-479.75 1458.64,-473.01"/>
+</g>
+<!-- ofono -->
+<g id="node16" class="node">
+<title>ofono</title>
+<polygon fill="yellow" stroke="black" points="1657.54,-456.54 1657.54,-471.46 1637.89,-482 1610.11,-482 1590.46,-471.46 1590.46,-456.54 1610.11,-446 1637.89,-446 1657.54,-456.54"/>
+<text text-anchor="middle" x="1624" y="-460.3" font-family="Times,serif" font-size="14.00">ofono</text>
+</g>
+<!-- PulseAudio->ofono -->
+<g id="edge14" class="edge">
+<title>PulseAudio->ofono</title>
+<path fill="none" stroke="black" d="M1763.93,-557.72C1752.25,-552.02 1739.38,-544.66 1729,-536 1713.44,-523.01 1716.91,-512.56 1701,-500 1689.41,-490.85 1675.04,-483.49 1661.86,-477.92"/>
+<polygon fill="black" stroke="black" points="1663.12,-474.65 1652.53,-474.18 1660.52,-481.15 1663.12,-474.65"/>
+</g>
+<!-- sox -->
+<g id="node17" class="node">
+<title>sox</title>
+<g id="a_node17"><a xlink:href="http://sox.sourceforge.net/Docs/Features" xlink:title="sox">
+<ellipse fill="lightgrey" stroke="black" cx="1779" cy="-464" rx="27" ry="18"/>
+<text text-anchor="middle" x="1779" y="-460.3" font-family="Times,serif" font-size="14.00">sox</text>
+</a>
+</g>
+</g>
+<!-- PulseAudio->sox -->
+<g id="edge15" class="edge">
+<title>PulseAudio->sox</title>
+<path fill="none" stroke="black" d="M1788.15,-553.97C1783.64,-537.28 1779.23,-511.58 1777.37,-492.08"/>
+<polygon fill="black" stroke="black" points="1780.85,-491.7 1776.61,-481.99 1773.87,-492.22 1780.85,-491.7"/>
+</g>
+<!-- PulseAudio->PipeWire -->
+<g id="edge49" class="edge">
+<title>PulseAudio->PipeWire</title>
+<path fill="none" stroke="black" d="M1767.42,-548.6C1762.78,-544.57 1758.14,-540.28 1754,-536 1739.91,-521.43 1739.75,-514.9 1726,-500 1701.89,-473.88 1694.61,-468.39 1667,-446 1646.1,-429.05 1621.34,-411.41 1602.34,-398.34"/>
+<polygon fill="black" stroke="black" points="1765.24,-551.34 1775.14,-555.1 1769.74,-545.99 1765.24,-551.34"/>
+<polygon fill="black" stroke="black" points="1604.29,-395.43 1594.05,-392.68 1600.34,-401.21 1604.29,-395.43"/>
+</g>
+<!-- bluez->Bluetooth card -->
+<g id="edge19" class="edge">
+<title>bluez->Bluetooth card</title>
+<path fill="none" stroke="green" d="M1381.74,-456.27C1365.83,-451.29 1348.52,-442.7 1339,-428 1334.62,-421.23 1334.51,-412.92 1336.19,-405.04"/>
+<polygon fill="green" stroke="green" points="1339.55,-406 1339.08,-395.42 1332.85,-403.99 1339.55,-406"/>
+</g>
+<!-- ofono->phone modem -->
+<g id="edge17" class="edge">
+<title>ofono->phone modem</title>
+<path fill="none" stroke="green" d="M1600.79,-450.82C1575.58,-437.59 1534.78,-416.18 1503.92,-400"/>
+<polygon fill="green" stroke="green" points="1505.18,-396.7 1494.69,-395.15 1501.92,-402.9 1505.18,-396.7"/>
+</g>
+<!-- sox->filesystem -->
+<g id="edge20" class="edge">
+<title>sox->filesystem</title>
+<path fill="none" stroke="black" d="M1771.69,-446.43C1760.3,-422.74 1735.92,-379.76 1701,-359 1650.29,-328.86 1484.8,-314.27 1393.64,-308.36"/>
+<polygon fill="black" stroke="black" points="1393.64,-304.85 1383.44,-307.71 1393.2,-311.84 1393.64,-304.85"/>
+</g>
+<!-- sox->null -->
+<g id="edge21" class="edge">
+<title>sox->null</title>
+<path fill="none" stroke="red" d="M1784.72,-446.03C1792.65,-422.47 1807.45,-378.51 1820,-341 1821.24,-337.28 1822.56,-333.35 1823.84,-329.5"/>
+<polygon fill="red" stroke="red" points="1827.26,-330.31 1827.1,-319.72 1820.62,-328.1 1827.26,-330.31"/>
+</g>
+<!-- sox->ALSA -->
+<g id="edge24" class="edge">
+<title>sox->ALSA</title>
+<path fill="none" stroke="black" d="M1756.76,-474.32C1704.55,-496.35 1570.3,-553.85 1461,-608 1416.14,-630.22 1408.84,-644.05 1362,-661.74 1327.42,-674.8 1286.52,-683.85 1255.71,-689.47"/>
+<polygon fill="black" stroke="black" points="1254.91,-686.05 1245.68,-691.24 1256.13,-692.95 1254.91,-686.05"/>
+</g>
+<!-- sox->PulseAudio -->
+<g id="edge23" class="edge">
+<title>sox->PulseAudio</title>
+<path fill="none" stroke="black" d="M1786.64,-481.29C1791.22,-497.91 1795.72,-523.97 1797.61,-543.74"/>
+<polygon fill="black" stroke="black" points="1794.14,-544.26 1798.38,-553.97 1801.12,-543.73 1794.14,-544.26"/>
+</g>
+<!-- libao -->
+<g id="node19" class="node">
+<title>libao</title>
+<g id="a_node19"><a xlink:href="https://www.xiph.org/ao/" xlink:title="libao">
+<ellipse fill="lightgrey" stroke="black" cx="1663" cy="-377" rx="28.7" ry="18"/>
+<text text-anchor="middle" x="1663" y="-373.3" 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="M1761.38,-450.09C1742.25,-436.07 1711.47,-413.52 1689.43,-397.37"/>
+<polygon fill="black" stroke="black" points="1691.3,-394.4 1681.17,-391.31 1687.16,-400.05 1691.3,-394.4"/>
+</g>
+<!-- X11 bell -->
+<g id="node18" class="node">
+<title>X11 bell</title>
+<ellipse fill="lightgrey" stroke="black" cx="1724" cy="-697.74" rx="41.69" ry="18"/>
+<text text-anchor="middle" x="1724" y="-694.04" font-family="Times,serif" font-size="14.00">X11 bell</text>
+</g>
+<!-- X11 bell->PulseAudio -->
+<g id="edge16" class="edge">
+<title>X11 bell->PulseAudio</title>
+<path fill="none" stroke="black" d="M1733.16,-679.92C1743.01,-661.97 1759.25,-632.77 1774,-608 1775.91,-604.79 1777.96,-601.44 1780,-598.13"/>
+<polygon fill="black" stroke="black" points="1782.98,-599.97 1785.32,-589.63 1777.05,-596.26 1782.98,-599.97"/>
+</g>
+<!-- libao->filesystem -->
+<g id="edge25" class="edge">
+<title>libao->filesystem</title>
+<path fill="none" stroke="black" d="M1641.24,-365.2C1636.01,-362.91 1630.38,-360.67 1625,-359 1546.91,-334.72 1453.52,-319.83 1393.51,-312"/>
+<polygon fill="black" stroke="black" points="1393.81,-308.51 1383.44,-310.71 1392.92,-315.45 1393.81,-308.51"/>
+</g>
+<!-- libao->null -->
+<g id="edge31" class="edge">
+<title>libao->null</title>
+<path fill="none" stroke="red" d="M1691.38,-374.78C1722.02,-372.24 1771.13,-364.49 1806,-341 1811.24,-337.47 1815.8,-332.51 1819.56,-327.39"/>
+<polygon fill="red" stroke="red" points="1822.59,-329.15 1825.14,-318.87 1816.74,-325.32 1822.59,-329.15"/>
+</g>
+<!-- libao->ALSA -->
+<g id="edge27" class="edge">
+<title>libao->ALSA</title>
+<path fill="none" stroke="black" d="M1641.22,-388.73C1635.99,-391.03 1630.37,-393.28 1625,-395 1516.18,-429.88 1466.84,-380.79 1373,-446 1326.66,-478.21 1272.35,-616.21 1239,-661.74 1236.5,-665.15 1233.75,-668.65 1230.97,-672.05"/>
+<polygon fill="black" stroke="black" points="1228.27,-669.82 1224.5,-679.72 1233.62,-674.33 1228.27,-669.82"/>
+</g>
+<!-- libao->OSS -->
+<g id="edge26" class="edge">
+<title>libao->OSS</title>
+<path fill="none" stroke="black" d="M1641.8,-364.79C1636.46,-362.45 1630.63,-360.3 1625,-359 1511.27,-332.67 1216.01,-353.96 1100,-341 1047.35,-335.12 987.4,-322.71 949.4,-314.12"/>
+<polygon fill="black" stroke="black" points="949.82,-310.62 939.29,-311.8 948.26,-317.44 949.82,-310.62"/>
+</g>
+<!-- libao->sndio -->
+<g id="edge34" class="edge">
+<title>libao->sndio</title>
+<path fill="none" stroke="black" d="M1658.62,-358.99C1648.77,-324.03 1621.59,-243.62 1570,-199 1537.56,-170.94 1489.59,-157.16 1456.04,-150.59"/>
+<polygon fill="black" stroke="black" points="1456.59,-147.14 1446.12,-148.78 1455.33,-154.02 1456.59,-147.14"/>
+</g>
+<!-- libao->PulseAudio -->
+<g id="edge29" class="edge">
+<title>libao->PulseAudio</title>
+<path fill="none" stroke="black" d="M1674.7,-393.58C1691.85,-416.57 1724.66,-461.07 1751,-500 1761.03,-514.83 1771.79,-531.75 1780.26,-545.36"/>
+<polygon fill="black" stroke="black" points="1777.49,-547.52 1785.73,-554.18 1783.44,-543.83 1777.49,-547.52"/>
+</g>
+<!-- libao->aRts -->
+<g id="edge28" class="edge">
+<title>libao->aRts</title>
+<path fill="none" stroke="black" d="M1641.8,-364.79C1636.46,-362.45 1630.63,-360.3 1625,-359 1461.98,-321.32 1035.05,-363.64 873,-322 725.83,-284.18 564.28,-197.67 500.32,-161.44"/>
+<polygon fill="black" stroke="black" points="502.02,-158.38 491.6,-156.47 498.55,-164.46 502.02,-158.38"/>
+</g>
+<!-- ESD -->
+<g id="node21" class="node">
+<title>ESD</title>
+<ellipse fill="lightgrey" stroke="black" cx="839" cy="-144" rx="27.1" ry="18"/>
+<text text-anchor="middle" x="839" y="-140.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="M1641.36,-364.79C1636.12,-362.51 1630.46,-360.39 1625,-359 1522.4,-332.89 1253.08,-346.17 1150,-322 1049.24,-298.37 1021.1,-290.9 934,-235 904.76,-216.23 876.55,-187.77 858.58,-167.89"/>
+<polygon fill="black" stroke="black" points="861.02,-165.36 851.76,-160.21 855.78,-170.01 861.02,-165.36"/>
+</g>
+<!-- NAS -->
+<g id="node22" class="node">
+<title>NAS</title>
+<ellipse fill="lightgrey" stroke="black" cx="295" cy="-304" rx="90.98" ry="18"/>
+<text text-anchor="middle" x="295" y="-300.3" font-family="Times,serif" font-size="14.00">Network Audio Server</text>
+</g>
+<!-- libao->NAS -->
+<g id="edge32" class="edge">
+<title>libao->NAS</title>
+<path fill="none" stroke="black" d="M1641.81,-364.75C1636.47,-362.41 1630.64,-360.27 1625,-359 1539.57,-339.74 924.49,-344.9 837,-341 679.11,-333.96 495.66,-320.71 387.78,-312.39"/>
+<polygon fill="black" stroke="black" points="387.82,-308.89 377.58,-311.61 387.28,-315.87 387.82,-308.89"/>
+</g>
+<!-- libao->RoarAudio -->
+<g id="edge33" class="edge">
+<title>libao->RoarAudio</title>
+<path fill="none" stroke="black" d="M1641.33,-364.89C1636.1,-362.61 1630.44,-360.46 1625,-359 1472.66,-318.06 1425.57,-358.06 1272,-322 1183.41,-301.2 1084.72,-259.83 1031.72,-236.01"/>
+<polygon fill="black" stroke="black" points="1032.92,-232.71 1022.37,-231.78 1030.04,-239.09 1032.92,-232.71"/>
+</g>
+<!-- ESD->network card -->
+<g id="edge43" class="edge">
+<title>ESD->network card</title>
+<path fill="none" stroke="black" d="M858.25,-131.12C874.33,-121.19 897.71,-106.75 917.35,-94.63"/>
+<polygon fill="black" stroke="black" points="919.39,-97.48 926.06,-89.25 915.72,-91.52 919.39,-97.48"/>
+</g>
+<!-- ESD->ALSA -->
+<g id="edge42" class="edge">
+<title>ESD->ALSA</title>
+<path fill="none" stroke="black" d="M829.04,-160.95C809.48,-194.27 769.33,-273.77 786,-341 809.58,-436.13 832.75,-455.73 889,-536 932.29,-597.78 936.85,-625.49 1003,-661.74 1052.63,-688.94 1118.26,-695.98 1161.97,-697.34"/>
+<polygon fill="black" stroke="black" points="1161.97,-700.84 1172.04,-697.56 1162.12,-693.84 1161.97,-700.84"/>
+</g>
+<!-- ESD->OSS -->
+<g id="edge41" class="edge">
+<title>ESD->OSS</title>
+<path fill="none" stroke="black" d="M841.72,-162.21C845.07,-180.8 851.76,-210.98 863,-235 870.31,-250.63 881.25,-266.48 890.84,-278.94"/>
+<polygon fill="black" stroke="black" points="888.25,-281.31 897.2,-286.98 893.74,-276.96 888.25,-281.31"/>
+</g>
+<!-- NAS->network card -->
+<g id="edge108" class="edge">
+<title>NAS->network card</title>
+<path fill="none" stroke="black" d="M302.48,-285.82C319.72,-248.65 366.21,-161.24 436,-126 516.21,-85.5 784.1,-75.34 899.91,-72.82"/>
+<polygon fill="black" stroke="black" points="900.04,-76.32 909.97,-72.61 899.9,-69.32 900.04,-76.32"/>
+</g>
+<!-- RoarAudio->network card -->
+<g id="edge40" class="edge">
+<title>RoarAudio->network card</title>
+<path fill="none" stroke="black" d="M985.67,-188.93C978.69,-163.16 968.25,-124.6 961.28,-98.89"/>
+<polygon fill="black" stroke="black" points="982.38,-190.18 988.37,-198.92 989.14,-188.35 982.38,-190.18"/>
+<polygon fill="black" stroke="black" points="964.61,-97.8 958.62,-89.06 957.86,-99.63 964.61,-97.8"/>
+<text text-anchor="middle" x="1047.5" y="-140.3" font-family="Times,serif" font-size="14.00">IPv4, DECnet, OpenSLP</text>
+</g>
+<!-- RoarAudio->sndio -->
+<g id="edge36" class="edge">
+<title>RoarAudio->sndio</title>
+<path fill="none" stroke="black" d="M1034.71,-206.98C1071.11,-199.27 1125.41,-188.17 1173,-180 1245.11,-167.63 1329.72,-156.17 1377.98,-149.93"/>
+<polygon fill="black" stroke="black" points="1378.53,-153.38 1388,-148.64 1377.63,-146.44 1378.53,-153.38"/>
+</g>
+<!-- RoarAudio->PulseAudio -->
+<g id="edge37" class="edge">
+<title>RoarAudio->PulseAudio</title>
+<path fill="none" stroke="black" d="M1033.4,-227.72C1084.95,-239.63 1177,-259.32 1257,-268 1291.2,-271.71 1851.8,-261.55 1876,-286 1891.69,-301.85 1907.2,-485.45 1868,-536 1861.74,-544.07 1853.14,-550.39 1844.06,-555.31"/>
+<polygon fill="black" stroke="black" points="1842.35,-552.24 1834.89,-559.76 1845.41,-558.54 1842.35,-552.24"/>
+</g>
+<!-- RoarAudio->aRts -->
+<g id="edge39" class="edge">
+<title>RoarAudio->aRts</title>
+<path fill="none" stroke="black" d="M946.76,-209.7C844.49,-195.76 600.84,-162.56 508.41,-149.96"/>
+<polygon fill="black" stroke="black" points="508.79,-146.48 498.41,-148.6 507.85,-153.42 508.79,-146.48"/>
+</g>
+<!-- RoarAudio->ESD -->
+<g id="edge38" class="edge">
+<title>RoarAudio->ESD</title>
+<path fill="none" stroke="black" d="M963.31,-202.31C936.53,-189.96 897.29,-171.87 870.09,-159.33"/>
+<polygon fill="black" stroke="black" points="871.2,-155.99 860.66,-154.98 868.27,-162.35 871.2,-155.99"/>
+</g>
+<!-- libcanberra -->
+<g id="node24" class="node">
+<title>libcanberra</title>
+<g id="a_node24"><a xlink:href="http://git.0pointer.net/libcanberra.git/tree/src/driver-order.c" xlink:title="libcanberra">
+<ellipse fill="lightgrey" stroke="black" cx="1350" cy="-843.74" rx="50.09" ry="18"/>
+<text text-anchor="middle" x="1350" y="-840.04" font-family="Times,serif" font-size="14.00">libcanberra</text>
+</a>
+</g>
+</g>
+<!-- libcanberra->null -->
+<g id="edge48" class="edge">
+<title>libcanberra->null</title>
+<path fill="none" stroke="red" d="M1346.38,-825.56C1329.31,-743.54 1258.96,-394.4 1291,-359 1324.35,-322.15 1669,-309.39 1790.16,-306.02"/>
+<polygon fill="red" stroke="red" points="1790.27,-309.51 1800.17,-305.74 1790.08,-302.52 1790.27,-309.51"/>
+</g>
+<!-- libcanberra->ALSA -->
+<g id="edge46" class="edge">
+<title>libcanberra->ALSA</title>
+<path fill="none" stroke="black" d="M1308.19,-833.67C1282.34,-825.94 1250.48,-812.23 1231,-788.74 1216.45,-771.19 1211.26,-745.48 1209.54,-726.03"/>
+<polygon fill="black" stroke="black" points="1213.03,-725.72 1208.9,-715.96 1206.04,-726.16 1213.03,-725.72"/>
+</g>
+<!-- libcanberra->OSS -->
+<g id="edge45" class="edge">
+<title>libcanberra->OSS</title>
+<path fill="none" stroke="black" d="M1300.01,-842.24C1189.85,-838.29 924.94,-812.68 786,-661.74 694.37,-562.19 674.64,-468.58 754,-359 780.89,-321.87 834.97,-310.03 872.07,-306.39"/>
+<polygon fill="black" stroke="black" points="872.37,-309.88 882.05,-305.57 871.8,-302.9 872.37,-309.88"/>
+</g>
+<!-- libcanberra->PulseAudio -->
+<g id="edge44" class="edge">
+<title>libcanberra->PulseAudio</title>
+<path fill="none" stroke="black" d="M1374.61,-827.85C1449.84,-782.36 1676.77,-645.11 1762.62,-593.19"/>
+<polygon fill="black" stroke="black" points="1764.44,-596.18 1771.19,-588.01 1760.82,-590.19 1764.44,-596.18"/>
+</g>
+<!-- gstreamer -->
+<g id="node25" class="node">
+<title>gstreamer</title>
+<ellipse fill="lightgrey" stroke="black" cx="1680" cy="-770.74" rx="46.29" ry="18"/>
+<text text-anchor="middle" x="1680" y="-767.04" font-family="Times,serif" font-size="14.00">gstreamer</text>
+</g>
+<!-- libcanberra->gstreamer -->
+<g id="edge47" class="edge">
+<title>libcanberra->gstreamer</title>
+<path fill="none" stroke="black" d="M1395.59,-836.21C1436.71,-829.99 1498.72,-819.82 1552,-807.74 1580,-801.39 1611,-792.72 1635.48,-785.47"/>
+<polygon fill="black" stroke="black" points="1636.63,-788.79 1645.21,-782.57 1634.62,-782.08 1636.63,-788.79"/>
+</g>
+<!-- gstreamer->ALSA -->
+<g id="edge109" class="edge">
+<title>gstreamer->ALSA</title>
+<path fill="none" stroke="black" d="M1637.79,-763.38C1549.84,-750.12 1347.56,-719.63 1255.8,-705.79"/>
+<polygon fill="black" stroke="black" points="1256.1,-702.3 1245.69,-704.27 1255.06,-709.22 1256.1,-702.3"/>
+</g>
+<!-- gstreamer->JACK -->
+<g id="edge111" class="edge">
+<title>gstreamer->JACK</title>
+<path fill="none" stroke="black" d="M1665.05,-753.4C1656.52,-743.25 1646.3,-729.54 1640,-715.74 1609.42,-648.75 1644.54,-615.48 1604,-554 1596.46,-542.57 1588.07,-546.25 1579,-536 1567.26,-522.74 1557.63,-505.34 1550.88,-491.09"/>
+<polygon fill="black" stroke="black" points="1553.99,-489.47 1546.67,-481.81 1547.62,-492.36 1553.99,-489.47"/>
+</g>
+<!-- gstreamer->OSS -->
+<g id="edge110" class="edge">
+<title>gstreamer->OSS</title>
+<path fill="none" stroke="black" d="M1714.66,-758.83C1732.06,-752.76 1753.17,-744.46 1771,-734.74 1836.7,-698.92 1842.72,-663.45 1857,-590 1878.49,-479.48 1857.35,-401.28 1753,-359 1703.02,-338.75 1321.8,-344.71 1268,-341 1152.32,-333.03 1016.13,-317.62 950.41,-309.8"/>
+<polygon fill="black" stroke="black" points="950.45,-306.28 940.1,-308.57 949.61,-313.23 950.45,-306.28"/>
+</g>
+<!-- gstreamer->sndio -->
+<g id="edge58" class="edge">
+<title>gstreamer->sndio</title>
+<path fill="none" stroke="black" d="M1722.31,-763.53C1790.22,-752.07 1925.89,-722.96 2024,-661.74 2039.61,-652 2252,-439.9 2252,-421.5 2252,-421.5 2252,-421.5 2252,-216 2252,-159.89 2186.31,-189.44 2131,-180 1999.96,-157.63 1588.24,-148.19 1457.36,-145.7"/>
+<polygon fill="black" stroke="black" points="1457.07,-142.2 1447,-145.51 1456.93,-149.2 1457.07,-142.2"/>
+</g>
+<!-- gstreamer->PulseAudio -->
+<g id="edge112" class="edge">
+<title>gstreamer->PulseAudio</title>
+<path fill="none" stroke="black" d="M1714.85,-758.74C1735.67,-750.33 1760.75,-736.56 1775,-715.74 1798.66,-681.16 1800.36,-630.82 1798.71,-600.09"/>
+<polygon fill="black" stroke="black" points="1802.2,-599.83 1798.01,-590.09 1795.21,-600.31 1802.2,-599.83"/>
+</g>
+<!-- gstreamer->PipeWire -->
+<g id="edge52" class="edge">
+<title>gstreamer->PipeWire</title>
+<path fill="none" stroke="black" d="M1650.07,-756.88C1615.25,-740.25 1558.84,-707.86 1530,-661.74 1478.64,-579.6 1460.35,-534.82 1499,-446 1507.45,-426.57 1524.5,-410.18 1540,-398.36"/>
+<polygon fill="black" stroke="black" points="1542.34,-400.98 1548.38,-392.28 1538.23,-395.32 1542.34,-400.98"/>
+</g>
+<!-- PipeWire->? -->
+<g id="edge53" class="edge">
+<title>PipeWire->?</title>
+<path fill="none" stroke="red" d="M1540.42,-364.25C1533.45,-362.12 1526.05,-360.2 1519,-359 1365.59,-332.97 974.55,-345.37 819,-341 680.32,-337.11 327.69,-362.49 195,-322 193.58,-321.57 192.15,-321.03 190.75,-320.43"/>
+<polygon fill="red" stroke="red" points="192.35,-317.32 181.88,-315.69 189.05,-323.49 192.35,-317.32"/>
+</g>
+<!-- OpenAL -->
+<g id="node27" class="node">
+<title>OpenAL</title>
+<g id="a_node27"><a xlink:href="https://www.openal-soft.org/" xlink:title="OpenAL">
+<ellipse fill="lightgrey" stroke="black" cx="1855" cy="-843.74" rx="41.69" ry="18"/>
+<text text-anchor="middle" x="1855" y="-840.04" font-family="Times,serif" font-size="14.00">OpenAL</text>
+</a>
+</g>
+</g>
+<!-- OpenAL->filesystem -->
+<g id="edge65" class="edge">
+<title>OpenAL->filesystem</title>
+<path fill="none" stroke="black" d="M1895.61,-839.38C1956.31,-833.42 2066.14,-818.7 2090,-788.74 2194.6,-657.38 2039.12,-574.48 1931,-446 1894.35,-402.45 1888.8,-382.6 1837,-359 1759.31,-323.61 1510.18,-310.86 1393.44,-306.75"/>
+<polygon fill="black" stroke="black" points="1393.36,-303.25 1383.24,-306.4 1393.12,-310.24 1393.36,-303.25"/>
+</g>
+<!-- OpenAL->null -->
+<g id="edge66" class="edge">
+<title>OpenAL->null</title>
+<path fill="none" stroke="red" d="M1896.16,-840.99C1947.43,-837.93 2037.26,-829.68 2111,-807.74 2201.31,-780.86 2252.9,-796.16 2302,-715.74 2326.96,-674.87 2309.34,-655.32 2302,-608 2288.06,-518.13 2302.1,-479.44 2240,-413 2188.87,-358.29 1959.27,-322.09 1868.8,-309.72"/>
+<polygon fill="red" stroke="red" points="1869.11,-306.23 1858.73,-308.37 1868.18,-313.17 1869.11,-306.23"/>
+</g>
+<!-- OpenAL->portaudio -->
+<g id="edge63" class="edge">
+<title>OpenAL->portaudio</title>
+<path fill="none" stroke="black" d="M1891.75,-835.23C1916.93,-829.39 1950.75,-820.19 1979,-807.74 1988.68,-803.47 1998.66,-797.8 2007.55,-792.23"/>
+<polygon fill="black" stroke="black" points="2009.54,-795.12 2016.03,-786.75 2005.74,-789.24 2009.54,-795.12"/>
+</g>
+<!-- OpenAL->ALSA -->
+<g id="edge60" class="edge">
+<title>OpenAL->ALSA</title>
+<path fill="none" stroke="black" d="M1814.14,-839.69C1759.63,-835.15 1660.32,-825.2 1577,-807.74 1454.8,-782.13 1314.33,-735.61 1247.81,-712.52"/>
+<polygon fill="black" stroke="black" points="1248.75,-709.14 1238.16,-709.15 1246.45,-715.75 1248.75,-709.14"/>
+</g>
+<!-- OpenAL->JACK -->
+<g id="edge64" class="edge">
+<title>OpenAL->JACK</title>
+<path fill="none" stroke="black" d="M1815.21,-838.28C1756.83,-830.96 1651.96,-814.56 1625,-788.74 1540.67,-707.98 1536.36,-554.55 1538.4,-492.28"/>
+<polygon fill="black" stroke="black" points="1541.91,-492.22 1538.82,-482.09 1534.91,-491.93 1541.91,-492.22"/>
+</g>
+<!-- OpenAL->OSS -->
+<g id="edge61" class="edge">
+<title>OpenAL->OSS</title>
+<path fill="none" stroke="black" d="M1813.36,-842.32C1757.42,-840.7 1655.51,-833.99 1573,-807.74 1442.26,-766.14 1419.15,-731.49 1301,-661.74 1269.32,-643.04 1048.88,-508.14 1023,-482 1010.76,-469.64 954.26,-376.9 926.49,-330.82"/>
+<polygon fill="black" stroke="black" points="929.34,-328.77 921.19,-322 923.34,-332.38 929.34,-328.77"/>
+</g>
+<!-- OpenAL->PulseAudio -->
+<g id="edge59" class="edge">
+<title>OpenAL->PulseAudio</title>
+<path fill="none" stroke="black" d="M1875.14,-827.92C1886.55,-818.21 1899.76,-804.44 1906,-788.74 1911.91,-773.87 1908.33,-768.57 1906,-752.74 1901.06,-719.22 1899.58,-709.83 1884,-679.74 1865.4,-643.82 1854.11,-638.89 1828,-608 1824.99,-604.44 1821.74,-600.74 1818.51,-597.14"/>
+<polygon fill="black" stroke="black" points="1820.89,-594.54 1811.57,-589.5 1815.71,-599.25 1820.89,-594.54"/>
+</g>
+<!-- SoundIO -->
+<g id="node28" class="node">
+<title>SoundIO</title>
+<g id="a_node28"><a xlink:href="http://libsound.io/" xlink:title="SoundIO">
+<ellipse fill="lightgrey" stroke="black" cx="1855" cy="-770.74" rx="42.49" ry="18"/>
+<text text-anchor="middle" x="1855" y="-767.04" font-family="Times,serif" font-size="14.00">SoundIO</text>
+</a>
+</g>
+</g>
+<!-- OpenAL->SoundIO -->
+<g id="edge62" class="edge">
+<title>OpenAL->SoundIO</title>
+<path fill="none" stroke="black" d="M1855,-825.55C1855,-817.53 1855,-807.79 1855,-798.81"/>
+<polygon fill="black" stroke="black" points="1858.5,-798.77 1855,-788.77 1851.5,-798.77 1858.5,-798.77"/>
+</g>
+<!-- SoundIO->null -->
+<g id="edge70" class="edge">
+<title>SoundIO->null</title>
+<path fill="none" stroke="red" d="M1877.11,-755.39C1938.58,-713.51 2105.15,-585.56 2076,-446 2067.37,-404.7 2070.06,-386.43 2038,-359 1992,-319.64 1920.56,-308.54 1875.05,-305.65"/>
+<polygon fill="red" stroke="red" points="1875.09,-302.15 1864.91,-305.12 1874.72,-309.14 1875.09,-302.15"/>
+</g>
+<!-- SoundIO->ALSA -->
+<g id="edge69" class="edge">
+<title>SoundIO->ALSA</title>
+<path fill="none" stroke="black" d="M1815.87,-763.81C1792.44,-760.35 1762.05,-756.04 1735,-752.74 1558.42,-731.18 1347.78,-711.32 1255.82,-702.94"/>
+<polygon fill="black" stroke="black" points="1256,-699.44 1245.72,-702.02 1255.36,-706.41 1256,-699.44"/>
+</g>
+<!-- SoundIO->JACK -->
+<g id="edge67" class="edge">
+<title>SoundIO->JACK</title>
+<path fill="none" stroke="black" d="M1844.25,-753.26C1818.98,-715.27 1752.59,-619.79 1682,-554 1651.16,-525.25 1639.88,-522.15 1604,-500 1593.85,-493.74 1582.51,-487.34 1572.22,-481.77"/>
+<polygon fill="black" stroke="black" points="1573.61,-478.54 1563.14,-476.9 1570.3,-484.71 1573.61,-478.54"/>
+</g>
+<!-- SoundIO->PulseAudio -->
+<g id="edge68" class="edge">
+<title>SoundIO->PulseAudio</title>
+<path fill="none" stroke="black" d="M1849.87,-752.62C1839.55,-718.24 1816.26,-640.55 1803.96,-599.53"/>
+<polygon fill="black" stroke="black" points="1807.3,-598.51 1801.08,-589.94 1800.6,-600.52 1807.3,-598.51"/>
+</g>
+<!-- RtAudio -->
+<g id="node29" class="node">
+<title>RtAudio</title>
+<g id="a_node29"><a xlink:href="https://www.music.mcgill.ca/~gary/rtaudio/apinotes.html" xlink:title="RtAudio">
+<ellipse fill="lightgrey" stroke="black" cx="1281" cy="-770.74" rx="40.89" ry="18"/>
+<text text-anchor="middle" x="1281" y="-767.04" font-family="Times,serif" font-size="14.00">RtAudio</text>
+</a>
+</g>
+</g>
+<!-- RtAudio->ALSA -->
+<g id="edge72" class="edge">
+<title>RtAudio->ALSA</title>
+<path fill="none" stroke="black" d="M1278.54,-752.72C1276.95,-746.26 1274.32,-739.16 1270,-733.74 1263.73,-725.88 1255.18,-719.45 1246.46,-714.35"/>
+<polygon fill="black" stroke="black" points="1247.88,-711.14 1237.41,-709.51 1244.58,-717.31 1247.88,-711.14"/>
+</g>
+<!-- RtAudio->JACK -->
+<g id="edge73" class="edge">
+<title>RtAudio->JACK</title>
+<path fill="none" stroke="black" d="M1298.28,-754.34C1337.58,-718.73 1435.23,-626.75 1500,-536 1510.22,-521.68 1519.94,-504.53 1527.25,-490.67"/>
+<polygon fill="black" stroke="black" points="1530.41,-492.17 1531.89,-481.68 1524.19,-488.95 1530.41,-492.17"/>
+</g>
+<!-- RtAudio->OSS -->
+<g id="edge71" class="edge">
+<title>RtAudio->OSS</title>
+<path fill="none" stroke="black" d="M1244.4,-762.51C1187.27,-749.83 1075.45,-719.3 998,-661.74 941.35,-619.64 923.77,-602.81 901,-536 877.01,-465.62 892.97,-376.16 903.63,-332.07"/>
+<polygon fill="black" stroke="black" points="907.09,-332.67 906.13,-322.12 900.3,-330.97 907.09,-332.67"/>
+<text text-anchor="middle" x="928.5" y="-514.3" font-family="Times,serif" font-size="14.00">OSS 4.0+</text>
+</g>
+<!-- RtAudio->PulseAudio -->
+<g id="edge74" class="edge">
+<title>RtAudio->PulseAudio</title>
+<path fill="none" stroke="black" d="M1313.4,-759.46C1334.67,-752.63 1363.07,-743.37 1388,-734.74 1443.36,-715.58 1581.93,-662.46 1583,-661.74 1610.09,-643.56 1604.63,-624.11 1633,-608 1664,-590.4 1702.9,-581.63 1734.93,-577.27"/>
+<polygon fill="black" stroke="black" points="1735.57,-580.72 1745.06,-576.01 1734.71,-573.77 1735.57,-580.72"/>
+</g>
+<!-- JUCE -->
+<g id="node30" class="node">
+<title>JUCE</title>
+<ellipse fill="lightgrey" stroke="black" cx="1052" cy="-770.74" rx="31.7" ry="18"/>
+<text text-anchor="middle" x="1052" y="-767.04" font-family="Times,serif" font-size="14.00">JUCE</text>
+</g>
+<!-- JUCE->? -->
+<g id="edge77" class="edge">
+<title>JUCE->?</title>
+<path fill="none" stroke="red" d="M1022.29,-764.2C958.28,-751.59 803.49,-717.45 684,-661.74 473.86,-563.77 256.37,-382.03 189.09,-323.6"/>
+<polygon fill="red" stroke="red" points="191.13,-320.74 181.29,-316.8 186.53,-326.01 191.13,-320.74"/>
+</g>
+<!-- JUCE->ALSA -->
+<g id="edge75" class="edge">
+<title>JUCE->ALSA</title>
+<path fill="none" stroke="black" d="M1076.43,-759.04C1081.55,-756.89 1086.93,-754.69 1092,-752.74 1114.82,-743.95 1121.66,-744.7 1144,-734.74 1155.3,-729.7 1167.25,-723.38 1177.79,-717.46"/>
+<polygon fill="black" stroke="black" points="1179.7,-720.4 1186.63,-712.39 1176.21,-714.33 1179.7,-720.4"/>
+</g>
+<!-- JUCE->JACK -->
+<g id="edge76" class="edge">
+<title>JUCE->JACK</title>
+<path fill="none" stroke="black" d="M1068.28,-755.15C1089.36,-736.58 1127.61,-704.02 1163,-679.74 1284.66,-596.28 1440.85,-514.83 1507.51,-481.16"/>
+<polygon fill="black" stroke="black" points="1509.32,-484.17 1516.68,-476.55 1506.17,-477.92 1509.32,-484.17"/>
+</g>
+<!-- SDL1 -->
+<g id="node31" class="node">
+<title>SDL1</title>
+<g id="a_node31"><a xlink:href="https://hg.libsdl.org/SDL/file/fba40d9f4a73/src/audio" xlink:title="libSDL-1.2">
+<ellipse fill="lightgrey" stroke="black" cx="698" cy="-770.74" rx="50.89" ry="18"/>
+<text text-anchor="middle" x="698" y="-767.04" font-family="Times,serif" font-size="14.00">libSDL-1.2</text>
+</a>
+</g>
+</g>
+<!-- SDL1->filesystem -->
+<g id="edge90" class="edge">
+<title>SDL1->filesystem</title>
+<path fill="none" stroke="black" d="M705.48,-752.79C729.14,-700.81 807.16,-541.41 914,-446 1005.24,-364.52 1048.49,-366.11 1168,-340 1204.83,-331.95 1246.36,-323.09 1278.41,-316.3"/>
+<polygon fill="black" stroke="black" points="1279.41,-319.67 1288.47,-314.17 1277.96,-312.82 1279.41,-319.67"/>
+</g>
+<!-- SDL1->null -->
+<g id="edge94" class="edge">
+<title>SDL1->null</title>
+<path fill="none" stroke="red" d="M715.58,-753.73C756.32,-716.47 859.93,-620.66 942,-536 979.46,-497.36 979.3,-477.41 1023,-446 1102.04,-389.18 1131.5,-389.32 1224,-359 1259.96,-347.21 1269.56,-345.5 1307,-340 1485,-313.86 1699.86,-307.23 1789.5,-305.56"/>
+<polygon fill="red" stroke="red" points="1789.61,-309.05 1799.55,-305.38 1789.49,-302.06 1789.61,-309.05"/>
+</g>
+<!-- SDL1->ALSA -->
+<g id="edge87" class="edge">
+<title>SDL1->ALSA</title>
+<path fill="none" stroke="black" d="M744.25,-763.31C841.2,-749.84 1064.79,-718.78 1162.21,-705.24"/>
+<polygon fill="black" stroke="black" points="1162.92,-708.68 1172.34,-703.83 1161.95,-701.74 1162.92,-708.68"/>
+</g>
+<!-- SDL1->OSS -->
+<g id="edge92" class="edge">
+<title>SDL1->OSS</title>
+<path fill="none" stroke="black" d="M690.68,-752.88C665.47,-691.9 588.95,-480.06 686,-359 694.95,-347.83 698.83,-345.61 712,-340 764.55,-317.62 830.76,-309.55 871.99,-306.64"/>
+<polygon fill="black" stroke="black" points="872.41,-310.12 882.16,-305.99 871.96,-303.14 872.41,-310.12"/>
+</g>
+<!-- SDL1->PulseAudio -->
+<g id="edge93" class="edge">
+<title>SDL1->PulseAudio</title>
+<path fill="none" stroke="black" d="M747.37,-766.56C844.79,-759.94 1068.5,-742.96 1255,-715.74 1337.45,-703.71 1357.19,-695.58 1439,-679.74 1480.76,-671.66 1495.78,-682.33 1533,-661.74 1561.55,-645.95 1554.25,-623.42 1583,-608 1608.83,-594.15 1682.62,-584.16 1736.11,-578.48"/>
+<polygon fill="black" stroke="black" points="1736.6,-581.95 1746.18,-577.44 1735.88,-574.99 1736.6,-581.95"/>
+</g>
+<!-- SDL1->aRts -->
+<g id="edge88" class="edge">
+<title>SDL1->aRts</title>
+<path fill="none" stroke="black" d="M679.97,-753.63C641.07,-718 548.48,-628.32 495,-536 414.16,-396.46 434.15,-341.64 420,-181 418.99,-169.58 427.46,-161.49 437.84,-155.91"/>
+<polygon fill="black" stroke="black" points="439.6,-158.95 447.26,-151.63 436.71,-152.58 439.6,-158.95"/>
+</g>
+<!-- SDL1->ESD -->
+<g id="edge89" class="edge">
+<title>SDL1->ESD</title>
+<path fill="none" stroke="black" d="M685.1,-752.94C677.62,-742.62 668.44,-728.9 662,-715.74 650.89,-693.01 649.43,-686.45 644,-661.74 624.88,-574.76 585.15,-391.49 609,-340 650.53,-250.34 755.85,-186.89 808.32,-159.74"/>
+<polygon fill="black" stroke="black" points="810.14,-162.74 817.48,-155.09 806.98,-156.5 810.14,-162.74"/>
+</g>
+<!-- SDL1->NAS -->
+<g id="edge91" class="edge">
+<title>SDL1->NAS</title>
+<path fill="none" stroke="black" d="M649.23,-765.42C605.6,-759.65 541.41,-746.33 494,-715.74 467.99,-698.96 467.22,-687.47 450,-661.74 374.56,-549 322.08,-393.54 302.97,-331.81"/>
+<polygon fill="black" stroke="black" points="306.26,-330.61 299.99,-322.07 299.57,-332.66 306.26,-330.61"/>
+</g>
+<!-- SDL2 -->
+<g id="node32" class="node">
+<title>SDL2</title>
+<g id="a_node32"><a xlink:href="https://hg.libsdl.org/SDL/file/355a4f94a782" xlink:title="libSDL-2.0">
+<ellipse fill="lightgrey" stroke="black" cx="353" cy="-770.74" rx="50.89" ry="18"/>
+<text text-anchor="middle" x="353" y="-767.04" font-family="Times,serif" font-size="14.00">libSDL-2.0</text>
+</a>
+</g>
+</g>
+<!-- SDL2->filesystem -->
+<g id="edge98" class="edge">
+<title>SDL2->filesystem</title>
+<path fill="none" stroke="black" d="M358.96,-752.68C360.92,-746.99 363.08,-740.6 365,-734.74 406.89,-606.59 359.68,-538.25 458,-446 577.77,-333.63 650.39,-369.25 812,-340 898.32,-324.38 1152.19,-312.34 1270.28,-307.42"/>
+<polygon fill="black" stroke="black" points="1270.75,-310.91 1280.6,-307 1270.46,-303.91 1270.75,-310.91"/>
+</g>
+<!-- SDL2->null -->
+<g id="edge103" class="edge">
+<title>SDL2->null</title>
+<path fill="none" stroke="red" d="M381.39,-755.63C417.52,-736.94 480.86,-701.65 528,-661.74 552.22,-641.24 552.63,-630.5 575,-608 600.53,-582.32 606.28,-574.68 636,-554 677.79,-524.93 691.35,-522.52 737,-500 895.2,-421.97 935.01,-393.5 1108,-359 1190.36,-342.57 1212.31,-346.96 1296,-340 1481.08,-324.61 1702.58,-311.98 1791.83,-307.13"/>
+<polygon fill="red" stroke="red" points="1792.25,-310.62 1802.04,-306.58 1791.87,-303.63 1792.25,-310.62"/>
+</g>
+<!-- SDL2->ALSA -->
+<g id="edge95" class="edge">
+<title>SDL2->ALSA</title>
+<path fill="none" stroke="black" d="M402.37,-766.22C486.62,-760.17 663.55,-747.22 813,-734.74 939.06,-724.22 1087.54,-710.31 1161.76,-703.26"/>
+<polygon fill="black" stroke="black" points="1162.54,-706.7 1172.16,-702.27 1161.88,-699.73 1162.54,-706.7"/>
+</g>
+<!-- SDL2->JACK -->
+<g id="edge100" class="edge">
+<title>SDL2->JACK</title>
+<path fill="none" stroke="black" d="M399.27,-763.23C440.99,-757.03 503.92,-746.86 558,-734.74 652.77,-713.5 1306.1,-524.82 1400,-500 1433.98,-491.02 1472.75,-481.37 1500.87,-474.48"/>
+<polygon fill="black" stroke="black" points="1501.83,-477.85 1510.71,-472.08 1500.17,-471.05 1501.83,-477.85"/>
+</g>
+<!-- SDL2->OSS -->
+<g id="edge104" class="edge">
+<title>SDL2->OSS</title>
+<path fill="none" stroke="black" d="M351.67,-752.42C348.22,-699.71 342.03,-537.3 385,-413 394.35,-385.97 395.66,-374.01 420,-359 495.43,-312.48 769.11,-305.88 871.76,-305.06"/>
+<polygon fill="black" stroke="black" points="872.02,-308.56 882,-304.99 871.97,-301.56 872.02,-308.56"/>
+</g>
+<!-- SDL2->sndio -->
+<g id="edge106" class="edge">
+<title>SDL2->sndio</title>
+<path fill="none" stroke="black" d="M302.81,-768.08C235.82,-762.74 120.55,-741.73 77,-661.74 62.75,-635.57 76.45,-345.22 141,-286 187.89,-242.99 1166.76,-164.49 1377.32,-148.06"/>
+<polygon fill="black" stroke="black" points="1377.62,-151.55 1387.32,-147.29 1377.08,-144.57 1377.62,-151.55"/>
+</g>
+<!-- SDL2->PulseAudio -->
+<g id="edge105" class="edge">
+<title>SDL2->PulseAudio</title>
+<path fill="none" stroke="black" d="M398.6,-762.86C580.07,-735.54 1251.47,-634.81 1465,-608 1559.7,-596.11 1669.98,-584.99 1736.32,-578.6"/>
+<polygon fill="black" stroke="black" points="1736.96,-582.06 1746.58,-577.62 1736.29,-575.09 1736.96,-582.06"/>
+</g>
+<!-- SDL2->aRts -->
+<g id="edge96" class="edge">
+<title>SDL2->aRts</title>
+<path fill="none" stroke="black" d="M302.26,-769.52C221.85,-768.31 69.57,-762.33 24,-734.74 7.55,-724.78 0,-717.97 0,-698.74 0,-698.74 0,-698.74 0,-216 0,-172.1 323.43,-152.23 434.83,-146.69"/>
+<polygon fill="black" stroke="black" points="435.11,-150.18 444.93,-146.19 434.77,-143.18 435.11,-150.18"/>
+</g>
+<!-- SDL2->ESD -->
+<g id="edge97" class="edge">
+<title>SDL2->ESD</title>
+<path fill="none" stroke="black" d="M302.16,-769.75C231.28,-768.71 107.66,-762.79 74,-734.74 17.89,-687.97 42.29,-333.35 86,-286 135.67,-232.19 657.19,-166.61 801.93,-149.34"/>
+<polygon fill="black" stroke="black" points="802.56,-152.79 812.08,-148.13 801.73,-145.83 802.56,-152.79"/>
+</g>
+<!-- SDL2->NAS -->
+<g id="edge101" class="edge">
+<title>SDL2->NAS</title>
+<path fill="none" stroke="black" d="M347.56,-752.67C345.77,-746.98 343.78,-740.59 342,-734.74 308.01,-622.74 284.61,-597.86 268,-482 265.73,-466.16 266.49,-461.93 268,-446 271.8,-405.96 281.54,-360.37 288.22,-332.14"/>
+<polygon fill="black" stroke="black" points="291.67,-332.76 290.61,-322.21 284.86,-331.11 291.67,-332.76"/>
+</g>
+<!-- FusionSound -->
+<g id="node33" class="node">
+<title>FusionSound</title>
+<ellipse fill="red" stroke="black" cx="178" cy="-634.87" rx="100.32" ry="26.74"/>
+<text text-anchor="middle" x="178" y="-638.67" font-family="Times,serif" font-size="14.00">DirectFB/FusionSound</text>
+<text text-anchor="middle" x="178" y="-623.67" font-family="Times,serif" font-size="14.00">[dead]</text>
+</g>
+<!-- SDL2->FusionSound -->
+<g id="edge99" class="edge">
+<title>SDL2->FusionSound</title>
+<path fill="none" stroke="red" d="M301.98,-769.68C260.38,-766.58 203.95,-754.78 175,-715.74 165.8,-703.33 165.17,-686.62 167.39,-671.68"/>
+<polygon fill="red" stroke="red" points="170.86,-672.18 169.32,-661.7 163.99,-670.86 170.86,-672.18"/>
+</g>
+<!-- OpenSL ES -->
+<g id="node34" class="node">
+<title>OpenSL ES</title>
+<ellipse fill="lightgrey" stroke="black" cx="237" cy="-697.74" rx="52.79" ry="18"/>
+<text text-anchor="middle" x="237" y="-694.04" font-family="Times,serif" font-size="14.00">OpenSL ES</text>
+</g>
+<!-- SDL2->OpenSL ES -->
+<g id="edge102" class="edge">
+<title>SDL2->OpenSL ES</title>
+<path fill="none" stroke="black" d="M328.68,-754.86C311.78,-744.51 289.05,-730.6 270.44,-719.21"/>
+<polygon fill="black" stroke="black" points="272.04,-716.08 261.68,-713.85 268.39,-722.05 272.04,-716.08"/>
+</g>
+<!-- FusionSound->? -->
+<g id="edge107" class="edge">
+<title>FusionSound->?</title>
+<path fill="none" stroke="red" d="M174.45,-607.92C171.57,-584.68 168,-549.63 168,-519 168,-519 168,-519 168,-376 168,-361.65 168,-345.67 168,-332.51"/>
+<polygon fill="red" stroke="red" points="171.5,-332.22 168,-322.22 164.5,-332.22 171.5,-332.22"/>
+</g>
+<!-- OpenSL ES->? -->
+<g id="edge134" class="edge">
+<title>OpenSL ES->?</title>
+<path fill="none" stroke="red" d="M262.07,-681.79C268.83,-676.39 275.3,-669.65 279,-661.74 289.13,-640.11 289.23,-629.58 279,-608 273.59,-596.58 264.01,-600.51 257,-590 192.63,-493.5 220.25,-449.52 182,-340 180.9,-336.85 179.68,-333.56 178.44,-330.32"/>
+<polygon fill="red" stroke="red" points="181.65,-328.93 174.71,-320.92 175.14,-331.5 181.65,-328.93"/>
+</g>
+<!-- phonon -->
+<g id="node35" class="node">
+<title>phonon</title>
+<ellipse fill="lightgrey" stroke="black" cx="2147" cy="-843.74" rx="37.09" ry="18"/>
+<text text-anchor="middle" x="2147" y="-840.04" font-family="Times,serif" font-size="14.00">phonon</text>
+</g>
+<!-- phonon->PulseAudio -->
+<g id="edge115" class="edge">
+<title>phonon->PulseAudio</title>
+<path fill="none" stroke="black" d="M2139.19,-825.96C2129.61,-806.64 2111.92,-774.77 2090,-752.74 2013.7,-676.05 1898.5,-618.02 1837.43,-590.56"/>
+<polygon fill="black" stroke="black" points="1838.66,-587.28 1828.1,-586.41 1835.82,-593.67 1838.66,-587.28"/>
+</g>
+<!-- phonon->gstreamer -->
+<g id="edge113" class="edge">
+<title>phonon->gstreamer</title>
+<path fill="none" stroke="black" d="M2111.9,-837.4C2030.44,-825.02 1828.22,-794.27 1732.21,-779.68"/>
+<polygon fill="black" stroke="black" points="1732.56,-776.19 1722.14,-778.15 1731.5,-783.11 1732.56,-776.19"/>
+</g>
+<!-- VLC -->
+<g id="node36" class="node">
+<title>VLC</title>
+<g id="a_node36"><a xlink:href="https://code.videolan.org/videolan/vlc/-/tree/master/modules/audio_output" xlink:title="VLC">
+<ellipse fill="lightgrey" stroke="black" cx="2358" cy="-770.74" rx="28.7" ry="18"/>
+<text text-anchor="middle" x="2358" y="-767.04" font-family="Times,serif" font-size="14.00">VLC</text>
+</a>
+</g>
+</g>
+<!-- phonon->VLC -->
+<g id="edge114" class="edge">
+<title>phonon->VLC</title>
+<path fill="none" stroke="black" d="M2183.39,-840.3C2218.57,-836.79 2272.64,-828.27 2315,-807.74 2322.52,-804.1 2329.82,-798.85 2336.22,-793.49"/>
+<polygon fill="black" stroke="black" points="2338.64,-796.02 2343.78,-786.75 2333.98,-790.79 2338.64,-796.02"/>
+</g>
+<!-- VLC->filesystem -->
+<g id="edge128" class="edge">
+<title>VLC->filesystem</title>
+<path fill="none" stroke="black" d="M2379.03,-758.32C2393.32,-749.07 2410.57,-734.51 2416,-715.74 2435.98,-646.69 2451.53,-616.49 2416,-554 2355.41,-447.46 2289.3,-466.45 2179,-413 2118.61,-383.74 2103.47,-373.71 2038,-359 1915.97,-331.58 1541.86,-313.63 1393.52,-307.42"/>
+<polygon fill="black" stroke="black" points="1393.37,-303.91 1383.24,-307 1393.08,-310.91 1393.37,-303.91"/>
+</g>
+<!-- VLC->null -->
+<g id="edge126" class="edge">
+<title>VLC->null</title>
+<path fill="none" stroke="red" d="M2385.53,-765.81C2420.96,-759.03 2478,-741.47 2478,-698.74 2478,-698.74 2478,-698.74 2478,-376 2478,-315.18 2019.79,-306.45 1875.18,-305.2"/>
+<polygon fill="red" stroke="red" points="1874.95,-301.7 1864.92,-305.12 1874.9,-308.7 1874.95,-301.7"/>
+</g>
+<!-- VLC->ALSA -->
+<g id="edge127" class="edge">
+<title>VLC->ALSA</title>
+<path fill="none" stroke="black" d="M2329.44,-767.91C2280.46,-764.77 2177.25,-758.18 2090,-752.74 1771.34,-732.87 1387.79,-709.57 1256.07,-701.59"/>
+<polygon fill="black" stroke="black" points="1256.12,-698.09 1245.93,-700.98 1255.7,-705.07 1256.12,-698.09"/>
+</g>
+<!-- VLC->JACK -->
+<g id="edge129" class="edge">
+<title>VLC->JACK</title>
+<path fill="none" stroke="black" d="M2351.84,-752.89C2343.58,-732.59 2326.99,-698.86 2302,-679.74 2081.59,-511.11 1974.92,-560.2 1704,-500 1650.07,-488.02 1634.26,-496.69 1581,-482 1578.68,-481.36 1576.32,-480.62 1573.96,-479.82"/>
+<polygon fill="black" stroke="black" points="1574.96,-476.46 1564.37,-476.26 1572.52,-483.02 1574.96,-476.46"/>
+</g>
+<!-- VLC->OSS -->
+<g id="edge131" class="edge">
+<title>VLC->OSS</title>
+<path fill="none" stroke="black" d="M2358.79,-752.74C2358.75,-746.69 2358.31,-739.85 2357,-733.74 2333.49,-623.75 2342.33,-576.63 2260,-500 2187.47,-432.49 1934.18,-378.33 1837,-359 1720.32,-335.79 1688.74,-347.38 1570,-340 1334.76,-325.38 1052.04,-311.66 950.05,-306.83"/>
+<polygon fill="black" stroke="black" points="950.07,-303.33 939.92,-306.35 949.74,-310.32 950.07,-303.33"/>
+</g>
+<!-- VLC->sndio -->
+<g id="edge133" class="edge">
+<title>VLC->sndio</title>
+<path fill="none" stroke="black" d="M2386.49,-768.31C2456.07,-764.06 2629,-748.47 2629,-698.74 2629,-698.74 2629,-698.74 2629,-259.5 2629,-156.81 2507.04,-217.34 2406,-199 2219.31,-165.11 1619.57,-149.52 1457.62,-145.86"/>
+<polygon fill="black" stroke="black" points="1457.24,-142.36 1447.16,-145.63 1457.08,-149.35 1457.24,-142.36"/>
+</g>
+<!-- VLC->PulseAudio -->
+<g id="edge132" class="edge">
+<title>VLC->PulseAudio</title>
+<path fill="none" stroke="black" d="M2332.17,-762.47C2280.82,-747.49 2163.02,-710.45 2072,-661.74 2035.85,-642.39 2034.82,-623.86 1997,-608 1952.43,-589.31 1898.28,-580.6 1857.41,-576.54"/>
+<polygon fill="black" stroke="black" points="1857.6,-573.05 1847.32,-575.61 1856.96,-580.02 1857.6,-573.05"/>
+</g>
+<!-- VLC->OpenSL ES -->
+<g id="edge130" class="edge">
+<title>VLC->OpenSL ES</title>
+<path fill="none" stroke="black" d="M2329.46,-767.61C2280.5,-764.02 2177.32,-756.78 2090,-752.74 1387.93,-720.25 535.26,-703.9 299.81,-699.79"/>
+<polygon fill="black" stroke="black" points="299.78,-696.29 289.72,-699.62 299.66,-703.29 299.78,-696.29"/>
+</g>
+<!-- ClanLib -->
+<g id="node37" class="node">
+<title>ClanLib</title>
+<g id="a_node37"><a xlink:href="https://github.com/sphair/ClanLib/tree/master/Sources/Sound/Platform/Linux" xlink:title="ClanLib">
+<ellipse fill="lightgrey" stroke="black" cx="1141" cy="-770.74" rx="39.79" ry="18"/>
+<text text-anchor="middle" x="1141" y="-767.04" font-family="Times,serif" font-size="14.00">ClanLib</text>
+</a>
+</g>
+</g>
+<!-- ClanLib->ALSA -->
+<g id="edge116" class="edge">
+<title>ClanLib->ALSA</title>
+<path fill="none" stroke="black" d="M1156.09,-753.98C1164.82,-744.87 1175.99,-733.21 1185.82,-722.95"/>
+<polygon fill="black" stroke="black" points="1188.61,-725.09 1193,-715.44 1183.56,-720.24 1188.61,-725.09"/>
+</g>
+<!-- ClanLib->OSS -->
+<g id="edge117" class="edge">
+<title>ClanLib->OSS</title>
+<path fill="none" stroke="black" d="M1110.64,-758.99C1033.49,-731.67 836,-661.74 836,-661.74 732.97,-560.49 702.84,-455.19 790,-340 808.84,-315.1 844.29,-307.09 871.98,-304.87"/>
+<polygon fill="black" stroke="black" points="872.37,-308.36 882.15,-304.28 871.97,-301.37 872.37,-308.36"/>
+</g>
+<!-- allegro -->
+<g id="node38" class="node">
+<title>allegro</title>
+<g id="a_node38"><a xlink:href="https://github.com/liballeg/allegro5/tree/master/addons/audio" xlink:title="allegro">
+<ellipse fill="lightgrey" stroke="black" cx="565" cy="-916.74" rx="35.19" ry="18"/>
+<text text-anchor="middle" x="565" y="-913.04" font-family="Times,serif" font-size="14.00">allegro</text>
+</a>
+</g>
+</g>
+<!-- allegro->OSS -->
+<g id="edge118" class="edge">
+<title>allegro->OSS</title>
+<path fill="none" stroke="black" d="M530.75,-912.26C491.34,-906.14 432,-889.5 432,-844.74 432,-844.74 432,-844.74 432,-733.74 432,-636.26 585.95,-422.39 660,-359 691.45,-332.08 809.41,-315.8 871.78,-308.89"/>
+<polygon fill="black" stroke="black" points="872.45,-312.33 882.02,-307.78 871.7,-305.37 872.45,-312.33"/>
+</g>
+<!-- allegro->PulseAudio -->
+<g id="edge120" class="edge">
+<title>allegro->PulseAudio</title>
+<path fill="none" stroke="black" d="M600.27,-915.23C823.14,-911.91 2031.73,-892.62 2193,-861.74 2287.17,-843.71 2340.85,-867.17 2396,-788.74 2530.2,-597.87 2036.64,-575.05 1858.1,-572.95"/>
+<polygon fill="black" stroke="black" points="1858.1,-569.45 1848.07,-572.85 1858.03,-576.45 1858.1,-569.45"/>
+</g>
+<!-- allegro->OpenAL -->
+<g id="edge119" class="edge">
+<title>allegro->OpenAL</title>
+<path fill="none" stroke="black" d="M599.84,-913.82C778.34,-904 1590.29,-859.31 1803.56,-847.57"/>
+<polygon fill="black" stroke="black" points="1804.06,-851.05 1813.85,-847.01 1803.67,-844.06 1804.06,-851.05"/>
+</g>
+<!-- allegro->SDL1 -->
+<g id="edge122" class="edge">
+<title>allegro->SDL1</title>
+<path fill="none" stroke="black" d="M579.49,-900.06C602.72,-874.9 648.49,-825.34 675.85,-795.72"/>
+<polygon fill="black" stroke="black" points="678.5,-798.01 682.71,-788.29 673.36,-793.26 678.5,-798.01"/>
+</g>
+<!-- allegro->SDL2 -->
+<g id="edge123" class="edge">
+<title>allegro->SDL2</title>
+<path fill="none" stroke="black" d="M530.02,-914.96C498.05,-912.61 450.88,-904.89 418,-880.74 389.91,-860.11 371.71,-823.35 361.91,-798.28"/>
+<polygon fill="black" stroke="black" points="365.1,-796.8 358.33,-788.65 358.54,-799.24 365.1,-796.8"/>
+</g>
+<!-- allegro->OpenSL ES -->
+<g id="edge121" class="edge">
+<title>allegro->OpenSL ES</title>
+<path fill="none" stroke="black" d="M530.81,-912.65C489.86,-907.58 420.58,-894.52 371,-861.74 331.39,-835.55 323.13,-825.43 293,-788.74 276.41,-768.54 261,-743.06 250.56,-724.37"/>
+<polygon fill="black" stroke="black" points="253.59,-722.62 245.71,-715.54 247.45,-725.99 253.59,-722.62"/>
+</g>
+<!-- telepathy -->
+<g id="node39" class="node">
+<title>telepathy</title>
+<ellipse fill="lightgrey" stroke="black" cx="1075" cy="-464" rx="42.79" ry="18"/>
+<text text-anchor="middle" x="1075" y="-460.3" font-family="Times,serif" font-size="14.00">telepathy</text>
+</g>
+<!-- telepathy->phone modem -->
+<g id="edge124" class="edge">
+<title>telepathy->phone modem</title>
+<path fill="none" stroke="black" d="M1113.74,-456.24C1174,-445.46 1293.94,-422.97 1404.45,-395.29"/>
+<polygon fill="black" stroke="black" points="1405.59,-398.61 1414.42,-392.77 1403.87,-391.82 1405.59,-398.61"/>
+<text text-anchor="middle" x="1327.5" y="-416.8" font-family="Times,serif" font-size="14.00" fill="red">?</text>
+</g>
+<!-- telepathy->? -->
+<g id="edge125" class="edge">
+<title>telepathy->?</title>
+<path fill="none" stroke="red" d="M1035.35,-456.88C921.71,-439.32 585.09,-387.02 306,-341 256.62,-332.86 241.74,-339.9 195,-322 193.78,-321.53 192.55,-321.01 191.33,-320.44"/>
+<polygon fill="red" stroke="red" points="192.75,-317.22 182.3,-315.46 189.37,-323.35 192.75,-317.22"/>
+</g>
+</g>
+</svg>