📄 plays.c
字号:
#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 */
#ifdef MP3CDG
if (MP3CDG_file_detect(file_rec, &mp3cdg_start_time, &mp3cdg_end_time))
MP3CDG_set(mp3cdg_start_time, mp3cdg_end_time*2048, 2048);
#endif
/* 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 REVERB
RVB_on |= RVB_MODE_SUPPRESS;
#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 /* AVI_DEC */
{
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 /* JPEG_DEC || AVI_DEC */
/* 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 */
#ifdef MP3CDG
if (!MP3CDG_started)
#endif
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 */
play_item_start_time = adjCDtime(play_item_begin_time,
logical2physical(tmp), 1);
}
}
#endif /* ID3 */
if (VCD_ptr_resume_info->state == RESUME_RESTORE) {
restore_resume_track_time();
cur_track_index = cur_track_number-1; /* update cur_track_index */
} else VCD_ptr_resume_info->state = RESUME_EMPTY;
play_item_mode = PLAY_INFO_STOP_MODE;
/* go to play */
play_state = PLAY_NORMAL_STATE;
return;
}
#endif
/*------------------------------------------------------------------------
Function: play_entry
Parameters:
entry_number: The entry number that this function will play.
Description:
Play an entry in VIDEO CD.
------------------------------------------------------------------------*/
static void play_entry(int entry_number)
{
unsigned char track_number;
/* get entry info */
get_entry_info(entry_number, &track_number,
&play_item_start_time, /* entry start time */
&play_item_real_end_time);
/* update panel & OSD */
cur_track_number = track_number - 1;
panel_play_track(cur_track_number);
/* get track info, since we play entry until track end */
get_track_info(track_number - 1, /* logical track starts at 1 */
&play_item_begin_time, /* starting time of track */
&play_item_real_end_time,
&play_item_type);
play_item_end_time = play_item_real_end_time;
PRINTF(("entry %d, start time %x, end time %x\n", entry_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();
if (VCD_ptr_resume_info->state == RESUME_RESTORE) {
restore_resume_track_time();
}
play_item_mode = PLAY_INFO_STOP_MODE;
play_item_type = DATA_TRACK;
/* go to play */
PRINTF(("Play Entry %d\n", entry_number));
play_state = PLAY_NORMAL_STATE;
return;
}
/*------------------------------------------------------------------------
Function:play_entry_in_track
Parameters:
Description:
------------------------------------------------------------------------*/
static void play_entry_in_track(int entry_number)
{
int mmssff;
int dummy2;
unsigned char dummy1;
PANEL_PLAY_INDEX((entry_number - track_entry_beg + 1));
/* get the next entry time for updating lcd in the future */
if (!get_entry_info(entry_number + 1, &dummy1, &next_entry_time,
&dummy2)) {
next_entry_time = xMAX_CDTIME; /* no next entry */
}
/*
* since the beg_time will be modified to entry beg_time by play_entry
* function, we have to store it.
*/
mmssff = play_item_begin_time;
/* play entry */
play_entry(entry_number);
play_item_begin_time = mmssff;
}
/*------------------------------------------------------------------------
Function: play_segment
Parameters:
segment_number
Description:
------------------------------------------------------------------------*/
static void play_segment(int segment_number)
{
unsigned char content;
int len; /* # of segment */
int seconds;
int video_type;
#ifdef MZOOM
if (vcx_mzoom) MZM_out();
#endif
/* get segment content and play length */
get_segment_info(segment_number, &content, &len);
/* compute the start and end time */
if (first_seg_ad == 0) /* in case we do not have value. */
first_seg_ad = 0x0500;
seconds = bcd2hex[((first_seg_ad >> 16) & 0xff)] * 60; /* min -> sec */
seconds += bcd2hex[(first_seg_ad >> 8) & 0xff] + (segment_number - 1) * 2;
play_item_begin_time =
logical2physical(seconds * 75); /* Sec->Frm */
play_item_start_time = play_item_begin_time;
play_item_end_time =
logical2physical((seconds + len * 2) * 75);
play_item_real_end_time = play_item_end_time;
play_item_type = DATA_TRACK;
/* if we are playing item from play list, we need to check the */
/* playing time. */
check_playing_time();
play_item_mode = PLAY_INFO_STOP_MODE;
PRINTF(("seg %d, start 0x%x, end 0x%x\n",
segment_number,
play_item_start_time,
play_item_end_time));
/* check play type */
video_type = content & 0xC; /* bit 2..3 */
play_still_retry = 3; /* Retry still 3 times if error */
play_state = PLAY_STILL_STATE; /* Assume it is still */
is_slide_show = 0; /* determine in video_state_machine() */
#ifdef KARASC
KSC_mode = 0;
#endif
if (video_type == 4) {
seg_sel = 1;
PRINTF(("E1\n"));
} else if (video_type == 8) {
seg_sel = 2;
PRINTF(("E2\n"));
} else {
/* if the zoom level != 1, reset it */
#ifdef ZOOM
if (zoom_level) {
zoom_reset();
}
#endif
seg_sel = 0;
play_still_retry = 0;
play_state = PLAY_NORMAL_STATE;
PRINTF((" Motion\n"));
}
if (VCD_ptr_resume_info->state == RESUME_RESTORE) {
len = VCD_ptr_resume_info->mmssff;
if (len != xMAX_CDTIME) {
play_item_start_time = len;
is_slide_show = seg_sel; /* slide-show? */
}
VCD_ptr_resume_info->state = RESUME_SUCCESS;
}
picture_type = 0xe0 | seg_sel;
panel_play_track(0);
cur_track_number = 0; /* Set for OSD */
return;
}
#ifdef GAMEBOY
static void play_game(int segment_number)
{
int seconds;
uchar *game_data_ptr;
/* compute the start time */
if (first_seg_ad == 0) /* in case we do not have value. */
first_seg_ad = 0x0500; /* assume set to 00:05:00 */
#ifdef INES
if (is_ess_game >= 3) {/*It is for Sunplus game DISC*/
play_item_begin_time = logical2physical(play_list_playing_time+150);
gmby_sect_sum = play_list_play_item_wait_time;
} else
#endif
{
seconds = bcd2hex[((first_seg_ad >> 16) & 0xff)] * 60; /* min -> sec */
seconds += bcd2hex[(first_seg_ad >> 8) & 0xff] + (segment_number - 1000) * 2;
play_item_begin_time =
logical2physical(seconds * 75); /* Sec->Frm */
}
play_item_start_time = play_item_begin_time;
gmby_start_time = play_item_start_time;
if(is_ess_game < 3 ) {/*Not Sunplus game DISC*/
if(is_ess_game == 1){ /*ESS GVCD DISC*/
gmby_sect_sum=(((game_list_buffer_size>>8)&0xff)<<14)+
((game_list_buffer_size&0xff)<<13);
} else { /*QiSheng Game Disc*/
getSectors(play_item_start_time, 1, 2048);
game_data_ptr = (uchar *)dram(VBV_start);
gmby_sect_sum = 16+(*(game_data_ptr+4) << 14)+
(*(game_data_ptr+5) << 13);
}
gmby_sect_sum = (gmby_sect_sum+2047)>>11;
}
gmby_name_id = GAME_INES;
panel_play_track(0);
cur_track_number = 0; /* Set for OSD */
play_state = PLAY_GMBY_STATE;
return;
}
#endif
/*------------------------------------------------------------------------
Function:assign_selection_list
Parameters:
scratch: Is a pointer to the selection list data.
Description:
Assign selection data to a selection_list structure.
------------------------------------------------------------------------*/
static void assign_selection_list(unsigned char *scratch_buf)
{
selection_list_number_of_selections = scratch_buf[2];
selection_list_base_of_selection_number = scratch_buf[3];
list_previous_list_offset = *((short *) (scratch_buf + 6));
list_next_list_offset = *((short *) (scratch_buf + 8));
selection_list_default_list_offset = *((short *) (scratch_buf + 12));
list_return_list_offset = *((short *) (scratch_buf + 10));
selection_list_time_out_list_offset = *((short *) (scratch_buf + 14));
selection_list_wait_time_for_timeout = scratch_buf[16];
selection_list_loop_count_and_jump_timing = scratch_buf[17];
selection_list_play_item_number = *((short *) (scratch_buf + 18));
selection_list_loop_count =
(selection_list_loop_count_and_jump_timing & 0x7f); /* bit 0-6 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -