⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 plays.c

📁 ESS3890+SL原代码(1*16内存)
💻 C
📖 第 1 页 / 共 5 页
字号:
 *
 * 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 + -