<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Audio drift in Allegro 5.1.8</title>
		<link>http://www.allegro.cc/forums/view/613969</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sat, 01 Mar 2014 21:28:52 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve recently run into a problem with audio playback in Allegro 5.1.8: audio stream playback lags behind the clock by a factor of about 0.0000205.  That might not sound like a lot, but it&#39;s significant in my case as I am working on a rhythm game.  After ten minutes the audio and clock are out of sync by about 12 milliseconds, more than enough to make the rhythm element unusable.</p><p>This lag doesn&#39;t appear to depend on the stream I&#39;m playing, its sample rate, the buffer size or count (as long as they&#39;re adequate to prevent buffer underflow), or the file format.</p><p>I have only tested this on Mac OS 10.9 so far, but at the bottom of this post I have included a test case I wrote.  The &quot;total drift&quot; and &quot;drift per second&quot; displays will start out rather chaotic, but over time the total drift will gradually creep up and the drift per second will eventually converge to somewhere around 0.00002.  I&#39;d like to ask the following of other developers:</p><p>- Would you please run this test case yourself on other platforms and see if you get similar results?  The longer it runs, the more accurate the drift per second figure will be.  The white flash and the cymbal crash in the test loop become visibly out of sync after a half hour or so as well.</p><p>- Do you have any idea what the cause of this problem might be or, better yet, how to fix it?</p><p>The audio stream I used for the test case is attached to this post, but feel free to try other files.  The font DejaVuSans.ttf can be found <a href="http://www.fontsquirrel.com/fonts/DejaVu-Sans">here</a>.</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">//////////////////////////////////////////////////////////////////////</span>
<span class="number">   2</span><span class="c">//  Test case for audio drift in allegro 5.1.8.  By Donald Goldin.  //</span>
<span class="number">   3</span><span class="c">//////////////////////////////////////////////////////////////////////</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="p">#include &lt;allegro5/allegro_font.h&gt;</span>
<span class="number">   9</span><span class="p">#include &lt;allegro5/allegro_ttf.h&gt;</span>
<span class="number">  10</span><span class="p">#include &lt;math.h&gt;</span>
<span class="number">  11</span>
<span class="number">  12</span><span class="c">// The results of this test case are similar whether or not USE_PLAYED_SAMPLES is</span>
<span class="number">  13</span><span class="c">// defined, but getStreamTime is much more precise with USE_PLAYED_SAMPLES and</span>
<span class="number">  14</span><span class="c">// thus the drift per second measurement will converge more quickly</span>
<span class="number">  15</span>
<span class="number">  16</span><span class="p">#define USE_PLAYED_SAMPLES</span>
<span class="number">  17</span>
<span class="number">  18</span><span class="k1">double</span> getStreamTime<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_AUDIO_STREAM"><span class="a">ALLEGRO_AUDIO_STREAM</span></a> <span class="k3">*</span> stream<span class="k2">)</span>
<span class="number">  19</span><span class="k2">{</span>
<span class="number">  20</span><span class="p">#ifdef USE_PLAYED_SAMPLES</span>
<span class="number">  21</span>  <span class="k1">uint64_t</span> samples <span class="k3">=</span> al_get_audio_stream_played_samples<span class="k2">(</span>stream<span class="k2">)</span><span class="k2">;</span>
<span class="number">  22</span>  <span class="k1">double</span> syncTime <span class="k3">=</span> samples <span class="k3">/</span> <span class="k2">(</span><span class="k2">(</span><span class="k1">double</span><span class="k2">)</span><a href="http://www.allegro.cc/manual/al_get_audio_stream_frequency"><span class="a">al_get_audio_stream_frequency</span></a><span class="k2">(</span>stream<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  23</span>  <span class="k1">return</span> syncTime<span class="k2">;</span>
<span class="number">  24</span><span class="p">#else</span>
<span class="number">  25</span>  <span class="k1">return</span> <a href="http://www.allegro.cc/manual/al_get_audio_stream_position_secs"><span class="a">al_get_audio_stream_position_secs</span></a><span class="k2">(</span>stream<span class="k2">)</span><span class="k2">;</span>
<span class="number">  26</span><span class="p">#endif</span>
<span class="number">  27</span><span class="k2">}</span>
<span class="number">  28</span>
<span class="number">  29</span><span class="k1">double</span> arrayAverage<span class="k2">(</span><span class="k1">double</span> <span class="k3">*</span> array, <span class="k1">size_t</span> arraySize<span class="k2">)</span>
<span class="number">  30</span><span class="k2">{</span>
<span class="number">  31</span>  <span class="k1">if</span> <span class="k2">(</span>arraySize <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span>
<span class="number">  32</span>  <span class="k2">{</span>
<span class="number">  33</span>    <span class="k1">return</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">;</span>
<span class="number">  34</span>  <span class="k2">}</span>
<span class="number">  35</span>  <span class="k1">else</span>
<span class="number">  36</span>  <span class="k2">{</span>
<span class="number">  37</span>    <span class="k1">double</span> total <span class="k3">=</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">;</span>
<span class="number">  38</span>    <span class="k1">for</span> <span class="k2">(</span><span class="k1">size_t</span> i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> i <span class="k3">&lt;</span> arraySize<span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number">  39</span>    <span class="k2">{</span>
<span class="number">  40</span>      total <span class="k3">+</span><span class="k3">=</span> array<span class="k2">[</span>i<span class="k2">]</span><span class="k2">;</span>
<span class="number">  41</span>    <span class="k2">}</span>
<span class="number">  42</span>    <span class="k1">return</span> total <span class="k3">/</span> arraySize<span class="k2">;</span>
<span class="number">  43</span>  <span class="k2">}</span>
<span class="number">  44</span><span class="k2">}</span>
<span class="number">  45</span>
<span class="number">  46</span><span class="k1">int</span> main <span class="k2">(</span><span class="k1">int</span>, <span class="k1">char</span><span class="k3">*</span><span class="k3">*</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  47</span>
<span class="number">  48</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><span class="k3">*</span> argv<span class="k2">)</span>
<span class="number">  49</span><span class="k2">{</span>
<span class="number">  50</span>  <span class="c">// initialization</span>
<span class="number">  51</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">  52</span>  <span class="k2">{</span>
<span class="number">  53</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"al_init failed!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  54</span>    <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span>
<span class="number">  55</span>  <span class="k2">}</span>
<span class="number">  56</span>  
<span class="number">  57</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">  58</span>  <span class="k2">{</span>
<span class="number">  59</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"error: couldn't install audio\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  60</span>    <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span>
<span class="number">  61</span>  <span class="k2">}</span>
<span class="number">  62</span>  
<span class="number">  63</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">  64</span>  <span class="k2">{</span>
<span class="number">  65</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"error: couldn't init acodec addon\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  66</span>    <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span>
<span class="number">  67</span>  <span class="k2">}</span>
<span class="number">  68</span>  
<span class="number">  69</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</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">  70</span>  <span class="k2">{</span>
<span class="number">  71</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"error: couldn't reserve samples\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  72</span>    <span class="k1">return</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="number">  75</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_install_keyboard"><span class="a">al_install_keyboard</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span>
<span class="number">  76</span>  <span class="k2">{</span>
<span class="number">  77</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"error: couldn't install keyboard\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  78</span>    <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span>
<span class="number">  79</span>  <span class="k2">}</span>
<span class="number">  80</span>  
<span class="number">  81</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_init_font_addon"><span class="a">al_init_font_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span>
<span class="number">  82</span>  <span class="k2">{</span>
<span class="number">  83</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"error: couldn't init font addon\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  84</span>    <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span>
<span class="number">  85</span>  <span class="k2">}</span>
<span class="number">  86</span>  
<span class="number">  87</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_init_ttf_addon"><span class="a">al_init_ttf_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span>
<span class="number">  88</span>  <span class="k2">{</span>
<span class="number">  89</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"error: couldn't init ttf addon\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  90</span>    <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span>
<span class="number">  91</span>  <span class="k2">}</span>
<span class="number">  92</span>  
<span class="number">  93</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_FONT"><span class="a">ALLEGRO_FONT</span></a> <span class="k3">*</span> <a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a> <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_load_ttf_font"><span class="a">al_load_ttf_font</span></a><span class="k2">(</span><span class="s">"DejaVuSans.ttf"</span>, <span class="n">10</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  94</span>  
<span class="number">  95</span>  <a href="http://www.allegro.cc/manual/al_set_new_display_option"><span class="a">al_set_new_display_option</span></a><span class="k2">(</span>ALLEGRO_VSYNC, <span class="n">1</span>, ALLEGRO_SUGGEST<span class="k2">)</span><span class="k2">;</span>
<span class="number">  96</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a> <span class="k3">*</span> display <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">  97</span>  <span class="k1">if</span> <span class="k2">(</span>display <span class="k3">=</span><span class="k3">=</span> NULL<span class="k2">)</span>
<span class="number">  98</span>  <span class="k2">{</span>
<span class="number">  99</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"error: could not create display\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 100</span>  <span class="k2">}</span>
<span class="number"> 101</span>  
<span class="number"> 102</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_MIXER"><span class="a">ALLEGRO_MIXER</span></a> <span class="k3">*</span> mixer <span class="k3">=</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="number"> 103</span>  
<span class="number"> 104</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>mixer<span class="k2">)</span>
<span class="number"> 105</span>  <span class="k2">{</span>
<span class="number"> 106</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"error: couldn't get default mixer\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 107</span>    <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 108</span>  <span class="k2">}</span>
<span class="number"> 109</span>  
<span class="number"> 110</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_AUDIO_STREAM"><span class="a">ALLEGRO_AUDIO_STREAM</span></a> <span class="k3">*</span> stream <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_load_audio_stream"><span class="a">al_load_audio_stream</span></a><span class="k2">(</span><span class="s">"TestStream.ogg"</span>, <span class="n">4</span>, <span class="n">1024</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 111</span>  
<span class="number"> 112</span>  <span class="k1">const</span> <span class="k1">double</span> k_loopLength <span class="k3">=</span> <span class="n">8</span>.<span class="n">0</span><span class="k2">;</span>
<span class="number"> 113</span>  
<span class="number"> 114</span>  <span class="k1">if</span> <span class="k2">(</span>stream <span class="k3">=</span><span class="k3">=</span> NULL<span class="k2">)</span>
<span class="number"> 115</span>  <span class="k2">{</span>
<span class="number"> 116</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"error: failed to load stream\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 117</span>    <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 118</span>  <span class="k2">}</span>
<span class="number"> 119</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, mixer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 120</span>  <a href="http://www.allegro.cc/manual/al_set_audio_stream_gain"><span class="a">al_set_audio_stream_gain</span></a><span class="k2">(</span>stream, <span class="n">1</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 121</span>  <a href="http://www.allegro.cc/manual/al_set_audio_stream_playmode"><span class="a">al_set_audio_stream_playmode</span></a><span class="k2">(</span>stream, ALLEGRO_PLAYMODE_LOOP<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 122</span>  <a href="http://www.allegro.cc/manual/al_set_audio_stream_loop_secs"><span class="a">al_set_audio_stream_loop_secs</span></a><span class="k2">(</span>stream, <span class="n">0</span>.<span class="n">0</span>, k_loopLength<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 123</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="k1">true</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 124</span>  
<span class="number"> 125</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="n">0</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// give the stream a couple seconds to buffer</span>
<span class="number"> 126</span>  
<span class="number"> 127</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_get_audio_stream_playing"><span class="a">al_get_audio_stream_playing</span></a><span class="k2">(</span>stream<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 128</span>  <span class="k2">{</span>
<span class="number"> 129</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"error: stream isn't playing\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 130</span>    <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 131</span>  <span class="k2">}</span>
<span class="number"> 132</span>  
<span class="number"> 133</span>  <span class="k1">double</span> startTime <span class="k3">=</span> <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 class="k2">;</span>
<span class="number"> 134</span>  <span class="k1">double</span> initialOffset <span class="k3">=</span> getStreamTime<span class="k2">(</span>stream<span class="k2">)</span> <span class="k3">-</span> startTime<span class="k2">;</span>
<span class="number"> 135</span>  
<span class="number"> 136</span>  <span class="k1">bool</span> shouldExit <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 137</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_KEYBOARD_STATE"><span class="a">ALLEGRO_KEYBOARD_STATE</span></a> kbState<span class="k2">;</span>
<span class="number"> 138</span>  
<span class="number"> 139</span>  <span class="k1">char</span> buf<span class="k2">[</span><span class="n">128</span><span class="k2">]</span><span class="k2">;</span>
<span class="number"> 140</span>  
<span class="number"> 141</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_QUEUE"><span class="a">ALLEGRO_EVENT_QUEUE</span></a> <span class="k3">*</span> queue <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"> 142</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_TIMER"><span class="a">ALLEGRO_TIMER</span></a> <span class="k3">*</span> timer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_timer"><span class="a">al_create_timer</span></a><span class="k2">(</span><span class="n">1</span>.<span class="n">0</span> <span class="k3">/</span> <span class="n">60</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 143</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, <a href="http://www.allegro.cc/manual/al_get_timer_event_source"><span class="a">al_get_timer_event_source</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 144</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, <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>display<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 145</span>  <a href="http://www.allegro.cc/manual/al_start_timer"><span class="a">al_start_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 146</span>  
<span class="number"> 147</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"> 148</span>  
<span class="number"> 149</span>  <span class="k1">const</span> <span class="k1">size_t</span> k_historySize <span class="k3">=</span> <span class="n">60</span><span class="k2">;</span>
<span class="number"> 150</span>  <span class="k1">double</span> driftHistory<span class="k2">[</span>k_historySize<span class="k2">]</span><span class="k2">;</span>
<span class="number"> 151</span>  <span class="k1">for</span> <span class="k2">(</span><span class="k1">size_t</span> i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> i <span class="k3">&lt;</span> k_historySize<span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 152</span>  <span class="k2">{</span>
<span class="number"> 153</span>    driftHistory<span class="k2">[</span>i<span class="k2">]</span> <span class="k3">=</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">;</span>
<span class="number"> 154</span>  <span class="k2">}</span>
<span class="number"> 155</span>  <span class="k1">size_t</span> historyPos <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 156</span>  
<span class="number"> 157</span>  <span class="c">// main update loop</span>
<span class="number"> 158</span>  <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span>shouldExit<span class="k2">)</span>
<span class="number"> 159</span>  <span class="k2">{</span>
<span class="number"> 160</span>    <span class="k1">bool</span> needsUpdate <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 161</span>    
<span class="number"> 162</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, <span class="k3">&amp;</span>event<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 163</span>    
<span class="number"> 164</span>    <span class="k1">switch</span> <span class="k2">(</span>event.type<span class="k2">)</span>
<span class="number"> 165</span>    <span class="k2">{</span>
<span class="number"> 166</span>      <span class="k1">case</span> ALLEGRO_EVENT_DISPLAY_CLOSE:
<span class="number"> 167</span>        <span class="k1">if</span> <span class="k2">(</span>event.display.source <span class="k3">=</span><span class="k3">=</span> display<span class="k2">)</span>
<span class="number"> 168</span>        <span class="k2">{</span>
<span class="number"> 169</span>          shouldExit <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 170</span>        <span class="k2">}</span>
<span class="number"> 171</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 172</span>      <span class="k1">case</span> ALLEGRO_EVENT_TIMER:
<span class="number"> 173</span>        <span class="k1">if</span> <span class="k2">(</span>event.timer.source <span class="k3">=</span><span class="k3">=</span> timer<span class="k2">)</span>
<span class="number"> 174</span>        <span class="k2">{</span>
<span class="number"> 175</span>          needsUpdate <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 176</span>        <span class="k2">}</span>
<span class="number"> 177</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 178</span>      default:
<span class="number"> 179</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 180</span>    <span class="k2">}</span>
<span class="number"> 181</span>    
<span class="number"> 182</span>    <span class="k1">if</span> <span class="k2">(</span>needsUpdate<span class="k2">)</span>
<span class="number"> 183</span>    <span class="k2">{</span>
<span class="number"> 184</span>      <a href="http://www.allegro.cc/manual/al_get_keyboard_state"><span class="a">al_get_keyboard_state</span></a><span class="k2">(</span><span class="k3">&amp;</span>kbState<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 185</span>      <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span><span class="k3">&amp;</span>kbState, ALLEGRO_KEY_Q<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 186</span>      <span class="k2">{</span>
<span class="number"> 187</span>        shouldExit <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 188</span>      <span class="k2">}</span>
<span class="number"> 189</span>      
<span class="number"> 190</span>      <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span><span class="k3">&amp;</span>kbState, ALLEGRO_KEY_R<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 191</span>      <span class="k2">{</span>
<span class="number"> 192</span>        startTime <span class="k3">=</span> <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 class="k2">;</span>
<span class="number"> 193</span>        initialOffset <span class="k3">=</span> getStreamTime<span class="k2">(</span>stream<span class="k2">)</span> <span class="k3">-</span> startTime<span class="k2">;</span>
<span class="number"> 194</span>      <span class="k2">}</span>
<span class="number"> 195</span>      
<span class="number"> 196</span>      <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span><span class="k3">&amp;</span>kbState, ALLEGRO_KEY_M<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 197</span>      <span class="k2">{</span>
<span class="number"> 198</span>        <a href="http://www.allegro.cc/manual/al_set_audio_stream_gain"><span class="a">al_set_audio_stream_gain</span></a><span class="k2">(</span>stream, <span class="n">0</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 199</span>      <span class="k2">}</span>
<span class="number"> 200</span>      
<span class="number"> 201</span>      <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/al_key_down"><span class="a">al_key_down</span></a><span class="k2">(</span><span class="k3">&amp;</span>kbState, ALLEGRO_KEY_N<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 202</span>      <span class="k2">{</span>
<span class="number"> 203</span>        <a href="http://www.allegro.cc/manual/al_set_audio_stream_gain"><span class="a">al_set_audio_stream_gain</span></a><span class="k2">(</span>stream, <span class="n">1</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 204</span>      <span class="k2">}</span>
<span class="number"> 205</span>
<span class="number"> 206</span>      <span class="k1">double</span> clockTime <span class="k3">=</span> <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 class="k2">;</span>
<span class="number"> 207</span>      <span class="k1">double</span> streamTime <span class="k3">=</span> getStreamTime<span class="k2">(</span>stream<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 208</span>      
<span class="number"> 209</span><span class="p">#ifdef USE_PLAYED_SAMPLES</span>
<span class="number"> 210</span>      <span class="k1">double</span> clockTimeLooped <span class="k3">=</span> initialOffset <span class="k3">+</span> clockTime<span class="k2">;</span>
<span class="number"> 211</span><span class="p">#else</span>
<span class="number"> 212</span>      <span class="k1">double</span> clockTimeLooped <span class="k3">=</span> initialOffset <span class="k3">+</span> clockTime <span class="k3">-</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_330.html" target="_blank">floor</a><span class="k2">(</span><span class="k2">(</span>initialOffset <span class="k3">+</span> clockTime<span class="k2">)</span> <span class="k3">/</span> k_loopLength<span class="k2">)</span> <span class="k3">*</span> k_loopLength<span class="k2">;</span>
<span class="number"> 213</span><span class="p">#endif</span>
<span class="number"> 214</span>      
<span class="number"> 215</span>      driftHistory<span class="k2">[</span>historyPos<span class="k2">]</span> <span class="k3">=</span> clockTimeLooped <span class="k3">-</span> streamTime<span class="k2">;</span>
<span class="number"> 216</span>      historyPos<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>
<span class="number"> 217</span>      <span class="k1">if</span> <span class="k2">(</span>historyPos <span class="k3">=</span><span class="k3">=</span> k_historySize<span class="k2">)</span>
<span class="number"> 218</span>      <span class="k2">{</span>
<span class="number"> 219</span>        historyPos <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 220</span>      <span class="k2">}</span>
<span class="number"> 221</span>      
<span class="number"> 222</span>      <span class="k1">double</span> totalDrift <span class="k3">=</span> arrayAverage<span class="k2">(</span>driftHistory, k_historySize<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 223</span>      <span class="k1">double</span> driftPerSecond <span class="k3">=</span> totalDrift <span class="k3">/</span> <span class="k2">(</span>clockTime <span class="k3">-</span> startTime<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 224</span>      
<span class="number"> 225</span><span class="p">#ifdef USE_PLAYED_SAMPLES</span>
<span class="number"> 226</span>      <span class="k1">if</span> <span class="k2">(</span>clockTimeLooped <span class="k3">-</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_330.html" target="_blank">floor</a><span class="k2">(</span>clockTimeLooped <span class="k3">/</span> k_loopLength<span class="k2">)</span> <span class="k3">*</span> k_loopLength <span class="k3">&lt;</span> <span class="n">0</span>.<span class="n">125</span><span class="k2">)</span>
<span class="number"> 227</span><span class="p">#else</span>
<span class="number"> 228</span>      <span class="k1">if</span> <span class="k2">(</span>clockTimeLooped <span class="k3">&lt;</span> <span class="n">0</span>.<span class="n">125</span><span class="k2">)</span>
<span class="number"> 229</span><span class="p">#endif</span>
<span class="number"> 230</span>      <span class="k2">{</span>
<span class="number"> 231</span>        <a href="http://www.allegro.cc/manual/al_clear_to_color"><span class="a">al_clear_to_color</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_map_rgb_f"><span class="a">al_map_rgb_f</span></a><span class="k2">(</span><span class="n">1</span>.f, <span class="n">1</span>.f, <span class="n">1</span>.f<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 232</span>      <span class="k2">}</span>
<span class="number"> 233</span>      <span class="k1">else</span>
<span class="number"> 234</span>      <span class="k2">{</span>
<span class="number"> 235</span>        <a href="http://www.allegro.cc/manual/al_clear_to_color"><span class="a">al_clear_to_color</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_map_rgb_f"><span class="a">al_map_rgb_f</span></a><span class="k2">(</span><span class="n">0</span>.f, <span class="n">0</span>.f, <span class="n">0</span>.f<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 236</span>      <span class="k2">}</span>
<span class="number"> 237</span>          
<span class="number"> 238</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_732.html" target="_blank">snprintf</a><span class="k2">(</span>buf, <span class="n">128</span>, <span class="s">"time elapsed: %f"</span>, clockTime <span class="k3">-</span> startTime<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 239</span>      <a href="http://www.allegro.cc/manual/al_draw_text"><span class="a">al_draw_text</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a>, <a href="http://www.allegro.cc/manual/al_map_rgb_f"><span class="a">al_map_rgb_f</span></a><span class="k2">(</span><span class="n">0</span>.f, <span class="n">0</span>.<span class="n">5f</span>, <span class="n">0</span>.f<span class="k2">)</span>, <span class="n">24</span>, <span class="n">8</span>, <span class="n">0</span>, buf<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 240</span>      
<span class="number"> 241</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_732.html" target="_blank">snprintf</a><span class="k2">(</span>buf, <span class="n">128</span>, <span class="s">"playback time according to clock: %f"</span>, clockTimeLooped<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 242</span>      <a href="http://www.allegro.cc/manual/al_draw_text"><span class="a">al_draw_text</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a>, <a href="http://www.allegro.cc/manual/al_map_rgb_f"><span class="a">al_map_rgb_f</span></a><span class="k2">(</span><span class="n">0</span>.f, <span class="n">0</span>.<span class="n">5f</span>, <span class="n">0</span>.f<span class="k2">)</span>, <span class="n">24</span>, <span class="n">24</span>, <span class="n">0</span>, buf<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 243</span>      
<span class="number"> 244</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_732.html" target="_blank">snprintf</a><span class="k2">(</span>buf, <span class="n">128</span>, <span class="s">"playback time according to stream: %f"</span>, streamTime<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 245</span>      <a href="http://www.allegro.cc/manual/al_draw_text"><span class="a">al_draw_text</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a>, <a href="http://www.allegro.cc/manual/al_map_rgb_f"><span class="a">al_map_rgb_f</span></a><span class="k2">(</span><span class="n">0</span>.f, <span class="n">0</span>.<span class="n">5f</span>, <span class="n">0</span>.f<span class="k2">)</span>, <span class="n">24</span>, <span class="n">40</span>, <span class="n">0</span>, buf<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 246</span>      
<span class="number"> 247</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_732.html" target="_blank">snprintf</a><span class="k2">(</span>buf, <span class="n">128</span>, <span class="s">"total drift: %f"</span>, totalDrift<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 248</span>      <a href="http://www.allegro.cc/manual/al_draw_text"><span class="a">al_draw_text</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a>, <a href="http://www.allegro.cc/manual/al_map_rgb_f"><span class="a">al_map_rgb_f</span></a><span class="k2">(</span><span class="n">0</span>.f, <span class="n">0</span>.<span class="n">5f</span>, <span class="n">0</span>.f<span class="k2">)</span>, <span class="n">24</span>, <span class="n">56</span>, <span class="n">0</span>, buf<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 249</span>      
<span class="number"> 250</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_732.html" target="_blank">snprintf</a><span class="k2">(</span>buf, <span class="n">128</span>, <span class="s">"drift per second: %.9f"</span>, driftPerSecond<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 251</span>      <a href="http://www.allegro.cc/manual/al_draw_text"><span class="a">al_draw_text</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a>, <a href="http://www.allegro.cc/manual/al_map_rgb_f"><span class="a">al_map_rgb_f</span></a><span class="k2">(</span><span class="n">0</span>.f, <span class="n">0</span>.<span class="n">5f</span>, <span class="n">0</span>.f<span class="k2">)</span>, <span class="n">24</span>, <span class="n">72</span>, <span class="n">0</span>, buf<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 252</span>      
<span class="number"> 253</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_732.html" target="_blank">snprintf</a><span class="k2">(</span>buf, <span class="n">128</span>, <span class="s">"press 'm' to mute, 'n' to unmute, 'r' to reset time elapsed, or 'q' to quit"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 254</span>      <a href="http://www.allegro.cc/manual/al_draw_text"><span class="a">al_draw_text</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a>, <a href="http://www.allegro.cc/manual/al_map_rgb_f"><span class="a">al_map_rgb_f</span></a><span class="k2">(</span><span class="n">0</span>.f, <span class="n">0</span>.<span class="n">5f</span>, <span class="n">0</span>.f<span class="k2">)</span>, <span class="n">24</span>, <span class="n">104</span>, <span class="n">0</span>, buf<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 255</span>          
<span class="number"> 256</span>      <a href="http://www.allegro.cc/manual/al_flip_display"><span class="a">al_flip_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 257</span>    <span class="k2">}</span>
<span class="number"> 258</span>  <span class="k2">}</span>
<span class="number"> 259</span>  
<span class="number"> 260</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"> 261</span>  <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 262</span>  
<span class="number"> 263</span>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 264</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (aureus)</author>
		<pubDate>Sat, 01 Mar 2014 05:39:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>In my rhythm game, PK Rhythm, I just control the time spent by using <span class="source-code"><a href="http://www.allegro.cc/manual/al_get_audio_stream_position_secs"><span class="a">al_get_audio_stream_position_secs</span></a></span>. This has a slight delay between the actual position time and real time, but it doesn&#39;t delay each time more with time. I made a thread about the delay <a href="https://www.allegro.cc/forums/thread/611580">here</a>.</p><p>Also, you should look into how <span class="source-code"><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a></span> works with keyboard input; using keyboard states isn&#39;t really the best way to approach input when you&#39;re using events.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (André Silva)</author>
		<pubDate>Sat, 01 Mar 2014 21:24:30 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Couldn&#39;t reproduce this on Linux... and André Silva&#39;s point makes me think that this might be related to Windows input lag issues. I&#39;ll try this on Windows later today before and after the patch I made to the input system (the lag is present in 5.1.8 but not in git 5.1 branch):</p><p><span class="remote-thumbnail"><span class="json">{"name":"608334","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/0\/8\/0800cb49ed93bfc2291786a0e1fe7520.png","w":640,"h":480,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/0\/8\/0800cb49ed93bfc2291786a0e1fe7520"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/0/8/0800cb49ed93bfc2291786a0e1fe7520-240.jpg" alt="608334" width="240" height="180" /></span></p><p>(note that I changed the font to <span class="source-code">al_get_builtin_font<span class="k2">(</span><span class="k2">)</span></span> but that shouldn&#39;t affect things)</p><p>EDIT: Oh wait, you said MacOSX... that&#39;ll be a pain to debug as I don&#39;t have any easy way to get to an OSX system <img src="http://www.allegro.cc/forums/smileys/undecided.gif" alt=":-/" />.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (SiegeLord)</author>
		<pubDate>Sat, 01 Mar 2014 21:28:52 +0000</pubDate>
	</item>
</rss>
