parse.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:26k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #ifdef LAMEPARSE
  2. #include "util.h"
  3. #include "id3tag.h"
  4. #include "get_audio.h"
  5. #include "brhist.h"
  6. #include "version.h"
  7. #define         MAX_NAME_SIZE           300
  8.   char    inPath[MAX_NAME_SIZE];
  9.   char    outPath[MAX_NAME_SIZE];
  10. /************************************************************************
  11. *
  12. * usage
  13. *
  14. * PURPOSE:  Writes command line syntax to the file specified by #stderr#
  15. *
  16. ************************************************************************/
  17. void lame_usage(lame_global_flags *gfp,char *name)  /* print syntax & exit */
  18. {
  19.   lame_print_version(stderr);
  20.   fprintf(stderr,"n");
  21.   fprintf(stderr,"USAGE   :  %s [options] <infile> [outfile]n",name);
  22.   fprintf(stderr,"n<infile> and/or <outfile> can be "-", which means stdin/stdout.n");
  23.   fprintf(stderr,"n");
  24.   fprintf(stderr,"Try "%s --help" for more informationn",name);
  25.   exit(1);
  26. }
  27. /************************************************************************
  28. *
  29. * usage
  30. *
  31. * PURPOSE:  Writes command line syntax to the file specified by #stdout#
  32. *
  33. ************************************************************************/
  34. void lame_help(lame_global_flags *gfp,char *name)  /* print syntax & exit */
  35. {
  36.   lame_print_version(stdout);
  37.   fprintf(stdout,"n");
  38.   fprintf(stdout,"USAGE   :  %s [options] <infile> [outfile]n",name);
  39.   fprintf(stdout,"n<infile> and/or <outfile> can be "-", which means stdin/stdout.n");
  40.   fprintf(stdout,"n");
  41.   fprintf(stdout,"OPTIONS :n");
  42.   fprintf(stdout,"  Input options:n");
  43.   fprintf(stdout,"    -r              input is raw pcmn");
  44.   fprintf(stdout,"    -x              force byte-swapping of inputn");
  45.   fprintf(stdout,"    -s sfreq        sampling frequency of input file(kHz) - default 44.1kHzn");
  46.   fprintf(stdout,"    --mp3input      input file is a MP3 filen");
  47.   fprintf(stdout,"n");
  48.   fprintf(stdout,"  Filter options:n");
  49.   fprintf(stdout,"    -k              keep ALL frequencies (disables all filters)n");
  50.   fprintf(stdout,"  --lowpass freq         frequency(kHz), lowpass filter cutoff above freqn");
  51.   fprintf(stdout,"  --lowpass-width freq   frequency(kHz) - default 15%% of lowpass freqn");
  52.   fprintf(stdout,"  --highpass freq        frequency(kHz), highpass filter cutoff below freqn");
  53.   fprintf(stdout,"  --highpass-width freq  frequency(kHz) - default 15%% of highpass freqn");
  54.   fprintf(stdout,"  --resample sfreq  sampling frequency of output file(kHz)- default=input sfreqn");
  55.   fprintf(stdout,"  --cwlimit freq    compute tonality up to freq (in kHz) default 8.8717n");
  56.   fprintf(stdout,"n");
  57.   fprintf(stdout,"  Operational options:n");
  58.   fprintf(stdout,"    -m mode         (s)tereo, (j)oint, (f)orce or (m)ono  (default j)n");
  59.   fprintf(stdout,"                    force = force ms_stereo on all frames. Fastern");
  60.   fprintf(stdout,"    -a              downmix from stereo to mono file for mono encodingn");
  61.   fprintf(stdout,"    -d              allow channels to have different blocktypesn");
  62.   fprintf(stdout,"    -S              don't print progress report, VBR histogramsn");
  63.   fprintf(stdout,"    --athonly       only use the ATH for maskingn");
  64.   fprintf(stdout,"    --noath         disable the ATH for maskingn");
  65.   fprintf(stdout,"    --noshort       do not use short blocksn");
  66.   fprintf(stdout,"    --voice         experimental voice moden");
  67.   fprintf(stdout,"    --preset type   type must be phone, voice, fm, tape, hifi, cd or studion");
  68.   fprintf(stdout,"                    help gives some more infos on thesen");
  69.   fprintf(stdout,"n");
  70.   fprintf(stdout,"  CBR (constant bitrate, the default) options:n");
  71.   fprintf(stdout,"    -h              higher quality, but a little slower.  Recommended.n");
  72.   fprintf(stdout,"    -f              fast mode (very low quality)n");
  73.   fprintf(stdout,"    -b bitrate      set the bitrate, default 128kbpsn");
  74.   fprintf(stdout,"n");
  75.   fprintf(stdout,"  VBR options:n");
  76.   fprintf(stdout,"    -v              use variable bitrate (VBR)n");
  77.   fprintf(stdout,"    -V n            quality setting for VBR.  default n=%in",gfp->VBR_q);
  78.   fprintf(stdout,"                    0=high quality,bigger files. 9=smaller filesn");
  79.   fprintf(stdout,"    -b bitrate      specify minimum allowed bitrate, default 32kbsn");
  80.   fprintf(stdout,"    -B bitrate      specify maximum allowed bitrate, default 256kbsn");
  81.   fprintf(stdout,"    -t              disable Xing VBR informational tagn");
  82.   fprintf(stdout,"    --nohist        disable VBR histogram displayn");
  83.   fprintf(stdout,"n");
  84.   fprintf(stdout,"  MP3 header/stream options:n");
  85.   fprintf(stdout,"    -e emp          de-emphasis n/5/c  (obsolete)n");
  86.   fprintf(stdout,"    -c              mark as copyrightn");
  87.   fprintf(stdout,"    -o              mark as non-originaln");
  88.   fprintf(stdout,"    -p              error protection.  adds 16bit checksum to every framen");
  89.   fprintf(stdout,"                    (the checksum is computed correctly)n");
  90.   fprintf(stdout,"    --nores         disable the bit reservoirn");
  91.   fprintf(stdout,"n");
  92.   fprintf(stdout,"  Specifying any of the following options will add an ID3 tag:n");
  93.   fprintf(stdout,"     --tt "title"     title of song (max 30 chars)n");
  94.   fprintf(stdout,"     --ta "artist"    artist who did the song (max 30 chars)n");
  95.   fprintf(stdout,"     --tl "album"     album where it came from (max 30 chars)n");
  96.   fprintf(stdout,"     --ty "year"      year in which the song/album was made (max 4 chars)n");
  97.   fprintf(stdout,"     --tc "comment"   additional info (max 30 chars)n");
  98.   fprintf(stdout,"                      (or max 28 chars if using the "track" option)n");
  99.   fprintf(stdout,"     --tn "track"     track number of the song on the CD (1 to 99)n");
  100.   fprintf(stdout,"                      (using this option will add an ID3v1.1 tag)n");
  101.   fprintf(stdout,"     --tg "genre"     genre of song (name or number)n");
  102.   fprintf(stdout,"n");
  103. #ifdef HAVEGTK
  104.   fprintf(stdout,"    -g              run graphical analysis on <infile>n");
  105. #endif
  106.   display_bitrates(stdout);
  107.   exit(0);
  108. }
  109. /************************************************************************
  110. *
  111. * usage
  112. *
  113. * PURPOSE:  Writes presetting info to #stdout#
  114. *
  115. ************************************************************************/
  116. void lame_presets_info(lame_global_flags *gfp,char *name)  /* print syntax & exit */
  117. {
  118.   lame_print_version(stdout);
  119.   fprintf(stdout,"n");
  120.   fprintf(stdout,"Presets are some shortcuts for common settings.n");
  121.   fprintf(stdout,"They can be combined with -v if you want VBR MP3s.n");
  122.   fprintf(stdout,"n");
  123.   fprintf(stdout,"  --preset phone    =>  --resample      16n");
  124.   fprintf(stdout,"                        --highpass       0.260n");
  125.   fprintf(stdout,"                        --highpasswidth  0.040n");
  126.   fprintf(stdout,"                        --lowpass        3.700n");
  127.   fprintf(stdout,"                        --lowpasswidth   0.300n");
  128.   fprintf(stdout,"                        --noshortn");
  129.   fprintf(stdout,"                        -m   mn");
  130.   fprintf(stdout,"                        -b  16n");
  131.   fprintf(stdout,"                  plus  -b   8  \n");
  132.   fprintf(stdout,"                        -B  56   > in combination with -vn");
  133.   fprintf(stdout,"                        -V   5  /n");
  134.   fprintf(stdout,"n");
  135.   fprintf(stdout,"  --preset voice:   =>  --resample      24n");
  136.   fprintf(stdout,"                        --highpass       0.100n");
  137.   fprintf(stdout,"                        --highpasswidth  0.020n");
  138.   fprintf(stdout,"                        --lowpass       11n");
  139.   fprintf(stdout,"                        --lowpasswidth   2n");
  140.   fprintf(stdout,"                        --noshortn");
  141.   fprintf(stdout,"                        -m   mn");
  142.   fprintf(stdout,"                        -b  32n");
  143.   fprintf(stdout,"                  plus  -b   8  \n");
  144.   fprintf(stdout,"                        -B  96   > in combination with -vn");
  145.   fprintf(stdout,"                        -V   4  /n");
  146.   fprintf(stdout,"n");
  147.   fprintf(stdout,"  --preset fm:      =>  --resample      32n");
  148.   fprintf(stdout,"                        --highpass       0.030n");
  149.   fprintf(stdout,"                        --highpasswidth  0n");
  150.   fprintf(stdout,"                        --lowpass       11.4n");
  151.   fprintf(stdout,"                        --lowpasswidth   0n");
  152.   fprintf(stdout,"                        -m   jn");
  153.   fprintf(stdout,"                        -b  96n");
  154.   fprintf(stdout,"                  plus  -b  32  \n");
  155.   fprintf(stdout,"                        -B 192   > in combination with -vn");
  156.   fprintf(stdout,"                        -V   4  /n");
  157.   fprintf(stdout,"n");
  158.   fprintf(stdout,"  --preset tape:    =>  --lowpass       17n");
  159.   fprintf(stdout,"                        --lowpasswidth   2n");
  160.   fprintf(stdout,"                        --highpass       0.015n");
  161.   fprintf(stdout,"                        --highpasswidth  0.015n");
  162.   fprintf(stdout,"                        -m   jn");
  163.   fprintf(stdout,"                        -b 128n");
  164.   fprintf(stdout,"                  plus  -b  32  \n");
  165.   fprintf(stdout,"                        -B 192   > in combination with -vn");
  166.   fprintf(stdout,"                        -V   4  /n");
  167.   fprintf(stdout,"n");
  168.   fprintf(stdout,"  --preset hifi:    =>  --lowpass       20n");
  169.   fprintf(stdout,"                        --lowpasswidth   3n");
  170.   fprintf(stdout,"                        --highpass       0.015n");
  171.   fprintf(stdout,"                        --highpasswidth  0.015n");
  172.   fprintf(stdout,"                        -hn");
  173.   fprintf(stdout,"                        -m   jn");
  174.   fprintf(stdout,"                        -b 160n");
  175.   fprintf(stdout,"                  plus  -b  32  \n");
  176.   fprintf(stdout,"                        -B 224   > in combination with -vn");
  177.   fprintf(stdout,"                        -V   3  /n");
  178.   fprintf(stdout,"n");
  179.   fprintf(stdout,"  --preset cd:      =>  -kn");
  180.   fprintf(stdout,"                        -hn");
  181.   fprintf(stdout,"                        -m   sn");
  182.   fprintf(stdout,"                        -b 192n");
  183.   fprintf(stdout,"                  plus  -b  80  \n");
  184.   fprintf(stdout,"                        -B 256   > in combination with -vn");
  185.   fprintf(stdout,"                        -V   2  /n");
  186.   fprintf(stdout,"n");
  187.   fprintf(stdout,"  --preset studio:  =>  -kn");
  188.   fprintf(stdout,"                        -hn");
  189.   fprintf(stdout,"                        -m   sn");
  190.   fprintf(stdout,"                        -b 256n");
  191.   fprintf(stdout,"                  plus  -b 112  \n");
  192.   fprintf(stdout,"                        -B 320   > in combination with -vn");
  193.   fprintf(stdout,"                        -V   0  /n");
  194.   fprintf(stdout,"n");
  195.   exit(0);
  196. }
  197. /************************************************************************
  198. *
  199. * parse_args
  200. *
  201. * PURPOSE:  Sets encoding parameters to the specifications of the
  202. * command line.  Default settings are used for parameters
  203. * not specified in the command line.
  204. *
  205. * If the input file is in WAVE or AIFF format, the sampling frequency is read
  206. * from the AIFF header.
  207. *
  208. * The input and output filenames are read into #inpath# and #outpath#.
  209. *
  210. ************************************************************************/
  211. void lame_parse_args(lame_global_flags *gfp,int argc, char **argv)
  212. {
  213.   FLOAT srate;
  214.   int   err = 0, i = 0;
  215.   int autoconvert=0;
  216.   int user_quality=0;
  217.   char *programName = argv[0]; 
  218.   int track = 0;
  219.   inPath[0] = '';   
  220.   outPath[0] = '';
  221.   gfp->inPath=inPath;
  222.   gfp->outPath=outPath;
  223.   id3_inittag(&id3tag);
  224.   id3tag.used = 0;
  225.   /* process args */
  226.   while(++i<argc && err == 0) {
  227.     char c, *token, *arg, *nextArg;
  228.     int  argUsed;
  229.     
  230.     token = argv[i];
  231.     if(*token++ == '-') {
  232.       if(i+1 < argc) nextArg = argv[i+1];
  233.       else           nextArg = "";
  234.       argUsed = 0;
  235.       if (! *token) {
  236. /* The user wants to use stdin and/or stdout. */
  237. if(inPath[0] == '')       strncpy(inPath, argv[i],MAX_NAME_SIZE);
  238. else if(outPath[0] == '') strncpy(outPath, argv[i],MAX_NAME_SIZE);
  239.       } 
  240.       if (*token == '-') {
  241. /* GNU style */
  242. token++;
  243. if (strcmp(token, "resample")==0) {
  244.   argUsed=1;
  245.   srate = atof( nextArg );
  246.   /* samplerate = rint( 1000.0 * srate ); $A  */
  247.   gfp->out_samplerate =  (( 1000.0 * srate ) + 0.5);
  248.   if (srate  < 1) {
  249.     fprintf(stderr,"Must specify a samplerate with --resamplen");
  250.     exit(1);
  251.   }
  252. }
  253. else if (strcmp(token, "mp3input")==0) {
  254.   gfp->input_format=sf_mp3;
  255. }
  256. else if (strcmp(token, "voice")==0) {
  257.   gfp->lowpassfreq=12000;
  258.   gfp->VBR_max_bitrate_kbps=160;
  259.   gfp->no_short_blocks=1;
  260. }
  261. else if (strcmp(token, "noshort")==0) {
  262.   gfp->no_short_blocks=1;
  263. }
  264. else if (strcmp(token, "noath")==0) {
  265.   gfp->noATH=1;
  266. }
  267. else if (strcmp(token, "nores")==0) {
  268.   gfp->disable_reservoir=1;
  269.   gfp->padding=0;
  270. }
  271. else if (strcmp(token, "athonly")==0) {
  272.   gfp->ATHonly=1;
  273. }
  274. else if (strcmp(token, "nohist")==0) {
  275. #ifdef BRHIST
  276.   disp_brhist = 0;
  277. #endif
  278. }
  279. /* options for ID3 tag */
  280.   else if (strcmp(token, "tt")==0) {
  281.   id3tag.used=1;      argUsed = 1;
  282.    strncpy(id3tag.title, nextArg, 30);
  283.   }
  284.   else if (strcmp(token, "ta")==0) {
  285.   id3tag.used=1; argUsed = 1;
  286.    strncpy(id3tag.artist, nextArg, 30);
  287.   }
  288.   else if (strcmp(token, "tl")==0) {
  289.   id3tag.used=1; argUsed = 1;
  290.    strncpy(id3tag.album, nextArg, 30);
  291.   }
  292.   else if (strcmp(token, "ty")==0) {
  293.   id3tag.used=1; argUsed = 1;
  294.    strncpy(id3tag.year, nextArg, 4);
  295.   }
  296.   else if (strcmp(token, "tc")==0) {
  297.   id3tag.used=1; argUsed = 1;
  298.    strncpy(id3tag.comment, nextArg, 30);
  299.   }
  300.   else if (strcmp(token, "tn")==0) {
  301.   id3tag.used=1; argUsed = 1;
  302.    track = atoi(nextArg);
  303.    if (track < 1) { track = 1; }
  304.    if (track > 99) { track = 99; }
  305.    id3tag.track = track;
  306.   }
  307.   else if (strcmp(token, "tg")==0) {
  308. argUsed = strtol (nextArg, &token, 10);
  309. if (nextArg==token) {
  310.   /* Genere was given as a string, so it's number*/
  311.   for (argUsed=0; argUsed<=genre_last; argUsed++) {
  312.     if (!strcmp (genre_list[argUsed], nextArg)) { break; }
  313.   }
  314.   }
  315. if (argUsed>genre_last) { 
  316.   argUsed=255; 
  317.   fprintf(stderr,"Unknown genre: %s.  Specifiy genre number n", nextArg);
  318. }
  319.         argUsed &= 255; c=(char)(argUsed);
  320.   id3tag.used=1; argUsed = 1;
  321.    strncpy(id3tag.genre, &c, 1);
  322.        }
  323. else if (strcmp(token, "lowpass")==0) {
  324.   argUsed=1;
  325.   gfp->lowpassfreq =  (( 1000.0 * atof( nextArg ) ) + 0.5);
  326.   if (gfp->lowpassfreq  < 1) {
  327.     fprintf(stderr,"Must specify lowpass with --lowpass freq, freq >= 0.001 kHzn");
  328.     exit(1);
  329.   }
  330. }
  331. else if (strcmp(token, "lowpass-width")==0) {
  332.   argUsed=1;
  333.   gfp->lowpasswidth =  (( 1000.0 * atof( nextArg ) ) + 0.5);
  334.   if (gfp->lowpasswidth  < 0) {
  335.     fprintf(stderr,"Must specify lowpass width with --lowpass-width freq, freq >= 0 kHzn");
  336.     exit(1);
  337.   }
  338. }
  339. else if (strcmp(token, "highpass")==0) {
  340.   argUsed=1;
  341.   gfp->highpassfreq =  (( 1000.0 * atof( nextArg ) ) + 0.5);
  342.   if (gfp->highpassfreq  < 1) {
  343.     fprintf(stderr,"Must specify highpass with --highpass freq, freq >= 0.001 kHzn");
  344.     exit(1);
  345.   }
  346. }
  347. else if (strcmp(token, "highpass-width")==0) {
  348.   argUsed=1;
  349.   gfp->highpasswidth =  (( 1000.0 * atof( nextArg ) ) + 0.5);
  350.   if (gfp->highpasswidth  < 0) {
  351.     fprintf(stderr,"Must specify highpass width with --highpass-width freq, freq >= 0 kHzn");
  352.     exit(1);
  353.   }
  354. }
  355. else if (strcmp(token, "cwlimit")==0) {
  356.   argUsed=1;
  357.   gfp->cwlimit =  atof( nextArg );
  358.   if (gfp->cwlimit <= 0 ) {
  359.     fprintf(stderr,"Must specify cwlimit in kHzn");
  360.     exit(1);
  361.   }
  362. } /* some more GNU-ish options could be added
  363.    * version       => complete name, version and license info (normal exit)  
  364.    * quiet/silent  => no messages on screen
  365.    * brief         => few messages on screen (name, status report)
  366.    * verbose       => all infos to screen (brhist, internal flags/filters)
  367.    * o/output file => specifies output filename
  368.    * O             => stdout
  369.    * i/input file  => specifies input filename
  370.    * I             => stdin
  371.    */
  372. else if (strcmp(token, "help") ==0
  373.        ||strcmp(token, "usage")==0){
  374.   lame_help(gfp,programName);  /* doesn't return */
  375. }
  376. else if (strcmp(token, "preset")==0) {
  377.   argUsed=1;
  378.   if (strcmp(nextArg,"phone")==0)
  379.   { /* when making changes, please update help text too */
  380.     gfp->brate = 16; 
  381.     gfp->highpassfreq=260;
  382.             gfp->highpasswidth=40; 
  383.     gfp->lowpassfreq=3700;
  384.     gfp->lowpasswidth=300;
  385.     gfp->VBR_q=5;
  386.     gfp->VBR_min_bitrate_kbps=8;
  387.     gfp->VBR_max_bitrate_kbps=56;
  388.     gfp->no_short_blocks=1;
  389.     gfp->out_samplerate =  16000;
  390.     gfp->mode = MPG_MD_MONO; 
  391.     gfp->mode_fixed = 1; 
  392.     gfp->quality = 5;
  393.   }
  394.   else if (strcmp(nextArg,"voice")==0)
  395.   { /* when making changes, please update help text too */
  396.     gfp->brate = 56; 
  397.     gfp->highpassfreq=100;  
  398.     gfp->highpasswidth=20;
  399.     gfp->lowpasswidth=2000;
  400.     gfp->lowpassfreq=11000;
  401.     gfp->VBR_q=4;
  402.     gfp->VBR_min_bitrate_kbps=8;
  403.     gfp->VBR_max_bitrate_kbps=96;
  404.     gfp->no_short_blocks=1;
  405.     gfp->mode = MPG_MD_MONO; 
  406.     gfp->mode_fixed = 1; 
  407.     gfp->out_samplerate =  24000; 
  408.     gfp->quality = 5;
  409.   }
  410.   else if (strcmp(nextArg,"fm")==0)
  411.   { /* when making changes, please update help text too */
  412.     gfp->brate = 96; 
  413.             gfp->highpassfreq=30;
  414.             gfp->highpasswidth=0;
  415.             gfp->lowpassfreq=15000;
  416.             gfp->lowpasswidth=0;
  417.     gfp->VBR_q=4;
  418.     gfp->VBR_min_bitrate_kbps=32;
  419.     gfp->VBR_max_bitrate_kbps=192;
  420.     gfp->mode = MPG_MD_JOINT_STEREO; 
  421.     gfp->mode_fixed = 1; 
  422.     /*gfp->out_samplerate =  32000; */ /* determined automatically based on bitrate & sample freq. */
  423.     gfp->quality = 5;
  424.   }
  425.   else if (strcmp(nextArg,"tape")==0)
  426.   { /* when making changes, please update help text too */
  427.     gfp->brate = 128; 
  428.             gfp->highpassfreq=15;
  429.             gfp->highpasswidth=15;
  430.             gfp->lowpassfreq=17000;
  431.             gfp->lowpasswidth=2000;
  432.     gfp->VBR_q=4;
  433.     gfp->VBR_min_bitrate_kbps=32;
  434.     gfp->VBR_max_bitrate_kbps=192;
  435.     gfp->mode = MPG_MD_JOINT_STEREO; 
  436.     gfp->mode_fixed = 1; 
  437.     gfp->quality = 5;
  438.   }
  439.   else if (strcmp(nextArg,"hifi")==0)
  440.   { /* when making changes, please update help text too */
  441.     gfp->brate = 160;            
  442.     gfp->highpassfreq=15;
  443.             gfp->highpasswidth=15;
  444.             gfp->lowpassfreq=20000;
  445.             gfp->lowpasswidth=3000;
  446.     gfp->VBR_q=3;
  447.     gfp->VBR_min_bitrate_kbps=32;
  448.     gfp->VBR_max_bitrate_kbps=224;
  449.     gfp->mode = MPG_MD_JOINT_STEREO; 
  450.     gfp->mode_fixed = 1; 
  451.     gfp->quality = 2;
  452.   }
  453.   else if (strcmp(nextArg,"cd")==0)
  454.   { /* when making changes, please update help text too */
  455.     gfp->brate = 192;  
  456.     gfp->lowpassfreq=-1;
  457.             gfp->highpassfreq=-1;
  458.     gfp->VBR_q=2;
  459.     gfp->VBR_min_bitrate_kbps=80;
  460.     gfp->VBR_max_bitrate_kbps=256;
  461.     gfp->mode = MPG_MD_STEREO; 
  462.     gfp->mode_fixed = 1; 
  463.     gfp->quality = 2;
  464.   }
  465.   else if (strcmp(nextArg,"studio")==0)
  466.   { /* when making changes, please update help text too */
  467.     gfp->brate = 256; 
  468.     gfp->lowpassfreq=-1;
  469.             gfp->highpassfreq=-1;
  470.     gfp->VBR_q=0;
  471.     gfp->VBR_min_bitrate_kbps=112;
  472.     gfp->VBR_max_bitrate_kbps=320;
  473.     gfp->mode = MPG_MD_STEREO; 
  474.     gfp->mode_fixed = 1; 
  475.     gfp->quality = 2; /* should be 0, but does not work now */
  476.   }
  477.   else if (strcmp(nextArg,"help")==0)
  478.   {
  479.     lame_presets_info(gfp,programName);  /* doesn't return */
  480.   }
  481.   else
  482.     {
  483.       fprintf(stderr,"%s: --preset type, type must be phone, voice, fm, tape, hifi, cd or studio, not %sn",
  484.       programName, nextArg);
  485.       exit(1);
  486.     }
  487. } /* --preset */
  488. else
  489.   {
  490.     fprintf(stderr,"%s: unrec option --%sn",
  491.     programName, token);
  492.   }
  493. i += argUsed;
  494.       } else  while( (c = *token++) ) {
  495. if(*token ) arg = token;
  496. else                             arg = nextArg;
  497. switch(c) {
  498. case 'm':        argUsed = 1;   gfp->mode_fixed = 1;
  499.   if (*arg == 's')
  500.     { gfp->mode = MPG_MD_STEREO; }
  501.   else if (*arg == 'd')
  502.     { gfp->mode = MPG_MD_DUAL_CHANNEL; }
  503.   else if (*arg == 'j')
  504.     { gfp->mode = MPG_MD_JOINT_STEREO; }
  505.   else if (*arg == 'f')
  506.     { gfp->mode = MPG_MD_JOINT_STEREO; gfp->force_ms=1; }
  507.   else if (*arg == 'm')
  508.     { gfp->mode = MPG_MD_MONO; }
  509.   else {
  510.     fprintf(stderr,"%s: -m mode must be s/d/j/f/m not %sn",
  511.     programName, arg);
  512.     err = 1;
  513.   }
  514.   break;
  515. case 'V':        argUsed = 1;   gfp->VBR = 1;  
  516.   gfp->VBR_q = atoi(arg);
  517.   if (gfp->VBR_q <0) gfp->VBR_q=0;
  518.   if (gfp->VBR_q >9) gfp->VBR_q=9;
  519.   break;
  520. case 'q':        argUsed = 1; 
  521.   user_quality = atoi(arg);
  522.   if (user_quality<0) user_quality=0;
  523.   if (user_quality>9) user_quality=9;
  524.   break;
  525. case 's':
  526.   argUsed = 1;
  527.   srate = atof( arg );
  528.   /* samplerate = rint( 1000.0 * srate ); $A  */
  529.   gfp->in_samplerate =  (( 1000.0 * srate ) + 0.5);
  530.   break;
  531. case 'b':        
  532.   argUsed = 1;
  533.   gfp->brate = atoi(arg); 
  534.   gfp->VBR_min_bitrate_kbps=gfp->brate;
  535.   break;
  536. case 'B':        
  537.   argUsed = 1;
  538.   gfp->VBR_max_bitrate_kbps=atoi(arg); 
  539.   break;
  540. case 't':  /* dont write VBR tag */
  541.   gfp->bWriteVbrTag=0;
  542.   break;
  543. case 'r':  /* force raw pcm input file */
  544. #ifdef LIBSNDFILE
  545.   fprintf(stderr,"WARNING: libsndfile may ignore -r and perform fseek's on the input.n");
  546.   fprintf(stderr,"Compile without libsndfile if this is a problem.n");
  547. #endif
  548.   gfp->input_format=sf_raw;
  549.   break;
  550. case 'x':  /* force byte swapping */
  551.   gfp->swapbytes=TRUE;
  552.   break;
  553. case 'p': /* (jo) error_protection: add crc16 information to stream */
  554.   gfp->error_protection = 1; 
  555.   break;
  556. case 'a': /* autoconvert input file from stereo to mono - for mono mp3 encoding */
  557.   autoconvert=1;
  558.   gfp->mode=MPG_MD_MONO;
  559.   gfp->mode_fixed=1;
  560.   break;
  561. case 'h': 
  562.   gfp->quality = 2;
  563.   break;
  564. case 'k': 
  565.   gfp->lowpassfreq=-1;
  566.   gfp->highpassfreq=-1;
  567.   break;
  568. case 'd': 
  569.   gfp->allow_diff_short = 1;
  570.   break;
  571. case 'v': 
  572.   gfp->VBR = 1; 
  573.   break;
  574. case 'S': 
  575.   gfp->silent = TRUE;
  576.   break;
  577. case 'X':        argUsed = 1;   gfp->experimentalX = 0;
  578.   if (*arg == '0')
  579.     { gfp->experimentalX=0; }
  580.   else if (*arg == '1')
  581.     { gfp->experimentalX=1; }
  582.   else if (*arg == '2')
  583.     { gfp->experimentalX=2; }
  584.   else if (*arg == '3')
  585.     { gfp->experimentalX=3; }
  586.   else if (*arg == '4')
  587.     { gfp->experimentalX=4; }
  588.   else if (*arg == '5')
  589.     { gfp->experimentalX=5; }
  590.   else if (*arg == '6')
  591.     { gfp->experimentalX=6; }
  592.   else {
  593.     fprintf(stderr,"%s: -X n must be 0-6, not %sn",
  594.     programName, arg);
  595.     err = 1;
  596.   }
  597.   break;
  598. case 'Y': 
  599.   gfp->experimentalY = TRUE;
  600.   break;
  601. case 'Z': 
  602.   gfp->experimentalZ = TRUE;
  603.   break;
  604. case 'f': 
  605.   gfp->quality= 9;
  606.   break;
  607. case 'g': /* turn on gtk analysis */
  608. #ifdef HAVEGTK
  609.   gfp->gtkflag = TRUE;
  610. #else
  611.     fprintf(stderr,"LAME not compiled with GTK support, -g not supported.n",
  612.     programName, arg);
  613. #endif
  614.   break;
  615. case 'e':        argUsed = 1;
  616.   if (*arg == 'n')                    gfp->emphasis = 0;
  617.   else if (*arg == '5')               gfp->emphasis = 1;
  618.   else if (*arg == 'c')               gfp->emphasis = 3;
  619.   else {
  620.     fprintf(stderr,"%s: -e emp must be n/5/c not %sn",
  621.     programName, arg);
  622.     err = 1;
  623.   }
  624.   break;
  625. case 'c':   gfp->copyright = 1; break;
  626. case 'o':   gfp->original  = 0; break;
  627. case '?':   lame_help(gfp,programName);  /* doesn't return */
  628. default:    fprintf(stderr,"%s: unrec option %cn",
  629. programName, c);
  630. err = 1; break;
  631. }
  632. if(argUsed) {
  633.   if(arg == token)    token = "";   /* no more from token */
  634.   else                ++i;          /* skip arg we used */
  635.   arg = ""; argUsed = 0;
  636. }
  637.       }
  638.     } else {
  639.       if(inPath[0] == '')       strncpy(inPath, argv[i], MAX_NAME_SIZE);
  640.       else if(outPath[0] == '') strncpy(outPath, argv[i], MAX_NAME_SIZE);
  641.       else {
  642. fprintf(stderr,"%s: excess arg %sn", programName, argv[i]);
  643. err = 1;
  644.       }
  645.     }
  646.   }  /* loop over args */
  647.   if(err || inPath[0] == '') lame_usage(gfp,programName);  /* never returns */
  648.   if (inPath[0]=='-') gfp->silent=1;  /* turn off status - it's broken for stdin */
  649.   if(outPath[0] == '') {
  650.     if (inPath[0]=='-') {
  651.       /* if input is stdin, default output is stdout */
  652.       strcpy(outPath,"-");
  653.     }else {
  654.       strncpy(outPath, inPath, MAX_NAME_SIZE - 4);
  655.       strncat(outPath, ".mp3", 4 );
  656.     }
  657.   }
  658.   /* some file options not allowed with stdout */
  659.   if (outPath[0]=='-') {
  660.     gfp->bWriteVbrTag=0; /* turn off VBR tag */
  661.     if (id3tag.used) {
  662.       id3tag.used=0;         /* turn of id3 tagging */
  663.       fprintf(stderr,"id3tag ignored: id3 tagging not supported for stdout.n");
  664.     }
  665.   }
  666.   /* if user did not explicitly specify input is mp3, check file name */
  667.   if (gfp->input_format != sf_mp3)
  668.     if (!(strcmp((char *) &inPath[strlen(inPath)-4],".mp3")))
  669.       gfp->input_format = sf_mp3;
  670. #if !(defined HAVEMPGLIB || defined AMIGA_MPEGA)
  671.   if (gfp->input_format == sf_mp3) {
  672.     fprintf(stderr,"Error: libmp3lame not compiled with mp3 *decoding* support n");
  673.     exit(1);
  674.   }
  675. #endif
  676.   /* default guess for number of channels */
  677.   if (autoconvert) gfp->num_channels=2; 
  678.   else if (gfp->mode == MPG_MD_MONO) gfp->num_channels=1;
  679.   else gfp->num_channels=2;
  680.   /* user specified a quality value.  override any defaults set above */
  681.   if (user_quality)   gfp->quality=user_quality;
  682. }
  683. #endif