<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Sound recording (again)</title>
		<link>http://www.allegro.cc/forums/view/464312</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Fri, 25 Feb 2005 16:31:06 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve tried to use the Allegro sound recording routines and I&#39;ve come to the conclusion that that the DirectX ones don&#39;t do what the documentation says they do.</p><p>My original post was <a href="http://www.allegro.cc/forums/view_thread.php?_id=459212">http://www.allegro.cc/forums/view_thread.php?_id=459212</a></p><p>Then I wasn&#39;t sure if I was doing it right, but now I think it&#39;s a bug. Recording is one of the few parts of Allegro without an example. Does anyone have an example program for recording which has worked for them?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Eric Love)</author>
		<pubDate>Thu, 24 Feb 2005 17:35:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I can&#39;t test the code myself, but I just looked at the source in src/win/wdsinput.c. It seems to have some frequencies hardcoded, maybe try checking if the frequency is valid, or try with one of the frequencies in there..</p><p>[edit]<br />And I wouldn&#39;t be surprised if it is actually broken. But then I doubt any of the current main developers will be able to fix it - so someone who knows about DSound will have to find the bug in the mentioned source file.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Thu, 24 Feb 2005 18:57:29 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I just wrote a working example. It&#39;s not good enough to be an official example, but it should get the idea across.</p><p>You should call read_sound_input only when needed. To do this, check the size of the input buffer and calculate how many milliseconds will be needed to fill it. While testing it, I got a buffer large enough to hold one second of data.<br />The code below uses 9/10th of that interval to determine when to call it.</p><p>I recommand that we change the documentation accordingly. Instead of:
</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
You must be sure to call this function at regular intervals during the recording (typically around 100 times a second), or some data will be lost.
</p></div></div><p>
The documentation should read:<br />&quot;You must be sure to call this function at regular intervals during the recording, or some data will be lost. To determine the maximum interval, check the size returned by start_sound_input() and determine the time needed to fill this buffer. Use a value that is slightly lower than this maximum period, 50%-90% of the maximum work fine.&quot;</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="p">#include &lt;allegro.h&gt;</span></td></tr><tr><td class="number">2</td><td><span class="p">#include &lt;stdio.h&gt;</span></td></tr><tr><td class="number">3</td><td><span class="p">#include &lt;string.h&gt;</span></td></tr><tr><td class="number">4</td><td>&#160;</td></tr><tr><td class="number">5</td><td><span class="k1">int</span> main<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">6</td><td>    </td></tr><tr><td class="number">7</td><td>    <span class="k1">int</span> ofs <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td>    <span class="k1">int</span> len<span class="k2">;</span></td></tr><tr><td class="number">9</td><td>    <span class="k1">int</span> size<span class="k2">;</span></td></tr><tr><td class="number">10</td><td>    <span class="k1">int</span> foo<span class="k2">;</span></td></tr><tr><td class="number">11</td><td>    <span class="k1">int</span> rate <span class="k3">=</span> <span class="n">44100</span><span class="k2">;</span></td></tr><tr><td class="number">12</td><td>    <span class="k1">int</span> result <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">13</td><td>    <a href="http://www.allegro.cc/manual/SAMPLE" target="_blank"><span class="a">SAMPLE</span></a> <span class="k3">*</span>sample<span class="k2">;</span></td></tr><tr><td class="number">14</td><td>    <span class="k1">int</span> interval<span class="k2">;</span></td></tr><tr><td class="number">15</td><td>    <span class="k1">unsigned</span> <span class="k1">char</span><span class="k3">*</span>buf<span class="k2">;</span></td></tr><tr><td class="number">16</td><td>    </td></tr><tr><td class="number">17</td><td>    <a href="http://www.allegro.cc/manual/allegro_init" target="_blank"><span class="a">allegro_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td>    <a href="http://www.allegro.cc/manual/install_timer" target="_blank"><span class="a">install_timer</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">19</td><td>    <a href="http://www.allegro.cc/manual/install_keyboard" target="_blank"><span class="a">install_keyboard</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>    <a href="http://www.allegro.cc/manual/install_sound" target="_blank"><span class="a">install_sound</span></a><span class="k2">(</span>DIGI_AUTODETECT, MIDI_AUTODETECT, NULL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td>    </td></tr><tr><td class="number">22</td><td>    <a href="http://www.allegro.cc/manual/install_sound_input" target="_blank"><span class="a">install_sound_input</span></a><span class="k2">(</span>DIGI_AUTODETECT, MIDI_NONE<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td>    result <span class="k3">=</span> <a href="http://www.allegro.cc/manual/get_sound_input_cap_parm" target="_blank"><span class="a">get_sound_input_cap_parm</span></a><span class="k2">(</span>rate, <span class="n">16</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>    </td></tr><tr><td class="number">24</td><td>    <a href="http://www.allegro.cc/manual/set_volume" target="_blank"><span class="a">set_volume</span></a><span class="k2">(</span><span class="n">255</span>,<span class="n">255</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">25</td><td>    </td></tr><tr><td class="number">26</td><td>    <span class="k1">if</span> <span class="k2">(</span>result <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">27</td><td>        rate <span class="k3">=</span> result <span class="k3">*</span><span class="k3">-</span><span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">28</td><td>    <span class="k2">}</span> <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>rate <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">29</td><td>        <a href="http://www.delorie.com/djgpp/doc/libc/libc_298.html" target="_blank">exit</a><span class="k2">(</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">30</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">31</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"rate = %i\n"</span>, rate<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">32</td><td>    size <span class="k3">=</span> <span class="n">1024</span><span class="k3">*</span><span class="n">1024</span><span class="k2">;</span></td></tr><tr><td class="number">33</td><td>    sample <span class="k3">=</span> <a href="http://www.allegro.cc/manual/create_sample" target="_blank"><span class="a">create_sample</span></a><span class="k2">(</span><span class="n">16</span>, <span class="n">0</span>, rate, size<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">34</td><td>    buf <span class="k3">=</span> sample-&gt;data<span class="k2">;</span></td></tr><tr><td class="number">35</td><td>    </td></tr><tr><td class="number">36</td><td>    </td></tr><tr><td class="number">37</td><td>    <a href="http://www.allegro.cc/manual/set_sound_input_source" target="_blank"><span class="a">set_sound_input_source</span></a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">38</td><td>    len <span class="k3">=</span> <a href="http://www.allegro.cc/manual/start_sound_input" target="_blank"><span class="a">start_sound_input</span></a><span class="k2">(</span>rate, <span class="n">16</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">39</td><td>    </td></tr><tr><td class="number">40</td><td>    <span class="c">/* calc max interval */</span></td></tr><tr><td class="number">41</td><td>    interval <span class="k3">=</span> <span class="n">1000</span> <span class="k3">/</span> <span class="k2">(</span><span class="k2">(</span>len <span class="k3">/</span> <span class="n">2</span><span class="k2">)</span> <span class="k3">/</span> rate<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">42</td><td>    </td></tr><tr><td class="number">43</td><td>    <span class="c">/* use 9/10 of the max intervall */</span></td></tr><tr><td class="number">44</td><td>    interval <span class="k3">*</span><span class="k3">=</span> <span class="n">9</span><span class="k2">;</span></td></tr><tr><td class="number">45</td><td>    interval <span class="k3">/</span><span class="k3">=</span> <span class="n">10</span><span class="k2">;</span></td></tr><tr><td class="number">46</td><td>        </td></tr><tr><td class="number">47</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"len=%i, intervall=%i\n"</span>, len, interval<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">48</td><td>    <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/keypressed" target="_blank"><span class="a">keypressed</span></a><span class="k2">(</span><span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> ofs <span class="k3">&lt;</span> size<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">49</td><td>        foo <span class="k3">=</span> <a href="http://www.allegro.cc/manual/read_sound_input" target="_blank"><span class="a">read_sound_input</span></a><span class="k2">(</span>buf<span class="k2">)</span><span class="k2">;</span>        </td></tr><tr><td class="number">50</td><td>        <span class="k1">if</span> <span class="k2">(</span>foo <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">51</td><td>            ofs <span class="k3">+</span><span class="k3">=</span> len<span class="k2">;</span></td></tr><tr><td class="number">52</td><td>            buf <span class="k3">+</span><span class="k3">=</span> len<span class="k2">;</span></td></tr><tr><td class="number">53</td><td>            <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%i\n"</span>, foo<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">54</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">55</td><td>        <a href="http://www.allegro.cc/manual/rest" target="_blank"><span class="a">rest</span></a><span class="k2">(</span>interval<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">56</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">57</td><td>    <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/keypressed" target="_blank"><span class="a">keypressed</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">58</td><td>        foo <span class="k3">=</span> <a href="http://www.allegro.cc/manual/read_sound_input" target="_blank"><span class="a">read_sound_input</span></a><span class="k2">(</span>buf<span class="k2">)</span><span class="k2">;</span>        </td></tr><tr><td class="number">59</td><td>        <span class="k1">if</span> <span class="k2">(</span>foo <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">60</td><td>            ofs <span class="k3">+</span><span class="k3">=</span> len<span class="k2">;</span></td></tr><tr><td class="number">61</td><td>            buf <span class="k3">+</span><span class="k3">=</span> len<span class="k2">;</span></td></tr><tr><td class="number">62</td><td>            <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%i\n"</span>, foo<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">63</td><td>        <span class="k2">}</span></td></tr><tr><td class="number">64</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">65</td><td>    <a href="http://www.allegro.cc/manual/stop_sound_input" target="_blank"><span class="a">stop_sound_input</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">66</td><td>    <a href="http://www.allegro.cc/manual/clear_keybuf" target="_blank"><span class="a">clear_keybuf</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>    </td></tr><tr><td class="number">67</td><td>    </td></tr><tr><td class="number">68</td><td>    <a href="http://www.allegro.cc/manual/play_sample" target="_blank"><span class="a">play_sample</span></a><span class="k2">(</span>sample, <span class="n">255</span>, <span class="n">128</span>, <span class="n">1000</span>,<span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">69</td><td>    </td></tr><tr><td class="number">70</td><td>    <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_ESC<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">71</td><td>        </td></tr><tr><td class="number">72</td><td><span class="k2">}</span></td></tr><tr><td class="number">73</td><td><a href="http://www.allegro.cc/manual/END_OF_MAIN" target="_blank"><span class="a">END_OF_MAIN</span></a><span class="k2">(</span><span class="k2">)</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (spellcaster)</author>
		<pubDate>Thu, 24 Feb 2005 21:07:26 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks spellcaster, your example worked. Something like it should be added to the Allegro examples.</p><p>I still need to look into it more to see what the effective difference is with mine. In my program I was calling read_sound_input all the time, assuming it would only return non-zero at the appropriate time. It was returning non-zero more often than it was supposed to, giving me buffers which were similar to each other.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Eric Love)</author>
		<pubDate>Fri, 25 Feb 2005 11:15:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>i use PortAudio lib.<br />it works great on windows  for audio recording.<br />i think its cross platform too.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (A J)</author>
		<pubDate>Fri, 25 Feb 2005 13:04:28 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p> still need to look into it more to see what the effective difference is with mine. In my program I was calling read_sound_input all the time, assuming it would only return non-zero at the appropriate time. It was returning non-zero more often than it was supposed to, giving me buffers which were similar to each other.</p></div></div><p>
I did that at first as well (since it was suggested in the docs), and the results are horrible. I guess read_sound_input does something that disturbs the recording slightly. The more often you call it the more problems you&#39;ll get. <br />I&#39;d need to check the DSound routines and the allegro implementation to see  how one could improve that.</p><p>My example should not be added to allegro right now. The code is a mess because I tried lot&#39;s of stuff before it worked. The example should also be able to deal with several formats and confirm that these formats actually work, etc.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (spellcaster)</author>
		<pubDate>Fri, 25 Feb 2005 16:31:06 +0000</pubDate>
	</item>
</rss>
