misc/libtremor/tremor/ivorbisfile_example.c
changeset 9371 f3840de881bd
parent 9370 328264029b6e
child 9372 915436ff64ab
equal deleted inserted replaced
9370:328264029b6e 9371:f3840de881bd
     1 /********************************************************************
       
     2  *                                                                  *
       
     3  * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE.   *
       
     4  *                                                                  *
       
     5  * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
       
     6  * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
       
     7  * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
       
     8  *                                                                  *
       
     9  * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002    *
       
    10  * BY THE Xiph.Org FOUNDATION http://www.xiph.org/                  *
       
    11  *                                                                  *
       
    12  ********************************************************************
       
    13 
       
    14  function: simple example decoder using vorbisidec
       
    15 
       
    16  ********************************************************************/
       
    17 
       
    18 /* Takes a vorbis bitstream from stdin and writes raw stereo PCM to
       
    19    stdout using vorbisfile. Using vorbisfile is much simpler than
       
    20    dealing with libvorbis. */
       
    21 
       
    22 #include <stdio.h>
       
    23 #include <stdlib.h>
       
    24 #include <vorbis/ivorbiscodec.h>
       
    25 #include <vorbis/ivorbisfile.h>
       
    26 
       
    27 #ifdef _WIN32 /* We need the following two to set stdin/stdout to binary */
       
    28 #include <io.h>
       
    29 #include <fcntl.h>
       
    30 #endif
       
    31 
       
    32 char pcmout[4096]; /* take 4k out of the data segment, not the stack */
       
    33 
       
    34 int main(){
       
    35   OggVorbis_File vf;
       
    36   int eof=0;
       
    37   int current_section;
       
    38 
       
    39 #ifdef _WIN32 /* We need to set stdin/stdout to binary mode. Damn windows. */
       
    40   /* Beware the evil ifdef. We avoid these where we can, but this one we 
       
    41      cannot. Don't add any more, you'll probably go to hell if you do. */
       
    42   _setmode( _fileno( stdin ), _O_BINARY );
       
    43   _setmode( _fileno( stdout ), _O_BINARY );
       
    44 #endif
       
    45 
       
    46   if(ov_open(stdin, &vf, NULL, 0) < 0) {
       
    47       fprintf(stderr,"Input does not appear to be an Ogg bitstream.\n");
       
    48       exit(1);
       
    49   }
       
    50 
       
    51   /* Throw the comments plus a few lines about the bitstream we're
       
    52      decoding */
       
    53   {
       
    54     char **ptr=ov_comment(&vf,-1)->user_comments;
       
    55     vorbis_info *vi=ov_info(&vf,-1);
       
    56     while(*ptr){
       
    57       fprintf(stderr,"%s\n",*ptr);
       
    58       ++ptr;
       
    59     }
       
    60     fprintf(stderr,"\nBitstream is %d channel, %ldHz\n",vi->channels,vi->rate);
       
    61     fprintf(stderr,"\nDecoded length: %ld samples\n",
       
    62 	    (long)ov_pcm_total(&vf,-1));
       
    63     fprintf(stderr,"Encoded by: %s\n\n",ov_comment(&vf,-1)->vendor);
       
    64   }
       
    65   
       
    66   while(!eof){
       
    67     long ret=ov_read(&vf,pcmout,sizeof(pcmout),&current_section);
       
    68     if (ret == 0) {
       
    69       /* EOF */
       
    70       eof=1;
       
    71     } else if (ret < 0) {
       
    72       /* error in the stream.  Not a problem, just reporting it in
       
    73 	 case we (the app) cares.  In this case, we don't. */
       
    74     } else {
       
    75       /* we don't bother dealing with sample rate changes, etc, but
       
    76 	 you'll have to*/
       
    77       fwrite(pcmout,1,ret,stdout);
       
    78     }
       
    79   }
       
    80 
       
    81   /* cleanup */
       
    82   ov_clear(&vf);
       
    83     
       
    84   fprintf(stderr,"Done.\n");
       
    85   return(0);
       
    86 }