mirror of
https://github.com/tildearrow/furnace.git
synced 2024-11-04 20:05:05 +00:00
split config management
This commit is contained in:
parent
84cf4ec046
commit
840be64314
3 changed files with 164 additions and 142 deletions
|
@ -265,6 +265,7 @@ src/engine/platform/ym2610Interface.cpp
|
||||||
src/engine/blip_buf.c
|
src/engine/blip_buf.c
|
||||||
src/engine/safeReader.cpp
|
src/engine/safeReader.cpp
|
||||||
src/engine/safeWriter.cpp
|
src/engine/safeWriter.cpp
|
||||||
|
src/engine/config.cpp
|
||||||
src/engine/dispatchContainer.cpp
|
src/engine/dispatchContainer.cpp
|
||||||
src/engine/engine.cpp
|
src/engine/engine.cpp
|
||||||
src/engine/fileOps.cpp
|
src/engine/fileOps.cpp
|
||||||
|
|
163
src/engine/config.cpp
Normal file
163
src/engine/config.cpp
Normal file
|
@ -0,0 +1,163 @@
|
||||||
|
/**
|
||||||
|
* Furnace Tracker - multi-system chiptune tracker
|
||||||
|
* Copyright (C) 2021-2022 tildearrow and contributors
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "engine.h"
|
||||||
|
#include "../ta-log.h"
|
||||||
|
#include "../fileutils.h"
|
||||||
|
#include <fmt/printf.h>
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
#define CONFIG_FILE "\\furnace.cfg"
|
||||||
|
#else
|
||||||
|
#define CONFIG_FILE "/furnace.cfg"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
bool DivEngine::saveConf() {
|
||||||
|
configFile=configPath+String(CONFIG_FILE);
|
||||||
|
FILE* f=ps_fopen(configFile.c_str(),"wb");
|
||||||
|
if (f==NULL) {
|
||||||
|
logW("could not write config file! %s\n",strerror(errno));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (auto& i: conf) {
|
||||||
|
String toWrite=fmt::sprintf("%s=%s\n",i.first,i.second);
|
||||||
|
if (fwrite(toWrite.c_str(),1,toWrite.size(),f)!=toWrite.size()) {
|
||||||
|
logW("could not write config file! %s\n",strerror(errno));
|
||||||
|
fclose(f);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose(f);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DivEngine::loadConf() {
|
||||||
|
char line[4096];
|
||||||
|
configFile=configPath+String(CONFIG_FILE);
|
||||||
|
FILE* f=ps_fopen(configFile.c_str(),"rb");
|
||||||
|
if (f==NULL) {
|
||||||
|
logI("creating default config.\n");
|
||||||
|
return saveConf();
|
||||||
|
}
|
||||||
|
logI("loading config.\n");
|
||||||
|
while (!feof(f)) {
|
||||||
|
String key="";
|
||||||
|
String value="";
|
||||||
|
bool keyOrValue=false;
|
||||||
|
if (fgets(line,4095,f)==NULL) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
for (char* i=line; *i; i++) {
|
||||||
|
if (*i=='\n') continue;
|
||||||
|
if (keyOrValue) {
|
||||||
|
value+=*i;
|
||||||
|
} else {
|
||||||
|
if (*i=='=') {
|
||||||
|
keyOrValue=true;
|
||||||
|
} else {
|
||||||
|
key+=*i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (keyOrValue) {
|
||||||
|
conf[key]=value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose(f);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool DivEngine::getConfBool(String key, bool fallback) {
|
||||||
|
try {
|
||||||
|
String val=conf.at(key);
|
||||||
|
if (val=="true") {
|
||||||
|
return true;
|
||||||
|
} else if (val=="false") {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
} catch (std::out_of_range& e) {
|
||||||
|
}
|
||||||
|
return fallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
int DivEngine::getConfInt(String key, int fallback) {
|
||||||
|
try {
|
||||||
|
String val=conf.at(key);
|
||||||
|
int ret=std::stoi(val);
|
||||||
|
return ret;
|
||||||
|
} catch (std::out_of_range& e) {
|
||||||
|
} catch (std::invalid_argument& e) {
|
||||||
|
}
|
||||||
|
return fallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
float DivEngine::getConfFloat(String key, float fallback) {
|
||||||
|
try {
|
||||||
|
String val=conf.at(key);
|
||||||
|
float ret=std::stof(val);
|
||||||
|
return ret;
|
||||||
|
} catch (std::out_of_range& e) {
|
||||||
|
} catch (std::invalid_argument& e) {
|
||||||
|
}
|
||||||
|
return fallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
double DivEngine::getConfDouble(String key, double fallback) {
|
||||||
|
try {
|
||||||
|
String val=conf.at(key);
|
||||||
|
double ret=std::stod(val);
|
||||||
|
return ret;
|
||||||
|
} catch (std::out_of_range& e) {
|
||||||
|
} catch (std::invalid_argument& e) {
|
||||||
|
}
|
||||||
|
return fallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
String DivEngine::getConfString(String key, String fallback) {
|
||||||
|
try {
|
||||||
|
String val=conf.at(key);
|
||||||
|
return val;
|
||||||
|
} catch (std::out_of_range& e) {
|
||||||
|
}
|
||||||
|
return fallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DivEngine::setConf(String key, bool value) {
|
||||||
|
if (value) {
|
||||||
|
conf[key]="true";
|
||||||
|
} else {
|
||||||
|
conf[key]="false";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DivEngine::setConf(String key, int value) {
|
||||||
|
conf[key]=fmt::sprintf("%d",value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DivEngine::setConf(String key, float value) {
|
||||||
|
conf[key]=fmt::sprintf("%f",value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DivEngine::setConf(String key, double value) {
|
||||||
|
conf[key]=fmt::sprintf("%f",value);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DivEngine::setConf(String key, String value) {
|
||||||
|
conf[key]=value;
|
||||||
|
}
|
|
@ -39,8 +39,6 @@
|
||||||
#include <sndfile.h>
|
#include <sndfile.h>
|
||||||
#include <fmt/printf.h>
|
#include <fmt/printf.h>
|
||||||
|
|
||||||
constexpr int MASTER_CLOCK_PREC=(sizeof(void*)==8)?8:0;
|
|
||||||
|
|
||||||
void process(void* u, float** in, float** out, int inChans, int outChans, unsigned int size) {
|
void process(void* u, float** in, float** out, int inChans, int outChans, unsigned int size) {
|
||||||
((DivEngine*)u)->nextBuf(in,out,inChans,outChans,size);
|
((DivEngine*)u)->nextBuf(in,out,inChans,outChans,size);
|
||||||
}
|
}
|
||||||
|
@ -435,146 +433,6 @@ void DivEngine::notifyWaveChange(int wave) {
|
||||||
isBusy.unlock();
|
isBusy.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
#define CONFIG_FILE "\\furnace.cfg"
|
|
||||||
#else
|
|
||||||
#define CONFIG_FILE "/furnace.cfg"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool DivEngine::saveConf() {
|
|
||||||
configFile=configPath+String(CONFIG_FILE);
|
|
||||||
FILE* f=ps_fopen(configFile.c_str(),"wb");
|
|
||||||
if (f==NULL) {
|
|
||||||
logW("could not write config file! %s\n",strerror(errno));
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
for (auto& i: conf) {
|
|
||||||
String toWrite=fmt::sprintf("%s=%s\n",i.first,i.second);
|
|
||||||
if (fwrite(toWrite.c_str(),1,toWrite.size(),f)!=toWrite.size()) {
|
|
||||||
logW("could not write config file! %s\n",strerror(errno));
|
|
||||||
fclose(f);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fclose(f);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DivEngine::loadConf() {
|
|
||||||
char line[4096];
|
|
||||||
configFile=configPath+String(CONFIG_FILE);
|
|
||||||
FILE* f=ps_fopen(configFile.c_str(),"rb");
|
|
||||||
if (f==NULL) {
|
|
||||||
logI("creating default config.\n");
|
|
||||||
return saveConf();
|
|
||||||
}
|
|
||||||
logI("loading config.\n");
|
|
||||||
while (!feof(f)) {
|
|
||||||
String key="";
|
|
||||||
String value="";
|
|
||||||
bool keyOrValue=false;
|
|
||||||
if (fgets(line,4095,f)==NULL) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
for (char* i=line; *i; i++) {
|
|
||||||
if (*i=='\n') continue;
|
|
||||||
if (keyOrValue) {
|
|
||||||
value+=*i;
|
|
||||||
} else {
|
|
||||||
if (*i=='=') {
|
|
||||||
keyOrValue=true;
|
|
||||||
} else {
|
|
||||||
key+=*i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (keyOrValue) {
|
|
||||||
conf[key]=value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fclose(f);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DivEngine::getConfBool(String key, bool fallback) {
|
|
||||||
try {
|
|
||||||
String val=conf.at(key);
|
|
||||||
if (val=="true") {
|
|
||||||
return true;
|
|
||||||
} else if (val=="false") {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} catch (std::out_of_range& e) {
|
|
||||||
}
|
|
||||||
return fallback;
|
|
||||||
}
|
|
||||||
|
|
||||||
int DivEngine::getConfInt(String key, int fallback) {
|
|
||||||
try {
|
|
||||||
String val=conf.at(key);
|
|
||||||
int ret=std::stoi(val);
|
|
||||||
return ret;
|
|
||||||
} catch (std::out_of_range& e) {
|
|
||||||
} catch (std::invalid_argument& e) {
|
|
||||||
}
|
|
||||||
return fallback;
|
|
||||||
}
|
|
||||||
|
|
||||||
float DivEngine::getConfFloat(String key, float fallback) {
|
|
||||||
try {
|
|
||||||
String val=conf.at(key);
|
|
||||||
float ret=std::stof(val);
|
|
||||||
return ret;
|
|
||||||
} catch (std::out_of_range& e) {
|
|
||||||
} catch (std::invalid_argument& e) {
|
|
||||||
}
|
|
||||||
return fallback;
|
|
||||||
}
|
|
||||||
|
|
||||||
double DivEngine::getConfDouble(String key, double fallback) {
|
|
||||||
try {
|
|
||||||
String val=conf.at(key);
|
|
||||||
double ret=std::stod(val);
|
|
||||||
return ret;
|
|
||||||
} catch (std::out_of_range& e) {
|
|
||||||
} catch (std::invalid_argument& e) {
|
|
||||||
}
|
|
||||||
return fallback;
|
|
||||||
}
|
|
||||||
|
|
||||||
String DivEngine::getConfString(String key, String fallback) {
|
|
||||||
try {
|
|
||||||
String val=conf.at(key);
|
|
||||||
return val;
|
|
||||||
} catch (std::out_of_range& e) {
|
|
||||||
}
|
|
||||||
return fallback;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivEngine::setConf(String key, bool value) {
|
|
||||||
if (value) {
|
|
||||||
conf[key]="true";
|
|
||||||
} else {
|
|
||||||
conf[key]="false";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivEngine::setConf(String key, int value) {
|
|
||||||
conf[key]=fmt::sprintf("%d",value);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivEngine::setConf(String key, float value) {
|
|
||||||
conf[key]=fmt::sprintf("%f",value);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivEngine::setConf(String key, double value) {
|
|
||||||
conf[key]=fmt::sprintf("%f",value);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DivEngine::setConf(String key, String value) {
|
|
||||||
conf[key]=value;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ADPCM code attribution: https://wiki.neogeodev.org/index.php?title=ADPCM_codecs
|
// ADPCM code attribution: https://wiki.neogeodev.org/index.php?title=ADPCM_codecs
|
||||||
|
|
||||||
static short adSteps[49]={
|
static short adSteps[49]={
|
||||||
|
|
Loading…
Reference in a new issue