由小白到大大的涅盘,从vgsky.com开始!

psp开发如何响应待机事件

Update:2007/10/6,Click:0 本文如有下载 请从下面附件中下载

举手之劳 是您对我们最大的支持 感谢您!

昨天研究了libmad在cnreader中的应用,发现待机时会因为对应播放线程繁忙而卡死,问下如何响应待机事件。JQYE?];`K^\d4%5~e\:@t0UHW6|0@(Z+/kcc,Ov4本文来自:V电G玩S天K空Y
我看了一下官方的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
}
这是neocd 仿真器里类似的代码:
 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
}
原来在psppower里,一直没想到去看那个东西,呵呵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
以后打算是加入查看各种格式图片的功能,不过个人时间不多,希望能有足够的时间来搞定这些东西。

【分类导航】

【热门游戏资讯】

更多

【推荐游戏资讯】

更多

【最新资讯更新】

更多

【赞助商链接】