<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Audio Stream Mutex Issue</title>
		<link>http://www.allegro.cc/forums/view/616003</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sun, 24 Jan 2016 20:06:51 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m having an issue with my application freezing on an <span class="source-code"><a href="http://www.allegro.cc/manual/al_set_audio_stream_playing"><span class="a">al_set_audio_stream_playing</span></a><span class="k2">(</span>..., <span class="k1">false</span><span class="k2">)</span></span> call. Here are some details about how my program works.</p><p>I am attaching several audio streams to the default mixer and setting them to playing simultaneously. When I try to stop them using <span class="source-code"><a href="http://www.allegro.cc/manual/al_set_audio_stream_playing"><span class="a">al_set_audio_stream_playing</span></a><span class="k2">(</span>..., <span class="k1">false</span><span class="k2">)</span></span>, the first stream successfully stops. Subsequent streams will occasionally lock the program up on that call.</p><p>To start the streams, I do something like this:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">int</span> start_streams<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>
<span class="k2">{</span>
    <span class="k1">int</span> i<span class="k2">;</span>
    <span class="k1">for</span><span class="k2">(</span>i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> i <span class="k3">&lt;</span> total_streams<span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
    <span class="k2">{</span>
        <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_attach_audio_stream_to_mixer"><span class="a">al_attach_audio_stream_to_mixer</span></a><span class="k2">(</span>stream<span class="k2">[</span>i<span class="k2">]</span>, <a href="http://www.allegro.cc/manual/al_get_default_mixer"><span class="a">al_get_default_mixer</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">)</span>
        <span class="k2">{</span>
            <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_set_audio_stream_playing"><span class="a">al_set_audio_stream_playing</span></a><span class="k2">(</span>stream<span class="k2">[</span>i<span class="k2">]</span>, <span class="k1">true</span><span class="k2">)</span><span class="k2">)</span>
            <span class="k2">{</span>
                <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
            <span class="k2">}</span>
        <span class="k2">}</span>
    <span class="k2">}</span>
<span class="k2">}</span>
</pre></div></div><p>

I stop the streams in a similar manner:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">void</span> stop_streams<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>
<span class="k2">{</span>
    <span class="k1">int</span> i<span class="k2">;</span>
    <span class="k1">for</span><span class="k2">(</span>i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> i <span class="k3">&lt;</span> total_streams<span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
    <span class="k2">{</span>
        <span class="k1">if</span><span class="k2">(</span>stream<span class="k2">[</span>i<span class="k2">]</span><span class="k2">)</span>
        <span class="k2">{</span>
            <a href="http://www.allegro.cc/manual/al_set_audio_stream_playing"><span class="a">al_set_audio_stream_playing</span></a><span class="k2">(</span>stream<span class="k2">[</span>i<span class="k2">]</span>, <span class="k1">false</span><span class="k2">)</span><span class="k2">;</span>
            <a href="http://www.allegro.cc/manual/al_detach_audio_stream"><span class="a">al_detach_audio_stream</span></a><span class="k2">(</span>stream<span class="k2">[</span>i<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
        <span class="k2">}</span>
    <span class="k2">}</span>
<span class="k2">}</span>
</pre></div></div><p>

After some debugging I found that the lock up was happening inside <span class="source-code"><a href="http://www.allegro.cc/manual/al_set_audio_stream_playing"><span class="a">al_set_audio_stream_playing</span></a><span class="k2">(</span><span class="k2">)</span></span>. It is attempting to lock a mutex that is already locked by the stream feeder thread and it never gets the lock. </p><p>I found that the issue is caused by <span class="source-code"><a href="http://www.allegro.cc/manual/al_detach_audio_stream"><span class="a">al_detach_audio_stream</span></a><span class="k2">(</span><span class="k2">)</span></span> setting the first stream&#39;s mutex to <span class="source-code">NULL</span> after the stream feeder thread has locked the stream&#39;s mutex but before it unlocks it. This causes the first stream&#39;s mutex to never get unlocked. Since all of the streams are sharing a single mutex, the second stream will never get the mutex lock because it is still locked.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Todd Cope)</author>
		<pubDate>Sun, 24 Jan 2016 07:25:25 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>What do you think of this fix: <a href="https://github.com/liballeg/allegro5/pull/561">https://github.com/liballeg/allegro5/pull/561</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (SiegeLord)</author>
		<pubDate>Sun, 24 Jan 2016 12:39:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I wonder if this explains some of the problems I had on Android when trying to stop audio streams while switched out. I ended up wanting to shut down the entire voice for battery saving reasons anyway in the end, but before that I think I had some lockups :/
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Sun, 24 Jan 2016 20:06:51 +0000</pubDate>
	</item>
</rss>
