Example #1
0
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;
}
Example #2
0
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;
}