Adding support for writing zlib compressed set files and fixing audio
authorterminatorX <>
Mon, 31 Mar 2003 18:36:27 +0000 (18:36 +0000)
committerterminatorX <>
Mon, 31 Mar 2003 18:36:27 +0000 (18:36 +0000)
recording - Alex

22 files changed:
ChangeLog
INSTALL
TODO
configure.in
src/tX_dialog.cc
src/tX_engine.cc
src/tX_event.cc
src/tX_event.h
src/tX_glade_interface.cc
src/tX_global.c
src/tX_global.h
src/tX_mastergui.cc
src/tX_seqpar.cc
src/tX_seqpar.h
src/tX_sequencer.cc
src/tX_sequencer.h
src/tX_tape.cc
src/tX_vtt.cc
src/tX_vtt.h
src/tX_vttfx.cc
src/tX_vttfx.h
terminatorX.glade

index 58b05ff4a2bbb9c1d425e4669133cc54c98fcbe2..596fc16d07a6e1f1be08c29a555eaac1c1deca4e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,10 +1,12 @@
 terminatorX - ChangeLog
-All changes were done by me (Alexander König) if not stated otherwise.
+All changes were done by me (Alexander Knig) if not stated otherwise.
 This is not a GNU-style ChangeLog but you sort of get the idea what was
 changed.
 
 [v3.80 - prerelease]
-
+- XML based set files can get rather huge when they contain a lot of sequencer
+  events - to solve this terminatorX now uses zlib to save compressed set
+  files if enabled in the preferences dialog.
 - I hacked support for Steve Harris' cool liblrdf - if you've got that library
   setup correctly and you use Steve's wonderful plugin collection with RDF 
   description you should get a nicely structured menu when clicking on the
@@ -50,7 +52,7 @@ changed.
 - terminatorX now stores set files as XML documents, too - so terminatorX has
   become terminatorXML finally. Note: for sets with a large number of events
   recorded into the sequencer - the XML based set files can grow significally
-  larger than the old ones.
+  larger than the old ones (see "compression" above)
 - The old code to support the obsolete binary tX file formats has now been
   scheduled for deletion. It's been moved into the tX_legacy* source files and 
   it will be built only when "--enable-legacy" was used on configuring
@@ -268,8 +270,8 @@ changed.
 - some gui redesign. The volume scales are now located near their corresponding
   "flash"-widget. This release fits into very small windows - so it should be
   usable on smaller displays as well.
-- Adrian told me configure doesn´t have to check for glib after checking for
-  gtk+ - I guess he´s right so the glib-test has gone.
+- Adrian told me configure doesnt have to check for glib after checking for
+  gtk+ - I guess hes right so the glib-test has gone.
 - more minor fixes
   
 [v3.55]
@@ -425,7 +427,7 @@ changed.
 [v2.4] (unreleased)
 - implemented a time counter
 - licmak now finally is what it should be: a perl script (licmak.pl)
-  it was contributed by: Adam Sjøgren <asjo@diku.dk>. Thanks!
+  it was contributed by: Adam Sjgren <asjo@diku.dk>. Thanks!
 
 [v2.3]
 - X-Window background fixed
diff --git a/INSTALL b/INSTALL
index a6110a7fa286698d266594ddf0a4672ddbe33263..1fc776e53290cd9c121bb2235b669de5a261f5d4 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -1,5 +1,5 @@
 terminatorX INSTALL:
-Copyright (C) 1999, 2000, 2001 by Alexander König <alex@lisas.de>
+Copyright (C) 1999 - 2003 by Alexander König <alex@lisas.de>
 http://terminatorX.cx
 
 Note: As of Version 3.70 you need to have LADSPA installed to compile
diff --git a/TODO b/TODO
index fbe0fffc9ccf3e0fa49f14b6311cbcf4d9d36d04..75f972247f54a95bee1835bd8535a1b29ba6aca5 100644 (file)
--- a/TODO
+++ b/TODO
@@ -24,7 +24,7 @@ This might come after 4.0:
     
 - Support other languages.
 
---- Ok, the follownig points are already implemented:
+--- Ok, the following points are already implemented:
 
 - Rewrite the audio device layer, so that terminatorX operates at a fix block
   size - this will allow correct playback of sequencer events even if played
index a14021d13daa0d11a0b9cc506494421b1fcd3c17..83b0d23661ea5c4861b42f90c19e6e9a101b21ab 100644 (file)
@@ -154,6 +154,9 @@ if test "$have_ladspa" = "no"; then
        AC_MSG_ERROR([** couldn't find ladspa.h - Install the LADSPA SDK from http://www.ladspa.org first. **])
 fi
 
+AC_CHECK_HEADERS(zlib.h,, AC_MSG_ERROR([** couldn't find zlib.h **]))
+AC_CHECK_LIB(z,gzprintf, LIBS="$LIBS -lz", AC_MSG_ERROR([** couldn't find libz library **]))
+
 dnl Checks for typedefs, structures, and compiler characteristics.
 AC_C_BIGENDIAN
 AC_TYPE_SIZE_T
index 4db58d4d34b9682dca784cdf1a2112cc9e550995..d3445a2208b7f44958211e0e30b54c9702e963b8 100644 (file)
@@ -106,6 +106,7 @@ void apply_options(GtkWidget *dialog) {
        /* Misc */
        strcpy(globals.file_editor, gtk_entry_get_text(GTK_ENTRY(lookup_widget(dialog, "soundfile_editor"))));
        strcpy(globals.lrdf_path, gtk_entry_get_text(GTK_ENTRY(lookup_widget(dialog, "ladspa_rdf_path"))));
+       globals.compress_set_files=(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog, "compress_set_files")))==TRUE);        
        globals.prelis=(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog, "prelisten_enabled")))==TRUE);
 }
 
@@ -343,6 +344,7 @@ void init_tx_options(GtkWidget *dialog) {
        /* Misc */
        gtk_entry_set_text(GTK_ENTRY(lookup_widget(dialog, "soundfile_editor")), globals.file_editor);
        gtk_entry_set_text(GTK_ENTRY(lookup_widget(dialog, "ladspa_rdf_path")), globals.lrdf_path);
+       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog, "compress_set_files")), globals.compress_set_files);
        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(lookup_widget(dialog, "prelisten_enabled")), globals.prelis);
 }
 
index 0b48a3095cf348c0eb61f01f6b39be4ea7d23548..f0548c650830edabc87130fc7222152b31ca8f82 100644 (file)
@@ -257,7 +257,7 @@ tX_engine_error tX_engine :: run() {
        vtt_class::set_sample_rate(device->get_sample_rate());
        
        if (recording_request) {
-               if (tape->start_record(globals.record_filename, device->get_buffersize()*sizeof(int16_t), device->get_sample_rate())) {
+               if (tape->start_record(globals.record_filename, vtt_class::get_mix_buffer_size(), device->get_sample_rate())) {
                        device->close();
                        delete device;
                        device=NULL;                    
index 973ca7f8a54f78824276bd142c86618eea4c55c7..3a86e7b3920204deab98e2a6d55368bcbc01b54a 100644 (file)
@@ -24,8 +24,8 @@
 #include <tX_event.h>
 #include <tX_global.h>
 
-void tX_event :: store (FILE *output, char *indent) {
-       fprintf(output, "%s<event pid=\"%i\" value=\"%lf\" time=\"%i\"/>\n", indent, sp->get_persistence_id(), value, timestamp);
+void tX_event :: store (FILE *rc, gzFile rz, char *indent) {
+       tX_store("%s<event pid=\"%i\" value=\"%lf\" time=\"%i\"/>\n", indent, sp->get_persistence_id(), value, timestamp);
 }
 
 tX_event :: tX_event (xmlDocPtr doc, xmlNodePtr node) {
index e31b1564e9ec7ef22a351615d1595904d3d397f0..b669e160b2b4ab06c7a6ca0672c80c3fd7533683 100644 (file)
@@ -51,7 +51,7 @@ class tX_event
        tX_event(FILE *input);
 #endif         
        tX_event(xmlDocPtr, xmlNodePtr);
-       void store(FILE *output, char *indent);
+       void store(FILE *rc, gzFile rz, char *indent);
 
        tX_seqpar *get_sp() { return sp; }
        guint32 get_timestamp() { return timestamp; }
index d579f627843a484ca4a28eb84b6914e0cab2c5fd..1adbbbbc65c56fdb06e315341d53519c7a50bd22 100644 (file)
@@ -101,6 +101,8 @@ create_tx_options (void)
   GtkWidget *prelisten_enabled;
   GtkWidget *label31;
   GtkWidget *ladspa_rdf_path;
+  GtkWidget *label33;
+  GtkWidget *compress_set_files;
   GtkWidget *label3;
   GtkWidget *dialog_action_area1;
   GtkWidget *pref_cancel;
@@ -523,7 +525,7 @@ create_tx_options (void)
   gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 4), label2);
   gtk_label_set_justify (GTK_LABEL (label2), GTK_JUSTIFY_LEFT);
 
-  table3 = gtk_table_new (3, 2, FALSE);
+  table3 = gtk_table_new (4, 2, FALSE);
   gtk_widget_show (table3);
   gtk_container_add (GTK_CONTAINER (notebook1), table3);
   gtk_container_set_border_width (GTK_CONTAINER (table3), 4);
@@ -547,7 +549,7 @@ create_tx_options (void)
 
   label26 = gtk_label_new ("\"Pre-Listen\" to soundfiles:");
   gtk_widget_show (label26);
-  gtk_table_attach (GTK_TABLE (table3), label26, 0, 1, 2, 3,
+  gtk_table_attach (GTK_TABLE (table3), label26, 0, 1, 3, 4,
                     (GtkAttachOptions) (GTK_FILL),
                     (GtkAttachOptions) (0), 0, 0);
   gtk_label_set_justify (GTK_LABEL (label26), GTK_JUSTIFY_LEFT);
@@ -555,7 +557,7 @@ create_tx_options (void)
 
   prelisten_enabled = gtk_check_button_new_with_mnemonic ("Enabled");
   gtk_widget_show (prelisten_enabled);
-  gtk_table_attach (GTK_TABLE (table3), prelisten_enabled, 1, 2, 2, 3,
+  gtk_table_attach (GTK_TABLE (table3), prelisten_enabled, 1, 2, 3, 4,
                     (GtkAttachOptions) (GTK_FILL),
                     (GtkAttachOptions) (0), 0, 0);
   gtk_tooltips_set_tip (tooltips, prelisten_enabled, "When enabled soundfiles will be playedback when selected in a file dialog (before loading them).", NULL);
@@ -574,6 +576,20 @@ create_tx_options (void)
                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
                     (GtkAttachOptions) (0), 0, 0);
 
+  label33 = gtk_label_new ("Compress set files:");
+  gtk_widget_show (label33);
+  gtk_table_attach (GTK_TABLE (table3), label33, 0, 1, 2, 3,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_label_set_justify (GTK_LABEL (label33), GTK_JUSTIFY_LEFT);
+  gtk_misc_set_alignment (GTK_MISC (label33), 0, 0.5);
+
+  compress_set_files = gtk_check_button_new_with_mnemonic ("Enabled");
+  gtk_widget_show (compress_set_files);
+  gtk_table_attach (GTK_TABLE (table3), compress_set_files, 1, 2, 2, 3,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+
   label3 = gtk_label_new ("Misc");
   gtk_widget_show (label3);
   gtk_notebook_set_tab_label (GTK_NOTEBOOK (notebook1), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook1), 5), label3);
@@ -681,6 +697,8 @@ create_tx_options (void)
   GLADE_HOOKUP_OBJECT (tx_options, prelisten_enabled, "prelisten_enabled");
   GLADE_HOOKUP_OBJECT (tx_options, label31, "label31");
   GLADE_HOOKUP_OBJECT (tx_options, ladspa_rdf_path, "ladspa_rdf_path");
+  GLADE_HOOKUP_OBJECT (tx_options, label33, "label33");
+  GLADE_HOOKUP_OBJECT (tx_options, compress_set_files, "compress_set_files");
   GLADE_HOOKUP_OBJECT (tx_options, label3, "label3");
   GLADE_HOOKUP_OBJECT_NO_REF (tx_options, dialog_action_area1, "dialog_action_area1");
   GLADE_HOOKUP_OBJECT (tx_options, pref_cancel, "pref_cancel");
index d5ae85ddc25441f05e880d9386c29011c9e0a604..bc7bd9d605829e82ad2a7f1ebdc29bee237c1c64 100644 (file)
@@ -43,6 +43,7 @@
 #define TX_XML_RC_VERSION "1.0"
 
 tx_global globals;
+int _store_compress_xml=0;
 
 void get_rc_name(char *buffer)
 {
@@ -130,6 +131,7 @@ void set_global_defaults() {
        
        strcpy(globals.lrdf_path, "/usr/share/ladspa/rdf:/usr/local/share/ladspa/rdf");
        globals.fullscreen_enabled=1;
+       globals.compress_set_files=0;
 }
 
 int load_globals_xml() {
@@ -204,6 +206,7 @@ int load_globals_xml() {
                        restore_string("file_editor", globals.file_editor);
                        restore_string("lrdf_path", globals.lrdf_path);
                        
+                       restore_int("compress_set_files", globals.compress_set_files);
                        restore_int("fullscreen_enabled", globals.fullscreen_enabled);
 
                        if (!elementFound) {
@@ -226,6 +229,8 @@ void store_globals() {
        char device_type[16];
        char indent[]="\t";
        FILE *rc;
+       gzFile rz;
+       _store_compress_xml=0;
        char tmp_xml_buffer[4096];
        
        get_rc_name(rc_name);
@@ -286,6 +291,7 @@ void store_globals() {
                store_string("record_filename", globals.record_filename);
                store_string("file_editor", globals.file_editor);
                store_string("lrdf_path", globals.lrdf_path);
+               store_int("compress_set_files", globals.compress_set_files);
                store_int("fullscreen_enabled", globals.fullscreen_enabled);
                
                fprintf(rc,"</terminatorXrc>\n");
index fedcd3dc4250018645fce50f3195201705b21175..abc78840b2fad5764a468b20ad5a0666eeba2efe 100644 (file)
@@ -48,6 +48,8 @@ extern "C" {
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
+
+#include <zlib.h>
        
 #ifdef ENABLE_DEBUG_OUTPUT     
 #define tX_debug(fmt, args...); { fprintf(stderr, "- tX_debug: "); fprintf(stderr, fmt , ## args); fprintf(stderr, "\n"); }
@@ -133,6 +135,8 @@ typedef struct {
        
        char lrdf_path[PATH_MAX];
        
+       int compress_set_files;
+       
        int fullscreen_enabled;
 } tx_global;
 
@@ -161,19 +165,23 @@ extern char *decode_xml(char *dest, const char *src);
 //#define restore_float_id(s, i, sp, init); if ((!elementFound) && (!xmlStrcmp(cur->name, (const xmlChar *) s))) { elementFound=1; if  (xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)) {sscanf((char *) xmlNodeListGetString(doc, cur->xmlChildrenNode, 1), "%lf", &dvalue); i=dvalue; pid_attr=(char* ) xmlGetProp(cur, (xmlChar *) "id"); if (pid_attr) { sscanf(pid_attr, "%i",  &pid); sp.set_persistence_id(pid); } init; }}
 //#define restore_bool_id(s, i, sp, init); if ((!elementFound) && (!xmlStrcmp(cur->name, (const xmlChar *) s))) { elementFound=1; if (xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)) {if (xmlStrcmp(xmlNodeListGetString(doc, cur->xmlChildrenNode, 1),  (const xmlChar *) "true")==0) i=true; else i=false; pid_attr=(char* ) xmlGetProp(cur,  (xmlChar *)"id"); if (pid_attr) { sscanf(pid_attr, "%i",  &pid); sp.set_persistence_id(pid); } init; }}
 
-#define store_int(s, i); fprintf(rc, "%s<%s>%i</%s>\n", indent, s,(int) i, s);
-#define store_float(s, i); fprintf(rc, "%s<%s>%lf</%s>\n", indent, s,(double) i, s);
-#define store_string(s, i); fprintf(rc, "%s<%s>%s</%s>\n", indent, s, encode_xml(tmp_xml_buffer, i) , s);
-#define store_bool(s, i); fprintf(rc, "%s<%s>%s</%s>\n", indent, s, i ? "true" : "false", s);
+extern int _store_compress_xml;
+
+#define tX_store(fmt, args...); { _store_compress_xml ? gzprintf(rz, fmt , ## args) : fprintf(rc, fmt , ## args); }
+
+#define store_int(s, i); tX_store("%s<%s>%i</%s>\n", indent, s,(int) i, s);
+#define store_float(s, i); tX_store("%s<%s>%lf</%s>\n", indent, s,(double) i, s);
+#define store_string(s, i); tX_store("%s<%s>%s</%s>\n", indent, s, encode_xml(tmp_xml_buffer, i) , s);
+#define store_bool(s, i); tX_store("%s<%s>%s</%s>\n", indent, s, i ? "true" : "false", s);
 
-#define store_id(s, id); fprintf(rc, "%s<%s id=\"%i\"/>\n", indent, s, id);
-#define store_int_id(s, i, id); fprintf(rc, "%s<%s id=\"%i\">%i</%s>\n", indent, s, id, (int) i, s);
-#define store_float_id(s, i, id); fprintf(rc, "%s<%s id=\"%i\">%lf</%s>\n", indent, s, id, (double) i, s);
-#define store_bool_id(s, i, id); fprintf(rc, "%s<%s id=\"%i\">%s</%s>\n", indent, s, id, i ? "true" : "false", s);
+#define store_id(s, id); tX_store("%s<%s id=\"%i\"/>\n", indent, s, id);
+#define store_int_id(s, i, id); tX_store("%s<%s id=\"%i\">%i</%s>\n", indent, s, id, (int) i, s);
+#define store_float_id(s, i, id); tX_store("%s<%s id=\"%i\">%lf</%s>\n", indent, s, id, (double) i, s);
+#define store_bool_id(s, i, id); tX_store("%s<%s id=\"%i\">%s</%s>\n", indent, s, id, i ? "true" : "false", s);
 
-#define store_int_sp(name, i, sp); { fprintf(rc, "%s<%s ", indent, name); sp.store_meta(rc); fprintf(rc, ">%i</%s>\n", (int) i, name); }
-#define store_float_sp(name, i, sp); { fprintf(rc, "%s<%s ", indent, name); sp.store_meta(rc); fprintf(rc, ">%lf</%s>\n", (double) i, name); }
-#define store_bool_sp(name, i, sp); { fprintf(rc, "%s<%s ", indent, name); sp.store_meta(rc); fprintf(rc, ">%s</%s>\n", i ? "true" : "false", name); }
+#define store_int_sp(name, i, sp); { tX_store("%s<%s ", indent, name); sp.store_meta(rc, rz); tX_store(">%i</%s>\n", (int) i, name); }
+#define store_float_sp(name, i, sp); { tX_store("%s<%s ", indent, name); sp.store_meta(rc, rz); tX_store(">%lf</%s>\n", (double) i, name); }
+#define store_bool_sp(name, i, sp); { tX_store("%s<%s ", indent, name); sp.store_meta(rc, rz); tX_store(">%s</%s>\n", i ? "true" : "false", name); }
 
 #define restore_int_id(s, i, sp, init); if ((!elementFound) && (!xmlStrcmp(cur->name, (const xmlChar *) s))) { elementFound=1; if (xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)) { sscanf((char *) xmlNodeListGetString(doc, cur->xmlChildrenNode, 1), "%i", &i);  init; } sp.restore_meta(cur); }
 #define restore_float_id(s, i, sp, init); if ((!elementFound) && (!xmlStrcmp(cur->name, (const xmlChar *) s))) { elementFound=1; if  (xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)) {sscanf((char *) xmlNodeListGetString(doc, cur->xmlChildrenNode, 1), "%lf", &dvalue); i=dvalue; init; } sp.restore_meta(cur);}
index 0ea0e26d89f7aec038d54e0ef26526fd608a9c17..f1debe5c3714781e0776afd2fc447577da1872f3 100644 (file)
@@ -451,9 +451,10 @@ GtkSignalFunc cancel_save_tables(GtkWidget *wid)
        return(0);
 }
 
-void do_save_tables(GtkWidget *wid)
+gboolean do_save_tables(GtkWidget *wid)
 {
        FILE *out;
+       gzFile zout;
        char buffer[PATH_MAX];
        char wbuf[PATH_MAX];
        char *ext;
@@ -463,7 +464,7 @@ void do_save_tables(GtkWidget *wid)
                int len=strlen(buffer);
                if (!len || (buffer[len-1]=='/')) {                     
                        tx_note("Invalid filename for set file.", true);                        
-                       return;
+                       return FALSE;
                }
                strcpy(globals.tables_filename, buffer);
                gtk_widget_destroy(save_dialog);
@@ -487,12 +488,21 @@ void do_save_tables(GtkWidget *wid)
        tx_mg_have_setname=true;
        strcpy(tx_mg_current_setname, buffer);
        
-       out=fopen(buffer, "w");
+       if (globals.compress_set_files) {
+               _store_compress_xml=1;
+               out=NULL;
+               zout=gzopen(buffer, "w");
+       } else {
+               _store_compress_xml=0;
+               out=fopen(buffer, "w");
+               zout=NULL;
+       }
        
-       if (out)
+       if (out || zout)
        {
-               if (vtt_class::save_all(out)) tx_note("Error while saving set.", true);
-               fclose(out);
+               if (vtt_class::save_all(out, zout)) tx_note("Error while saving set.", true);
+               if (out) fclose(out); 
+               else if (zout) gzclose(zout);
                sprintf(wbuf,"terminatorX - %s", strip_path(buffer));
                gtk_window_set_title(GTK_WINDOW(main_window), wbuf);                            
        }
@@ -500,6 +510,8 @@ void do_save_tables(GtkWidget *wid)
        {
                tx_note("Failed to open file for write access.", true);
        }
+       
+       return FALSE;
 }
 
 GtkSignalFunc save_tables_as()
@@ -714,7 +726,7 @@ void grab_off()
        grab_status=0;
 }
 
-void quit()
+gboolean quit()
 {
        GtkWidget *dialog=gtk_message_dialog_new(GTK_WINDOW(main_window), 
        GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO,
@@ -724,7 +736,7 @@ void quit()
        gtk_widget_destroy(dialog);
                
        if (res!=GTK_RESPONSE_YES) {
-               return;
+               return TRUE;
        }
 
        turn_audio_off();
index a2c9dc40a1db0712f6ba3f0659d2575886237d3e..9e5f26c445da17e37a4793b28434e1c22316e4bd 100644 (file)
@@ -256,7 +256,7 @@ void tX_seqpar :: restore_meta(xmlNodePtr node) {
        /* else: no MIDI init.... */
 }
 
-void tX_seqpar :: store_meta(FILE *output) {
+void tX_seqpar :: store_meta(FILE *rc, gzFile rz) {
        char buffer[256];
        
        if (bound_midi_event.type!=tX_midievent::NONE) {
@@ -272,7 +272,7 @@ void tX_seqpar :: store_meta(FILE *output) {
        } else {
                sprintf(buffer, "id=\"%i\"", persistence_id);
        }
-       fprintf(output, buffer);
+       tX_store(buffer);
 }
 
 
index c556c66e48ae9576d73a9a18611afaccb58e27b2..4de2f593488d3c7f4cae58fc3761a07bcad56661 100644 (file)
@@ -132,7 +132,7 @@ class tX_seqpar
        public:
        int is_mappable;        
        void restore_meta(xmlNodePtr node);
-       void store_meta(FILE *output);
+       void store_meta(FILE *rc, gzFile rz);
 };
 
 class tX_seqpar_update : public tX_seqpar
index 93fcbf0fcda989783577779e166cf0c68d378b17..3a04af7ebc1c515a6d6b1495d4f9647706bd35b3 100644 (file)
@@ -238,21 +238,21 @@ void tX_sequencer :: delete_all_events_for_sp(tX_seqpar *sp)
 #endif                         
 }
 
-void tX_sequencer :: save(FILE *rc, char *indent) {
+void tX_sequencer :: save(FILE *rc, gzFile rz, char *indent) {
        guint32 event_count;
        list <tX_event *> :: iterator song_event;
        
        event_count=song_list.size();
 
-       fprintf(rc, "%s<sequencer>\n", indent);
+       tX_store("%s<sequencer>\n", indent);
        strcat(indent, "\t");
        
        for (song_event=song_list.begin(); song_event!=song_list.end(); song_event++) {
-               (*song_event)->store(rc, indent);
+               (*song_event)->store(rc, rz, indent);
        }
        
        indent[strlen(indent)-1]=0;
-       fprintf(rc, "%s</sequencer>\n", indent);
+       tX_store("%s</sequencer>\n", indent);
 }
 
 
index eb4c1fa4e24540876c895942dff6e5347db09459..aef297f8cd49c10d59ab98d2d2b80f1827003a49 100644 (file)
@@ -82,7 +82,7 @@ class tX_sequencer
        void delete_all_events_for_sp(tX_seqpar *sp);
        void delete_all_events();
        
-       void save(FILE *, char *indent);
+       void save(FILE *, gzFile, char *indent);
 #ifdef ENABLE_TX_LEGACY        
        void load(FILE *);
 #endif 
index a2bf6aa79f24a6e9ff9d2694a79d69b7c1f94b11..5dd3adba4a91b0216d1b8e376f32edb764693fdf 100644 (file)
@@ -44,7 +44,7 @@ int tx_tapedeck :: start_record (char *name, int bs, int samplerate)
        file.len=0;
        file.sofar=0;
 
-       blocksize=bs;
+       blocksize=bs * sizeof(int16_t) * 2;
 
        written_bytes=0;        
 
index 33042f6d5da9ac784a424ae8b00ada8525973b4f..69339868c531d30959ef96205d143d7a3825d187 100644 (file)
@@ -1339,13 +1339,13 @@ void vtt_class :: xy_input(f_prec x_value, f_prec y_value)
 
 #define store(data); if (fwrite((void *) &data, sizeof(data), 1, output)!=1) res+=1;
 
-int  vtt_class :: save(FILE *rc, char *indent) {
+int  vtt_class :: save(FILE *rc, gzFile rz, char *indent) {
        list <vtt_fx *> :: iterator effect;
        char tmp_xml_buffer[4096];
        
        int res=0;
 
-       fprintf(rc, "%s<turntable>\n", indent);
+       tX_store("%s<turntable>\n", indent);
        strcat(indent, "\t");
        
        store_string("name", name);
@@ -1399,32 +1399,32 @@ int  vtt_class :: save(FILE *rc, char *indent) {
 
        store_float("audio_x_zoom", gui_get_audio_x_zoom(this));
        
-       fprintf(rc, "%s<fx>\n", indent);
+       tX_store("%s<fx>\n", indent);
        strcat(indent, "\t");
        
        for (effect=fx_list.begin(); effect!=fx_list.end(); effect++) {
-               (*effect)->save(rc, indent);
+               (*effect)->save(rc, rz, indent);
        }
        indent[strlen(indent)-1]=0;
-       fprintf(rc, "%s</fx>\n", indent);
+       tX_store("%s</fx>\n", indent);
        
        indent[strlen(indent)-1]=0;
-       fprintf(rc, "%s</turntable>\n", indent);
+       tX_store("%s</turntable>\n", indent);
        
        return(res);
 }
 
 #define TX_XML_SETFILE_VERSION "1.0"
 
-int  vtt_class :: save_all(FILE* rc) {
+int  vtt_class :: save_all(FILE* rc, gzFile rz) {
        int res=0;
        list <vtt_class *> :: iterator vtt;
        char indent[256];
        
        tX_seqpar :: create_persistence_ids();
 
-       fprintf(rc, "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n");
-       fprintf(rc, "<terminatorXset version=\"%s\">\n", TX_XML_SETFILE_VERSION);
+       tX_store("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n");
+       tX_store("<terminatorXset version=\"%s\">\n", TX_XML_SETFILE_VERSION);
        
        strcpy(indent, "\t");
 
@@ -1434,12 +1434,12 @@ int  vtt_class :: save_all(FILE* rc) {
        store_float_sp("master_pitch", globals.pitch, sp_master_pitch);
 
        for (vtt=main_list.begin(); vtt!=main_list.end(); vtt++) {
-               res+=(*vtt)->save(rc, indent);
+               res+=(*vtt)->save(rc, rz, indent);
        }
        
-       sequencer.save(rc, indent);
+       sequencer.save(rc, rz, indent);
        
-       fprintf(rc, "</terminatorXset>\n");
+       tX_store("</terminatorXset>\n");
        
        return(res);
 }
index 271375b5918a7586402c9beb7146b02f491e9cd0..719979970e9cd3e0901a1db4bd749ef14ef6c1f5 100644 (file)
@@ -279,8 +279,8 @@ class vtt_class
        int stop();
        int stop_nolock();
        
-       int save(FILE *, char *indent);
-       static int save_all(FILE *);
+       int save(FILE *, gzFile rz, char *indent);
+       static int save_all(FILE *, gzFile rz);
        int load(xmlDocPtr, xmlNodePtr);
        static int load_all(xmlDocPtr doc, char *fname);
        static void delete_all();
index a5aca3e1e76a82e8c678b017356f5d6e0f6314ae..b2c008abd5d2ccd1c79a14bcaa1784a47c7504a2 100644 (file)
@@ -46,7 +46,7 @@ void vtt_fx :: run ()
        fprintf(stderr, "tX: Oops: run() abstract vtt_fx?");
 }
 
-void vtt_fx :: save (FILE *output, char *indent) {
+void vtt_fx :: save(FILE *rc, gzFile rz, char *indent) {
        fprintf(stderr, "tX: Oops: run() abstract vtt_fx?");
 }
 
@@ -75,8 +75,8 @@ void vtt_fx_lp :: deactivate() { /* NOP */ }
 void vtt_fx_lp :: run() { myvtt->render_lp(); }
 int vtt_fx_lp :: isEnabled() { return myvtt->lp_enable; }
 
-void vtt_fx_lp :: save (FILE *output, char *indent) { 
-       fprintf(output, "%s<cutoff/>\n", indent);
+void vtt_fx_lp :: save (FILE *rc, gzFile rz, char *indent) { 
+       tX_store("%s<cutoff/>\n", indent);
 }
 
 const char *vtt_fx_lp :: get_info_string()
@@ -91,8 +91,8 @@ void vtt_fx_ec :: deactivate() { myvtt->ec_clear_buffer(); }
 void vtt_fx_ec :: run() { myvtt->render_ec(); }
 int vtt_fx_ec :: isEnabled() { return myvtt->ec_enable; }
 
-void vtt_fx_ec :: save (FILE *output, char *indent) { 
-       fprintf(output, "%s<lowpass/>\n", indent);      
+void vtt_fx_ec :: save (FILE *rc, gzFile rz, char *indent) { 
+       tX_store("%s<lowpass/>\n", indent);     
 }
 
 const char *vtt_fx_ec :: get_info_string()
@@ -281,11 +281,11 @@ vtt_fx_ladspa :: ~vtt_fx_ladspa()
 }
 
 
-void vtt_fx_ladspa :: save (FILE *rc, char *indent) {
+void vtt_fx_ladspa :: save (FILE *rc, gzFile rz, char *indent) {
        long ID=plugin->getUniqueID();
        list <tX_seqpar_vttfx *> :: iterator sp;
        
-       fprintf(rc, "%s<ladspa_plugin>\n", indent);
+       tX_store("%s<ladspa_plugin>\n", indent);
        strcat (indent, "\t");
        
        store_int("ladspa_id", ID);
@@ -297,7 +297,7 @@ void vtt_fx_ladspa :: save (FILE *rc, char *indent) {
        store_bool("panel_hidden", panel->is_hidden());
        
        indent[strlen(indent)-1]=0;
-       fprintf(rc, "%s</ladspa_plugin>\n", indent);
+       tX_store("%s</ladspa_plugin>\n", indent);
 }
 
 void vtt_fx_ladspa :: load(xmlDocPtr doc, xmlNodePtr node) {
index fd6853de24a0109b1f4e5160e4f0ec7eb4cf7804..10c5058aa8d0b350003bc946eb2124a3d81fc9f9 100644 (file)
@@ -64,7 +64,7 @@ class vtt_fx
        
        virtual const char *get_info_string();
        
-       virtual void save(FILE *output, char *indent);
+       virtual void save(FILE *rc, gzFile rz, char *indent);
        
        GtkWidget* get_panel_widget() { return panel_widget; }
        void set_panel_widget(GtkWidget *widget) { panel_widget=widget; }
@@ -85,7 +85,7 @@ class vtt_fx_lp : public vtt_fx
        virtual void run();     
        virtual int isEnabled();
 
-       virtual void save(FILE *output, char *indent);
+       virtual void save(FILE *rc, gzFile rz, char *indent);
        virtual const char *get_info_string();
 };
 
@@ -98,7 +98,7 @@ class vtt_fx_ec : public vtt_fx
        virtual void run();     
        virtual int isEnabled();
 
-       virtual void save(FILE *output, char *indent);
+       virtual void save(FILE *rc, gzFile rz, char *indent);
        virtual const char *get_info_string();  
 };
 
@@ -126,7 +126,7 @@ class vtt_fx_ladspa : public vtt_fx
        virtual int isEnabled();
        virtual void reconnect_buffer();
        virtual const char *get_info_string();  
-       virtual void save(FILE *output, char *indent);
+       virtual void save(FILE *rc, gzFile rz, char *indent);
 #ifdef ENABLE_TX_LEGACY        
        virtual void load(FILE *);
 #endif 
index 9e9c15b69590d17f267d1e6a6e46d2041a1387eb..efea133c122b3500ce6d2da3bb3b45ac948af637 100644 (file)
            <widget class="GtkTable" id="table3">
              <property name="border_width">4</property>
              <property name="visible">True</property>
-             <property name="n_rows">3</property>
+             <property name="n_rows">4</property>
              <property name="n_columns">2</property>
              <property name="homogeneous">False</property>
              <property name="row_spacing">2</property>
                <packing>
                  <property name="left_attach">0</property>
                  <property name="right_attach">1</property>
-                 <property name="top_attach">2</property>
-                 <property name="bottom_attach">3</property>
+                 <property name="top_attach">3</property>
+                 <property name="bottom_attach">4</property>
                  <property name="x_options">fill</property>
                  <property name="y_options"></property>
                </packing>
                <packing>
                  <property name="left_attach">1</property>
                  <property name="right_attach">2</property>
-                 <property name="top_attach">2</property>
-                 <property name="bottom_attach">3</property>
+                 <property name="top_attach">3</property>
+                 <property name="bottom_attach">4</property>
                  <property name="x_options">fill</property>
                  <property name="y_options"></property>
                </packing>
                  <property name="y_options"></property>
                </packing>
              </child>
+
+             <child>
+               <widget class="GtkLabel" id="label33">
+                 <property name="visible">True</property>
+                 <property name="label" translatable="yes">Compress set files:</property>
+                 <property name="use_underline">False</property>
+                 <property name="use_markup">False</property>
+                 <property name="justify">GTK_JUSTIFY_LEFT</property>
+                 <property name="wrap">False</property>
+                 <property name="selectable">False</property>
+                 <property name="xalign">0</property>
+                 <property name="yalign">0.5</property>
+                 <property name="xpad">0</property>
+                 <property name="ypad">0</property>
+               </widget>
+               <packing>
+                 <property name="left_attach">0</property>
+                 <property name="right_attach">1</property>
+                 <property name="top_attach">2</property>
+                 <property name="bottom_attach">3</property>
+                 <property name="x_options">fill</property>
+                 <property name="y_options"></property>
+               </packing>
+             </child>
+
+             <child>
+               <widget class="GtkCheckButton" id="compress_set_files">
+                 <property name="visible">True</property>
+                 <property name="can_focus">True</property>
+                 <property name="label" translatable="yes">Enabled</property>
+                 <property name="use_underline">True</property>
+                 <property name="relief">GTK_RELIEF_NORMAL</property>
+                 <property name="active">False</property>
+                 <property name="inconsistent">False</property>
+                 <property name="draw_indicator">True</property>
+               </widget>
+               <packing>
+                 <property name="left_attach">1</property>
+                 <property name="right_attach">2</property>
+                 <property name="top_attach">2</property>
+                 <property name="bottom_attach">3</property>
+                 <property name="x_options">fill</property>
+                 <property name="y_options"></property>
+               </packing>
+             </child>
            </widget>
            <packing>
              <property name="tab_expand">False</property>