Bunch of changes, most notably stereo VU meters, LADSPA fixes improved
authorterminatorX <>
Tue, 3 Feb 2004 22:51:31 +0000 (22:51 +0000)
committerterminatorX <>
Tue, 3 Feb 2004 22:51:31 +0000 (22:51 +0000)
error handling - Alex

67 files changed:
ChangeLog
INSTALL
README
README.PERFORMANCE
TODO
configure.in
src/main.cc
src/tX_audiodevice.cc
src/tX_audiodevice.h
src/tX_audiofile.cc
src/tX_audiofile.h
src/tX_capabilities.cc
src/tX_capabilities.h
src/tX_dial.c
src/tX_dial.h
src/tX_dialog.cc
src/tX_dialog.h
src/tX_endian.c
src/tX_endian.h
src/tX_engine.cc
src/tX_engine.h
src/tX_event.cc
src/tX_event.h
src/tX_extdial.cc
src/tX_flash.c
src/tX_flash.h
src/tX_glade_callbacks.cc
src/tX_global.c
src/tX_global.h
src/tX_icon.c
src/tX_icon.h
src/tX_knobloader.c
src/tX_knobloader.h
src/tX_ladspa.cc
src/tX_ladspa.h
src/tX_ladspa_class.cc
src/tX_ladspa_class.h
src/tX_legacy_global.c
src/tX_legacy_vtt.cc
src/tX_loaddlg.cc
src/tX_loaddlg.h
src/tX_logo.c
src/tX_mastergui.cc
src/tX_mastergui.h
src/tX_mouse.cc
src/tX_mouse.h
src/tX_panel.cc
src/tX_panel.h
src/tX_pbutton.cc
src/tX_pbutton.h
src/tX_prelis.cc
src/tX_prelis.h
src/tX_seqpar.cc
src/tX_sequencer.cc
src/tX_sequencer.h
src/tX_tape.cc
src/tX_tape.h
src/tX_types.h
src/tX_vtt.cc
src/tX_vtt.h
src/tX_vttfx.cc
src/tX_vttfx.h
src/tX_vttgui.cc
src/tX_vttgui.h
src/tX_widget.c
src/tX_widget.h
src/version.h

index 6d3cc669352fc872af6862552b57f66f19f672b7..e6ad408d19eae83c702eb76a1b4c18b8ec06fcad 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -13,6 +13,22 @@ changed.
   instance press the "Stereo FX" button and select the plugin of your choice.
 - fixed the plugin menu - empty categories no longer get a menu entry.
 - plugins that do not qualify as realtime capable will now be disabled.
+- I'm fed up with terminatorX related security postings, so the old suid-root
+  method had to go. To achieve realtime scheduling you now have two options:
+   a) run terminatorX as root (obviously dangerous and not recommended)
+   b) build terminatorX with capabilities enabled and install it suid-root.
+      Due to the use of PR_SET_KEEPCAPS this will work on Linux _only_.
+   c) use the JACK backend with "POSIX draft capabilities" (see jackd manpage)
+- Loading sets with missing LADPSA plugins no longer crash tX.
+- Fixed a bug that made reading error messages impossible with the load dialog
+  open.
+- The engine now handles audiodevices that break down when already in playback
+  mode more gracefully. This really necessary when jack decides to kick us out.
+- All vu meters are stereo now. Having a mono widget for a stereo thing just
+  didn't make any sense anymore.
+- modified the render loop to comply with LADSPA V1.1: 0 db is now at 1.0f. This
+  makes a lot of plugins work with terminatorX that haven't worked with previous
+  releases.
 
 [v3.81]
 - JACK doesn't seem to like SCHED_FIFO clients so I added a little test that
diff --git a/INSTALL b/INSTALL
index c7ac4465db8ac7c2264c424b1c606646801e0b75..ff1ac9ed4a6084b748e5e50fece1a1903f780086 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -1,5 +1,5 @@
 terminatorX INSTALL:
-Copyright (C) 1999 - 2003 by Alexander König <alex@lisas.de>
+Copyright (C) 1999-2004 by Alexander König <alex@lisas.de>
 http://terminatorX.cx
 
 Note: As of Version 3.70 you need to have LADSPA installed to compile
@@ -98,12 +98,6 @@ Step 1: Configure terminatorX.
                Allows running terminatorX suid-root to gain realtime scheduling
                (see README.PERFORMANCE).
                
-               --enable-suidroot
-               
-               Allows running terminatorX suid-root to gain realtime scheduling
-               (see README.PERFORMANCE) - if your Linux system has capabilities
-               you should prefer that method.
-               
                --with-docdir
                
                If you intend to package terminatorX this flag will allow terminatorX
diff --git a/README b/README
index 408c81af2212371669d4d626fff5d37f5a0193c5..731c2637b0edd50794a5efec2d6754fdcca9b36d 100644 (file)
--- a/README
+++ b/README
@@ -1,7 +1,7 @@
-terminatorX V3.81 README
+terminatorX V3.82 README
 ------------------------
 
-Copyright (C) 1999 - 2003 Alexander König
+Copyright (C) 1999-2004 Alexander König
 eMail: alex@lisas.de
 Homepage: http://terminatorX.cx
 
index 5e67904a04b8d3f7b4aafc0d69ed32d13f19dea9..4eccfff1dff15cb1c052098602536da6e49e1116 100644 (file)
@@ -17,27 +17,21 @@ happens fast. Some gtk+ engines can slow down drawing signifcantly
 2. Install suid root
 --------------------
 
-Note: Installing a program suid-root is always potentially dangerous. However
+Note: Installing a program suid-root is always potentially dangerous. However,
 a program needs special privileges to acquire realtime scheduling (which 
-improves playback quality signifcantly). Since release 3.81 terminatorX provides
-two methods of running suid root:
+improves playback quality signifcantly). Since release 3.82 terminatorX provides
+only one method of running suid root:
 
 - Linux' POSIX capabilities: when capabilities support is available at
   compile time (requires libcap) terminatorX can make use of Linux' POSIX
   capabilities. The binary has to be installed suid root but the program
   will drop root privileges right on startup - after aquiring the CAP_SYS_NICE
   capability.
-  
-- The "old" suid-root way: terminatorX starts the engine thread with root
-  privileges (and realtime scheduling). Then both threads drop root privileges.
-  Unfortunately the standard Linux 2.4 pthreads implementation has an extra
-  "manager" thread that keeps running as root. So it might be possible to gain
-  root privileges somehow. This has been shown before - the detected holes 
-  have been close, but I'm confident that others do exist.
-
-As the 2nd approach is more dangerous you have to explictly enable it at
-compile time (run configure with --enable-suidroot). However both methods might
-be exploitable somehow - so your not getting any garanties either way.
+
+While the capabilities based approach seems much more secure than the approach
+that was previously implemented, it might still be exploitable. So, for 100%
+security you have to do without realtime scheduling and not install terminatorX
+suid root.
 
 3. Compile an optimized binary
 ------------------------------
@@ -56,8 +50,8 @@ in the options dialog.
 5. Optimize your kernel
 -----------------------
 
-2.6 Kernels have much lower latency than older Kernels - if you want to work 
-with a stable Kernel however I recommend patching the 2.4 Series with Con 
-Kolivas' "ck" patches. They improve terminatorX performace signifcantly - if you
-dont forget to renice your X to '0' (see Con Kolivas' FAQ at 
+2.6 Kernels have much lower latency than previous versions - if you prefer 2.4
+Kernels however, I recommend patching the 2.4 Series with Con Kolivas' "ck" 
+patches. They improve terminatorX performace signifcantly - if you dont forget 
+to renice your X to '0' (see Con Kolivas' FAQ at 
 http://members.optusnet.com.au/ckolivas/kernel/).
diff --git a/TODO b/TODO
index c619f90aa6253fee2b9c7eb4dd0b81668b2ad425..e695d617fa29a8f13bade93005988ce203d0ff57 100644 (file)
--- a/TODO
+++ b/TODO
@@ -8,7 +8,9 @@ High priority milestones:
 
 I'd like to have this in 4.0:
 
-- Support stereo LADSPA plugins somehow.
+- Now, that stereo LADSPA plugins are done, I'd really like to:
+  Find a replacement for DGA mouse grabbing as that has some problems and 
+  might be gone sometime from now.
 
 Low priority milestones:
 ------------------------
@@ -17,9 +19,6 @@ This might come after 4.0:
 
 - Implement a sequencer editor GUI to delete, copy & paste, edit event etc.
 
-- Find a replacement for DGA mouse grabbing as that has some problems and 
-  might be gone sometime from now.
-    
 - Support other languages.
 
 - Support multiple audio devices in parallel maybe?
index 58a092c8acb0dff48e97ada6984191f1c9382380..726774cdbf3037a92f0246f8f83f0979e5cda2ca 100644 (file)
@@ -22,8 +22,7 @@ AC_ARG_ENABLE(audiofile,      [  --disable-audiofile     disable audiofile support (d
 AC_ARG_ENABLE(legacy,          [  --enable-legacy         enable support for old terminatorX files (default=no) ])
 AC_ARG_ENABLE(alsamidi,                [  --disable-alsamidi      disable support  ALSA MIDI in (default=auto) ])
 AC_ARG_ENABLE(lrdf,            [  --disable-lrdf          disable support for liblrdf (default=auto) ])
-AC_ARG_ENABLE(suidroot,                [  --enable-suidroot       enable old suid-root exec method (default=no) ])
-AC_ARG_ENABLE(capabilities,    [  --enable-capabilities   an alternative suid-root method (default=auto) ])
+AC_ARG_ENABLE(capabilities,    [  --enable-capabilities   to use rt-scheduling (default=auto) ])
 AC_ARG_ENABLE(deprecated,      [  --disable-deprecated    compile without deprecated G*-headers (default=no) ])
 AC_ARG_WITH(docdir,            [  --with-docdir=/some/dir the final location the docs will be installed to. ])
 
@@ -50,7 +49,6 @@ OPTION_SCHEDULER="no"
 OPTION_ALSAMIDI="no"
 OPTION_LEGACY="no"
 OPTION_LRDF="no"
-OPTION_SUIDROOT="no"
 OPTION_CAP="no"
 
 dnl Checks for libraries.
@@ -399,11 +397,6 @@ if test "$enable_benchmark" = yes; then
        AC_DEFINE_UNQUOTED([CREATE_BENCHMARK], 1, [Define this to build an performance benchmark - WARNING: You cannot use the resulting binary for normal operation])
 fi
 
-if test "$enable_suidroot" = yes; then
-       OPTION_SUIDROOT="yes";
-       AC_DEFINE_UNQUOTED([ALLOW_SUID_ROOT], 1, [Define this only if you know what you're doing.])
-fi
-
 if test "$enable_capabilities" != "no"; then
        AC_CHECK_HEADERS(sys/capability.h,capheader=yes,capheader=no)
        AC_CHECK_HEADERS(sys/prctl.h,prctlheader=yes,prctlheader=no)
@@ -652,7 +645,6 @@ option_info;
 echo "legacy files support: $OPTION_LEGACY"
 echo "builtin-wav support: $OPTION_WAV"
 echo "enhanced scheduling support: $OPTION_SCHEDULER"
-echo "old suid-root support: $OPTION_SUIDROOT"
 echo "capabilities support: $OPTION_CAP"
 echo "GNOME support: $OPTION_GNOME"
 echo
index 909a04a5f7d6fc7f66863e4292124f7ff35de156..805401cc321a143264d616956cb1d61c408c4546 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
 
     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
@@ -186,7 +186,7 @@ void checkenv(const char *name)
 
 int main(int argc, char **argv)
 {
-       fprintf(stderr, "%s - Copyright (C) 1999-2003 by Alexander König\n", VERSIONSTRING);
+       fprintf(stderr, "%s - Copyright (C) 1999-2004 by Alexander König\n", VERSIONSTRING);
        fprintf(stderr, "terminatorX comes with ABSOLUTELY NO WARRANTY - for details read the license.\n");
 
 #ifdef USE_CAPABILITIES        
@@ -196,9 +196,10 @@ int main(int argc, char **argv)
                }
                set_nice_capability(CAP_PERMITTED);
        }
-       
+#endif
+
        if ((!geteuid()) && (getuid() != geteuid())) {
-               tX_debug("main() - capabilites set, dropping root privileges.");
+               tX_msg("runnig suid-root - dropping root privileges.");
                
                int result=setuid(getuid());
                
@@ -208,20 +209,16 @@ int main(int argc, char **argv)
                }
        }
        
+       /* No suidroot below this comment. */
+       
+#ifdef USE_CAPABILITIES                
        set_nice_capability(CAP_EFFECTIVE);     
 #endif
        
+       /* Theses checks are now sort of unecessary... Anyway... */
        checkenv("HOME");
        checkenv("XLOCALEDIR"); 
 
-#ifndef USE_CAPABILITIES
-       /* If we're not using capabilities we're still 
-          running suid-root here. So we get rid of root
-          before doing anything esle.
-       */
-       tX_engine *engine=tX_engine::get_instance();
-#endif 
-       
        gtk_init (&argc, &argv);
        gtk_set_locale();
        
@@ -231,18 +228,11 @@ int main(int argc, char **argv)
                show_about(1);
                g_timeout_add(2000, (GSourceFunc) timeout, NULL);
        }
-
-#ifdef USE_CAPABILITIES
-       /* If we have capabilities it's save to
-          first read the config and then create 
-          the engine.
-       */
+       
        tX_engine *engine=tX_engine::get_instance();
-#endif 
-
        LADSPA_Class::init();
        LADSPA_Plugin::init();
-       //LADSPA_Class::dump();
+
 #ifdef USE_JACK        
        tX_jack_client::init();
 #endif 
index e7e4d5a789cba3881fc3c721752d86f0c55674c1..34056f1955c028814bea56dd74eca71bd48e0dc6 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index b87a61257c4729129422a794d9f323276cf0642e..56c4635db822d46cf618724ef44ad1acaeae39ae 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index fe38aab59bec75a3b3c92c3faa4016c1dc04b5e7..68bbb67195619483b7d2a8c3f70cfb29bec790a5 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index a3e4eabd4398ccda8698fe8b4511f82ff5b8637d..d908dc4af848a14723cd64d5e135daae2a472ab1 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index 62809b0397994e81a3bd859c488ccc35786a2bbf..caed0d0bf0bbb0ba4569b3231d26cb108557f20f 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index 281de149b4c43c2a73015c6884ba3ff32d451caf..5debd9cc15b203bf9baabda113c5cc85e6b9747f 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index 8586bd6bf7d7b655ef5abcc5fce2e21e24d4185c..df3fd8312bf2703c1d863f0d066baeb4e272c7e9 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index 82dbe2795f7ef8c6a669d6cf584b4632fb58d2f8..b919443d4c06688dc2f4d9aac01a73cf5aed8221 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index 5b96e3be57b584537f802ce11f9f6cbb2006f91a..31ab0d42972275d414c59653fecc1120b4ef56af 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
@@ -158,10 +158,8 @@ void apply_options(GtkWidget *dialog) {
                gtk_widget_queue_draw((*vtt)->gui.flash);
        }
        
-       gtk_tx_flash_update_colors(GTK_TX_FLASH(main_flash_l));
-       gtk_widget_queue_draw(main_flash_l);
-       gtk_tx_flash_update_colors(GTK_TX_FLASH(main_flash_r));
-       gtk_widget_queue_draw(main_flash_r);
+       gtk_tx_flash_update_colors(GTK_TX_FLASH(main_flash));
+       gtk_widget_queue_draw(main_flash);
        
 #ifdef USE_JACK
        jack_check();
@@ -565,7 +563,7 @@ void show_about(int nag)
                gtk_misc_set_alignment(GTK_MISC(label), 0.1, 0.5);
                gtk_widget_show(label);
 
-               label=gtk_label_new("Copyright (C) 1999-2003 by Alexander K\xC3\xB6nig");
+               label=gtk_label_new("Copyright (C) 1999-2004 by Alexander K\xC3\xB6nig");
                gtk_box_pack_start(GTK_BOX(box2), label, WID_DYN);
                gtk_misc_set_alignment(GTK_MISC(label), 0.9, 0.5);
                gtk_widget_show(label);
@@ -583,7 +581,7 @@ void show_about(int nag)
                sep=gtk_hseparator_new();
                add_about_wid_fix(sep);
                
-               label=gtk_label_new("This is "PACKAGE" release "VERSION" - Copyright (C) 1999-2003 by Alexander K\xC3\xB6nig"
+               label=gtk_label_new("This is "PACKAGE" release "VERSION" - Copyright (C) 1999-2004 by Alexander K\xC3\xB6nig"
                "\nSend comments, patches and scratches to: alex@lisas.de\nterminatorX-homepage: http://www.terminatorX.cx");
 
                gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER);
index 61b39b51816daeb0784a49b9d3f70658dcb92d19..32547dc0305d2e0d18e51677d6eba9ac441ef8ef 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index 0cc2e444ee3ab9033a913ff0de9aaa95e6fc762b..aefe73306404c2a6d4d2226e86c7f72f147d3404 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index 7b9def05d4301df6d9f311e485a6851c56bb79ab..23ba5b06b99cf5e2ad236d33ef1a3aee4884d5fa 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index 87a45e670a0142f9db86dac067fe06169aafc48d..d2437cdf1c83aed0ce17c9a99597ee7d91ef5b13 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
@@ -127,7 +127,7 @@ void tX_engine::loop() {
                        parm.sched_priority=sched_get_priority_max(SCHED_FIFO);
                                                
                        if (pthread_setschedparam(pthread_self(), SCHED_FIFO, &parm)) {
-                               tX_error("loop(): failed to set realtime priority.");
+                               tX_msg("loop(): failed to set realtime priority.");
                        } else {
                                tX_debug("loop(): set SCHED_FIFO.");
                        }
@@ -136,7 +136,7 @@ void tX_engine::loop() {
                        parm.sched_priority=sched_get_priority_max(SCHED_OTHER);
                                                
                        if (pthread_setschedparam(pthread_self(), SCHED_OTHER, &parm)) {
-                               tX_error("loop(): failed to set non-realtime priority.");
+                               tX_msg("loop(): failed to set non-realtime priority.");
                        } else {
                                tX_debug("loop(): set SCHED_OTHER.");
                        }                       
@@ -146,7 +146,19 @@ void tX_engine::loop() {
                pthread_mutex_unlock(&start);
 
                if (!stop_flag) device->start(); // Hand flow control over to the device
+
+               // in case we got kicked out by jack we might have
+               // to kill the mouse grab
+               if (grab_active) {
+                       mouse->ungrab();
+                       grab_active=false;
+                       grab_off(); // for the mastergui this is...
+               }
                
+               if (!stop_flag) {
+                       runtime_error=true;
+                       usleep(100);
+               }
                /* Stopping engine... */
                loop_is_active=false;
        }
@@ -156,71 +168,30 @@ void *engine_thread_entry(void *engine_void) {
        tX_engine *engine=(tX_engine*) engine_void;
        int result;
        
-       /* Dropping root privileges for the engine thread - if running suid. */
-       
-       if ((!geteuid()) && (getuid() != geteuid())) {
-#ifdef USE_CAPABILITIES
-               tX_error("engine_thread_entry(): using capabilities but still suid root?");
-               tX_error("engine_thread_entry(): Please report this.");
-               exit(-1);
-#endif
-               
-#ifndef ALLOW_SUID_ROOT
-               tX_error("This binary doesn't support running suid-root.");
-               tX_error("Reconfigure with --enable-capabilities or --enable-suidroot if you really want that.");
-               exit(-1);
-#endif         
-               tX_debug("engine_thread_entry() - Running suid root - dropping privileges.");
-               
-               result=setuid(getuid());
-               
-               if (result!=0) {
-                       tX_error("engine_thread_entry() - Failed to drop root privileges.");
-                       exit(2);
-               }
-       }
-
 #ifdef USE_SCHEDULER
        pid_t pid=getpid();
        struct sched_param parm;
 
-#ifdef USE_CAPABILITIES
-       if (have_nice_capability()) {
-               if (globals.use_realtime) {
-                       sched_getparam(pid, &parm);
-                       parm.sched_priority=sched_get_priority_max(SCHED_FIFO);
-                                               
-                       if (pthread_setschedparam(pthread_self(), SCHED_FIFO, &parm)) {
-                               tX_error("engine_thread_entry(): failed to set realtime priority.");
-                       } else {
-                               tX_debug("engine_thread_entry(): set SCHED_FIFO via capabilities.");
-                       }
+       if (globals.use_realtime) {
+               sched_getparam(pid, &parm);
+               parm.sched_priority=sched_get_priority_max(SCHED_FIFO);
+                                       
+               if (pthread_setschedparam(pthread_self(), SCHED_FIFO, &parm)) {
+                       tX_warning("engine_thread_entry(): failed to set realtime priority.");
+               } else {
+                       tX_debug("engine_thread_entry(): set SCHED_FIFO via capabilities.");
                }
-       } else {
-               tX_warning("engine_thread_entry(): can't set SCHED_FIFO -> lacking capabilities.");
        }
-#endif //USE_CAPABILITIES
        int policy=0;
-       
-       pthread_getschedparam(pthread_self(), &policy, &parm);
-       if (policy!=SCHED_FIFO) {
-               tX_warning("engine_thread_entry() - engine has no realtime priority scheduling.");
-       }
 #endif //USE_SCHEDULER
                
 #ifdef USE_JACK
        /* Create the client now, so the user has something to connect to. */
        tX_jack_client::get_instance();
 #endif 
-
-#ifdef USE_SCHEDULER
-       tX_debug("engine_thread_entry() engine thread is p: %i, t: %i and has policy %i.", getpid(), (int) pthread_self(), sched_getscheduler(getpid()));
-#endif
        
        engine->loop();
-       
        tX_debug("engine_thread_entry() engine thread terminating.");
-       
        pthread_exit(NULL);
 }
 
@@ -231,60 +202,13 @@ tX_engine :: tX_engine() {
        pthread_mutex_lock(&start);
        thread_terminate=false;
        
-       /* Creating the actual engine thread.. */
-#ifdef USE_SCHEDULER   
-       if (!geteuid() /* && globals.use_realtime */) {
-
-#ifndef ALLOW_SUID_ROOT
-               tX_error("This binary doesn't support running suid-root.");
-               tX_error("Reconfigure with --enable-capabilities or --enable-suidroot if you really want that.");
-               exit(-1);
-#endif         
-               
-               pthread_attr_t pattr;
-               struct sched_param sparm;
-               
-               tX_debug("tX_engine() - setting SCHED_FIFO.");
-               
-               pthread_attr_init(&pattr);
-               pthread_attr_setdetachstate(&pattr, PTHREAD_CREATE_JOINABLE);
-               pthread_attr_setschedpolicy(&pattr, SCHED_FIFO);
-       
-               sched_getparam(getpid(), &sparm);
-               sparm.sched_priority=sched_get_priority_max(SCHED_FIFO);
-       
-               pthread_attr_setschedparam(&pattr, &sparm);
-               pthread_attr_setinheritsched(&pattr, PTHREAD_EXPLICIT_SCHED);
-               pthread_attr_setscope(&pattr, PTHREAD_SCOPE_SYSTEM);
-               
-               result=pthread_create(&thread, &pattr, engine_thread_entry, (void *) this);
-       } else {
-#endif // USE_SCHEDULER
-               //tX_debug("tX_engine() - can't set SCHED_FIFO euid: %i.", geteuid());
-               
-               result=pthread_create(&thread, NULL, engine_thread_entry, (void *) this);
-#ifdef USE_SCHEDULER           
-       }
-#endif
+       result=pthread_create(&thread, NULL, engine_thread_entry, (void *) this);
        
        if (result!=0) {
                tX_error("tX_engine() - Failed to create engine thread. Errno is %i.", errno);
                exit(1);
        }
        
-       /* Dropping root privileges for the main thread - if running suid. */
-       
-       if ((!geteuid()) && (getuid() != geteuid())) {
-               tX_debug("tX_engine() - Running suid root - dropping privileges.");
-               
-               result=setuid(getuid());
-               
-               if (result!=0) {
-                       tX_error("tX_engine() - Failed to drop root privileges.");
-                       exit(2);
-               }
-       }
-       
        mouse=new tx_mouse();
 #ifdef USE_ALSA_MIDI_IN        
        midi=new tX_midiin();
@@ -306,6 +230,7 @@ void tX_engine :: set_recording_request (bool recording) {
 tX_engine_error tX_engine :: run() {
        list <vtt_class *> :: iterator vtt;
        
+       runtime_error=false;
        if (loop_is_active) return ERROR_BUSY;
        
        switch (globals.audiodevice_type) {
index f1f12a0b62a3b29ef6863976c60286ed1ceb0e82..a86ec840bed33206a9bc53f09b6267e5a58526b2 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
@@ -74,16 +74,16 @@ class tX_engine {
        bool loop_is_active;
        bool grab_request;
        bool grab_active;
+       bool runtime_error;
        
-       public:
-
 #ifdef USE_ALSA_MIDI_IN
-       tX_midiin *midi;
-       tX_midiin *get_midi() { return midi; }
+       private: tX_midiin *midi;
+       public: tX_midiin *get_midi() { return midi; }
 #endif 
+       public:
 
        pthread_t get_thread_id() { return thread; }
-       
+       bool get_runtime_error() { return runtime_error; }
        static tX_engine *get_instance();
        tX_engine();
        ~tX_engine();
index 3a86e7b3920204deab98e2a6d55368bcbc01b54a..ea2d3d878060e7534f0006af1ac59c02832df396 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
@@ -28,9 +28,13 @@ 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) {
+tX_event* tX_event :: load_event (xmlDocPtr doc, xmlNodePtr node) {
        unsigned int sp_persistence_id;
        char *buffer;
+       float value;
+       guint32 timestamp;
+       tX_event *event=NULL;
+       tX_seqpar *sp=NULL;
        
        buffer=(char *) xmlGetProp(node, (xmlChar *) "pid");
        if (buffer) sscanf(buffer, "%i", &sp_persistence_id);
@@ -43,7 +47,11 @@ tX_event :: tX_event (xmlDocPtr doc, xmlNodePtr node) {
 
        sp=tX_seqpar::get_sp_by_persistence_id(sp_persistence_id);
        
-       if (!sp) {
-               tX_error("fatal: couldn't resolve seq. parameter for event at %i.", timestamp);
+       if (sp) {
+               event=new tX_event(sp, timestamp, value);
+       } else {
+               tX_error("failed to resolve event at %i - pid [%i]. Event lost.", timestamp, sp_persistence_id);
        }
+       
+       return event;
 }
index b669e160b2b4ab06c7a6ca0672c80c3fd7533683..1733bff71ee78edfd76a6c6b464988b90bc128b4 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
@@ -41,16 +41,18 @@ class tX_event
        tX_seqpar               *sp;
        
        public:
-       tX_event(guint32 time, float val, tX_seqpar *sp_in)
-               {
-                       timestamp=time;
-                       value=val;
-                       sp=sp_in;
-               }
+       tX_event(guint32 time, float val, tX_seqpar *sp_in) {
+               timestamp=time;
+               value=val;
+               sp=sp_in;
+       }
+       
 #ifdef ENABLE_TX_LEGACY                
        tX_event(FILE *input);
 #endif         
-       tX_event(xmlDocPtr, xmlNodePtr);
+       static tX_event* load_event(xmlDocPtr, xmlNodePtr);
+       tX_event(tX_seqpar *p, guint32 t, float v) : sp(p),timestamp(t),value(v) {}
+       
        void store(FILE *rc, gzFile rz, char *indent);
 
        tX_seqpar *get_sp() { return sp; }
@@ -58,13 +60,12 @@ class tX_event
        float get_value() { return value; }
        void set_value(float val) { value=val; }
 
-        char *get_vtt_name() { return sp->get_vtt_name(); }
-        const char *get_seqpar_name() { return sp->get_name(); }
+       char *get_vtt_name() { return sp->get_vtt_name(); }
+       const char *get_seqpar_name() { return sp->get_name(); }
 
-       void playback()
-               {
-                       if (sp->is_untouched()) sp->exec_value(value);
-               }
+       void playback() {
+               if (sp->is_untouched()) sp->exec_value(value);
+       }
 };
 
 #endif
index e154cec54ced38c087062792435f1ea6476cb4c5..77692aab1944b0afd1fa2b8c4977c83e60991b9d 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index fc60d0c5c48435fc1061e6ebfff03800e910ec8e..0f62fd1ec7de4d141e2d24b1042944911b1c3b7f 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
 extern "C" {
 #endif /* __cplusplus */
 
-#define MAX_VALUE 32767
-#define RED_BORDER 25000
-#define TX_FLASH_DEFAULT_SIZE_X 17
+#define MAX_VALUE 1.0f
+// 32767
+#define RED_BORDER 0.8f
+// 25000
+#define TX_FLASH_DEFAULT_SIZE_X 25
 #define TX_FLASH_DEFAULT_SIZE_Y 30
 #define DY 5
 #define DX 5
@@ -48,7 +50,7 @@ extern "C" {
 #define S_MINIX 2
 #define L_MINIX 3
 #define DLEVEL 3
-#define MAX_MAX_CYCLES 20;
+#define MAX_MAX_CYCLES 30;
 
 /* pre dec */
 static void gtk_tx_flash_class_init (GtkTxFlashClass *);
@@ -59,8 +61,6 @@ static void gtk_tx_flash_realize (GtkWidget *widget);
 static void gtk_tx_flash_size_request (GtkWidget *widget, GtkRequisition *requisition);
 static void gtk_tx_flash_size_allocate (GtkWidget *widget, GtkAllocation *allocation);
 static gint gtk_tx_flash_expose (GtkWidget *widget, GdkEventExpose *event);
-//static void gtk_tx_flash_prepare (GtkWidget *widget);
-//static void gtk_tx_flash_set_level(GtkWidget *widget, f_prec new_value);
 
 /* Local data */
 
@@ -224,13 +224,28 @@ static void gtk_tx_flash_prepare(GtkWidget *widget)
        tx_flash=GTK_TX_FLASH(widget);
 
        tx_flash->levels=(widget->allocation.height-(2*DY))/DLEVEL;
-       tx_flash->last_level=0;
+       tx_flash->channel[0].last_level=0;
+       tx_flash->channel[1].last_level=0;
+       tx_flash->channel[0].max=0;
+       tx_flash->channel[1].max=0;
        tx_flash->level_value=MAX_VALUE/(f_prec) tx_flash->levels;
        tx_flash->red_level=(RED_BORDER/tx_flash->level_value);
        
-       tx_flash->x1=DMINIX+S_MINIX+2;
-       tx_flash->x2=widget->allocation.width-tx_flash->x1-1;
-       tx_flash->max=0;
+       tx_flash->channel[0].x1=DMINIX+S_MINIX+2;
+       tx_flash->channel[1].x2=widget->allocation.width-tx_flash->channel[0].x1-1;
+       
+       if (widget->allocation.width%2>0) {
+               // odd
+               tx_flash->center_expand=0;
+               tx_flash->channel[0].x2=widget->allocation.width/2-2;
+       } else {
+               // even
+               tx_flash->center_expand=1;
+               tx_flash->channel[0].x2=widget->allocation.width/2-3;
+       }
+       tx_flash->channel[1].x1=widget->allocation.width/2+2;
+       
+       //tX_msg("flash: width %i: left %i, right %i", widget->allocation.width, tx_flash->channel[0].x2-tx_flash->channel[0].x1, tx_flash->channel[1].x2-tx_flash->channel[1].x1);
 }
 
 static void gtk_tx_flash_size_allocate(GtkWidget *widget, GtkAllocation *allocation)
@@ -257,7 +272,7 @@ static void gtk_tx_flash_size_allocate(GtkWidget *widget, GtkAllocation *allocat
 static void gtk_tx_flash_paint_yourself(GtkWidget *widget)
 {
        GtkTxFlash *tx_flash;
-       gint i, x11, x12,x21, x22, y;
+       gint i, x11, x12,x21, x22, y, middle;
        int long_level;
        
        tx_flash = GTK_TX_FLASH (widget);
@@ -270,6 +285,7 @@ static void gtk_tx_flash_paint_yourself(GtkWidget *widget)
        
        x12=DMINIX+S_MINIX;
        x21=widget->allocation.width-1-x12;
+       middle=widget->allocation.width/2;
        
        for (i=0, y=widget->allocation.height-DY; i<=tx_flash->levels; y-=DLEVEL, i++) {
                if (i==0) {
@@ -293,6 +309,12 @@ static void gtk_tx_flash_paint_yourself(GtkWidget *widget)
                
                gdk_draw_line(widget->window, widget->style->fg_gc[widget->state], x11, y, x12, y);
                gdk_draw_line(widget->window, widget->style->fg_gc[widget->state], x21, y, x22, y);
+               
+               if (tx_flash->center_expand) {
+                       gdk_draw_line(widget->window, widget->style->fg_gc[widget->state], middle-1, y, middle, y);                     
+               } else {
+                       gdk_draw_point(widget->window, widget->style->fg_gc[widget->state], middle, y);
+               }
        }
 }
 
@@ -311,7 +333,10 @@ static gint gtk_tx_flash_expose (GtkWidget *widget, GdkEventExpose *event)
        return FALSE;
 } 
 
-void gtk_tx_flash_set_level(GtkWidget *widget, f_prec new_value)
+
+static void gtk_tx_flash_set_channel_level(GtkTxFlash *tx_flash, f_prec new_value, struct flash_channel *channel);
+
+void gtk_tx_flash_set_level(GtkWidget *widget, f_prec left_channel, f_prec right_channel)
 {
        GtkTxFlash *tx_flash;
        gint i, y;
@@ -323,69 +348,80 @@ void gtk_tx_flash_set_level(GtkWidget *widget, f_prec new_value)
        
        tx_flash = GTK_TX_FLASH (widget);
        
+       gtk_tx_flash_set_channel_level(tx_flash, left_channel, &tx_flash->channel[0]);
+       gtk_tx_flash_set_channel_level(tx_flash, right_channel, &tx_flash->channel[1]);
+}
+
+static void gtk_tx_flash_set_channel_level(GtkTxFlash *tx_flash, f_prec new_value, struct flash_channel *channel)
+{
+       GtkWidget *widget=GTK_WIDGET(tx_flash);
+       gint i, y;
+       int new_level;
+       int red=0;
+       
        new_level=(int) (new_value/tx_flash->level_value);
        
        if (new_level>tx_flash->levels) 
                new_level=tx_flash->levels;
        
-       if (new_level>tx_flash->max) {
-               tx_flash->max=new_level;
+       if (new_level>channel->max) {
+               channel->max=new_level;
                tx_flash->max_cycles=MAX_MAX_CYCLES;
        } else {
                tx_flash->max_cycles--;
        }
        
        if (tx_flash->max_cycles <= 0) {
-               y=widget->allocation.height-(DY+(tx_flash->max)*DLEVEL);
+               y=widget->allocation.height-(DY+(channel->max)*DLEVEL);
                gdk_gc_set_foreground(widget->style->fg_gc[widget->state], &tx_flash->colors[COL_BG]);
-               gdk_draw_line(widget->window, widget->style->fg_gc[widget->state], tx_flash->x1, y, tx_flash->x2, y);
+               gdk_draw_line(widget->window, widget->style->fg_gc[widget->state], channel->x1, y, channel->x2, y);
                
-               if (tx_flash->max>0) {
-                       tx_flash->max--;
+               if (channel->max>0) {
+                       channel->max--;
                        y+=DLEVEL;
-                       if (tx_flash->max>tx_flash->red_level) {
+                       if (channel->max>tx_flash->red_level) {
                                gdk_gc_set_foreground(widget->style->fg_gc[widget->state], &tx_flash->colors[COL_LOUD]);
                        } else {
                                gdk_gc_set_foreground(widget->style->fg_gc[widget->state], &tx_flash->colors[COL_NORM]);
                        }
                        
-                       gdk_draw_line(widget->window, widget->style->fg_gc[widget->state], tx_flash->x1, y, tx_flash->x2, y);   
+                       gdk_draw_line(widget->window, widget->style->fg_gc[widget->state], channel->x1, y, channel->x2, y);
                }
        }
        
-       if (new_level==tx_flash->last_level) 
+       if (new_level==channel->last_level) 
                return;
        
-       if (new_level<tx_flash->last_level) {
-               new_level=tx_flash->last_level*globals.flash_response;
+       if (new_level<channel->last_level) {
+               new_level=channel->last_level*globals.flash_response;
        }
        
-       if (new_level>tx_flash->last_level) {
+       if (new_level>channel->last_level) {
                gdk_gc_set_foreground(widget->style->fg_gc[widget->state], &tx_flash->colors[COL_NORM]);
                
-               for (i=tx_flash->last_level, y=widget->allocation.height-(DY+tx_flash->last_level*DLEVEL); i<=new_level; y-=DLEVEL, i++) {
+               for (i=channel->last_level, y=widget->allocation.height-(DY+channel->last_level*DLEVEL); i<=new_level; y-=DLEVEL, i++) {
                        if (!red) {
                                if (i>=tx_flash->red_level) {
                                        gdk_gc_set_foreground(widget->style->fg_gc[widget->state], &tx_flash->colors[COL_LOUD]);
                                        red=1;
                                }
                        }
-                       gdk_draw_line(widget->window, widget->style->fg_gc[widget->state], tx_flash->x1, y, tx_flash->x2, y);
+                       gdk_draw_line(widget->window, widget->style->fg_gc[widget->state], channel->x1, y, channel->x2, y);
                }
        } else {
                gdk_gc_set_foreground(widget->style->fg_gc[widget->state], &tx_flash->colors[COL_BG]);
                
-               if (tx_flash->last_level==tx_flash->max) {
-                       i=tx_flash->last_level-1;
+               if (channel->last_level==channel->max) {
+                       i=channel->last_level-1;
                } else {
-                       i=tx_flash->last_level;
+                       i=channel->last_level;
                }
                
                for (y=widget->allocation.height-(DY+i*DLEVEL); i>new_level; y+=DLEVEL, i--) {
-                       gdk_draw_line(widget->window, widget->style->fg_gc[widget->state], tx_flash->x1, y, tx_flash->x2, y);
+                       gdk_draw_line(widget->window, widget->style->fg_gc[widget->state], channel->x1, y, channel->x2, y);
                }
        }
-       tx_flash->last_level=new_level;
+       channel->last_level=new_level;
 }
 
 void
@@ -395,9 +431,11 @@ gtk_tx_flash_clear (GtkWidget *widget)
 
        tx_flash = GTK_TX_FLASH (widget);
        
-       tx_flash->max=0;
+       tx_flash->channel[0].max=0;
+       tx_flash->channel[1].max=0;
+       tx_flash->channel[0].last_level=0;
+       tx_flash->channel[1].last_level=0;
        tx_flash->max_cycles=0;
-       tx_flash->last_level=0;
        
        gtk_tx_flash_paint_yourself(widget);
 }
index 16ed9bb77af465b19ec83b7e1ac1d7a5b22f9832..69553d389a46a0a5bffed1a4d027c263f243172c 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
@@ -41,20 +41,23 @@ extern "C" {
 typedef struct _GtkTxFlash GtkTxFlash;
 typedef struct _GtkTxFlashClass GtkTxFlashClass;
 
+struct flash_channel {
+       int last_level;
+       int max;
+       int x1;
+       int x2;
+};
+
 struct _GtkTxFlash {
        GtkWidget widget;
-
        GdkColor colors[5];     
-       
        int colors_allocated;
        int levels;
-       int last_level;
        int red_level;
        f_prec level_value;
-       
-       int x1, x2;
-       
-       int max, max_cycles;
+       int max_cycles;
+       int center_expand;
+       struct flash_channel channel[2];
 };
 
 struct _GtkTxFlashClass {
@@ -63,7 +66,7 @@ struct _GtkTxFlashClass {
 
 GtkWidget* gtk_tx_flash_new();
 GType gtk_tx_flash_get_type (void);
-void gtk_tx_flash_set_level (GtkWidget *widget, f_prec new_value);
+void gtk_tx_flash_set_level (GtkWidget *widget, f_prec left_channel, f_prec right_channel);
 void gtk_tx_flash_clear (GtkWidget *widget);
 void gtk_tx_flash_update_colors(GtkTxFlash *tx);
 
index 0dc998bf83c74a39131a7024276fa9548ef4ed1d..0cc15a47bc026fc2f85dece66472f730363d7760 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index 28113f4bc1f0ef6419643af803f8593624ecb7ce..248a6c98f4b078147e138a6f133a041077023222 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index 11a79f29873ad6ba96e71eba18573f30663ba9a6..f7bd8d2a1147e0868b9b864c4d8062f3d0a2ec5b 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
@@ -41,6 +41,9 @@ extern "C" {
 #define PATH_MAX 1024
 #endif
 
+#define FL_SHRT_MAX 32767.0
+#define FL_SHRT_MIN -32768.0
+
 #define BUTTON_TYPE_ICON 1
 #define BUTTON_TYPE_TEXT 2
 #define BUTTON_TYPE_BOTH 3
@@ -52,13 +55,14 @@ extern "C" {
 #include <zlib.h>
        
 #ifdef ENABLE_DEBUG_OUTPUT     
-#define tX_debug(fmt, args...); { fprintf(stderr, "- tX_debug: "); fprintf(stderr, fmt , ## args); fprintf(stderr, "\n"); }
+#define tX_debug(fmt, args...); { fprintf(stderr, "~ tX_debug: "); fprintf(stderr, fmt , ## args); fprintf(stderr, "\n"); }
 #else
 #define tX_debug(fmt, args...);
 #endif
        
 #define tX_error(fmt, args...); { fprintf(stderr, "* tX_error: "); fprintf(stderr, fmt , ## args); fprintf(stderr, "\n"); }
 #define tX_warning(fmt, args...); { fprintf(stderr, "+ tX_warning: "); fprintf(stderr, fmt , ## args); fprintf(stderr, "\n"); }
+#define tX_msg(fmt, args...); { fprintf(stderr, "- tX_msg: "); fprintf(stderr, fmt , ## args); fprintf(stderr, "\n"); }
 
 #ifdef MEM_DEBUG
 #define tX_freemem(ptr, varname, comment); fprintf(stderr, "** free() [%s] at %08x. %s.\n", varname, ptr, comment); free(ptr);
index f812eb9e377d09462d25c72bca02efbc660678e0..40eea496c3dcfcda5e80f5768108d72e34e40ef4 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index 698e7aa7141344c189f59e6461f08e845f3b5b20..fdc6bb41ad63499544bf902d50e0e3cb5a458fa5 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index 96ac333c4aeb30d0bc4116be27b5525b7b7eb520..b898824a129b8ec89993187a26ab691055d62a13 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index b3f232383b02dd21eb9b9be685ff80d3bf36e893..d73b6471c4b19299d677e03f48f6ac50bcdca751 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index faf1c2687138f66b397ea64ab70d4d2b5491693d..037c00223a9d29f424c128f336199c44e759e1b7 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
@@ -83,9 +83,9 @@ void LADSPA_Plugin :: handlelib(void *lib, LADSPA_Descriptor_Function desc_func,
        
        for (i=0; (descriptor = desc_func(i)) != NULL; i++) {           
                if (LADSPA_IS_INPLACE_BROKEN(descriptor->Properties)) {
-                       tX_warning("Plugin \"%s\" disabled. No in-place processing support.", descriptor->Name);
+                       tX_warning("Plugin \"%s\" [%i] disabled: No in-place processing support.", descriptor->Label, descriptor->UniqueID);
                } else if (!LADSPA_IS_HARD_RT_CAPABLE(descriptor->Properties)) {
-                       tX_warning("Plugin \"%s\" disabled. Not realtime capable.", descriptor->Name);                  
+                       tX_warning("Plugin \"%s\" [%i] disabled: Not realtime capable.", descriptor->Label, descriptor->UniqueID);                      
                } else {                
                        in_audio=0; out_audio=0; in_ctrl=0;
                
@@ -103,7 +103,7 @@ void LADSPA_Plugin :: handlelib(void *lib, LADSPA_Descriptor_Function desc_func,
                        } if ((in_audio == 2) && (out_audio == 2)) {
                                new LADSPA_Stereo_Plugin(descriptor, filename);
                        }
-                       else { tX_warning("Plugin \"%s\" disabled. Neither mono nor stereo.", descriptor->Name); }
+                       else { tX_warning("Plugin \"%s\" [%i] disabled: Neither mono nor stereo.", descriptor->Label, descriptor->UniqueID); }
                }
        }
 }
index de508035f81ef4adf782fc1061fe4a5247338e6e..ad34f6279306d62fedaa048116992b256234d14f 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index 3d236907f02b6432d9577aa935a4ed2a12fe1e1f..2f05ea852bfb2f17d5d2a79eead103e72743f053 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index 6ceba55804a68a0f05757a4e10dc62f5b4a4765e..c406a045506599cc2f7df81a0fa2c405cc8b4e34 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index 4f39537420ed78062c72425014f724d8d2114056..d42247890193e91afcc30357a9e6b36a666df585 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index 0106da3e9b4e644cca952eee9aa7bc7cdc404858..89992928c179df67960b903e7c17ad4fca4ec218 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index 36f68a41dca3f30d8be216e51f96e5185b7a9cba..4424ceab48858181d6612727ff8929d001df9f06 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
@@ -64,7 +64,7 @@ int ld_create_loaddlg(int mode, int count)
        ld_mode=mode;
        ld_count=count;
 
-       ld_loaddlg=gtk_window_new(GTK_WINDOW_POPUP);
+       ld_loaddlg=gtk_window_new(GTK_WINDOW_TOPLEVEL);
        gtk_window_set_position(GTK_WINDOW(ld_loaddlg), GTK_WIN_POS_CENTER_ON_PARENT);
        gtk_window_set_title(GTK_WINDOW(ld_loaddlg), "terminatorX - loading");
        gtk_window_set_transient_for(GTK_WINDOW(ld_loaddlg), GTK_WINDOW(main_window));
index 54367e00fc4aa863500ec4096d55438341cf4b58..fd6b71e6f3eb52d89e6cfd18f1a74d2716a48c40 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
@@ -26,7 +26,8 @@
 #define TX_LOADDLG_MODE_SINGLE 0
 #define TX_LOADDLG_MODE_MULTI 1
 
-#include <glib.h>
+#include <gtk/gtk.h>
+extern GtkWidget *ld_loaddlg;
 
 extern int ld_create_loaddlg(int mode, int count);
 extern void ld_set_setname(char *name);
index 0c488a7a08101a5790902299cae8797bc29b0756..5a10a9b57f06ac32cc37fb694a0913ac487aa702 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index 30bdbc2b45dfd4230a51ea5a3a444d1cb699bed5..0ceb50df273eefa468b600e74ce06dbc67b60355 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
@@ -68,8 +68,7 @@ GtkWidget *control_parent;
 GtkWidget *audio_parent;
 GtkWidget *main_window;
 GtkWidget *grab_button;
-GtkWidget *main_flash_l;
-GtkWidget *main_flash_r;
+GtkWidget *main_flash;
 
 GtkWidget *seq_rec_btn;
 GtkWidget *seq_play_btn;
@@ -119,7 +118,7 @@ GtkWidget *load_dialog=NULL;
 GdkWindow *rec_dialog_win=NULL;
 GtkWidget *rec_dialog=NULL;
 
-GtkWidget *no_of_vtts=NULL;
+//GtkWidget *no_of_vtts=NULL;
 GtkWidget *used_mem=NULL;
 
 int stop_update=0;
@@ -148,34 +147,29 @@ void turn_audio_off(void)
        }
 }
 
-
 gint pos_update(gpointer data)
 {
-       f_prec temp;
+       f_prec temp,temp2;
 
        if (stop_update) {              
                cleanup_all_vtts();
                tX_seqpar :: update_all_graphics();
                if (old_focus) gui_show_frame(old_focus, 0);
                old_focus=NULL;
-               gtk_tx_flash_clear(main_flash_l);
-               gtk_tx_flash_clear(main_flash_r);
+               gtk_tx_flash_clear(main_flash);
                gdk_flush();    
                update_tag=0;
-               return(FALSE);
+               return FALSE;
        } else {
                update_all_vtts();
                
-               /*left vu meter */
+               /*main vu meter */
                temp=vtt_class::mix_max_l;
                vtt_class::mix_max_l=0;
-               gtk_tx_flash_set_level(main_flash_l, temp);
-
-               /*right vu meter */
-               temp=vtt_class::mix_max_r;
+               temp2=vtt_class::mix_max_r;
                vtt_class::mix_max_r=0;
-               gtk_tx_flash_set_level(main_flash_r, temp);
-               
+               gtk_tx_flash_set_level(main_flash, temp/FL_SHRT_MAX, temp2/FL_SHRT_MAX);
+
                if (vtt_class::focused_vtt!=old_focus) {
                        if (old_focus) gui_show_frame(old_focus, 0);
                        old_focus=vtt_class::focused_vtt;
@@ -192,10 +186,17 @@ gint pos_update(gpointer data)
                
                if (update_delay < 0) {
                        seq_update();
-                       tX_seqpar :: update_all_graphics();
+                       tX_seqpar::update_all_graphics();
                        update_delay=globals.update_delay;
                }
-               return(TRUE);
+               
+               if (tX_engine::get_instance()->get_runtime_error()) {
+                       tX_error("ouch - error while playback...");
+                       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(engine_btn), 0);                 
+                       return FALSE;
+               }               
+               
+               return TRUE;
        }
 }
 
@@ -227,8 +228,8 @@ void mg_update_status()
                gtk_label_set_text(GTK_LABEL(used_mem), "");
        }
        
-       sprintf(buffer, "%i", vtt_class::vtt_amount);
-       gtk_label_set_text(GTK_LABEL(no_of_vtts), buffer);
+       /*sprintf(buffer, "%i", vtt_class::vtt_amount);
+       gtk_label_set_text(GTK_LABEL(no_of_vtts), buffer);*/
 }
 
 GtkSignalFunc new_table(GtkWidget *, char *fn)
@@ -330,7 +331,7 @@ void load_tt_part(char * buffer)
                        }
                        fclose(in);     
                } else {
-                       strcpy(idbuff, "Failed to access file: \"");    // I'm stealing the unrelated sting for a temp :)
+                       strcpy(idbuff, "Failed to access file: \"");    // I'm stealing the unrelated string for a temp :)
                        strcat(idbuff, globals.tables_filename);
                        strcat(idbuff, "\"");
                        tx_note(idbuff, true);
@@ -429,7 +430,6 @@ GtkSignalFunc drop_set(GtkWidget *widget, GdkDragContext *context,
        return NULL;
 }
 
-
 /* save tables */
 
 GtkSignalFunc cancel_save_tables(GtkWidget *wid)
@@ -558,7 +558,6 @@ void mg_enable_critical_buttons(int enable)
        vg_enable_critical_buttons(enable);
 }
 
-
 GtkSignalFunc seq_stop(GtkWidget *w, void *);
 
 static bool stop_override=false;
@@ -616,6 +615,10 @@ GtkSignalFunc audio_on(GtkWidget *w, void *d)
                
                seq_stop(NULL, NULL);
                mg_enable_critical_buttons(1);
+               
+               if (tX_engine::get_instance()->get_runtime_error()) {
+                       tx_note("Fatal: The audio device broke down while playing\nback audio. Note that that some audio devices can not\nrecover from such a breakdown.", true);
+               }
        }
        
        return NULL;
@@ -1401,13 +1404,9 @@ void create_mastergui(int x, int y)
        gtk_widget_show(dummy); 
        gui_set_tooltip(dummy, "Adjust the master volume. This parameter will effect *all* turntables in the set.");
        
-       main_flash_r=gtk_tx_flash_new();
-       gtk_box_pack_end(GTK_BOX(master_vol_box), main_flash_r, WID_DYN);
-       gtk_widget_show(main_flash_r);
-
-       main_flash_l=gtk_tx_flash_new();
-       gtk_box_pack_end(GTK_BOX(master_vol_box), main_flash_l, WID_DYN);
-       gtk_widget_show(main_flash_l);
+       main_flash=gtk_tx_flash_new();
+       gtk_box_pack_end(GTK_BOX(master_vol_box), main_flash, WID_DYN);
+       gtk_widget_show(main_flash);
 
        dummy=gtk_label_new("Volume");
        gtk_misc_set_alignment(GTK_MISC(dummy), 0.5, 0.5);
@@ -1434,7 +1433,7 @@ void create_mastergui(int x, int y)
        gtk_box_pack_end(GTK_BOX(status_box), dummy, WID_FIX);
        gtk_widget_show(dummy);
        
-       add_sep2();
+       /*add_sep2();
 
        dummy=gtk_label_new("1");
        no_of_vtts=dummy;
@@ -1445,19 +1444,19 @@ void create_mastergui(int x, int y)
        dummy=gtk_label_new("Vtts:");
        gtk_misc_set_alignment(GTK_MISC(dummy), 0, 0.5);
        gtk_box_pack_end(GTK_BOX(status_box), dummy, WID_FIX);
-       gtk_widget_show(dummy);
+       gtk_widget_show(dummy);*/
 
        add_sep2();
 
-       dummy=gtk_label_new(VERSION);
+       dummy=gtk_label_new("V "VERSION);
        gtk_misc_set_alignment(GTK_MISC(dummy), 1, 0.5);
        gtk_box_pack_end(GTK_BOX(status_box), dummy, WID_FIX);
        gtk_widget_show(dummy);
 
-       dummy=gtk_label_new("Release:");
+       /*dummy=gtk_label_new("Release:");
        gtk_misc_set_alignment(GTK_MISC(dummy), 0, 0.5);
        gtk_box_pack_end(GTK_BOX(status_box), dummy, WID_FIX);
-       gtk_widget_show(dummy);
+       gtk_widget_show(dummy);*/
        
        add_sep2();
 
@@ -1487,7 +1486,7 @@ void note_destroy(GtkWidget *widget, GtkWidget *mbox)
        gtk_widget_destroy(GTK_WIDGET(mbox));
 }
 
-void tx_note(const char *message, bool isError)
+void tx_note(const char *message, bool isError, GtkWindow *window)
 {
        char buffer[4096]="terminatorX ";
        if (isError) {
@@ -1496,8 +1495,10 @@ void tx_note(const char *message, bool isError)
                strcat(buffer, "error:\n\n");
        }
        
+       if (!window) window==GTK_WINDOW(main_window);
+       
        strcat(buffer, message);
-       GtkWidget *dialog=gtk_message_dialog_new(GTK_WINDOW(main_window),
+       GtkWidget *dialog=gtk_message_dialog_new(window,
                GTK_DIALOG_DESTROY_WITH_PARENT,
                isError ? GTK_MESSAGE_ERROR : GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, message);
        gtk_dialog_run(GTK_DIALOG(dialog));
index d4bfe9fd3a10c220c6bed5d3efa4ab4fb4906469..fafde356dce8e1c97fb3850fa579a529d466ebbf 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
@@ -35,10 +35,7 @@ extern GtkWidget *main_window;
 
 extern GtkAdjustment *volume_adj;
 extern GtkAdjustment *pitch_adj;
-
-
-extern GtkWidget *main_flash_l;
-extern GtkWidget *main_flash_r;
+extern GtkWidget *main_flash;
 
 extern tX_seqpar_master_volume sp_master_volume;
 extern tX_seqpar_master_pitch sp_master_pitch;
@@ -46,7 +43,7 @@ extern tX_seqpar_master_pitch sp_master_pitch;
 extern void create_mastergui(int x, int y);
 extern void wav_progress_update(gfloat percent);
 extern void note_destroy(GtkWidget *widget, GtkWidget *mbox);
-extern void tx_note(const char *message, bool isError=false);
+extern void tx_note(const char *message, bool isError=false, GtkWindow *window=NULL);
 extern void tx_l_note(const char *message);
 extern void display_mastergui();
 extern void grab_off();
index a98621b8ea1e3365bee8864a8eb397883f1c1ece..1106c1347fd41051bd3467a2ee7dcc60b4216d96 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index 67718e68f716290c902bc297e9e0a363a91fbf44..6dcd2fa7198b1b07bf9081d5fa524b315a8ce103 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index eed52bc72124ae91c48a8c6409f369cdc90331a7..6127dc13554c75d96f4d128775b54aa439a56023 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index fac2c1d7996c62ad14dac1a7a5a8e74f33121075..0a8092401cd48edc01733700d19fd393d99d380d 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index 22c5652bd83d6e1dca1919e332124cdf9c0c6791..e5a0dc1d8fe8999654bafdde80f6a66350535f4b 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index 29cb7caa86765415067bf0fee37ac86f2f85b21f..3bd6cda56ad986b0f7aa48946194b30e776c5edc 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index 3927d1d2a7511eb052b93ee337df6734c08f2ded..8980ead0b5028e3fbc8c5187d0b4683427d7fbda 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index 0da2fadc3d3675cae4c4eb44450f9dc32999329b..de4783382ff0846c1ee63528bc29f03ac19d9483 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index f2dd51ab047e5e511709708a36b45a032046b1de..bacbc2dfc2c42eb79437c9a4d899e50c707fb397 100644 (file)
@@ -150,8 +150,7 @@ void tX_seqpar :: untouch_all()
 {
        list <tX_seqpar *> :: iterator sp;
        
-       for (sp=all.begin(); sp!=all.end(); sp++)
-       {
+       for (sp=all.begin(); sp!=all.end(); sp++) {
                (*sp)->untouch();
        }
 }
@@ -161,8 +160,7 @@ void tX_seqpar :: create_persistence_ids()
        list <tX_seqpar *> :: iterator sp;
        int pid=0;
        
-       for (sp=all.begin(); sp!=all.end(); sp++)
-       {
+       for (sp=all.begin(); sp!=all.end(); sp++) {
                pid++;
                (*sp)->set_persistence_id(pid);
        }
@@ -172,12 +170,11 @@ tX_seqpar* tX_seqpar :: get_sp_by_persistence_id(unsigned int pid)
 {
        list <tX_seqpar *> :: iterator sp;
        
-       for (sp=all.begin(); sp!=all.end(); sp++)
-       {
+       for (sp=all.begin(); sp!=all.end(); sp++) {
                if ((*sp)->get_persistence_id()==pid) return ((*sp));
        }
        
-       fprintf (stderr, "oops: failed to lookup persistence id [%i].\n", pid); 
+       //tX_error("failed to resolve persistence id [%i].", pid);
        return (NULL);
 }
 
@@ -191,17 +188,16 @@ void tX_seqpar :: record_value(const float value)
          last_event_recorded was for the current timestamp
          we simply set that event's value to the current one.
        */
-       if ((last_event) && (last_event->get_timestamp() == sequencer.get_timestamp()))
-       {
+       if ((last_event) && (last_event->get_timestamp() == sequencer.get_timestamp())) {
                last_event->set_value(value);
+       } else {
+               last_event_recorded=(void *) sequencer.record(this, value);
        }
-       else last_event_recorded=(void *) sequencer.record(this, value);
 }
 
 void tX_seqpar :: receive_gui_value(const float value)
 {
-       if (gui_active)
-       {
+       if (gui_active) {
                touch();
                do_exec(value);
                record_value(value);
@@ -224,8 +220,7 @@ void tX_seqpar :: materialize_forward_values()
 {
        list <tX_seqpar *> :: iterator sp;
        
-       for (sp=all.begin(); sp!=all.end(); sp++)
-       {
+       for (sp=all.begin(); sp!=all.end(); sp++) {
                (*sp)->exec_value((*sp)->fwd_value);
        }       
        gdk_flush();
@@ -346,15 +341,13 @@ void tX_seqpar :: update_all_graphics()
 
        pthread_mutex_lock(&update_lock);
 
-       if (!update.size())
-       {
+       if (!update.size()) {
                pthread_mutex_unlock(&update_lock);
                return; 
        }
        
        while (gtk_events_pending()) gtk_main_iteration();      
-       for (sp=update.begin(); sp!=update.end(); sp++)
-       {
+       for (sp=update.begin(); sp!=update.end(); sp++) {
                (*sp)->update_graphics();
        }
        update.erase(update.begin(), update.end());
@@ -367,8 +360,7 @@ void tX_seqpar :: init_all_graphics()
 
        pthread_mutex_lock(&update_lock);
        
-       for (sp=all.begin(); sp!=all.end(); sp++)
-       {
+       for (sp=all.begin(); sp!=all.end(); sp++) {
                (*sp)->update_graphics();
        }
        while (gtk_events_pending()) gtk_main_iteration();      
index 8590b0ffba23613c66865b28287d4b11d769b9b4..1da8b0dfe3ee577fcfbff3972817f876ed2507ea 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
@@ -331,9 +331,12 @@ void tX_sequencer :: load(xmlDocPtr doc, xmlNodePtr node)
        for (xmlNodePtr cur=node->xmlChildrenNode; cur!=NULL; cur=cur->next) {
                if (cur->type == XML_ELEMENT_NODE) {
                        if (xmlStrcmp(cur->name, (xmlChar *) "event")==0) {
-                               ev=new tX_event(doc, cur);
-                               max_timestamp=ev->get_timestamp();
-                               song_list.push_back(ev);
+                               ev=tX_event::load_event(doc, cur);
+                               
+                               if (ev) {
+                                       max_timestamp=ev->get_timestamp();
+                                       song_list.push_back(ev);
+                               }
                        } else {
                                tX_warning("unhandled sequencer element %s.", cur->name);
                        }
index f1548416821f90a50178fb0c86cd079ee847e731..ecc0b2b4bf7fc98d6f149e5316648572c8ed9fe8 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index 2188bccbda94a9f4ba4d4652cec2afa3ee6f3242..8b73cef9a1d93279c74325bd9dec9c1e03941fe5 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index 158bd4e6e2f082993ef4b882139f7b7379d6ff99..8b43f3b38c6d616cf2646b43ee1419274426f328 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index ab170d00233c3f498ca42a5857bfcef58acf5c40..004ce672251dc4a023b17d8791920f55f53564b1 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index 69ce1333999685f861885ee895772a070c5204df..d878299cd17313af01970e564d24accd80c90602 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
@@ -520,6 +520,16 @@ void vtt_class :: ec_clear_buffer()
        ec_ptr=ec_buffer; 
 }
 
+#ifdef BIG_ENDIAN_MACHINE
+#define vabs(x) fabs(x)
+#else
+inline float vabs(float f)
+{
+       int i=((*(int*)&f)&0x7fffffff);
+       return (*(float*)&i);
+}
+#endif
+
 void vtt_class :: render()
 {
        list <vtt_fx *> :: iterator effect;
@@ -548,19 +558,13 @@ void vtt_class :: render()
                }
 
                for (int sample=0; sample<samples_in_outputbuffer; sample++) {                          
-                       f_prec temp=output_buffer[sample]*=res_volume_left;
+                       output_buffer[sample]*=res_volume_left;
                        output_buffer2[sample]*=res_volume_right;
-                       
-                       temp=fabs(temp);
-                       if (temp>max_value) max_value=temp;
                }
        } else {
                for (int sample=0; sample<samples_in_outputbuffer; sample++) {                          
                        output_buffer2[sample]=output_buffer[sample]*res_volume_right;
-                       f_prec temp=output_buffer[sample]*=res_volume_left;
-                       
-                       temp=fabs(temp);
-                       if (temp>max_value) max_value=temp;
+                       output_buffer[sample]*=res_volume_left;
                }
        }
        
@@ -570,7 +574,16 @@ void vtt_class :: render()
                        output_buffer[sample]+=temp*ec_volume_left;
                        output_buffer2[sample]+=temp*ec_volume_right;
                }
-       }       
+       }
+       
+       // find max signal for vu meters...
+       for (int sample=0; sample<samples_in_outputbuffer; sample++) {
+               f_prec lmax=vabs(output_buffer[sample]);
+               f_prec rmax=vabs(output_buffer2[sample]);
+               
+               if (lmax>max_value) max_value=lmax;
+               if (rmax>max_value2) max_value2=rmax;
+       }
 }
 
 extern void vg_create_fx_gui(vtt_class *vtt, vtt_fx_ladspa *effect, LADSPA_Plugin *plugin);
@@ -723,6 +736,9 @@ void vtt_class :: render_scratch()
                                }
                                
                                sample_res=(sample_a*amount_a)+(sample_b*amount_b);
+                               
+                               // scale to 0 db := 1.0f
+                               sample_res/=FL_SHRT_MAX;
                                                                
                                if (fade_in) {
                                        sample_res*=fade_vol;
@@ -895,8 +911,8 @@ int16_t * vtt_class :: render_all_turntables()
                        (*vtt)->render();                       
                        
                        for (sample=0, mix_sample=0; sample<(*vtt)->samples_in_outputbuffer; sample++) {
-                               mix_buffer[mix_sample++]=(*vtt)->output_buffer[sample];
-                               mix_buffer[mix_sample++]=(*vtt)->output_buffer2[sample];
+                               mix_buffer[mix_sample++]=(*vtt)->output_buffer[sample]*FL_SHRT_MAX;
+                               mix_buffer[mix_sample++]=(*vtt)->output_buffer2[sample]*FL_SHRT_MAX;
                        }
 
                        if (master_triggered) {
@@ -918,8 +934,8 @@ int16_t * vtt_class :: render_all_turntables()
                                (*vtt)->render();                                       
 
                                for (sample=0, mix_sample=0; sample<(*vtt)->samples_in_outputbuffer; sample++) {
-                                       mix_buffer[mix_sample++]+=(*vtt)->output_buffer[sample];
-                                       mix_buffer[mix_sample++]+=(*vtt)->output_buffer2[sample];
+                                       mix_buffer[mix_sample++]+=(*vtt)->output_buffer[sample]*FL_SHRT_MAX;
+                                       mix_buffer[mix_sample++]+=(*vtt)->output_buffer2[sample]*FL_SHRT_MAX;
                                }
                        }
                        
@@ -932,8 +948,6 @@ int16_t * vtt_class :: render_all_turntables()
                                temp=mix_buffer[sample];
 
 #ifndef TX_DO_CLIP
-#define FL_SHRT_MAX 32767.0
-#define FL_SHRT_MIN -32768.0
                                if(temp < FL_SHRT_MIN) temp = FL_SHRT_MIN;
                                else if (temp > FL_SHRT_MAX) temp = FL_SHRT_MAX;
 #endif                                 
@@ -1044,6 +1058,7 @@ void vtt_class :: retrigger()
        want_stop=0;
 
        max_value=0;
+       max_value2=0;
        
        if (is_sync_master)     {
                master_triggered=1;
@@ -1096,6 +1111,7 @@ int vtt_class :: stop_nolock()
        want_stop=0;
        is_playing=0;
        max_value=0;
+       max_value2=0;
 
        cleanup_required=true;
        
@@ -1480,20 +1496,20 @@ int vtt_class :: load(xmlDocPtr doc, xmlNodePtr node) {
                                                                                ladspa_effect=add_stereo_effect((LADSPA_Stereo_Plugin *) plugin);
                                                                                if (!stereo) {
                                                                                        sprintf(buffer,"Trying to load mono plugin into stereo queue [%i].", ladspa_id);
-                                                                                       tx_note(buffer, true);                                                  
+                                                                                       tx_note(buffer, true, GTK_WINDOW(gtk_widget_get_toplevel(ld_loaddlg)));
                                                                                }
                                                                        } else {
                                                                                ladspa_effect=add_effect(plugin);
                                                                                if (stereo) {
                                                                                        sprintf(buffer,"Trying to load stereo plugin into mono queue [%i].", ladspa_id);
-                                                                                       tx_note(buffer, true);                                                  
+                                                                                       tx_note(buffer, true, GTK_WINDOW(gtk_widget_get_toplevel(ld_loaddlg)));
                                                                                }                                                                               
                                                                        }
                                                                        
                                                                        ladspa_effect->load(doc, pluginNode);
                                                                } else {
                                                                        sprintf(buffer,"The terminatorX set file you are loading makes use of a LADSPA plugin that is not installed on this machine. The plugin's ID is [%i].", ladspa_id);
-                                                                       tx_note(buffer, true);                                                  
+                                                                       tx_note(buffer, true, GTK_WINDOW(gtk_widget_get_toplevel(ld_loaddlg)));
                                                                }
                                                        } else {
                                                                tX_warning("ladspa_plugin section without a ladspa_id element.");
@@ -1519,12 +1535,12 @@ int vtt_class :: load(xmlDocPtr doc, xmlNodePtr node) {
        }
        
        if (xpar_id>=0) {
-               set_x_input_parameter(tX_seqpar :: get_sp_by_persistence_id(xpar_id));
+               set_x_input_parameter(tX_seqpar::get_sp_by_persistence_id(xpar_id));
        }
        else set_x_input_parameter(NULL);
        
        if (ypar_id) {
-               set_y_input_parameter(tX_seqpar :: get_sp_by_persistence_id(ypar_id));
+               set_y_input_parameter(tX_seqpar::get_sp_by_persistence_id(ypar_id));
        }
        else set_y_input_parameter(NULL);
        
@@ -1619,8 +1635,6 @@ int vtt_class :: load_all(xmlDocPtr doc, char *fname) {
                                vtt_class *vtt=new vtt_class(1);
                                vtt->load(doc, cur);
                                
-                               tX_debug("loading a turntable..");
-
                                if (strlen(vtt->filename)) {
                                        strcpy(fn_buff, vtt->filename);
                                        ld_set_filename(fn_buff);
index 3fd6b530853b016f1ae149b3665ad948bba56b42..d316ae82fdb016c27a426208f340444a3cdf91e4 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
@@ -103,6 +103,7 @@ class vtt_class
        vtt_fx* ec_fx;
 
        f_prec max_value;
+       f_prec max_value2;
        
        int16_t *buffer;        // Actual audio data
        unsigned int samples_in_buffer;  // No. of samples in audio data
index e2314f5edc1ffb435ac6d51a58c01a6adfe44b9b..71d980273eef73f64c7ca7067d41cf5bbb2dc726 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index 71eab3d5a12b53d206bc23cb2016a9d4a554c2c0..4e14c420aff05cb51f0f32b25bb5c217211ebe3b 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index b506115dfcba186dec959b7f4fb26a9ea0b20c7b..56ed31793080196ba7450b694e3eb9ee6d69f717 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
@@ -374,7 +374,7 @@ void ec_enabled(GtkWidget *wid, vtt_class *vtt)
 #ifdef USE_ALSA_MIDI_IN
 void midi_mapping_clicked(GtkWidget *wid, vtt_class *vtt)
 {
-       tX_engine::get_instance()->midi->configure_bindings(vtt);
+       tX_engine::get_instance()->get_midi()->configure_bindings(vtt);
 }
 #endif
 
@@ -1370,7 +1370,7 @@ void delete_gui(vtt_class *vtt)
 void cleanup_vtt(vtt_class *vtt)
 {
        gtk_tx_cleanup_pos_display(GTK_TX(vtt->gui.display));   
-       gtk_tx_flash_set_level(vtt->gui.flash, 0.0);
+       gtk_tx_flash_set_level(vtt->gui.flash, 0.0, 0.0);
        gtk_tx_flash_clear(vtt->gui.flash);
        vtt->cleanup_required=false;
 }
@@ -1378,7 +1378,7 @@ void cleanup_vtt(vtt_class *vtt)
 void update_all_vtts()
 {
        list <vtt_class *> :: iterator vtt;
-       f_prec temp;
+       f_prec temp,temp2;
        
        for (vtt=vtt_class::main_list.begin(); vtt!=vtt_class::main_list.end(); vtt++)
        {
@@ -1386,7 +1386,9 @@ void update_all_vtts()
                        gtk_tx_update_pos_display(GTK_TX((*vtt)->gui.display), (*vtt)->pos_i, (*vtt)->mute);
                        temp=(*vtt)->max_value*(*vtt)->res_volume*vtt_class::vol_channel_adjust;
                        (*vtt)->max_value=0;
-                       gtk_tx_flash_set_level((*vtt)->gui.flash, temp);
+                       temp2=(*vtt)->max_value2*(*vtt)->res_volume*vtt_class::vol_channel_adjust;
+                       (*vtt)->max_value2=0;
+                       gtk_tx_flash_set_level((*vtt)->gui.flash, temp, temp2);
                }
                
                if ((*vtt)->needs_cleaning_up()) {
@@ -1402,7 +1404,7 @@ void cleanup_all_vtts()
        for (vtt=vtt_class::main_list.begin(); vtt!=vtt_class::main_list.end(); vtt++)
        {
                if ((*vtt)->buffer) gtk_tx_cleanup_pos_display(GTK_TX((*vtt)->gui.display));
-               gtk_tx_flash_set_level((*vtt)->gui.flash, 0.0);
+               gtk_tx_flash_set_level((*vtt)->gui.flash, 0.0, 0.0);
                gtk_tx_flash_clear((*vtt)->gui.flash);
        }
 }
index 41112f7fe939efded353a941b57e79043b5a4653..e53cb0dd0a0d81ce13e25c81b8559a6257f9d3a5 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index 77cc8f92f508f287a9394cd1237cdf3298e6bf09..56d7787754780e3f58da98307ec7598a064a991e 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index a5e6e91818b7b1d0bed3a59548ec7c881f757a69..2585e5654ff38e59e0bf7ffb4ef12ad5736a9f99 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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
index c5ae8b3ea9507303cd36c21ff751e02e65aa4408..dbf47fd9632ce02dab1c58f47fd0269940ed9f22 100644 (file)
@@ -1,6 +1,6 @@
 /*
     terminatorX - realtime audio scratching software
-    Copyright (C) 1999-2003  Alexander König
+    Copyright (C) 1999-2004  Alexander König
  
     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