Skip to content

Commit dea5093

Browse files
committed
Libretro: Reimplement a functioning content restart
Not tested on windows, but should work. Also, we don't need to repopulate all the path and arg structures when restarting, so only do what's necessary to re-load FreeJ2ME and the app jar it should run.
1 parent 3930914 commit dea5093

File tree

1 file changed

+58
-23
lines changed

1 file changed

+58
-23
lines changed

Diff for: src/libretro/freej2me_libretro.c

+58-23
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ int mouseLpre = 0; /* old mouse button state */
119119
bool uses_mouse = true;
120120
bool uses_pointer = false;
121121
bool booted = false;
122+
bool restarting = false;
122123

123124
unsigned int readSize = 16384;
124125
unsigned char readBuffer[16384];
@@ -138,6 +139,9 @@ int framesDropped = 0;
138139
/* Libretro exposed config variables START */
139140

140141
char *options_update; /* String containing the options updated in check_variables() */
142+
char *systemPath; /* Path of FreeJ2ME's jar */
143+
char *outPath; /* Actual path of FreeJ2ME's jar to start */
144+
char** params; /* Char matrix containing launch arguments */
141145
unsigned int optstrlen; /* length of the string above */
142146
unsigned long int screenRes[2]; /* {width, height} */
143147
int rotateScreen; /* acts as a boolean */
@@ -443,6 +447,8 @@ static void check_variables(bool first_time_startup)
443447

444448

445449
/* Prepare a string to pass those core options to the Java app */
450+
options_update = malloc(sizeof(char) * PIPE_MAX_LEN);
451+
446452
snprintf(options_update, PIPE_MAX_LEN, "FJ2ME_LR_OPTS:|%lux%lu|%d|%d|%d|%d|%d|%d|%d", screenRes[0], screenRes[1], rotateScreen, phoneType, gameFPS, soundEnabled, customMidi, maxMidiPlayers, dumpAudioStreams);
447453
optstrlen = strlen(options_update);
448454

@@ -456,6 +462,8 @@ static void check_variables(bool first_time_startup)
456462
write_to_pipe(pWrite[1], options_update, optstrlen);
457463
log_fn(RETRO_LOG_INFO, "Sent updated options to the Java app.\n");
458464
}
465+
466+
free(options_update);
459467
}
460468

461469
/* Core exit function */
@@ -466,7 +474,6 @@ void quit(int state)
466474
{
467475
kill(javaProcess, SIGKILL);
468476
}
469-
/* exit(state); */
470477
}
471478

472479
#elif _WIN32
@@ -491,8 +498,6 @@ void retro_init(void)
491498
/* init buffers, structs */
492499
memset(frame, 0, frameSize);
493500
memset(frameBuffer, 0, frameBufferSize);
494-
options_update = malloc(sizeof(char) * PIPE_MAX_LEN);
495-
496501
/*
497502
* Those below are arguments sent to Java during init. Otherwise, games
498503
* wouldn't get a res setting, rotation, fps, etc. that matched the
@@ -515,14 +520,35 @@ void retro_init(void)
515520
sprintf(dumpAudioArg, "%d", dumpAudioStreams);
516521

517522
/* start java process */
518-
char *javapath;
519-
Environ(RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY, &javapath);
520-
char *outPath = malloc(sizeof(char) * PATH_MAX_LENGTH);
521-
fill_pathname_join(outPath, javapath, "freej2me-lr.jar", PATH_MAX_LENGTH);
522-
char *params[] = { "java", "-jar", outPath, resArg[0], resArg[1], rotateArg, phoneArg, fpsArg, soundArg, midiArg, maxMidiArg, dumpAudioArg, NULL };
523523

524-
log_fn(RETRO_LOG_INFO, "Passing params: %s | %s | %s | %s | %s | %s | %s | %s | %s\n", *(params+3),
524+
525+
if(!restarting)
526+
{
527+
log_fn(RETRO_LOG_INFO, "Setting up FreeJ2ME-Plus' Java app.\n");
528+
Environ(RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY, &systemPath);
529+
outPath = malloc(sizeof(char) * PATH_MAX_LENGTH);
530+
fill_pathname_join(outPath, systemPath, "freej2me-lr.jar", PATH_MAX_LENGTH);
531+
532+
log_fn(RETRO_LOG_INFO, "Setting up params. \n");
533+
params = (char**)malloc(sizeof(char*) * PATH_MAX_LENGTH * 2);
534+
params[0] = strdup("java");
535+
params[1] = strdup("-jar");
536+
params[2] = strdup(outPath);
537+
params[3] = strdup(resArg[0]);
538+
params[4] = strdup(resArg[1]);
539+
params[5] = strdup(rotateArg);
540+
params[6] = strdup(phoneArg);
541+
params[7] = strdup(fpsArg);
542+
params[8] = strdup(soundArg);
543+
params[9] = strdup(midiArg);
544+
params[10] = strdup(maxMidiArg);
545+
params[11] = strdup(dumpAudioArg);
546+
params[12] = NULL; // Null-terminate the array
547+
548+
log_fn(RETRO_LOG_INFO, "Passing params: %s | %s | %s | %s | %s | %s | %s | %s | %s\n", *(params+3),
525549
*(params+4), *(params+5), *(params+6), *(params+7), *(params+8), *(params+9), *(params+10), *(params+11));
550+
}
551+
526552
log_fn(RETRO_LOG_INFO, "Preparing to open FreeJ2ME-Plus' Java app (make sure freej2me-lr.jar is inside system/).\n");
527553

528554
#ifdef __linux__
@@ -983,6 +1009,8 @@ void retro_deinit(void)
9831009

9841010
void retro_reset(void)
9851011
{
1012+
restarting = true;
1013+
booted = false;
9861014
retro_deinit();
9871015
retro_init();
9881016
retro_load_game(&gameinfo);
@@ -1007,15 +1035,17 @@ pid_t javaOpen(char *cmd, char **params)
10071035
{
10081036
pid_t pid;
10091037

1010-
char *systemPath;
1011-
Environ(RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY, &systemPath);
1012-
log_fn(RETRO_LOG_INFO, "System Path: %s\n", systemPath);
1038+
if(!restarting)
1039+
{
1040+
log_fn(RETRO_LOG_INFO, "System Path: %s\n", systemPath);
10131041

1014-
log_fn(RETRO_LOG_INFO, "Setting up java app's process and pipes...\n");
1042+
log_fn(RETRO_LOG_INFO, "Setting up java app's process and pipes...\n");
10151043

1016-
log_fn(RETRO_LOG_INFO, "Opening: %s %s %s ...\n", *(params+0), *(params+1), *(params+2));
1017-
log_fn(RETRO_LOG_INFO, "Params: %s | %s | %s | %s | %s | %s | %s | %s | %s\n", *(params+3),
1018-
*(params+4), *(params+5), *(params+6), *(params+7), *(params+8), *(params+9), *(params+10), *(params+11));
1044+
log_fn(RETRO_LOG_INFO, "Opening: %s %s %s ...\n", *(params+0), *(params+1), *(params+2));
1045+
log_fn(RETRO_LOG_INFO, "Params: %s | %s | %s | %s | %s | %s | %s | %s | %s\n", *(params+3),
1046+
*(params+4), *(params+5), *(params+6), *(params+7), *(params+8), *(params+9), *(params+10), *(params+11));
1047+
}
1048+
else { log_fn(RETRO_LOG_INFO, "\n\nRESTARTING!!!\n\n"); restarting = false; }
10191049

10201050
int fd_stdin = 0;
10211051
int fd_stdout = 1;
@@ -1079,9 +1109,6 @@ void javaOpen(char *cmd, char **params)
10791109
{
10801110
SECURITY_ATTRIBUTES pipeSec;
10811111

1082-
char *systemPath;
1083-
Environ(RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY, &systemPath);
1084-
log_fn(RETRO_LOG_INFO, "System Path: %s\n", systemPath);
10851112
log_fn(RETRO_LOG_INFO, "Setting up java app's process and pipes...\n");
10861113

10871114
ZeroMemory( &pipeSec, sizeof(pipeSec) );
@@ -1146,13 +1173,21 @@ void javaOpen(char *cmd, char **params)
11461173
log_fn(RETRO_LOG_INFO, "Opening: %s \n", cmd);
11471174
for (int i = 3; i <= 11; i++) /* There are 10 cmd arguments for now */
11481175
{
1149-
log_fn(RETRO_LOG_INFO, "Processing arg %d: %s \n", i, *(params+i));
1176+
//log_fn(RETRO_LOG_INFO, "Processing arg %d: %s \n", i, *(params+i));
11501177
sprintf(cmdWin, "%s %s", cmdWin, *(params+i));
11511178
}
11521179

1153-
log_fn(RETRO_LOG_INFO, "Creating proc: %s \n", cmdWin);
1154-
log_fn(RETRO_LOG_INFO, "Params: %s | %s | %s | %s | %s | %s | %s | %s | %s\n", *(params+3),
1155-
*(params+4), *(params+5), *(params+6), *(params+7), *(params+8), *(params+9), *(params+10), *(params+11));
1180+
if(!restarting)
1181+
{
1182+
log_fn(RETRO_LOG_INFO, "System Path: %s\n", systemPath);
1183+
1184+
log_fn(RETRO_LOG_INFO, "Setting up java app's process and pipes...\n");
1185+
1186+
log_fn(RETRO_LOG_INFO, "Opening: %s %s %s ...\n", *(params+0), *(params+1), *(params+2));
1187+
log_fn(RETRO_LOG_INFO, "Params: %s | %s | %s | %s | %s | %s | %s | %s | %s\n", *(params+3),
1188+
*(params+4), *(params+5), *(params+6), *(params+7), *(params+8), *(params+9), *(params+10), *(params+11));
1189+
}
1190+
else { log_fn(RETRO_LOG_INFO, "\n\nRESTARTING!!!\n\n"); restarting = false; }
11561191

11571192
GetStartupInfo(&startInfo);
11581193
startInfo.dwFlags = STARTF_USESTDHANDLES;

0 commit comments

Comments
 (0)