<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Possible inconsistency in the behavior of al_set_sample_instance_playing() ?</title>
		<link>http://www.allegro.cc/forums/view/613614</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Tue, 10 Dec 2013 14:02:28 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>[Edit1] See Edit1 (below the original text) for my attempt at solving the problem.</p><p>So, I was experimenting with the latest 5.1.8 Allegro libraries, obtained from the repository and compiled in debug mode (I&#39;ve decided that since that is where all bugfixes are going, I might as well start using it right away). I have discovered that in certain situations, al_set_sample_instance_playing() will return &#39;false&#39; where I think it should be returning &#39;true&#39;.</p><p>What that means is that code like the following ...</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">// This is code (almost) directly from my project.</span>
<span class="number">  2</span>
<span class="number">  3</span><span class="c">// All necessary initialization here.</span>
<span class="number">  4</span>
<span class="number">  5</span><span class="c">/*</span>
<span class="number">  6</span><span class="c"> * Anything here.</span>
<span class="number">  7</span><span class="c"> */</span>
<span class="number">  8</span>
<span class="number">  9</span><span class="c">// 'mSampleInstance' is a smart pointer.</span>
<span class="number"> 10</span><span class="k1">bool</span> jResult <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_stop_sample_instance"><span class="a">al_stop_sample_instance</span></a><span class="k2">(</span><span class="k3">*</span>mSampleInstance<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>jResult<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 12</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_get_sample_instance_playing"><span class="a">al_get_sample_instance_playing</span></a><span class="k2">(</span><span class="k3">*</span>mSampleInstance<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
</div></div><p>

... can fail, depending on what is in that &quot;anything here&quot;.</p><p>I think the example program below will be more descriptive of what I mean. There is also more explanation in the comments ....</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="number">   2</span><span class="c">// This program is intended to demonstrate an inconsistency in the meaning of</span>
<span class="number">   3</span><span class="c">// the return value of al_set_sample_instance_playing().</span>
<span class="number">   4</span>
<span class="number">   5</span><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">   6</span><span class="p">#include &lt;allegro5/allegro_audio.h&gt;</span>
<span class="number">   7</span><span class="p">#include &lt;allegro5/allegro_acodec.h&gt;</span>
<span class="number">   8</span>
<span class="number">   9</span><span class="p">#include &lt;iostream&gt;</span>
<span class="number">  10</span><span class="p">#include &lt;cassert&gt;</span>
<span class="number">  11</span>
<span class="number">  12</span>
<span class="number">  13</span>
<span class="number">  14</span><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span> <span class="c">/* argc */</span>, <span class="k1">char</span><span class="k3">*</span><span class="k3">*</span> <span class="c">/* argv */</span><span class="k2">)</span>
<span class="number">  15</span><span class="k2">{</span>
<span class="number">  16</span>  std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Starting test ..."</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number">  17</span>
<span class="number">  18</span>  <span class="c">// Initialize Allegro Base.</span>
<span class="number">  19</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</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">  20</span>  <span class="k2">{</span>
<span class="number">  21</span>    std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"al_init() failed."</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number">  22</span>    <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  23</span>  <span class="k2">}</span>
<span class="number">  24</span>
<span class="number">  25</span>  <span class="c">// Initialize Allegro Audio add-on.</span>
<span class="number">  26</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</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">  27</span>  <span class="k2">{</span>
<span class="number">  28</span>    std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"al_install_audio() failed."</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number">  29</span>    <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  30</span>  <span class="k2">}</span>
<span class="number">  31</span>
<span class="number">  32</span>  <span class="c">// Initialize the Allegro Audio Codec add-on.</span>
<span class="number">  33</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</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">  34</span>  <span class="k2">{</span>
<span class="number">  35</span>    std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"al_init_acodec_addon() failed."</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number">  36</span>    <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  37</span>  <span class="k2">}</span>
<span class="number">  38</span>
<span class="number">  39</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_is_system_installed"><span class="a">al_is_system_installed</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  40</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_is_audio_installed"><span class="a">al_is_audio_installed</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  41</span>
<span class="number">  42</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_VOICE"><span class="a">ALLEGRO_VOICE</span></a><span class="k3">*</span> pVoice <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  43</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_MIXER"><span class="a">ALLEGRO_MIXER</span></a><span class="k3">*</span> pMixer <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  44</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_SAMPLE"><span class="a">ALLEGRO_SAMPLE</span></a><span class="k3">*</span> pSample <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  45</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_SAMPLE_INSTANCE"><span class="a">ALLEGRO_SAMPLE_INSTANCE</span></a><span class="k3">*</span> pSampleInstance <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  46</span>
<span class="number">  47</span>  <span class="c">// Configuration variables.</span>
<span class="number">  48</span>  <span class="k1">const</span> <span class="k1">unsigned</span> <span class="k1">int</span> frequency <span class="k3">=</span> <span class="n">44100</span><span class="k2">;</span>
<span class="number">  49</span>  <span class="k1">const</span> <a href="http://www.allegro.cc/manual/ALLEGRO_CHANNEL_CONF"><span class="a">ALLEGRO_CHANNEL_CONF</span></a> channel_conf <span class="k3">=</span> ALLEGRO_CHANNEL_CONF_2<span class="k2">;</span>
<span class="number">  50</span>  <span class="k1">const</span> <a href="http://www.allegro.cc/manual/ALLEGRO_AUDIO_DEPTH"><span class="a">ALLEGRO_AUDIO_DEPTH</span></a> audio_depth <span class="k3">=</span> ALLEGRO_AUDIO_DEPTH_FLOAT32<span class="k2">;</span>
<span class="number">  51</span>
<span class="number">  52</span>  <span class="c">// Create the voice, mixer, sample and sample instance.</span>
<span class="number">  53</span>  pVoice <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_voice"><span class="a">al_create_voice</span></a><span class="k2">(</span>frequency, audio_depth, channel_conf<span class="k2">)</span><span class="k2">;</span>
<span class="number">  54</span>  pMixer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_mixer"><span class="a">al_create_mixer</span></a><span class="k2">(</span>frequency, audio_depth, channel_conf<span class="k2">)</span><span class="k2">;</span>
<span class="number">  55</span>
<span class="number">  56</span>  <span class="c">// Note: I think the sound needs to be a long one (&gt; 20 seconds). I don't</span>
<span class="number">  57</span>  <span class="c">// think the problem will appear if the sound is short enough to enter the</span>
<span class="number">  58</span>  <span class="c">// 'stopped' state by the time the execution of the main thread reaches the</span>
<span class="number">  59</span>  <span class="c">// problem tests.</span>
<span class="number">  60</span>  pSample <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_load_sample"><span class="a">al_load_sample</span></a><span class="k2">(</span><span class="s">"./test.ogg"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  61</span>
<span class="number">  62</span>  pSampleInstance <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_sample_instance"><span class="a">al_create_sample_instance</span></a><span class="k2">(</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  63</span>
<span class="number">  64</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>pVoice<span class="k2">)</span>
<span class="number">  65</span>  <span class="k2">{</span>
<span class="number">  66</span>    std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"al_create_voice() failed."</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number">  67</span>    <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  68</span>  <span class="k2">}</span>
<span class="number">  69</span>  <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>pMixer<span class="k2">)</span>
<span class="number">  70</span>  <span class="k2">{</span>
<span class="number">  71</span>    std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"al_create_mixer() failed."</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number">  72</span>    <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  73</span>  <span class="k2">}</span>
<span class="number">  74</span>  <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>pSample<span class="k2">)</span>
<span class="number">  75</span>  <span class="k2">{</span>
<span class="number">  76</span>    std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"al_load_sample() failed."</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number">  77</span>    <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  78</span>  <span class="k2">}</span>
<span class="number">  79</span>  <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>pSampleInstance<span class="k2">)</span>
<span class="number">  80</span>  <span class="k2">{</span>
<span class="number">  81</span>    std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"al_create_sample_instance() failed."</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number">  82</span>    <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  83</span>  <span class="k2">}</span>
<span class="number">  84</span>
<span class="number">  85</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>pMixer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  86</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>pVoice<span class="k2">)</span><span class="k2">;</span>
<span class="number">  87</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>pSample<span class="k2">)</span><span class="k2">;</span>
<span class="number">  88</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>pSampleInstance<span class="k2">)</span><span class="k2">;</span>
<span class="number">  89</span>
<span class="number">  90</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_set_sample"><span class="a">al_set_sample</span></a><span class="k2">(</span>pSampleInstance, pSample<span class="k2">)</span><span class="k2">)</span>
<span class="number">  91</span>  <span class="k2">{</span>
<span class="number">  92</span>    std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"al_set_sample() failed."</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number">  93</span>    <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  94</span>  <span class="k2">}</span>
<span class="number">  95</span>  <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_attach_sample_instance_to_mixer"><span class="a">al_attach_sample_instance_to_mixer</span></a><span class="k2">(</span>pSampleInstance, pMixer<span class="k2">)</span><span class="k2">)</span>
<span class="number">  96</span>  <span class="k2">{</span>
<span class="number">  97</span>    std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"al_attach_sample_instance_to_mixer() failed."</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number">  98</span>    <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  99</span>  <span class="k2">}</span>
<span class="number"> 100</span>  <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_attach_mixer_to_voice"><span class="a">al_attach_mixer_to_voice</span></a><span class="k2">(</span>pMixer, pVoice<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 101</span>  <span class="k2">{</span>
<span class="number"> 102</span>    std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"al_attach_mixer_to_voice() failed."</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 103</span>    <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number"> 104</span>  <span class="k2">}</span>
<span class="number"> 105</span>
<span class="number"> 106</span>
<span class="number"> 107</span>
<span class="number"> 108</span>  <span class="c">// Begin the actual test.</span>
<span class="number"> 109</span>
<span class="number"> 110</span>
<span class="number"> 111</span>
<span class="number"> 112</span>  <span class="k1">bool</span> result <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 113</span>
<span class="number"> 114</span>  <span class="c">// Test al_set_sample_instance_playing() with a mixer and data.</span>
<span class="number"> 115</span>  result <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_set_sample_instance_playing"><span class="a">al_set_sample_instance_playing</span></a><span class="k2">(</span>pSampleInstance, <span class="k1">true</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 116</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>result<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 117</span>  <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">2</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 118</span>
<span class="number"> 119</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_sample_instance_playing"><span class="a">al_get_sample_instance_playing</span></a><span class="k2">(</span>pSampleInstance<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 120</span>  result <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_set_sample_instance_playing"><span class="a">al_set_sample_instance_playing</span></a><span class="k2">(</span>pSampleInstance, <span class="k1">true</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 121</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>result<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 122</span>  <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">2</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 123</span>
<span class="number"> 124</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_sample_instance_playing"><span class="a">al_get_sample_instance_playing</span></a><span class="k2">(</span>pSampleInstance<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 125</span>  result <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_set_sample_instance_playing"><span class="a">al_set_sample_instance_playing</span></a><span class="k2">(</span>pSampleInstance, <span class="k1">false</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 126</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>result<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 127</span>  <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">2</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 128</span>
<span class="number"> 129</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_get_sample_instance_playing"><span class="a">al_get_sample_instance_playing</span></a><span class="k2">(</span>pSampleInstance<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 130</span>  result <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_set_sample_instance_playing"><span class="a">al_set_sample_instance_playing</span></a><span class="k2">(</span>pSampleInstance, <span class="k1">false</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 131</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>result<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 132</span>  <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">2</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 133</span>
<span class="number"> 134</span>  <span class="c">// Note: before trying to test al_set_sample_instance_playing() while no mixer</span>
<span class="number"> 135</span>  <span class="c">// is attached, I first start the sample instance playing again. This test</span>
<span class="number"> 136</span>  <span class="c">// program will succeed if this code is commented out. I do not know why.</span>
<span class="number"> 137</span>  result <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_set_sample_instance_playing"><span class="a">al_set_sample_instance_playing</span></a><span class="k2">(</span>pSampleInstance, <span class="k1">true</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 138</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>result<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 139</span>  <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">2</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 140</span>
<span class="number"> 141</span>  <span class="c">// Disconnect the sample instance from the mixer -- note: I do not detach it</span>
<span class="number"> 142</span>  <span class="c">// from the sample data (notice the commented-out code).</span>
<span class="number"> 143</span>  <span class="k2">{</span>
<span class="number"> 144</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_sample_instance_attached"><span class="a">al_get_sample_instance_attached</span></a><span class="k2">(</span>pSampleInstance<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 145</span>    result <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_detach_sample_instance"><span class="a">al_detach_sample_instance</span></a><span class="k2">(</span>pSampleInstance<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 146</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>result<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 147</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_get_sample_instance_attached"><span class="a">al_get_sample_instance_attached</span></a><span class="k2">(</span>pSampleInstance<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 148</span>
<span class="number"> 149</span>    <span class="c">// Uncommenting this code results in an ASSERT() in</span>
<span class="number"> 150</span>    <span class="c">// addons/audio/kcm_instance.c:596. Line 594 calls</span>
<span class="number"> 151</span>    <span class="c">// al_set_sample_instance_playing(spl, false).</span>
<span class="number"> 152</span><span class="c">//    result = al_set_sample(pSampleInstance, 0);</span>
<span class="number"> 153</span><span class="c">//    assert(result);</span>
<span class="number"> 154</span>  <span class="k2">}</span>
<span class="number"> 155</span>
<span class="number"> 156</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_get_sample_instance_attached"><span class="a">al_get_sample_instance_attached</span></a><span class="k2">(</span>pSampleInstance<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 157</span>  <span class="c">// The problem begins with this line. It doesn't do what (I think) it should.</span>
<span class="number"> 158</span>  result <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_set_sample_instance_playing"><span class="a">al_set_sample_instance_playing</span></a><span class="k2">(</span>pSampleInstance, <span class="k1">false</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 159</span>
<span class="number"> 160</span>  <span class="c">// This assert(), if uncommented, will fail. Shouldn't calling</span>
<span class="number"> 161</span>  <span class="c">// al_set_sample_instance_playing(false) always succeed, even when no parent</span>
<span class="number"> 162</span>  <span class="c">// exists?</span>
<span class="number"> 163</span>  <span class="c">//assert(result);</span>
<span class="number"> 164</span>
<span class="number"> 165</span>  <span class="c">// This assert() will fail because the last call to</span>
<span class="number"> 166</span>  <span class="c">// al_set_sample_instance_playing(false) does not actually set 'is_playing' to</span>
<span class="number"> 167</span>  <span class="c">// 'false' for the given sample instance. This is because</span>
<span class="number"> 168</span>  <span class="c">// al_set_sample_instance_playing() returns early (with a return value of</span>
<span class="number"> 169</span>  <span class="c">// false) if no parent exists.</span>
<span class="number"> 170</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_get_sample_instance_playing"><span class="a">al_get_sample_instance_playing</span></a><span class="k2">(</span>pSampleInstance<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 171</span>  <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">2</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 172</span>
<span class="number"> 173</span>  result <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_set_sample_instance_playing"><span class="a">al_set_sample_instance_playing</span></a><span class="k2">(</span>pSampleInstance, <span class="k1">true</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 174</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span><span class="k3">!</span>result<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 175</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_get_sample_instance_playing"><span class="a">al_get_sample_instance_playing</span></a><span class="k2">(</span>pSampleInstance<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 176</span>  <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">2</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 177</span>
<span class="number"> 178</span>
<span class="number"> 179</span>  <span class="c">// End the actual test.</span>
<span class="number"> 180</span>
<span class="number"> 181</span>
<span class="number"> 182</span>
<span class="number"> 183</span>  <span class="c">// Clean up.</span>
<span class="number"> 184</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>pMixer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 185</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>pVoice<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 186</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>pSample<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 187</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>pSampleInstance<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 188</span>
<span class="number"> 189</span>  <a href="http://www.allegro.cc/manual/al_destroy_mixer"><span class="a">al_destroy_mixer</span></a><span class="k2">(</span>pMixer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 190</span>  <a href="http://www.allegro.cc/manual/al_destroy_voice"><span class="a">al_destroy_voice</span></a><span class="k2">(</span>pVoice<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 191</span>  <a href="http://www.allegro.cc/manual/al_destroy_sample"><span class="a">al_destroy_sample</span></a><span class="k2">(</span>pSample<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 192</span>  <a href="http://www.allegro.cc/manual/al_destroy_sample_instance"><span class="a">al_destroy_sample_instance</span></a><span class="k2">(</span>pSampleInstance<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 193</span>
<span class="number"> 194</span>  pMixer <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 195</span>  pVoice <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 196</span>  pSample <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 197</span>  pSampleInstance <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 198</span>
<span class="number"> 199</span>  <span class="c">// Shutdown Allegro Audio add-on; Allegro Base.</span>
<span class="number"> 200</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"> 201</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"> 202</span>
<span class="number"> 203</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_is_system_installed"><span class="a">al_is_system_installed</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 204</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_is_audio_installed"><span class="a">al_is_audio_installed</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 205</span>
<span class="number"> 206</span>  std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Test finished."</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 207</span>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 208</span><span class="k2">}</span>
</div></div><p>

Looking at the source code of al_set_sample_instance_playing(), I think at least part of the problem is that, if no parent mixer (or voice) is attached, and this function is called with &#39;false&#39;, then this function will return early (with a return value of &#39;false&#39;), even if the sample instance is actually playing at the time. That is, &#39;spl-&gt;is_playing&#39; doesn&#39;t get set to &#39;false&#39;. Which causes al_get_sample_instance_playing() to return &#39;true&#39; <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /></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">/* Function: al_set_sample_instance_playing</span>
<span class="number">  2</span><span class="c"> */</span>
<span class="number">  3</span><span class="k1">bool</span> <a href="http://www.allegro.cc/manual/al_set_sample_instance_playing"><span class="a">al_set_sample_instance_playing</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_SAMPLE_INSTANCE"><span class="a">ALLEGRO_SAMPLE_INSTANCE</span></a> <span class="k3">*</span>spl, <span class="k1">bool</span> val<span class="k2">)</span>
<span class="number">  4</span><span class="k2">{</span>
<span class="number">  5</span>   <a href="http://www.allegro.cc/manual/ASSERT"><span class="a">ASSERT</span></a><span class="k2">(</span>spl<span class="k2">)</span><span class="k2">;</span>
<span class="number">  6</span>
<span class="number">  7</span>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>spl-&gt;parent.u.ptr<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  8</span>      _al_set_error<span class="k2">(</span>ALLEGRO_INVALID_OBJECT, <span class="s">"Sample has no parent"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  9</span>      <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 10</span>   <span class="k2">}</span>
<span class="number"> 11</span>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>spl-&gt;spl_data.buffer.ptr<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 12</span>      _al_set_error<span class="k2">(</span>ALLEGRO_INVALID_OBJECT, <span class="s">"Sample has no data"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 13</span>      <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 14</span>   <span class="k2">}</span>
<span class="number"> 15</span>
<span class="number"> 16</span>   <span class="k1">if</span> <span class="k2">(</span>spl-&gt;parent.is_voice<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 17</span>      <span class="c">/* parent is voice */</span>
<span class="number"> 18</span>      <a href="http://www.allegro.cc/manual/ALLEGRO_VOICE"><span class="a">ALLEGRO_VOICE</span></a> <span class="k3">*</span>voice <span class="k3">=</span> spl-&gt;parent.u.voice<span class="k2">;</span>
<span class="number"> 19</span>
<span class="number"> 20</span>      <span class="k1">return</span> <a href="http://www.allegro.cc/manual/al_set_voice_playing"><span class="a">al_set_voice_playing</span></a><span class="k2">(</span>voice, val<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 21</span>   <span class="k2">}</span>
<span class="number"> 22</span>
<span class="number"> 23</span>   <span class="c">/* parent is mixer */</span>
<span class="number"> 24</span>   maybe_lock_mutex<span class="k2">(</span>spl-&gt;mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 25</span>   spl-&gt;is_playing <span class="k3">=</span> val<span class="k2">;</span>
<span class="number"> 26</span>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>val<span class="k2">)</span>
<span class="number"> 27</span>      spl-&gt;pos <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 28</span>   maybe_unlock_mutex<span class="k2">(</span>spl-&gt;mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 29</span>   <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 30</span><span class="k2">}</span>
</div></div><p>




</p><h1>[Edit1]</h1><p>

I have discovered that always calling al_set_sample_instance_playing(splinst, false) before detaching the sample instance from anything seems to reliably fix the apparent problem. This led me to suspect that al_detach_sample_instance() was not doing this itself (although, I think that it should).</p><p>So I added the following code to the very end of _al_kcm_detach_from_parent() (taken from al_set_sample_instance_playing(), with a slight modification):</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>maybe_lock_mutex<span class="k2">(</span>spl-&gt;mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 2</span>spl-&gt;is_playing <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 3</span>spl-&gt;pos <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 4</span>maybe_unlock_mutex<span class="k2">(</span>spl-&gt;mutex<span class="k2">)</span><span class="k2">;</span>
</div></div><p>

And then I changed the error detection in al_set_sample_instance_playing() to look like 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="k1">if</span> <span class="k2">(</span><span class="k3">!</span>spl-&gt;parent.u.ptr<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  2</span>      _al_set_error<span class="k2">(</span>ALLEGRO_INVALID_OBJECT, <span class="s">"Sample has no parent"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  3</span>      <a href="http://www.allegro.cc/manual/ASSERT"><span class="a">ASSERT</span></a><span class="k2">(</span>spl-&gt;is_playing <span class="k3">=</span><span class="k3">=</span> <span class="k1">false</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  4</span>      
<span class="number">  5</span>      <span class="k1">if</span><span class="k2">(</span>val<span class="k2">)</span> <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  6</span>      <span class="k1">else</span> <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  7</span>   <span class="k2">}</span>
<span class="number">  8</span>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>spl-&gt;spl_data.buffer.ptr<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  9</span>      _al_set_error<span class="k2">(</span>ALLEGRO_INVALID_OBJECT, <span class="s">"Sample has no data"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 10</span>      <a href="http://www.allegro.cc/manual/ASSERT"><span class="a">ASSERT</span></a><span class="k2">(</span>spl-&gt;is_playing <span class="k3">=</span><span class="k3">=</span> <span class="k1">false</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span>      
<span class="number"> 12</span>      <span class="k1">if</span><span class="k2">(</span>val<span class="k2">)</span> <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 13</span>      <span class="k1">else</span> <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 14</span>   <span class="k2">}</span>
</div></div><p>

This makes my test program succeed, and doesn&#39;t seem to cause my project any problems. I haven&#39;t tested any of the examples that come with Allegro yet, though.</p><p>I hope this doesn&#39;t break something else.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Bluebird)</author>
		<pubDate>Sun, 08 Dec 2013 09:13:20 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>What if al_set_sample_instance_playing is allowed to change the playing state of the instance, regardless of whether it is attached to a parent or whether it has data This would be consistent with the other instance states (position, speed, gain, pan, playmode) as far as I can tell.</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>diff <span class="k3">-</span><span class="k3">-</span>git a<span class="k3">/</span>addons<span class="k3">/</span>audio<span class="k3">/</span>kcm_instance.c b<span class="k3">/</span>addons<span class="k3">/</span>audio<span class="k3">/</span>kcm_instance.c
<span class="number">  2</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> <span class="n">8094707</span>..<span class="n">737665c</span> <span class="n">100644</span>
<span class="number">  3</span><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span> a<span class="k3">/</span>addons<span class="k3">/</span>audio<span class="k3">/</span>kcm_instance.c
<span class="number">  4</span><span class="k3">+</span><span class="k3">+</span><span class="k3">+</span> b<span class="k3">/</span>addons<span class="k3">/</span>audio<span class="k3">/</span>kcm_instance.c
<span class="number">  5</span>@@ <span class="k3">-</span><span class="n">542</span>,<span class="n">13</span> <span class="k3">+</span><span class="n">542</span>,<span class="n">9</span> @@ <span class="k1">bool</span> <a href="http://www.allegro.cc/manual/al_set_sample_instance_playing"><span class="a">al_set_sample_instance_playing</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_SAMPLE_INSTANCE"><span class="a">ALLEGRO_SAMPLE_INSTANCE</span></a> <span class="k3">*</span>spl, <span class="k1">bool</span> val<span class="k2">)</span>
<span class="number">  6</span> <span class="k2">{</span>
<span class="number">  7</span>    <a href="http://www.allegro.cc/manual/ASSERT"><span class="a">ASSERT</span></a><span class="k2">(</span>spl<span class="k2">)</span><span class="k2">;</span>
<span class="number">  8</span> 
<span class="number">  9</span><span class="k3">-</span>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>spl-&gt;parent.u.ptr<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 10</span><span class="k3">-</span>      _al_set_error<span class="k2">(</span>ALLEGRO_INVALID_OBJECT, <span class="s">"Sample has no parent"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span><span class="k3">-</span>      <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 12</span><span class="k3">-</span>   <span class="k2">}</span>
<span class="number"> 13</span><span class="k3">-</span>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>spl-&gt;spl_data.buffer.ptr<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 14</span><span class="k3">-</span>      _al_set_error<span class="k2">(</span>ALLEGRO_INVALID_OBJECT, <span class="s">"Sample has no data"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span><span class="k3">-</span>      <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 16</span><span class="k3">+</span>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>spl-&gt;parent.u.ptr <span class="k3">|</span><span class="k3">|</span> <span class="k3">!</span>spl-&gt;spl_data.buffer.ptr<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 17</span><span class="k3">+</span>      spl-&gt;is_playing <span class="k3">=</span> val<span class="k2">;</span>
<span class="number"> 18</span><span class="k3">+</span>      <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 19</span>    <span class="k2">}</span>
<span class="number"> 20</span> 
<span class="number"> 21</span>    <span class="k1">if</span> <span class="k2">(</span>spl-&gt;parent.is_voice<span class="k2">)</span> <span class="k2">{</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Wang)</author>
		<pubDate>Mon, 09 Dec 2013 14:23:51 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yes, that makes sense. It causes the following code to fail at line 3 (and if line 3 is commented out, then it fails at line 4):</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><a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_get_sample_instance_attached"><span class="a">al_get_sample_instance_attached</span></a><span class="k2">(</span>pSampleInstance<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 2</span>result <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_set_sample_instance_playing"><span class="a">al_set_sample_instance_playing</span></a><span class="k2">(</span>pSampleInstance, <span class="k1">true</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 3</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span><span class="k3">!</span>result<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 4</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_get_sample_instance_playing"><span class="a">al_get_sample_instance_playing</span></a><span class="k2">(</span>pSampleInstance<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
</div></div><p>

After experimenting with it for several hours now, I think that actually, the functions in the audio add-on are intended to change as little state per individual function as possible -- am I right? That would mean that user code should actually be written as:</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="k1">bool</span> play <span class="k3">=</span> <span class="k2">(</span><span class="c">/* Some value either true or false. */</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 2</span>result <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_set_sample_instance_playing"><span class="a">al_set_sample_instance_playing</span></a><span class="k2">(</span>pSampleInstance, play<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 3</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>result<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 4</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_sample_instance_playing"><span class="a">al_get_sample_instance_playing</span></a><span class="k2">(</span>pSampleInstance<span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> play<span class="k2">)</span><span class="k2">;</span>
</div></div><p>

... In order to be correct. And it should be expected to succeed in every case except where the sample instance is attached to a voice (and attaching a sample directly to a voice is not recommended anyway, according to the documentation). That would also mean that setting the <tt>&#39;playing&#39;</tt> state to <tt>false</tt> in <tt>_al_kcm_detach_from_parent()</tt> (as I originally proposed) is incorrect.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Bluebird)</author>
		<pubDate>Tue, 10 Dec 2013 02:54: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/613614/993807#target">Bluebird</a> said:</div><div class="quote"><p>I think that actually, the functions in the audio add-on are intended to change as little state per individual function as possible -- am I right?</p></div></div><p>
That&#39;s right.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Wang)</author>
		<pubDate>Tue, 10 Dec 2013 14:02:28 +0000</pubDate>
	</item>
</rss>
