<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">
	<channel>
		<title>Can AU Sampler Survive Dynamic Chain Changes? | Infinum</title>
		<atom:link href="https://infinum.com/blog/au-sampler-dynamic-chain-changes/feed/" rel="self" type="application/rss+xml" />
		<link>https://infinum.com/blog/au-sampler-dynamic-chain-changes/</link>
		<description>Building digital products</description>
		<lastBuildDate>Fri, 24 Apr 2026 14:02:14 +0000</lastBuildDate>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>

					<item>
				<image>
					<url>32107https://infinum.com/uploads/2023/01/AU-Sampler2-HERO.webp</url>
				</image>
				<title>Can AU Sampler Survive Dynamic Chain Changes?</title>
				<link>https://infinum.com/blog/au-sampler-dynamic-chain-changes/</link>
				<pubDate>Wed, 18 Jan 2023 14:24:40 +0000</pubDate>
				<dc:creator>Josip Ćavar</dc:creator>
				<guid isPermaLink="false">https://infinum.com/?p=32107</guid>
				<description>
					<![CDATA[<p>Continuing our exploration of Apple's AUSampler, we’ve tested it to see if the promise of AVAudioEngine’s dynamic connection abilities holds true. </p>
<p>The post <a href="https://infinum.com/blog/au-sampler-dynamic-chain-changes/">Can AU Sampler Survive Dynamic Chain Changes?</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</description>
				<content:encoded>
					<![CDATA[<div
	class="wrapper"
	data-id="es-123"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-92">
	</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-95"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-93">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-94'
	>
	Apple’s <a href="https://developer.apple.com/documentation/avfaudio/avaudioengine" target="_blank" rel="noreferrer noopener">AVAudioEngine documentation</a> opens with a brave statement:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-97"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-24-text js-typography block-highlighted-text__typography'
	data-id='es-96'
	>
	<em>You can connect, disconnect, and remove audio nodes during runtime with minor limitations. Removing an audio node that has differing channel counts, or that’s a mixer, can break the graph. Reconnect audio nodes only when they’re upstream of a mixer.</em></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-100"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-98">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-99'
	>
	<code>AVAudioEngine</code> header docs state the same in slightly different words:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-103"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-101">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-102'
	>
	<em>The engine supports dynamic connection, disconnection, and removal of nodes while running, with only minor limitations:</em></p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-106"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--black block-bullet__bullet" data-id="es-104">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-105'
	>
	<em>all dynamic reconnections must occur upstream of a mixer</em></p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-109"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--dot bullet__color--black block-bullet__bullet" data-id="es-107">
			<div class="bullet__dot"></div>
		<div class="bullet__content">
		<p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-108'
	>
	<em><em>while removals of effects will normally result in the automatic connection of the adjacent nodes, removal of a node which has differing input vs. output channel counts, or which is a mixer, is likely to result in a broken graph.</em></em></p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-112"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-110">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-111'
	>
	In the <a href="https://infinum.com/blog/getting-started-with-au-sampler/" target="_blank" rel="noreferrer noopener">first blog post in our sampler series</a>, we laid the foundations for exploring the world of software audio samplers, while the third part reveals <a href="https://infinum.com/blog/ausampler-missing-documentation/" target="_blank" rel="noreferrer noopener">the secrets of AUSampler&#8217;s missing documentation</a>. In this article, we’ll put AUSampler to the test and see if the promise of <code>AVAudioEngine</code>’s dynamic connection abilities holds true. </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-115"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-113">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-114'
	>
	Dynamic chain configuration</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-118"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-116">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-117'
	>
	Before we dive into the specifics of AUSampler, let&#8217;s explore what dynamic chain configuration even means.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-121"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-119">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-120'
	>
	We will start with a simple case of an oscillator. Our goal is to replace the Distortion audio effect with the Equalizer audio effect <strong>dynamically while the oscillator is rendering audio without interruptions.</strong></p></div>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-126"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-124"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-125">
	<picture class="image__picture block-media__image-picture">
								
			<source
				srcset=https://infinum.com/uploads/2023/01/Img-01-1400x321.webp				media='(max-width: 699px)'
				type=image/webp								height="321"
												width="1400"
				 />
												<img
					src="https://infinum.com/uploads/2023/01/Img-01.webp"
					class="image__img block-media__image-img"
					alt=""
										height="458"
															width="2000"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-132"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-127">
	

</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-130"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-128">
	<p	class='typography typography--size-20-text-roman js-typography block-paragraph__paragraph'
	data-id='es-129'
	>
	We can do this in four steps:</p></div>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-135"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-133"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-134">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2023/01/Img-2-1.webp"
					class="image__img block-media__image-img"
					alt=""
										height="1003"
															width="1001"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-246"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-136">
	

</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-139"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-137">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-138'
	>
	The code would look something like this:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-141"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">func reconnectDynamically</span><span class="token">(</span><span class="token">)</span><span class="token"> </span><span class="token">{</span><span class="token">
</span></span><span class="line"><span class="token">    engine.</span><span class="token">attach(</span><span class="token">equalizer</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    engine.</span><span class="token">connect(</span><span class="token">equalizer</span><span class="token">, </span><span class="token">to:</span><span class="token"> engine.</span><span class="token">mainMixerNode</span><span class="token">, </span><span class="token">format:</span><span class="token"> </span><span class="token" style="color: #005cc5;">nil</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    engine.</span><span class="token">connect(</span><span class="token">oscillator</span><span class="token">, </span><span class="token">to:</span><span class="token"> equalizer</span><span class="token">, </span><span class="token">format:</span><span class="token"> </span><span class="token" style="color: #005cc5;">nil</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">    engine.</span><span class="token">detach(</span><span class="token">distortion</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">}</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-144"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-142">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-143'
	>
	We can take a shortcut here and only detach the node that we want to remove. The engine will take care of the rest.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-147"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-145">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-146'
	>
	To verify that everything is in the correct state, we can print the engine’s description. This will print out the underlying audio graph:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-149"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-php github-light" data-language="php" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #005cc5;">print</span><span class="token">(</span><span class="token" style="color: #005cc5;">engine</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">description</span><span class="token">)</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-151"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">AVAudioEngineGraph</span><span class="token" style="color: #d73a49;">:</span><span class="token"> initialized </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">1</span><span class="token">, running </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">1</span><span class="token">, number </span><span class="token" style="color: #d73a49;">of</span><span class="token"> nodes </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">4</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token"> </span><span class="token" style="color: #d73a49;">********</span><span class="token"> output chain </span><span class="token" style="color: #d73a49;">********</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token"> node </span><span class="token" style="color: #005cc5;">0x6000005b0280</span><span class="token"> </span><span class="token">{</span><span class="token">&#039;auou&#039; &#039;ahal&#039; &#039;appl&#039;</span><span class="token">}</span><span class="token">, &#039;I&#039;
</span></span><span class="line"><span class="token"> inputs </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">1</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token">(</span><span class="token">bus0</span><span class="token">, </span><span class="token">en1</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">&lt;-</span><span class="token"> </span><span class="token">(</span><span class="token">bus0</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #005cc5;">0x6000005bdd00</span><span class="token">, </span><span class="token">{</span><span class="token">&#039;aumx&#039; &#039;mcmx&#039; &#039;appl&#039;</span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token"> node </span><span class="token" style="color: #005cc5;">0x6000005bdd00</span><span class="token"> </span><span class="token">{</span><span class="token">&#039;aumx&#039; &#039;mcmx&#039; &#039;appl&#039;</span><span class="token">}</span><span class="token">, &#039;I&#039;
</span></span><span class="line"><span class="token"> inputs </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">2</span><span class="token">\</span><span class="token">n  (</span><span class="token">bus0</span><span class="token">, </span><span class="token">en0</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">&lt;-</span><span class="token"> </span><span class="token">(</span><span class="token">bus0</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #005cc5;">0x0</span><span class="token">, </span><span class="token">{</span><span class="token">}</span><span class="token">, 
</span></span><span class="line"><span class="token">  </span><span class="token">(</span><span class="token">bus1</span><span class="token">, </span><span class="token">en1</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">&lt;-</span><span class="token"> </span><span class="token">(</span><span class="token">bus0</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #005cc5;">0x6000005bcf80</span><span class="token">, </span><span class="token">{</span><span class="token">&#039;aufx&#039; &#039;nbeq&#039; &#039;appl&#039;</span><span class="token">}</span><span class="token">,
</span></span><span class="line"><span class="token"> outputs </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">1</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token">(</span><span class="token">bus0</span><span class="token">, </span><span class="token">en1</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">-&gt;</span><span class="token"> </span><span class="token">(</span><span class="token">bus0</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #005cc5;">0x6000005b0280</span><span class="token">, </span><span class="token">{</span><span class="token">&#039;auou&#039; &#039;ahal&#039; &#039;appl&#039;</span><span class="token">}</span><span class="token">,
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token"> node </span><span class="token" style="color: #005cc5;">0x6000005bcf80</span><span class="token"> </span><span class="token">{</span><span class="token">&#039;aufx&#039; &#039;nbeq&#039; &#039;appl&#039;</span><span class="token">}</span><span class="token">, &#039;I&#039;
</span></span><span class="line"><span class="token"> inputs </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">1</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token">(</span><span class="token">bus0</span><span class="token">, </span><span class="token">en1</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">&lt;-</span><span class="token"> </span><span class="token">(</span><span class="token">bus0</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #005cc5;">0x6000019bc870</span><span class="token">, </span><span class="token">{</span><span class="token">&#039;aufc&#039; &#039;conv&#039; &#039;appl&#039;</span><span class="token">}</span><span class="token">,
</span></span><span class="line"><span class="token"> outputs </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">1</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token">(</span><span class="token">bus0</span><span class="token">, </span><span class="token">en1</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">-&gt;</span><span class="token"> </span><span class="token">(</span><span class="token">bus1</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #005cc5;">0x6000005bdd00</span><span class="token">, </span><span class="token">{</span><span class="token">&#039;aumx&#039; &#039;mcmx&#039; &#039;appl&#039;</span><span class="token">}</span><span class="token">,
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token"> node </span><span class="token" style="color: #005cc5;">0x6000019bc870</span><span class="token"> </span><span class="token">{</span><span class="token">&#039;aufc&#039; &#039;conv&#039; &#039;appl&#039;</span><span class="token">}</span><span class="token">, &#039;I&#039;
</span></span><span class="line"><span class="token"> outputs </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">1</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token">(</span><span class="token">bus0</span><span class="token">, </span><span class="token">en1</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">-&gt;</span><span class="token"> </span><span class="token">(</span><span class="token">bus0</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #005cc5;">0x6000005bcf80</span><span class="token">, </span><span class="token">{</span><span class="token">&#039;aufx&#039; &#039;nbeq&#039; &#039;appl&#039;</span><span class="token">}</span><span class="token">,
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-153"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-24-text js-typography block-highlighted-text__typography'
	data-id='es-152'
	>
	You can check what these abbreviations map to by running <code>auval -a</code> in Terminal. This will print out all audio units in your system.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-156"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-154">
	<p	class='typography typography--size-20-text-roman js-typography block-paragraph__paragraph'
	data-id='es-155'
	>
	This graph is mostly consistent. The number of nodes is correct, and everything is wired up correctly. The only anomaly is an instance of `0x0` input in the main mixer. This is an artifact of the removal process. On successive connections, the mixer will reuse this bus. And while it looks suspicious, it seems that it doesn’t do any damage.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-159"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-157">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-158'
	>
	Sampler dynamic chain configuration</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-162"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-160">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-161'
	>
	Now, let’s try to do the same with Sampler. Our goal is to:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-166"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--number bullet__color--infinum block-bullet__bullet" data-id="es-163">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-164'
	>
	1</p>	<div class="bullet__content">
		<p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-165'
	>
	Play and sustain a note with Sampler</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-170"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--number bullet__color--infinum block-bullet__bullet" data-id="es-167">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-168'
	>
	2</p>	<div class="bullet__content">
		<p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-169'
	>
	Change the effect dynamically while the note is still playing</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-173"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-171">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-172'
	>
	We can use the same reconnect procedure that worked for the oscillator:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-175"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">engine.</span><span class="token">attach(</span><span class="token">equalizer</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">engine.</span><span class="token">connect(</span><span class="token">equalizer</span><span class="token">, </span><span class="token">to:</span><span class="token"> engine.</span><span class="token">mainMixerNode</span><span class="token">, </span><span class="token">format:</span><span class="token"> </span><span class="token" style="color: #005cc5;">nil</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">engine.</span><span class="token">connect(</span><span class="token">sampler</span><span class="token">, </span><span class="token">to:</span><span class="token"> equalizer</span><span class="token">, </span><span class="token">format:</span><span class="token"> </span><span class="token" style="color: #005cc5;">nil</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">engine.</span><span class="token">detach(</span><span class="token">distortion</span><span class="token">)</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-178"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-176">
	<p	class='typography typography--size-20-text-roman js-typography block-paragraph__paragraph'
	data-id='es-177'
	>
	However, we’ll hear that the sound is interrupted. Moreover, if we try to play some notes again, we will hear the sine wave instead of our instrument. What happened here?</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-181"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-179">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-180'
	>
	In <a href="https://infinum.com/blog/getting-started-with-au-sampler/" target="_blank" rel="noreferrer noopener">the previous article on AUSampler</a> we introduced some tools to help us debug and understand Sampler behavior. We can use what we’ve learned to investigate this problem. The process will be the following:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-185"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--number bullet__color--infinum block-bullet__bullet" data-id="es-182">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-183'
	>
	1</p>	<div class="bullet__content">
		<p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-184'
	>
	Start the engine</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-189"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--number bullet__color--infinum block-bullet__bullet" data-id="es-186">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-187'
	>
	2</p>	<div class="bullet__content">
		<p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-188'
	>
	Stop the debugger</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-193"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--number bullet__color--infinum block-bullet__bullet" data-id="es-190">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-191'
	>
	3</p>	<div class="bullet__content">
		<p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-192'
	>
	Add a breakpoint</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-197"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--number bullet__color--infinum block-bullet__bullet" data-id="es-194">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-195'
	>
	4</p>	<div class="bullet__content">
		<p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-196'
	>
	Perform dynamic node connection</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-201"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--number bullet__color--infinum block-bullet__bullet" data-id="es-198">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-199'
	>
	5</p>	<div class="bullet__content">
		<p	class='typography typography--size-20-text-roman js-typography bullet__paragraph'
	data-id='es-200'
	>
	Observe what is happening</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-204"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-202">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-203'
	>
	Since we don’t have much knowledge about AUSampler’s internals, we will start with a very general breakpoint:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-206"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">rb Sampler</span><span class="token" style="color: #d73a49;">:</span><span class="token" style="color: #d73a49;">:</span><span class="token"> </span><span class="token" style="color: #d73a49;">--</span><span class="token">command </span><span class="token" style="color: #032f62;">&quot;</span><span class="token" style="color: #032f62;">frame info</span><span class="token" style="color: #032f62;">&quot;</span><span class="token"> </span><span class="token" style="color: #d73a49;">--</span><span class="token">auto</span><span class="token" style="color: #d73a49;">-</span><span class="token" style="color: #d73a49;">continue</span><span class="token"> </span><span class="token" style="color: #005cc5;">1</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-209"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-207">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-208'
	>
	The Sampler is implemented in C++ and this will print out every invocation of the method that matches this pattern.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-211"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-24-text js-typography block-highlighted-text__typography'
	data-id='es-210'
	>
	Make sure to run this on an iOS simulator. As mentioned in the previous article, macOS doesn’t expose any symbols, and the debugger will not be able to find them.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-214"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-212">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-213'
	>
	If we try to change a node now, we’ll see that several things are called:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-216"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">Sampler</span><span class="token" style="color: #d73a49;">:</span><span class="token" style="color: #d73a49;">:</span><span class="token">CleanupMemory(</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">Sampler</span><span class="token" style="color: #d73a49;">:</span><span class="token" style="color: #d73a49;">:</span><span class="token">SetProperty(</span><span class="token">unsigned int</span><span class="token">, </span><span class="token">unsigned int</span><span class="token">, </span><span class="token">unsigned int</span><span class="token">, </span><span class="token">void const</span><span class="token" style="color: #d73a49;">*</span><span class="token">, </span><span class="token">unsigned int</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">Sampler</span><span class="token" style="color: #d73a49;">:</span><span class="token" style="color: #d73a49;">:</span><span class="token">SetProperty(</span><span class="token">unsigned int</span><span class="token">, </span><span class="token">unsigned int</span><span class="token">, </span><span class="token">unsigned int</span><span class="token">, </span><span class="token">void const</span><span class="token" style="color: #d73a49;">*</span><span class="token">, </span><span class="token">unsigned int</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">Sampler</span><span class="token" style="color: #d73a49;">:</span><span class="token" style="color: #d73a49;">:</span><span class="token">SetProperty(</span><span class="token">unsigned int</span><span class="token">, </span><span class="token">unsigned int</span><span class="token">, </span><span class="token">unsigned int</span><span class="token">, </span><span class="token">void const</span><span class="token" style="color: #d73a49;">*</span><span class="token">, </span><span class="token">unsigned int</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">Sampler</span><span class="token" style="color: #d73a49;">:</span><span class="token" style="color: #d73a49;">:</span><span class="token">SetProperty(</span><span class="token">unsigned int</span><span class="token">, </span><span class="token">unsigned int</span><span class="token">, </span><span class="token">unsigned int</span><span class="token">, </span><span class="token">void const</span><span class="token" style="color: #d73a49;">*</span><span class="token">, </span><span class="token">unsigned int</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">Sampler</span><span class="token" style="color: #d73a49;">:</span><span class="token" style="color: #d73a49;">:</span><span class="token">GetPropertyInfo(</span><span class="token">unsigned int</span><span class="token">, </span><span class="token">unsigned int</span><span class="token">, </span><span class="token">unsigned int</span><span class="token">, </span><span class="token">unsigned int</span><span class="token" style="color: #d73a49;">&amp;</span><span class="token">, </span><span class="token">bool</span><span class="token" style="color: #d73a49;">&amp;</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">Sampler</span><span class="token" style="color: #d73a49;">:</span><span class="token" style="color: #d73a49;">:</span><span class="token">InitializeMemory(</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">Sampler</span><span class="token" style="color: #d73a49;">:</span><span class="token" style="color: #d73a49;">:</span><span class="token">GetInitializeNoteCount(</span><span class="token">)</span><span class="token"> const
</span></span><span class="line"><span class="token">Sampler</span><span class="token" style="color: #d73a49;">:</span><span class="token" style="color: #d73a49;">:</span><span class="token">GetPropertyInfo(</span><span class="token">unsigned int</span><span class="token">, </span><span class="token">unsigned int</span><span class="token">, </span><span class="token">unsigned int</span><span class="token">, </span><span class="token">unsigned int</span><span class="token" style="color: #d73a49;">&amp;</span><span class="token">, </span><span class="token">bool</span><span class="token" style="color: #d73a49;">&amp;</span><span class="token">)</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-219"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-217">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-218'
	>
	We should take special note of the following: </p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-223"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--number bullet__color--infinum block-bullet__bullet" data-id="es-220">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-221'
	>
	1</p>	<div class="bullet__content">
		<p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-222'
	>
	<code>Sampler::CleanupMemory</code> is called (which in turn calls: <code>AudioStreamer::Destroy</code>)</p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-227"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="bullet bullet--left bullet__type--number bullet__color--infinum block-bullet__bullet" data-id="es-224">
	<p	class='typography typography--size-14-text js-typography bullet__dot'
	data-id='es-225'
	>
	2</p>	<div class="bullet__content">
		<p	class='typography typography--size-16-text-roman js-typography bullet__paragraph'
	data-id='es-226'
	>
	<code>Sampler::InitializeMemory</code></p>	</div>
</div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-230"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-228">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-229'
	>
	We don’t know exactly what these methods do, but it is a strong indication that the Sampler is reinitialized and that the audio stream is destroyed.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-232"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-24-text js-typography block-highlighted-text__typography'
	data-id='es-231'
	>
	AUSampler’s default preset will produce a sine wave. If you hear it, it means that the Sampler has been reset.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-235"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-233">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-234'
	>
	What can we do about it? The good news is that the AUSampler is able to handle dynamic reconnections, but before we dive into that, let’s take a tour of the <code>AVAudioEngine</code> audio splitting.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-238"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-236">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-237'
	>
	AVAudioEngine audio splitting</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-241"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-239">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-240'
	>
	The <code>AVAudioEngine</code> first introduced splitting support in iOS 9 (see <a href="https://developer.apple.com/videos/play/wwdc2015/507/" target="_blank" rel="noreferrer noopener">Session 507: What’s new in Core Audio from WWDC 2015</a>).</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-244"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-242">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-243'
	>
	Before that, only one-to-one connections were supported:</p></div>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-249"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-247"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-248">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2023/01/Image_001.webp"
					class="image__img block-media__image-img"
					alt=""
										height="466"
															width="1000"
										loading="lazy"
					 />
					</picture>

			<figcaption class="image__figcaption block-media__image-figcaption">
			SOURCE: APPLE WWDC 2015 KEYNOTE		</figcaption>
	</figure></div></div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-257"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-250">
	

</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-253"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-251">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-252'
	>
	Then a new API was introduced:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-255"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-php github-light" data-language="php" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token" style="color: #d73a49;">-</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #005cc5;">void</span><span class="token">)</span><span class="token" style="color: #005cc5;">connect</span><span class="token">:</span><span class="token">(</span><span class="token" style="color: #005cc5;">AVAudioNode</span><span class="token"> </span><span class="token" style="color: #d73a49;">*</span><span class="token">)</span><span class="token" style="color: #005cc5;">sourceNode</span><span class="token"> </span><span class="token" style="color: #005cc5;">toConnectionPoints</span><span class="token">:</span><span class="token">(</span><span class="token" style="color: #005cc5;">NSArray</span><span class="token" style="color: #d73a49;">&lt;</span><span class="token" style="color: #005cc5;">AVAudioConnectionPoint</span><span class="token"> </span><span class="token" style="color: #d73a49;">*</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token"> </span><span class="token" style="color: #d73a49;">*</span><span class="token">)</span><span class="token" style="color: #005cc5;">destNodes</span><span class="token"> </span><span class="token" style="color: #005cc5;">fromBus</span><span class="token">:</span><span class="token">(</span><span class="token" style="color: #005cc5;">AVAudioNodeBus</span><span class="token">)</span><span class="token" style="color: #005cc5;">sourceBus</span><span class="token"> </span><span class="token" style="color: #005cc5;">format</span><span class="token">:</span><span class="token">(</span><span class="token" style="color: #005cc5;">AVAudioFormat</span><span class="token"> </span><span class="token" style="color: #d73a49;">*</span><span class="token"> </span><span class="token" style="color: #005cc5;">__nullable</span><span class="token">)</span><span class="token" style="color: #005cc5;">format</span><span class="token">
</span></span></code></pre></div>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-260"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-258"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-259">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2023/01/Imge-002-2.webp"
					class="image__img block-media__image-img"
					alt=""
										height="503"
															width="1001"
										loading="lazy"
					 />
					</picture>

			<figcaption class="image__figcaption block-media__image-figcaption">
			SOURCE: APPLE WWDC 2015 KEYNOTE		</figcaption>
	</figure></div></div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-291"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-261">
	

</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-264"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-262">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-263'
	>
	The engine transparently handles internal connections for us, but it’s interesting to see what happens under the hood.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-267"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-265">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-266'
	>
	When we have one-to-many connections, the engine will create an instance of the <em>AUMultiSplitter</em> audio unit. This can be confirmed by looking at the underlying graph that we can print:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-269"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">AVAudioEngineGraph </span><span class="token" style="color: #005cc5;">0x600002c25c00</span><span class="token" style="color: #d73a49;">:</span><span class="token"> initialized </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">, running </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">, number </span><span class="token" style="color: #d73a49;">of</span><span class="token"> nodes </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">7</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token"> </span><span class="token" style="color: #d73a49;">********</span><span class="token"> output chain </span><span class="token" style="color: #d73a49;">********</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token"> node </span><span class="token" style="color: #005cc5;">0x600003e23280</span><span class="token"> </span><span class="token">{</span><span class="token">auou rioc appl</span><span class="token">}</span><span class="token">, &#039;U&#039;
</span></span><span class="line"><span class="token" style="color: #d73a49;">&lt;</span><span class="token">em</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token"> </span><span class="token" style="color: #d73a49;">&lt;/</span><span class="token">em</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token">inputs </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">1</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token">(</span><span class="token">bus0</span><span class="token">, </span><span class="token">en1</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">&lt;-</span><span class="token"> </span><span class="token">(</span><span class="token">bus0</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #005cc5;">0x600003e28b80</span><span class="token">, </span><span class="token">{</span><span class="token">aumx mcmx appl</span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token"> node </span><span class="token" style="color: #005cc5;">0x600003e28b80</span><span class="token"> </span><span class="token">{</span><span class="token">aumx mcmx appl</span><span class="token">}</span><span class="token">, &#039;U&#039;
</span></span><span class="line"><span class="token"> inputs </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">3</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token">(</span><span class="token">bus0</span><span class="token">, </span><span class="token">en1</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">&lt;-</span><span class="token"> </span><span class="token">(</span><span class="token">bus0</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #005cc5;">0x600003e20400</span><span class="token">, </span><span class="token">{</span><span class="token">aufx dist appl</span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token">(</span><span class="token">bus1</span><span class="token">, </span><span class="token">en1</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">&lt;-</span><span class="token"> </span><span class="token">(</span><span class="token">bus0</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #005cc5;">0x600003e01780</span><span class="token">, </span><span class="token">{</span><span class="token">aufx dist appl</span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token"> outputs </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">1</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token">(</span><span class="token">bus0</span><span class="token">, </span><span class="token">en1</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">-&gt;</span><span class="token"> </span><span class="token">(</span><span class="token">bus0</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #005cc5;">0x600003e23280</span><span class="token">, </span><span class="token">{</span><span class="token">auou rioc appl</span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">&lt;</span><span class="token">em</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token"> </span><span class="token" style="color: #d73a49;">&lt;/</span><span class="token">em</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token">node </span><span class="token" style="color: #005cc5;">0x600003e20400</span><span class="token"> </span><span class="token">{</span><span class="token">aufx dist appl</span><span class="token">}</span><span class="token">, &#039;U&#039;
</span></span><span class="line"><span class="token"> inputs </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">1</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token">(</span><span class="token">bus0</span><span class="token">, </span><span class="token">en1</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">&lt;-</span><span class="token"> </span><span class="token">(</span><span class="token">bus2</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #005cc5;">0x600003e26300</span><span class="token">, </span><span class="token">{</span><span class="token">aumx mspl appl</span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token"> outputs </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">1</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token">(</span><span class="token">bus0</span><span class="token">, </span><span class="token">en1</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">-&gt;</span><span class="token"> </span><span class="token">(</span><span class="token">bus0</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #005cc5;">0x600003e28b80</span><span class="token">, </span><span class="token">{</span><span class="token">aumx mcmx appl</span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token"> node </span><span class="token" style="color: #005cc5;">0x600003e01780</span><span class="token"> </span><span class="token">{</span><span class="token">aufx dist appl</span><span class="token">}</span><span class="token">, &#039;U&#039;
</span></span><span class="line"><span class="token"> inputs </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">1</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token">(</span><span class="token">bus0</span><span class="token">, </span><span class="token">en1</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">&lt;-</span><span class="token"> </span><span class="token">(</span><span class="token">bus0</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #005cc5;">0x600003e26300</span><span class="token">, </span><span class="token">{</span><span class="token">aumx mspl appl</span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token"> outputs </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">1</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token">(</span><span class="token">bus0</span><span class="token">, </span><span class="token">en1</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">-&gt;</span><span class="token"> </span><span class="token">(</span><span class="token">bus1</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #005cc5;">0x600003e28b80</span><span class="token">, </span><span class="token">{</span><span class="token">aumx mcmx appl</span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token" style="color: #d73a49;">&lt;</span><span class="token">em</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token"> </span><span class="token" style="color: #d73a49;">&lt;/</span><span class="token">em</span><span class="token" style="color: #d73a49;">&gt;</span><span class="token">node </span><span class="token" style="color: #005cc5;">0x600003e26300</span><span class="token"> </span><span class="token">{</span><span class="token">aumx mspl appl</span><span class="token">}</span><span class="token">, &#039;U&#039;
</span></span><span class="line"><span class="token"> inputs </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">1</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token">(</span><span class="token">bus0</span><span class="token">, </span><span class="token">en1</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">&lt;-</span><span class="token"> </span><span class="token">(</span><span class="token">bus0</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #005cc5;">0x600002200240</span><span class="token">, </span><span class="token">{</span><span class="token">aumu samp appl</span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token"> outputs </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">3</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token">(</span><span class="token">bus0</span><span class="token">, </span><span class="token">en1</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">-&gt;</span><span class="token"> </span><span class="token">(</span><span class="token">bus0</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #005cc5;">0x600003e01780</span><span class="token">, </span><span class="token">{</span><span class="token">aufx dist appl</span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token">(</span><span class="token">bus1</span><span class="token">, </span><span class="token">en1</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">-&gt;</span><span class="token"> </span><span class="token">(</span><span class="token">bus0</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #005cc5;">0x600003e00b00</span><span class="token">, </span><span class="token">{</span><span class="token">aufx dist appl</span><span class="token">}</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token"> node </span><span class="token" style="color: #005cc5;">0x600002200240</span><span class="token"> </span><span class="token">{</span><span class="token">aumu samp appl</span><span class="token">}</span><span class="token">, &#039;U&#039;
</span></span><span class="line"><span class="token"> outputs </span><span class="token" style="color: #d73a49;">=</span><span class="token"> </span><span class="token" style="color: #005cc5;">1</span><span class="token">
</span></span><span class="line"><span class="token">  </span><span class="token">(</span><span class="token">bus0</span><span class="token">, </span><span class="token">en1</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #d73a49;">-&gt;</span><span class="token"> </span><span class="token">(</span><span class="token">bus0</span><span class="token">)</span><span class="token"> </span><span class="token" style="color: #005cc5;">0x600003e26300</span><span class="token">, </span><span class="token">{</span><span class="token">aumx mspl appl</span><span class="token">}</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-272"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-270">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-271'
	>
	Note an instance of the <code>mspl</code> audio unit. It represents an instance of the AUMultiSplitter<em> </em>audio unit responsible for audio splitting.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-275"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-273">
	<p	class='typography typography--size-20-text-roman js-typography block-paragraph__paragraph'
	data-id='es-274'
	>
	These are the unit’s header docs:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-277"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">kAudioUnitSubType_MultiSplitter
</span></span><span class="line"><span class="token">    An audio unit that sends its input bus to </span><span class="token" style="color: #d73a49;">any</span><span class="token"> number </span><span class="token" style="color: #d73a49;">of</span><span class="token"> output buses.
</span></span><span class="line"><span class="token">    Every output bus gets all channels </span><span class="token" style="color: #d73a49;">of</span><span class="token"> the input bus.
</span></span><span class="line"><span class="token">    This unit&#039;s implementation </span><span class="token" style="color: #d73a49;">is</span><span class="token"> lighter weight than kAudioUnitSubType_Splitter
</span></span><span class="line"><span class="token">    even </span><span class="token" style="color: #d73a49;">for</span><span class="token"> two</span><span class="token"> output buses, and </span><span class="token" style="color: #d73a49;">is</span><span class="token"> recommended over kAudioUnitSubType_Splitter.
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-280"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-278">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-279'
	>
	This audio unit turned out to be the key to keeping AUSampler alive while dynamically reconnecting it.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-283"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-281">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-282'
	>
	Correct setup</h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-286"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-284">
	<p	class='typography typography--size-20-text-roman js-typography block-paragraph__paragraph'
	data-id='es-285'
	>
	With this knowledge, we are now able to find the correct setup.&nbsp;</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-289"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-287">
	<p	class='typography typography--size-20-text-roman js-typography block-paragraph__paragraph'
	data-id='es-288'
	>
	Ideally, we would like to do this:</p></div>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-294"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-292"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-293">
	<picture class="image__picture block-media__image-picture">
								
			<source
				srcset=https://infinum.com/uploads/2023/01/Img-3-1400x321.webp				media='(max-width: 699px)'
				type=image/webp								height="321"
												width="1400"
				 />
												<img
					src="https://infinum.com/uploads/2023/01/Img-3.webp"
					class="image__img block-media__image-img"
					alt=""
										height="459"
															width="2000"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-300"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-295">
	

</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-298"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-296">
	<p	class='typography typography--size-20-text-roman js-typography block-paragraph__paragraph'
	data-id='es-297'
	>
	However, we realized earlier this wouldn’t work. Instead, let’s do this:</p></div>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-303"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-301"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-302">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2023/01/Img-4.webp"
					class="image__img block-media__image-img"
					alt=""
										height="356"
															width="1001"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-309"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-304">
	

</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-307"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-305">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-306'
	>
	These extra two dummy effects give us a fully working sampler. The reconnection process would look like this:</p></div>	</div>
</div>
</div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-312"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-media">
	<div	class="media block-media__media media__border--none media__align--center-center"
	data-id="es-310"
	 data-media-type='image'>

	<figure class="image block-media__image-figure image--size-stretch" data-id="es-311">
	<picture class="image__picture block-media__image-picture">
												<img
					src="https://infinum.com/uploads/2023/01/Img-5-1.webp"
					class="image__img block-media__image-img"
					alt=""
										height="1220"
															width="1001"
										loading="lazy"
					 />
					</picture>

	</figure></div></div>		</div>
	</div>

<div
	class="wrapper"
	data-id="es-353"
	 data-animation-target='inner-items'>
		
			<div class="wrapper__inner">
			<div class="block-blog-content js-block-blog-content">
	
<div class="block-blog-content-sidebar" data-id="es-313">
	

</div>

<div class="block-blog-content-main">
	
<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-316"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-314">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-315'
	>
	Step 1: Create a Sampler with two static dummy nodes and connect it to them.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-318"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">engine.</span><span class="token">attach(</span><span class="token">sampler</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">engine.</span><span class="token">attach(</span><span class="token">staticDistortion</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">engine.</span><span class="token">attach(</span><span class="token">staticDistortion2</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">engine.</span><span class="token">attach(</span><span class="token">distortion</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">  
</span></span><span class="line"><span class="token">engine.</span><span class="token">connect(</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">sampler</span><span class="token">,
</span></span><span class="line"><span class="token">    </span><span class="token">to:</span><span class="token"> [
</span></span><span class="line"><span class="token">           </span><span class="token">AVAudioConnectionPoint(</span><span class="token">node:</span><span class="token"> staticDistortion</span><span class="token">, </span><span class="token">bus:</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">)</span><span class="token">,
</span></span><span class="line"><span class="token">           </span><span class="token">AVAudioConnectionPoint(</span><span class="token">node:</span><span class="token"> staticDistortion2</span><span class="token">, </span><span class="token">bus:</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">)</span><span class="token">,
</span></span><span class="line"><span class="token">           </span><span class="token">AVAudioConnectionPoint(</span><span class="token">node:</span><span class="token"> distortion</span><span class="token">, </span><span class="token">bus:</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">)</span><span class="token">,
</span></span><span class="line"><span class="token">    ],
</span></span><span class="line"><span class="token">    </span><span class="token">fromBus:</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">,
</span></span><span class="line"><span class="token">    </span><span class="token">format:</span><span class="token"> </span><span class="token" style="color: #005cc5;">nil</span><span class="token">
</span></span><span class="line"><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">engine.</span><span class="token">connect(</span><span class="token">distortion</span><span class="token">, </span><span class="token">to:</span><span class="token"> engine.</span><span class="token">mainMixerNode</span><span class="token">, </span><span class="token">format:</span><span class="token"> </span><span class="token" style="color: #005cc5;">nil</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">engine.</span><span class="token">connect(</span><span class="token">staticDistortion</span><span class="token">, </span><span class="token">to:</span><span class="token"> engine.</span><span class="token">mainMixerNode</span><span class="token">, </span><span class="token">format:</span><span class="token"> </span><span class="token" style="color: #005cc5;">nil</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">engine.</span><span class="token">connect(</span><span class="token">staticDistortion2</span><span class="token">, </span><span class="token">to:</span><span class="token"> engine.</span><span class="token">mainMixerNode</span><span class="token">, </span><span class="token">format:</span><span class="token"> </span><span class="token" style="color: #005cc5;">nil</span><span class="token">)</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-321"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-319">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-320'
	>
	Step 2: Reconnect.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-323"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-swift github-light" data-language="swift" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">engine.</span><span class="token">disconnectNodeOutput(</span><span class="token">distortion</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">engine.</span><span class="token">detach(</span><span class="token">distortion</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">engine.</span><span class="token">connect(</span><span class="token">equalizer</span><span class="token">, </span><span class="token">to:</span><span class="token"> engine.</span><span class="token">mainMixerNode</span><span class="token">, </span><span class="token">format:</span><span class="token"> </span><span class="token" style="color: #005cc5;">nil</span><span class="token">)</span><span class="token">
</span></span><span class="line"><span class="token">
</span></span><span class="line"><span class="token">engine.</span><span class="token">connect(</span><span class="token">
</span></span><span class="line"><span class="token">    </span><span class="token">sampler</span><span class="token">,
</span></span><span class="line"><span class="token">    </span><span class="token">to:</span><span class="token"> [
</span></span><span class="line"><span class="token">          </span><span class="token">AVAudioConnectionPoint(</span><span class="token">node:</span><span class="token"> staticDistortion</span><span class="token">, </span><span class="token">bus:</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">)</span><span class="token">,
</span></span><span class="line"><span class="token">          </span><span class="token">AVAudioConnectionPoint(</span><span class="token">node:</span><span class="token"> staticDistortion2</span><span class="token">, </span><span class="token">bus:</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">)</span><span class="token">,
</span></span><span class="line"><span class="token">          </span><span class="token">AVAudioConnectionPoint(</span><span class="token">node:</span><span class="token"> equalizer</span><span class="token">, </span><span class="token">bus:</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">)</span><span class="token">,
</span></span><span class="line"><span class="token">    ],
</span></span><span class="line"><span class="token">    </span><span class="token">fromBus:</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token">,
</span></span><span class="line"><span class="token">    </span><span class="token">format:</span><span class="token"> </span><span class="token" style="color: #005cc5;">nil</span><span class="token">
</span></span><span class="line"><span class="token">)</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-326"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-324">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-325'
	>
	If we now add the same breakpoint as in our initial setup, we will see that nothing gets called and the Sampler is not touched on reconnection.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-328"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-highlighted-text">
	<p	class='typography typography--size-24-text js-typography block-highlighted-text__typography'
	data-id='es-327'
	>
	Finding this out was pure luck. We had a more complex setup that worked by default. After making some changes to our chain, we found that things got broken and then went down the rabbit hole that brought us to this realization.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-331"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-329">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-330'
	>
	We need two dummy nodes because the splitter node is very sensitive to the number of connections. If we leave it with only one connection, we will get the following error:</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-333"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-code">
	<pre class="phiki language-php github-light" data-language="php" style="background-color: #fff;color: #24292e;"><code><span class="line"><span class="token">[</span><span class="token" style="color: #005cc5;">avae</span><span class="token">]</span><span class="token"> </span><span class="token" style="color: #005cc5;">AVAEInternal</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">h</span><span class="token">:</span><span class="token" style="color: #005cc5;">76</span><span class="token"> </span><span class="token" style="color: #005cc5;">required</span><span class="token"> </span><span class="token" style="color: #005cc5;">condition</span><span class="token"> </span><span class="token" style="color: #005cc5;">is</span><span class="token"> </span><span class="token" style="color: #005cc5;">false</span><span class="token">:</span><span class="token"> </span><span class="token">[</span><span class="token" style="color: #005cc5;">AVAudioEngineGraph</span><span class="token" style="color: #d73a49;">.</span><span class="token" style="color: #005cc5;">mm</span><span class="token">:</span><span class="token" style="color: #005cc5;">3135</span><span class="token">:</span><span class="token" style="color: #005cc5;">GetOutputConnectionPointsForNode</span><span class="token">:</span><span class="token"> </span><span class="token">(</span><span class="token" style="color: #005cc5;">numSplitterConnections</span><span class="token"> </span><span class="token" style="color: #d73a49;">==</span><span class="token"> </span><span class="token" style="color: #005cc5;">0</span><span class="token"> </span><span class="token" style="color: #d73a49;">||</span><span class="token"> </span><span class="token" style="color: #005cc5;">numSplitterConnections</span><span class="token"> </span><span class="token" style="color: #d73a49;">&gt;</span><span class="token"> </span><span class="token" style="color: #005cc5;">1</span><span class="token">)</span><span class="token">]</span><span class="token">
</span></span></code></pre></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-336"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-heading" data-id="es-334">
	<h2	class='typography typography--size-52-default js-typography block-heading__heading'
	data-id='es-335'
	>
	Tricky, yet important </h2></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-339"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-337">
	<p	class='typography typography--size-20-text-roman js-typography block-paragraph__paragraph'
	data-id='es-338'
	>
	While quite tricky, we’ve seen that the AUSampler in combination with AVAudioEngine is capable of picking up dynamically added or removed nodes. This use case is very important for some apps, and while going to the AudioUnit level is always an option, it also requires us to sacrifice the convenience of the <code>AVAudioEngine</code> API.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-342"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-340">
	<p	class='typography typography--size-20-text-roman js-typography block-paragraph__paragraph'
	data-id='es-341'
	>
	Please note that the <code>AVAudioPlayerNode</code> is not immune to this problem either. If we try to connect new nodes to the <code>AVAudioPlayerNode</code> during playback, the playback will stop and we will need to schedule buffers/files again.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-345"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-343">
	<p	class='typography typography--size-20-text-roman js-typography block-paragraph__paragraph'
	data-id='es-344'
	>
	Furthermore, it’s puzzling that introducing a splitter prevents the Sampler from cleanup; it would seem that shouldn’t be necessary.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-348"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-346">
	<p	class='typography typography--size-20-text-roman js-typography block-paragraph__paragraph'
	data-id='es-347'
	>
	We have filed both of these as bugs to Apple.</p></div>	</div>

<div
	class="wrapper wrapper__use-simple--true"
	data-id="es-351"
	 data-animation='slideFade' data-animation-target='inner-items'>
		
			<div class="block-paragraph" data-id="es-349">
	<p	class='typography typography--size-16-text-roman js-typography block-paragraph__paragraph'
	data-id='es-350'
	>
	You can find the associated source code <a href="https://github.com/infinum/mysterious-sampler" target="_blank" rel="noreferrer noopener">here</a>.</p></div>	</div>
</div>
</div>		</div>
	</div><p>The post <a href="https://infinum.com/blog/au-sampler-dynamic-chain-changes/">Can AU Sampler Survive Dynamic Chain Changes?</a> appeared first on <a href="https://infinum.com">Infinum</a>.</p>
]]>
				</content:encoded>
			</item>
		
	</channel>
</rss>