song_drv.lst

来自「atmel at89c51snd1c mp3芯片方案源码」· LST 代码 · 共 636 行 · 第 1/2 页

LST
636
字号
 301   1      return 0;
 302   1      }
C51 COMPILER V7.50   SONG_DRV                                                              02/16/2009 09:59:52 PAGE 6   

 303          
 304          
 305          /*F**************************************************************************
 306          * NAME: song_init
 307          *----------------------------------------------------------------------------
 308          * PARAMS:
 309          *
 310          * return:
 311          *   header status:  SONG_NO_ERR:    header ok
 312          *                   SONG_LAYER_ERR: not a layer 3 file
 313          *                   SONG_BR_ERR:    bit rate not supported
 314          *                   SONG_FS_ERR:    bad frequency sampling
 315          *                   SONG_SYNC_ERR:  no header found
 316          *----------------------------------------------------------------------------
 317          * PURPOSE: 
 318          *   Search frame header and initialize song playing according to this header
 319          *----------------------------------------------------------------------------
 320          * EXAMPLE:
 321          *----------------------------------------------------------------------------
 322          * NOTE:
 323          *   Header search is stopped when errors number exceeds 
 324          *----------------------------------------------------------------------------
 325          * REQUIREMENTS:
 326          *****************************************************************************/
 327          Byte song_init (void)
 328          {
 329   1      Byte    b, c;
 330   1      Byte    head_status;                        /* return error byte */
 331   1      Byte    err_count;                          /* error counter */
 332   1      bit     err_set;                            /* error flag */
 333   1      Byte    bit_rate;                           /* Bit Rate  */
 334   1      Byte    song_fs;                            /* Frequency sample */
 335   1      Byte    song_version;                       /* Song verison : MPEG1 or MPEG2 */
 336   1      Uint16  song_one_frame_size;                /* Size of one frame */
 337   1      
 338   1      
 339   1        head_status = SONG_NO_ERR;
 340   1        err_count = SONG_MAX_ERR;
 341   1        while (!Feof())
 342   1        {
 343   2          if (err_count != 0)
 344   2          { /* continue searching synchro */
 345   3            if (Fgetc() == MP3_SYNC_H)
 346   3            { /* high order sync found */
 347   4              b = Fgetc();
 348   4              if ((b & MP3_MSK_SYNC) == MP3_SYNC_L)
 349   4              { /* low order sync found */
 350   5                if ((b & MP3_MSK_LAYER) != MP3_LAYER_III)
 351   5                {
 352   6                  Fseek( (Int16) -1 );
 353   6                  head_status |= SONG_LAYER_ERR;  /* bad layer */
 354   6                  err_count--;
 355   6                }
 356   5                else
 357   5                {
 358   6                  c = Fgetc();
 359   6                  if (c & 0x02)
 360   6                    song_one_frame_size = 1;
 361   6                  else
 362   6                    song_one_frame_size = 0;
 363   6                  b = (b & MP3_MSK_VER) >> 1;       /* keep MPEG Version B3 -> B2 */
 364   6      
C51 COMPILER V7.50   SONG_DRV                                                              02/16/2009 09:59:52 PAGE 7   

 365   6                  if (b)
 366   6                  {
 367   7                    song_version = 0;   /* Version MPEG1 */
 368   7                  }
 369   6                  else
 370   6                  {
 371   7                    song_version = 1;   /* Version MPEG2 */
 372   7                  }
 373   6                  bit_rate = c >> 4;
 374   6                  song_fs = (c & MP3_MSK_FS) >> 2;
 375   6                  switch (song_fs)
 376   6                  {
 377   7                    case 0x00 :   /* 44100 Hz / 22050 Hz */
 378   7                      song_one_frame_size += song_tab_frame_size_00[song_version][bit_rate];
 379   7                      break;
 380   7                    case 0x01 :   /* 48000 Hz / 24000 Hz */
 381   7                      song_one_frame_size += song_tab_frame_size_01[song_version][bit_rate];
 382   7                      break;
 383   7                    case 0x10 :   /* 32000 Hz / 16000 Hz */
 384   7                      song_one_frame_size += song_tab_frame_size_10[song_version][bit_rate];
 385   7                      break;
 386   7                  }
 387   6                  song_frame_size = (song_tab_seek[song_version][bit_rate]) >> 3;
 388   6                  b |= (c & MP3_MSK_FS) >> 2;       /* read FS B3:2 -> B1:0 */
 389   6                  c &= MP3_MSK_BR;
 390   6      
 391   6                  
 392   6                              err_set = FALSE;
 393   6      
 394   6                  switch (b)
 395   6                  {
 396   7                    case MP3_FS_44:
 397   7                    case MP3_FS_48:
 398   7                    case MP3_FS_32:
 399   7                    case MP3_FS_22:
 400   7                    case MP3_FS_24:
 401   7                    case MP3_FS_16:
 402   7                    {
 403   8                      if (c == MP3_BR_FREE)
 404   8                      {
 405   9                        head_status |= SONG_BR_ERR; /* bad bit-rate */
 406   9                        err_count--;
 407   9                        err_set = TRUE;
 408   9                      }
 409   8                      break;
 410   8                    }
 411   7                    default:
 412   7                    {
 413   8                      head_status |= SONG_FS_ERR;   /* bad sampling frequency */
 414   8                      err_count--;
 415   8                      err_set = TRUE;
 416   8                      break;
 417   8                    }
 418   7                  }
 419   6                  if (!err_set)
 420   6                  {
 421   7                    Fseek((Int16)(song_one_frame_size) - 3);
 422   7                    if (Fgetc() == MP3_SYNC_H)                        /* first header byte */
 423   7                    { /* high order sync found */
 424   8                      b = Fgetc();                                    /* second header byte */  
 425   8                      if ((b & MP3_MSK_SYNC) == MP3_SYNC_L)
 426   8                      { /* low order sync found */
C51 COMPILER V7.50   SONG_DRV                                                              02/16/2009 09:59:52 PAGE 8   

 427   9                        if ((b & MP3_MSK_LAYER) != MP3_LAYER_III)
 428   9                        {
 429  10                          head_status |= SONG_LAYER_ERR;  /* bad layer */
 430  10                          err_count--;
 431  10                          Fseek(-(Int16)(song_one_frame_size) - 1 );
 432  10                        }
 433   9                        else
 434   9                        {
 435  10                          c = Fgetc();                                /* third header byte */
 436  10                          if ( song_fs == ((c & MP3_MSK_FS) >> 2) )
 437  10                          {
 438  11                            b = (b & MP3_MSK_VER) >> 1;       /* keep MPEG Version B3 -> B2 */
 439  11                            b |= (c & MP3_MSK_FS) >> 2;       /* read FS B3:2 -> B1:0 */ 
 440  11                            c &= MP3_MSK_BR;
 441  11                            song_audio_init();                /* init audio interface */
 442  11                            clock_song_init(b);  //b             /* program the song clocks */
 443  11                            Fseek(-(Int16)(song_one_frame_size) - 3);
 444  11                            return SONG_NO_ERR;
 445  11                          }
 446  10                          else    
 447  10                          { /* Frequency sample does not match */
 448  11                            Fseek(-(Int16)(song_one_frame_size) - 2);
 449  11                          }
 450  10                        }
 451   9                      }
 452   8                      else
 453   8                      { /* no low order synchro found */
 454   9                        Fseek(-(Int16)(song_one_frame_size) - 1);
 455   9                      }
 456   8                    }
 457   7                    else
 458   7                    { /* No high order synchro found */
 459   8                      Fseek(-(Int16)(song_one_frame_size));
 460   8                    }
 461   7                    
 462   7                  }
 463   6                              else
 464   6                              { /* bad bit-rate or bad sampling frequency */
 465   7                          Fseek( (Int16) -2 );
 466   7                              }
 467   6                }
 468   5              }
 469   4                      else
 470   4                      { /* No low order sync found */
 471   5                  Fseek( (Int16) -1 );
 472   5                      }
 473   4      
 474   4            }
 475   3          }
 476   2          else
 477   2          { /* too much error */
 478   3            return head_status;
 479   3          }
 480   2        }
 481   1        return (head_status | SONG_SYNC_ERR);
 482   1      }
 483          
 484          
 485          
 486          /*F**************************************************************************
 487          * NAME: song_audio_init
 488          *----------------------------------------------------------------------------
C51 COMPILER V7.50   SONG_DRV                                                              02/16/2009 09:59:52 PAGE 9   

 489          * PARAMS:
 490          *
 491          * return:
 492          *----------------------------------------------------------------------------
 493          * PURPOSE: 
 494          *   Audio interface initialization in song mode
 495          *----------------------------------------------------------------------------
 496          * EXAMPLE:
 497          *----------------------------------------------------------------------------
 498          * NOTE:
 499          *   DAC_NB_BIT defined in config.h
 500          *----------------------------------------------------------------------------
 501          * REQUIREMENTS:
 502          *****************************************************************************/
 503          void song_audio_init (void)
 504          {
 505   1       // AUDCLK  = 1;
 506   1      
 507   1        AUDCON0 = AUDCON0 | 0x02;                //DSIZ=1
 508   1        AUDCON0 = AUDCON0 | 0x04;                //POL=1
 509   1        AUDCON0 = AUDCON0 | ((0x01<<3) & 0xf4);  //JUST=1
 510   1        AUDCON1 = AUDCON1 & 0x7f;                //SRC=0
 511   1      
 512   1        AUDCON1 = AUDCON1 | 0x01;
 513   1        AUDCON1 = AUDCON1 | 0x40;
 514   1       
 515   1       // Aud_set_pcm_32(18);
 516   1       // Aud_set_song();
 517   1       // Aud_enable();
 518   1       // Aud_disable_int();                        /* disable audio interrupt */
 519   1      }
 520          
 521          
 522          /*F**************************************************************************
 523          * NAME: song_start
 524          *----------------------------------------------------------------------------
 525          * PARAMS:
 526          *
 527          * return:
 528          *----------------------------------------------------------------------------
 529          * PURPOSE: 
 530          *   Start song playing
 531          *----------------------------------------------------------------------------
 532          * EXAMPLE:
 533          *----------------------------------------------------------------------------
 534          * NOTE:
 535          *----------------------------------------------------------------------------
 536          * REQUIREMENTS:
 537          *****************************************************************************/
 538          void song_start (void)
 539          {  
 540   1        Aud_song_play();                          /* start sample request */
 541   1        mp3_init();                               /* enable mp3 decoder */
 542   1      }
 543          
 544          
 545          /*F**************************************************************************
 546          * NAME: song_pause
 547          *----------------------------------------------------------------------------
 548          * PARAMS:
 549          *
 550          * return:
C51 COMPILER V7.50   SONG_DRV                                                              02/16/2009 09:59:52 PAGE 10  

 551          *----------------------------------------------------------------------------
 552          * PURPOSE: 
 553          *   Stop song playing
 554          *----------------------------------------------------------------------------
 555          * EXAMPLE:
 556          *----------------------------------------------------------------------------
 557          * NOTE:
 558          *   clocks are not disabled by this functions
 559          *----------------------------------------------------------------------------
 560          * REQUIREMENTS:
 561          *****************************************************************************/
 562          void song_pause (void)
 563          {
 564   1        Aud_song_pause();                         /* disable audio */
 565   1        mp3_stop();                               /* disable mp3 macrocell */
 566   1      }
 567          
 568          
 569          /*F**************************************************************************
 570          * NAME: song_stop
 571          *----------------------------------------------------------------------------
 572          * PARAMS:
 573          *
 574          * return:
 575          *----------------------------------------------------------------------------
 576          * PURPOSE: 
 577          *   Stop song playing
 578          *----------------------------------------------------------------------------
 579          * EXAMPLE:
 580          *----------------------------------------------------------------------------
 581          * NOTE:
 582          *----------------------------------------------------------------------------
 583          * REQUIREMENTS:
 584          *****************************************************************************/
 585          void song_stop (void)
 586          { 
 587   1        aud_stop();                               /* disable audio */
 588   1        mp3_stop();                               /* disable mp3 macrocell */
 589   1        clock_disable();                          /* disable clocks */
 590   1      }
 591          
 592          
 593          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    929    ----
   CONSTANT SIZE    =    256    ----
   XDATA SIZE       =      4       8
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =      1    ----
   BIT SIZE         =   ----       1
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?