src1.c
上传用户:yisoukefu
上传日期:2020-08-09
资源大小:39506k
文件大小:14k
源码类别:

其他游戏

开发平台:

Visual C++

  1. #include <windows.h>
  2. #include <math.h>
  3. #define ARCH_X86
  4. typedef UINT uint32_t;
  5. typedef WORD uint16_t;
  6. #define real float
  7. #include "mpg123.h"
  8. #define fast_memcpy memcpy
  9. static _inline uint16_t bswap_16(uint16_t x)
  10. {
  11. __asm mov ax, x
  12. __asm bswap eax; 
  13. __asm shr eax, 16
  14. }
  15. static _inline uint32_t bswap_32(uint32_t x)
  16. {
  17. __asm mov eax, x
  18. __asm bswap eax; 
  19. }
  20. #define DECLARE_ALIGNED(n,t,v)      __declspec(align(n)) t v
  21. #define LOCAL static _inline
  22. #include        <stdlib.h>
  23. #include        <stdio.h>
  24. #include        <string.h>
  25. #include        <signal.h>
  26. #include        <math.h>
  27. #include "mpg123.h"
  28. #include "huffman.h"
  29. //#include "mp_msg.h"
  30. int MP3_frames=0;
  31. int MP3_eof=0;
  32. int MP3_pause=0;
  33. int MP3_filesize=0;
  34. int MP3_fpos=0;      // current file position
  35. int MP3_framesize=0; // current framesize
  36. int MP3_bitrate=0;   // current bitrate
  37. int MP3_samplerate=0;  // current samplerate
  38. int MP3_resync=0;
  39. int MP3_channels=0;
  40. int MP3_bps=2;
  41. static long outscale = 32768;
  42. #include "tabinit.c"
  43. #if 1
  44. extern int mplayer_audio_read(char *buf,int size);
  45. LOCAL int mp3_read(char *buf,int size){
  46. //  int len=fread(buf,1,size,mp3_file);
  47.   int len=mplayer_audio_read(buf,size);
  48.   if(len>0) MP3_fpos+=len;
  49. //  if(len!=size) MP3_eof=1;
  50.   return len;
  51. }
  52. #else
  53. extern int mp3_read(char *buf,int size);
  54. #endif
  55. /*
  56.  * Modified for use with MPlayer, for details see the changelog at
  57.  * http://svn.mplayerhq.hu/mplayer/trunk/
  58.  * $Id: sr1.c 23515 2007-06-08 14:38:25Z zuxy $
  59.  */
  60. //void mp3_seek(int pos){
  61. //  fseek(mp3_file,pos,SEEK_SET);
  62. //  return (MP3_fpos=ftell(mp3_file));
  63. //}
  64. /*       Frame reader           */
  65. #define MAXFRAMESIZE 1280
  66. #define MAXFRAMESIZE2 (512+MAXFRAMESIZE)
  67. static int fsizeold=0,ssize=0;
  68. static unsigned char bsspace[2][MAXFRAMESIZE2]; /* !!!!! */
  69. static unsigned char *bsbufold=bsspace[0]+512;
  70. static unsigned char *bsbuf=bsspace[1]+512;
  71. static int bsnum=0;
  72. static int bitindex;
  73. static unsigned char *wordpointer;
  74. static int bitsleft;
  75. static unsigned char *pcm_sample;   /* outbuffer address */
  76. static int pcm_point = 0;           /* outbuffer offset */
  77. static struct frame fr;
  78. static int tabsel_123[2][3][16] = {
  79.    { {0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,},
  80.      {0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,},
  81.      {0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,} },
  82.    { {0,32,48,56,64,80,96,112,128,144,160,176,192,224,256,},
  83.      {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,},
  84.      {0,8,16,24,32,40,48,56,64,80,96,112,128,144,160,} }
  85. };
  86. static int freqs[9] = { 44100, 48000, 32000, 22050, 24000, 16000 , 11025 , 12000 , 8000 };
  87. LOCAL unsigned int getbits(short number_of_bits)
  88. {
  89.   unsigned rval;
  90. //  if(MP3_frames>=7741) printf("getbits: bits=%d  bitsleft=%d  wordptr=%xn",number_of_bits,bitsleft,wordpointer);
  91.   if((bitsleft-=number_of_bits)<0) return 0;
  92.   if(!number_of_bits) return 0;
  93.          rval = wordpointer[0];
  94.          rval <<= 8;
  95.          rval |= wordpointer[1];
  96.          rval <<= 8;
  97.          rval |= wordpointer[2];
  98.          rval <<= bitindex;
  99.          rval &= 0xffffff;
  100.          bitindex += number_of_bits;
  101.          rval >>= (24-number_of_bits);
  102.          wordpointer += (bitindex>>3);
  103.          bitindex &= 7;
  104.   return rval;
  105. }
  106. LOCAL unsigned int getbits_fast(short number_of_bits)
  107. {
  108.   unsigned rval;
  109. //  if(MP3_frames>=7741) printf("getbits_fast: bits=%d  bitsleft=%d  wordptr=%xn",number_of_bits,bitsleft,wordpointer);
  110.   if((bitsleft-=number_of_bits)<0) return 0;
  111.   if(!number_of_bits) return 0;
  112. #ifdef ARCH_X86
  113.   rval = bswap_16(*((uint16_t *)wordpointer));
  114. #else
  115.   /*
  116.    * we may not be able to address unaligned 16-bit data on non-x86 cpus.
  117.    * Fall back to some portable code.
  118.    */
  119.   rval = wordpointer[0] << 8 | wordpointer[1];
  120. #endif
  121.          rval <<= bitindex;
  122.          rval &= 0xffff;
  123.          bitindex += number_of_bits;
  124.          rval >>= (16-number_of_bits);
  125.          wordpointer += (bitindex>>3);
  126.          bitindex &= 7;
  127.   return rval;
  128. }
  129. LOCAL unsigned int get1bit(void)
  130. {
  131.   unsigned char rval;
  132. //  if(MP3_frames>=7741) printf("get1bit: bitsleft=%d  wordptr=%xn",bitsleft,wordpointer);
  133.   if((--bitsleft)<0) return 0;
  134.   rval = *wordpointer << bitindex;
  135.   bitindex++;
  136.   wordpointer += (bitindex>>3);
  137.   bitindex &= 7;
  138.   return ((rval>>7)&1);
  139. }
  140. LOCAL void set_pointer(int backstep)
  141. {
  142. //  if(backstep!=512 && backstep>fsizeold)
  143. //    printf("rWarning! backstep (%d>%d)                                         n",backstep,fsizeold);
  144.   wordpointer = bsbuf + ssize - backstep;
  145.   if (backstep) fast_memcpy(wordpointer,bsbufold+fsizeold-backstep,backstep);
  146.   bitindex = 0;
  147.   bitsleft+=8*backstep;
  148. //  printf("Backstep %d  (bitsleft=%d)n",backstep,bitsleft);
  149. }
  150. LOCAL int stream_head_read(unsigned char *hbuf,uint32_t *newhead){
  151.   if(mp3_read(hbuf,4) != 4) return FALSE;
  152. #ifdef ARCH_X86
  153.   *newhead = bswap_32(*((uint32_t*)hbuf));
  154. #else
  155.   /*
  156.    * we may not be able to address unaligned 32-bit data on non-x86 cpus.
  157.    * Fall back to some portable code.
  158.    */
  159.   *newhead = 
  160.       hbuf[0] << 24 |
  161.       hbuf[1] << 16 |
  162.       hbuf[2] <<  8 |
  163.       hbuf[3];
  164. #endif
  165.   return TRUE;
  166. }
  167. LOCAL int stream_head_shift(unsigned char *hbuf,uint32_t *head){
  168.   *((uint32_t*)hbuf) >>= 8;
  169.   if(mp3_read(hbuf+3,1) != 1) return 0;
  170.   *head <<= 8;
  171.   *head |= hbuf[3];
  172.   return 1;
  173. }
  174. /*
  175.  * decode a header and write the information
  176.  * into the frame structure
  177.  */
  178. LOCAL int decode_header(struct frame *fr,uint32_t newhead){
  179.     // head_check:
  180.     if( (newhead & 0xffe00000) != 0xffe00000 ||  
  181.         (newhead & 0x0000fc00) == 0x0000fc00) return FALSE;
  182.     fr->lay = 4-((newhead>>17)&3);
  183. //    if(fr->lay!=3) return FALSE;
  184.     if( newhead & (1<<20) ) {
  185.       fr->lsf = (newhead & (1<<19)) ? 0x0 : 0x1;
  186.       fr->mpeg25 = 0;
  187.     } else {
  188.       fr->lsf = 1;
  189.       fr->mpeg25 = 1;
  190.     }
  191.     if(fr->mpeg25)
  192.       fr->sampling_frequency = 6 + ((newhead>>10)&0x3);
  193.     else
  194.       fr->sampling_frequency = ((newhead>>10)&0x3) + (fr->lsf*3);
  195.     if(fr->sampling_frequency>8) return FALSE;  // valid: 0..8
  196.     fr->error_protection = ((newhead>>16)&0x1)^0x1;
  197.     fr->bitrate_index = ((newhead>>12)&0xf);
  198.     fr->padding   = ((newhead>>9)&0x1);
  199.     fr->extension = ((newhead>>8)&0x1);
  200.     fr->mode      = ((newhead>>6)&0x3);
  201.     fr->mode_ext  = ((newhead>>4)&0x3);
  202.     fr->copyright = ((newhead>>3)&0x1);
  203.     fr->original  = ((newhead>>2)&0x1);
  204.     fr->emphasis  = newhead & 0x3;
  205.     MP3_channels = fr->stereo    = (fr->mode == MPG_MD_MONO) ? 1 : 2;
  206.     if(!fr->bitrate_index){
  207. //      fprintf(stderr,"Free format not supported.n");
  208.       return FALSE;
  209.     }
  210. switch(fr->lay){
  211.   case 2:
  212.     MP3_bitrate=tabsel_123[fr->lsf][1][fr->bitrate_index];
  213.     MP3_samplerate=freqs[fr->sampling_frequency];
  214.     fr->framesize = MP3_bitrate * 144000;
  215.     fr->framesize /= MP3_samplerate;
  216.     MP3_framesize=fr->framesize;
  217.     fr->framesize += fr->padding - 4;
  218.     break;
  219.   case 3:
  220.     if(fr->lsf)
  221.       ssize = (fr->stereo == 1) ? 9 : 17;
  222.     else
  223.       ssize = (fr->stereo == 1) ? 17 : 32;
  224.     if(fr->error_protection) ssize += 2;
  225.     MP3_bitrate=tabsel_123[fr->lsf][2][fr->bitrate_index];
  226.     MP3_samplerate=freqs[fr->sampling_frequency];
  227.     fr->framesize  = MP3_bitrate * 144000;
  228.     fr->framesize /= MP3_samplerate<<(fr->lsf);
  229.     MP3_framesize=fr->framesize;
  230.     fr->framesize += fr->padding - 4;
  231.     break;
  232.   case 1:
  233. //    fr->jsbound = (fr->mode == MPG_MD_JOINT_STEREO) ? (fr->mode_ext<<2)+4 : 32;
  234.     MP3_bitrate=tabsel_123[fr->lsf][0][fr->bitrate_index];
  235.     MP3_samplerate=freqs[fr->sampling_frequency];
  236.     fr->framesize  = MP3_bitrate * 12000;
  237.     fr->framesize /= MP3_samplerate;
  238.     MP3_framesize  = ((fr->framesize+fr->padding)<<2);
  239.     fr->framesize  = MP3_framesize-4;
  240. //    printf("framesize=%dn",fr->framesize);
  241.     break;
  242.   default:
  243.     MP3_framesize=fr->framesize=0;
  244. //    fprintf(stderr,"Sorry, unsupported layer type.n");
  245.     return 0;
  246. }
  247.     if(fr->framesize<=0 || fr->framesize>MAXFRAMESIZE) return FALSE;
  248.     return 1;
  249. }
  250. LOCAL int stream_read_frame_body(int size){
  251.   /* flip/init buffer for Layer 3 */
  252.   bsbufold = bsbuf;
  253.   bsbuf = bsspace[bsnum]+512;
  254.   bsnum = (bsnum + 1) & 1;
  255.   if( mp3_read(bsbuf,size) != size) return 0; // broken frame
  256.   bitindex = 0;
  257.   wordpointer = (unsigned char *) bsbuf;
  258.   bitsleft=8*size;
  259.   return 1;
  260. }
  261. /*****************************************************************
  262.  * read next frame     return number of frames read.
  263.  */
  264. LOCAL int read_frame(struct frame *fr){
  265.   uint32_t newhead;
  266.   union {
  267.     unsigned char buf[8];
  268.     unsigned long dummy; // for alignment
  269.   } hbuf;
  270.   int skipped,resyncpos;
  271.   int frames=0;
  272. resync:
  273.   skipped=MP3_fpos;
  274.   resyncpos=MP3_fpos;
  275.   set_pointer(512);
  276.   fsizeold=fr->framesize;       /* for Layer3 */
  277.   if(!stream_head_read(hbuf.buf,&newhead)) return 0;
  278.   if(!decode_header(fr,newhead)){
  279.     // invalid header! try to resync stream!
  280. #ifdef DEBUG_RESYNC
  281.     printf("ReSync: searching for a valid header...  (pos=%X)n",MP3_fpos);
  282. #endif
  283. retry1:
  284.     while(!decode_header(fr,newhead)){
  285.       if(!stream_head_shift(hbuf.buf,&newhead)) return 0;
  286.     }
  287.     resyncpos=MP3_fpos-4;
  288.     // found valid header
  289. #ifdef DEBUG_RESYNC
  290.     printf("ReSync: found valid hdr at %X  fsize=%ld  ",resyncpos,fr->framesize);
  291. #endif
  292.     if(!stream_read_frame_body(fr->framesize)) return 0; // read body
  293.     set_pointer(512);
  294.     fsizeold=fr->framesize;       /* for Layer3 */
  295.     if(!stream_head_read(hbuf.buf,&newhead)) return 0;
  296.     if(!decode_header(fr,newhead)){
  297.       // invalid hdr! go back...
  298. #ifdef DEBUG_RESYNC
  299.       printf("INVALIDn");
  300. #endif
  301. //      mp3_seek(resyncpos+1);
  302.       if(!stream_head_read(hbuf.buf,&newhead)) return 0;
  303.       goto retry1;
  304.     }
  305. #ifdef DEBUG_RESYNC
  306.     printf("OK!n");
  307.     ++frames;
  308. #endif
  309.   }
  310.   skipped=resyncpos-skipped;
  311. //  if(skipped && !MP3_resync) printf("r%d bad bytes skipped  (resync at 0x%X)                          n",skipped,resyncpos);
  312. //  printf("%8X [%08X] %d %d (%d)%s%sn",MP3_fpos-4,newhead,fr->framesize,fr->mode,fr->mode_ext,fr->error_protection?" CRC":"",fr->padding?" PAD":"");
  313.   /* read main data into memory */
  314.   if(!stream_read_frame_body(fr->framesize)){
  315.     printf("nBroken frame at 0x%X                                                  n",resyncpos);
  316.     return 0;
  317.   }
  318.   ++frames;
  319.   if(MP3_resync){
  320.     MP3_resync=0;
  321.     if(frames==1) goto resync;
  322.   }
  323.   return frames;
  324. }
  325. static int _has_mmx = 0;  // used by layer2.c, layer3.c to pre-scale coeffs
  326. #include "layer2.c"
  327. #include "layer3.c"
  328. #include "layer1.c"
  329. /******************************************************************************/
  330. /*           PUBLIC FUNCTIONS                  */
  331. /******************************************************************************/
  332. /* It's hidden from gcc in assembler */
  333. extern void dct64_MMX(short *, short *, real *);
  334. extern void dct64_MMX_3dnow(short *, short *, real *);
  335. extern void dct64_MMX_3dnowex(short *, short *, real *);
  336. extern void dct64_sse(short *, short *, real *);
  337. void (*dct64_MMX_func)(short *, short *, real *);
  338. #include "cpudetect.h"
  339. // Init decoder tables.  Call first, once!
  340. #ifdef USE_FAKE_MONO
  341. void MP3_Init(int fakemono){
  342. #else
  343. void MP3_Init(){
  344. #endif
  345. //gCpuCaps.hasMMX=gCpuCaps.hasMMX2=gCpuCaps.hasSSE=0; // for testing!
  346.     _has_mmx = 0;
  347.     dct36_func = dct36;
  348.     make_decode_tables(outscale);
  349. #ifdef HAVE_MMX
  350.     if (gCpuCaps.hasMMX)
  351.     {
  352. _has_mmx = 1;
  353. synth_func = synth_1to1_MMX;
  354.     }
  355. #endif
  356. #ifdef HAVE_3DNOWEX
  357.     if (gCpuCaps.has3DNowExt)
  358.     {
  359. dct36_func=dct36_3dnowex;
  360. dct64_MMX_func= dct64_MMX_3dnowex;
  361. mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: using 3DNow!Ex optimized decore!n");
  362.     }
  363.     else
  364. #endif
  365. #ifdef HAVE_3DNOW
  366.     if (gCpuCaps.has3DNow)
  367.     {
  368. dct36_func = dct36_3dnow;
  369. dct64_MMX_func = dct64_MMX_3dnow;
  370. mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: using 3DNow! optimized decore!n");
  371.     }
  372.     else
  373. #endif
  374. #ifdef HAVE_SSE
  375.     if (gCpuCaps.hasSSE)
  376.     {
  377. dct64_MMX_func = dct64_sse;
  378. mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: using SSE optimized decore!n");
  379.     }
  380.     else
  381. #endif
  382. #ifdef ARCH_X86_32
  383. #ifdef HAVE_MMX
  384.     if (gCpuCaps.hasMMX)
  385.     {
  386. dct64_MMX_func = dct64_MMX;
  387. mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: using MMX optimized decore!n");
  388.     }
  389.     else
  390. #endif
  391.     if (gCpuCaps.cpuType >= CPUTYPE_I586)
  392.     {
  393. synth_func = synth_1to1_pent;
  394. mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: using Pentium optimized decore!n");
  395.     }
  396.     else
  397. #endif /* ARCH_X86_32 */
  398. #ifdef HAVE_ALTIVEC
  399.     if (gCpuCaps.hasAltiVec)
  400.     {
  401. mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: using AltiVec optimized decore!n");
  402.     }
  403.     else
  404. #endif
  405.     {
  406. synth_func = NULL; /* use default c version */
  407. /// mp_msg(MSGT_DECAUDIO,MSGL_V,"mp3lib: using generic C decore!n");
  408.     }
  409. #ifdef USE_FAKE_MONO
  410.     if (fakemono == 1)
  411.         fr.synth=synth_1to1_l;
  412.     else if (fakemono == 2)
  413.         fr.synth=synth_1to1_r;
  414.     else
  415.         fr.synth=synth_1to1;
  416. #else
  417.     fr.synth=synth_1to1;
  418. #endif
  419.     fr.synth_mono=synth_1to1_mono2stereo;
  420.     fr.down_sample=0;
  421.     fr.down_sample_sblimit = SBLIMIT>>(fr.down_sample);
  422.     init_layer2();
  423.     init_layer3(fr.down_sample_sblimit);
  424. ///    mp_msg(MSGT_DECAUDIO,MSGL_V,"MP3lib: init layer2&3 finished, tables donen");
  425. }
  426. // Read & decode a single frame. Called by sound driver.
  427. int MP3_DecodeFrame(unsigned char *hova,short single){
  428.    pcm_sample = hova;
  429.    pcm_point = 0;
  430.    if(!read_frame(&fr))return(0);
  431.    if(single==-2){ set_pointer(512); return(1); }
  432.    if(fr.error_protection) getbits(16); /* skip crc */
  433.    fr.single=single;
  434.    switch(fr.lay){
  435.      case 2: do_layer2(&fr,single);break;
  436.      case 3: do_layer3(&fr,single);break;
  437.      case 1: do_layer1(&fr,single);break;
  438.      default:
  439.          return 0; // unsupported
  440.    }
  441. //   ++MP3_frames;
  442.    return(pcm_point?pcm_point:2);
  443. }