<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>[OSX 10.9] Audio somehow freezes program a few seconds on exit</title>
		<link>http://www.allegro.cc/forums/view/614696</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Mon, 06 Oct 2014 02:26:20 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hi!</p><p>I have the same problem as explained here: <a href="https://www.allegro.cc/forums/thread/613698">https://www.allegro.cc/forums/thread/613698</a></p><p>I&#39;ve tried to replicate the problem in the smallest amount of code possible, but haven&#39;t succeeded yet. But in the codebase I have now, if I remove al_reserve_samples(), the program quits immediately - if I add it back the program waits for 10 seconds (after the window is gone) before it really quits.</p><p>I&#39;m not sure how to debug this. Has anyone looked into this yet?</p><p>edit:</p><p>I managed to replicate the problem in the smallest amount of code:</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">  2</span><span class="p">#include &lt;allegro5/allegro_audio.h&gt;</span>
<span class="number">  3</span><span class="p">#include &lt;allegro5/allegro_acodec.h&gt;</span>
<span class="number">  4</span><span class="p">#include &lt;memory&gt;</span>
<span class="number">  5</span>
<span class="number">  6</span><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span> argc, <span class="k1">char</span> <span class="k3">*</span>argv<span class="k2">[</span><span class="k2">]</span><span class="k2">)</span>
<span class="number">  7</span><span class="k2">{</span>
<span class="number">  8</span>    <a href="http://www.allegro.cc/manual/al_init"><span class="a">al_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  9</span>    
<span class="number"> 10</span>    std::shared_ptr<span class="k3">&lt;</span>ALLEGRO_EVENT_QUEUE&gt; queue <span class="k3">=</span> std::shared_ptr<span class="k3">&lt;</span>ALLEGRO_EVENT_QUEUE&gt;<span class="k2">(</span><a href="http://www.allegro.cc/manual/al_create_event_queue"><span class="a">al_create_event_queue</span></a><span class="k2">(</span><span class="k2">)</span>, <a href="http://www.allegro.cc/manual/al_destroy_event_queue"><span class="a">al_destroy_event_queue</span></a><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span>    std::shared_ptr<span class="k3">&lt;</span>ALLEGRO_DISPLAY&gt; display <span class="k3">=</span> std::shared_ptr<span class="k3">&lt;</span>ALLEGRO_DISPLAY&gt;<span class="k2">(</span><a href="http://www.allegro.cc/manual/al_create_display"><span class="a">al_create_display</span></a><span class="k2">(</span><span class="n">640</span>, <span class="n">480</span><span class="k2">)</span>, <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 12</span>
<span class="number"> 13</span>    <a href="http://www.allegro.cc/manual/al_install_audio"><span class="a">al_install_audio</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 14</span>    <a href="http://www.allegro.cc/manual/al_init_acodec_addon"><span class="a">al_init_acodec_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>    <a href="http://www.allegro.cc/manual/al_reserve_samples"><span class="a">al_reserve_samples</span></a><span class="k2">(</span><span class="n">16</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>    
<span class="number"> 17</span>    <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>queue.get<span class="k2">(</span><span class="k2">)</span>, <a href="http://www.allegro.cc/manual/al_get_display_event_source"><span class="a">al_get_display_event_source</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_current_display"><span class="a">al_get_current_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 18</span>    
<span class="number"> 19</span>    <span class="k1">bool</span> quit <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 20</span>    <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span>quit<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 21</span>        <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> event<span class="k2">;</span>
<span class="number"> 22</span>        <a href="http://www.allegro.cc/manual/al_wait_for_event"><span class="a">al_wait_for_event</span></a><span class="k2">(</span>queue.get<span class="k2">(</span><span class="k2">)</span>, <span class="k3">&amp;</span>event<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span>    
<span class="number"> 24</span>        <span class="k1">switch</span> <span class="k2">(</span>event.type<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 25</span>            <span class="k1">case</span> ALLEGRO_EVENT_DISPLAY_CLOSE:
<span class="number"> 26</span>                quit <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 27</span>                <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 28</span>        <span class="k2">}</span>
<span class="number"> 29</span>    <span class="k2">}</span>
<span class="number"> 30</span>    
<span class="number"> 31</span>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 32</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc ( Arvidsson)</author>
		<pubDate>Sat, 04 Oct 2014 10:55:30 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Are there corresponding al_destroy_sample()&#39;s at exit?  Just guessing here.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Sat, 04 Oct 2014 13:10:36 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>To debug you can add in some <span class="source-code"><a href="http://www.allegro.cc/manual/al_get_time"><span class="a">al_get_time</span></a><span class="k2">(</span><span class="k2">)</span></span> statements and see how long it is between measurements around each line of code. Something else you can do is run it through the debugger and when you think it is busy doing its thing, then hit CTRL-C and break execution. Then </p><pre>info threads</pre><p> and usually check out thread 1, but sometimes all you get is weird system calls. Do a </p><pre>backtrace</pre><p> on each thread by switching threads with </p><pre>thread N</pre><p>. You don&#39;t always get anything useful unless all your libs are debug. Call <span class="source-code"><a href="http://www.allegro.cc/manual/al_uninstall_audio"><span class="a">al_uninstall_audio</span></a></span>  and the other shutdown functions manually and see which ones take the longest. That may help narrow it down.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sun, 05 Oct 2014 00:04:11 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>When I run this:</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="c">// g++ -Wall main.cpp -o main -lallegro_monolith</span>
<span class="number">  2</span><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">  3</span><span class="p">#include &lt;allegro5/allegro_audio.h&gt;</span>
<span class="number">  4</span><span class="p">#include &lt;allegro5/allegro_acodec.h&gt;</span>
<span class="number">  5</span><span class="p">#include &lt;iostream&gt;</span>
<span class="number">  6</span>
<span class="number">  7</span><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span> argc, <span class="k1">char</span> <span class="k3">*</span>argv<span class="k2">[</span><span class="k2">]</span><span class="k2">)</span>
<span class="number">  8</span><span class="k2">{</span>
<span class="number">  9</span>    <a href="http://www.allegro.cc/manual/al_install_system"><span class="a">al_install_system</span></a><span class="k2">(</span>ALLEGRO_VERSION_INT, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 10</span>    
<span class="number"> 11</span>    <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_QUEUE"><span class="a">ALLEGRO_EVENT_QUEUE</span></a> <span class="k3">*</span>q <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_event_queue"><span class="a">al_create_event_queue</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 12</span>    <a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a> <span class="k3">*</span>d <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_display"><span class="a">al_create_display</span></a><span class="k2">(</span><span class="n">640</span>, <span class="n">480</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 13</span>
<span class="number"> 14</span>    <a href="http://www.allegro.cc/manual/al_install_audio"><span class="a">al_install_audio</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>    <a href="http://www.allegro.cc/manual/al_init_acodec_addon"><span class="a">al_init_acodec_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>    <a href="http://www.allegro.cc/manual/al_reserve_samples"><span class="a">al_reserve_samples</span></a><span class="k2">(</span><span class="n">16</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 17</span>    
<span class="number"> 18</span>    <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>q, <a href="http://www.allegro.cc/manual/al_get_display_event_source"><span class="a">al_get_display_event_source</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_current_display"><span class="a">al_get_current_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>    
<span class="number"> 20</span>    <span class="k1">while</span> <span class="k2">(</span><span class="k1">true</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 21</span>        <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> e<span class="k2">;</span>
<span class="number"> 22</span>        <a href="http://www.allegro.cc/manual/al_wait_for_event"><span class="a">al_wait_for_event</span></a><span class="k2">(</span>q, <span class="k3">&amp;</span>e<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span>    
<span class="number"> 24</span>        <span class="k1">if</span> <span class="k2">(</span>e.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_DISPLAY_CLOSE<span class="k2">)</span>
<span class="number"> 25</span>            <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 26</span>    <span class="k2">}</span>
<span class="number"> 27</span>    
<span class="number"> 28</span>    std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"destroy display"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 29</span>    <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span>d<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 30</span>    
<span class="number"> 31</span>    std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"destroy queue"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 32</span>    <a href="http://www.allegro.cc/manual/al_destroy_event_queue"><span class="a">al_destroy_event_queue</span></a><span class="k2">(</span>q<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 33</span>    
<span class="number"> 34</span>    std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"uninstall audio"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 35</span>    <a href="http://www.allegro.cc/manual/al_uninstall_audio"><span class="a">al_uninstall_audio</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 36</span>    
<span class="number"> 37</span>    std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"uninstall allegro"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 38</span>    <a href="http://www.allegro.cc/manual/al_uninstall_system"><span class="a">al_uninstall_system</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 39</span>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 40</span><span class="k2">}</span>
</div></div><p>

It gets stuck at al_uninstall_audio(). I&#39;ll try to investigate further.</p><p>What is weird is this though: if I comment out the while loop, the program runs and quits immediately. <img src="http://www.allegro.cc/forums/smileys/huh.gif" alt="???" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc ( Arvidsson)</author>
		<pubDate>Sun, 05 Oct 2014 16:52:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I traced this all through and the &#39;slow&#39; part seems to be a call to <span class="source-code">AudioQueueDispose</span> in <span class="source-code">aqueue.m</span>.</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="c">/* The stop_voice method should stop playback. For non-streaming voices, it</span>
<span class="number">  2</span><span class="c">   should leave the data loaded, and reset the voice position to 0. */</span>
<span class="number">  3</span><span class="k1">static</span> <span class="k1">int</span> _aqueue_stop_voice<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_VOICE"><span class="a">ALLEGRO_VOICE</span></a><span class="k3">*</span> voice<span class="k2">)</span>
<span class="number">  4</span><span class="k2">{</span>
<span class="number">  5</span>   ALLEGRO_AQ_DATA <span class="k3">*</span>ex_data <span class="k3">=</span> voice-&gt;extra<span class="k2">;</span>
<span class="number">  6</span>
<span class="number">  7</span>   <span class="k1">if</span> <span class="k2">(</span>playing <span class="k3">=</span><span class="k3">=</span> <span class="k1">true</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  8</span>      playing <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  9</span>
<span class="number"> 10</span>      ex_data-&gt;playing <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 11</span>
<span class="number"> 12</span>      AudioQueueDispose<span class="k2">(</span>
<span class="number"> 13</span>         queue,
<span class="number"> 14</span>         <span class="k1">true</span>
<span class="number"> 15</span>      <span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>   <span class="k2">}</span>
<span class="number"> 17</span>
<span class="number"> 18</span>   <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 19</span><span class="k2">}</span>
</div></div><p>

The second parameter to AQD can be <span class="source-code"><span class="k1">false</span></span> to dispose of the queue asynchronously and I wonder if that mode might help. Of course, it may well be set to true for a good reason.</p><p>Pete
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Hull)</author>
		<pubDate>Mon, 06 Oct 2014 00:21:40 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Seems Elias fixed it? <a href="https://github.com/liballeg/allegro5/commit/d6d58b28b018e065770bb96b7276fe2cc002cad6">https://github.com/liballeg/allegro5/commit/d6d58b28b018e065770bb96b7276fe2cc002cad6</a></p><p>I recompiled allegro with the fix and now my example above quits immediately as it should.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc ( Arvidsson)</author>
		<pubDate>Mon, 06 Oct 2014 01:00:24 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I don&#39;t know if that makes me feel really clever or really dumb. Anyway, glad it&#39;s fixed.<br />Maybe the powers that be should consider backporting the fix for 5.0.10?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Hull)</author>
		<pubDate>Mon, 06 Oct 2014 01:57:22 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/614696/1005892#target">Peter Hull</a> said:</div><div class="quote"><p>Maybe the powers that be should consider backporting the fix for 5.0.10?</p></div></div><p>We need to sit down and make someone do some backporting. And then make a release.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Mon, 06 Oct 2014 02:26:20 +0000</pubDate>
	</item>
</rss>
