song_task.c

来自「MP3设计源代码 使用atmel的单片机」· C语言 代码 · 共 1,081 行 · 第 1/3 页

C
1,081
字号
      break;
    }


    case SONG_PLL:
    {
      if (Pll_get_lock())                   /* pll locked? */
      {
        song_start();                       /* start playing song */
        disp_clock_start();                 /* start clock timer */
        print_state_play();                 /* display play icon */
        song_state = SONG_PLAY;
      }
      break;
    }


    case SONG_PLAY:
    {
      if (Feof() == TRUE)
      { /* end of file reached */
        song_pause();                       /* pause playing song */
        Fclose();
        loop = song_loop;
        song_state = SONG_NEXT;
        gl_key_press = FALSE;               /* no key usage */
      }

      if (gl_key_press)                     /* a key is pressed? */
      {
        switch (gl_key)
        {
          case KEY_REPEAT_A_B:
            if (!repeat_A_B)              
            {                               /* A position */
              repeat_A_B = TRUE;            /* Detect repeat A/B mode */
              file_pos_A = Fget_pos();      /* Get the first position */
              if (file_pos_A > (song_frame_size * SONG_PRE_SAMPLING))
                file_pos_A -= (song_frame_size * SONG_PRE_SAMPLING);
              else
                file_pos_A = 0x00;
              disp_save_time();
              print_repeat(SYMB_REP_A);
            }
            else
            { 
              mp3_stop();                   /* B position */
              Fsave_cluster_info();         /* Save cluster info for B position detect */
              song_state = SONG_PLAY_A_B_MUTE;              
              count = gl_cpt_tick;
              Fseek(file_pos_A);
              disp_recall_time();
              Song_save_volume_level(Mp3_get_right_vol());
              print_repeat(SYMB_REP_B);
              mp3_restart();
            }
            break;

          case KEY_PAUSE:
            Aud_song_pause();               /* suspend sample request */
            disp_clock_stop();              /* suspend clock timer */
            print_state_pause();            /* display pause icon */
            song_state = SONG_PAUSE;
            break;

          case KEY_NEXT:
            repeat_A_B = FALSE;             /* cancel repeat A/B */
            song_state = SONG_DETECT_REPEAT_KEY_NEXT;
            break;

          case KEY_PREV:
            repeat_A_B = FALSE;             /* cancel repeat A/B */
            song_state = SONG_DETECT_REPEAT_KEY_PREV;/* Key  repeat? */
            break;

          case KEY_INC:
          case KEY_INC_REP:
          case KEY_INC_LREP:
            song_snd_inc();                 /* increment selected control */
            print_sound_level();            /* display new level */
            break;

          case KEY_DEC:
          case KEY_DEC_REP:
          case KEY_DEC_LREP:
            song_snd_dec();                 /* decrement selected control */
            print_sound_level();            /* display new level */
            break;

          case KEY_SOUND:
            song_snd_select();              /* select next sound control */
            print_sound();                  /* display selected sound icon */
            print_sound_level();            /* display new level */
            break;

          case KEY_REPEAT:
            song_loop = ~song_loop;         /* display repeat or not */
            print_repeat(song_loop);
            break;

          case KEY_STOP:
            song_stop();                    /* stop playing song */
            Fclose();
            song_state = SONG_STOP;
            break;

          default:
            break;
        }
        gl_key_press = FALSE;               /* ack key usage */
      }
      break;
    }


    case SONG_DETECT_REPEAT_KEY_NEXT:
    { /* KEY_NEXT is pressed */
      if (Feof() == TRUE)                   /* end of file? */
      {
        song_pause();                       /* pause playing song */
        Fclose();
        loop = song_loop;                   /* loop only if enabled */
        song_state = SONG_NEXT;
        gl_key_press = FALSE;               /* no key usage */
      }
      if ((MP3STA & (MSK_ERRLAY | MSK_ERRSYN)) != 0)
      {
//        break;
      }

      if (gl_key_repeat == TRUE)
      {
        if (gl_key == KEY_FF)
        {
          if (Fseek((Int32)(song_frame_size) * SONG_SKEEP_FRAME_FFW) == OK)/* 1st fast forward */
          {
            disp_inc_time(SONG_REPEAT_TIME_FFW);
            do
            {
              status = song_init();
            }
            while ((status != SONG_NO_ERR) && (status != SONG_SYNC_ERR));
  
            if (status != SONG_NO_ERR)
            { /* sync error: skip next */
              loop = TRUE;                  /* keypad action so loop */
              song_state = SONG_NEXT;
            }
            else
            {
              mp3_restart();                /* re-start MP3 */
              Aud_song_play();              /* start sample request */        
              Song_save_volume_level(Mp3_get_right_vol()); /* save volume level */
              song_state = SONG_DETECT_REPEAT_KEY_END;
            }
            count = gl_cpt_tick;
          }
          else
          { /* end of file: skip next */
            song_pause();                   /* pause playing song */
            Fclose();
            loop = TRUE;                    /* keypad action so loop */
            disp_clock_stop();              /* suspend clock timer */
            song_state = SONG_NEXT;
          }
        }
      }
      else
      { /* key released: skip next */
        song_pause();                       /* pause playing song */
        Fclose();
        loop = TRUE;                        /* keypad action so loop */
        song_state = SONG_NEXT;
      }
      gl_key_press = FALSE;
      break;
    }

    case SONG_DETECT_REPEAT_KEY_PREV:
    { /* KEY_PREV is pressed */
      if (Feof() == TRUE)                   /* end of file? */
      {
        song_pause();                       /* pause playing song */
        Fclose();
        loop = song_loop;                   /* loop only if enabled */
        song_state = SONG_NEXT;
        gl_key_press = FALSE;               /* no key usage */
      }

      if ((MP3STA & (MSK_ERRLAY | MSK_ERRSYN)) != 0)
      {
//        break;
      }

      if (gl_key_repeat == TRUE)
      {
        if (gl_key == KEY_FR)
        {
          if (Fseek(-(Int32)(song_frame_size) * SONG_SKEEP_FRAME_FRW) == OK)/* 1st fast rewind */
          {
            disp_dec_time(SONG_REPEAT_TIME_FRW);
            Song_save_volume_level(Mp3_get_right_vol());/* Save volume level */
            song_state = SONG_DETECT_REPEAT_KEY_END;
            do
            {
              status = song_init();
            }
            while ((status != SONG_NO_ERR) && (status != SONG_SYNC_ERR));

            if (status != SONG_NO_ERR)
            { /* sync error: skip next */
              loop = TRUE;                  /* keypad action so loop */
              song_state = SONG_NEXT;
            }
            else
            {
              mp3_restart();                /* re-start MP3 */
              Aud_song_play();              /* start sample request */
            }
            count = gl_cpt_tick;
          }
          else
          { /* beg of file: replay same file */
            Aud_song_play();
            Mp3_set_right_vol(Song_get_saved_volume_level());
            Mp3_set_left_vol(Song_get_saved_volume_level());
            song_state = SONG_PLAY;
          }
        }
      }
      else
      { /* key released: skip previous */
        song_pause();                       /* pause playing song */
        disp_clock_stop();                  /* suspend clock timer */
        Fclose();
        file_seek_prev(FILE_TYPE);          /* select previous song */
        song_state = SONG_NEW;
      }
      gl_key_press = FALSE;
      break;
    }


    case SONG_DETECT_REPEAT_KEY_END:
    {
      Mp3_set_right_vol(VOLUME_MIN);
      Mp3_set_left_vol(VOLUME_MIN);
      if (gl_cpt_tick >= count)
        delta_t = gl_cpt_tick - count;
      else
        delta_t = DISP_TICK_SEC - count + gl_cpt_tick;  

      if (Feof() == TRUE)                   /* end of file? */
      {
        Mp3_set_right_vol(Song_get_saved_volume_level());
        Mp3_set_left_vol(Song_get_saved_volume_level());
        song_pause();                       /* pause playing song */
        Fclose();
        loop = song_loop;
        song_state = SONG_NEXT;
        gl_key_press = FALSE;               /* no key usage */
      }

      if (delta_t > SONG_MUTE_DURATION)     /* Maestro */
      {
        count = gl_cpt_tick;
        song_state = SONG_PLAY_REPEAT_KEY;
      }
      if ((MP3STA & (MSK_ERRLAY | MSK_ERRSYN)) != 0)
      {
        count = gl_cpt_tick;
      }
      break;
    }

    case SONG_PLAY_REPEAT_KEY:
    {
      if (gl_cpt_tick >= count)
        delta_t = gl_cpt_tick - count;
      else
        delta_t = DISP_TICK_SEC - count + gl_cpt_tick;  

      if (Feof() == TRUE)                   /* end of file? */
      {
        Mp3_set_right_vol(Song_get_saved_volume_level());
        Mp3_set_left_vol(Song_get_saved_volume_level());
        song_pause();                       /* pause playing song */
        Fclose();
        loop = song_loop;
        song_state = SONG_NEXT;
        gl_key_press = FALSE;               /* no key usage */
      }

      if ((Mp3_get_right_vol() < (Song_get_saved_volume_level() / 2)) && (delta_t > SONG_START_TIME_VOL))
      {
        if (delta_t % 20)
        {
          Mp3_set_right_vol(Mp3_get_right_vol() + 1);
          Mp3_set_left_vol(Mp3_get_left_vol() + 1);
        }
      }
      if (delta_t > SONG_UNMUTE_PLAY_DURATION)
      {
        if (gl_key_repeat == TRUE)
        { /* Still key repeat: Fast Forward and Fast Rewind Only */
          if (gl_key_press)
          {
            switch (gl_key)
            {
              case KEY_FF:
              case KEY_LFF:
                if (Fseek((Int32)(song_frame_size) * SONG_SKEEP_FRAME_FFW) == OK)/* Fast Forward */
                {
                  do
                  { 
                    status = song_init();
                  }
                  while ((status != SONG_NO_ERR) && (status != SONG_SYNC_ERR));

                  if (status != SONG_NO_ERR)
                  { /* sync error: skip next */
                    loop = TRUE;            /* keypad action so loop */
                    song_state = SONG_NEXT;
                  }
                  else
                  {
                    count = gl_cpt_tick;
                    disp_inc_time(SONG_REPEAT_TIME_FFW);      /* Increase display time */
                    song_state = SONG_DETECT_REPEAT_KEY_END;  /* Valid the repeat key in mute mode */
                    mp3_restart();                            /* Re-start MP3 */
                    Aud_song_play();                          /* start sample request */
                  }
                }
                else
                { /* end of file: skip next */
                  loop = TRUE;              /* keypad action so loop */
                  song_state = SONG_NEXT;
                }
                gl_key_press = FALSE;
                break;
    
              case KEY_FR:
              case KEY_LFR:
                if (Fseek(-(Int32)(song_frame_size) * SONG_SKEEP_FRAME_FRW) == OK)/* fast rewind skeep frame */
                { 
                  do
                  {
                    status = song_init();
                  }
                  while ((status != SONG_NO_ERR) && (status != SONG_SYNC_ERR)); 
                  if (status != SONG_NO_ERR)
                  { /* sync error: skip next */
                    loop = TRUE;            /* keypad action so loop */
                    song_state = SONG_NEXT;           
                  }
                  else
                  {
                    count = gl_cpt_tick;
                    mp3_restart();          /* Re-start MP3 */
                    Aud_song_play();        /* start sample request */
                    disp_dec_time(SONG_REPEAT_TIME_FRW);

⌨️ 快捷键说明

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