1
1
Fork 0
mirror of https://github.com/QB64Official/qb64.git synced 2024-09-19 19:05:03 +00:00
qb64/internal/c/parts/audio/decode/mp3/misc/mpg123__to__wav_8c_source.shtml

196 lines
No EOL
19 KiB
Text

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"><head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link href="mpg123__to__wav_8c_source_files/02.css" rel="stylesheet" type="text/css">
<meta name="author" content="Michael Hipp &amp; Thomas Orgis">
<meta name="copyright" content="Michael Hipp &amp; Thomas Orgis">
<meta name="publisher" content="Thomas Orgis">
<title>libmpg123: mpg123_to_wav.c Source File</title>
<link href="mpg123__to__wav_8c_source_files/doxygen.css" rel="stylesheet" type="text/css">
</head>
<body>
<div class="center">
<a href="http://www.mpg123.de/index.shtml" title="mpg123 website entry page"><img alt="mpg123 logo" src="mpg123__to__wav_8c_source_files/logo-current.png"></a>
<div>
<a href="http://www.mpg123.de/download.shtml">download</a>
:
<a href="http://www.mpg123.de/cgi-bin/viewvc.cgi">svn</a>
::
<a href="http://www.mpg123.de/features.shtml">features</a>
::
<a href="http://sourceforge.net/projects/mpg123">sf.net project</a>
-
<a href="http://sourceforge.net/tracker/?atid=733194&amp;group_id=135704&amp;func=browse">bug tracker</a>
::
<a href="http://www.mpg123.de/cgi-bin/news.cgi">news archive</a>
</div>
<div>
<a href="http://www.mpg123.de/api/">libmpg123 API</a>
::
<a href="http://www.mpg123.de/hacking.shtml">hacking</a>
::
<a href="http://www.mpg123.de/testing.shtml">testing</a>
::
<a href="http://www.mpg123.de/benchmarking.shtml">benchmarking</a>
::
<a href="http://www.mpg123.de/faq.shtml">FAQ</a>
::
<a href="http://www.mpg123.de/links.shtml">links</a>
::
<a href="http://www.mpg123.de/contact.shtml">contact</a>
</div>
</div>
<div style="padding:1em;">
<strong>Note:</strong>
This API doc is automatically generated from the current development
version that you can get via Subversion or as a daily snapshot from <a href="http://mpg123.org/snapshot">http://mpg123.org/snapshot</a>.
There may be differences (additions) compared to the latest stable release. See <a href="http://mpg123.org/cgi-bin/viewvc.cgi/trunk/NEWS.libmpg123?view=markup">NEWS.libmpg123</a> and the overall <a href="http://mpg123.org/cgi-bin/viewvc.cgi/trunk/NEWS?view=markup">NEWS</a> file on libmpg123 versions and important changes between them.<br>
Let me emphasize that the policy for libmpg123 is to always stay backwards compatible -- only <em>additions</em> are planned (and it's not yet planned to change the plans;-).
</div>
<!-- Generated by Doxygen 1.7.1 -->
<script type="text/javascript"><!--
var searchBox = new SearchBox("searchBox", "search",false,'Search');
--></script>
<div class="header">
<div class="headertitle">
<h1>mpg123_to_wav.c</h1> </div>
</div>
<div class="contents">
<a href="http://www.mpg123.de/api/mpg123__to__wav_8c.shtml">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> mpg123_to_wav.c</span>
<a name="l00003"></a>00003 <span class="comment"></span>
<a name="l00004"></a>00004 <span class="comment"> copyright 2007 by the mpg123 project - free software under the terms of the LGPL 2.1</span>
<a name="l00005"></a>00005 <span class="comment"> see COPYING and AUTHORS files in distribution or http://mpg123.org</span>
<a name="l00006"></a>00006 <span class="comment"> initially written by Nicholas Humfrey</span>
<a name="l00007"></a>00007 <span class="comment">*/</span>
<a name="l00008"></a>00008
<a name="l00009"></a>00009 <span class="preprocessor">#include &lt;stdio.h&gt;</span>
<a name="l00010"></a>00010 <span class="preprocessor">#include &lt;strings.h&gt;</span>
<a name="l00011"></a>00011 <span class="preprocessor">#include &lt;<a class="code" href="http://www.mpg123.de/api/mpg123_8h.shtml">mpg123.h</a>&gt;</span>
<a name="l00012"></a>00012 <span class="preprocessor">#include &lt;sndfile.h&gt;</span>
<a name="l00013"></a>00013
<a name="l00014"></a>00014
<a name="l00015"></a>00015 <span class="keywordtype">void</span> usage()
<a name="l00016"></a>00016 {
<a name="l00017"></a>00017 printf(<span class="stringliteral">"Usage: mpg123_to_wav &lt;input&gt; &lt;output&gt; [s16|f32 [ &lt;buffersize&gt;]]\n"</span>);
<a name="l00018"></a>00018 exit(99);
<a name="l00019"></a>00019 }
<a name="l00020"></a>00020
<a name="l00021"></a>00021 <span class="keywordtype">void</span> cleanup(<a class="code" href="http://www.mpg123.de/api/group__mpg123__init.shtml#ga6728e2839a395f3a07d4514da659faca">mpg123_handle</a> *mh)
<a name="l00022"></a>00022 {
<a name="l00023"></a>00023 <span class="comment">/* It's really to late for error checks here;-) */</span>
<a name="l00024"></a>00024 <a class="code" href="http://www.mpg123.de/api/group__mpg123__input.shtml#ga9648ec0771f8f21646f3215fa97a52bd">mpg123_close</a>(mh);
<a name="l00025"></a>00025 <a class="code" href="http://www.mpg123.de/api/group__mpg123__init.shtml#ga0b289fffd405c287a13283883a5590ff">mpg123_delete</a>(mh);
<a name="l00026"></a>00026 <a class="code" href="http://www.mpg123.de/api/group__mpg123__init.shtml#gaa156beb645b863aed906fc5a279ce56e">mpg123_exit</a>();
<a name="l00027"></a>00027 }
<a name="l00028"></a>00028
<a name="l00029"></a>00029 <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> *argv[])
<a name="l00030"></a>00030 {
<a name="l00031"></a>00031 SNDFILE* sndfile = NULL;
<a name="l00032"></a>00032 SF_INFO sfinfo;
<a name="l00033"></a>00033 <a class="code" href="http://www.mpg123.de/api/group__mpg123__init.shtml#ga6728e2839a395f3a07d4514da659faca">mpg123_handle</a> *mh = NULL;
<a name="l00034"></a>00034 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* buffer = NULL;
<a name="l00035"></a>00035 <span class="keywordtype">size_t</span> buffer_size = 0;
<a name="l00036"></a>00036 <span class="keywordtype">size_t</span> done = 0;
<a name="l00037"></a>00037 <span class="keywordtype">int</span> channels = 0, encoding = 0;
<a name="l00038"></a>00038 <span class="keywordtype">long</span> rate = 0;
<a name="l00039"></a>00039 <span class="keywordtype">int</span> err = MPG123_OK;
<a name="l00040"></a>00040 off_t samples = 0;
<a name="l00041"></a>00041
<a name="l00042"></a>00042 <span class="keywordflow">if</span> (argc&lt;3) usage();
<a name="l00043"></a>00043 printf( <span class="stringliteral">"Input file: %s\n"</span>, argv[1]);
<a name="l00044"></a>00044 printf( <span class="stringliteral">"Output file: %s\n"</span>, argv[2]);
<a name="l00045"></a>00045
<a name="l00046"></a>00046 err = <a class="code" href="http://www.mpg123.de/api/group__mpg123__init.shtml#gab4ec9458b44a971249634b6b5f002b13">mpg123_init</a>();
<a name="l00047"></a>00047 <span class="keywordflow">if</span>(err != <a class="code" href="http://www.mpg123.de/api/group__mpg123__error.shtml#ggac50432012aeaf7c23014de3198dfa5fdaf2a2fd03e8a2cc34d676f1a416f482e0">MPG123_OK</a> || (mh = <a class="code" href="http://www.mpg123.de/api/group__mpg123__init.shtml#ga16294920e5b0889d1a9a5f44acc95bcb">mpg123_new</a>(NULL, &amp;err)) == NULL)
<a name="l00048"></a>00048 {
<a name="l00049"></a>00049 fprintf(stderr, <span class="stringliteral">"Basic setup goes wrong: %s"</span>, <a class="code" href="http://www.mpg123.de/api/group__mpg123__error.shtml#ga0d5be9516e74a2e979b741987383e163">mpg123_plain_strerror</a>(err));
<a name="l00050"></a>00050 cleanup(mh);
<a name="l00051"></a>00051 <span class="keywordflow">return</span> -1;
<a name="l00052"></a>00052 }
<a name="l00053"></a>00053
<a name="l00054"></a>00054 <span class="comment">/* Simple hack to enable floating point output. */</span>
<a name="l00055"></a>00055 <span class="keywordflow">if</span>(argc &gt;= 4 &amp;&amp; !strcmp(argv[3], <span class="stringliteral">"f32"</span>)) <a class="code" href="http://www.mpg123.de/api/group__mpg123__init.shtml#gace722e63ce9a280a7bc81f689579e2d1">mpg123_param</a>(mh, <a class="code" href="http://www.mpg123.de/api/group__mpg123__init.shtml#gga73a8ff3363028b89afc72b3ea032b9cba827123f9e1f1632205edf3cc2ffcbc57">MPG123_ADD_FLAGS</a>, <a class="code" href="http://www.mpg123.de/api/group__mpg123__init.shtml#gga12f1bf1105a9b0c1501b20516a9719d4a14f7a0feff933f06ae34db03d73aa1db">MPG123_FORCE_FLOAT</a>, 0.);
<a name="l00056"></a>00056
<a name="l00057"></a>00057 <span class="comment">/* Let mpg123 work with the file, that excludes MPG123_NEED_MORE messages. */</span>
<a name="l00058"></a>00058 <span class="keywordflow">if</span>( <a class="code" href="http://www.mpg123.de/api/group__mpg123__input.shtml#ga92823034f354dd58b11ac7adace153c5">mpg123_open</a>(mh, argv[1]) != <a class="code" href="http://www.mpg123.de/api/group__mpg123__error.shtml#ggac50432012aeaf7c23014de3198dfa5fdaf2a2fd03e8a2cc34d676f1a416f482e0">MPG123_OK</a>
<a name="l00059"></a>00059 <span class="comment">/* Peek into track and get first output format. */</span>
<a name="l00060"></a>00060 || <a class="code" href="http://www.mpg123.de/api/group__mpg123__output.shtml#ga3becc3c7115b0bf57cfb25f30391c448">mpg123_getformat</a>(mh, &amp;rate, &amp;channels, &amp;encoding) != <a class="code" href="http://www.mpg123.de/api/group__mpg123__error.shtml#ggac50432012aeaf7c23014de3198dfa5fdaf2a2fd03e8a2cc34d676f1a416f482e0">MPG123_OK</a> )
<a name="l00061"></a>00061 {
<a name="l00062"></a>00062 fprintf( stderr, <span class="stringliteral">"Trouble with mpg123: %s\n"</span>, <a class="code" href="http://www.mpg123.de/api/group__mpg123__error.shtml#ga1ec2703febfdf074b8e78c575b704e61">mpg123_strerror</a>(mh) );
<a name="l00063"></a>00063 cleanup(mh);
<a name="l00064"></a>00064 <span class="keywordflow">return</span> -1;
<a name="l00065"></a>00065 }
<a name="l00066"></a>00066
<a name="l00067"></a>00067 <span class="keywordflow">if</span>(encoding != <a class="code" href="http://www.mpg123.de/api/group__mpg123__output.shtml#ggafc8cdd60a8d3c30a09249869d835c634a0bbd04130b54eb8e4b336e8551459279">MPG123_ENC_SIGNED_16</a> &amp;&amp; encoding != <a class="code" href="http://www.mpg123.de/api/group__mpg123__output.shtml#ggafc8cdd60a8d3c30a09249869d835c634afee3f81a5b7f53cd8a1613e05b942fd7">MPG123_ENC_FLOAT_32</a>)
<a name="l00068"></a>00068 { <span class="comment">/* Signed 16 is the default output format anyways; it would actually by only different if we forced it.</span>
<a name="l00069"></a>00069 <span class="comment"> So this check is here just for this explanation. */</span>
<a name="l00070"></a>00070 cleanup(mh);
<a name="l00071"></a>00071 fprintf(stderr, <span class="stringliteral">"Bad encoding: 0x%x!\n"</span>, encoding);
<a name="l00072"></a>00072 <span class="keywordflow">return</span> -2;
<a name="l00073"></a>00073 }
<a name="l00074"></a>00074 <span class="comment">/* Ensure that this output format will not change (it could, when we allow it). */</span>
<a name="l00075"></a>00075 <a class="code" href="http://www.mpg123.de/api/group__mpg123__output.shtml#ga187d1ae72e014925639ba5af532d7d2f">mpg123_format_none</a>(mh);
<a name="l00076"></a>00076 <a class="code" href="http://www.mpg123.de/api/group__mpg123__output.shtml#gadedc4685ecc8ca298d71e31d0d0d9bfb">mpg123_format</a>(mh, rate, channels, encoding);
<a name="l00077"></a>00077
<a name="l00078"></a>00078 bzero(&amp;sfinfo, <span class="keyword">sizeof</span>(sfinfo) );
<a name="l00079"></a>00079 sfinfo.samplerate = rate;
<a name="l00080"></a>00080 sfinfo.channels = channels;
<a name="l00081"></a>00081 sfinfo.format = SF_FORMAT_WAV|(encoding == <a class="code" href="http://www.mpg123.de/api/group__mpg123__output.shtml#ggafc8cdd60a8d3c30a09249869d835c634a0bbd04130b54eb8e4b336e8551459279">MPG123_ENC_SIGNED_16</a> ? SF_FORMAT_PCM_16 : SF_FORMAT_FLOAT);
<a name="l00082"></a>00082 printf(<span class="stringliteral">"Creating WAV with %i channels and %liHz.\n"</span>, channels, rate);
<a name="l00083"></a>00083
<a name="l00084"></a>00084 sndfile = sf_open(argv[2], SFM_WRITE, &amp;sfinfo);
<a name="l00085"></a>00085 <span class="keywordflow">if</span>(sndfile == NULL){ fprintf(stderr, <span class="stringliteral">"Cannot open output file!\n"</span>); cleanup(mh); <span class="keywordflow">return</span> -2; }
<a name="l00086"></a>00086
<a name="l00087"></a>00087 <span class="comment">/* Buffer could be almost any size here, mpg123_outblock() is just some recommendation.</span>
<a name="l00088"></a>00088 <span class="comment"> Important, especially for sndfile writing, is that the size is a multiple of sample size. */</span>
<a name="l00089"></a>00089 buffer_size = argc &gt;= 5 ? atol(argv[4]) : <a class="code" href="http://www.mpg123.de/api/group__mpg123__lowio.shtml#ga9e300b83abb001f09fa6f9fb6769912a">mpg123_outblock</a>(mh);
<a name="l00090"></a>00090 buffer = malloc( buffer_size );
<a name="l00091"></a>00091
<a name="l00092"></a>00092 <span class="keywordflow">do</span>
<a name="l00093"></a>00093 {
<a name="l00094"></a>00094 sf_count_t more_samples;
<a name="l00095"></a>00095 err = <a class="code" href="http://www.mpg123.de/api/group__mpg123__input.shtml#ga2777c4c390a18fe289f2a491fa390707">mpg123_read</a>( mh, buffer, buffer_size, &amp;done );
<a name="l00096"></a>00096 more_samples = encoding == <a class="code" href="http://www.mpg123.de/api/group__mpg123__output.shtml#ggafc8cdd60a8d3c30a09249869d835c634a0bbd04130b54eb8e4b336e8551459279">MPG123_ENC_SIGNED_16</a>
<a name="l00097"></a>00097 ? sf_write_short(sndfile, (<span class="keywordtype">short</span>*)buffer, done/<span class="keyword">sizeof</span>(<span class="keywordtype">short</span>))
<a name="l00098"></a>00098 : sf_write_float(sndfile, (float*)buffer, done/sizeof(float));
<a name="l00099"></a>00099 <span class="keywordflow">if</span>(more_samples &lt; 0 || more_samples*<a class="code" href="http://www.mpg123.de/api/group__mpg123__output.shtml#gae36f200d7e13ab9c735c5f06870d8984">mpg123_encsize</a>(encoding) != done)
<a name="l00100"></a>00100 {
<a name="l00101"></a>00101 fprintf(stderr, <span class="stringliteral">"Warning: Written number of samples does not match the byte count we got from libmpg123: %li != %li\n"</span>, (<span class="keywordtype">long</span>)(more_samples*<a class="code" href="http://www.mpg123.de/api/group__mpg123__output.shtml#gae36f200d7e13ab9c735c5f06870d8984">mpg123_encsize</a>(encoding)), (<span class="keywordtype">long</span>)done);
<a name="l00102"></a>00102 }
<a name="l00103"></a>00103 samples += more_samples;
<a name="l00104"></a>00104 <span class="comment">/* We are not in feeder mode, so MPG123_OK, MPG123_ERR and MPG123_NEW_FORMAT are the only possibilities.</span>
<a name="l00105"></a>00105 <span class="comment"> We do not handle a new format, MPG123_DONE is the end... so abort on anything not MPG123_OK. */</span>
<a name="l00106"></a>00106 } <span class="keywordflow">while</span> (err==<a class="code" href="http://www.mpg123.de/api/group__mpg123__error.shtml#ggac50432012aeaf7c23014de3198dfa5fdaf2a2fd03e8a2cc34d676f1a416f482e0">MPG123_OK</a>);
<a name="l00107"></a>00107
<a name="l00108"></a>00108 <span class="keywordflow">if</span>(err != <a class="code" href="http://www.mpg123.de/api/group__mpg123__error.shtml#ggac50432012aeaf7c23014de3198dfa5fdaa70ae24fcae9de17ba5d7196898557ba">MPG123_DONE</a>)
<a name="l00109"></a>00109 fprintf( stderr, <span class="stringliteral">"Warning: Decoding ended prematurely because: %s\n"</span>,
<a name="l00110"></a>00110 err == <a class="code" href="http://www.mpg123.de/api/group__mpg123__error.shtml#ggac50432012aeaf7c23014de3198dfa5fda416b4ef6c8cdc461fe210327819192cd">MPG123_ERR</a> ? <a class="code" href="http://www.mpg123.de/api/group__mpg123__error.shtml#ga1ec2703febfdf074b8e78c575b704e61">mpg123_strerror</a>(mh) : <a class="code" href="http://www.mpg123.de/api/group__mpg123__error.shtml#ga0d5be9516e74a2e979b741987383e163">mpg123_plain_strerror</a>(err) );
<a name="l00111"></a>00111
<a name="l00112"></a>00112 sf_close( sndfile );
<a name="l00113"></a>00113
<a name="l00114"></a>00114 samples /= channels;
<a name="l00115"></a>00115 printf(<span class="stringliteral">"%li samples written.\n"</span>, (<span class="keywordtype">long</span>)samples);
<a name="l00116"></a>00116 cleanup(mh);
<a name="l00117"></a>00117 <span class="keywordflow">return</span> 0;
<a name="l00118"></a>00118 }
</pre></div></div>
<!--- window showing the filter options -->
<div id="MSearchSelectWindow" onmouseover="return searchBox.OnSearchSelectShow()" onmouseout="return searchBox.OnSearchSelectHide()" onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&nbsp;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&nbsp;</span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&nbsp;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&nbsp;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&nbsp;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&nbsp;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&nbsp;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&nbsp;</span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark">&nbsp;</span>Defines</a></div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="" name="MSearchResults" id="MSearchResults" frameborder="0">
</iframe>
</div>
<hr class="footer"><address class="footer"><small>Generated on Thu May 3 2012 09:49:21 for libmpg123 by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="mpg123__to__wav_8c_source_files/doxygen.png" alt="doxygen"></a> 1.7.1 </small></address>
</body></html>