<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>save_wav() is a good idea</title>
		<link>http://www.allegro.cc/forums/view/586131</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Tue, 04 Jul 2006 17:54:12 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I haven&#39;t got source for Allegro 4.2.0 so I can&#39;t check if the load_wav() function has been perfected and not just skipping a bunch of bytes.</p><p>Anyways, someone I know (who codes a lot of Assembler but does a lot of C nowadays) has given me the actual WAV header format.<br />00 DWORD &quot;RIFF&quot;<br />04 DWORD Filesize-8<br />08 DWORD &quot;WAVE&quot;<br />0C DWORD &quot;fmt &quot;<br />10 DWORD 0x10<br />14 WORD 1<br />16 WORD NumChannels<br />18 DWORD SampleRate<br />1C DWORD ByteRate=SampleRate*NumChannels*BitsPerSample/8<br />20 WORD BlockAlign=NumChannels*BitsPerSample/8<br />22 WORD BitsPerSample<br />24 DWORD &quot;data&quot;<br />28 DWORD DataSize=FileSize-0x2C<br />2C Data goes here<br />I reckon I could make something quite quickly. Here&#39;s a header...
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">typedef</span> <span class="k1">struct</span> WaveFile <span class="k2">{</span>
  <span class="k1">char</span> riffhead<span class="k2">[</span><span class="n">4</span><span class="k2">]</span><span class="k2">;</span> <span class="c">// Set this to "RIFF"</span>
  <span class="k1">unsigned</span> <span class="k1">long</span> fsm8<span class="k2">;</span> <span class="c">// Set this to sample&gt;len + 36 (24h)</span>
  <span class="k1">char</span> wavefmthead<span class="k2">[</span><span class="n">8</span><span class="k2">]</span><span class="k2">;</span> <span class="c">// Set this to "WAVEfmt "</span>
  <span class="k1">unsigned</span> <span class="k1">long</span> fmtheaderlen<span class="k2">;</span> <span class="c">// Set this to 16 (10h)</span>
  <span class="k1">unsigned</span> <span class="k1">short</span> codecused<span class="k2">;</span> <span class="c">// Set this to 1 (PCM unencoded format)</span>
  <span class="k1">unsigned</span> <span class="k1">short</span> channels<span class="k2">;</span> <span class="c">// Set this to sample-&gt;stereo + 1</span>
  <span class="k1">unsigned</span> <span class="k1">long</span> samplerate<span class="k2">;</span> <span class="c">// Set this to sample-&gt;frequency</span>
  <span class="k1">unsigned</span> <span class="k1">long</span> byterate<span class="k2">;</span> <span class="c">// Set this to samplerate*channels*bits/8</span>
  <span class="k1">unsigned</span> <span class="k1">short</span> blockalign<span class="k2">;</span> <span class="c">// Set this to channels*bits/8</span>
  <span class="k1">unsigned</span> <span class="k1">short</span> bits<span class="k2">;</span> <span class="c">// Set this to sample-&gt;bits</span>
  <span class="k1">char</span> datahead<span class="k2">[</span><span class="n">4</span><span class="k2">]</span><span class="k2">;</span> <span class="c">// Set this to "data"</span>
  <span class="k1">unsigned</span> <span class="k1">long</span> datasize<span class="k2">;</span> <span class="c">// Set this to sample-&gt;len</span>
  <span class="k1">void</span> <span class="k3">*</span>data<span class="k2">;</span> <span class="c">// Set this to sample-&gt;data</span>
<span class="k2">}</span> WaveFile<span class="k2">;</span>
</pre></div></div><p>
As you see, I&#39;m really anal when it comes to signed and unsigned numbers.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (thematrixeatsyou)</author>
		<pubDate>Tue, 27 Jun 2006 12:58:05 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Why would load_wav need to read data it doesn&#39;t use?</p><p>Though if you want to handle any riff format, give my <a href="http://strangesoft.net/software.ss?project=25">libriff</a> a shot. It might not handle aiff/iff files correctly, as for some reason the one file I tried stored the offsets and lengths in the wrong endian layout.</p><p>example:
</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;stdio.h&gt;</span></td></tr><tr><td class="number">2</td><td><span class="p">#include &lt;errno.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><span class="p">#include "libriff.h"</span></td></tr><tr><td class="number">5</td><td>&#160;</td></tr><tr><td class="number">6</td><td><span class="p">#include "debug.h"</span></td></tr><tr><td class="number">7</td><td>&#160;</td></tr><tr><td class="number">8</td><td>size_t stdio_read<span class="k2">(</span><span class="k1">void</span> <span class="k3">*</span>f, size_t size, <span class="k1">void</span> <span class="k3">*</span>ptr<span class="k2">)</span></td></tr><tr><td class="number">9</td><td><span class="k2">{</span></td></tr><tr><td class="number">10</td><td>  <span class="k1">return</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_349.html" target="_blank">fread</a><span class="k2">(</span>ptr, <span class="n">1</span>, size, <span class="k2">(</span>FILE <span class="k3">*</span><span class="k2">)</span>f<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td><span class="k2">}</span></td></tr><tr><td class="number">12</td><td>&#160;</td></tr><tr><td class="number">13</td><td>size_t stdio_write<span class="k2">(</span><span class="k1">void</span> <span class="k3">*</span>f, size_t size, <span class="k1">void</span> <span class="k3">*</span>ptr<span class="k2">)</span></td></tr><tr><td class="number">14</td><td><span class="k2">{</span></td></tr><tr><td class="number">15</td><td>  <span class="k1">return</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_371.html" target="_blank">fwrite</a><span class="k2">(</span>ptr, <span class="n">1</span>, size, <span class="k2">(</span>FILE <span class="k3">*</span><span class="k2">)</span>f<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">16</td><td><span class="k2">}</span></td></tr><tr><td class="number">17</td><td>&#160;</td></tr><tr><td class="number">18</td><td>int32_t stdio_seek<span class="k2">(</span><span class="k1">void</span> <span class="k3">*</span>f, off_t off, u_int32_t whence<span class="k2">)</span></td></tr><tr><td class="number">19</td><td><span class="k2">{</span></td></tr><tr><td class="number">20</td><td>  <span class="k1">return</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_354.html" target="_blank">fseek</a><span class="k2">(</span><span class="k2">(</span>FILE <span class="k3">*</span><span class="k2">)</span>f, off, whence<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td><span class="k2">}</span></td></tr><tr><td class="number">22</td><td>&#160;</td></tr><tr><td class="number">23</td><td>off_t stdio_tell<span class="k2">(</span><span class="k1">void</span> <span class="k3">*</span>f<span class="k2">)</span></td></tr><tr><td class="number">24</td><td><span class="k2">{</span></td></tr><tr><td class="number">25</td><td>  <span class="k1">return</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_366.html" target="_blank">ftell</a><span class="k2">(</span><span class="k2">(</span>FILE <span class="k3">*</span><span class="k2">)</span>f<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td><span class="k2">}</span></td></tr><tr><td class="number">27</td><td>&#160;</td></tr><tr><td class="number">28</td><td>int32_t stdio_error<span class="k2">(</span><span class="k1">void</span> <span class="k3">*</span>f<span class="k2">)</span></td></tr><tr><td class="number">29</td><td><span class="k2">{</span></td></tr><tr><td class="number">30</td><td>  <span class="k1">return</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_314.html" target="_blank">ferror</a><span class="k2">(</span><span class="k2">(</span>FILE <span class="k3">*</span><span class="k2">)</span>f<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">31</td><td><span class="k2">}</span></td></tr><tr><td class="number">32</td><td>&#160;</td></tr><tr><td class="number">33</td><td>int32_t stdio_eof<span class="k2">(</span><span class="k1">void</span> <span class="k3">*</span>f<span class="k2">)</span></td></tr><tr><td class="number">34</td><td><span class="k2">{</span></td></tr><tr><td class="number">35</td><td>  <span class="k1">return</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_313.html" target="_blank">feof</a><span class="k2">(</span><span class="k2">(</span>FILE <span class="k3">*</span><span class="k2">)</span>f<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">36</td><td><span class="k2">}</span></td></tr><tr><td class="number">37</td><td>&#160;</td></tr><tr><td class="number">38</td><td>riff_callbacks_t stdio_vtable <span class="k3">=</span> <span class="k2">{</span></td></tr><tr><td class="number">39</td><td>  <span class="k3">&amp;</span>stdio_read,</td></tr><tr><td class="number">40</td><td>  <span class="k3">&amp;</span>stdio_write,</td></tr><tr><td class="number">41</td><td>  <span class="k3">&amp;</span>stdio_seek,</td></tr><tr><td class="number">42</td><td>  <span class="k3">&amp;</span>stdio_tell,</td></tr><tr><td class="number">43</td><td>  <span class="k3">&amp;</span>stdio_error,</td></tr><tr><td class="number">44</td><td>  <span class="k3">&amp;</span>stdio_eof,</td></tr><tr><td class="number">45</td><td><span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">46</td><td>&#160;</td></tr><tr><td class="number">47</td><td><span class="k1">int</span> copy_riff<span class="k2">(</span>riff_file_t <span class="k3">*</span>src, FILE <span class="k3">*</span>dest<span class="k2">)</span></td></tr><tr><td class="number">48</td><td><span class="k2">{</span></td></tr><tr><td class="number">49</td><td>  riff_file_t <span class="k3">*</span>riff <span class="k3">=</span> NULL<span class="k2">;</span></td></tr><tr><td class="number">50</td><td>  riff_chunk_t <span class="k3">*</span>schunk <span class="k3">=</span> NULL, <span class="k3">*</span>dchunk <span class="k3">=</span> NULL<span class="k2">;</span></td></tr><tr><td class="number">51</td><td>  <span class="k1">unsigned</span> <span class="k1">char</span> data<span class="k2">[</span><span class="n">1024</span><span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">52</td><td>  </td></tr><tr><td class="number">53</td><td>  Assert<span class="k2">(</span>src<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">54</td><td>  </td></tr><tr><td class="number">55</td><td>  riff <span class="k3">=</span> riff_file_copy<span class="k2">(</span>src<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">56</td><td>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>riff<span class="k2">)</span></td></tr><tr><td class="number">57</td><td>    <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">58</td><td>  </td></tr><tr><td class="number">59</td><td>  schunk <span class="k3">=</span> riff_file_chunk<span class="k2">(</span>src<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">60</td><td>  dchunk <span class="k3">=</span> riff_file_chunk<span class="k2">(</span>riff<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">61</td><td>  </td></tr><tr><td class="number">62</td><td>  riff_file_data_set<span class="k2">(</span>riff, dest<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">63</td><td>  <span class="k1">if</span><span class="k2">(</span>riff_file_save<span class="k2">(</span>riff<span class="k2">)</span> <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">64</td><td>    riff_file_destroy<span class="k2">(</span>riff<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">65</td><td>    warn<span class="k2">(</span><span class="s">"failed to save dest riff headers"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">66</td><td>    <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">67</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">68</td><td>  </td></tr><tr><td class="number">69</td><td>  <span class="k1">while</span><span class="k2">(</span>schunk<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">70</td><td>    u_int32_t i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">71</td><td>    <span class="k1">if</span><span class="k2">(</span>riff_chunk_children<span class="k2">(</span>schunk<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">72</td><td>      schunk <span class="k3">=</span> riff_chunk_children<span class="k2">(</span>schunk<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">73</td><td>      dchunk <span class="k3">=</span> riff_chunk_children<span class="k2">(</span>dchunk<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">74</td><td>      <span class="k1">continue</span><span class="k2">;</span></td></tr><tr><td class="number">75</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">76</td><td>    </td></tr><tr><td class="number">77</td><td>    <span class="k1">while</span><span class="k2">(</span>i <span class="k3">&lt;</span> riff_chunk_size_get<span class="k2">(</span>schunk<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">78</td><td>      u_int32_t r <span class="k3">=</span> riff_chunk_read<span class="k2">(</span>src, schunk, <span class="n">1024</span>, data<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">79</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">"read %i bytes\n"</span>, r<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">80</td><td>      riff_chunk_write<span class="k2">(</span>riff, dchunk, r, data<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">81</td><td>      </td></tr><tr><td class="number">82</td><td>      i <span class="k3">+</span><span class="k3">=</span> r<span class="k2">;</span></td></tr><tr><td class="number">83</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">84</td><td>    </td></tr><tr><td class="number">85</td><td>    <span class="k1">if</span><span class="k2">(</span>riff_chunk_next<span class="k2">(</span>schunk<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">86</td><td>      schunk <span class="k3">=</span> riff_chunk_next<span class="k2">(</span>schunk<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">87</td><td>      dchunk <span class="k3">=</span> riff_chunk_next<span class="k2">(</span>dchunk<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">88</td><td>    <span class="k2">}</span> <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>riff_chunk_parent<span class="k2">(</span>schunk<span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> riff_chunk_next<span class="k2">(</span>riff_chunk_parent<span class="k2">(</span>schunk<span class="k2">)</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">89</td><td>      schunk <span class="k3">=</span> riff_chunk_next<span class="k2">(</span>riff_chunk_parent<span class="k2">(</span>schunk<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">90</td><td>      dchunk <span class="k3">=</span> riff_chunk_next<span class="k2">(</span>riff_chunk_parent<span class="k2">(</span>dchunk<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">91</td><td>    <span class="k2">}</span> <span class="k1">else</span></td></tr><tr><td class="number">92</td><td>      schunk <span class="k3">=</span> NULL<span class="k2">;</span></td></tr><tr><td class="number">93</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">94</td><td>  </td></tr><tr><td class="number">95</td><td>  riff_file_destroy<span class="k2">(</span>riff<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">96</td><td>  </td></tr><tr><td class="number">97</td><td>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">98</td><td><span class="k2">}</span></td></tr><tr><td class="number">99</td><td>&#160;</td></tr><tr><td class="number">100</td><td><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></td></tr><tr><td class="number">101</td><td><span class="k2">{</span></td></tr><tr><td class="number">102</td><td>  riff_file_t <span class="k3">*</span>riff <span class="k3">=</span> NULL<span class="k2">;</span></td></tr><tr><td class="number">103</td><td>  </td></tr><tr><td class="number">104</td><td>  FILE <span class="k3">*</span>src <span class="k3">=</span> NULL<span class="k2">;</span></td></tr><tr><td class="number">105</td><td>  FILE <span class="k3">*</span>dest <span class="k3">=</span> NULL<span class="k2">;</span></td></tr><tr><td class="number">106</td><td>  </td></tr><tr><td class="number">107</td><td>  <span class="k1">if</span><span class="k2">(</span>argc <span class="k3">&lt;</span> <span class="n">3</span><span class="k2">)</span></td></tr><tr><td class="number">108</td><td>    error<span class="k2">(</span><span class="s">"Usage:  %s &lt;src&gt; &lt;dest&gt;"</span>, argv<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">109</td><td>  </td></tr><tr><td class="number">110</td><td>  src <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_337.html" target="_blank">fopen</a><span class="k2">(</span>argv<span class="k2">[</span><span class="n">1</span><span class="k2">]</span>, <span class="s">"rb"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">111</td><td>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>src<span class="k2">)</span></td></tr><tr><td class="number">112</td><td>    error<span class="k2">(</span><span class="s">"Failed to open file '%s': %s"</span>, argv<span class="k2">[</span><span class="n">1</span><span class="k2">]</span>, <a href="http://www.delorie.com/djgpp/doc/libc/libc_759.html" target="_blank">strerror</a><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_293.html" target="_blank">errno</a><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">113</td><td>  </td></tr><tr><td class="number">114</td><td>  dest <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_337.html" target="_blank">fopen</a><span class="k2">(</span>argv<span class="k2">[</span><span class="n">2</span><span class="k2">]</span>, <span class="s">"wb"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">115</td><td>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>dest<span class="k2">)</span></td></tr><tr><td class="number">116</td><td>    error<span class="k2">(</span><span class="s">"Failed to open file '%s': %s"</span>, argv<span class="k2">[</span><span class="n">2</span><span class="k2">]</span>, <a href="http://www.delorie.com/djgpp/doc/libc/libc_759.html" target="_blank">strerror</a><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_293.html" target="_blank">errno</a><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">117</td><td>  </td></tr><tr><td class="number">118</td><td>  riff <span class="k3">=</span> riff_file_create<span class="k2">(</span><span class="k3">&amp;</span>stdio_vtable, src<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">119</td><td>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>riff<span class="k2">)</span> <span class="k2">{</span> <span class="c">// doesn't currently return if creation failed.. may change, so error checking is a good thing...</span></td></tr><tr><td class="number">120</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_308.html" target="_blank">fclose</a><span class="k2">(</span>src<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">121</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_308.html" target="_blank">fclose</a><span class="k2">(</span>dest<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">122</td><td>    error<span class="k2">(</span><span class="s">"Failed to create riff data"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">123</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">124</td><td>  </td></tr><tr><td class="number">125</td><td>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>riff_file_load<span class="k2">(</span>riff<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">126</td><td>    riff_file_destroy<span class="k2">(</span>riff<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">127</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_308.html" target="_blank">fclose</a><span class="k2">(</span>src<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">128</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_308.html" target="_blank">fclose</a><span class="k2">(</span>dest<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">129</td><td>    error<span class="k2">(</span><span class="s">"Failed to load riff file"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">130</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">131</td><td>&#160;</td></tr><tr><td class="number">132</td><td>  <span class="k1">if</span><span class="k2">(</span>copy_riff<span class="k2">(</span>riff, dest<span class="k2">)</span> <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">133</td><td>    warn<span class="k2">(</span><span class="s">"failed durring copy..."</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">134</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">135</td><td>  </td></tr><tr><td class="number">136</td><td>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_308.html" target="_blank">fclose</a><span class="k2">(</span>dest<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">137</td><td>  </td></tr><tr><td class="number">138</td><td>  riff_file_destroy<span class="k2">(</span>riff<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">139</td><td>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_308.html" target="_blank">fclose</a><span class="k2">(</span>src<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">140</td><td>  </td></tr><tr><td class="number">141</td><td>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">142</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

This is a somewhat useless example, but hey, it shows how to read and write a riff file, so I thought it was better than just showing the others. it provides a &quot;FILE&quot; like interface to the individual chunks in a given riff file, reading, writing, seeking, and you can&#39;t seek, read or write past the end or before the start of a chunk, so its a little safe there.</p><p>Though I have to admit, the riff_file_copy function might need to be renamed, it only coppies the metadata, ie: the structs, and chunk structs, and not the actual data stored in the chunks.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Tue, 27 Jun 2006 13:09:48 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Well most of the players load these values to perform checks.<br />A SAVE_WAV() function MUST save these values correctly anyways.<br />Let&#39;s see what I can whip up... Untested sorry. If it works, then I&#39;m just the man.
</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;stdio.h&gt;</span></td></tr><tr><td class="number">2</td><td>&#160;</td></tr><tr><td class="number">3</td><td><span class="p">#include &lt;allegro.h&gt;</span></td></tr><tr><td class="number">4</td><td><span class="k1">typedef</span> <span class="k1">struct</span> WaveFile <span class="k2">{</span></td></tr><tr><td class="number">5</td><td>  <span class="k1">char</span> riffhead<span class="k2">[</span><span class="n">4</span><span class="k2">]</span><span class="k2">;</span> <span class="c">// Set this to "RIFF"</span></td></tr><tr><td class="number">6</td><td>  <span class="k1">unsigned</span> <span class="k1">long</span> fsm8<span class="k2">;</span> <span class="c">// Set this to sample&gt;len + 36 (24h)</span></td></tr><tr><td class="number">7</td><td>  <span class="k1">char</span> wavefmthead<span class="k2">[</span><span class="n">8</span><span class="k2">]</span><span class="k2">;</span> <span class="c">// Set this to "WAVEfmt "</span></td></tr><tr><td class="number">8</td><td>  <span class="k1">unsigned</span> <span class="k1">long</span> fmtheaderlen<span class="k2">;</span> <span class="c">// Set this to 16 (10h)</span></td></tr><tr><td class="number">9</td><td>  <span class="k1">unsigned</span> <span class="k1">short</span> codecused<span class="k2">;</span> <span class="c">// Set this to 1 (PCM unencoded format)</span></td></tr><tr><td class="number">10</td><td>  <span class="k1">unsigned</span> <span class="k1">short</span> channels<span class="k2">;</span> <span class="c">// Set this to sample-&gt;stereo + 1</span></td></tr><tr><td class="number">11</td><td>  <span class="k1">unsigned</span> <span class="k1">long</span> samplerate<span class="k2">;</span> <span class="c">// Set this to sample-&gt;frequency</span></td></tr><tr><td class="number">12</td><td>  <span class="k1">unsigned</span> <span class="k1">long</span> byterate<span class="k2">;</span> <span class="c">// Set this to samplerate*channels*bits/8</span></td></tr><tr><td class="number">13</td><td>  <span class="k1">unsigned</span> <span class="k1">short</span> blockalign<span class="k2">;</span> <span class="c">// Set this to channels*bits/8</span></td></tr><tr><td class="number">14</td><td>  <span class="k1">unsigned</span> <span class="k1">short</span> bits<span class="k2">;</span> <span class="c">// Set this to sample-&gt;bits</span></td></tr><tr><td class="number">15</td><td>  <span class="k1">char</span> datahead<span class="k2">[</span><span class="n">4</span><span class="k2">]</span><span class="k2">;</span> <span class="c">// Set this to "data"</span></td></tr><tr><td class="number">16</td><td>  <span class="k1">unsigned</span> <span class="k1">long</span> datasize<span class="k2">;</span> <span class="c">// Set this to sample-&gt;len</span></td></tr><tr><td class="number">17</td><td>  <span class="k1">void</span> <span class="k3">*</span>data<span class="k2">;</span> <span class="c">// Set this to sample-&gt;data</span></td></tr><tr><td class="number">18</td><td><span class="k2">}</span> WaveFile<span class="k2">;</span></td></tr><tr><td class="number">19</td><td>&#160;</td></tr><tr><td class="number">20</td><td><span class="k1">int</span> save_wav<span class="k2">(</span><span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span>filename, <a href="http://www.allegro.cc/manual/SAMPLE" target="_blank"><span class="a">SAMPLE</span></a> <span class="k3">*</span>spl<span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">21</td><td>  <a href="http://www.allegro.cc/manual/PACKFILE" target="_blank"><span class="a">PACKFILE</span></a> <span class="k3">*</span>fp<span class="k2">;</span></td></tr><tr><td class="number">22</td><td>  WaveFile wf<span class="k2">;</span></td></tr><tr><td class="number">23</td><td>&#160;</td></tr><tr><td class="number">24</td><td>  <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/pack_fopen" target="_blank"><span class="a">pack_fopen</span></a><span class="k2">(</span>filename,<span class="s">"w"</span><span class="k2">)</span><span class="k2">)</span><span class="k2">{</span></td></tr><tr><td class="number">25</td><td>    <a href="http://www.allegro.cc/manual/pack_fwrite" target="_blank"><span class="a">pack_fwrite</span></a><span class="k2">(</span><span class="s">"RIFF"</span>,<span class="n">4</span>,fp<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>    <a href="http://www.allegro.cc/manual/pack_iputl" target="_blank"><span class="a">pack_iputl</span></a><span class="k2">(</span>spl-&gt;len<span class="k3">*</span><span class="k2">(</span>spl-&gt;stereo<span class="k3">+</span><span class="n">1</span><span class="k2">)</span><span class="k3">*</span><span class="k2">(</span>spl-&gt;bits<span class="k3">/</span><span class="n">8</span><span class="k2">)</span><span class="k3">+</span><span class="n">36</span>,fp<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">27</td><td>    <a href="http://www.allegro.cc/manual/pack_fwrite" target="_blank"><span class="a">pack_fwrite</span></a><span class="k2">(</span><span class="s">"WAVEfmt "</span>,<span class="n">8</span>,fp<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">28</td><td>    <a href="http://www.allegro.cc/manual/pack_iputl" target="_blank"><span class="a">pack_iputl</span></a><span class="k2">(</span><span class="n">10</span>,fp<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">29</td><td>    <a href="http://www.allegro.cc/manual/pack_iputw" target="_blank"><span class="a">pack_iputw</span></a><span class="k2">(</span><span class="n">1</span>,fp<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">30</td><td>    <a href="http://www.allegro.cc/manual/pack_iputw" target="_blank"><span class="a">pack_iputw</span></a><span class="k2">(</span>spl-&gt;stereo<span class="k3">+</span><span class="n">1</span>,fp<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">31</td><td>    <a href="http://www.allegro.cc/manual/pack_iputl" target="_blank"><span class="a">pack_iputl</span></a><span class="k2">(</span>spl-&gt;freq,fp<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">32</td><td>    <a href="http://www.allegro.cc/manual/pack_iputl" target="_blank"><span class="a">pack_iputl</span></a><span class="k2">(</span>spl-&gt;freq<span class="k3">*</span><span class="k2">(</span>spl-&gt;stereo<span class="k3">+</span><span class="n">1</span><span class="k2">)</span><span class="k3">*</span><span class="k2">(</span>spl-&gt;bits<span class="k3">/</span><span class="n">8</span><span class="k2">)</span>,fp<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">33</td><td>    <a href="http://www.allegro.cc/manual/pack_iputw" target="_blank"><span class="a">pack_iputw</span></a><span class="k2">(</span><span class="k2">(</span>spl-&gt;stereo<span class="k3">+</span><span class="n">1</span><span class="k2">)</span><span class="k3">*</span><span class="k2">(</span>spl-&gt;bits<span class="k3">/</span><span class="n">8</span><span class="k2">)</span>,fp<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">34</td><td>    <a href="http://www.allegro.cc/manual/pack_iputw" target="_blank"><span class="a">pack_iputw</span></a><span class="k2">(</span><span class="k2">(</span>spl-&gt;stereo<span class="k3">+</span><span class="n">1</span><span class="k2">)</span><span class="k3">*</span>spl-&gt;bits,fp<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">35</td><td>    <a href="http://www.allegro.cc/manual/pack_fwrite" target="_blank"><span class="a">pack_fwrite</span></a><span class="k2">(</span><span class="s">"data"</span>,<span class="n">4</span>,fp<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">36</td><td>    <a href="http://www.allegro.cc/manual/pack_iputl" target="_blank"><span class="a">pack_iputl</span></a><span class="k2">(</span>spl-&gt;len<span class="k3">*</span><span class="k2">(</span>spl-&gt;stereo<span class="k3">+</span><span class="n">1</span><span class="k2">)</span><span class="k3">*</span><span class="k2">(</span>spl-&gt;bits<span class="k3">/</span><span class="n">8</span><span class="k2">)</span>,fp<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">37</td><td>    <a href="http://www.allegro.cc/manual/pack_fwrite" target="_blank"><span class="a">pack_fwrite</span></a><span class="k2">(</span>spl-&gt;data,spl-&gt;len<span class="k3">*</span><span class="k2">(</span>spl-&gt;stereo<span class="k3">+</span><span class="n">1</span><span class="k2">)</span><span class="k3">*</span><span class="k2">(</span>spl-&gt;bits<span class="k3">/</span><span class="n">8</span><span class="k2">)</span>,fp<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">38</td><td>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">39</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">40</td><td>  <span class="k1">return</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">41</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (thematrixeatsyou)</author>
		<pubDate>Wed, 28 Jun 2006 11:37:04 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Don&#39;t think allegro really needs to save waves but a simple save_wav might be cool for utilities or debugging.  If you&#39;re looking for a lib, I&#39;ve written several libraries that can read/write PCM format wave files and the most recent (&#39;My_Audio&#39; library) can handle all bit depths of PCM .wav (8 to 32 bit integer, float type3, double type3, and the non-standard CoolEdit 16.8) and all integer format .aif files. (can also read and write .mid files)  It handles all unsupported chunks in a way that allows them to be saved back to the file and supports a lot of chunks common to the pro-audio scene including the &#39;smpl&#39; chunk (sampler info), &#39;cue &#39; and &#39;plst&#39; and even the &#39;bext&#39; chunk (EBU extensions).  It&#39;s not on the net yet but will be soon.  You might want to check out <a href="http://www.mega-nerd.com/libsndfile/">libsndfile</a> too.  Libsndfile handles all kinds of audio file formats.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Ron Novy)</author>
		<pubDate>Fri, 30 Jun 2006 21:57:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The best way would probably be an addon, which would use the save_sample and register_sample_file_type functions. I also should have a very simple function lying around somewhere which can be registered for saving to wav.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Fri, 30 Jun 2006 23:38:11 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I also should have a very simple function lying around somewhere
</p></div></div><p>
So do not let it lying around, Let it be a part of allegro ;-)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GullRaDriel)</author>
		<pubDate>Tue, 04 Jul 2006 17:54:12 +0000</pubDate>
	</item>
</rss>
