MUSICOUT.C
上传用户:njqiyou
上传日期:2007-01-08
资源大小:574k
文件大小:26k
源码类别:

mpeg/mp3

开发平台:

C/C++

  1. /**********************************************************************
  2.  * ISO MPEG Audio Subgroup Software Simulation Group (1996)
  3.  * ISO 13818-3 MPEG-2 Audio Decoder - Lower Sampling Frequency Extension
  4.  *
  5.  * $Id: musicout.c,v 1.2 1996/03/28 03:13:37 rowlands Exp $
  6.  *
  7.  * $Log: musicout.c,v $
  8.  * Revision 1.2  1996/03/28 03:13:37  rowlands
  9.  * Merged layers 1-2 and layer 3 revisions
  10.  *
  11.  * Revision 1.1  1996/02/14 03:45:52  rowlands
  12.  * Initial revision
  13.  *
  14.  * Received from FhG
  15.  **********************************************************************/
  16. /**********************************************************************
  17.  *   date   programmers                comment                        *
  18.  * 2/25/91  Douglas Wong        start of version 1.0 records          *
  19.  * 3/06/91  Douglas Wong        rename setup.h to dedef.h             *
  20.  *                              removed extraneous variables          *
  21.  *                              removed window_samples (now part of   *
  22.  *                              filter_samples)                       *
  23.  * 3/07/91  Davis Pan           changed output file to "codmusic"     *
  24.  * 5/10/91  Vish (PRISM)        Ported to Macintosh and Unix.         *
  25.  *                              Incorporated new "out_fifo()" which   *
  26.  *                              writes out last incomplete buffer.    *
  27.  *                              Incorporated all AIFF routines which  *
  28.  *                              are also compatible with SUN.         *
  29.  *                              Incorporated user interface for       *
  30.  *                              specifying sound file names.          *
  31.  *                              Also incorporated user interface for  *
  32.  *                              writing AIFF compatible sound files.  *
  33.  * 27jun91  dpwe (Aware)        Added musicout and &sample_frames as  *
  34.  *                              args to out_fifo (were glob refs).    *
  35.  *                              Used new 'frame_params' struct.       *
  36.  *                              Clean,simplify, track clipped output  *
  37.  *                              and total bits/frame received.        *
  38.  * 7/10/91  Earle Jennings      changed to floats to FLOAT            *
  39.  *10/ 1/91  S.I. Sudharsanan,   Ported to IBM AIX platform.           *
  40.  *          Don H. Lee,                                               *
  41.  *          Peter W. Farrett                                          *
  42.  *10/ 3/91  Don H. Lee          implemented CRC-16 error protection   *
  43.  *                              newly introduced functions are        *
  44.  *                              buffer_CRC and recover_CRC_error      *
  45.  *                              Additions and revisions are marked    *
  46.  *                              with "dhl" for clarity                *
  47.  * 2/11/92  W. Joseph Carter    Ported new code to Macintosh.  Most   *
  48.  *                              important fixes involved changing     *
  49.  *                              16-bit ints to long or unsigned in    *
  50.  *                              bit alloc routines for quant of 65535 *
  51.  *                              and passing proper function args.     *
  52.  *                              Removed "Other Joint Stereo" option   *
  53.  *                              and made bitrate be total channel     *
  54.  *                              bitrate, irrespective of the mode.    *
  55.  *                              Fixed many small bugs & reorganized.  *
  56.  *19 aug 92 Soren H. Nielsen    Changed MS-DOS file name extensions.  *
  57.  * 8/27/93 Seymour Shlien,      Fixes in Unix and MSDOS ports,        *
  58.  *         Daniel Lauzon, and                                         *
  59.  *         Bill Truerniet                                             *
  60.  *--------------------------------------------------------------------*
  61.  * 4/23/92  J. Pineda           Added code for layer III.  LayerIII   *
  62.  *          Amit Gulati         decoding is currently performed in    *
  63.  *                              two-passes for ease of sideinfo and   *
  64.  *                              maindata buffering and decoding.      *
  65.  *                              The second (computation) pass is      *
  66.  *                              activated with "decode -3 <outfile>"  *
  67.  * 10/25/92 Amit Gulati         Modified usage() for layerIII         *
  68.  * 12/10/92 Amit Gulati         Changed processing order of re-order- *
  69.  *                              -ing step.  Fixed adjustment of       *
  70.  *                              main_data_end pointer to exclude      *
  71.  *                              side information.                     *
  72.  *  9/07/93 Toshiyuki Ishino    Integrated Layer III with Ver 3.9.    *
  73.  *--------------------------------------------------------------------*
  74.  * 11/20/93 Masahiro Iwadare    Integrated Layer III with Ver 4.0.    *
  75.  *--------------------------------------------------------------------*
  76.  *  7/14/94 Juergen Koller      Bug fixes in Layer III code           *
  77.  *--------------------------------------------------------------------*
  78.  * 08/11/94 IIS                 Bug fixes in Layer III code           *
  79.  *--------------------------------------------------------------------*
  80.  * 11/04/94 Jon Rowlands        Prototype fixes                       *
  81.  *--------------------------------------------------------------------*
  82.  *  7/12/95 Soeren H. Nielsen   Changes for LSF Layer I and II        *
  83.  *--------------------------------------------------------------------*
  84.  *  7/14/94 Juergen Koller      Bug fixes in Layer III code           *
  85.  *--------------------------------------------------------------------*
  86.  *     8/95 Roland Bitto        addapdet to MPEG 2                    *
  87.  *--------------------------------------------------------------------*
  88.  * 11/22/95 Heiko Purnhagen     skip ancillary data in bitstream      *
  89.  **********************************************************************/
  90. #include        "common.h"
  91. #include        "decoder.h"
  92. /********************************************************************
  93. /*
  94. /*        This part contains the MPEG I decoder for Layers I & II.
  95. /*
  96. /*********************************************************************/
  97. /****************************************************************
  98. /*
  99. /*        For MS-DOS user (Turbo c) change all instance of malloc
  100. /*        to _farmalloc and free to _farfree. Compiler model hugh
  101. /*        Also make sure all the pointer specified are changed to far.
  102. /*
  103. /*****************************************************************/
  104. /* local functions definition */
  105. static void usage();
  106. static void GetArguments();
  107.   
  108. /*********************************************************************
  109. /*
  110. /* Core of the Layer II decoder.  Default layer is Layer II.
  111. /*
  112. /*********************************************************************/
  113. /* Global variable definitions for "musicout.c" */
  114. char *programName;
  115. int main_data_slots();
  116. int side_info_slots();
  117. /* Implementations */
  118. main(argc, argv)
  119. int argc;
  120. char **argv;
  121. {
  122. /*typedef short PCM[2][3][SBLIMIT];*/
  123. typedef short PCM[2][SSLIMIT][SBLIMIT];
  124.     PCM FAR *pcm_sample;
  125. typedef unsigned int SAM[2][3][SBLIMIT];
  126.     SAM FAR *sample;
  127. typedef double FRA[2][3][SBLIMIT];
  128.     FRA FAR *fraction;
  129. typedef double VE[2][HAN_SIZE];
  130.     VE FAR *w;
  131.     Bit_stream_struc  bs;
  132.     frame_params      fr_ps;
  133.     layer             info;
  134.     FILE              *musicout;
  135.     unsigned long     sample_frames;
  136.     int               i, j, k, stereo, done=FALSE, clip, sync; 
  137.     int               error_protection, crc_error_count, total_error_count;
  138.     unsigned int      old_crc, new_crc;
  139.     unsigned int      bit_alloc[2][SBLIMIT], scfsi[2][SBLIMIT],
  140.                       scale_index[2][3][SBLIMIT];
  141.     unsigned long     bitsPerSlot, samplesPerFrame, frameNum = 0;
  142.     unsigned long     frameBits, gotBits = 0;
  143.     IFF_AIFF          pcm_aiff_data;
  144.     Arguments_t       Arguments;
  145.     int Max_gr;
  146. III_scalefac_t III_scalefac;
  147. III_side_info_t III_side_info;
  148. #ifdef  MACINTOSH
  149.     console_options.nrows = MAC_WINDOW_SIZE;
  150.     argc = ccommand(&argv);
  151. #endif
  152.     /* Most large variables are declared dynamically to ensure
  153.        compatibility with smaller machines */
  154.     pcm_sample = (PCM FAR *) mem_alloc((long) sizeof(PCM), "PCM Samp");
  155.     sample = (SAM FAR *) mem_alloc((long) sizeof(SAM), "Sample");
  156.     fraction = (FRA FAR *) mem_alloc((long) sizeof(FRA), "fraction");
  157.     w = (VE FAR *) mem_alloc((long) sizeof(VE), "w");
  158.     fr_ps.header = &info;
  159.     fr_ps.tab_num = -1;                /* no table loaded */
  160.     fr_ps.alloc = NULL;
  161.     for (i=0;i<HAN_SIZE;i++) for (j=0;j<2;j++) (*w)[j][i] = 0.0;
  162.     Arguments.topSb = 0;
  163.     GetArguments(argc, argv, &Arguments);
  164.     if ((musicout = fopen(Arguments.decoded_file_name, "w+b")) == NULL) {
  165.           printf ("Could not create "%s".n", Arguments.decoded_file_name);
  166.           exit(1);
  167.         }
  168.     open_bit_stream_r(&bs, Arguments.encoded_file_name, BUFFER_SIZE);
  169.     if (Arguments.need_aiff)
  170.        if (aiff_seek_to_sound_data(musicout) == -1) {
  171.           printf("Could not seek to PCM sound data in "%s".n",
  172.                  Arguments.decoded_file_name);
  173.           exit(1);
  174.        }
  175.     sample_frames = 0;
  176.     while (!end_bs(&bs)) {
  177.        sync = seek_sync(&bs, SYNC_WORD, SYNC_WORD_LNGTH);
  178.        frameBits = sstell(&bs) - gotBits;
  179.        if(frameNum > 0)        /* don't want to print on 1st loop; no lay */
  180.           if(frameBits%bitsPerSlot)
  181.              fprintf(stderr,"Got %ld bits = %ld slots plus %ldn",
  182.                      frameBits, frameBits/bitsPerSlot, frameBits%bitsPerSlot);
  183.        gotBits += frameBits;
  184.        if (!sync) {
  185.           printf("Frame cannot be locatedn");
  186.           printf("Input stream may be emptyn");
  187.           done = TRUE;
  188.           /* finally write out the buffer */
  189.           if (info.lay != 1) out_fifo(*pcm_sample, 3, &fr_ps, done,
  190.                                       musicout, &sample_frames);
  191.           else               out_fifo(*pcm_sample, 1, &fr_ps, done,
  192.                                       musicout, &sample_frames);
  193.           break;
  194.        }
  195.        decode_info(&bs, &fr_ps);
  196.        hdr_to_frps(&fr_ps);
  197.        stereo = fr_ps.stereo;
  198.        if(fr_ps.header->version == MPEG_PHASE2_LSF) {
  199. Max_gr = 1;
  200.        }
  201.        else
  202.        { 
  203. Max_gr = 2;
  204.        }
  205.        error_protection = info.error_protection;
  206.        crc_error_count = 0;
  207.        total_error_count = 0;
  208.        if(frameNum == 0) WriteHdr(&fr_ps, stdout);  /* printout layer/mode */
  209. #ifdef ESPS
  210. if (frameNum == 0 && Arguments.need_esps) {
  211. esps_write_header(musicout,(long) sample_frames, (double)
  212. s_freq[info.version][info.sampling_frequency] * 1000,
  213. (int) stereo, Arguments.decoded_file_name );
  214. } /* MI */
  215. #endif
  216.        fprintf(stderr, "{%4lu}", frameNum++); fflush(stderr); 
  217.        if (error_protection) buffer_CRC(&bs, &old_crc);
  218.        switch (info.lay) {
  219.           case 1: {
  220.              bitsPerSlot = 32;        samplesPerFrame = 384;
  221.              I_decode_bitalloc(&bs,bit_alloc,&fr_ps);
  222.              I_decode_scale(&bs, bit_alloc, scale_index, &fr_ps);
  223.              if (error_protection) {
  224.                 I_CRC_calc(&fr_ps, bit_alloc, &new_crc);
  225.                 if (new_crc != old_crc) {
  226.                    crc_error_count++;
  227.                    total_error_count++;
  228.                    recover_CRC_error(*pcm_sample, crc_error_count,
  229.                                      &fr_ps, musicout, &sample_frames);
  230.                    break;
  231.                 }
  232.                 else crc_error_count = 0;
  233.              }
  234.              clip = 0;
  235.              for (i=0;i<SCALE_BLOCK;i++) {
  236.                 I_buffer_sample(&bs,(*sample),bit_alloc,&fr_ps);
  237.                 I_dequantize_sample(*sample,*fraction,bit_alloc,&fr_ps);
  238.                 I_denormalize_sample((*fraction),scale_index,&fr_ps);
  239.                 if(Arguments.topSb>0)        /* clear channels to 0 */
  240.                    for(j=Arguments.topSb; j<fr_ps.sblimit; ++j)
  241.                       for(k=0; k<stereo; ++k)
  242.                          (*fraction)[k][0][j] = 0;
  243.                 for (j=0;j<stereo;j++) {
  244.                    clip += SubBandSynthesis (&((*fraction)[j][0][0]), j,
  245.                                              &((*pcm_sample)[j][0][0]));
  246.                 }
  247.                 out_fifo(*pcm_sample, 1, &fr_ps, done,
  248.                          musicout, &sample_frames);
  249.              }
  250.              if(clip > 0) printf("%d output samples clippedn", clip);
  251.              break;
  252.           }
  253.           case 2: {
  254.              bitsPerSlot = 8;        samplesPerFrame = 1152;
  255.              II_decode_bitalloc(&bs, bit_alloc, &fr_ps);
  256.              II_decode_scale(&bs, scfsi, bit_alloc, scale_index, &fr_ps);
  257.              if (error_protection) { 
  258.                 II_CRC_calc(&fr_ps, bit_alloc, scfsi, &new_crc);
  259.                 if (new_crc != old_crc) {
  260.                    crc_error_count++;
  261.                    total_error_count++;
  262.                    recover_CRC_error(*pcm_sample, crc_error_count,
  263.                                      &fr_ps, musicout, &sample_frames);
  264.                    break;
  265.                 }
  266.                 else crc_error_count = 0;
  267.              }
  268.              clip = 0;
  269.              for (i=0;i<SCALE_BLOCK;i++) {
  270.                 II_buffer_sample(&bs,(*sample),bit_alloc,&fr_ps);
  271.                 II_dequantize_sample((*sample),bit_alloc,(*fraction),&fr_ps);
  272.                 II_denormalize_sample((*fraction),scale_index,&fr_ps,i>>2);
  273.                 if(Arguments.topSb>0)        /* debug : clear channels to 0 */
  274.                    for(j=Arguments.topSb; j<fr_ps.sblimit; ++j)
  275.                       for(k=0; k<stereo; ++k)
  276.                          (*fraction)[k][0][j] =
  277.                          (*fraction)[k][1][j] =
  278.                          (*fraction)[k][2][j] = 0;
  279.                 for (j=0;j<3;j++) for (k=0;k<stereo;k++) {
  280.                    clip += SubBandSynthesis (&((*fraction)[k][j][0]), k,
  281.                                              &((*pcm_sample)[k][j][0]));
  282.                 }
  283.                 out_fifo(*pcm_sample, 3, &fr_ps, done, musicout,
  284.                          &sample_frames);
  285.              }
  286.              if(clip > 0) printf("%d samples clippedn", clip);
  287.              break;
  288.           }
  289.           case 3: {
  290.              int nSlots;
  291.              int gr, ch, ss, sb, main_data_end, flush_main ;
  292.      int  bytes_to_discard ;
  293.      static int frame_start = 0;
  294.              bitsPerSlot = 8;        
  295.              if(fr_ps.header->version == MPEG_PHASE2_LSF)
  296. samplesPerFrame = 576;
  297.      else
  298. samplesPerFrame = 1152;
  299.  
  300.              III_get_side_info(&bs, &III_side_info, &fr_ps);
  301.              nSlots = main_data_slots(fr_ps);
  302.              for (; nSlots > 0; nSlots--)  /* read main data. */
  303.                 hputbuf((unsigned int) getbits(&bs,8), 8);
  304.      main_data_end = hsstell() / 8; /*of privious frame*/
  305.              if ( flush_main=(hsstell() % bitsPerSlot) ) { 
  306.                 hgetbits((int)(bitsPerSlot - flush_main));
  307. main_data_end ++;
  308.      }
  309.              bytes_to_discard = frame_start - main_data_end
  310.               - III_side_info.main_data_begin ;
  311.              if( main_data_end > 4096 )
  312.              {   frame_start -= 4096;
  313.                  rewindNbytes( 4096 );
  314.              }
  315.              frame_start += main_data_slots(fr_ps);
  316.              if (bytes_to_discard < 0) {
  317.          printf("Not enough main data to decode frame %d.  Frame discarded.n", 
  318.                         frameNum - 1); break;
  319.              }
  320.              for (; bytes_to_discard > 0; bytes_to_discard--) hgetbits(8);
  321.              clip = 0;
  322.              for (gr=0;gr<Max_gr;gr++) {
  323.                double lr[2][SBLIMIT][SSLIMIT],ro[2][SBLIMIT][SSLIMIT];
  324.                for (ch=0; ch<stereo; ch++) {
  325.                  long int is[SBLIMIT][SSLIMIT];   /* Quantized samples. */
  326.                  int part2_start;
  327.                  part2_start = hsstell();
  328.                  if(fr_ps.header->version != MPEG_PHASE2_LSF)
  329.                  {
  330.                     III_get_scale_factors(&III_scalefac,&III_side_info,gr,ch,
  331.    &fr_ps);
  332.                  }
  333.                  else
  334.                  {
  335.                     III_get_LSF_scale_factors(&III_scalefac,
  336.                                                     &III_side_info,
  337.                                                     gr,ch,&fr_ps);
  338.                  }
  339.                  III_hufman_decode(is, &III_side_info, ch, gr, part2_start,
  340.                                    &fr_ps);
  341.                  III_dequantize_sample(is, ro[ch], &III_scalefac,
  342.                                    &(III_side_info.ch[ch].gr[gr]), ch, &fr_ps);
  343.                }
  344.                III_stereo(ro,lr,&III_scalefac,
  345.                             &(III_side_info.ch[0].gr[gr]), &fr_ps);
  346.                for (ch=0; ch<stereo; ch++) {
  347.                     double re[SBLIMIT][SSLIMIT];
  348.                     double hybridIn[SBLIMIT][SSLIMIT];/* Hybrid filter input */
  349.                     double hybridOut[SBLIMIT][SSLIMIT];/* Hybrid filter out */
  350.                     double polyPhaseIn[SBLIMIT];     /* PolyPhase Input. */
  351.                     III_reorder (lr[ch],re,&(III_side_info.ch[ch].gr[gr]),
  352.                                   &fr_ps);
  353.                     III_antialias(re, hybridIn, /* Antialias butterflies. */
  354.                                   &(III_side_info.ch[ch].gr[gr]), &fr_ps);
  355.                     for (sb=0; sb<SBLIMIT; sb++) { /* Hybrid synthesis. */
  356.                         III_hybrid(hybridIn[sb], hybridOut[sb], sb, ch,
  357.                                    &(III_side_info.ch[ch].gr[gr]), &fr_ps);
  358.                     }
  359.                     for (ss=0;ss<18;ss++) /*Frequency inversion for polyphase.*/
  360.                        for (sb=0; sb<SBLIMIT; sb++)
  361.                           if ((ss%2) && (sb%2))
  362.                              hybridOut[sb][ss] = -hybridOut[sb][ss];
  363.                     for (ss=0;ss<18;ss++) { /* Polyphase synthesis */
  364.                         for (sb=0; sb<SBLIMIT; sb++)
  365.                             polyPhaseIn[sb] = hybridOut[sb][ss];
  366.                         clip += SubBandSynthesis (polyPhaseIn, ch,
  367.                                                   &((*pcm_sample)[ch][ss][0]));
  368.                         }
  369.                     }
  370.                 /* Output PCM sample points for one granule. */
  371.                 out_fifo(*pcm_sample, 18, &fr_ps, done, musicout,
  372.                          &sample_frames);
  373.              }
  374.              if(clip > 0) printf("%d samples clipped.n", clip);
  375.              break;
  376.           }
  377.        }
  378. /* skip ancillary data   HP 22-nov-95 */
  379.        if (info.bitrate_index > 0) { /* if not free-format */
  380. long anc_len;
  381. anc_len = (int)((double)samplesPerFrame /
  382.        s_freq[info.version][info.sampling_frequency] *
  383.        (double)bitrate[info.version][info.lay-1][info.bitrate_index] /
  384.        (double)bitsPerSlot);
  385. if (info.padding)
  386. anc_len++;
  387. anc_len *= bitsPerSlot;
  388. anc_len -= sstell(&bs)-gotBits+SYNC_WORD_LNGTH;
  389. for (j=0; j<anc_len; j++)
  390. get1bit(&bs);
  391. }
  392.     }
  393.     if (Arguments.need_aiff) {
  394.        pcm_aiff_data.numChannels       = stereo;
  395.        pcm_aiff_data.numSampleFrames   = sample_frames;
  396.        pcm_aiff_data.sampleSize        = 16;
  397.        pcm_aiff_data.sampleRate        = s_freq[info.version][info.sampling_frequency]*1000;
  398.        pcm_aiff_data.sampleType        = IFF_ID_SSND;
  399.        pcm_aiff_data.blkAlgn.offset    = 0;
  400.        pcm_aiff_data.blkAlgn.blockSize = 0;
  401.        if (aiff_write_headers(musicout, &pcm_aiff_data) == -1) {
  402.           printf("Could not write AIFF headers to "%s"n",
  403.                  Arguments.decoded_file_name);
  404.           exit(2);
  405.        }
  406.     }
  407.     printf("Avg slots/frame = %.3f; b/smp = %.2f; br = %.3f kbpsn",
  408.            (FLOAT) gotBits / (frameNum * bitsPerSlot),
  409.            (FLOAT) gotBits / (frameNum * samplesPerFrame),
  410.            (FLOAT) gotBits / (frameNum * samplesPerFrame) *
  411.            s_freq[info.version][info.sampling_frequency]);
  412.     close_bit_stream_r(&bs);
  413.     fclose(musicout);
  414.     /* for the correct AIFF header information */
  415.     /*             on the Macintosh            */
  416.     /* the file type and the file creator for  */
  417.     /* Macintosh compatible Digidesign is set  */
  418. #ifdef  MACINTOSH
  419.     if (Arguments.need_aiff)
  420. set_mac_file_attr(Arguments.decoded_file_name, VOL_REF_NUM,
  421.                                      CREATR_DEC_AIFF, FILTYP_DEC_AIFF);
  422.     else set_mac_file_attr(Arguments.decoded_file_name, VOL_REF_NUM,
  423.                                      CREATR_DEC_BNRY, FILTYP_DEC_BNRY);
  424. #endif
  425.     printf("Decoding of "%s" is finishedn", Arguments.encoded_file_name);
  426.     printf("The decoded PCM output file name is "%s"n", Arguments.decoded_file_name);
  427.     if (Arguments.need_aiff)
  428.        printf(""%s" has been written with AIFF header informationn",
  429.               Arguments.decoded_file_name);
  430.     exit( 0 );
  431. }
  432. static void usage()  /* print syntax & exit */
  433. {
  434.    fprintf(stderr,
  435.       "usage: %s                         queries for all arguments, orn",
  436.        programName);
  437.    fprintf(stderr,
  438.       "       %s [-A][-s sb] inputBS [outPCM]n", programName);
  439.    fprintf(stderr,"wheren");
  440.    fprintf(stderr," -A       write an AIFF output PCM sound filen");
  441.    fprintf(stderr," -s sb    resynth only up to this sb (debugging only)n");
  442.    fprintf(stderr," inputBS  input bit stream of encoded audion");
  443.    fprintf(stderr," outPCM   output PCM sound file (dflt inName+%s)n",
  444.            DFLT_OPEXT);
  445.    exit(1);
  446. }
  447. static void GetArguments(argc, argv,Arguments) 
  448.     int argc;
  449.     char **argv;
  450.     Arguments_t *Arguments;
  451. {
  452.     char              t[50];
  453.     programName = argv[0];
  454.     if(argc==1) {        /* no command line args -> interact */
  455.        do {
  456.           printf ("Enter encoded file name <required>: ");
  457.           gets (Arguments->encoded_file_name);
  458.           if (Arguments->encoded_file_name[0] == NULL_CHAR)
  459.              printf ("Encoded file name is required. n");
  460.        } while (Arguments->encoded_file_name[0] == NULL_CHAR);
  461.        printf (">>> Encoded file name is: %s n", Arguments->encoded_file_name);
  462. #ifdef  MS_DOS
  463.        printf ("Enter MPEG decoded file name <%s>: ",
  464.                new_ext(Arguments->encoded_file_name, DFLT_OPEXT)); /* 92-08-19 shn */
  465. #else
  466.        printf ("Enter MPEG decoded file name <%s%s>: ",
  467.                                      Arguments->encoded_file_name,
  468.                                      DFLT_OPEXT);
  469. #endif
  470.        gets (Arguments->decoded_file_name);
  471.        if (Arguments->decoded_file_name[0] == NULL_CHAR) {
  472. #ifdef  MS_DOS
  473.            /* replace old extension with new one, 92-08-19 shn */
  474.            strcpy(Arguments->decoded_file_name,
  475.                         new_ext(Arguments->encoded_file_name, DFLT_OPEXT));
  476. #else
  477.            strcat (strcpy(Arguments->decoded_file_name, 
  478.                                Arguments->encoded_file_name), DFLT_OPEXT);
  479. #endif
  480.        }
  481.        printf (">>> MPEG decoded file name is: %s n", 
  482.                                         Arguments->decoded_file_name);
  483.        printf(
  484.           "Do you wish to write an AIFF compatible sound file ? (y/<n>) : ");
  485.        gets(t);
  486.        if (*t == 'y' || *t == 'Y') Arguments->need_aiff = TRUE;
  487.        else                        Arguments->need_aiff = FALSE;
  488.        if (Arguments->need_aiff)
  489.             printf(">>> An AIFF compatible sound file will be writtenn");
  490.        else printf(">>> A non-headered PCM sound file will be writtenn");
  491.        printf(
  492.           "Do you wish to exit (last chance before decoding) ? (y/<n>) : ");
  493.        gets(t);
  494.        if (*t == 'y' || *t == 'Y') exit(0);
  495.     }
  496.     else {        /* interpret CL Args */
  497.        int i=0, err=0;
  498.        Arguments->need_aiff = FALSE;
  499.        Arguments->need_esps = FALSE; /* MI */
  500.        Arguments->encoded_file_name[0] = '';
  501.        Arguments->decoded_file_name[0] = '';
  502.        while(++i<argc && err == 0) {
  503.           char c, *token, *arg, *nextArg;
  504.           int  argUsed;
  505.           token = argv[i];
  506.           if(*token++ == '-') {
  507.              if(i+1 < argc) nextArg = argv[i+1];
  508.              else           nextArg = "";
  509.              argUsed = 0;
  510.              while(c = *token++) {
  511.                 if(*token /* NumericQ(token) */) arg = token;
  512.                 else                             arg = nextArg;
  513.                 switch(c) {
  514.                    case 's':  Arguments->topSb = atoi(arg); argUsed = 1;
  515.                       if(Arguments->topSb<1 || Arguments->topSb>SBLIMIT) {
  516.                          fprintf(stderr, "%s: -s band %s not %d..%dn",
  517.                                  programName, arg, 1, SBLIMIT);
  518.                          err = 1;
  519.                       }
  520.                       break;
  521.                    case 'A':  Arguments->need_aiff = TRUE; break;
  522.                    case 'E':  Arguments->need_esps = TRUE; break; /* MI */
  523.                    default:   fprintf(stderr,"%s: unrecognized option %cn",
  524.                                       programName, c);
  525.                       err = 1; break;
  526.                 }
  527.                 if(argUsed) {
  528.                    if(arg == token) token = ""; /* no more from token */
  529.                    else             ++i; /* skip arg we used */
  530.                    arg = ""; argUsed = 0;
  531.                 }
  532.              }
  533.           }
  534.           else {
  535.              if(Arguments->encoded_file_name[0] == '')
  536.                 strcpy(Arguments->encoded_file_name, argv[i]);
  537.              else
  538.                 if(Arguments->decoded_file_name[0] == '')
  539.                    strcpy(Arguments->decoded_file_name, argv[i]);
  540.                 else {
  541.                    fprintf(stderr,
  542.                            "%s: excess arg %sn", programName, argv[i]);
  543.                    err = 1;
  544.                 }
  545.           }
  546.        }
  547.        if(err || Arguments->encoded_file_name[0] == '') usage();  /* never returns */
  548.        if(Arguments->decoded_file_name[0] == '') {
  549.           strcpy(Arguments->decoded_file_name, Arguments->encoded_file_name);
  550.           strcat(Arguments->decoded_file_name, DFLT_OPEXT);
  551.        }
  552.     }
  553.     /* report results of dialog / command line */
  554.     printf("Input file = '%s'  output file = '%s'n",
  555.            Arguments->encoded_file_name, Arguments->decoded_file_name);
  556.     if(Arguments->need_aiff) printf("Output file written in AIFF formatn");
  557.     if(Arguments->need_esps) printf("Output file written in ESPS formatn"); /* MI */
  558. }