1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>libmpcdec: src/sample.cpp Source File</title>
<link href="custom.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.4.4 -->
<div class="qindex"><a class="qindex" href="index.html">Main Page</a> | <a class="qindex" href="annotated.html">Class List</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="functions.html">Class Members</a> | <a class="qindex" href="globals.html">File Members</a> | <a class="qindex" href="pages.html">Related Pages</a></div>
<div class="nav">
<a class="el" href="dir_000002.html">src</a></div>
<h1>sample.cpp</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> Copyright (c) 2005, The Musepack Development Team</span>
<a name="l00003"></a>00003 <span class="comment"> All rights reserved.</span>
<a name="l00004"></a>00004 <span class="comment"></span>
<a name="l00005"></a>00005 <span class="comment"> Redistribution and use in source and binary forms, with or without</span>
<a name="l00006"></a>00006 <span class="comment"> modification, are permitted provided that the following conditions are</span>
<a name="l00007"></a>00007 <span class="comment"> met:</span>
<a name="l00008"></a>00008 <span class="comment"></span>
<a name="l00009"></a>00009 <span class="comment"> * Redistributions of source code must retain the above copyright</span>
<a name="l00010"></a>00010 <span class="comment"> notice, this list of conditions and the following disclaimer.</span>
<a name="l00011"></a>00011 <span class="comment"></span>
<a name="l00012"></a>00012 <span class="comment"> * Redistributions in binary form must reproduce the above</span>
<a name="l00013"></a>00013 <span class="comment"> copyright notice, this list of conditions and the following</span>
<a name="l00014"></a>00014 <span class="comment"> disclaimer in the documentation and/or other materials provided</span>
<a name="l00015"></a>00015 <span class="comment"> with the distribution.</span>
<a name="l00016"></a>00016 <span class="comment"></span>
<a name="l00017"></a>00017 <span class="comment"> * Neither the name of the The Musepack Development Team nor the</span>
<a name="l00018"></a>00018 <span class="comment"> names of its contributors may be used to endorse or promote</span>
<a name="l00019"></a>00019 <span class="comment"> products derived from this software without specific prior</span>
<a name="l00020"></a>00020 <span class="comment"> written permission.</span>
<a name="l00021"></a>00021 <span class="comment"></span>
<a name="l00022"></a>00022 <span class="comment"> THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS</span>
<a name="l00023"></a>00023 <span class="comment"> "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT</span>
<a name="l00024"></a>00024 <span class="comment"> LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR</span>
<a name="l00025"></a>00025 <span class="comment"> A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT</span>
<a name="l00026"></a>00026 <span class="comment"> OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,</span>
<a name="l00027"></a>00027 <span class="comment"> SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT</span>
<a name="l00028"></a>00028 <span class="comment"> LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,</span>
<a name="l00029"></a>00029 <span class="comment"> DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY</span>
<a name="l00030"></a>00030 <span class="comment"> THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT</span>
<a name="l00031"></a>00031 <span class="comment"> (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE</span>
<a name="l00032"></a>00032 <span class="comment"> OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</span>
<a name="l00033"></a>00033 <span class="comment">*/</span>
<a name="l00034"></a>00034
<a name="l00035"></a>00035 <span class="preprocessor">#include <stdio.h></span>
<a name="l00036"></a>00036 <span class="preprocessor">#include <assert.h></span>
<a name="l00037"></a>00037 <span class="preprocessor">#include <time.h></span>
<a name="l00038"></a>00038
<a name="l00039"></a>00039 <span class="preprocessor">#include <<a class="code" href="mpcdec_8h.html">mpcdec/mpcdec.h</a>></span>
<a name="l00040"></a>00040
<a name="l00041"></a>00041 <span class="comment">/*</span>
<a name="l00042"></a>00042 <span class="comment"> The data bundle we pass around with our reader to store file</span>
<a name="l00043"></a>00043 <span class="comment"> position and size etc. </span>
<a name="l00044"></a>00044 <span class="comment">*/</span>
<a name="l00045"></a><a class="code" href="structreader__data__t.html">00045</a> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structreader__data__t.html">reader_data_t</a> {
<a name="l00046"></a><a class="code" href="structreader__data__t.html#o0">00046</a> FILE *<a class="code" href="structreader__data__t.html#o0">file</a>;
<a name="l00047"></a><a class="code" href="structreader__data__t.html#o1">00047</a> <span class="keywordtype">long</span> <a class="code" href="structreader__data__t.html#o1">size</a>;
<a name="l00048"></a><a class="code" href="structreader__data__t.html#o2">00048</a> mpc_bool_t <a class="code" href="structreader__data__t.html#o2">seekable</a>;
<a name="l00049"></a>00049 } <a class="code" href="structreader__data__t.html">reader_data</a>;
<a name="l00050"></a>00050
<a name="l00051"></a>00051 <span class="comment">/*</span>
<a name="l00052"></a>00052 <span class="comment"> Our implementations of the mpc_reader callback functions.</span>
<a name="l00053"></a>00053 <span class="comment">*/</span>
<a name="l00054"></a>00054 mpc_int32_t
<a name="l00055"></a>00055 read_impl(<span class="keywordtype">void</span> *data, <span class="keywordtype">void</span> *ptr, mpc_int32_t size)
<a name="l00056"></a>00056 {
<a name="l00057"></a>00057 <a class="code" href="structreader__data__t.html">reader_data</a> *d = (<a class="code" href="structreader__data__t.html">reader_data</a> *) data;
<a name="l00058"></a>00058 <span class="keywordflow">return</span> fread(ptr, 1, size, d-><a class="code" href="structreader__data__t.html#o0">file</a>);
<a name="l00059"></a>00059 }
<a name="l00060"></a>00060
<a name="l00061"></a>00061 mpc_bool_t
<a name="l00062"></a>00062 seek_impl(<span class="keywordtype">void</span> *data, mpc_int32_t offset)
<a name="l00063"></a>00063 {
<a name="l00064"></a>00064 <a class="code" href="structreader__data__t.html">reader_data</a> *d = (<a class="code" href="structreader__data__t.html">reader_data</a> *) data;
<a name="l00065"></a>00065 <span class="keywordflow">return</span> d-><a class="code" href="structreader__data__t.html#o2">seekable</a> ? !fseek(d-><a class="code" href="structreader__data__t.html#o0">file</a>, offset, SEEK_SET) : false;
<a name="l00066"></a>00066 }
<a name="l00067"></a>00067
<a name="l00068"></a>00068 mpc_int32_t
<a name="l00069"></a>00069 tell_impl(<span class="keywordtype">void</span> *data)
<a name="l00070"></a>00070 {
<a name="l00071"></a>00071 <a class="code" href="structreader__data__t.html">reader_data</a> *d = (<a class="code" href="structreader__data__t.html">reader_data</a> *) data;
<a name="l00072"></a>00072 <span class="keywordflow">return</span> ftell(d-><a class="code" href="structreader__data__t.html#o0">file</a>);
<a name="l00073"></a>00073 }
<a name="l00074"></a>00074
<a name="l00075"></a>00075 mpc_int32_t
<a name="l00076"></a>00076 get_size_impl(<span class="keywordtype">void</span> *data)
<a name="l00077"></a>00077 {
<a name="l00078"></a>00078 <a class="code" href="structreader__data__t.html">reader_data</a> *d = (<a class="code" href="structreader__data__t.html">reader_data</a> *) data;
<a name="l00079"></a>00079 <span class="keywordflow">return</span> d-><a class="code" href="structreader__data__t.html#o1">size</a>;
<a name="l00080"></a>00080 }
<a name="l00081"></a>00081
<a name="l00082"></a>00082 mpc_bool_t
<a name="l00083"></a>00083 canseek_impl(<span class="keywordtype">void</span> *data)
<a name="l00084"></a>00084 {
<a name="l00085"></a>00085 <a class="code" href="structreader__data__t.html">reader_data</a> *d = (<a class="code" href="structreader__data__t.html">reader_data</a> *) data;
<a name="l00086"></a>00086 <span class="keywordflow">return</span> d-><a class="code" href="structreader__data__t.html#o2">seekable</a>;
<a name="l00087"></a>00087 }
<a name="l00088"></a>00088
<a name="l00089"></a>00089 <span class="preprocessor">#define WFX_SIZE (2+2+4+4+2+2)</span>
<a name="l00090"></a>00090 <span class="preprocessor"></span>
<a name="l00091"></a>00091 <span class="preprocessor">#ifdef MPC_FIXED_POINT</span>
<a name="l00092"></a>00092 <span class="preprocessor"></span><span class="keyword">static</span> <span class="keywordtype">int</span>
<a name="l00093"></a>00093 shift_signed(<a class="code" href="math_8h.html#a16">MPC_SAMPLE_FORMAT</a> val, <span class="keywordtype">int</span> shift)
<a name="l00094"></a>00094 {
<a name="l00095"></a>00095 <span class="keywordflow">if</span> (shift > 0)
<a name="l00096"></a>00096 val <<= shift;
<a name="l00097"></a>00097 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (shift < 0)
<a name="l00098"></a>00098 val >>= -shift;
<a name="l00099"></a>00099 <span class="keywordflow">return</span> (<span class="keywordtype">int</span>)val;
<a name="l00100"></a>00100 }
<a name="l00101"></a>00101 <span class="preprocessor">#endif</span>
<a name="l00102"></a>00102 <span class="preprocessor"></span>
<a name="l00103"></a><a class="code" href="classWavWriter.html">00103</a> <span class="keyword">class </span><a class="code" href="classWavWriter.html">WavWriter</a> {
<a name="l00104"></a>00104 <span class="keyword">public</span>:
<a name="l00105"></a><a class="code" href="classWavWriter.html#a0">00105</a> <a class="code" href="classWavWriter.html#a0">WavWriter</a>(FILE * p_output, <span class="keywordtype">unsigned</span> p_nch, <span class="keywordtype">unsigned</span> p_bps,
<a name="l00106"></a>00106 <span class="keywordtype">unsigned</span> p_srate)
<a name="l00107"></a>00107 : m_file(p_output), m_nch(p_nch), m_bps(p_bps), m_srate(p_srate) {
<a name="l00108"></a>00108 assert(m_bps == 16 || m_bps == 24);
<a name="l00109"></a>00109
<a name="l00110"></a>00110 WriteRaw(<span class="stringliteral">"RIFF"</span>, 4);
<a name="l00111"></a>00111 WriteDword(0); <span class="comment">//fix this in destructor</span>
<a name="l00112"></a>00112
<a name="l00113"></a>00113 WriteRaw(<span class="stringliteral">"WAVE"</span>, 4);
<a name="l00114"></a>00114 WriteRaw(<span class="stringliteral">"fmt "</span>, 4);
<a name="l00115"></a>00115 WriteDword(WFX_SIZE);
<a name="l00116"></a>00116
<a name="l00117"></a>00117 WriteWord(1); <span class="comment">//WAVE_FORMAT_PCM</span>
<a name="l00118"></a>00118 WriteWord(m_nch);
<a name="l00119"></a>00119 WriteDword(m_srate);
<a name="l00120"></a>00120 WriteDword(m_srate * m_nch * (m_bps >> 3));
<a name="l00121"></a>00121 WriteWord(m_nch * (m_bps >> 3));
<a name="l00122"></a>00122 WriteWord(m_bps);
<a name="l00123"></a>00123 <span class="comment">/*</span>
<a name="l00124"></a>00124 <span class="comment"> WORD wFormatTag; </span>
<a name="l00125"></a>00125 <span class="comment"> WORD nChannels; </span>
<a name="l00126"></a>00126 <span class="comment"> DWORD nSamplesPerSec; </span>
<a name="l00127"></a>00127 <span class="comment"> DWORD nAvgBytesPerSec; </span>
<a name="l00128"></a>00128 <span class="comment"> WORD nBlockAlign; </span>
<a name="l00129"></a>00129 <span class="comment"> WORD wBitsPerSample; </span>
<a name="l00130"></a>00130 <span class="comment"> */</span>
<a name="l00131"></a>00131 WriteRaw(<span class="stringliteral">"data"</span>, 4);
<a name="l00132"></a>00132 WriteDword(0); <span class="comment">//fix this in destructor</span>
<a name="l00133"></a>00133
<a name="l00134"></a>00134 m_data_bytes_written = 0;
<a name="l00135"></a><a class="code" href="classWavWriter.html#a1">00135</a> } mpc_bool_t <a class="code" href="classWavWriter.html#a1">WriteSamples</a>(<span class="keyword">const</span> <a class="code" href="math_8h.html#a16">MPC_SAMPLE_FORMAT</a> * p_buffer, <span class="keywordtype">unsigned</span> p_size) {
<a name="l00136"></a>00136 <span class="keywordtype">unsigned</span> n;
<a name="l00137"></a>00137 <span class="keywordtype">int</span> clip_min = -1 << (m_bps - 1),
<a name="l00138"></a>00138 clip_max = (1 << (m_bps - 1)) - 1, float_scale = 1 << (m_bps - 1);
<a name="l00139"></a>00139 <span class="keywordflow">for</span> (n = 0; n < p_size; n++) {
<a name="l00140"></a>00140 <span class="keywordtype">int</span> val;
<a name="l00141"></a>00141 <span class="preprocessor">#ifdef MPC_FIXED_POINT</span>
<a name="l00142"></a>00142 <span class="preprocessor"></span> val =
<a name="l00143"></a>00143 shift_signed(p_buffer[n],
<a name="l00144"></a>00144 m_bps - MPC_FIXED_POINT_SCALE_SHIFT);
<a name="l00145"></a>00145 <span class="preprocessor">#else</span>
<a name="l00146"></a>00146 <span class="preprocessor"></span> val = (int)(p_buffer[n] * float_scale);
<a name="l00147"></a>00147 <span class="preprocessor">#endif</span>
<a name="l00148"></a>00148 <span class="preprocessor"></span> <span class="keywordflow">if</span> (val < clip_min)
<a name="l00149"></a>00149 val = clip_min;
<a name="l00150"></a>00150 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (val > clip_max)
<a name="l00151"></a>00151 val = clip_max;
<a name="l00152"></a>00152 <span class="keywordflow">if</span> (!WriteInt(val, m_bps))
<a name="l00153"></a>00153 <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00154"></a>00154 }
<a name="l00155"></a>00155 m_data_bytes_written += p_size * (m_bps >> 3);
<a name="l00156"></a>00156 <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00157"></a>00157 }
<a name="l00158"></a>00158
<a name="l00159"></a><a class="code" href="classWavWriter.html#a2">00159</a> <a class="code" href="classWavWriter.html#a2">~WavWriter</a>() {
<a name="l00160"></a>00160 <span class="keywordflow">if</span> (m_data_bytes_written & 1) {
<a name="l00161"></a>00161 <span class="keywordtype">char</span> blah = 0;
<a name="l00162"></a>00162 WriteRaw(&blah, 1);
<a name="l00163"></a>00163 m_data_bytes_written++;
<a name="l00164"></a>00164 }
<a name="l00165"></a>00165 Seek(4);
<a name="l00166"></a>00166 WriteDword((<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>)(m_data_bytes_written + 4 + 8 + WFX_SIZE +
<a name="l00167"></a>00167 8));
<a name="l00168"></a>00168 Seek(8 + 4 + 8 + WFX_SIZE + 4);
<a name="l00169"></a>00169 WriteDword(m_data_bytes_written);
<a name="l00170"></a>00170 }
<a name="l00171"></a>00171
<a name="l00172"></a>00172 <span class="keyword">private</span>:
<a name="l00173"></a>00173
<a name="l00174"></a>00174 mpc_bool_t Seek(<span class="keywordtype">unsigned</span> p_offset) {
<a name="l00175"></a>00175 <span class="keywordflow">return</span> !fseek(m_file, p_offset, SEEK_SET);
<a name="l00176"></a>00176 }
<a name="l00177"></a>00177
<a name="l00178"></a>00178 mpc_bool_t WriteRaw(<span class="keyword">const</span> <span class="keywordtype">void</span> *p_buffer, <span class="keywordtype">unsigned</span> p_bytes) {
<a name="l00179"></a>00179 <span class="keywordflow">return</span> fwrite(p_buffer, 1, p_bytes, m_file) == p_bytes;
<a name="l00180"></a>00180 }
<a name="l00181"></a>00181
<a name="l00182"></a>00182 mpc_bool_t WriteDword(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> p_val) {
<a name="l00183"></a>00183 <span class="keywordflow">return</span> WriteInt(p_val, 32);
<a name="l00184"></a>00184 }
<a name="l00185"></a>00185 mpc_bool_t WriteWord(<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> p_val) {
<a name="l00186"></a>00186 <span class="keywordflow">return</span> WriteInt(p_val, 16);
<a name="l00187"></a>00187 }
<a name="l00188"></a>00188
<a name="l00189"></a>00189 <span class="comment">// write a little-endian number properly</span>
<a name="l00190"></a>00190 mpc_bool_t WriteInt(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> p_val, <span class="keywordtype">unsigned</span> p_width_bits) {
<a name="l00191"></a>00191 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> temp;
<a name="l00192"></a>00192 <span class="keywordtype">unsigned</span> shift = 0;
<a name="l00193"></a>00193 assert((p_width_bits % 8) == 0);
<a name="l00194"></a>00194 <span class="keywordflow">do</span> {
<a name="l00195"></a>00195 temp = (<span class="keywordtype">unsigned</span> char)((p_val >> shift) & 0xFF);
<a name="l00196"></a>00196 <span class="keywordflow">if</span> (!WriteRaw(&temp, 1))
<a name="l00197"></a>00197 <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00198"></a>00198 shift += 8;
<a name="l00199"></a>00199 } <span class="keywordflow">while</span> (shift < p_width_bits);
<a name="l00200"></a>00200 <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00201"></a>00201 }
<a name="l00202"></a>00202
<a name="l00203"></a>00203 <span class="keywordtype">unsigned</span> m_nch, m_bps, m_srate;
<a name="l00204"></a>00204 FILE *m_file;
<a name="l00205"></a>00205 <span class="keywordtype">unsigned</span> m_data_bytes_written;
<a name="l00206"></a>00206 };
<a name="l00207"></a>00207
<a name="l00208"></a>00208
<a name="l00209"></a>00209 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00210"></a>00210 usage(<span class="keyword">const</span> <span class="keywordtype">char</span> *exename)
<a name="l00211"></a>00211 {
<a name="l00212"></a>00212 printf
<a name="l00213"></a>00213 (<span class="stringliteral">"Usage: %s <infile.mpc> [<outfile.wav>]\nIf <outfile.wav> is not specified, decoder will run in benchmark mode.\n"</span>,
<a name="l00214"></a>00214 exename);
<a name="l00215"></a>00215 }
<a name="l00216"></a>00216
<a name="l00217"></a>00217 <span class="keywordtype">int</span>
<a name="l00218"></a>00218 main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv)
<a name="l00219"></a>00219 {
<a name="l00220"></a>00220 <span class="keywordflow">if</span> (argc != 2 && argc != 3) {
<a name="l00221"></a>00221 <span class="keywordflow">if</span> (argc > 0)
<a name="l00222"></a>00222 usage(argv[0]);
<a name="l00223"></a>00223 <span class="keywordflow">return</span> 0;
<a name="l00224"></a>00224 }
<a name="l00225"></a>00225
<a name="l00226"></a>00226 FILE *input = fopen(argv[1], <span class="stringliteral">"rb"</span>);
<a name="l00227"></a>00227 FILE *output = 0;
<a name="l00228"></a>00228 <span class="keywordflow">if</span> (input == 0) {
<a name="l00229"></a>00229 usage(argv[0]);
<a name="l00230"></a>00230 printf(<span class="stringliteral">"Error opening input file: \"%s\"\n"</span>, argv[1]);
<a name="l00231"></a>00231 <span class="keywordflow">return</span> 1;
<a name="l00232"></a>00232 }
<a name="l00233"></a>00233
<a name="l00234"></a>00234 <span class="keywordflow">if</span> (argc == 3) {
<a name="l00235"></a>00235 output = fopen(argv[2], <span class="stringliteral">"wb"</span>);
<a name="l00236"></a>00236 <span class="keywordflow">if</span> (output == 0) {
<a name="l00237"></a>00237 fclose(input);
<a name="l00238"></a>00238 usage(argv[0]);
<a name="l00239"></a>00239 printf(<span class="stringliteral">"Error opening output file: \"%s\"\n"</span>, argv[2]);
<a name="l00240"></a>00240 <span class="keywordflow">return</span> 1;
<a name="l00241"></a>00241 }
<a name="l00242"></a>00242 }
<a name="l00243"></a>00243
<a name="l00244"></a>00244 <span class="comment">/* initialize our reader_data tag the reader will carry around with it */</span>
<a name="l00245"></a>00245 <a class="code" href="structreader__data__t.html">reader_data</a> data;
<a name="l00246"></a>00246 data.<a class="code" href="structreader__data__t.html#o0">file</a> = input;
<a name="l00247"></a>00247 data.<a class="code" href="structreader__data__t.html#o2">seekable</a> = <span class="keyword">true</span>;
<a name="l00248"></a>00248 fseek(data.<a class="code" href="structreader__data__t.html#o0">file</a>, 0, SEEK_END);
<a name="l00249"></a>00249 data.<a class="code" href="structreader__data__t.html#o1">size</a> = ftell(data.<a class="code" href="structreader__data__t.html#o0">file</a>);
<a name="l00250"></a>00250 fseek(data.<a class="code" href="structreader__data__t.html#o0">file</a>, 0, SEEK_SET);
<a name="l00251"></a>00251
<a name="l00252"></a>00252 <span class="comment">/* set up an mpc_reader linked to our function implementations */</span>
<a name="l00253"></a>00253 <a class="code" href="structmpc__decoder__t.html">mpc_decoder</a> decoder;
<a name="l00254"></a>00254 <a class="code" href="structmpc__reader__t.html">mpc_reader</a> reader;
<a name="l00255"></a>00255 reader.<a class="code" href="structmpc__reader__t.html#o0">read</a> = read_impl;
<a name="l00256"></a>00256 reader.<a class="code" href="structmpc__reader__t.html#o1">seek</a> = seek_impl;
<a name="l00257"></a>00257 reader.<a class="code" href="structmpc__reader__t.html#o2">tell</a> = tell_impl;
<a name="l00258"></a>00258 reader.<a class="code" href="structmpc__reader__t.html#o3">get_size</a> = get_size_impl;
<a name="l00259"></a>00259 reader.<a class="code" href="structmpc__reader__t.html#o4">canseek</a> = canseek_impl;
<a name="l00260"></a>00260 reader.<a class="code" href="structmpc__reader__t.html#o5">data</a> = &data;
<a name="l00261"></a>00261
<a name="l00262"></a>00262 <span class="comment">/* read file's streaminfo data */</span>
<a name="l00263"></a>00263 <a class="code" href="structmpc__streaminfo.html">mpc_streaminfo</a> info;
<a name="l00264"></a>00264 <a class="code" href="mpcdec_8h.html#a9">mpc_streaminfo_init</a>(&info);
<a name="l00265"></a>00265 <span class="keywordflow">if</span> (<a class="code" href="mpcdec_8h.html#a10">mpc_streaminfo_read</a>(&info, &reader) != <a class="code" href="mpcdec_8h.html#a0">ERROR_CODE_OK</a>) {
<a name="l00266"></a>00266 printf(<span class="stringliteral">"Not a valid musepack file: \"%s\"\n"</span>, argv[1]);
<a name="l00267"></a>00267 <span class="keywordflow">return</span> 1;
<a name="l00268"></a>00268 }
<a name="l00269"></a>00269
<a name="l00270"></a>00270 <span class="comment">/* instantiate a decoder with our file reader */</span>
<a name="l00271"></a>00271 <a class="code" href="mpcdec_8h.html#a13">mpc_decoder_setup</a>(&decoder, &reader);
<a name="l00272"></a>00272 <span class="keywordflow">if</span> (!<a class="code" href="mpcdec_8h.html#a14">mpc_decoder_initialize</a>(&decoder, &info)) {
<a name="l00273"></a>00273 printf(<span class="stringliteral">"Error initializing decoder.\n"</span>, argv[1]);
<a name="l00274"></a>00274 <span class="keywordflow">return</span> 1;
<a name="l00275"></a>00275 }
<a name="l00276"></a>00276
<a name="l00277"></a>00277 <span class="comment">/* decode the file */</span>
<a name="l00278"></a>00278 printf(<span class="stringliteral">"Decoding from:\n%s\nTo:\n%s\n"</span>, argv[1],
<a name="l00279"></a>00279 output ? argv[2] : <span class="stringliteral">"N/A"</span>);
<a name="l00280"></a>00280 <a class="code" href="classWavWriter.html">WavWriter</a> *wavwriter =
<a name="l00281"></a>00281 output ? <span class="keyword">new</span> <a class="code" href="classWavWriter.html">WavWriter</a>(output, 2, 16, info.<a class="code" href="structmpc__streaminfo.html#z1_0">sample_freq</a>) : 0;
<a name="l00282"></a>00282 <a class="code" href="math_8h.html#a16">MPC_SAMPLE_FORMAT</a> sample_buffer[<a class="code" href="mpcdec_8h.html#a21a8">MPC_DECODER_BUFFER_LENGTH</a>];
<a name="l00283"></a>00283 clock_t begin, end;
<a name="l00284"></a>00284 begin = clock();
<a name="l00285"></a>00285 <span class="keywordtype">unsigned</span> total_samples = 0;
<a name="l00286"></a>00286 mpc_bool_t successful = FALSE;
<a name="l00287"></a>00287 <span class="keywordflow">for</span> (;;) {
<a name="l00288"></a>00288 <span class="keywordtype">unsigned</span> status = <a class="code" href="mpcdec_8h.html#a17">mpc_decoder_decode</a>(&decoder, sample_buffer, 0, 0);
<a name="l00289"></a>00289 <span class="keywordflow">if</span> (status == (<span class="keywordtype">unsigned</span>)(-1)) {
<a name="l00290"></a>00290 <span class="comment">//decode error</span>
<a name="l00291"></a>00291 printf(<span class="stringliteral">"Error decoding file.\n"</span>);
<a name="l00292"></a>00292 <span class="keywordflow">break</span>;
<a name="l00293"></a>00293 }
<a name="l00294"></a>00294 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (status == 0) <span class="comment">//EOF</span>
<a name="l00295"></a>00295 {
<a name="l00296"></a>00296 successful = <span class="keyword">true</span>;
<a name="l00297"></a>00297 <span class="keywordflow">break</span>;
<a name="l00298"></a>00298 }
<a name="l00299"></a>00299 <span class="keywordflow">else</span> <span class="comment">//status>0</span>
<a name="l00300"></a>00300 {
<a name="l00301"></a>00301 total_samples += status;
<a name="l00302"></a>00302 <span class="keywordflow">if</span> (wavwriter) {
<a name="l00303"></a>00303 <span class="keywordflow">if</span> (!wavwriter->
<a name="l00304"></a>00304 WriteSamples(sample_buffer, status * <span class="comment">/* stereo */</span> 2)) {
<a name="l00305"></a>00305 printf(<span class="stringliteral">"Write error.\n"</span>);
<a name="l00306"></a>00306 <span class="keywordflow">break</span>;
<a name="l00307"></a>00307 }
<a name="l00308"></a>00308 }
<a name="l00309"></a>00309 }
<a name="l00310"></a>00310 }
<a name="l00311"></a>00311
<a name="l00312"></a>00312 end = clock();
<a name="l00313"></a>00313
<a name="l00314"></a>00314 <span class="keywordflow">if</span> (wavwriter) {
<a name="l00315"></a>00315 <span class="keyword">delete</span> wavwriter;
<a name="l00316"></a>00316 }
<a name="l00317"></a>00317
<a name="l00318"></a>00318 <span class="keywordflow">if</span> (successful) {
<a name="l00319"></a>00319 printf(<span class="stringliteral">"\nFinished.\nTotal samples decoded: %u.\n"</span>, total_samples);
<a name="l00320"></a>00320 <span class="keywordtype">unsigned</span> ms = (end - begin) * 1000 / CLOCKS_PER_SEC;
<a name="l00321"></a>00321 <span class="keywordtype">unsigned</span> ratio =
<a name="l00322"></a>00322 (unsigned)((double)total_samples / (double)info.<a class="code" href="structmpc__streaminfo.html#z1_0">sample_freq</a> /
<a name="l00323"></a>00323 ((double)ms / 1000.0) * 100.0);
<a name="l00324"></a>00324 printf(<span class="stringliteral">"Time: %u ms (%u.%02ux).\n"</span>, ms, ratio / 100, ratio % 100);
<a name="l00325"></a>00325 }
<a name="l00326"></a>00326
<a name="l00327"></a>00327 <span class="keywordflow">return</span> 0;
<a name="l00328"></a>00328 }
</pre></div><hr size="1"><address style="align: right;"><small>Generated on Sun Oct 23 16:35:24 2005 for libmpcdec by
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.4 </small></address>
</body>
</html>
|