www.pudn.com > snowfish.rar > SFApi.c


/* $Id: SFApi.c,v 1.1 2007/08/03 03:10:02 shiheng Exp $ */ 
 
#include "MMI_features.h" 
#include "SFApi.h" 
#include "PixtelDataTypes.h" 
//#include "SFGameSimuDef.h" 
 
#include "gdi_datatype.h" 
#include "lcd_sw_inc.h" 
#include "wgui.h" 
#include "mdi_datatype.h" 
#include "mdi_audio.h" 
#include "historygprot.h" 
#include "GlobalDefs.h" 
#include "SettingProfile.h" 
#include "Ucs2prot.h" 
#include "fs_type.h" 
#include "DebugInitDef.h" 
#include "drv_comm.h" 
#include "reg_base.h" 
#include "lcd_if.h" 
#include "GameFramework.h" 
#include "FileMgr.h" 
#include "FileManagerDef.h" 
#include "CommonScreens.h" 
#include "med_utility.h" 
 
#ifndef MMI_ON_HARDWARE_P 
#include  
#include  
#include  
#endif 
 
#include "NVRAMType.h" 
#include "NVRAMProt.h" 
#include "NVRAMEnum.h" 
 
#include "VdoPlyScrEnum.h" 
#include "app_datetime.h" 
 
#ifdef MMI_ON_HARDWARE_P 
void* malloc(unsigned int sz); 
void free(void*ptr); 
extern void *kal_sys_mem_alloc(kal_uint32 size); 
extern void kal_sys_mem_free(void *mem_ptr); 
extern kal_uint8 custom_get_csd_profile_num(void); 
#endif 
 
extern void* sf_system_malloc(kal_uint32 size); 
extern void sf_system_free(void* ptr); 
extern void* sf_system_malloc_fast(kal_uint32 size); 
extern void sf_system_free_fast(void* ptr); 
 
typedef struct _SFTimerInfo 
{ 
	SFTIMER_ID iTimerId; 
	ISFApplication* pHandler; 
	SFInt iExpiredTime; 
	SFBool bOnce; 
} SFTimerInfo; 
 
typedef struct _SFAppKernal 
{ 
	SFTimerInfo iTimerInfo; 
	ISFApplication* pApplication; 
	SFBool bAppRunning; 
	SFUint32 iKeyState; 
	gdi_handle iGdiLayer; 
	SFAnyPtr pHeap; 
	SFBool bWavPlaying; 
	SFBool bMidiPlaying; 
#ifdef WIN32 
	FILE*fpFile; 
#else 
	FS_HANDLE hFile; 
#endif 
} SFAppKernal; 
 
void SFDEBUG(const char*str) 
{ 
#ifdef MMI_ON_HARDWARE_P 
//kal_prompt_trace(MOD_MMI,(char *)str); 
#endif 
} 
 
 
#define SNOWFISH_APP_MEM_LENGTH (512*1024+256*1024) 
//U8  SnowFishMemPool[SNOWFISH_APP_MEM_LENGTH] = {0}; 
static U16 u16_g_game_file_name[FMGR_PATH_BUFFER_SIZE/2]; 
 
kal_uint16 g_mtk_MOD_MMI=MOD_MMI; 
#ifdef __MMI_GPRS_FEATURES__ 
kal_uint32 g_mtk_nwk_account_id;// = custom_get_csd_profile_num(); 
#else 
kal_uint32 g_mtk_nwk_account_id = 0; 
#endif 
 
static SFBool g_bFirstTime=SFTrue; 
static SFAppKernal g_kernal; 
static BOOL g_bBgMusicOn = TRUE; 
static BOOL g_bRotate90 = TRUE; 
 
 
/*Output voice only through earphone when earphone plugged*/ 
extern U8 isEarphonePlugged; 
 
 
extern U8 gactivatedprofile; 
 
#if defined(__IMT_LCD_ROTATE_MMI__) 
extern U8 gMMILcdRotateState; 
#endif 
/***************************************************************************************************** 
  *inner function declaration 
  ****************************************************************************************************/ 
 
void SFApp_Entry(void); 
void game_select_account(void) ; 
void mmi_game_prof_data_acct_callback(U16 index) ; 
void mmi_game_prof_save_data_acct(void); 
static void SFApp_KeyHandler(S32 aKey,S32 aKeyState); 
void SFApp_FreeGDI(void); 
void EntryRomList(void); 
 
 
static SFBool SFApp_IsFirstTime(void) 
{ 
	return g_bFirstTime; 
} 
static void SFApp_SetFirstTime(SFBool bFirstTime) 
{ 
	g_bFirstTime=bFirstTime; 
} 
 
ISFApplication* SFGetApp(void) 
{ 
	return g_kernal.pApplication; 
} 
 
/** 
* @brief 关闭请求,不是用户方法 
*/ 
void SFApp_Terminate(void) 
{ 
	GoBackHistory(); 
} 
 
/** 
* @brief 表示应用主动要求退出,系统随后应该发送EVT_APP_DESTORY消息 
*/ 
void SFApp_Exit(void) 
{ 
	//send the destroy message first 
	g_kernal.bAppRunning=SFFalse; 
	SFApp_Terminate(); 
} 
 
 
/** 
* @brief 获取系统的屏幕缓冲区 
* @return 屏幕缓冲区指针 
*/ 
SFNColor* SFScreen_GetBuffer(void) 
{ 
	U8*ptr; 
	gdi_layer_get_buffer_ptr(&ptr); 
	return (SFNColor*)ptr; 
} 
 
 
/** 
* @brief 获取系统的屏幕宽度 
* @return 屏幕宽度 
*/ 
SFInt SFScreen_GetWidth(void) 
{ 
	return SF_SCREEN_WIDTH; 
} 
 
 
/** 
* @brief 获取系统的屏幕高度 
* @return 屏幕高度 
*/ 
SFInt SFScreen_GetHeight(void) 
{ 
	return SF_SCREEN_HEIGHT; 
} 
 
/** 
* @brief 把系统的屏幕缓冲区内容刷新到前台(实际屏幕) 
*/ 
#if 0 
void SFScreen_Update(void) 
{ 
	START_LCD_TRANSFER; 
	//gdi_layer_blt_previous(0, 0,LCD_WIDTH, LCD_HEIGHT); 
} 
#endif 
/* 
方案二*/ 
void SFScreen_Update(void) 
{ 
	gdi_layer_blt_previous(0, 0,LCD_WIDTH, LCD_HEIGHT); 
} 
 
 
SFInt SFFont_GetHeight(void) 
{ 
	return (SFInt)gui_get_character_height(); 
} 
 
 
SFInt SFFont_GetCharWidth(UNICHAR aChar) 
{ 
	SFInt width=0,height=0; 
	U8 buf[4]={0,0,0,0}; 
	buf[0]=(aChar)&0xff; 
	buf[1]=((aChar>>8) & 0xff); 
	 
	gui_measure_string_n((UI_string_type)buf,1,&width,&height); 
	return width; 
} 
 
 
SFInt SFFont_GetStringWidth(UString aStr,SFInt aLength) 
{ 
 SFInt width=0,height=0,i; 
 //TODO LATER : should be replaced 
 if(aLength<0) 
 { 
  aLength=sf_strlen(aStr); 
 } 
 for(i=0;ipfnEvtHandler(pHandler,EVT_TIMER,idTimer,(SFWPARAM)0); 
 
//	g_bRotate90 = (SFNesEmuApp_GetStatus() == NESEMU_STATUS_GAMER90); 
} 
 
/** 
* @brief 启动一个定时器 
* @param idTimer - IN 定时器ID 
* @param nExpiredTime - IN 以毫秒为单位的定时时间 
* @param bOnceOrPeriod - IN YSTrue 表示定时器只有效一次,YSFalse 表示按指定间隔反复发出信号 
*/ 
void SFTimer_Start(SFTIMER_ID idTimer,SFInt nExpiredTime,SFBool bOnce,ISFApplication*pHandler) 
{ 
	g_kernal.iTimerInfo.bOnce=bOnce; 
	g_kernal.iTimerInfo.iExpiredTime=nExpiredTime; 
	g_kernal.iTimerInfo.iTimerId=idTimer; 
	g_kernal.iTimerInfo.pHandler=pHandler; 
 
	gui_start_timer(nExpiredTime,SFTimer_Callback); 
} 
 
 
/** 
* @brief 停止指定的定时器 
* @param idTimer - IN 定时器ID 
*/ 
void SFTimer_Stop(SFTIMER_ID idTimer) 
{ 
	if(g_kernal.iTimerInfo.iTimerId==idTimer) 
	{ 
		gui_cancel_timer(SFTimer_Callback); 
	} 
} 
 
 
/** 
* @brief 获取游戏中可分配的连续空间首地址 
* @return 取得的空间首地址 
*/ 
SFAnyPtr SFSystem_GetHeap(void) 
{ 
	return g_kernal.pHeap; 
} 
 
extern void InitSysStream(void); 
 
void SFSystem_Initialize(void) 
{ 
	g_kernal.bWavPlaying=SFFalse; 
	g_kernal.bMidiPlaying=SFFalse; 
//#ifdef WIN32 
//	g_kernal.fpFile=SFNull; 
//#else 
	g_kernal.hFile=0; 
//#endif 
	//静态分配内存的话请在这里返回那个空间的首地址。 
	//g_kernal.pHeap=&SnowFishMemPool[0]; 
	//g_kernal.pHeap=sf_system_malloc(SNOWFISH_APP_MEM_LENGTH); 
	InitSysStream(); 
	 
} 
 
void SFSystem_Finalize(void) 
{ 
	if(g_kernal.bWavPlaying || g_kernal.bMidiPlaying) 
		mdi_audio_stop_string(); 
	if(g_kernal.pHeap) 
	{ 
		sf_system_free(g_kernal.pHeap); 
		g_kernal.pHeap=SFNull; 
	} 
} 
 
static const SFByte s_mapKey[MAX_KEYS] = 
{ 
	SFKEY_NUM0,//KEY_0= 0, 
	SFKEY_NUM1,//KEY_1,				 
	SFKEY_NUM2,//KEY_2,				 
	SFKEY_NUM3,//KEY_3,				 
	SFKEY_NUM4,//KEY_4,				 
	SFKEY_NUM5,//KEY_5,				 
	SFKEY_NUM6,//KEY_6,				 
	SFKEY_NUM7,//KEY_7,				 
	SFKEY_NUM8,//KEY_8,				 
	SFKEY_NUM9,//KEY_9,				 
	SFKEY_SL,//KEY_LSK,			 
	SFKEY_SR,//KEY_RSK,			 
	SFKEY_SM,//KEY_CSK, 
	SFKEY_UP,//KEY_UP_ARROW,			 
	SFKEY_DOWN,//KEY_DOWN_ARROW,		 
	SFKEY_LEFT,//KEY_LEFT_ARROW,		 
	SFKEY_RIGHT,//KEY_RIGHT_ARROW,		 
	SFKEY_NONE,//KEY_SEND,					 
	SFKEY_NONE,//KEY_END,					 
	SFKEY_CLR,//KEY_CLEAR,				 
	SFKEY_STAR,//KEY_STAR,					 
	SFKEY_POUND,//KEY_POUND,				 
	SFKEY_NONE,//KEY_VOL_UP,				 
	SFKEY_NONE,//KEY_VOL_DOWN,			 
	SFKEY_NONE,//KEY_QUICK_ACS,KEY_CAMERA			 
	SFKEY_NONE,//KEY_ENTER,KEY_WAP,KEY_IP					 
	SFKEY_NONE,//KEY_EXTRA_1, 
	SFKEY_NONE//KEY_EXTRA_2, 
}; 
 
void SfKey0_DownHandler(void) 
{ 
  	SFApp_KeyHandler(KEY_0,KEY_EVENT_DOWN); 
} 
 
void SfKey0_UpHandler(void) 
{ 
	SFApp_KeyHandler(KEY_0,KEY_EVENT_UP); 
} 
 
 
void SfKey1_DownHandler(void) 
{ 
  	SFApp_KeyHandler(KEY_1,KEY_EVENT_DOWN); 
} 
 
void SfKey1_UpHandler(void) 
{ 
	SFApp_KeyHandler(KEY_1,KEY_EVENT_UP); 
} 
 
void SfKey2_DownHandler(void) 
{ 
  	SFApp_KeyHandler(KEY_2,KEY_EVENT_DOWN); 
} 
 
void SfKey2_UpHandler(void) 
{ 
	SFApp_KeyHandler(KEY_2,KEY_EVENT_UP); 
} 
 
 
 
void SfKey3_DownHandler(void) 
{ 
  	SFApp_KeyHandler(KEY_3,KEY_EVENT_DOWN); 
} 
 
void SfKey3_UpHandler(void) 
{ 
	SFApp_KeyHandler(KEY_3,KEY_EVENT_UP); 
} 
 
 
void SfKey4_DownHandler(void) 
{ 
  	SFApp_KeyHandler(KEY_4,KEY_EVENT_DOWN); 
} 
 
void SfKey4_UpHandler(void) 
{ 
	SFApp_KeyHandler(KEY_4,KEY_EVENT_UP); 
} 
 
 
void SfKey5_DownHandler(void) 
{ 
  	SFApp_KeyHandler(KEY_5,KEY_EVENT_DOWN); 
} 
 
void SfKey5_UpHandler(void) 
{ 
	SFApp_KeyHandler(KEY_5,KEY_EVENT_UP); 
} 
 
void SfKey6_DownHandler(void) 
{ 
  	SFApp_KeyHandler(KEY_6,KEY_EVENT_DOWN); 
} 
 
void SfKey6_UpHandler(void) 
{ 
	SFApp_KeyHandler(KEY_6,KEY_EVENT_UP); 
} 
 
void SfKey7_DownHandler(void) 
{ 
  	SFApp_KeyHandler(KEY_7,KEY_EVENT_DOWN); 
} 
 
void SfKey7_UpHandler(void) 
{ 
	SFApp_KeyHandler(KEY_7,KEY_EVENT_UP); 
} 
 
 
void SfKey8_DownHandler(void) 
{ 
  	SFApp_KeyHandler(KEY_8,KEY_EVENT_DOWN); 
} 
 
void SfKey8_UpHandler(void) 
{ 
	SFApp_KeyHandler(KEY_8,KEY_EVENT_UP); 
} 
 
 
 
void SfKey9_DownHandler(void) 
{ 
  	SFApp_KeyHandler(KEY_9,KEY_EVENT_DOWN); 
} 
 
void SfKey9_UpHandler(void) 
{ 
	SFApp_KeyHandler(KEY_9,KEY_EVENT_UP); 
} 
 
void SfKeyLSK_DownHandler(void) 
{ 
  	SFApp_KeyHandler(KEY_LSK,KEY_EVENT_DOWN); 
} 
 
void SfKeyLSK_UpHandler(void) 
{ 
	SFApp_KeyHandler(KEY_LSK,KEY_EVENT_UP); 
} 
 
 
void SfKeyRSK_DownHandler(void) 
{ 
  	SFApp_KeyHandler(KEY_RSK,KEY_EVENT_DOWN); 
} 
 
void SfKeyRSK_UpHandler(void) 
{ 
	SFApp_KeyHandler(KEY_RSK,KEY_EVENT_UP); 
} 
 
 
void SfKeyEnter_DownHandler(void) 
{ 
  	SFApp_KeyHandler(KEY_ENTER,KEY_EVENT_DOWN); 
} 
 
void SfKeyEnter_UpHandler(void) 
{ 
	SFApp_KeyHandler(KEY_ENTER,KEY_EVENT_UP); 
} 
void SfKeyUpArrow_DownHandler(void) 
{ 
  	SFApp_KeyHandler(KEY_UP_ARROW,KEY_EVENT_DOWN); 
} 
 
void SfKeyUpArrow_UpHandler(void) 
{ 
	SFApp_KeyHandler(KEY_UP_ARROW,KEY_EVENT_UP); 
} 
 
void SfKeyDownArrow_DownHandler(void) 
{ 
  	SFApp_KeyHandler(KEY_DOWN_ARROW,KEY_EVENT_DOWN); 
} 
 
void SfKeyDownArrow_UpHandler(void) 
{ 
	SFApp_KeyHandler(KEY_DOWN_ARROW,KEY_EVENT_UP); 
} 
 
void SfKeyLeftArrow_DownHandler(void) 
{ 
  	SFApp_KeyHandler(KEY_LEFT_ARROW,KEY_EVENT_DOWN); 
} 
 
void SfKeyLeftArrow_UpHandler(void) 
{ 
	SFApp_KeyHandler(KEY_LEFT_ARROW,KEY_EVENT_UP); 
} 
 
void SfKeyRightArrow_DownHandler(void) 
{ 
  	SFApp_KeyHandler(KEY_RIGHT_ARROW,KEY_EVENT_DOWN); 
} 
 
void SfKeyRightArrow_UpHandler(void) 
{ 
	SFApp_KeyHandler(KEY_RIGHT_ARROW,KEY_EVENT_UP); 
} 
 
 
 
void SfKeyStar_DownHandler(void) 
{ 
  	SFApp_KeyHandler(KEY_STAR,KEY_EVENT_DOWN); 
} 
 
void SfKeyStar_UpHandler(void) 
{ 
	SFApp_KeyHandler(KEY_STAR,KEY_EVENT_UP); 
} 
 
 
void SfKeyPound_DownHandler(void) 
{ 
  	SFApp_KeyHandler(KEY_POUND,KEY_EVENT_DOWN); 
} 
 
void SfKeyPound_UpHandler(void) 
{ 
	SFApp_KeyHandler(KEY_POUND,KEY_EVENT_UP); 
} 
 
void SfKeyClear_DownHandler(void) 
{ 
  	SFApp_KeyHandler(KEY_CLEAR,KEY_EVENT_DOWN); 
} 
 
void SfKeyClear_UpHandler(void) 
{ 
	SFApp_KeyHandler(KEY_CLEAR,KEY_EVENT_UP); 
} 
 
void SfKeyEnd_DownHandler(void) 
{ 
	SFApp_KeyHandler(KEY_END,KEY_EVENT_DOWN); 
} 
 
void SFAppRegistKeyHandler() 
{ 
       ClearInputEventHandler(MMI_DEVICE_KEY); 
	    
	SetKeyHandler(SfKey0_DownHandler,KEY_0,KEY_EVENT_DOWN); 
	SetKeyHandler(SfKey0_UpHandler,KEY_0,KEY_EVENT_UP); 
 
	SetKeyHandler(SfKey1_DownHandler,KEY_1,KEY_EVENT_DOWN); 
	SetKeyHandler(SfKey1_UpHandler,KEY_1,KEY_EVENT_UP); 
 
	SetKeyHandler(SfKey2_DownHandler,KEY_2,KEY_EVENT_DOWN); 
	SetKeyHandler(SfKey2_UpHandler,KEY_2,KEY_EVENT_UP); 
 
	SetKeyHandler(SfKey3_DownHandler,KEY_3,KEY_EVENT_DOWN); 
	SetKeyHandler(SfKey3_UpHandler,KEY_3,KEY_EVENT_UP); 
 
	SetKeyHandler(SfKey4_DownHandler,KEY_4,KEY_EVENT_DOWN); 
	SetKeyHandler(SfKey4_UpHandler,KEY_4,KEY_EVENT_UP); 
 
	SetKeyHandler(SfKey5_DownHandler,KEY_5,KEY_EVENT_DOWN); 
	SetKeyHandler(SfKey5_UpHandler,KEY_5,KEY_EVENT_UP); 
 
 
	SetKeyHandler(SfKey6_DownHandler,KEY_6,KEY_EVENT_DOWN); 
	SetKeyHandler(SfKey6_UpHandler,KEY_6,KEY_EVENT_UP); 
 
	SetKeyHandler(SfKey7_DownHandler,KEY_7,KEY_EVENT_DOWN); 
	SetKeyHandler(SfKey7_UpHandler,KEY_7,KEY_EVENT_UP); 
 
 
	SetKeyHandler(SfKey8_DownHandler,KEY_8,KEY_EVENT_DOWN); 
	SetKeyHandler(SfKey8_UpHandler,KEY_8,KEY_EVENT_UP); 
	 
	SetKeyHandler(SfKey9_DownHandler,KEY_9,KEY_EVENT_DOWN); 
	SetKeyHandler(SfKey9_UpHandler,KEY_9,KEY_EVENT_UP); 
 
 
	SetKeyHandler(SfKeyLSK_DownHandler,KEY_LSK,KEY_EVENT_DOWN); 
	SetKeyHandler(SfKeyLSK_UpHandler,KEY_LSK,KEY_EVENT_UP); 
 
	SetKeyHandler(SfKeyRSK_DownHandler,KEY_RSK,KEY_EVENT_DOWN); 
	SetKeyHandler(SfKeyRSK_UpHandler,KEY_RSK,KEY_EVENT_UP); 
 
	SetKeyHandler(SfKeyEnter_DownHandler,KEY_ENTER,KEY_EVENT_DOWN); 
	SetKeyHandler(SfKeyEnter_UpHandler,KEY_ENTER,KEY_EVENT_UP); 
 
	SetKeyHandler(SfKeyUpArrow_DownHandler,KEY_UP_ARROW,KEY_EVENT_DOWN); 
	SetKeyHandler(SfKeyUpArrow_UpHandler,KEY_UP_ARROW,KEY_EVENT_UP); 
 
 
	SetKeyHandler(SfKeyDownArrow_DownHandler,KEY_DOWN_ARROW,KEY_EVENT_DOWN); 
	SetKeyHandler(SfKeyDownArrow_UpHandler,KEY_DOWN_ARROW,KEY_EVENT_UP); 
 
	SetKeyHandler(SfKeyLeftArrow_DownHandler,KEY_LEFT_ARROW,KEY_EVENT_DOWN); 
	SetKeyHandler(SfKeyLeftArrow_UpHandler,KEY_LEFT_ARROW,KEY_EVENT_UP); 
 
	SetKeyHandler(SfKeyRightArrow_DownHandler,KEY_RIGHT_ARROW,KEY_EVENT_DOWN); 
	SetKeyHandler(SfKeyRightArrow_UpHandler,KEY_RIGHT_ARROW,KEY_EVENT_UP); 
	 
	SetKeyHandler(SfKeyStar_DownHandler,KEY_STAR,KEY_EVENT_DOWN); 
	SetKeyHandler(SfKeyStar_UpHandler,KEY_STAR,KEY_EVENT_UP); 
 
	SetKeyHandler(SfKeyPound_DownHandler,KEY_POUND,KEY_EVENT_DOWN); 
	SetKeyHandler(SfKeyPound_UpHandler,KEY_POUND,KEY_EVENT_UP); 
	 
	SetKeyHandler(SfKeyClear_DownHandler,KEY_CLEAR,KEY_EVENT_DOWN); 
	SetKeyHandler(SfKeyClear_UpHandler,KEY_CLEAR,KEY_EVENT_UP); 
	 
	SetKeyHandler(SfKeyEnd_DownHandler,KEY_END,KEY_EVENT_DOWN); 
	 
} 
 
 
SFBool SFKey_IsPressed(SFInt aKeyCode) 
{ 
	if(g_kernal.iKeyState&(1<pfnEvtHandler(pApp,EVT_KEYDOWN,(SFWPARAM)aKey,0); 
		} 
	} 
	} 
	else if(aKeyState==KEY_EVENT_UP) 
	{ 
		/*if(aKey==KEY_END) 
		{ 
			//close the app 
			g_kernal.bAppRunning=SFFalse; 
			//terminate request 
			SFApp_Terminate(); 
 
			SFApp_Leave(); 
			SFDEBUG("term req"); 
		} 
		else*/ 
		{ 
			aKey=SFApp_MapKeyCode(aKey); 
			if(aKey!=SFKEY_NONE) 
			{ 
				g_kernal.iKeyState&=~(1<pfnEvtHandler(pApp,EVT_KEYUP,(SFWPARAM)aKey,0); 
			} 
		} 
	} 
} 
 
static void SFApp_PenMoveHandler(mmi_pen_point_struct pos) 
{ 
	ISFApplication*pApp=SFGetApp(); 
	pApp->pfnEvtHandler(pApp,EVT_POINTER_DRAGGED,SFMAKE_POINT(pos.x,pos.y),0); 
} 
static void SFApp_PenPressHandler(mmi_pen_point_struct pos) 
{ 
	ISFApplication*pApp=SFGetApp(); 
	pApp->pfnEvtHandler(pApp,EVT_POINTER_PRESSED,SFMAKE_POINT(pos.x,pos.y),0); 
} 
static void SFApp_PenReleaseHandler(mmi_pen_point_struct pos) 
{ 
	ISFApplication*pApp=SFGetApp(); 
	pApp->pfnEvtHandler(pApp,EVT_POINTER_RELEASED,SFMAKE_POINT(pos.x,pos.y),0); 
} 
 
//static void SFApp_LoadGameSetting() 
//{	 
//	S16 error; 
//#ifdef __MMI_GAME_MULTICHANNEL_SOUND__ 
// 
//	ReadValue(NVRAM_GFX_BACKGROUND_MUSIC_SETTING, &g_bBgMusicOn, DS_BYTE , &error); 
// 
//	/* if not init, init as ON */ 
//	if(g_bBgMusicOn == 0xff) 
//	{ 
//		g_bBgMusicOn = TRUE; 
//	}	 
//#endif	 
//} 
 
static U32 g_myKeyState=0; 
 
static void KeyHandler_ForA_Up(void) 
{ 
	g_myKeyState&=~SFKS_NUM2; 
} 
static void KeyHandler_ForB_Up(void) 
{ 
	g_myKeyState&=~SFKS_NUM1; 
} 
static void KeyHandler_ForSelect_Up(void) 
{ 
	g_myKeyState&=~SFKS_NUM8; 
} 
static void KeyHandler_ForStart_Up(void) 
{ 
	g_myKeyState&=~SFKS_NUM7; 
} 
static void KeyHandler_ForUp_Up(void) 
{ 
	g_myKeyState&=~SFKS_UP; 
} 
static void KeyHandler_ForDown_Up(void) 
{ 
	g_myKeyState&=~SFKS_DOWN; 
} 
static void KeyHandler_ForLeft_Up(void) 
{ 
	g_myKeyState&=~SFKS_LEFT; 
} 
static void KeyHandler_ForRight_Up(void) 
{ 
	g_myKeyState&=~SFKS_RIGHT; 
} 
static void KeyHandler_ForA_Down(void) 
{ 
	g_myKeyState|=~SFKS_NUM2; 
} 
static void KeyHandler_ForB_Down(void) 
{ 
	g_myKeyState|=~SFKS_NUM1; 
} 
static void KeyHandler_ForSelect_Down(void) 
{ 
	g_myKeyState|=~SFKS_NUM8; 
} 
static void KeyHandler_ForStart_Down(void) 
{ 
	g_myKeyState|=~SFKS_NUM7; 
} 
static void KeyHandler_ForUp_Down(void) 
{ 
	g_myKeyState|=SFKS_UP; 
} 
static void KeyHandler_ForDown_Down(void) 
{ 
	g_myKeyState|=SFKS_DOWN; 
} 
static void KeyHandler_ForLeft_Down(void) 
{ 
	g_myKeyState|=SFKS_LEFT; 
} 
static void KeyHandler_ForRight_Down(void) 
{ 
	g_myKeyState|=SFKS_RIGHT; 
} 
static void KeyHandler_ForSound_Up(void) 
{ 
	g_myKeyState&=~SFKS_NUM9; 
} 
static void KeyHandler_ForSound_Down(void) 
{ 
	g_myKeyState|=SFKS_NUM9; 
} 
 
 
void SetupKeyHandlers(void) 
{ 
	g_myKeyState=0; 
	 
	SetKeyHandler(KeyHandler_ForUp_Up,KEY_UP_ARROW,KEY_EVENT_UP); 
	SetKeyHandler(KeyHandler_ForDown_Up,KEY_DOWN_ARROW,KEY_EVENT_UP); 
	SetKeyHandler(KeyHandler_ForLeft_Up,KEY_LEFT_ARROW,KEY_EVENT_UP); 
	SetKeyHandler(KeyHandler_ForRight_Up,KEY_RIGHT_ARROW,KEY_EVENT_UP); 
	 
	SetKeyHandler(KeyHandler_ForUp_Down,KEY_UP_ARROW,KEY_EVENT_DOWN); 
	SetKeyHandler(KeyHandler_ForDown_Down,KEY_DOWN_ARROW,KEY_EVENT_DOWN); 
	SetKeyHandler(KeyHandler_ForLeft_Down,KEY_LEFT_ARROW,KEY_EVENT_DOWN); 
	SetKeyHandler(KeyHandler_ForRight_Down,KEY_RIGHT_ARROW,KEY_EVENT_DOWN); 
	 
	SetKeyHandler(KeyHandler_ForA_Up,KEY_1,KEY_EVENT_UP); 
	SetKeyHandler(KeyHandler_ForB_Up,KEY_2,KEY_EVENT_UP); 
	SetKeyHandler(KeyHandler_ForSelect_Up,KEY_4,KEY_EVENT_UP); 
	SetKeyHandler(KeyHandler_ForStart_Up,KEY_5,KEY_EVENT_UP); 
	 
	SetKeyHandler(KeyHandler_ForA_Down,KEY_1,KEY_EVENT_DOWN); 
	SetKeyHandler(KeyHandler_ForB_Down,KEY_2,KEY_EVENT_DOWN); 
	SetKeyHandler(KeyHandler_ForSelect_Down,KEY_4,KEY_EVENT_DOWN); 
	SetKeyHandler(KeyHandler_ForStart_Down,KEY_5,KEY_EVENT_DOWN); 
	 
	SetKeyHandler(KeyHandler_ForSound_Up,KEY_VOL_UP,KEY_EVENT_UP); 
	SetKeyHandler(KeyHandler_ForSound_Down,KEY_VOL_DOWN,KEY_EVENT_DOWN); 
	 
	 
} 
 
 
void SFApp_SetupHandlers(void) 
{ 
	//clear key states 
	g_kernal.iKeyState=0;  
	ClearAllKeyHandler(); 
	SetKeyHandler(SfKeyEnd_DownHandler,KEY_END,KEY_EVENT_DOWN); 
	SetKeyHandler(mmi_gfx_volume_up,	KEY_UP_ARROW, KEY_EVENT_DOWN); 
	SetKeyHandler(mmi_gfx_volume_down,	KEY_DOWN_ARROW, KEY_EVENT_DOWN);	 
	mmi_pen_register_down_handler(SFApp_PenPressHandler); 
	mmi_pen_register_move_handler(SFApp_PenMoveHandler); 
	mmi_pen_register_up_handler(SFApp_PenReleaseHandler); 
	 
	SetupKeyHandlers(); 
} 
 
#if 0 
void SFApp_SetupGDI(void) 
{ 
	gdi_handle gdi_hdlr; 
	lcd_power_up(); 
	entry_full_screen(); 
 
	gdi_layer_reset_clip(); 
	gdi_layer_get_base_handle(&gdi_hdlr); 
	gdi_layer_set_blt_layer(gdi_hdlr,0,0,0); 
 
	gdi_layer_set_active(gdi_hdlr); 
	gdi_layer_clear(GDI_COLOR_BLACK); 
		 
	TurnOnBacklight(0); 
 
	gdi_layer_blt_ext(GDI_LAYER_MAIN_BASE_LAYER_HANDLE, 0, 0, 0, 
			#ifdef GDI_6_LAYERS 
						0, 0, 
			#endif 
						0, 0, LCD_WIDTH-1, LCD_HEIGHT-1);	 
 
    gdi_layer_lock_frame_buffer(); 
 
	mmi_frm_kbd_set_tone_state(MMI_KEY_TONE_DISABLED); 
/* 
	gdi_handle gdi_hdlr; 
	lcd_power_up(); 
	entry_full_screen(); 
 
	gdi_layer_reset_clip(); 
	gdi_layer_get_base_handle(&gdi_hdlr); 
	gdi_layer_set_blt_layer(gdi_hdlr,0,0,0); 
 
	gdi_layer_set_active(gdi_hdlr); 
	mmi_frm_kbd_set_tone_state(MMI_KEY_TONE_DISABLED); 
*/ 
} 
#endif 
/* 
方案二*/ 
void SFApp_SetupGDI(void) 
{ 
	gdi_handle gdi_hdlr; 
	lcd_power_up(); 
	entry_full_screen(); 
 
	gdi_layer_reset_clip(); 
	gdi_layer_get_base_handle(&gdi_hdlr); 
	gdi_layer_set_blt_layer(gdi_hdlr,0,0,0); 
	gdi_layer_clear(GDI_COLOR_BLACK);     
 
	gdi_layer_set_active(gdi_hdlr); 
	mmi_frm_kbd_set_tone_state(MMI_KEY_TONE_DISABLED); 
} 
 
#if 0 
void SFApp_FreeGDI(void) 
{ 
	gdi_layer_unlock_frame_buffer(); 
	lcd_power_down(); 
 
	TurnOffBacklight(); 
 
	mmi_frm_kbd_set_tone_state(MMI_KEY_TONE_ENABLED); 
/* 
	lcd_power_down(); 
 
	TurnOffBacklight(); 
 
	mmi_frm_kbd_set_tone_state(MMI_KEY_TONE_ENABLED); 
*/ 
} 
#endif 
/* 
方案二*/ 
void SFApp_FreeGDI(void) 
{ 
	lcd_power_down(); 
 
	TurnOffBacklight(); 
 
	mmi_frm_kbd_set_tone_state(MMI_KEY_TONE_ENABLED); 
} 
 
 
void SFApp_Leave(void); 
void SFApp_Enter(void); 
 
void EntrySFApp(PS8 filename, BOOL is_short) 
{ 
	memset(u16_g_game_file_name,0x0,FMGR_PATH_BUFFER_SIZE); 
	 
	pfnUnicodeStrcpy((PS8)u16_g_game_file_name, filename); 
	 
	SFApp_Entry(); 
} 
 
void game_simu_highlight(void) 
{ 
	SetLeftSoftkeyFunction(EntryRomList, KEY_EVENT_UP); 
	SetKeyHandler(EntryRomList, KEY_RIGHT_ARROW, KEY_EVENT_DOWN); 
	SetRightSoftkeyFunction(GoBackHistory,KEY_EVENT_UP); 
	SetKeyHandler(GoBackHistory, KEY_LEFT_ARROW, KEY_EVENT_DOWN); 
} 
 
void GameSimuInit(void) 
{ 
	//SetHiliteHandler(MENU_ID_FNG_GAME_SIMU, game_simu_highlight); 
} 
 
U8 mmi_game_simu_delete_history_hdlr( void* in_param ) 
{ 
	ISFApplication*pApp=SFGetApp(); 
 
	if(g_kernal.bAppRunning) 
	{ 
		g_kernal.bAppRunning = SFFalse; 
		 
		pApp->pfnEvtHandler(pApp,EVT_APP_DESTROY,0,0); 
		SFApp_SetFirstTime(SFTrue); 
 
		SFSystem_Finalize();		 
	} 
} 
	 
void SFApp_Entry(void) 
{ 
	//create the app first 
	EntryNewScreen(SCR_ID_VDOPLY_STREAM_EDITOR,SFApp_Leave,SFApp_Entry,SFNull); 
	SetDelScrnIDCallbackHandler( SCR_ID_VDOPLY_STREAM_EDITOR, (HistoryDelCBPtr)mmi_game_simu_delete_history_hdlr ); 
	 
	/* stop bg music */ 
	mdi_audio_suspend_background_play(); 
	SFApp_SetupHandlers(); 
	SFApp_SetupGDI(); 
	//SFApp_LoadGameSetting(); 
	 
	if(SFApp_IsFirstTime()) 
	{ 
		//do init 
		SFApp_SetFirstTime(SFFalse); 
		g_kernal.bAppRunning=SFTrue; 
		 
		SFSystem_Initialize(); 
 
	//	g_kernal.pApplication=SFApp_Create(1); 
 
		g_kernal.pApplication->pfnEvtHandler(g_kernal.pApplication,EVT_APP_START,0,0); 
	} 
	else 
	{ 
		//resume 
		ISFApplication*pApp=SFGetApp(); 
		pApp->pfnEvtHandler(pApp,EVT_APP_RESUME,0,0); 
	} 
} 
 
void SFApp_Leave(void) 
{ 
	ISFApplication*pApp=SFGetApp(); 
	if(!g_kernal.bAppRunning) 
	{ 
		//destroy 
		pApp->pfnEvtHandler(pApp,EVT_APP_DESTROY,0,0); 
		SFApp_SetFirstTime(SFTrue); 
 
		SFSystem_Finalize(); 
	} 
	else 
	{ 
		//pause 
		pApp->pfnEvtHandler(pApp,EVT_APP_PAUSE,0,0); 
		//gdi_layer_blt_previous(0, 0, UI_device_width-1, UI_device_height-1); 
	} 
 
	SFApp_FreeGDI(); 
		 
	/* resume background audio */ 
	mdi_audio_resume_background_play(); 
} 
 
 
/** 
* @brief 获取游戏中可分配的连续空间大小 
* @return 空间的大小 
*/ 
SFSize_T SFSystem_GetHeapSize(void) 
{ 
	return SNOWFISH_APP_MEM_LENGTH; 
} 
 
void SFSystem_GetCurrentDataTime(SFDateTime*pDataTime) 
{ 
	MYTIME mt; 
	DTGetRTCTime(&mt); 
	pDataTime->nYear=(U16)mt.nYear; 
	pDataTime->nMonth=(U8)mt.nMonth; 
	pDataTime->nDay=(U8)mt.nDay; 
	pDataTime->nHour=(U8)mt.nHour; 
	pDataTime->nMinute=(U8)mt.nMin; 
	pDataTime->nSecond=(U8)mt.nSec; 
	kal_get_time(&pDataTime->nMill); 
} 
 
/** 
* @brief 开始播放一个声音 
* @param pSndBuffer - 声音缓冲 
* @param uBufferSize - 声音缓冲大小 
* @param format - 声音数据格式 
* @param nLoopCount - 0表示循环播放,其他表示播放次数 
* @return 播放ID 
*/ 
SFSND_ID SFSnd_Play(void*pSndBuffer,unsigned int uBufferSize,SFSND_FORMAT format,int nLoopCount) 
{ 
	if(!g_bBgMusicOn 
		|| (MMI_PROFILE_SILENT == gactivatedprofile) 
		|| (MMI_PROFILE_MEETING == gactivatedprofile)) 
	{ 
		return 0; 
	} 
	 
 
//Output audio only through the earphone when earphone plugged 
	if(isEarphonePlugged) 
	{ 
		if(format==SNDFORMAT_MIDI) 
		{ 
			if(g_kernal.bMidiPlaying) 
				mdi_audio_stop_string(); 
			//PlayAudioMidiStream((U8*)pSndBuffer,(U16)uBufferSize,0); 
			mdi_audio_play_string_with_vol_path(pSndBuffer,uBufferSize,MDI_FORMAT_SMF,nLoopCount==1?DEVICE_AUDIO_PLAY_ONCE:DEVICE_AUDIO_PLAY_INFINITE,SFNull,SFNull,255,MDI_DEVICE_SPEAKER2); 
			g_kernal.bMidiPlaying=SFTrue; 
			return 1; 
		} 
		else if(format==SNDFORMAT_WAVE) 
		{ 
			if(g_kernal.bWavPlaying) 
				mdi_audio_stop_string(); 
			//PlayAudioWavStream((U8*)pSndBuffer,(U16)uBufferSize,0); 
			mdi_audio_play_string_with_vol_path(pSndBuffer,uBufferSize,MDI_FORMAT_WAV,nLoopCount==1?DEVICE_AUDIO_PLAY_ONCE:DEVICE_AUDIO_PLAY_INFINITE,SFNull,SFNull,255,MDI_DEVICE_SPEAKER2); 
			g_kernal.bWavPlaying=SFTrue; 
			return 2; 
		} 
	} 
	else 
     { 
	if(format==SNDFORMAT_MIDI) 
	{ 
		if(g_kernal.bMidiPlaying) 
			mdi_audio_stop_string(); 
		mdi_audio_play_string_with_vol_path(pSndBuffer,uBufferSize,MDI_FORMAT_SMF,nLoopCount==1?DEVICE_AUDIO_PLAY_ONCE:DEVICE_AUDIO_PLAY_INFINITE,SFNull,SFNull,255,MDI_DEVICE_SPEAKER_BOTH); 
		g_kernal.bMidiPlaying=SFTrue; 
		return 1; 
	} 
	else if(format==SNDFORMAT_WAVE) 
	{ 
		if(g_kernal.bWavPlaying) 
			mdi_audio_stop_string(); 
		mdi_audio_play_string_with_vol_path(pSndBuffer,uBufferSize,MDI_FORMAT_WAV,nLoopCount==1?DEVICE_AUDIO_PLAY_ONCE:DEVICE_AUDIO_PLAY_INFINITE,SFNull,SFNull,255,MDI_DEVICE_SPEAKER_BOTH); 
		g_kernal.bWavPlaying=SFTrue; 
		return 2; 
	} 
     } 
     return 0; 
} 
/** 
* @brief 结束并关闭声音的播放 
* @param idSnd - 播放声音ID 
*/ 
void SFSnd_Stop(SFSND_ID idSnd) 
{ 
	if(idSnd==1) 
	{ 
		mdi_audio_stop_string(); 
	} 
	else if(idSnd==2) 
	{ 
		mdi_audio_stop_string(); 
	} 
} 
 
 
SFFS_HANDLE SFFS_Open(UString path,SFUint flags) 
{ 
#ifdef WIN32 
	g_kernal.fpFile=_wfopen(path,(flags&SFFSF_READ)?L"rb":L"wb"); 
	if(!g_kernal.fpFile) 
		return 0; 
	return 1; 
#else 
	//暂时关闭存档功能 
	g_kernal.hFile=FS_Open(path,(flags&SFFSF_READ)?FS_READ_ONLY:(FS_READ_WRITE|FS_CREATE)); 
	if(g_kernal.hFile<0)//??? 
		return 0; 
	return 1; 
#endif 
	 
} 
 
SFSize_T SFFS_Read(SFFS_HANDLE hFile,SFAnyPtr buf,SFSize_T sz) 
{ 
#ifdef WIN32 
	if(!g_kernal.fpFile) 
		return (SFSize_T)0; 
	return (SFSize_T)fread(buf,1,sz,g_kernal.fpFile); 
#else 
	UINT len=0; 
	FS_Read(g_kernal.hFile,buf,(UINT)sz,&len); 
	return (SFSize_T)len; 
#endif 
} 
 
SFSize_T SFFS_Write(SFFS_HANDLE hFile,const SFAny* buf,SFSize_T sz) 
{ 
#ifdef WIN32 
	if(!g_kernal.fpFile) 
		return (SFSize_T)0; 
	return (SFSize_T)fwrite(buf,1,sz,g_kernal.fpFile); 
#else 
	UINT len=0; 
	FS_Write(g_kernal.hFile,(void*)buf,(UINT)sz,&len); 
	return (SFSize_T)len; 
#endif 
} 
 
void SFFS_Close(SFFS_HANDLE hHandle) 
{ 
#ifdef WIN32 
	if(!g_kernal.fpFile) 
		return; 
	fclose(g_kernal.fpFile); 
#else 
	FS_Close(g_kernal.hFile); 
#endif 
} 
 
SFBool SFFS_GetSize(SFFS_HANDLE hHandle,SFSize_T*pSz) 
{ 
#ifdef WIN32 
	long fsz=_filelength(g_kernal.fpFile->_file); 
	if(fsz>=0) 
	{ 
		*pSz=fsz; 
		return SFTrue; 
	} 
	return SFFalse; 
#else 
	UINT sz=0; 
	FS_GetFileSize(g_kernal.hFile,&sz); 
	*pSz=sz; 
	return  SFTrue; 
#endif 
} 
 
void SFScreen_DrawTextN(UString str,SFInt length,SFInt x,SFInt y,SFUint32 cr) 
{ 
	S32 str_w, str_h,str_size; 
	SFInt i; 
	SFInt cursor_x =x; 
	color text_color; 
	U8 buf[4]={0,0,0,0}; 
	 
 
	text_color.alpha=((cr & 0xff00000)>>24) & 0xff; 
	text_color.r=((cr & 0x00ff0000)>>16) & 0xff; 
	text_color.g=((cr & 0x0000ff00)>>8) & 0xff; 
	text_color.b=((cr & 0x000000ff)) & 0xff; 
	 
       gui_set_text_color(text_color); 
 
	for(i=0;i>8) & 0xff); 
		gui_print_text((UI_string_type)buf); 
		cursor_x+=SFFont_GetCharWidth(str[i]); 
	} 
} 
 
extern void SFSms_Callback(unsigned char status); 
SFSMS_ID SFSms_Send(const UChar*pNumber,const UChar *pContent) 
{ 
#if 0 
	int i; 
	char buf[64]; 
	for(i=0;i<63;i++) 
	{ 
		if(pNumber[i]) 
			buf[i]=(char)pNumber[i]; 
		else 
			break; 
	} 
	buf[i]='\0'; 
	mmi_send_short_message(buf,(unsigned char*)pContent,1,SFSms_Callback); 
	return 1; 
#endif 
} 
 
SFBool SFSystem_HasSim(void) 
{ 
	if(mmi_bootup_is_sim_valid()) 
	{ 
		return SFTrue; 
	} 
	else 
	{ 
		return SFFalse; 
	} 
} 
 
 
//Data_Account Interface 
extern void DataAccountReadyCheck(FuncPtr ready_callback); 
extern void GPRSAppDTCNTSelect( FuncPtrShort callback, U16 AppMenuID); 
extern kal_uint8 custom_get_csd_profile_num(); 
//void game_select_account(void)  
//{  
// 
// 
//#ifdef  __MMI_GPRS_FEATURES__      
//       GPRSAppDTCNTSelect(mmi_game_prof_data_acct_callback, MENU_ID_SNOWFISH_APP);  
//#else 
//       AppDTCNTSelect(mmi_game_prof_data_acct_callback,MENU_ID_SNOWFISH_APP); 
//#endif 
//#endif/*remove end*/ 
//}  
 
void mmi_game_prof_data_acct_callback(U16 index)  
{  
#ifdef  __MMI_GPRS_FEATURES__      
	g_mtk_nwk_account_id = (S32)(index+custom_get_csd_profile_num());  
#else 
	g_mtk_nwk_account_id = (S32)index;  
#endif 
	mmi_game_prof_save_data_acct(); 
#ifdef MMI_ON_HARDWARE_P 
       kal_prompt_trace(MOD_MMI,"mmi_game_prof_data_acct_callback get account is %d",g_mtk_nwk_account_id); 
#endif 
 
}  
 
/** 
 * @brief 浏览并选择一个文件以供之后打开 
 * @param aBuffer - 接受文件名的缓冲 
 * @param aMaxSize - 缓冲以字符为单位的大小,含0结尾 
 * @param abOpenFile - 是否是打开文件还是保存文件 
 * @param aFilter - 过滤字符串,格式为"*.aaa;*.bbb",如果为SFNull表示"*.*" 
 * @param aReason - 异步调用的通知结果的存放地址,调用后应当设为SF_REASON_BUSY,然后在系统处理完后设置实际的处理结果,成功的话设为SF_REASON_OK 
 * @remarks 这是一个异步调用,调用后将在之后控制权交还系统时离开本应用进入系统的打开界面,之后回到应用再设置结果。 
 */ 
void SFSystem_SelectFile(UChar* aBuffer,SFSize_T aMaxSize,SFBool bOpenFile,const UChar* aFilter,SFReason* aReason) 
{ 
	if(bOpenFile) 
	{ 
		AnsiiToUnicodeString((S8 *)aBuffer,(S8 *)"d:\\demo.nes"); 
		* aReason = SF_REASON_OK; 
	} 
} 
 
#define 	SF_SOUND_BUFFER_SIZE 		0x8000 
static kal_uint8	u8_g_sound_buffer[SF_SOUND_BUFFER_SIZE]; 
 
#if defined(__MTK_TARGET__) 
#pragma arm section code = "AUDIOAPICODE",rwdata = "AUDIOAPIRW", zidata = "AUDIOAPIZI" 
#endif 
static kal_uint8	u8_g_sound_playflag=0;		// 声音播放标志 
static kal_uint8	*pu8_g_sound_bufstart;		// 声音数据缓冲区首地址 
static kal_uint32	u32_g_sound_bufsize;		// 声音缓冲区大小 
static kal_uint8	*pu8_g_sound_out_ptr;		// 声音播出指针 
static kal_uint8	*pu8_g_sound_in_ptr;		// 声音写入指针 
 
 
/** 
* @brief 创建一个PCM播放设备 
* @param aFormat - 必须为0 
* @param aSamplesPerSec - 每秒的采样数 
* @param aBit - 采样精度8/16 
* @param aChannel - 声道 
* @return 创建的声音设备 
*/ 
SFPCMDevice device; 
SFPCMDevice* SFPCMDevice_Create(SFInt aFormat,SFInt aSamplesPerSec,SFInt 
aBit,SFInt aChannel) 
{ 
	PARAM_UNUSED(aFormat); 
	PARAM_UNUSED(aSamplesPerSec); 
	PARAM_UNUSED(aChannel); 
	return &device; 
} 
 
/** 
* @brief 开始播放指定的设备 
* @param aDevice - 播放的设备 
*/ 
void SFPCMDevice_Start(SFPCMDevice* aDevice) 
{ 
	PARAM_UNUSED(aDevice); 
 
	if((MMI_PROFILE_SILENT == gactivatedprofile) 
		|| (MMI_PROFILE_MEETING == gactivatedprofile)) 
	{ 
		return; 
	} 
	 
	u8_g_sound_playflag = 1; 
	pu8_g_sound_bufstart = (U8 *)u8_g_sound_buffer; 
	u32_g_sound_bufsize = SF_SOUND_BUFFER_SIZE; 
	pu8_g_sound_in_ptr = pu8_g_sound_out_ptr = pu8_g_sound_bufstart; 
 
	memset(pu8_g_sound_bufstart,0x0,u32_g_sound_bufsize); 
	 
	mdi_audio_play_string(pu8_g_sound_bufstart, u32_g_sound_bufsize,  
		MDI_FORMAT_PCM_8K, DEVICE_AUDIO_PLAY_INFINITE, NULL, NULL); 
} 
 
/** 
* @brief 停止声音播放 
* @param aDevice - 播放的设备 
*/ 
void SFPCMDevice_Stop(SFPCMDevice* aDevice) 
{ 
	PARAM_UNUSED(aDevice); 
 
	if((MMI_PROFILE_SILENT == gactivatedprofile) 
		|| (MMI_PROFILE_MEETING == gactivatedprofile)) 
	{ 
		return; 
	} 
	 
	u8_g_sound_playflag = 0; 
	mdi_audio_stop_string(); 
} 
 
/** 
* @brief 关闭设备 
* @param aDevice - 创建的声音设备 
*/ 
void SFPCMDevice_Close(SFPCMDevice* aDevice) 
{ 
	PARAM_UNUSED(aDevice); 
	if(u8_g_sound_playflag == 1) 
	{ 
		u8_g_sound_playflag = 0; 
		mdi_audio_stop_string(); 
	} 
	return; 
} 
 
#if defined(__MTK_TARGET__) 
#pragma arm section code rwdata zidata 
#endif 
 
/** 
* @brief 设置设备的音量 
* @param aDevice - 创建的声音设备 
* @param aVolume - 设置的音量 
*/ 
void SFPCMDevice_SetVolume(SFPCMDevice* aDevice,SFInt aVolume) 
{ 
	PARAM_UNUSED(aDevice); 
	PARAM_UNUSED(aVolume); 
} 
 
/** 
* @brief 获取设备的音量 
* @param aDevice - 创建的声音设备 
* @return 音量 
*/ 
SFInt SFPCMDevice_GetVolume(SFPCMDevice* aDevice) 
{ 
	PARAM_UNUSED(aDevice); 
	return 0; 
} 
 
void mmi_game_prof_save_data_acct(void) 
{ 
#if 0  
	DeleteUptoScrID(SCR_ID_SNOWFISH_APP); 
	GoBackHistory(); 
#endif/*remove end*/ 
} 
 
SFSize_T SFApp_GetCommandLine(UChar* aBuffer,SFSize_T aSize) 
{	 
	SFSize_T realSize; 
	 
	realSize = pfnUnicodeStrlen((S8 *)u16_g_game_file_name); 
 
	if(realSize >= aSize) 
	{ 
		realSize = aSize - 1; 
	} 
 
	if(realSize > 0) 
	{ 
		pfnUnicodeStrncpy((PS8)aBuffer, (PS8)u16_g_game_file_name,realSize); 
		aBuffer[realSize + 1] = 0x0;		 
	} 
 
	return realSize; 
} 
 
#define		KEY_REGISTER_TIME		0x80200230 
#define		KEY_REGISTER_LOW		0x80110004 
#define		KEY_REGISTER_MID		0x80110008 
#define		KEY_REGISTER_HIG		0x8011000c 
//up:0xFFFFFFFE	L 
//sr:0xFFFFFFFD	L 
//r:0xFFFFFFFB	L 
//l:0xFFFFFFF7	L 
//--:0xFFFFFFEF	L 
//--:0xFFFFFFDF	L 
//--:0xFFFFFFBF	L 
 
//send:0xFFFFFF7F	L 
//sl:0xFFFFFEFF	L 
//menu:0xFFFFFDFF	L 
//d:0xFFFFFBFF	L 
//--0xFFFFF7FF	L 
//--0xFFFFEFFF	L 
//--0xFFFFDFFF	L 
 
//VUP:0xFFFFBFFF	L 
//STAR:0xFFFF7FFF	L 
//N3:FFFE	M 
//N2:FFFD M 
//MP3_F:FFFB M 
//--:FFF7 M 
//--FFEF M 
 
//VDOWN:FFDF M 
//N0:FFBF M 
//N6:FF7F M 
//N5:FEFF M 
//MP3_B:FDFF M 
//--FBFF M 
//--F7FF M 
 
//EX1:EFFF M 
//HASH:DFFF M 
//N9:BFFF M 
//N8:7FFF M 
//--FFFE H 
//--FFFD H 
//--FFFB H 
 
//--FFF7 H 
//N1:FFEF H 
//N4:FFDF H 
//N7:FFBF H 
//--:FF7F H 
//-- 
//-- 
 
 
#define		KEY_PUB_LSK				0xdfff//KP_MID_KEY//0xFEFF L 
#define		KEY_PUB_RSK				0xbfff//KP_MID_KEY//0xFFFD L 
#define		KEY_PUB_LEFT			0xbfff//KP_LOW_KEY//0xFFF7 L 
#define		KEY_PUB_RIGHT			0xffdf//KP_MID_KEY//0xFFFB L 
#define		KEY_PUB_UP				0xfffe//KP_LOW_KEY//0xFFFE L 
#define		KEY_PUB_DOWN			0xff7f//KP_LOW_KEY//0xFBFF L 
#define		KEY_PUB_OK				0xefff //KP_MID_KEY// 
#define		KEY_PUB_CALL			0x7fff//KP_MID_KEY// 
#define		KEY_PUB_POUND			0xfeff //KP_MID_KEY 
#define		KEY_PUB_0				0xff7f //KP_MID_KEY 
#define		KEY_PUB_1				0xfffd//KP_LOW_KEY 
#define		KEY_PUB_4				0xfeff//KP_LOW_KEY 
#define		KEY_PUB_5				0xfdff//KP_LOW_KEY 
#define		KEY_PUB_6				0xfbff//KP_LOW_KEY 
#define		KEY_PUB_7				0x7fff//KP_LOW_KEY 
#define		KEY_PUB_8				0xfffe//KP_MID_KEY 
#define		KEY_PUB_STAR			0xffbf //KP_MID_KEY 
#define		KEY_PUB_9				0xfffd//KP_MID_KEY 
#define		KEY_PUB_2				0xfffb//KP_LOW_KEY 
#define		KEY_PUB_3				0xfff7//KP_LOW_KEY 
#define		KEY_PUB_ESC				0xffbf //KP_LOW_KEY 
#define		KEY_PUB_VOLUP				0xf7ff//KP_LOW_KEY 
#define		KEY_PUB_VOLDOWN			0xffef //KP_LOW_KEY 
 
#define		REGISTER_PUB_LSK		KEY_REGISTER_MID 
#define		REGISTER_PUB_RSK		KEY_REGISTER_MID 
#define		REGISTER_PUB_LEFT		KEY_REGISTER_LOW 
#define		REGISTER_PUB_RIGHT		KEY_REGISTER_MID 
#define		REGISTER_PUB_UP			KEY_REGISTER_LOW 
#define		REGISTER_PUB_DOWN		KEY_REGISTER_LOW 
#define		REGISTER_PUB_OK			KEY_REGISTER_MID 
#define		REGISTER_PUB_CALL		KEY_REGISTER_MID 
#define		REGISTER_PUB_POUND		KEY_REGISTER_MID 
#define		REGISTER_PUB_0			KEY_REGISTER_MID 
#define		REGISTER_PUB_1			KEY_REGISTER_LOW 
#define		REGISTER_PUB_4			KEY_REGISTER_LOW 
#define		REGISTER_PUB_5			KEY_REGISTER_LOW 
#define		REGISTER_PUB_6			KEY_REGISTER_LOW 
#define		REGISTER_PUB_7			KEY_REGISTER_LOW 
#define		REGISTER_PUB_8			KEY_REGISTER_MID 
#define		REGISTER_PUB_STAR		KEY_REGISTER_MID 
#define		REGISTER_PUB_9			KEY_REGISTER_MID 
#define		REGISTER_PUB_2			KEY_REGISTER_LOW 
#define		REGISTER_PUB_3			KEY_REGISTER_LOW 
#define		REGISTER_PUB_ESC		KEY_REGISTER_LOW 
#define		REGISTER_PUB_VOLUP		KEY_REGISTER_LOW 
#define		REGISTER_PUB_VOLDOWN		KEY_REGISTER_LOW 
 
 
SFUint32 SFSystem_GetKeyState(void) 
{ 
	SFUint32 keyValue = 0; 
			 
	if(g_bRotate90 
	    #if defined(__IMT_LCD_ROTATE_MMI__) 
	    && !gMMILcdRotateState 
	    #endif 
	    ) 
	{ 
		if(!(DRV_Reg32(REGISTER_PUB_1)&(~KEY_PUB_1))) 
		{ 
			keyValue |= SFKS_UP; 
			keyValue |= SFKS_RIGHT; 
		} 
		if(!(DRV_Reg32(REGISTER_PUB_2)&(~KEY_PUB_2))) 
		{ 
			keyValue |= SFKS_RIGHT; 
		} 
		if(!(DRV_Reg32(REGISTER_PUB_3)&(~KEY_PUB_3))) 
		{ 
			keyValue |= SFKS_DOWN; 
			keyValue |= SFKS_RIGHT; 
		} 
		if(!(DRV_Reg32(REGISTER_PUB_4)&(~KEY_PUB_4))) 
		{ 
			keyValue |= SFKS_UP; 
		} 
		if(!(DRV_Reg32(REGISTER_PUB_6)&(~KEY_PUB_6))) 
		{ 
			keyValue |= SFKS_DOWN; 
		} 
		if(!(DRV_Reg32(REGISTER_PUB_7)&(~KEY_PUB_7))) 
		{ 
			keyValue |= SFKS_UP; 
			keyValue |= SFKS_LEFT; 
		} 
		if(!(DRV_Reg32(REGISTER_PUB_8)&(~KEY_PUB_8))) 
		{ 
			keyValue |= SFKS_LEFT; 
		} 
		if(!(DRV_Reg32(REGISTER_PUB_9)&(~KEY_PUB_9))) 
		{ 
			keyValue |= SFKS_DOWN; 
			keyValue |= SFKS_LEFT; 
		}	 
	} 
	else 
	{ 
		if(!(DRV_Reg32(REGISTER_PUB_1)&(~KEY_PUB_1))) 
		{ 
			keyValue |= SFKS_UP; 
			keyValue |= SFKS_LEFT; 
		} 
		if(!(DRV_Reg32(REGISTER_PUB_2)&(~KEY_PUB_2))) 
		{ 
			keyValue |= SFKS_UP; 
		} 
		if(!(DRV_Reg32(REGISTER_PUB_3)&(~KEY_PUB_3))) 
		{ 
			keyValue |= SFKS_UP; 
			keyValue |= SFKS_RIGHT; 
		} 
		if(!(DRV_Reg32(REGISTER_PUB_4)&(~KEY_PUB_4))) 
		{ 
			keyValue |= SFKS_LEFT; 
		} 
		if(!(DRV_Reg32(REGISTER_PUB_6)&(~KEY_PUB_6))) 
		{ 
			keyValue |= SFKS_RIGHT; 
		} 
		if(!(DRV_Reg32(REGISTER_PUB_7)&(~KEY_PUB_7))) 
		{ 
			keyValue |= SFKS_DOWN; 
			keyValue |= SFKS_LEFT; 
		} 
		if(!(DRV_Reg32(REGISTER_PUB_8)&(~KEY_PUB_8))) 
		{ 
			keyValue |= SFKS_DOWN; 
		} 
		if(!(DRV_Reg32(REGISTER_PUB_9)&(~KEY_PUB_9))) 
		{ 
			keyValue |= SFKS_DOWN; 
			keyValue |= SFKS_RIGHT; 
		} 
		 
		if(!(DRV_Reg32(REGISTER_PUB_5)&(~KEY_PUB_5))) 
		{ 
			keyValue |= SFKS_NUM7; 
		} 
		if(!(DRV_Reg32(REGISTER_PUB_POUND)&(~KEY_PUB_POUND))) 
		{ 
			keyValue |= SFKS_NUM8; 
		}		 
	} 
 
	if(!(DRV_Reg32(REGISTER_PUB_5)&(~KEY_PUB_5))) 
	keyValue |= SFKS_NUM7; 
	if(!(DRV_Reg32(REGISTER_PUB_POUND)&(~KEY_PUB_POUND))) 
	keyValue |= SFKS_NUM8; 
	if(!(DRV_Reg32(REGISTER_PUB_0)&(~KEY_PUB_0))) 
	keyValue |= SFKS_NUM1;	 
	if(!(DRV_Reg32(REGISTER_PUB_STAR)&(~KEY_PUB_STAR))) 
	keyValue |= SFKS_NUM2;			 
	if(!(DRV_Reg32(REGISTER_PUB_VOLDOWN)&(~KEY_PUB_VOLDOWN))) 
	keyValue |= SFKS_NUM1;	 
	if(!(DRV_Reg32(REGISTER_PUB_VOLUP)&(~KEY_PUB_VOLUP))) 
	keyValue |= SFKS_NUM2;	 
		 
	if(!(DRV_Reg32(REGISTER_PUB_LEFT)&(~KEY_PUB_LEFT))) 
	keyValue |= SFKS_NUM0; 
	if(!(DRV_Reg32(REGISTER_PUB_RIGHT)&(~KEY_PUB_RIGHT))) 
	keyValue |= SFKS_NUM9;		 
 
	return keyValue; 
	 
} 
 
void SFPCMDevice_GetCurrentPosition(SFPCMDevice* self,SFUint32*pPlayCursor,SFUint32* pWriteCursor) 
{ 
	PARAM_UNUSED(self); 
	if(pPlayCursor) 
	{ 
		*pPlayCursor=(uint32)(pu8_g_sound_out_ptr-pu8_g_sound_bufstart); 
	} 
	 
	if(pWriteCursor) 
	{ 
		*pWriteCursor=(uint32)(pu8_g_sound_in_ptr-pu8_g_sound_bufstart); 
	}	 
} 
 
void SFPCMDevice_LockBuffer(SFPCMDevice* self,SFUint32 offset,SFUint32 size,SFAny** pBuf0,SFUint32* pBufSize0,SFAny** pBuf1,SFUint32* pBufSize1) 
{ 
	if(offset==0xFFFFFFFF) 
	{ 
		SFPCMDevice_GetCurrentPosition(self,SFNull,&offset); 
	} 
	 
	if(offset+size>SF_SOUND_BUFFER_SIZE) 
	{ 
		*pBuf0=pu8_g_sound_bufstart+offset; 
		*pBufSize0=SF_SOUND_BUFFER_SIZE-offset; 
 
		*pBuf1=pu8_g_sound_bufstart; 
		*pBufSize1=offset+size-SF_SOUND_BUFFER_SIZE; 
	} 
	else 
	{ 
		*pBuf0=pu8_g_sound_bufstart+offset; 
		*pBufSize0=size; 
 
		*pBuf1=SFNull; 
		*pBufSize1=0; 
	} 
} 
 
void SFPCMDevice_UnlockBuffer(SFPCMDevice* self,SFAny* aBuf0,SFUint32 
aBufSize0,SFAny* aBuf1,SFUint32 aBufSize1) 
{ 
	//提交音频数据 
	if(aBuf1 && aBufSize1) 
	{ 
		pu8_g_sound_in_ptr=(SFUint8*)aBuf1+aBufSize1; 
	} 
	else 
	{ 
		pu8_g_sound_in_ptr=(SFUint8*)aBuf0+aBufSize0; 
	} 
 
//提交_pSndCommitBegin到_pSndCommitEnd的数据,提交完毕让_pSndCommitBegin= _pSndCommitEnd 
 
} 
// 
//const U8	*u8_g_game_dir=(U8 *)L"D:\\game\\"; 
// 
//S32 mmi_gamesimu_create_file_dir(S8 *filepath) 
//{ 
//     
//    S8 buf_createpath[128]; 
//    S8 buf_filepath[FMGR_PATH_BUFFER_SIZE]; 
//    S32 fs_ret; 
//    S32 str_len; 
//    S32 cmp_ret; 
//    S32 i; 
//    FS_HANDLE file_handle; 
// 
//    
//    fs_ret = 0; 
// 
//    file_handle = FS_Open((kal_uint16*) filepath, FS_OPEN_DIR | FS_READ_ONLY); 
// 
//    /* path already exist */ 
//    if (file_handle >= 0) 
//    { 
//        FS_Close(file_handle); 
//        return 0;   /* already exist, 0 means successful in file system */ 
//    } 
// 
//    /* create directory if it is not there */ 
//    pfnUnicodeStrcpy((PS8) buf_filepath, (PS8) filepath); 
// 
//    str_len = pfnUnicodeStrlen((PS8) buf_filepath); 
//    str_len *= ENCODING_LENGTH; 
// 
//    /* skip drive. "C:\" */ 
//    for (i = 3 * ENCODING_LENGTH; i < str_len; i += 2) 
//    { 
//        cmp_ret = pfnUnicodeStrncmp((PS8) & buf_filepath[i], (PS8) L"\\", 1); 
//        if (cmp_ret == 0) 
//        { 
//            /* create dir */ 
// 
//            pfnUnicodeStrncpy((PS8) buf_createpath, (PS8) buf_filepath, i / ENCODING_LENGTH); 
//            buf_createpath[i] = '\0'; 
//            buf_createpath[i + 1] = '\0'; 
// 
//            fs_ret = FS_CreateDir((PU16) buf_createpath); 
// 
//            if (fs_ret < 0) 
//            { 
//                return fs_ret; 
//            } 
//        } 
//    } 
// 
//    return fs_ret; 
//} 
/* 
void mmi_gamesimu_exit_from_fmgr(void *filename, int is_short) 
{ 
     
    //DeleteUptoScrID(SCREENID_GAMESIMU_LIST); 
    DeleteNHistory(1); 
    GoBackHistory(); 
} 
*/ 
void EntryRomList(void) 
{ 
#if 0 
    /*----------------------------------------------------------------*/ 
    /* Local Variables                                                */ 
    /*----------------------------------------------------------------*/ 
    S8 buf_filepath[FMGR_PATH_BUFFER_SIZE]; 
    FS_HANDLE file_handle; 
    FMGR_FILTER filter; 
    S32 create_result; 
 
    /*----------------------------------------------------------------*/ 
    /* Code Body                                                      */ 
    /*----------------------------------------------------------------*/ 
   memset(buf_filepath,0x00,FMGR_PATH_BUFFER_SIZE); 
   pfnUnicodeStrcpy((S8 *)buf_filepath,(const S8 *)u8_g_game_dir); 
 
    #ifndef NAND_SUPPORT 
    if(fmgr_is_msdc_present() == FALSE) 
    { 
          DisplayPopup((PU8)GetString(STR_GLOBAL_NOTIFY_NO_MEMORY_CARD), IMG_GLOBAL_EMPTY,0, 1000, EMPTY_LIST_TONE); 
          return; 
    } 
    #endif 
 
    EntryNewScreen(SCREENID_GAMESIMU_LIST, NULL, EntryRomList, NULL); 
 
    create_result = mmi_gamesimu_create_file_dir(buf_filepath); 
 
    /* check if it is valid path */ 
    file_handle = FS_Open((PU16) buf_filepath, FS_OPEN_DIR | FS_READ_ONLY); 
 
    if (file_handle >= 0) 
    { 
        FS_Close(file_handle); 
 
        FMGR_FILTER_INIT(&filter); 
	 
	FMGR_FILTER_SET(&filter,FMGR_TYPE_NES); 
 
        mmi_fmgr_select_path_and_enter( 
            APP_GAME_SIMU, 
            FMGR_SELECT_BROWSE, 
            filter, 
            buf_filepath, 
            (PsExtFuncPtr) mmi_gamesimu_exit_from_fmgr); 
 
        /* check if device is busy or not */ 
        if (FS_GetDevStatus(buf_filepath[0], FS_FEATURE_STATE_ENUM) == FS_DEVICE_BUSY) 
        { 
            /*  mmi_fmgr_select_path_and_enter will also add screen to histry */ 
            DeleteUptoScrID(SCREENID_GAMESIMU_LIST); 
 
            /* Delete up to previous screen */ 
            DeleteNHistory(1); 
        } 
    } 
    else 
    { 
        { 
            /* storage is card */ 
 
            /* photo's path is not exist, and card is write protected, cant create photo folder */ 
            if (create_result == FS_WRITE_PROTECTION) 
            { 
                DisplayPopup( 
                    (PU8) GetString(FMGR_FS_WRITE_PROTECTION_TEXT), 
                    IMG_GLOBAL_WARNING, 
                    1, 
                    ST_NOTIFYDURATION, 
                    WARNING_TONE); 
            } 
            else if (create_result == FS_DISK_FULL) 
            { 
                DisplayPopup( 
                    (PU8) GetString(FMGR_FS_DISK_FULL_TEXT), 
                    IMG_GLOBAL_WARNING, 
                    1, 
                    ST_NOTIFYDURATION, 
                    WARNING_TONE); 
            } 
            else if (create_result == FS_ROOT_DIR_FULL) 
            { 
                DisplayPopup( 
                    (PU8) GetString(FMGR_FS_ROOT_DIR_FULL_TEXT), 
                    IMG_GLOBAL_WARNING, 
                    1, 
                    ST_NOTIFYDURATION, 
                    WARNING_TONE); 
            } 
            else 
            { 
                DisplayPopup( 
                    (PU8) GetString(STR_GLOBAL_NOTIFY_NO_MEMORY_CARD), 
                    IMG_GLOBAL_WARNING, 
                    1, 
                    ST_NOTIFYDURATION, 
                    WARNING_TONE); 
            } 
 
            DeleteUptoScrID(SCREENID_GAMESIMU); 
            return; 
 
        } 
    } 
#endif 
} 
 
/*Added by bob, to dynamic get memory for MP4, @20070720, begin*/ 
void* sf_system_malloc(unsigned int size) 
{ 
	//return SnowFishMemPool;//med_alloc_ext_mem(size); 
	return med_alloc_ext_mem(size); 
} 
 
void* sf_system_malloc_fast(unsigned int size) 
{ 
	void* ptr; 
 
	ptr = med_alloc_int_mem(size); 
	return ptr; 
} 
 
void sf_system_free(void*ptr) 
{ 
	med_free_ext_mem(&ptr); 
} 
 
void sf_system_free_fast(void* ptr) 
{ 
	//todo 
	med_free_int_mem(&ptr); 
} 
 
 
 
#if defined(__SF_MP4_SUPPORT__) 
 
#include "med_global.h"  
#include "med_utility.h"  
#include "mdi_video.h"  
 
static void LCDDisplay_adrs (const lcd_frame_update_struct *lcd_param, void* adrs, U8 layer) 
{ 
	kal_uint16 w, h; 
	lcd_frame_update_struct lcd_data = {0}; 
 
	lcd_power_up(); 
 
	w = lcd_param->lcm_end_x - lcd_param->lcm_start_x + 1; 
	h = lcd_param->lcm_end_y - lcd_param->lcm_start_y + 1; 
 
	if (layer == 0) 
	{ 
		SET_LCD_LAYER0_WINDOW_SIZE(w,h); 
		SET_LCD_LAYER0_WINDOW_OFFSET(0,0); 
		SET_LCD_LAYER0_ROTATE(lcd_param->rotate_value); 
		lcd_data.update_layer=LCD_LAYER0_ENABLE; 
 
		REG_LCD_LAYER0_BUFF_ADDR = (kal_uint32) adrs; 
	} 
	else if (layer == 1) 
	{ 
		SET_LCD_LAYER1_WINDOW_SIZE(w,h); 
		SET_LCD_LAYER1_WINDOW_OFFSET(0,0); 
		SET_LCD_LAYER1_ROTATE(lcd_param->rotate_value); 
		lcd_data.update_layer=LCD_LAYER1_ENABLE; 
 
		REG_LCD_LAYER1_BUFF_ADDR = (kal_uint32) adrs; 
	} 
	else if (layer == 2) 
	{ 
		SET_LCD_LAYER2_WINDOW_SIZE(w,h); 
		SET_LCD_LAYER2_WINDOW_OFFSET(0,0); 
		SET_LCD_LAYER2_ROTATE(lcd_param->rotate_value); 
		lcd_data.update_layer=LCD_LAYER2_ENABLE; 
 
		REG_LCD_LAYER2_BUFF_ADDR = (kal_uint32) adrs; 
	} 
	else if (layer == 3) 
	{ 
		SET_LCD_LAYER3_WINDOW_SIZE(w,h); 
		SET_LCD_LAYER3_WINDOW_OFFSET(0,0); 
		SET_LCD_LAYER3_ROTATE(lcd_param->rotate_value); 
		lcd_data.update_layer=LCD_LAYER3_ENABLE; 
 
		REG_LCD_LAYER3_BUFF_ADDR = (kal_uint32) adrs; 
	} 
	else 
	{ 
		MMI_ASSERT(0); 
	} 
 
 
	if (lcd_param->rotate_value == MDI_VIDEO_LCD_ROTATE_0) 
	{ 
		lcd_data.roi_offset_x = 0; 
		lcd_data.roi_offset_y = 0; 
	} 
	else 
	{ 
		lcd_data.roi_offset_x = lcd_param->roi_offset_x; 
		lcd_data.roi_offset_y = lcd_param->roi_offset_y; 
	} 
 
	lcd_data.lcm_start_x = lcd_param->lcm_start_x; 
	lcd_data.lcm_start_y = lcd_param->lcm_start_y; 
	lcd_data.lcm_end_x = lcd_param->lcm_end_x; 
	lcd_data.lcm_end_y = lcd_param->lcm_end_y; 
	lcd_data.rotate_value = lcd_param->rotate_value; 
	lcd_data.update_layer = lcd_param->update_layer; 
	lcd_data.hw_update_layer = lcd_param->hw_update_layer; 
 
	lcd_data.module_id = LCD_UPDATE_MODULE_JPEG_VIDEO; 
	lcd_data.lcd_id = MAIN_LCD; 
	lcd_data.fb_update_mode = LCD_SW_TRIGGER_MODE; 
	lcd_data.memory_output  = KAL_FALSE; 
	lcd_data.block_mode_flag = KAL_TRUE; 
	lcd_data.lcd_block_mode_cb = NULL; 
 
	lcd_fb_update(&lcd_data); 
} 
 
extern void vdo_get_active_buffer(U8** ptr); 
 
void SF_vdo_screen_update(const lcd_frame_update_struct *lcd_param) 
{ 
	U8 *buf_ptr; 
	U8  layer_pos; 
 
	if ((lcd_param->hw_update_layer & LCD_LAYER0_ENABLE) != 0) 
		layer_pos = 0; 
	else if ((lcd_param->hw_update_layer & LCD_LAYER1_ENABLE) != 0) 
		layer_pos = 1; 
	else if ((lcd_param->hw_update_layer & LCD_LAYER2_ENABLE) != 0) 
		layer_pos = 2; 
	else if ((lcd_param->hw_update_layer & LCD_LAYER3_ENABLE) != 0) 
		layer_pos = 3; 
	else 
		MMI_ASSERT(0); 
 
	vdo_get_active_buffer(&buf_ptr); 
 
	if (lcd_param->rotate_value == MDI_VIDEO_LCD_ROTATE_270) 
	{ 
		//{{方案一 
		//START_LCD_TRANSFER; 
		//}}方案一 
		 
		//{{方案二 
		gdi_layer_blt_previous(lcd_param->lcm_start_y, lcd_param->lcm_start_x, lcd_param->lcm_end_y, lcd_param->lcm_end_x); 
		//}}方案二 
	} 
	else 
	{ 
		LCDDisplay_adrs(lcd_param, buf_ptr, layer_pos); 
	} 
} 
 
SFBool SFSystem_IsTouchSupported(void) 
{ 
	return SFTrue; 
} 
#endif