static jboolean Emulator_initialize(JNIEnv *env, jobject self, jstring jdir, jstring jlib) { static EngineCallbacks cbs; const char *dir = env->GetStringUTFChars(jdir, NULL); const char *lib = env->GetStringUTFChars(jlib, NULL); jboolean rv = JNI_FALSE; engine = loadEmuEngine(dir, lib); if (engine == NULL || !engine->initialize(&cbs)) { LOGE("Cannot load emulator engine"); goto bail; } audioPlayer = loadAudioPlayer(dir); LOGW_IF(audioPlayer == NULL, "Cannot initialize sound module"); ticksInitialize(); emuState = EMUSTATE_PAUSED; renderSurface = NULL; currentGame = NULL; resumeRequested = false; autoFrameSkip = true; maxFrameSkips = 2; soundEnabled = false; rv = JNI_TRUE; bail: env->ReleaseStringUTFChars(jdir, dir); env->ReleaseStringUTFChars(jlib, lib); return rv; }
static jboolean Emulator_initialize(JNIEnv *env, jobject self, jstring jdir, jint sdk) { media = createEmuMedia(); if (!media->init(env)) return JNI_FALSE; ticksInitialize(); emuState = EMUSTATE_PAUSED; surfaceReady = false; currentGame = NULL; resumeRequested = false; flipScreen = false; autoFrameSkip = true; maxFrameSkips = 2; refreshRate = 0; gameSpeed = 1.0f; soundEnabled = false; jFrameUpdateListener = NULL; jclass clazz = env->FindClass( "eu/codlab/game/gameba/Emulator$FrameUpdateListener"); midOnFrameUpdate = env->GetMethodID(clazz, "onFrameUpdate", "(I)I"); pthread_mutex_init(&emuStateMutex, NULL); pthread_cond_init(&emuStateCond, NULL); return JNI_TRUE; }
EXPORT m64p_error CALL PluginStartup(m64p_dynlib_handle CoreLibHandle, void *Context, void (*DebugCallback)(void *, int, const char *)) { ConfigGetSharedDataFilepath = (ptr_ConfigGetSharedDataFilepath) dlsym(CoreLibHandle, "ConfigGetSharedDataFilepath"); CoreVideo_GL_SwapBuffers = (ptr_VidExt_GL_SwapBuffers) dlsym(CoreLibHandle, "VidExt_GL_SwapBuffers"); CoreVideo_SetVideoMode = (ptr_VidExt_SetVideoMode) dlsym(CoreLibHandle, "VidExt_SetVideoMode"); CoreVideo_Quit = (ptr_VidExt_Quit) dlsym(CoreLibHandle, "VidExt_Quit"); CoreVideo_Init = (ptr_VidExt_Init) dlsym(CoreLibHandle, "VidExt_Init"); #ifdef __NEON_OPT if (android_getCpuFamily() == ANDROID_CPU_FAMILY_ARM && (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0) { MathInitNeon(); gSPInitNeon(); } #endif ticksInitialize(); //int max_frames = Android_JNI_GetMaxFrameSkip(); //int max_frames = 1; // TODO: get rid of this, it should be handled through the config file: // if( Android_JNI_GetAutoFrameSkip() ) // frameSkipper.setSkips( FrameSkipper::AUTO, max_frames ); // else //frameSkipper.setSkips( FrameSkipper::MANUAL, max_frames ); // return M64ERR_SUCCESS; }
EXPORT int CALL InitiateGFX (GFX_INFO Gfx_Info) { DMEM = Gfx_Info.DMEM; IMEM = Gfx_Info.IMEM; RDRAM = Gfx_Info.RDRAM; REG.MI_INTR = (u32*) Gfx_Info.MI_INTR_REG; REG.DPC_START = (u32*) Gfx_Info.DPC_START_REG; REG.DPC_END = (u32*) Gfx_Info.DPC_END_REG; REG.DPC_CURRENT = (u32*) Gfx_Info.DPC_CURRENT_REG; REG.DPC_STATUS = (u32*) Gfx_Info.DPC_STATUS_REG; REG.DPC_CLOCK = (u32*) Gfx_Info.DPC_CLOCK_REG; REG.DPC_BUFBUSY = (u32*) Gfx_Info.DPC_BUFBUSY_REG; REG.DPC_PIPEBUSY = (u32*) Gfx_Info.DPC_PIPEBUSY_REG; REG.DPC_TMEM = (u32*) Gfx_Info.DPC_TMEM_REG; REG.VI_STATUS = (u32*) Gfx_Info.VI_STATUS_REG; REG.VI_ORIGIN = (u32*) Gfx_Info.VI_ORIGIN_REG; REG.VI_WIDTH = (u32*) Gfx_Info.VI_WIDTH_REG; REG.VI_INTR = (u32*) Gfx_Info.VI_INTR_REG; REG.VI_V_CURRENT_LINE = (u32*) Gfx_Info.VI_V_CURRENT_LINE_REG; REG.VI_TIMING = (u32*) Gfx_Info.VI_TIMING_REG; REG.VI_V_SYNC = (u32*) Gfx_Info.VI_V_SYNC_REG; REG.VI_H_SYNC = (u32*) Gfx_Info.VI_H_SYNC_REG; REG.VI_LEAP = (u32*) Gfx_Info.VI_LEAP_REG; REG.VI_H_START = (u32*) Gfx_Info.VI_H_START_REG; REG.VI_V_START = (u32*) Gfx_Info.VI_V_START_REG; REG.VI_V_BURST = (u32*) Gfx_Info.VI_V_BURST_REG; REG.VI_X_SCALE = (u32*) Gfx_Info.VI_X_SCALE_REG; REG.VI_Y_SCALE = (u32*) Gfx_Info.VI_Y_SCALE_REG; CheckInterrupts = Gfx_Info.CheckInterrupts; Config_LoadConfig(); Config_LoadRomConfig(Gfx_Info.HEADER); ticksInitialize(); if( config.autoFrameSkip ) frameSkipper.setSkips( FrameSkipper::AUTO, config.maxFrameSkip ); else frameSkipper.setSkips( FrameSkipper::MANUAL, config.maxFrameSkip ); OGL_Start(); return 1; }