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 + -
显示快捷键?