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

📄 plays.c

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