examples/SFExamples/oggvorbiscodec/src/tremor/doc/example.html

00001 <html>
00002 
00003 <head>
00004 <title>Tremor - Example Code</title>
00005 <link rel=stylesheet href="style.css" type="text/css">
00006 </head>
00007 
00008 <body bgcolor=white text=black link="#5555ff" alink="#5555ff" vlink="#5555ff">
00009 <table border=0 width=100%>
00010 <tr>
00011 <td><p class=tiny>Tremor documentation</p></td>
00012 <td align=right><p class=tiny>Tremor version 1.0 - 20020403</p></td>
00013 </tr>
00014 </table>
00015 
00016 <h1>Example Code</h1>
00017 
00018 <p>
00019 The following is a run-through of the decoding example program supplied
00020 with libvorbisidec, ivorbisfile_example.c.  
00021 This program takes a vorbis bitstream from stdin and writes raw pcm to stdout.
00022 
00023 <p>
00024 First, relevant headers, including vorbis-specific "ivorbiscodec.h" and "ivorbisfile.h" have to be included.
00025 
00026 <br><br>
00027 <table border=0 width=100% color=black cellspacing=0 cellpadding=7>
00028 <tr bgcolor=#cccccc>
00029         <td>
00030 <pre><b>
00031 #include &lt;stdio.h&gt;
00032 #include &lt;stdlib.h&gt;
00033 #include &lt;math.h&gt;
00034 #include "ivorbiscodec.h"
00035 #include "ivorbisfile.h"
00036 </b></pre>
00037         </td>
00038 </tr>
00039 </table>
00040 <p>
00041 We also have to make a concession to Windows users here.  If we are using windows for decoding, we must declare these libraries so that we can set stdin/stdout to binary.
00042 <br><br>
00043 <table border=0 width=100% color=black cellspacing=0 cellpadding=7>
00044 <tr bgcolor=#cccccc>
00045         <td>
00046 <pre><b>
00047 #ifdef _WIN32
00048 #include &lt;io.h&gt;
00049 #include &lt;fcntl.h&gt;
00050 #endif
00051 </b></pre>
00052         </td>
00053 </tr>
00054 </table>
00055 <p>
00056 Next, a buffer for the pcm audio output is declared.
00057 
00058 <br><br>
00059 <table border=0 width=100% color=black cellspacing=0 cellpadding=7>
00060 <tr bgcolor=#cccccc>
00061         <td>
00062 <pre><b>
00063 char pcmout[4096];
00064 </b></pre>
00065         </td>
00066 </tr>
00067 </table>
00068 
00069 <p>Inside main(), we declare our primary OggVorbis_File structure.  We also declare a few other helpful variables to track out progress within the file.
00070 Also, we make our final concession to Windows users by setting the stdin and stdout to binary mode.
00071 <br><br>
00072 <table border=0 width=100% color=black cellspacing=0 cellpadding=7>
00073 <tr bgcolor=#cccccc>
00074         <td>
00075 <pre><b>
00076 int main(int argc, char **argv){
00077   OggVorbis_File vf;
00078   int eof=0;
00079   int current_section;
00080 
00081 #ifdef _WIN32
00082   _setmode( _fileno( stdin ), _O_BINARY );
00083   _setmode( _fileno( stdout ), _O_BINARY );
00084 #endif
00085 </b></pre>
00086         </td>
00087 </tr>
00088 </table>
00089 
00090 <p><a href="ov_open.html">ov_open()</a> must be
00091 called to initialize the <b>OggVorbis_File</b> structure with default values.  
00092 <a href="ov_open.html">ov_open()</a> also checks to ensure that we're reading Vorbis format and not something else.
00093 
00094 <br><br>
00095 <table border=0 width=100% color=black cellspacing=0 cellpadding=7>
00096 <tr bgcolor=#cccccc>
00097         <td>
00098 <pre><b>
00099   if(ov_open(stdin, &vf, NULL, 0) < 0) {
00100       fprintf(stderr,"Input does not appear to be an Ogg bitstream.\n");
00101       exit(1);
00102   }
00103 
00104 </b></pre>
00105         </td>
00106 </tr>
00107 </table>
00108 
00109 <p>
00110 We're going to pull the channel and bitrate info from the file using <a href="ov_info.html">ov_info()</a> and show them to the user.
00111 We also want to pull out and show the user a comment attached to the file using <a href="ov_comment.html">ov_comment()</a>.
00112 
00113 <br><br>
00114 <table border=0 width=100% color=black cellspacing=0 cellpadding=7>
00115 <tr bgcolor=#cccccc>
00116         <td>
00117 <pre><b>
00118   {
00119     char **ptr=ov_comment(&vf,-1)->user_comments;
00120     vorbis_info *vi=ov_info(&vf,-1);
00121     while(*ptr){
00122       fprintf(stderr,"%s\n",*ptr);
00123       ++ptr;
00124     }
00125     fprintf(stderr,"\nBitstream is %d channel, %ldHz\n",vi->channels,vi->rate);
00126     fprintf(stderr,"\nDecoded length: %ld samples\n",
00127             (long)ov_pcm_total(&vf,-1));
00128     fprintf(stderr,"Encoded by: %s\n\n",ov_comment(&vf,-1)->vendor);
00129   }
00130   
00131 </b></pre>
00132         </td>
00133 </tr>
00134 </table>
00135 
00136 <p>
00137 Here's the read loop:
00138 
00139 <br><br>
00140 <table border=0 width=100% color=black cellspacing=0 cellpadding=7>
00141 <tr bgcolor=#cccccc>
00142         <td>
00143 <pre><b>
00144 
00145   while(!eof){
00146     long ret=ov_read(&vf,pcmout,sizeof(pcmout),&current_section);
00147     if (ret == 0) {
00148       /* EOF */
00149       eof=1;
00150     } else if (ret < 0) {
00151       /* error in the stream.  Not a problem, just reporting it in
00152          case we (the app) cares.  In this case, we don't. */
00153     } else {
00154       /* we don't bother dealing with sample rate changes, etc, but
00155          you'll have to*/
00156       fwrite(pcmout,1,ret,stdout);
00157     }
00158   }
00159 
00160   
00161 </b></pre>
00162         </td>
00163 </tr>
00164 </table>
00165 
00166 <p>
00167 The code is reading blocks of data using <a href="ov_read.html">ov_read()</a>.
00168 Based on the value returned, we know if we're at the end of the file or have invalid data.  If we have valid data, we write it to the pcm output.
00169 
00170 <p>
00171 Now that we've finished playing, we can pack up and go home.  It's important to call <a href="ov_clear.html">ov_clear()</a> when we're finished.
00172 
00173 <br><br>
00174 <table border=0 width=100% color=black cellspacing=0 cellpadding=7>
00175 <tr bgcolor=#cccccc>
00176         <td>
00177 <pre><b>
00178 
00179   ov_clear(&vf);
00180     
00181   fprintf(stderr,"Done.\n");
00182   return(0);
00183 }
00184 </b></pre>
00185         </td>
00186 </tr>
00187 </table>
00188 
00189 <p>
00190 
00191 <br><br>
00192 <hr noshade>
00193 <table border=0 width=100%>
00194 <tr valign=top>
00195 <td><p class=tiny>copyright &copy; 2002 Xiph.org</p></td>
00196 <td align=right><p class=tiny><a href="http://www.xiph.org/ogg/vorbis/">Ogg Vorbis</a></p></td>
00197 </tr><tr>
00198 <td><p class=tiny>Tremor documentation</p></td>
00199 <td align=right><p class=tiny>Tremor version 1.0 - 20020403</p></td>
00200 </tr>
00201 </table>
00202 
00203 </body>
00204 
00205 </html>

Generated by  doxygen 1.6.2