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

mpeg/mp3

开发平台:

C/C++

  1. /**********************************************************************
  2.  * ISO MPEG Audio Subgroup Software Simulation Group (1996)
  3.  * ISO 13818-3 MPEG-2 Audio Encoder - Lower Sampling Frequency Extension
  4.  *
  5.  * $Id: musicin.c,v 1.2 1997/01/19 22:28:29 rowlands Exp $
  6.  *
  7.  * $Log: musicin.c,v $
  8.  * Revision 1.2  1997/01/19 22:28:29  rowlands
  9.  * Layer 3 bug fixes from Seymour Shlien
  10.  *
  11.  * Revision 1.1  1996/02/14 04:04:23  rowlands
  12.  * Initial revision
  13.  *
  14.  * Received from Mike Coleman
  15.  **********************************************************************/
  16. /**********************************************************************
  17.  *   date   programmers         comment                               *
  18.  * 3/01/91  Douglas Wong,       start of version 1.1 records          *
  19.  *          Davis Pan                                                 *
  20.  * 3/06/91  Douglas Wong,       rename: setup.h to endef.h            *
  21.  *                              removed extraneous variables          *
  22.  * 3/21/91  J.Georges Fritsch   introduction of the bit-stream        *
  23.  *                              package. This package allows you      *
  24.  *                              to generate the bit-stream in a       *
  25.  *                              binary or ascii format                *
  26.  * 3/31/91  Bill Aspromonte     replaced the read of the SB matrix    *
  27.  *                              by an "code generated" one            *
  28.  * 5/10/91  W. Joseph Carter    Ported to Macintosh and Unix.         *
  29.  *                              Incorporated Jean-Georges Fritsch's   *
  30.  *                              "bitstream.c" package.                *
  31.  *                              Modified to strictly adhere to        *
  32.  *                              encoded bitstream specs, including    *
  33.  *                              "Berlin changes".                     *
  34.  *                              Modified user interface dialog & code *
  35.  *                              to accept any input & output          *
  36.  *                              filenames desired.  Also added        *
  37.  *                              de-emphasis prompt and final bail-out *
  38.  *                              opportunity before encoding.          *
  39.  *                              Added AIFF PCM sound file reading     *
  40.  *                              capability.                           *
  41.  *                              Modified PCM sound file handling to   *
  42.  *                              process all incoming samples and fill *
  43.  *                              out last encoded frame with zeros     *
  44.  *                              (silence) if needed.                  *
  45.  *                              Located and fixed numerous software   *
  46.  *                              bugs and table data errors.           *
  47.  * 27jun91  dpwe (Aware Inc)    Used new frame_params struct.         *
  48.  *                              Clear all automatic arrays.           *
  49.  *                              Changed some variable names,          *
  50.  *                              simplified some code.                 *
  51.  *                              Track number of bits actually sent.   *
  52.  *                              Fixed padding slot, stereo bitrate    *
  53.  *                              Added joint-stereo : scales L+R.      *
  54.  * 6/12/91  Earle Jennings      added fix for MS_DOS in obtain_param  *
  55.  * 6/13/91  Earle Jennings      added stack length adjustment before  *
  56.  *                              main for MS_DOS                       *
  57.  * 7/10/91  Earle Jennings      conversion of all float to FLOAT      *
  58.  *                              port to MsDos from MacIntosh completed*
  59.  * 8/ 8/91  Jens Spille         Change for MS-C6.00                   *
  60.  * 8/22/91  Jens Spille         new obtain_parameters()               *
  61.  *10/ 1/91  S.I. Sudharsanan,   Ported to IBM AIX platform.           *
  62.  *          Don H. Lee,                                               *
  63.  *          Peter W. Farrett                                          *
  64.  *10/ 3/91  Don H. Lee          implemented CRC-16 error protection   *
  65.  *                              newly introduced functions are        *
  66.  *                              I_CRC_calc, II_CRC_calc and encode_CRC*
  67.  *                              Additions and revisions are marked    *
  68.  *                              with "dhl" for clarity                *
  69.  *11/11/91 Katherine Wang       Documentation of code.                *
  70.  *                                (variables in documentation are     *
  71.  *                                surround by the # symbol, and an '*'*
  72.  *                                denotes layer I or II versions)     *
  73.  * 2/11/92  W. Joseph Carter    Ported new code to Macintosh.  Most   *
  74.  *                              important fixes involved changing     *
  75.  *                              16-bit ints to long or unsigned in    *
  76.  *                              bit alloc routines for quant of 65535 *
  77.  *                              and passing proper function args.     *
  78.  *                              Removed "Other Joint Stereo" option   *
  79.  *                              and made bitrate be total channel     *
  80.  *                              bitrate, irrespective of the mode.    *
  81.  *                              Fixed many small bugs & reorganized.  *
  82.  * 2/25/92  Masahiro Iwadare    made code cleaner and more consistent *
  83.  * 8/07/92  Mike Coleman        make exit() codes return error status *
  84.  *                              made slight changes for portability   *
  85.  *19 aug 92 Soren H. Nielsen    Changed MS-DOS file name extensions.  *
  86.  * 8/25/92  Shaun Astarabadi    Replaced rint() function with explicit*
  87.  *                              rounding for portability with MSDOS.  *
  88.  * 9/22/92  jddevine@aware.com  Fixed _scale_factor_calc() calls.     *
  89.  *10/19/92  Masahiro Iwadare    added info->mode and info->mode_ext   *
  90.  *                              updates for AIFF format files         *
  91.  * 3/10/93  Kevin Peterson      In parse_args, only set non default   *
  92.  *                              bit rate if specified in arg list.    *
  93.  *                              Use return value from aiff_read_hdrs  *
  94.  *                              to fseek to start of sound data       *
  95.  * 7/26/93  Davis Pan           fixed bug in printing info->mode_ext  *
  96.  *                              value for joint stereo condition      *
  97.  * 8/27/93 Seymour Shlien,      Fixes in Unix and MSDOS ports,        *
  98.  *         Daniel Lauzon, and                                         *
  99.  *         Bill Truerniet                                             *
  100.  * 11/7/95 Soeren H. Nielsen    LSF added. Bug fix in MSDOS ext.      *
  101.  * 8/02/95 mc@fivebats.com      Changed default bitrate selection so  *
  102.  *                              it works with the new LSF stuff       *
  103.  *10/01/95 mc@fivebats.com      Added layer3                          *
  104.  **********************************************************************/
  105. #ifdef MS_DOS
  106. #include <dos.h>
  107. #endif
  108. #include <stdlib.h>
  109. #include "common.h"
  110. #include "encoder.h"
  111. #include "l3psy.h"
  112. #include "mdct.h"
  113. #include "loop.h"
  114. #include "l3bitstream.h"
  115. #include <assert.h>
  116. /* Global variable definitions for "musicin.c" */
  117. FILE               *musicin;
  118. Bit_stream_struc   bs;
  119. char               *programName;
  120. /* Implementations */
  121. /************************************************************************
  122. *
  123. * obtain_parameters
  124. *
  125. * PURPOSE:  Prompts for and reads user input for encoding parameters
  126. *
  127. * SEMANTICS:  The parameters read are:
  128. * - input and output filenames
  129. * - sampling frequency (if AIFF file, will read from the AIFF file header)
  130. * - layer number
  131. * - mode (stereo, joint stereo, dual channel or mono)
  132. * - psychoacoustic model (I or II)
  133. * - total bitrate, irrespective of the mode
  134. * - de-emphasis, error protection, copyright and original or copy flags
  135. *
  136. ************************************************************************/
  137. void
  138. obtain_parameters(fr_ps,psy,num_samples,original_file_name,encoded_file_name)
  139. frame_params    *fr_ps;
  140. int             *psy;
  141. unsigned long   *num_samples;
  142. char            original_file_name[MAX_NAME_SIZE];
  143. char            encoded_file_name[MAX_NAME_SIZE];
  144. {
  145.     int j;
  146.     long int freq;
  147.     int model, brt;
  148.     char t[50];
  149.     IFF_AIFF pcm_aiff_data;
  150.     layer *info = fr_ps->header;
  151.     long soundPosition;
  152. #ifdef  MS_DOS
  153.     char temp_str[MAX_NAME_SIZE];
  154. #endif 
  155.     do  {
  156.        printf("Enter PCM input file name <required>: ");
  157.        gets(original_file_name);
  158.        if (original_file_name[0] == NULL_CHAR)
  159.        printf("PCM input file name is required.n");
  160.     } while (original_file_name[0] == NULL_CHAR);
  161.     printf(">>> PCM input file name is: %sn", original_file_name);
  162.  
  163.     if ((musicin = fopen(original_file_name, "rb")) == NULL) {
  164.        printf("Could not find "%s".n", original_file_name);
  165.        exit(1);
  166.     }
  167. #ifdef  MS_DOS
  168.     /* replace old extension with new one, 1992-08-19, 1995-06-12 shn */
  169.     new_ext(original_file_name, DFLT_EXT, temp_str);
  170.     printf("Enter MPEG encoded output file name <%s>: ",
  171.            temp_str);
  172. #else
  173.     printf("Enter MPEG encoded output file name <%s%s>: ",
  174.            original_file_name, DFLT_EXT);
  175. #endif
  176.  
  177.     gets(encoded_file_name);
  178.     
  179.     if (encoded_file_name[0] == NULL_CHAR) {
  180. #ifdef  MS_DOS
  181.   strcpy(encoded_file_name, temp_str);
  182. #else
  183.         strcat(strcpy(encoded_file_name, original_file_name), DFLT_EXT);
  184. #endif
  185.     }
  186.         
  187.     printf(">>> MPEG encoded output file name is: %sn", encoded_file_name);
  188.  
  189.     open_bit_stream_w(&bs, encoded_file_name, BUFFER_SIZE);
  190.  
  191.     if ((soundPosition = aiff_read_headers(musicin, &pcm_aiff_data)) != -1) {
  192.        printf(">>> Using Audio IFF sound file headersn");
  193.        aiff_check(original_file_name, &pcm_aiff_data, &info->version);
  194.        if (fseek(musicin, soundPosition, SEEK_SET) != 0) {
  195.           printf("Could not seek to PCM sound data in "%s".n",
  196.                  original_file_name);
  197.           exit(1);
  198.        }
  199.        info->sampling_frequency =
  200.       SmpFrqIndex((long)pcm_aiff_data.sampleRate, &info->version);
  201.        printf(">>> %f Hz sampling frequency selectedn",
  202.               pcm_aiff_data.sampleRate);
  203.        /* Determine number of samples in sound file */
  204. #ifndef MS_DOS
  205.        *num_samples = pcm_aiff_data.numChannels *
  206.                       pcm_aiff_data.numSampleFrames;
  207. #else
  208.        *num_samples = (long)(pcm_aiff_data.numChannels) *
  209.                       (long)(pcm_aiff_data.numSampleFrames);
  210. #endif
  211.     }
  212.     else {    /* Not using Audio IFF sound file headers. */
  213.        printf("What is the sampling frequency? <44100>[Hz]: ");
  214.        gets(t);
  215.        freq = atol(t);
  216.        switch (freq) {
  217.           case 48000 : info->sampling_frequency = 1;
  218.               printf(">>> %ld Hz sampling freq selectedn", freq);
  219.               break;
  220.           case 44100 : info->sampling_frequency = 0;
  221.               printf(">>> %ld Hz sampling freq selectedn", freq);
  222.               break;
  223.           case 32000 : info->sampling_frequency = 2;
  224.               printf(">>> %ld Hz sampling freq selectedn", freq);
  225.               break;
  226.           case 24000 : info->sampling_frequency = 1;
  227.         info->version = MPEG_PHASE2_LSF;
  228.               printf(">>> %ld Hz sampling freq selectedn", freq);
  229.               break;
  230.           case 22050 : info->sampling_frequency = 0;
  231.         info->version = MPEG_PHASE2_LSF;
  232.               printf(">>> %ld Hz sampling freq selectedn", freq);
  233.               break;
  234.           case 16000 : info->sampling_frequency = 2;
  235.         info->version = MPEG_PHASE2_LSF;
  236.               printf(">>> %ld Hz sampling freq selectedn", freq);
  237.               break;
  238.           default:    info->sampling_frequency = 0;
  239.               printf(">>> Default 44.1 kHz samp freq selectedn");
  240.        }
  241.        printf(">>> Encoding algorithm is %sn", version_names[info->version]);
  242.        if (fseek(musicin, 0, SEEK_SET) != 0) {
  243.           printf("Could not seek to PCM sound data in "%s".n",
  244.                   original_file_name);
  245.           exit(1);
  246.        }
  247.  
  248.        /* Declare sound file to have "infinite" number of samples. */
  249.        *num_samples = MAX_U_32_NUM;
  250.     }
  251.     printf("Which layer do you want to use?n");
  252.     printf("Available: Layer (1), Layer (<2>), Layer (3): ");
  253.     gets(t);
  254.     switch(*t){
  255.        case '1': info->lay = 1; printf(">>> Using Layer %sn",t); break;
  256.        case '2': info->lay = 2; printf(">>> Using Layer %sn",t); break;
  257.      case '3': info->lay = 3; printf(">>> Using Layer %sn",t); break;
  258.        default:  info->lay = 2; printf(">>> Using default Layer 2n"); break;
  259.     }
  260.     printf("Which mode do you want?n");
  261.     printf("Available: (<s>)tereo, (j)oint stereo, ");
  262.     printf("(d)ual channel, s(i)ngle Channel: ");
  263.     gets(t);
  264.     switch(*t){
  265.        case 's':
  266.        case 'S':
  267.           info->mode = MPG_MD_STEREO; info->mode_ext = 0;
  268.           printf(">>> Using mode %sn",t);
  269.           break;
  270.        case 'j':
  271.        case 'J':
  272.           info->mode = MPG_MD_JOINT_STEREO;
  273.           printf(">>> Using mode %sn",t);
  274.           break;
  275.        case 'd':
  276.        case 'D':
  277.           info->mode = MPG_MD_DUAL_CHANNEL; info->mode_ext = 0;
  278.           printf(">>> Using mode %sn",t);
  279.           break;
  280.        case 'i':
  281.        case 'I':
  282.           info->mode = MPG_MD_MONO; info->mode_ext = 0;
  283.           printf(">>> Using mode %sn",t);
  284.           break;
  285.        default:
  286.           info->mode = MPG_MD_STEREO; info->mode_ext = 0;
  287.           printf(">>> Using default stereo moden");
  288.           break;
  289.     }
  290.     printf("Which psychoacoustic model do you want to use? <1>: ");
  291.     gets(t);
  292.     model = atoi(t);
  293.     if (model > 2 || model < 1) {
  294.        printf(">>> Default model 1 selectedn");
  295.        *psy = 1;
  296.     }
  297.     else {
  298.        *psy = model;
  299.        printf(">>> Using psychoacoustic model %dn", model);
  300.     }
  301.     
  302.     /* set default bitrate to highest allowed, which is index 14 */
  303.   brt = bitrate[info->version][info->lay-1][14];
  304.     printf( "What is the total bitrate? <%u>[kbps]: ", brt );
  305.     gets( t );
  306.     brt = atoi( t );
  307.     if ( brt == 0 )
  308.       j = 15;
  309.     else
  310.       j = 0;
  311.     while ( j < 15 )
  312.     {
  313.     if ( bitrate[info->version][info->lay-1][j] == brt )
  314.           break;
  315.     j++;
  316.     }
  317.     if ( j == 15 )
  318.     {
  319.     brt = bitrate[info->version][info->lay-1][14];
  320.         printf( ">>> Using default %u kbpsn", brt );
  321.         info->bitrate_index = 14;
  322.     }
  323.     else
  324.     {
  325.        info->bitrate_index = j;
  326.        printf( ">>> Bitrate = %d kbpsn", bitrate[info->version][info->lay-1][j] );
  327.     }
  328.  
  329.     printf("What type of de-emphasis should the decoder use?n");
  330.     printf("Available: (<n>)one, (5)0/15 microseconds, (c)citt j.17: ");
  331.     gets(t);
  332.     if (*t != 'n' && *t != '5' && *t != 'c') {
  333.        printf(">>> Using default no de-emphasisn");
  334.        info->emphasis = 0;
  335.     }
  336.     else {
  337.        if (*t == 'n')      info->emphasis = 0;
  338.        else if (*t == '5') info->emphasis = 1;
  339.        else if (*t == 'c') info->emphasis = 3;
  340.        printf(">>> Using de-emphasis %sn",t);
  341.     }
  342.  
  343. /*  Start 2. Part changes for CD Ver 3.2; jsp; 22-Aug-1991 */
  344.  
  345.     printf("Do you want to set the private bit? (y/<n>): ");
  346.     gets(t);
  347.     if (*t == 'y' || *t == 'Y') info->extension = 1;
  348.     else                        info->extension = 0;
  349.     if(info->extension) printf(">>> Private bit setn");
  350.     else                printf(">>> Private bit not setn");
  351.  
  352. /*  End changes for CD Ver 3.2; jsp; 22-Aug-1991 */
  353.  
  354.     printf("Do you want error protection? (y/<n>): ");
  355.     gets(t);
  356.     if (*t == 'y' || *t == 'Y') info->error_protection = TRUE;
  357.     else                        info->error_protection = FALSE;
  358.     if(info->error_protection) printf(">>> Error protection usedn");
  359.     else printf(">>> Error protection not usedn");
  360.  
  361.     printf("Is the material copyrighted? (y/<n>): ");
  362.     gets(t);
  363.     if (*t == 'y' || *t == 'Y') info->copyright = 1;
  364.     else                        info->copyright = 0;
  365.     if(info->copyright) printf(">>> Copyrighted materialn");
  366.     else                printf(">>> Material not copyrightedn");
  367.  
  368.     printf("Is this the original? (y/<n>): ");
  369.     gets(t);
  370.     if (*t == 'y' || *t == 'Y') info->original = 1;
  371.     else                        info->original = 0;
  372.     if(info->original) printf(">>> Original materialn");
  373.     else               printf(">>> Material not originaln");
  374.  
  375.     printf("Do you wish to exit (last chance before encoding)? (y/<n>): ");
  376.     gets(t);
  377.     if (*t == 'y' || *t == 'Y') exit(0);
  378. }
  379. /************************************************************************
  380. *
  381. * parse_args
  382. *
  383. * PURPOSE:  Sets encoding parameters to the specifications of the
  384. * command line.  Default settings are used for parameters
  385. * not specified in the command line.
  386. *
  387. * SEMANTICS:  The command line is parsed according to the following
  388. * syntax:
  389. *
  390. * -l  is followed by the layer number
  391. * -m  is followed by the mode
  392. * -p  is followed by the psychoacoustic model number
  393. * -s  is followed by the sampling rate
  394. * -b  is followed by the total bitrate, irrespective of the mode
  395. * -d  is followed by the emphasis flag
  396. * -c  is followed by the copyright/no_copyright flag
  397. * -o  is followed by the original/not_original flag
  398. * -e  is followed by the error_protection on/off flag
  399. *
  400. * If the input file is in AIFF format, the sampling frequency is read
  401. * from the AIFF header.
  402. *
  403. * The input and output filenames are read into #inpath# and #outpath#.
  404. *
  405. ************************************************************************/
  406.  
  407. void
  408. parse_args(argc, argv, fr_ps, psy, num_samples, inPath, outPath)
  409. int     argc;
  410. char    **argv;
  411. frame_params  *fr_ps;
  412. int     *psy;
  413. unsigned long *num_samples;
  414. char    inPath[MAX_NAME_SIZE];
  415. char    outPath[MAX_NAME_SIZE];
  416. {
  417.    FLOAT srate;
  418.    int   brate;
  419.    layer *info = fr_ps->header;
  420.    int   err = 0, i = 0;
  421.    IFF_AIFF pcm_aiff_data;
  422.    long samplerate;
  423.    long soundPosition;
  424.  
  425.    /* preset defaults */
  426.    inPath[0] = '';   outPath[0] = '';
  427.    info->lay = DFLT_LAY;
  428.    switch(DFLT_MOD) {
  429.       case 's': info->mode = MPG_MD_STEREO; info->mode_ext = 0; break;
  430.       case 'd': info->mode = MPG_MD_DUAL_CHANNEL; info->mode_ext=0; break;
  431.       case 'j': info->mode = MPG_MD_JOINT_STEREO; break;
  432.       case 'm': info->mode = MPG_MD_MONO; info->mode_ext = 0; break;
  433.       default:
  434.          fprintf(stderr, "%s: Bad mode dflt %cn", programName, DFLT_MOD);
  435.          abort();
  436.    }
  437.    *psy = DFLT_PSY;
  438.    if((info->sampling_frequency = SmpFrqIndex((long)(1000*DFLT_SFQ), &info->version)) < 0) {
  439.       fprintf(stderr, "%s: bad sfrq default %.2fn", programName, DFLT_SFQ);
  440.       abort();
  441.    }
  442.   info->bitrate_index = 14;
  443.   brate = 0;
  444.    switch(DFLT_EMP) {
  445.       case 'n': info->emphasis = 0; break;
  446.       case '5': info->emphasis = 1; break;
  447.       case 'c': info->emphasis = 3; break;
  448.       default: 
  449.          fprintf(stderr, "%s: Bad emph dflt %cn", programName, DFLT_EMP);
  450.          abort();
  451.    }
  452.    info->copyright = 0; info->original = 0; info->error_protection = FALSE;
  453.  
  454.    /* process args */
  455.    while(++i<argc && err == 0) {
  456.       char c, *token, *arg, *nextArg;
  457.       int  argUsed;
  458.  
  459.       token = argv[i];
  460.       if(*token++ == '-') {
  461.          if(i+1 < argc) nextArg = argv[i+1];
  462.          else           nextArg = "";
  463.          argUsed = 0;
  464.          while( (c = *token++) ) {
  465.             if(*token /* NumericQ(token) */) arg = token;
  466.             else                             arg = nextArg;
  467.             switch(c) {
  468.                case 'l':        info->lay = atoi(arg); argUsed = 1;
  469.                   if(info->lay<1 || info->lay>3) {
  470.                      fprintf(stderr,"%s: -l layer must be 1, 2, or 3, not %sn",
  471.                           programName, arg);
  472.                      err = 1;
  473.                   }
  474.                   break;
  475.                case 'm':        argUsed = 1;
  476.                   if (*arg == 's')
  477.                     { info->mode = MPG_MD_STEREO; info->mode_ext = 0; }
  478.                   else if (*arg == 'd')
  479.                     { info->mode = MPG_MD_DUAL_CHANNEL; info->mode_ext=0; }
  480.                   else if (*arg == 'j')
  481.                     { info->mode = MPG_MD_JOINT_STEREO; }
  482.                   else if (*arg == 'm')
  483.                     { info->mode = MPG_MD_MONO; info->mode_ext = 0; }
  484.                   else {
  485.                     fprintf(stderr,"%s: -m mode must be s/d/j/m not %sn",
  486.                             programName, arg);
  487.                     err = 1;
  488.                   }
  489.                   break;
  490.                case 'p':        *psy = atoi(arg); argUsed = 1;
  491.                   if(*psy<1 || *psy>2) {
  492.                      fprintf(stderr,"%s: -p model must be 1 or 2, not %sn",
  493.                              programName, arg);
  494.                      err = 1;
  495.                   }
  496.                   break;
  497.                case 's':
  498.                   argUsed = 1;
  499.                   srate = atof( arg );
  500.                   /* samplerate = rint( 1000.0 * srate ); $A  */
  501.                   samplerate = (long) (( 1000.0 * srate ) + 0.5);
  502.                   if( (info->sampling_frequency =
  503.           SmpFrqIndex((long) samplerate, &info->version)) < 0 )
  504.                       err = 1;
  505.                   break;
  506.                   
  507.                case 'b':        
  508.         argUsed = 1;
  509.       brate = atoi(arg); 
  510.       break;
  511.                case 'd':        argUsed = 1;
  512.                   if (*arg == 'n')                    info->emphasis = 0;
  513.                   else if (*arg == '5')               info->emphasis = 1;
  514.                   else if (*arg == 'c')               info->emphasis = 3;
  515.                   else {
  516.                      fprintf(stderr,"%s: -d emp must be n/5/c not %sn",
  517.                              programName, arg);
  518.                      err = 1;
  519.                   }
  520.                   break;
  521.                 case 'c':       info->copyright = 1; break;
  522.                 case 'o':       info->original  = 1; break;
  523.                 case 'e':       info->error_protection = TRUE; break;
  524.                 default:        fprintf(stderr,"%s: unrec option %cn",
  525.                                         programName, c);
  526.                                 err = 1; break;
  527.             }
  528.             if(argUsed) {
  529.                if(arg == token)    token = "";   /* no more from token */
  530.                else                ++i;          /* skip arg we used */
  531.                arg = ""; argUsed = 0;
  532.             }
  533.          }
  534.       }
  535.       else {
  536.          if(inPath[0] == '')       strcpy(inPath, argv[i]);
  537.          else if(outPath[0] == '') strcpy(outPath, argv[i]);
  538.          else {
  539.             fprintf(stderr,"%s: excess arg %sn", programName, argv[i]);
  540.             err = 1;
  541.          }
  542.       }
  543.    }
  544.    if(err || inPath[0] == '') usage();  /* never returns */
  545.  
  546.    if(outPath[0] == '') {
  547. #ifdef MS_DOS
  548.       /* replace old extension with new one, 1992-08-19, 1995-06-12 shn */
  549.       new_ext(inPath, DFLT_EXT, outPath);
  550. #else
  551.       strcpy(outPath, inPath);
  552.       strcat(outPath, DFLT_EXT);
  553. #endif
  554.    }
  555.    if ((musicin = fopen(inPath, "rb")) == NULL) {
  556.       printf("Could not find "%s".n", inPath);
  557.       exit(1);
  558.    }
  559.  
  560.    open_bit_stream_w(&bs, outPath, BUFFER_SIZE);
  561.    if ((soundPosition = aiff_read_headers(musicin, &pcm_aiff_data)) != -1) {
  562.       printf(">>> Using Audio IFF sound file headersn");
  563.       aiff_check(inPath, &pcm_aiff_data, &info->version);
  564.       if (fseek(musicin, soundPosition, SEEK_SET) != 0) {
  565.          printf("Could not seek to PCM sound data in "%s".n", inPath);
  566.          exit(1);
  567.       }
  568.       info->sampling_frequency = SmpFrqIndex((long)pcm_aiff_data.sampleRate, &info->version);
  569.       printf(">>> %f Hz sampling frequency selectedn",
  570.              pcm_aiff_data.sampleRate);
  571.       /* Determine number of samples in sound file */
  572. #ifndef MS_DOS
  573.       *num_samples = pcm_aiff_data.numChannels *
  574.                      pcm_aiff_data.numSampleFrames;
  575. #else
  576.       *num_samples = (long)(pcm_aiff_data.numChannels) *
  577.                      (long)(pcm_aiff_data.numSampleFrames);
  578. #endif
  579.       if ( pcm_aiff_data.numChannels == 1 ) {
  580.         info->mode = MPG_MD_MONO;
  581.         info->mode_ext = 0;
  582.       }
  583.    }
  584.    else {    /* Not using Audio IFF sound file headers. */
  585.       if (fseek(musicin, 0, SEEK_SET) != 0) {
  586.          printf("Could not seek to PCM sound data in "%s".n", inPath);
  587.          exit(1);
  588.       }
  589.  
  590.       /* Declare sound file to have "infinite" number of samples. */
  591.       *num_samples = MAX_U_32_NUM;
  592.    }
  593.    if ( brate == 0 )
  594.     brate = bitrate[info->version][info->lay-1][14];
  595.    if( (info->bitrate_index = BitrateIndex(info->lay, brate, info->version)) < 0) err=1;
  596.    if(err || inPath[0] == '') usage();  /* never returns */
  597. }
  598. /************************************************************************
  599. *
  600. * print_config
  601. *
  602. * PURPOSE:  Prints the encoding parameters used
  603. *
  604. ************************************************************************/
  605.  
  606. void print_config( frame_params *fr_ps, int *psy, char *inPath, char *outPath)
  607. {
  608.  layer *info = fr_ps->header;
  609.  
  610.    printf("Encoding configuration:n");
  611.    printf("Algorithm=%sn", version_names[info->version]);
  612.    if(info->mode != MPG_MD_JOINT_STEREO)
  613.       printf("Layer=%s   mode=%s   extn=%d   psy model=%dn",
  614.              layer_names[info->lay-1], mode_names[info->mode],
  615.              info->mode_ext, *psy);
  616.    else printf("Layer=%s   mode=%s   extn=data dependant   psy model=%dn",
  617.                layer_names[info->lay-1], mode_names[info->mode], *psy);
  618.    printf("samp frq=%.1f kHz   total bitrate=%d kbpsn",
  619.           s_freq[info->version][info->sampling_frequency],
  620.           bitrate[info->version][info->lay-1][info->bitrate_index]);
  621.    printf("de-emph=%d   c/right=%d   orig=%d   errprot=%sn",
  622.           info->emphasis, info->copyright, info->original,
  623.           ((info->error_protection) ? "on" : "off"));
  624.    printf("input file: '%s'   output file: '%s'n", inPath, outPath);
  625. }
  626.  
  627. /************************************************************************
  628. *
  629. * main
  630. *
  631. * PURPOSE:  MPEG I Encoder supporting layers 1 and 2, and 3, with
  632. * psychoacoustic models 1 (MUSICAM) and 2 (AT&T)
  633. *
  634. * SEMANTICS:  One overlapping frame of audio of up to 2 channels are
  635. * processed at a time in the following order:
  636. * (associated routines are in parentheses)
  637. *
  638. * 1.  Filter sliding window of data to get 32 subband
  639. * samples per channel.
  640. * (window_subband,filter_subband)
  641. *
  642. * 2.  If joint stereo mode, combine left and right channels
  643. * for subbands above #jsbound#.
  644. * (*_combine_LR)
  645. *
  646. * 3.  Calculate scalefactors for the frame, and if layer 2,
  647. * also calculate scalefactor select information.
  648. * (*_scale_factor_calc)
  649. *
  650. * 4.  Calculate psychoacoustic masking levels using selected
  651. * psychoacoustic model.
  652. * (*_Psycho_One, psycho_anal)
  653. *
  654. * 5.  Perform iterative bit allocation for subbands with low
  655. * mask_to_noise ratios using masking levels from step 4.
  656. * (*_main_bit_allocation)
  657. *
  658. * 6.  If error protection flag is active, add redundancy for
  659. * error protection.
  660. * (*_CRC_calc)
  661. *
  662. * 7.  Pack bit allocation, scalefactors, and scalefactor select
  663. * information (layer 2) onto bitstream.
  664. * (*_encode_bit_alloc,*_encode_scale,II_transmission_pattern)
  665. *
  666. * 8.  Quantize subbands and pack them into bitstream
  667. * (*_subband_quantization, *_sample_encoding)
  668. *
  669. ************************************************************************/
  670. int frameNum=0;
  671. void main(argc, argv)
  672. int     argc;
  673. char    **argv;
  674. {
  675.     typedef double SBS[2][3][SCALE_BLOCK][SBLIMIT];
  676.     SBS  FAR        *sb_sample;
  677.     L3SBS  FAR        *l3_sb_sample;
  678.     typedef double JSBS[3][SCALE_BLOCK][SBLIMIT];
  679.     JSBS FAR        *j_sample;
  680.     typedef double IN[2][HAN_SIZE];
  681.     IN   FAR        *win_que;
  682.     typedef unsigned int SUB[2][3][SCALE_BLOCK][SBLIMIT];
  683.     SUB  FAR        *subband;
  684.     
  685.     frame_params fr_ps;
  686.     layer info;
  687.     char original_file_name[MAX_NAME_SIZE];
  688.     char encoded_file_name[MAX_NAME_SIZE];
  689.     short FAR **win_buf;
  690.     static short FAR buffer[2][1152];
  691.     static unsigned int bit_alloc[2][SBLIMIT], scfsi[2][SBLIMIT];
  692.     static unsigned int scalar[2][3][SBLIMIT], j_scale[3][SBLIMIT];
  693.     static double FAR ltmin[2][SBLIMIT], lgmin[2][SBLIMIT], max_sc[2][SBLIMIT];
  694.     FLOAT snr32[32];
  695.     short sam[2][1344]; /* was [1056]; */
  696.     int whole_SpF, extra_slot = 0;
  697.     double avg_slots_per_frame, frac_SpF, slot_lag;
  698.     int model, stereo, error_protection;
  699.     static unsigned int crc;
  700.     int i, j, k, adb;
  701.     unsigned long bitsPerSlot, samplesPerFrame;
  702.     unsigned long frameBits, sentBits = 0;
  703.     unsigned long num_samples;
  704.     
  705. #ifdef  MACINTOSH
  706.     argc = ccommand( &argv );
  707. #endif
  708.     
  709.     /* Most large variables are declared dynamically to ensure
  710.        compatibility with smaller machines */
  711.     
  712.     sb_sample = (SBS FAR *) mem_alloc(sizeof(SBS), "sb_sample");
  713.     l3_sb_sample = (L3SBS FAR *) mem_alloc(sizeof(SBS), "l3_sb_sample");
  714.     j_sample = (JSBS FAR *) mem_alloc(sizeof(JSBS), "j_sample");
  715.     win_que = (IN FAR *) mem_alloc(sizeof(IN), "Win_que");
  716.     subband = (SUB FAR *) mem_alloc(sizeof(SUB),"subband");
  717.     win_buf = (short FAR **) mem_alloc(sizeof(short *)*2, "win_buf");
  718.  
  719.     /* clear buffers */
  720.     memset((char *) buffer, 0, sizeof(buffer));
  721.     memset((char *) bit_alloc, 0, sizeof(bit_alloc));
  722.     memset((char *) scalar, 0, sizeof(scalar));
  723.     memset((char *) j_scale, 0, sizeof(j_scale));
  724.     memset((char *) scfsi, 0, sizeof(scfsi));
  725.     memset((char *) ltmin, 0, sizeof(ltmin));
  726.     memset((char *) lgmin, 0, sizeof(lgmin));
  727.     memset((char *) max_sc, 0, sizeof(max_sc));
  728.     memset((char *) snr32, 0, sizeof(snr32));
  729.     memset((char *) sam, 0, sizeof(sam));
  730.  
  731.     fr_ps.header = &info;
  732.     fr_ps.tab_num = -1;             /* no table loaded */
  733.     fr_ps.alloc = NULL;
  734.     info.version = MPEG_AUDIO_ID;   /* Default: MPEG-1 */
  735.     programName = argv[0];
  736.     if(argc==1)     /* no command-line args */
  737.        obtain_parameters(&fr_ps, &model, &num_samples,
  738.                          original_file_name, encoded_file_name);
  739.     else
  740. parse_args(argc, argv, &fr_ps, &model, &num_samples,
  741.    original_file_name, encoded_file_name);
  742.     print_config(&fr_ps, &model,
  743.                  original_file_name, encoded_file_name);
  744.     
  745.     hdr_to_frps(&fr_ps);
  746.     stereo = fr_ps.stereo;
  747.     error_protection = info.error_protection;
  748.     
  749.     if (info.lay == 1)
  750.     { bitsPerSlot = 32; samplesPerFrame = 384;  }
  751.     else 
  752. if ( info.lay == 2 )
  753. { bitsPerSlot = 8;  samplesPerFrame = 1152; }
  754. else
  755. {  /* layer 3 */
  756.     bitsPerSlot = 8;
  757.     samplesPerFrame = info.version == 1 ? 1152 : 576;
  758.     
  759.     /* Apologize for missing features */
  760.     if ( info.mode == MPG_MD_JOINT_STEREO )
  761.     {
  762. fprintf( stderr, "Sorry, joint stereo not yet available for layer3n" );
  763. exit( 1 );
  764.     }
  765. #if 0
  766.     if ( info.version != MPEG_AUDIO_ID )
  767.     {
  768. fprintf( stderr, "Sorry, MPEG2-LSF not yet available for layer3n" );
  769. exit( 1 );
  770.     }
  771. #endif
  772.     if ( model != 2 )
  773.     {
  774. fprintf( stderr, "Sorry, psycho model 1 not available for layer3n" );
  775. exit( 1 );
  776.     }
  777. }
  778.     /* Figure average number of 'slots' per frame. */
  779.     /* Bitrate means TOTAL for both channels, not per side. */
  780.     avg_slots_per_frame = ((double)samplesPerFrame /
  781.                            s_freq[info.version][info.sampling_frequency]) *
  782.    ((double)bitrate[info.version][info.lay-1][info.bitrate_index] /
  783.     (double)bitsPerSlot);
  784.     whole_SpF = (int) avg_slots_per_frame;
  785.     printf("slots/frame = %dn",whole_SpF);
  786.     frac_SpF  = avg_slots_per_frame - (double)whole_SpF;
  787.     slot_lag  = -frac_SpF;
  788.     printf("frac SpF=%.3f, tot bitrate=%d kbps, s freq=%.1f kHzn",
  789.            frac_SpF, bitrate[info.version][info.lay-1][info.bitrate_index],
  790.            s_freq[info.version][info.sampling_frequency]);
  791.     
  792.     if (frac_SpF != 0)
  793. printf("Fractional number of slots, padding requiredn");
  794.     else info.padding = 0;
  795.     
  796.     while ( get_audio(musicin, buffer, num_samples, stereo, &info) > 0 )
  797.     {
  798. fprintf(stderr, "{%4lu}", frameNum++); fflush(stderr);
  799. win_buf[0] = &buffer[0][0];
  800. win_buf[1] = &buffer[1][0];
  801. if (frac_SpF != 0) {
  802.     if (slot_lag > (frac_SpF-1.0) ) {
  803. slot_lag -= frac_SpF;
  804. extra_slot = 0;
  805. info.padding = 0;
  806. /*  printf("No padding for this framen"); */
  807.     }
  808.     else {
  809. extra_slot = 1;
  810. info.padding = 1;
  811. slot_lag += (1-frac_SpF);
  812. /*  printf("Padding for this framen");    */
  813.     }
  814. }
  815. adb = (whole_SpF+extra_slot) * bitsPerSlot;
  816. switch (info.lay)
  817. {
  818.     
  819. /***************************** Layer I **********************************/
  820.     
  821.           case 1 :
  822.     for (j=0;j<SCALE_BLOCK;j++)
  823. for (k=0;k<stereo;k++) {
  824.     window_subband(&win_buf[k], &(*win_que)[k][0], k);
  825.     filter_subband(&(*win_que)[k][0], &(*sb_sample)[k][0][j][0]);
  826. }
  827.     
  828.     I_scale_factor_calc(*sb_sample, scalar, stereo);
  829.     if(fr_ps.actual_mode == MPG_MD_JOINT_STEREO) {
  830.                 I_combine_LR(*sb_sample, *j_sample);
  831.                 I_scale_factor_calc(j_sample, &j_scale, 1);
  832.     }
  833.     
  834.     put_scale(scalar, &fr_ps, max_sc);
  835.     
  836.     if (model == 1) I_Psycho_One(buffer, max_sc, ltmin, &fr_ps);
  837.     else {
  838.                 for (k=0;k<stereo;k++) {
  839.     psycho_anal(&buffer[k][0],&sam[k][0], k, info.lay, snr32,
  840. (FLOAT)s_freq[info.version][info.sampling_frequency]*1000);
  841.     for (i=0;i<SBLIMIT;i++) ltmin[k][i] = (double) snr32[i];
  842.                 }
  843.     }
  844.     
  845.     I_main_bit_allocation(ltmin, bit_alloc, &adb, &fr_ps);
  846.     
  847.     if (error_protection) I_CRC_calc(&fr_ps, bit_alloc, &crc);
  848.     
  849.     encode_info(&fr_ps, &bs);
  850.     
  851.     if (error_protection) encode_CRC(crc, &bs);
  852.     
  853.     I_encode_bit_alloc(bit_alloc, &fr_ps, &bs);
  854.     I_encode_scale(scalar, bit_alloc, &fr_ps, &bs);
  855.     I_subband_quantization(scalar, *sb_sample, j_scale, *j_sample,
  856.    bit_alloc, *subband, &fr_ps);
  857.     I_sample_encoding(*subband, bit_alloc, &fr_ps, &bs);
  858.     for (i=0;i<adb;i++) put1bit(&bs, 0);
  859.     break;
  860.     
  861. /***************************** Layer 2 **********************************/
  862.     
  863.           case 2 :
  864.     for (i=0;i<3;i++) for (j=0;j<SCALE_BLOCK;j++)
  865.                 for (k=0;k<stereo;k++) {
  866.     window_subband(&win_buf[k], &(*win_que)[k][0], k);
  867.     filter_subband(&(*win_que)[k][0], &(*sb_sample)[k][i][j][0]);
  868.                 }
  869.     
  870.     II_scale_factor_calc(*sb_sample, scalar, stereo, fr_ps.sblimit);
  871.     pick_scale(scalar, &fr_ps, max_sc);
  872.     if(fr_ps.actual_mode == MPG_MD_JOINT_STEREO) {
  873. II_combine_LR(*sb_sample, *j_sample, fr_ps.sblimit);
  874. II_scale_factor_calc(j_sample, &j_scale, 1, fr_ps.sblimit);
  875.     }       /* this way we calculate more mono than we need */
  876.     /* but it is cheap */
  877.     
  878.     if (model == 1) II_Psycho_One(buffer, max_sc, ltmin, &fr_ps);
  879.     else {
  880. for (k=0;k<stereo;k++) {
  881.     psycho_anal(&buffer[k][0],&sam[k][0], k, 
  882. info.lay, snr32,
  883. (FLOAT)s_freq[info.version][info.sampling_frequency]*1000);
  884.     for (i=0;i<SBLIMIT;i++) ltmin[k][i] = (double) snr32[i];
  885. }
  886.     }
  887.     
  888.     II_transmission_pattern(scalar, scfsi, &fr_ps);
  889.     II_main_bit_allocation(ltmin, scfsi, bit_alloc, &adb, &fr_ps);
  890.     
  891.     if (error_protection)
  892. II_CRC_calc(&fr_ps, bit_alloc, scfsi, &crc);
  893.     
  894.     encode_info(&fr_ps, &bs);
  895.     
  896.     if (error_protection) encode_CRC(crc, &bs);
  897.     
  898.     II_encode_bit_alloc(bit_alloc, &fr_ps, &bs);
  899.     II_encode_scale(bit_alloc, scfsi, scalar, &fr_ps, &bs);
  900.     II_subband_quantization(scalar, *sb_sample, j_scale,
  901.     *j_sample, bit_alloc, *subband, &fr_ps);
  902.     II_sample_encoding(*subband, bit_alloc, &fr_ps, &bs);
  903.     for (i=0;i<adb;i++) put1bit(&bs, 0);
  904.     break;
  905.     
  906. /***************************** Layer 3 **********************************/
  907.   case 3:
  908.   {
  909.       /*
  910. large "auto" vars are static due to the Macintosh linker
  911.       */ 
  912.       static double xr[2][2][576];
  913.       static double xr_dec[2][2][576];
  914.       static double pe[2][2];
  915.       static int l3_enc[2][2][576];
  916.       static III_psy_ratio ratio;
  917.       static III_side_info_t l3_side;
  918.       static III_scalefac_t  scalefac;
  919.       int gr, mode_gr, ch;
  920.       int mean_bits, sideinfo_len;
  921.       
  922.       int bitsPerFrame = 8 * whole_SpF + (info.padding * 8);
  923.       mode_gr = (info.version == 1) ? 2 : 1;
  924.       /*
  925. determine the mean bitrate for main data
  926.       */
  927.       sideinfo_len = 32;
  928.       if ( info.version == 1 )
  929.       {   /* MPEG 1 */
  930.   if ( stereo == 1 )
  931.       sideinfo_len += 136;
  932.   else
  933.       sideinfo_len += 256;
  934.       }
  935.       else
  936.       {   /* MPEG 2 */
  937.   if ( stereo == 1 )
  938.       sideinfo_len += 72;
  939.   else
  940.       sideinfo_len += 136;
  941.       }
  942.       if ( info.error_protection )
  943.   sideinfo_len += 16;
  944.       mean_bits = (bitsPerFrame - sideinfo_len) / mode_gr;
  945.       /*
  946. psychoacoustic model
  947.       */
  948.       for ( gr = 0; gr < mode_gr; gr++ )
  949.   for ( ch = 0; ch < stereo; ch++ )
  950.   {
  951.       L3psycho_anal( &buffer[ch][gr*576], &sam[ch][0], ch, info.lay,
  952.      snr32, s_freq[info.version][info.sampling_frequency] * 1000.0,
  953.      &ratio.l[gr][ch][0], &ratio.s[gr][ch][0],
  954.      &pe[gr][ch], &l3_side.gr[gr].ch[ch].tt );
  955.   }
  956.       /*
  957. polyphase filtering
  958.       */
  959.       for( gr = 0; gr < mode_gr; gr++ )
  960.   for ( ch = 0; ch < stereo; ch++ )
  961.       for ( j = 0; j < 18; j++ )
  962.       {
  963.   window_subband( &win_buf[ch], &(*win_que)[ch][0], ch );
  964.   filter_subband( &(*win_que)[ch][0],  &(*l3_sb_sample)[ch][gr+1][j][0] );
  965.       }
  966.       /*
  967. apply mdct to the polyphase outputs
  968.       */
  969.       mdct_sub( l3_sb_sample, xr, stereo, &l3_side, mode_gr );
  970. #if 0
  971.       delay( xr, stereo );
  972. #endif
  973.       /*
  974. bit and noise allocation
  975.       */
  976.       iteration_loop( pe, xr, &ratio, &l3_side, l3_enc, mean_bits,
  977.       stereo, xr_dec, &scalefac, &fr_ps, 0, bitsPerFrame );
  978.       /*
  979. write the frame to the bitstream
  980.       */
  981.       III_format_bitstream( bitsPerFrame, &fr_ps, l3_enc, &l3_side, &scalefac, &bs,
  982.     xr, NULL, 0 );
  983.   }
  984.     break;  /* end of layer 3 */
  985.     
  986. } /* end switch  */
  987. frameBits = sstell( &bs ) - sentBits;
  988. if ( frameBits % bitsPerSlot )   /* a program failure */
  989.     fprintf( stderr, "Sent %ld bits = %ld slots plus %ldn",
  990.      frameBits, frameBits/bitsPerSlot,
  991.      frameBits%bitsPerSlot );
  992. sentBits += frameBits;
  993.     }    
  994.     if ( info.lay == 3 )
  995. III_FlushBitstream();
  996.     close_bit_stream_w( &bs );
  997.     printf("Avg slots/frame = %.3f; b/smp = %.2f; br = %.3f kbpsn",
  998.            (FLOAT) sentBits / (frameNum * bitsPerSlot),
  999.            (FLOAT) sentBits / (frameNum * samplesPerFrame),
  1000.            (FLOAT) sentBits / (frameNum * samplesPerFrame) *
  1001.            s_freq[info.version][info.sampling_frequency]);
  1002.     if (fclose(musicin) != 0){
  1003. printf("Could not close "%s".n", original_file_name);
  1004. exit(2);
  1005.     }
  1006. #ifdef  MACINTOSH
  1007.     set_mac_file_attr( encoded_file_name, VOL_REF_NUM, CREATOR_ENCODE,
  1008.        FILETYPE_ENCODE );
  1009. #endif
  1010.     printf("Encoding of "%s" with psychoacoustic model %d is finishedn",
  1011.            original_file_name, model);
  1012.     printf("The MPEG encoded output file name is "%s"n",
  1013.    encoded_file_name);
  1014.     exit(0);
  1015. }
  1016.  
  1017. /************************************************************************
  1018. *
  1019. * usage
  1020. *
  1021. * PURPOSE:  Writes command line syntax to the file specified by #stderr#
  1022. *
  1023. ************************************************************************/
  1024. void usage()  /* print syntax & exit */
  1025. {
  1026.     fprintf(stderr,
  1027.     "usage: %s                         queries for all arguments, orn",
  1028.             programName);
  1029.     fprintf(stderr,
  1030.     "       %s [-l lay][-m mode][-p psy][-s sfrq][-b br][-d emp]n",
  1031.             programName);
  1032.     fprintf(stderr,
  1033.     "          [-c][-o][-e] inputPCM [outBS]n");
  1034.     fprintf(stderr,"wheren");
  1035.     fprintf(stderr," -l lay   use layer <lay> coding   (dflt %4u)n",DFLT_LAY);
  1036.     fprintf(stderr," -m mode  channel mode : s/d/j/m   (dflt %4c)n",DFLT_MOD);
  1037.     fprintf(stderr," -p psy   psychoacoustic model 1/2 (dflt %4u)n",DFLT_PSY);
  1038.     fprintf(stderr," -s sfrq  input smpl rate in kHz   (dflt %4.1f)n",DFLT_SFQ);
  1039.     fprintf(stderr," -b br    total bitrate in kbps    (dflt highest)n");
  1040.     fprintf(stderr," -d emp   de-emphasis n/5/c        (dflt %4c)n",DFLT_EMP);
  1041.     fprintf(stderr," -c       mark as copyrightn");
  1042.     fprintf(stderr," -o       mark as originaln");
  1043.     fprintf(stderr," -e       add error protectionn");
  1044.     fprintf(stderr," inputPCM input PCM sound file (standard or AIFF)n");
  1045.     fprintf(stderr," outBS    output bit stream of encoded audio (dflt inName+%s)n",
  1046.             DFLT_EXT);
  1047.     exit(1);
  1048. }
  1049. /************************************************************************
  1050. *
  1051. * aiff_check
  1052. *
  1053. * PURPOSE:  Checks AIFF header information to make sure it is valid.
  1054. *           Exits if not.
  1055. *
  1056. ************************************************************************/
  1057. void aiff_check( char *file_name, IFF_AIFF *pcm_aiff_data, int *version)
  1058. {
  1059.     if (pcm_aiff_data->sampleType != IFF_ID_SSND) {
  1060.        printf("Sound data is not PCM in "%s".n", file_name);
  1061.        exit(1);
  1062.     }
  1063.     if(SmpFrqIndex((long)pcm_aiff_data->sampleRate, version) < 0) {
  1064.        printf("in "%s".n", file_name);
  1065.        exit(1);
  1066.     }
  1067.     if (pcm_aiff_data->sampleSize != sizeof(short) * BITS_IN_A_BYTE) {
  1068.         printf("Sound data is not %d bits in "%s".n",
  1069.                sizeof(short) * BITS_IN_A_BYTE, file_name);
  1070.         exit(1);
  1071.     }
  1072.     if (pcm_aiff_data->numChannels != MONO &&
  1073.         pcm_aiff_data->numChannels != STEREO) {
  1074.        printf("Sound data is not mono or stereo in "%s".n", file_name);
  1075.        exit(1);
  1076.     }
  1077.     if (pcm_aiff_data->blkAlgn.blockSize != 0) {
  1078.        printf("Block size is not %d bytes in "%s".n", 0, file_name);
  1079.        exit(1);
  1080.     }
  1081.     if (pcm_aiff_data->blkAlgn.offset != 0) {
  1082.        printf("Block offset is not %d bytes in "%s".n", 0, file_name);
  1083.        exit(1);
  1084.     }
  1085. }