📄 sfapi.c
字号:
/* 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<length;i++){
gui_move_text_cursor(cursor_x,y);
buf[0]=((str[i]) & 0xff);
buf[1]=((str[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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -