int main_set_core_defaults(void) { float fConfigParamsVersion; int bSaveConfig = 0, bUpgrade = 0; if (ConfigGetParameter(g_CoreConfig, "Version", M64TYPE_FLOAT, &fConfigParamsVersion, sizeof(float)) != M64ERR_SUCCESS) { DebugMessage(M64MSG_WARNING, "No version number in 'Core' config section. Setting defaults."); ConfigDeleteSection("Core"); ConfigOpenSection("Core", &g_CoreConfig); bSaveConfig = 1; } else if (((int) fConfigParamsVersion) != ((int) CONFIG_PARAM_VERSION)) { DebugMessage(M64MSG_WARNING, "Incompatible version %.2f in 'Core' config section: current is %.2f. Setting defaults.", fConfigParamsVersion, (float) CONFIG_PARAM_VERSION); ConfigDeleteSection("Core"); ConfigOpenSection("Core", &g_CoreConfig); bSaveConfig = 1; } else if ((CONFIG_PARAM_VERSION - fConfigParamsVersion) >= 0.0001f) { float fVersion = (float) CONFIG_PARAM_VERSION; ConfigSetParameter(g_CoreConfig, "Version", M64TYPE_FLOAT, &fVersion); DebugMessage(M64MSG_INFO, "Updating parameter set version in 'Core' config section to %.2f", fVersion); bUpgrade = 1; bSaveConfig = 1; } /* parameters controlling the operation of the core */ ConfigSetDefaultFloat(g_CoreConfig, "Version", (float) CONFIG_PARAM_VERSION, "Mupen64Plus Core config parameter set version number. Please don't change this version number."); ConfigSetDefaultBool(g_CoreConfig, "OnScreenDisplay", 1, "Draw on-screen display if True, otherwise don't draw OSD"); #if defined(DYNAREC) ConfigSetDefaultInt(g_CoreConfig, "R4300Emulator", 2, "Use Pure Interpreter if 0, Cached Interpreter if 1, or Dynamic Recompiler if 2 or more"); #else ConfigSetDefaultInt(g_CoreConfig, "R4300Emulator", 1, "Use Pure Interpreter if 0, Cached Interpreter if 1, or Dynamic Recompiler if 2 or more"); #endif ConfigSetDefaultBool(g_CoreConfig, "NoCompiledJump", 0, "Disable compiled jump commands in dynamic recompiler (should be set to False) "); ConfigSetDefaultBool(g_CoreConfig, "DisableExtraMem", 0, "Disable 4MB expansion RAM pack. May be necessary for some games"); ConfigSetDefaultBool(g_CoreConfig, "EnableDebugger", 0, "Activate the R4300 debugger when ROM execution begins, if core was built with Debugger support"); ConfigSetDefaultInt(g_CoreConfig, "CountPerOp", 0, "Force number of cycles per emulated instruction."); ConfigSetDefaultBool(g_CoreConfig, "DelaySI", 1, "Delay interrupt after DMA SI read/write"); if (bSaveConfig) ConfigSaveSection("Core"); return 1; }
static int SetConfigParameter(const char *ParamSpec) { char *ParsedString, *VarName, *VarValue=NULL; m64p_handle ConfigSection; m64p_type VarType; m64p_error rval; if (ParamSpec == NULL) { DebugMessage(M64MSG_ERROR, "ParamSpec is NULL in SetConfigParameter()"); return 1; } /* make a copy of the input string */ ParsedString = (char *) malloc(strlen(ParamSpec) + 1); if (ParsedString == NULL) { DebugMessage(M64MSG_ERROR, "SetConfigParameter() couldn't allocate memory for temporary string."); return 2; } strcpy(ParsedString, ParamSpec); /* parse it for the simple section[name]=value format */ VarName = strchr(ParsedString, '['); if (VarName != NULL) { *VarName++ = 0; VarValue = strchr(VarName, ']'); if (VarValue != NULL) { *VarValue++ = 0; } } if (VarName == NULL || VarValue == NULL || *VarValue != '=') { DebugMessage(M64MSG_ERROR, "invalid (param-spec) '%s'", ParamSpec); free(ParsedString); return 3; } VarValue++; /* then set the value */ rval = (*ConfigOpenSection)(ParsedString, &ConfigSection); if (rval != M64ERR_SUCCESS) { DebugMessage(M64MSG_ERROR, "SetConfigParameter failed to open config section '%s'", ParsedString); free(ParsedString); return 4; } if ((*ConfigGetParameterType)(ConfigSection, VarName, &VarType) == M64ERR_SUCCESS) { switch(VarType) { int ValueInt; float ValueFloat; case M64TYPE_INT: ValueInt = atoi(VarValue); ConfigSetParameter(ConfigSection, VarName, M64TYPE_INT, &ValueInt); break; case M64TYPE_FLOAT: ValueFloat = (float) atof(VarValue); ConfigSetParameter(ConfigSection, VarName, M64TYPE_FLOAT, &ValueFloat); break; case M64TYPE_BOOL: ValueInt = (int) (osal_insensitive_strcmp(VarValue, "true") == 0); ConfigSetParameter(ConfigSection, VarName, M64TYPE_BOOL, &ValueInt); break; case M64TYPE_STRING: ConfigSetParameter(ConfigSection, VarName, M64TYPE_STRING, VarValue); break; default: DebugMessage(M64MSG_ERROR, "invalid VarType in SetConfigParameter()"); return 5; } } else { ConfigSetParameter(ConfigSection, VarName, M64TYPE_STRING, VarValue); } free(ParsedString); return 0; }
static m64p_error OpenConfigurationHandles(void) { float fConfigParamsVersion; int bSaveConfig = 0; m64p_error rval; /* Open Configuration sections for core library and console User Interface */ rval = (*ConfigOpenSection)("Core", &l_ConfigCore); if (rval != M64ERR_SUCCESS) { DebugMessage(M64MSG_ERROR, "failed to open 'Core' configuration section"); return rval; } rval = (*ConfigOpenSection)("Video-General", &l_ConfigVideo); if (rval != M64ERR_SUCCESS) { DebugMessage(M64MSG_ERROR, "failed to open 'Video-General' configuration section"); return rval; } rval = (*ConfigOpenSection)("UI-Console", &l_ConfigUI); if (rval != M64ERR_SUCCESS) { DebugMessage(M64MSG_ERROR, "failed to open 'UI-Console' configuration section"); return rval; } if ((*ConfigGetParameter)(l_ConfigUI, "Version", M64TYPE_FLOAT, &fConfigParamsVersion, sizeof(float)) != M64ERR_SUCCESS) { DebugMessage(M64MSG_WARNING, "No version number in 'UI-Console' config section. Setting defaults."); (*ConfigDeleteSection)("UI-Console"); (*ConfigOpenSection)("UI-Console", &l_ConfigUI); bSaveConfig = 1; } else if (((int) fConfigParamsVersion) != ((int) CONFIG_PARAM_VERSION)) { DebugMessage(M64MSG_WARNING, "Incompatible version %.2f in 'UI-Console' config section: current is %.2f. Setting defaults.", fConfigParamsVersion, (float) CONFIG_PARAM_VERSION); (*ConfigDeleteSection)("UI-Console"); (*ConfigOpenSection)("UI-Console", &l_ConfigUI); bSaveConfig = 1; } else if ((CONFIG_PARAM_VERSION - fConfigParamsVersion) >= 0.0001f) { /* handle upgrades */ float fVersion = CONFIG_PARAM_VERSION; ConfigSetParameter(l_ConfigUI, "Version", M64TYPE_FLOAT, &fVersion); DebugMessage(M64MSG_INFO, "Updating parameter set version in 'UI-Console' config section to %.2f", fVersion); bSaveConfig = 1; } /* Set default values for my Config parameters */ (*ConfigSetDefaultFloat)(l_ConfigUI, "Version", CONFIG_PARAM_VERSION, "Mupen64Plus UI-Console config parameter set version number. Please don't change this version number."); (*ConfigSetDefaultString)(l_ConfigUI, "PluginDir", OSAL_CURRENT_DIR, "Directory in which to search for plugins"); (*ConfigSetDefaultString)(l_ConfigUI, "VideoPlugin", "mupen64plus-video-rice" OSAL_DLL_EXTENSION, "Filename of video plugin"); (*ConfigSetDefaultString)(l_ConfigUI, "AudioPlugin", "mupen64plus-audio-sdl" OSAL_DLL_EXTENSION, "Filename of audio plugin"); (*ConfigSetDefaultString)(l_ConfigUI, "InputPlugin", "mupen64plus-input-sdl" OSAL_DLL_EXTENSION, "Filename of input plugin"); (*ConfigSetDefaultString)(l_ConfigUI, "RspPlugin", "mupen64plus-rsp-hle" OSAL_DLL_EXTENSION, "Filename of RSP plugin"); if (bSaveConfig && ConfigSaveSection != NULL) /* ConfigSaveSection was added in Config API v2.1.0 */ (*ConfigSaveSection)("UI-Console"); return M64ERR_SUCCESS; }
/* global functions */ int auto_set_defaults(int iDeviceIdx, const char *joySDLName) { FILE *pfIn; m64p_handle pConfig = NULL; const char *CfgFilePath = ConfigGetSharedDataFilepath(INI_FILE_NAME); enum { E_NAME_SEARCH, E_NAME_FOUND, E_PARAM_READ } eParseState; char *pchIni, *pchNextLine, *pchCurLine; long iniLength; int ControllersFound = 0; /* if we couldn't get a name (no joystick plugged in to given port), then return with a failure */ if (joySDLName == NULL) return 0; /* if we couldn't find the shared data file, dump an error and return */ if (CfgFilePath == NULL || strlen(CfgFilePath) < 1) { DebugMessage(M64MSG_ERROR, "Couldn't find config file '%s'", INI_FILE_NAME); return 0; } /* read the input auto-config .ini file */ pfIn = fopen(CfgFilePath, "rb"); if (pfIn == NULL) { DebugMessage(M64MSG_ERROR, "Couldn't open config file '%s'", CfgFilePath); return 0; } fseek(pfIn, 0L, SEEK_END); iniLength = ftell(pfIn); fseek(pfIn, 0L, SEEK_SET); pchIni = (char *) malloc(iniLength + 1); if (pchIni == NULL) { DebugMessage(M64MSG_ERROR, "Couldn't allocate %li bytes for config file '%s'", iniLength, CfgFilePath); fclose(pfIn); return 0; } if (fread(pchIni, 1, iniLength, pfIn) != iniLength) { DebugMessage(M64MSG_ERROR, "File read failed for %li bytes of config file '%s'", iniLength, CfgFilePath); free(pchIni); fclose(pfIn); return 0; } fclose(pfIn); pchIni[iniLength] = 0; /* parse the INI file, line by line */ pchNextLine = pchIni; eParseState = E_NAME_SEARCH; while (pchNextLine != NULL && *pchNextLine != 0) { char *pivot = NULL; /* set up character pointers */ pchCurLine = pchNextLine; pchNextLine = strchr(pchNextLine, '\n'); if (pchNextLine != NULL) *pchNextLine++ = 0; pchCurLine = StripSpace(pchCurLine); /* handle blank/comment lines */ if (strlen(pchCurLine) < 1 || *pchCurLine == ';' || *pchCurLine == '#') continue; /* handle section (joystick name in ini file) */ if (*pchCurLine == '[' && pchCurLine[strlen(pchCurLine)-1] == ']') { char Word[64]; char *wordPtr; int joyFound = 1; if (eParseState == E_PARAM_READ) { /* we've finished parsing all parameters for the discovered input device */ free(pchIni); return ControllersFound; } else if (eParseState == E_NAME_FOUND) { /* this is an equivalent device name to the one we're looking for (and found); keep looking for parameters */ continue; } /* we need to look through the device name word by word to see if it matches the joySDLName that we're looking for */ pchCurLine[strlen(pchCurLine)-1] = 0; wordPtr = StripSpace(pchCurLine + 1); /* first, if there is a preceding system name in this .ini device name, and the system matches, then strip out */ #if defined(__unix__) if (strncmp(wordPtr, "Unix:", 5) == 0) wordPtr = StripSpace(wordPtr + 5); #endif #if defined(__linux__) if (strncmp(wordPtr, "Linux:", 6) == 0) wordPtr = StripSpace(wordPtr + 6); #endif #if defined(__APPLE__) if (strncmp(wordPtr, "OSX:", 4) == 0) wordPtr = StripSpace(wordPtr + 4); #endif #if defined(WIN32) if (strncmp(wordPtr, "Win32:", 6) == 0) wordPtr = StripSpace(wordPtr + 6); #endif /* search in the .ini device name for all the words in the joystick name. If any are missing, then this is not the right joystick model */ while (wordPtr != NULL && strlen(wordPtr) > 0) { char *nextSpace = strchr(wordPtr, ' '); if (nextSpace == NULL) { strncpy(Word, wordPtr, 63); Word[63] = 0; wordPtr = NULL; } else { int length = (int) (nextSpace - wordPtr); if (length > 63) length = 63; strncpy(Word, wordPtr, length); Word[length] = 0; wordPtr = nextSpace + 1; } printf("Word1: %s, Word2: %s\n", joySDLName, Word);fflush(stdout); if (strstr(joySDLName, Word) == NULL) joyFound = 0; } /* if we found the right joystick, then open up the core config section to store parameters and set the 'device' param */ if (joyFound) { char SectionName[32]; sprintf(SectionName, "AutoConfig%i", ControllersFound); if (ConfigOpenSection(SectionName, &pConfig) != M64ERR_SUCCESS) { DebugMessage(M64MSG_ERROR, "auto_set_defaults(): Couldn't open config section '%s'", SectionName); free(pchIni); return 0; } eParseState = E_NAME_FOUND; ControllersFound++; DebugMessage(M64MSG_INFO, "Using auto-configuration for device '%s'", joySDLName); ConfigSetParameter(pConfig, "device", M64TYPE_INT, &iDeviceIdx); } continue; } /* handle parameters */ pivot = strchr(pchCurLine, '='); if (pivot != NULL) { /* if we haven't found the correct section yet, just skip this */ if (eParseState == E_NAME_SEARCH) continue; eParseState = E_PARAM_READ; /* otherwise, store this parameter in the current active joystick config */ *pivot++ = 0; pchCurLine = StripSpace(pchCurLine); pivot = StripSpace(pivot); if (strcasecmp(pchCurLine, "plugin") == 0 || strcasecmp(pchCurLine, "device") == 0) { int iVal = atoi(pivot); ConfigSetParameter(pConfig, pchCurLine, M64TYPE_INT, &iVal); } else if (strcasecmp(pchCurLine, "plugged") == 0 || strcasecmp(pchCurLine, "mouse") == 0) { int bVal = (strcasecmp(pivot, "true") == 0); ConfigSetParameter(pConfig, pchCurLine, M64TYPE_BOOL, &bVal); } else { ConfigSetParameter(pConfig, pchCurLine, M64TYPE_STRING, pivot); } continue; } /* handle keywords */ if (pchCurLine[strlen(pchCurLine)-1] == ':') { /* if we haven't found the correct section yet, just skip this */ if (eParseState == E_NAME_SEARCH) continue; /* otherwise parse the keyword */ if (strcmp(pchCurLine, "__NextController:") == 0) { char SectionName[32]; /* if there are no more N64 controller spaces left, then exit */ if (ControllersFound == 4) { free(pchIni); return ControllersFound; } /* otherwise go to the next N64 controller */ sprintf(SectionName, "AutoConfig%i", ControllersFound); if (ConfigOpenSection(SectionName, &pConfig) != M64ERR_SUCCESS) { DebugMessage(M64MSG_ERROR, "auto_set_defaults(): Couldn't open config section '%s'", SectionName); free(pchIni); return ControllersFound; } ControllersFound++; DebugMessage(M64MSG_INFO, "Using auto-configuration for device '%s': %i controllers for this device", joySDLName, ControllersFound); ConfigSetParameter(pConfig, "device", M64TYPE_INT, &iDeviceIdx); } else { DebugMessage(M64MSG_ERROR, "Unknown keyword '%s' in %s", pchCurLine, INI_FILE_NAME); } continue; } /* unhandled line in .ini file */ DebugMessage(M64MSG_ERROR, "Invalid line in %s: '%s'", INI_FILE_NAME, pchCurLine); } if (eParseState == E_PARAM_READ) { /* we've finished parsing all parameters for the discovered input device, which is the last in the .ini file */ free(pchIni); return ControllersFound; } DebugMessage(M64MSG_INFO, "No auto-configuration found for device '%s'", joySDLName); free(pchIni); return 0; }
int auto_set_defaults(int iDeviceIdx, const char *joySDLName) { FILE *pfIn; m64p_handle pConfig = NULL; const char *CfgFilePath = ConfigGetSharedDataFilepath(INI_FILE_NAME); enum { E_NAME_SEARCH, E_NAME_FOUND, E_PARAM_READ } eParseState; char *pchIni, *pchNextLine, *pchCurLine; long iniLength; int ControllersFound = 0; int joyFoundScore = -1; /* if we couldn't get a name (no joystick plugged in to given port), then return with a failure */ if (joySDLName == NULL) return 0; /* if we couldn't find the shared data file, dump an error and return */ if (CfgFilePath == NULL || strlen(CfgFilePath) < 1) { DebugMessage(M64MSG_ERROR, "Couldn't find config file '%s'", INI_FILE_NAME); return 0; } /* read the input auto-config .ini file */ pfIn = fopen(CfgFilePath, "rb"); if (pfIn == NULL) { DebugMessage(M64MSG_ERROR, "Couldn't open config file '%s'", CfgFilePath); return 0; } fseek(pfIn, 0L, SEEK_END); iniLength = ftell(pfIn); fseek(pfIn, 0L, SEEK_SET); if (iniLength < 0) { DebugMessage(M64MSG_ERROR, "Couldn't get size of config file '%s'", CfgFilePath); fclose(pfIn); return 0; } pchIni = (char *) malloc(iniLength + 1); if (pchIni == NULL) { DebugMessage(M64MSG_ERROR, "Couldn't allocate %li bytes for config file '%s'", iniLength, CfgFilePath); fclose(pfIn); return 0; } if (fread(pchIni, 1, iniLength, pfIn) != iniLength) { DebugMessage(M64MSG_ERROR, "File read failed for %li bytes of config file '%s'", iniLength, CfgFilePath); free(pchIni); fclose(pfIn); return 0; } fclose(pfIn); pchIni[iniLength] = 0; /* parse the INI file, line by line */ DebugMessage(M64MSG_INFO, "Using auto-config file at: '%s'", CfgFilePath); pchNextLine = pchIni; eParseState = E_NAME_SEARCH; while (pchNextLine != NULL && *pchNextLine != 0) { char *pivot = NULL; int joyFound = 0; /* set up character pointers */ pchCurLine = pchNextLine; pchNextLine = strchr(pchNextLine, '\n'); if (pchNextLine != NULL) *pchNextLine++ = 0; pchCurLine = StripSpace(pchCurLine); /* handle blank/comment lines */ if (strlen(pchCurLine) < 1 || *pchCurLine == ';' || *pchCurLine == '#') continue; /* handle section (joystick name in ini file) */ if (*pchCurLine == '[' && pchCurLine[strlen(pchCurLine)-1] == ']') { /* only switch to name search when some section body was identified since last header */ if (eParseState == E_PARAM_READ) eParseState = E_NAME_SEARCH; /* we need to look through the device name word by word to see if it matches the joySDLName that we're looking for */ pchCurLine[strlen(pchCurLine)-1] = 0; joyFound = auto_compare_name(joySDLName, StripSpace(pchCurLine + 1)); /* if we found the right joystick, then open up the core config section to store parameters and set the 'device' param */ if (joyFound > joyFoundScore) { char SectionName[32]; ControllersFound = 0; sprintf(SectionName, "AutoConfig%i", ControllersFound); if (ConfigOpenSection(SectionName, &pConfig) != M64ERR_SUCCESS) { DebugMessage(M64MSG_ERROR, "auto_set_defaults(): Couldn't open config section '%s'", SectionName); free(pchIni); return 0; } eParseState = E_NAME_FOUND; ControllersFound++; ConfigSetParameter(pConfig, "device", M64TYPE_INT, &iDeviceIdx); joyFoundScore = joyFound; } continue; } /* handle parameters */ pivot = strchr(pchCurLine, '='); if (pivot != NULL) { /* if we haven't found the correct section yet, just skip this */ if (eParseState == E_NAME_SEARCH) continue; eParseState = E_PARAM_READ; /* otherwise, store this parameter in the current active joystick config */ *pivot++ = 0; pchCurLine = StripSpace(pchCurLine); pivot = StripSpace(pivot); if (strcasecmp(pchCurLine, "device") == 0) { int iVal = atoi(pivot); ConfigSetParameter(pConfig, pchCurLine, M64TYPE_INT, &iVal); } else if (strcasecmp(pchCurLine, "plugged") == 0 || strcasecmp(pchCurLine, "mouse") == 0) { int bVal = (strcasecmp(pivot, "true") == 0); ConfigSetParameter(pConfig, pchCurLine, M64TYPE_BOOL, &bVal); } else { ConfigSetParameter(pConfig, pchCurLine, M64TYPE_STRING, pivot); } continue; } /* handle keywords */ if (pchCurLine[strlen(pchCurLine)-1] == ':') { /* if we haven't found the correct section yet, just skip this */ if (eParseState == E_NAME_SEARCH) continue; eParseState = E_PARAM_READ; /* otherwise parse the keyword */ if (strcmp(pchCurLine, "__NextController:") == 0) { char SectionName[32]; /* if there are no more N64 controller spaces left, then exit */ if (ControllersFound == 4) { free(pchIni); return ControllersFound; } /* otherwise go to the next N64 controller */ sprintf(SectionName, "AutoConfig%i", ControllersFound); if (ConfigOpenSection(SectionName, &pConfig) != M64ERR_SUCCESS) { DebugMessage(M64MSG_ERROR, "auto_set_defaults(): Couldn't open config section '%s'", SectionName); free(pchIni); return ControllersFound; } ControllersFound++; ConfigSetParameter(pConfig, "device", M64TYPE_INT, &iDeviceIdx); } else { DebugMessage(M64MSG_ERROR, "Unknown keyword '%s' in %s", pchCurLine, INI_FILE_NAME); } continue; } /* unhandled line in .ini file */ DebugMessage(M64MSG_ERROR, "Invalid line in %s: '%s'", INI_FILE_NAME, pchCurLine); } if (joyFoundScore != -1) { /* we've finished parsing all parameters for the discovered input device, which is the last in the .ini file */ free(pchIni); return ControllersFound; } free(pchIni); return 0; }
int event_set_core_defaults(void) { float fConfigParamsVersion; int bSaveConfig = 0; if (ConfigOpenSection("CoreEvents", &l_CoreEventsConfig) != M64ERR_SUCCESS || l_CoreEventsConfig == NULL) { DebugMessage(M64MSG_ERROR, "Failed to open CoreEvents config section."); return 0; /* fail */ } if (ConfigGetParameter(l_CoreEventsConfig, "Version", M64TYPE_FLOAT, &fConfigParamsVersion, sizeof(float)) != M64ERR_SUCCESS) { DebugMessage(M64MSG_WARNING, "No version number in 'CoreEvents' config section. Setting defaults."); ConfigDeleteSection("CoreEvents"); ConfigOpenSection("CoreEvents", &l_CoreEventsConfig); bSaveConfig = 1; } else if (((int) fConfigParamsVersion) != ((int) CONFIG_PARAM_VERSION)) { DebugMessage(M64MSG_WARNING, "Incompatible version %.2f in 'CoreEvents' config section: current is %.2f. Setting defaults.", fConfigParamsVersion, (float) CONFIG_PARAM_VERSION); ConfigDeleteSection("CoreEvents"); ConfigOpenSection("CoreEvents", &l_CoreEventsConfig); bSaveConfig = 1; } else if ((CONFIG_PARAM_VERSION - fConfigParamsVersion) >= 0.0001f) { /* handle upgrades */ float fVersion = CONFIG_PARAM_VERSION; ConfigSetParameter(l_CoreEventsConfig, "Version", M64TYPE_FLOAT, &fVersion); DebugMessage(M64MSG_INFO, "Updating parameter set version in 'CoreEvents' config section to %.2f", fVersion); bSaveConfig = 1; } ConfigSetDefaultFloat(l_CoreEventsConfig, "Version", CONFIG_PARAM_VERSION, "Mupen64Plus CoreEvents config parameter set version number. Please don't change this version number."); /* Keyboard presses mapped to core functions */ ConfigSetDefaultInt(l_CoreEventsConfig, kbdStop, sdl_native2keysym(SDL_SCANCODE_ESCAPE), "SDL keysym for stopping the emulator"); ConfigSetDefaultInt(l_CoreEventsConfig, kbdFullscreen, sdl_native2keysym(SDL_NUM_SCANCODES), "SDL keysym for switching between fullscreen/windowed modes"); ConfigSetDefaultInt(l_CoreEventsConfig, kbdSave, sdl_native2keysym(SDL_SCANCODE_F5), "SDL keysym for saving the emulator state"); ConfigSetDefaultInt(l_CoreEventsConfig, kbdLoad, sdl_native2keysym(SDL_SCANCODE_F7), "SDL keysym for loading the emulator state"); ConfigSetDefaultInt(l_CoreEventsConfig, kbdIncrement, sdl_native2keysym(SDL_SCANCODE_UNKNOWN), "SDL keysym for advancing the save state slot"); ConfigSetDefaultInt(l_CoreEventsConfig, kbdReset, sdl_native2keysym(SDL_SCANCODE_F9), "SDL keysym for resetting the emulator"); ConfigSetDefaultInt(l_CoreEventsConfig, kbdSpeeddown, sdl_native2keysym(SDL_SCANCODE_F10), "SDL keysym for slowing down the emulator"); ConfigSetDefaultInt(l_CoreEventsConfig, kbdSpeedup, sdl_native2keysym(SDL_SCANCODE_F11), "SDL keysym for speeding up the emulator"); ConfigSetDefaultInt(l_CoreEventsConfig, kbdScreenshot, sdl_native2keysym(SDL_SCANCODE_F12), "SDL keysym for taking a screenshot"); ConfigSetDefaultInt(l_CoreEventsConfig, kbdPause, sdl_native2keysym(SDL_SCANCODE_P), "SDL keysym for pausing the emulator"); ConfigSetDefaultInt(l_CoreEventsConfig, kbdMute, sdl_native2keysym(SDL_SCANCODE_M), "SDL keysym for muting/unmuting the sound"); ConfigSetDefaultInt(l_CoreEventsConfig, kbdIncrease, sdl_native2keysym(SDL_SCANCODE_RIGHTBRACKET),"SDL keysym for increasing the volume"); ConfigSetDefaultInt(l_CoreEventsConfig, kbdDecrease, sdl_native2keysym(SDL_SCANCODE_LEFTBRACKET), "SDL keysym for decreasing the volume"); ConfigSetDefaultInt(l_CoreEventsConfig, kbdForward, sdl_native2keysym(SDL_SCANCODE_F), "SDL keysym for temporarily going really fast"); ConfigSetDefaultInt(l_CoreEventsConfig, kbdAdvance, sdl_native2keysym(SDL_SCANCODE_SLASH), "SDL keysym for advancing by one frame when paused"); ConfigSetDefaultInt(l_CoreEventsConfig, kbdGameshark, sdl_native2keysym(SDL_SCANCODE_G), "SDL keysym for pressing the game shark button"); /* Joystick events mapped to core functions */ ConfigSetDefaultString(l_CoreEventsConfig, JoyCmdName[joyStop], "", "Joystick event string for stopping the emulator"); ConfigSetDefaultString(l_CoreEventsConfig, JoyCmdName[joyFullscreen], "", "Joystick event string for switching between fullscreen/windowed modes"); ConfigSetDefaultString(l_CoreEventsConfig, JoyCmdName[joySave], "", "Joystick event string for saving the emulator state"); ConfigSetDefaultString(l_CoreEventsConfig, JoyCmdName[joyLoad], "", "Joystick event string for loading the emulator state"); ConfigSetDefaultString(l_CoreEventsConfig, JoyCmdName[joyIncrement], "", "Joystick event string for advancing the save state slot"); ConfigSetDefaultString(l_CoreEventsConfig, JoyCmdName[joyScreenshot], "", "Joystick event string for taking a screenshot"); ConfigSetDefaultString(l_CoreEventsConfig, JoyCmdName[joyPause], "", "Joystick event string for pausing the emulator"); ConfigSetDefaultString(l_CoreEventsConfig, JoyCmdName[joyMute], "", "Joystick event string for muting/unmuting the sound"); ConfigSetDefaultString(l_CoreEventsConfig, JoyCmdName[joyIncrease], "", "Joystick event string for increasing the volume"); ConfigSetDefaultString(l_CoreEventsConfig, JoyCmdName[joyDecrease], "", "Joystick event string for decreasing the volume"); ConfigSetDefaultString(l_CoreEventsConfig, JoyCmdName[joyForward], "", "Joystick event string for fast-forward"); ConfigSetDefaultString(l_CoreEventsConfig, JoyCmdName[joyGameshark], "", "Joystick event string for pressing the game shark button"); if (bSaveConfig) ConfigSaveSection("CoreEvents"); return 1; }
void load_configuration(int bPreConfig) { char SectionName[32]; int joy_plugged = 0; int n64CtrlIdx, sdlCtrlIdx, j; int sdlNumDevUsed = 0; int sdlDevicesUsed[4]; eModeType OrigControlMode[4], ControlMode[4]; int ControlDevice[4]; char DeviceName[4][256]; int ActiveControllers = 0; int sdlNumJoysticks = get_sdl_num_joysticks(); float fVersion = 0.0f; const char *sdl_name; int ControllersFound = 0; /* tell user how many SDL joysticks are available */ if (!bPreConfig) DebugMessage(M64MSG_INFO, "%i SDL joysticks were found.", sdlNumJoysticks); /* loop through 4 N64 controllers, initializing and validating special section parameters */ for (n64CtrlIdx=0; n64CtrlIdx < 4; n64CtrlIdx++) { m64p_handle pConfig; /* reset the controller configuration */ clear_controller(n64CtrlIdx); /* Open the configuration section for this controller */ sprintf(SectionName, "Input-SDL-Control%i", n64CtrlIdx + 1); if (ConfigOpenSection(SectionName, &pConfig) != M64ERR_SUCCESS) { // this should never happen DebugMessage(M64MSG_ERROR, "Couldn't open config section '%s'. Aborting...", SectionName); return; } /* Check version number, and if it doesn't match: delete the config section */ fVersion = 0.0f; if (ConfigGetParameter(pConfig, "version", M64TYPE_FLOAT, &fVersion, sizeof(float)) != M64ERR_SUCCESS || ((int) fVersion) != ((int) CONFIG_VERSION)) { DebugMessage(M64MSG_WARNING, "Missing or incompatible config section '%s'. Clearing.", SectionName); ConfigDeleteSection(SectionName); // set local controller default parameters OrigControlMode[n64CtrlIdx] = ControlMode[n64CtrlIdx] = E_MODE_FULL_AUTO; ControlDevice[n64CtrlIdx] = DEVICE_NO_JOYSTICK; DeviceName[n64CtrlIdx][0] = 0; // write blank config for GUI front-ends init_controller_config(n64CtrlIdx, "", E_MODE_FULL_AUTO); // save it to the file too ConfigSaveSection(SectionName); } else { if (ConfigGetParameter(pConfig, "mode", M64TYPE_INT, &OrigControlMode[n64CtrlIdx], sizeof(int)) != M64ERR_SUCCESS || (int) OrigControlMode[n64CtrlIdx] < 0 || (int) OrigControlMode[n64CtrlIdx] > 2) { if (!bPreConfig) DebugMessage(M64MSG_WARNING, "Missing or invalid 'mode' parameter in config section '%s'. Setting to 2 (Fully Auto)", SectionName); OrigControlMode[n64CtrlIdx] = E_MODE_FULL_AUTO; } ControlMode[n64CtrlIdx] = OrigControlMode[n64CtrlIdx]; if (ConfigGetParameter(pConfig, "device", M64TYPE_INT, &ControlDevice[n64CtrlIdx], sizeof(int)) != M64ERR_SUCCESS) { if (!bPreConfig) DebugMessage(M64MSG_WARNING, "Missing 'device' parameter in config section '%s'. Setting to -1 (No joystick)", SectionName); ControlDevice[n64CtrlIdx] = DEVICE_NO_JOYSTICK; } if (ConfigGetParameter(pConfig, "name", M64TYPE_STRING, DeviceName[n64CtrlIdx], 256) != M64ERR_SUCCESS) { DeviceName[n64CtrlIdx][0] = 0; } } } /* loop through 4 N64 controllers and set up those in Fully Manual mode */ for (n64CtrlIdx=0; n64CtrlIdx < 4; n64CtrlIdx++) { if (ControlMode[n64CtrlIdx] != E_MODE_MANUAL) continue; /* load the stored configuration (disregard any errors) */ sprintf(SectionName, "Input-SDL-Control%i", n64CtrlIdx + 1); load_controller_config(SectionName, n64CtrlIdx, ControlDevice[n64CtrlIdx]); /* if this config uses an SDL joystick, mark it as used */ if (ControlDevice[n64CtrlIdx] == DEVICE_NO_JOYSTICK) { if (!bPreConfig) DebugMessage(M64MSG_INFO, "N64 Controller #%i: Using manual config with no SDL joystick (keyboard/mouse only)", n64CtrlIdx+1); } else { sdlDevicesUsed[sdlNumDevUsed++] = ControlDevice[n64CtrlIdx]; if (!bPreConfig) DebugMessage(M64MSG_INFO, "N64 Controller #%i: Using manual config for SDL joystick %i", n64CtrlIdx+1, ControlDevice[n64CtrlIdx]); } ActiveControllers++; } /* now loop through again, setting up those in Named Auto mode */ for (n64CtrlIdx=0; n64CtrlIdx < 4; n64CtrlIdx++) { if (ControlMode[n64CtrlIdx] != E_MODE_NAMED_AUTO) continue; /* if name is empty, then use full auto mode instead */ if (DeviceName[n64CtrlIdx][0] == 0) { ControlMode[n64CtrlIdx] = E_MODE_FULL_AUTO; continue; } sprintf(SectionName, "Input-SDL-Control%i", n64CtrlIdx + 1); /* if user is looking for a keyboard, set that up */ if (strcasecmp(DeviceName[n64CtrlIdx], "Keyboard") == 0) { auto_set_defaults(DEVICE_NO_JOYSTICK, "Keyboard"); if (load_controller_config("AutoConfig0", n64CtrlIdx, DEVICE_NO_JOYSTICK) > 0) { if (!bPreConfig) DebugMessage(M64MSG_INFO, "N64 Controller #%i: Using auto-config for keyboard", n64CtrlIdx+1); /* copy the auto-config settings to the controller config section */ auto_copy_inputconfig("AutoConfig0", SectionName, "Keyboard"); ActiveControllers++; ConfigSaveSection(SectionName); } else { DebugMessage(M64MSG_ERROR, "Autoconfig keyboard setup invalid"); } ConfigDeleteSection("AutoConfig0"); continue; } /* search for an unused SDL device with the matching name */ for (sdlCtrlIdx=0; sdlCtrlIdx < sdlNumJoysticks; sdlCtrlIdx++) { /* check if this one is in use */ int deviceAlreadyUsed = 0; for (j = 0; j < sdlNumDevUsed; j++) { if (sdlDevicesUsed[j] == sdlCtrlIdx) deviceAlreadyUsed = 1; } if (deviceAlreadyUsed) continue; /* check if the name matches */ sdl_name = get_sdl_joystick_name(sdlCtrlIdx); if (sdl_name != NULL && strncmp(DeviceName[n64CtrlIdx], sdl_name, 255) == 0) { /* set up one or more controllers for this SDL device, if present in InputAutoConfig.ini */ int ControllersFound = setup_auto_controllers(bPreConfig, n64CtrlIdx, sdlCtrlIdx, sdl_name, ControlMode, OrigControlMode, DeviceName); if (ControllersFound == 0) { // error: no auto-config found for this SDL device DebugMessage(M64MSG_ERROR, "No auto-config found for joystick named '%s' in InputAutoConfig.ini", sdl_name); // mark this device as being used just so we don't complain about it again sdlDevicesUsed[sdlNumDevUsed++] = sdlCtrlIdx; // quit looking for SDL joysticks which match the name, because there's no valid autoconfig for that name. // this controller will be unused; skip to the next one break; } /* mark this sdl device as used */ sdlDevicesUsed[sdlNumDevUsed++] = sdlCtrlIdx; ActiveControllers += ControllersFound; break; } } /* if we didn't find a match for this joystick name, then set the controller to fully auto */ if (sdlCtrlIdx == sdlNumJoysticks) { if (!bPreConfig) DebugMessage(M64MSG_WARNING, "N64 Controller #%i: No SDL joystick found matching name '%s'. Using full auto mode.", n64CtrlIdx+1, DeviceName[n64CtrlIdx]); ControlMode[n64CtrlIdx] = E_MODE_FULL_AUTO; } } /* Final loop through N64 controllers, setting up those in Full Auto mode */ for (n64CtrlIdx=0; n64CtrlIdx < 4; n64CtrlIdx++) { if (ControlMode[n64CtrlIdx] != E_MODE_FULL_AUTO) continue; sprintf(SectionName, "Input-SDL-Control%i", n64CtrlIdx + 1); /* search for an unused SDL device */ for (sdlCtrlIdx=0; sdlCtrlIdx < sdlNumJoysticks; sdlCtrlIdx++) { /* check if this one is in use */ int deviceAlreadyUsed = 0; for (j = 0; j < sdlNumDevUsed; j++) { if (sdlDevicesUsed[j] == sdlCtrlIdx) deviceAlreadyUsed = 1; } if (deviceAlreadyUsed) continue; /* set up one or more controllers for this SDL device, if present in InputAutoConfig.ini */ sdl_name = get_sdl_joystick_name(sdlCtrlIdx); ControllersFound = setup_auto_controllers(bPreConfig, n64CtrlIdx, sdlCtrlIdx, sdl_name, ControlMode, OrigControlMode, DeviceName); if (!bPreConfig && ControllersFound == 0) { // error: no auto-config found for this SDL device DebugMessage(M64MSG_ERROR, "No auto-config found for joystick named '%s' in InputAutoConfig.ini", sdl_name); // mark this device as being used just so we don't complain about it again sdlDevicesUsed[sdlNumDevUsed++] = sdlCtrlIdx; // keep trying more SDL devices to see if we can auto-config one for this N64 controller continue; } /* mark this sdl device as used */ sdlDevicesUsed[sdlNumDevUsed++] = sdlCtrlIdx; ActiveControllers += ControllersFound; break; } /* if this N64 controller was not activated, set device to -1 */ if (sdlCtrlIdx == sdlNumJoysticks) { m64p_handle section; if (ConfigOpenSection(SectionName, §ion) == M64ERR_SUCCESS) { const int iNoDevice = -1; ConfigSetParameter(section, "device", M64TYPE_INT, &iNoDevice); if (OrigControlMode[n64CtrlIdx] == E_MODE_FULL_AUTO) ConfigSetParameter(section, "name", M64TYPE_STRING, ""); ConfigSaveSection(SectionName); } } } /* fallback to keyboard if no controllers were configured */ if (ActiveControllers == 0) { if (!bPreConfig) DebugMessage(M64MSG_INFO, "N64 Controller #1: Forcing default keyboard configuration"); auto_set_defaults(DEVICE_NO_JOYSTICK, "Keyboard"); if (load_controller_config("AutoConfig0", 0, DEVICE_NO_JOYSTICK) > 0) { /* copy the auto-config settings to the controller config section */ if (OrigControlMode[0] == E_MODE_FULL_AUTO) auto_copy_inputconfig("AutoConfig0", "Input-SDL-Control1", "Keyboard"); else auto_copy_inputconfig("AutoConfig0", "Input-SDL-Control1", NULL); // don't overwrite 'name' parameter ActiveControllers++; ConfigSaveSection("Input-SDL-Control1"); } else { DebugMessage(M64MSG_ERROR, "Autoconfig keyboard setup invalid"); } ConfigDeleteSection("AutoConfig0"); } /* see how many joysticks are plugged in */ joy_plugged = 0; for (j = 0; j < 4; j++) { if (controller[j].control->Present) joy_plugged++; } /* print out summary info message */ if (!bPreConfig) { if (joy_plugged > 0) { DebugMessage(M64MSG_INFO, "%i controller(s) found, %i plugged in and usable in the emulator", ActiveControllers, joy_plugged); } else { if (ActiveControllers == 0) DebugMessage(M64MSG_WARNING, "No joysticks/controllers found"); else DebugMessage(M64MSG_WARNING, "%i controllers found, but none were 'plugged in'", ActiveControllers); } } }
static m64p_error OpenConfigurationHandles(void) { float fConfigParamsVersion; int bSaveConfig = 0; m64p_error rval; /* Open Configuration sections for core library and console User Interface */ rval = (*ConfigOpenSection)("Core", &l_ConfigCore); if (rval != M64ERR_SUCCESS) { DebugMessage(M64MSG_ERROR, "failed to open 'Core' configuration section"); return rval; } rval = (*ConfigOpenSection)("Video-General", &l_ConfigVideo); if (rval != M64ERR_SUCCESS) { DebugMessage(M64MSG_ERROR, "failed to open 'Video-General' configuration section"); return rval; } rval = (*ConfigOpenSection)("UI-Console", &l_ConfigUI); if (rval != M64ERR_SUCCESS) { DebugMessage(M64MSG_ERROR, "failed to open 'UI-Console' configuration section"); return rval; } rval = (*ConfigOpenSection)("Video-Glide64mk2", &l_ConfigVideoGlide64mk2); if (rval != M64ERR_SUCCESS) { DebugMessage(M64MSG_ERROR, "failed to open 'Video-Glide64mk2' configuration section"); return rval; } rval = (*ConfigOpenSection)("Video-GLideN64", &l_ConfigVideoGLideN64); if (rval != M64ERR_SUCCESS) { DebugMessage(M64MSG_ERROR, "failed to open 'Video-GLideN64' configuration section"); return rval; } if ((*ConfigGetParameter)(l_ConfigUI, "Version", M64TYPE_FLOAT, &fConfigParamsVersion, sizeof(float)) != M64ERR_SUCCESS) { DebugMessage(M64MSG_WARNING, "No version number in 'UI-Console' config section. Setting defaults."); (*ConfigDeleteSection)("UI-Console"); (*ConfigOpenSection)("UI-Console", &l_ConfigUI); bSaveConfig = 1; } else if (((int) fConfigParamsVersion) != ((int) CONFIG_PARAM_VERSION)) { DebugMessage(M64MSG_WARNING, "Incompatible version %.2f in 'UI-Console' config section: current is %.2f. Setting defaults.", fConfigParamsVersion, (float) CONFIG_PARAM_VERSION); (*ConfigDeleteSection)("UI-Console"); (*ConfigOpenSection)("UI-Console", &l_ConfigUI); bSaveConfig = 1; } else if ((CONFIG_PARAM_VERSION - fConfigParamsVersion) >= 0.0001f) { /* handle upgrades */ float fVersion = CONFIG_PARAM_VERSION; ConfigSetParameter(l_ConfigUI, "Version", M64TYPE_FLOAT, &fVersion); DebugMessage(M64MSG_INFO, "Updating parameter set version in 'UI-Console' config section to %.2f", fVersion); bSaveConfig = 1; } DebugMessage(M64MSG_VERBOSE, "Setting default config values."); (*ConfigSetDefaultFloat)(l_ConfigUI, "Version", CONFIG_PARAM_VERSION, "Mupen64Plus UI-Console config parameter set version number. Please don't change this version number."); (*ConfigSetDefaultString)(l_ConfigUI, "PluginDir", OSAL_CURRENT_DIR, "Directory in which to search for plugins"); char *product_id = GetProductID(); if (product_id != NULL) { if (strcmp(product_id, "l500d") == 0) { DebugMessage(M64MSG_VERBOSE, "Setting default config values for the Jolla C"); /* Set default values for my Config parameters */ (*ConfigSetDefaultString)(l_ConfigUI, "VideoPlugin", "mupen64plus-video-GLideN64" OSAL_DLL_EXTENSION, "Filename of video plugin"); (*ConfigSetDefaultString)(l_ConfigUI, "AudioPlugin", "mupen64plus-audio-sdl" OSAL_DLL_EXTENSION, "Filename of audio plugin"); (*ConfigSetDefaultString)(l_ConfigUI, "InputPlugin", "mupen64plus-input-sdltouch" OSAL_DLL_EXTENSION, "Filename of input plugin"); (*ConfigSetDefaultString)(l_ConfigUI, "RspPlugin", "mupen64plus-rsp-hle" OSAL_DLL_EXTENSION, "Filename of RSP plugin"); (*ConfigSetDefaultInt)(l_ConfigVideo, "ScreenWidth", 720, "Width of output window or fullscreen width"); (*ConfigSetDefaultInt)(l_ConfigVideo, "ScreenHeight", 1280, "Height of output window or fullscreen height"); (*ConfigSetDefaultInt)(l_ConfigVideo, "Rotate", 3, "Rotate screen contents: 0=0 degree, 1=90 degree, 2 = 180 degree, 3=270 degree"); (*ConfigSetDefaultInt)(l_ConfigVideoGlide64mk2, "aspect", 2, "Aspect ratio: -1=Game default, 0=Force 4:3, 1=Force 16:9, 2=Stretch, 3=Original"); (*ConfigSetDefaultBool)(l_ConfigVideoGlide64mk2, "force_polygon_offset", 1, "If true, use polygon offset values specified below"); (*ConfigSetDefaultBool)(l_ConfigVideoGlide64mk2, "polygon_offset_factor", -0.25, "Specifies a scale factor that is used to create a variable depth offset for each polygon"); (*ConfigSetDefaultBool)(l_ConfigVideoGlide64mk2, "polygon_offset_units", -0.25, "Is multiplied by an implementation-specific value to create a constant depth offset"); (*ConfigSetDefaultBool)(l_ConfigVideoGLideN64, "EnableFBEmulation", 0, "Enable frame and|or depth buffer emulation."); (*ConfigSetDefaultBool)(l_ConfigVideoGLideN64, "EnableLegacyBlending", 1, "Do not use shaders to emulate N64 blending modes. Works faster on slow GPU. Can cause glitches."); (*ConfigSetDefaultInt)(l_ConfigVideoGLideN64, "AspectRatio", 0, "Screen aspect ratio (0=stretch, 1=force 4:3, 2=force 16:9, 3=adjust)"); (*ConfigSetDefaultBool)(l_ConfigVideoGLideN64, "EnableFBEmulation", 0, "Enable frame and|or depth buffer emulation."); } else if (strcmp(product_id, "sbj") == 0) { DebugMessage(M64MSG_VERBOSE, "Setting default config values for the Jolla Phone"); /* Set default values for my Config parameters */ (*ConfigSetDefaultString)(l_ConfigUI, "VideoPlugin", "mupen64plus-video-GLideN64" OSAL_DLL_EXTENSION, "Filename of video plugin"); (*ConfigSetDefaultString)(l_ConfigUI, "AudioPlugin", "mupen64plus-audio-sdl" OSAL_DLL_EXTENSION, "Filename of audio plugin"); (*ConfigSetDefaultString)(l_ConfigUI, "InputPlugin", "mupen64plus-input-sdltouch" OSAL_DLL_EXTENSION, "Filename of input plugin"); (*ConfigSetDefaultString)(l_ConfigUI, "RspPlugin", "mupen64plus-rsp-hle" OSAL_DLL_EXTENSION, "Filename of RSP plugin"); (*ConfigSetDefaultInt)(l_ConfigVideo, "ScreenWidth", 540, "Width of output window or fullscreen width"); (*ConfigSetDefaultInt)(l_ConfigVideo, "ScreenHeight", 960, "Height of output window or fullscreen height"); (*ConfigSetDefaultInt)(l_ConfigVideo, "Rotate", 3, "Rotate screen contents: 0=0 degree, 1=90 degree, 2 = 180 degree, 3=270 degree"); (*ConfigSetDefaultInt)(l_ConfigVideoGlide64mk2, "aspect", 2, "Aspect ratio: -1=Game default, 0=Force 4:3, 1=Force 16:9, 2=Stretch, 3=Original"); (*ConfigSetDefaultBool)(l_ConfigVideoGlide64mk2, "force_polygon_offset", 1, "If true, use polygon offset values specified below"); (*ConfigSetDefaultBool)(l_ConfigVideoGlide64mk2, "polygon_offset_factor", -0.25, "Specifies a scale factor that is used to create a variable depth offset for each polygon"); (*ConfigSetDefaultBool)(l_ConfigVideoGlide64mk2, "polygon_offset_units", -0.25, "Is multiplied by an implementation-specific value to create a constant depth offset"); (*ConfigSetDefaultBool)(l_ConfigVideoGLideN64, "EnableFBEmulation", 0, "Enable frame and|or depth buffer emulation."); (*ConfigSetDefaultBool)(l_ConfigVideoGLideN64, "EnableLegacyBlending", 1, "Do not use shaders to emulate N64 blending modes. Works faster on slow GPU. Can cause glitches."); (*ConfigSetDefaultInt)(l_ConfigVideoGLideN64, "AspectRatio", 0, "Screen aspect ratio (0=stretch, 1=force 4:3, 2=force 16:9, 3=adjust)"); (*ConfigSetDefaultBool)(l_ConfigVideoGLideN64, "EnableFBEmulation", 0, "Enable frame and|or depth buffer emulation."); } else if(strcmp(product_id, "tbj") == 0) { DebugMessage(M64MSG_VERBOSE, "Setting default config values for the Jolla Tablet"); /* Set default values for my Config parameters */ (*ConfigSetDefaultString)(l_ConfigUI, "VideoPlugin", "mupen64plus-video-GLideN64" OSAL_DLL_EXTENSION, "Filename of video plugin"); (*ConfigSetDefaultString)(l_ConfigUI, "AudioPlugin", "mupen64plus-audio-sdl" OSAL_DLL_EXTENSION, "Filename of audio plugin"); (*ConfigSetDefaultString)(l_ConfigUI, "InputPlugin", "mupen64plus-input-sdltouch" OSAL_DLL_EXTENSION, "Filename of input plugin"); (*ConfigSetDefaultString)(l_ConfigUI, "RspPlugin", "mupen64plus-rsp-hle" OSAL_DLL_EXTENSION, "Filename of RSP plugin"); (*ConfigSetDefaultInt)(l_ConfigVideo, "ScreenWidth", 1536, "Width of output window or fullscreen width"); (*ConfigSetDefaultInt)(l_ConfigVideo, "ScreenHeight", 2048, "Height of output window or fullscreen height"); (*ConfigSetDefaultInt)(l_ConfigVideo, "Rotate", 3, "Rotate screen contents: 0=0 degree, 1=90 degree, 2 = 180 degree, 3=270 degree"); (*ConfigSetDefaultInt)(l_ConfigVideoGlide64mk2, "aspect", 2, "Aspect ratio: -1=Game default, 0=Force 4:3, 1=Force 16:9, 2=Stretch, 3=Original"); (*ConfigSetDefaultBool)(l_ConfigVideoGlide64mk2, "force_polygon_offset", 1, "If true, use polygon offset values specified below"); (*ConfigSetDefaultBool)(l_ConfigVideoGlide64mk2, "polygon_offset_factor", -0.25, "Specifies a scale factor that is used to create a variable depth offset for each polygon"); (*ConfigSetDefaultBool)(l_ConfigVideoGlide64mk2, "polygon_offset_units", -0.25, "Is multiplied by an implementation-specific value to create a constant depth offset"); (*ConfigSetDefaultBool)(l_ConfigVideoGLideN64, "EnableFBEmulation", 0, "Enable frame and|or depth buffer emulation."); (*ConfigSetDefaultBool)(l_ConfigVideoGLideN64, "EnableLegacyBlending", 1, "Do not use shaders to emulate N64 blending modes. Works faster on slow GPU. Can cause glitches."); (*ConfigSetDefaultInt)(l_ConfigVideoGLideN64, "AspectRatio", 0, "Screen aspect ratio (0=stretch, 1=force 4:3, 2=force 16:9, 3=adjust)"); (*ConfigSetDefaultBool)(l_ConfigVideoGLideN64, "EnableFBEmulation", 0, "Enable frame and|or depth buffer emulation."); } else if (strcmp(product_id, "hammerhead") == 0) { DebugMessage(M64MSG_VERBOSE, "Setting default config values for the Nexus 5"); /* Set default values for my Config parameters */ (*ConfigSetDefaultString)(l_ConfigUI, "VideoPlugin", "mupen64plus-video-GLideN64" OSAL_DLL_EXTENSION, "Filename of video plugin"); (*ConfigSetDefaultString)(l_ConfigUI, "AudioPlugin", "mupen64plus-audio-sdl" OSAL_DLL_EXTENSION, "Filename of audio plugin"); (*ConfigSetDefaultString)(l_ConfigUI, "InputPlugin", "mupen64plus-input-sdltouch" OSAL_DLL_EXTENSION, "Filename of input plugin"); (*ConfigSetDefaultString)(l_ConfigUI, "RspPlugin", "mupen64plus-rsp-hle" OSAL_DLL_EXTENSION, "Filename of RSP plugin"); (*ConfigSetDefaultInt)(l_ConfigVideo, "ScreenWidth", 1080, "Width of output window or fullscreen width"); (*ConfigSetDefaultInt)(l_ConfigVideo, "ScreenHeight", 1920, "Height of output window or fullscreen height"); (*ConfigSetDefaultInt)(l_ConfigVideo, "Rotate", 3, "Rotate screen contents: 0=0 degree, 1=90 degree, 2 = 180 degree, 3=270 degree"); (*ConfigSetDefaultInt)(l_ConfigVideoGlide64mk2, "aspect", 2, "Aspect ratio: -1=Game default, 0=Force 4:3, 1=Force 16:9, 2=Stretch, 3=Original"); (*ConfigSetDefaultBool)(l_ConfigVideoGlide64mk2, "force_polygon_offset", 1, "If true, use polygon offset values specified below"); (*ConfigSetDefaultBool)(l_ConfigVideoGlide64mk2, "polygon_offset_factor", -0.25, "Specifies a scale factor that is used to create a variable depth offset for each polygon"); (*ConfigSetDefaultBool)(l_ConfigVideoGlide64mk2, "polygon_offset_units", -0.25, "Is multiplied by an implementation-specific value to create a constant depth offset"); (*ConfigSetDefaultBool)(l_ConfigVideoGLideN64, "EnableFBEmulation", 0, "Enable frame and|or depth buffer emulation."); (*ConfigSetDefaultBool)(l_ConfigVideoGLideN64, "EnableLegacyBlending", 1, "Do not use shaders to emulate N64 blending modes. Works faster on slow GPU. Can cause glitches."); (*ConfigSetDefaultInt)(l_ConfigVideoGLideN64, "AspectRatio", 0, "Screen aspect ratio (0=stretch, 1=force 4:3, 2=force 16:9, 3=adjust)"); (*ConfigSetDefaultBool)(l_ConfigVideoGLideN64, "EnableFBEmulation", 0, "Enable frame and|or depth buffer emulation."); } else { DebugMessage(M64MSG_VERBOSE, "Setting default config values."); /* Set default values for my Config parameters */ (*ConfigSetDefaultString)(l_ConfigUI, "VideoPlugin", "mupen64plus-video-GLideN64" OSAL_DLL_EXTENSION, "Filename of video plugin"); (*ConfigSetDefaultString)(l_ConfigUI, "AudioPlugin", "mupen64plus-audio-sdl" OSAL_DLL_EXTENSION, "Filename of audio plugin"); (*ConfigSetDefaultString)(l_ConfigUI, "InputPlugin", "mupen64plus-input-sdltouch" OSAL_DLL_EXTENSION, "Filename of input plugin"); (*ConfigSetDefaultString)(l_ConfigUI, "RspPlugin", "mupen64plus-rsp-hle" OSAL_DLL_EXTENSION, "Filename of RSP plugin"); (*ConfigSetDefaultInt)(l_ConfigVideo, "Rotate", 3, "Rotate screen contents: 0=0 degree, 1=90 degree, 2 = 180 degree, 3=270 degree"); (*ConfigSetDefaultInt)(l_ConfigVideoGlide64mk2, "aspect", 2, "Aspect ratio: -1=Game default, 0=Force 4:3, 1=Force 16:9, 2=Stretch, 3=Original"); (*ConfigSetDefaultBool)(l_ConfigVideoGlide64mk2, "force_polygon_offset", 1, "If true, use polygon offset values specified below"); (*ConfigSetDefaultBool)(l_ConfigVideoGlide64mk2, "polygon_offset_factor", -0.25, "Specifies a scale factor that is used to create a variable depth offset for each polygon"); (*ConfigSetDefaultBool)(l_ConfigVideoGlide64mk2, "polygon_offset_units", -0.25, "Is multiplied by an implementation-specific value to create a constant depth offset"); (*ConfigSetDefaultBool)(l_ConfigVideoGLideN64, "EnableFBEmulation", 0, "Enable frame and|or depth buffer emulation."); (*ConfigSetDefaultBool)(l_ConfigVideoGLideN64, "EnableLegacyBlending", 1, "Do not use shaders to emulate N64 blending modes. Works faster on slow GPU. Can cause glitches."); (*ConfigSetDefaultInt)(l_ConfigVideoGLideN64, "AspectRatio", 0, "Screen aspect ratio (0=stretch, 1=force 4:3, 2=force 16:9, 3=adjust)"); (*ConfigSetDefaultBool)(l_ConfigVideoGLideN64, "EnableFBEmulation", 0, "Enable frame and|or depth buffer emulation."); } if(product_id != NULL) free(product_id); } else { (*ConfigSetDefaultString)(l_ConfigUI, "VideoPlugin", "mupen64plus-video-rice" OSAL_DLL_EXTENSION, "Filename of video plugin"); (*ConfigSetDefaultString)(l_ConfigUI, "AudioPlugin", "mupen64plus-audio-sdl" OSAL_DLL_EXTENSION, "Filename of audio plugin"); (*ConfigSetDefaultString)(l_ConfigUI, "InputPlugin", "mupen64plus-input-sdltouch" OSAL_DLL_EXTENSION, "Filename of input plugin"); (*ConfigSetDefaultString)(l_ConfigUI, "RspPlugin", "mupen64plus-rsp-hle" OSAL_DLL_EXTENSION, "Filename of RSP plugin"); } if (bSaveConfig && ConfigSaveSection != NULL) /* ConfigSaveSection was added in Config API v2.1.0 */ (*ConfigSaveSection)("UI-Console"); return M64ERR_SUCCESS; }
static m64p_error ParseCommandLineFinal(int argc, const char **argv) { int i; /* parse commandline options */ for (i = 1; i < argc; i++) { int ArgsLeft = argc - i - 1; if (strcmp(argv[i], "--noosd") == 0) { int Osd = 0; (*ConfigSetParameter)(l_ConfigCore, "OnScreenDisplay", M64TYPE_BOOL, &Osd); } else if (strcmp(argv[i], "--osd") == 0) { int Osd = 1; (*ConfigSetParameter)(l_ConfigCore, "OnScreenDisplay", M64TYPE_BOOL, &Osd); } else if (strcmp(argv[i], "--fullscreen") == 0) { int Fullscreen = 1; (*ConfigSetParameter)(l_ConfigVideo, "Fullscreen", M64TYPE_BOOL, &Fullscreen); } else if (strcmp(argv[i], "--windowed") == 0) { int Fullscreen = 0; (*ConfigSetParameter)(l_ConfigVideo, "Fullscreen", M64TYPE_BOOL, &Fullscreen); } else if (strcmp(argv[i], "--nospeedlimit") == 0) { int EnableSpeedLimit = 0; if (g_CoreAPIVersion < 0x020001) DebugMessage(M64MSG_WARNING, "core library doesn't support --nospeedlimit"); else { if ((*CoreDoCommand)(M64CMD_CORE_STATE_SET, M64CORE_SPEED_LIMITER, &EnableSpeedLimit) != M64ERR_SUCCESS) DebugMessage(M64MSG_ERROR, "core gave error while setting --nospeedlimit option"); } } else if ((strcmp(argv[i], "--corelib") == 0 || strcmp(argv[i], "--configdir") == 0 || strcmp(argv[i], "--datadir") == 0) && ArgsLeft >= 1) { /* these are handled in ParseCommandLineInitial */ i++; } else if (strcmp(argv[i], "--resolution") == 0 && ArgsLeft >= 1) { const char *res = argv[i+1]; int xres, yres; i++; if (sscanf(res, "%ix%i", &xres, &yres) != 2) DebugMessage(M64MSG_WARNING, "couldn't parse resolution '%s'", res); else { (*ConfigSetParameter)(l_ConfigVideo, "ScreenWidth", M64TYPE_INT, &xres); (*ConfigSetParameter)(l_ConfigVideo, "ScreenHeight", M64TYPE_INT, &yres); } } else if (strcmp(argv[i], "--cheats") == 0 && ArgsLeft >= 1) { if (strcmp(argv[i+1], "all") == 0) l_CheatMode = CHEAT_ALL; else if (strcmp(argv[i+1], "list") == 0) l_CheatMode = CHEAT_SHOW_LIST; else { l_CheatMode = CHEAT_LIST; l_CheatNumList = (char*) argv[i+1]; } i++; } else if (strcmp(argv[i], "--plugindir") == 0 && ArgsLeft >= 1) { g_PluginDir = argv[i+1]; i++; } else if (strcmp(argv[i], "--sshotdir") == 0 && ArgsLeft >= 1) { (*ConfigSetParameter)(l_ConfigCore, "ScreenshotPath", M64TYPE_STRING, argv[i+1]); i++; } else if (strcmp(argv[i], "--gfx") == 0 && ArgsLeft >= 1) { g_GfxPlugin = argv[i+1]; i++; } else if (strcmp(argv[i], "--audio") == 0 && ArgsLeft >= 1) { g_AudioPlugin = argv[i+1]; i++; } else if (strcmp(argv[i], "--input") == 0 && ArgsLeft >= 1) { g_InputPlugin = argv[i+1]; i++; } else if (strcmp(argv[i], "--rsp") == 0 && ArgsLeft >= 1) { g_RspPlugin = argv[i+1]; i++; } else if (strcmp(argv[i], "--emumode") == 0 && ArgsLeft >= 1) { int emumode = atoi(argv[i+1]); i++; if (emumode < 0 || emumode > 2) { DebugMessage(M64MSG_WARNING, "invalid --emumode value '%i'", emumode); continue; } if (emumode == 2 && !(g_CoreCapabilities & M64CAPS_DYNAREC)) { DebugMessage(M64MSG_WARNING, "Emulator core doesn't support Dynamic Recompiler."); emumode = 1; } (*ConfigSetParameter)(l_ConfigCore, "R4300Emulator", M64TYPE_INT, &emumode); } else if (strcmp(argv[i], "--savestate") == 0 && ArgsLeft >= 1) { l_SaveStatePath = argv[i+1]; i++; } else if (strcmp(argv[i], "--testshots") == 0 && ArgsLeft >= 1) { l_TestShotList = ParseNumberList(argv[i+1], NULL); i++; } else if (strcmp(argv[i], "--set") == 0 && ArgsLeft >= 1) { if (SetConfigParameter(argv[i+1]) != 0) return M64ERR_INPUT_INVALID; i++; } else if (strcmp(argv[i], "--debug") == 0) { l_LaunchDebugger = 1; } else if (strcmp(argv[i], "--core-compare-send") == 0) { l_CoreCompareMode = 1; } else if (strcmp(argv[i], "--core-compare-recv") == 0) { l_CoreCompareMode = 2; } else if (strcmp(argv[i], "--nosaveoptions") == 0) { l_SaveOptions = 0; } #define PARSE_GB_CART_PARAM(param, key) \ else if (strcmp(argv[i], param) == 0) \ { \ ConfigSetParameter(l_ConfigTransferPak, key, M64TYPE_STRING, argv[i+1]); \ i++; \ } PARSE_GB_CART_PARAM("--gb-rom-1", "GB-rom-1") PARSE_GB_CART_PARAM("--gb-ram-1", "GB-ram-1") PARSE_GB_CART_PARAM("--gb-rom-2", "GB-rom-2") PARSE_GB_CART_PARAM("--gb-ram-2", "GB-ram-2") PARSE_GB_CART_PARAM("--gb-rom-3", "GB-rom-3") PARSE_GB_CART_PARAM("--gb-ram-3", "GB-ram-3") PARSE_GB_CART_PARAM("--gb-rom-4", "GB-rom-4") PARSE_GB_CART_PARAM("--gb-ram-4", "GB-ram-4") #undef PARSE_GB_CART_PARAM else if (strcmp(argv[i], "--dd-ipl-rom") == 0) { ConfigSetParameter(l_Config64DD, "IPL-ROM", M64TYPE_STRING, argv[i+1]); i++; } else if (strcmp(argv[i], "--dd-disk") == 0) { ConfigSetParameter(l_Config64DD, "Disk", M64TYPE_STRING, argv[i+1]); i++; } else if (ArgsLeft == 0) { /* this is the last arg, it should be a ROM filename */ l_ROMFilepath = argv[i]; return M64ERR_SUCCESS; } else if (strcmp(argv[i], "--verbose") == 0) { g_Verbose = 1; } else { DebugMessage(M64MSG_WARNING, "unrecognized command-line parameter '%s'", argv[i]); } /* continue argv loop */ } /* missing ROM filepath */ DebugMessage(M64MSG_ERROR, "no ROM filepath given"); return M64ERR_INPUT_INVALID; }
static m64p_error OpenConfigurationHandles(void) { float fConfigParamsVersion; int bSaveConfig = 0; m64p_error rval; unsigned int i; /* Open Configuration sections for core library and console User Interface */ rval = (*ConfigOpenSection)("Core", &l_ConfigCore); if (rval != M64ERR_SUCCESS) { DebugMessage(M64MSG_ERROR, "failed to open 'Core' configuration section"); return rval; } rval = (*ConfigOpenSection)("Video-General", &l_ConfigVideo); if (rval != M64ERR_SUCCESS) { DebugMessage(M64MSG_ERROR, "failed to open 'Video-General' configuration section"); return rval; } rval = (*ConfigOpenSection)("Transferpak", &l_ConfigTransferPak); if (rval != M64ERR_SUCCESS) { DebugMessage(M64MSG_ERROR, "failed to open 'Transferpak' configuration section"); return rval; } rval = (*ConfigOpenSection)("64DD", &l_Config64DD); if (rval != M64ERR_SUCCESS) { DebugMessage(M64MSG_ERROR, "failed to open '64DD' configuration section"); return rval; } rval = (*ConfigOpenSection)("UI-Console", &l_ConfigUI); if (rval != M64ERR_SUCCESS) { DebugMessage(M64MSG_ERROR, "failed to open 'UI-Console' configuration section"); return rval; } if ((*ConfigGetParameter)(l_ConfigUI, "Version", M64TYPE_FLOAT, &fConfigParamsVersion, sizeof(float)) != M64ERR_SUCCESS) { DebugMessage(M64MSG_WARNING, "No version number in 'UI-Console' config section. Setting defaults."); (*ConfigDeleteSection)("UI-Console"); (*ConfigOpenSection)("UI-Console", &l_ConfigUI); bSaveConfig = 1; } else if (((int) fConfigParamsVersion) != ((int) CONFIG_PARAM_VERSION)) { DebugMessage(M64MSG_WARNING, "Incompatible version %.2f in 'UI-Console' config section: current is %.2f. Setting defaults.", fConfigParamsVersion, (float) CONFIG_PARAM_VERSION); (*ConfigDeleteSection)("UI-Console"); (*ConfigOpenSection)("UI-Console", &l_ConfigUI); bSaveConfig = 1; } else if ((CONFIG_PARAM_VERSION - fConfigParamsVersion) >= 0.0001f) { /* handle upgrades */ float fVersion = CONFIG_PARAM_VERSION; ConfigSetParameter(l_ConfigUI, "Version", M64TYPE_FLOAT, &fVersion); DebugMessage(M64MSG_INFO, "Updating parameter set version in 'UI-Console' config section to %.2f", fVersion); bSaveConfig = 1; } /* Set default values for my Config parameters */ (*ConfigSetDefaultFloat)(l_ConfigUI, "Version", CONFIG_PARAM_VERSION, "Mupen64Plus UI-Console config parameter set version number. Please don't change this version number."); (*ConfigSetDefaultString)(l_ConfigUI, "PluginDir", OSAL_CURRENT_DIR, "Directory in which to search for plugins"); (*ConfigSetDefaultString)(l_ConfigUI, "VideoPlugin", "mupen64plus-video-rice" OSAL_DLL_EXTENSION, "Filename of video plugin"); (*ConfigSetDefaultString)(l_ConfigUI, "AudioPlugin", "mupen64plus-audio-sdl" OSAL_DLL_EXTENSION, "Filename of audio plugin"); (*ConfigSetDefaultString)(l_ConfigUI, "InputPlugin", "mupen64plus-input-sdl" OSAL_DLL_EXTENSION, "Filename of input plugin"); (*ConfigSetDefaultString)(l_ConfigUI, "RspPlugin", "mupen64plus-rsp-hle" OSAL_DLL_EXTENSION, "Filename of RSP plugin"); for(i = 1; i < 5; ++i) { char key[64]; char desc[2048]; #define SET_DEFAULT_STRING(key_fmt, default_value, desc_fmt) \ do { \ snprintf(key, sizeof(key), key_fmt, i); \ snprintf(desc, sizeof(desc), desc_fmt, i); \ (*ConfigSetDefaultString)(l_ConfigTransferPak, key, default_value, desc); \ } while(0) SET_DEFAULT_STRING("GB-rom-%u", "", "Filename of the GB ROM to load into transferpak %u"); SET_DEFAULT_STRING("GB-ram-%u", "", "Filename of the GB RAM to load into transferpak %u"); #undef SET_DEFAULT_STRING } (*ConfigSetDefaultString)(l_Config64DD, "IPL-ROM", "", "Filename of the 64DD IPL ROM"); (*ConfigSetDefaultString)(l_Config64DD, "Disk", "", "Filename of the disk to load into Disk Drive"); if (bSaveConfig && ConfigSaveSection != NULL) { /* ConfigSaveSection was added in Config API v2.1.0 */ (*ConfigSaveSection)("UI-Console"); (*ConfigSaveSection)("Transferpak"); } return M64ERR_SUCCESS; }