/* ZynAddSubFX - a software synthesizer Config.cpp - Configuration file functions Copyright (C) 2003-2005 Nasca Octavian Paul Author: Nasca Octavian Paul This program is free software; you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation. 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 (version 2 or later) for more details. You should have received a copy of the GNU General Public License (version 2) along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #include #include #include #include #include "Config.h" #include "XMLwrapper.h" using namespace std; Config::Config() {} void Config::init() { maxstringsize = MAX_STRING_SIZE; //for ui //defaults cfg.SampleRate = 44100; cfg.SoundBufferSize = 256; cfg.OscilSize = 1024; cfg.SwapStereo = 0; cfg.LinuxOSSWaveOutDev = new char[MAX_STRING_SIZE]; snprintf(cfg.LinuxOSSWaveOutDev, MAX_STRING_SIZE, "/dev/dsp"); cfg.LinuxOSSSeqInDev = new char[MAX_STRING_SIZE]; snprintf(cfg.LinuxOSSSeqInDev, MAX_STRING_SIZE, "/dev/sequencer"); cfg.DumpFile = "zynaddsubfx_dump.txt"; cfg.WindowsWaveOutId = 0; cfg.WindowsMidiInId = 0; cfg.BankUIAutoClose = 0; cfg.DumpNotesToFile = 0; cfg.DumpAppend = 1; cfg.GzipCompression = 3; cfg.Interpolation = 0; cfg.CheckPADsynth = 1; cfg.IgnoreProgramChange = 0; cfg.UserInterfaceMode = 0; cfg.VirKeybLayout = 1; winwavemax = 1; winmidimax = 1; //try to find out how many input midi devices are there winmididevices = new winmidionedevice[winmidimax]; for(int i = 0; i < winmidimax; ++i) { winmididevices[i].name = new char[MAX_STRING_SIZE]; for(int j = 0; j < MAX_STRING_SIZE; ++j) winmididevices[i].name[j] = '\0'; } //get the midi input devices name cfg.currentBankDir = "./testbnk"; char filename[MAX_STRING_SIZE]; getConfigFileName(filename, MAX_STRING_SIZE); readConfig(filename); if(cfg.bankRootDirList[0].empty()) { //banks cfg.bankRootDirList[0] = "~/banks"; cfg.bankRootDirList[1] = "./"; cfg.bankRootDirList[2] = "/usr/share/zynaddsubfx/banks"; cfg.bankRootDirList[3] = "/usr/local/share/zynaddsubfx/banks"; cfg.bankRootDirList[4] = "../banks"; cfg.bankRootDirList[5] = "banks"; } if(cfg.presetsDirList[0].empty()) { //presets cfg.presetsDirList[0] = "./"; cfg.presetsDirList[1] = "../presets"; cfg.presetsDirList[2] = "presets"; cfg.presetsDirList[3] = "/usr/share/zynaddsubfx/presets"; cfg.presetsDirList[4] = "/usr/local/share/zynaddsubfx/presets"; } cfg.LinuxALSAaudioDev = "default"; cfg.nameTag = ""; } Config::~Config() { delete [] cfg.LinuxOSSWaveOutDev; delete [] cfg.LinuxOSSSeqInDev; for(int i = 0; i < winmidimax; ++i) delete [] winmididevices[i].name; delete [] winmididevices; } void Config::save() { char filename[MAX_STRING_SIZE]; getConfigFileName(filename, MAX_STRING_SIZE); saveConfig(filename); } void Config::clearbankrootdirlist() { for(int i = 0; i < MAX_BANK_ROOT_DIRS; ++i) cfg.bankRootDirList[i].clear(); } void Config::clearpresetsdirlist() { for(int i = 0; i < MAX_BANK_ROOT_DIRS; ++i) cfg.presetsDirList[i].clear(); } void Config::readConfig(const char *filename) { XMLwrapper xmlcfg; if(xmlcfg.loadXMLfile(filename) < 0) return; if(xmlcfg.enterbranch("CONFIGURATION")) { cfg.SampleRate = xmlcfg.getpar("sample_rate", cfg.SampleRate, 4000, 1024000); cfg.SoundBufferSize = xmlcfg.getpar("sound_buffer_size", cfg.SoundBufferSize, 16, 8192); cfg.OscilSize = xmlcfg.getpar("oscil_size", cfg.OscilSize, MAX_AD_HARMONICS * 2, 131072); cfg.SwapStereo = xmlcfg.getpar("swap_stereo", cfg.SwapStereo, 0, 1); cfg.BankUIAutoClose = xmlcfg.getpar("bank_window_auto_close", cfg.BankUIAutoClose, 0, 1); cfg.DumpNotesToFile = xmlcfg.getpar("dump_notes_to_file", cfg.DumpNotesToFile, 0, 1); cfg.DumpAppend = xmlcfg.getpar("dump_append", cfg.DumpAppend, 0, 1); cfg.DumpFile = xmlcfg.getparstr("dump_file", ""); cfg.GzipCompression = xmlcfg.getpar("gzip_compression", cfg.GzipCompression, 0, 9); cfg.currentBankDir = xmlcfg.getparstr("bank_current", ""); cfg.Interpolation = xmlcfg.getpar("interpolation", cfg.Interpolation, 0, 1); cfg.CheckPADsynth = xmlcfg.getpar("check_pad_synth", cfg.CheckPADsynth, 0, 1); cfg.IgnoreProgramChange = xmlcfg.getpar("ignore_program_change", cfg.IgnoreProgramChange, 0, 1); cfg.UserInterfaceMode = xmlcfg.getpar("user_interface_mode", cfg.UserInterfaceMode, 0, 2); cfg.VirKeybLayout = xmlcfg.getpar("virtual_keyboard_layout", cfg.VirKeybLayout, 0, 10); //get bankroot dirs for(int i = 0; i < MAX_BANK_ROOT_DIRS; ++i) if(xmlcfg.enterbranch("BANKROOT", i)) { cfg.bankRootDirList[i] = xmlcfg.getparstr("bank_root", ""); xmlcfg.exitbranch(); } //get preset root dirs for(int i = 0; i < MAX_BANK_ROOT_DIRS; ++i) if(xmlcfg.enterbranch("PRESETSROOT", i)) { cfg.presetsDirList[i] = xmlcfg.getparstr("presets_root", ""); xmlcfg.exitbranch(); } //linux stuff xmlcfg.getparstr("linux_oss_wave_out_dev", cfg.LinuxOSSWaveOutDev, MAX_STRING_SIZE); xmlcfg.getparstr("linux_oss_seq_in_dev", cfg.LinuxOSSSeqInDev, MAX_STRING_SIZE); //windows stuff cfg.WindowsWaveOutId = xmlcfg.getpar("windows_wave_out_id", cfg.WindowsWaveOutId, 0, winwavemax); cfg.WindowsMidiInId = xmlcfg.getpar("windows_midi_in_id", cfg.WindowsMidiInId, 0, winmidimax); xmlcfg.exitbranch(); } cfg.OscilSize = (int) powf(2, ceil(logf(cfg.OscilSize - 1.0f) / logf(2.0f))); } void Config::saveConfig(const char *filename) { XMLwrapper *xmlcfg = new XMLwrapper(); xmlcfg->beginbranch("CONFIGURATION"); xmlcfg->addpar("sample_rate", cfg.SampleRate); xmlcfg->addpar("sound_buffer_size", cfg.SoundBufferSize); xmlcfg->addpar("oscil_size", cfg.OscilSize); xmlcfg->addpar("swap_stereo", cfg.SwapStereo); xmlcfg->addpar("bank_window_auto_close", cfg.BankUIAutoClose); xmlcfg->addpar("dump_notes_to_file", cfg.DumpNotesToFile); xmlcfg->addpar("dump_append", cfg.DumpAppend); xmlcfg->addparstr("dump_file", cfg.DumpFile); xmlcfg->addpar("gzip_compression", cfg.GzipCompression); xmlcfg->addpar("check_pad_synth", cfg.CheckPADsynth); xmlcfg->addpar("ignore_program_change", cfg.IgnoreProgramChange); xmlcfg->addparstr("bank_current", cfg.currentBankDir); xmlcfg->addpar("user_interface_mode", cfg.UserInterfaceMode); xmlcfg->addpar("virtual_keyboard_layout", cfg.VirKeybLayout); for(int i = 0; i < MAX_BANK_ROOT_DIRS; ++i) if(!cfg.bankRootDirList[i].empty()) { xmlcfg->beginbranch("BANKROOT", i); xmlcfg->addparstr("bank_root", cfg.bankRootDirList[i]); xmlcfg->endbranch(); } for(int i = 0; i < MAX_BANK_ROOT_DIRS; ++i) if(!cfg.presetsDirList[i].empty()) { xmlcfg->beginbranch("PRESETSROOT", i); xmlcfg->addparstr("presets_root", cfg.presetsDirList[i]); xmlcfg->endbranch(); } xmlcfg->addpar("interpolation", cfg.Interpolation); //linux stuff xmlcfg->addparstr("linux_oss_wave_out_dev", cfg.LinuxOSSWaveOutDev); xmlcfg->addparstr("linux_oss_seq_in_dev", cfg.LinuxOSSSeqInDev); //windows stuff xmlcfg->addpar("windows_wave_out_id", cfg.WindowsWaveOutId); xmlcfg->addpar("windows_midi_in_id", cfg.WindowsMidiInId); xmlcfg->endbranch(); int tmp = cfg.GzipCompression; cfg.GzipCompression = 0; xmlcfg->saveXMLfile(filename); cfg.GzipCompression = tmp; delete (xmlcfg); } void Config::getConfigFileName(char *name, int namesize) { name[0] = 0; snprintf(name, namesize, "%s%s", getenv("HOME"), "/.zynaddsubfxXML.cfg"); }