Documentation updates and fixes - Alex
authorterminatorX <>
Thu, 27 Mar 2003 19:52:51 +0000 (19:52 +0000)
committerterminatorX <>
Thu, 27 Mar 2003 19:52:51 +0000 (19:52 +0000)
ChangeLog
configure.in
doc/terminatorX-manual/C/legal.xml
doc/terminatorX-manual/C/terminatorX-manual.xml
src/tX_global.c
src/tX_global.h
src/tX_ladspa_class.cc
src/tX_ladspa_class.h
src/tX_mastergui.cc
src/tX_vtt.cc

index 7d5f7b7982220ef49fc3e58ebdfaff3cb76e911d..58b05ff4a2bbb9c1d425e4669133cc54c98fcbe2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -4,9 +4,35 @@ This is not a GNU-style ChangeLog but you sort of get the idea what was
 changed.
 
 [v3.80 - prerelease]
+
+- 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
+  "FX" button. All plugins not categorized through RDF files go to the 
+  "Unclassified" category.
+- I'm no longer including the html and ps versions of the manual - it's now
+  attached in it's XML/DocBook source and will be installed via scrollkeeper.
+  terminatorX offers a menu entry to start gnome-help to display the manual.
+- Reworked the Preferences dialog - I now use glade-2 to create that code -
+  I'm fed up with copy'n'pasting gtk+ code so now I'll let glade-2 do this 
+  whereever possible. The glade project files are included with this tarball
+  in case you want to mess with them.
+- Switched to a fixed blocksize (1 ms) for rendering. This finally allows to
+  playback set files with events recorded on machines with small buffer sizes
+  on slow machines with large buffer sizes. The buffersize of the audiodevice
+  has no effect on the "operating" blocksize anymore.
+  Note that the samlping rate has a - very small - effect though. Depending on
+  the sampling rate terminatorX will try to find a blocksize that fits exactly
+  1 ms - while this is easy for "straight" sampling rates (22000 32000 48000)
+  this results in "44.1" samples for 44100 Hz.
+- Finally hacked a native ALSA backend. It definitley needs some more polish
+  though.
+- Added "Remove Binding" button
+- MIDI now uses a GIOCallback so the effect of MIDI controllers is visible
+  even without the audio engine turned on.
 - Reworked the mastergui for better usabilty and less space consumption, yes,
   terminatorX now features a boring menubar - which helps using it on small
-  displays quite a bit, and should be easier to handle for first time users.
+  displays quite a bit, and should be easier to handle for first-time users.
 - Implemented a suggestion from Darrick Servis <darrick@dcn.davis.ca.us> that
   stops clipping in the mixer routine. The outgoing signal is now limited as it
   should be, which improves the output quality for signals too loud
@@ -19,7 +45,8 @@ changed.
 - Fixed a bug in XML serialization that dropped strings' contents.
 - You can now hit "F11" to turn fullscreen mode on/off - this will help using
   terminatorX on small DJ laptops. Note that the key will have no effect in 
-  scratch - hit it before you get that engine running.
+  scratch mode - hit it before you enter grab mode. This feature requires a 
+  NETWM compliant window manager.
 - 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
index 136c87b4799edee2b3833f22f7073bfe6802226a..a14021d13daa0d11a0b9cc506494421b1fcd3c17 100644 (file)
@@ -25,6 +25,7 @@ AC_ARG_ENABLE(audiofile,      [  --disable-audiofile     disable audiofile support (d
 AC_ARG_ENABLE(legacy,          [  --disable-legacy        disable support for old terminatorX files (default=on) ])
 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_WITH(docdir,            [  --with-docdir=/some/dir the final location the docs will be installed to. ])
 
 dnl Checks for programs.
 AC_PROG_AWK
@@ -468,9 +469,13 @@ AC_SUBST(XML_LIBS)
 AC_SUBST(XML_CFLAGS)
 
 if test "$prefix" != "NONE"; then
-       inst_pref="\\\"$datadir\\\""
+       xml_man="\\\"$datadir/terminatorX/doc/terminatorX-manual/C/terminatorX-manual.xml\\\""
 else
-       inst_pref="\\\"/usr/local/share\\\""
+       xml_man="\\\"/usr/local/share/terminatorX/doc/terminatorX-manual/C/terminatorX-manual.xml\\\""
+fi
+
+if test "$with_docdir" != ""; then
+       xml_man="\\\"$with_docdir/terminatorX/doc/terminatorX-manual/C/terminatorX-manual.xml\\\""
 fi
 
 if test "$enable_lrdf" != "no"; then
@@ -518,7 +523,7 @@ if test "$enable_dga2" = yes; then
        AC_CHECK_LIB(Xxf86dga, XDGASelectInput,, AC_MSG_ERROR([** DGA2 not installed. Try using dga1 instead. **]), $X_LIBS $X_PRE_LIBS -lXext -lX11 $X_EXTRA_LIBS)
 fi
 
-CFLAGS="$XML_CFLAGS $CFLAGS -DINSTALL_PREFIX=$inst_pref"
+CFLAGS="$XML_CFLAGS $CFLAGS -DXML_MANUAL=$xml_man"
 LIBS="$XML_LIBS $LIBS"
 
 AC_OUTPUT(Makefile 
@@ -547,6 +552,8 @@ echo configured terminatorX for:
 echo ---------------------------
 echo
 
+echo manual: $xml_man
+
 option=sox; option_val=$OPTION_SOX; option_url=http://sox.sourceforge.net/
 option_info;
 
index 54ee68f84cca874eb5b9337e7a5214e934d2b870..d99be98cfaac816b080df84dba83bd880855feff 100644 (file)
@@ -1,70 +1,23 @@
-  <legalnotice id="legalnotice">
-       <para>
-         Permission is granted to copy, distribute and/or modify this
-         document under the terms of the GNU Free Documentation
-         License (GFDL), Version 1.1 or any later version published
-         by the Free Software Foundation with no Invariant Sections,
-         no Front-Cover Texts, and no Back-Cover Texts.  You can find
-         a copy of the GFDL at this <ulink type="help"
-         url="ghelp:fdl">link</ulink> or in the file COPYING-DOCS
-         distributed with this manual.
-         </para>
-
-       <para>
-         Many of the names used by companies to distinguish their
-         products and services are claimed as trademarks. Where those
-         names appear in any ScrollKeeper documentation, and the members of
-         the ScrollKeeper Project are made aware of those
-         trademarks, then the names are in capital letters or initial
-         capital letters.
-       </para>
-
-       <para>
-         DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT ARE PROVIDED
-         UNDER  THE TERMS OF THE GNU FREE DOCUMENTATION LICENSE
-         WITH THE FURTHER UNDERSTANDING THAT:
-
-         <orderedlist>
-               <listitem>
-                 <para>DOCUMENT IS PROVIDED ON AN "AS IS" BASIS,
-                    WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR
-                    IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES
-                    THAT THE DOCUMENT OR MODIFIED VERSION OF THE
-                    DOCUMENT IS FREE OF DEFECTS MERCHANTABLE, FIT FOR
-                    A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE
-                    RISK AS TO THE QUALITY, ACCURACY, AND PERFORMANCE
-                    OF THE DOCUMENT OR MODIFIED VERSION OF THE
-                    DOCUMENT IS WITH YOU. SHOULD ANY DOCUMENT OR
-                    MODIFIED VERSION PROVE DEFECTIVE IN ANY RESPECT,
-                    YOU (NOT THE INITIAL WRITER, AUTHOR OR ANY
-                    CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY
-                    SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER
-                    OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS
-                    LICENSE. NO USE OF ANY DOCUMENT OR MODIFIED
-                    VERSION OF THE DOCUMENT IS AUTHORIZED HEREUNDER
-                    EXCEPT UNDER THIS DISCLAIMER; AND
-                 </para>
-               </listitem>
-               <listitem>
-                 <para>UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL
-                       THEORY, WHETHER IN TORT (INCLUDING NEGLIGENCE),
-                       CONTRACT, OR OTHERWISE, SHALL THE AUTHOR,
-                       INITIAL WRITER, ANY CONTRIBUTOR, OR ANY
-                       DISTRIBUTOR OF THE DOCUMENT OR MODIFIED VERSION
-                       OF THE DOCUMENT, OR ANY SUPPLIER OF ANY OF SUCH
-                       PARTIES, BE LIABLE TO ANY PERSON FOR ANY
-                       DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR
-                       CONSEQUENTIAL DAMAGES OF ANY CHARACTER
-                       INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS
-                       OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR
-                       MALFUNCTION, OR ANY AND ALL OTHER DAMAGES OR
-                       LOSSES ARISING OUT OF OR RELATING TO USE OF THE
-                       DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT,
-                       EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF
-                       THE POSSIBILITY OF SUCH DAMAGES.
-                 </para>
-               </listitem>
-         </orderedlist>
-       </para>
-  </legalnotice>
-
+<?xml version='1.0' encoding='UTF-8'?>
+<legalnotice
+id="legalnotice"
+><para
+> Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License (GFDL), Version 1.1 or any later version published by the Free Software Foundation with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. You can find a copy of the GFDL at this <ulink
+url="ghelp:fdl"
+type="help"
+>link</ulink
+> or in the file COPYING-DOCS distributed with this manual. </para
+><para
+> DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT ARE PROVIDED UNDER THE TERMS OF THE GNU FREE DOCUMENTATION LICENSE WITH THE FURTHER UNDERSTANDING THAT: <orderedlist
+><listitem
+><para
+>DOCUMENT IS PROVIDED ON AN &#34;AS IS&#34; BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS FREE OF DEFECTS MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE QUALITY, ACCURACY, AND PERFORMANCE OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS WITH YOU. SHOULD ANY DOCUMENT OR MODIFIED VERSION PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL WRITER, AUTHOR OR ANY CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. NO USE OF ANY DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER; AND </para
+></listitem
+><listitem
+><para
+>UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER IN TORT (INCLUDING NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE AUTHOR, INITIAL WRITER, ANY CONTRIBUTOR, OR ANY DISTRIBUTOR OF THE DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO ANY PERSON FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR MALFUNCTION, OR ANY AND ALL OTHER DAMAGES OR LOSSES ARISING OUT OF OR RELATING TO USE OF THE DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT, EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH DAMAGES. </para
+></listitem
+></orderedlist
+> </para
+></legalnotice
+>
\ No newline at end of file
index b659d73c5a68e1001632cc7ba26255d7427444b5..21a284ca89d8bd8b6c8a3a34ff5477df0ceec33a 100644 (file)
@@ -2,6 +2,7 @@
 <!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
 "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
 <!ENTITY legal SYSTEM "legal.xml">
+
 ]>
 <article id="index" lang="en">
   <articleinfo>
 
     <copyright>
       <year>1999</year>
+
       <year>2000</year>
+
       <year>2001</year>
+
       <year>2002</year>
 
+      <year>2003</year>
+
       <holder role="mailto:alex@lisas.de">Alexander K├Ânig</holder>
     </copyright>
 
-    <releaseinfo>Version 3.73</releaseinfo>
-    
-    &legal;
+    <releaseinfo>Version 3.80</releaseinfo>
+
+    <legalnotice id="legalnotice">
+      <para>Permission is granted to copy, distribute and/or modify this
+      document under the terms of the GNU Free Documentation License (GFDL),
+      Version 1.1 or any later version published by the Free Software
+      Foundation with no Invariant Sections, no Front-Cover Texts, and no
+      Back-Cover Texts. You can find a copy of the GFDL at this <ulink
+      url="ghelp:fdl" type="help">link</ulink> or in the file COPYING-DOCS
+      distributed with this manual.</para>
+
+      <para>Many of the names used by companies to distinguish their products
+      and services are claimed as trademarks. Where those names appear in any
+      ScrollKeeper documentation, and the members of the ScrollKeeper Project
+      are made aware of those trademarks, then the names are in capital
+      letters or initial capital letters.</para>
+
+      <para>DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT ARE PROVIDED UNDER
+      THE TERMS OF THE GNU FREE DOCUMENTATION LICENSE WITH THE FURTHER
+      UNDERSTANDING THAT: <orderedlist><listitem><para>DOCUMENT IS PROVIDED ON
+      AN &#34;AS IS&#34; BASIS, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+      OR IMPLIED, INCLUDING, WITHOUT LIMITATION, WARRANTIES THAT THE DOCUMENT
+      OR MODIFIED VERSION OF THE DOCUMENT IS FREE OF DEFECTS MERCHANTABLE, FIT
+      FOR A PARTICULAR PURPOSE OR NON-INFRINGING. THE ENTIRE RISK AS TO THE
+      QUALITY, ACCURACY, AND PERFORMANCE OF THE DOCUMENT OR MODIFIED VERSION
+      OF THE DOCUMENT IS WITH YOU. SHOULD ANY DOCUMENT OR MODIFIED VERSION
+      PROVE DEFECTIVE IN ANY RESPECT, YOU (NOT THE INITIAL WRITER, AUTHOR OR
+      ANY CONTRIBUTOR) ASSUME THE COST OF ANY NECESSARY SERVICING, REPAIR OR
+      CORRECTION. THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF
+      THIS LICENSE. NO USE OF ANY DOCUMENT OR MODIFIED VERSION OF THE DOCUMENT
+      IS AUTHORIZED HEREUNDER EXCEPT UNDER THIS DISCLAIMER; AND</para></listitem><listitem><para>UNDER
+      NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY, WHETHER IN TORT (INCLUDING
+      NEGLIGENCE), CONTRACT, OR OTHERWISE, SHALL THE AUTHOR, INITIAL WRITER,
+      ANY CONTRIBUTOR, OR ANY DISTRIBUTOR OF THE DOCUMENT OR MODIFIED VERSION
+      OF THE DOCUMENT, OR ANY SUPPLIER OF ANY OF SUCH PARTIES, BE LIABLE TO
+      ANY PERSON FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR
+      CONSEQUENTIAL DAMAGES OF ANY CHARACTER INCLUDING, WITHOUT LIMITATION,
+      DAMAGES FOR LOSS OF GOODWILL, WORK STOPPAGE, COMPUTER FAILURE OR
+      MALFUNCTION, OR ANY AND ALL OTHER DAMAGES OR LOSSES ARISING OUT OF OR
+      RELATING TO USE OF THE DOCUMENT AND MODIFIED VERSIONS OF THE DOCUMENT,
+      EVEN IF SUCH PARTY SHALL HAVE BEEN INFORMED OF THE POSSIBILITY OF SUCH
+      DAMAGES.</para></listitem></orderedlist></para>
+    </legalnotice>
   </articleinfo>
 
   <sect1 id="INTRODUCTION">
     <sect2 id="WHATITIS">
       <title>What it is</title>
 
-      <para><application moreinfo="none">terminatorX</application> is a
-      realtime audio synthesizer that allows you to &#34;scratch&#34; on
-      digitally sampled audio data (*.wav, *.au, *.mp3, *.ogg etc.) the way
-      hiphop-DJs scratch on vinyl records. It features multiple turntables,
-      realtime effects (built-in as well as LADSPA plugin effects), a
-      sequencer and an easy-to-use gtk+ GUI.</para>
+      <para><application moreinfo="none">terminatorX</application> is a real
+      time audio synthesizer that allows you to &#34;scratch&#34; on digitally
+      sampled audio data (*.wav, *.au, *.mp3, *.ogg etc.) the way Hiphop DJs
+      scratch on vinyl records. It features multiple turntables, real time
+      effects (built-in as well as LADSPA plugin effects), a sequencer and an
+      easy-to-use gtk+ GUI.</para>
 
       <para>This is <emphasis>beta</emphasis> Software please help me fix
       bugs. See <xref linkend="CONTACT" /> (Contact/Download). Please read
@@ -50,7 +96,8 @@
       <title>Quickstart</title>
 
       <para>Try the following steps:</para>
-      <orderedlist inheritnum="ignore" continuation="restarts">
+
+      <orderedlist continuation="restarts" inheritnum="ignore">
         <listitem>
           <para>If you don&#39;t have <application moreinfo="none">LADSPA</application>
           (Linux Audio Developer&#39;s Simple Plugin API) installed, go and
         </listitem>
 
         <listitem>
-          <para>Install terminatorX (see <filename moreinfo="none">INSTALL</filename>)</para>
+          <para>Install terminatorX (see <filename moreinfo="none">INSTALL</filename>
+          file)</para>
         </listitem>
 
         <listitem>
 
     <sect2 id="FEATURES">
       <title>Features</title>
-      <para>The following list summarizes terminatorX' main features:</para>
+
+      <para>The following list summarizes terminatorX&#39; main features:</para>
 
       <itemizedlist>
         <listitem>
           <para>Built-in Sequencer</para>
         </listitem>
 
+        <listitem>
+          <para>MIDI Interface (Input)</para>
+        </listitem>
+
         <listitem>
           <para>Pitch / Volume settings for each turntable</para>
         </listitem>
         </listitem>
 
         <listitem>
-          <para>Recording (straight to disk now)</para>
+          <para>Recording to</para>
         </listitem>
 
         <listitem>
 
     <sect2 id="REQUIREMENTS">
       <title>Requirements</title>
-      
-      <para>To run terminatorX a system should meet the following requirements:</para>
+
+      <para>To run terminatorX a system should meet the following
+      requirements:</para>
 
       <itemizedlist>
         <listitem>
                 </listitem>
 
                 <listitem>
-                  <para>The Gimp Toolkit: gtk+ (&#62;= 1.2.5) - Version 2 of
-                  gtk+ is supported, too. If your distribution doesn&#39;t
-                  provide a current version of gtk+ get it from the <ulink
-                  url="http://www.gtk.org">gtk+ homepage</ulink>.</para>
+                  <para>The Gimp Toolkit: gtk+ (&#62;= 2.0). If your
+                  distribution doesn&#39;t provide a current version of gtk+
+                  get it from the <ulink url="http://www.gtk.org">gtk+
+                  homepage</ulink>.</para>
                 </listitem>
 
                 <listitem>
             </listitem>
 
             <listitem>
-              <para>optional</para>
+              <para>optional (but highly recommended)</para>
 
               <itemizedlist>
                 <listitem>
-                  <para><ulink
-                  url="http://home.sprynet.com/~cbagwell/sox.html">sox</ulink>
-                  for enhanced audio file support</para>
+                  <para><ulink url="http://plugin.org.uk/releases/lrdf/">liblrdf</ulink>
+                  for easier handling of LADSPA plugins</para>
+                </listitem>
+
+                <listitem>
+                  <para><ulink url="http://www.mars.org/home/rob/proj/mpeg/">mad</ulink>
+                  for loading mp3 files.</para>
+                </listitem>
+
+                <listitem>
+                  <para><ulink url="http://www.xiph.org/ogg/vorbis/">libvorbis</ulink>
+                  for loading ogg files.</para>
+                </listitem>
+
+                <listitem>
+                  <para><ulink url="http://www.68k.org/~michael/audiofile/">libaudiofile</ulink>
+                  for loading misc other audio files.</para>
                 </listitem>
 
                 <listitem>
                   <para><ulink
                   url="http://www-ti.informatik.uni-tuebingen.de/~hippm/mpg123.html">mpg123</ulink>
-                  for mp3 support</para>
+                  for mp3 pre-listening (and fallback loading if mad is not
+                  installed).</para>
                 </listitem>
 
                 <listitem>
                   <para><ulink url="http://www.xiph.org/ogg/vorbis/">ogg123</ulink>
-                  for Ogg Vorbis support</para>
+                  for ogg pre-listening (and fallback loading if libvorbis is
+                  not installed).</para>
+                </listitem>
+
+                <listitem>
+                  <para><ulink
+                  url="http://home.sprynet.com/~cbagwell/sox.html">sox</ulink>
+                  for misc files pre-listening (and fallback loading of misc
+                  files).</para>
                 </listitem>
               </itemizedlist>
             </listitem>
 
           <itemizedlist>
             <listitem>
-              <para>An OSS compatible soundcard capable of stereo output. This
-              includes <emphasis>all</emphasis> <ulink
-              url="http://www.alsa-project.org">ALSA-driven</ulink> soundcards
-              as this enhanced audio device interface includes support for the
-              OSS API.</para>
+              <para>An <ulink url="http://www.alsa-project.org">ALSA</ulink>
+              or OSS compatible soundcard capable of stereo output.</para>
             </listitem>
 
             <listitem>
     controls. Each turntable has it&#39;s own GUI split up into control and
     audio panel.</para>
 
+    <sect2>
+      <title>Menu</title>
+
+      <para>To clean-up the user interface a bit further some functions have
+      been moved into a more standard menu bar for the main window (with
+      release 3.80). The following sub-menus are available:</para>
+
+      <sect3>
+        <title><emphasis>File</emphasis> Menu</title>
+
+        <para>The <emphasis>File</emphasis> menu features these functions:</para>
+
+        <itemizedlist>
+          <listitem>
+            <para><emphasis>New</emphasis></para>
+
+            <para>Erases all existing turntables and sequencer events and
+            creates a new and untouched turntable.</para>
+          </listitem>
+
+          <listitem>
+            <para><emphasis>Open</emphasis></para>
+
+            <para>Allows restoring of a previously saved terminatorX set file.</para>
+          </listitem>
+
+          <listitem>
+            <para><emphasis>Save</emphasis></para>
+
+            <para>Saves the current turntables and events in a terminatorX set
+            file.</para>
+          </listitem>
+
+          <listitem>
+            <para><emphasis>Save As</emphasis></para>
+
+            <para>Like <emphasis>Save</emphasis> but prompts for a new file
+            name.</para>
+          </listitem>
+
+          <listitem>
+            <para><emphasis>Quit</emphasis></para>
+          </listitem>
+        </itemizedlist>
+      </sect3>
+
+      <sect3>
+        <title><emphasis>Turntables</emphasis> Menu</title>
+
+        <para>The <emphasis>Turntables</emphasis> menu features these
+        functions:</para>
+
+        <itemizedlist>
+          <listitem>
+            <para><emphasis>Add Turntable</emphasis></para>
+
+            <para>Adds a new turntable to the current set of turntables.</para>
+          </listitem>
+
+          <listitem>
+            <para><emphasis>Record Audio to Disk</emphasis></para>
+
+            <para>On activation of this option, terminatorX will prompt for a
+            file name for the RIFF/Wave file to create. Once activated
+            terminatorX will start recording audio to disk the next time the
+            audio engine is started - either by pressing the Power or the Play
+            button. Recording will stop when the audio engine is stopped
+            again. The created RIFF/Wave file will be a 16Bit/Stereo wave-file
+            with the sampling rate selected for the current audio backend.</para>
+          </listitem>
+        </itemizedlist>
+      </sect3>
+
+      <sect3>
+        <title><emphasis>Options</emphasis> Menu</title>
+
+        <para>The <emphasis>Options</emphasis> menu features these functions:</para>
+
+        <itemizedlist>
+          <listitem>
+            <para><emphasis>Fullscreen</emphasis></para>
+
+            <para>Maximizes the terminatorX main windows to use the complete
+            screen. Note that this requires a NETWM compliant window manager
+            to work (GNOME2&#39;s metacity works nicely, while openbox 2.x
+            does not for example). By choosing this option again
+            terminatorX&#39; window can be resized back to the previous state
+            again. The setting will be stored in the <filename>~/.terminatorXrc</filename>
+            file.</para>
+          </listitem>
+
+          <listitem>
+            <para><emphasis>Preferences</emphasis></para>
+
+            <para>Will pop up the Preferences dialog. For more details on
+            configuration itself see the <xref linkend="CONFIGURATION" />
+            section.</para>
+          </listitem>
+        </itemizedlist>
+      </sect3>
+
+      <sect3>
+        <title><emphasis>Help</emphasis> Menu</title>
+
+        <para>The <emphasis>Help</emphasis> menu features these functions:</para>
+
+        <itemizedlist>
+          <listitem>
+            <para><emphasis>Contents</emphasis></para>
+
+            <para>Starts a <emphasis>gnome-help</emphasis> (aka
+            <emphasis>yelp</emphasis>) process to display the very manual you
+            are reading right now.</para>
+          </listitem>
+
+          <listitem>
+            <para><emphasis>About</emphasis></para>
+
+            <para>Selecting this menu item will cause a small dialog to pop up
+            that contains some information on the compile time settings for
+            the terminatorX binary as well as the license.</para>
+          </listitem>
+
+          <listitem>
+            <para><emphasis>Visit terminatorX.cx</emphasis></para>
+
+            <para>Will try to spawn a browser process to load the URL
+            &#34;http://terminatorX.cx&#34; - for easy update checking or just
+            unecessary bloat.</para>
+          </listitem>
+        </itemizedlist>
+      </sect3>
+    </sect2>
+
     <sect2 id="MAINCONTROLS">
       <title>Main Controls</title>
 
-      <para>The controls of the master gui are located in the top and the
+      <para>The controls of the master GUI are located in the top and the
       right bar of the terminatorX main window.</para>
 
       <itemizedlist>
           Mode Operation) to find out how to control the software then.</para>
         </listitem>
 
-        <listitem>
-          <para><emphasis>Record (Audio Engine)</emphasis></para>
-
-          <para>To enable recording you have to enable the
-          &#34;Record&#34;-toggle button BEFORE you start the audio engine.
-          You will be prompted for a filename after enabling the button. Audio
-          will then be recorded to that file in stereo RIFF/WAV format from
-          the moment you turn the audio engine on until you turn it off again.
-          Please be aware of the fact that recording audio requires
-          <emphasis>a lot</emphasis> of harddisk space!</para>
-        </listitem>
-
         <listitem>
           <para><emphasis>Sequencer Play / Record / Stop</emphasis></para>
 
           relative to these master settings. This information will be stored
           within the .tX set files.</para>
         </listitem>
-
-        <listitem>
-          <para><emphasis>Add Turntable</emphasis></para>
-
-          <para>Oh well, it says it all: adds a (new) turntable to the current
-          set.</para>
-        </listitem>
-
-        <listitem>
-          <para><emphasis>Save Set</emphasis></para>
-
-          <para>With this button you can save your current set and all related
-          settings to a .tX set file. Note that the audiofiles themselves will
-          not be stored within these files but only references to them.
-          Therefore on loading the set the audiofiles have to be at the same
-          location in the filesystem as they were when putting that set
-          together.</para>
-        </listitem>
-
-        <listitem>
-          <para><emphasis>Load Set</emphasis></para>
-
-          <para>Loads a previously saved set (see above). The current set will
-          be destroyed!</para>
-        </listitem>
-
-        <listitem>
-          <para><emphasis>Options</emphasis></para>
-
-          <para>Displays the options dialog. See <xref linkend="CONFIGURATION" />
-          (Options/Configuration).</para>
-        </listitem>
-
-        <listitem>
-          <para><emphasis>About/Legal</emphasis></para>
-
-          <para>Displays a dialog with some info about the prog and the binary
-          itself plus the good old GPL.</para>
-        </listitem>
-
-        <listitem>
-          <para><emphasis>Quit</emphasis></para>
-
-          <para>No comment.</para>
-        </listitem>
       </itemizedlist>
     </sect2>
 
     <sect2 id="TURNtableCONTROLS">
       <title>Turntable Controls</title>
 
-      <para>The turntable GUI contains multiple controls and the realtime
+      <para>The turntable GUI contains multiple controls and the real time
       displays for each turntable. To save some space on your desktop and to
       give terminatorX the traditional audio-application look, terminatorX
       features &#34;knob&#34;-widgets. These widgets work pretty
         indicate the current position within the sample with a red cursor (a
         blue/green cursor indicates the turntable is muted).</para>
 
-        <para>Additionaly there are some controls above the audio-display:</para>
+        <para>Additionally there are some controls above the audio-display:</para>
 
         <itemizedlist>
           <listitem>
             that qualify as &#34;mappable&#34;. Note that this includes
             plugins&#39; controls as well.</para>
           </listitem>
+
+          <listitem>
+            <para><emphasis>MIDI Mapping</emphasis></para>
+
+            <para>This button is available only if terminatorX was built with
+            ALSA MIDI support and the sequencer input port was created
+            successfully on startup. For more information on terminatorX&#39;
+            MIDI interface see <xref linkend="MIDI" /> section.</para>
+          </listitem>
         </itemizedlist>
       </sect3>
 
             <listitem>
               <para><emphasis>Delete Button</emphasis></para>
 
-              <para>Pressing this button remove the tunrtable from the current
+              <para>Pressing this button remove the turntable from the current
               setup. Note that all sequencer events recorded for this
               turntable will be erased, too.</para>
             </listitem>
               <para><emphasis>Client Button</emphasis></para>
 
               <para>This button marks the turntable as <emphasis>sync-client</emphasis>,
-              so it will be triggerd with the master automatically.</para>
+              so it will be triggered with the master automatically.</para>
             </listitem>
 
             <listitem>
               be triggered. With a setting of zero the sync-client will be
               (re-)triggered with <emphasis>every</emphasis> trigger of the
               sync-master. A setting of 1 will (re-)trigger the client every
-              <emphasis>second</emphasis> master-triger and so on.</para>
+              <emphasis>second</emphasis> master-trigger and so on.</para>
             </listitem>
           </itemizedlist>
 
         effect-queue. The effect sequence is configurable by the user. To move
         an effect to higher position within the queue, press the
         <emphasis>blue upward arrow button</emphasis>. This will cause the
-        effect to be renderd <emphasis>before</emphasis> the following
+        effect to be rendered <emphasis>before</emphasis> the following
         effects. The <emphasis>blue downward arrow button</emphasis> will move
         the effect down by one position. It will then be rendered
         <emphasis>after</emphasis> the preceding effects.</para>
         (Lowpass and Echo) and LADSPA plugins. The built-in effects are always
         available and cannot be removed (but disabled). There can be only one
         instance of a built-in effect. The LADSPA plugins on the other hand
-        may be instanciated multiple times and can be removed from the effect
+        may be instantiated multiple times and can be removed from the effect
         queue. Press the <emphasis>blue cross button</emphasis> to achieve
         this.</para>
 
         <para>Now since release 3.71 the built-in echo effect is treated
         differently from other effects. Where all other effects feed their
         signal back into the effect queue the echo effect doesn&#39;t touch
-        the input signal. It&#39;s echo-signal is mixed seperately from the
+        the input signal. It&#39;s echo-signal is mixed separately from the
         turntable&#39;s main signal to allow a different panning value for the
         echo-signal. This mode of operation does have some side-effects:
         imagine a lowpass filter with a position after the echo effect in the
         effect queue. This will result in the turntable&#39;s main signal
-        being lowpassed but it will leave the echo-signal un-lowpassed.</para>
+        being lowpass-filtered but it will leave the echo-signal
+        lowpass-unfiltered.</para>
 
         <para>Some may call this behaviour a bug - whereas I would consider it
         a feature ;). Anyway if the above description didn&#39;t clear things
             plugins have they sometimes might be hard to control with the knob
             widget. In these cases you might want to use the text field to
             enter values. For more details on Plugins see <xref
-            linkend="LADSPAPLUGINS" /> (LASDPA).</para>
+            linkend="LADSPAPLUGINS" /> (LADSPA).</para>
           </listitem>
         </itemizedlist>
       </sect3>
       <sect3>
         <title>Lowpass Panel</title>
 
-        <para>terminatorX features a builtin resonating lowpass filter that
+        <para>terminatorX features a built-in resonating lowpass filter that
         can be configured with this panel.</para>
 
         <itemizedlist>
       <sect3>
         <title>Echo Panel</title>
 
-        <para>Additionaly terminatorX features a built-in echo effect. It can
+        <para>Additionally terminatorX features a built-in echo effect. It can
         be configured with this panel.</para>
 
         <itemizedlist>
             <para><emphasis>Pan Control</emphasis></para>
 
             <para>The echo effect differs from other effects as it&#39;s
-            output signal will be mixed seperately. The main goal here is to
+            output signal will be mixed separately. The main goal here is to
             allow positioning the echo signal at a position in the stereo
-            panorama that differs from the main panning positon of the
+            panorama that differs from the main panning position of the
             turntable to achieve a somewhat spacial effect. The easy example
             is: turntable&#39;s panning left, echo&#39;s panning right. As
-            both pan parameters are sequencable you can create nice motion
+            both pan parameters are sequenceable you can create nice motion
             effects from this starting point.</para>
           </listitem>
         </itemizedlist>
     <sect2 id="SYNCHRONIZATION">
       <title>Synchronization</title>
 
-      <para>Let&#39;s start off with an example: Say you have two drumloops
+      <para>Let&#39;s start off with an example: Say you have two drum loops
       and one bassline loaded in three turntables. Of course you want these
       samples to be triggered at the same time but you don&#39;t want to
       invest time to cut them to the exact length. Therefore you decide which
-      of the drumloops to make the sync master. You&#39;ll have to do this
+      of the drum loops to make the sync master. You&#39;ll have to do this
       before you enable the audio engine (for now). Only one turntable can be
       the sync master. Now you can make the other two sync clients which will
       cause them to be (re-)triggered whenever the master is (re-)triggered.
 
       <para>After pressing the <emphasis>Mouse Grab button</emphasis>
       terminatorX enters &#34;grab mode&#34;. This mode actually locks the
-      mouse (as this input is now used to control the realtime parameters) and
-      therefore you&#39;ll have to know some mouse/keyboard shortcuts to
+      mouse (as this input is now used to control the real time parameters)
+      and therefore you&#39;ll have to know some mouse/keyboard shortcuts to
       control the software without the GUI.</para>
 
       <para>Press <keycap moreinfo="none">ESCAPE</keycap> to quit grab mode.</para>
       <para>Select the turntable with input focus: The first turntable to hold
       the input focus will be the first turntable. You can now use <keycap
       moreinfo="none">TAB</keycap> or right mouse button to switch to the next
-      turntable. Alternativley you can use <keycap moreinfo="none">F1</keycap>
-      to <keycap moreinfo="none">F12</keycap> to select turtntable 1 to 12.</para>
+      turntable. Alternatively you can use <keycap moreinfo="none">F1</keycap>
+      to <keycap moreinfo="none">F12</keycap> to select turntable 1 to 12.</para>
 
       <para>Now the turntable that has the focus is the one you will
       manipulate with your mouse and keyboard inputs: Note that you can
 
       <para>Since V3.55 terminatorX provides multiple DND-Drop-Targets for use
       with GNOME / gmc (gmc is the GNU Midnight Commander), Nautilus or the
-      Elightenment File Manager (efm). You can load an audiofile into an
+      Enlightenment File Manager (efm). You can load an audiofile into an
       existing turntable by dragging it from a gmc (or efm or whatever)-window
       and drop it over a. the <emphasis>file button</emphasis> (audio-display)
       or b. (the easier target ;) over the audio-display (the green on black
 
       <para>To add a file to the set (== to load the file into a *new*
       turntable) simply drop the audiofile over the &#34;New Turntable&#34;
-      Button. To load a complete terminatorX-set simply drop the setfile
+      Button. To load a complete terminatorX-set simply drop the set file
       (*.tX) over the &#34;Load Set&#34; button.</para>
     </sect2>
 
 
       <para>To record events simply press the <emphasis>Record</emphasis>
       button of the sequencer, then press the <emphasis>Play</emphasis>
-      button. All actions (for sequencable parameters - see above) you now
+      button. All actions (for sequenceable parameters - see above) you now
       take will be recorded into the song list. Press <emphasis>Stop</emphasis>
       and <emphasis>Play</emphasis> again to see/hear how terminatorX plays
       back the events recorded before. You can now record events again for
       e.g. another turntable or record other parameters for the same turntable
-      - whatever you want to do. Recording events for parameters for wich
+      - whatever you want to do. Recording events for parameters for which
       events have been recorded before will result in dubbing: if you touch a
       parameter while recording, events previously recorded will be erased
-      from the moment you touch the paramater until you stop recording.</para>
+      from the moment you touch the parameter until you stop recording.</para>
 
       <para>When recording long sequences/songs you can use the
       sequencer-scale to start recording/playback from any song-position you
-      want. To record a single paramteter value at a certain position simply
+      want. To record a single parameter value at a certain position simply
       move the sequencer-scale to that position, press <emphasis>Record,</emphasis>
       set the parameter and press <emphasis>Stop</emphasis> again.</para>
 
       load plugins with <emphasis>one</emphasis> audio-in port and
       <emphasis>one</emphasis> audio-out port only.</para>
 
-      <para>The decision on wether a plugin is terminatorX-suitable is made on
-      terminatorX startup, so only plugins that fit into the effect queue will
-      be offered in the plugin-menu that pops up when the
-      <emphasis>FX</emphasis> button is clicked. On startup terminatorX will
-      print some information on the LADSPA-plugins analysis process to the
-      standard output. Watch the terminal you run terminatorX from for that
-      info if you have problems loading a plugin.</para>
+      <para>The decision on whether a plugin is terminatorX-suitable is made
+      on terminatorX startup, so only plugins that fit into the effect queue
+      will be offered in the plugin-menu that pops up when the
+      <emphasis>FX</emphasis> button is clicked. Depending on whether the
+      terminatorX binary you&#39;re using was built with or without liblrdf (<xref
+      linkend="LIBLRDF" />) support the plugin menu will either contain
+      sub-menus with plugin categories (with liblrdf) or just a single menu
+      with the <emphasis>Unclassified</emphasis> category.</para>
+
+      <para>On startup terminatorX will print some information on the
+      LADSPA-plugins analysis process to the standard output. Watch the
+      terminal you run terminatorX from for that info if you have problems
+      loading a plugin.</para>
 
       <para>As specified in the LADSPA-standard LADSPA-plugins can be located
       in multiple directories across the filesystem. To enable LADSPA-hosts to
       order for other LADSPA-hosts to work properly, be sure to set your
       <envar>LADSPA_PATH</envar> correctly. It is a good idea to do that from
       somewhere in your system configuration (either in your rc-scripts or
-      <filename moreinfo="none">/etc/profile</filename> or whereever you
-      perefer).</para>
+      <filename moreinfo="none">/etc/profile</filename> or wherever you
+      prefer).</para>
+
+      <sect3 id="LIBLRDF">
+        <title>liblrdf support</title>
+
+        <para>Release 3.80 introduces support for Steve Harris&#39; great
+        <ulink url="http://plugin.org.uk/releases/lrdf/">liblrdf</ulink>
+        library which introduces an RDF based scheme to categorize LADSPA
+        plugins. This approach allows storing additional meta-data for LADSPA
+        plugins in separate RDF files. In order to make use of these RDF files
+        a terminatorX binary (compiled with liblrdf support of course)
+        requires the main <filename>ladspa.rdfs</filename> file and additional
+        RDF files containing meta information about the LADSPA plugins
+        installed. Steve Harris&#39; wonderful plugin library comes with such
+        an additional description file for example.</para>
+
+        <para>By default terminatorX will search the directories
+        <filename>/usr/share/ladspa/rdf</filename> and <filename>/usr/local/share/ladspa/rdf</filename>
+        for RDF files. In case the files were installed to other locations it
+        is possible to configure the LADSPA RDF path in the
+        <emphasis>Misc</emphasis> tab of the <emphasis>Preferences</emphasis>
+        dialog.</para>
+
+        <para>If the RDF are read successfully on startup, the LADSPA menu
+        that pops up when clicking a turntable&#39;s <emphasis>FX</emphasis>
+        button will feature multiple sub-menus with LADSPA plugin categories
+        (eg <emphasis>Amplitude/Amplifier</emphasis>) in which you will find
+        the according plugins. Plugins not categorized by the RDF files reside
+        in the <emphasis>Unclassified</emphasis> menu.</para>
+      </sect3>
+    </sect2>
+
+    <sect2 id="MIDI">
+      <title>MIDI Interface</title>
+
+      <para>Aside of controlling terminatorX with a regular mouse and keyboard
+      it is possible to control parameters through MIDI events (since 3.80).
+      The MIDI interface is based upon the ALSA sequencer API. On startup
+      terminatorX creates a MIDI input port called &#34;terminatorX&#34;. You
+      can now use for example the <ulink url="alsa-patch-bay link here">alsa-patch-pay</ulink>
+      to connect an output port of your choice (either a hardware MIDI input
+      device or a software generating midi events) to the terminatorX input
+      port.</para>
+
+      <para>Once the connection is set up terminatorX receives MIDI events
+      through the input port. To configure what MIDI events will have which
+      effect on a terminatorX turntable you can bind MIDI events to parameters
+      of your choice by clicking the <emphasis>MIDI Mapping</emphasis> button
+      of the turntable&#39;s audio panel. As a result the
+      <emphasis>Configure MIDI Bindings</emphasis> dialog will pop up which
+      features a field labelled <emphasis>Selected MIDI Event</emphasis> that
+      will frequently update to display the contents of the last MIDI event
+      received by terminatorX. So in order to map a MIDI controller to a
+      specific turntable parameter select the parameter of your choice from
+      the parameter list, cause your MIDI event sending device to emit the
+      event you want to map the parameter on and click the
+      <emphasis>Bind</emphasis> button.</para>
+
+      <para>Immediately after binding the event you should see that the
+      <emphasis>Event</emphasis> column entry of the selected parameter is
+      updated to match the selected event. From now on all events matching the
+      selected event will cause the turntable parameter to be updated. The GUI
+      for that parameter will be refreshed accordingly. Note that it is
+      possible to map the same event to multiple parameters.</para>
+
+      <para>The MIDI mappings are stored within terminatorX set files so you
+      wont have to reconfigure your bindings every time you start up
+      terminatorX. If you are unhappy with a chosen binding you can select the
+      parameter and click the <emphasis>Remove Binding</emphasis> button to
+      get rid of the parameter&#39;s MIDI mapping.</para>
+
+      <para>If you want to use your joystick to control terminatorX - I wrote
+      a tiny tool to create MIDI events from joystick motion called
+      <emphasis>aseqjoy</emphasis>. It&#39;s available from the <ulink
+      url="http://terminatorX.cx/aseqjoy">terminatorX website</ulink>, too.</para>
     </sect2>
   </sect1>
 
   <sect1 id="CONFIGURATION">
     <title>Configuration</title>
 
-    <para>All configuration business now happens in the Options-dialog. The
-    features that are not completely self-explaining do have tooltips.</para>
+    <para>The main terminatorX configuration parameters can be set up via the
+    <emphasis>Preferences</emphasis> dialog, which can be activated from the
+    terminatorX menu. The new <emphasis>Preferences</emphasis> dialog features
+    multiple tabs for several aspects of configuration.</para>
 
-    <para>A word on the settings in general: your settings are stored in the
-    file <filename moreinfo="none">~/.terminatorX3rc.bin</filename> so if you
-    think you completely messed up your settings you will have to exit
+    <para>A word on the settings in general: your settings are stored in an
+    XML file ( <filename moreinfo="none">~/.terminatorXrc).</filename> So if
+    you think you completely messed up your settings you will have to exit
     terminatorX - delete this file - and then re-run terminatorX with the
-    default settings.</para>
+    default settings. Note: is this file is now an XML file you can edit with
+    an editor of your choice.</para>
 
-    <sect2 id="AUDIOSETUP">
-      <title>Audio Setup</title>
+    <sect2>
+      <title><emphasis>Audio</emphasis> Tab</title>
 
-      <para>TerminatorX renders audio blockwise. If you want to have
-      near-realtime operation you need to have really small blocks. The values
-      of these blocks can be influenced via the <emphasis>buffer size</emphasis>
-      option. The setting you select actually results in a 2^x blocksize
-      (size-setting == 8 -&#62; true buffer size in bytes is 2^8=256).</para>
+      <para>This tab allows to select which audio backend to use. Currently
+      there are two of these: one for the OSS (Open Sound System) backend and
+      one for ALSA (Advanced Linux Sound Architecture) backend. Hopefully
+      future releases will feature a JACK backend too.</para>
+    </sect2>
 
-      <para>The problem is the smaller the value you select is the faster your
-      machine has to be. So if you here &#34;clicks&#34;, or &#34;drops&#34;
-      in audio output that are not related to your sample-material you will
-      have to increase the buffer size. On the other hand if you believe
+    <sect2>
+      <title><emphasis>Audio: OSS</emphasis> Tab</title>
+
+      <para>Select the audio device you are going to use from the available
+      options (or simply enter one yourself). terminatorX renders audio
+      block-wise. In order to achieve close-to-realtime performance it is
+      necessary to keep this blocks as small as possible. The main parameters
+      that determine how close-to-realtime terminatorX will perform are
+      <emphasis>No. of Buffers</emphasis> and <emphasis>Buffersize</emphasis>.
+      The <emphasis>No. of Buffers</emphasis> parameter determines how many
+      buffers the audio driver should use in most cases <emphasis>2</emphasis>
+      should be the best setting and in rare cases <emphasis>3</emphasis>
+      might give better results.</para>
+
+      <para>The value for the <emphasis>Buffersize</emphasis> setting will be
+      evaluated as 2^buffersize by OSS. So if you set the value to
+      <emphasis>8</emphasis> the actual buffer size will be 2^8=256 Bytes. The
+      smaller the buffers&#39; size the better terminatorX will perform. The
+      default setting of <emphasis>9</emphasis> should be acceptable in most
+      conditions, but if you here &#34;clicks&#34;, or &#34;drops&#34; in
+      audio output that are not related to your sample-material you will have
+      to increase the buffer size. On the other hand if you believe
       terminatorX does not react fast enough you have to decrease this
-      parameter. The default value is 8, but as my machine handles 7 nicely
-      (running with root privileges for realtime scheduling) I use 7.</para>
+      parameter.</para>
+
+      <para>Additionally you can select the sampling rate you want terminatorX
+      to operate on - note that recording to disk will use the same sample
+      rate.</para>
+    </sect2>
+
+    <sect2>
+      <title><emphasis>Audio: ALSA</emphasis> Tab</title>
+
+      <para>Configuring the ALSA backend works pretty similar to configuring
+      the OSS backend (see above) - except that ALSA doesn&#39;t use crappy
+      &#34;2^x&#34; semantics for the buffer size setting: you can specify the
+      buffer size in plain bytes.</para>
     </sect2>
 
-    <sect2 id="MOUSEINPUTSETUP">
-      <title>Mouse/Input Setup</title>
+    <sect2>
+      <title><emphasis>Input</emphasis> Tab</title>
 
-      <para>Between rendering and outputing these blocks terminatorX checks
+      <para>Between rendering and outputting these blocks terminatorX checks
       for mouse motion. The problem with mice is: they don&#39;t report when
       they have stopped. This is why terminatorX assumes your mouse has
       stopped if there is no motion reported for certain amount of
       render/output-cycles. This value is configurable via the
       <emphasis>Stop-sense-cycles</emphasis> option. If you decrease your
-      buffsize of course you shorten the cycle time as well, therefore if you
-      here strange stop/run behaviour of the audio ouput while scratching
-      after you decreased the buffersize you might have to increase the
+      buffersize of course you shorten the cycle time as well, therefore if
+      you here strange stop/run behaviour of the audio output while scratching
+      after you decreased the buffer size you might have to increase the
       stop-sense value too.</para>
 
-      <para>Xinput Device: <emphasis>WARNING:</emphasis> Use this option
+      <para>XInput Device: <emphasis>WARNING:</emphasis> Use this option
       *only* if you want to use an input device other than your default-mouse
       for scratching. Selecting your default pointer will cause terminatorX to
       crash. See the &#34;Using a turntable&#34; section on the terminatorX
       homepage for details.</para>
     </sect2>
 
-    <sect2 id="GUISETUP">
-      <title>GUI Setup</title>
+    <sect2>
+      <title><emphasis>User Interface</emphasis> Tab</title>
 
       <para>With <emphasis>Update Idle</emphasis> / <emphasis>Update Delay</emphasis>
-      you can configure GUI resposivness: Higher <emphasis>Update Idle</emphasis>
-      will cause the wav-display (position display) and flash-widgets to
+      you can configure GUI responsiveness: Higher <emphasis>Update Idle</emphasis>
+      will cause the wavdisplay (position display) and flash-widgets to
       update less often. Higher <emphasis>Update Delay</emphasis> values will
       cause the parameter widgets to update less often.</para>
     </sect2>
 
-    <sect2 id="SOUNDFILEEDITOR">
-      <title>Soundfile-Editor integration</title>
+    <sect2>
+      <title><emphasis>Misc</emphasis> Tab</title>
 
       <para>You can now enter the soundfile editor of your choice in the
-      &#34;Soundfile editor&#34; field. This editor will be started when
+      &#34;Sound file editor&#34; field. This editor will be started when
       clicking the <emphasis>Edit</emphasis>-button in the main panel of the
       vtt-gui. If you enter for example &#34;myeditor&#34; terminatorX will
       run &#34;myeditor sample_in_vtt.wav&#34;.</para>
     <para>Send me comments, bug-reports, patches or scratches (see scratches
     section on the terminatorX homepage) at: <email>alex@lisas.de</email></para>
   </sect1>
-</article>
+</article>
\ No newline at end of file
index 7a43fa9431c09b41bcb411afaaae5ff4038307cb..a27fb731a77a76978210edbc2cab9ad258b19952 100644 (file)
@@ -37,6 +37,8 @@
 #include "string.h"
 #include <libxml/xmlmemory.h>
 #include <libxml/parser.h>
+#include <libxml/encoding.h>
+
 
 #define TX_XML_RC_VERSION "1.0"
 
@@ -137,7 +139,8 @@ int load_globals_xml() {
        xmlNodePtr cur;
        int elementFound;
        double dvalue;
-
+       char tmp_xml_buffer[4096];
+       
        get_rc_name(rc_name);
        
        doc = xmlParseFile(rc_name);
@@ -243,7 +246,7 @@ void store_globals() {
        }
        
        if (rc) {               
-               fprintf(rc, "<?xml version=\"1.0\" encoding=\"US-ASCII\"?>\n\n");
+               fprintf(rc, "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n");
                fprintf(rc, "<!-- Warning: this file will be rewritten by terminatorX on exit!\n     Don\'t waste your time adding comments - they will be erased -->\n\n" );
                fprintf(rc, "<terminatorXrc version=\"%s\">\n", TX_XML_RC_VERSION);
 
@@ -306,23 +309,48 @@ void load_globals() {
 
 char *encode_xml(char *dest, const char *src) {
        int i, t, max;
+       char tmp[4096];
        
-       dest[0]=0;
+       tmp[0]=0;
        t=0;
        max=strlen(src);
        
        for (i=0; i<max; i++) {
                switch (src[i]) {
-                       case '<': dest[t]=0; strcat(dest, "&lt;"); t+=4; break;
-                       case '>': dest[t]=0; strcat(dest, "&gt;"); t+=4; break;
-                       case '&': dest[t]=0; strcat(dest, "&amp;"); t+=5; break;
-                       case '"': dest[t]=0; strcat(dest, "&quot;"); t+=6; break;
-                       case '\'': strcat(dest, "&apos;"); t+=7; break;
-                       default: dest[t]=src[i]; t++;
+                       case '<': tmp[t]=0; strcat(tmp, "&lt;"); t+=4; break;
+                       case '>': tmp[t]=0; strcat(tmp, "&gt;"); t+=4; break;
+                       case '&': tmp[t]=0; strcat(tmp, "&amp;"); t+=5; break;
+                       case '"': tmp[t]=0; strcat(tmp, "&quot;"); t+=6; break;
+                       case '\'': strcat(tmp, "&apos;"); t+=7; break;
+                       default: tmp[t]=src[i]; t++;
                }
        }
-       dest[t]=0;
+       tmp[t]=0;
+
+       int outlen=4096;
+       int inlen=t;
+       
+       int res=isolat1ToUTF8((unsigned char *) dest, &outlen, (unsigned char *) tmp, &inlen);
+       dest[outlen]=0;
+       if (res<0) {
+               tX_error("failed to encode string (%s) to UTF-8.", src);
+       }
        
        //tX_debug("encode_xml: from \"%s\" to \"%s\".", src, dest); 
        return dest;
 }
+
+char *decode_xml(char *dest, const char *src) {
+       int inlen=strlen(src);
+       int outlen=4096;
+       
+       int res=UTF8Toisolat1(dest, &outlen, src, &inlen);
+       dest[outlen]=0;
+       
+       if (res<0) {
+               tX_error("failed to decode UTF-8 string (%s).", src);
+       }
+       
+       return dest;
+}
+       
index a611ca6759587bfe103c1dc9a9b6e350ef4b16bc..400e531f1bf5db514fbb1ecee6a327f222482f37 100644 (file)
@@ -141,19 +141,20 @@ extern tx_global globals;
 extern void load_globals();
 extern void store_globals();
 extern char *encode_xml(char *dest, const char *src);
+extern char *decode_xml(char *dest, const char *src);
 
 #define nop
 
 /* some ugly XML macros... */
 #define restore_int(s, i); 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); }}
 #define restore_float(s, i); 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;}}
-#define restore_string(s, i); if ((!elementFound) && (!xmlStrcmp(cur->name, (const xmlChar *) s))) { elementFound=1; if (xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)) {strcpy(i, (const char *)  xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)); }}
+#define restore_string(s, i); if ((!elementFound) && (!xmlStrcmp(cur->name, (const xmlChar *) s))) { elementFound=1; if (xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)) {strcpy(i, decode_xml(tmp_xml_buffer, (const char *)  xmlNodeListGetString(doc, cur->xmlChildrenNode, 1))); }}
 #define restore_bool(s, i); 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; }}
 #define restore_id(s, sp); if ((!elementFound) && (!xmlStrcmp(cur->name, (const xmlChar *) s))) { elementFound=1; pid_attr=(char* ) xmlGetProp(cur, (xmlChar *) "id"); if (pid_attr) { sscanf(pid_attr, "%i",  &pid); sp.set_persistence_id(pid); }}
 
 #define restore_int_ac(s, i, 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; }}
 #define restore_float_ac(s, i, 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; }}
-#define restore_string_ac(s, i, init); if ((!elementFound) && (!xmlStrcmp(cur->name, (const xmlChar *) s))) { elementFound=1; if (xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)) {strcpy(i, (const char *) xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)); init; }}
+#define restore_string_ac(s, i, init); if ((!elementFound) && (!xmlStrcmp(cur->name, (const xmlChar *) s))) { elementFound=1; if (xmlNodeListGetString(doc, cur->xmlChildrenNode, 1)) {strcpy(i, decode_xml(tmp_xml_buffer, (const char *) xmlNodeListGetString(doc, cur->xmlChildrenNode, 1))); init; }}
 #define restore_bool_ac(s, i, 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; init; }}
 
 //#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); pid_attr=(char* ) xmlGetProp(cur, (xmlChar *) "id"); if (pid_attr) { sscanf(pid_attr, "%i",  &pid); sp.set_persistence_id(pid); } init; }}
index 0557fca0db3c92ecf2d57638f470c67e54c8c082..765c3fb33d652d01bfcab8831ae1c3af3a022235 100644 (file)
@@ -35,6 +35,7 @@ LADSPA_Class * LADSPA_Class::root=NULL;
 LADSPA_Class * LADSPA_Class::unclassified=NULL;
 std::list <char *> LADSPA_Class::rdf_files;
 vtt_class *LADSPA_Class::current_vtt;
+bool LADSPA_Class::liblrdf_error=false;
 
 /* Why do have to code this myself? */
 static int compare(const char *a, const char *b) {
@@ -95,7 +96,8 @@ void LADSPA_Class::init() {
                lrdf_init();
        
                if (lrdf_read_files((const char **) uris)) {
-                       tX_error("liblrdf had problems reading the rdf files");
+                       tX_error("liblrdf had problems reading the rdf files - cannot provide structured menu");
+                       liblrdf_error=true;
         }
 #endif
                root=new LADSPA_Class("http://ladspa.org/ontology#Plugin");
@@ -167,30 +169,32 @@ LADSPA_Class :: LADSPA_Class (char *uri) : label(NULL), accept_all(false) {
        lrdf_uris *ulist;
        char *urilabel;
        int i;
+
+       if (!liblrdf_error) {
+               urilabel=lrdf_get_label(uri);
+               
+               if (urilabel) {
+                       label=strdup(urilabel);
+               }
+               
+               /* Finding subclasses... */
+               ulist = lrdf_get_subclasses(uri);
+               
+               for (i = 0; ulist && i < ulist->count; i++) {
+                       insert_class(new LADSPA_Class(ulist->items[i]));
+               }
        
-       urilabel=lrdf_get_label(uri);
-       
-       if (urilabel) {
-               label=strdup(urilabel);
-       }
-       
-       /* Finding subclasses... */
-       ulist = lrdf_get_subclasses(uri);
+               lrdf_free_uris(ulist);
        
-       for (i = 0; ulist && i < ulist->count; i++) {
-               insert_class(new LADSPA_Class(ulist->items[i]));
-       }
-
-       lrdf_free_uris(ulist);
-
-       /* Finding instances... */
-       ulist=lrdf_get_instances(uri);
+               /* Finding instances... */
+               ulist=lrdf_get_instances(uri);
+               
+               for (i = 0; ulist && i < ulist->count; i++) {
+                       registered_ids.push_back(lrdf_get_uid(ulist->items[i]));
+               }
        
-       for (i = 0; ulist && i < ulist->count; i++) {
-               registered_ids.push_back(lrdf_get_uid(ulist->items[i]));
+               lrdf_free_uris(ulist);
        }
-
-       lrdf_free_uris(ulist);
 #endif 
 }
 
index ca96c65218cd3818d7863ea49d3352c3af4455c5..256de68658a2471e3f8e7a13f98fa4350e7090c9 100644 (file)
@@ -39,6 +39,7 @@ class LADSPA_Class { // Yeah, I know "class" name for C++ class - but it just se
        static LADSPA_Class *unclassified;
        static std::list <char *> rdf_files;
        static vtt_class *current_vtt;
+       static bool liblrdf_error;
        
        char *label;
        bool accept_all;
index a03ec68a9823b02e2db2b850a8a6e35ef25ba6da..a08a4d557bc3a1b1b3c56cb7a4a2f30d66eec57f 100644 (file)
@@ -1401,7 +1401,8 @@ void display_help() {
        
        if (help_child==0) {
                // child
-               execlp("gnome-help","gnome-help","ghelp:/" INSTALL_PREFIX "/terminatorX/doc/terminatorX-manual/C/terminatorX-manual.xml", NULL);
+               // execlp("gnome-help","gnome-help","ghelp:/" INSTALL_PREFIX "/terminatorX/doc/terminatorX-manual/C/terminatorX-manual.xml", NULL);
+               execlp("gnome-help","gnome-help","ghelp:/" XML_MANUAL, NULL);           
                _exit(-1);
        } else if (help_child==-1) {
                tx_note("System error: couldn't fork() to run the help process.", true);
index 1d85eb81cdbaf297d4b702cc69b719fed8b67998..2caf2bbea8e7d26254c8a0be70c700a921a054cb 100644 (file)
@@ -1652,7 +1652,7 @@ int  vtt_class :: save_all(FILE* rc) {
        
        tX_seqpar :: create_persistence_ids();
 
-       fprintf(rc, "<?xml version=\"1.0\" encoding=\"US-ASCII\"?>\n\n");
+       fprintf(rc, "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n");
        fprintf(rc, "<terminatorXset version=\"%s\">\n", TX_XML_SETFILE_VERSION);
        
        strcpy(indent, "\t");
@@ -1683,6 +1683,7 @@ int vtt_class :: load(xmlDocPtr doc, xmlNodePtr node) {
        int pid;
        double dvalue;
        double tmp;
+       char tmp_xml_buffer[4096];
        
        for (xmlNodePtr cur=node->xmlChildrenNode; cur != NULL; cur = cur->next) {
                if (cur->type == XML_ELEMENT_NODE) {