我看了一下官方的sample是用audio的callback,但是如果要用这个方法实现BGM我觉得不太现实,一般游戏应该都是用一个单独的背景音乐线程来控制的吧。因此个人觉得应该有响应待机事件的callback,可惜查了sdk的文档没看到,只好来求助了。
| void cn_power_callback(int unknown, int powerInfo)JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y {JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y if( powerInfo & PSP_POWER_CB_POWER_SWITCH )JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y {JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y if(playerStart == g_playerStat)JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y {JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y playstop();JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y }JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y }JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y return ;JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y }JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y int cn_CallbackThread(SceSize args, void *argp)JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y {JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y int cbid;JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y cbid = sceKernelCreateCallback("cn Power Callback", (void *)cn_power_callback, NULL);JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y scePowerRegisterCallback(0, cbid);JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y sceKernelSleepThreadCB();JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y return 0;JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y } JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y int cn_setupCallbacks(void) {JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y int thid = 0;JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y thid = sceKernelCreateThread("update_thread", cn_CallbackThread, 0x11, 0xFA0, 0, 0);JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y if (thid >= 0) {JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y sceKernelStartThread(thid, 0, 0);JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y }JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y return thid;JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y } |
| void PowerCallback(int unknown, int pwrflags){JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y static int old_snd_thread,old_mp3_thread; JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y debug_log("Power Callback");JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y if(pwrflags & POWER_CB_POWER){ JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y bSleep=1;JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y old_mp3_thread=mp3_thread; JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y StopMP3Thread();JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y old_snd_thread=snd_thread;JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y StopSoundThread(); JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y scePowerSetClockFrequency(222,222,111);JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y }else if(pwrflags & POWER_CB_RESCOMP){ JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y bSleep=0;JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y set_cpu_clock();JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y if (old_mp3_thread!=-1) InitMP3Thread(); JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y if (old_snd_thread!=-1)InitSoundThread();JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y } JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y int cbid = sceKernelCreateCallback("Power Callback", (void*)PowerCallback,NULL);JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y scePowerRegisterCallback(0, cbid); JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y }JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y // Thread to create the callbacks and then begin pollingJQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y int CallbackThread(void *arg){JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y int cbid;JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y cbid = sceKernelCreateCallback( "Exit Callback", (void*)ExitCallback,NULL );JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y sceKernelRegisterExitCallback( cbid );JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y cbid = sceKernelCreateCallback( "Power Callback", (void*)PowerCallback,NULL );JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y scePowerRegisterCallback( 0, cbid );JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y sceKernelSleepThreadCB();JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y }JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y /* Sets up the callback thread and returns its thread id */JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y int SetupCallbacks()JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y {JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y int thid = 0;JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y thid = sceKernelCreateThread( "update_thread", CallbackThread, 0x11, 0xFA0, 0, 0 );JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y if( thid >= 0 ){JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y sceKernelStartThread(thid, 0, 0);JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y }JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y return thid;JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y } |
把cnreader的mp3播放部分加上了,也做了全面的修订,同样清除warning并优化了一些运算。目前在测试跑libmad的最低CPU clock,反正原来的25/50是跑不动的,测试感觉大概80/40~100/50是个最小极限,有待继续测试。JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y
以后打算是加入查看各种格式图片的功能,不过个人时间不多,希望能有足够的时间来搞定这些东西。


