+#define PARSEPATH(dst, src) \
+ ptr = src + strlen(src); \
+ while (*ptr != '\\' && ptr != src) ptr--; \
+ if (ptr != src) { \
+ strcpy(dst, ptr+1); \
+ }
+
+static int _OpenPlugins(void) {
+ int ret;
+
+ signal(SIGINT, SignalExit);
+ signal(SIGPIPE, SignalExit);
+
+ GPU_clearDynarec(clearDynarec);
+
+ ret = CDR_open();
+ if (ret < 0) { SysMessage(_("Error opening CD-ROM plugin!")); return -1; }
+ ret = SPU_open();
+ if (ret < 0) { SysMessage(_("Error opening SPU plugin!")); return -1; }
+ SPU_registerCallback(SPUirq);
+ // pcsx-rearmed: we handle gpu elsewhere
+ //ret = GPU_open(&gpuDisp, "PCSX", NULL);
+ //if (ret < 0) { SysMessage(_("Error opening GPU plugin!")); return -1; }
+ ret = PAD1_open(&gpuDisp);
+ if (ret < 0) { SysMessage(_("Error opening Controller 1 plugin!")); return -1; }
+ ret = PAD2_open(&gpuDisp);
+ if (ret < 0) { SysMessage(_("Error opening Controller 2 plugin!")); return -1; }
+
+ if (Config.UseNet && !NetOpened) {
+ netInfo info;
+ char path[MAXPATHLEN];
+ char dotdir[MAXPATHLEN];
+
+ MAKE_PATH(dotdir, "/.pcsx/plugins/", NULL);
+
+ strcpy(info.EmuName, "PCSX");
+ strncpy(info.CdromID, CdromId, 9);
+ strncpy(info.CdromLabel, CdromLabel, 9);
+ info.psxMem = psxM;
+ info.GPU_showScreenPic = GPU_showScreenPic;
+ info.GPU_displayText = GPU_displayText;
+ info.GPU_showScreenPic = GPU_showScreenPic;
+ info.PAD_setSensitive = PAD1_setSensitive;
+ sprintf(path, "%s%s", Config.BiosDir, Config.Bios);
+ strcpy(info.BIOSpath, path);
+ strcpy(info.MCD1path, Config.Mcd1);
+ strcpy(info.MCD2path, Config.Mcd2);
+ sprintf(path, "%s%s", dotdir, Config.Gpu);
+ strcpy(info.GPUpath, path);
+ sprintf(path, "%s%s", dotdir, Config.Spu);
+ strcpy(info.SPUpath, path);
+ sprintf(path, "%s%s", dotdir, Config.Cdr);
+ strcpy(info.CDRpath, path);
+ NET_setInfo(&info);
+
+ ret = NET_open(&gpuDisp);
+ if (ret < 0) {
+ if (ret == -2) {
+ // -2 is returned when something in the info
+ // changed and needs to be synced
+ char *ptr;
+
+ PARSEPATH(Config.Bios, info.BIOSpath);
+ PARSEPATH(Config.Gpu, info.GPUpath);
+ PARSEPATH(Config.Spu, info.SPUpath);
+ PARSEPATH(Config.Cdr, info.CDRpath);
+
+ strcpy(Config.Mcd1, info.MCD1path);
+ strcpy(Config.Mcd2, info.MCD2path);
+ return -2;
+ } else {
+ Config.UseNet = FALSE;
+ }
+ } else {
+ if (NET_queryPlayer() == 1) {
+ if (SendPcsxInfo() == -1) Config.UseNet = FALSE;
+ } else {
+ if (RecvPcsxInfo() == -1) Config.UseNet = FALSE;
+ }
+ }
+ NetOpened = TRUE;
+ } else if (Config.UseNet) {
+ NET_resume();
+ }