mirror of
https://github.com/CTCaer/RetroArch.git
synced 2024-12-13 22:08:34 +00:00
(Android) Better lifecycle management - getting close to restoring state
This commit is contained in:
parent
2e58e25dbe
commit
46a4efd885
@ -24,6 +24,7 @@ struct saved_state
|
||||
{
|
||||
int32_t x;
|
||||
int32_t y;
|
||||
uint64_t input_state;
|
||||
};
|
||||
|
||||
struct droid
|
||||
|
@ -296,6 +296,8 @@ static void onNativeWindowCreated(ANativeActivity* activity, ANativeWindow* wind
|
||||
static void onNativeWindowDestroyed(ANativeActivity* activity, ANativeWindow* window)
|
||||
{
|
||||
RARCH_LOG("NativeWindowDestroyed: %p -- %p\n", activity, window);
|
||||
|
||||
|
||||
android_app_set_window((struct android_app*)activity->instance, NULL);
|
||||
}
|
||||
|
||||
@ -386,6 +388,13 @@ void engine_handle_cmd(struct android_app* android_app, int32_t cmd)
|
||||
/* The window is being shown, get it ready. */
|
||||
android_app->window = android_app->pendingWindow;
|
||||
|
||||
if (g_android.input_state & (1ULL << RARCH_REENTRANT))
|
||||
{
|
||||
gfx_ctx_init();
|
||||
g_extern.audio_active = true;
|
||||
g_extern.video_active = true;
|
||||
}
|
||||
|
||||
pthread_cond_broadcast(&android_app->cond);
|
||||
pthread_mutex_unlock(&android_app->mutex);
|
||||
|
||||
@ -422,6 +431,17 @@ void engine_handle_cmd(struct android_app* android_app, int32_t cmd)
|
||||
android_app->activityState = cmd;
|
||||
pthread_cond_broadcast(&android_app->cond);
|
||||
pthread_mutex_unlock(&android_app->mutex);
|
||||
|
||||
/* EXEC */
|
||||
if(g_android.input_state & (1ULL << RARCH_QUIT_KEY)) { }
|
||||
else
|
||||
{
|
||||
/* Setting reentrancy */
|
||||
RARCH_LOG("Setting up RetroArch re-entrancy...\n");
|
||||
g_android.input_state |= (1ULL << RARCH_REENTRANT);
|
||||
g_extern.audio_active = false;
|
||||
g_extern.video_active = false;
|
||||
}
|
||||
break;
|
||||
case APP_CMD_STOP:
|
||||
RARCH_LOG("engine_handle_cmd: APP_CMD_STOP.\n");
|
||||
@ -449,6 +469,8 @@ void engine_handle_cmd(struct android_app* android_app, int32_t cmd)
|
||||
/* EXEC */
|
||||
/* The window is being hidden or closed, clean it up. */
|
||||
/* terminate display/EGL context here */
|
||||
if(g_android.input_state & (1ULL << RARCH_REENTRANT))
|
||||
gfx_ctx_destroy();
|
||||
|
||||
/* POSTEXEC */
|
||||
android_app->window = NULL;
|
||||
@ -459,7 +481,6 @@ void engine_handle_cmd(struct android_app* android_app, int32_t cmd)
|
||||
RARCH_LOG("engine_handle_cmd: APP_CMD_GAINED_FOCUS.\n");
|
||||
|
||||
/* EXEC */
|
||||
// When our app gains focus, we start monitoring the accelerometer.
|
||||
break;
|
||||
case APP_CMD_LOST_FOCUS:
|
||||
RARCH_LOG("engine_handle_cmd: APP_CMD_LOST_FOCUS.\n");
|
||||
@ -510,10 +531,7 @@ static void android_get_char_argv(char *argv, size_t sizeof_argv, const char *ar
|
||||
*/
|
||||
void android_main(struct android_app* state)
|
||||
{
|
||||
rarch_main_clear_state();
|
||||
|
||||
RARCH_LOG("Native Activity started.\n");
|
||||
|
||||
memset(&g_android, 0, sizeof(g_android));
|
||||
g_android.app = state;
|
||||
|
||||
struct android_app* android_app = g_android.app;
|
||||
@ -541,14 +559,30 @@ void android_main(struct android_app* state)
|
||||
argv[argc++] = strdup(libretro_path);
|
||||
argv[argc++] = strdup("-v");
|
||||
|
||||
g_extern.verbose = true;
|
||||
|
||||
if (state->savedState != NULL)
|
||||
{
|
||||
// We are starting with a previous saved state; restore from it.
|
||||
RARCH_LOG("Restoring reentrant savestate.\n");
|
||||
g_android.state = *(struct saved_state*)state->savedState;
|
||||
g_android.input_state = g_android.state.input_state;
|
||||
}
|
||||
|
||||
bool rarch_reentrant = (g_android.input_state & (1ULL << RARCH_REENTRANT));
|
||||
|
||||
if(rarch_reentrant)
|
||||
{
|
||||
RARCH_LOG("Native Activity started (reentrant).\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
RARCH_LOG("Native Activity started.\n");
|
||||
rarch_main_clear_state();
|
||||
}
|
||||
|
||||
|
||||
g_extern.verbose = true;
|
||||
|
||||
while(!(g_android.input_state & (1ULL << RARCH_WINDOW_READY)))
|
||||
{
|
||||
// Read all pending events.
|
||||
@ -579,23 +613,32 @@ void android_main(struct android_app* state)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int init_ret;
|
||||
|
||||
RARCH_LOG("Initializing RetroArch...\n");
|
||||
if ((init_ret = rarch_main_init(argc, argv)) == 0)
|
||||
if (rarch_reentrant)
|
||||
{
|
||||
RARCH_LOG("Starting RetroArch...\n");
|
||||
rarch_init_msg_queue();
|
||||
while (rarch_main_iterate());
|
||||
init_ret = 0;
|
||||
|
||||
/* We've done everything state-wise needed for RARCH_REENTRANT,
|
||||
* get rid of it now */
|
||||
g_android.input_state |= ~(1ULL << RARCH_REENTRANT);
|
||||
}
|
||||
else
|
||||
else if ((init_ret = rarch_main_init(argc, argv)) != 0)
|
||||
{
|
||||
RARCH_LOG("Initialization failed.\n");
|
||||
g_android.input_state |= (1ULL << RARCH_QUIT_KEY);
|
||||
g_android.input_state |= (1ULL << RARCH_KILL);
|
||||
}
|
||||
|
||||
if (init_ret == 0)
|
||||
{
|
||||
RARCH_LOG("Initializing succeeded.\n");
|
||||
RARCH_LOG("RetroArch started.\n");
|
||||
rarch_init_msg_queue();
|
||||
while (rarch_main_iterate());
|
||||
RARCH_LOG("RetroArch stopped.\n");
|
||||
}
|
||||
|
||||
if(g_android.input_state & (1ULL << RARCH_QUIT_KEY))
|
||||
{
|
||||
RARCH_LOG("Deinitializing RetroArch...\n");
|
||||
|
3
driver.h
3
driver.h
@ -97,6 +97,9 @@ enum // RetroArch specific bind IDs.
|
||||
RARCH_KILL,
|
||||
RARCH_WINDOW_READY,
|
||||
#endif
|
||||
#if defined(ANDROID) || defined(RARCH_CONSOLE)
|
||||
RARCH_REENTRANT,
|
||||
#endif
|
||||
|
||||
RARCH_BIND_LIST_END,
|
||||
RARCH_BIND_LIST_END_NULL
|
||||
|
@ -254,10 +254,8 @@ static void recording_dump_frame(const void *data, unsigned width, unsigned heig
|
||||
|
||||
static void video_frame(const void *data, unsigned width, unsigned height, size_t pitch)
|
||||
{
|
||||
#if !defined(RARCH_PERFORMANCE_MODE)
|
||||
if (!g_extern.video_active)
|
||||
return;
|
||||
#endif
|
||||
|
||||
if (g_extern.system.pix_fmt == RETRO_PIXEL_FORMAT_0RGB1555 && data)
|
||||
{
|
||||
@ -2555,10 +2553,6 @@ void rarch_main_clear_state(void)
|
||||
free(g_extern.system.environment_split);
|
||||
memset(&g_extern, 0, sizeof(g_extern));
|
||||
|
||||
#ifdef ANDROID
|
||||
memset(&g_android, 0, sizeof(g_android));
|
||||
#endif
|
||||
|
||||
init_state();
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user