Index: debian/Makefile.am
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/debian/Makefile.am,v
retrieving revision 1.9
diff -u -r1.9 Makefile.am
--- debian/Makefile.am	7 Dec 2007 16:44:20 -0000	1.9
+++ debian/Makefile.am	18 Nov 2008 08:52:23 -0000
@@ -26,11 +26,12 @@
 SUBDIRS = patches
 
 EXTRA_DIST = changelog compat control copyright\
-             librivendell.install menu rdadmin.desktop rdadmin.xpm\
-             rdairplay.desktop rdairplay.xpm rdcatch.desktop\
-             rdcatch.xpm rdlibrary.desktop rdlibrary.xpm rdlogedit.desktop\
-             rdlogedit.xpm rdlogin.desktop rdlogin.xpm\
-             rdlogmanager.desktop rdlogmanager.xpm README.Debian\
+             librivendell.install menu rdadmin.desktop\
+             rdairplay.desktop rdcatch.desktop\
+             rdlibrary.desktop rdlogedit.desktop\
+             rdlogin.desktop rdcastmanager.desktop\
+             rdpanel.desktop\
+             rdlogmanager.desktop README.Debian\
              rivendell.conffiles rivendell.config\
              rivendell.docs.in rivendell.install\
              rivendell.logrotate rivendell.templates\
Index: debian/menu
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/debian/menu,v
retrieving revision 1.1
diff -u -r1.1 menu
--- debian/menu	15 Feb 2007 20:25:16 -0000	1.1
+++ debian/menu	18 Nov 2008 08:52:24 -0000
@@ -2,41 +2,53 @@
   needs="x11"\
   section="Apps/Sound"\
   title="rdadmin" command="/usr/bin/rdadmin" \
-  icon="/usr/share/srlabs/rdadmin.xpm"
+  icon="/usr/share/rivendell/rivendell.xpm"
 
 ?package(rivendell):\
   needs="x11"\
   section="Apps/Sound"\
   title="rdairplay" command="/usr/bin/rdairplay" \
-  icon="/usr/share/srlabs/rdairplay.xpm"
+  icon="/usr/share/rivendell/rivendell.xpm"
 
 ?package(rivendell):\
   needs="x11"\
   section="Apps/Sound"\
   title="rdcatch" command="/usr/bin/rdcatch" \
-  icon="/usr/share/srlabs/rdcatch.xpm"
+  icon="/usr/share/rivendell/rivendell.xpm"
 
 ?package(rivendell):\
   needs="x11"\
   section="Apps/Sound"\
   title="rdlibrary" command="/usr/bin/rdlibrary" \
-  icon="/usr/share/srlabs/rdlibrary.xpm"
+  icon="/usr/share/rivendell/rivendell.xpm"
 
 ?package(rivendell):\
   needs="x11"\
   section="Apps/Sound"\
   title="rdlogedit" command="/usr/bin/rdlogedit" \
-  icon="/usr/share/srlabs/rdlogedit.xpm"
+  icon="/usr/share/rivendell/rivendell.xpm"
 
 ?package(rivendell):\
   needs="x11"\
   section="Apps/Sound"\
   title="rdlogin" command="/usr/bin/rdlogin" \
-  icon="/usr/share/srlabs/rdlogin.xpm"
+  icon="/usr/share/rivendell/rivendell.xpm"
 
 ?package(rivendell):\
   needs="x11"\
   section="Apps/Sound"\
   title="rdlogmanager" command="/usr/bin/rdlogmanager" \
-  icon="/usr/share/srlabs/rdlogmanager.xpm"
+  icon="/usr/share/rivendell/rivendell.xpm"
+
+?package(rivendell):\
+  needs="x11"\
+  section="Apps/Sound"\
+  title="rdpanel" command="/usr/bin/rdpanel" \
+  icon="/usr/share/rivendell/rivendell.xpm"
+
+?package(rivendell):\
+  needs="x11"\
+  section="Apps/Sound"\
+  title="rdcastmanager" command="/usr/bin/rdcastmanager" \
+  icon="/usr/share/rivendell/rivendell.xpm"
 
Index: debian/rdadmin.desktop
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/debian/rdadmin.desktop,v
retrieving revision 1.1
diff -u -r1.1 rdadmin.desktop
--- debian/rdadmin.desktop	15 Feb 2007 20:25:16 -0000	1.1
+++ debian/rdadmin.desktop	18 Nov 2008 08:52:24 -0000
@@ -5,5 +5,5 @@
 Exec=rdadmin
 Terminal=false
 Type=Application
-Icon=/usr/share/srlabs/rdadmin.xpm
+Icon=/usr/share/rivendell/rivendell.xpm
 Categories=Application;AudioVideo;
Index: debian/rdairplay.desktop
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/debian/rdairplay.desktop,v
retrieving revision 1.1
diff -u -r1.1 rdairplay.desktop
--- debian/rdairplay.desktop	15 Feb 2007 20:25:16 -0000	1.1
+++ debian/rdairplay.desktop	18 Nov 2008 08:52:24 -0000
@@ -5,5 +5,5 @@
 Exec=rdairplay
 Terminal=false
 Type=Application
-Icon=/usr/share/srlabs/rdairplay.xpm
+Icon=/usr/share/rivendell/rivendell.xpm
 Categories=Application;AudioVideo;
Index: debian/rdcatch.desktop
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/debian/rdcatch.desktop,v
retrieving revision 1.1
diff -u -r1.1 rdcatch.desktop
--- debian/rdcatch.desktop	15 Feb 2007 20:25:16 -0000	1.1
+++ debian/rdcatch.desktop	18 Nov 2008 08:52:24 -0000
@@ -5,5 +5,5 @@
 Exec=rdcatch
 Terminal=false
 Type=Application
-Icon=/usr/share/srlabs/rdcatch.xpm
+Icon=/usr/share/rivendell/rivendell.xpm
 Categories=Application;AudioVideo;
Index: debian/rdlibrary.desktop
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/debian/rdlibrary.desktop,v
retrieving revision 1.1
diff -u -r1.1 rdlibrary.desktop
--- debian/rdlibrary.desktop	15 Feb 2007 20:25:16 -0000	1.1
+++ debian/rdlibrary.desktop	18 Nov 2008 08:52:24 -0000
@@ -5,5 +5,5 @@
 Exec=rdlibrary
 Terminal=false
 Type=Application
-Icon=/usr/share/srlabs/rdlibrary.xpm
+Icon=/usr/share/rivendell/rivendell.xpm
 Categories=Application;AudioVideo;
Index: debian/rdlogedit.desktop
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/debian/rdlogedit.desktop,v
retrieving revision 1.1
diff -u -r1.1 rdlogedit.desktop
--- debian/rdlogedit.desktop	15 Feb 2007 20:25:16 -0000	1.1
+++ debian/rdlogedit.desktop	18 Nov 2008 08:52:24 -0000
@@ -5,5 +5,5 @@
 Exec=rdlogedit
 Terminal=false
 Type=Application
-Icon=/usr/share/srlabs/rdlogedit.xpm
+Icon=/usr/share/rivendell/rivendell.xpm
 Categories=Application;AudioVideo;
Index: debian/rdlogin.desktop
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/debian/rdlogin.desktop,v
retrieving revision 1.1
diff -u -r1.1 rdlogin.desktop
--- debian/rdlogin.desktop	15 Feb 2007 20:25:16 -0000	1.1
+++ debian/rdlogin.desktop	18 Nov 2008 08:52:24 -0000
@@ -5,5 +5,5 @@
 Exec=rdlogin
 Terminal=false
 Type=Application
-Icon=/usr/share/srlabs/rdlogin.xpm
+Icon=/usr/share/rivendell/rivendell.xpm
 Categories=Application;AudioVideo;
Index: debian/rdlogmanager.desktop
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/debian/rdlogmanager.desktop,v
retrieving revision 1.1
diff -u -r1.1 rdlogmanager.desktop
--- debian/rdlogmanager.desktop	15 Feb 2007 20:25:16 -0000	1.1
+++ debian/rdlogmanager.desktop	18 Nov 2008 08:52:24 -0000
@@ -5,5 +5,5 @@
 Exec=rdlogmanager
 Terminal=false
 Type=Application
-Icon=/usr/share/srlabs/rdlogmanager.xpm
+Icon=/usr/share/rivendell/rivendell.xpm
 Categories=Application;AudioVideo;
Index: debian/rivendell.config
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/debian/rivendell.config,v
retrieving revision 1.4
diff -u -r1.4 rivendell.config
--- debian/rivendell.config	4 Jan 2008 17:56:11 -0000	1.4
+++ debian/rivendell.config	18 Nov 2008 08:52:24 -0000
@@ -13,7 +13,7 @@
 db_input high rivendell/debconfenable || true
 db_go
 
-# If user doesn't want to use debconf then leave...
+# If user doesn't want to use debconf then leave...'
 db_get rivendell/debconfenable || true
 if [ "$RET" = "false" ]; then
 	exit 0
@@ -26,6 +26,9 @@
 db_input high rivendell/run_mode || true
 db_go
 
+db_input high rivendell/text_editor || true
+db_go
+
 
 # Identify section
 db_input high rivendell/identity/password || true
@@ -51,13 +54,10 @@
 db_input high rivendell/mysql/loginname || true
 db_go
 
-# Populate the password with the value entered above.
-db_get rivendell/identity/password
-db_set rivendell/mysql/password $RET
 db_input high rivendell/mysql/password || true
 db_go
 
-db_input medium rivendell/mysql/database || true
+db_input low rivendell/mysql/database || true
 db_go
 
 db_input low rivendell/mysql/driver || true
Index: debian/rivendell.init
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/debian/rivendell.init,v
retrieving revision 1.4
diff -u -r1.4 rivendell.init
--- debian/rivendell.init	4 Jan 2008 17:56:11 -0000	1.4
+++ debian/rivendell.init	18 Nov 2008 08:52:24 -0000
@@ -1,83 +1,212 @@
-#!/bin/bash -e
-#
-# /etc/init.d/rivendell
-#
-
-DAEMONS="caed ripcd rdcatchd"
-PIDDIR=/var/run/rivendell
-NAME=rivendell
-LABEL="Rivendell daemons"
-
-# Defaults
-RUN_MODE="init.d"
+#! /bin/bash
+##
+##    A Rivendell init script for LSB-compliant Linux systems.
+##
+##    (C) Copyright 2002-2006 Fred Gleason <fredg@paravelsystems.com>
+##
+##      $Id: rivendell-suse.in,v 1.5 2007/02/14 21:48:41 fredg Exp $
+##
+##    This program is free software; you can redistribute it and/or modify
+##    it under the terms of version 2 of the GNU General Public License as
+##    published by the Free Software Foundation;
+##
+##    This program is distributed in the hope that it will be useful,
+##    but WITHOUT ANY WARRANTY; without even the implied warranty of
+##    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+##    GNU General Public License for more details.
+##
+##    You should have received a copy of the GNU General Public License
+##    along with this program; if not, write to the Free Software
+##    Foundation, Inc., 59 Temple Place, Suite 330, 
+##    Boston, MA  02111-1307  USA
+##
+
+### BEGIN INIT INFO
+# Provides:          rivendell
+# Required-Start:    $remote_fs mysql
+# Required-Stop:     $remote_fs
+# Default-Start:     2 3 5
+# Default-Stop:      0 1 6
+# Description:       Start the Rivendell system daemons
+### END INIT INFO
+
+
+function StartDaemons {
+  if test $GPIO_START = yes ; then
+    if test -x /etc/init.d/gpio ; then
+      /etc/init.d/gpio status > /dev/null
+      if test $? -eq 3 ; then
+        /etc/init.d/gpio start
+      fi
+    fi
+  fi
+  if test $HPI_START = yes ; then
+    if test -x /etc/init.d/asihpi ; then
+      /etc/init.d/asihpi status > /dev/null
+      if test $? -eq 3 ; then
+        /etc/init.d/asihpi start
+      fi
+    fi
+  fi
+  if test $JACK_START = yes ; then
+    $( cat /etc/jackdrc ) > /dev/null 2> /dev/null &
+    echo -n $! > /var/run/rivendell/jackd.pid
+    ipcrm -M 0x5005 2> /dev/null
+    sleep 1
+  fi
+  /usr/bin/caed 2> /dev/null
+  sleep 1
+  /usr/bin/ripcd 2> /dev/null
+  sleep 1
+  /usr/bin/rdcatchd 2> /dev/null
+}
 
-# Read config file (will override defaults above)
-[ -r /etc/default/rivendell ] && . /etc/default/rivendell
 
-if [ ! -f "/etc/rd.conf" ]; then
-    echo "No /etc/rd.conf found. See documentation and /usr/share/doc/rivendell/examples/." >&2
-    exit 0
-fi
+function StopDaemons {
+  kill `cat /var/run/rivendell/rdcatchd.pid` > /dev/null 2> /dev/null
+  kill `cat /var/run/rivendell/ripcd.pid` > /dev/null 2> /dev/null
+  kill `cat /var/run/rivendell/caed.pid` > /dev/null 2> /dev/null
+  if test $JACK_START = yes ; then
+#
+# FIXME
+#  Why are three kill(1) invocations necessary to stop jackd(1)?
+#
+    killall jackd > /dev/null 2> /dev/null
+    rm -f /var/run/rivendell/jackd.pid
+  fi
+}
 
-DAEMON_USER=`sed -n 's/^AudioOwner=\(.*\)$/\1/p' /etc/rd.conf`
+# Set path for script functions
+export PATH=$PATH:/usr/bin:/usr/sbin
 
 # For Ubuntu, create run directory to store pid files.
 AUDIOGROUP=`sed -n 's/^AudioGroup=\(.*\)$/\1/p' /etc/rd.conf`
 if [ ! -d /var/run/rivendell ]; then
-    install --directory --mode 02775 --owner="$DAEMON_USER" --group="$AUDIOGROUP" /var/run/rivendell
+  mkdir /var/run/rivendell
+  chmod ugo+rwx /var/run/rivendell
 fi
 
-
-# Check if Rivendell daemons are started by init scripts or pam_rd.
-if [ "$RUN_MODE" != "init.d" ]; then
-    exit 0
+#
+# If the LSB Init functions exist, use them, otherwise roll our own
+#
+if test -f /lib/lsb/init-functions ; then
+  . /lib/lsb/init-functions
+else
+  function log_success_msg() {
+    echo "$1 ... done."
+  }
+  function log_failure_msg() {
+    echo "$1 ... done."
+  }
 fi
 
-for daemon in $DAEMONS; do
-    test -x /usr/bin/$daemon || exit 0
-done
+# Default sysconfig values
+GPIO_START="no"
+HPI_START="no"
+JACK_START="no"
+RUN_MODE="init.d"
 
-function start() {
-    echo -n "Starting $LABEL:"
-    for daemon in $DAEMONS; do
-	start-stop-daemon --start --oknodo --chuid $DAEMON_USER --exec "/usr/bin/$daemon"
-	echo -n " $daemon"
-    done
-    echo "."
-}
+# Override defaults, if we have the sysconfig file
+test -f /etc/default/rivendell && . /etc/default/rivendell
 
-function stop() {
-    echo -n "Stopping $LABEL:"
-    for daemon in $DAEMONS; do
-	start-stop-daemon --stop --pidfile "$PIDDIR/$daemon.pid" --oknodo --user $DAEMON_USER  --exec "/usr/bin/$daemon"
-	echo -n " $daemon"
-    done
-    echo "."
+# Check for missing binaries
+if [ ! -x /usr/bin/caed ] ; then
+  echo "caed not installed"
+  exit 5
+fi
+if [ ! -x /usr/bin/ripcd ] ; then
+  echo "ripcd not installed"
+  exit 5
+fi
+if [ ! -x /usr/bin/rdcatchd ] ; then
+  echo "rdcatchd not installed"
+  exit 5
+fi
 
-    # caed forgets sometimes the shared memory 0x5005
-    ipcrm -M 0x5005 2> /dev/null || true
-}
+# Check for existence of needed config file and read it
+if [ ! -r /etc/rd.conf ] ; then
+  echo "Missing /etc/rd.conf"
+  exit 6
+fi
+
+# Check if Rivendell daemons are started by init scripts or pam_rd. (not for rdd)
+if [[ "$RUN_MODE" != "init.d" && $0 != "/usr/bin/rdd" ]]; then
+      exit 0
+fi
 
 case "$1" in
   start)
-    if ! /usr/bin/rdadmin --check-db; then
-	echo "No database available, check that MySQL is running" >&2;
-	exit 0;
+	$0 silent-status
+	if test $? -eq 3 ; then
+	    StartDaemons
+	fi
+	$0 silent-status
+	if test $? -eq 0 ; then
+	    log_success_msg "Starting Rivendell system daemons"
+	    exit 0
+	else
+	    log_failure_msg "Starting Rivendell system daemons"
+	    exit 0
     fi
-
-    start
     ;;
   stop)
-    stop
+	StopDaemons
+	$0 silent-status
+	if test $? -eq 0 ; then
+	    log_failure_msg "Stopping Rivendell system daemons"
+	    exit 1
+	else
+	    log_success_msg "Stopping Rivendell system daemons"
+	    exit 0
+	fi
       ;;
   restart)
-    stop
-    start
+	$0 silent-status
+	if test $? -eq 0 ; then
+	    StopDaemons
+	fi
+	$0 silent-status
+	if test $? -eq 0 ; then
+	    exit 1
+	fi
+	StartDaemons
+	$0 silent-status
+	if test $? -eq 0 ; then
+	    exit 0
+	fi
+	exit 1
+	;;
+    force-reload)
+	$0 restart
+	;;
+    status)
+	$0 silent-status
+	EXIT_CODE=$?
+	if test $EXIT_CODE -eq 0 ; then
+	    echo "Rivendell system daemons running."
+	else 
+	    echo "Rivendell system daemons stopped."
+	fi
+	exit $EXIT_CODE
+	;;
+    silent-status)
+	if test -f /var/run/rivendell/caed.pid ; then
+	    if test -d /proc/`cat /var/run/rivendell/caed.pid` ; then
+		if test -f /var/run/rivendell/ripcd.pid ; then
+		    if test -d /proc/`cat /var/run/rivendell/ripcd.pid` ; then
+			if test -f /var/run/rivendell/rdcatchd.pid ; then
+			    if test -d /proc/`cat /var/run/rivendell/rdcatchd.pid` ; then
+				exit 0
+			    fi
+			fi
+		    fi
+		fi
+	    fi
+	fi
+	exit 3
     ;;
   *)
-    echo "Usage: /etc/init.d/$NAME {start|stop|restart|force-reload}"
+	echo "Usage: $0 {start|stop|restart|force-reload|status}"
     exit 1
     ;;
 esac
-
-exit 0
Index: debian/rivendell.install
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/debian/rivendell.install,v
retrieving revision 1.1
diff -u -r1.1 rivendell.install
--- debian/rivendell.install	15 Feb 2007 20:25:16 -0000	1.1
+++ debian/rivendell.install	18 Nov 2008 08:52:24 -0000
@@ -1,5 +1,5 @@
 usr/bin
 usr/sbin
 usr/share/applications/rd*.desktop
-usr/share/srlabs/rd*.qm
-usr/share/srlabs/rd*.xpm
+usr/share/rivendell/rd*.qm
+usr/share/rivendell/rivendell.xpm
Index: debian/rivendell.postinst
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/debian/rivendell.postinst,v
retrieving revision 1.4
diff -u -r1.4 rivendell.postinst
--- debian/rivendell.postinst	4 Jan 2008 17:56:11 -0000	1.4
+++ debian/rivendell.postinst	18 Nov 2008 08:52:24 -0000
@@ -1,4 +1,4 @@
-#!/bin/bash -e
+#!/bin/sh -e
 
 case "$1" in
     configure)
@@ -22,102 +22,97 @@
 
             # generate the rd.conf file from debconf settings.
             dc="/etc/rd.conf"
-            if [ -e "$dc" ]; then
-                cp -a "$dc" "${dc}.dpkg-save"
-            fi
-
-            echo "; NOTE: this file was generated by the rivendell debian package" > "$dc"
-            echo ";" >> "$dc"
-            echo "; DO NOT EDIT THIS FILE!  Your changes will be lost on the next upgrade." >> "$dc"
-            echo ";" >> "$dc"
-            echo "; To regenerate this file (or to select manual configuration) run the command:" >> "$dc"
-            echo ";     dpkg-reconfigure rivendell" >> "$dc"
-            echo ";"
-            echo "" >> "$dc"
-
-            echo "[Identity]" >> "$dc"
-            db_get rivendell/identity/password
-            echo "Password=$RET" >> "$dc"
-            db_get rivendell/identity/audioowner
-            echo "AudioOwner=$RET" >> "$dc"
-            AUDIOUSER="$RET"
-            db_get rivendell/identity/audiogroup
-            echo "AudioGroup=$RET" >> "$dc"
-            AUDIOGROUP="$RET"
-            echo "" >> "$dc"
-
-            echo "[Format]" >> "$dc"
-            db_get rivendell/format/samplerate
-            echo "SampleRate=$RET" >> "$dc"
-            db_get rivendell/format/channels
-            echo "Channels=$RET" >> "$dc"
-            echo "" >> "$dc"
-
-            echo "[mySQL]" >> "$dc"
-            db_get rivendell/mysql/hostname
-            echo "Hostname=$RET" >> "$dc"
-            db_get rivendell/mysql/loginname
-            echo "Loginname=$RET" >> "$dc"
-            db_get rivendell/mysql/password
-            echo "Password=$RET" >> "$dc"
-            db_get rivendell/mysql/database
-            echo "Database=$RET" >> "$dc"
-            db_get rivendell/mysql/driver
-            echo "Driver=$RET" >> "$dc"
-            echo "" >> "$dc"
-
-            echo "[Cae]" >> "$dc"
-            db_get rivendell/cae/audioroot
-            echo "AudioRoot=$RET" >> "$dc"
-            AUDIOROOT="$RET"
-            db_get rivendell/cae/audioextension
-            echo "AudioExtension=$RET" >> "$dc"
-            db_get rivendell/cae/allownonstandardrates
-            echo "AllowNonstandardRates=$RET" >> "$dc"
-            echo "" >> "$dc"
-
-            echo "[Tuning]" >> "$dc"
-            db_get rivendell/tuning/userealtime
-            echo "UseRealtime=$RET" >> "$dc"
-            echo "" >> "$dc"
-
-            echo ";" >> "$dc"
-            echo "; Log Generation, mainly useful for debugging" >> "$dc"
-            echo ";" >> "$dc"
-            echo "" >> "$dc"
-            echo "[RDAirPlay]" >> "$dc"
-            db_get rivendell/rdairplay/logfile
-            echo "Logfile=$RET" >> "$dc"
-            echo "" >> "$dc"
-            echo "[RDCatchd]" >> "$dc"
-            db_get rivendell/rdcatchd/logfile
-            echo "Logfile=$RET" >> "$dc"
-            echo "" >> "$dc"
-            echo "[Ripcd]" >> "$dc"
-            db_get rivendell/ripcd/logfile
-            echo "Logfile=$RET" >> "$dc"
-            echo "" >> "$dc"
-            echo "[Caed]" >> "$dc"
-            db_get rivendell/caed/logfile
-            echo "Logfile=$RET" >> "$dc"
-            echo "" >> "$dc"
-
-            db_get rivendell/audioadapters/selections
-            JACK_CARD=0 # initialize JACK card to 0
-
-            # no configuration needed for HPI, simply increment JACK card
-            if  echo "$RET" | grep -s "Audioscience HPI" &> /dev/null ; then
-                let JACK_CARD=$JACK_CARD+1
-            fi
-
-            # no configuration needed for ALSA, simply increment JACK card
-            if  echo "$RET" | grep -s "ALSA" &> /dev/null ; then
-                let JACK_CARD=$JACK_CARD+1
-            fi
-
-            # JACK configuration file portion
-            if  echo "$RET" | grep -s "JACK" &> /dev/null ; then
-                cat >> "$dc" << EOF 
+            if ! [ -e "$dc" ]; then
+		echo "; NOTE: this file was generated by the rivendell debian package" > "$dc"
+		echo ";" >> "$dc"
+		echo "; To regenerate this file (or to select manual configuration) run the command:" >> "$dc"
+		echo ";     dpkg-reconfigure rivendell" >> "$dc"
+		echo ";" >> "$dc"
+		echo "" >> "$dc"
+	
+		echo "[Identity]" >> "$dc"
+		db_get rivendell/identity/password
+		echo "Password=$RET" >> "$dc"
+		db_get rivendell/identity/audioowner
+		echo "AudioOwner=$RET" >> "$dc"
+		AUDIOUSER="$RET"
+		db_get rivendell/identity/audiogroup
+		echo "AudioGroup=$RET" >> "$dc"
+		AUDIOGROUP="$RET"
+		echo "" >> "$dc"
+	
+		echo "[Format]" >> "$dc"
+		db_get rivendell/format/samplerate
+		echo "SampleRate=$RET" >> "$dc"
+		db_get rivendell/format/channels
+		echo "Channels=$RET" >> "$dc"
+		echo "" >> "$dc"
+	
+		echo "[mySQL]" >> "$dc"
+		db_get rivendell/mysql/hostname
+		echo "Hostname=$RET" >> "$dc"
+		db_get rivendell/mysql/loginname
+		echo "Loginname=$RET" >> "$dc"
+		db_get rivendell/mysql/password
+		echo "Password=$RET" >> "$dc"
+		db_get rivendell/mysql/database
+		echo "Database=$RET" >> "$dc"
+		db_get rivendell/mysql/driver
+		echo "Driver=$RET" >> "$dc"
+		echo "" >> "$dc"
+	
+		echo "[Cae]" >> "$dc"
+		db_get rivendell/cae/audioroot
+		echo "AudioRoot=$RET" >> "$dc"
+		AUDIOROOT="$RET"
+		db_get rivendell/cae/audioextension
+		echo "AudioExtension=$RET" >> "$dc"
+		db_get rivendell/cae/allownonstandardrates
+		echo "AllowNonstandardRates=$RET" >> "$dc"
+		echo "" >> "$dc"
+	
+		echo "[Tuning]" >> "$dc"
+		db_get rivendell/tuning/userealtime
+		echo "UseRealtime=$RET" >> "$dc"
+		echo "" >> "$dc"
+	
+		echo ";" >> "$dc"
+		echo "; Log Generation, mainly useful for debugging" >> "$dc"
+		echo ";" >> "$dc"
+		echo "" >> "$dc"
+		echo "[RDAirPlay]" >> "$dc"
+		db_get rivendell/rdairplay/logfile
+		echo "Logfile=$RET" >> "$dc"
+		echo "" >> "$dc"
+		echo "[RDCatchd]" >> "$dc"
+		db_get rivendell/rdcatchd/logfile
+		echo "Logfile=$RET" >> "$dc"
+		echo "" >> "$dc"
+		echo "[Ripcd]" >> "$dc"
+		db_get rivendell/ripcd/logfile
+		echo "Logfile=$RET" >> "$dc"
+		echo "" >> "$dc"
+		echo "[Caed]" >> "$dc"
+		db_get rivendell/caed/logfile
+		echo "Logfile=$RET" >> "$dc"
+		echo "" >> "$dc"
+	
+		db_get rivendell/audioadapters/selections
+		JACK_CARD=0 # initialize JACK card to 0
+	
+		# no configuration needed for HPI, simply increment JACK card
+                if [ "$RET" = "Audioscience HPI" ]; then
+			let JACK_CARD=$JACK_CARD+1
+		fi
+	
+		# no configuration needed for ALSA, simply increment JACK card
+                if [ "$RET" = "ALSA" ]; then
+			let JACK_CARD=$JACK_CARD+1
+		fi
+	
+		# JACK configuration file portion
+                if [ "$RET" = "JACK" ]; then
+			cat >> "$dc" << EOF 
 ;
 ; JACK Session Management
 ;
@@ -178,33 +173,43 @@
 Source18=alsa_pcm:capture_2
 Destination18=rivendell_${JACK_CARD}:record_0R
 EOF
-
-                # generate global /etc/jackdrc configuration file
-                dc="/etc/jackdrc"
-                if [ -e "$dc" ]; then
-                    cp -a "$dc" "${dc}.dpkg-save"
                 fi
-                db_get rivendell/format/samplerate
-                echo "/usr/bin/jackd --realtime --temporary --driver alsa --rate $RET" > "$dc"
-                # FIXME: unfortunately jackd cannot parse comments, so none can be added at this time to /etc/jackdrc
-
-                # generate global X11 Xsession.d configuration file to set JACK_START_SERVER environment variable
-                dc="/etc/X11/Xsession.d/98jack-environment"
-                if [ -e "$dc" ]; then
-                    cp -a "$dc" "${dc}.dpkg-save"
-                fi
-                echo "# NOTE: this file was generated by the rivendell debian package" > "$dc"
-                echo "#" >> "$dc"
-                echo "# DO NOT EDIT THIS FILE!  Your changes will be lost on the next upgrade." >> "$dc"
-                echo "#" >> "$dc"
-                echo "# To regenerate this file (or to select manual configuration) run the command:" >> "$dc"
-                echo "#     dpkg-reconfigure rivendell" >> "$dc"
-                echo "" >> "$dc"
-                echo "# set environment variable for JACK to start if not running" >> "$dc"
-                echo "# (NOTE: /etc/jackdrc is read for the jackd command line)." >> "$dc"
-                echo "export JACK_START_SERVER=1" >> "$dc"
-            fi  # End of if rivendell/audioadapters/selections has JACK
-            # End of generate the rd.conf file from debconf settings.
+            fi 
+            # generate global /etc/jackdrc configuration file
+            dc="/etc/jackdrc"
+ 	    db_get rivendell/audioadapters/selections
+            if ! [ -e "$dc" ] && [ "$RET" = "JACK" ]; then
+              db_get rivendell/format/samplerate
+	      echo "/usr/bin/jackd --realtime --temporary --driver alsa --rate $RET" > "$dc"
+	      # FIXME: unfortunately jackd cannot parse comments, so none can be added at this time to /etc/jackdrc
+            fi  
+
+            dc="/etc/X11/Xsession.d/98jack-environment"
+	    if [ -e "$dc" ]; then
+               rm "$dc"
+	    fi
+
+            dc="/etc/X11/Xsession.d/98rivendell-environment"
+	    echo "# NOTE: this file was generated by the rivendell debian package" > "$dc"
+	    echo "#" >> "$dc"
+	    echo "# To regenerate this file (or to select manual configuration) run the command:" >> "$dc"
+	    echo "#     dpkg-reconfigure rivendell" >> "$dc"
+	    echo "" >> "$dc"
+  	    db_get rivendell/run_mode
+            if [ "$RET" = "pam_rd" ]; then
+   	      db_get rivendell/audioadapters/selections
+              if [ "$RET" = "JACK" ]; then
+	         echo "# set environment variable for JACK to start if not running" >> "$dc"
+	         echo "# (NOTE: /etc/jackdrc is read for the jackd command line)." >> "$dc"
+	         echo "export JACK_START_SERVER=1" >> "$dc"
+              fi
+            else  
+	       echo "# set environment variable for JACK to start not automatically" >> "$dc"
+	       echo "export JACK_START_SERVER=0" >> "$dc"
+            fi
+            db_get rivendell/text_editor
+	    echo "# set environment variable external Text Editor" >> "$dc"
+	    echo "export VISUAL=""$RET" >> "$dc"
 
             # generate init script configuration file from debconf settings.
             dc="/etc/default/rivendell"
@@ -225,6 +230,19 @@
             echo "# Possible values are 'init.d' or 'pam_rd'." >> "$dc"
             db_get rivendell/run_mode || true
             echo "RUN_MODE=\"$RET\" " >> "$dc"
+            echo "GPIO_START=\"no\" " >> "$dc"
+            db_get rivendell/audioadapters/selections
+            if [ "$RET" = "Audioscience HPI" ]; then
+              echo "HPI_START=\"yes\" " >> "$dc"
+            else
+              echo "HPI_START=\"no\" " >> "$dc"
+            fi
+            db_get rivendell/audioadapters/selections
+            if [ "$RET" = "JACK" ]; then
+              echo "JACK_START=\"yes\" " >> "$dc"
+            else
+              echo "JACK_START=\"no\" " >> "$dc"
+            fi
 
             # populate PAM scripts with pam_rd hooks if requested by the user and it is not already in there
             db_get rivendell/run_mode
@@ -244,21 +262,33 @@
                     #   @include common-auth
                     # note only 1 backslash after first line, as we don't want an extra blank line in the output file.
                     sed -e "s/^[[:space:]]*@include common-auth[[:space:]]*/\
-auth       optional     pam_rd.so   debug kill_rd_daemons destroy_shm ignore_pass \\
+auth       optional     pam_rd.so   debug kill_rd_daemons destroy_shm ignore_pass fail_default_user=user\\
 @include common-auth/" \
                         < ${dc} >${dc}.dpkg-tmp
                     mv -f ${dc}.dpkg-tmp ${dc}
                 fi
             fi # End of populate PAM scripts.
 
+            #Realtime permissions for Rivendell Group
+            dc="/etc/security/limits.conf"
+            if [ `grep --count "$AUDIOGROUP" "$dc"` -eq 0 ] ; then
+               echo @"$AUDIOGROUP" - rtprio 99 >> "$dc" 
+               echo @"$AUDIOGROUP" - nice -10 >> "$dc" 
+               echo @"$AUDIOGROUP" - memlock 450000 >> "$dc" 
+            fi
         fi # End of if rivendell/debconfenable = true
 
         db_stop # End of debconf section
 
-
         # Do other system configurations, using debconf values if set, and
         # falling back to defaults if not using debconf.
 
+        if [ -e "/usr/bin/rdd" ]; then
+          rm /usr/bin/rdd
+        fi
+        ln -s /etc/init.d/rivendell /usr/bin/rdd
+        chmod ugo+rx /usr/bin/rdd
+
         # create Rivendell user and group
         if ! getent group "$AUDIOGROUP" >/dev/null; then
             # Adding system group:
@@ -286,7 +316,7 @@
             install --directory --mode 02775 --owner="$AUDIOUSER" --group="$AUDIOGROUP" "$AUDIOROOT"
         fi
 
-        # Create run directory to store pid files .
+        # Create run directory to store pid files 
         if [ ! -d /var/run/rivendell ]; then
             install --directory --mode 02775 --owner="$AUDIOUSER" --group="$AUDIOGROUP" /var/run/rivendell
         fi
@@ -296,6 +326,10 @@
         if [ ! -d /var/log/rivendell ]; then
             install --directory --mode 02775 --owner="$AUDIOUSER" --group="$AUDIOGROUP" /var/log/rivendell
         fi
+
+        if [ "$(rdadmin --update-db)" = "No Database" ]; then 
+          echo $(cat /etc/mysql/debian.cnf |grep password |head -1 |sed 's/password = //') |rdadmin --update-db $(cat /etc/mysql/debian.cnf |grep user |head -1 |sed 's/user.*= //') >/dev/null 
+        fi
     ;;
 
     abort-upgrade|abort-remove|abort-deconfigure)
Index: debian/rivendell.postrm
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/debian/rivendell.postrm,v
retrieving revision 1.4
diff -u -r1.4 rivendell.postrm
--- debian/rivendell.postrm	4 Jan 2008 17:56:11 -0000	1.4
+++ debian/rivendell.postrm	18 Nov 2008 08:52:24 -0000
@@ -36,6 +36,8 @@
         
         # Remove init.d configuration file
         rm -f /etc/default/rivendell
+        rm -f /etc/rd.conf
+        rm -f /usr/bin/rdd
 
         # Remove pam_rd hooks from PAM scripts
         DISPLAY_MANAGER=`cat /etc/X11/default-display-manager`
@@ -44,11 +46,10 @@
         grep -v "pam_rd.so" "$dc" > "${dc}.dpkg-tmp"
         mv -f "${dc}.dpkg-tmp" "$dc"
 
-        # Remove user and group
+        if [ "$REMOVEDATA" = "true" ]; then
         deluser $AUDIOUSER $AUDIOGROUP 2> /dev/null || true
         deluser $AUDIOUSER 2> /dev/null || true
         groupdel $AUDIOGROUP 2> /dev/null || true
-        if [ "$REMOVEDATA" = "true" ]; then
             [ -d "$AUDIOROOT" ] && rm -rf "$AUDIOROOT" || true
             mysqladmin --force drop Rivendell || true
         fi
Index: debian/rivendell.templates
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/debian/rivendell.templates,v
retrieving revision 1.2
diff -u -r1.2 rivendell.templates
--- debian/rivendell.templates	2 Aug 2007 16:45:54 -0000	1.2
+++ debian/rivendell.templates	18 Nov 2008 08:52:24 -0000
@@ -31,6 +31,11 @@
  pam_rd - multiple UNIX user accounts can be used, with pam_rd clearing any old
  daemons when a user logs in to an X session.
 
+Template: rivendell/text_editor
+Type: string
+Default: vi
+Description: Text Editor for Reports
+
 Template: rivendell/identity/password
 Type: string
 Default: letmein
@@ -106,6 +111,7 @@
 Template: rivendell/mysql/driver
 Type: select
 Choices: QMYSQL3, FIXME
+Default: QMYSQL3
 Description: Select the driver used to connect to the database:
  This is the driver used to connect to the database, which may or may
  not be a MySQL database.
@@ -132,7 +138,7 @@
 Description: Should non standard sample rates be permitted
  If true, then non-standard rates can exist in the audio store.
  .
- FIXME: is this samplerate or bitrate or both.
+ 
 
 Template: rivendell/tuning/userealtime
 Type: boolean
@@ -184,6 +190,8 @@
 Template: rivendell/audioadapters/alsaintro
 Type: note
 Description: ALSA Rivendell integration.
+ You don't have to care about this, if you are using Jack Audio.
+  
  In order for Rivendell to recognize an ALSA sound adapter, there must
  exist a standard ALSA configuration file with a card named "rd0"
  defined. 
@@ -214,12 +222,7 @@
 Description: Rivendell introduction.
  The Rivendell radio broadcast automation solution has been installed.
  .
- The next step is to run the "rdadmin" command with a user that has permissions
- to the rivendell system.  The first time it will prompt for a MySQL userid and
- password that has permissions to connect and create the database.
- .
- Once the database has been created, run the "rdadmin" command again.
- From this point on, rdadmin will allow for configuring of Rivendell.
+ Run "rdadmin" for configuring.
  .
  The default user accounts within Rivendell are "admin" and "user", both
  with no password.
Index: debian/rules
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/debian/rules,v
retrieving revision 1.5
diff -u -r1.5 rules
--- debian/rules	7 Dec 2007 16:44:20 -0000	1.5
+++ debian/rules	18 Nov 2008 08:52:24 -0000
@@ -51,13 +51,8 @@
 	$(MAKE) DESTDIR=`pwd`/debian/tmp prefix=/usr install-debian	
 #	rm -f `pwd`/debian/tmp/usr/bin/toolame
 
-	install -m 644 $(CURDIR)/debian/rdadmin.xpm $(CURDIR)/debian/tmp/usr/share/srlabs
-	install -m 644 $(CURDIR)/debian/rdairplay.xpm $(CURDIR)/debian/tmp/usr/share/srlabs
-	install -m 644 $(CURDIR)/debian/rdcatch.xpm $(CURDIR)/debian/tmp/usr/share/srlabs
-	install -m 644 $(CURDIR)/debian/rdlibrary.xpm $(CURDIR)/debian/tmp/usr/share/srlabs
-	install -m 644 $(CURDIR)/debian/rdlogedit.xpm $(CURDIR)/debian/tmp/usr/share/srlabs
-	install -m 644 $(CURDIR)/debian/rdlogin.xpm $(CURDIR)/debian/tmp/usr/share/srlabs
-	install -m 644 $(CURDIR)/debian/rdlogmanager.xpm $(CURDIR)/debian/tmp/usr/share/srlabs
+	# FIXME: there may be a better way to get this directory created...
+	install -m 644 $(CURDIR)/icons/rivendell-48x48.xpm $(CURDIR)/debian/tmp/usr/share/rivendell/rivendell.xpm
 
 	# FIXME: there may be a better way to get this directory created...
 	install -d -m 755 $(CURDIR)/debian/tmp/usr/share/applications
@@ -68,6 +63,8 @@
 	install -m 644 $(CURDIR)/debian/rdlogedit.desktop $(CURDIR)/debian/tmp/usr/share/applications
 	install -m 644 $(CURDIR)/debian/rdlogin.desktop $(CURDIR)/debian/tmp/usr/share/applications
 	install -m 644 $(CURDIR)/debian/rdlogmanager.desktop $(CURDIR)/debian/tmp/usr/share/applications
+	install -m 644 $(CURDIR)/debian/rdcastmanager.desktop $(CURDIR)/debian/tmp/usr/share/applications
+	install -m 644 $(CURDIR)/debian/rdpanel.desktop $(CURDIR)/debian/tmp/usr/share/applications
 
 	dh_install --sourcedir=debian/tmp --autodest
 
Index: lib/dbversion.h
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/lib/dbversion.h,v
retrieving revision 1.22.2.1
diff -u -r1.22.2.1 dbversion.h
--- lib/dbversion.h	14 Nov 2008 21:30:52 -0000	1.22.2.1
+++ lib/dbversion.h	18 Nov 2008 08:52:24 -0000
@@ -26,6 +26,6 @@
 /*
  * Current Database Version
  */
-#define RD_VERSION_DATABASE 163
+#define RD_VERSION_DATABASE 164
 
 #endif  // DBVERSION_H
Index: lib/rdcart_dialog.cpp
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/lib/rdcart_dialog.cpp,v
retrieving revision 1.40
diff -u -r1.40 rdcart_dialog.cpp
--- lib/rdcart_dialog.cpp	12 May 2008 13:39:43 -0000	1.40
+++ lib/rdcart_dialog.cpp	18 Nov 2008 08:52:24 -0000
@@ -146,16 +146,30 @@
   // Group Selector
   //
   cart_group_box=new RDComboBox(this,"cart_group_box");
-  cart_group_box->setGeometry(100,35,150,20);
+  cart_group_box->setGeometry(100,40,150,20);
   label=new QLabel(cart_group_box,tr("Group:"),
 			   this,"cart_group_label");
-  label->setGeometry(10,35,85,20);
+  label->setGeometry(10,40,85,20);
   label->setAlignment(AlignRight|AlignVCenter);
   label->setFont(button_font);
   connect(cart_group_box,SIGNAL(activated(const QString &)),
 	  this,SLOT(groupActivatedData(const QString &)));
 
   //
+  // Scheduler Codes Filter
+  //
+  cart_codes_box=new RDComboBox(this,"cart_codes_box");
+  cart_codes_box->setGeometry(350,40,150,20);
+  label=new QLabel(cart_codes_box,tr("Label:"),
+			     this,"cart_codes_label");
+  label->setFont(button_font);
+  label->setGeometry(260,40,85,20);
+  label->setAlignment(AlignVCenter|AlignRight);
+  connect(cart_codes_box,SIGNAL(activated(const QString &)),
+	  this,SLOT(groupActivatedData(const QString &)));
+
+
+  //
   // Cart List
   //
   cart_cart_list=new RDListView(this,"cart_cart_list");
@@ -530,6 +544,13 @@
 		(const char *)GetSearchFilter(cart_filter_edit->text(),group),
 			  cart_type);
   }
+  QString code=cart_codes_box->currentText();
+  if(code!=QString("")) {
+  	code+="          ";
+    code=code.left(11);
+  	sql+=QString().sprintf(" && SCHED_CODES like \"%%%s%%\"",(const char *)code);
+  }  
+
   q=new RDSqlQuery(sql);
   int step=0;
   int count=0;
@@ -608,6 +629,15 @@
   }
   delete q;
 
+  cart_codes_box->clear();
+  cart_codes_box->insertItem(tr(""));
+  sql=QString().sprintf("select CODE from SCHED_CODES");
+  q=new RDSqlQuery(sql);
+  while(q->next()) {
+    cart_codes_box->insertItem(q->value(0).toString());
+  }
+  delete q;
+
   //
   // Preselect Group
   //
Index: lib/rdcart_dialog.h
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/lib/rdcart_dialog.h,v
retrieving revision 1.16
diff -u -r1.16 rdcart_dialog.h
--- lib/rdcart_dialog.h	31 Dec 2007 18:49:08 -0000	1.16
+++ lib/rdcart_dialog.h	18 Nov 2008 08:52:24 -0000
@@ -81,6 +81,7 @@
   QPushButton *cart_clear_button;
   QPushButton *cart_editor_button;
   RDComboBox *cart_group_box;
+  RDComboBox *cart_codes_box;
   QString *cart_filter;
   QString *cart_group;
   bool local_filter;
Index: lib/rdcart_search_text.cpp
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/lib/rdcart_search_text.cpp,v
retrieving revision 1.17
diff -u -r1.17 rdcart_search_text.cpp
--- lib/rdcart_search_text.cpp	4 Oct 2007 20:53:28 -0000	1.17
+++ lib/rdcart_search_text.cpp	18 Nov 2008 08:52:24 -0000
@@ -38,7 +38,8 @@
       (CART.AGENCY like \"%%%s%%\")||(CART.ALBUM like \"%%%s%%\")||\
       (CART.LABEL like \"%%%s%%\")||(CART.NUMBER like \"%%%s%%\")||\
       (CART.PUBLISHER like \"%%%s%%\")||(CART.COMPOSER like \"%%%s%%\")||\
-      (CART.USER_DEFINED like \"%%%s%%\"))",
+      (CART.USER_DEFINED like \"%%%s%%\")||\
+      (CART.SCHED_CODES like \"%%%s%%\"))",
   			   (const char *)search_string.utf8(),
 			   (const char *)search_string.utf8(),
 			   (const char *)search_string.utf8(),
@@ -48,6 +49,7 @@
 			   (const char *)search_string.utf8(),
 			   (const char *)search_string.utf8(),
 			   (const char *)search_string.utf8(),
+			   (const char *)search_string.utf8(),
 			   (const char *)search_string.utf8());
   }
 else {
@@ -82,7 +84,7 @@
       (CART.AGENCY like \"%%%s%%\")||(CART.ALBUM like \"%%%s%%\")||\
       (CART.LABEL like \"%%%s%%\")||(CART.NUMBER like \"%%%s%%\")||\
       (CART.PUBLISHER like \"%%%s%%\")||(CART.COMPOSER like \"%%%s%%\")||\
-      (CART.USER_DEFINED like \"%%%s%%\"))",
+      (CART.USER_DEFINED like \"%%%s%%\")||(CART.SCHED_CODES like \"%%%s%%\"))",
   			   (const char *)search_string.utf8(),
 			   (const char *)search_string.utf8(),
 			   (const char *)search_string.utf8(),
@@ -92,6 +94,7 @@
 			   (const char *)search_string.utf8(),
 			   (const char *)search_string.utf8(),
 			   (const char *)search_string.utf8(),
+			   (const char *)search_string.utf8(),
 			   (const char *)search_string.utf8());
     }
   }
Index: lib/rdclock.cpp
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/lib/rdclock.cpp,v
retrieving revision 1.19
diff -u -r1.19 rdclock.cpp
--- lib/rdclock.cpp	13 Nov 2007 00:23:29 -0000	1.19
+++ lib/rdclock.cpp	18 Nov 2008 08:52:24 -0000
@@ -292,6 +292,9 @@
   QString sql;
   RDSqlQuery *q;
   RDEventLine eventline;
+  QTime sched_length=QTime(0,0);
+  QTime length=QTime(0,0);
+  int real_length=0;
 
   sql=QString().sprintf("select EVENT_NAME,START_TIME,LENGTH from %s_CLK\
                          order by START_TIME",
@@ -302,7 +305,23 @@
     eventline.load();
     eventline.setStartTime(q->value(1).toTime().addSecs(3600*hour));
     eventline.setLength(q->value(2).toInt());
-    eventline.generateLog(logname,svc_name,errors,artistsep,clock_name_esc);
+    if(eventline.timeType()==RDLogLine::Hard) {
+      length=q->value(1).toTime();
+      sched_length=q->value(1).toTime();
+    }
+    sched_length=sched_length.addMSecs(q->value(2).toInt());
+    if(eventline.importSource()==RDEventLine::Scheduler) {
+      QTime slop_length=sched_length.addMSecs(eventline.endSlop());
+      if(slop_length>length) {
+        eventline.generateLog(logname,svc_name,errors,artistsep,clock_name_esc,&real_length);
+        length=length.addMSecs(real_length);
+      }
+    }
+    else {
+      eventline.generateLog(logname,svc_name,errors,artistsep,clock_name_esc,&real_length);
+      real_length=q->value(2).toInt();
+      length=length.addMSecs(real_length);
+    }
     eventline.clear();
   }
   delete q;
Index: lib/rdcreate_log.cpp
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/lib/rdcreate_log.cpp,v
retrieving revision 1.34
diff -u -r1.34 rdcreate_log.cpp
--- lib/rdcreate_log.cpp	4 Aug 2008 14:00:59 -0000	1.34
+++ lib/rdcreate_log.cpp	18 Nov 2008 08:52:24 -0000
@@ -97,6 +97,18 @@
 }
 
 
+QString RDCreateRulesTableSql(QString name)
+{
+  return QString().sprintf("create table if not exists `%s_RULES` (\
+      CODE varchar(10) not null primary key,\
+      MAX_ROW int unsigned,\
+      MIN_WAIT int unsigned,\
+      NOT_AFTER varchar(10),\
+      OR_AFTER varchar(10),\
+      OR_AFTER_II varchar(10))",(const char *)name.replace(" ","_")); 
+}
+
+
 QString RDCreateReconciliationTableSql(QString name)
 {
   QString sql=QString().sprintf("create table `%s_SRT` (\
Index: lib/rdcreate_log.h
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/lib/rdcreate_log.h,v
retrieving revision 1.8
diff -u -r1.8 rdcreate_log.h
--- lib/rdcreate_log.h	24 Jun 2008 22:17:48 -0000	1.8
+++ lib/rdcreate_log.h	18 Nov 2008 08:52:24 -0000
@@ -28,6 +28,7 @@
 void RDCreateLogTable(const QString &name);
 QString RDCreateLogTableSql(QString name);
 QString RDCreateClockTableSql(QString name);
+QString RDCreateRulesTableSql(QString name);
 QString RDCreateReconciliationTableSql(QString name);
 QString RDCreateStackTableSql(QString name);
 
Index: lib/rddropbox.cpp
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/lib/rddropbox.cpp,v
retrieving revision 1.5
diff -u -r1.5 rddropbox.cpp
--- lib/rddropbox.cpp	4 Aug 2008 19:05:32 -0000	1.5
+++ lib/rddropbox.cpp	18 Nov 2008 08:52:24 -0000
@@ -117,6 +117,30 @@
 }
 
 
+int RDDropbox::segueLevel() const
+{
+  return RDGetSqlValue("DROPBOXES","ID",box_id,"SEGUE_LEVEL").toInt();
+}
+
+
+void RDDropbox::setSegueLevel(int lvl) const
+{
+  SetRow("SEGUE_LEVEL",lvl);
+}
+
+
+int RDDropbox::segueLength() const
+{
+  return RDGetSqlValue("DROPBOXES","ID",box_id,"SEGUE_LENGTH").toInt();
+}
+
+
+void RDDropbox::setSegueLength(int len) const
+{
+  SetRow("SEGUE_LENGTH",len);
+}
+
+
 bool RDDropbox::singleCart() const
 {
   return RDBool(RDGetSqlValue("DROPBOXES","ID",box_id,"SINGLE_CART").toString());
Index: lib/rddropbox.h
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/lib/rddropbox.h,v
retrieving revision 1.3
diff -u -r1.3 rddropbox.h
--- lib/rddropbox.h	4 Aug 2008 19:05:33 -0000	1.3
+++ lib/rddropbox.h	18 Nov 2008 08:52:24 -0000
@@ -41,6 +41,10 @@
   void setNormalizationLevel(int lvl) const;
   int autotrimLevel() const;
   void setAutotrimLevel(int lvl) const;
+  int segueLevel() const;
+  void setSegueLevel(int lvl) const;
+  int segueLength() const;
+  void setSegueLength(int len) const;
   bool singleCart() const;
   void setSingleCart(bool state) const;
   unsigned toCart() const;
Index: lib/rdevent.cpp
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/lib/rdevent.cpp,v
retrieving revision 1.10
diff -u -r1.10 rdevent.cpp
--- lib/rdevent.cpp	4 Aug 2008 19:05:33 -0000	1.10
+++ lib/rdevent.cpp	18 Nov 2008 08:52:24 -0000
@@ -384,6 +384,30 @@
   return GetIntValue("TITLE_SEP");
 }
 
+int RDEvent::duckVolume()
+{
+  return GetIntValue("DUCK_UP");
+}
+
+
+void RDEvent::setDuckVolume(int vol)
+{
+  SetRow("DUCK_UP",vol);
+}
+
+
+QString RDEvent::transGroup()
+{
+  bool ok;
+  return GetStringValue("TRANS_GROUP",&ok);
+}
+
+
+void RDEvent::setTransGroup(QString group)
+{
+  SetRow("TRANS_GROUP",group,true);
+}
+
 
 void RDEvent::setTitleSep(unsigned titlesep)
 {
Index: lib/rdevent.h
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/lib/rdevent.h,v
retrieving revision 1.7
diff -u -r1.7 rdevent.h
--- lib/rdevent.h	12 Mar 2007 11:57:01 -0000	1.7
+++ lib/rdevent.h	18 Nov 2008 08:52:24 -0000
@@ -4,7 +4,7 @@
 //
 //   (C) Copyright 2002-2004 Fred Gleason <fredg@paravelsystems.com>
 //
-//      $Id: rdevent.h,v 1.7 2007-03-12 11:57:01 fredg Exp $
+//      $Id: rdevent.h,v 1.7 2007/03/12 11:57:01 fredg Exp $
 //
 //   This program is free software; you can redistribute it and/or modify
 //   it under the terms of the GNU General Public License version 2 as
@@ -73,6 +73,10 @@
   void setHaveCode(QString str);
   unsigned titleSep();
   void setTitleSep(unsigned titlesep);
+  int duckVolume();
+  void setDuckVolume(int vol);
+  QString transGroup();
+  void setTransGroup(QString group);
 
   
  private:
Index: lib/rdevent_line.cpp
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/lib/rdevent_line.cpp,v
retrieving revision 1.54
diff -u -r1.54 rdevent_line.cpp
--- lib/rdevent_line.cpp	4 Aug 2008 19:05:33 -0000	1.54
+++ lib/rdevent_line.cpp	18 Nov 2008 08:52:25 -0000
@@ -262,6 +262,29 @@
 }
 
 
+int RDEventLine::duckVolume() const
+{
+  return event_duck_up;
+}
+
+
+void RDEventLine::setDuckVolume(int vol)
+{
+  event_duck_up=vol;
+}
+
+
+QString RDEventLine::transGroup() const
+{
+  return event_trans_group;
+}
+
+
+void RDEventLine::setTransGroup(QString group)
+{
+  event_trans_group=group;
+}
+
 
 RDLogEvent *RDEventLine::preimportCarts()
 {
@@ -323,6 +346,8 @@
    event_sched_group="";
    event_have_code="";
    event_title_sep=100;
+   event_duck_up=0;
+   event_trans_group="";
    event_nested_event="";
 }
 
@@ -333,7 +358,8 @@
                                  GRACE_TIME,POST_POINT,USE_AUTOFILL,\
                                  USE_TIMESCALE,IMPORT_SOURCE,START_SLOP,\
                                  END_SLOP,FIRST_TRANS_TYPE,DEFAULT_TRANS_TYPE,\
-                                 COLOR,AUTOFILL_SLOP,NESTED_EVENT,SCHED_GROUP,TITLE_SEP,HAVE_CODE \
+                                 COLOR,AUTOFILL_SLOP,NESTED_EVENT,SCHED_GROUP,TITLE_SEP,HAVE_CODE, \
+                                 DUCK_UP,TRANS_GROUP \
                                  from EVENTS where NAME=\"%s\"",
 				(const char *)event_name);
   RDSqlQuery *q=new RDSqlQuery(sql);
@@ -366,6 +392,8 @@
   event_sched_group=q->value(15).toString();
   event_title_sep=q->value(16).toUInt();
   event_have_code=q->value(17).toString();
+  event_duck_up=q->value(18).toInt();
+  event_trans_group=q->value(19).toString();
   
   delete q;
   event_preimport_log->load();
@@ -388,7 +416,8 @@
                            END_SLOP=%d,FIRST_TRANS_TYPE=%d,\
                            DEFAULT_TRANS_TYPE=%d,COLOR=\"%s\"\
                            AUTOFILL_SLOP=%d,NESTED_EVENT=\"%s\",\
-                           SCHED_GROUP=\"%s\",TITLE_SEP=%d,HAVE_CODE=\"%s\" \
+                           SCHED_GROUP=\"%s\",TITLE_SEP=%d,HAVE_CODE=\"%s\",\
+                           DUCK_UP=%d,TRANS_GROUP=\"%s\" \
                            where NAME=\"%s\"",
 			  (const char *)RDEscapeString(event_properties),
 			  event_preposition,event_time_type,
@@ -405,6 +434,8 @@
 			  (const char *)RDEscapeString(event_sched_group),
 			  event_title_sep,
 			  (const char*)event_have_code,
+			  event_duck_up,
+			  (const char *)RDEscapeString(event_trans_group),
 			  (const char *)RDEscapeString(event_name));
   }
   else {
@@ -447,7 +478,7 @@
 
 bool RDEventLine::generateLog(QString logname,const QString &svcname,
 			      QString *errors, unsigned artistsep,
-			      QString clockname)
+			      QString clockname,int *real_length)
 {
   QString sql;
   RDSqlQuery *q;
@@ -467,6 +498,8 @@
   int grace_time=event_grace_time;
   int link_id=0;
 
+  *real_length=0;
+
   //
   // Get Current Count and Link ID
   //
@@ -588,20 +621,22 @@
   }
 
 // Scheduler 
-
-  if(event_import_source == RDEventLine::Scheduler ) 
+  if(event_import_source==RDEventLine::Scheduler) 
     {
           int titlesep;
           int stackid;
           int counter;   		
           RDLogLine::Source source=RDLogLine::Music;
               
+          trans_type=event_default_transtype;
           QString svcname_rp = svcname;
           svcname_rp.replace(" ","_");
  
 	  time.addMSecs(postimport_length);
       
-	  sql=QString().sprintf("select NUMBER,ARTIST,SCHED_CODES from CART where GROUP_NAME='%s'",(const char *)SchedGroup()); 
+	  sql=QString().sprintf("select NUMBER,ARTIST,SCHED_CODES from CART where GROUP_NAME='%s'\
+	   and SCHED_CODES like \"%%%s%%\"",
+	  (const char *)SchedGroup(),(const char *)event_have_code); 
 
 	  q=new RDSqlQuery(sql);
 	  if(q->size()>0)
@@ -617,7 +652,7 @@
     	  
 		  int querysize=(int)q->size();
 		  SchedCartList *schedCL;
-		  schedCL=new SchedCartList(querysize);
+		  schedCL=new SchedCartList();
 
 		  for(counter=0;counter<querysize;counter++)
 		  {
@@ -626,7 +661,8 @@
                   }
 		  delete q;
 
-        	  sql=QString().sprintf("SELECT SCHED_STACK_ID from %s_STACK order by SCHED_STACK_ID",(const char*)svcname_rp);
+        	  sql=QString().sprintf("SELECT SCHED_STACK_ID from %s_STACK order by SCHED_STACK_ID",
+        	  (const char*)svcname_rp);
 	          q=new RDSqlQuery(sql);
 	          if (q->last())
 	             { 
@@ -654,13 +690,13 @@
                           if(q->value(0).toUInt()==schedCL->getItemCartnumber(counter))
                           {
  			       schedCL->removeItem(counter);
-			       counter--;
 		          }
 		     }
                   }          
                   delete q;
                   if(schedCL->getNumberOfItems()==0)
-                    *errors+=QString().sprintf("%s Rule broken: Title Separation\n",(const char *)time.toString("hh:mm:ss"));
+                    *errors+=QString().sprintf("%s Rule broken: Title Separation\n",
+                    (const char *)time.toString("hh:mm:ss"));
                   schedCL->restore();
 
                   // Artist separation
@@ -676,18 +712,18 @@
                           if(q->value(0).toString()==schedCL->getItemArtist(counter))
                           {
  			       schedCL->removeItem(counter);
-			       counter--;
 		          }
 		     }
                   }          
 
                   delete q;
                   if(schedCL->getNumberOfItems()==0)
-                      *errors+=QString().sprintf("%s Rule broken: Artist Separation\n",(const char *)time.toString("hh:mm:ss"));
+                      *errors+=QString().sprintf("%s Rule broken: Artist Separation\n",
+                      (const char *)time.toString("hh:mm:ss"));
                   schedCL->restore();
 
                   // Must have scheduler code
-                  if(event_have_code!="")
+    /*              if(event_have_code!="")
                     {
 		    schedCL->save();		  
                     for(counter=0;counter<schedCL->getNumberOfItems();counter++)
@@ -695,16 +731,17 @@
                       if(!schedCL->itemHasCode(counter,event_have_code))
                         {
                         schedCL->removeItem(counter);
-		        counter--;
                         }
                       }
                      if(schedCL->getNumberOfItems()==0)
-                       *errors+=QString().sprintf("%s Rule broken: Must have code %s\n",(const char *)time.toString("hh:mm:ss"),(const char*)event_have_code);
+                       *errors+=QString().sprintf("%s Rule broken: Must have code %s\n",
+                       (const char *)time.toString("hh:mm:ss"),(const char*)event_have_code);
                      schedCL->restore();
-                     }
+                     }*/
 
 		  // Scheduler Codes 
-	          sql=QString().sprintf("select CODE,MAX_ROW,MIN_WAIT,NOT_AFTER, OR_AFTER,OR_AFTER_II from %s_RULES",(const char *)clockname);
+	          sql=QString().sprintf("select CODE,MAX_ROW,MIN_WAIT,NOT_AFTER, OR_AFTER,\
+	          OR_AFTER_II from %s_RULES",(const char *)clockname);
 	          q=new RDSqlQuery(sql);
                      while (q->next())
                        {
@@ -716,7 +753,8 @@
                        wstr+="          ";
                        wstr=wstr.left(11);
                        sql=QString().sprintf("select CART from %s_STACK \
-			  where SCHED_STACK_ID > %d and SCHED_CODES like \"%%%s%%\"",(const char*)svcname_rp,(stackid-range),(const char *)wstr);
+			  where SCHED_STACK_ID > %d and SCHED_CODES like \"%%%s%%\"",
+			  (const char*)svcname_rp,(stackid-range),(const char *)wstr);
                        q1=new RDSqlQuery(sql);
                        if (q1->size()>=allowed || allowed==0)	
                          for(counter=0;counter<schedCL->getNumberOfItems();counter++)
@@ -724,7 +762,8 @@
                              counter--;
                        delete q1;
                        if(schedCL->getNumberOfItems()==0)
-                         *errors+=QString().sprintf("%s Rule broken: Max. in a Row/Min. Wait for %s\n",(const char *)time.toString("hh:mm:ss"),(const char *)q->value(0).toString());
+                         *errors+=QString().sprintf("%s Rule broken: Max. in a Row/Min. Wait for %s\n",
+                         (const char *)time.toString("hh:mm:ss"),(const char *)q->value(0).toString());
                        schedCL->restore();
                        // do not play after
                        if (q->value(3).toString()!="")
@@ -734,15 +773,18 @@
                          wstr+="          ";
                          wstr=wstr.left(11);
                          sql=QString().sprintf("select CART from %s_STACK \
-			  where SCHED_STACK_ID = %d and SCHED_CODES like \"%%%s%%\"",(const char*)svcname_rp,(stackid-1),(const char *)wstr);
+			  where SCHED_STACK_ID = %d and SCHED_CODES like \"%%%s%%\"",
+			  (const char*)svcname_rp,(stackid-1),(const char *)wstr);
                          q1=new RDSqlQuery(sql);
                          if (q1->size()>0)	
                            for(counter=0;counter<schedCL->getNumberOfItems();counter++)
-                             if (                           schedCL->removeIfCode(counter,q->value(0).toString()))
+                             if (schedCL->removeIfCode(counter,q->value(0).toString()))
                                counter--;
                          delete q1;
                          if(schedCL->getNumberOfItems()==0)
-                           *errors+=QString().sprintf("%s Rule broken: Do not schedule %s after %s\n",(const char *)time.toString("hh:mm:ss"),(const char *)q->value(0).toString(),(const char *)q->value(3).toString());
+                           *errors+=QString().sprintf("%s Rule broken: Do not schedule %s after %s\n",
+                           (const char *)time.toString("hh:mm:ss"),(const char *)q->value(0).toString(),
+                           (const char *)q->value(3).toString());
                          schedCL->restore();
                          }
                        // or after
@@ -753,15 +795,18 @@
                          wstr+="          ";
                          wstr=wstr.left(11);
                          sql=QString().sprintf("select CART from %s_STACK \
-			  where SCHED_STACK_ID = %d and SCHED_CODES like \"%%%s%%\"",(const char*)svcname_rp,(stackid-1),(const char *)wstr);
+			  where SCHED_STACK_ID = %d and SCHED_CODES like \"%%%s%%\"",
+			  (const char*)svcname_rp,(stackid-1),(const char *)wstr);
                          q1=new RDSqlQuery(sql);
                          if (q1->size()>0)	
                            for(counter=0;counter<schedCL->getNumberOfItems();counter++)
-                             if (                           schedCL->removeIfCode(counter,q->value(0).toString()))
+                             if (schedCL->removeIfCode(counter,q->value(0).toString()))
                                counter--;
                          delete q1;
                          if(schedCL->getNumberOfItems()==0)
-                           *errors+=QString().sprintf("%s Rule broken: Do not schedule %s after %s\n",(const char *)time.toString("hh:mm:ss"),(const char *)q->value(0).toString(),(const char *)q->value(4).toString());
+                           *errors+=QString().sprintf("%s Rule broken: Do not schedule %s after %s\n",
+                           (const char *)time.toString("hh:mm:ss"),(const char *)q->value(0).toString(),
+                           (const char *)q->value(4).toString());
                          schedCL->restore();
                          }
                        // or after II
@@ -772,15 +817,18 @@
                          wstr+="          ";
                          wstr=wstr.left(11);
                          sql=QString().sprintf("select CART from %s_STACK \
-			  where SCHED_STACK_ID = %d and SCHED_CODES like \"%%%s%%\"",(const char*)svcname_rp,(stackid-1),(const char *)wstr);
+			  where SCHED_STACK_ID = %d and SCHED_CODES like \"%%%s%%\"",
+			  (const char*)svcname_rp,(stackid-1),(const char *)wstr);
                          q1=new RDSqlQuery(sql);
                          if (q1->size()>0)	
                            for(counter=0;counter<schedCL->getNumberOfItems();counter++)
-                             if (                           schedCL->removeIfCode(counter,q->value(0).toString()))
+                             if (schedCL->removeIfCode(counter,q->value(0).toString()))
                                counter--;
                          delete q1;
                          if(schedCL->getNumberOfItems()==0)
-                           *errors+=QString().sprintf("%s Rule broken: Do not schedule %s after %s\n",(const char *)time.toString("hh:mm:ss"),(const char *)q->value(0).toString(),(const char *)q->value(5).toString());
+                           *errors+=QString().sprintf("%s Rule broken: Do not schedule %s after %s\n",
+                           (const char *)time.toString("hh:mm:ss"),(const char *)q->value(0).toString(),
+                           (const char *)q->value(5).toString());
                          schedCL->restore();
                          }
                        }
@@ -789,28 +837,108 @@
 
 // end of deconflicting rules
 
-		  int schedpos = rand()%schedCL->getNumberOfItems();
-		  sql=QString().sprintf("insert into %s_LOG set ID=%d,COUNT=%d,TYPE=%d,\
-				  SOURCE=%d,START_TIME=\"%s\",GRACE_TIME=-1,\
+		  int schedpos = schedCL->getRandom();
+		  
+// transition cart
+	          unsigned trans_cart=0;
+		  sql=QString().sprintf("select NUMBER from CART where GROUP_NAME='%s'",
+		  (const char *)transGroup()); 
+
+	  	  q=new RDSqlQuery(sql);
+	  	  if(q->size()>0)
+	          {
+ 		        SchedCartList *trans_group_list;
+		  	int matches=(int)q->size();
+		  	trans_group_list=new SchedCartList();
+
+		  	for(counter=0;counter<matches;counter++)
+		  	{
+				q->seek(counter);
+                          	trans_group_list->insertItem(q->value(0).toUInt(),0,0," "," ");
+                        }
+                        trans_cart=trans_group_list->
+                           getItemCartnumber(trans_group_list->getRandom());
+       		        delete trans_group_list;
+		  }
+  	  	  delete q;
+  	  	  
+		  if(trans_cart>0) {
+		  	int segue_duration=GetSegueDuration(trans_cart);
+		  	int segue_end=GetSegueEndPoint(trans_cart);
+		  	int talk_length=GetTalkLength(schedCL->getItemCartnumber(schedpos));
+		  	int segue_gain=-3000;
+		  	if(event_duck_up<0) {
+		  	        segue_gain=0;
+		  	}
+			if(talk_length>=segue_duration || event_duck_up==0) {
+			  	sql=QString().sprintf("insert into %s_LOG set ID=%d,COUNT=%d,TYPE=%d,\
+				  SOURCE=%d,START_TIME=\"%s\",GRACE_TIME=%d,\
+				  CART_NUMBER=%u,TIME_TYPE=%d,POST_POINT=\"%s\",\
+				  TRANS_TYPE=%d,EXT_START_TIME=\"%s\",SEGUE_GAIN=%d",
+		  		(const char *)logname,count,count,
+		  		RDLogLine::Cart,source,
+		  		(const char *)time.toString("hh:mm:ss"),
+                  		grace_time,
+		  		trans_cart,
+		  		time_type,
+		  		(const char *)RDYesNo(post_point),
+		  		trans_type,
+		  		(const char *)time.toString("hh:mm:ss"),segue_gain);
+		  		q=new RDSqlQuery(sql);
+		  		delete q;
+		  		count++;
+			}
+			else {
+			  	sql=QString().sprintf("insert into %s_LOG set ID=%d,COUNT=%d,TYPE=%d,\
+				  SOURCE=%d,START_TIME=\"%s\",GRACE_TIME=%d,\
 				  CART_NUMBER=%u,TIME_TYPE=%d,POST_POINT=\"%s\",\
-				  TRANS_TYPE=%d,EXT_START_TIME=\"%s\"",
-		  (const char *)logname,count,count,
-		  RDLogLine::Cart,source,
+				  TRANS_TYPE=%d,EXT_START_TIME=\"%s\",SEGUE_START_POINT=%d,\
+				  SEGUE_END_POINT=%d,SEGUE_GAIN=%d",
+		  		(const char *)logname,count,count,
+		  		RDLogLine::Cart,source,
+		  		(const char *)time.toString("hh:mm:ss"),
+                  		grace_time,
+		  		trans_cart,
+		  		time_type,
+		  		(const char *)RDYesNo(post_point),
+		  		trans_type,
+		  		(const char *)time.toString("hh:mm:ss"),
+		  		(segue_end-talk_length),segue_end,segue_gain);
+		  		q=new RDSqlQuery(sql);
+		  		delete q;
+		  		count++;
+			}
+		  }
+// insert into log	
+
+  		  sql=QString().sprintf("insert into %s_LOG set ID=%d,COUNT=%d,TYPE=%d,\
+				  SOURCE=%d,START_TIME=\"%s\",GRACE_TIME=%d,\
+  				  CART_NUMBER=%u,TIME_TYPE=%d,POST_POINT=\"%s\",\
+				  TRANS_TYPE=%d,EXT_START_TIME=\"%s\",DUCK_UP_GAIN=%d",
+  		  (const char *)logname,count,count,
+  		  RDLogLine::Cart,source,
+  		  (const char *)time.toString("hh:mm:ss"),
+                  grace_time,
+  		  schedCL->getItemCartnumber(schedpos),
+  		  time_type,
+  		  (const char *)RDYesNo(post_point),
+  		  trans_type,
 		  (const char *)time.toString("hh:mm:ss"),
-		  schedCL->getItemCartnumber(schedpos),
-		  time_type,
-		  (const char *)RDYesNo(post_point),
-		  trans_type,
-		  (const char *)time.toString("hh:mm:ss"));
-		  q=new RDSqlQuery(sql);
-		  delete q;
+                  (event_duck_up*100));
+  		  q=new RDSqlQuery(sql);
+  		  delete q;
+    		  count++;
     
-		  sql=QString().sprintf("insert into %s_STACK set SCHED_STACK_ID=%u,CART=%u,ARTIST=\"%s\",SCHED_CODES=\"%s\"",(const char*)svcname_rp,
-				  stackid,schedCL->getItemCartnumber(schedpos),
-					(const char *)RDEscapeString(schedCL->getItemArtist(schedpos)),(const char *)schedCL->getItemSchedCodes(schedpos));
-		  q=new RDSqlQuery(sql);
-		  delete q;
-		  delete schedCL;
+ 		  sql=QString().sprintf("insert into %s_STACK set SCHED_STACK_ID=%u,\
+ 		  CART=%u,ARTIST=\"%s\",SCHED_CODES=\"%s\"",
+ 		  (const char*)svcname_rp,
+ 				  stackid,schedCL->getItemCartnumber(schedpos),
+                                   (const char *)RDEscapeString(schedCL->getItemArtist(schedpos)),
+                                   (const char *)schedCL->getItemSchedCodes(schedpos));
+  		  q=new RDSqlQuery(sql);
+  		  delete q;
+ 		  *real_length=GetSegueLength(schedCL->getItemCartnumber(schedpos));
+  		  delete schedCL;
 	  }
 	  else
 	  {
@@ -1145,3 +1273,92 @@
   delete cart;
   return length;
 }
+
+
+int RDEventLine::GetSegueLength(unsigned cartnum,int def_length)
+{
+  RDCart *cart=new RDCart(cartnum);
+  if(!cart->exists()) {
+    delete cart;
+    return def_length;
+  }
+  int length=cart->averageSegueLength();
+  delete cart;
+  return length;
+}
+
+
+int RDEventLine::GetSegueDuration(unsigned cartnum)
+{
+  RDCart *cart=new RDCart(cartnum);
+  if(!cart->exists()) {
+    delete cart;
+    return 0;
+  }
+  int length=cart->averageLength()-cart->averageSegueLength();
+  delete cart;
+  if (length>=0) {
+    return length;
+  }
+  else {
+    return 0;
+  }
+}
+
+
+int RDEventLine::GetSegueEndPoint(unsigned cartnum)
+{
+  RDCut *cut;
+  
+  for(int i=1;i<1000;i++)  {
+    cut=new RDCut(cartnum,i);
+    if(cut->exists()) {
+      i=1000;
+    }
+  }
+  if(!cut->exists()) {
+    delete cut;
+    return 0;
+  }
+  int segue_end=cut->segueEndPoint();
+  delete cut;
+  if (segue_end>=0) {
+    return segue_end;
+  }
+  else {
+    return 0;
+  }
+}
+
+
+int RDEventLine::GetTalkLength(unsigned cartnum)
+{
+  RDCut *cut;
+  
+  for(int i=1;i<1000;i++)  {
+    cut=new RDCut(cartnum,i);
+    if(cut->exists()) {
+      i=1000;
+    }
+  }
+  if(!cut->exists()) {
+    delete cut;
+    return 0;
+  }
+  int talkend=cut->talkEndPoint();
+  int start=cut->startPoint();
+  delete cut;
+  if(talkend<0) {
+    talkend=0;
+  }
+  if(start<0) {
+    start=0;
+  }
+  int length=talkend-start;
+  if (length>=0) {
+    return length;
+  }
+  else {
+    return 0;
+  }
+}
Index: lib/rdevent_line.h
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/lib/rdevent_line.h,v
retrieving revision 1.15
diff -u -r1.15 rdevent_line.h
--- lib/rdevent_line.h	31 Aug 2007 17:41:12 -0000	1.15
+++ lib/rdevent_line.h	18 Nov 2008 08:52:25 -0000
@@ -72,6 +72,10 @@
   void setHaveCode(QString str);
   unsigned titleSep() const;
   void setTitleSep(unsigned titlesep);
+  int duckVolume() const;
+  void setDuckVolume(int vol);
+  QString transGroup() const;
+  void setTransGroup(QString group);
   RDLogEvent *preimportCarts();
   RDLogEvent *postimportCarts();
   QTime startTime() const;
@@ -82,7 +86,7 @@
   bool load();
   bool save();
   bool generateLog(QString logname,const QString &svcname,
-		   QString *errors, unsigned artistsep,QString clockname);
+		   QString *errors, unsigned artistsep,QString clockname,int *real_length);
   bool linkLog(RDLogEvent *e,int next_id,const QString &svcname,
 	       RDLogLine *link_logline,const QString &track_str,
 	       const QString &label_cart,const QString &track_cart,
@@ -90,6 +94,10 @@
   
  private:
   int GetLength(unsigned cartnum,int def_length=0);
+  int GetSegueLength(unsigned cartnum,int def_length=0);
+  int GetSegueDuration(unsigned cartnum);
+  int GetSegueEndPoint(unsigned cartnum);
+  int GetTalkLength(unsigned cartnum);
   QString event_name;
   QString event_properties;
   int event_preposition;
@@ -113,6 +121,8 @@
   QString event_sched_group;
   QString event_have_code;
   unsigned event_title_sep;
+  int event_duck_up;
+  QString event_trans_group;
 };
 
 #endif 
Index: lib/rdlog_event.cpp
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/lib/rdlog_event.cpp,v
retrieving revision 1.93
diff -u -r1.93 rdlog_event.cpp
--- lib/rdlog_event.cpp	8 Oct 2008 18:43:30 -0000	1.93
+++ lib/rdlog_event.cpp	18 Nov 2008 08:52:25 -0000
@@ -833,6 +833,9 @@
     else {
       actual_length+=logLine(i)->forcedLength();
     }
+    if(logLine(i)->type()==RDLogLine::MusicLink || logLine(i)->type()==RDLogLine::TrafficLink) {
+      actual_length+=logLine(i)->linkLength();
+    }
   }
   return_time=start_time.addMSecs(actual_length);
   return return_time;
@@ -953,6 +956,9 @@
 
 void RDLogEvent::SaveLine(int line)
 {
+  if(log_line[line].id()==-1) {
+    return;
+  }
   QString sql;
   RDSqlQuery *q;
   sql=QString().sprintf("insert into %s set ID=%d,COUNT=%d,\
Index: lib/rdlog_line.cpp
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/lib/rdlog_line.cpp,v
retrieving revision 1.107
diff -u -r1.107 rdlog_line.cpp
--- lib/rdlog_line.cpp	12 May 2008 13:39:45 -0000	1.107
+++ lib/rdlog_line.cpp	18 Nov 2008 08:52:25 -0000
@@ -1153,7 +1153,8 @@
 	break;
 
       case RDLogLine::Macro:
-	return log_effective_length;
+//	return log_effective_length;
+	return log_forced_length;
 
       case RDLogLine::Marker:
 	return 0;
@@ -1452,11 +1453,12 @@
 	  log_end_point[0]=q->value(2).toInt();
           if(log_start_point[RDLogLine::LogPointer]>=0 ||
              log_end_point[RDLogLine::LogPointer]>=0) {
-            log_effective_length=log_end_point[RDLogLine::LogPointer]-
-                                   log_start_point[RDLogLine::LogPointer];
+    //        log_effective_length=log_end_point[RDLogLine::LogPointer]-
+    //                               log_start_point[RDLogLine::LogPointer];
+             log_effective_length=endPoint()-startPoint();
           }
           else {
-	  log_effective_length=q->value(0).toUInt();
+	    log_effective_length=q->value(0).toUInt();
           }
 	  log_segue_start_point[0]=q->value(3).toInt();
 	  log_segue_end_point[0]=q->value(4).toInt();
@@ -1502,6 +1504,7 @@
       case RDLogLine::Macro:
 	cart=new RDCart(log_cart_number);
 	log_effective_length=cart->forcedLength();
+	log_forced_length=cart->forcedLength();
 	log_average_segue_length=log_effective_length;
 	log_forced_stop=false;
 	rml_event=new RDMacroEvent();
@@ -1527,6 +1530,8 @@
 
       case RDLogLine::Marker:
       case RDLogLine::Track:
+        log_effective_length=0;
+        log_forced_length=0;
 	log_cut_number=0;
 	log_cut_name="";
 	log_effective_length=0;
@@ -1598,6 +1603,9 @@
   log_agency=q->value(9).toString();
   log_user_defined=q->value(10).toString();
   log_forced_length=q->value(11).toUInt();
+  if(log_type==RDLogLine::Macro) {
+    log_effective_length=log_forced_length;
+  }
   log_cut_quantity=q->value(12).toUInt();
   log_last_cut_played=q->value(13).toUInt();
   log_play_order=(RDCart::PlayOrder)q->value(14).toInt();
Index: lib/rdsvc.cpp
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/lib/rdsvc.cpp,v
retrieving revision 1.66
diff -u -r1.66 rdsvc.cpp
--- lib/rdsvc.cpp	4 Aug 2008 19:05:34 -0000	1.66
+++ lib/rdsvc.cpp	18 Nov 2008 08:52:26 -0000
@@ -687,6 +687,20 @@
   }
   delete q;
 
+
+  //
+  // Predict Start Times for Scheduler Events
+  //
+  RDLogEvent *log_event=new RDLogEvent(logname+"_LOG");
+  log_event->load();
+  for(int x=0;x<log_event->size();x++) {
+    log_event->logLine(x)->setStartTime(RDLogLine::Logged,
+                  log_event->blockStartTime(x));
+    log_event->save(false,x);
+  }
+  delete log_event;
+
+
   //
   // Log Chain To
   //
@@ -940,6 +954,9 @@
 			  (const char *)RDEscapeString(svc_name));
     q=new RDSqlQuery(sql);
     delete q;
+    sql=RDCreateStackTableSql(svc_name);
+    q=new RDSqlQuery(sql);
+    delete q;
 
     //
     // Create Group Audio Perms
Index: lib/schedcartlist.cpp
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/lib/schedcartlist.cpp,v
retrieving revision 1.1
diff -u -r1.1 schedcartlist.cpp
--- lib/schedcartlist.cpp	14 Mar 2007 10:26:13 -0000	1.1
+++ lib/schedcartlist.cpp	18 Nov 2008 08:52:26 -0000
@@ -21,49 +21,36 @@
 //
 
 #include <schedcartlist.h>
+#include <cstdlib>
 
 
-SchedCartList::SchedCartList(int listsize)
+SchedCartList::SchedCartList()
 {
-	cartnum=new unsigned[listsize];
-	cartlen=new int[listsize];
-	stackid=new int[listsize];
-	artist=new QString[listsize];
-	sched_codes=new QString[listsize];
 	itemcounter=0;
 }
 
 SchedCartList::~SchedCartList()
 {
-	delete []cartnum;
-	delete []cartlen;
-	delete []stackid;
-	delete []artist;
-	delete []sched_codes;
 }
 
 void SchedCartList::insertItem(unsigned cartnumber,int cartlength,int stack_id,QString stack_artist,QString stack_schedcodes)
 {
-	cartnum[itemcounter]=cartnumber;
-	cartlen[itemcounter]=cartlength;
-	stackid[itemcounter]=stack_id;
-	artist[itemcounter]=stack_artist.lower().replace(" ","");
-        sched_codes[itemcounter]=stack_schedcodes;	
+	cartnum.push_back(cartnumber);
+	cartlen.push_back(cartlength);
+	stackid.push_back(stack_id);
+	artist.push_back(stack_artist.lower().replace(" ",""));
+        sched_codes.push_back(stack_schedcodes);
+	valid.push_back(true);	
 	itemcounter++;
 }
 
 
 void SchedCartList::removeItem(int itemnumber)
 {
-	for(int i=itemnumber;i<(itemcounter-1);i++)
-	{
-		cartnum[i]=cartnum[i+1];
-		cartlen[i]=cartlen[i+1];
-		stackid[i]=stackid[i+1];
-		artist[i]=artist[i+1];
-		sched_codes[i]=sched_codes[i+1];
-	}
+   if(valid[itemnumber]) {
+	valid[itemnumber]=false;		
 	itemcounter--;
+    }
 }
 
 bool SchedCartList::removeIfCode(int itemnumber,QString test_code)
@@ -72,16 +59,9 @@
     test+="          ";
     test=test.left(11);
 
-    if (sched_codes[itemnumber].find(test)!=-1)
+    if (sched_codes[itemnumber].find(test)!=-1 && valid[itemnumber])
       {
-	for(int i=itemnumber;i<(itemcounter-1);i++)
-	{
-		cartnum[i]=cartnum[i+1];
-		cartlen[i]=cartlen[i+1];
-		stackid[i]=stackid[i+1];
-		artist[i]=artist[i+1];
-		sched_codes[i]=sched_codes[i+1];
-	}
+	valid[itemnumber]=false;		
 	itemcounter--;
         return true;
       }
@@ -103,21 +83,13 @@
 
 void SchedCartList::save(void)
 {
-	savecartnum=new unsigned[itemcounter];
-	savecartlen=new int[itemcounter];
-	savestackid=new int[itemcounter];
-	saveartist=new QString[itemcounter];
-	save_sched_codes=new QString[itemcounter];
-
 	saveitemcounter=itemcounter;	
-	for(int i=0;i<saveitemcounter;i++)
-	{
-		savecartnum[i]=cartnum[i];
-		savecartlen[i]=cartlen[i];
-		savestackid[i]=stackid[i];
-		saveartist[i]=artist[i];
-		save_sched_codes[i]=sched_codes[i];
-	}
+	savecartnum=cartnum;
+	savecartlen=cartlen;
+	savestackid=stackid;
+	saveartist=artist;
+	save_sched_codes=sched_codes;
+	save_valid=valid;
 }
 
 
@@ -125,21 +97,14 @@
 {
 	if(itemcounter==0)
 	{
-		for(int i=0;i<saveitemcounter;i++)
-		{
-			cartnum[i]=savecartnum[i];
-			cartlen[i]=savecartlen[i];
-			stackid[i]=savestackid[i];
-			artist[i]=saveartist[i];
-			sched_codes[i]=save_sched_codes[i];
-		}
+		cartnum=savecartnum;
+		cartlen=savecartlen;
+		stackid=savestackid;
+		artist=saveartist;
+		sched_codes=save_sched_codes;
 		itemcounter=saveitemcounter;	
+		valid=save_valid;
 	}
-	delete []savecartnum;
-	delete []savecartlen;
-	delete []savestackid;
-	delete []saveartist;
-	delete []save_sched_codes;
 }
 
 
@@ -172,8 +137,22 @@
 
 int SchedCartList::getNumberOfItems(void)
 {
-	return itemcounter;
+	return cartnum.size();
 }
  
 
-
+int SchedCartList::getRandom(void)
+{
+	if(itemcounter<=0) {
+	  return 0;
+	}
+        unsigned pos=rand()%(cartnum.size()-1);
+	while(valid[pos]==false) {
+	  pos++;
+	  if(pos>=cartnum.size()) {
+	    pos=0;
+	  }
+	}
+	return pos;	
+}
+ 
Index: lib/schedcartlist.h
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/lib/schedcartlist.h,v
retrieving revision 1.1
diff -u -r1.1 schedcartlist.h
--- lib/schedcartlist.h	14 Mar 2007 10:26:13 -0000	1.1
+++ lib/schedcartlist.h	18 Nov 2008 08:52:26 -0000
@@ -20,17 +20,18 @@
 //   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 //
 
+#include <vector>
 #include <qsqldatabase.h>
 
-
 #ifndef SCHEDCARTLIST_H
 #define SCHEDCARTLIST_H
 
+using namespace std;
 
 class SchedCartList
 {
   public:
-   SchedCartList(int listsize);
+   SchedCartList();
    ~SchedCartList();
    void insertItem(unsigned cartnumber,int cartlength,int stack_id,QString stack_artist,QString stack_schedcodes);
    void removeItem(int itemnumber);
@@ -42,22 +43,25 @@
    QString getItemArtist(int itemnumber);
    QString getItemSchedCodes(int itemnumber);
    int getNumberOfItems(void);
+   int getRandom(void);
    void save(void);
    void restore(void);
    
   private:
    int itemcounter;
    int saveitemcounter;
-   unsigned* cartnum;
-   unsigned* savecartnum;
-   int* cartlen;
-   int* savecartlen;
-   int* stackid;
-   int* savestackid;
-   QString* saveartist;
-   QString* artist;
-   QString* sched_codes;
-   QString* save_sched_codes;
+   vector<unsigned> cartnum;
+   vector<unsigned> savecartnum;
+   vector<int> cartlen;
+   vector<int> savecartlen;
+   vector<int> stackid;
+   vector<int> savestackid;
+   vector<bool> valid;
+   vector<bool> save_valid;
+   vector<QString> saveartist;
+   vector<QString> artist;
+   vector<QString> sched_codes;
+   vector<QString> save_sched_codes;
 };
 
 
Index: lib/schedruleslist.cpp
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/lib/schedruleslist.cpp,v
retrieving revision 1.4
diff -u -r1.4 schedruleslist.cpp
--- lib/schedruleslist.cpp	4 Oct 2007 20:53:28 -0000	1.4
+++ lib/schedruleslist.cpp	18 Nov 2008 08:52:26 -0000
@@ -30,22 +30,6 @@
   RDSqlQuery *q;
   RDSqlQuery *q1;
 
-  sql=QString().sprintf("create table if not exists `%s_RULES` (\
-      CODE varchar(10) not null primary key,\
-      MAX_ROW int unsigned,\
-      MIN_WAIT int unsigned,\
-      NOT_AFTER varchar(10),\
-      OR_AFTER varchar(10),\
-      OR_AFTER_II varchar(10))",(const char*)clockname.replace(" ","_")); 
-
-  q=new RDSqlQuery(sql);
-  if(!q->isActive()) {
-    printf("SQL: %s\n",(const char *)sql);
-    printf("SQL Error: %s\n",(const char *)q->lastError().databaseText());
-    delete q;
-    }
-  delete q;
-  
   sql=QString().sprintf("select CODE,DESCRIPTION from SCHED_CODES order by `CODE` asc"); 
 
   q=new RDSqlQuery(sql);
Index: pam_rd/pam_rd.cpp
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/pam_rd/pam_rd.cpp,v
retrieving revision 1.7
diff -u -r1.7 pam_rd.cpp
--- pam_rd/pam_rd.cpp	22 Apr 2008 19:54:07 -0000	1.7
+++ pam_rd/pam_rd.cpp	18 Nov 2008 08:52:26 -0000
@@ -65,8 +65,6 @@
 // The pam module name, this should be unique amongst pam modules.
 #define MODULE_NAME SYSLOG_IDENT
 
-
-
 /* 
  * utility functions and related definitions 
  */
@@ -164,7 +162,7 @@
     int i = 0;
     int retval;
 
-    msg[i].msg = "Password: ";
+    msg[i].msg = "Rivendell Password: ";
     msg[i].msg_style = PAM_PROMPT_ECHO_OFF;
     mesg[i] = &msg[i];
 
@@ -231,7 +229,7 @@
     }
     if (ctrl & PAM_RD_DEBUG) syslog(LOG_DEBUG, "got user:%s", username);
 
-    if (ctrl & ~PAM_RD_IGNORE_PASS) {
+    if ( !(ctrl & PAM_RD_IGNORE_PASS) ) {
         /* get password */
         if ((ctrl & PAM_RD_TRY_FIRST_PASS) || (ctrl & PAM_RD_USE_FIRST_PASS)) {
             retval = pam_get_item(pamh, PAM_AUTHTOK, (const void **) &password);
@@ -244,6 +242,7 @@
         }
         retval = pam_get_item(pamh, PAM_AUTHTOK, (const void **)&password);
 
+
         if (password == NULL) {
             syslog(LOG_ERR, "Could not retrieve user's password");
             return PAM_AUTHINFO_UNAVAIL;
Index: rdadmin/createdb.cpp
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/rdadmin/createdb.cpp,v
retrieving revision 1.177.2.1
diff -u -r1.177.2.1 createdb.cpp
--- rdadmin/createdb.cpp	14 Nov 2008 21:30:53 -0000	1.177.2.1
+++ rdadmin/createdb.cpp	18 Nov 2008 08:52:28 -0000
@@ -910,6 +910,8 @@
       COLOR char(7),\
       SCHED_GROUP VARCHAR(10),\
       TITLE_SEP INT(10) UNSIGNED,\
+      TRANS_GROUP VARCHAR(10),\
+      DUCK_UP int default 0,\
       HAVE_CODE VARCHAR(10),\
       HOR_SEP INT(10) UNSIGNED,\
       HOR_DIST INT(10) UNSIGNED,\
@@ -1140,6 +1142,8 @@
         PATH char(255),\
         NORMALIZATION_LEVEL int default 1,\
         AUTOTRIM_LEVEL int default 1,\
+        SEGUE_LENGTH int default 0,\
+        SEGUE_LEVEL int default 0,\
         SINGLE_CART enum('N','Y') default 'N',\
         TO_CART int unsigned default 0,\
         USE_CARTCHUNK_ID enum('N','Y') default 'N',\
@@ -5550,6 +5554,36 @@
     delete q;
   }
 
+  if(ver<164) {
+    q=new QSqlQuery("alter table EVENTS add column DUCK_UP int default 0 after TITLE_SEP");
+    delete q;
+    q=new QSqlQuery("alter table EVENTS add column TRANS_GROUP VARCHAR(10) after TITLE_SEP");
+    delete q;
+    q=new QSqlQuery("alter table DROPBOXES add column SEGUE_LEVEL int default 0 after AUTOTRIM_LEVEL");
+    delete q;
+    q=new QSqlQuery("alter table DROPBOXES add column SEGUE_LENGTH int default 0 after AUTOTRIM_LEVEL");
+    delete q;
+    sql="select NAME from LOGS;";
+    q=new QSqlQuery(sql);
+    while(q->next()) {
+      tablename=q->value(0).toString();
+      tablename.replace(" ","_");
+      sql="drop table "+tablename+"_STACK";
+      q1=new QSqlQuery(sql);
+      delete q1;
+    }
+    delete q;
+    sql="select NAME from SERVICES;";
+    q=new QSqlQuery(sql);
+    while(q->next()) {
+      tablename=q->value(0).toString();
+      sql=RDCreateStackTableSql(tablename);
+      q1=new QSqlQuery(sql);
+      delete q1;
+    }
+    delete q;
+  }
+
 
   // **** End of version updates ****
   
Index: rdadmin/edit_dropbox.cpp
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/rdadmin/edit_dropbox.cpp,v
retrieving revision 1.8
diff -u -r1.8 edit_dropbox.cpp
--- rdadmin/edit_dropbox.cpp	24 Jun 2008 22:17:48 -0000	1.8
+++ rdadmin/edit_dropbox.cpp	18 Nov 2008 08:52:28 -0000
@@ -167,16 +167,16 @@
   label->setAlignment(AlignLeft|AlignVCenter|ShowPrefix);
   box_normalization_level_spin=
     new QSpinBox(this,"box_normalization_level_spin");
-  box_normalization_level_spin->setGeometry(275,124,50,20);
+  box_normalization_level_spin->setGeometry(300,124,50,20);
   box_normalization_level_spin->setRange(-100,-1);
   box_normalization_level_label=
     new QLabel(tr("Level:"),this,"box_normalization_level_label");
-  box_normalization_level_label->setGeometry(210,124,60,20);
+  box_normalization_level_label->setGeometry(235,124,60,20);
   box_normalization_level_label->setFont(font);
   box_normalization_level_label->setAlignment(AlignVCenter|AlignRight);
   box_normalization_level_unit=
     new QLabel(tr("dBFS"),this,"box_normalization_level_unit");
-  box_normalization_level_unit->setGeometry(330,124,60,20);
+  box_normalization_level_unit->setGeometry(355,124,60,20);
   box_normalization_level_unit->setAlignment(AlignVCenter|AlignLeft);
   connect(box_normalization_box,SIGNAL(toggled(bool)),
 	  this,SLOT(normalizationToggledData(bool)));
@@ -193,29 +193,81 @@
   label->setAlignment(AlignLeft|AlignVCenter|ShowPrefix);
   box_autotrim_level_spin=
     new QSpinBox(this,"box_autotrim_level_spin");
-  box_autotrim_level_spin->setGeometry(275,146,50,20);
+  box_autotrim_level_spin->setGeometry(300,146,50,20);
   box_autotrim_level_spin->setRange(-100,-1);
   box_autotrim_level_label=
     new QLabel(tr("Level:"),this,"box_autotrim_level_label");
-  box_autotrim_level_label->setGeometry(210,146,60,20);
+  box_autotrim_level_label->setGeometry(235,146,60,20);
   box_autotrim_level_label->setFont(font);
   box_autotrim_level_label->setAlignment(AlignVCenter|AlignRight);
   box_autotrim_level_unit=
     new QLabel(tr("dBFS"),this,"box_autotrim_level_unit");
-  box_autotrim_level_unit->setGeometry(330,146,60,20);
+  box_autotrim_level_unit->setGeometry(355,146,60,20);
   box_autotrim_level_unit->setAlignment(AlignVCenter|AlignLeft);
   connect(box_autotrim_box,SIGNAL(toggled(bool)),
 	  this,SLOT(autotrimToggledData(bool)));
 
   //
+  // Segue Level
+  //
+  box_seguelevel_box=new QCheckBox(this,"box_seguelevel_box");
+  box_seguelevel_box->setGeometry(90,170,15,15);
+  label=new QLabel(box_seguelevel_box,tr("Set Segue Marker"),
+		   this,"box_seguelevel_label");
+  label->setGeometry(110,168,120,20);
+  label->setFont(font);
+  label->setAlignment(AlignLeft|AlignVCenter|ShowPrefix);
+  box_seguelevel_level_spin=
+		  new QSpinBox(this,"box_seguelevel_level_spin");
+  box_seguelevel_level_spin->setGeometry(300,168,50,20);
+  box_seguelevel_level_spin->setRange(-100,-1);
+  box_seguelevel_level_label=
+		  new QLabel(tr("Level:"),this,"box_seguelevel_level_label");
+  box_seguelevel_level_label->setGeometry(235,168,60,20);
+  box_seguelevel_level_label->setFont(font);
+  box_seguelevel_level_label->setAlignment(AlignVCenter|AlignRight);
+  box_seguelevel_level_unit=
+		  new QLabel(tr("dBFS"),this,"box_seguelevel_level_unit");
+  box_seguelevel_level_unit->setGeometry(355,168,60,20);
+  box_seguelevel_level_unit->setAlignment(AlignVCenter|AlignLeft);
+  connect(box_seguelevel_box,SIGNAL(toggled(bool)),
+	  this,SLOT(seguelevelToggledData(bool)));
+
+  //
+  // Segue Length
+  //
+  box_seguelength_box=new QCheckBox(this,"box_seguelength_box");
+  box_seguelength_box->setGeometry(90,192,15,15);
+  label=new QLabel(box_seguelength_box,tr("Set Segue Marker"),
+		   this,"box_seguelength_label");
+  label->setGeometry(110,190,120,20);
+  label->setFont(font);
+  label->setAlignment(AlignLeft|AlignVCenter|ShowPrefix);
+  box_seguelength_length_spin=
+		  new QSpinBox(this,"box_seguelength_length_spin");
+  box_seguelength_length_spin->setGeometry(300,190,70,20);
+  box_seguelength_length_spin->setRange(1,999999);
+  box_seguelength_length_label=
+		  new QLabel(tr("Length:"),this,"box_seguelength_length_label");
+  box_seguelength_length_label->setGeometry(235,190,60,20);
+  box_seguelength_length_label->setFont(font);
+  box_seguelength_length_label->setAlignment(AlignVCenter|AlignRight);
+  box_seguelength_length_unit=
+		  new QLabel(tr("MSec"),this,"box_seguelength_length_unit");
+  box_seguelength_length_unit->setGeometry(380,190,60,20);
+  box_seguelength_length_unit->setAlignment(AlignVCenter|AlignLeft);
+  connect(box_seguelength_box,SIGNAL(toggled(bool)),
+	  this,SLOT(seguelengthToggledData(bool)));
+
+  //
   // Use CartChunk ID
   //
   box_use_cartchunk_id_box=new QCheckBox(this,"box_use_cartchunk_id_box");
-  box_use_cartchunk_id_box->setGeometry(90,170,15,15);
+  box_use_cartchunk_id_box->setGeometry(90,214,15,15);
   label=new QLabel(box_use_cartchunk_id_box,
 		   tr("Get cart number from CartChunk CutID"),
 		   this,"box_use_cartchunk_id_label");
-  label->setGeometry(110,168,sizeHint().width()-40,20);
+  label->setGeometry(110,212,sizeHint().width()-40,20);
   label->setFont(font);
   label->setAlignment(AlignLeft|AlignVCenter|ShowPrefix);
 
@@ -223,11 +275,11 @@
   // Title from CartChunk ID
   //
   box_title_from_cartchunk_id_box=new QCheckBox(this,"box_title_from_cartchunk_id_box");
-  box_title_from_cartchunk_id_box->setGeometry(90,192,15,15);
+  box_title_from_cartchunk_id_box->setGeometry(90,236,15,15);
   label=new QLabel(box_title_from_cartchunk_id_box,
 		   tr("Get cart title from CartChunk CutID"),
 		   this,"box_title_from_cartchunk_id_label");
-  label->setGeometry(110,190,sizeHint().width()-40,20);
+  label->setGeometry(110,234,sizeHint().width()-40,20);
   label->setFont(font);
   label->setAlignment(AlignLeft|AlignVCenter|ShowPrefix);
 
@@ -235,11 +287,11 @@
   // Fix Broken Formats
   //
   box_fix_broken_formats_box=new QCheckBox(this,"box_fix_broken_formats_box");
-  box_fix_broken_formats_box->setGeometry(90,214,15,15);
+  box_fix_broken_formats_box->setGeometry(90,258,15,15);
   label=new QLabel(box_fix_broken_formats_box,
 		   tr("Attempt to work around malformatted input files"),
 		   this,"box_fix_broken_formats_label");
-  label->setGeometry(110,212,sizeHint().width()-40,20);
+  label->setGeometry(110,256,sizeHint().width()-40,20);
   label->setFont(font);
   label->setAlignment(AlignLeft|AlignVCenter|ShowPrefix);
 
@@ -287,6 +339,10 @@
     setValue(box_dropbox->normalizationLevel()/100);
   box_autotrim_box->setChecked(box_dropbox->autotrimLevel()<0);
   box_autotrim_level_spin->setValue(box_dropbox->autotrimLevel()/100);
+  box_seguelevel_box->setChecked(box_dropbox->segueLevel()<0);
+  box_seguelevel_level_spin->setValue(box_dropbox->segueLevel()/100);
+  box_seguelength_box->setChecked(box_dropbox->segueLength()>0);
+  box_seguelength_length_spin->setValue(box_dropbox->segueLength());
   box_use_cartchunk_id_box->setChecked(box_dropbox->useCartchunkId());
   box_title_from_cartchunk_id_box->setChecked(box_dropbox->titleFromCartchunkId());
   box_log_path_edit->setText(box_dropbox->logPath());
@@ -295,12 +351,14 @@
   toCartChangedData(box_to_cart_edit->text());
   normalizationToggledData(box_normalization_box->isChecked());
   autotrimToggledData(box_autotrim_box->isChecked());
+  seguelevelToggledData(box_seguelevel_box->isChecked());
+  seguelengthToggledData(box_seguelength_box->isChecked());
 }
 
 
 QSize EditDropbox::sizeHint() const
 {
-  return QSize(450,302);
+  return QSize(450,346);
 } 
 
 
@@ -363,6 +421,22 @@
 }
 
 
+void EditDropbox::seguelevelToggledData(bool state)
+{
+  box_seguelevel_level_spin->setEnabled(state);
+  box_seguelevel_level_label->setEnabled(state);
+  box_seguelevel_level_unit->setEnabled(state);
+}
+
+
+void EditDropbox::seguelengthToggledData(bool state)
+{
+  box_seguelength_length_spin->setEnabled(state);
+  box_seguelength_length_label->setEnabled(state);
+  box_seguelength_length_unit->setEnabled(state);
+}
+
+
 void EditDropbox::okData()
 {
   box_dropbox->setGroupName(box_group_name_box->currentText());
@@ -389,6 +463,20 @@
   else {
     box_dropbox->setAutotrimLevel(0);
   }
+  if(box_seguelevel_box->isChecked()) {
+    box_dropbox->
+      setSegueLevel(box_seguelevel_level_spin->value()*100);
+  }
+  else {
+    box_dropbox->setSegueLevel(0);
+  }
+  if(box_seguelength_box->isChecked()) {
+    box_dropbox->
+      setSegueLength(box_seguelength_length_spin->value());
+  }
+  else {
+    box_dropbox->setSegueLength(0);
+  }
   box_dropbox->setUseCartchunkId(box_use_cartchunk_id_box->isChecked());
   box_dropbox->setTitleFromCartchunkId(box_title_from_cartchunk_id_box->isChecked());
   box_dropbox->setLogPath(box_log_path_edit->text());
Index: rdadmin/edit_dropbox.h
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/rdadmin/edit_dropbox.h,v
retrieving revision 1.2
diff -u -r1.2 edit_dropbox.h
--- rdadmin/edit_dropbox.h	10 Sep 2007 22:05:54 -0000	1.2
+++ rdadmin/edit_dropbox.h	18 Nov 2008 08:52:28 -0000
@@ -54,6 +54,8 @@
   void selectLogPathData();
   void normalizationToggledData(bool state);
   void autotrimToggledData(bool state);
+  void seguelevelToggledData(bool state);
+  void seguelengthToggledData(bool state);
   void okData();
   void cancelData();
   
@@ -74,6 +76,14 @@
   QLabel *box_autotrim_level_label;
   QSpinBox *box_autotrim_level_spin;
   QLabel *box_autotrim_level_unit;
+  QCheckBox *box_seguelevel_box;
+  QLabel *box_seguelevel_level_label;
+  QSpinBox *box_seguelevel_level_spin;
+  QLabel *box_seguelevel_level_unit;
+  QCheckBox *box_seguelength_box;
+  QLabel *box_seguelength_length_label;
+  QSpinBox *box_seguelength_length_spin;
+  QLabel *box_seguelength_length_unit;
   QCheckBox *box_use_cartchunk_id_box;
   QCheckBox *box_title_from_cartchunk_id_box;
   QCheckBox *box_fix_broken_formats_box;
Index: rdadmin/list_dropboxes.cpp
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/rdadmin/list_dropboxes.cpp,v
retrieving revision 1.4
diff -u -r1.4 list_dropboxes.cpp
--- rdadmin/list_dropboxes.cpp	5 Oct 2007 13:50:31 -0000	1.4
+++ rdadmin/list_dropboxes.cpp	18 Nov 2008 08:52:28 -0000
@@ -108,16 +108,20 @@
   list_dropboxes_view->setColumnAlignment(2,Qt::AlignCenter);
   list_dropboxes_view->addColumn(tr("Autotrim Level"));
   list_dropboxes_view->setColumnAlignment(3,Qt::AlignCenter);
-  list_dropboxes_view->addColumn(tr("To Cart"));
+  list_dropboxes_view->addColumn(tr("Segue Level"));
   list_dropboxes_view->setColumnAlignment(4,Qt::AlignCenter);
-  list_dropboxes_view->addColumn(tr("Use CartChunk ID"));
+  list_dropboxes_view->addColumn(tr("Segue Length"));
   list_dropboxes_view->setColumnAlignment(5,Qt::AlignCenter);
-  list_dropboxes_view->addColumn(tr("Delete Cuts"));
+  list_dropboxes_view->addColumn(tr("To Cart"));
   list_dropboxes_view->setColumnAlignment(6,Qt::AlignCenter);
-  list_dropboxes_view->addColumn(tr("Metadata Pattern"));
+  list_dropboxes_view->addColumn(tr("Use CartChunk ID"));
   list_dropboxes_view->setColumnAlignment(7,Qt::AlignCenter);
-  list_dropboxes_view->addColumn(tr("Fix Broken Formats"));
+  list_dropboxes_view->addColumn(tr("Delete Cuts"));
   list_dropboxes_view->setColumnAlignment(8,Qt::AlignCenter);
+  list_dropboxes_view->addColumn(tr("Metadata Pattern"));
+  list_dropboxes_view->setColumnAlignment(9,Qt::AlignCenter);
+  list_dropboxes_view->addColumn(tr("Fix Broken Formats"));
+  list_dropboxes_view->setColumnAlignment(10,Qt::AlignCenter);
   connect(list_dropboxes_view,
 	  SIGNAL(doubleClicked(QListViewItem *,const QPoint &,int)),
 	  this,
@@ -230,7 +234,8 @@
                          DROPBOXES.AUTOTRIM_LEVEL,\
                          DROPBOXES.TO_CART,DROPBOXES.USE_CARTCHUNK_ID,\
                          DROPBOXES.DELETE_CUTS,DROPBOXES.METADATA_PATTERN,\
-                         DROPBOXES.FIX_BROKEN_FORMATS,GROUPS.COLOR \
+                         DROPBOXES.FIX_BROKEN_FORMATS,GROUPS.COLOR, \
+		         DROPBOXES.SEGUE_LEVEL, DROPBOXES.SEGUE_LENGTH\
                          from DROPBOXES left join GROUPS on \
                          DROPBOXES.GROUP_NAME=GROUPS.NAME \
                          where DROPBOXES.STATION_NAME=\"%s\"",
@@ -254,7 +259,8 @@
                          DROPBOXES.AUTOTRIM_LEVEL,\
                          DROPBOXES.TO_CART,DROPBOXES.USE_CARTCHUNK_ID,\
                          DROPBOXES.DELETE_CUTS,DROPBOXES.METADATA_PATTERN,\
-                         DROPBOXES.FIX_BROKEN_FORMATS,GROUPS.COLOR \
+                         DROPBOXES.FIX_BROKEN_FORMATS,GROUPS.COLOR, \
+		         DROPBOXES.SEGUE_LEVEL, DROPBOXES.SEGUE_LENGTH\
                          from DROPBOXES left join GROUPS on \
                          DROPBOXES.GROUP_NAME=GROUPS.NAME \
                          where DROPBOXES.ID=%d",item->id());
@@ -285,18 +291,30 @@
     item->setText(3,tr("[off]"));
   }
   if(q->value(5).toUInt()>0) {
-    item->setText(4,QString().sprintf("%06u",q->value(5).toUInt()));
+    item->setText(6,QString().sprintf("%06u",q->value(5).toUInt()));
   }
   else {
-    item->setText(4,tr("[auto]"));
+    item->setText(6,tr("[auto]"));
   }
-  item->setText(5,q->value(6).toString());
-  item->setText(6,q->value(7).toString());
+  item->setText(7,q->value(6).toString());
+  item->setText(8,q->value(7).toString());
   if(q->value(8).toString().isEmpty()) {
-    item->setText(7,tr("[none]"));
+    item->setText(9,tr("[none]"));
+  }
+  else {
+    item->setText(9,q->value(8).toString());
+  }
+  item->setText(10,q->value(9).toString());
+  if(q->value(11).toInt()<0) {
+    item->setText(4,QString().sprintf("%d",q->value(11).toInt()/100));
+  }
+  else {
+    item->setText(4,tr("[off]"));
+  }
+  if(q->value(12).toInt()>0) {
+    item->setText(5,QString().sprintf("%d",q->value(12).toInt()));
   }
   else {
-    item->setText(7,q->value(8).toString());
+    item->setText(5,tr("[off]"));
   }
-  item->setText(8,q->value(9).toString());
 }
Index: rdadmin/opendb.cpp
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/rdadmin/opendb.cpp,v
retrieving revision 1.32
diff -u -r1.32 opendb.cpp
--- rdadmin/opendb.cpp	17 Apr 2008 20:33:47 -0000	1.32
+++ rdadmin/opendb.cpp	18 Nov 2008 08:52:28 -0000
@@ -148,7 +148,7 @@
 
 
 bool OpenDb(QString dbname,QString login,QString pwd,QString host,
-	    QString stationname,bool interactive)
+	    QString stationname,bool interactive,QString username)
 {
   int db_ver;
   QString admin_name;
@@ -171,10 +171,8 @@
   db->setPassword(pwd);
   db->setHostName(host);
   if(!db->open()) {
-    if(!interactive) {
-      return false;
-    }
     RDKillDaemons();
+    if(interactive) {
     msg=QT_TR_NOOP("Unable to access the Rivendell Database!\n\
 Please enter a login for an account with\n\
 administrative rights on the mySQL server,\n\
@@ -188,7 +186,20 @@
     delete mysql_login;
     db->setUserName(admin_name);
     db->setPassword(admin_pwd);
+    } 
+    else { 
+      if(username==QString::QString("")) {    
+        printf("No Database\n");
+	return true;
+      }	
+      char pwd[100];
+      printf("Password:");
+      scanf("%s",pwd); 
+      db->setUserName(username);
+      db->setPassword(QString::QString(pwd));
+    }
     if(db->open()) {      // Fixup DB Access Permsissions
+      if(interactive)
       QMessageBox::warning(NULL,QT_TR_NOOP("Can't Connect"),
 	          QT_TR_NOOP("Wrong access permissions for accessing mySQL!"));
       db->removeDatabase("mysql");
@@ -197,6 +208,7 @@
     else {
       db->setDatabaseName("mysql");
       if(!db->open()) {   // mySQL is hosed -- scream and die.
+	if(interactive)
 	QMessageBox::warning(NULL,QT_TR_NOOP("Can't Connect"),
 			     QT_TR_NOOP("Unable to connect to mySQL!"));
 	db->removeDatabase("mysql");
@@ -207,6 +219,7 @@
 	q=new QSqlQuery(sql);
 	if(!q->isActive()) {   // Can't create DB.
 	  delete q;
+	  if(interactive)
 	  QMessageBox::warning(NULL,QT_TR_NOOP("Can't Create DB"),
 			 QT_TR_NOOP("Unable to create a Rivendell Database!"));
 	  db->removeDatabase("mysql");
@@ -241,13 +254,15 @@
 	db->setUserName(login);
 	db->setPassword(pwd);
 	if(!db->open()) {   // Can't open new database
+          if(interactive)
 	  QMessageBox::warning(NULL,QT_TR_NOOP("Can't Connect"),
 		 QT_TR_NOOP("Unable to connect to new Rivendell Database!"));
 	  db->removeDatabase(dbname);
 	  return false;
 	}
 	if(!CreateDb(login,pwd)) {   // Can't create tables.
-	  QMessageBox::warning(NULL,QT_TR_NOOP("Can't Create"),
+	  if(interactive)
+	  if(interactive)QMessageBox::warning(NULL,QT_TR_NOOP("Can't Create"),
 			       QT_TR_NOOP("Unable to create Rivendell Database!"));
 	  db->removeDatabase(dbname);
 	  return false;
@@ -257,17 +272,20 @@
 	db->setUserName(login);
 	db->setPassword(pwd);
 	if(!db->open()) {
+	  if(interactive)
 	  QMessageBox::warning(NULL,QT_TR_NOOP("Can't Connect"),
 			       QT_TR_NOOP("Unable to connect to Rivendell Database!"));
 	  db->removeDatabase(dbname);
 	  return false;
 	}	  
 	if(!InitDb(login,pwd,stationname)) {  // Can't initialize tables.
+	  if(interactive)
 	  QMessageBox::warning(NULL,QT_TR_NOOP("Can't Initialize"),
 			       QT_TR_NOOP("Unable to initialize Rivendell Database!"));
 	  db->removeDatabase(dbname);
 	  return false;
 	}
+	if(interactive)
 	QMessageBox::information(NULL,QT_TR_NOOP("Created Database"),
 			     QT_TR_NOOP("New Rivendell Database Created!"));
 	return true;
@@ -389,6 +407,6 @@
       }
     }
   }
-
+  UpdateDb(500); // Database-Updates that have not an own Version Number!!!
   return true;
 }
Index: rdadmin/opendb.h
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/rdadmin/opendb.h,v
retrieving revision 1.6
diff -u -r1.6 opendb.h
--- rdadmin/opendb.h	14 Feb 2007 21:51:02 -0000	1.6
+++ rdadmin/opendb.h	18 Nov 2008 08:52:28 -0000
@@ -26,8 +26,8 @@
 #include <qstring.h>
 
 
-bool OpenDb(QString dbname,QString username,QString password,QString hostname,
-	    QString stationname,bool interactive);
+bool OpenDb(QString dbname,QString login,QString password,QString hostname,
+	    QString stationname,bool interactive,QString username=QString::QString(""));
 
 
 #endif
Index: rdadmin/rdadmin.cpp
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/rdadmin/rdadmin.cpp,v
retrieving revision 1.64
diff -u -r1.64 rdadmin.cpp
--- rdadmin/rdadmin.cpp	18 Aug 2008 20:26:16 -0000	1.64
+++ rdadmin/rdadmin.cpp	18 Nov 2008 08:52:28 -0000
@@ -152,6 +152,7 @@
 	     admin_config->stationName(),true)) {
     exit(1);
   }
+  
   new RDDbHeartbeat(admin_config->mysqlHeartbeatInterval());
 
   //
@@ -543,6 +544,18 @@
 int cmdline_main(int argc,char *argv[])
 {
   QApplication a(argc,argv,false);
+  bool update_db=false;
+  QString username=QString::QString("");
+  
+  for(int i=0;i<argc;i++) {
+    if(!strcmp(argv[i],"--update-db")) {
+      update_db=true;
+      if(argc>i+1) { 
+        username=(QString)argv[i+1];
+	i++;
+      }
+    }
+  }
   
   //
   // Load Configs
@@ -555,7 +568,7 @@
   //
   if(!OpenDb(admin_config->mysqlDbname(),admin_config->mysqlUsername(),
 	     admin_config->mysqlPassword(),admin_config->mysqlHostname(),
-	     admin_config->stationName(),false)) {
+	     admin_config->stationName(),false,username)) {
     return 1;
   }
 
@@ -572,6 +585,9 @@
     if(!strcmp(argv[i],"--check-db")) {
       found_check_db=true;
     }
+    if(!strcmp(argv[i],"--update-db")) {
+      found_check_db=true;
+    }
   }
   if(found_check_db) {
     ret=cmdline_main(argc,argv);
Index: rdcatchd/rdcatchd.cpp
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/rdcatchd/rdcatchd.cpp,v
retrieving revision 1.130.2.1
diff -u -r1.130.2.1 rdcatchd.cpp
--- rdcatchd/rdcatchd.cpp	14 Nov 2008 21:30:56 -0000	1.130.2.1
+++ rdcatchd/rdcatchd.cpp	18 Nov 2008 08:52:29 -0000
@@ -3093,7 +3093,8 @@
   sql=QString().sprintf("select GROUP_NAME,PATH,NORMALIZATION_LEVEL,\
                          AUTOTRIM_LEVEL,TO_CART,USE_CARTCHUNK_ID,\
                          TITLE_FROM_CARTCHUNK_ID,DELETE_CUTS,\
-                         METADATA_PATTERN,FIX_BROKEN_FORMATS,LOG_PATH \
+                         METADATA_PATTERN,FIX_BROKEN_FORMATS,LOG_PATH, \
+		         SEGUE_LEVEL,SEGUE_LENGTH \
                          from DROPBOXES where STATION_NAME=\"%s\"",
 			(const char *)catch_config->stationName());
   q=new RDSqlQuery(sql);
@@ -3122,6 +3123,12 @@
     if(q->value(9).toString()=="Y") {
       cmd+=" --fix-broken-formats";
     }
+    if(q->value(11).toInt()<0) {
+      cmd+=QString().sprintf(" --segue-level=%d",q->value(11).toInt()/100);;
+    }
+    if(q->value(12).toInt()>0) {
+      cmd+=QString().sprintf(" --segue-length=%d",q->value(12).toInt());;
+    }
     cmd+=QString().sprintf(" %s \"%s\"",(const char *)q->value(0).toString(),
 			   (const char *)q->value(1).toString());
     if(!q->value(10).toString().isEmpty()) {
Index: rdlibrary/rdlibrary.cpp
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/rdlibrary/rdlibrary.cpp,v
retrieving revision 1.106
diff -u -r1.106 rdlibrary.cpp
--- rdlibrary/rdlibrary.cpp	3 Apr 2008 16:50:07 -0000	1.106
+++ rdlibrary/rdlibrary.cpp	18 Nov 2008 08:52:29 -0000
@@ -300,6 +300,13 @@
   connect(lib_showmacro_box,SIGNAL(stateChanged(int)),
 	  this,SLOT(macroChangedData(int)));
 
+
+  lib_search_button->setEnabled(false);
+  lib_group_box->setEnabled(false);
+  lib_showaudio_box->setEnabled(false);
+  lib_codes_box->setEnabled(false);
+  lib_showmacro_box->setEnabled(false);
+
   //
   // Cart List
   //
@@ -308,12 +315,7 @@
   lib_cart_list->setAllColumnsShowFocus(true);
   lib_cart_list->setItemMargin(5);
   lib_cart_list->setSelectionMode(QListView::Extended);
-  connect(lib_cart_list,
-	  SIGNAL(doubleClicked(QListViewItem *,const QPoint &,int)),
-	  this,
-	  SLOT(cartDoubleclickedData(QListViewItem *,const QPoint &,int)));
-  connect(lib_cart_list,SIGNAL(pressed(QListViewItem *)),
-	  this,SLOT(cartClickedData(QListViewItem *)));
+
   lib_cart_list->addColumn("");
   lib_cart_list->setColumnAlignment(0,Qt::AlignHCenter);
   lib_cart_list->addColumn(tr("CART"));
@@ -362,6 +364,12 @@
 
   lib_cart_list->addColumn(tr("OWNED BY"));
   lib_cart_list->setColumnAlignment(17,Qt::AlignHCenter);
+  connect(lib_cart_list,
+	  SIGNAL(doubleClicked(QListViewItem *,const QPoint &,int)),
+	  this,
+	  SLOT(cartDoubleclickedData(QListViewItem *,const QPoint &,int)));
+  connect(lib_cart_list,SIGNAL(pressed(QListViewItem *)),
+	  this,SLOT(cartClickedData(QListViewItem *)));
 
   //
   // Add Button
@@ -388,6 +396,15 @@
   connect(lib_delete_button,SIGNAL(clicked()),this,SLOT(deleteData()));
 
   //
+  // Selected
+  //
+  lib_selected_label=new QLabel(lib_group_box,tr(""),
+			     this,"lib_selected_label");
+  lib_selected_label->setFont(button_font);
+  lib_selected_label->setAlignment(AlignVCenter|AlignCenter);
+
+
+  //
   // Disk Gauge
   //
   disk_gauge=new DiskGauge(rdlibrary_conf->defaultSampleRate(),
@@ -411,6 +428,18 @@
   connect(lib_reports_button,SIGNAL(clicked()),this,SLOT(reportsData()));
 
   //
+  // Cart Player
+  //
+  lib_player=
+    new RDSimplePlayer(rdcae,rdripc,rdlibrary_conf->outputCard(),rdlibrary_conf->outputPort(),
+		       0,0,this,"lib_player");
+  lib_player->playButton()->
+    setPalette(QPalette(backgroundColor(),QColor(lightGray)));
+  lib_player->stopButton()->
+    setPalette(QPalette(backgroundColor(),QColor(lightGray)));
+  lib_player->stopButton()->setOnColor(red);
+
+  //
   // Close Button
   //
   lib_close_button=new QPushButton(this,"lib_close_button");
@@ -429,7 +458,7 @@
 
 QSize MainWidget::sizeHint() const
 {
-  return QSize(800,600);
+  return QSize(980,600);
 }
 
 
@@ -784,6 +813,13 @@
   else {
     lib_edit_button->setEnabled(true);
     }
+
+  if(item==NULL) {
+    lib_player->setCart(0);
+  }
+  else {
+    lib_player->setCart(item->text(1).toUInt());
+  }
 }
 
 
@@ -809,6 +845,7 @@
 {
   SaveGeometry();
   lib_lock->unlock();
+  lib_player->stop();
   exit(0);
 }
 
@@ -846,17 +883,14 @@
   lib_add_button->setGeometry(10,e->size().height()-60,80,50);
   lib_edit_button->setGeometry(100,e->size().height()-60,80,50);
   lib_delete_button->setGeometry(190,e->size().height()-60,80,50);
-  disk_gauge->setGeometry(290,e->size().height()-45,
+  lib_selected_label->setGeometry(290,e->size().height()-55,disk_gauge->sizeHint().width(),20);
+  disk_gauge->setGeometry(290,e->size().height()-30,
 			  disk_gauge->sizeHint().width(),
 			  disk_gauge->sizeHint().height());
-  lib_rip_button->setGeometry(240+disk_gauge->sizeHint().width()+
-			      (e->size().width()-90-
-			       (280+disk_gauge->sizeHint().width()))/2-45,
-			      e->size().height()-60,80,50);
-  lib_reports_button->setGeometry(340+disk_gauge->sizeHint().width()+
-				  (e->size().width()-90-
-				   (280+disk_gauge->sizeHint().width()))/2-45,
-				  e->size().height()-60,80,50);
+  lib_rip_button->setGeometry(490,e->size().height()-60,80,50);
+  lib_reports_button->setGeometry(590,e->size().height()-60,80,50);
+  lib_player->playButton()->setGeometry(690,e->size().height()-60,80,50);
+  lib_player->stopButton()->setGeometry(780,e->size().height()-60,80,50);
   lib_close_button->setGeometry(e->size().width()-90,e->size().height()-60,
 				80,50);
 }
@@ -875,6 +909,12 @@
 
   lib_cart_list->clear();
 
+  lib_search_button->setEnabled(false);
+  lib_group_box->setEnabled(false);
+  lib_showaudio_box->setEnabled(false);
+  lib_codes_box->setEnabled(false);
+  lib_showmacro_box->setEnabled(false);
+
   type_filter=GetTypeFilter();
   if(type_filter.isEmpty()) {
     return;
@@ -1023,6 +1063,13 @@
   UpdateItemColor(l,validity,end_datetime,current_datetime);
   lib_progress_dialog->reset();
   delete q;
+
+  lib_search_button->setEnabled(true);
+  lib_group_box->setEnabled(true);
+  lib_showaudio_box->setEnabled(true);
+  lib_codes_box->setEnabled(true);
+  lib_showmacro_box->setEnabled(true);
+  lib_selected_label->setText(QString().sprintf("Filtered  %d Carts",lib_cart_list->childCount()));
 }
 
 
@@ -1298,3 +1345,4 @@
   w->show();
   return a.exec();
 }
+
Index: rdlibrary/rdlibrary.h
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/rdlibrary/rdlibrary.h,v
retrieving revision 1.43
diff -u -r1.43 rdlibrary.h
--- rdlibrary/rdlibrary.h	3 Apr 2008 16:50:07 -0000	1.43
+++ rdlibrary/rdlibrary.h	18 Nov 2008 08:52:29 -0000
@@ -44,6 +44,7 @@
 #include <rdlibrary_conf.h>
 #include <rdlistviewitem.h>
 #include <rdconfig.h>
+#include <rdsimpleplayer.h>
 
 #include <disk_gauge.h>
 
@@ -130,6 +131,8 @@
   QPixmap *lib_rivendell_map;
   RDStation::FilterMode lib_filter_mode;
   QProgressDialog *lib_progress_dialog;
+  QLabel *lib_selected_label;
+  RDSimplePlayer *lib_player;
 };
 
 
Index: rdlogmanager/edit_clock.cpp
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/rdlogmanager/edit_clock.cpp,v
retrieving revision 1.22.2.1
diff -u -r1.22.2.1 edit_clock.cpp
--- rdlogmanager/edit_clock.cpp	24 Oct 2008 12:12:38 -0000	1.22.2.1
+++ rdlogmanager/edit_clock.cpp	18 Nov 2008 08:52:30 -0000
@@ -351,7 +351,8 @@
   QString clock_name = edit_clock->name();
   bool rules_modified = edit_clock->getRulesModified();
 
-  EditSchedRules *dialog=new EditSchedRules(clock_name,&edit_artistsep,sched_rules_list,&rules_modified,this,"dialog");
+  EditSchedRules *dialog=new EditSchedRules(clock_name,&edit_artistsep,
+        sched_rules_list,&rules_modified,this,"dialog");
   dialog->exec();
   
   if (edit_clock->getArtistSep()!=edit_artistsep)
@@ -454,8 +455,17 @@
   sql=RDCreateClockTableSql(clockname);
   q=new RDSqlQuery(sql);
   delete q;
-
-
+  sql=QString().sprintf("create table if not exists `%s_RULES` (\
+      CODE varchar(10) not null primary key,\
+      MAX_ROW int unsigned,\
+      MIN_WAIT int unsigned,\
+      NOT_AFTER varchar(10),\
+      OR_AFTER varchar(10),\
+      OR_AFTER_II varchar(10))",(const char *)clockname); 
+  q=new RDSqlQuery(sql);
+  delete q;
+  sched_rules_list->Save(clockname);
+  edit_clock->setRulesModified(false);
   Save();
   edit_new_clocks->push_back(clockname);
   CopyClockPerms(old_name,clockname);
Index: rdlogmanager/edit_event.cpp
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/rdlogmanager/edit_event.cpp,v
retrieving revision 1.44
diff -u -r1.44 edit_event.cpp
--- rdlogmanager/edit_event.cpp	4 Aug 2008 19:05:36 -0000	1.44
+++ rdlogmanager/edit_event.cpp	18 Nov 2008 08:52:30 -0000
@@ -501,6 +501,39 @@
   delete q2;
 
 
+// Transition Group
+
+  event_trans_group_label=
+    new QLabel(tr("Link"),this,"event_trans_group_label");
+  event_trans_group_label->setFont(bold_font);
+  event_trans_group_label->setGeometry(CENTER_LINE+420,425,100,20);
+
+  event_trans_group_box=new QComboBox(this,"event_trans_group_box");
+  event_trans_group_box->setGeometry(CENTER_LINE+510,425,100,20);
+  event_trans_group_box->insertItem("");
+  sql2="select NAME from GROUPS order by NAME";
+  q2=new RDSqlQuery(sql2);
+  while(q2->next()) {
+    event_trans_group_box->insertItem(q2->value(0).toString());
+  }
+  delete q2;
+ 
+
+// Title Separation SpinBox
+
+  event_duck_label=
+    new QLabel(tr("Duck Volume (dB)"),this,"event_duck_label");
+  event_duck_label->setFont(bold_font);
+  event_duck_label->setGeometry(CENTER_LINE+420,446,100,20);
+  
+
+  event_duck_spinbox = new QSpinBox( this, "event_duck_spinbox" );
+  event_duck_spinbox->setGeometry(CENTER_LINE+510,446,50,20);
+  event_duck_spinbox->setMinValue( -30 );
+  event_duck_spinbox->setMaxValue( 0 );
+
+
+
   //
   // Start Slop Time
   //
@@ -553,7 +586,8 @@
   event_firsttrans_unit=new QLabel("transition.",this,"first_cart_label");
   event_firsttrans_unit->setFont(bold_font);
   event_firsttrans_unit->setGeometry(CENTER_LINE+215,428,
-		     sizeHint().width()-CENTER_LINE-450,22);
+//		     sizeHint().width()-CENTER_LINE-450,22);
+		     100,22);
   event_firsttrans_unit->setAlignment(AlignVCenter|AlignLeft);
   
   //
@@ -573,7 +607,8 @@
 				     this,"default_cart_unit");
   event_defaulttrans_unit->setFont(bold_font);
   event_defaulttrans_unit->setGeometry(CENTER_LINE+255,451,
-		     sizeHint().width()-CENTER_LINE-420,22);
+//		     sizeHint().width()-CENTER_LINE-420,22);
+		     100,22);
   event_defaulttrans_unit->setAlignment(AlignVCenter|AlignLeft);
   
   //
@@ -759,6 +794,9 @@
   }
   event_title_sep_spinbox->setValue(event_event->titleSep());
   event_have_code_box->setCurrentText(event_event->HaveCode());
+  event_duck_spinbox->setValue(event_event->duckVolume());
+  event_trans_group_box->setCurrentText(event_event->transGroup());
+
   QColor color=event_event->color();
   if(color.isValid()) {
     event_color_button->setPalette(QPalette(color,backgroundColor()));
@@ -863,6 +901,12 @@
       event_firsttrans_unit->setDisabled(state);
     }
   }
+  if((RDEventLine::ImportSource)event_source_group->selectedId()==
+     RDEventLine::Scheduler) {
+      event_firsttrans_box->setDisabled(true);
+      event_firsttrans_label->setDisabled(true);
+      event_firsttrans_unit->setDisabled(true);
+  }  
   if(state) {
     event_preimport_list->setForceTrans(RDLogLine::Stop);
   }
@@ -932,12 +976,19 @@
     event_position_label->setEnabled(true);
     event_position_unit->setEnabled(true);
     if(((RDEventLine::ImportSource)event_source_group->selectedId()!=
-       RDEventLine::None)&&(!event_position_box->isChecked())&&
+       RDEventLine::None) && (RDEventLine::ImportSource)event_source_group->selectedId()!=
+       RDEventLine::Scheduler &&(!event_position_box->isChecked())&&
        (event_preimport_list->childCount()==0)) {
       event_firsttrans_box->setEnabled(true);
       event_firsttrans_label->setEnabled(true);
       event_firsttrans_unit->setEnabled(true);
     }
+    if((RDEventLine::ImportSource)event_source_group->selectedId()==
+       RDEventLine::Scheduler) {
+        event_firsttrans_box->setDisabled(true);
+        event_firsttrans_label->setDisabled(true);
+        event_firsttrans_unit->setDisabled(true);
+    }  
   }
   SetPostTransition();
 }
@@ -1016,14 +1067,14 @@
   event_startslop_edit->setEnabled(statesched);
   event_startslop_label->setEnabled(statesched);
   event_startslop_unit->setEnabled(statesched);
-  event_endslop_edit->setEnabled(statesched);
-  event_endslop_label->setEnabled(statesched);
-  event_endslop_unit->setEnabled(statesched);
+  event_endslop_edit->setEnabled(state);
+  event_endslop_label->setEnabled(state);
+  event_endslop_unit->setEnabled(state);
   if((!event_timetype_box->isChecked())&&(!event_position_box->isChecked())) {
     if((state&&(event_preimport_list->childCount()==0))||(!state)) {
-      event_firsttrans_box->setEnabled(state);
-      event_firsttrans_label->setEnabled(state);
-      event_firsttrans_unit->setEnabled(state);
+      event_firsttrans_box->setEnabled(statesched);
+      event_firsttrans_label->setEnabled(statesched);
+      event_firsttrans_unit->setEnabled(statesched);
     }
   }
   event_defaulttrans_box->setEnabled(state);
@@ -1039,6 +1090,10 @@
   event_title_sep_spinbox->setEnabled(stateschedinv);
   event_have_code_box->setEnabled(stateschedinv);
   event_have_code_label->setEnabled(stateschedinv);
+  event_trans_group_label->setEnabled(stateschedinv);
+  event_trans_group_box->setEnabled(stateschedinv);
+  event_duck_label->setEnabled(stateschedinv);
+  event_duck_spinbox->setEnabled(stateschedinv);
 }
 
 
@@ -1055,6 +1110,12 @@
     event_firsttrans_label->setDisabled(true);
     event_firsttrans_unit->setDisabled(true);
   }
+  if((RDEventLine::ImportSource)event_source_group->selectedId()==
+     RDEventLine::Scheduler) {
+      event_firsttrans_box->setDisabled(true);
+      event_firsttrans_label->setDisabled(true);
+      event_firsttrans_unit->setDisabled(true);
+  }  
   SetPostTransition();
 }
 
@@ -1246,7 +1307,7 @@
   p->lineTo(CENTER_LINE,sizeHint().height()-10);
   p->drawRect(CENTER_LINE+160,82,sizeHint().width()-CENTER_LINE-200,45);
   p->moveTo(CENTER_LINE+408,383);
-  p->lineTo(CENTER_LINE+408,450);
+  p->lineTo(CENTER_LINE+408,475);
   p->end();
 }
 
@@ -1466,6 +1527,8 @@
   event_event->setSchedGroup(event_sched_group_box->currentText());  
   event_event->setTitleSep(event_title_sep_spinbox->value());
   event_event->setHaveCode(event_have_code_box->currentText()); 
+  event_event->setDuckVolume(event_duck_spinbox->value());
+  event_event->setTransGroup(event_trans_group_box->currentText()); 
   listname=event_name;
   listname.replace(" ","_");
   event_preimport_list->logEvent()->
@@ -1509,7 +1572,13 @@
 	trans_type=RDLogLine::Stop;
       }
       else {
-	trans_type=(RDLogLine::TransType)event_firsttrans_box->currentItem();
+         if((RDEventLine::ImportSource)event_source_group->selectedId()==
+             RDEventLine::Scheduler) {
+ 	   trans_type=(RDLogLine::TransType)event_defaulttrans_box->currentItem();
+         }
+	 else {
+ 	   trans_type=(RDLogLine::TransType)event_firsttrans_box->currentItem();
+         }
       }
     }
   }
Index: rdlogmanager/edit_event.h
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/rdlogmanager/edit_event.h,v
retrieving revision 1.20
diff -u -r1.20 edit_event.h
--- rdlogmanager/edit_event.h	14 Sep 2007 14:06:58 -0000	1.20
+++ rdlogmanager/edit_event.h	18 Nov 2008 08:52:30 -0000
@@ -102,8 +102,12 @@
   QButtonGroup *event_lib_type_group;
   QComboBox *event_group_box;
   QComboBox *event_sched_group_box;
+  QComboBox *event_trans_group_box;
+  QLabel *event_trans_group_label;
   QSpinBox* event_title_sep_spinbox;
   QLabel *event_title_sep_label;
+  QSpinBox* event_duck_spinbox;
+  QLabel *event_duck_label;
   QComboBox* event_have_code_box;
   QLabel *event_have_code_label;
   LibListView *event_lib_list;
Index: rdlogmanager/list_clocks.cpp
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/rdlogmanager/list_clocks.cpp,v
retrieving revision 1.25
diff -u -r1.25 list_clocks.cpp
--- rdlogmanager/list_clocks.cpp	1 Apr 2008 20:51:41 -0000	1.25
+++ rdlogmanager/list_clocks.cpp	18 Nov 2008 08:52:30 -0000
@@ -257,6 +257,9 @@
   sql=RDCreateClockTableSql(clockname);
   q=new RDSqlQuery(sql);
   delete q;
+  sql=RDCreateRulesTableSql(clockname);
+  q=new RDSqlQuery(sql);
+  delete q;
   EditClock *clock_dialog=new EditClock(clockname,true,&new_clocks,
 					this,"clock_dialog");
   if(clock_dialog->exec()<0) {
Index: utils/rddbcheck/rddbcheck.cpp
===================================================================
RCS file: /home/cvs/cvsroot/rivendell/utils/rddbcheck/rddbcheck.cpp,v
retrieving revision 1.11
diff -u -r1.11 rddbcheck.cpp
--- utils/rddbcheck/rddbcheck.cpp	24 Jun 2008 22:17:48 -0000	1.11
+++ utils/rddbcheck/rddbcheck.cpp	18 Nov 2008 08:52:30 -0000
@@ -212,6 +212,9 @@
 	sql=RDCreateClockTableSql(clockname);
 	q2=new QSqlQuery(sql);
 	delete q2;
+	sql=RDCreateRulesTableSql(clockname);
+	q2=new QSqlQuery(sql);
+	delete q2;
       }
     }
     delete q1;

