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 + -
显示快捷键?