📄 musicout.c
字号:
/**********************************************************************Copyright (c) 1991 MPEG/audio software simulation group, All Rights Reservedmusicout.c**********************************************************************//********************************************************************** * MPEG/audio coding/decoding software, work in progress * * NOT for public distribution until verified and approved by the * * MPEG/audio committee. For further information, please contact * * Chad Fogg email: <cfogg@xenon.com> * * * * VERSION 4.1 * * changes made since last update: * * date programmers comment * * 2/25/91 Douglas Wong start of version 1.0 records * * 3/06/91 Douglas Wong rename setup.h to dedef.h * * removed extraneous variables * * removed window_samples (now part of * * filter_samples) * * 3/07/91 Davis Pan changed output file to "codmusic" * * 5/10/91 Vish (PRISM) Ported to Macintosh and Unix. * * Incorporated new "out_fifo()" which * * writes out last incomplete buffer. * * Incorporated all AIFF routines which * * are also compatible with SUN. * * Incorporated user interface for * * specifying sound file names. * * Also incorporated user interface for * * writing AIFF compatible sound files. * * 27jun91 dpwe (Aware) Added musicout and &sample_frames as * * args to out_fifo (were glob refs). * * Used new 'frame_params' struct. * * Clean,simplify, track clipped output * * and total bits/frame received. * * 7/10/91 Earle Jennings changed to floats to FLOAT * *10/ 1/91 S.I. Sudharsanan, Ported to IBM AIX platform. * * Don H. Lee, * * Peter W. Farrett * *10/ 3/91 Don H. Lee implemented CRC-16 error protection * * newly introduced functions are * * buffer_CRC and recover_CRC_error * * Additions and revisions are marked * * with "dhl" for clarity * * 2/11/92 W. Joseph Carter Ported new code to Macintosh. Most * * important fixes involved changing * * 16-bit ints to long or unsigned in * * bit alloc routines for quant of 65535 * * and passing proper function args. * * Removed "Other Joint Stereo" option * * and made bitrate be total channel * * bitrate, irrespective of the mode. * * Fixed many small bugs & reorganized. * *19 aug 92 Soren H. Nielsen Changed MS-DOS file name extensions. * * 8/27/93 Seymour Shlien, Fixes in Unix and MSDOS ports, * * Daniel Lauzon, and * * Bill Truerniet * *--------------------------------------------------------------------* * 4/23/92 J. Pineda Added code for layer III. LayerIII * * Amit Gulati decoding is currently performed in * * two-passes for ease of sideinfo and * * maindata buffering and decoding. * * The second (computation) pass is * * activated with "decode -3 <outfile>" * * 10/25/92 Amit Gulati Modified usage() for layerIII * * 12/10/92 Amit Gulati Changed processing order of re-order- * * -ing step. Fixed adjustment of * * main_data_end pointer to exclude * * side information. * * 9/07/93 Toshiyuki Ishino Integrated Layer III with Ver 3.9. * *--------------------------------------------------------------------* * 11/20/93 Masahiro Iwadare Integrated Layer III with Ver 4.0. * *--------------------------------------------------------------------* * 7/14/94 Juergen Koller Bug fixes in Layer III code * **********************************************************************/#include "common.h"#include "decoder.h"/********************************************************************/*/* This part contains the MPEG I decoder for Layers I & II./*/*********************************************************************//****************************************************************/*/* For MS-DOS user (Turbo c) change all instance of malloc/* to _farmalloc and free to _farfree. Compiler model hugh/* Also make sure all the pointer specified are changed to far./*/*****************************************************************//*********************************************************************/*/* Core of the Layer II decoder. Default layer is Layer II./*/*********************************************************************//* Global variable definitions for "musicout.c" */char *programName;int main_data_slots();int side_info_slots();/* Implementations */main(argc, argv)int argc;char **argv;{/*typedef short PCM[2][3][SBLIMIT];*/typedef short PCM[2][SSLIMIT][SBLIMIT]; PCM FAR *pcm_sample;typedef unsigned int SAM[2][3][SBLIMIT]; SAM FAR *sample;typedef double FRA[2][3][SBLIMIT]; FRA FAR *fraction;typedef double VE[2][HAN_SIZE]; VE FAR *w; Bit_stream_struc bs; frame_params fr_ps; layer info; FILE *musicout; unsigned long sample_frames; int i, j, k, stereo, done=FALSE, clip, sync; int error_protection, crc_error_count, total_error_count; unsigned int old_crc, new_crc; unsigned int bit_alloc[2][SBLIMIT], scfsi[2][SBLIMIT], scale_index[2][3][SBLIMIT]; unsigned long bitsPerSlot, samplesPerFrame, frameNum = 0; unsigned long frameBits, gotBits = 0; IFF_AIFF pcm_aiff_data; char encoded_file_name[MAX_NAME_SIZE]; char decoded_file_name[MAX_NAME_SIZE]; char t[50]; int need_aiff; int need_esps; /* MI */ int topSb = 0;III_scalefac_t III_scalefac;III_side_info_t III_side_info;#ifdef MACINTOSH console_options.nrows = MAC_WINDOW_SIZE; argc = ccommand(&argv);#endif /* Most large variables are declared dynamically to ensure compatibility with smaller machines */ pcm_sample = (PCM FAR *) mem_alloc((long) sizeof(PCM), "PCM Samp"); sample = (SAM FAR *) mem_alloc((long) sizeof(SAM), "Sample"); fraction = (FRA FAR *) mem_alloc((long) sizeof(FRA), "fraction"); w = (VE FAR *) mem_alloc((long) sizeof(VE), "w"); fr_ps.header = &info; fr_ps.tab_num = -1; /* no table loaded */ fr_ps.alloc = NULL; for (i=0;i<HAN_SIZE;i++) for (j=0;j<2;j++) (*w)[j][i] = 0.0; programName = argv[0]; if(argc==1) { /* no command line args -> interact */ do { printf ("Enter encoded file name <required>: "); gets (encoded_file_name); if (encoded_file_name[0] == NULL_CHAR) printf ("Encoded file name is required. \n"); } while (encoded_file_name[0] == NULL_CHAR); printf (">>> Encoded file name is: %s \n", encoded_file_name);#ifdef MS_DOS printf ("Enter MPEG decoded file name <%s>: ", new_ext(encoded_file_name, DFLT_OPEXT)); /* 92-08-19 shn */#else printf ("Enter MPEG decoded file name <%s%s>: ", encoded_file_name, DFLT_OPEXT);#endif gets (decoded_file_name); if (decoded_file_name[0] == NULL_CHAR) {#ifdef MS_DOS /* replace old extension with new one, 92-08-19 shn */ strcpy(decoded_file_name,new_ext(encoded_file_name, DFLT_OPEXT));#else strcat (strcpy(decoded_file_name, encoded_file_name), DFLT_OPEXT);#endif } printf (">>> MPEG decoded file name is: %s \n", decoded_file_name); printf( "Do you wish to write an AIFF compatible sound file ? (y/<n>) : "); gets(t); if (*t == 'y' || *t == 'Y') need_aiff = TRUE; else need_aiff = FALSE; if (need_aiff) printf(">>> An AIFF compatible sound file will be written\n"); else printf(">>> A non-headered PCM sound file will be written\n"); printf( "Do you wish to exit (last chance before decoding) ? (y/<n>) : "); gets(t); if (*t == 'y' || *t == 'Y') exit(0); } else { /* interpret CL Args */ int i=0, err=0; need_aiff = FALSE; need_esps = FALSE; /* MI */ encoded_file_name[0] = '\0'; decoded_file_name[0] = '\0'; while(++i<argc && err == 0) { char c, *token, *arg, *nextArg; int argUsed; token = argv[i]; if(*token++ == '-') { if(i+1 < argc) nextArg = argv[i+1]; else nextArg = ""; argUsed = 0; while(c = *token++) { if(*token /* NumericQ(token) */) arg = token; else arg = nextArg; switch(c) { case 's': topSb = atoi(arg); argUsed = 1; if(topSb<1 || topSb>SBLIMIT) { fprintf(stderr, "%s: -s band %s not %d..%d\n", programName, arg, 1, SBLIMIT); err = 1; } break; case 'A': need_aiff = TRUE; break; case 'E': need_esps = TRUE; break; /* MI */ default: fprintf(stderr,"%s: unrecognized option %c\n", programName, c); err = 1; break; } if(argUsed) { if(arg == token) token = ""; /* no more from token */ else ++i; /* skip arg we used */ arg = ""; argUsed = 0; } } } else { if(encoded_file_name[0] == '\0') strcpy(encoded_file_name, argv[i]); else if(decoded_file_name[0] == '\0') strcpy(decoded_file_name, argv[i]); else { fprintf(stderr, "%s: excess arg %s\n", programName, argv[i]); err = 1; } } } if(err || encoded_file_name[0] == '\0') usage(); /* never returns */ if(decoded_file_name[0] == '\0') { strcpy(decoded_file_name, encoded_file_name); strcat(decoded_file_name, DFLT_OPEXT); } } /* report results of dialog / command line */ printf("Input file = '%s' output file = '%s'\n", encoded_file_name, decoded_file_name); if(need_aiff) printf("Output file written in AIFF format\n"); if(need_esps) printf("Output file written in ESPS format\n"); /* MI */ if ((musicout = fopen(decoded_file_name, "w+b")) == NULL) { printf ("Could not create \"%s\".\n", decoded_file_name); exit(1); } open_bit_stream_r(&bs, encoded_file_name, BUFFER_SIZE); if (need_aiff)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -