📄 plays.c
字号:
*
* Input:
* level: an integer between AUDIO_MIN_LEVEL (0) and
* AUDIO_LEVEL_LIMIT (16/128).
* osdlen: number of seconds to show this OSD
*/
PRIVATE unsigned char volumebarbuf[AUDIO_BUFSZ] = " ";
PRIVATE void osdVolumeBar(level, osdlen)
int level;
int osdlen;
{
int i, tmp = 0;
int region;
region = OSD_KARAOKE_REGION;
#if (defined(MP3) || defined(JPEG_DEC))
if (STREAM_type) region = 7;
#endif
if (level > AUDIO_MIN_LEVEL)
tmp = ((level * AUDIO_LEVEL_BARS) / AUDIO_LEVEL_LIMIT);
PLAY_fill_volumebarbuf(tmp);
volumebarbuf[AUDIO_LEVEL_BARS/2] = ' ';
hex2string(volumebarbuf+AUDIO_BUFSZ - 3, level);
CG_MAP_COLOR(1,6,3);
CG_MAP_DELAYED(8,2,2);
OUTOSD(region, volumebarbuf, volumebarbuf, osdlen);
}
#endif VOLUME_CONTROL
/* fill volumebarbuf[]..used by REC_time_bar() and osdVolumeBar() */
static void PLAY_fill_volumebarbuf(int level)
{
int i;
/* 0 <= level <= 16 */
for (i = 0; i < (level>>1); i++) {
asm("nop");
volumebarbuf[i] = FONT_LL;
}
if (level&1) volumebarbuf[i++] = FONT_LS;
for (; i < (AUDIO_LEVEL_BARS/2); i++) {
asm("nop");
volumebarbuf[i] = FONT_SS;
}
}
#ifdef EQUALIZER
#define EQ_KEY KEY_MINUS /* testing */
#define EQ_ON_OFF_KEY KEY_PLUS /* testing */
static int process_EQ_key(key)
{
int tmp, update = 0;
unsigned char *eq_settings;
if (key == EQ_KEY) {
OSD_eq_mode++;
if (OSD_eq_mode > OSD_EQ_LIMIT) OSD_eq_mode = OSD_EQ_CLEAR;
OSD_eq_mode_previous = OSD_EQ_CLEAR; /* used to bring back EQ OSD */
EQ_display_setup(1, OSD_eq_mode);
EQ_display(OSD_eq_mode);
} else {
if (OSD_eq_mode != OSD_EQ_CONTROL) {
/* exit EQ mode */
if (key == SURROUND_KEY) OSD_eq_mode = -2;
else OSD_eq_mode = 0;
EQ_display(OSD_EQ_CLEAR);
return (0); /* key not processed */
}
if (key == SURROUND_KEY) {
/* change EQ music-type effects */
EQ_music_type_effect++;
if (EQ_music_type_effect > EQFX_PERSONAL)
EQ_music_type_effect = EQFX_STANDARD;
if (!OSD_eq_mode) return (1); /* let display come back later */
EQ_display(OSD_EQ_CONTROL);
} else if (key == ZOOM_LEFT_KEY) {
tmp = EQ_cur_freq;
/* move focus left if possible */
if (tmp != EQ_60HZ) {
EQ_cur_freq -= 2;
eq_settings = (EQ_music_type_effect == EQFX_PERSONAL) ?
eq_person_level : &(EQ_SETTINGS[EQ_music_type_effect*7]);
EQ_adj(tmp, eq_settings[(tmp>>1)]);
EQ_adj(EQ_cur_freq, eq_settings[(EQ_cur_freq>>1)]);
update = 1;
}
} else if (key == ZOOM_RIGHT_KEY) {
tmp = EQ_cur_freq;
/* move focus right if possible */
if (tmp != EQ_15KHZ) {
EQ_cur_freq += 2;
eq_settings = (EQ_music_type_effect == EQFX_PERSONAL) ?
eq_person_level : &(EQ_SETTINGS[EQ_music_type_effect*7]);
EQ_adj(tmp, eq_settings[(tmp>>1)]);
EQ_adj(EQ_cur_freq, eq_settings[(EQ_cur_freq>>1)]);
update = 1;
}
} else if ((key == ZOOM_UP_KEY) || (key == ZOOM_DOWN_KEY)) {
if (EQ_music_type_effect == EQFX_PERSONAL) {
update = (key == ZOOM_UP_KEY) ? 1 : -1;
/* Only personal settings can change */
tmp = eq_person_level[(EQ_cur_freq>>1)] + update;
/* change EQ level if possible */
if ((tmp <= 24) && (tmp >= 0)) {
eq_person_level[(EQ_cur_freq>>1)] = tmp;
EQ_adj(EQ_cur_freq, tmp);
update = 1;
} else
update = 0;
} else {
/* ignore key */
return (0);
}
} else {
/* exit EQ mode */
update = -1;
}
if(update == 1) {
EQ_show_db(EQ_cur_freq);
} else if(update < 0) {
/* exit EQ mode */
EQ_display(OSD_EQ_CLEAR);
return (0); /* key not processed */
}
/* customers requested to turn on EQ when adjusting
* EQ settings.
*/
if (!EQ_mode) {
EQ_mode = 1; /* turn on EQ processing */
MIX_init();
}
}
return (1);
}
#endif EQUALIZER
/*------------------------------------------------------------------------
Function:
Parameters:
Description:
------------------------------------------------------------------------*/
void reset_play_machine()
{
#ifdef EQUALIZER
if (OSD_eq_mode > 0) {
/* exit EQ mode */
EQ_display(0);
}
#endif EQUALIZER
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;
C2PO_interrupt = 0; //PRL388..in case we got C2PO during open/close
/* 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_DGST
static 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;
#ifndef FIVE_DISC_POWERRESUME
VCD_ptr_resume_info->state = RESUME_EMPTY;
#endif FIVE_DISC_POWERRESUME
#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 MP3CDG
int mp3cdg_start_time, mp3cdg_end_time;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -