commit 95ee486b64fef423a81037bf49de9f10fca08677
parent 6276491ccc665f4aa2f53e04f939b6e75d6191bf
Author: paulnasca <paulnasca>
Date: Sat, 14 Feb 2004 21:44:43 +0000
*** empty log message ***
Diffstat:
11 files changed, 145 insertions(+), 56 deletions(-)
diff --git a/ChangeLog b/ChangeLog
@@ -538,4 +538,4 @@
- Corectate cateva erori la incarcarea XML-ului
- frecventa LFO-ul de la instrumente are valoare reala intre 0..1
- corectata eroarea care facea ca functia de rezonanta sa fie trasata incorect
-
+ - adaugata compresie gzip la fisiere si decompresie automata la incarcare (folosesc biblioteca zlib)
diff --git a/README.txt b/README.txt
@@ -32,6 +32,7 @@ Requirements:
- FFTW 2.x.x (tested with fftw 2.0.5, 2.1.3) - necesary for
Fast Fourier computations
- MXML library from http://www.easysw.com/~mike/mxml/
+ - zlib library from http://www.zlib.org - this exists in most linux distributions
- (for Linux) OpenSoundSystem (OSS) (if you don't have ALSA, only)
- (for Windows) pthreads, portaudio
diff --git a/src/Makefile b/src/Makefile
@@ -9,7 +9,7 @@ endif
CXXFLAGS += -DOS_$(OS_PORT) -D$(MIDIIN)MIDIIN -D$(AUDIOOUT)AUDIOOUT -DFFTW_VERSION_$(FFTW_VERSION) -DASM_F2I_$(ASM_F2I) `fltk-config --cflags`
export CXXFLAGS
-LIBS= -lm `fltk-config --ldflags` -lmxml
+LIBS= -lm `fltk-config --ldflags` -lmxml -lz
ifeq ($(FFTW_VERSION),2)
LIBS += -lrfftw -lfftw
diff --git a/src/Misc/Config.C b/src/Misc/Config.C
@@ -55,6 +55,8 @@ Config::Config(){
cfg.DumpNotesToFile=0;
cfg.DumpAppend=1;
+ cfg.GzipCompression=3;
+
winwavemax=1;winmidimax=1;
//try to find out how many input midi devices are there
#ifdef WINMIDIIN
@@ -81,6 +83,7 @@ Config::Config(){
readConfig(filename);
ui.showinstrumentinfo=0;
+
};
Config::~Config(){
@@ -166,6 +169,10 @@ void Config::readConfig(char *filename){
if (strlen(val)<2) continue;
snprintf(cfg.DumpFile,MAX_STRING_SIZE,val);
};
+
+ if (strstr(par,"GZIP_COMPRESSION")!=NULL){
+ cfg.GzipCompression=intvalue;
+ };
};
fclose(file);
@@ -181,6 +188,9 @@ void Config::readConfig(char *filename){
if (cfg.WindowsWaveOutId>=winwavemax) cfg.WindowsWaveOutId=0;
if (cfg.WindowsMidiInId>=winmidimax) cfg.WindowsMidiInId=0;
#endif
+ if (cfg.GzipCompression<0) cfg.GzipCompression=0;
+ else if (cfg.GzipCompression>9) cfg.GzipCompression=9;
+
};
void Config::saveConfig(char *filename){
@@ -198,6 +208,8 @@ void Config::saveConfig(char *filename){
fprintf(file,"DUMP_APPEND = %d\n",cfg.DumpAppend);
fprintf(file,"DUMP_FILE = %s\n",cfg.DumpFile);
+ fprintf(file,"GZIP_COMPRESSION = %d\n",cfg.GzipCompression);
+
fprintf(file,"#Linux\n");
fprintf(file,"LINUX_OSS_WAVE_OUT_DEV = %s\n",cfg.LinuxOSSWaveOutDev);
fprintf(file,"LINUX_OSS_SEQ_IN_DEV = %s\n",cfg.LinuxOSSSeqInDev);
diff --git a/src/Misc/Config.h b/src/Misc/Config.h
@@ -34,6 +34,7 @@ class Config{
int WindowsWaveOutId,WindowsMidiInId;
int BankUIAutoClose;
int DumpNotesToFile,DumpAppend;
+ int GzipCompression;
char *DumpFile;
} cfg;
int winwavemax,winmidimax;//number of wave/midi devices on Windows
diff --git a/src/Misc/Master.C b/src/Misc/Master.C
@@ -790,7 +790,7 @@ int Master::saveXML(char *filename){
add2XML(xml);
xml->endbranch();
- xml->saveXMLfile(filename,0);
+ xml->saveXMLfile(filename);
delete (xml);
return(0);
};
diff --git a/src/Misc/Part.C b/src/Misc/Part.C
@@ -1026,7 +1026,7 @@ int Part::saveXML(char *filename){
add2XMLinstrument(xml);
xml->endbranch();
- xml->saveXMLfile(filename,0);
+ xml->saveXMLfile(filename);
delete (xml);
return(0);
};
diff --git a/src/Misc/XMLwrapper.C b/src/Misc/XMLwrapper.C
@@ -23,8 +23,10 @@
#include "XMLwrapper.h"
#include <stdio.h>
#include <stdlib.h>
+#include <zlib.h>
#include "../globals.h"
+#include "Util.h"
int XMLwrapper_whitespace_callback(mxml_node_t *node,int where){
const char *name=node->value.element.name;
@@ -77,23 +79,49 @@ XMLwrapper::~XMLwrapper(){
/* SAVE XML members */
-int XMLwrapper::saveXMLfile(char *filename,int compression){
- FILE *file;
- file=fopen(filename,"w");
- if (file==NULL) return(-1);
- mxmlSaveFile(tree,file,XMLwrapper_whitespace_callback);
+int XMLwrapper::saveXMLfile(char *filename){
+ char *xmldata=mxmlSaveAllocString(tree,XMLwrapper_whitespace_callback);
+ if (xmldata==NULL) return(-2);
+
+ int compression=config.cfg.GzipCompression;
+
+ int fnsize=strlen(filename)+100;
+ char *filenamenew=new char [fnsize];
+ if (compression) snprintf(filenamenew,fnsize,"%sz",filename);
+ else snprintf(filenamenew,fnsize,"%s",filename);
+
+ int result=dosavefile(filenamenew,compression,xmldata);
- fclose(file);
+ delete(filenamenew);
+ delete(xmldata);
+ return(result);
+};
+
+int XMLwrapper::dosavefile(char *filename,int compression,char *xmldata){
+ if (compression==0){
+ FILE *file;
+ file=fopen(filename,"w");
+ if (file==NULL) return(-1);
+ fputs(xmldata,file);
+ fclose(file);
+ } else {
+ if (compression>9) compression=9;
+ if (compression<1) compression=1;
+ char options[10];
+ snprintf(options,10,"wb%d",compression);
+
+ gzFile gzfile;
+ gzfile=gzopen(filename,options);
+ if (gzfile==NULL) return(-1);
+ gzputs(gzfile,xmldata);
+ gzclose(gzfile);
+ };
-/* //test
- printf("\n\n");
- mxmlSaveFile(tree,stdout,XMLwrapper_whitespace_callback);
- printf("\n\n");
-*/
return(0);
};
+
void XMLwrapper::addpar(char *name,int val){
addparams2("par","name",name,"value",int2str(val));
};
@@ -141,35 +169,70 @@ int XMLwrapper::loadXMLfile(const char *filename){
stackpos=0;
+
+ char *xmldata=doloadfile(filename);
+ if (xmldata==NULL) return(-1);//the file could not be loaded or uncompressed
- FILE *file=fopen(filename,"r");
- if (file==NULL) return(-1);
-
- root=tree=mxmlLoadFile(NULL,file,MXML_OPAQUE_CALLBACK);
- fclose(file);
-
- if (tree==NULL) return(-1);//this is not XML
+ root=tree=mxmlLoadString(NULL,xmldata,MXML_OPAQUE_CALLBACK);
+
+ delete(xmldata);
+
+ if (tree==NULL) return(-2);//this is not XML
-// if (strcmp(tree->value.element.name,"?xml")!=0) return(-2);
node=root=mxmlFindElement(tree,tree,"ZynAddSubFX-data",NULL,NULL,MXML_DESCEND);
- if (root==NULL) return(-2);//the XML doesnt embbed zynaddsubfx data
-
+ if (root==NULL) return(-3);//the XML doesnt embbed zynaddsubfx data
push(root);
values.xml_version.major=str2int(mxmlElementGetAttr(root,"version-major"));
values.xml_version.minor=str2int(mxmlElementGetAttr(root,"version-minor"));
-
-// node=mxmlFindElement(node,node,NULL,"name","volume",MXML_DESCEND);
-
-
-
-// if (node!=NULL) printf("%s\n",node->value.element.name);
-// else printf("NULL node\n");
-
return(0);
};
+char *XMLwrapper::doloadfile(const char *filename){
+ char *xmldata=NULL;
+ int filesize=-1;
+
+ //try get filesize as gzip data (first)
+ gzFile gzfile=gzopen(filename,"rb");
+ if (gzfile!=NULL){//this is a gzip file
+ // first check it's size
+ while(!gzeof(gzfile)) {
+ gzseek (gzfile,1024*1024,SEEK_CUR);
+ if (gztell(gzfile)>10000000) goto notgzip;//the file is not gzip
+ };
+ filesize=gztell(gzfile);
+
+ //rewind the file and load the data
+ xmldata=new char[filesize+1];
+ memset(xmldata,0,filesize+1);
+
+ gzrewind(gzfile);
+ gzread(gzfile,xmldata,filesize);
+
+ gzclose(gzfile);
+ return (xmldata);
+ } else {//this is not a gzip file
+ notgzip:
+ FILE *file=fopen(filename,"rb");
+ if (file==NULL) return(NULL);
+ fseek(file,0,SEEK_END);
+ filesize=ftell(file);
+
+ xmldata=new char [filesize+1];
+ memset(xmldata,0,filesize+1);
+
+ rewind(file);
+ fread(xmldata,filesize,1,file);
+
+ fclose(file);
+ return(xmldata);
+ };
+};
+
+
+
+
int XMLwrapper::enterbranch(char *name){
node=mxmlFindElement(peek(),peek(),name,NULL,NULL,MXML_DESCEND_FIRST);
if (node==NULL) return(0);
diff --git a/src/Misc/XMLwrapper.h b/src/Misc/XMLwrapper.h
@@ -43,8 +43,8 @@ class XMLwrapper{
/********************************/
//returns 0 if ok or -1 if the file cannot be saved
- int saveXMLfile(char *filename, int compression);
-
+ int saveXMLfile(char *filename);
+
//add simple parameter (name and value)
void addpar(char *name,int val);
void addparreal(char *name,REALTYPE val);
@@ -104,6 +104,11 @@ class XMLwrapper{
private:
+
+ int dosavefile(char *filename,int compression,char *xmldata);
+ char *doloadfile(const char *filename);
+
+
mxml_node_t *tree;//all xml data
mxml_node_t *root;//xml data used by zynaddsubfx
mxml_node_t *node;//current node
diff --git a/src/UI/ConfigUI.fl b/src/UI/ConfigUI.fl
@@ -1,5 +1,5 @@
# data file for the Fltk User Interface Designer (fluid)
-version 1.0104
+version 1.0200
header_name {.h}
code_name {.cc}
decl {//Copyright (c) 2002-2003 Nasca Octavian Paul} {}
@@ -12,7 +12,7 @@ decl {\#include <stdio.h>} {public
decl {\#include <math.h>} {public
}
-decl {\#include <stdlib.h>} {selected public
+decl {\#include <stdlib.h>} {public
}
decl {\#include "../globals.h"} {public
@@ -27,16 +27,17 @@ decl {\#include "../Misc/Dump.h"} {public
decl {extern Dump dump;} {public
}
-class ConfigUI {} {
+class ConfigUI {selected
+} {
Function {make_window()} {} {
Fl_Window configwindow {
label {ZynAddSubFX Settings}
- xywh {41 80 500 290} hide
+ xywh {120 213 500 290} type Double hide
} {
Fl_Button {} {
label OK
callback {configwindow->hide();}
- xywh {70 255 100 20} box THIN_UP_BOX
+ xywh {70 265 100 20} box THIN_UP_BOX
}
Fl_Group {} {
label {Sample Rate}
@@ -145,12 +146,12 @@ config.cfg.SoundBufferSize=strtoul(o->value(),&tmp,10);}
}
}
Fl_Box {} {
- label {The settings has effect only after ZynAddSubFX is restarted.}
- xywh {10 210 235 30} labelfont 1 labelsize 12 align 128
+ label {Most settings has effect only after ZynAddSubFX is restarted.}
+ xywh {10 225 235 30} labelfont 1 labelsize 12 align 128
}
Fl_Box {} {
label {Read the Readme.txt for other settings}
- xywh {5 190 240 20} labelfont 1 labelsize 12 align 128
+ xywh {5 205 240 20} labelfont 1 labelsize 12 align 128
}
Fl_Group {} {
xywh {5 95 230 85} box ENGRAVED_BOX
@@ -170,11 +171,11 @@ dump.startnow();//this has effect only if this option was disabled}
}
}
Fl_Group {} {
- xywh {250 15 245 275} box ENGRAVED_FRAME
+ xywh {250 30 245 260} box ENGRAVED_FRAME
} {
Fl_Box {} {
label {Note: Not all the following settings are used (this depends on the operating system, etc..)}
- xywh {255 25 235 45} labelfont 1 labelsize 12 align 128
+ xywh {255 35 235 45} labelfont 1 labelsize 12 align 128
}
Fl_Group {} {
label Linux
@@ -218,6 +219,12 @@ midiinputnamebox->label(config.winmididevices[config.cfg.WindowsMidiInId].name);
xywh {150 100 80 20} down_box DOWN_BOX
code0 {o->value(config.cfg.DumpAppend);}
}
+ Fl_Counter {} {
+ label {XML compression level}
+ callback {config.cfg.GzipCompression=(int) o->value();}
+ tooltip {gzip compression level (0 - uncompressed)} xywh {10 185 65 15} type Simple labelsize 12 align 8 minimum 0 maximum 9 step 1
+ code0 {o->value(config.cfg.GzipCompression);}
+ }
}
}
Function {ConfigUI()} {} {
diff --git a/src/UI/MasterUI.fl b/src/UI/MasterUI.fl
@@ -372,7 +372,7 @@ fl_alert("ZynAddSubFX could not be closed this way, because it's a VST plugin. P
\#else
if (fl_ask("Exit and leave the unsaved data?")) *exitprogram=1;
\#endif}
- xywh {151 174 390 465} type Double
+ xywh {448 226 390 465} type Double
code0 {setfilelabel(NULL);} non_modal visible
} {
Fl_Menu_Bar mastermenu {
@@ -385,11 +385,11 @@ if (fl_ask("Exit and leave the unsaved data?")) *exitprogram=1;
menuitem {} {
label {&Save All As XML (EXPERIMENTAL)...}
callback {char *filename;
-\#define EXT ".xml"
-filename=fl_file_chooser("Save:","(*"EXT")",NULL,0);
+
+filename=fl_file_chooser("Save:","({*.xml,*.xmlz})",NULL,0);
if (filename==NULL) return;
-filename=fl_filename_setext(filename,EXT);
-\#undef EXT
+filename=fl_filename_setext(filename,".xml");
+
pthread_mutex_lock(&master->mutex);
master->saveXML(filename);
@@ -401,7 +401,7 @@ updatepanel();}
menuitem {} {
label {&Open XML...}
callback {char *filename;
-filename=fl_file_chooser("Open:","(*.xml)",NULL,0);
+filename=fl_file_chooser("Open:","({*.xml,*.xmlz})",NULL,0);
if (filename==NULL) return;
@@ -582,11 +582,11 @@ if (result!=0) fl_alert("Error: Could not save the file.");}
menuitem {} {
label {&Save As XML (EXPERIMENTAL)...}
callback {char *filename;
-\#define EXT ".xml"
-filename=fl_file_chooser("Save:","(*"EXT")",NULL,0);
+
+filename=fl_file_chooser("Save:","({*.xml,*.xmlz})",NULL,0);
if (filename==NULL) return;
-filename=fl_filename_setext(filename,EXT);
-\#undef EXT
+filename=fl_filename_setext(filename,"xml");
+
pthread_mutex_lock(&master->mutex);
master->part[npart]->saveXML(filename);
@@ -598,7 +598,7 @@ updatepanel();}
menuitem {} {
label {&Load XML Instrument...}
callback {const char *filename;
-filename=fl_file_chooser("Load:","(*.xml)",NULL,0);
+filename=fl_file_chooser("Load:","({*.xml,*.xmlz})",NULL,0);
if (filename==NULL) return;