home *** CD-ROM | disk | FTP | other *** search
/ Chip 2004 November / CMCD1104.ISO / Software / Complet / ZynAddFX / Setup_ZynAddSubFX-2.1.1.exe / Config.C < prev    next >
Encoding:
C/C++ Source or Header  |  2004-10-01  |  9.8 KB  |  322 lines

  1. /*
  2.   ZynAddSubFX - a software synthesizer
  3.  
  4.   Config.C - Configuration file functions
  5.   Copyright (C) 2003-2004 Nasca Octavian Paul
  6.   Author: Nasca Octavian Paul
  7.  
  8.   This program is free software; you can redistribute it and/or modify
  9.   it under the terms of version 2 of the GNU General Public License 
  10.   as published by the Free Software Foundation.
  11.  
  12.   This program is distributed in the hope that it will be useful,
  13.   but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.   GNU General Public License (version 2) for more details.
  16.  
  17.   You should have received a copy of the GNU General Public License (version 2)
  18.   along with this program; if not, write to the Free Software Foundation,
  19.   Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  20.  
  21. */
  22. #include <stdio.h>
  23. #include <math.h>
  24. #include <stdlib.h>
  25. #include <string.h>
  26.  
  27. #ifdef OS_WINDOWS
  28. #include <windows.h>
  29. #include <mmsystem.h>
  30. #endif
  31.  
  32. #include "Config.h"
  33. #include "XMLwrapper.h"
  34.  
  35. Config::Config(){
  36.     maxstringsize=MAX_STRING_SIZE;//for ui
  37.     //defaults
  38.     cfg.SampleRate=44100;
  39.     cfg.SoundBufferSize=256;
  40.     cfg.OscilSize=512;
  41.     cfg.SwapStereo=0;
  42.     
  43.     cfg.LinuxOSSWaveOutDev=new char[MAX_STRING_SIZE];
  44.     snprintf(cfg.LinuxOSSWaveOutDev,MAX_STRING_SIZE,"/dev/dsp");
  45.     cfg.LinuxOSSSeqInDev=new char[MAX_STRING_SIZE];
  46.     snprintf(cfg.LinuxOSSSeqInDev,MAX_STRING_SIZE,"/dev/sequencer");
  47.  
  48.     cfg.DumpFile=new char[MAX_STRING_SIZE];
  49.     snprintf(cfg.DumpFile,MAX_STRING_SIZE,"zynaddsubfx_dump.txt");
  50.  
  51.     cfg.WindowsWaveOutId=0;
  52.     cfg.WindowsMidiInId=0;
  53.     
  54.     cfg.BankUIAutoClose=0;
  55.     cfg.DumpNotesToFile=0;
  56.     cfg.DumpAppend=1;
  57.  
  58.     cfg.GzipCompression=3;
  59.  
  60.     cfg.Interpolation=0;
  61.     cfg.CheckPADsynth=1;
  62.  
  63.     cfg.UserInterfaceMode=0;
  64.  
  65.     winwavemax=1;winmidimax=1;
  66. //try to find out how many input midi devices are there
  67. #ifdef WINMIDIIN
  68.     winmidimax=midiInGetNumDevs();
  69.     if (winmidimax==0) winmidimax=1;
  70. #endif
  71.     winmididevices=new winmidionedevice[winmidimax];
  72.     for (int i=0;i<winmidimax;i++) {
  73.     winmididevices[i].name=new char[MAX_STRING_SIZE];
  74.     for (int j=0;j<MAX_STRING_SIZE;j++) winmididevices[i].name[j]='\0';
  75.     };
  76.  
  77. //get the midi input devices name
  78. #ifdef WINMIDIIN
  79.     MIDIINCAPS midiincaps;
  80.     for (int i=0;i<winmidimax;i++){
  81.     if (! midiInGetDevCaps(i,&midiincaps,sizeof(MIDIINCAPS)))
  82.         snprintf(winmididevices[i].name,MAX_STRING_SIZE,"%s",midiincaps.szPname);
  83.     };
  84. #endif
  85.     for (int i=0;i<MAX_BANK_ROOT_DIRS;i++) cfg.bankRootDirList[i]=NULL;
  86.     cfg.currentBankDir=new char[MAX_STRING_SIZE];
  87.     sprintf(cfg.currentBankDir,"./testbnk");
  88.     
  89.     for (int i=0;i<MAX_BANK_ROOT_DIRS;i++) cfg.presetsDirList[i]=NULL;
  90.     
  91.     char filename[MAX_STRING_SIZE];
  92.     getConfigFileName(filename,MAX_STRING_SIZE);
  93.     readConfig(filename);
  94.     if (cfg.bankRootDirList[0]==NULL){
  95. #if defined(OS_LINUX)
  96.     //banks
  97.         cfg.bankRootDirList[0]=new char[MAX_STRING_SIZE];
  98.     sprintf(cfg.bankRootDirList[0],"~/banks");
  99.  
  100.     cfg.bankRootDirList[1]=new char[MAX_STRING_SIZE];
  101.     sprintf(cfg.bankRootDirList[1],"./");
  102.  
  103.         cfg.bankRootDirList[2]=new char[MAX_STRING_SIZE];
  104.     sprintf(cfg.bankRootDirList[2],"/usr/share/zynaddsubfx/banks");
  105.  
  106.     cfg.bankRootDirList[3]=new char[MAX_STRING_SIZE];
  107.     sprintf(cfg.bankRootDirList[3],"/usr/local/share/zynaddsubfx/banks");
  108.  
  109.     cfg.bankRootDirList[4]=new char[MAX_STRING_SIZE];
  110.     sprintf(cfg.bankRootDirList[4],"../banks");
  111.  
  112.     cfg.bankRootDirList[5]=new char[MAX_STRING_SIZE];
  113.     sprintf(cfg.bankRootDirList[5],"banks");
  114.     
  115. #else
  116.     //banks
  117.     cfg.bankRootDirList[0]=new char[MAX_STRING_SIZE];
  118.     sprintf(cfg.bankRootDirList[0],"./");
  119.  
  120. #ifdef VSTAUDIOOUT
  121.     cfg.bankRootDirList[1]=new char[MAX_STRING_SIZE];
  122.     sprintf(cfg.bankRootDirList[1],"c:/Program Files/ZynAddSubFX/banks");
  123. #else
  124.     cfg.bankRootDirList[1]=new char[MAX_STRING_SIZE];
  125.     sprintf(cfg.bankRootDirList[1],"../banks");
  126. #endif
  127.     cfg.bankRootDirList[2]=new char[MAX_STRING_SIZE];
  128.     sprintf(cfg.bankRootDirList[2],"banks");
  129.     
  130. #endif
  131.     };
  132.  
  133.     if (cfg.presetsDirList[0]==NULL){
  134. #if defined(OS_LINUX)
  135.     //presets
  136.     cfg.presetsDirList[0]=new char[MAX_STRING_SIZE];
  137.     sprintf(cfg.presetsDirList[0],"./");
  138.  
  139.     cfg.presetsDirList[1]=new char[MAX_STRING_SIZE];
  140.     sprintf(cfg.presetsDirList[1],"../presets");
  141.  
  142.     cfg.presetsDirList[2]=new char[MAX_STRING_SIZE];
  143.     sprintf(cfg.presetsDirList[2],"presets");
  144.     
  145.         cfg.presetsDirList[3]=new char[MAX_STRING_SIZE];
  146.     sprintf(cfg.presetsDirList[3],"/usr/share/zynaddsubfx/presets");
  147.  
  148.     cfg.presetsDirList[4]=new char[MAX_STRING_SIZE];
  149.     sprintf(cfg.presetsDirList[4],"/usr/local/share/zynaddsubfx/presets");
  150.     
  151. #else
  152.     //presets
  153.     cfg.presetsDirList[0]=new char[MAX_STRING_SIZE];
  154.     sprintf(cfg.presetsDirList[0],"./");
  155.  
  156. #ifdef VSTAUDIOOUT
  157.     cfg.presetsDirList[1]=new char[MAX_STRING_SIZE];
  158.     sprintf(cfg.presetsDirList[1],"c:/Program Files/ZynAddSubFX/presets");
  159. #else
  160.     cfg.presetsDirList[1]=new char[MAX_STRING_SIZE];
  161.     sprintf(cfg.presetsDirList[1],"../presets");
  162. #endif
  163.  
  164.     cfg.presetsDirList[2]=new char[MAX_STRING_SIZE];
  165.     sprintf(cfg.presetsDirList[2],"presets");
  166. #endif
  167.     };
  168.  
  169. };
  170.  
  171. Config::~Config(){
  172.     char filename[MAX_STRING_SIZE];
  173.     getConfigFileName(filename,MAX_STRING_SIZE);
  174.     saveConfig(filename);
  175.  
  176.     delete(cfg.LinuxOSSWaveOutDev);
  177.     delete(cfg.LinuxOSSSeqInDev);
  178.     delete(cfg.DumpFile);
  179.  
  180.     for (int i=0;i<winmidimax;i++) delete (winmididevices[i].name);
  181.     delete(winmididevices);
  182. };
  183.  
  184. void Config::clearbankrootdirlist(){
  185.     for (int i=0;i<MAX_BANK_ROOT_DIRS;i++) {
  186.     if (cfg.bankRootDirList[i]==NULL) delete(cfg.bankRootDirList[i]);
  187.     cfg.bankRootDirList[i]=NULL;
  188.     };
  189. };
  190.  
  191. void Config::clearpresetsdirlist(){
  192.     for (int i=0;i<MAX_BANK_ROOT_DIRS;i++) {
  193.     if (cfg.presetsDirList[i]==NULL) delete(cfg.presetsDirList[i]);
  194.     cfg.presetsDirList[i]=NULL;
  195.     };
  196. };
  197.  
  198. void Config::readConfig(char *filename){
  199.     XMLwrapper *xmlcfg=new XMLwrapper();
  200.     if (xmlcfg->loadXMLfile(filename)<0) return;
  201.     if (xmlcfg->enterbranch("CONFIGURATION")){
  202.     cfg.SampleRate=xmlcfg->getpar("sample_rate",cfg.SampleRate,4000,1024000);
  203.     cfg.SoundBufferSize=xmlcfg->getpar("sound_buffer_size",cfg.SoundBufferSize,16,8192);
  204.     cfg.OscilSize=xmlcfg->getpar("oscil_size",cfg.OscilSize,MAX_AD_HARMONICS*2,131072);
  205.     cfg.SwapStereo=xmlcfg->getpar("swap_stereo",cfg.SwapStereo,0,1);
  206.     cfg.BankUIAutoClose=xmlcfg->getpar("bank_window_auto_close",cfg.BankUIAutoClose,0,1);
  207.  
  208.     cfg.DumpNotesToFile=xmlcfg->getpar("dump_notes_to_file",cfg.DumpNotesToFile,0,1);
  209.     cfg.DumpAppend=xmlcfg->getpar("dump_append",cfg.DumpAppend,0,1);
  210.     xmlcfg->getparstr("dump_file",cfg.DumpFile,MAX_STRING_SIZE);
  211.  
  212.     cfg.GzipCompression=xmlcfg->getpar("gzip_compression",cfg.GzipCompression,0,9);
  213.  
  214.     xmlcfg->getparstr("bank_current",cfg.currentBankDir,MAX_STRING_SIZE);
  215.     cfg.Interpolation=xmlcfg->getpar("interpolation",cfg.Interpolation,0,1);
  216.  
  217.     cfg.CheckPADsynth=xmlcfg->getpar("check_pad_synth",cfg.CheckPADsynth,0,1);
  218.  
  219.  
  220.     cfg.UserInterfaceMode=xmlcfg->getpar("user_interface_mode",cfg.UserInterfaceMode,0,2);
  221.  
  222.     //get bankroot dirs
  223.     for (int i=0;i<MAX_BANK_ROOT_DIRS;i++){
  224.         if (xmlcfg->enterbranch("BANKROOT",i)){
  225.           cfg.bankRootDirList[i]=new char[MAX_STRING_SIZE];
  226.           xmlcfg->getparstr("bank_root",cfg.bankRootDirList[i],MAX_STRING_SIZE);
  227.          xmlcfg->exitbranch();
  228.         };
  229.     };
  230.  
  231.     //get preset root dirs
  232.     for (int i=0;i<MAX_BANK_ROOT_DIRS;i++){
  233.         if (xmlcfg->enterbranch("PRESETSROOT",i)){
  234.           cfg.presetsDirList[i]=new char[MAX_STRING_SIZE];
  235.           xmlcfg->getparstr("presets_root",cfg.presetsDirList[i],MAX_STRING_SIZE);
  236.          xmlcfg->exitbranch();
  237.         };
  238.     };
  239.  
  240.     //linux stuff
  241.     xmlcfg->getparstr("linux_oss_wave_out_dev",cfg.LinuxOSSWaveOutDev,MAX_STRING_SIZE);
  242.     xmlcfg->getparstr("linux_oss_seq_in_dev",cfg.LinuxOSSSeqInDev,MAX_STRING_SIZE);
  243.     
  244.     //windows stuff
  245.     cfg.WindowsWaveOutId=xmlcfg->getpar("windows_wave_out_id",cfg.WindowsWaveOutId,0,winwavemax);
  246.     cfg.WindowsMidiInId=xmlcfg->getpar("windows_midi_in_id",cfg.WindowsMidiInId,0,winmidimax);
  247.  
  248.  
  249.  
  250.       xmlcfg->exitbranch();
  251.     };
  252.     delete(xmlcfg);
  253.  
  254.     cfg.OscilSize=(int) pow(2,ceil(log (cfg.OscilSize-1.0)/log(2.0)));
  255.  
  256. };
  257.  
  258. void Config::saveConfig(char *filename){
  259.     XMLwrapper *xmlcfg=new XMLwrapper();
  260.     
  261.     xmlcfg->beginbranch("CONFIGURATION");    
  262.     
  263.     xmlcfg->addpar("sample_rate",cfg.SampleRate);
  264.     xmlcfg->addpar("sound_buffer_size",cfg.SoundBufferSize);
  265.     xmlcfg->addpar("oscil_size",cfg.OscilSize);
  266.     xmlcfg->addpar("swap_stereo",cfg.SwapStereo);
  267.     xmlcfg->addpar("bank_window_auto_close",cfg.BankUIAutoClose);
  268.  
  269.     xmlcfg->addpar("dump_notes_to_file",cfg.DumpNotesToFile);
  270.     xmlcfg->addpar("dump_append",cfg.DumpAppend);
  271.     xmlcfg->addparstr("dump_file",cfg.DumpFile);
  272.  
  273.     xmlcfg->addpar("gzip_compression",cfg.GzipCompression);
  274.  
  275.     xmlcfg->addpar("check_pad_synth",cfg.CheckPADsynth);
  276.  
  277.     xmlcfg->addparstr("bank_current",cfg.currentBankDir);
  278.  
  279.     xmlcfg->addpar("user_interface_mode",cfg.UserInterfaceMode);
  280.     for (int i=0;i<MAX_BANK_ROOT_DIRS;i++) if (cfg.bankRootDirList[i]!=NULL) {
  281.         xmlcfg->beginbranch("BANKROOT",i);
  282.          xmlcfg->addparstr("bank_root",cfg.bankRootDirList[i]);
  283.         xmlcfg->endbranch();
  284.     };
  285.  
  286.     for (int i=0;i<MAX_BANK_ROOT_DIRS;i++) if (cfg.presetsDirList[i]!=NULL) {
  287.         xmlcfg->beginbranch("PRESETSROOT",i);
  288.          xmlcfg->addparstr("presets_root",cfg.presetsDirList[i]);
  289.         xmlcfg->endbranch();
  290.     };
  291.  
  292.     xmlcfg->addpar("interpolation",cfg.Interpolation);
  293.  
  294.     //linux stuff
  295.     xmlcfg->addparstr("linux_oss_wave_out_dev",cfg.LinuxOSSWaveOutDev);
  296.     xmlcfg->addparstr("linux_oss_seq_in_dev",cfg.LinuxOSSSeqInDev);
  297.     
  298.     //windows stuff
  299.     xmlcfg->addpar("windows_wave_out_id",cfg.WindowsWaveOutId);
  300.     xmlcfg->addpar("windows_midi_in_id",cfg.WindowsMidiInId);
  301.  
  302.     xmlcfg->endbranch();
  303.     
  304.     int tmp=cfg.GzipCompression;
  305.     cfg.GzipCompression=0;
  306.     xmlcfg->saveXMLfile(filename);
  307.     cfg.GzipCompression=tmp;
  308.     
  309.     delete(xmlcfg);
  310. };
  311.  
  312. void Config::getConfigFileName(char *name, int namesize){
  313.     name[0]=0;
  314. #ifdef OS_LINUX
  315.     snprintf(name,namesize,"%s%s",getenv("HOME"),"/.zynaddsubfxXML.cfg");
  316. #else
  317.     snprintf(name,namesize,"%s","zynaddsubfxXML.cfg");
  318. #endif
  319.  
  320. };
  321.  
  322.