mirror of
https://github.com/lindbergh-loader/lindbergh-loader.git
synced 2026-10-14 01:49:12 +03:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
efe34307e3 | ||
|
|
11b657e961 | ||
|
|
5ea59a05fd | ||
|
|
8d1f2764f3 | ||
|
|
f677f1cd3f | ||
|
|
3cd8e7019f | ||
|
|
38643436f2 | ||
|
|
527bdc418f | ||
|
|
a3e3f51003 | ||
|
|
a96b1fcf30 |
@@ -6,12 +6,14 @@ on:
|
|||||||
paths-ignore:
|
paths-ignore:
|
||||||
- '**.md'
|
- '**.md'
|
||||||
- '.github/ISSUE_TEMPLATE/*'
|
- '.github/ISSUE_TEMPLATE/*'
|
||||||
|
- '.docs/changelog'
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
- master
|
- master
|
||||||
paths-ignore:
|
paths-ignore:
|
||||||
- '**.md'
|
- '**.md'
|
||||||
- '.github/ISSUE_TEMPLATE/*'
|
- '.github/ISSUE_TEMPLATE/*'
|
||||||
|
- '.docs/changelog'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
linux-build:
|
linux-build:
|
||||||
@@ -40,9 +42,6 @@ jobs:
|
|||||||
NEW_RUN_NUMBER=$(( ${{ github.run_number }} + 161 ))
|
NEW_RUN_NUMBER=$(( ${{ github.run_number }} + 161 ))
|
||||||
echo "NEW_RUN_NUMBER=$NEW_RUN_NUMBER" >> $GITHUB_ENV
|
echo "NEW_RUN_NUMBER=$NEW_RUN_NUMBER" >> $GITHUB_ENV
|
||||||
|
|
||||||
# - name: Display Updated Number
|
|
||||||
# run: echo "Updated Run Number: ${{ env.NEW_RUN_NUMBER }}"
|
|
||||||
|
|
||||||
- name: Create Preview Release
|
- name: Create Preview Release
|
||||||
if: github.ref == 'refs/heads/master'
|
if: github.ref == 'refs/heads/master'
|
||||||
uses: "marvinpinto/action-automatic-releases@latest"
|
uses: "marvinpinto/action-automatic-releases@latest"
|
||||||
|
|||||||
@@ -2,6 +2,15 @@
|
|||||||
|
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
|
## [2.0.6]
|
||||||
|
### Fixed
|
||||||
|
- Reverted (Fixed LGJ, VT3 and ID4/ID5 JVS passthrough).
|
||||||
|
- Outrun 2 High Scores.
|
||||||
|
|
||||||
|
## [2.0.5]
|
||||||
|
### Fixed
|
||||||
|
- Fixed LGJ, VT3 and ID4/ID5 JVS passthrough.
|
||||||
|
|
||||||
## [2.0.4]
|
## [2.0.4]
|
||||||
### Added
|
### Added
|
||||||
- Boost render res option for Rambo, LGJ, HOD4, HOD-EX, ID4/ID5, 2Spicy and Harley.
|
- Boost render res option for Rambo, LGJ, HOD4, HOD-EX, ID4/ID5, 2Spicy and Harley.
|
||||||
|
|||||||
@@ -90,6 +90,10 @@ sudo ln -s /lib/i386-linux-gnu/libglut.so /lib/i386-linux-gnu/libglut.so.3
|
|||||||
|
|
||||||
- You need to set `SKIP_OUTRUN_CABINET_CHECK` to 1 in `lindbergh.conf` to play in DX, SDX or Standard cabinet types.
|
- You need to set `SKIP_OUTRUN_CABINET_CHECK` to 1 in `lindbergh.conf` to play in DX, SDX or Standard cabinet types.
|
||||||
|
|
||||||
|
### Hummer (all versions)
|
||||||
|
|
||||||
|
The games will ask for libGLcore.so.1 and libnvidia-tls.so.1 you can copy for example libkswapapi.so as libGLcore.so.1 and libnvidia-tls.so.1 and the game will work fine.
|
||||||
|
|
||||||
## Configuration File : lindbergh.conf
|
## Configuration File : lindbergh.conf
|
||||||
|
|
||||||
All configurable options are set and explained in the [`lindbergh.conf`](lindbergh.conf) file itself, and should be reasonably easy to understand. This chapter further explains some of those setup options.
|
All configurable options are set and explained in the [`lindbergh.conf`](lindbergh.conf) file itself, and should be reasonably easy to understand. This chapter further explains some of those setup options.
|
||||||
|
|||||||
+24
-18
@@ -862,7 +862,7 @@ static ControllerStatus listControllers(Controllers *controllers)
|
|||||||
int controller = open(controllers->controller[i].path, O_RDONLY);
|
int controller = open(controllers->controller[i].path, O_RDONLY);
|
||||||
if (controller < 0)
|
if (controller < 0)
|
||||||
{
|
{
|
||||||
strcpy(controllers->controller[i].name, "Unknown");
|
strncpy(controllers->controller[i].name, "Unknown", SIZE);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -912,13 +912,18 @@ static ControllerStatus listControllers(Controllers *controllers)
|
|||||||
{
|
{
|
||||||
if (test_bit(code, bit[EV_KEY]))
|
if (test_bit(code, bit[EV_KEY]))
|
||||||
{
|
{
|
||||||
|
if(controllers->controller[i].inputCount >= MAX_INPUTS) { // the number of input is limited
|
||||||
|
fprintf(stderr, "warning, maximum number of inputs reached !\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
controllers->controller[i].enabled = 1;
|
controllers->controller[i].enabled = 1;
|
||||||
ControllerInput *controllerInput =
|
ControllerInput *controllerInput =
|
||||||
&controllers->controller[i].inputs[controllers->controller[i].inputCount++];
|
&controllers->controller[i].inputs[controllers->controller[i].inputCount++];
|
||||||
controllerInput->evType = EV_KEY;
|
controllerInput->evType = EV_KEY;
|
||||||
controllerInput->evCode = code;
|
controllerInput->evCode = code;
|
||||||
controllerInput->specialFunction = NO_SPECIAL_FUNCTION;
|
controllerInput->specialFunction = NO_SPECIAL_FUNCTION;
|
||||||
strcpy(controllerInput->inputName, controllers->controller[i].name);
|
strncpy(controllerInput->inputName, controllers->controller[i].name, SIZE);
|
||||||
strcat(controllerInput->inputName, "_");
|
strcat(controllerInput->inputName, "_");
|
||||||
strcat(controllerInput->inputName, codename(EV_KEY, code));
|
strcat(controllerInput->inputName, codename(EV_KEY, code));
|
||||||
normaliseName(controllerInput->inputName);
|
normaliseName(controllerInput->inputName);
|
||||||
@@ -926,7 +931,7 @@ static ControllerStatus listControllers(Controllers *controllers)
|
|||||||
{
|
{
|
||||||
// hum ok, truncated value
|
// hum ok, truncated value
|
||||||
}
|
}
|
||||||
strcpy(controllerInput->inputTechNegName, "-"); // unassignable value (not "" while some conf are empty)
|
strncpy(controllerInput->inputTechNegName, "-", SIZE); // unassignable value (not "" while some conf are empty)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -944,7 +949,7 @@ static ControllerStatus listControllers(Controllers *controllers)
|
|||||||
controllerInput->evType = EV_ABS;
|
controllerInput->evType = EV_ABS;
|
||||||
controllerInput->evCode = code;
|
controllerInput->evCode = code;
|
||||||
controllerInput->specialFunction = NO_SPECIAL_FUNCTION;
|
controllerInput->specialFunction = NO_SPECIAL_FUNCTION;
|
||||||
strcpy(controllerInput->inputName, controllers->controller[i].name);
|
strncpy(controllerInput->inputName, controllers->controller[i].name, SIZE);
|
||||||
strcat(controllerInput->inputName, "_");
|
strcat(controllerInput->inputName, "_");
|
||||||
strcat(controllerInput->inputName, codename(EV_ABS, code));
|
strcat(controllerInput->inputName, codename(EV_ABS, code));
|
||||||
normaliseName(controllerInput->inputName);
|
normaliseName(controllerInput->inputName);
|
||||||
@@ -962,7 +967,7 @@ static ControllerStatus listControllers(Controllers *controllers)
|
|||||||
minControllerInput->evType = EV_ABS;
|
minControllerInput->evType = EV_ABS;
|
||||||
minControllerInput->evCode = code;
|
minControllerInput->evCode = code;
|
||||||
minControllerInput->specialFunction = ANALOGUE_TO_DIGITAL_MIN;
|
minControllerInput->specialFunction = ANALOGUE_TO_DIGITAL_MIN;
|
||||||
strcpy(minControllerInput->inputName, controllerInput->inputName);
|
strncpy(minControllerInput->inputName, controllerInput->inputName, SIZE);
|
||||||
strcat(minControllerInput->inputName, "_MIN");
|
strcat(minControllerInput->inputName, "_MIN");
|
||||||
if (snprintf(minControllerInput->inputTechName, SIZE, "%s:ABS:%i:MIN", controllers->controller[i].path, code) >= 1024)
|
if (snprintf(minControllerInput->inputTechName, SIZE, "%s:ABS:%i:MIN", controllers->controller[i].path, code) >= 1024)
|
||||||
{
|
{
|
||||||
@@ -979,7 +984,7 @@ static ControllerStatus listControllers(Controllers *controllers)
|
|||||||
maxControllerInput->evType = EV_ABS;
|
maxControllerInput->evType = EV_ABS;
|
||||||
maxControllerInput->evCode = code;
|
maxControllerInput->evCode = code;
|
||||||
maxControllerInput->specialFunction = ANALOGUE_TO_DIGITAL_MAX;
|
maxControllerInput->specialFunction = ANALOGUE_TO_DIGITAL_MAX;
|
||||||
strcpy(maxControllerInput->inputName, controllerInput->inputName);
|
strncpy(maxControllerInput->inputName, controllerInput->inputName, SIZE);
|
||||||
strcat(maxControllerInput->inputName, "_MAX");
|
strcat(maxControllerInput->inputName, "_MAX");
|
||||||
if (snprintf(maxControllerInput->inputTechName, SIZE, "%s:ABS:%i:MAX", controllers->controller[i].path, code) >= 1024)
|
if (snprintf(maxControllerInput->inputTechName, SIZE, "%s:ABS:%i:MAX", controllers->controller[i].path, code) >= 1024)
|
||||||
{
|
{
|
||||||
@@ -995,7 +1000,7 @@ static ControllerStatus listControllers(Controllers *controllers)
|
|||||||
shakeControllerInput->evType = EV_ABS;
|
shakeControllerInput->evType = EV_ABS;
|
||||||
shakeControllerInput->evCode = code;
|
shakeControllerInput->evCode = code;
|
||||||
shakeControllerInput->specialFunction = ANALOGUE_SHAKE;
|
shakeControllerInput->specialFunction = ANALOGUE_SHAKE;
|
||||||
strcpy(shakeControllerInput->inputName, controllerInput->inputName);
|
strncpy(shakeControllerInput->inputName, controllerInput->inputName, SIZE);
|
||||||
strcat(shakeControllerInput->inputName, "_SHAKE");
|
strcat(shakeControllerInput->inputName, "_SHAKE");
|
||||||
if (snprintf(shakeControllerInput->inputTechName, SIZE, "%s:ABS:%i:SHAKE", controllers->controller[i].path, code) >=
|
if (snprintf(shakeControllerInput->inputTechName, SIZE, "%s:ABS:%i:SHAKE", controllers->controller[i].path, code) >=
|
||||||
1024)
|
1024)
|
||||||
@@ -1007,6 +1012,7 @@ static ControllerStatus listControllers(Controllers *controllers)
|
|||||||
ioctl(controller, EVIOCGABS(code), &absoluteFeatures);
|
ioctl(controller, EVIOCGABS(code), &absoluteFeatures);
|
||||||
controllers->controller[i].absMin[code] = absoluteFeatures.minimum;
|
controllers->controller[i].absMin[code] = absoluteFeatures.minimum;
|
||||||
controllers->controller[i].absMax[code] = absoluteFeatures.maximum;
|
controllers->controller[i].absMax[code] = absoluteFeatures.maximum;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1294,7 +1300,7 @@ ControllerStatus getArcadeInputByName(char *name, ArcadeInput *input)
|
|||||||
{
|
{
|
||||||
if (strcmp(tempName, name) == 0)
|
if (strcmp(tempName, name) == 0)
|
||||||
{
|
{
|
||||||
strcpy(input->name, arcadeInputs[index].name);
|
strncpy(input->name, arcadeInputs[index].name, SIZE);
|
||||||
input->channel = arcadeInputs[index].channel;
|
input->channel = arcadeInputs[index].channel;
|
||||||
input->player = arcadeInputs[index].player;
|
input->player = arcadeInputs[index].player;
|
||||||
return CONTROLLER_STATUS_SUCCESS;
|
return CONTROLLER_STATUS_SUCCESS;
|
||||||
@@ -1371,8 +1377,8 @@ ControllerStatus startControllerThreads(Controllers *controllers)
|
|||||||
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].enabled = 1;
|
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].enabled = 1;
|
||||||
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].channel =
|
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].channel =
|
||||||
input.channel;
|
input.channel;
|
||||||
strcpy(controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].name,
|
strncpy(controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].name,
|
||||||
input.name);
|
input.name, SIZE);
|
||||||
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].player =
|
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].player =
|
||||||
input.player;
|
input.player;
|
||||||
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].isNeg = negabs;
|
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].isNeg = negabs;
|
||||||
@@ -1386,8 +1392,8 @@ ControllerStatus startControllerThreads(Controllers *controllers)
|
|||||||
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].maxEnabled = 1;
|
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].maxEnabled = 1;
|
||||||
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].maxChannel =
|
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].maxChannel =
|
||||||
input.channel;
|
input.channel;
|
||||||
strcpy(controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].maxName,
|
strncpy(controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].maxName,
|
||||||
input.name);
|
input.name, SIZE);
|
||||||
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].maxPlayer =
|
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].maxPlayer =
|
||||||
input.player;
|
input.player;
|
||||||
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].isNeg = negabs;
|
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].isNeg = negabs;
|
||||||
@@ -1401,8 +1407,8 @@ ControllerStatus startControllerThreads(Controllers *controllers)
|
|||||||
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].minEnabled = 1;
|
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].minEnabled = 1;
|
||||||
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].minChannel =
|
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].minChannel =
|
||||||
input.channel;
|
input.channel;
|
||||||
strcpy(controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].minName,
|
strncpy(controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].minName,
|
||||||
input.name);
|
input.name, SIZE);
|
||||||
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].minPlayer =
|
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].minPlayer =
|
||||||
input.player;
|
input.player;
|
||||||
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].isNeg = negabs;
|
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].isNeg = negabs;
|
||||||
@@ -1416,8 +1422,8 @@ ControllerStatus startControllerThreads(Controllers *controllers)
|
|||||||
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].shakeEnabled = 1;
|
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].shakeEnabled = 1;
|
||||||
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].shakeChannel =
|
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].shakeChannel =
|
||||||
input.channel;
|
input.channel;
|
||||||
strcpy(controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].shakeName,
|
strncpy(controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].shakeName,
|
||||||
input.name);
|
input.name, SIZE);
|
||||||
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].shakePlayer =
|
controllers->controller[i].absTriggers[controllers->controller[i].inputs[j].evCode].shakePlayer =
|
||||||
input.player;
|
input.player;
|
||||||
}
|
}
|
||||||
@@ -1434,8 +1440,8 @@ ControllerStatus startControllerThreads(Controllers *controllers)
|
|||||||
controllers->controller[i].keyTriggers[controllers->controller[i].inputs[j].evCode].enabled = 1;
|
controllers->controller[i].keyTriggers[controllers->controller[i].inputs[j].evCode].enabled = 1;
|
||||||
controllers->controller[i].keyTriggers[controllers->controller[i].inputs[j].evCode].channel =
|
controllers->controller[i].keyTriggers[controllers->controller[i].inputs[j].evCode].channel =
|
||||||
input.channel;
|
input.channel;
|
||||||
strcpy(controllers->controller[i].keyTriggers[controllers->controller[i].inputs[j].evCode].name,
|
strncpy(controllers->controller[i].keyTriggers[controllers->controller[i].inputs[j].evCode].name,
|
||||||
input.name);
|
input.name, SIZE);
|
||||||
controllers->controller[i].keyTriggers[controllers->controller[i].inputs[j].evCode].player =
|
controllers->controller[i].keyTriggers[controllers->controller[i].inputs[j].evCode].player =
|
||||||
input.player;
|
input.player;
|
||||||
|
|
||||||
|
|||||||
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
#include <linux/input-event-codes.h>
|
#include <linux/input-event-codes.h>
|
||||||
|
|
||||||
#define SIZE 128
|
#define SIZE 300
|
||||||
#define CONTROLLER_THREAD_MAX 256
|
#define CONTROLLER_THREAD_MAX 256
|
||||||
|
#define MAX_INPUTS 512
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
@@ -69,12 +69,12 @@ typedef struct
|
|||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
char name[SIZE];
|
char name[SIZE];
|
||||||
char path[320];
|
char path[SIZE];
|
||||||
char physicalLocation[128];
|
char physicalLocation[SIZE];
|
||||||
int absMax[ABS_MAX];
|
int absMax[ABS_MAX];
|
||||||
int absMin[ABS_MAX];
|
int absMin[ABS_MAX];
|
||||||
|
|
||||||
ControllerInput inputs[320];
|
ControllerInput inputs[MAX_INPUTS];
|
||||||
int inputCount;
|
int inputCount;
|
||||||
|
|
||||||
ArcadeInput keyTriggers[KEY_MAX];
|
ArcadeInput keyTriggers[KEY_MAX];
|
||||||
|
|||||||
@@ -337,9 +337,67 @@ DIR *opendir(const char *dirname)
|
|||||||
return _opendir(dirname + 1);
|
return _opendir(dirname + 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fix for Outrun high scores
|
||||||
|
switch (gId)
|
||||||
|
{
|
||||||
|
case OUTRUN_2_SP_SDX:
|
||||||
|
case OUTRUN_2_SP_SDX_REVA:
|
||||||
|
case OUTRUN_2_SP_SDX_TEST:
|
||||||
|
case OUTRUN_2_SP_SDX_REVA_TEST:
|
||||||
|
case OUTRUN_2_SP_SDX_REVA_TEST2:
|
||||||
|
{
|
||||||
|
if (strcmp(dirname, "/home/disk1/rankingdata") == 0)
|
||||||
|
{
|
||||||
|
return _opendir("./rankingdata");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
return _opendir(dirname);
|
return _opendir(dirname);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int remove(const char *path)
|
||||||
|
{
|
||||||
|
int (*_remove)(const char *path) = dlsym(RTLD_NEXT, "remove");
|
||||||
|
|
||||||
|
switch (gId)
|
||||||
|
{
|
||||||
|
case OUTRUN_2_SP_SDX:
|
||||||
|
case OUTRUN_2_SP_SDX_REVA:
|
||||||
|
case OUTRUN_2_SP_SDX_TEST:
|
||||||
|
case OUTRUN_2_SP_SDX_REVA_TEST:
|
||||||
|
case OUTRUN_2_SP_SDX_REVA_TEST2:
|
||||||
|
{
|
||||||
|
if (strcmp(path, "/home/disk1/rankingdata/%s") == 0)
|
||||||
|
{
|
||||||
|
return _remove("./rankingdata/%s");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return _remove(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
int mkdir(const char *path, mode_t mode)
|
||||||
|
{
|
||||||
|
int (*_mkdir)(const char *path, mode_t mode) = dlsym(RTLD_NEXT, "mkdir");
|
||||||
|
|
||||||
|
switch (gId)
|
||||||
|
{
|
||||||
|
case OUTRUN_2_SP_SDX:
|
||||||
|
case OUTRUN_2_SP_SDX_REVA:
|
||||||
|
case OUTRUN_2_SP_SDX_TEST:
|
||||||
|
case OUTRUN_2_SP_SDX_REVA_TEST:
|
||||||
|
case OUTRUN_2_SP_SDX_REVA_TEST2:
|
||||||
|
{
|
||||||
|
if (strcmp(path, "/home/disk1/rankingdata") == 0)
|
||||||
|
{
|
||||||
|
return _mkdir("./rankingdata", mode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return _mkdir(path, mode);
|
||||||
|
}
|
||||||
|
|
||||||
int __xstat64(int ver, const char *path, struct stat64 *stat_buf)
|
int __xstat64(int ver, const char *path, struct stat64 *stat_buf)
|
||||||
{
|
{
|
||||||
int (*___xstat64)(int ver, const char *path, struct stat64 *stat_buf) = dlsym(RTLD_NEXT, "__xstat64");
|
int (*___xstat64)(int ver, const char *path, struct stat64 *stat_buf) = dlsym(RTLD_NEXT, "__xstat64");
|
||||||
@@ -572,6 +630,22 @@ FILE *fopen(const char *restrict pathname, const char *restrict mode)
|
|||||||
pathname = newPathname;
|
pathname = newPathname;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fix for Outrun high scores
|
||||||
|
switch (gId)
|
||||||
|
{
|
||||||
|
case OUTRUN_2_SP_SDX:
|
||||||
|
case OUTRUN_2_SP_SDX_REVA:
|
||||||
|
case OUTRUN_2_SP_SDX_TEST:
|
||||||
|
case OUTRUN_2_SP_SDX_REVA_TEST:
|
||||||
|
case OUTRUN_2_SP_SDX_REVA_TEST2:
|
||||||
|
{
|
||||||
|
if ((newPathname = strstr(pathname, "/home/disk1")) != NULL)
|
||||||
|
{
|
||||||
|
pathname = newPathname + 12;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// This forces LGJ games and ID games to not use the pre-compiled shaders.
|
// This forces LGJ games and ID games to not use the pre-compiled shaders.
|
||||||
if ((strstr(pathname, "asm_lbg") != NULL) || (strstr(pathname, "asm_gl") != NULL))
|
if ((strstr(pathname, "asm_lbg") != NULL) || (strstr(pathname, "asm_gl") != NULL))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -444,7 +444,7 @@ int main(int argc, char *argv[])
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(argv[i], "-z") == 0 || strcmp(argv[i], "--ziink") == 0)
|
if (strcmp(argv[i], "-z") == 0 || strcmp(argv[i], "--zink") == 0)
|
||||||
{
|
{
|
||||||
zink = 1;
|
zink = 1;
|
||||||
continue;
|
continue;
|
||||||
|
|||||||
@@ -159,7 +159,8 @@ void *readJVSFrameThread(void * arg)
|
|||||||
ackSize = 0;
|
ackSize = 0;
|
||||||
waitForEnd = 0;
|
waitForEnd = 0;
|
||||||
|
|
||||||
do {
|
do
|
||||||
|
{
|
||||||
// printf("SERIAL thread debug: trying to read byte.\n");
|
// printf("SERIAL thread debug: trying to read byte.\n");
|
||||||
// Try to read a byte from serial, this call will be blocking if VMIN > 0 and VTIME = 0
|
// Try to read a byte from serial, this call will be blocking if VMIN > 0 and VTIME = 0
|
||||||
bytesRead = read(fd, &localBuffer[byteCount], 1);
|
bytesRead = read(fd, &localBuffer[byteCount], 1);
|
||||||
@@ -194,7 +195,6 @@ void *readJVSFrameThread(void * arg)
|
|||||||
}
|
}
|
||||||
} while (waitForEnd);
|
} while (waitForEnd);
|
||||||
|
|
||||||
|
|
||||||
// Lock the buffer while we write to it
|
// Lock the buffer while we write to it
|
||||||
pthread_mutex_lock(&jvsBuffer_lock);
|
pthread_mutex_lock(&jvsBuffer_lock);
|
||||||
memcpy(jvsFrameBuffer.buffer, localBuffer, byteCount);
|
memcpy(jvsFrameBuffer.buffer, localBuffer, byteCount);
|
||||||
@@ -237,7 +237,6 @@ int startJVSFrameThread(int * fd) {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
JVSFrame readJVSFrameFromThread() {
|
JVSFrame readJVSFrameFromThread() {
|
||||||
|
|
||||||
JVSFrame frame;
|
JVSFrame frame;
|
||||||
// Lock while reading/writing to shared frame
|
// Lock while reading/writing to shared frame
|
||||||
pthread_mutex_lock(&jvsBuffer_lock);
|
pthread_mutex_lock(&jvsBuffer_lock);
|
||||||
|
|||||||
Reference in New Issue
Block a user