Driver: Implement audio scheduler (#179)

This PR implements a custom scheduler for audio threads, which reduces thread use and (often) memory consumption.

To save threads and memory (e.g., packet buffer allocations), Songbird parks Mixer tasks which do not have any live Tracks.
These are now all co-located on a single async 'Idle' task.
This task is responsible for managing UDP keepalive messages for each task, maintaining event state, and executing any Mixer task messages.
Whenever any message arrives which adds a `Track`, the mixer task is moved to a live thread.
The Idle task inspects task counts and execution time on each thread, choosing the first live thread with room, and creating a new one if needed.

Each live thread is responsible for running as many live mixers as it can in a single tick every 20ms: this currently defaults to 16 mixers per thread, but is user-configurable.
A live thread also stores RTP packet blocks to be written into by each sub-task.
Each live thread has a conservative limit of 18ms that it will aim to stay under: if all work takes longer than this, it will offload the task with the highest mixing cost once per tick onto another (possibly new) live worker thread.
This commit is contained in:
Kyle Simpson
2023-05-21 13:50:54 +01:00
parent a5f7d3f488
commit 3daf11f5d1
34 changed files with 2828 additions and 561 deletions

329
images/scheduler.svg Normal file
View File

@@ -0,0 +1,329 @@
<?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">
<svg width="100%" height="100%" viewBox="0 0 1375 1307" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;">
<g transform="matrix(1,0,0,1,-2132,-380)">
<g transform="matrix(0.960543,0,0,1,2128.12,-622.183)">
<path d="M89.27,1672.76L1407.47,1672.76" style="fill:none;stroke:rgb(186,186,186);stroke-width:3.97px;stroke-dasharray:39.71,39.71,0,0;"/>
</g>
<g transform="matrix(1,0,0,1,1783.91,-585.183)">
<text x="409.473px" y="1589.56px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:50px;">As<tspan x="460.973px " y="1589.56px ">y</tspan>nc</text>
</g>
<g transform="matrix(1,0,0,1,1783.91,-468.47)">
<text x="409.473px" y="1589.56px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:50px;">S<tspan x="435.723px " y="1589.56px ">y</tspan>nc</text>
</g>
<g transform="matrix(1,0,0,1,1536.27,-1077.6)">
<g transform="matrix(1.75342,0,0,1.61288,854.748,-134.087)">
<rect x="101.876" y="1143.29" width="184.054" height="163.884" style="fill:rgb(255,193,74);stroke:rgb(62,62,62);stroke-width:2.31px;"/>
</g>
<g transform="matrix(1,0,0,1,931.504,566.618)">
<text x="140.064px" y="1193.29px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:50px;">Idl<tspan x="198.864px " y="1193.29px ">e</tspan> Mix<tspan x="316.764px 344.264px 363.064px " y="1193.29px 1193.29px 1193.29px ">ers</tspan></text>
</g>
<g transform="matrix(1,0,0,1,91.9551,9.9189)">
<g opacity="0.5">
<g transform="matrix(0.506003,0,0,0.506003,744.793,1148.74)">
<g transform="matrix(1.01835,0,0,1.01835,-11.9813,-27.0542)">
<ellipse cx="829.267" cy="1498.79" rx="134.889" ry="73.117" style="fill:white;stroke:black;stroke-width:7.56px;"/>
</g>
<g transform="matrix(1,0,0,1,9,40.3406)">
<text x="806.428px" y="1473.58px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:50px;stroke:black;stroke-opacity:0;stroke-width:1.98px;stroke-linecap:butt;stroke-miterlimit:2;">...</text>
</g>
</g>
<g transform="matrix(0.506003,0,0,0.506003,744.011,1098.98)">
<g transform="matrix(1.01835,0,0,1.01835,-11.9813,-27.0542)">
<ellipse cx="829.267" cy="1498.79" rx="134.889" ry="73.117" style="fill:white;stroke:black;stroke-width:7.56px;"/>
</g>
<g transform="matrix(1,0,0,1,9,40.3406)">
<text x="762.453px" y="1473.58px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:50px;stroke:black;stroke-opacity:0;stroke-width:1.98px;stroke-linecap:butt;stroke-miterlimit:2;">Mix<tspan x="839.603px " y="1473.58px ">e</tspan>r</text>
</g>
</g>
<g transform="matrix(0.506003,0,0,0.506003,744.047,1049.39)">
<g transform="matrix(1.01835,0,0,1.01835,-11.9813,-27.0542)">
<ellipse cx="829.267" cy="1498.79" rx="134.889" ry="73.117" style="fill:white;stroke:black;stroke-width:7.56px;"/>
</g>
<g transform="matrix(1,0,0,1,9,40.3406)">
<text x="762.453px" y="1473.58px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:50px;stroke:black;stroke-opacity:0;stroke-width:1.98px;stroke-linecap:butt;stroke-miterlimit:2;">Mix<tspan x="839.603px " y="1473.58px ">e</tspan>r</text>
</g>
</g>
</g>
</g>
<g transform="matrix(1,0,0,1,31.9551,9.9189)">
<g opacity="0.69">
<g transform="matrix(0.506003,0,0,0.506003,744.793,1148.74)">
<g transform="matrix(1.01835,0,0,1.01835,-11.9813,-27.0542)">
<ellipse cx="829.267" cy="1498.79" rx="134.889" ry="73.117" style="fill:white;stroke:rgb(62,62,62);stroke-width:7.56px;"/>
</g>
<g transform="matrix(1,0,0,1,9,40.3406)">
<text x="806.428px" y="1473.58px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:50px;">...</text>
</g>
</g>
<g transform="matrix(0.506003,0,0,0.506003,744.011,1098.98)">
<g transform="matrix(1.01835,0,0,1.01835,-11.9813,-27.0542)">
<ellipse cx="829.267" cy="1498.79" rx="134.889" ry="73.117" style="fill:white;stroke:rgb(62,62,62);stroke-width:7.56px;"/>
</g>
<g transform="matrix(1,0,0,1,9,40.3406)">
<text x="762.453px" y="1473.58px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:50px;">Mix<tspan x="839.603px " y="1473.58px ">e</tspan>r</text>
</g>
</g>
<g transform="matrix(0.506003,0,0,0.506003,744.047,1049.39)">
<g transform="matrix(1.01835,0,0,1.01835,-11.9813,-27.0542)">
<ellipse cx="829.267" cy="1498.79" rx="134.889" ry="73.117" style="fill:white;stroke:rgb(62,62,62);stroke-width:7.56px;"/>
</g>
<g transform="matrix(1,0,0,1,9,40.3406)">
<text x="762.453px" y="1473.58px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:50px;">Mix<tspan x="839.603px " y="1473.58px ">e</tspan>r</text>
</g>
</g>
</g>
</g>
<g transform="matrix(1,0,0,1,-28.0449,9.9189)">
<g transform="matrix(0.506003,0,0,0.506003,744.793,1148.74)">
<g transform="matrix(1.01835,0,0,1.01835,-11.9813,-27.0542)">
<ellipse cx="829.267" cy="1498.79" rx="134.889" ry="73.117" style="fill:white;stroke:rgb(62,62,62);stroke-width:7.56px;"/>
</g>
<g transform="matrix(1,0,0,1,9,40.3406)">
<text x="806.428px" y="1473.58px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:50px;">...</text>
</g>
</g>
<g transform="matrix(0.506003,0,0,0.506003,744.011,1098.98)">
<g transform="matrix(1.01835,0,0,1.01835,-11.9813,-27.0542)">
<ellipse cx="829.267" cy="1498.79" rx="134.889" ry="73.117" style="fill:white;stroke:rgb(62,62,62);stroke-width:7.56px;"/>
</g>
<g transform="matrix(1,0,0,1,9,40.3406)">
<text x="762.453px" y="1473.58px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:50px;">Mix<tspan x="839.603px " y="1473.58px ">e</tspan>r</text>
</g>
</g>
<g transform="matrix(0.506003,0,0,0.506003,744.047,1049.39)">
<g transform="matrix(1.01835,0,0,1.01835,-11.9813,-27.0542)">
<ellipse cx="829.267" cy="1498.79" rx="134.889" ry="73.117" style="fill:white;stroke:rgb(62,62,62);stroke-width:7.56px;"/>
</g>
<g transform="matrix(1,0,0,1,9,40.3406)">
<text x="762.453px" y="1473.58px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:50px;">Mix<tspan x="839.603px " y="1473.58px ">e</tspan>r</text>
</g>
</g>
</g>
</g>
<g transform="matrix(1,0,0,1,1289.87,-560.521)">
<g transform="matrix(2.86943,0,0,1.72283,741.053,-259.784)">
<rect x="101.876" y="1143.29" width="184.054" height="163.884" style="fill:rgb(234,234,234);stroke:rgb(62,62,62);stroke-width:1.65px;"/>
</g>
<g transform="matrix(1,0,0,1,193.864,60.8467)">
<g transform="matrix(1.75342,0,0,1.27206,854.748,255.576)">
<rect x="101.876" y="1143.29" width="184.054" height="163.884" style="fill:rgb(219,219,219);stroke:rgb(62,62,62);stroke-width:2.54px;"/>
</g>
<g transform="matrix(1,0,0,1,931.504,566.618)">
<text x="160.901px" y="1183.91px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:37.5px;">Thr<tspan x="216.364px " y="1183.91px ">e</tspan>ad P<tspan x="310.789px " y="1183.91px ">o</tspan>ol</text>
</g>
<g transform="matrix(0.506003,0,0,0.506003,767.748,1105.66)">
<g transform="matrix(1.01835,0,0,1.01835,-11.9813,-27.0542)">
<ellipse cx="829.267" cy="1498.79" rx="134.889" ry="73.117" style="fill:white;stroke:rgb(62,62,62);stroke-width:7.56px;"/>
</g>
<g transform="matrix(1,0,0,1,9,40.3406)">
<text x="806.428px" y="1473.58px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:50px;">...</text>
</g>
</g>
<g transform="matrix(1,0,0,1,-31.0449,9.9189)">
<g transform="matrix(0.506003,0,0,0.506003,744.047,1049.39)">
<g transform="matrix(1.01835,0,0,1.01835,-11.9813,-27.0542)">
<ellipse cx="829.267" cy="1498.79" rx="134.889" ry="73.117" style="fill:white;stroke:rgb(62,62,62);stroke-width:7.56px;"/>
</g>
<g transform="matrix(1,0,0,1,9,40.3406)">
<text x="770.503px" y="1473.58px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:50px;">Seek</text>
</g>
</g>
<g transform="matrix(0.506003,0,0,0.506003,854.011,1048.98)">
<g transform="matrix(1.01835,0,0,1.01835,-11.9813,-27.0542)">
<ellipse cx="829.267" cy="1498.79" rx="134.889" ry="73.117" style="fill:white;stroke:rgb(62,62,62);stroke-width:7.56px;"/>
</g>
<g transform="matrix(1,0,0,1,9,40.3406)">
<text x="719.778px" y="1473.58px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:50px;">C<tspan x="747.278px " y="1473.58px ">o</tspan>mpose</text>
</g>
</g>
</g>
</g>
<g transform="matrix(1,0,0,1,931.504,566.618)">
<g id="Live">
<text x="140.085px" y="1190.16px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:45.833px;">Liv<tspan x="197.926px " y="1190.16px ">e</tspan> Mix<tspan x="306.001px 331.21px 348.443px " y="1190.16px 1190.16px 1190.16px ">ers</tspan> Thr<tspan x="449.78px " y="1190.16px ">e</tspan>ad #</text>
<text x="563.218px" y="1190.16px" style="font-family:'FiraSans-Italic', 'Fira Sans', sans-serif;font-style:italic;font-size:45.833px;">1</text>
</g>
</g>
<g transform="matrix(1,0,0,1,-28.0449,19.9189)">
<g transform="matrix(0.506003,0,0,0.506003,744.793,1148.74)">
<g transform="matrix(1.01835,0,0,1.01835,-11.9813,-27.0542)">
<ellipse cx="829.267" cy="1498.79" rx="134.889" ry="73.117" style="fill:white;stroke:rgb(62,62,62);stroke-width:7.56px;"/>
</g>
<g transform="matrix(1,0,0,1,9,40.3406)">
<text x="806.428px" y="1473.58px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:50px;">...</text>
</g>
</g>
<g transform="matrix(0.506003,0,0,0.506003,744.011,1098.98)">
<g transform="matrix(1.01835,0,0,1.01835,-11.9813,-27.0542)">
<ellipse cx="829.267" cy="1498.79" rx="134.889" ry="73.117" style="fill:white;stroke:rgb(62,62,62);stroke-width:7.56px;"/>
</g>
<g transform="matrix(1,0,0,1,9,40.3406)">
<text x="762.453px" y="1473.58px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:50px;">Mix<tspan x="839.603px " y="1473.58px ">e</tspan>r</text>
</g>
</g>
<g transform="matrix(0.506003,0,0,0.506003,744.047,1049.39)">
<g transform="matrix(1.01835,0,0,1.01835,-11.9813,-27.0542)">
<ellipse cx="829.267" cy="1498.79" rx="134.889" ry="73.117" style="fill:white;stroke:rgb(62,62,62);stroke-width:7.56px;"/>
</g>
<g transform="matrix(1,0,0,1,9,40.3406)">
<text x="762.453px" y="1473.58px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:50px;">Mix<tspan x="839.603px " y="1473.58px ">e</tspan>r</text>
</g>
</g>
</g>
</g>
<g transform="matrix(1,0,0,1,1929.87,-560.521)">
<g transform="matrix(2.86943,0,0,1.72283,741.053,-259.784)">
<rect x="101.876" y="1143.29" width="184.054" height="163.884" style="fill:rgb(234,234,234);stroke:rgb(62,62,62);stroke-width:1.65px;"/>
</g>
<g transform="matrix(1,0,0,1,193.864,60.8467)">
<g transform="matrix(1.75342,0,0,1.27206,854.748,255.576)">
<rect x="101.876" y="1143.29" width="184.054" height="163.884" style="fill:rgb(219,219,219);stroke:rgb(62,62,62);stroke-width:2.54px;"/>
</g>
<g transform="matrix(1,0,0,1,931.504,566.618)">
<text x="160.901px" y="1183.91px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:37.5px;">Thr<tspan x="216.364px " y="1183.91px ">e</tspan>ad P<tspan x="310.789px " y="1183.91px ">o</tspan>ol</text>
</g>
<g transform="matrix(0.506003,0,0,0.506003,767.748,1105.66)">
<g transform="matrix(1.01835,0,0,1.01835,-11.9813,-27.0542)">
<ellipse cx="829.267" cy="1498.79" rx="134.889" ry="73.117" style="fill:white;stroke:rgb(62,62,62);stroke-width:7.56px;"/>
</g>
<g transform="matrix(1,0,0,1,9,40.3406)">
<text x="806.428px" y="1473.58px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:50px;">...</text>
</g>
</g>
<g transform="matrix(1,0,0,1,-31.0449,9.9189)">
<g transform="matrix(0.506003,0,0,0.506003,744.047,1049.39)">
<g transform="matrix(1.01835,0,0,1.01835,-11.9813,-27.0542)">
<ellipse cx="829.267" cy="1498.79" rx="134.889" ry="73.117" style="fill:white;stroke:rgb(62,62,62);stroke-width:7.56px;"/>
</g>
<g transform="matrix(1,0,0,1,9,40.3406)">
<text x="770.503px" y="1473.58px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:50px;">Seek</text>
</g>
</g>
<g transform="matrix(0.506003,0,0,0.506003,854.011,1048.98)">
<g transform="matrix(1.01835,0,0,1.01835,-11.9813,-27.0542)">
<ellipse cx="829.267" cy="1498.79" rx="134.889" ry="73.117" style="fill:white;stroke:rgb(62,62,62);stroke-width:7.56px;"/>
</g>
<g transform="matrix(1,0,0,1,9,40.3406)">
<text x="719.778px" y="1473.58px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:50px;">C<tspan x="747.278px " y="1473.58px ">o</tspan>mpose</text>
</g>
</g>
</g>
</g>
<g transform="matrix(1,0,0,1,931.504,566.618)">
<g id="Live1" serif:id="Live">
<text x="136.578px" y="1190.16px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:45.833px;">Liv<tspan x="194.42px " y="1190.16px ">e</tspan> Mix<tspan x="302.495px 327.703px 344.937px " y="1190.16px 1190.16px 1190.16px ">ers</tspan> Thr<tspan x="446.274px " y="1190.16px ">e</tspan>ad #</text>
<text x="559.712px" y="1190.16px" style="font-family:'FiraSans-Italic', 'Fira Sans', sans-serif;font-style:italic;font-size:45.833px;">n</text>
</g>
</g>
<g transform="matrix(1,0,0,1,-28.0449,19.9189)">
<g transform="matrix(0.506003,0,0,0.506003,744.793,1148.74)">
<g transform="matrix(1.01835,0,0,1.01835,-11.9813,-27.0542)">
<ellipse cx="829.267" cy="1498.79" rx="134.889" ry="73.117" style="fill:white;stroke:rgb(62,62,62);stroke-width:7.56px;"/>
</g>
<g transform="matrix(1,0,0,1,9,40.3406)">
<text x="806.428px" y="1473.58px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:50px;">...</text>
</g>
</g>
<g transform="matrix(0.506003,0,0,0.506003,744.011,1098.98)">
<g transform="matrix(1.01835,0,0,1.01835,-11.9813,-27.0542)">
<ellipse cx="829.267" cy="1498.79" rx="134.889" ry="73.117" style="fill:white;stroke:rgb(62,62,62);stroke-width:7.56px;"/>
</g>
<g transform="matrix(1,0,0,1,9,40.3406)">
<text x="762.453px" y="1473.58px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:50px;">Mix<tspan x="839.603px " y="1473.58px ">e</tspan>r</text>
</g>
</g>
<g transform="matrix(0.506003,0,0,0.506003,744.047,1049.39)">
<g transform="matrix(1.01835,0,0,1.01835,-11.9813,-27.0542)">
<ellipse cx="829.267" cy="1498.79" rx="134.889" ry="73.117" style="fill:white;stroke:rgb(62,62,62);stroke-width:7.56px;"/>
</g>
<g transform="matrix(1,0,0,1,9,40.3406)">
<text x="762.453px" y="1473.58px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:50px;">Mix<tspan x="839.603px " y="1473.58px ">e</tspan>r</text>
</g>
</g>
</g>
</g>
<g transform="matrix(1,0,0,1,1738.24,98.1256)">
<g transform="matrix(0.924892,0,0,0.924892,52.9138,113.02)">
<ellipse cx="829.267" cy="1498.79" rx="134.889" ry="73.117" style="fill:rgb(255,193,74);stroke:rgb(62,62,62);stroke-width:4.21px;"/>
</g>
<g transform="matrix(1,0,0,1,-3,40.3406)">
<text x="725.078px" y="1473.58px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:50px;">Disposer</text>
</g>
</g>
<g transform="matrix(1,0,0,1,197.756,-121.243)">
<text x="2142px" y="812.69px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:45.833px;">New</text>
<text x="2056.32px" y="858.523px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:45.833px;">Mix<tspan x="2127.04px 2152.24px 2168.1px " y="858.523px 858.523px 858.523px ">er/</tspan>Driv<tspan x="2274.16px " y="858.523px ">e</tspan>r</text>
</g>
<g transform="matrix(1,0,0,1,-54,0)">
<g transform="matrix(0.595906,-0.803054,0.803054,0.595906,473.641,2339.83)">
<text x="2195.9px" y="837.915px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:41.667px;">Cr<tspan x="2234.9px " y="837.915px ">e</tspan>at<tspan x="2295.11px " y="837.915px ">e</tspan></text>
</g>
<g transform="matrix(-0.39895,0.55751,-0.616407,-0.441096,2749.77,876.339)">
<path d="M212.72,146.182L212.72,132.063L519.412,132.063L519.412,103.825L540.487,139.123L519.412,174.421L519.412,146.182L212.72,146.182Z" style="fill:rgb(62,62,62);"/>
</g>
</g>
<g transform="matrix(1,0,0,1,30,0)">
<g transform="matrix(0.597416,-0.801932,0.801932,0.597416,474.195,2407.65)">
<text x="2237.19px" y="855.933px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:37.5px;">Schedul<tspan x="2373.02px " y="855.933px ">e</tspan> Mix<tspan x="2461.44px " y="855.933px ">e</tspan>r</text>
</g>
<g transform="matrix(-0.39895,0.55751,-0.616407,-0.441096,2839.77,876.339)">
<path d="M212.72,146.182L212.72,132.063L519.412,132.063L519.412,103.825L540.487,139.123L519.412,174.421L519.412,146.182L212.72,146.182Z" style="fill:rgb(0,145,255);"/>
</g>
</g>
<g transform="matrix(-0.204144,0.285279,-0.616407,-0.441096,2849.16,1445.1)">
<path d="M212.72,146.182L212.72,132.063L499.302,132.063L499.302,103.825L540.487,139.123L499.302,174.421L499.302,146.182L212.72,146.182Z" style="fill:rgb(0,145,255);"/>
</g>
<g transform="matrix(-0.757756,0.466024,-0.397074,-0.645643,3152.8,1402.47)">
<path d="M212.72,146.182L212.72,132.063L524.246,132.063L524.246,103.825L540.487,139.123L524.246,174.421L524.246,146.182L212.72,146.182Z" style="fill:rgb(0,145,255);"/>
</g>
<g transform="matrix(1,0,0,1,30,0)">
<g transform="matrix(0.592937,-0.805249,0.805249,0.592937,936.176,2440.92)">
<text x="2058.5px" y="551.43px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:41.667px;">Deschedul<tspan x="2255.92px " y="551.43px ">e</tspan></text>
</g>
<g transform="matrix(-0.39895,0.55751,-0.616407,-0.441096,2929.77,876.339)">
<path d="M251.747,146.182L251.747,174.421L212.72,139.123L251.747,103.825L251.747,132.063L540.487,132.063L540.487,146.182L251.747,146.182Z" style="fill:rgb(0,145,255);"/>
</g>
</g>
<g transform="matrix(1,0,0,1,554.954,389.188)">
<text x="2256.37px" y="574.853px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:41.667px;">M<tspan x="2289.33px 2312.83px 2332.91px " y="574.853px 574.853px 574.853px ">ove</tspan> Mix<tspan x="2431.16px " y="574.853px ">e</tspan>r</text>
</g>
<g transform="matrix(1,0,0,1,37.8377,-12.6126)">
<text x="2840.19px" y="1319.22px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:64.865px;">...</text>
</g>
<g transform="matrix(1,0,0,1,2011.31,633.864)">
<path d="M212.72,146.182L212.72,132.063L521.426,132.063L521.426,103.825L540.487,139.123L521.426,174.421L521.426,146.182L212.72,146.182Z" style="fill:rgb(62,62,62);"/>
</g>
<g transform="matrix(1,0,0,1,530,0)">
<g transform="matrix(-0.39895,0.55751,-0.616407,-0.441096,2249.77,876.339)">
<path d="M212.72,146.182L212.72,132.063L519.412,132.063L519.412,103.825L540.487,139.123L519.412,174.421L519.412,146.182L212.72,146.182Z" style="fill:rgb(62,62,62);"/>
</g>
<g transform="matrix(0.595906,-0.803054,0.803054,0.595906,-21.9714,2325.42)">
<text x="2184.79px" y="837.915px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:41.667px;">Destr<tspan x="2284.71px 2308.63px " y="837.915px 837.915px ">oy</tspan></text>
</g>
</g>
<g transform="matrix(1,-0,-0,1,2132,380)">
<path d="M926.251,688.123L929.33,726.605L896.697,705.978L926.251,688.123Z" style="fill:rgb(0,145,255);"/>
<path d="M612.214,726.605C612.214,726.605 754.971,452.986 915.045,702.961" style="fill:none;stroke:rgb(0,145,255);stroke-width:11.51px;stroke-linecap:butt;"/>
</g>
<g transform="matrix(1,0,0,1,2112.36,364.866)">
<g transform="matrix(1,0,0,1,299,-52.947)">
<path d="M212.72,146.182L212.72,132.063L521.426,132.063L521.426,103.825L540.487,139.123L521.426,174.421L521.426,146.182L212.72,146.182Z" style="fill:rgb(62,62,62);"/>
</g>
<g transform="matrix(1,0,0,1,-168.926,12.6064)">
<text x="235.411px" y="98.782px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:75px;">Int<tspan x="327.811px 369.061px 396.511px " y="98.782px 98.782px 98.782px ">era</tspan>ction</text>
</g>
</g>
<g transform="matrix(1,0,0,1,2112.36,443.866)">
<g transform="matrix(1,0,0,1,299,-52.947)">
<path d="M212.72,146.182L212.72,132.063L521.426,132.063L521.426,103.825L540.487,139.123L521.426,174.421L521.426,146.182L212.72,146.182Z" style="fill:rgb(0,145,255);"/>
</g>
<g transform="matrix(1,0,0,1,-168.926,12.6064)">
<text x="235.411px" y="98.782px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:75px;">M<tspan x="294.736px " y="98.782px ">e</tspan>ssag<tspan x="485.086px " y="98.782px ">e</tspan>s</text>
</g>
</g>
<g transform="matrix(0.849915,-0.52692,0.52692,0.849915,-377.877,1731.84)">
<text x="2720.74px" y="1522.82px" style="font-family:'FiraSans-Regular', 'Fira Sans', sans-serif;font-size:41.667px;">T<tspan x="2738.95px 2754.2px " y="1522.82px 1522.82px ">ra</tspan>ck cl<tspan x="2860.87px " y="1522.82px ">e</tspan>anup</text>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 26 KiB