<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Audio Stream: Seeking doesn&#39;t work</title>
		<link>http://www.allegro.cc/forums/view/618111</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Tue, 05 May 2020 11:35:19 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hello,<br />I have started to work on a &quot;smart&quot; music system. I just have different versions of a song, and every time, the player level increases, the corresponding version of a song gets to play. All versions are stored in one audio file and thus in one stream, I only readjust the position and the looping points. To avoid straight cuts but also not having to wait through the entire length of the song to change it, the game knows the position of the sections in the song, and then waits for the current section to end and then jumps to the next section, but this time of course in the new version of the song. </p><p>But the simple call to al_seek_audio_stream_secs() fails. I have tried stopping the song before the call, or disabling the looping of the song, but with no luck. Does anyone know why the function could return false? Changing the looping points works without a problem.</p><p>The basic structure of my code:<br />I have an Audio Manager that recieves a Message from the Gameplay section, when a level-up occurs. This AudioManager has an object containing the ALLEGRO_STREAM of the currently playing track. With this it computes the amount of seconds to wait until the current section ends and where to jump to, and then starts an ALLEGRO_THREAD that waits and then calls the stream functions mentioned above. The thread doesn&#39;t seem to be a problem, the seeking fails even without it (the rest of my code is single threaded).</p><p>Thanks in advance!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (schollexpos)</author>
		<pubDate>Sun, 03 May 2020 21:33:09 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hello schollexpos <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /></p><p>Can you produce a simple code example that demonstrates this? Does seeking not work with any audio stream?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sun, 03 May 2020 22:32:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hello Edgar, thanks for your quick reply!<br />Here, is a condensed example:
</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">int</span> main<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  2</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">  3</span>
<span class="number">  4</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">  5</span>
<span class="number">  6</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">  7</span>
<span class="number">  8</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> nullptr<span class="k2">;</span>
<span class="number">  9</span>  <span class="k1">int</span> requiredFlags <span class="k3">=</span> ALLEGRO_OPENGL <span class="k3">|</span> ALLEGRO_PROGRAMMABLE_PIPELINE<span class="k2">;</span>
<span class="number"> 10</span>  <a href="http://www.allegro.cc/manual/al_set_new_display_flags"><span class="a">al_set_new_display_flags</span></a><span class="k2">(</span>requiredFlags<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span>
<span class="number"> 12</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">1280</span>, <span class="n">720</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 13</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"> 14</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_keyboard_event_source"><span class="a">al_get_keyboard_event_source</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>
<span class="number"> 16</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="k2">{</span>
<span class="number"> 17</span>    std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"[ERR.] Failed to load the Audio System!"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 18</span>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 19</span>  <span class="k2">}</span> <span class="k1">else</span> <span class="k2">{</span>
<span class="number"> 20</span>    std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Loaded the Audio System!"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 21</span>  <span class="k2">}</span>
<span class="number"> 22</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"> 23</span>
<span class="number"> 24</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> <a href="http://www.allegro.cc/manual/al_create_voice"><span class="a">al_create_voice</span></a><span class="k2">(</span><span class="n">44100</span>, ALLEGRO_AUDIO_DEPTH_INT16, ALLEGRO_CHANNEL_CONF_2<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 25</span>
<span class="number"> 26</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>voice<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 27</span>    std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"Failed to create Voice!"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 28</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_298.html" target="_blank">exit</a><span class="k2">(</span><span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 29</span>  <span class="k2">}</span>
<span class="number"> 30</span>
<span class="number"> 31</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_MIXER"><span class="a">ALLEGRO_MIXER</span></a> <span class="k3">*</span>mix_final <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><span class="n">44100</span>, ALLEGRO_AUDIO_DEPTH_INT16, ALLEGRO_CHANNEL_CONF_2<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 32</span>
<span class="number"> 33</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"> 34</span>
<span class="number"> 35</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>mix_final, voice<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 36</span>
<span class="number"> 37</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">"res/theme.ogg"</span>, <span class="n">4</span>, <span class="n">2048</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 38</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, mix_final<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 39</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"> 40</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">47</span>.<span class="n">2</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 41</span>
<span class="number"> 42</span>  <span class="k1">bool</span> running <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 43</span>  <span class="k1">while</span><span class="k2">(</span>running<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 44</span>    <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> ev<span class="k2">;</span>
<span class="number"> 45</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>ev<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 46</span>    <span class="k1">do</span> <span class="k2">{</span>
<span class="number"> 47</span>      <span class="k1">switch</span><span class="k2">(</span>ev.type<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 48</span>        <span class="k1">case</span> ALLEGRO_EVENT_DISPLAY_CLOSE:
<span class="number"> 49</span>          running <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 50</span>          <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 51</span>        <span class="k1">case</span> ALLEGRO_EVENT_KEY_DOWN:
<span class="number"> 52</span>          <span class="k1">if</span><span class="k2">(</span>ev.keyboard.keycode <span class="k3">=</span><span class="k3">=</span> ALLEGRO_KEY_N<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 53</span>            std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"We should get something here"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 54</span>            <a href="http://www.allegro.cc/manual/al_seek_audio_stream_secs"><span class="a">al_seek_audio_stream_secs</span></a><span class="k2">(</span>stream, <span class="n">60</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 55</span>          <span class="k2">}</span>
<span class="number"> 56</span>      <span class="k2">}</span>
<span class="number"> 57</span>    <span class="k2">}</span> <span class="k1">while</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_next_event"><span class="a">al_get_next_event</span></a><span class="k2">(</span>queue, <span class="k3">&amp;</span>ev<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>
<span class="number"> 60</span>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 61</span><span class="k2">}</span>
</div></div><p>

I&#39;m amazed that the problem is not some kind of side effect from somewhere else in my engine <img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" /> The console shows the output when pressing N, but the audio stream plays as if nothing had happened.</p><p>The audio file is over 5 minutes long, so I&#39;m not trying to go over it&#39;s length here. I&#39;m developing on Windows with Visual Studio 2017 and Allegro 5.2.5.2
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (schollexpos)</author>
		<pubDate>Sun, 03 May 2020 23:02:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Can you post the audio file as an attachment please? I will test this on my Win10 MinGW-W64 setup with Allegro 5.2.6.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sun, 03 May 2020 23:07:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The Music kind of gives away what I&#39;m working on <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (schollexpos)</author>
		<pubDate>Sun, 03 May 2020 23:13:00 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>What I&#39;m getting at is that the ogg container that holds the audio file has a stream adjuster. I don&#39;t know if they&#39;re common for all formats. Can you load the file in VLC and tell me what the audio codec in use is?</p><p><b>EDIT</b><br />Did you ever call <a href="http://docs.liballeg.org/audio.html#al_set_audio_stream_playing">al_set_audio_stream_playing(true) or false?</a>? I don&#39;t see that in the example.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Mon, 04 May 2020 01:59:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The codec is just plain Vorbis Audio, according to VLC. I&#39;ve exported the file from audacity, so I don&#39;t think there should be anything wrong about it(?)</p><p>No I haven&#39;t, I&#39;ve relied on al_load_audio_stream automatically starting the file. But now I&#39;ve tried to setting the stream to play manually, that didn&#39;t change anything. </p><p><b>Edit:</b><br />I&#39;ve tried to replace my music file with the menu music from the allegro skater demo, but al_seek_audio_stream_secs() still returns false
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (schollexpos)</author>
		<pubDate>Mon, 04 May 2020 02:22:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I had a very quick look at the Allegro code. It seems that you can only seek to within the loop you set in <span class="source-code"><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>. You set that to 0..47.2secs then tried to seek outside it. You could maybe try resetting the loop to whatever and then seeking.</p><p>Relevant part is here:<br /><a href="https://github.com/liballeg/allegro5/blob/50460b7fc48d6bafff2db309fe3cd5def80e3863/addons/acodec/ogg.c#L309-L319">https://github.com/liballeg/allegro5/blob/50460b7fc48d6bafff2db309fe3cd5def80e3863/addons/acodec/ogg.c#L309-L319</a>
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">static</span> <span class="k1">bool</span> ogg_stream_seek<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="k1">double</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a><span class="k2">)</span>
<span class="k2">{</span>
   AL_OV_DATA <span class="k3">*</span>extra <span class="k3">=</span> <span class="k2">(</span>AL_OV_DATA <span class="k3">*</span><span class="k2">)</span> stream-&gt;extra<span class="k2">;</span>
   <span class="k1">if</span> <span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a> <span class="k3">&gt;</span><span class="k3">=</span> extra-&gt;loop_end<span class="k2">)</span>
      <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
<span class="p">#ifndef TREMOR</span>
   <span class="k1">return</span> <span class="k2">(</span>lib.ov_time_seek_lap<span class="k2">(</span>extra-&gt;vf, <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="p">#else</span>
   <span class="k1">return</span> lib.ov_time_seek<span class="k2">(</span>extra-&gt;vf, <a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a><span class="k3">*</span><span class="n">1000</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="p">#endif</span>
<span class="k2">}</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Hull)</author>
		<pubDate>Mon, 04 May 2020 18:03:38 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Of course, that was it! I haven&#39;t even thought about that I should be changing the loop-points first and only seek after that. Thank you!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (schollexpos)</author>
		<pubDate>Mon, 04 May 2020 20:19:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Strangely it&#39;s OK to seek before the looped section (you can see in the code snippet there&#39;s no check against <span class="source-code">loop_start</span>) - in which case it plays through to the loop end and then starts to repeat. I don&#39;t know if that&#39;s a bug or useful behaviour, what do you think?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Hull)</author>
		<pubDate>Tue, 05 May 2020 11:35:19 +0000</pubDate>
	</item>
</rss>
