📄 play.c
字号:
current_key = STOP_KEY; play_state = ENTRY_STATE;}/*------------------------------------------------------------------------ Function: play_item Parameters: playitem_number: The playitem_number is from play_item in selection list or play list. Description: This function will call proper function to play motion picture, segment item or entry item depending on the value of playitem_number.------------------------------------------------------------------------*/static void play_item(int playitem_number){ /* reset entry variables. The values are chosen to no index at init */ picture_type = 0xe0; track_entry_beg = 1000; track_entry_end = 0; track_entry_number = 1; next_entry_time = xMAX_CDTIME;/* set it a very big number, so we want update the lcd index number if we are not in play entry in track mode. */ /* reset a2b if a2b flag is on */ if (repeat_a2b) {/* REPEAT_AB_START or REPEAT_AB_END */ repeat_a2b = REPEAT_AB_OFF; panel_repeat_ab(REPEAT_AB_OFF); } /* remember the play item */ cur_vcd_playitem = playitem_number; /* 2..99 -> play track */ if ((playitem_number > 1) && (playitem_number < 100)) { play_track(playitem_number - 1); /* convert to 1 base */ cur_track_number = playitem_number - 1; /* for display purpose */ } else if ((playitem_number > 99) && (playitem_number < 600)) { play_entry(playitem_number - 99); /* 100..599 -> play entry */ } else if ((playitem_number > 999) && (playitem_number < 2980)) { play_segment(playitem_number - 999); /* 1000..2979 -> play segment */ } else { /* wrong item number. We go to the PLAY_WAIT_TIME_STATE and hopefully, we will get good play item next time after time expired or user inputs.*/ play_state = PLAY_WAIT_TIME_STATE; }}/*------------------------------------------------------------------------ Function: Parameters: Description: This function checks if we need to adjust the play_item_end_time.------------------------------------------------------------------------*/void check_playing_time(){ int mmssff; /* if we are playing item from play list, we need to check the */ /* playing time. */ if ((cur_list_state == PLAY_LIST_STATE) && (play_list_playing_time > 0)) { mmssff = logical2physical(5*(play_list_playing_time)); play_item_end_time = adjCDtime(play_item_start_time, mmssff, 1); }}/*------------------------------------------------------------------------ Function: play_track Parameters: track_number: The track number to be played. The track number is 1 base. For VideoCD, the mpeg track number starts at 2 is converted to 1 base. Fox example: If we want to play track 2 on video CD, the track_number should be 1. Description: It plays an MPEG audio/video track.------------------------------------------------------------------------*/static void play_track(int track_number){ int tmp; /* reset bad audio frame counter to zero at the beginning */ bad_track_len = 0; /* reset picture_type to normal */ picture_type = 0xe0; AUD_n_frames = 0;#ifdef ANTI_SHOCK AUD_n_samples = 0; /* set some parameters back to default */ vcx_bitstream_type = MPEG1_PS; VBV_ABV_default();#endif /* update panel */ panel_play_track(track_number); /* 15-08-96 Alger */ CurrentTrackTime = get_track_time(track_number, NULL, NULL); dsa_reset(); /* get track info */ get_track_info(track_number, &play_item_begin_time, &play_item_real_end_time, &play_item_type); play_item_start_time = play_item_begin_time; play_item_end_time = play_item_real_end_time;#ifdef MIC_RECORD REC_begin_msf = REC_end_msf = play_item_start_time; rec_msf[0] = rec_msf[1] = rec_msf[2] = REC_begin_msf;#endif if (play_item_type == AUDIO_TRACK) {#ifdef LOGO4CDDA /* for CDDA tracks in VCD disc */ if (!showingLogo #if 1 /* disable to show logo even when PBC-on */ && !PBC_on#endif ) { show_still_pic(); }#endif } else { /* find out whether the track contains entries */ if ((!PBC_on) && (PLAY_vcd_type & (VCD_TYPE_11 | VCD_TYPE_20)) ) { track_entry_number = get_track_entries(track_number, &track_entry_beg, &track_entry_end); track_current_entry = track_entry_beg; if (!intro_mode && track_entry_number > 1) { play_state = PLAY_ENTRY_LIST_STATE; return; } } if (showingLogo) { /* clear all display frames of logo data */ vcx_user_video_stream = 0xe0; vcx_VertSz = 288; DISP_change_resolution(352, 288); for (tmp=0; tmp<3; tmp++) { DISP_paint_screen(COLOR_BLACK,0,tmp); } DISP_count = 0; showingLogo = 0; } } PRINTF(("track %d, start time %x, end time %x\n", track_number, play_item_start_time, play_item_end_time)); /* if we are playing item from play list, we need to check the */ /* playing time. */ check_playing_time(); /* set the play_end time to INTRO_TIME_MMSSFF */ if (intro_mode) { tmp = adjCDtime(play_item_start_time, INTRO_TIME_MMSSFF, 1); if (play_item_end_time >= tmp) { second_endCDtime = tmp; } } if (VCD_ptr_resume_info->state == RESUME_RESTORE) { restore_resume_track_time(); } /* go to play */ play_item_mode = PLAY_INFO_STOP_MODE; play_state = PLAY_NORMAL_STATE; return;}#ifdef DATA_CD#ifdef JPEG_DGSTstatic void play_jpeg(int track_number){ int mmssff;#ifdef JPEG_DEC extern long g_jpeg_filesize;#endif STREAM_type = ((iso9660_file[track_number-1].loc)>>24) & 0x3f;#ifdef MP3 MPG_layer = 0;#endif#ifdef JPEG_DEC is_jpeg = 0;#endif /* Look for sequence header */ MPG_frames = 0;#ifdef XSEG1_ON_FLY if (vcx_xseg_loaded != XSEG1_CODE) { Decompress(xtra_s1_compress_data_start, (JPEG_globals_start<<2), XSEG1_DATA); Decompress(xtra_s1_compress_text_start, dram_cached(JPEG_code_start), XSEG1_CODE); }#endif /* XSEG1_ON_FLY */ /* jpeg display size: (180*576*3) DW */ DISP_END = JPEG_disp_end; #ifdef KARASC KSC_mode = 0;#endif#ifdef REVERB RVB_on |= RVB_MODE_SUPPRESS;#endif#ifdef EQUALIZER EQ_mode = DAE_mode = DAE_mode_save = 0;#endif JPG_start(1); g_jpeg_filesize = iso9660_file[track_number-1].bsize; vcx_bitstream_type = DATA_PS; /* data to VBV */ /* reset bad audio frame counter to zero at the beginning */ bad_track_len = 0; /* reset picture_type to normal */ picture_type = 0xe0; /* update panel */ panel_running_time(0); /* clear up "CLOSE" message */ panel_play_track(track_number); dsa_reset(); /* get track info */ play_item_begin_time = (iso9660_file[track_number - 1].loc & x00ffffff); play_item_real_end_time = iso9660_file[track_number - 1].size; play_item_start_time = play_item_begin_time; play_item_end_time = play_item_real_end_time; play_item_type = DATA_TRACK;#ifdef JPEG_THUMBNAIL if ((STREAM_type == JPEG_ID) && JPG_digest) { int jpg_thm_size = 0; extern int g_jpeg_SOI; g_jpeg_SOI = 0; if (JPG_digest == 1 || JPG_digest == 2) { getSectors(play_item_begin_time, 1, 2048); JPG_check_thumbnail(2048, &jpg_thm_size); } /* reset for thm */ if (g_jpeg_SOI && jpg_thm_size) { g_jpeg_filesize = g_jpeg_SOI + jpg_thm_size - 1; play_item_end_time = adjCDtime(play_item_begin_time, ((g_jpeg_filesize + 2047) >> 11),1); } }#endif av_play_motion_video(play_item_start_time, play_item_end_time); play_item_mode = PLAY_INFO_PLAYING_MODE; return;}#endif /* JPEG_DGST */static void play_data_file(int track_number){ int mmssff, file_rec;#ifdef JPEG_DEC extern long g_jpeg_filesize;#endif#ifdef MULTI_EXT_FILE cur_file_rec = file_rec = track_to_rec(track_number); #else file_rec = track_number - 1; /* index */#endif STREAM_type = ((iso9660_file[file_rec].loc)>>24) & 0x3f;#ifdef MP3 MPG_layer = 0;#endif /* Look for sequence header */ MPG_frames = 0;#ifdef MP3 if (STREAM_type == MP3_ID) {#ifdef JPEG_DEC if(is_jpeg) { /* transition from jpeg to mp3 has garbage on screen */ DISP_do_blank(); /* then do DISP_END_DO_BLANK to bring back screen */ } is_jpeg = 0;#endif MP3_start(); DISP_END_DO_BLANK; /* OK to bring back display */ /* force to update for new MP3 file */ prev_sampling_frequency = -1; MP3_VBR_gain = DEF_VBR_GAIN; /* Set to default value */#ifdef ANTI_SHOCK ABV_gdptr = ABV_wrptr = ABV_rdptr = ABV_start;#endif vcx_bitstream_type = MP3_PS; /* data to ABV */ }#endif /* MP3 */#ifdef WMA_DEC if (STREAM_type == WMA_ID) {#ifdef JPEG_DEC if(is_jpeg) { /* transition from jpeg to wma has garbage on screen */ DISP_do_blank(); /* then do DISP_END_DO_BLANK to bring back screen */ } is_jpeg = 0;#endif WMA_start(); DISP_END_DO_BLANK; /* OK to bring back display */ play_new_rom_file = 1; wma_smpl_num = 0;#ifdef WMA_CERT { extern int MLP_dump; MLP_dump = 0; }#endif#ifdef ANTI_SHOCK ABV_gdptr = ABV_wrptr = ABV_rdptr = ABV_start;#endif vcx_bitstream_type = MP3_PS; /* data to ABV */ }#endif /* WMA_DEC */#if (defined(JPEG_DEC) || defined(AVI_DEC)) if ((STREAM_type == JPEG_ID)#ifdef AVI_DEC || (STREAM_type == AVI_ID)#endif ) {#ifdef XSEG1_ON_FLY if (vcx_xseg_loaded != XSEG1_CODE) { Decompress(xtra_s1_compress_data_start, (JPEG_globals_start<<2), XSEG1_DATA); Decompress(xtra_s1_compress_text_start, dram_cached(JPEG_code_start), XSEG1_CODE); }#endif /* XSEG1_ON_FLY */ /* jpeg display size: (180*576*3) DW */ DISP_END = JPEG_disp_end; #ifdef KARASC KSC_mode = 0;#endif#ifdef EQUALIZER EQ_mode = DAE_mode = DAE_mode_save = 0;#endif#ifdef AVI_DEC if (STREAM_type == AVI_ID) { AVI_start(); MP3_VBR_gain = 7680; /* Set to default value */ /* * Trace AVI as MP3 data, so that data is going to ABV and we * can parse it Video data and send to VBV, audio data directly * transfer to PCM and send to PCM buffer. */ vcx_bitstream_type = MP3_PS; } else#endif { JPG_start(1); jpeg_pause = 0; g_jpeg_filesize = iso9660_file[file_rec].bsize; vcx_bitstream_type = DATA_PS; /* data to VBV */#ifdef JPEG_THUMBNAIL extern int g_jpeg_SOI; g_jpeg_SOI = 0;#endif } /* For JPEG, clear menu if on */ if (CG_menu_on) CLEARALLOSD(); }#endif /* reset bad audio frame counter to zero at the beginning */ bad_track_len = 0; /* reset picture_type to normal */ picture_type = 0xe0; /* update panel */ panel_running_time(0); /* clear up "CLOSE" message */ panel_play_track(track_number); /* "depresses" the specified button and redraws the menu if necessary */ track_to_mp3(cur_track_number); dsa_reset(); /* get track info */ play_item_begin_time = (iso9660_file[file_rec].loc & x00ffffff); play_item_real_end_time = iso9660_file[file_rec].size; play_item_start_time = play_item_begin_time; play_item_end_time = play_item_real_end_time; play_item_type = DATA_TRACK;#ifdef MIC_RECORD if(STREAM_type == MP3_ID){ REC_begin_msf = REC_end_msf = play_item_start_time; rec_msf[0] = rec_msf[1] = rec_msf[2] = REC_begin_msf; } else REC_mode = REC_OFF;#endif #ifdef GAMEBOY if(STREAM_type == GAME_GB_ID) {#ifdef JPEG_DEC is_jpeg = 0;#endif#ifdef REVERB RVB_on |= RVB_MODE_SUPPRESS;#endif gmby_start_time = play_item_begin_time; gmby_sect_sum = play_item_real_end_time; gmby_name_id = (iso9660_file[file_rec].loc>>24) & 0xff; play_state = PLAY_GMBY_STATE; return; }#endif#ifdef ID3#ifdef USE_ID3_INFO id3_str_index = 0;#endif ID3_ABV_offset = 0; /* default..non-MP3 */ if (STREAM_type == MP3_ID) { ID3_ABV_offset = ID3_detect(play_item_begin_time, play_item_real_end_time, 2048);#ifdef USE_ID3_INFO cd_stop = 0; show_ID3(track_number);#endif if (ID3_ABV_offset) { int tmp = 0; /* For ID3-V2.x tags larger than one sector we'll adjust * MP3 file's start time. */ while (ID3_ABV_offset >= 2048) { /* currently assume MP3 sector size is 2048B */ ID3_ABV_offset -= 2048; tmp++; } ID3_ABV_offset >>= 2; /* Bytes to DWords */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -