macro.c

来自「Sunplus 8202S source code.」· C语言 代码 · 共 1,139 行 · 第 1/2 页

C
1,139
字号
//
// FILE
// macro.c
//
// DESCRIPTION
//
//

#include "config.h"
#include "global.h"
#include "memmap.h"
#include "cd.h"
#include "macro.h"
#include "osd.h"
#include "func.h"
#include "supfunc.h"
#include "dma.h"
#include "vpp.h"
#include "atapi_if.h"
#include "stc.h"
#include "lbaif.h"
#include "util.h"
#include "svcd.h"   //Jeff 20010717
#include "dsp3_if.h" //Jeff 20010827
#include "auddrv.h" //2004AUDDRV oliver 20041011 for using audio driver API purpose
#include "dvdpe.h"
#include "viddec.h"
#include "cdxa.h"
#include "mpegsys.h"
#include "cdfunc.h"
#include "dvdpe.h"
#include "setup.h"
#include "pu8560.h" //alan,2002/5/28 10:07PM
#include "fs96602.h"//#ifdef SUPPORT_FILE_SYSTEM_MODE
#include "fsGUI.h"
#include "fsNAV.h"
#include "srv2.h" //cyue: add streamming play

#include "kinf.h"
#include "sinf.h"
#include "kernel.h"

#include "asf_if.h"
#include "avi_if.h"

#include "audcodec.h"
#include "bit_rate.h"   // 2004/07/26 yltseng
#include "cardfs.h"     //wthsin, 2004/8/5 01:24am

#ifndef DVDRELEASE
//#define MACRO_DBG       1
#endif

#ifdef MACRO_DBG
#define MONE_FUNCTION
#define macro_puts(s)       io_write_wait(s)
#endif

#ifdef  MONE_FUNCTION
#define macro_function(s)   do {macro_puts(s); macro_puts("\n");} while (0)
#endif

#ifndef macro_puts
#define macro_puts(s)       ((void)0)
#endif

#ifndef macro_function
#define macro_function(s)   ((void)0)
#endif


//
// standalone debugging
// enable macro_puts() with UART0_puts()
//
#if 0
#include "uartsup.h"
#undef  macro_puts
#define macro_puts(s)       UART0_puts(s)
#endif


#ifdef SUPPORT_MIDI_MENU_SEL
extern UINT8 gIsMidiSelMenu;
#endif


//2004AUDDRV extern  void    DSPReset();
extern  int     DTSAC3_check(void);        //Jeff 20010717
extern  void    resync_audio(void);
extern  int     get_size_map(int track);
extern  int     get_segment_length(int s);
//2004AUDDRV init_cdda(void);//kenny
//2004AUDDRV extern  void    init_dtscd(void);
//2004AUDDRV extern  void    init_mp3(void);
extern  int     do_mp3(void);
extern	int		do_aac(void);
extern  int     do_audio_cdda(void);

extern  void    set_video_aspect(void);
void    InitializeCDPlayback(UINT32 lba,UINT32 len,UINT8 id);

#include "ninf.h"
#include "pinf.h"

extern UINT32 save_srn_start_t;

UINT32  mp3ReadLen; //To count data(units in Word) that move to Aud Buf(for MP3 timeing display) Jeff 20010919
BYTE    audio_only;
t_seq_info last_header;


static  inline  void
restart_sup(void)
{
	reset_sup();
}


void MacroSaveHeader()
{
    if( (!show_logo)&&((psd_state&PSD_SEL_LIST)==0) )
    {
        //Terry,2004/6/7 06:39PM
        //for HanYing, Video Masaic.
        save_sequence_info(&last_header);
    }
}


void MacroRestoreHeader()
{
    setup_sequence_info(&last_header);
}


/*
** Abort()
**
** HIGH PRIORITY.  IMMEDIATE
*/
void    MacroAbort()
{
	macro_puts("abort\n");
	avd_idle_state();
	SetIntrMask(0);
  //SetIntrFlag(0);
}

/*
** Sync()
**
** HIGH PRIORITY.  IMMEDIATE
*/
void    MacroSync()
{
	while (IsRPicStart || !IsVPicEnd)
		;
}

/*
** Pause()
**
** Cause the player to PAUSE and stop.
**
*/
void    MacroPause()
{
	AUDIF_Set_Pause();//2004AUDDRV AudioSetPause(); //Pause command to DSP Jeff 20010919
	avd_pause_on();
}

//
// Continue()
//
// Release from PAUSE status and continue playback.
// STC and other timers should be reset and resynced according to incoming
// bitstream.
//
void    MacroContinue()
{
	avd_pause_off();
	avd_play_state();
	AUDIF_Set_Continue();//2004AUDDRV AudioSetContinue(); //Continue-play command to DSP Jeff 20010919
}

/*
** DisplayBackground()
**
** Display the background for preview.
** Also set display picture id to 2
**
*/
//void    MacroDisplayBackground()
//{
//  set_disbuf(1);
//}

/*
** Freeze()
**
** Cause the player to play audio only.  Video output is freezed.
**
*/
//void    MacroFreeze()
//{
//}

/*
** OSD_OnOff()
**
**
*/
/*
void    MacroOSD_OnOff()
{
  if (MacroParam.OSD_OnOff.on_off)
  {
        // reset link address
    regs0->tlink_addr  = LINK_NULL;
    regs0->blink_addr  = LINK_NULL;
  }
  else
  {
        // setup link address
    regs0->tlink_addr  = region[0].osd_header[0];
    regs0->blink_addr  = region[0].osd_header[1];
  }
}

*/


/*
** PlayMP3()
**
** interestingly, I am still not sure how to design this.
**
*/
void    MacroPlayMP3(void)
{
    macro_function(__FUNCTION__);

    /*
    ** play video elementary bitstream only.
    */
    CDSetPlayCRC();

    s_msf             = MacroParam.PlayMP3.address_msf;
    s_len             = MacroParam.PlayMP3.length;

    e_msf  = addmsf(s_msf, s_len);

    if(adv_search_time<0)
    {
        if (GetCurrentFileType() == CDROM)
        {
            mp3ReadLen = (PlayBackLength-10)<<11;
            s_msf = addmsf(e_msf,-10);
        }
    }

    InitializeCDPlayback(msf2l(s_msf),(UINT32)s_len,0);
    VOBU_DIS = 0; //Jeff 20011024
}


/*
void PlayMP3FromEnd(UINT32 msf, UINT32 len)
{

}
*/


/*
void PlayMP3FromX(UINT32 msf, UINT32 len, UINT32 Xmsf)
{
  MacroParam.PlayMP3.address_msf=(msf);
  MacroParam.PlayMP3.length=(len);

  CDSetPlayCRC();

  s_msf             = MacroParam.PlayMP3.address_msf;
  s_len             = MacroParam.PlayMP3.length;

  e_msf  = addmsf(s_msf, s_len); //Jeff 20010827
  st_msf = s_msf;

//  mp3ReadLen = 0;

  //InitializeCDPlayback(msf2l(s_msf),(UINT32)s_len,0);
  InitializeCDPlayback(msf2l(Xmsf), (UINT32)s_len, 0);

  VOBU_DIS = 0;
}
*/


UINT8 avd_search_header(void)
{
    if (AVD_state == STATE_FINDFIRSTSEQ) return TRUE;
    return FALSE;
}


extern void init_svcd_as(void); // in \nav\user_if.c


extern BYTE audioNotContinuous; //Jeff 20021125


//
// FUNCTION
// InitializeCDPlayback()
//
void
InitializeCDPlayback(UINT32 lba,UINT32 len,UINT8 id)
{
    macro_function(__FUNCTION__);

    #ifdef ZOOM_FFBF_NOT_ACROSS_TRACK//Jack 20040930
    if(vpp_zoom || adv_search_time)
    {
        vpp_zoom = 0;
        adv_search_time = 0;
        osd_tog_region(REGION1,OSD_OFF);
        //PrintOsdMsg(STR_OS_PLAY,REGION1, 1,0);
    }
    #endif


    if(counter_down==-1)
        counter_down = 5;
    flush_atapi();

	// initialize new playback
    audio_only    = 0;
    set_video_stream_id(0xe0);

	// initialize cd track
    cd_update_trk_now();

	// initialize service program
    setup_decode_service(SERVICE_CD);
    cd_type = GetCurrentFileType();

    do_system = do_system_init = do_system_layer;

    restart_video_engine();
    restart_audio_engine();

    if ((cd_type != CDDVD) && (cd_type_loaded != CDROM)) // Robert 2004/02/05, cdrom disc should not enter.
    {
        //terry,2002/5/1 12:12AM
        //audio/subtitle must be initial,avoid being reset on trk chg
        init_svcd_as();

        // initialize cd msf
        //printf("psd_state:%x\n",psd_state);
        if (cd_type_loaded != CDROM)
        {
            if (((psd_state&PSD_PLAY_SEG) != PSD_PLAY_SEG) || (bDiscType == CD_OKO))
            {
                st_msf = gettrkmsf(cd_trk_now) & 0x00ffffff;
                if ((psd_state & PSD_PLAY_LIST) && pFsJpeg->List.p.play_time)
                {
                    e_msf = addmsf(s_msf, getUINT16_bi(&pFsJpeg->List.p.play_time) * 5);
                }
                else if ((bDiscType == CD_OKO) && ((!IsPBCOn()) || (psd_state & PSD_PLAY_LIST)))
                {
                    UINT8 a_o_id = (pFsJpeg->cdrom.oko_trk_end[cd_trk_now] >> 24);
                    e_msf = pFsJpeg->cdrom.oko_trk_end[cd_trk_now] & 0x00ffffff;
                    set_audio_stream_id(0xc0 | (a_o_id >> 4));
                    sup_set_channel(a_o_id & 0xf);
                }
                else
                {
                    e_msf = get_next_trk_msf(cd_trk_now);
                }

	        if (bDiscType == CD_CVD)
                {
                    //printf("oko id:%d\n",oko_menu_id);
		    set_audio_stream_id(0xc0 |oko_menu_id);
                    sup_set_channel(oko_menu_id);
                }

		if ((gettrkcna(cd_trk_now) & CNA_DATA) == 0)
                    cd_type = CDDA;
            } //if( ( (psd_state&PSD_PLAY_SEG)!=PSD_PLAY_SEG )||(bDiscType == CD_OKO) )
        } //if(cd_type_loaded!=CDROM)

        if (len == 0) len = msf2l(e_msf) - msf2l(s_msf);

        // setup VCD specific information
        if (cd_type != CDDA)
        {
            unsigned v_id;

            // initialize video stream
            v_id = 0xe0 | (id & 0x03);    // VCD: depends on PSD
            if(v_id >= 0xe3) v_id = 0xe0;
            if(v_id != 0xe0) audio_only = 2;
            set_video_stream_id(v_id);

            //printf("st_msf:%x s_msf:%x\n",st_msf,s_msf);
            //printf("2.goto_active:%x\n",goto_active);
	    if (goto_active == 1)
            {
                // * search video-sequence header
                //we must avoid user keyin when searching video seq. header
                //macro_puts("macro: search seq.hdr\n");
                reset_sequence_state();
                AVD_ResetMediaStatus();
                AVD_state = STATE_FINDFIRSTSEQ;
                start_atapi_intr(msf2l(st_msf),5*75, 16);
                MediaMainLoop();
                flush_atapi();

			    restart_video_engine();
			    restart_audio_engine();
                //if (!sequence_start)
                //  macro_puts("macro: seq.hdr NOT found\n");
                //else
                //  macro_puts("macro: seq.hdr FOUND\n");
	        if (sequence_start)
	            goto_active = 0;
            } else if (((psd_state==(PSD_PLAY_LIST|PSD_PLAY_ENTRY)) || adv_search_time<0) && (cd_type_loaded!=CDROM)) {
                // list, entry or backward playback: force auto-setting
                goto_active = 1;
            } else if ((last_header.horizontal_size_value)&&(last_header.vertical_size_value)) {
                // has last-header: use saved-header info.
                Restore_header();
	    } else {
                // otherwise
                goto_active = 1;
            }

            //printf("3.goto_active:%x\n",goto_active);
            //printf("psd_state:%x goto_active:%x\n",psd_state,goto_active);
            if (goto_active)
            {
                if( (get_size_map(cd_trk_now)==1) || (cd_type_loaded==CDVCD10))
                    setup_vcd_motion_pal();
                else
                    setup_vcd_motion_ntsc();
                goto_active=0;
            }
        } //if(cd_type != CDDA)
        //printf("stream_video:%x audio_only:%x psd_state:%x\n",stream_video,audio_only,psd_state);
    } //if ((cd_type!=CDDVD)&&(cd_type!=CDROM))


    AVD_ResetMediaStatus();
    source_end = 0;
    if ((play_state != VCD_STATE_PREVIEW) && (play_state != VCD_STATE_9FRAMES))
    {
        avd_play_state();
    }
    else
    {
        avd_preview_state();
    }

    SetIntrMask(INTR_MASK_NORMAL);
    restart_sup();

    timeout_playback    = 0;
    regs0->rtc_31_16    = 0;
    timestamp_key       = 0;    // alan 0425
    set_stc(0);
    set_stc_init();

    P_frame	        = 0;    // clear pause

    // navigator-state
    PE_ClearNav();

    sys_cmd = 0;

    if (vpp_zoom<2)
    {
        set_video_aspect();
    }

#ifndef IR_TOOL
	printf("cd_type:%x\n",cd_type);
#endif

    switch(cd_type)
    {
	case CD_DA:
	case CDDA:
	{
		//Jeff 20020527
		BYTE bDTS=0;
		BYTE preCDsubtype;
		int     iRetry=0;

		preCDsubtype = cd_subtype; //Jeff 20021206
		audio_only = 1;   // terry,2002/4/30 05:32PM ff>=4 mute audio
		//init_cdda();        // for mix mode
		cd_subtype = CD_DA;       //Jeff 20020415
		setup_decode_service(SERVICE_CDDA);
		//4-7-23 0:28
		AUDIF_Set_Volume(0);//AudioSetVolume(0); //Jeff 20021125

        // 2004/01/17 yltseng, because when we do some action during DTSAC3_check(), this action may be invalid because
        // goto_active is set to 1. So we prevent user input during DTSAC3_check by setting counter_down longer
        counter_down = 10;  

		do { //Jeff 20020518
			int iCheckType;
			audioNotContinuous=5; //Jeff 20021125
			goto_active = 1; //avoid display time show error time
			start_atapi_intr(msf2l(st_msf),150, 16);//terry,0515,search track start up
			iRetry++;

			iCheckType = DTSAC3_check();
#ifdef SUPPORT_AC3_CD_DISC //terry,2004/2/17 06:35PM
			if (iCheckType==0xac3)
			{ //Jeff 20040102
				//Dolby-CD
				cd_subtype = CD_AC3;
				AUDIF_Init_AC3CD();//2004AUDDRV init_ac3cd();
				setup_SetAC3Config();
				if ( setup_IsSet2SPDIF_Bitstream() ) {
					AUDIF_Reset_DSP();//2004AUDDRV DSPReset();
				}
				iRetry = 3;
				bDTS=0xf;
			} else
#endif
			if (iCheckType > 0)
			{
				cd_subtype = CD_DTS;       //move to here 2003-8-13 0:38
				//printf("DTS bitstream\n");
#if !defined(NO_DTS_OUTPUT)||defined(FORCE_NO_DTS_OUTPUT)//nono 4-5-5 13:31
	#ifndef DTS_CD_OUT_RAW_A
				if ( !setup_IsSet2SPDIF_Bitstream() )//nono 2-7-5 21:38
	#endif
				{
					AUDIF_Init_DTSCD();//2004AUDDRV init_dtscd();
				}
#endif//#ifndef NO_DTS_OUTPUT

				// cd_subtype = CD_DTS;       //Jeff 20020415
				setup_SetDTSCDConfig();

#ifndef DTS_CD_OUT_RAW_A
				if ( setup_IsSet2SPDIF_Bitstream() ) { //Jeff 20031230
                    //ycwen 2004/08/31 : if not download PCM again, it would be wrong when "AC3->DTS"
                    AUDIF_Set_CodingMode(AUDIF_CODING_MODE_PCM);//2004AUDDRV audif_set_coding_mode(AUDIF_CODING_MODE_PCM);
					AUDIF_Reset_DSP();//2004AUDDRV DSPReset();
				}
#endif
				iRetry = 3;
				bDTS=1;
			}
			//printf("2.cd_subtype=%x\n",cd_subtype);
		} while(iRetry < 3);

		printf("program:%x source_end:%x AVD_media_status:%x goto_active:%x sys_cmd:%x\n",program_end,source_end,AVD_media_status,goto_active,sys_cmd);

		if(program_end)
		{
			//terry,2003/8/24 04:38PM
			program_end = 0;
			source_end = 0;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?