changeset 261:5fd398406cf7 trunk

[svn] Still need to pry internal OSS from clenched fingers. In need of anti-warning love too, but it compiles.
author chainsaw
date Tue, 06 Dec 2005 16:09:32 -0800
parents 4b1c9d1a469b
children 5410de731c3c
files Plugins/Output/crossfade/Makefile.am Plugins/Output/crossfade/configure.c Plugins/Output/crossfade/configure.h Plugins/Output/crossfade/crossfade.c Plugins/Output/crossfade/crossfade.h Plugins/Output/crossfade/interface-2.0.c Plugins/Output/crossfade/interface-2.0.h Plugins/Output/crossfade/monitor.c Plugins/Output/crossfade/support-2.0.c Plugins/Output/crossfade/support-2.0.h
diffstat 10 files changed, 5328 insertions(+), 40 deletions(-) [+]
line wrap: on
line diff
--- a/Plugins/Output/crossfade/Makefile.am	Tue Dec 06 14:02:16 2005 -0800
+++ b/Plugins/Output/crossfade/Makefile.am	Tue Dec 06 16:09:32 2005 -0800
@@ -1,4 +1,6 @@
+if ENABLE_CROSSFADE
 lib_LTLIBRARIES = libcrossfade.la
+endif
 
 gtk_sources = \
 	interface-2.0.c \
@@ -7,22 +9,15 @@
 	support-2.0.h \
 	callbacks.c \
 	callbacks.h
-interface-2.0.c:
-	glade-2 -w interface-2.0.glade
 
-if HAVE_LIBFFTW_COND
-fftw_sources = fft.c fft.h
-fftw_libs = -lfftw -lrfftw
-endif
-
-if HAVE_LIBSAMPLERATE_COND
+if HAVE_LIBSAMPLERATE
 samplerate_libs = -lsamplerate
 endif
 
 libdir = $(plugindir)/$(OUTPUT_PLUGIN_DIR)
 
 libcrossfade = @PLUGIN_LDFLAGS@
-libcrossfade_la_LIBADD  = $(fftw_libs) $(samplerate_libs)
+libcrossfade_la_LIBADD  = $(samplerate_libs)
 libcrossfade_la_SOURCES = \
 	crossfade.c \
 	crossfade.h \
@@ -44,6 +39,6 @@
 	timing.h \
 	volume.c \
 	volume.h \
-	$(gtk_sources) \
-	$(fftw_sources)
+	$(gtk_sources)
 
+INCLUDES = $(GTK_CFLAGS) -I$(top_builddir)/intl -I$(top_srcdir)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/Output/crossfade/configure.c	Tue Dec 06 16:09:32 2005 -0800
@@ -0,0 +1,2180 @@
+
+/* 
+ *  XMMS Crossfade Plugin
+ *  Copyright (C) 2000-2004  Peter Eisenlohr <peter@eisenlohr.org>
+ *
+ *  based on the original OSS Output Plugin
+ *  Copyright (C) 1998-2000  Peter Alm, Mikael Alm, Olle Hallnas, Thomas Nilsson and 4Front Technologies
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *  
+ *  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.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#undef PRESET_SUPPORT
+
+#include "crossfade.h"
+#include "configure.h"
+#include "interface.h"
+#include "monitor.h"
+#include "support.h"
+#ifdef HAVE_OSS
+#  include "oss.h"
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <sys/stat.h>
+
+#ifdef HAVE_OSS
+#  ifdef HAVE_SYS_SOUNDCARD_H
+#    include <sys/soundcard.h>
+#  elif defined(HAVE_MACHINE_SOUNDCARD_H)
+#    include <machine/soundcard.h>
+#  endif
+#endif
+
+#ifdef HAVE_LIBSAMPLERATE
+#  include <samplerate.h>
+#endif
+
+
+#define HIDE(name)					\
+{ if((set_wgt = lookup_widget(config_win, name)))	\
+    gtk_widget_hide(set_wgt); }
+
+#define SHOW(name)					\
+{ if((set_wgt = lookup_widget(config_win, name)))	\
+    gtk_widget_show(set_wgt); }
+
+
+#define SETW_SENSITIVE(wgt, sensitive)		\
+  gtk_widget_set_sensitive(wgt, sensitive)
+
+#define SETW_TOGGLE(wgt, active)				\
+  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(wgt), active)
+
+#define SETW_SPIN(wgt, value)					\
+  gtk_spin_button_set_value(GTK_SPIN_BUTTON(wgt), value)
+
+
+#define SET_SENSITIVE(name, sensitive)			\
+{ if((set_wgt = lookup_widget(config_win, name)))	\
+    gtk_widget_set_sensitive(set_wgt, sensitive); }
+
+#define SET_TOGGLE(name, active)					\
+{ if((set_wgt = lookup_widget(config_win, name)))			\
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(set_wgt), active); }
+
+#define SET_SPIN(name, value)						\
+{ if((set_wgt = lookup_widget(config_win, name)))			\
+    gtk_spin_button_set_value(GTK_SPIN_BUTTON(set_wgt), value); }
+
+#define SET_PAGE(name, index)					\
+{ if((set_wgt = lookup_widget(config_win, name)))		\
+    gtk_notebook_set_page(GTK_NOTEBOOK(set_wgt), index); }
+
+#define SET_HISTORY(name, index)					\
+{ if((set_wgt = lookup_widget(config_win, name)))			\
+    gtk_option_menu_set_history(GTK_OPTION_MENU(set_wgt), index); }
+
+
+#define GET_SENSITIVE(name)			\
+((get_wgt = lookup_widget(config_win, name))	\
+  && GTK_WIDGET_SENSITIVE(get_wgt))		\
+
+#define GET_TOGGLE(name)					\
+((get_wgt = lookup_widget(config_win, name))			\
+  && gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(get_wgt)))
+
+#define GET_SPIN(name)							\
+((get_wgt = lookup_widget(config_win, name))				\
+  ? gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(get_wgt)) : 0)
+
+
+static GtkWidget *config_win = NULL;
+static GtkWidget *about_win = NULL;
+static GtkWidget *set_wgt;
+static GtkWidget *get_wgt;
+
+/* init with DEFAULT_CFG to make sure all string pointers are set to NULL */
+static config_t _cfg = CONFIG_DEFAULT;
+static config_t *cfg = &_cfg; 
+
+/* some helpers to keep track of the GUI's state */
+static gboolean checking = FALSE;
+static gint            op_index;
+static plugin_config_t op_config;
+static gint            ep_index;
+
+
+static void update_plugin_config(gchar **config_string, gchar *name,
+				 plugin_config_t *pc, gboolean save);
+
+/*****************************************************************************/
+
+void g_free_f(gpointer data, gpointer user_data)
+{
+  g_free(data);
+}
+
+/*****************************************************************************/
+
+#ifdef PRESET_SUPPORT
+static void
+scan_presets(gchar *filename)
+{
+  struct stat stats;
+  FILE       *fh;
+  gchar      *data, **lines, *tmp, *name;
+  int         i;
+
+  if(lstat(filename, &stats)) {
+    DEBUG(("[crossfade] scan_presets: \"%s\":\n", filename));
+    PERROR("[crossfade] scan_presets: lstat");
+    return;
+  }
+  if(stats.st_size <= 0) return;
+
+  if(!(data = g_malloc(stats.st_size + 1))) {
+    DEBUG(("[crossfade] scan_presets: g_malloc(%ld) failed!\n", stats.st_size));
+    return;
+  }
+
+  if(!(fh = fopen(filename, "r"))) {
+    PERROR("[crossfade] scan_presets: fopen");
+    g_free(data);
+    return;
+  }
+
+  if(fread(data, stats.st_size, 1, fh) != 1) {
+    DEBUG(("[crossfade] scan_presets: fread() failed!\n")); 
+    g_free(data);
+    fclose(fh);
+    return;
+  }
+  fclose(fh);
+  data[stats.st_size] = 0;
+
+  lines = g_strsplit(data, "\n", 0);
+  g_free(data);
+
+  if(!lines) {
+    DEBUG(("[crossfade] scan_presets: g_strsplit() failed!\n"));
+    return;
+  }
+
+  g_list_foreach(config->presets, g_free_f, NULL);
+  g_list_free(config->presets);
+  config->presets = NULL;
+
+  for(i=0; lines[i]; i++) {
+    if(lines[i][0] == '[') {
+      if((tmp = strchr(lines[i], ']'))) {
+	*tmp = 0;
+	if((name = g_strdup(lines[i]+1)))
+	  config->presets = g_list_append(config->presets, name);
+      }
+    }
+  }
+
+  g_strfreev(lines);
+}
+#endif
+
+static void
+read_fade_config(ConfigFile *cfgfile, gchar *section, gchar *key, fade_config_t *fc)
+{
+  gchar *s = NULL;
+  gint n;
+  
+  if(!cfgfile || !section || !key || !fc) return;
+
+  xmms_cfg_read_string(cfgfile, section, key, &s);
+  if(!s) return;
+
+  n = sscanf(s,
+	     "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",
+	     &fc->type,
+	     &fc->pause_len_ms,
+	     &fc->simple_len_ms,
+	     &fc->out_enable,
+	     &fc->out_len_ms,
+	     &fc->out_volume,
+	     &fc->ofs_type,
+	     &fc->ofs_type_wanted,
+	     &fc->ofs_custom_ms,
+	     &fc->in_locked,
+	     &fc->in_enable,
+	     &fc->in_len_ms,
+	     &fc->in_volume,
+	     &fc->flush_pause_enable,
+	     &fc->flush_pause_len_ms,
+	     &fc->flush_in_enable,
+	     &fc->flush_in_len_ms,
+	     &fc->flush_in_volume);
+
+  g_free(s);
+}
+
+static void
+write_fade_config(ConfigFile *cfgfile, gchar *section, gchar *key, fade_config_t *fc)
+{
+  gchar *s;
+  
+  if(!cfgfile || !section || !key || !fc) return;
+
+  s = g_strdup_printf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d",
+		      fc->type,
+		      fc->pause_len_ms,
+		      fc->simple_len_ms,
+		      fc->out_enable,
+		      fc->out_len_ms,
+		      fc->out_volume,
+		      fc->ofs_type,
+		      fc->ofs_type_wanted,
+		      fc->ofs_custom_ms,
+		      fc->in_locked,
+		      fc->in_enable,
+		      fc->in_len_ms,
+		      fc->in_volume,
+		      fc->flush_pause_enable,
+		      fc->flush_pause_len_ms,
+		      fc->flush_in_enable,
+		      fc->flush_in_len_ms,
+		      fc->flush_in_volume);
+
+  if(!s) return;
+
+  xmms_cfg_write_string(cfgfile, section, key, s);
+  g_free(s);
+}
+
+void
+xfade_load_config()
+{
+#ifdef PRESET_SUPPORT
+  gchar      *filename;
+#endif
+  gchar      *section = "Crossfade";
+  ConfigFile *cfgfile;
+
+  if((cfgfile = xmms_cfg_open_default_file())) {
+    /* config items used in v0.1 */
+    xmms_cfg_read_int    (cfgfile, section, "output_method",        &config->output_method);
+    xmms_cfg_read_int    (cfgfile, section, "audio_device",         &config->oss_audio_device);
+    xmms_cfg_read_boolean(cfgfile, section, "use_alt_audio_device", &config->oss_use_alt_audio_device);
+    xmms_cfg_read_string (cfgfile, section, "alt_audio_device",     &config->oss_alt_audio_device);
+    xmms_cfg_read_int    (cfgfile, section, "mixer_device",         &config->oss_mixer_device);
+    xmms_cfg_read_string (cfgfile, section, "output_plugin",        &config->op_name);
+    xmms_cfg_read_string (cfgfile, section, "op_config_string",     &config->op_config_string);
+    xmms_cfg_read_int    (cfgfile, section, "buffer_size",          &config->mix_size_ms);
+    xmms_cfg_read_int    (cfgfile, section, "sync_size",            &config->sync_size_ms);
+    xmms_cfg_read_int    (cfgfile, section, "preload_size",         &config->preload_size_ms);
+    xmms_cfg_read_int    (cfgfile, section, "songchange_timeout",   &config->songchange_timeout);
+    xmms_cfg_read_boolean(cfgfile, section, "enable_mixer",         &config->enable_mixer);
+    xmms_cfg_read_boolean(cfgfile, section, "mixer_reverse",        &config->mixer_reverse);
+    xmms_cfg_read_boolean(cfgfile, section, "enable_debug",         &config->enable_debug);
+    xmms_cfg_read_boolean(cfgfile, section, "enable_monitor",       &config->enable_monitor);
+
+    /* config items introduced by v0.2 */
+    xmms_cfg_read_int    (cfgfile, section, "oss_buffer_size",      &config->oss_buffer_size_ms);
+    xmms_cfg_read_int    (cfgfile, section, "oss_preload_size",     &config->oss_preload_size_ms);
+    xmms_cfg_read_boolean(cfgfile, section, "oss_mixer_use_master", &config->oss_mixer_use_master);
+    xmms_cfg_read_boolean(cfgfile, section, "gap_lead_enable",      &config->gap_lead_enable);
+    xmms_cfg_read_int    (cfgfile, section, "gap_lead_len_ms",      &config->gap_lead_len_ms);
+    xmms_cfg_read_int    (cfgfile, section, "gap_lead_level",       &config->gap_lead_level);
+    xmms_cfg_read_boolean(cfgfile, section, "gap_trail_enable",     &config->gap_trail_enable);
+    xmms_cfg_read_int    (cfgfile, section, "gap_trail_len_ms",     &config->gap_trail_len_ms);
+    xmms_cfg_read_int    (cfgfile, section, "gap_trail_level",      &config->gap_trail_level);
+    xmms_cfg_read_int    (cfgfile, section, "gap_trail_locked",     &config->gap_trail_locked);
+    
+    /* config items introduced by v0.2.1 */
+    xmms_cfg_read_boolean(cfgfile, section, "buffer_size_auto",     &config->mix_size_auto);
+    
+    /* config items introduced by v0.2.3 */
+    xmms_cfg_read_boolean(cfgfile, section, "album_detection",      &config->album_detection);
+      
+    /* config items introduced by v0.2.4 */
+    xmms_cfg_read_boolean(cfgfile, section, "http_workaround",      &config->enable_http_workaround);
+    xmms_cfg_read_boolean(cfgfile, section, "enable_op_max_used",   &config->enable_op_max_used);
+    xmms_cfg_read_int    (cfgfile, section, "op_max_used_ms",       &config->op_max_used_ms);
+    
+    /* config items introduced by v0.2.6 */
+    xmms_cfg_read_string (cfgfile, section, "effect_plugin",        &config->ep_name);
+    xmms_cfg_read_boolean(cfgfile, section, "effect_enable",        &config->ep_enable);
+    xmms_cfg_read_int    (cfgfile, section, "output_rate",          &config->output_rate);
+    
+    /* config items introduced by v0.2.7 */
+    xmms_cfg_read_boolean(cfgfile, section, "oss_maxbuf_enable",    &config->oss_maxbuf_enable);
+
+    /* config items introduced by v0.3.0 */
+    xmms_cfg_read_boolean(cfgfile, section, "use_alt_mixer_device", &config->oss_use_alt_mixer_device);
+    xmms_cfg_read_int    (cfgfile, section, "oss_fragments",        &config->oss_fragments);
+    xmms_cfg_read_int    (cfgfile, section, "oss_fragment_size",    &config->oss_fragment_size);
+    xmms_cfg_read_boolean(cfgfile, section, "volnorm_enable",       &config->volnorm_enable);
+    xmms_cfg_read_boolean(cfgfile, section, "volnorm_use_qa",       &config->volnorm_use_qa);
+    xmms_cfg_read_int    (cfgfile, section, "volnorm_target",       &config->volnorm_target);
+    xmms_cfg_read_boolean(cfgfile, section, "output_keep_opened",   &config->output_keep_opened);
+    xmms_cfg_read_boolean(cfgfile, section, "mixer_software",       &config->mixer_software);
+    xmms_cfg_read_int    (cfgfile, section, "mixer_vol_left",       &config->mixer_vol_left);
+    xmms_cfg_read_int    (cfgfile, section, "mixer_vol_right",      &config->mixer_vol_right);
+    
+    /* config items introduced by v0.3.2 */
+    xmms_cfg_read_boolean(cfgfile, section, "no_xfade_if_same_file",&config->no_xfade_if_same_file);
+
+    /* config items introduced by v0.3.3 */
+    xmms_cfg_read_string (cfgfile, section, "alt_mixer_device",     &config->oss_alt_mixer_device);
+    xmms_cfg_read_boolean(cfgfile, section, "gap_crossing",         &config->gap_crossing);
+
+    /* config items introduced by v0.3.6 */
+    xmms_cfg_read_int    (cfgfile, section, "output_quality",       &config->output_quality);
+
+    /* fade configs */
+    read_fade_config(cfgfile, section, "fc_xfade",   &config->fc[FADE_CONFIG_XFADE]);
+    read_fade_config(cfgfile, section, "fc_manual",  &config->fc[FADE_CONFIG_MANUAL]);
+    read_fade_config(cfgfile, section, "fc_album",   &config->fc[FADE_CONFIG_ALBUM]);
+    read_fade_config(cfgfile, section, "fc_start",   &config->fc[FADE_CONFIG_START]);
+    read_fade_config(cfgfile, section, "fc_stop",    &config->fc[FADE_CONFIG_STOP]);
+    read_fade_config(cfgfile, section, "fc_eop",     &config->fc[FADE_CONFIG_EOP]);
+    read_fade_config(cfgfile, section, "fc_seek",    &config->fc[FADE_CONFIG_SEEK]);
+    read_fade_config(cfgfile, section, "fc_pause",   &config->fc[FADE_CONFIG_PAUSE]);
+    
+    xmms_cfg_free(cfgfile);
+    DEBUG(("[crossfade] load_config: configuration loaded\n"));
+  }
+  else
+    DEBUG(("[crossfade] load_config: error loading config, using defaults\n"));
+
+#ifdef PRESET_SUPPORT
+  filename = g_strconcat(g_get_home_dir(), "/.xmms/xmms-crossfade-presets", NULL);
+  scan_presets(filename);
+  g_free(filename);
+#endif
+}
+
+void
+xfade_save_config()
+{
+  gchar      *section = "Crossfade";
+  ConfigFile *cfgfile;
+
+  if((cfgfile = xmms_cfg_open_default_file())) {
+    /* obsolete config items */
+    xmms_cfg_remove_key(cfgfile, section, "underrun_pct");
+    xmms_cfg_remove_key(cfgfile, section, "enable_crossfade");
+    xmms_cfg_remove_key(cfgfile, section, "enable_gapkiller");
+    xmms_cfg_remove_key(cfgfile, section, "mixer_use_master");
+    xmms_cfg_remove_key(cfgfile, section, "late_effect");
+    xmms_cfg_remove_key(cfgfile, section, "gap_lead_length");
+      
+    /* config items used in v0.1 */
+    xmms_cfg_write_int    (cfgfile, section, "output_method",        config->output_method);
+    xmms_cfg_write_int    (cfgfile, section, "audio_device",         config->oss_audio_device);
+    xmms_cfg_write_boolean(cfgfile, section, "use_alt_audio_device", config->oss_use_alt_audio_device);
+    xmms_cfg_write_string (cfgfile, section, "alt_audio_device",     config->oss_alt_audio_device ? config->oss_alt_audio_device : DEFAULT_OSS_ALT_AUDIO_DEVICE);
+    xmms_cfg_write_int    (cfgfile, section, "mixer_device",         config->oss_mixer_device);
+    xmms_cfg_write_string (cfgfile, section, "output_plugin",        config->op_name ? config->op_name : DEFAULT_OP_NAME);
+    xmms_cfg_write_string (cfgfile, section, "op_config_string",     config->op_config_string ? config->op_config_string : DEFAULT_OP_CONFIG_STRING);
+    xmms_cfg_write_int    (cfgfile, section, "buffer_size",          config->mix_size_ms);
+    xmms_cfg_write_int    (cfgfile, section, "sync_size",            config->sync_size_ms);
+    xmms_cfg_write_int    (cfgfile, section, "preload_size",         config->preload_size_ms);
+    xmms_cfg_write_int    (cfgfile, section, "songchange_timeout",   config->songchange_timeout);
+    xmms_cfg_write_boolean(cfgfile, section, "enable_mixer",         config->enable_mixer);
+    xmms_cfg_write_boolean(cfgfile, section, "mixer_reverse",        config->mixer_reverse);
+    xmms_cfg_write_boolean(cfgfile, section, "enable_debug",         config->enable_debug);
+    xmms_cfg_write_boolean(cfgfile, section, "enable_monitor",       config->enable_monitor);
+    
+    /* config items introduced by v0.2 */
+    xmms_cfg_write_int    (cfgfile, section, "oss_buffer_size",      config->oss_buffer_size_ms);
+    xmms_cfg_write_int    (cfgfile, section, "oss_preload_size",     config->oss_preload_size_ms);
+    xmms_cfg_write_boolean(cfgfile, section, "oss_mixer_use_master", config->oss_mixer_use_master);
+    xmms_cfg_write_boolean(cfgfile, section, "gap_lead_enable",      config->gap_lead_enable);
+    xmms_cfg_write_int    (cfgfile, section, "gap_lead_len_ms",      config->gap_lead_len_ms);
+    xmms_cfg_write_int    (cfgfile, section, "gap_lead_level",       config->gap_lead_level);
+    xmms_cfg_write_boolean(cfgfile, section, "gap_trail_enable",     config->gap_trail_enable);
+    xmms_cfg_write_int    (cfgfile, section, "gap_trail_len_ms",     config->gap_trail_len_ms);
+    xmms_cfg_write_int    (cfgfile, section, "gap_trail_level",      config->gap_trail_level);
+    xmms_cfg_write_int    (cfgfile, section, "gap_trail_locked",     config->gap_trail_locked);
+    
+    /* config items introduced by v0.2.1 */
+    xmms_cfg_write_boolean(cfgfile, section, "buffer_size_auto",     config->mix_size_auto);
+    
+    /* config items introduced by v0.2.3 */
+    xmms_cfg_write_boolean(cfgfile, section, "album_detection",      config->album_detection);
+    
+    /* config items introduced by v0.2.4 */
+    xmms_cfg_write_boolean(cfgfile, section, "http_workaround",      config->enable_http_workaround);
+    xmms_cfg_write_boolean(cfgfile, section, "enable_op_max_used",   config->enable_op_max_used);
+    xmms_cfg_write_int    (cfgfile, section, "op_max_used_ms",       config->op_max_used_ms);
+    
+    /* config items introduced by v0.2.6 */
+    xmms_cfg_write_string (cfgfile, section, "effect_plugin",        config->ep_name ? config->ep_name : DEFAULT_EP_NAME);
+    xmms_cfg_write_boolean(cfgfile, section, "effect_enable",        config->ep_enable);
+    xmms_cfg_write_int    (cfgfile, section, "output_rate",          config->output_rate);
+   
+    /* config items introduced by v0.2.7 */
+    xmms_cfg_write_boolean(cfgfile, section, "oss_maxbuf_enable",    config->oss_maxbuf_enable);
+    
+    /* config items introduced by v0.3.0 */
+    xmms_cfg_write_boolean(cfgfile, section, "use_alt_mixer_device", config->oss_use_alt_mixer_device);
+    xmms_cfg_write_int    (cfgfile, section, "oss_fragments",        config->oss_fragments);
+    xmms_cfg_write_int    (cfgfile, section, "oss_fragment_size",    config->oss_fragment_size);
+#ifdef VOLUME_NORMALIZER
+    xmms_cfg_write_boolean(cfgfile, section, "volnorm_enable",       config->volnorm_enable);
+    xmms_cfg_write_boolean(cfgfile, section, "volnorm_use_qa",       config->volnorm_use_qa);
+    xmms_cfg_write_int    (cfgfile, section, "volnorm_target",       config->volnorm_target);
+#endif
+    xmms_cfg_write_boolean(cfgfile, section, "output_keep_opened",   config->output_keep_opened);
+    xmms_cfg_write_boolean(cfgfile, section, "mixer_software",       config->mixer_software);
+    xmms_cfg_write_int    (cfgfile, section, "mixer_vol_left",       config->mixer_vol_left);
+    xmms_cfg_write_int    (cfgfile, section, "mixer_vol_right",      config->mixer_vol_right);
+
+    /* config items introduced by v0.3.2 */
+    xmms_cfg_write_boolean(cfgfile, section, "no_xfade_if_same_file",config->no_xfade_if_same_file);
+
+    /* config items introduced by v0.3.2 */
+    xmms_cfg_write_string (cfgfile, section, "alt_mixer_device",     config->oss_alt_mixer_device ? config->oss_alt_mixer_device : DEFAULT_OSS_ALT_MIXER_DEVICE);
+    xmms_cfg_write_boolean(cfgfile, section, "gap_crossing",         config->gap_crossing);
+
+    /* config items introduced by v0.3.6 */
+    xmms_cfg_write_int    (cfgfile, section, "output_quality",       config->output_quality);
+
+    /* fade configs */
+    write_fade_config(cfgfile, section, "fc_xfade",   &config->fc[FADE_CONFIG_XFADE]);
+    write_fade_config(cfgfile, section, "fc_manual",  &config->fc[FADE_CONFIG_MANUAL]);
+    write_fade_config(cfgfile, section, "fc_album",   &config->fc[FADE_CONFIG_ALBUM]);
+    write_fade_config(cfgfile, section, "fc_start",   &config->fc[FADE_CONFIG_START]);
+    write_fade_config(cfgfile, section, "fc_stop",    &config->fc[FADE_CONFIG_STOP]);
+    write_fade_config(cfgfile, section, "fc_eop",     &config->fc[FADE_CONFIG_EOP]);
+    write_fade_config(cfgfile, section, "fc_seek",    &config->fc[FADE_CONFIG_SEEK]);
+    write_fade_config(cfgfile, section, "fc_pause",   &config->fc[FADE_CONFIG_PAUSE]);
+    
+    xmms_cfg_write_default_file(cfgfile);
+    xmms_cfg_free              (cfgfile);
+    DEBUG(("[crossfade] save_config: configuration saved\n"));
+  }
+  else
+    DEBUG(("[crossfade] save_config: error saving configuration!\n"));
+}
+
+#define SAFE_FREE(x) if(x) { g_free(x); x = NULL; }
+void
+xfade_free_config()
+{
+  SAFE_FREE(cfg->oss_alt_audio_device);
+  SAFE_FREE(cfg->oss_alt_mixer_device);
+  SAFE_FREE(cfg->op_config_string);
+  SAFE_FREE(cfg->op_name);
+
+  g_list_foreach(config->presets, g_free_f, NULL);
+  g_list_free(config->presets);
+  config->presets = NULL;
+}
+
+void
+xfade_load_plugin_config(gchar *config_string,
+			 gchar *plugin_name,
+			 plugin_config_t *plugin_config)
+{
+  update_plugin_config(&config_string, plugin_name, plugin_config, FALSE);
+}
+
+void
+xfade_save_plugin_config(gchar **config_string,
+			 gchar *plugin_name,
+			 plugin_config_t *plugin_config)
+{
+  update_plugin_config(config_string, plugin_name, plugin_config, TRUE);
+}
+
+/*** helpers *****************************************************************/
+
+gint
+xfade_cfg_fadeout_len(fade_config_t *fc)
+{
+  if(!fc) return 0;
+  switch(fc->type) {
+  case FADE_TYPE_SIMPLE_XF:
+    return fc->simple_len_ms;
+  case FADE_TYPE_ADVANCED_XF:
+    return fc->out_enable ? fc->out_len_ms : 0;
+  case FADE_TYPE_FADEOUT:
+  case FADE_TYPE_PAUSE_ADV:
+    return fc->out_len_ms;
+  }
+  return 0;
+}
+
+gint
+xfade_cfg_fadeout_volume(fade_config_t *fc)
+{
+  gint volume;
+  if(!fc) return 0;
+  switch(fc->type) {
+  case FADE_TYPE_ADVANCED_XF:
+  case FADE_TYPE_FADEOUT:
+    volume = fc->out_volume;
+    if(volume <   0) volume =   0;
+    if(volume > 100) volume = 100;
+    return volume;
+  }
+  return 0;
+}
+
+gint
+xfade_cfg_offset(fade_config_t *fc)
+{
+  if(!fc) return 0;
+  switch(fc->type) {
+  case FADE_TYPE_FLUSH:
+    return fc->flush_pause_enable ? fc->flush_pause_len_ms : 0;
+  case FADE_TYPE_PAUSE:
+    return fc->pause_len_ms;
+  case FADE_TYPE_SIMPLE_XF:
+    return -fc->simple_len_ms;
+  case FADE_TYPE_ADVANCED_XF:
+    switch(fc->ofs_type) {
+    case FC_OFFSET_LOCK_OUT:
+      return -fc->out_len_ms;
+    case FC_OFFSET_LOCK_IN:
+      return -fc->in_len_ms;
+    case FC_OFFSET_CUSTOM:
+      return fc->ofs_custom_ms;
+    }
+    return 0;
+  case FADE_TYPE_FADEOUT:
+  case FADE_TYPE_PAUSE_ADV:
+    return fc->ofs_custom_ms;
+  }
+  return 0;
+}
+
+gint
+xfade_cfg_fadein_len(fade_config_t *fc)
+{
+  if(!fc) return 0;
+  switch(fc->type) {
+  case FADE_TYPE_FLUSH:
+    return fc->flush_in_enable ? fc->flush_in_len_ms : 0;
+  case FADE_TYPE_SIMPLE_XF:
+    return fc->simple_len_ms;
+  case FADE_TYPE_ADVANCED_XF:
+    return
+      fc->in_locked
+      ? (fc->out_enable ? fc->out_len_ms : 0)
+      : (fc->in_enable  ? fc->in_len_ms  : 0);
+  case FADE_TYPE_FADEIN:
+  case FADE_TYPE_PAUSE_ADV:
+    return fc->in_len_ms;
+  }
+  return 0;
+}
+
+gint
+xfade_cfg_fadein_volume(fade_config_t *fc)
+{
+  gint volume;
+  if(!fc) return 0;
+  switch(fc->type) {
+  case FADE_TYPE_FLUSH:
+    volume = fc->flush_in_volume;
+    break;
+  case FADE_TYPE_ADVANCED_XF:
+    volume = fc->in_locked ? fc->out_volume : fc->in_volume;
+    break;
+  case FADE_TYPE_FADEIN:
+    volume = fc->in_volume;
+    break;
+  default:
+    volume = 0;
+  }
+  if(volume <   0) volume =   0;
+  if(volume > 100) volume = 100;
+  return volume;
+}
+
+gboolean
+xfade_cfg_gap_trail_enable(config_t *cfg)
+{
+  return cfg->gap_trail_locked
+    ? cfg->gap_lead_enable
+    : cfg->gap_trail_enable;
+}
+
+gint
+xfade_cfg_gap_trail_len(config_t *cfg)
+{
+  if(!xfade_cfg_gap_trail_enable(cfg)) return 0;
+  return cfg->gap_trail_locked
+    ? cfg->gap_lead_len_ms
+    : cfg->gap_trail_len_ms;
+}
+
+gint
+xfade_cfg_gap_trail_level(config_t *cfg)
+{
+  return cfg->gap_trail_locked
+    ? cfg->gap_lead_level
+    : cfg->gap_trail_level;
+}
+
+gint
+xfade_mix_size_ms(config_t *cfg)
+{
+  if(cfg->mix_size_auto) {
+    gint i, min_size = 0;
+
+    for(i=0; i<MAX_FADE_CONFIGS; i++) {
+      gint size   = xfade_cfg_fadeout_len(&cfg->fc[i]);
+      gint offset = xfade_cfg_offset(&cfg->fc[i]);
+
+      if(cfg->fc[i].type == FADE_TYPE_PAUSE_ADV)
+	size += xfade_cfg_fadein_len(&cfg->fc[i]);
+
+      if(size < -offset)
+	size = -offset;
+
+      if(size > min_size)
+	min_size = size;
+    }
+    return min_size += xfade_cfg_gap_trail_len(cfg)
+      +                cfg->songchange_timeout;
+  }
+  else
+    return cfg->mix_size_ms;
+}
+
+/*** internal helpers ********************************************************/
+
+static void
+add_menu_item(GtkWidget *menu, gchar *title, GtkSignalFunc func, gint index, gint **imap)
+{
+  GtkWidget *item;
+  if(!menu || !title || !func) return;
+  item = gtk_menu_item_new_with_label(title);
+  gtk_signal_connect(GTK_OBJECT(item), "activate", GTK_SIGNAL_FUNC(func), (gpointer)index);
+  gtk_widget_show(item);
+  gtk_menu_append(GTK_MENU(menu), item);
+
+  if(imap) *((*imap)++) = index;
+}
+
+/*** output method ***********************************************************/
+
+/*-- callbacks --------------------------------------------------------------*/
+
+void on_output_oss_radio_toggled(GtkToggleButton *togglebutton, gpointer user_data)
+{
+  SET_PAGE("output_notebook", 0);
+  cfg->output_method = OUTPUT_METHOD_BUILTIN_OSS;
+}
+
+void on_output_plugin_radio_toggled(GtkToggleButton *togglebutton, gpointer user_data)
+{
+  SET_PAGE("output_notebook", 1);
+  cfg->output_method = OUTPUT_METHOD_PLUGIN;
+}
+
+void on_output_none_radio_toggled(GtkToggleButton *togglebutton, gpointer user_data)
+{
+  SET_PAGE("output_notebook", 2);
+  cfg->output_method = OUTPUT_METHOD_BUILTIN_NULL;
+}
+
+static void resampling_rate_cb(GtkWidget *widget, gint index)
+{
+  cfg->output_rate = index;
+}
+
+#ifdef HAVE_LIBSAMPLERATE
+static void resampling_quality_cb(GtkWidget *widget, gint index)
+{
+  cfg->output_quality = index;
+}
+#endif
+
+/*** oss output **************************************************************/
+
+static void
+scan_devices(gchar *type, GtkWidget *option_menu, GtkSignalFunc signal_f)
+{
+#ifdef HAVE_OSS
+  gchar buffer[256];
+  FILE *file;
+
+  GtkWidget *item;
+  gboolean   found = FALSE;
+  gint       type_len = strlen(type);
+#endif
+
+  GtkWidget *menu;
+  gint  index = 0;
+  gint  mixer = 0;
+
+  menu = gtk_menu_new();
+
+#ifdef HAVE_OSS
+  /* look for devices in /dev/sndstat or /proc/asound/sndstat (OSS style) */
+  if((file = fopen("/dev/sndstat", "r")) ||
+     (file = fopen("/proc/asound/sndstat", "r")) ||
+     (file = fopen("/proc/asound/oss/sndstat", "r"))) {
+    while(fgets(buffer, sizeof(buffer), file)) {
+      gint i = strlen(buffer)-1;
+      while((i >= 0) && isspace(buffer[i])) buffer[i--] = 0;
+      if(found) {
+	if(!buffer[0] || !isdigit(buffer[0])) break;
+	if(index == 0) {
+	  gchar *label, *p = strchr(buffer, ':');
+	  if(p) do p++; while(*p == ' ');
+	  else p = buffer;
+	  label = g_strdup_printf("Default (%s)", p);
+	  item = gtk_menu_item_new_with_label(label);
+	  g_free(label);
+	}
+	else item = gtk_menu_item_new_with_label(buffer);
+	
+	gtk_signal_connect(GTK_OBJECT(item), "activate", GTK_SIGNAL_FUNC(signal_f),
+			   (gpointer)index);
+	gtk_widget_show(item);
+	gtk_menu_append(GTK_MENU(menu), item);
+	index++;
+      }
+      else if(!strcmp(buffer, type))
+	found = TRUE;
+      else if(!strncmp(buffer, type, type_len))
+	DEBUG(("[crossfade] scan_devices: %s\n", buffer));
+    }
+    fclose(file);
+    
+    if(!found)
+      DEBUG(("[crossfade] scan_devices: section \"%s\" not found!\n", type));
+  }
+  else {
+    DEBUG(("[crossfade] scan_devices: no sndstat found!\n"));
+#ifdef SOUND_MIXER_INFO
+    /* from xmms-3dse7 by Frank Cornelis */
+    DEBUG(("[crossfade] scan_devices: using alternate method...\n"));
+    for(;;) {
+      gchar      dev_name[32];
+      int        fd;
+      mixer_info info;
+      gchar     *label;
+      
+      if(mixer != 0)
+	sprintf(dev_name, "/dev/mixer%d", mixer);
+      else
+	strcpy(dev_name, "/dev/mixer");
+      
+      if((fd = open(dev_name, O_RDONLY)) != -1) {
+	if(ioctl(fd, SOUND_MIXER_INFO, &info) != -1) {
+	  label = g_strdup_printf(index ? "%s" : "Default (%s)", info.name);
+	  add_menu_item(menu, label, signal_f, index, NULL);
+	  g_free(label);
+	  index++;
+	}
+	close(fd);
+      }
+      else break;
+      mixer++;
+    }
+#endif                                                                       
+  }
+#endif  /* HAVE_OSS */
+  
+  /* create default entry if no device(s) could be found */
+  if(index == 0) add_menu_item(menu, "Default", signal_f, 0, NULL);
+
+  /* attach menu */
+  gtk_option_menu_set_menu(GTK_OPTION_MENU(option_menu), menu);
+}
+
+/*-- oss output callbacks ---------------------------------------------------*/
+
+void check_oss_dependencies()
+{
+  if(checking) return;
+  checking = TRUE;
+
+  SET_SENSITIVE("oss_adevice_optionmenu", !cfg->oss_use_alt_audio_device);
+  SET_SENSITIVE("oss_adevice_alt_entry",   cfg->oss_use_alt_audio_device);
+
+  SET_SENSITIVE("oss_mdevice_optionmenu", !cfg->oss_use_alt_mixer_device);
+  SET_SENSITIVE("oss_mdevice_alt_entry",   cfg->oss_use_alt_mixer_device);
+
+  SET_SENSITIVE("osshwb_fragments_label", !cfg->oss_maxbuf_enable);
+  SET_SENSITIVE("osshwb_fragments_spin",  !cfg->oss_maxbuf_enable);
+  SET_SENSITIVE("osshwb_fragsize_label",  !cfg->oss_maxbuf_enable);
+  SET_SENSITIVE("osshwb_fragsize_spin",   !cfg->oss_maxbuf_enable);
+
+  checking = FALSE;
+}
+
+void config_adevice_cb(GtkWidget *widget, gint device)
+{
+  cfg->oss_audio_device = device;
+}
+
+void config_mdevice_cb(GtkWidget *widget, gint device)
+{
+  cfg->oss_mixer_device = device;
+}
+
+void on_config_adevice_alt_check_toggled(GtkToggleButton *togglebutton, gpointer user_data)
+{
+  if(checking) return;
+  cfg->oss_use_alt_audio_device = gtk_toggle_button_get_active(togglebutton);
+  check_oss_dependencies();
+}
+
+void on_config_mdevice_alt_check_toggled(GtkToggleButton *togglebutton, gpointer user_data)
+{
+  if(checking) return;
+  cfg->oss_use_alt_mixer_device = gtk_toggle_button_get_active(togglebutton);
+  check_oss_dependencies();
+}
+
+void on_osshwb_maxbuf_check_toggled(GtkToggleButton *togglebutton, gpointer user_data)
+{
+  if(checking) return;
+  cfg->oss_maxbuf_enable = gtk_toggle_button_get_active(togglebutton);
+  check_oss_dependencies();
+}
+
+/*** plugin output ***********************************************************/
+
+static gchar *
+strip(gchar *s)
+{
+  gchar *p;
+  if(!s) return NULL;
+  for(; *s == ' '; s++);
+  if(!*s) return s;
+  for(p = s+strlen(s)-1; *p == ' '; p--);
+  *++p = 0;
+  return s;
+}
+
+static void
+update_plugin_config(gchar **config_string, gchar *name,
+		     plugin_config_t *pc, gboolean save)
+{
+  plugin_config_t default_pc = DEFAULT_OP_CONFIG;
+
+  gchar *buffer = NULL;
+  gchar  out[1024];
+
+  gboolean plugin_found = FALSE;
+  gchar   *plugin, *next_plugin;
+  gchar   *args;
+
+  if(pc && !save) *pc = default_pc;
+  if(!config_string || !*config_string || !name || !pc) {
+    DEBUG(("[crossfade] update_plugin_config: missing arg!\n"));
+    return;
+  }
+
+  buffer = g_strdup(*config_string);
+  out[0] = 0;
+
+  for(plugin = buffer; plugin; plugin = next_plugin) {
+    if((next_plugin = strchr(plugin, ';'))) *next_plugin++ = 0;
+    if((args = strchr(plugin, '='))) *args++ = 0;
+    plugin = strip(plugin);
+    if(!*plugin || !args || !*args) continue;
+
+    if(save) {
+      if(0 == strcmp(plugin, name)) continue;
+      if(*out) strcat(out, "; ");
+      strcat(out, plugin);
+      strcat(out, "=");
+      strcat(out, args);
+      continue;
+    }
+    else if(strcmp(plugin, name)) continue;
+
+    args = strip(args);
+    sscanf(args, "%d,%d,%d,%d",
+	   &pc->throttle_enable,
+	   &pc->max_write_enable,
+	   &pc->max_write_len,
+	   &pc->force_reopen);
+    pc->max_write_len &= -4;
+    plugin_found = TRUE;
+  }
+
+  if(save) {
+    /* only save if settings differ from defaults */
+    if((  pc->throttle_enable  != default_pc.throttle_enable)
+       ||(pc->max_write_enable != default_pc.max_write_enable)
+       ||(pc->max_write_len    != default_pc.max_write_len)
+       ||(pc->force_reopen     != default_pc.force_reopen)) {
+      if(*out) strcat(out, "; ");
+      sprintf(out + strlen(out), "%s=%d,%d,%d,%d", name,
+	      pc->throttle_enable ? 1 : 0,
+	      pc->max_write_enable ? 1 : 0,
+	      pc->max_write_len,
+	      pc->force_reopen);
+    }
+    if(*config_string) g_free(*config_string);
+    *config_string = g_strdup(out);
+  }
+
+  g_free(buffer);
+}
+
+static void
+config_plugin_cb(GtkWidget *widget, gint index);
+
+static gint
+scan_plugins(GtkWidget *option_menu, gchar *selected)
+{
+  GtkWidget *menu = gtk_menu_new();
+  GList     *list = g_list_first(get_output_list());  /* XMMS */
+  gint      index = 0;
+  gint  sel_index = -1;
+  gint  def_index = -1;
+
+  /* sanity check */
+  if(selected == NULL) selected = "";
+
+  /* parse module list */
+  while(list) {
+    OutputPlugin *op = (OutputPlugin *)list->data;
+    GtkWidget  *item = gtk_menu_item_new_with_label(op->description);
+    
+    if(op == get_crossfade_oplugin_info())  /* disable selecting ourselves */
+      gtk_widget_set_sensitive(item, FALSE);
+    else {
+      if(def_index == -1) def_index = index;
+      if(selected && !strcmp(g_basename(op->filename), selected))
+	sel_index = index;
+    }
+
+    /* create menu item */
+    gtk_signal_connect(GTK_OBJECT(item), "activate",
+		       GTK_SIGNAL_FUNC(config_plugin_cb), (gpointer)index++);
+    gtk_widget_show(item);
+    gtk_menu_append(GTK_MENU(menu), item);
+
+    /* advance to next module */
+    list = g_list_next(list);
+  }
+    
+  /* attach menu */
+  gtk_option_menu_set_menu(GTK_OPTION_MENU(option_menu), menu);
+  
+  if(sel_index == -1) {
+    DEBUG(("[crossfade] scan_plugins: plugin not found (\"%s\")\n", selected));
+    return def_index;  /* use default (first entry) */
+  }
+  return sel_index;
+}
+
+/*-- plugin output callbacks ------------------------------------------------*/
+
+static void
+config_plugin_cb(GtkWidget *widget, gint index)
+{
+  OutputPlugin *op = g_list_nth_data(get_output_list(), index);  /* XMMS */
+
+  /* get plugin options from gui */
+  op_config.throttle_enable  = GET_TOGGLE("op_throttle_check");
+  op_config.max_write_enable = GET_TOGGLE("op_maxblock_check");
+  op_config.max_write_len    = GET_SPIN  ("op_maxblock_spin");
+  op_config.force_reopen     = GET_TOGGLE("op_forcereopen_check");
+
+  /* config -> string */
+  xfade_save_plugin_config(&cfg->op_config_string, cfg->op_name, &op_config);
+
+  /* select new plugin */
+  op_index = index;
+
+  /* get new plugin's name */
+  if(cfg->op_name) g_free(cfg->op_name);
+  cfg->op_name = (op && op->filename) 
+    ? g_strdup(g_basename(op->filename)) : NULL;
+
+  /* string -> config */
+  xfade_load_plugin_config(cfg->op_config_string, cfg->op_name, &op_config);
+
+  /* update gui */
+  SET_SENSITIVE("op_configure_button",  op && (op->configure != NULL)); 
+  SET_SENSITIVE("op_about_button",      op && (op->about != NULL));
+  SET_TOGGLE   ("op_throttle_check",    op_config.throttle_enable);
+  SET_TOGGLE   ("op_maxblock_check",    op_config.max_write_enable);
+  SET_SPIN     ("op_maxblock_spin",     op_config.max_write_len); 
+  SET_SENSITIVE("op_maxblock_spin",     op_config.max_write_enable);
+  SET_TOGGLE   ("op_forcereopen_check", op_config.force_reopen);
+}
+
+void on_output_plugin_configure_button_clicked (GtkButton *button, gpointer user_data)
+{
+  OutputPlugin *op = g_list_nth_data(get_output_list(), op_index);  /* XMMS */
+  if((op == NULL) || (op->configure == NULL)) return;
+  op->configure();
+}
+
+void on_output_plugin_about_button_clicked(GtkButton *button, gpointer user_data)
+{
+  OutputPlugin *op = g_list_nth_data(get_output_list(), op_index);  /* XMMS */
+  if((op == NULL) || (op->about == NULL)) return;
+  op->about();
+}
+
+void on_op_throttle_check_toggled(GtkToggleButton *togglebutton, gpointer user_data)
+{
+  op_config.throttle_enable = gtk_toggle_button_get_active(togglebutton);
+}
+
+void on_op_maxblock_check_toggled(GtkToggleButton *togglebutton, gpointer user_data)
+{
+  op_config.max_write_enable = gtk_toggle_button_get_active(togglebutton);
+  SET_SENSITIVE("op_maxblock_spin", op_config.max_write_enable);
+}
+
+void on_op_maxblock_spin_changed(GtkEditable *editable, gpointer user_data)
+{
+  op_config.max_write_len = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(editable));
+}
+
+void on_op_forcereopen_check_toggled(GtkToggleButton *togglebutton, gpointer user_data)
+{
+  op_config.max_write_enable = gtk_toggle_button_get_active(togglebutton);
+}
+
+/*** effects *****************************************************************/
+
+static void
+config_effect_plugin_cb(GtkWidget *widget, gint index);
+
+static gint
+scan_effect_plugins(GtkWidget *option_menu, gchar *selected)
+{
+  GtkWidget *menu = gtk_menu_new();
+  GList     *list = g_list_first(get_effect_list());  /* XMMS */
+  gint      index = 0;
+  gint  sel_index = -1;
+  gint  def_index = -1;
+
+  /* sanity check */
+  if(selected == NULL) selected = "";
+
+  /* parse module list */
+  while(list) {
+    EffectPlugin *ep = (EffectPlugin *)list->data;
+    GtkWidget  *item = gtk_menu_item_new_with_label(ep->description);
+    
+    if(def_index == -1) def_index = index;
+    if(selected && !strcmp(g_basename(ep->filename), selected))
+      sel_index = index;
+
+    /* create menu item */
+    gtk_signal_connect(GTK_OBJECT(item), "activate",
+		       GTK_SIGNAL_FUNC(config_effect_plugin_cb), (gpointer)index++);
+    gtk_widget_show(item);
+    gtk_menu_append(GTK_MENU(menu), item);
+
+    /* advance to next module */
+    list = g_list_next(list);
+  }
+    
+  /* attach menu */
+  gtk_option_menu_set_menu(GTK_OPTION_MENU(option_menu), menu);
+  
+  if(sel_index == -1) {
+    DEBUG(("[crossfade] scan_effect_plugins: plugin not found (\"%s\")\n", selected));
+    return def_index;  /* use default (first entry) */
+  }
+  return sel_index;
+}
+
+/*-- plugin output callbacks ------------------------------------------------*/
+
+static void
+config_effect_plugin_cb(GtkWidget *widget, gint index)
+{
+  EffectPlugin *ep = g_list_nth_data(get_effect_list(), index);  /* XMMS */
+
+  /* select new plugin */
+  ep_index = index;
+
+  /* get new plugin's name */
+  if(cfg->ep_name) g_free(cfg->ep_name);
+  cfg->ep_name = (ep && ep->filename) 
+    ? g_strdup(g_basename(ep->filename)) : NULL;
+
+  /* update gui */
+  SET_SENSITIVE("ep_configure_button", ep && (ep->configure != NULL)); 
+  SET_SENSITIVE("ep_about_button",     ep && (ep->about != NULL));
+
+  /* 0.3.5: apply effect config immediatelly */
+  if(config->ep_name) g_free(config->ep_name);
+  config->ep_name = g_strdup(cfg->ep_name);
+  xfade_realize_ep_config();
+}
+
+void on_ep_configure_button_clicked(GtkButton *button, gpointer user_data)
+{
+  EffectPlugin *ep = g_list_nth_data(get_effect_list(), ep_index);  /* XMMS */
+  if((ep == NULL) || (ep->configure == NULL)) return;
+  ep->configure();
+}
+
+void on_ep_about_button_clicked(GtkButton *button, gpointer user_data)
+{
+  EffectPlugin *ep = g_list_nth_data(get_effect_list(), ep_index);  /* XMMS */
+  if((ep == NULL) || (ep->about == NULL)) return;
+  ep->about();
+}
+
+void on_ep_enable_check_toggled(GtkToggleButton *togglebutton, gpointer user_data)
+{
+  /* 0.3.5: apply effect config immediatelly */
+  config->ep_enable = cfg->ep_enable = GET_TOGGLE("ep_enable_check");
+  xfade_realize_ep_config();
+}
+
+/*-- volume normalizer ------------------------------------------------------*/
+
+void check_effects_dependencies()
+{
+  if(checking) return;
+  checking = TRUE;
+
+  SET_SENSITIVE("volnorm_target_spin",      cfg->volnorm_enable);
+  SET_SENSITIVE("volnorm_target_label",     cfg->volnorm_enable);
+  SET_SENSITIVE("volnorm_quantaudio_check", cfg->volnorm_enable);
+  SET_SENSITIVE("volnorm_target_spin",      cfg->volnorm_enable);
+
+  checking = FALSE;
+}
+
+void on_volnorm_enable_check_toggled(GtkToggleButton *togglebutton, gpointer user_data)
+{
+  if(checking) return;
+  cfg->volnorm_enable = gtk_toggle_button_get_active(togglebutton);
+  check_effects_dependencies();
+}
+
+/*** crossfader **************************************************************/
+
+static void xf_config_cb(GtkWidget *widget, gint index);
+static void xf_type_cb  (GtkWidget *widget, gint index);
+
+/* crude hack to keep track of menu items */
+static gint xf_config_index_map[MAX_FADE_CONFIGS];
+static gint xf_type_index_map  [MAX_FADE_TYPES];
+
+static void
+create_crossfader_config_menu()
+{
+  GtkWidget *optionmenu, *menu;
+  gint i, *imap;
+
+  if((optionmenu = lookup_widget(config_win, "xf_config_optionmenu"))) {
+    for(i=0; i<MAX_FADE_CONFIGS; i++) xf_config_index_map[i] = -1;
+    imap = xf_config_index_map;
+    menu = gtk_menu_new();
+    add_menu_item(menu, "Start of playback",    xf_config_cb, FADE_CONFIG_START, &imap);
+    add_menu_item(menu, "Automatic songchange", xf_config_cb, FADE_CONFIG_XFADE, &imap);
+#if 0
+    /* this should be FADE_TYPE_NONE all the time, anyway,
+       so no need to make it configureable by the user */
+    add_menu_item(menu, "Automatic (gapless)",  xf_config_cb, FADE_CONFIG_ALBUM, &imap);
+#endif
+    add_menu_item(menu, "Manual songchange",    xf_config_cb, FADE_CONFIG_MANUAL, &imap);
+    add_menu_item(menu, "Manual stop",          xf_config_cb, FADE_CONFIG_STOP, &imap);
+    add_menu_item(menu, "End of playlist",      xf_config_cb, FADE_CONFIG_EOP, &imap);
+    add_menu_item(menu, "Seeking",              xf_config_cb, FADE_CONFIG_SEEK, &imap);
+    add_menu_item(menu, "Pause",                xf_config_cb, FADE_CONFIG_PAUSE, &imap);
+    gtk_option_menu_set_menu(GTK_OPTION_MENU(optionmenu), menu);
+  }
+
+}
+
+static void
+create_crossfader_type_menu()
+{
+  GtkWidget *optionmenu, *menu;
+  gint i, *imap;
+  guint32 mask;
+
+  if((optionmenu = lookup_widget(config_win, "xf_type_optionmenu"))) {
+    for(i=0; i<MAX_FADE_TYPES; i++) xf_type_index_map[i] = -1;
+    imap = xf_type_index_map;
+    menu = gtk_menu_new();
+    mask = cfg->fc[cfg->xf_index].type_mask;
+    if(mask & (1 << FADE_TYPE_REOPEN))      add_menu_item(menu, "Reopen output device", xf_type_cb, FADE_TYPE_REOPEN, &imap);
+    if(mask & (1 << FADE_TYPE_FLUSH))       add_menu_item(menu, "Flush output device",  xf_type_cb, FADE_TYPE_FLUSH, &imap);
+    if(mask & (1 << FADE_TYPE_NONE))        add_menu_item(menu, "None (gapless/off)",   xf_type_cb, FADE_TYPE_NONE, &imap);
+    if(mask & (1 << FADE_TYPE_PAUSE))       add_menu_item(menu, "Pause",                xf_type_cb, FADE_TYPE_PAUSE, &imap);
+    if(mask & (1 << FADE_TYPE_SIMPLE_XF))   add_menu_item(menu, "Simple crossfade",     xf_type_cb, FADE_TYPE_SIMPLE_XF, &imap);
+    if(mask & (1 << FADE_TYPE_ADVANCED_XF)) add_menu_item(menu, "Advanced crossfade",   xf_type_cb, FADE_TYPE_ADVANCED_XF, &imap);
+    if(mask & (1 << FADE_TYPE_FADEIN))      add_menu_item(menu, "Fadein",               xf_type_cb, FADE_TYPE_FADEIN, &imap);
+    if(mask & (1 << FADE_TYPE_FADEOUT))     add_menu_item(menu, "Fadeout",              xf_type_cb, FADE_TYPE_FADEOUT, &imap);
+    if(mask & (1 << FADE_TYPE_PAUSE_NONE))  add_menu_item(menu, "None",                 xf_type_cb, FADE_TYPE_PAUSE_NONE, &imap);
+    if(mask & (1 << FADE_TYPE_PAUSE_ADV))   add_menu_item(menu, "Fadeout/Fadein",       xf_type_cb, FADE_TYPE_PAUSE_ADV, &imap);
+    gtk_option_menu_set_menu(GTK_OPTION_MENU(optionmenu), menu);
+  }
+}
+
+#define NONE             0x00000000L
+#define XF_CONFIG        0x00000001L
+#define XF_TYPE          0x00000002L
+#define XF_MIX_SIZE      0x00000004L
+#define XF_FADEOUT       0x00000008L
+#define XF_OFFSET        0x00000010L
+#define XF_FADEIN        0x00000020L
+#define XF_PAGE          0x00000040L
+#define XF_FLUSH         0x00000080L 
+#define ANY              0xffffffffL
+
+static void
+check_crossfader_dependencies(guint32 mask)
+{
+  fade_config_t *fc = &cfg->fc[cfg->xf_index];
+  gint i;
+
+  /* HACK: avoid endless recursion */
+  if(checking) return;
+  checking = TRUE;
+
+  if(mask & XF_FLUSH) {
+    SET_TOGGLE   ("xftfp_enable_check",  fc->flush_pause_enable);
+    SET_SENSITIVE("xftfp_length_label",  fc->flush_pause_enable);
+    SET_SENSITIVE("xftfp_length_spin",   fc->flush_pause_enable);
+    SET_TOGGLE   ("xftffi_enable_check", fc->flush_in_enable);
+    SET_SENSITIVE("xftffi_length_label", fc->flush_in_enable);
+    SET_SENSITIVE("xftffi_length_spin",  fc->flush_in_enable);
+    SET_SENSITIVE("xftffi_volume_label", fc->flush_in_enable);
+    SET_SENSITIVE("xftffi_volume_spin",  fc->flush_in_enable);
+  }
+
+  if(mask & XF_MIX_SIZE) {
+    SET_TOGGLE   ("xf_autobuf_check", cfg->mix_size_auto);
+    SET_SENSITIVE("xf_buffer_spin",  !cfg->mix_size_auto);
+    SET_SPIN     ("xf_buffer_spin",  xfade_mix_size_ms(cfg));
+  }
+
+  if(mask & XF_CONFIG) {
+    for(i=0; i<MAX_FADE_CONFIGS && (xf_config_index_map[i] != cfg->xf_index); i++);
+    if(i == MAX_FADE_CONFIGS) i=0;
+    SET_HISTORY("xf_config_optionmenu", i);
+  }
+
+  if(mask & XF_TYPE) {
+    create_crossfader_type_menu();
+    for(i=0; i<MAX_FADE_TYPES && (xf_type_index_map[i] != fc->type); i++);
+    if(i == MAX_FADE_TYPES) {
+      fc->type = FADE_TYPE_NONE;
+      for(i=0; i<MAX_FADE_TYPES && (xf_type_index_map[i] != fc->type); i++);
+      if(i == MAX_FADE_CONFIGS) i=0;
+    }
+    SET_HISTORY("xf_type_optionmenu", i);
+  }
+  
+  if(mask & XF_PAGE) {
+    SET_PAGE("xf_type_notebook",   fc->type);
+    SET_SPIN("pause_length_spin",  fc->pause_len_ms);
+    SET_SPIN("simple_length_spin", fc->simple_len_ms);
+    if(fc->config == FADE_CONFIG_SEEK) {
+      HIDE("xftf_pause_frame");
+      HIDE("xftf_fadein_frame");
+    }
+    else {
+      SHOW("xftf_pause_frame");
+      SHOW("xftf_fadein_frame");
+    }
+  }
+  
+  if(mask & XF_FADEOUT) {
+    SET_TOGGLE   ("fadeout_enable_check", fc->out_enable);
+    SET_SENSITIVE("fadeout_length_label", fc->out_enable);
+    SET_SENSITIVE("fadeout_length_spin",  fc->out_enable);
+    SET_SPIN     ("fadeout_length_spin",  fc->out_len_ms);
+    SET_SENSITIVE("fadeout_volume_label", fc->out_enable);
+    SET_SENSITIVE("fadeout_volume_spin",  fc->out_enable);
+    SET_SPIN     ("fadeout_volume_spin",  fc->out_volume);
+    SET_SPIN     ("xftfo_length_spin",    fc->out_len_ms);
+    SET_SPIN     ("xftfo_volume_spin",    fc->out_volume);
+    SET_SPIN     ("xftfoi_fadeout_spin",  fc->out_len_ms);
+  }
+  
+  if(mask & XF_FADEIN) {
+    SET_TOGGLE   ("fadein_lock_check",    fc->in_locked);
+    SET_SENSITIVE("fadein_enable_check", !fc->in_locked);
+    SET_TOGGLE   ("fadein_enable_check",  fc->in_locked ? fc->out_enable : fc->in_enable);
+    SET_SENSITIVE("fadein_length_label", !fc->in_locked && fc->in_enable);
+    SET_SENSITIVE("fadein_length_spin",  !fc->in_locked && fc->in_enable);
+    SET_SPIN     ("fadein_length_spin",   fc->in_locked ? fc->out_len_ms : fc->in_len_ms);
+    SET_SENSITIVE("fadein_volume_label", !fc->in_locked && fc->in_enable);
+    SET_SENSITIVE("fadein_volume_spin",  !fc->in_locked && fc->in_enable);
+    SET_SPIN     ("fadein_volume_spin",   fc->in_locked ? fc->out_volume : fc->in_volume);
+    SET_SPIN     ("xftfi_length_spin",    fc->in_len_ms);
+    SET_SPIN     ("xftfi_volume_spin",    fc->in_volume);
+    SET_SPIN     ("xftfoi_fadein_spin",   fc->in_len_ms);
+  }
+  
+  if(mask & XF_OFFSET) {
+    if(fc->out_enable)
+      SET_SENSITIVE("xfofs_lockout_radiobutton", TRUE);
+    if(!fc->in_locked && fc->in_enable)
+      SET_SENSITIVE("xfofs_lockin_radiobutton",  TRUE);
+
+    switch(fc->ofs_type) {
+    case FC_OFFSET_LOCK_OUT:
+      if(!fc->out_enable) {
+	SET_TOGGLE("xfofs_none_radiobutton", TRUE);
+	fc->ofs_type = FC_OFFSET_NONE;
+      }
+      break;
+    case FC_OFFSET_LOCK_IN:
+      if(!(!fc->in_locked && fc->in_enable)) {
+	if((fc->in_locked && fc->out_enable)) {
+	  SET_TOGGLE("xfofs_lockout_radiobutton", TRUE);
+	  fc->ofs_type = FC_OFFSET_LOCK_OUT;
+	} else {
+	  SET_TOGGLE("xfofs_none_radiobutton", TRUE);
+	  fc->ofs_type = FC_OFFSET_NONE;
+	}
+      }
+      break;
+    }
+    
+    switch(fc->ofs_type_wanted) {
+    case FC_OFFSET_NONE:
+      SET_TOGGLE("xfofs_none_radiobutton", TRUE);
+      fc->ofs_type = FC_OFFSET_NONE;
+      break;
+    case FC_OFFSET_LOCK_OUT:
+      if(fc->out_enable) {
+	SET_TOGGLE("xfofs_lockout_radiobutton", TRUE);
+	fc->ofs_type = FC_OFFSET_LOCK_OUT;
+      }
+      break;
+    case FC_OFFSET_LOCK_IN:
+      if(!fc->in_locked && fc->in_enable) {
+	SET_TOGGLE("xfofs_lockin_radiobutton", TRUE);
+	fc->ofs_type = FC_OFFSET_LOCK_IN;
+      }
+      else if(fc->out_enable) {
+	SET_TOGGLE("xfofs_lockout_radiobutton", TRUE);
+	fc->ofs_type = FC_OFFSET_LOCK_OUT;
+      }
+      break;
+    case FC_OFFSET_CUSTOM:
+      SET_TOGGLE("xfofs_custom_radiobutton", TRUE);
+      fc->ofs_type = FC_OFFSET_CUSTOM;
+      break;
+    }
+    
+    if(!fc->out_enable)
+      SET_SENSITIVE("xfofs_lockout_radiobutton", FALSE);
+    if(!(!fc->in_locked && fc->in_enable))
+      SET_SENSITIVE("xfofs_lockin_radiobutton",  FALSE);
+  
+    SET_SENSITIVE("xfofs_custom_spin",   fc->ofs_type == FC_OFFSET_CUSTOM);
+    SET_SPIN     ("xfofs_custom_spin",   xfade_cfg_offset(fc));
+    SET_SPIN     ("xftfo_silence_spin",  xfade_cfg_offset(fc));
+    SET_SPIN     ("xftfoi_silence_spin", xfade_cfg_offset(fc));
+  }
+
+  checking = FALSE;
+}
+
+/*-- crossfader callbacks ---------------------------------------------------*/
+
+void on_xf_buffer_spin_changed(GtkEditable *editable, gpointer user_data)
+{
+  if(checking) return;
+  cfg->mix_size_ms = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(editable));
+  check_crossfader_dependencies(NONE);
+}
+
+void on_xf_autobuf_check_toggled(GtkToggleButton *togglebutton, gpointer user_data)
+{
+  cfg->mix_size_auto = gtk_toggle_button_get_active(togglebutton);
+  check_crossfader_dependencies(XF_MIX_SIZE);
+}
+
+/* - config/type  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
+
+void xf_config_cb(GtkWidget *widget, gint index)
+{
+  if(checking) return;
+  cfg->xf_index = index;
+  check_crossfader_dependencies(ANY & ~XF_CONFIG);
+}
+
+void xf_type_cb(GtkWidget *widget, gint index)
+{
+  if(checking) return;
+  cfg->fc[cfg->xf_index].type = index;
+  check_crossfader_dependencies(ANY & ~XF_CONFIG);
+}
+
+/* - flush  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
+
+void on_xftfp_enable_check_toggled(GtkToggleButton *togglebutton, gpointer user_data)
+{
+  if(checking) return;
+  cfg->fc[cfg->xf_index].flush_pause_enable
+    = gtk_toggle_button_get_active(togglebutton);
+  check_crossfader_dependencies(XF_FLUSH|XF_MIX_SIZE);
+}
+
+void on_xftfp_length_spin_changed(GtkEditable *editable, gpointer user_data)
+{
+  if(checking) return;
+  cfg->fc[cfg->xf_index].flush_pause_len_ms
+    = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(editable));
+  check_crossfader_dependencies(XF_FLUSH);
+}
+
+void on_xftffi_enable_check_toggled(GtkToggleButton *togglebutton, gpointer user_data)
+{
+  if(checking) return;
+  cfg->fc[cfg->xf_index].flush_in_enable
+    = gtk_toggle_button_get_active(togglebutton);
+  check_crossfader_dependencies(XF_FLUSH|XF_OFFSET|XF_FADEOUT|XF_FADEIN);
+}
+
+void on_xftffi_length_spin_changed(GtkEditable *editable, gpointer user_data)
+{
+  if(checking) return;
+  cfg->fc[cfg->xf_index].flush_in_len_ms
+    = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(editable));
+  check_crossfader_dependencies(XF_FLUSH);
+}
+
+void on_xftffi_volume_spin_changed(GtkEditable *editable, gpointer user_data)
+{
+  if(checking) return;
+  cfg->fc[cfg->xf_index].flush_in_volume
+    = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(editable));
+  check_crossfader_dependencies(XF_FLUSH);
+}
+
+/* - pause  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
+
+void on_pause_length_spin_changed(GtkEditable *editable, gpointer user_data)
+{
+  if(checking) return;
+  cfg->fc[cfg->xf_index].pause_len_ms
+    = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(editable));
+  check_crossfader_dependencies(XF_MIX_SIZE);
+}
+
+/* - simple - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
+
+void on_simple_length_spin_changed(GtkEditable *editable, gpointer user_data)
+{
+  if(checking) return;
+  cfg->fc[cfg->xf_index].simple_len_ms
+    = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(editable));
+  check_crossfader_dependencies(XF_MIX_SIZE);
+}
+
+/* - crossfade-fadeout  - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
+
+void on_fadeout_enable_check_toggled(GtkToggleButton *togglebutton, gpointer user_data)
+{
+  if(checking) return;
+  cfg->fc[cfg->xf_index].out_enable
+    = gtk_toggle_button_get_active(togglebutton);
+  check_crossfader_dependencies(XF_MIX_SIZE|XF_OFFSET|XF_FADEOUT|XF_FADEIN);
+}
+
+void on_fadeout_length_spin_changed(GtkEditable *editable, gpointer user_data)
+{
+  if(checking) return;
+  cfg->fc[cfg->xf_index].out_len_ms
+    = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(editable));
+  check_crossfader_dependencies(XF_MIX_SIZE|XF_OFFSET|XF_FADEIN);
+}
+
+void on_fadeout_volume_spin_changed(GtkEditable *editable, gpointer user_data)
+{
+  cfg->fc[cfg->xf_index].out_volume
+    = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(editable));
+  check_crossfader_dependencies(XF_OFFSET|XF_FADEIN);
+}
+
+/* - crossfade-offset - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
+
+void on_xfofs_none_radiobutton_toggled(GtkToggleButton *togglebutton, gpointer user_data)
+{
+  if(checking || !gtk_toggle_button_get_active(togglebutton)) return;
+  cfg->fc[cfg->xf_index].ofs_type = FC_OFFSET_NONE;
+  cfg->fc[cfg->xf_index].ofs_type_wanted = FC_OFFSET_NONE;
+  check_crossfader_dependencies(XF_MIX_SIZE|XF_OFFSET);
+}
+
+void on_xfofs_none_radiobutton_clicked(GtkButton *button, gpointer user_data)
+{
+  if(checking) return;
+  cfg->fc[cfg->xf_index].ofs_type_wanted = FC_OFFSET_NONE;
+}
+
+void on_xfofs_lockout_radiobutton_toggled(GtkToggleButton *togglebutton, gpointer user_data)
+{
+  if(checking || !gtk_toggle_button_get_active(togglebutton)) return;
+  cfg->fc[cfg->xf_index].ofs_type = FC_OFFSET_LOCK_OUT;
+  cfg->fc[cfg->xf_index].ofs_type_wanted = FC_OFFSET_LOCK_OUT;
+  check_crossfader_dependencies(XF_MIX_SIZE|XF_OFFSET);
+}
+
+void on_xfofs_lockout_radiobutton_clicked(GtkButton *button, gpointer user_data)
+{
+  if(checking) return;
+  cfg->fc[cfg->xf_index].ofs_type_wanted = FC_OFFSET_LOCK_OUT;
+}
+
+void on_xfofs_lockin_radiobutton_toggled(GtkToggleButton *togglebutton, gpointer user_data)
+{
+  if(checking || !gtk_toggle_button_get_active(togglebutton)) return;
+  cfg->fc[cfg->xf_index].ofs_type = FC_OFFSET_LOCK_IN;
+  cfg->fc[cfg->xf_index].ofs_type_wanted = FC_OFFSET_LOCK_IN;
+  check_crossfader_dependencies(XF_MIX_SIZE|XF_OFFSET);
+}
+
+void on_xfofs_lockin_radiobutton_clicked(GtkButton *button, gpointer user_data)
+{
+  if(checking) return;
+  cfg->fc[cfg->xf_index].ofs_type_wanted = FC_OFFSET_LOCK_IN;
+}
+
+void on_xfofs_custom_radiobutton_toggled(GtkToggleButton *togglebutton, gpointer user_data)
+{
+  if(checking || !gtk_toggle_button_get_active(togglebutton)) return;
+  cfg->fc[cfg->xf_index].ofs_type = FC_OFFSET_CUSTOM;
+  cfg->fc[cfg->xf_index].ofs_type_wanted = FC_OFFSET_CUSTOM;
+  check_crossfader_dependencies(XF_MIX_SIZE|XF_OFFSET);
+}
+
+void on_xfofs_custom_radiobutton_clicked(GtkButton *button, gpointer user_data)
+{
+  if(checking) return;
+  cfg->fc[cfg->xf_index].ofs_type_wanted = FC_OFFSET_CUSTOM;
+}
+
+void on_xfofs_custom_spin_changed(GtkEditable *editable, gpointer user_data)
+{
+  if(checking) return;
+  cfg->fc[cfg->xf_index].ofs_custom_ms = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(editable));
+  check_crossfader_dependencies(XF_MIX_SIZE);
+}
+
+/* - crossfade-fadein - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
+
+void on_fadein_lock_check_toggled(GtkToggleButton *togglebutton, gpointer user_data)
+{
+  if(checking) return;
+  cfg->fc[cfg->xf_index].in_locked = gtk_toggle_button_get_active(togglebutton);
+  check_crossfader_dependencies(XF_OFFSET|XF_FADEIN);
+}
+
+void on_fadein_enable_check_toggled(GtkToggleButton *togglebutton, gpointer user_data)
+{
+  if(checking) return;
+  cfg->fc[cfg->xf_index].in_enable = gtk_toggle_button_get_active(togglebutton);
+  check_crossfader_dependencies(XF_OFFSET|XF_FADEIN);
+}
+
+void on_fadein_length_spin_changed(GtkEditable *editable, gpointer user_data)
+{
+  if(checking) return;
+  cfg->fc[cfg->xf_index].in_len_ms = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(editable));
+  check_crossfader_dependencies(XF_MIX_SIZE|XF_OFFSET);
+}
+
+void on_fadein_volume_spin_changed(GtkEditable *editable, gpointer user_data)
+{
+  if(checking) return;
+  cfg->fc[cfg->xf_index].in_volume = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(editable));
+  check_crossfader_dependencies(NONE);
+}
+
+/*-- fadein -----------------------------------------------------------------*/
+
+/* signal set to on_fadein_length_spin_changed */
+/* signal set to on_fadein_volume_spin_changed */
+
+/*-- fadeout ----------------------------------------------------------------*/
+
+/* signal set to on_fadeout_length_spin_changed */
+/* signal set to on_fadeout_volume_spin_changed */
+
+/*-- fadeout/fadein ---------------------------------------------------------*/
+
+/* signal set to on_fadeout_length_spin_changed */
+/* signal set to on_xfofs_custom_spin_changed */
+/* signal set to on_fadeout_volume_spin_changed */
+
+/*** gap killer **************************************************************/
+
+void check_gapkiller_dependencies()
+{
+  if(checking) return;
+  checking = TRUE;
+
+  SET_SENSITIVE("lgap_length_spin",  cfg->gap_lead_enable);
+  SET_SENSITIVE("lgap_level_spin",   cfg->gap_lead_enable);
+  SET_SENSITIVE("tgap_enable_check", !cfg->gap_trail_locked);
+  SET_SENSITIVE("tgap_length_spin",  !cfg->gap_trail_locked && cfg->gap_trail_enable);
+  SET_SENSITIVE("tgap_level_spin",   !cfg->gap_trail_locked && cfg->gap_trail_enable);
+
+  if(cfg->gap_trail_locked) {
+    SET_TOGGLE("tgap_enable_check", cfg->gap_lead_enable);
+    SET_SPIN  ("tgap_length_spin",  cfg->gap_lead_len_ms);
+    SET_SPIN  ("tgap_level_spin",   cfg->gap_lead_level);
+  }
+  else {
+    SET_TOGGLE("tgap_enable_check", cfg->gap_trail_enable);
+    SET_SPIN  ("tgap_length_spin",  cfg->gap_trail_len_ms);
+    SET_SPIN  ("tgap_level_spin",   cfg->gap_trail_level);
+  }
+
+  if(cfg->mix_size_auto)
+    SET_SPIN("xf_buffer_spin", xfade_mix_size_ms(cfg));
+
+  checking = FALSE;
+}
+
+/*-- gapkiller callbacks ----------------------------------------------------*/
+
+void on_lgap_enable_check_toggled(GtkToggleButton *togglebutton, gpointer user_data)
+{
+  if(checking) return;
+  cfg->gap_lead_enable = gtk_toggle_button_get_active(togglebutton);
+  check_gapkiller_dependencies();
+}
+
+void on_lgap_length_spin_changed(GtkEditable *editable, gpointer user_data)
+{
+  if(checking) return;
+  cfg->gap_lead_len_ms = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(editable));
+  check_gapkiller_dependencies();
+}
+
+void on_lgap_level_spin_changed(GtkEditable *editable, gpointer user_data)
+{
+  if(checking) return;
+  cfg->gap_lead_level = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(editable));
+  check_gapkiller_dependencies();
+}
+
+void on_tgap_lock_check_toggled(GtkToggleButton *togglebutton, gpointer user_data)
+{
+  if(checking) return;
+  cfg->gap_trail_locked = gtk_toggle_button_get_active(togglebutton);
+  check_gapkiller_dependencies();
+}
+
+void on_tgap_enable_check_toggled(GtkToggleButton *togglebutton, gpointer user_data)
+{
+  if(checking) return;
+  cfg->gap_trail_enable = gtk_toggle_button_get_active(togglebutton);
+  check_gapkiller_dependencies();
+}
+
+void on_tgap_length_spin_changed(GtkEditable *editable, gpointer user_data)
+{
+  if(checking) return;
+  cfg->gap_trail_len_ms = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(editable));
+}
+
+void on_tgap_level_spin_changed(GtkEditable *editable, gpointer user_data)
+{
+  if(checking) return;
+  cfg->gap_trail_level = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(editable));
+}
+
+/*** misc ********************************************************************/
+
+void check_misc_dependencies()
+{
+  if(checking) return;
+  checking = TRUE;
+
+  if(cfg->mix_size_auto)
+    SET_SPIN("xf_buffer_spin", xfade_mix_size_ms(cfg));
+
+  SET_SENSITIVE("moth_opmaxused_spin", cfg->enable_op_max_used);
+
+  checking = FALSE;
+}
+
+/*-- misc callbacks ---------------------------------------------------------*/
+
+void on_config_mixopt_enable_check_toggled(GtkToggleButton *togglebutton, gpointer user_data)
+{
+  SET_SENSITIVE("mixopt_reverse_check",  gtk_toggle_button_get_active(togglebutton));
+  SET_SENSITIVE("mixopt_software_check", gtk_toggle_button_get_active(togglebutton));
+}
+
+void on_moth_songchange_spin_changed(GtkEditable *editable, gpointer user_data)
+{
+  if(checking) return;
+  cfg->songchange_timeout = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(editable));
+  check_misc_dependencies();
+}
+
+void on_moth_opmaxused_check_toggled(GtkToggleButton *togglebutton, gpointer user_data)
+{
+  if(checking) return;
+  cfg->enable_op_max_used = gtk_toggle_button_get_active(togglebutton);
+  check_misc_dependencies();
+}
+
+/*** presets *****************************************************************/
+
+void on_presets_list_click_column(GtkCList *clist, gint column, gpointer user_data)
+{
+  DEBUG(("*** column=%d\n", column));
+}
+
+/*** main config *************************************************************/
+
+void on_config_apply_clicked(GtkButton *button, gpointer user_data)
+{
+  GtkWidget *widget;
+
+  /* get current notebook page */
+  if((widget = lookup_widget(config_win, "config_notebook")))
+    cfg->page = gtk_notebook_get_current_page(GTK_NOTEBOOK(widget));
+
+  /* output method */
+
+  /* sample rate */
+
+  /* output method: builtin OSS */
+  if((widget = lookup_widget(config_win, "output_oss_notebook")))
+    cfg->oss_page = gtk_notebook_get_current_page(GTK_NOTEBOOK(widget));
+
+  if((widget = lookup_widget(config_win, "oss_adevice_alt_entry"))) {
+    if(cfg->oss_alt_audio_device) g_free(cfg->oss_alt_audio_device);
+    cfg->oss_alt_audio_device = gtk_editable_get_chars(GTK_EDITABLE(widget), 0, -1);
+    g_strstrip(cfg->oss_alt_audio_device);
+  }
+
+  if((widget = lookup_widget(config_win, "oss_mdevice_alt_entry"))) {
+    if(cfg->oss_alt_mixer_device) g_free(cfg->oss_alt_mixer_device);
+    cfg->oss_alt_mixer_device = gtk_editable_get_chars(GTK_EDITABLE(widget), 0, -1);
+    g_strstrip(cfg->oss_alt_mixer_device);
+  }
+
+  cfg->oss_buffer_size_ms  = GET_SPIN  ("ossbuf_buffer_spin");
+  cfg->oss_preload_size_ms = GET_SPIN  ("ossbuf_preload_spin");
+
+  cfg->oss_fragments       = GET_SPIN  ("osshwb_fragments_spin");
+  cfg->oss_fragment_size   = GET_SPIN  ("osshwb_fragsize_spin");
+  cfg->oss_maxbuf_enable   = GET_TOGGLE("osshwb_maxbuf_check");
+
+  cfg->oss_mixer_use_master = GET_TOGGLE("ossmixer_pcm_check");
+
+  /* output method: plugin */
+  op_config.throttle_enable  = GET_TOGGLE("op_throttle_check");
+  op_config.max_write_enable = GET_TOGGLE("op_maxblock_check");
+  op_config.max_write_len    = GET_SPIN  ("op_maxblock_spin");
+  op_config.force_reopen     = GET_TOGGLE("op_forcereopen_check");
+
+  xfade_save_plugin_config(&cfg->op_config_string, cfg->op_name, &op_config);
+
+  /* output method: none: */
+
+  /* effects: pre-mixing effect plugin */
+
+  /* effects: volume normalizer */
+  cfg->volnorm_target = GET_SPIN  ("volnorm_target_spin");
+  cfg->volnorm_use_qa = GET_TOGGLE("volnorm_quantaudio_check");
+
+  /* crossfader */
+  cfg->mix_size_auto = GET_TOGGLE("xf_autobuf_check");
+
+  /* gap killer */
+  cfg->gap_lead_enable  = GET_TOGGLE("lgap_enable_check");
+  cfg->gap_lead_len_ms  = GET_SPIN  ("lgap_length_spin");
+  cfg->gap_lead_level   = GET_SPIN  ("lgap_level_spin");
+
+  cfg->gap_trail_locked = GET_TOGGLE("tgap_lock_check");
+
+  cfg->gap_crossing     = GET_TOGGLE("gadv_crossing_check");
+
+  /* misc */
+  cfg->enable_debug           = GET_TOGGLE("debug_stderr_check");
+  cfg->enable_monitor         = GET_TOGGLE("debug_monitor_check");
+  cfg->enable_mixer           = GET_TOGGLE("mixopt_enable_check");
+  cfg->mixer_reverse          = GET_TOGGLE("mixopt_reverse_check"); 
+  cfg->mixer_software         = GET_TOGGLE("mixopt_software_check"); 
+  cfg->preload_size_ms        = GET_SPIN  ("moth_preload_spin");
+  cfg->album_detection        = GET_TOGGLE("noxf_album_check");
+  cfg->no_xfade_if_same_file  = GET_TOGGLE("noxf_samefile_check");
+  cfg->enable_http_workaround = GET_TOGGLE("moth_httpworkaround_check");
+  cfg->op_max_used_ms         = GET_SPIN  ("moth_opmaxused_spin");
+  cfg->output_keep_opened     = GET_TOGGLE("moth_outputkeepopened_check");
+
+  /* presets */
+
+  /* lock buffer */
+  g_static_mutex_lock(&buffer_mutex);
+
+  /* free existing strings */
+  if(config->oss_alt_audio_device) g_free(config->oss_alt_audio_device);
+  if(config->oss_alt_mixer_device) g_free(config->oss_alt_mixer_device);
+  if(config->op_config_string)     g_free(config->op_config_string);
+  if(config->op_name)              g_free(config->op_name);
+  if(config->ep_name)              g_free(config->ep_name);
+
+  /* copy current settings (dupping the strings) */
+  *config = *cfg;
+  config->oss_alt_audio_device = g_strdup(cfg->oss_alt_audio_device);
+  config->oss_alt_mixer_device = g_strdup(cfg->oss_alt_mixer_device);
+  config->op_config_string     = g_strdup(cfg->op_config_string);
+  config->op_name              = g_strdup(cfg->op_name);
+  config->ep_name              = g_strdup(cfg->ep_name);
+
+  /* tell the engine that the config has changed */
+  xfade_realize_config();
+  
+  /* unlock buffer */
+  g_static_mutex_unlock(&buffer_mutex);
+
+  /* save configuration */
+  xfade_save_config();
+  
+  /* show/hide monitor win depending on config->enable_monitor */
+  xfade_check_monitor_win(); 
+}
+
+void on_config_ok_clicked(GtkButton *button, gpointer user_data)
+{
+  /* apply and save config */
+  on_config_apply_clicked(button, user_data);
+
+  /* close and destroy window */
+  gtk_widget_destroy(config_win);
+}
+
+void xfade_configure()
+{
+  GtkWidget *widget;
+
+  if(!config_win) {
+    /* create */
+    if(!(config_win = create_config_win())) {
+      DEBUG(("[crossfade] plugin_configure: error creating window!\n"));
+      return;
+    }
+
+    /* update config_win when window is destroyed */
+    gtk_signal_connect(GTK_OBJECT(config_win), "destroy",
+		       GTK_SIGNAL_FUNC(gtk_widget_destroyed), &config_win);
+    
+    /* free any strings that might be left in our local copy of the config */
+    if(cfg->oss_alt_audio_device) g_free(cfg->oss_alt_audio_device);
+    if(cfg->oss_alt_mixer_device) g_free(cfg->oss_alt_mixer_device);
+    if(cfg->op_config_string)     g_free(cfg->op_config_string);
+    if(cfg->op_name)              g_free(cfg->op_name);
+    if(cfg->ep_name)              g_free(cfg->ep_name);
+
+    /* copy current settings (dupping the strings) */
+    *cfg = *config;
+    cfg->oss_alt_audio_device = g_strdup(config->oss_alt_audio_device);
+    cfg->oss_alt_mixer_device = g_strdup(config->oss_alt_mixer_device);
+    cfg->op_config_string     = g_strdup(config->op_config_string);
+    cfg->op_name              = g_strdup(config->op_name);
+    cfg->ep_name              = g_strdup(config->ep_name);
+
+    /* go to remembered notebook page */
+    if((widget = lookup_widget(config_win, "config_notebook")))
+      gtk_notebook_set_page(GTK_NOTEBOOK(widget), config->page);
+
+    /* output: method */
+#ifdef HAVE_OSS
+    SET_SENSITIVE("output_oss_radio", TRUE);
+#else
+    SET_SENSITIVE("output_oss_radio", FALSE);
+#endif
+
+    switch(cfg->output_method) {
+    case OUTPUT_METHOD_BUILTIN_OSS:
+      widget = lookup_widget(config_win, "output_oss_radio");
+      break;
+    case OUTPUT_METHOD_PLUGIN:
+      widget = lookup_widget(config_win, "output_plugin_radio");
+      break;
+    case OUTPUT_METHOD_BUILTIN_NULL:
+      widget = lookup_widget(config_win, "output_none_radio");
+      break;
+    default:
+      widget = NULL;
+    }
+    if(widget) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget), TRUE);
+
+    if((widget = lookup_widget(config_win, "output_notebook")))
+      gtk_notebook_set_page(GTK_NOTEBOOK(widget), cfg->output_method);
+
+    /* output: resampling rate */
+    if((widget = lookup_widget(config_win, "resampling_rate_optionmenu"))) {
+      GtkWidget *menu = gtk_menu_new();
+      GtkWidget *item;
+
+      item = gtk_menu_item_new_with_label("44100 Hz");
+      gtk_signal_connect(GTK_OBJECT(item), "activate", GTK_SIGNAL_FUNC(resampling_rate_cb), (gpointer)44100);
+      gtk_widget_show(item);
+      gtk_menu_append(GTK_MENU(menu), item);
+      
+      item = gtk_menu_item_new_with_label("48000 Hz");
+      gtk_signal_connect(GTK_OBJECT(item), "activate", GTK_SIGNAL_FUNC(resampling_rate_cb), (gpointer)48000);
+      gtk_widget_show(item);
+      gtk_menu_append(GTK_MENU(menu), item);
+
+      gtk_option_menu_set_menu(GTK_OPTION_MENU(widget), menu);
+
+      switch(cfg->output_rate) {
+      default:
+	DEBUG(("[crossfade] plugin_configure: WARNING: invalid output sample rate (%d)!\n", cfg->output_rate));
+	DEBUG(("[crossfade] plugin_configure:          ... using default of 44100\n"));
+	cfg->output_rate = 44100;
+      case 44100: gtk_option_menu_set_history(GTK_OPTION_MENU(widget), 0); break;
+      case 48000: gtk_option_menu_set_history(GTK_OPTION_MENU(widget), 1); break;
+      }
+    }
+
+    /* output: resampling quality (libsamplerate setting) */
+#ifdef HAVE_LIBSAMPLERATE
+    if((widget = lookup_widget(config_win, "resampling_quality_optionmenu"))) {
+      GtkWidget *menu = gtk_menu_new();
+      GtkWidget *item;
+
+      GtkTooltips *tooltips = (GtkTooltips *)gtk_object_get_data(GTK_OBJECT(config_win), "tooltips");
+
+      int converter_type;
+      const char *name, *description;
+      for(converter_type = 0; (name = src_get_name(converter_type));
+	  converter_type++) {
+	description = src_get_description(converter_type);
+
+	item = gtk_menu_item_new_with_label(name);
+	gtk_tooltips_set_tip(tooltips, item, description, NULL);
+
+	gtk_signal_connect(GTK_OBJECT(item), "activate",
+			   GTK_SIGNAL_FUNC(resampling_quality_cb), (gpointer)converter_type);
+	gtk_widget_show(item);
+	gtk_menu_append(GTK_MENU(menu), item);
+      }
+      
+      gtk_option_menu_set_menu   (GTK_OPTION_MENU(widget), menu);
+      gtk_option_menu_set_history(GTK_OPTION_MENU(widget), cfg->output_quality);
+    }
+#else
+    HIDE("resampling_quality_hbox");
+    HIDE("resampling_quality_optionmenu");
+#endif
+
+    /* output method: builtin OSS */
+    if((widget = lookup_widget(config_win, "output_oss_notebook")))
+      gtk_notebook_set_page(GTK_NOTEBOOK(widget), cfg->oss_page);
+
+    if((widget = lookup_widget(config_win, "oss_adevice_optionmenu"))) {
+      scan_devices("Audio devices:", widget, config_adevice_cb);
+      gtk_option_menu_set_history(GTK_OPTION_MENU(widget),
+				  cfg->oss_audio_device);
+      gtk_widget_set_sensitive(widget, !cfg->oss_use_alt_audio_device);
+    }
+    SET_TOGGLE("oss_adevice_alt_check", cfg->oss_use_alt_audio_device);
+    if((widget = lookup_widget(config_win, "oss_adevice_alt_entry"))) {
+      gtk_entry_set_text(GTK_ENTRY(widget), cfg->oss_alt_audio_device
+			 ? cfg->oss_alt_audio_device
+			 : DEFAULT_OSS_ALT_AUDIO_DEVICE);
+      gtk_widget_set_sensitive(widget, cfg->oss_use_alt_audio_device);
+    }
+    
+    if((widget = lookup_widget(config_win, "oss_mdevice_optionmenu"))) {
+      scan_devices("Mixers:", widget, config_mdevice_cb);
+      gtk_option_menu_set_history(GTK_OPTION_MENU(widget),
+				  cfg->oss_mixer_device);
+      gtk_widget_set_sensitive(widget, !cfg->oss_use_alt_mixer_device);
+    }
+    SET_TOGGLE("oss_mdevice_alt_check", cfg->oss_use_alt_mixer_device);
+    if((widget = lookup_widget(config_win, "oss_mdevice_alt_entry"))) {
+      gtk_entry_set_text(GTK_ENTRY(widget), cfg->oss_alt_mixer_device
+        		 ? cfg->oss_alt_mixer_device
+        		 : DEFAULT_OSS_ALT_MIXER_DEVICE); 
+      gtk_widget_set_sensitive(widget, cfg->oss_use_alt_mixer_device);
+    }
+
+    SET_SPIN  ("ossbuf_buffer_spin",  cfg->oss_buffer_size_ms);
+    SET_SPIN  ("ossbuf_preload_spin", cfg->oss_preload_size_ms);
+
+    SET_SPIN  ("osshwb_fragments_spin", cfg->oss_fragments);
+    SET_SPIN  ("osshwb_fragsize_spin",  cfg->oss_fragment_size);
+    SET_TOGGLE("osshwb_maxbuf_check",   cfg->oss_maxbuf_enable);
+
+    SET_TOGGLE("ossmixer_pcm_check", cfg->oss_mixer_use_master);
+
+    check_oss_dependencies();
+
+    /* output method: plugin */
+    xfade_load_plugin_config(cfg->op_config_string, cfg->op_name, &op_config);
+    SET_TOGGLE   ("op_throttle_check",    op_config.throttle_enable);
+    SET_TOGGLE   ("op_maxblock_check",    op_config.max_write_enable);
+    SET_SPIN     ("op_maxblock_spin",     op_config.max_write_len); 
+    SET_SENSITIVE("op_maxblock_spin",     op_config.max_write_enable);
+    SET_TOGGLE   ("op_forcereopen_check", op_config.force_reopen);
+
+    if((widget = lookup_widget(config_win, "op_plugin_optionmenu"))) {
+      OutputPlugin *op = NULL;
+      if((op_index = scan_plugins(widget, cfg->op_name)) >= 0) {
+	gtk_option_menu_set_history(GTK_OPTION_MENU(widget), op_index);
+	op = g_list_nth_data(get_output_list(), op_index);  /* XMMS */
+      }
+      SET_SENSITIVE("op_configure_button", op && (op->configure != NULL));
+      SET_SENSITIVE("op_about_button",     op && (op->about     != NULL));
+    }
+
+    /* output method: none */
+
+    /* effects: pre-mixing effect plugin */
+    if((widget = lookup_widget(config_win, "ep_plugin_optionmenu"))) {
+      EffectPlugin *ep = NULL;
+      if((ep_index = scan_effect_plugins(widget, cfg->ep_name)) >= 0) {
+	gtk_option_menu_set_history(GTK_OPTION_MENU(widget), ep_index);
+	ep = g_list_nth_data(get_effect_list(), ep_index);  /* XMMS */
+      }
+      SET_SENSITIVE("ep_configure_button", ep && (ep->configure != NULL));
+      SET_SENSITIVE("ep_about_button",     ep && (ep->about     != NULL));
+      SET_TOGGLE   ("ep_enable_check",     cfg->ep_enable);
+    }
+
+    /* effects: volume normalizer */
+    SET_TOGGLE("volnorm_enable_check",     cfg->volnorm_enable);
+    SET_TOGGLE("volnorm_quantaudio_check", cfg->volnorm_use_qa);
+    SET_SPIN  ("volnorm_target_spin",      cfg->volnorm_target);
+
+    check_effects_dependencies();
+    
+    /* crossfader */
+    create_crossfader_config_menu();
+
+    if((cfg->xf_index < 0) || (cfg->xf_index >= MAX_FADE_CONFIGS)) {
+      DEBUG(("[crossfade] plugin_configure: crossfade index out of range (%d)!\n", cfg->xf_index));
+      cfg->xf_index = CLAMP(cfg->xf_index, 0, MAX_FADE_CONFIGS);
+    }
+
+    check_crossfader_dependencies(ANY);
+    
+    /* gap killer */
+    SET_TOGGLE   ("lgap_enable_check",   cfg->gap_lead_enable);
+    SET_SPIN     ("lgap_length_spin",    cfg->gap_lead_len_ms);
+    SET_SPIN     ("lgap_level_spin",     cfg->gap_lead_level);
+    SET_TOGGLE   ("tgap_lock_check",     cfg->gap_trail_locked);
+    SET_TOGGLE   ("tgap_enable_check",   cfg->gap_trail_enable);
+    SET_SPIN     ("tgap_length_spin",    cfg->gap_trail_len_ms);
+    SET_SPIN     ("tgap_level_spin",     cfg->gap_trail_level);
+    SET_TOGGLE   ("gadv_crossing_check", cfg->gap_crossing);
+
+    check_gapkiller_dependencies();
+
+    /* misc */
+    SET_TOGGLE("debug_stderr_check",          cfg->enable_debug);
+    SET_TOGGLE("debug_monitor_check",         cfg->enable_monitor);
+    SET_TOGGLE("mixopt_enable_check",         cfg->enable_mixer);
+    SET_TOGGLE("mixopt_reverse_check",        cfg->mixer_reverse);
+    SET_TOGGLE("mixopt_software_check",       cfg->mixer_software);
+    SET_SPIN  ("moth_songchange_spin",        cfg->songchange_timeout);
+    SET_SPIN  ("moth_preload_spin",           cfg->preload_size_ms);
+    SET_TOGGLE("noxf_album_check",            cfg->album_detection);
+    SET_TOGGLE("noxf_samefile_check",         cfg->album_detection);
+    SET_TOGGLE("moth_httpworkaround_check",   cfg->enable_http_workaround);
+    SET_TOGGLE("moth_opmaxused_check",        cfg->enable_op_max_used);
+    SET_SPIN  ("moth_opmaxused_spin",         cfg->op_max_used_ms);
+    SET_TOGGLE("moth_outputkeepopened_check", cfg->output_keep_opened);
+
+    check_misc_dependencies();
+
+    /* presets */
+    if((set_wgt = lookup_widget(config_win, "presets_list_list"))) {
+      GList *item;
+
+      for(item = config->presets; item; item = g_list_next(item)) {
+	gchar *name = (gchar *)item->data;
+	gchar *text[] = {name, "Default", "No"};
+	gtk_clist_append(GTK_CLIST(set_wgt), text);
+      }
+    }
+
+    /* show window near mouse pointer */
+    gtk_window_set_position(GTK_WINDOW(config_win), GTK_WIN_POS_MOUSE);
+    gtk_widget_show(config_win);
+  }
+  else
+    /* bring window to front */
+    gdk_window_raise(config_win->window);
+}
+
+void xfade_about()
+{
+  if(!about_win) {
+    gchar *about_text = 
+      "XMMS Crossfade Plugin "VERSION"\n"
+      "Copyright (C) 2000-2004  Peter Eisenlohr <peter@eisenlohr.org>\n"
+      "\n"
+      "based on the original OSS Output Plugin  Copyright (C) 1998-2000\n"
+      "Peter Alm, Mikael Alm, Olle Hallnas, Thomas Nilsson and 4Front Technologies\n"
+      "\n"
+      "This program is free software; you can redistribute it and/or modify\n"
+      "it under the terms of the GNU General Public License as published by\n"
+      "the Free Software Foundation; either version 2 of the License, or\n"
+      "(at your option) any later version.\n"
+      "\n"
+      "This program is distributed in the hope that it will be useful,\n"
+      "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+      "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n"
+      "GNU General Public License for more details.\n"
+      "\n"
+      "You should have received a copy of the GNU General Public License\n"
+      "along with this program; if not, write to the Free Software\n"
+      "Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,\n"
+      "USA.";
+
+    about_win = create_about_win();
+
+    /* update about_win when window is destroyed */
+    gtk_signal_connect(GTK_OBJECT(about_win), "destroy", GTK_SIGNAL_FUNC(gtk_widget_destroyed), &about_win);
+    
+    /* set about box text (this is done here and not in interface.c because
+       of the VERSION #define -- there is no way to do this with GLADE */
+    if((set_wgt = lookup_widget(about_win, "about_label")))
+      gtk_label_set_text(GTK_LABEL(set_wgt), about_text);
+    
+    /* show near mouse pointer */
+    gtk_window_set_position(GTK_WINDOW(about_win), GTK_WIN_POS_MOUSE);
+    gtk_widget_show(about_win);
+  }
+  else
+    gdk_window_raise(about_win->window);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/Output/crossfade/configure.h	Tue Dec 06 16:09:32 2005 -0800
@@ -0,0 +1,55 @@
+/* 
+ *  XMMS Crossfade Plugin
+ *  Copyright (C) 2000-2004  Peter Eisenlohr <peter@eisenlohr.org>
+ *
+ *  based on the original OSS Output Plugin
+ *  Copyright (C) 1998-2000  Peter Alm, Mikael Alm, Olle Hallnas, Thomas Nilsson and 4Front Technologies
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *  
+ *  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.
+ */
+
+#ifndef _CONFIGURE_H_
+#define _CONFIGURE_H_
+
+#include "crossfade.h"
+
+void xfade_load_config();
+void xfade_save_config();
+void xfade_free_config();
+
+void xfade_load_plugin_config(gchar *config_string, gchar *plugin_name,
+			      plugin_config_t *plugin_config);
+void xfade_save_plugin_config(gchar **config_string, gchar *plugin_name,
+			      plugin_config_t *plugin_confg);
+
+/* some helper functions */
+gint xfade_mix_size_ms(config_t *cfg);
+
+gint xfade_cfg_fadeout_len   (fade_config_t *fc);
+gint xfade_cfg_fadeout_volume(fade_config_t *fc);
+gint xfade_cfg_offset        (fade_config_t *fc);
+gint xfade_cfg_fadein_len    (fade_config_t *fc);
+gint xfade_cfg_fadein_volume (fade_config_t *fc);
+
+gboolean xfade_cfg_gap_trail_enable(config_t *cfg);
+gint     xfade_cfg_gap_trail_len   (config_t *cfg);
+gint     xfade_cfg_gap_trail_level (config_t *cfg);
+
+/* xmms callback prototypes */
+void xfade_about    ();
+void xfade_configure();
+
+#endif  /* _CONFIGURE_H_ */
--- a/Plugins/Output/crossfade/crossfade.c	Tue Dec 06 14:02:16 2005 -0800
+++ b/Plugins/Output/crossfade/crossfade.c	Tue Dec 06 16:09:32 2005 -0800
@@ -36,9 +36,6 @@
 #include "rate.h"
 #include "volume.h"
 #include "timing.h"
-#ifdef HAVE_LIBFFTW
-#  include "fft.h"
-#endif
 
 #include <stdio.h>
 #include <string.h>
@@ -106,11 +103,7 @@
 static gboolean  *xmms_is_quitting             = NULL;  /* XMMS */
 static gboolean (*input_stopped_for_restart)() = NULL;  /* XMMS */
 
-#ifdef HAVE_CTOR
 void fini() __attribute__((destructor));
-#else
-void _fini() { fini(); }
-#endif
 
 /* local variables */
 static gint      session_id;
@@ -200,9 +193,6 @@
 static convert_context_t  convert_context;
 static rate_context_t     rate_context;
 static volume_context_t   volume_context;
-#ifdef HAVE_LIBFFTW
-static fft_context_t      fft_context;
-#endif
 
 static config_t  the_config;
        config_t *config = &the_config;
@@ -456,9 +446,6 @@
   convert_init(&convert_context);
   rate_init(&rate_context);
   volume_init(&volume_context);
-#ifdef HAVE_LIBFFTW
-  fft_init(&fft_context);
-#endif
 
   /* reset */
   stopped = FALSE;
@@ -570,9 +557,6 @@
   g_static_mutex_unlock (&buffer_mutex);
 
   /* free contexts */
-#ifdef HAVE_LIBFFTW
-  fft_free(&fft_context);
-#endif
   volume_free(&volume_context);
   rate_free(&rate_context);
   convert_free(&convert_context);
@@ -1728,11 +1712,6 @@
 	   && (blen > the_op_config.max_write_len))
 	  blen = the_op_config.max_write_len;
 
-#ifdef HAVE_LIBFFTW
-	/* fft playground */
-	fft_flow(&fft_context, (gpointer)data, blen);
-#endif
-
 	/* finally, write data */
 	the_op->write_audio(data, blen);
 
--- a/Plugins/Output/crossfade/crossfade.h	Tue Dec 06 14:02:16 2005 -0800
+++ b/Plugins/Output/crossfade/crossfade.h	Tue Dec 06 16:09:32 2005 -0800
@@ -335,11 +335,7 @@
 
 /* xmms internal prototypes */ /* XMMS */
 gint     ctrlsocket_get_session_id();
-#ifndef HAVE_BEEP
-gboolean get_input_playing();
-#else
 gboolean bmp_playback_get_playing();
-#endif
 GList   *get_output_list();
 GList   *get_effect_list();
 gint     get_playlist_position();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/Output/crossfade/interface-2.0.c	Tue Dec 06 16:09:32 2005 -0800
@@ -0,0 +1,2891 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdio.h>
+
+#include <gdk/gdkkeysyms.h>
+#include <gtk/gtk.h>
+
+#include "callbacks.h"
+#include "interface-2.0.h"
+#include "support-2.0.h"
+
+#define GLADE_HOOKUP_OBJECT(component,widget,name) \
+  g_object_set_data_full (G_OBJECT (component), name, \
+    gtk_widget_ref (widget), (GDestroyNotify) gtk_widget_unref)
+
+#define GLADE_HOOKUP_OBJECT_NO_REF(component,widget,name) \
+  g_object_set_data (G_OBJECT (component), name, widget)
+
+GtkWidget*
+create_config_win (void)
+{
+  GtkWidget *config_win;
+  GtkWidget *config_vbox;
+  GtkWidget *config_notebook;
+  GtkWidget *config_output_page;
+  GtkWidget *output_options_hbox;
+  GtkWidget *output_method_frame;
+  GtkWidget *output_method_vbox;
+  GtkWidget *output_oss_radio;
+  GSList *output_oss_radio_group = NULL;
+  GtkWidget *output_plugin_radio;
+  GtkWidget *output_none_radio;
+  GtkWidget *label1;
+  GtkWidget *output_resampling_frame;
+  GtkWidget *output_resampling_table;
+  GtkWidget *resampling_rate_hbox;
+  GtkWidget *resampling_rate_label;
+  GtkWidget *resampling_quality_hbox;
+  GtkWidget *resampling_quality_label;
+  GtkWidget *resampling_rate_optionmenu;
+  GtkWidget *resampling_quality_optionmenu;
+  GtkWidget *output_resampling_label;
+  GtkWidget *output_notebook;
+  GtkWidget *output_oss_page;
+  GtkWidget *output_oss_notebook;
+  GtkWidget *oss_device_page;
+  GtkWidget *oss_adevice_frame;
+  GtkWidget *oss_adevice_vbox;
+  GtkWidget *oss_adevice_hbox;
+  GtkWidget *oss_adevice_optionmenu;
+  GtkWidget *convertwidget1;
+  GtkWidget *convertwidget2;
+  GtkWidget *oss_adevice_alt_hbox;
+  GtkWidget *oss_adevice_alt_check;
+  GtkWidget *oss_adevice_alt_entry;
+  GtkWidget *label3;
+  GtkWidget *oss_mdevice_frame;
+  GtkWidget *oss_mdevice_vbox;
+  GtkWidget *oss_mdevice_hbox;
+  GtkWidget *oss_mdevice_optionmenu;
+  GtkWidget *convertwidget3;
+  GtkWidget *convertwidget4;
+  GtkWidget *oss_mdevice_alt_hbox;
+  GtkWidget *oss_mdevice_alt_check;
+  GtkWidget *oss_mdevice_alt_entry;
+  GtkWidget *label4;
+  GtkWidget *oss_device_label;
+  GtkWidget *oss_buffer_page;
+  GtkWidget *oss_buffer_frame;
+  GtkWidget *oss_buffer_vbox;
+  GtkWidget *ossbuf_buffer_hbox;
+  GtkWidget *ossbuf_buffer_label;
+  GtkObject *ossbuf_buffer_spin_adj;
+  GtkWidget *ossbuf_buffer_spin;
+  GtkWidget *ossbuf_preload_hbox;
+  GtkWidget *ossbuf_preload_label;
+  GtkObject *ossbuf_preload_spin_adj;
+  GtkWidget *ossbuf_preload_spin;
+  GtkWidget *label5;
+  GtkWidget *oss_hwbuf_frame;
+  GtkWidget *oss_hwbuf_vbox;
+  GtkWidget *osshwb_maxbuf_check;
+  GtkWidget *osshwb_fragments_hbox;
+  GtkWidget *osshwb_fragments_label;
+  GtkObject *osshwb_fragments_spin_adj;
+  GtkWidget *osshwb_fragments_spin;
+  GtkWidget *osshwb_fragsize_hbox;
+  GtkWidget *osshwb_fragsize_label;
+  GtkObject *osshwb_fragsize_spin_adj;
+  GtkWidget *osshwb_fragsize_spin;
+  GtkWidget *label6;
+  GtkWidget *oss_buffer_label;
+  GtkWidget *oss_mixer_page;
+  GtkWidget *oss_mixer_frame;
+  GtkWidget *oss_mixer_vbox;
+  GtkWidget *ossmixer_pcm_check;
+  GtkWidget *label7;
+  GtkWidget *oss_mixer_label;
+  GtkWidget *label29;
+  GtkWidget *output_plugin_page;
+  GtkWidget *op_plugin_frame;
+  GtkWidget *op_plugin_vbox;
+  GtkWidget *op_plugin_optionmenu;
+  GtkWidget *convertwidget5;
+  GtkWidget *convertwidget6;
+  GtkWidget *op_plugin_buttonbox;
+  GtkWidget *op_configure_button;
+  GtkWidget *op_about_button;
+  GtkWidget *label8;
+  GtkWidget *op_options_frame;
+  GtkWidget *op_options_vbox;
+  GtkWidget *op_throttle_check;
+  GtkWidget *op_maxblock_hbox;
+  GtkWidget *op_maxblock_check;
+  GtkObject *op_maxblock_spin_adj;
+  GtkWidget *op_maxblock_spin;
+  GtkWidget *op_forcereopen_check;
+  GtkWidget *label9;
+  GtkWidget *label31;
+  GtkWidget *empty_notebook_page;
+  GtkWidget *label32;
+  GtkWidget *label33;
+  GtkWidget *label34;
+  GtkWidget *output_help_label;
+  GtkWidget *config_devices_label;
+  GtkWidget *config_effects_page;
+  GtkWidget *ep_plugin_frame;
+  GtkWidget *ep_plugin_vbox;
+  GtkWidget *ep_plugin_optionmenu;
+  GtkWidget *convertwidget7;
+  GtkWidget *convertwidget8;
+  GtkWidget *ep_plugin_buttonbox;
+  GtkWidget *ep_configure_button;
+  GtkWidget *ep_about_button;
+  GtkWidget *ep_enable_check;
+  GtkWidget *label10;
+  GtkWidget *effects_volnorm_frame;
+  GtkWidget *effects_volnorm_table;
+  GtkWidget *volnorm_quantaudio_check;
+  GtkObject *volnorm_target_spin_adj;
+  GtkWidget *volnorm_target_spin;
+  GtkWidget *volnorm_target_hbox;
+  GtkWidget *volnorm_target_label;
+  GtkWidget *volnorm_enable_check;
+  GtkWidget *volnorm_rva2_check;
+  GtkWidget *label11;
+  GtkWidget *effects_help_label;
+  GtkWidget *config_effects_label;
+  GtkWidget *config_crossfader_page;
+  GtkWidget *xf_bufsize_hbox;
+  GtkWidget *xf_bufsize_label;
+  GtkObject *xf_buffer_spin_adj;
+  GtkWidget *xf_buffer_spin;
+  GtkWidget *xf_autobuf_check;
+  GtkWidget *xf_config_hbox;
+  GtkWidget *xf_config_label;
+  GtkWidget *xf_config_optionmenu;
+  GtkWidget *convertwidget9;
+  GtkWidget *convertwidget10;
+  GtkWidget *xf_type_hbox;
+  GtkWidget *xf_type_label;
+  GtkWidget *xf_type_optionmenu;
+  GtkWidget *convertwidget11;
+  GtkWidget *convertwidget12;
+  GtkWidget *xf_type_notebook;
+  GtkWidget *xft_reopen_label;
+  GtkWidget *xft_flush_page;
+  GtkWidget *xftf_pause_frame;
+  GtkWidget *xftf_pause_table;
+  GtkWidget *xftfp_length_label;
+  GtkObject *xftfp_length_spin_adj;
+  GtkWidget *xftfp_length_spin;
+  GtkWidget *xftfp_enable_check;
+  GtkWidget *label12;
+  GtkWidget *xftf_fadein_frame;
+  GtkWidget *xftf_fadein_table;
+  GtkWidget *xftffi_length_hbox;
+  GtkWidget *xftffi_length_label;
+  GtkWidget *xftffi_volume_hbox;
+  GtkWidget *xftffi_volume_label;
+  GtkObject *xftffi_length_spin_adj;
+  GtkWidget *xftffi_length_spin;
+  GtkWidget *xftffi_enable_check;
+  GtkObject *xftffi_volume_spin_adj;
+  GtkWidget *xftffi_volume_spin;
+  GtkWidget *label13;
+  GtkWidget *xft_flush_label;
+  GtkWidget *xft_none_label;
+  GtkWidget *xft_pause_page;
+  GtkWidget *xf_pause_frame;
+  GtkWidget *xf_pause_table;
+  GtkWidget *pause_length_hbox;
+  GtkWidget *pause_length_label;
+  GtkObject *pause_length_spin_adj;
+  GtkWidget *pause_length_spin;
+  GtkWidget *label14;
+  GtkWidget *xft_pause_label;
+  GtkWidget *xft_simplexf_page;
+  GtkWidget *xf_simple_frame;
+  GtkWidget *xf_simple_table;
+  GtkWidget *simple_length_hbox;
+  GtkWidget *simple_length_label;
+  GtkObject *simple_length_spin_adj;
+  GtkWidget *simple_length_spin;
+  GtkWidget *label15;
+  GtkWidget *xft_simplexf_label;
+  GtkWidget *xft_advancedxf_page;
+  GtkWidget *xf_fadeout_frame;
+  GtkWidget *xf_fadeout_table;
+  GtkWidget *fadeout_length_hbox;
+  GtkWidget *fadeout_length_label;
+  GtkObject *fadeout_length_spin_adj;
+  GtkWidget *fadeout_length_spin;
+  GtkWidget *fadeout_volume_hbox;
+  GtkWidget *fadeout_volume_label;
+  GtkObject *fadeout_volume_spin_adj;
+  GtkWidget *fadeout_volume_spin;
+  GtkWidget *fadeout_options_hbox;
+  GtkWidget *fadeout_enable_check;
+  GtkWidget *label16;
+  GtkWidget *xf_offset_frame;
+  GtkWidget *xf_offset_table;
+  GtkWidget *xfofs_custom_hbox;
+  GtkWidget *xfofs_custom_radiobutton;
+  GSList *xfofs_custom_radiobutton_group = NULL;
+  GtkObject *xfofs_custom_spin_adj;
+  GtkWidget *xfofs_custom_spin;
+  GtkWidget *xfofs_none_radiobutton;
+  GtkWidget *xfofs_lockout_radiobutton;
+  GtkWidget *xfofs_lockin_radiobutton;
+  GtkWidget *label17;
+  GtkWidget *xf_fadein_frame;
+  GtkWidget *xf_fadein_table;
+  GtkWidget *fadein_length_hbox;
+  GtkWidget *fadein_length_label;
+  GtkWidget *fadein_volume_hbox;
+  GtkWidget *fadein_volume_label;
+  GtkObject *fadein_length_spin_adj;
+  GtkWidget *fadein_length_spin;
+  GtkWidget *fadein_enable_check;
+  GtkWidget *fadein_lock_check;
+  GtkObject *fadein_volume_spin_adj;
+  GtkWidget *fadein_volume_spin;
+  GtkWidget *label18;
+  GtkWidget *xft_advancedxf_label;
+  GtkWidget *xft_fadein_page;
+  GtkWidget *xftfi_fadein_frame;
+  GtkWidget *xftfi_fadein_table;
+  GtkWidget *xftfi_length_hbox;
+  GtkWidget *xftfi_length_label;
+  GtkWidget *xftfi_volume_hbox;
+  GtkWidget *xftfi_volume_label;
+  GtkObject *xftfi_length_spin_adj;
+  GtkWidget *xftfi_length_spin;
+  GtkObject *xftfi_volume_spin_adj;
+  GtkWidget *xftfi_volume_spin;
+  GtkWidget *label19;
+  GtkWidget *xft_fadein_label;
+  GtkWidget *xft_fadeout_page;
+  GtkWidget *xftfo_fadeout_frame;
+  GtkWidget *xftfo_fadeout_table;
+  GtkWidget *xftfo_length_hbox;
+  GtkWidget *xftfo_length_label;
+  GtkObject *xftfo_length_spin_adj;
+  GtkWidget *xftfo_length_spin;
+  GtkWidget *xftfo_volume_hbox;
+  GtkWidget *xftfo_volume_label;
+  GtkObject *xftfo_volume_spin_adj;
+  GtkWidget *xftfo_volume_spin;
+  GtkWidget *label20;
+  GtkWidget *xftfo_silence_frame;
+  GtkWidget *xftfo_silence_table;
+  GtkWidget *xftfo_silence_hbox;
+  GtkWidget *xftfo_silence_label;
+  GtkObject *xftfo_silence_spin_adj;
+  GtkWidget *xftfo_silence_spin;
+  GtkWidget *label21;
+  GtkWidget *xft_fadeout_label;
+  GtkWidget *xft_pause_none_label;
+  GtkWidget *xft_pause_adv_page;
+  GtkWidget *xft_fadeoutin_frame;
+  GtkWidget *xft_fadeoutin_table;
+  GtkObject *xftfoi_fadeout_spin_adj;
+  GtkWidget *xftfoi_fadeout_spin;
+  GtkObject *xftfoi_silence_spin_adj;
+  GtkWidget *xftfoi_silence_spin;
+  GtkObject *xftfoi_fadein_spin_adj;
+  GtkWidget *xftfoi_fadein_spin;
+  GtkWidget *xftfoi_fadein_hbox;
+  GtkWidget *xftfoi_fadein_label;
+  GtkWidget *xftfoi_silence_hbox;
+  GtkWidget *xftfoi_silence_label;
+  GtkWidget *xftfoi_fadeout_hbox;
+  GtkWidget *xftfoi_fadeout_label;
+  GtkWidget *label22;
+  GtkWidget *xft_pause_adv_label;
+  GtkWidget *config_crossfade_label;
+  GtkWidget *config_gapkiller_page;
+  GtkWidget *gap_leading_frame;
+  GtkWidget *gap_leading_table;
+  GtkObject *lgap_length_spin_adj;
+  GtkWidget *lgap_length_spin;
+  GtkObject *lgap_level_spin_adj;
+  GtkWidget *lgap_level_spin;
+  GtkWidget *lgap_length_hbox;
+  GtkWidget *lgap_length_label;
+  GtkWidget *lgap_level_hbox;
+  GtkWidget *lgap_level_label;
+  GtkWidget *lgap_enable_check;
+  GtkWidget *label23;
+  GtkWidget *gap_trailing_frame;
+  GtkWidget *gap_trailing_table;
+  GtkWidget *tgap_length_hbox;
+  GtkWidget *tgap_length_label;
+  GtkWidget *tgap_level_hbox;
+  GtkWidget *tgap_level_label;
+  GtkObject *tgap_length_spin_adj;
+  GtkWidget *tgap_length_spin;
+  GtkObject *tgap_level_spin_adj;
+  GtkWidget *tgap_level_spin;
+  GtkWidget *tgap_lock_check;
+  GtkWidget *tgap_enable_check;
+  GtkWidget *label24;
+  GtkWidget *gap_advanced_frame;
+  GtkWidget *gap_advanced_vbox;
+  GtkWidget *gadv_crossing_check;
+  GtkWidget *label25;
+  GtkWidget *config_gapkiller_label;
+  GtkWidget *config_misc_page;
+  GtkWidget *misc_debug_frame;
+  GtkWidget *misc_debug_vbox;
+  GtkWidget *debug_stderr_check;
+  GtkWidget *debug_monitor_check;
+  GtkWidget *label26;
+  GtkWidget *misc_mixopt_frame;
+  GtkWidget *misc_mixopt_vbox;
+  GtkWidget *mixopt_enable_check;
+  GtkWidget *mixopt_reverse_check;
+  GtkWidget *mixopt_software_check;
+  GtkWidget *label27;
+  GtkWidget *misc_other_frame;
+  GtkWidget *misc_other_vbox;
+  GtkWidget *moth_songchange_hbox;
+  GtkWidget *moth_songchange_label;
+  GtkObject *moth_songchange_spin_adj;
+  GtkWidget *moth_songchange_spin;
+  GtkWidget *moth_preload_hbox;
+  GtkWidget *moth_preload_label;
+  GtkObject *moth_preload_spin_adj;
+  GtkWidget *moth_preload_spin;
+  GtkWidget *moth_noxf_hbox;
+  GtkWidget *moth_noxf_label;
+  GtkWidget *noxf_album_check;
+  GtkWidget *noxf_samefile_check;
+  GtkWidget *moth_httpworkaround_check;
+  GtkWidget *moth_opmaxused_hbox;
+  GtkWidget *moth_opmaxused_check;
+  GtkObject *moth_opmaxused_spin_adj;
+  GtkWidget *moth_opmaxused_spin;
+  GtkWidget *moth_quantaudio_check;
+  GtkWidget *moth_outputkeepopened_check;
+  GtkWidget *label28;
+  GtkWidget *config_misc_label;
+  GtkWidget *config_presets_page;
+  GtkWidget *presets_name_hbox;
+  GtkWidget *presets_name_entry;
+  GtkWidget *presets_delete_button;
+  GtkWidget *presets_new_button;
+  GtkWidget *presets_list_scrolledwindow;
+  GtkWidget *presets_list_list;
+  GtkWidget *presets_list_bbox;
+  GtkWidget *presets_load_button;
+  GtkWidget *presets_save_button;
+  GtkWidget *config_presets_label;
+  GtkWidget *config_bbox;
+  GtkWidget *config_ok;
+  GtkWidget *config_cancel;
+  GtkWidget *config_apply;
+  GtkTooltips *tooltips;
+
+  tooltips = gtk_tooltips_new ();
+
+  config_win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  gtk_window_set_title (GTK_WINDOW (config_win), "Crossfade Configuration");
+
+  config_vbox = gtk_vbox_new (FALSE, 10);
+  gtk_widget_show (config_vbox);
+  gtk_container_add (GTK_CONTAINER (config_win), config_vbox);
+  gtk_container_set_border_width (GTK_CONTAINER (config_vbox), 10);
+
+  config_notebook = gtk_notebook_new ();
+  gtk_widget_show (config_notebook);
+  gtk_box_pack_start (GTK_BOX (config_vbox), config_notebook, TRUE, TRUE, 0);
+
+  config_output_page = gtk_vbox_new (FALSE, 5);
+  gtk_widget_show (config_output_page);
+  gtk_container_add (GTK_CONTAINER (config_notebook), config_output_page);
+  gtk_container_set_border_width (GTK_CONTAINER (config_output_page), 5);
+
+  output_options_hbox = gtk_hbox_new (FALSE, 6);
+  gtk_widget_show (output_options_hbox);
+  gtk_box_pack_start (GTK_BOX (config_output_page), output_options_hbox, FALSE, TRUE, 0);
+
+  output_method_frame = gtk_frame_new (NULL);
+  gtk_widget_show (output_method_frame);
+  gtk_box_pack_start (GTK_BOX (output_options_hbox), output_method_frame, TRUE, TRUE, 0);
+
+  output_method_vbox = gtk_vbox_new (FALSE, 2);
+  gtk_widget_show (output_method_vbox);
+  gtk_container_add (GTK_CONTAINER (output_method_frame), output_method_vbox);
+  gtk_container_set_border_width (GTK_CONTAINER (output_method_vbox), 5);
+
+  output_oss_radio = gtk_radio_button_new_with_mnemonic (NULL, "Builtin OSS driver");
+  gtk_widget_show (output_oss_radio);
+  gtk_box_pack_start (GTK_BOX (output_method_vbox), output_oss_radio, FALSE, FALSE, 0);
+  gtk_tooltips_set_tip (tooltips, output_oss_radio, "Use XMMS-crossfade's builtin OSS driver for output.", NULL);
+  gtk_radio_button_set_group (GTK_RADIO_BUTTON (output_oss_radio), output_oss_radio_group);
+  output_oss_radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (output_oss_radio));
+
+  output_plugin_radio = gtk_radio_button_new_with_mnemonic (NULL, "Output plugin");
+  gtk_widget_show (output_plugin_radio);
+  gtk_box_pack_start (GTK_BOX (output_method_vbox), output_plugin_radio, FALSE, FALSE, 0);
+  gtk_tooltips_set_tip (tooltips, output_plugin_radio, "Use an existing plugin for output.", NULL);
+  gtk_radio_button_set_group (GTK_RADIO_BUTTON (output_plugin_radio), output_oss_radio_group);
+  output_oss_radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (output_plugin_radio));
+
+  output_none_radio = gtk_radio_button_new_with_mnemonic (NULL, "None [not implemented]");
+  gtk_box_pack_start (GTK_BOX (output_method_vbox), output_none_radio, FALSE, FALSE, 0);
+  gtk_widget_set_sensitive (output_none_radio, FALSE);
+  gtk_radio_button_set_group (GTK_RADIO_BUTTON (output_none_radio), output_oss_radio_group);
+  output_oss_radio_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (output_none_radio));
+
+  label1 = gtk_label_new ("Output method");
+  gtk_widget_show (label1);
+  gtk_frame_set_label_widget (GTK_FRAME (output_method_frame), label1);
+
+  output_resampling_frame = gtk_frame_new (NULL);
+  gtk_widget_show (output_resampling_frame);
+  gtk_box_pack_start (GTK_BOX (output_options_hbox), output_resampling_frame, FALSE, FALSE, 0);
+
+  output_resampling_table = gtk_table_new (2, 2, FALSE);
+  gtk_widget_show (output_resampling_table);
+  gtk_container_add (GTK_CONTAINER (output_resampling_frame), output_resampling_table);
+  gtk_container_set_border_width (GTK_CONTAINER (output_resampling_table), 5);
+  gtk_table_set_row_spacings (GTK_TABLE (output_resampling_table), 2);
+  gtk_table_set_col_spacings (GTK_TABLE (output_resampling_table), 2);
+
+  resampling_rate_hbox = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (resampling_rate_hbox);
+  gtk_table_attach (GTK_TABLE (output_resampling_table), resampling_rate_hbox, 0, 1, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  resampling_rate_label = gtk_label_new ("Rate:");
+  gtk_widget_show (resampling_rate_label);
+  gtk_box_pack_end (GTK_BOX (resampling_rate_hbox), resampling_rate_label, FALSE, FALSE, 0);
+
+  resampling_quality_hbox = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (resampling_quality_hbox);
+  gtk_table_attach (GTK_TABLE (output_resampling_table), resampling_quality_hbox, 0, 1, 1, 2,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  resampling_quality_label = gtk_label_new ("Quality:");
+  gtk_widget_show (resampling_quality_label);
+  gtk_box_pack_end (GTK_BOX (resampling_quality_hbox), resampling_quality_label, FALSE, FALSE, 0);
+
+  resampling_rate_optionmenu = gtk_option_menu_new ();
+  gtk_widget_show (resampling_rate_optionmenu);
+  gtk_table_attach (GTK_TABLE (output_resampling_table), resampling_rate_optionmenu, 1, 2, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+
+  resampling_quality_optionmenu = gtk_option_menu_new ();
+  gtk_widget_show (resampling_quality_optionmenu);
+  gtk_table_attach (GTK_TABLE (output_resampling_table), resampling_quality_optionmenu, 1, 2, 1, 2,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+
+  output_resampling_label = gtk_label_new ("Resampling");
+  gtk_widget_show (output_resampling_label);
+  gtk_frame_set_label_widget (GTK_FRAME (output_resampling_frame), output_resampling_label);
+
+  output_notebook = gtk_notebook_new ();
+  gtk_widget_show (output_notebook);
+  gtk_box_pack_start (GTK_BOX (config_output_page), output_notebook, FALSE, TRUE, 0);
+  GTK_WIDGET_UNSET_FLAGS (output_notebook, GTK_CAN_FOCUS);
+  gtk_notebook_set_show_tabs (GTK_NOTEBOOK (output_notebook), FALSE);
+  gtk_notebook_set_show_border (GTK_NOTEBOOK (output_notebook), FALSE);
+
+  output_oss_page = gtk_vbox_new (FALSE, 5);
+  gtk_widget_show (output_oss_page);
+  gtk_container_add (GTK_CONTAINER (output_notebook), output_oss_page);
+
+  output_oss_notebook = gtk_notebook_new ();
+  gtk_widget_show (output_oss_notebook);
+  gtk_box_pack_start (GTK_BOX (output_oss_page), output_oss_notebook, FALSE, FALSE, 0);
+
+  oss_device_page = gtk_vbox_new (FALSE, 5);
+  gtk_widget_show (oss_device_page);
+  gtk_container_add (GTK_CONTAINER (output_oss_notebook), oss_device_page);
+  gtk_container_set_border_width (GTK_CONTAINER (oss_device_page), 5);
+
+  oss_adevice_frame = gtk_frame_new (NULL);
+  gtk_widget_show (oss_adevice_frame);
+  gtk_box_pack_start (GTK_BOX (oss_device_page), oss_adevice_frame, FALSE, FALSE, 0);
+
+  oss_adevice_vbox = gtk_vbox_new (FALSE, 2);
+  gtk_widget_show (oss_adevice_vbox);
+  gtk_container_add (GTK_CONTAINER (oss_adevice_frame), oss_adevice_vbox);
+  gtk_container_set_border_width (GTK_CONTAINER (oss_adevice_vbox), 5);
+
+  oss_adevice_hbox = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (oss_adevice_hbox);
+  gtk_box_pack_start (GTK_BOX (oss_adevice_vbox), oss_adevice_hbox, TRUE, TRUE, 0);
+
+  oss_adevice_optionmenu = gtk_option_menu_new ();
+  gtk_widget_show (oss_adevice_optionmenu);
+  gtk_box_pack_start (GTK_BOX (oss_adevice_hbox), oss_adevice_optionmenu, TRUE, TRUE, 0);
+
+  convertwidget1 = gtk_menu_new ();
+
+  convertwidget2 = gtk_menu_item_new_with_mnemonic ("dummy");
+  gtk_widget_show (convertwidget2);
+  gtk_container_add (GTK_CONTAINER (convertwidget1), convertwidget2);
+
+  gtk_option_menu_set_menu (GTK_OPTION_MENU (oss_adevice_optionmenu), convertwidget1);
+
+  oss_adevice_alt_hbox = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (oss_adevice_alt_hbox);
+  gtk_box_pack_start (GTK_BOX (oss_adevice_vbox), oss_adevice_alt_hbox, TRUE, TRUE, 0);
+
+  oss_adevice_alt_check = gtk_check_button_new_with_mnemonic ("Use alternate device:");
+  gtk_widget_show (oss_adevice_alt_check);
+  gtk_box_pack_start (GTK_BOX (oss_adevice_alt_hbox), oss_adevice_alt_check, FALSE, FALSE, 0);
+
+  oss_adevice_alt_entry = gtk_entry_new ();
+  gtk_widget_show (oss_adevice_alt_entry);
+  gtk_box_pack_start (GTK_BOX (oss_adevice_alt_hbox), oss_adevice_alt_entry, TRUE, TRUE, 0);
+
+  label3 = gtk_label_new ("Audio device");
+  gtk_widget_show (label3);
+  gtk_frame_set_label_widget (GTK_FRAME (oss_adevice_frame), label3);
+
+  oss_mdevice_frame = gtk_frame_new (NULL);
+  gtk_widget_show (oss_mdevice_frame);
+  gtk_box_pack_start (GTK_BOX (oss_device_page), oss_mdevice_frame, FALSE, FALSE, 0);
+
+  oss_mdevice_vbox = gtk_vbox_new (FALSE, 2);
+  gtk_widget_show (oss_mdevice_vbox);
+  gtk_container_add (GTK_CONTAINER (oss_mdevice_frame), oss_mdevice_vbox);
+  gtk_container_set_border_width (GTK_CONTAINER (oss_mdevice_vbox), 5);
+
+  oss_mdevice_hbox = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (oss_mdevice_hbox);
+  gtk_box_pack_start (GTK_BOX (oss_mdevice_vbox), oss_mdevice_hbox, TRUE, TRUE, 0);
+
+  oss_mdevice_optionmenu = gtk_option_menu_new ();
+  gtk_widget_show (oss_mdevice_optionmenu);
+  gtk_box_pack_start (GTK_BOX (oss_mdevice_hbox), oss_mdevice_optionmenu, TRUE, TRUE, 0);
+
+  convertwidget3 = gtk_menu_new ();
+
+  convertwidget4 = gtk_menu_item_new_with_mnemonic ("dummy");
+  gtk_widget_show (convertwidget4);
+  gtk_container_add (GTK_CONTAINER (convertwidget3), convertwidget4);
+
+  gtk_option_menu_set_menu (GTK_OPTION_MENU (oss_mdevice_optionmenu), convertwidget3);
+
+  oss_mdevice_alt_hbox = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (oss_mdevice_alt_hbox);
+  gtk_box_pack_start (GTK_BOX (oss_mdevice_vbox), oss_mdevice_alt_hbox, FALSE, FALSE, 0);
+
+  oss_mdevice_alt_check = gtk_check_button_new_with_mnemonic ("Use alternate device:");
+  gtk_widget_show (oss_mdevice_alt_check);
+  gtk_box_pack_start (GTK_BOX (oss_mdevice_alt_hbox), oss_mdevice_alt_check, FALSE, FALSE, 0);
+
+  oss_mdevice_alt_entry = gtk_entry_new ();
+  gtk_widget_show (oss_mdevice_alt_entry);
+  gtk_box_pack_start (GTK_BOX (oss_mdevice_alt_hbox), oss_mdevice_alt_entry, TRUE, TRUE, 0);
+
+  label4 = gtk_label_new ("Mixer device");
+  gtk_widget_show (label4);
+  gtk_frame_set_label_widget (GTK_FRAME (oss_mdevice_frame), label4);
+
+  oss_device_label = gtk_label_new ("Device");
+  gtk_widget_show (oss_device_label);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (output_oss_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (output_oss_notebook), 0), oss_device_label);
+  gtk_label_set_justify (GTK_LABEL (oss_device_label), GTK_JUSTIFY_CENTER);
+
+  oss_buffer_page = gtk_vbox_new (FALSE, 5);
+  gtk_widget_show (oss_buffer_page);
+  gtk_container_add (GTK_CONTAINER (output_oss_notebook), oss_buffer_page);
+  gtk_container_set_border_width (GTK_CONTAINER (oss_buffer_page), 5);
+
+  oss_buffer_frame = gtk_frame_new (NULL);
+  gtk_widget_show (oss_buffer_frame);
+  gtk_box_pack_start (GTK_BOX (oss_buffer_page), oss_buffer_frame, FALSE, FALSE, 0);
+
+  oss_buffer_vbox = gtk_vbox_new (FALSE, 2);
+  gtk_widget_show (oss_buffer_vbox);
+  gtk_container_add (GTK_CONTAINER (oss_buffer_frame), oss_buffer_vbox);
+  gtk_container_set_border_width (GTK_CONTAINER (oss_buffer_vbox), 5);
+
+  ossbuf_buffer_hbox = gtk_hbox_new (FALSE, 5);
+  gtk_widget_show (ossbuf_buffer_hbox);
+  gtk_box_pack_start (GTK_BOX (oss_buffer_vbox), ossbuf_buffer_hbox, FALSE, FALSE, 0);
+
+  ossbuf_buffer_label = gtk_label_new ("Buffer size (ms):");
+  gtk_widget_show (ossbuf_buffer_label);
+  gtk_box_pack_start (GTK_BOX (ossbuf_buffer_hbox), ossbuf_buffer_label, FALSE, FALSE, 0);
+
+  ossbuf_buffer_spin_adj = gtk_adjustment_new (0, 0, 60000, 10, 100, 10);
+  ossbuf_buffer_spin = gtk_spin_button_new (GTK_ADJUSTMENT (ossbuf_buffer_spin_adj), 0, 0);
+  gtk_widget_show (ossbuf_buffer_spin);
+  gtk_box_pack_start (GTK_BOX (ossbuf_buffer_hbox), ossbuf_buffer_spin, TRUE, TRUE, 0);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (ossbuf_buffer_spin), TRUE);
+
+  ossbuf_preload_hbox = gtk_hbox_new (FALSE, 5);
+  gtk_widget_show (ossbuf_preload_hbox);
+  gtk_box_pack_start (GTK_BOX (oss_buffer_vbox), ossbuf_preload_hbox, TRUE, TRUE, 0);
+
+  ossbuf_preload_label = gtk_label_new ("Preload size (ms):");
+  gtk_widget_show (ossbuf_preload_label);
+  gtk_box_pack_start (GTK_BOX (ossbuf_preload_hbox), ossbuf_preload_label, FALSE, FALSE, 0);
+
+  ossbuf_preload_spin_adj = gtk_adjustment_new (1500, 0, 60000, 10, 100, 10);
+  ossbuf_preload_spin = gtk_spin_button_new (GTK_ADJUSTMENT (ossbuf_preload_spin_adj), 0, 0);
+  gtk_widget_show (ossbuf_preload_spin);
+  gtk_box_pack_start (GTK_BOX (ossbuf_preload_hbox), ossbuf_preload_spin, TRUE, TRUE, 0);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (ossbuf_preload_spin), TRUE);
+
+  label5 = gtk_label_new ("Software buffer");
+  gtk_widget_show (label5);
+  gtk_frame_set_label_widget (GTK_FRAME (oss_buffer_frame), label5);
+
+  oss_hwbuf_frame = gtk_frame_new (NULL);
+  gtk_widget_show (oss_hwbuf_frame);
+  gtk_box_pack_start (GTK_BOX (oss_buffer_page), oss_hwbuf_frame, TRUE, TRUE, 0);
+
+  oss_hwbuf_vbox = gtk_vbox_new (FALSE, 2);
+  gtk_widget_show (oss_hwbuf_vbox);
+  gtk_container_add (GTK_CONTAINER (oss_hwbuf_frame), oss_hwbuf_vbox);
+  gtk_container_set_border_width (GTK_CONTAINER (oss_hwbuf_vbox), 5);
+
+  osshwb_maxbuf_check = gtk_check_button_new_with_mnemonic ("Maximum device buffer size");
+  gtk_widget_show (osshwb_maxbuf_check);
+  gtk_box_pack_start (GTK_BOX (oss_hwbuf_vbox), osshwb_maxbuf_check, FALSE, FALSE, 0);
+
+  osshwb_fragments_hbox = gtk_hbox_new (FALSE, 5);
+  gtk_widget_show (osshwb_fragments_hbox);
+  gtk_box_pack_start (GTK_BOX (oss_hwbuf_vbox), osshwb_fragments_hbox, FALSE, FALSE, 0);
+
+  osshwb_fragments_label = gtk_label_new ("Number of Fragments:");
+  gtk_widget_show (osshwb_fragments_label);
+  gtk_box_pack_start (GTK_BOX (osshwb_fragments_hbox), osshwb_fragments_label, FALSE, FALSE, 0);
+
+  osshwb_fragments_spin_adj = gtk_adjustment_new (50, 2, 65535, 1, 10, 10);
+  osshwb_fragments_spin = gtk_spin_button_new (GTK_ADJUSTMENT (osshwb_fragments_spin_adj), 0, 0);
+  gtk_widget_show (osshwb_fragments_spin);
+  gtk_box_pack_start (GTK_BOX (osshwb_fragments_hbox), osshwb_fragments_spin, TRUE, TRUE, 0);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (osshwb_fragments_spin), TRUE);
+
+  osshwb_fragsize_hbox = gtk_hbox_new (FALSE, 5);
+  gtk_widget_show (osshwb_fragsize_hbox);
+  gtk_box_pack_start (GTK_BOX (oss_hwbuf_vbox), osshwb_fragsize_hbox, TRUE, TRUE, 0);
+
+  osshwb_fragsize_label = gtk_label_new ("Fragment size (2^x bytes):");
+  gtk_widget_show (osshwb_fragsize_label);
+  gtk_box_pack_start (GTK_BOX (osshwb_fragsize_hbox), osshwb_fragsize_label, FALSE, FALSE, 0);
+
+  osshwb_fragsize_spin_adj = gtk_adjustment_new (11, 4, 16, 1, 10, 10);
+  osshwb_fragsize_spin = gtk_spin_button_new (GTK_ADJUSTMENT (osshwb_fragsize_spin_adj), 0, 0);
+  gtk_widget_show (osshwb_fragsize_spin);
+  gtk_box_pack_start (GTK_BOX (osshwb_fragsize_hbox), osshwb_fragsize_spin, TRUE, TRUE, 0);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (osshwb_fragsize_spin), TRUE);
+
+  label6 = gtk_label_new ("Hardware device buffer");
+  gtk_widget_show (label6);
+  gtk_frame_set_label_widget (GTK_FRAME (oss_hwbuf_frame), label6);
+
+  oss_buffer_label = gtk_label_new ("Buffer");
+  gtk_widget_show (oss_buffer_label);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (output_oss_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (output_oss_notebook), 1), oss_buffer_label);
+  gtk_label_set_justify (GTK_LABEL (oss_buffer_label), GTK_JUSTIFY_CENTER);
+
+  oss_mixer_page = gtk_vbox_new (FALSE, 5);
+  gtk_widget_show (oss_mixer_page);
+  gtk_container_add (GTK_CONTAINER (output_oss_notebook), oss_mixer_page);
+  gtk_container_set_border_width (GTK_CONTAINER (oss_mixer_page), 5);
+
+  oss_mixer_frame = gtk_frame_new (NULL);
+  gtk_widget_show (oss_mixer_frame);
+  gtk_box_pack_start (GTK_BOX (oss_mixer_page), oss_mixer_frame, FALSE, FALSE, 0);
+
+  oss_mixer_vbox = gtk_vbox_new (FALSE, 2);
+  gtk_widget_show (oss_mixer_vbox);
+  gtk_container_add (GTK_CONTAINER (oss_mixer_frame), oss_mixer_vbox);
+  gtk_container_set_border_width (GTK_CONTAINER (oss_mixer_vbox), 5);
+
+  ossmixer_pcm_check = gtk_check_button_new_with_mnemonic ("Volume controls Master not PCM");
+  gtk_widget_show (ossmixer_pcm_check);
+  gtk_box_pack_start (GTK_BOX (oss_mixer_vbox), ossmixer_pcm_check, FALSE, FALSE, 0);
+
+  label7 = gtk_label_new ("Mixer options");
+  gtk_widget_show (label7);
+  gtk_frame_set_label_widget (GTK_FRAME (oss_mixer_frame), label7);
+
+  oss_mixer_label = gtk_label_new ("Mixer");
+  gtk_widget_show (oss_mixer_label);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (output_oss_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (output_oss_notebook), 2), oss_mixer_label);
+  gtk_label_set_justify (GTK_LABEL (oss_mixer_label), GTK_JUSTIFY_CENTER);
+
+  label29 = gtk_label_new ("");
+  gtk_widget_show (label29);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (output_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (output_notebook), 0), label29);
+
+  output_plugin_page = gtk_vbox_new (FALSE, 5);
+  gtk_widget_show (output_plugin_page);
+  gtk_container_add (GTK_CONTAINER (output_notebook), output_plugin_page);
+
+  op_plugin_frame = gtk_frame_new (NULL);
+  gtk_widget_show (op_plugin_frame);
+  gtk_box_pack_start (GTK_BOX (output_plugin_page), op_plugin_frame, FALSE, TRUE, 0);
+
+  op_plugin_vbox = gtk_vbox_new (FALSE, 2);
+  gtk_widget_show (op_plugin_vbox);
+  gtk_container_add (GTK_CONTAINER (op_plugin_frame), op_plugin_vbox);
+  gtk_container_set_border_width (GTK_CONTAINER (op_plugin_vbox), 5);
+
+  op_plugin_optionmenu = gtk_option_menu_new ();
+  gtk_widget_show (op_plugin_optionmenu);
+  gtk_box_pack_start (GTK_BOX (op_plugin_vbox), op_plugin_optionmenu, FALSE, FALSE, 0);
+
+  convertwidget5 = gtk_menu_new ();
+
+  convertwidget6 = gtk_menu_item_new_with_mnemonic ("dummy");
+  gtk_widget_show (convertwidget6);
+  gtk_container_add (GTK_CONTAINER (convertwidget5), convertwidget6);
+
+  gtk_option_menu_set_menu (GTK_OPTION_MENU (op_plugin_optionmenu), convertwidget5);
+
+  op_plugin_buttonbox = gtk_hbutton_box_new ();
+  gtk_widget_show (op_plugin_buttonbox);
+  gtk_box_pack_start (GTK_BOX (op_plugin_vbox), op_plugin_buttonbox, FALSE, TRUE, 0);
+  gtk_button_box_set_layout (GTK_BUTTON_BOX (op_plugin_buttonbox), GTK_BUTTONBOX_START);
+  gtk_box_set_spacing (GTK_BOX (op_plugin_buttonbox), 5);
+
+  op_configure_button = gtk_button_new_with_mnemonic ("Configure");
+  gtk_widget_show (op_configure_button);
+  gtk_container_add (GTK_CONTAINER (op_plugin_buttonbox), op_configure_button);
+  GTK_WIDGET_SET_FLAGS (op_configure_button, GTK_CAN_DEFAULT);
+
+  op_about_button = gtk_button_new_with_mnemonic ("About");
+  gtk_widget_show (op_about_button);
+  gtk_container_add (GTK_CONTAINER (op_plugin_buttonbox), op_about_button);
+  GTK_WIDGET_SET_FLAGS (op_about_button, GTK_CAN_DEFAULT);
+
+  label8 = gtk_label_new ("Output plugin");
+  gtk_widget_show (label8);
+  gtk_frame_set_label_widget (GTK_FRAME (op_plugin_frame), label8);
+
+  op_options_frame = gtk_frame_new (NULL);
+  gtk_widget_show (op_options_frame);
+  gtk_box_pack_start (GTK_BOX (output_plugin_page), op_options_frame, FALSE, TRUE, 0);
+
+  op_options_vbox = gtk_vbox_new (FALSE, 2);
+  gtk_widget_show (op_options_vbox);
+  gtk_container_add (GTK_CONTAINER (op_options_frame), op_options_vbox);
+  gtk_container_set_border_width (GTK_CONTAINER (op_options_vbox), 5);
+
+  op_throttle_check = gtk_check_button_new_with_mnemonic ("Throttle Output");
+  gtk_widget_show (op_throttle_check);
+  gtk_box_pack_start (GTK_BOX (op_options_vbox), op_throttle_check, FALSE, FALSE, 0);
+
+  op_maxblock_hbox = gtk_hbox_new (FALSE, 5);
+  gtk_widget_show (op_maxblock_hbox);
+  gtk_box_pack_start (GTK_BOX (op_options_vbox), op_maxblock_hbox, TRUE, TRUE, 0);
+
+  op_maxblock_check = gtk_check_button_new_with_mnemonic ("Max block size (bytes):");
+  gtk_widget_show (op_maxblock_check);
+  gtk_box_pack_start (GTK_BOX (op_maxblock_hbox), op_maxblock_check, FALSE, FALSE, 0);
+
+  op_maxblock_spin_adj = gtk_adjustment_new (1024, 4, 1048580, 4, 16, 10);
+  op_maxblock_spin = gtk_spin_button_new (GTK_ADJUSTMENT (op_maxblock_spin_adj), 10, 0);
+  gtk_widget_show (op_maxblock_spin);
+  gtk_box_pack_start (GTK_BOX (op_maxblock_hbox), op_maxblock_spin, TRUE, TRUE, 0);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (op_maxblock_spin), TRUE);
+  gtk_spin_button_set_snap_to_ticks (GTK_SPIN_BUTTON (op_maxblock_spin), TRUE);
+
+  op_forcereopen_check = gtk_check_button_new_with_mnemonic ("Force close/reopen on songchange");
+  gtk_widget_show (op_forcereopen_check);
+  gtk_box_pack_start (GTK_BOX (op_options_vbox), op_forcereopen_check, FALSE, FALSE, 0);
+
+  label9 = gtk_label_new ("Plugin compatibility options");
+  gtk_widget_show (label9);
+  gtk_frame_set_label_widget (GTK_FRAME (op_options_frame), label9);
+
+  label31 = gtk_label_new ("");
+  gtk_widget_show (label31);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (output_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (output_notebook), 1), label31);
+
+  empty_notebook_page = gtk_vbox_new (FALSE, 0);
+  gtk_widget_show (empty_notebook_page);
+  gtk_container_add (GTK_CONTAINER (output_notebook), empty_notebook_page);
+
+  label32 = gtk_label_new ("");
+  gtk_widget_show (label32);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (output_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (output_notebook), 2), label32);
+
+  empty_notebook_page = gtk_vbox_new (FALSE, 0);
+  gtk_widget_show (empty_notebook_page);
+  gtk_container_add (GTK_CONTAINER (output_notebook), empty_notebook_page);
+
+  label33 = gtk_label_new ("");
+  gtk_widget_show (label33);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (output_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (output_notebook), 3), label33);
+
+  empty_notebook_page = gtk_vbox_new (FALSE, 0);
+  gtk_widget_show (empty_notebook_page);
+  gtk_container_add (GTK_CONTAINER (output_notebook), empty_notebook_page);
+
+  label34 = gtk_label_new ("");
+  gtk_widget_show (label34);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (output_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (output_notebook), 4), label34);
+
+  output_help_label = gtk_label_new ("When modifying the Output Options or the Mixing buffer size, you need to stop/restart playback for the settings to take effect.");
+  gtk_widget_show (output_help_label);
+  gtk_box_pack_end (GTK_BOX (config_output_page), output_help_label, TRUE, TRUE, 0);
+  gtk_label_set_line_wrap (GTK_LABEL (output_help_label), TRUE);
+
+  config_devices_label = gtk_label_new ("Output");
+  gtk_widget_show (config_devices_label);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (config_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (config_notebook), 0), config_devices_label);
+  gtk_label_set_justify (GTK_LABEL (config_devices_label), GTK_JUSTIFY_CENTER);
+
+  config_effects_page = gtk_vbox_new (FALSE, 5);
+  gtk_widget_show (config_effects_page);
+  gtk_container_add (GTK_CONTAINER (config_notebook), config_effects_page);
+  gtk_container_set_border_width (GTK_CONTAINER (config_effects_page), 5);
+
+  ep_plugin_frame = gtk_frame_new (NULL);
+  gtk_widget_show (ep_plugin_frame);
+  gtk_box_pack_start (GTK_BOX (config_effects_page), ep_plugin_frame, FALSE, TRUE, 0);
+
+  ep_plugin_vbox = gtk_vbox_new (FALSE, 2);
+  gtk_widget_show (ep_plugin_vbox);
+  gtk_container_add (GTK_CONTAINER (ep_plugin_frame), ep_plugin_vbox);
+  gtk_container_set_border_width (GTK_CONTAINER (ep_plugin_vbox), 5);
+
+  ep_plugin_optionmenu = gtk_option_menu_new ();
+  gtk_widget_show (ep_plugin_optionmenu);
+  gtk_box_pack_start (GTK_BOX (ep_plugin_vbox), ep_plugin_optionmenu, FALSE, FALSE, 0);
+  gtk_tooltips_set_tip (tooltips, ep_plugin_optionmenu, "Select an effect plugin. Take care not to use the same plugin as selected in XMMS' configuration dialog.", NULL);
+
+  convertwidget7 = gtk_menu_new ();
+
+  convertwidget8 = gtk_menu_item_new_with_mnemonic ("dummy");
+  gtk_widget_show (convertwidget8);
+  gtk_container_add (GTK_CONTAINER (convertwidget7), convertwidget8);
+
+  gtk_option_menu_set_menu (GTK_OPTION_MENU (ep_plugin_optionmenu), convertwidget7);
+
+  ep_plugin_buttonbox = gtk_hbutton_box_new ();
+  gtk_widget_show (ep_plugin_buttonbox);
+  gtk_box_pack_start (GTK_BOX (ep_plugin_vbox), ep_plugin_buttonbox, FALSE, TRUE, 0);
+  gtk_button_box_set_layout (GTK_BUTTON_BOX (ep_plugin_buttonbox), GTK_BUTTONBOX_START);
+  gtk_box_set_spacing (GTK_BOX (ep_plugin_buttonbox), 5);
+
+  ep_configure_button = gtk_button_new_with_mnemonic ("Configure");
+  gtk_widget_show (ep_configure_button);
+  gtk_container_add (GTK_CONTAINER (ep_plugin_buttonbox), ep_configure_button);
+  GTK_WIDGET_SET_FLAGS (ep_configure_button, GTK_CAN_DEFAULT);
+  gtk_tooltips_set_tip (tooltips, ep_configure_button, "Open the configuration dialog of the plugin selected above.", NULL);
+
+  ep_about_button = gtk_button_new_with_mnemonic ("About");
+  gtk_widget_show (ep_about_button);
+  gtk_container_add (GTK_CONTAINER (ep_plugin_buttonbox), ep_about_button);
+  GTK_WIDGET_SET_FLAGS (ep_about_button, GTK_CAN_DEFAULT);
+  gtk_tooltips_set_tip (tooltips, ep_about_button, "Open the about dialog of the plugin selected above.", NULL);
+
+  ep_enable_check = gtk_check_button_new_with_mnemonic ("Use plugin");
+  gtk_widget_show (ep_enable_check);
+  gtk_container_add (GTK_CONTAINER (ep_plugin_buttonbox), ep_enable_check);
+  gtk_tooltips_set_tip (tooltips, ep_enable_check, "Enable the selected plugin. Note that after pressing 'Apply' it may take a while until you can hear the effect, since it is applied before the audio data goes into the buffer.", NULL);
+
+  label10 = gtk_label_new ("Pre-mixing effect plugin");
+  gtk_widget_show (label10);
+  gtk_frame_set_label_widget (GTK_FRAME (ep_plugin_frame), label10);
+
+  effects_volnorm_frame = gtk_frame_new (NULL);
+  gtk_box_pack_start (GTK_BOX (config_effects_page), effects_volnorm_frame, FALSE, FALSE, 0);
+
+  effects_volnorm_table = gtk_table_new (4, 2, FALSE);
+  gtk_widget_show (effects_volnorm_table);
+  gtk_container_add (GTK_CONTAINER (effects_volnorm_frame), effects_volnorm_table);
+  gtk_container_set_border_width (GTK_CONTAINER (effects_volnorm_table), 5);
+  gtk_table_set_row_spacings (GTK_TABLE (effects_volnorm_table), 2);
+  gtk_table_set_col_spacings (GTK_TABLE (effects_volnorm_table), 5);
+
+  volnorm_quantaudio_check = gtk_check_button_new_with_mnemonic ("Read Quantaudio comment field");
+  gtk_widget_show (volnorm_quantaudio_check);
+  gtk_table_attach (GTK_TABLE (effects_volnorm_table), volnorm_quantaudio_check, 1, 2, 2, 3,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+
+  volnorm_target_spin_adj = gtk_adjustment_new (8000, 0, 32768, 100, 1000, 10);
+  volnorm_target_spin = gtk_spin_button_new (GTK_ADJUSTMENT (volnorm_target_spin_adj), 0, 0);
+  gtk_widget_show (volnorm_target_spin);
+  gtk_table_attach (GTK_TABLE (effects_volnorm_table), volnorm_target_spin, 1, 2, 3, 4,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, volnorm_target_spin, "Set the maximum length for gaps at the end of a stream.\nDefault: 500", NULL);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (volnorm_target_spin), TRUE);
+
+  volnorm_target_hbox = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (volnorm_target_hbox);
+  gtk_table_attach (GTK_TABLE (effects_volnorm_table), volnorm_target_hbox, 0, 1, 3, 4,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+
+  volnorm_target_label = gtk_label_new ("Target RMS:");
+  gtk_widget_show (volnorm_target_label);
+  gtk_box_pack_start (GTK_BOX (volnorm_target_hbox), volnorm_target_label, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (volnorm_target_label), GTK_JUSTIFY_CENTER);
+
+  volnorm_enable_check = gtk_check_button_new_with_mnemonic ("Enable");
+  gtk_widget_show (volnorm_enable_check);
+  gtk_table_attach (GTK_TABLE (effects_volnorm_table), volnorm_enable_check, 1, 2, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+
+  volnorm_rva2_check = gtk_check_button_new_with_mnemonic ("Read ID3V2 RVA2 Tag");
+  gtk_widget_show (volnorm_rva2_check);
+  gtk_table_attach (GTK_TABLE (effects_volnorm_table), volnorm_rva2_check, 1, 2, 1, 2,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+
+  label11 = gtk_label_new ("Volume normalizer");
+  gtk_widget_show (label11);
+  gtk_frame_set_label_widget (GTK_FRAME (effects_volnorm_frame), label11);
+
+  effects_help_label = gtk_label_new ("You do not need to press 'Apply' after making changes to the effect plugin settings. It may take a while though until you can hear the change, since the plugin is applied before the mixing buffer.");
+  gtk_widget_show (effects_help_label);
+  gtk_box_pack_start (GTK_BOX (config_effects_page), effects_help_label, TRUE, TRUE, 0);
+  gtk_label_set_line_wrap (GTK_LABEL (effects_help_label), TRUE);
+
+  config_effects_label = gtk_label_new ("Effects");
+  gtk_widget_show (config_effects_label);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (config_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (config_notebook), 1), config_effects_label);
+  gtk_label_set_justify (GTK_LABEL (config_effects_label), GTK_JUSTIFY_CENTER);
+
+  config_crossfader_page = gtk_vbox_new (FALSE, 2);
+  gtk_widget_show (config_crossfader_page);
+  gtk_container_add (GTK_CONTAINER (config_notebook), config_crossfader_page);
+  gtk_container_set_border_width (GTK_CONTAINER (config_crossfader_page), 5);
+
+  xf_bufsize_hbox = gtk_hbox_new (FALSE, 5);
+  gtk_widget_show (xf_bufsize_hbox);
+  gtk_box_pack_start (GTK_BOX (config_crossfader_page), xf_bufsize_hbox, FALSE, FALSE, 0);
+
+  xf_bufsize_label = gtk_label_new ("Mixing buffer size (ms):");
+  gtk_widget_show (xf_bufsize_label);
+  gtk_box_pack_start (GTK_BOX (xf_bufsize_hbox), xf_bufsize_label, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (xf_bufsize_label), GTK_JUSTIFY_CENTER);
+
+  xf_buffer_spin_adj = gtk_adjustment_new (8500, 0, 60000, 100, 1000, 10);
+  xf_buffer_spin = gtk_spin_button_new (GTK_ADJUSTMENT (xf_buffer_spin_adj), 0, 0);
+  gtk_widget_show (xf_buffer_spin);
+  gtk_box_pack_start (GTK_BOX (xf_bufsize_hbox), xf_buffer_spin, TRUE, TRUE, 0);
+  gtk_tooltips_set_tip (tooltips, xf_buffer_spin, "Specify the size of the mixing buffer. Mixing buffer space is required for pauses, fade-outs, offsetting (i.e. interleaving the end and beginning of two songs) and killing trailing gaps. Fade-ins and killing leading gaps are done on-the-fly and do not depend on mixing buffer space.\nDefault: n/a - calculated automatically", NULL);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (xf_buffer_spin), TRUE);
+
+  xf_autobuf_check = gtk_check_button_new_with_mnemonic ("auto");
+  gtk_widget_show (xf_autobuf_check);
+  gtk_box_pack_start (GTK_BOX (xf_bufsize_hbox), xf_autobuf_check, FALSE, FALSE, 0);
+  gtk_tooltips_set_tip (tooltips, xf_autobuf_check, "Automatically calculate an optimal buffer size.\nDefault: On", NULL);
+
+  xf_config_hbox = gtk_hbox_new (FALSE, 5);
+  gtk_widget_show (xf_config_hbox);
+  gtk_box_pack_start (GTK_BOX (config_crossfader_page), xf_config_hbox, FALSE, FALSE, 0);
+
+  xf_config_label = gtk_label_new ("Set parameters for:");
+  gtk_widget_show (xf_config_label);
+  gtk_box_pack_start (GTK_BOX (xf_config_hbox), xf_config_label, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (xf_config_label), GTK_JUSTIFY_CENTER);
+
+  xf_config_optionmenu = gtk_option_menu_new ();
+  gtk_widget_show (xf_config_optionmenu);
+  gtk_box_pack_start (GTK_BOX (xf_config_hbox), xf_config_optionmenu, TRUE, TRUE, 0);
+  gtk_tooltips_set_tip (tooltips, xf_config_optionmenu, "Select the type of songchange you want to configure:\n* Start of playback: When starting playback by pressing PLAY\n* Automatic songchange: When reaching the end of a song and the playlist advances to the next song\n* Manual songchange: When manually selecting another song, for example by pressing NEXT/PREV\n* Manual stop: When pressing the STOP button\n* End of playlist: After the last song in the playlist has been played\n* Seeking: When seeking within the current song", NULL);
+
+  convertwidget9 = gtk_menu_new ();
+
+  convertwidget10 = gtk_menu_item_new_with_mnemonic ("dummy");
+  gtk_widget_show (convertwidget10);
+  gtk_container_add (GTK_CONTAINER (convertwidget9), convertwidget10);
+
+  gtk_option_menu_set_menu (GTK_OPTION_MENU (xf_config_optionmenu), convertwidget9);
+
+  xf_type_hbox = gtk_hbox_new (FALSE, 5);
+  gtk_widget_show (xf_type_hbox);
+  gtk_box_pack_start (GTK_BOX (config_crossfader_page), xf_type_hbox, FALSE, FALSE, 0);
+
+  xf_type_label = gtk_label_new ("Crossfade/Transition type:");
+  gtk_widget_show (xf_type_label);
+  gtk_box_pack_start (GTK_BOX (xf_type_hbox), xf_type_label, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (xf_type_label), GTK_JUSTIFY_CENTER);
+
+  xf_type_optionmenu = gtk_option_menu_new ();
+  gtk_widget_show (xf_type_optionmenu);
+  gtk_box_pack_start (GTK_BOX (xf_type_hbox), xf_type_optionmenu, TRUE, TRUE, 0);
+  gtk_tooltips_set_tip (tooltips, xf_type_optionmenu, "Select the transition to be used for the songchange type selected above:\n* Fade-in: Fade-in at 'Start of playback'\n* Reopen output device: Force a close/open on the output plugin. This will most certainly re-introduce gaps and clicks, but might be usefull with some plugins.\n* Flush output device: Keeps the output plugin opened, but flushes its buffers. This will give you almost instant reaction when pressing NEXT/PREV.\n* None (gapless/off): Gapless mode. Keeps the device opened, but does not do any fading.\n* Simple crossfade: Does a simple crossfade between the previous and the next song.\n* Advanced crossfade: Allows you to configure the crossfade in more detail.\n* Fade-out: Fade-out at 'Manual stop' or 'End of playlist'.", NULL);
+
+  convertwidget11 = gtk_menu_new ();
+
+  convertwidget12 = gtk_menu_item_new_with_mnemonic ("dummy");
+  gtk_widget_show (convertwidget12);
+  gtk_container_add (GTK_CONTAINER (convertwidget11), convertwidget12);
+
+  gtk_option_menu_set_menu (GTK_OPTION_MENU (xf_type_optionmenu), convertwidget11);
+
+  xf_type_notebook = gtk_notebook_new ();
+  gtk_widget_show (xf_type_notebook);
+  gtk_box_pack_start (GTK_BOX (config_crossfader_page), xf_type_notebook, FALSE, FALSE, 0);
+  GTK_WIDGET_UNSET_FLAGS (xf_type_notebook, GTK_CAN_FOCUS);
+  gtk_notebook_set_show_tabs (GTK_NOTEBOOK (xf_type_notebook), FALSE);
+  gtk_notebook_set_show_border (GTK_NOTEBOOK (xf_type_notebook), FALSE);
+
+  empty_notebook_page = gtk_vbox_new (FALSE, 0);
+  gtk_widget_show (empty_notebook_page);
+  gtk_container_add (GTK_CONTAINER (xf_type_notebook), empty_notebook_page);
+
+  xft_reopen_label = gtk_label_new ("Reopen");
+  gtk_widget_show (xft_reopen_label);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (xf_type_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (xf_type_notebook), 0), xft_reopen_label);
+  gtk_label_set_justify (GTK_LABEL (xft_reopen_label), GTK_JUSTIFY_CENTER);
+
+  xft_flush_page = gtk_vbox_new (FALSE, 5);
+  gtk_widget_show (xft_flush_page);
+  gtk_container_add (GTK_CONTAINER (xf_type_notebook), xft_flush_page);
+
+  xftf_pause_frame = gtk_frame_new (NULL);
+  gtk_widget_show (xftf_pause_frame);
+  gtk_box_pack_start (GTK_BOX (xft_flush_page), xftf_pause_frame, FALSE, FALSE, 0);
+
+  xftf_pause_table = gtk_table_new (2, 2, FALSE);
+  gtk_widget_show (xftf_pause_table);
+  gtk_container_add (GTK_CONTAINER (xftf_pause_frame), xftf_pause_table);
+  gtk_container_set_border_width (GTK_CONTAINER (xftf_pause_table), 5);
+  gtk_table_set_row_spacings (GTK_TABLE (xftf_pause_table), 2);
+  gtk_table_set_col_spacings (GTK_TABLE (xftf_pause_table), 5);
+
+  xftfp_length_label = gtk_label_new ("Length (ms):");
+  gtk_widget_show (xftfp_length_label);
+  gtk_table_attach (GTK_TABLE (xftf_pause_table), xftfp_length_label, 0, 1, 1, 2,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+
+  xftfp_length_spin_adj = gtk_adjustment_new (1000, 0, 60000, 100, 1000, 10);
+  xftfp_length_spin = gtk_spin_button_new (GTK_ADJUSTMENT (xftfp_length_spin_adj), 0, 0);
+  gtk_widget_show (xftfp_length_spin);
+  gtk_table_attach (GTK_TABLE (xftf_pause_table), xftfp_length_spin, 1, 2, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, xftfp_length_spin, "Specify the length of the silence to be inserted between the tracks.\nDefault: 2000", NULL);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (xftfp_length_spin), TRUE);
+
+  xftfp_enable_check = gtk_check_button_new_with_mnemonic ("Enable");
+  gtk_widget_show (xftfp_enable_check);
+  gtk_table_attach (GTK_TABLE (xftf_pause_table), xftfp_enable_check, 1, 2, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+
+  label12 = gtk_label_new ("Pause");
+  gtk_widget_show (label12);
+  gtk_frame_set_label_widget (GTK_FRAME (xftf_pause_frame), label12);
+
+  xftf_fadein_frame = gtk_frame_new (NULL);
+  gtk_widget_show (xftf_fadein_frame);
+  gtk_box_pack_start (GTK_BOX (xft_flush_page), xftf_fadein_frame, FALSE, FALSE, 0);
+
+  xftf_fadein_table = gtk_table_new (3, 2, FALSE);
+  gtk_widget_show (xftf_fadein_table);
+  gtk_container_add (GTK_CONTAINER (xftf_fadein_frame), xftf_fadein_table);
+  gtk_container_set_border_width (GTK_CONTAINER (xftf_fadein_table), 5);
+  gtk_table_set_row_spacings (GTK_TABLE (xftf_fadein_table), 2);
+  gtk_table_set_col_spacings (GTK_TABLE (xftf_fadein_table), 5);
+
+  xftffi_length_hbox = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (xftffi_length_hbox);
+  gtk_table_attach (GTK_TABLE (xftf_fadein_table), xftffi_length_hbox, 0, 1, 1, 2,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  xftffi_length_label = gtk_label_new ("Length (ms):");
+  gtk_widget_show (xftffi_length_label);
+  gtk_box_pack_start (GTK_BOX (xftffi_length_hbox), xftffi_length_label, FALSE, FALSE, 0);
+
+  xftffi_volume_hbox = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (xftffi_volume_hbox);
+  gtk_table_attach (GTK_TABLE (xftf_fadein_table), xftffi_volume_hbox, 0, 1, 2, 3,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  xftffi_volume_label = gtk_label_new ("Start volume (%):");
+  gtk_widget_show (xftffi_volume_label);
+  gtk_box_pack_start (GTK_BOX (xftffi_volume_hbox), xftffi_volume_label, FALSE, FALSE, 0);
+
+  xftffi_length_spin_adj = gtk_adjustment_new (1000, 0, 60000, 100, 1000, 10);
+  xftffi_length_spin = gtk_spin_button_new (GTK_ADJUSTMENT (xftffi_length_spin_adj), 0, 0);
+  gtk_widget_show (xftffi_length_spin);
+  gtk_table_attach (GTK_TABLE (xftf_fadein_table), xftffi_length_spin, 1, 2, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, xftffi_length_spin, "Set the duration for the fadein of the next song.", NULL);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (xftffi_length_spin), TRUE);
+
+  xftffi_enable_check = gtk_check_button_new_with_mnemonic ("Enable");
+  gtk_widget_show (xftffi_enable_check);
+  gtk_table_attach (GTK_TABLE (xftf_fadein_table), xftffi_enable_check, 1, 2, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+
+  xftffi_volume_spin_adj = gtk_adjustment_new (0, 0, 100, 1, 10, 10);
+  xftffi_volume_spin = gtk_spin_button_new (GTK_ADJUSTMENT (xftffi_volume_spin_adj), 0, 0);
+  gtk_widget_show (xftffi_volume_spin);
+  gtk_table_attach (GTK_TABLE (xftf_fadein_table), xftffi_volume_spin, 1, 2, 2, 3,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, xftffi_volume_spin, "Set the start volume. XMMS-crossfade will fade from this volume to 100% during the time specified above.\nDefault: 0", NULL);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (xftffi_volume_spin), TRUE);
+
+  label13 = gtk_label_new ("Fade in");
+  gtk_widget_show (label13);
+  gtk_frame_set_label_widget (GTK_FRAME (xftf_fadein_frame), label13);
+
+  xft_flush_label = gtk_label_new ("Flush");
+  gtk_widget_show (xft_flush_label);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (xf_type_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (xf_type_notebook), 1), xft_flush_label);
+  gtk_label_set_justify (GTK_LABEL (xft_flush_label), GTK_JUSTIFY_CENTER);
+
+  empty_notebook_page = gtk_vbox_new (FALSE, 0);
+  gtk_widget_show (empty_notebook_page);
+  gtk_container_add (GTK_CONTAINER (xf_type_notebook), empty_notebook_page);
+
+  xft_none_label = gtk_label_new ("None");
+  gtk_widget_show (xft_none_label);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (xf_type_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (xf_type_notebook), 2), xft_none_label);
+  gtk_label_set_justify (GTK_LABEL (xft_none_label), GTK_JUSTIFY_CENTER);
+
+  xft_pause_page = gtk_vbox_new (FALSE, 5);
+  gtk_widget_show (xft_pause_page);
+  gtk_container_add (GTK_CONTAINER (xf_type_notebook), xft_pause_page);
+
+  xf_pause_frame = gtk_frame_new (NULL);
+  gtk_widget_show (xf_pause_frame);
+  gtk_box_pack_start (GTK_BOX (xft_pause_page), xf_pause_frame, FALSE, FALSE, 0);
+
+  xf_pause_table = gtk_table_new (1, 2, FALSE);
+  gtk_widget_show (xf_pause_table);
+  gtk_container_add (GTK_CONTAINER (xf_pause_frame), xf_pause_table);
+  gtk_container_set_border_width (GTK_CONTAINER (xf_pause_table), 5);
+  gtk_table_set_row_spacings (GTK_TABLE (xf_pause_table), 2);
+  gtk_table_set_col_spacings (GTK_TABLE (xf_pause_table), 5);
+
+  pause_length_hbox = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (pause_length_hbox);
+  gtk_table_attach (GTK_TABLE (xf_pause_table), pause_length_hbox, 0, 1, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  pause_length_label = gtk_label_new ("Length (ms):");
+  gtk_widget_show (pause_length_label);
+  gtk_box_pack_start (GTK_BOX (pause_length_hbox), pause_length_label, FALSE, FALSE, 0);
+
+  pause_length_spin_adj = gtk_adjustment_new (1000, 0, 60000, 100, 1000, 10);
+  pause_length_spin = gtk_spin_button_new (GTK_ADJUSTMENT (pause_length_spin_adj), 0, 0);
+  gtk_widget_show (pause_length_spin);
+  gtk_table_attach (GTK_TABLE (xf_pause_table), pause_length_spin, 1, 2, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, pause_length_spin, "Specify the length of the silence to be inserted between the tracks.\nDefault: 2000", NULL);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (pause_length_spin), TRUE);
+
+  label14 = gtk_label_new ("Pause");
+  gtk_widget_show (label14);
+  gtk_frame_set_label_widget (GTK_FRAME (xf_pause_frame), label14);
+
+  xft_pause_label = gtk_label_new ("Pause");
+  gtk_widget_show (xft_pause_label);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (xf_type_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (xf_type_notebook), 3), xft_pause_label);
+  gtk_label_set_justify (GTK_LABEL (xft_pause_label), GTK_JUSTIFY_CENTER);
+
+  xft_simplexf_page = gtk_vbox_new (FALSE, 5);
+  gtk_widget_show (xft_simplexf_page);
+  gtk_container_add (GTK_CONTAINER (xf_type_notebook), xft_simplexf_page);
+
+  xf_simple_frame = gtk_frame_new (NULL);
+  gtk_widget_show (xf_simple_frame);
+  gtk_box_pack_start (GTK_BOX (xft_simplexf_page), xf_simple_frame, FALSE, FALSE, 0);
+
+  xf_simple_table = gtk_table_new (1, 2, FALSE);
+  gtk_widget_show (xf_simple_table);
+  gtk_container_add (GTK_CONTAINER (xf_simple_frame), xf_simple_table);
+  gtk_container_set_border_width (GTK_CONTAINER (xf_simple_table), 5);
+  gtk_table_set_row_spacings (GTK_TABLE (xf_simple_table), 2);
+  gtk_table_set_col_spacings (GTK_TABLE (xf_simple_table), 5);
+
+  simple_length_hbox = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (simple_length_hbox);
+  gtk_table_attach (GTK_TABLE (xf_simple_table), simple_length_hbox, 0, 1, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  simple_length_label = gtk_label_new ("Length (ms):");
+  gtk_widget_show (simple_length_label);
+  gtk_box_pack_start (GTK_BOX (simple_length_hbox), simple_length_label, FALSE, FALSE, 0);
+
+  simple_length_spin_adj = gtk_adjustment_new (1500, 0, 60000, 100, 1000, 10);
+  simple_length_spin = gtk_spin_button_new (GTK_ADJUSTMENT (simple_length_spin_adj), 0, 0);
+  gtk_widget_show (simple_length_spin);
+  gtk_table_attach (GTK_TABLE (xf_simple_table), simple_length_spin, 1, 2, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, simple_length_spin, "Specify the length of the crosssfade.\nDefault: depends on songchange type", NULL);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (simple_length_spin), TRUE);
+
+  label15 = gtk_label_new ("Crossfade");
+  gtk_widget_show (label15);
+  gtk_frame_set_label_widget (GTK_FRAME (xf_simple_frame), label15);
+
+  xft_simplexf_label = gtk_label_new ("Simple XF");
+  gtk_widget_show (xft_simplexf_label);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (xf_type_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (xf_type_notebook), 4), xft_simplexf_label);
+  gtk_label_set_justify (GTK_LABEL (xft_simplexf_label), GTK_JUSTIFY_CENTER);
+
+  xft_advancedxf_page = gtk_vbox_new (FALSE, 5);
+  gtk_widget_show (xft_advancedxf_page);
+  gtk_container_add (GTK_CONTAINER (xf_type_notebook), xft_advancedxf_page);
+
+  xf_fadeout_frame = gtk_frame_new (NULL);
+  gtk_widget_show (xf_fadeout_frame);
+  gtk_box_pack_start (GTK_BOX (xft_advancedxf_page), xf_fadeout_frame, FALSE, FALSE, 0);
+
+  xf_fadeout_table = gtk_table_new (3, 2, FALSE);
+  gtk_widget_show (xf_fadeout_table);
+  gtk_container_add (GTK_CONTAINER (xf_fadeout_frame), xf_fadeout_table);
+  gtk_container_set_border_width (GTK_CONTAINER (xf_fadeout_table), 5);
+  gtk_table_set_row_spacings (GTK_TABLE (xf_fadeout_table), 2);
+  gtk_table_set_col_spacings (GTK_TABLE (xf_fadeout_table), 5);
+
+  fadeout_length_hbox = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (fadeout_length_hbox);
+  gtk_table_attach (GTK_TABLE (xf_fadeout_table), fadeout_length_hbox, 0, 1, 1, 2,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  fadeout_length_label = gtk_label_new ("Length (ms):");
+  gtk_widget_show (fadeout_length_label);
+  gtk_box_pack_start (GTK_BOX (fadeout_length_hbox), fadeout_length_label, FALSE, FALSE, 0);
+
+  fadeout_length_spin_adj = gtk_adjustment_new (1000, 0, 60000, 100, 1000, 10);
+  fadeout_length_spin = gtk_spin_button_new (GTK_ADJUSTMENT (fadeout_length_spin_adj), 0, 0);
+  gtk_widget_show (fadeout_length_spin);
+  gtk_table_attach (GTK_TABLE (xf_fadeout_table), fadeout_length_spin, 1, 2, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, fadeout_length_spin, "Set the duration for the fadeout of the previous song.", NULL);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (fadeout_length_spin), TRUE);
+
+  fadeout_volume_hbox = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (fadeout_volume_hbox);
+  gtk_table_attach (GTK_TABLE (xf_fadeout_table), fadeout_volume_hbox, 0, 1, 2, 3,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  fadeout_volume_label = gtk_label_new ("End volume (%):");
+  gtk_widget_show (fadeout_volume_label);
+  gtk_box_pack_start (GTK_BOX (fadeout_volume_hbox), fadeout_volume_label, FALSE, FALSE, 0);
+
+  fadeout_volume_spin_adj = gtk_adjustment_new (0, 0, 100, 1, 10, 10);
+  fadeout_volume_spin = gtk_spin_button_new (GTK_ADJUSTMENT (fadeout_volume_spin_adj), 0, 0);
+  gtk_widget_show (fadeout_volume_spin);
+  gtk_table_attach (GTK_TABLE (xf_fadeout_table), fadeout_volume_spin, 1, 2, 2, 3,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, fadeout_volume_spin, "Set the end volume. XMMS-crossfade will fade from 100% to this volume during the time specified above.\nDefault: 0", NULL);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (fadeout_volume_spin), TRUE);
+
+  fadeout_options_hbox = gtk_hbox_new (FALSE, 5);
+  gtk_widget_show (fadeout_options_hbox);
+  gtk_table_attach (GTK_TABLE (xf_fadeout_table), fadeout_options_hbox, 1, 2, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  fadeout_enable_check = gtk_check_button_new_with_mnemonic ("Enable");
+  gtk_widget_show (fadeout_enable_check);
+  gtk_box_pack_start (GTK_BOX (fadeout_options_hbox), fadeout_enable_check, FALSE, FALSE, 0);
+
+  label16 = gtk_label_new ("Fade out");
+  gtk_widget_show (label16);
+  gtk_frame_set_label_widget (GTK_FRAME (xf_fadeout_frame), label16);
+
+  xf_offset_frame = gtk_frame_new (NULL);
+  gtk_widget_show (xf_offset_frame);
+  gtk_box_pack_start (GTK_BOX (xft_advancedxf_page), xf_offset_frame, FALSE, FALSE, 0);
+
+  xf_offset_table = gtk_table_new (4, 1, FALSE);
+  gtk_widget_show (xf_offset_table);
+  gtk_container_add (GTK_CONTAINER (xf_offset_frame), xf_offset_table);
+  gtk_container_set_border_width (GTK_CONTAINER (xf_offset_table), 5);
+  gtk_table_set_row_spacings (GTK_TABLE (xf_offset_table), 2);
+  gtk_table_set_col_spacings (GTK_TABLE (xf_offset_table), 5);
+
+  xfofs_custom_hbox = gtk_hbox_new (FALSE, 5);
+  gtk_widget_show (xfofs_custom_hbox);
+  gtk_table_attach (GTK_TABLE (xf_offset_table), xfofs_custom_hbox, 0, 1, 3, 4,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  xfofs_custom_radiobutton = gtk_radio_button_new_with_mnemonic (NULL, "Custom (ms):");
+  gtk_widget_show (xfofs_custom_radiobutton);
+  gtk_box_pack_start (GTK_BOX (xfofs_custom_hbox), xfofs_custom_radiobutton, FALSE, FALSE, 0);
+  gtk_tooltips_set_tip (tooltips, xfofs_custom_radiobutton, "Set a custom offset.", NULL);
+  gtk_radio_button_set_group (GTK_RADIO_BUTTON (xfofs_custom_radiobutton), xfofs_custom_radiobutton_group);
+  xfofs_custom_radiobutton_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (xfofs_custom_radiobutton));
+
+  xfofs_custom_spin_adj = gtk_adjustment_new (-2000, -60000, 60000, 100, 1000, 10);
+  xfofs_custom_spin = gtk_spin_button_new (GTK_ADJUSTMENT (xfofs_custom_spin_adj), 0, 0);
+  gtk_widget_show (xfofs_custom_spin);
+  gtk_box_pack_start (GTK_BOX (xfofs_custom_hbox), xfofs_custom_spin, TRUE, TRUE, 0);
+  gtk_tooltips_set_tip (tooltips, xfofs_custom_spin, "Set how much the end of the previous and the beginning of the next song should overlap.\n* Negative values indicate that the next song should start before the previous has reached the end.\n* A value of 0 means that the songs are concatenated seamlessly.\n* Positive values will yield insert silence inbetween..", NULL);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (xfofs_custom_spin), TRUE);
+
+  xfofs_none_radiobutton = gtk_radio_button_new_with_mnemonic (NULL, "None (0 ms)");
+  gtk_widget_show (xfofs_none_radiobutton);
+  gtk_table_attach (GTK_TABLE (xf_offset_table), xfofs_none_radiobutton, 0, 1, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, xfofs_none_radiobutton, "Don't overlap the two songs. The next song will start immediatelly after the previous has ended.", NULL);
+  gtk_radio_button_set_group (GTK_RADIO_BUTTON (xfofs_none_radiobutton), xfofs_custom_radiobutton_group);
+  xfofs_custom_radiobutton_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (xfofs_none_radiobutton));
+
+  xfofs_lockout_radiobutton = gtk_radio_button_new_with_mnemonic (NULL, "Lock to fadeout length");
+  gtk_widget_show (xfofs_lockout_radiobutton);
+  gtk_table_attach (GTK_TABLE (xf_offset_table), xfofs_lockout_radiobutton, 0, 1, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, xfofs_lockout_radiobutton, "Overlap by the fadeout duration specified above.", NULL);
+  gtk_radio_button_set_group (GTK_RADIO_BUTTON (xfofs_lockout_radiobutton), xfofs_custom_radiobutton_group);
+  xfofs_custom_radiobutton_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (xfofs_lockout_radiobutton));
+
+  xfofs_lockin_radiobutton = gtk_radio_button_new_with_mnemonic (NULL, "Lock to fadein length");
+  gtk_widget_show (xfofs_lockin_radiobutton);
+  gtk_table_attach (GTK_TABLE (xf_offset_table), xfofs_lockin_radiobutton, 0, 1, 2, 3,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, xfofs_lockin_radiobutton, "Overlap by the fadein duration specified below..", NULL);
+  gtk_radio_button_set_group (GTK_RADIO_BUTTON (xfofs_lockin_radiobutton), xfofs_custom_radiobutton_group);
+  xfofs_custom_radiobutton_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (xfofs_lockin_radiobutton));
+
+  label17 = gtk_label_new ("Offset");
+  gtk_widget_show (label17);
+  gtk_frame_set_label_widget (GTK_FRAME (xf_offset_frame), label17);
+
+  xf_fadein_frame = gtk_frame_new (NULL);
+  gtk_widget_show (xf_fadein_frame);
+  gtk_box_pack_start (GTK_BOX (xft_advancedxf_page), xf_fadein_frame, FALSE, FALSE, 0);
+
+  xf_fadein_table = gtk_table_new (3, 2, FALSE);
+  gtk_widget_show (xf_fadein_table);
+  gtk_container_add (GTK_CONTAINER (xf_fadein_frame), xf_fadein_table);
+  gtk_container_set_border_width (GTK_CONTAINER (xf_fadein_table), 5);
+  gtk_table_set_row_spacings (GTK_TABLE (xf_fadein_table), 2);
+  gtk_table_set_col_spacings (GTK_TABLE (xf_fadein_table), 5);
+
+  fadein_length_hbox = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (fadein_length_hbox);
+  gtk_table_attach (GTK_TABLE (xf_fadein_table), fadein_length_hbox, 0, 1, 1, 2,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  fadein_length_label = gtk_label_new ("Length (ms):");
+  gtk_widget_show (fadein_length_label);
+  gtk_box_pack_start (GTK_BOX (fadein_length_hbox), fadein_length_label, FALSE, FALSE, 0);
+
+  fadein_volume_hbox = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (fadein_volume_hbox);
+  gtk_table_attach (GTK_TABLE (xf_fadein_table), fadein_volume_hbox, 0, 1, 2, 3,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  fadein_volume_label = gtk_label_new ("Start volume (%):");
+  gtk_widget_show (fadein_volume_label);
+  gtk_box_pack_start (GTK_BOX (fadein_volume_hbox), fadein_volume_label, FALSE, FALSE, 0);
+
+  fadein_length_spin_adj = gtk_adjustment_new (1000, 0, 60000, 100, 1000, 10);
+  fadein_length_spin = gtk_spin_button_new (GTK_ADJUSTMENT (fadein_length_spin_adj), 0, 0);
+  gtk_widget_show (fadein_length_spin);
+  gtk_table_attach (GTK_TABLE (xf_fadein_table), fadein_length_spin, 1, 2, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, fadein_length_spin, "Set the duration for the fadein of the next song.", NULL);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (fadein_length_spin), TRUE);
+
+  fadein_enable_check = gtk_check_button_new_with_mnemonic (" Enable");
+  gtk_widget_show (fadein_enable_check);
+  gtk_table_attach (GTK_TABLE (xf_fadein_table), fadein_enable_check, 1, 2, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+
+  fadein_lock_check = gtk_check_button_new_with_mnemonic ("Lock to Fade-out");
+  gtk_widget_show (fadein_lock_check);
+  gtk_table_attach (GTK_TABLE (xf_fadein_table), fadein_lock_check, 0, 1, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, fadein_lock_check, "Use the same settings as fade-out.", NULL);
+
+  fadein_volume_spin_adj = gtk_adjustment_new (0, 0, 100, 1, 10, 10);
+  fadein_volume_spin = gtk_spin_button_new (GTK_ADJUSTMENT (fadein_volume_spin_adj), 0, 0);
+  gtk_widget_show (fadein_volume_spin);
+  gtk_table_attach (GTK_TABLE (xf_fadein_table), fadein_volume_spin, 1, 2, 2, 3,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, fadein_volume_spin, "Set the start volume. XMMS-crossfade will fade from this volume to 100% during the time specified above.\nDefault: 0", NULL);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (fadein_volume_spin), TRUE);
+
+  label18 = gtk_label_new ("Fade in");
+  gtk_widget_show (label18);
+  gtk_frame_set_label_widget (GTK_FRAME (xf_fadein_frame), label18);
+
+  xft_advancedxf_label = gtk_label_new ("Advanced XF");
+  gtk_widget_show (xft_advancedxf_label);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (xf_type_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (xf_type_notebook), 5), xft_advancedxf_label);
+  gtk_label_set_justify (GTK_LABEL (xft_advancedxf_label), GTK_JUSTIFY_CENTER);
+
+  xft_fadein_page = gtk_vbox_new (FALSE, 0);
+  gtk_widget_show (xft_fadein_page);
+  gtk_container_add (GTK_CONTAINER (xf_type_notebook), xft_fadein_page);
+
+  xftfi_fadein_frame = gtk_frame_new (NULL);
+  gtk_widget_show (xftfi_fadein_frame);
+  gtk_box_pack_start (GTK_BOX (xft_fadein_page), xftfi_fadein_frame, FALSE, FALSE, 0);
+
+  xftfi_fadein_table = gtk_table_new (2, 2, FALSE);
+  gtk_widget_show (xftfi_fadein_table);
+  gtk_container_add (GTK_CONTAINER (xftfi_fadein_frame), xftfi_fadein_table);
+  gtk_container_set_border_width (GTK_CONTAINER (xftfi_fadein_table), 5);
+  gtk_table_set_row_spacings (GTK_TABLE (xftfi_fadein_table), 2);
+  gtk_table_set_col_spacings (GTK_TABLE (xftfi_fadein_table), 5);
+
+  xftfi_length_hbox = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (xftfi_length_hbox);
+  gtk_table_attach (GTK_TABLE (xftfi_fadein_table), xftfi_length_hbox, 0, 1, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  xftfi_length_label = gtk_label_new ("Length (ms):");
+  gtk_widget_show (xftfi_length_label);
+  gtk_box_pack_start (GTK_BOX (xftfi_length_hbox), xftfi_length_label, FALSE, FALSE, 0);
+
+  xftfi_volume_hbox = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (xftfi_volume_hbox);
+  gtk_table_attach (GTK_TABLE (xftfi_fadein_table), xftfi_volume_hbox, 0, 1, 1, 2,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  xftfi_volume_label = gtk_label_new ("Start volume (%):");
+  gtk_widget_show (xftfi_volume_label);
+  gtk_box_pack_start (GTK_BOX (xftfi_volume_hbox), xftfi_volume_label, FALSE, FALSE, 0);
+
+  xftfi_length_spin_adj = gtk_adjustment_new (1000, 0, 60000, 10, 100, 10);
+  xftfi_length_spin = gtk_spin_button_new (GTK_ADJUSTMENT (xftfi_length_spin_adj), 0, 0);
+  gtk_widget_show (xftfi_length_spin);
+  gtk_table_attach (GTK_TABLE (xftfi_fadein_table), xftfi_length_spin, 1, 2, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, xftfi_length_spin, "Set the duration for the fadein when starting playback.", NULL);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (xftfi_length_spin), TRUE);
+
+  xftfi_volume_spin_adj = gtk_adjustment_new (0, 0, 100, 1, 10, 10);
+  xftfi_volume_spin = gtk_spin_button_new (GTK_ADJUSTMENT (xftfi_volume_spin_adj), 0, 0);
+  gtk_widget_show (xftfi_volume_spin);
+  gtk_table_attach (GTK_TABLE (xftfi_fadein_table), xftfi_volume_spin, 1, 2, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, xftfi_volume_spin, "Set the start volume. XMMS-crossfade will fade from this volume to 100% during the time specified above.\nDefault: 0", NULL);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (xftfi_volume_spin), TRUE);
+
+  label19 = gtk_label_new ("Fade in");
+  gtk_widget_show (label19);
+  gtk_frame_set_label_widget (GTK_FRAME (xftfi_fadein_frame), label19);
+
+  xft_fadein_label = gtk_label_new ("Fade in");
+  gtk_widget_show (xft_fadein_label);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (xf_type_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (xf_type_notebook), 6), xft_fadein_label);
+  gtk_label_set_justify (GTK_LABEL (xft_fadein_label), GTK_JUSTIFY_CENTER);
+
+  xft_fadeout_page = gtk_vbox_new (FALSE, 5);
+  gtk_widget_show (xft_fadeout_page);
+  gtk_container_add (GTK_CONTAINER (xf_type_notebook), xft_fadeout_page);
+
+  xftfo_fadeout_frame = gtk_frame_new (NULL);
+  gtk_widget_show (xftfo_fadeout_frame);
+  gtk_box_pack_start (GTK_BOX (xft_fadeout_page), xftfo_fadeout_frame, FALSE, FALSE, 0);
+
+  xftfo_fadeout_table = gtk_table_new (2, 2, FALSE);
+  gtk_widget_show (xftfo_fadeout_table);
+  gtk_container_add (GTK_CONTAINER (xftfo_fadeout_frame), xftfo_fadeout_table);
+  gtk_container_set_border_width (GTK_CONTAINER (xftfo_fadeout_table), 5);
+  gtk_table_set_row_spacings (GTK_TABLE (xftfo_fadeout_table), 2);
+  gtk_table_set_col_spacings (GTK_TABLE (xftfo_fadeout_table), 5);
+
+  xftfo_length_hbox = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (xftfo_length_hbox);
+  gtk_table_attach (GTK_TABLE (xftfo_fadeout_table), xftfo_length_hbox, 0, 1, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  xftfo_length_label = gtk_label_new ("Length (ms):");
+  gtk_widget_show (xftfo_length_label);
+  gtk_box_pack_start (GTK_BOX (xftfo_length_hbox), xftfo_length_label, FALSE, FALSE, 0);
+
+  xftfo_length_spin_adj = gtk_adjustment_new (500, 0, 60000, 10, 100, 10);
+  xftfo_length_spin = gtk_spin_button_new (GTK_ADJUSTMENT (xftfo_length_spin_adj), 0, 0);
+  gtk_widget_show (xftfo_length_spin);
+  gtk_table_attach (GTK_TABLE (xftfo_fadeout_table), xftfo_length_spin, 1, 2, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, xftfo_length_spin, "Set the duration for the fadeout of the last song.", NULL);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (xftfo_length_spin), TRUE);
+
+  xftfo_volume_hbox = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (xftfo_volume_hbox);
+  gtk_table_attach (GTK_TABLE (xftfo_fadeout_table), xftfo_volume_hbox, 0, 1, 1, 2,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  xftfo_volume_label = gtk_label_new ("End volume (%):");
+  gtk_widget_show (xftfo_volume_label);
+  gtk_box_pack_start (GTK_BOX (xftfo_volume_hbox), xftfo_volume_label, FALSE, FALSE, 0);
+
+  xftfo_volume_spin_adj = gtk_adjustment_new (0, 0, 100, 1, 10, 10);
+  xftfo_volume_spin = gtk_spin_button_new (GTK_ADJUSTMENT (xftfo_volume_spin_adj), 0, 0);
+  gtk_widget_show (xftfo_volume_spin);
+  gtk_table_attach (GTK_TABLE (xftfo_fadeout_table), xftfo_volume_spin, 1, 2, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, xftfo_volume_spin, "Set the end volume. XMMS-crossfade will fade from 100% to this volume during the time specified above.\nDefault: 0", NULL);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (xftfo_volume_spin), TRUE);
+
+  label20 = gtk_label_new ("Fade out");
+  gtk_widget_show (label20);
+  gtk_frame_set_label_widget (GTK_FRAME (xftfo_fadeout_frame), label20);
+
+  xftfo_silence_frame = gtk_frame_new (NULL);
+  gtk_widget_show (xftfo_silence_frame);
+  gtk_box_pack_start (GTK_BOX (xft_fadeout_page), xftfo_silence_frame, FALSE, FALSE, 0);
+
+  xftfo_silence_table = gtk_table_new (1, 2, FALSE);
+  gtk_widget_show (xftfo_silence_table);
+  gtk_container_add (GTK_CONTAINER (xftfo_silence_frame), xftfo_silence_table);
+  gtk_container_set_border_width (GTK_CONTAINER (xftfo_silence_table), 5);
+  gtk_table_set_row_spacings (GTK_TABLE (xftfo_silence_table), 2);
+  gtk_table_set_col_spacings (GTK_TABLE (xftfo_silence_table), 5);
+
+  xftfo_silence_hbox = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (xftfo_silence_hbox);
+  gtk_table_attach (GTK_TABLE (xftfo_silence_table), xftfo_silence_hbox, 0, 1, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  xftfo_silence_label = gtk_label_new ("Length (ms):");
+  gtk_widget_show (xftfo_silence_label);
+  gtk_box_pack_start (GTK_BOX (xftfo_silence_hbox), xftfo_silence_label, FALSE, FALSE, 0);
+
+  xftfo_silence_spin_adj = gtk_adjustment_new (100, 0, 60000, 10, 100, 10);
+  xftfo_silence_spin = gtk_spin_button_new (GTK_ADJUSTMENT (xftfo_silence_spin_adj), 0, 0);
+  gtk_widget_show (xftfo_silence_spin);
+  gtk_table_attach (GTK_TABLE (xftfo_silence_table), xftfo_silence_spin, 1, 2, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, xftfo_silence_spin, "Set how much additional silence should be played after the end of the last song. This way, you can avoid the clicks some soundcards produce when being shut down during playback.\nDefault: 500", NULL);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (xftfo_silence_spin), TRUE);
+
+  label21 = gtk_label_new ("Additional silence");
+  gtk_widget_show (label21);
+  gtk_frame_set_label_widget (GTK_FRAME (xftfo_silence_frame), label21);
+
+  xft_fadeout_label = gtk_label_new ("Fade out");
+  gtk_widget_show (xft_fadeout_label);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (xf_type_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (xf_type_notebook), 7), xft_fadeout_label);
+  gtk_label_set_justify (GTK_LABEL (xft_fadeout_label), GTK_JUSTIFY_CENTER);
+
+  empty_notebook_page = gtk_vbox_new (FALSE, 0);
+  gtk_widget_show (empty_notebook_page);
+  gtk_container_add (GTK_CONTAINER (xf_type_notebook), empty_notebook_page);
+
+  xft_pause_none_label = gtk_label_new ("None");
+  gtk_widget_show (xft_pause_none_label);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (xf_type_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (xf_type_notebook), 8), xft_pause_none_label);
+  gtk_label_set_justify (GTK_LABEL (xft_pause_none_label), GTK_JUSTIFY_CENTER);
+
+  xft_pause_adv_page = gtk_vbox_new (FALSE, 5);
+  gtk_widget_show (xft_pause_adv_page);
+  gtk_container_add (GTK_CONTAINER (xf_type_notebook), xft_pause_adv_page);
+
+  xft_fadeoutin_frame = gtk_frame_new (NULL);
+  gtk_widget_show (xft_fadeoutin_frame);
+  gtk_box_pack_start (GTK_BOX (xft_pause_adv_page), xft_fadeoutin_frame, FALSE, FALSE, 0);
+
+  xft_fadeoutin_table = gtk_table_new (3, 2, FALSE);
+  gtk_widget_show (xft_fadeoutin_table);
+  gtk_container_add (GTK_CONTAINER (xft_fadeoutin_frame), xft_fadeoutin_table);
+  gtk_container_set_border_width (GTK_CONTAINER (xft_fadeoutin_table), 5);
+  gtk_table_set_row_spacings (GTK_TABLE (xft_fadeoutin_table), 2);
+  gtk_table_set_col_spacings (GTK_TABLE (xft_fadeoutin_table), 5);
+
+  xftfoi_fadeout_spin_adj = gtk_adjustment_new (100, 0, 60000, 10, 100, 10);
+  xftfoi_fadeout_spin = gtk_spin_button_new (GTK_ADJUSTMENT (xftfoi_fadeout_spin_adj), 0, 0);
+  gtk_widget_show (xftfoi_fadeout_spin);
+  gtk_table_attach (GTK_TABLE (xft_fadeoutin_table), xftfoi_fadeout_spin, 1, 2, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, xftfoi_fadeout_spin, "Set the duration for the fadeout when pausing.\nDefault: 100\n", NULL);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (xftfoi_fadeout_spin), TRUE);
+
+  xftfoi_silence_spin_adj = gtk_adjustment_new (100, 0, 60000, 10, 100, 10);
+  xftfoi_silence_spin = gtk_spin_button_new (GTK_ADJUSTMENT (xftfoi_silence_spin_adj), 0, 0);
+  gtk_widget_show (xftfoi_silence_spin);
+  gtk_table_attach (GTK_TABLE (xft_fadeoutin_table), xftfoi_silence_spin, 1, 2, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, xftfoi_silence_spin, "Set how much additional silence should be played after pausing. This way, you can avoid the clicks some soundcards produce when entering pause.\nDefault: 100", NULL);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (xftfoi_silence_spin), TRUE);
+
+  xftfoi_fadein_spin_adj = gtk_adjustment_new (100, 0, 60000, 10, 100, 10);
+  xftfoi_fadein_spin = gtk_spin_button_new (GTK_ADJUSTMENT (xftfoi_fadein_spin_adj), 0, 0);
+  gtk_widget_show (xftfoi_fadein_spin);
+  gtk_table_attach (GTK_TABLE (xft_fadeoutin_table), xftfoi_fadein_spin, 1, 2, 2, 3,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, xftfoi_fadein_spin, "Set the duration for the fadein when unpausing.\nDefault: 100", NULL);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (xftfoi_fadein_spin), TRUE);
+
+  xftfoi_fadein_hbox = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (xftfoi_fadein_hbox);
+  gtk_table_attach (GTK_TABLE (xft_fadeoutin_table), xftfoi_fadein_hbox, 0, 1, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+
+  xftfoi_fadein_label = gtk_label_new ("Fade out (ms):");
+  gtk_widget_show (xftfoi_fadein_label);
+  gtk_box_pack_start (GTK_BOX (xftfoi_fadein_hbox), xftfoi_fadein_label, FALSE, FALSE, 0);
+
+  xftfoi_silence_hbox = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (xftfoi_silence_hbox);
+  gtk_table_attach (GTK_TABLE (xft_fadeoutin_table), xftfoi_silence_hbox, 0, 1, 1, 2,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+
+  xftfoi_silence_label = gtk_label_new ("Silence (ms):");
+  gtk_widget_show (xftfoi_silence_label);
+  gtk_box_pack_start (GTK_BOX (xftfoi_silence_hbox), xftfoi_silence_label, FALSE, FALSE, 0);
+
+  xftfoi_fadeout_hbox = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (xftfoi_fadeout_hbox);
+  gtk_table_attach (GTK_TABLE (xft_fadeoutin_table), xftfoi_fadeout_hbox, 0, 1, 2, 3,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+
+  xftfoi_fadeout_label = gtk_label_new ("Fade in (ms):");
+  gtk_widget_show (xftfoi_fadeout_label);
+  gtk_box_pack_start (GTK_BOX (xftfoi_fadeout_hbox), xftfoi_fadeout_label, FALSE, FALSE, 0);
+
+  label22 = gtk_label_new ("Fade out / Fade in");
+  gtk_widget_show (label22);
+  gtk_frame_set_label_widget (GTK_FRAME (xft_fadeoutin_frame), label22);
+
+  xft_pause_adv_label = gtk_label_new ("Fade out / Fade in");
+  gtk_widget_show (xft_pause_adv_label);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (xf_type_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (xf_type_notebook), 9), xft_pause_adv_label);
+  gtk_label_set_justify (GTK_LABEL (xft_pause_adv_label), GTK_JUSTIFY_CENTER);
+
+  config_crossfade_label = gtk_label_new ("Crossfader");
+  gtk_widget_show (config_crossfade_label);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (config_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (config_notebook), 2), config_crossfade_label);
+  gtk_label_set_justify (GTK_LABEL (config_crossfade_label), GTK_JUSTIFY_CENTER);
+
+  config_gapkiller_page = gtk_vbox_new (FALSE, 5);
+  gtk_widget_show (config_gapkiller_page);
+  gtk_container_add (GTK_CONTAINER (config_notebook), config_gapkiller_page);
+  gtk_container_set_border_width (GTK_CONTAINER (config_gapkiller_page), 5);
+
+  gap_leading_frame = gtk_frame_new (NULL);
+  gtk_widget_show (gap_leading_frame);
+  gtk_box_pack_start (GTK_BOX (config_gapkiller_page), gap_leading_frame, FALSE, TRUE, 0);
+
+  gap_leading_table = gtk_table_new (3, 2, FALSE);
+  gtk_widget_show (gap_leading_table);
+  gtk_container_add (GTK_CONTAINER (gap_leading_frame), gap_leading_table);
+  gtk_container_set_border_width (GTK_CONTAINER (gap_leading_table), 5);
+  gtk_table_set_row_spacings (GTK_TABLE (gap_leading_table), 2);
+  gtk_table_set_col_spacings (GTK_TABLE (gap_leading_table), 5);
+
+  lgap_length_spin_adj = gtk_adjustment_new (500, 0, 60000, 10, 100, 10);
+  lgap_length_spin = gtk_spin_button_new (GTK_ADJUSTMENT (lgap_length_spin_adj), 0, 0);
+  gtk_widget_show (lgap_length_spin);
+  gtk_table_attach (GTK_TABLE (gap_leading_table), lgap_length_spin, 1, 2, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, lgap_length_spin, "Set the maximum length for gaps at the beginning of a stream.\nDefault: 500", NULL);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (lgap_length_spin), TRUE);
+
+  lgap_level_spin_adj = gtk_adjustment_new (512, 0, 32767, 16, 256, 10);
+  lgap_level_spin = gtk_spin_button_new (GTK_ADJUSTMENT (lgap_level_spin_adj), 0, 0);
+  gtk_widget_show (lgap_level_spin);
+  gtk_table_attach (GTK_TABLE (gap_leading_table), lgap_level_spin, 1, 2, 2, 3,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, lgap_level_spin, "Set the maximum volume for gaps at the beginning of a stream. All samples below this value are considered as silent.\nDefault: 512", NULL);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (lgap_level_spin), TRUE);
+
+  lgap_length_hbox = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (lgap_length_hbox);
+  gtk_table_attach (GTK_TABLE (gap_leading_table), lgap_length_hbox, 0, 1, 1, 2,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+
+  lgap_length_label = gtk_label_new ("Max. length (ms):");
+  gtk_widget_show (lgap_length_label);
+  gtk_box_pack_start (GTK_BOX (lgap_length_hbox), lgap_length_label, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (lgap_length_label), GTK_JUSTIFY_CENTER);
+
+  lgap_level_hbox = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (lgap_level_hbox);
+  gtk_table_attach (GTK_TABLE (gap_leading_table), lgap_level_hbox, 0, 1, 2, 3,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+
+  lgap_level_label = gtk_label_new ("Max. level (16bit sample):");
+  gtk_widget_show (lgap_level_label);
+  gtk_box_pack_start (GTK_BOX (lgap_level_hbox), lgap_level_label, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (lgap_level_label), GTK_JUSTIFY_CENTER);
+
+  lgap_enable_check = gtk_check_button_new_with_mnemonic ("Enable");
+  gtk_widget_show (lgap_enable_check);
+  gtk_table_attach (GTK_TABLE (gap_leading_table), lgap_enable_check, 1, 2, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+
+  label23 = gtk_label_new ("Leading gap killer");
+  gtk_widget_show (label23);
+  gtk_frame_set_label_widget (GTK_FRAME (gap_leading_frame), label23);
+
+  gap_trailing_frame = gtk_frame_new (NULL);
+  gtk_widget_show (gap_trailing_frame);
+  gtk_box_pack_start (GTK_BOX (config_gapkiller_page), gap_trailing_frame, FALSE, TRUE, 0);
+
+  gap_trailing_table = gtk_table_new (3, 2, FALSE);
+  gtk_widget_show (gap_trailing_table);
+  gtk_container_add (GTK_CONTAINER (gap_trailing_frame), gap_trailing_table);
+  gtk_container_set_border_width (GTK_CONTAINER (gap_trailing_table), 5);
+  gtk_table_set_row_spacings (GTK_TABLE (gap_trailing_table), 2);
+  gtk_table_set_col_spacings (GTK_TABLE (gap_trailing_table), 5);
+
+  tgap_length_hbox = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (tgap_length_hbox);
+  gtk_table_attach (GTK_TABLE (gap_trailing_table), tgap_length_hbox, 0, 1, 1, 2,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  tgap_length_label = gtk_label_new ("Max. length (ms):");
+  gtk_widget_show (tgap_length_label);
+  gtk_box_pack_start (GTK_BOX (tgap_length_hbox), tgap_length_label, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (tgap_length_label), GTK_JUSTIFY_CENTER);
+
+  tgap_level_hbox = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (tgap_level_hbox);
+  gtk_table_attach (GTK_TABLE (gap_trailing_table), tgap_level_hbox, 0, 1, 2, 3,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  tgap_level_label = gtk_label_new ("Max. level (16bit sample):");
+  gtk_widget_show (tgap_level_label);
+  gtk_box_pack_start (GTK_BOX (tgap_level_hbox), tgap_level_label, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (tgap_level_label), GTK_JUSTIFY_CENTER);
+
+  tgap_length_spin_adj = gtk_adjustment_new (500, 0, 60000, 10, 100, 10);
+  tgap_length_spin = gtk_spin_button_new (GTK_ADJUSTMENT (tgap_length_spin_adj), 0, 0);
+  gtk_widget_show (tgap_length_spin);
+  gtk_table_attach (GTK_TABLE (gap_trailing_table), tgap_length_spin, 1, 2, 1, 2,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, tgap_length_spin, "Set the maximum length for gaps at the end of a stream.\nDefault: 500", NULL);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (tgap_length_spin), TRUE);
+
+  tgap_level_spin_adj = gtk_adjustment_new (512, 0, 32767, 1, 16, 10);
+  tgap_level_spin = gtk_spin_button_new (GTK_ADJUSTMENT (tgap_level_spin_adj), 0, 0);
+  gtk_widget_show (tgap_level_spin);
+  gtk_table_attach (GTK_TABLE (gap_trailing_table), tgap_level_spin, 1, 2, 2, 3,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, tgap_level_spin, "Set the maximum volume for gaps at the end of a stream. All samples below this value are considered as silent.\nDefault: 512", NULL);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (tgap_level_spin), TRUE);
+
+  tgap_lock_check = gtk_check_button_new_with_mnemonic ("Lock to Leading");
+  gtk_widget_show (tgap_lock_check);
+  gtk_table_attach (GTK_TABLE (gap_trailing_table), tgap_lock_check, 0, 1, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+  gtk_tooltips_set_tip (tooltips, tgap_lock_check, "Use the same settings as above.", NULL);
+
+  tgap_enable_check = gtk_check_button_new_with_mnemonic ("Enable");
+  gtk_widget_show (tgap_enable_check);
+  gtk_table_attach (GTK_TABLE (gap_trailing_table), tgap_enable_check, 1, 2, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+
+  label24 = gtk_label_new ("Trailing gap killer");
+  gtk_widget_show (label24);
+  gtk_frame_set_label_widget (GTK_FRAME (gap_trailing_frame), label24);
+
+  gap_advanced_frame = gtk_frame_new (NULL);
+  gtk_widget_show (gap_advanced_frame);
+  gtk_box_pack_start (GTK_BOX (config_gapkiller_page), gap_advanced_frame, FALSE, FALSE, 0);
+
+  gap_advanced_vbox = gtk_vbox_new (FALSE, 0);
+  gtk_widget_show (gap_advanced_vbox);
+  gtk_container_add (GTK_CONTAINER (gap_advanced_frame), gap_advanced_vbox);
+  gtk_container_set_border_width (GTK_CONTAINER (gap_advanced_vbox), 5);
+
+  gadv_crossing_check = gtk_check_button_new_with_mnemonic ("Skip to next zero crossing");
+  gtk_widget_show (gadv_crossing_check);
+  gtk_box_pack_start (GTK_BOX (gap_advanced_vbox), gadv_crossing_check, FALSE, FALSE, 0);
+  gtk_tooltips_set_tip (tooltips, gadv_crossing_check, "If enabled, XMMS-crossfade will take additional care to avoid clicks with pre-faded (gapless) tracks. XMMS-crossfade will cut off the end of the previous song (the beginning of the next song) only at a zero-crossing of the sample values.\nDefault: On", NULL);
+
+  label25 = gtk_label_new ("Advanced");
+  gtk_widget_show (label25);
+  gtk_frame_set_label_widget (GTK_FRAME (gap_advanced_frame), label25);
+
+  config_gapkiller_label = gtk_label_new ("Gap Killer");
+  gtk_widget_show (config_gapkiller_label);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (config_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (config_notebook), 3), config_gapkiller_label);
+  gtk_label_set_justify (GTK_LABEL (config_gapkiller_label), GTK_JUSTIFY_CENTER);
+
+  config_misc_page = gtk_vbox_new (FALSE, 5);
+  gtk_widget_show (config_misc_page);
+  gtk_container_add (GTK_CONTAINER (config_notebook), config_misc_page);
+  gtk_container_set_border_width (GTK_CONTAINER (config_misc_page), 5);
+
+  misc_debug_frame = gtk_frame_new (NULL);
+  gtk_widget_show (misc_debug_frame);
+  gtk_box_pack_start (GTK_BOX (config_misc_page), misc_debug_frame, FALSE, FALSE, 0);
+
+  misc_debug_vbox = gtk_vbox_new (FALSE, 2);
+  gtk_widget_show (misc_debug_vbox);
+  gtk_container_add (GTK_CONTAINER (misc_debug_frame), misc_debug_vbox);
+  gtk_container_set_border_width (GTK_CONTAINER (misc_debug_vbox), 5);
+
+  debug_stderr_check = gtk_check_button_new_with_mnemonic ("Write debug output to <stderr>");
+  gtk_widget_show (debug_stderr_check);
+  gtk_box_pack_start (GTK_BOX (misc_debug_vbox), debug_stderr_check, FALSE, FALSE, 0);
+  gtk_tooltips_set_tip (tooltips, debug_stderr_check, "Monitors what is going on in XMMS-crossfade. If you think you found a bug in XMMS-crossfade, please enable this option and send me the output.\nNote that you should disable debug output if you start XMMS from within Netscape. Netscape will spam you with dialogs containing the debug output captured from <stderr>.\nDefault: Off", NULL);
+
+  debug_monitor_check = gtk_check_button_new_with_mnemonic ("Show Buffer Monitor");
+  gtk_widget_show (debug_monitor_check);
+  gtk_box_pack_start (GTK_BOX (misc_debug_vbox), debug_monitor_check, FALSE, FALSE, 0);
+  gtk_tooltips_set_tip (tooltips, debug_monitor_check, "Enables the Buffer Monitor. This is a small window which shows how much data is in the buffers. The top display belongs to the mixing buffer, the bottom shows how much data is being buffered by the output plugin.\nDefault: Off", NULL);
+
+  label26 = gtk_label_new ("Debug options");
+  gtk_widget_show (label26);
+  gtk_frame_set_label_widget (GTK_FRAME (misc_debug_frame), label26);
+
+  misc_mixopt_frame = gtk_frame_new (NULL);
+  gtk_widget_show (misc_mixopt_frame);
+  gtk_box_pack_start (GTK_BOX (config_misc_page), misc_mixopt_frame, FALSE, FALSE, 0);
+
+  misc_mixopt_vbox = gtk_vbox_new (FALSE, 2);
+  gtk_widget_show (misc_mixopt_vbox);
+  gtk_container_add (GTK_CONTAINER (misc_mixopt_frame), misc_mixopt_vbox);
+  gtk_container_set_border_width (GTK_CONTAINER (misc_mixopt_vbox), 5);
+
+  mixopt_enable_check = gtk_check_button_new_with_mnemonic ("Enable volume control");
+  gtk_widget_show (mixopt_enable_check);
+  gtk_box_pack_start (GTK_BOX (misc_mixopt_vbox), mixopt_enable_check, FALSE, FALSE, 0);
+  gtk_tooltips_set_tip (tooltips, mixopt_enable_check, "Enables/disables XMMS volume and balance controls.\nDefault: On", NULL);
+
+  mixopt_reverse_check = gtk_check_button_new_with_mnemonic ("Reverse balance");
+  gtk_widget_show (mixopt_reverse_check);
+  gtk_box_pack_start (GTK_BOX (misc_mixopt_vbox), mixopt_reverse_check, FALSE, FALSE, 0);
+  gtk_tooltips_set_tip (tooltips, mixopt_reverse_check, "Reverses left and right with the balance control.\nDefault: Off", NULL);
+
+  mixopt_software_check = gtk_check_button_new_with_mnemonic ("Software Mixer");
+  gtk_widget_show (mixopt_software_check);
+  gtk_box_pack_start (GTK_BOX (misc_mixopt_vbox), mixopt_software_check, FALSE, FALSE, 0);
+  gtk_tooltips_set_tip (tooltips, mixopt_software_check, "Enable software mixer. Usefull for output plugins without mixer support.\nDefault: Off", NULL);
+
+  label27 = gtk_label_new ("Volume control options");
+  gtk_widget_show (label27);
+  gtk_frame_set_label_widget (GTK_FRAME (misc_mixopt_frame), label27);
+
+  misc_other_frame = gtk_frame_new (NULL);
+  gtk_widget_show (misc_other_frame);
+  gtk_box_pack_start (GTK_BOX (config_misc_page), misc_other_frame, FALSE, TRUE, 0);
+
+  misc_other_vbox = gtk_vbox_new (FALSE, 2);
+  gtk_widget_show (misc_other_vbox);
+  gtk_container_add (GTK_CONTAINER (misc_other_frame), misc_other_vbox);
+  gtk_container_set_border_width (GTK_CONTAINER (misc_other_vbox), 5);
+
+  moth_songchange_hbox = gtk_hbox_new (FALSE, 5);
+  gtk_widget_show (moth_songchange_hbox);
+  gtk_box_pack_start (GTK_BOX (misc_other_vbox), moth_songchange_hbox, TRUE, TRUE, 0);
+
+  moth_songchange_label = gtk_label_new ("Songchange timeout (ms):");
+  gtk_widget_show (moth_songchange_label);
+  gtk_box_pack_start (GTK_BOX (moth_songchange_hbox), moth_songchange_label, FALSE, FALSE, 0);
+  gtk_widget_set_sensitive (moth_songchange_label, FALSE);
+  gtk_label_set_justify (GTK_LABEL (moth_songchange_label), GTK_JUSTIFY_CENTER);
+
+  moth_songchange_spin_adj = gtk_adjustment_new (500, 10, 10000, 10, 100, 10);
+  moth_songchange_spin = gtk_spin_button_new (GTK_ADJUSTMENT (moth_songchange_spin_adj), 0, 0);
+  gtk_widget_show (moth_songchange_spin);
+  gtk_box_pack_start (GTK_BOX (moth_songchange_hbox), moth_songchange_spin, TRUE, TRUE, 0);
+  gtk_widget_set_sensitive (moth_songchange_spin, FALSE);
+  gtk_tooltips_set_tip (tooltips, moth_songchange_spin, "The songchange timeout is the maximum time XMMS-crossfade waits for the next song. If this timeout is exceeded, the output plugin/device is closed.\nDefault: 500", NULL);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (moth_songchange_spin), TRUE);
+
+  moth_preload_hbox = gtk_hbox_new (FALSE, 5);
+  gtk_widget_show (moth_preload_hbox);
+  gtk_box_pack_start (GTK_BOX (misc_other_vbox), moth_preload_hbox, TRUE, TRUE, 0);
+
+  moth_preload_label = gtk_label_new ("Mixing buffer preload (ms):");
+  gtk_widget_show (moth_preload_label);
+  gtk_box_pack_start (GTK_BOX (moth_preload_hbox), moth_preload_label, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (moth_preload_label), GTK_JUSTIFY_CENTER);
+
+  moth_preload_spin_adj = gtk_adjustment_new (0, 0, 60000, 10, 100, 10);
+  moth_preload_spin = gtk_spin_button_new (GTK_ADJUSTMENT (moth_preload_spin_adj), 0, 0);
+  gtk_widget_show (moth_preload_spin);
+  gtk_box_pack_start (GTK_BOX (moth_preload_hbox), moth_preload_spin, TRUE, TRUE, 0);
+  gtk_tooltips_set_tip (tooltips, moth_preload_spin, "Tells XMMS-crossfade how much data it should buffer before it starts writing to the output plugin/device. Usually, this value can be set to 0, because the output plugin does preloading on its own.\nDefault: 0", NULL);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (moth_preload_spin), TRUE);
+
+  moth_noxf_hbox = gtk_hbox_new (FALSE, 5);
+  gtk_widget_show (moth_noxf_hbox);
+  gtk_box_pack_start (GTK_BOX (misc_other_vbox), moth_noxf_hbox, FALSE, FALSE, 0);
+
+  moth_noxf_label = gtk_label_new ("Don't  crossfade");
+  gtk_widget_show (moth_noxf_label);
+  gtk_box_pack_start (GTK_BOX (moth_noxf_hbox), moth_noxf_label, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (moth_noxf_label), GTK_JUSTIFY_CENTER);
+
+  noxf_album_check = gtk_check_button_new_with_mnemonic ("successive tracks");
+  gtk_widget_show (noxf_album_check);
+  gtk_box_pack_start (GTK_BOX (moth_noxf_hbox), noxf_album_check, FALSE, FALSE, 0);
+  gtk_tooltips_set_tip (tooltips, noxf_album_check, "This option enables the automatic detection of pre-faded or gapless tracks, like the tracks on some compilations or on most live albums. If such tracks are detected, crossfading will be disabled and only the gapkiller (if enabled) will be used for the songchange.\nDefault: On", NULL);
+
+  noxf_samefile_check = gtk_check_button_new_with_mnemonic ("same file");
+  gtk_widget_show (noxf_samefile_check);
+  gtk_box_pack_start (GTK_BOX (moth_noxf_hbox), noxf_samefile_check, FALSE, FALSE, 0);
+  gtk_tooltips_set_tip (tooltips, noxf_samefile_check, "This option disables crossfading between the same file. This can happen if you have only one file in the playlist and 'repeat' turned on.\nDefault: Off", NULL);
+
+  moth_httpworkaround_check = gtk_check_button_new_with_mnemonic ("Enable HTTP buffer underrun workaround");
+  gtk_widget_show (moth_httpworkaround_check);
+  gtk_box_pack_start (GTK_BOX (misc_other_vbox), moth_httpworkaround_check, FALSE, FALSE, 0);
+  gtk_tooltips_set_tip (tooltips, moth_httpworkaround_check, "Enable this when you have problems playing internet HTTP audio streams. Unfortunatelly, it also breaks crossfading.\nDefault: Off", NULL);
+
+  moth_opmaxused_hbox = gtk_hbox_new (FALSE, 5);
+  gtk_widget_show (moth_opmaxused_hbox);
+  gtk_box_pack_start (GTK_BOX (misc_other_vbox), moth_opmaxused_hbox, TRUE, TRUE, 0);
+
+  moth_opmaxused_check = gtk_check_button_new_with_mnemonic ("Limit OP buffer usage (ms):");
+  gtk_widget_show (moth_opmaxused_check);
+  gtk_box_pack_start (GTK_BOX (moth_opmaxused_hbox), moth_opmaxused_check, FALSE, FALSE, 0);
+  gtk_tooltips_set_tip (tooltips, moth_opmaxused_check, "With this option enabled, XMMS-crossfade will limit the amount of data being buffered by the output plugin. This way, you can decrease the latency between pressing STOP/NEXT/PREV and the new song actually being played. \nDefault: Off", NULL);
+
+  moth_opmaxused_spin_adj = gtk_adjustment_new (500, 10, 10000, 10, 100, 10);
+  moth_opmaxused_spin = gtk_spin_button_new (GTK_ADJUSTMENT (moth_opmaxused_spin_adj), 0, 0);
+  gtk_widget_show (moth_opmaxused_spin);
+  gtk_box_pack_start (GTK_BOX (moth_opmaxused_hbox), moth_opmaxused_spin, TRUE, TRUE, 0);
+  gtk_tooltips_set_tip (tooltips, moth_opmaxused_spin, "Beware that setting this value too low also increases the chance of buffer underruns.\nDefault: 250", NULL);
+  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (moth_opmaxused_spin), TRUE);
+
+  moth_quantaudio_check = gtk_check_button_new_with_mnemonic ("Use Quantaudio timing comments");
+  gtk_box_pack_start (GTK_BOX (misc_other_vbox), moth_quantaudio_check, FALSE, FALSE, 0);
+  gtk_tooltips_set_tip (tooltips, moth_quantaudio_check, "Enable this when you have problems playing internet HTTP audio streams. Unfortunatelly, it also breaks crossfading.\nDefault: Off", NULL);
+
+  moth_outputkeepopened_check = gtk_check_button_new_with_mnemonic ("Keep output opened");
+  gtk_widget_show (moth_outputkeepopened_check);
+  gtk_box_pack_start (GTK_BOX (misc_other_vbox), moth_outputkeepopened_check, FALSE, FALSE, 0);
+  gtk_tooltips_set_tip (tooltips, moth_outputkeepopened_check, "Keep the output device opened all the time, even if XMMS is stopped. This way, you can avoid clicks caused by the soundcard when the device is opened or closed\nDefault: Off", NULL);
+
+  label28 = gtk_label_new ("Advanced options");
+  gtk_widget_show (label28);
+  gtk_frame_set_label_widget (GTK_FRAME (misc_other_frame), label28);
+
+  config_misc_label = gtk_label_new ("Advanced");
+  gtk_widget_show (config_misc_label);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (config_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (config_notebook), 4), config_misc_label);
+  gtk_label_set_justify (GTK_LABEL (config_misc_label), GTK_JUSTIFY_CENTER);
+
+  config_presets_page = gtk_vbox_new (FALSE, 5);
+  gtk_container_add (GTK_CONTAINER (config_notebook), config_presets_page);
+  gtk_container_set_border_width (GTK_CONTAINER (config_presets_page), 5);
+
+  presets_name_hbox = gtk_hbox_new (FALSE, 5);
+  gtk_widget_show (presets_name_hbox);
+  gtk_box_pack_start (GTK_BOX (config_presets_page), presets_name_hbox, FALSE, FALSE, 0);
+
+  presets_name_entry = gtk_entry_new ();
+  gtk_widget_show (presets_name_entry);
+  gtk_box_pack_start (GTK_BOX (presets_name_hbox), presets_name_entry, TRUE, TRUE, 0);
+
+  presets_delete_button = gtk_button_new_with_mnemonic ("Delete");
+  gtk_widget_show (presets_delete_button);
+  gtk_box_pack_start (GTK_BOX (presets_name_hbox), presets_delete_button, FALSE, FALSE, 0);
+
+  presets_new_button = gtk_button_new_with_mnemonic ("New");
+  gtk_widget_show (presets_new_button);
+  gtk_box_pack_start (GTK_BOX (presets_name_hbox), presets_new_button, FALSE, FALSE, 0);
+
+  presets_list_scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
+  gtk_widget_show (presets_list_scrolledwindow);
+  gtk_box_pack_start (GTK_BOX (config_presets_page), presets_list_scrolledwindow, TRUE, TRUE, 0);
+  GTK_WIDGET_UNSET_FLAGS (presets_list_scrolledwindow, GTK_CAN_FOCUS);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (presets_list_scrolledwindow), GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
+  gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (presets_list_scrolledwindow), GTK_SHADOW_IN);
+
+  presets_list_list = gtk_tree_view_new ();
+  gtk_widget_show (presets_list_list);
+  gtk_container_add (GTK_CONTAINER (presets_list_scrolledwindow), presets_list_list);
+
+  presets_list_bbox = gtk_hbutton_box_new ();
+  gtk_widget_show (presets_list_bbox);
+  gtk_box_pack_start (GTK_BOX (config_presets_page), presets_list_bbox, FALSE, FALSE, 0);
+  gtk_button_box_set_layout (GTK_BUTTON_BOX (presets_list_bbox), GTK_BUTTONBOX_END);
+  gtk_box_set_spacing (GTK_BOX (presets_list_bbox), 5);
+
+  presets_load_button = gtk_button_new_with_mnemonic ("Load");
+  gtk_widget_show (presets_load_button);
+  gtk_container_add (GTK_CONTAINER (presets_list_bbox), presets_load_button);
+  GTK_WIDGET_SET_FLAGS (presets_load_button, GTK_CAN_DEFAULT);
+
+  presets_save_button = gtk_button_new_with_mnemonic ("Save");
+  gtk_widget_show (presets_save_button);
+  gtk_container_add (GTK_CONTAINER (presets_list_bbox), presets_save_button);
+  GTK_WIDGET_SET_FLAGS (presets_save_button, GTK_CAN_DEFAULT);
+
+  config_presets_label = gtk_label_new ("Presets");
+  gtk_widget_show (config_presets_label);
+  gtk_notebook_set_tab_label (GTK_NOTEBOOK (config_notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (config_notebook), 5), config_presets_label);
+  gtk_label_set_justify (GTK_LABEL (config_presets_label), GTK_JUSTIFY_CENTER);
+
+  config_bbox = gtk_hbutton_box_new ();
+  gtk_widget_show (config_bbox);
+  gtk_box_pack_start (GTK_BOX (config_vbox), config_bbox, FALSE, TRUE, 0);
+  gtk_button_box_set_layout (GTK_BUTTON_BOX (config_bbox), GTK_BUTTONBOX_END);
+  gtk_box_set_spacing (GTK_BOX (config_bbox), 5);
+
+  config_ok = gtk_button_new_with_mnemonic ("OK");
+  gtk_widget_show (config_ok);
+  gtk_container_add (GTK_CONTAINER (config_bbox), config_ok);
+  GTK_WIDGET_SET_FLAGS (config_ok, GTK_CAN_DEFAULT);
+
+  config_cancel = gtk_button_new_with_mnemonic ("Cancel");
+  gtk_widget_show (config_cancel);
+  gtk_container_add (GTK_CONTAINER (config_bbox), config_cancel);
+  GTK_WIDGET_SET_FLAGS (config_cancel, GTK_CAN_DEFAULT);
+
+  config_apply = gtk_button_new_with_mnemonic ("Apply");
+  gtk_widget_show (config_apply);
+  gtk_container_add (GTK_CONTAINER (config_bbox), config_apply);
+  GTK_WIDGET_SET_FLAGS (config_apply, GTK_CAN_DEFAULT);
+
+  g_signal_connect ((gpointer) output_oss_radio, "toggled",
+                    G_CALLBACK (on_output_oss_radio_toggled),
+                    NULL);
+  g_signal_connect ((gpointer) output_plugin_radio, "toggled",
+                    G_CALLBACK (on_output_plugin_radio_toggled),
+                    NULL);
+  g_signal_connect ((gpointer) output_none_radio, "toggled",
+                    G_CALLBACK (on_output_none_radio_toggled),
+                    NULL);
+  g_signal_connect ((gpointer) oss_adevice_alt_check, "toggled",
+                    G_CALLBACK (on_config_adevice_alt_check_toggled),
+                    NULL);
+  g_signal_connect ((gpointer) oss_mdevice_alt_check, "toggled",
+                    G_CALLBACK (on_config_mdevice_alt_check_toggled),
+                    NULL);
+  g_signal_connect ((gpointer) osshwb_maxbuf_check, "toggled",
+                    G_CALLBACK (on_osshwb_maxbuf_check_toggled),
+                    NULL);
+  g_signal_connect ((gpointer) op_configure_button, "clicked",
+                    G_CALLBACK (on_output_plugin_configure_button_clicked),
+                    NULL);
+  g_signal_connect ((gpointer) op_about_button, "clicked",
+                    G_CALLBACK (on_output_plugin_about_button_clicked),
+                    NULL);
+  g_signal_connect ((gpointer) op_throttle_check, "toggled",
+                    G_CALLBACK (on_op_throttle_check_toggled),
+                    NULL);
+  g_signal_connect ((gpointer) op_maxblock_check, "toggled",
+                    G_CALLBACK (on_op_maxblock_check_toggled),
+                    NULL);
+  g_signal_connect ((gpointer) op_maxblock_spin, "changed",
+                    G_CALLBACK (on_op_maxblock_spin_changed),
+                    NULL);
+  g_signal_connect ((gpointer) op_forcereopen_check, "toggled",
+                    G_CALLBACK (on_op_forcereopen_check_toggled),
+                    NULL);
+  g_signal_connect ((gpointer) ep_configure_button, "clicked",
+                    G_CALLBACK (on_ep_configure_button_clicked),
+                    NULL);
+  g_signal_connect ((gpointer) ep_about_button, "clicked",
+                    G_CALLBACK (on_ep_about_button_clicked),
+                    NULL);
+  g_signal_connect ((gpointer) ep_enable_check, "toggled",
+                    G_CALLBACK (on_ep_enable_check_toggled),
+                    NULL);
+  g_signal_connect ((gpointer) volnorm_enable_check, "toggled",
+                    G_CALLBACK (on_volnorm_enable_check_toggled),
+                    NULL);
+  g_signal_connect ((gpointer) xf_buffer_spin, "changed",
+                    G_CALLBACK (on_xf_buffer_spin_changed),
+                    NULL);
+  g_signal_connect ((gpointer) xf_autobuf_check, "toggled",
+                    G_CALLBACK (on_xf_autobuf_check_toggled),
+                    NULL);
+  g_signal_connect ((gpointer) xftfp_length_spin, "changed",
+                    G_CALLBACK (on_xftfp_length_spin_changed),
+                    NULL);
+  g_signal_connect ((gpointer) xftfp_enable_check, "toggled",
+                    G_CALLBACK (on_xftfp_enable_check_toggled),
+                    NULL);
+  g_signal_connect ((gpointer) xftffi_length_spin, "changed",
+                    G_CALLBACK (on_xftffi_length_spin_changed),
+                    NULL);
+  g_signal_connect ((gpointer) xftffi_enable_check, "toggled",
+                    G_CALLBACK (on_xftffi_enable_check_toggled),
+                    NULL);
+  g_signal_connect ((gpointer) xftffi_volume_spin, "changed",
+                    G_CALLBACK (on_xftffi_volume_spin_changed),
+                    NULL);
+  g_signal_connect ((gpointer) pause_length_spin, "changed",
+                    G_CALLBACK (on_pause_length_spin_changed),
+                    NULL);
+  g_signal_connect ((gpointer) simple_length_spin, "changed",
+                    G_CALLBACK (on_simple_length_spin_changed),
+                    NULL);
+  g_signal_connect ((gpointer) fadeout_length_spin, "changed",
+                    G_CALLBACK (on_fadeout_length_spin_changed),
+                    NULL);
+  g_signal_connect ((gpointer) fadeout_volume_spin, "changed",
+                    G_CALLBACK (on_fadeout_volume_spin_changed),
+                    NULL);
+  g_signal_connect ((gpointer) fadeout_enable_check, "toggled",
+                    G_CALLBACK (on_fadeout_enable_check_toggled),
+                    NULL);
+  g_signal_connect ((gpointer) xfofs_custom_radiobutton, "toggled",
+                    G_CALLBACK (on_xfofs_custom_radiobutton_toggled),
+                    NULL);
+  g_signal_connect ((gpointer) xfofs_custom_radiobutton, "clicked",
+                    G_CALLBACK (on_xfofs_custom_radiobutton_clicked),
+                    NULL);
+  g_signal_connect ((gpointer) xfofs_custom_spin, "changed",
+                    G_CALLBACK (on_xfofs_custom_spin_changed),
+                    NULL);
+  g_signal_connect ((gpointer) xfofs_none_radiobutton, "clicked",
+                    G_CALLBACK (on_xfofs_none_radiobutton_clicked),
+                    NULL);
+  g_signal_connect ((gpointer) xfofs_none_radiobutton, "toggled",
+                    G_CALLBACK (on_xfofs_none_radiobutton_toggled),
+                    NULL);
+  g_signal_connect ((gpointer) xfofs_lockout_radiobutton, "toggled",
+                    G_CALLBACK (on_xfofs_lockout_radiobutton_toggled),
+                    NULL);
+  g_signal_connect ((gpointer) xfofs_lockout_radiobutton, "clicked",
+                    G_CALLBACK (on_xfofs_lockout_radiobutton_clicked),
+                    NULL);
+  g_signal_connect ((gpointer) xfofs_lockin_radiobutton, "toggled",
+                    G_CALLBACK (on_xfofs_lockin_radiobutton_toggled),
+                    NULL);
+  g_signal_connect ((gpointer) xfofs_lockin_radiobutton, "clicked",
+                    G_CALLBACK (on_xfofs_lockin_radiobutton_clicked),
+                    NULL);
+  g_signal_connect ((gpointer) fadein_length_spin, "changed",
+                    G_CALLBACK (on_fadein_length_spin_changed),
+                    NULL);
+  g_signal_connect ((gpointer) fadein_enable_check, "toggled",
+                    G_CALLBACK (on_fadein_enable_check_toggled),
+                    NULL);
+  g_signal_connect ((gpointer) fadein_lock_check, "toggled",
+                    G_CALLBACK (on_fadein_lock_check_toggled),
+                    NULL);
+  g_signal_connect ((gpointer) fadein_volume_spin, "changed",
+                    G_CALLBACK (on_fadein_volume_spin_changed),
+                    NULL);
+  g_signal_connect ((gpointer) xftfi_length_spin, "changed",
+                    G_CALLBACK (on_fadein_length_spin_changed),
+                    NULL);
+  g_signal_connect ((gpointer) xftfi_volume_spin, "changed",
+                    G_CALLBACK (on_fadein_volume_spin_changed),
+                    NULL);
+  g_signal_connect ((gpointer) xftfo_length_spin, "changed",
+                    G_CALLBACK (on_fadeout_length_spin_changed),
+                    NULL);
+  g_signal_connect ((gpointer) xftfo_volume_spin, "changed",
+                    G_CALLBACK (on_fadeout_volume_spin_changed),
+                    NULL);
+  g_signal_connect ((gpointer) xftfo_silence_spin, "changed",
+                    G_CALLBACK (on_xfofs_custom_spin_changed),
+                    NULL);
+  g_signal_connect ((gpointer) xftfoi_fadeout_spin, "changed",
+                    G_CALLBACK (on_fadeout_length_spin_changed),
+                    NULL);
+  g_signal_connect ((gpointer) xftfoi_silence_spin, "changed",
+                    G_CALLBACK (on_xfofs_custom_spin_changed),
+                    NULL);
+  g_signal_connect ((gpointer) xftfoi_fadein_spin, "changed",
+                    G_CALLBACK (on_fadein_length_spin_changed),
+                    NULL);
+  g_signal_connect ((gpointer) lgap_length_spin, "changed",
+                    G_CALLBACK (on_lgap_length_spin_changed),
+                    NULL);
+  g_signal_connect ((gpointer) lgap_level_spin, "changed",
+                    G_CALLBACK (on_lgap_level_spin_changed),
+                    NULL);
+  g_signal_connect ((gpointer) lgap_enable_check, "toggled",
+                    G_CALLBACK (on_lgap_enable_check_toggled),
+                    NULL);
+  g_signal_connect ((gpointer) tgap_length_spin, "changed",
+                    G_CALLBACK (on_tgap_length_spin_changed),
+                    NULL);
+  g_signal_connect ((gpointer) tgap_level_spin, "changed",
+                    G_CALLBACK (on_tgap_level_spin_changed),
+                    NULL);
+  g_signal_connect ((gpointer) tgap_lock_check, "toggled",
+                    G_CALLBACK (on_tgap_lock_check_toggled),
+                    NULL);
+  g_signal_connect ((gpointer) tgap_enable_check, "toggled",
+                    G_CALLBACK (on_tgap_enable_check_toggled),
+                    NULL);
+  g_signal_connect ((gpointer) mixopt_enable_check, "toggled",
+                    G_CALLBACK (on_config_mixopt_enable_check_toggled),
+                    NULL);
+  g_signal_connect ((gpointer) moth_songchange_spin, "changed",
+                    G_CALLBACK (on_moth_songchange_spin_changed),
+                    NULL);
+  g_signal_connect ((gpointer) moth_opmaxused_check, "toggled",
+                    G_CALLBACK (on_moth_opmaxused_check_toggled),
+                    NULL);
+  g_signal_connect ((gpointer) presets_list_list, "click_column",
+                    G_CALLBACK (on_presets_list_click_column),
+                    NULL);
+  g_signal_connect ((gpointer) config_ok, "clicked",
+                    G_CALLBACK (on_config_ok_clicked),
+                    NULL);
+  g_signal_connect_swapped ((gpointer) config_cancel, "clicked",
+                            G_CALLBACK (gtk_widget_destroy),
+                            GTK_OBJECT (config_win));
+  g_signal_connect ((gpointer) config_apply, "clicked",
+                    G_CALLBACK (on_config_apply_clicked),
+                    NULL);
+
+  /* Store pointers to all widgets, for use by lookup_widget(). */
+  GLADE_HOOKUP_OBJECT_NO_REF (config_win, config_win, "config_win");
+  GLADE_HOOKUP_OBJECT (config_win, config_vbox, "config_vbox");
+  GLADE_HOOKUP_OBJECT (config_win, config_notebook, "config_notebook");
+  GLADE_HOOKUP_OBJECT (config_win, config_output_page, "config_output_page");
+  GLADE_HOOKUP_OBJECT (config_win, output_options_hbox, "output_options_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, output_method_frame, "output_method_frame");
+  GLADE_HOOKUP_OBJECT (config_win, output_method_vbox, "output_method_vbox");
+  GLADE_HOOKUP_OBJECT (config_win, output_oss_radio, "output_oss_radio");
+  GLADE_HOOKUP_OBJECT (config_win, output_plugin_radio, "output_plugin_radio");
+  GLADE_HOOKUP_OBJECT (config_win, output_none_radio, "output_none_radio");
+  GLADE_HOOKUP_OBJECT (config_win, label1, "label1");
+  GLADE_HOOKUP_OBJECT (config_win, output_resampling_frame, "output_resampling_frame");
+  GLADE_HOOKUP_OBJECT (config_win, output_resampling_table, "output_resampling_table");
+  GLADE_HOOKUP_OBJECT (config_win, resampling_rate_hbox, "resampling_rate_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, resampling_rate_label, "resampling_rate_label");
+  GLADE_HOOKUP_OBJECT (config_win, resampling_quality_hbox, "resampling_quality_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, resampling_quality_label, "resampling_quality_label");
+  GLADE_HOOKUP_OBJECT (config_win, resampling_rate_optionmenu, "resampling_rate_optionmenu");
+  GLADE_HOOKUP_OBJECT (config_win, resampling_quality_optionmenu, "resampling_quality_optionmenu");
+  GLADE_HOOKUP_OBJECT (config_win, output_resampling_label, "output_resampling_label");
+  GLADE_HOOKUP_OBJECT (config_win, output_notebook, "output_notebook");
+  GLADE_HOOKUP_OBJECT (config_win, output_oss_page, "output_oss_page");
+  GLADE_HOOKUP_OBJECT (config_win, output_oss_notebook, "output_oss_notebook");
+  GLADE_HOOKUP_OBJECT (config_win, oss_device_page, "oss_device_page");
+  GLADE_HOOKUP_OBJECT (config_win, oss_adevice_frame, "oss_adevice_frame");
+  GLADE_HOOKUP_OBJECT (config_win, oss_adevice_vbox, "oss_adevice_vbox");
+  GLADE_HOOKUP_OBJECT (config_win, oss_adevice_hbox, "oss_adevice_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, oss_adevice_optionmenu, "oss_adevice_optionmenu");
+  GLADE_HOOKUP_OBJECT (config_win, convertwidget1, "convertwidget1");
+  GLADE_HOOKUP_OBJECT (config_win, convertwidget2, "convertwidget2");
+  GLADE_HOOKUP_OBJECT (config_win, oss_adevice_alt_hbox, "oss_adevice_alt_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, oss_adevice_alt_check, "oss_adevice_alt_check");
+  GLADE_HOOKUP_OBJECT (config_win, oss_adevice_alt_entry, "oss_adevice_alt_entry");
+  GLADE_HOOKUP_OBJECT (config_win, label3, "label3");
+  GLADE_HOOKUP_OBJECT (config_win, oss_mdevice_frame, "oss_mdevice_frame");
+  GLADE_HOOKUP_OBJECT (config_win, oss_mdevice_vbox, "oss_mdevice_vbox");
+  GLADE_HOOKUP_OBJECT (config_win, oss_mdevice_hbox, "oss_mdevice_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, oss_mdevice_optionmenu, "oss_mdevice_optionmenu");
+  GLADE_HOOKUP_OBJECT (config_win, convertwidget3, "convertwidget3");
+  GLADE_HOOKUP_OBJECT (config_win, convertwidget4, "convertwidget4");
+  GLADE_HOOKUP_OBJECT (config_win, oss_mdevice_alt_hbox, "oss_mdevice_alt_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, oss_mdevice_alt_check, "oss_mdevice_alt_check");
+  GLADE_HOOKUP_OBJECT (config_win, oss_mdevice_alt_entry, "oss_mdevice_alt_entry");
+  GLADE_HOOKUP_OBJECT (config_win, label4, "label4");
+  GLADE_HOOKUP_OBJECT (config_win, oss_device_label, "oss_device_label");
+  GLADE_HOOKUP_OBJECT (config_win, oss_buffer_page, "oss_buffer_page");
+  GLADE_HOOKUP_OBJECT (config_win, oss_buffer_frame, "oss_buffer_frame");
+  GLADE_HOOKUP_OBJECT (config_win, oss_buffer_vbox, "oss_buffer_vbox");
+  GLADE_HOOKUP_OBJECT (config_win, ossbuf_buffer_hbox, "ossbuf_buffer_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, ossbuf_buffer_label, "ossbuf_buffer_label");
+  GLADE_HOOKUP_OBJECT (config_win, ossbuf_buffer_spin, "ossbuf_buffer_spin");
+  GLADE_HOOKUP_OBJECT (config_win, ossbuf_preload_hbox, "ossbuf_preload_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, ossbuf_preload_label, "ossbuf_preload_label");
+  GLADE_HOOKUP_OBJECT (config_win, ossbuf_preload_spin, "ossbuf_preload_spin");
+  GLADE_HOOKUP_OBJECT (config_win, label5, "label5");
+  GLADE_HOOKUP_OBJECT (config_win, oss_hwbuf_frame, "oss_hwbuf_frame");
+  GLADE_HOOKUP_OBJECT (config_win, oss_hwbuf_vbox, "oss_hwbuf_vbox");
+  GLADE_HOOKUP_OBJECT (config_win, osshwb_maxbuf_check, "osshwb_maxbuf_check");
+  GLADE_HOOKUP_OBJECT (config_win, osshwb_fragments_hbox, "osshwb_fragments_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, osshwb_fragments_label, "osshwb_fragments_label");
+  GLADE_HOOKUP_OBJECT (config_win, osshwb_fragments_spin, "osshwb_fragments_spin");
+  GLADE_HOOKUP_OBJECT (config_win, osshwb_fragsize_hbox, "osshwb_fragsize_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, osshwb_fragsize_label, "osshwb_fragsize_label");
+  GLADE_HOOKUP_OBJECT (config_win, osshwb_fragsize_spin, "osshwb_fragsize_spin");
+  GLADE_HOOKUP_OBJECT (config_win, label6, "label6");
+  GLADE_HOOKUP_OBJECT (config_win, oss_buffer_label, "oss_buffer_label");
+  GLADE_HOOKUP_OBJECT (config_win, oss_mixer_page, "oss_mixer_page");
+  GLADE_HOOKUP_OBJECT (config_win, oss_mixer_frame, "oss_mixer_frame");
+  GLADE_HOOKUP_OBJECT (config_win, oss_mixer_vbox, "oss_mixer_vbox");
+  GLADE_HOOKUP_OBJECT (config_win, ossmixer_pcm_check, "ossmixer_pcm_check");
+  GLADE_HOOKUP_OBJECT (config_win, label7, "label7");
+  GLADE_HOOKUP_OBJECT (config_win, oss_mixer_label, "oss_mixer_label");
+  GLADE_HOOKUP_OBJECT (config_win, label29, "label29");
+  GLADE_HOOKUP_OBJECT (config_win, output_plugin_page, "output_plugin_page");
+  GLADE_HOOKUP_OBJECT (config_win, op_plugin_frame, "op_plugin_frame");
+  GLADE_HOOKUP_OBJECT (config_win, op_plugin_vbox, "op_plugin_vbox");
+  GLADE_HOOKUP_OBJECT (config_win, op_plugin_optionmenu, "op_plugin_optionmenu");
+  GLADE_HOOKUP_OBJECT (config_win, convertwidget5, "convertwidget5");
+  GLADE_HOOKUP_OBJECT (config_win, convertwidget6, "convertwidget6");
+  GLADE_HOOKUP_OBJECT (config_win, op_plugin_buttonbox, "op_plugin_buttonbox");
+  GLADE_HOOKUP_OBJECT (config_win, op_configure_button, "op_configure_button");
+  GLADE_HOOKUP_OBJECT (config_win, op_about_button, "op_about_button");
+  GLADE_HOOKUP_OBJECT (config_win, label8, "label8");
+  GLADE_HOOKUP_OBJECT (config_win, op_options_frame, "op_options_frame");
+  GLADE_HOOKUP_OBJECT (config_win, op_options_vbox, "op_options_vbox");
+  GLADE_HOOKUP_OBJECT (config_win, op_throttle_check, "op_throttle_check");
+  GLADE_HOOKUP_OBJECT (config_win, op_maxblock_hbox, "op_maxblock_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, op_maxblock_check, "op_maxblock_check");
+  GLADE_HOOKUP_OBJECT (config_win, op_maxblock_spin, "op_maxblock_spin");
+  GLADE_HOOKUP_OBJECT (config_win, op_forcereopen_check, "op_forcereopen_check");
+  GLADE_HOOKUP_OBJECT (config_win, label9, "label9");
+  GLADE_HOOKUP_OBJECT (config_win, label31, "label31");
+  GLADE_HOOKUP_OBJECT (config_win, label32, "label32");
+  GLADE_HOOKUP_OBJECT (config_win, label33, "label33");
+  GLADE_HOOKUP_OBJECT (config_win, label34, "label34");
+  GLADE_HOOKUP_OBJECT (config_win, output_help_label, "output_help_label");
+  GLADE_HOOKUP_OBJECT (config_win, config_devices_label, "config_devices_label");
+  GLADE_HOOKUP_OBJECT (config_win, config_effects_page, "config_effects_page");
+  GLADE_HOOKUP_OBJECT (config_win, ep_plugin_frame, "ep_plugin_frame");
+  GLADE_HOOKUP_OBJECT (config_win, ep_plugin_vbox, "ep_plugin_vbox");
+  GLADE_HOOKUP_OBJECT (config_win, ep_plugin_optionmenu, "ep_plugin_optionmenu");
+  GLADE_HOOKUP_OBJECT (config_win, convertwidget7, "convertwidget7");
+  GLADE_HOOKUP_OBJECT (config_win, convertwidget8, "convertwidget8");
+  GLADE_HOOKUP_OBJECT (config_win, ep_plugin_buttonbox, "ep_plugin_buttonbox");
+  GLADE_HOOKUP_OBJECT (config_win, ep_configure_button, "ep_configure_button");
+  GLADE_HOOKUP_OBJECT (config_win, ep_about_button, "ep_about_button");
+  GLADE_HOOKUP_OBJECT (config_win, ep_enable_check, "ep_enable_check");
+  GLADE_HOOKUP_OBJECT (config_win, label10, "label10");
+  GLADE_HOOKUP_OBJECT (config_win, effects_volnorm_frame, "effects_volnorm_frame");
+  GLADE_HOOKUP_OBJECT (config_win, effects_volnorm_table, "effects_volnorm_table");
+  GLADE_HOOKUP_OBJECT (config_win, volnorm_quantaudio_check, "volnorm_quantaudio_check");
+  GLADE_HOOKUP_OBJECT (config_win, volnorm_target_spin, "volnorm_target_spin");
+  GLADE_HOOKUP_OBJECT (config_win, volnorm_target_hbox, "volnorm_target_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, volnorm_target_label, "volnorm_target_label");
+  GLADE_HOOKUP_OBJECT (config_win, volnorm_enable_check, "volnorm_enable_check");
+  GLADE_HOOKUP_OBJECT (config_win, volnorm_rva2_check, "volnorm_rva2_check");
+  GLADE_HOOKUP_OBJECT (config_win, label11, "label11");
+  GLADE_HOOKUP_OBJECT (config_win, effects_help_label, "effects_help_label");
+  GLADE_HOOKUP_OBJECT (config_win, config_effects_label, "config_effects_label");
+  GLADE_HOOKUP_OBJECT (config_win, config_crossfader_page, "config_crossfader_page");
+  GLADE_HOOKUP_OBJECT (config_win, xf_bufsize_hbox, "xf_bufsize_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, xf_bufsize_label, "xf_bufsize_label");
+  GLADE_HOOKUP_OBJECT (config_win, xf_buffer_spin, "xf_buffer_spin");
+  GLADE_HOOKUP_OBJECT (config_win, xf_autobuf_check, "xf_autobuf_check");
+  GLADE_HOOKUP_OBJECT (config_win, xf_config_hbox, "xf_config_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, xf_config_label, "xf_config_label");
+  GLADE_HOOKUP_OBJECT (config_win, xf_config_optionmenu, "xf_config_optionmenu");
+  GLADE_HOOKUP_OBJECT (config_win, convertwidget9, "convertwidget9");
+  GLADE_HOOKUP_OBJECT (config_win, convertwidget10, "convertwidget10");
+  GLADE_HOOKUP_OBJECT (config_win, xf_type_hbox, "xf_type_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, xf_type_label, "xf_type_label");
+  GLADE_HOOKUP_OBJECT (config_win, xf_type_optionmenu, "xf_type_optionmenu");
+  GLADE_HOOKUP_OBJECT (config_win, convertwidget11, "convertwidget11");
+  GLADE_HOOKUP_OBJECT (config_win, convertwidget12, "convertwidget12");
+  GLADE_HOOKUP_OBJECT (config_win, xf_type_notebook, "xf_type_notebook");
+  GLADE_HOOKUP_OBJECT (config_win, xft_reopen_label, "xft_reopen_label");
+  GLADE_HOOKUP_OBJECT (config_win, xft_flush_page, "xft_flush_page");
+  GLADE_HOOKUP_OBJECT (config_win, xftf_pause_frame, "xftf_pause_frame");
+  GLADE_HOOKUP_OBJECT (config_win, xftf_pause_table, "xftf_pause_table");
+  GLADE_HOOKUP_OBJECT (config_win, xftfp_length_label, "xftfp_length_label");
+  GLADE_HOOKUP_OBJECT (config_win, xftfp_length_spin, "xftfp_length_spin");
+  GLADE_HOOKUP_OBJECT (config_win, xftfp_enable_check, "xftfp_enable_check");
+  GLADE_HOOKUP_OBJECT (config_win, label12, "label12");
+  GLADE_HOOKUP_OBJECT (config_win, xftf_fadein_frame, "xftf_fadein_frame");
+  GLADE_HOOKUP_OBJECT (config_win, xftf_fadein_table, "xftf_fadein_table");
+  GLADE_HOOKUP_OBJECT (config_win, xftffi_length_hbox, "xftffi_length_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, xftffi_length_label, "xftffi_length_label");
+  GLADE_HOOKUP_OBJECT (config_win, xftffi_volume_hbox, "xftffi_volume_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, xftffi_volume_label, "xftffi_volume_label");
+  GLADE_HOOKUP_OBJECT (config_win, xftffi_length_spin, "xftffi_length_spin");
+  GLADE_HOOKUP_OBJECT (config_win, xftffi_enable_check, "xftffi_enable_check");
+  GLADE_HOOKUP_OBJECT (config_win, xftffi_volume_spin, "xftffi_volume_spin");
+  GLADE_HOOKUP_OBJECT (config_win, label13, "label13");
+  GLADE_HOOKUP_OBJECT (config_win, xft_flush_label, "xft_flush_label");
+  GLADE_HOOKUP_OBJECT (config_win, xft_none_label, "xft_none_label");
+  GLADE_HOOKUP_OBJECT (config_win, xft_pause_page, "xft_pause_page");
+  GLADE_HOOKUP_OBJECT (config_win, xf_pause_frame, "xf_pause_frame");
+  GLADE_HOOKUP_OBJECT (config_win, xf_pause_table, "xf_pause_table");
+  GLADE_HOOKUP_OBJECT (config_win, pause_length_hbox, "pause_length_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, pause_length_label, "pause_length_label");
+  GLADE_HOOKUP_OBJECT (config_win, pause_length_spin, "pause_length_spin");
+  GLADE_HOOKUP_OBJECT (config_win, label14, "label14");
+  GLADE_HOOKUP_OBJECT (config_win, xft_pause_label, "xft_pause_label");
+  GLADE_HOOKUP_OBJECT (config_win, xft_simplexf_page, "xft_simplexf_page");
+  GLADE_HOOKUP_OBJECT (config_win, xf_simple_frame, "xf_simple_frame");
+  GLADE_HOOKUP_OBJECT (config_win, xf_simple_table, "xf_simple_table");
+  GLADE_HOOKUP_OBJECT (config_win, simple_length_hbox, "simple_length_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, simple_length_label, "simple_length_label");
+  GLADE_HOOKUP_OBJECT (config_win, simple_length_spin, "simple_length_spin");
+  GLADE_HOOKUP_OBJECT (config_win, label15, "label15");
+  GLADE_HOOKUP_OBJECT (config_win, xft_simplexf_label, "xft_simplexf_label");
+  GLADE_HOOKUP_OBJECT (config_win, xft_advancedxf_page, "xft_advancedxf_page");
+  GLADE_HOOKUP_OBJECT (config_win, xf_fadeout_frame, "xf_fadeout_frame");
+  GLADE_HOOKUP_OBJECT (config_win, xf_fadeout_table, "xf_fadeout_table");
+  GLADE_HOOKUP_OBJECT (config_win, fadeout_length_hbox, "fadeout_length_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, fadeout_length_label, "fadeout_length_label");
+  GLADE_HOOKUP_OBJECT (config_win, fadeout_length_spin, "fadeout_length_spin");
+  GLADE_HOOKUP_OBJECT (config_win, fadeout_volume_hbox, "fadeout_volume_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, fadeout_volume_label, "fadeout_volume_label");
+  GLADE_HOOKUP_OBJECT (config_win, fadeout_volume_spin, "fadeout_volume_spin");
+  GLADE_HOOKUP_OBJECT (config_win, fadeout_options_hbox, "fadeout_options_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, fadeout_enable_check, "fadeout_enable_check");
+  GLADE_HOOKUP_OBJECT (config_win, label16, "label16");
+  GLADE_HOOKUP_OBJECT (config_win, xf_offset_frame, "xf_offset_frame");
+  GLADE_HOOKUP_OBJECT (config_win, xf_offset_table, "xf_offset_table");
+  GLADE_HOOKUP_OBJECT (config_win, xfofs_custom_hbox, "xfofs_custom_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, xfofs_custom_radiobutton, "xfofs_custom_radiobutton");
+  GLADE_HOOKUP_OBJECT (config_win, xfofs_custom_spin, "xfofs_custom_spin");
+  GLADE_HOOKUP_OBJECT (config_win, xfofs_none_radiobutton, "xfofs_none_radiobutton");
+  GLADE_HOOKUP_OBJECT (config_win, xfofs_lockout_radiobutton, "xfofs_lockout_radiobutton");
+  GLADE_HOOKUP_OBJECT (config_win, xfofs_lockin_radiobutton, "xfofs_lockin_radiobutton");
+  GLADE_HOOKUP_OBJECT (config_win, label17, "label17");
+  GLADE_HOOKUP_OBJECT (config_win, xf_fadein_frame, "xf_fadein_frame");
+  GLADE_HOOKUP_OBJECT (config_win, xf_fadein_table, "xf_fadein_table");
+  GLADE_HOOKUP_OBJECT (config_win, fadein_length_hbox, "fadein_length_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, fadein_length_label, "fadein_length_label");
+  GLADE_HOOKUP_OBJECT (config_win, fadein_volume_hbox, "fadein_volume_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, fadein_volume_label, "fadein_volume_label");
+  GLADE_HOOKUP_OBJECT (config_win, fadein_length_spin, "fadein_length_spin");
+  GLADE_HOOKUP_OBJECT (config_win, fadein_enable_check, "fadein_enable_check");
+  GLADE_HOOKUP_OBJECT (config_win, fadein_lock_check, "fadein_lock_check");
+  GLADE_HOOKUP_OBJECT (config_win, fadein_volume_spin, "fadein_volume_spin");
+  GLADE_HOOKUP_OBJECT (config_win, label18, "label18");
+  GLADE_HOOKUP_OBJECT (config_win, xft_advancedxf_label, "xft_advancedxf_label");
+  GLADE_HOOKUP_OBJECT (config_win, xft_fadein_page, "xft_fadein_page");
+  GLADE_HOOKUP_OBJECT (config_win, xftfi_fadein_frame, "xftfi_fadein_frame");
+  GLADE_HOOKUP_OBJECT (config_win, xftfi_fadein_table, "xftfi_fadein_table");
+  GLADE_HOOKUP_OBJECT (config_win, xftfi_length_hbox, "xftfi_length_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, xftfi_length_label, "xftfi_length_label");
+  GLADE_HOOKUP_OBJECT (config_win, xftfi_volume_hbox, "xftfi_volume_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, xftfi_volume_label, "xftfi_volume_label");
+  GLADE_HOOKUP_OBJECT (config_win, xftfi_length_spin, "xftfi_length_spin");
+  GLADE_HOOKUP_OBJECT (config_win, xftfi_volume_spin, "xftfi_volume_spin");
+  GLADE_HOOKUP_OBJECT (config_win, label19, "label19");
+  GLADE_HOOKUP_OBJECT (config_win, xft_fadein_label, "xft_fadein_label");
+  GLADE_HOOKUP_OBJECT (config_win, xft_fadeout_page, "xft_fadeout_page");
+  GLADE_HOOKUP_OBJECT (config_win, xftfo_fadeout_frame, "xftfo_fadeout_frame");
+  GLADE_HOOKUP_OBJECT (config_win, xftfo_fadeout_table, "xftfo_fadeout_table");
+  GLADE_HOOKUP_OBJECT (config_win, xftfo_length_hbox, "xftfo_length_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, xftfo_length_label, "xftfo_length_label");
+  GLADE_HOOKUP_OBJECT (config_win, xftfo_length_spin, "xftfo_length_spin");
+  GLADE_HOOKUP_OBJECT (config_win, xftfo_volume_hbox, "xftfo_volume_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, xftfo_volume_label, "xftfo_volume_label");
+  GLADE_HOOKUP_OBJECT (config_win, xftfo_volume_spin, "xftfo_volume_spin");
+  GLADE_HOOKUP_OBJECT (config_win, label20, "label20");
+  GLADE_HOOKUP_OBJECT (config_win, xftfo_silence_frame, "xftfo_silence_frame");
+  GLADE_HOOKUP_OBJECT (config_win, xftfo_silence_table, "xftfo_silence_table");
+  GLADE_HOOKUP_OBJECT (config_win, xftfo_silence_hbox, "xftfo_silence_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, xftfo_silence_label, "xftfo_silence_label");
+  GLADE_HOOKUP_OBJECT (config_win, xftfo_silence_spin, "xftfo_silence_spin");
+  GLADE_HOOKUP_OBJECT (config_win, label21, "label21");
+  GLADE_HOOKUP_OBJECT (config_win, xft_fadeout_label, "xft_fadeout_label");
+  GLADE_HOOKUP_OBJECT (config_win, xft_pause_none_label, "xft_pause_none_label");
+  GLADE_HOOKUP_OBJECT (config_win, xft_pause_adv_page, "xft_pause_adv_page");
+  GLADE_HOOKUP_OBJECT (config_win, xft_fadeoutin_frame, "xft_fadeoutin_frame");
+  GLADE_HOOKUP_OBJECT (config_win, xft_fadeoutin_table, "xft_fadeoutin_table");
+  GLADE_HOOKUP_OBJECT (config_win, xftfoi_fadeout_spin, "xftfoi_fadeout_spin");
+  GLADE_HOOKUP_OBJECT (config_win, xftfoi_silence_spin, "xftfoi_silence_spin");
+  GLADE_HOOKUP_OBJECT (config_win, xftfoi_fadein_spin, "xftfoi_fadein_spin");
+  GLADE_HOOKUP_OBJECT (config_win, xftfoi_fadein_hbox, "xftfoi_fadein_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, xftfoi_fadein_label, "xftfoi_fadein_label");
+  GLADE_HOOKUP_OBJECT (config_win, xftfoi_silence_hbox, "xftfoi_silence_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, xftfoi_silence_label, "xftfoi_silence_label");
+  GLADE_HOOKUP_OBJECT (config_win, xftfoi_fadeout_hbox, "xftfoi_fadeout_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, xftfoi_fadeout_label, "xftfoi_fadeout_label");
+  GLADE_HOOKUP_OBJECT (config_win, label22, "label22");
+  GLADE_HOOKUP_OBJECT (config_win, xft_pause_adv_label, "xft_pause_adv_label");
+  GLADE_HOOKUP_OBJECT (config_win, config_crossfade_label, "config_crossfade_label");
+  GLADE_HOOKUP_OBJECT (config_win, config_gapkiller_page, "config_gapkiller_page");
+  GLADE_HOOKUP_OBJECT (config_win, gap_leading_frame, "gap_leading_frame");
+  GLADE_HOOKUP_OBJECT (config_win, gap_leading_table, "gap_leading_table");
+  GLADE_HOOKUP_OBJECT (config_win, lgap_length_spin, "lgap_length_spin");
+  GLADE_HOOKUP_OBJECT (config_win, lgap_level_spin, "lgap_level_spin");
+  GLADE_HOOKUP_OBJECT (config_win, lgap_length_hbox, "lgap_length_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, lgap_length_label, "lgap_length_label");
+  GLADE_HOOKUP_OBJECT (config_win, lgap_level_hbox, "lgap_level_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, lgap_level_label, "lgap_level_label");
+  GLADE_HOOKUP_OBJECT (config_win, lgap_enable_check, "lgap_enable_check");
+  GLADE_HOOKUP_OBJECT (config_win, label23, "label23");
+  GLADE_HOOKUP_OBJECT (config_win, gap_trailing_frame, "gap_trailing_frame");
+  GLADE_HOOKUP_OBJECT (config_win, gap_trailing_table, "gap_trailing_table");
+  GLADE_HOOKUP_OBJECT (config_win, tgap_length_hbox, "tgap_length_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, tgap_length_label, "tgap_length_label");
+  GLADE_HOOKUP_OBJECT (config_win, tgap_level_hbox, "tgap_level_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, tgap_level_label, "tgap_level_label");
+  GLADE_HOOKUP_OBJECT (config_win, tgap_length_spin, "tgap_length_spin");
+  GLADE_HOOKUP_OBJECT (config_win, tgap_level_spin, "tgap_level_spin");
+  GLADE_HOOKUP_OBJECT (config_win, tgap_lock_check, "tgap_lock_check");
+  GLADE_HOOKUP_OBJECT (config_win, tgap_enable_check, "tgap_enable_check");
+  GLADE_HOOKUP_OBJECT (config_win, label24, "label24");
+  GLADE_HOOKUP_OBJECT (config_win, gap_advanced_frame, "gap_advanced_frame");
+  GLADE_HOOKUP_OBJECT (config_win, gap_advanced_vbox, "gap_advanced_vbox");
+  GLADE_HOOKUP_OBJECT (config_win, gadv_crossing_check, "gadv_crossing_check");
+  GLADE_HOOKUP_OBJECT (config_win, label25, "label25");
+  GLADE_HOOKUP_OBJECT (config_win, config_gapkiller_label, "config_gapkiller_label");
+  GLADE_HOOKUP_OBJECT (config_win, config_misc_page, "config_misc_page");
+  GLADE_HOOKUP_OBJECT (config_win, misc_debug_frame, "misc_debug_frame");
+  GLADE_HOOKUP_OBJECT (config_win, misc_debug_vbox, "misc_debug_vbox");
+  GLADE_HOOKUP_OBJECT (config_win, debug_stderr_check, "debug_stderr_check");
+  GLADE_HOOKUP_OBJECT (config_win, debug_monitor_check, "debug_monitor_check");
+  GLADE_HOOKUP_OBJECT (config_win, label26, "label26");
+  GLADE_HOOKUP_OBJECT (config_win, misc_mixopt_frame, "misc_mixopt_frame");
+  GLADE_HOOKUP_OBJECT (config_win, misc_mixopt_vbox, "misc_mixopt_vbox");
+  GLADE_HOOKUP_OBJECT (config_win, mixopt_enable_check, "mixopt_enable_check");
+  GLADE_HOOKUP_OBJECT (config_win, mixopt_reverse_check, "mixopt_reverse_check");
+  GLADE_HOOKUP_OBJECT (config_win, mixopt_software_check, "mixopt_software_check");
+  GLADE_HOOKUP_OBJECT (config_win, label27, "label27");
+  GLADE_HOOKUP_OBJECT (config_win, misc_other_frame, "misc_other_frame");
+  GLADE_HOOKUP_OBJECT (config_win, misc_other_vbox, "misc_other_vbox");
+  GLADE_HOOKUP_OBJECT (config_win, moth_songchange_hbox, "moth_songchange_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, moth_songchange_label, "moth_songchange_label");
+  GLADE_HOOKUP_OBJECT (config_win, moth_songchange_spin, "moth_songchange_spin");
+  GLADE_HOOKUP_OBJECT (config_win, moth_preload_hbox, "moth_preload_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, moth_preload_label, "moth_preload_label");
+  GLADE_HOOKUP_OBJECT (config_win, moth_preload_spin, "moth_preload_spin");
+  GLADE_HOOKUP_OBJECT (config_win, moth_noxf_hbox, "moth_noxf_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, moth_noxf_label, "moth_noxf_label");
+  GLADE_HOOKUP_OBJECT (config_win, noxf_album_check, "noxf_album_check");
+  GLADE_HOOKUP_OBJECT (config_win, noxf_samefile_check, "noxf_samefile_check");
+  GLADE_HOOKUP_OBJECT (config_win, moth_httpworkaround_check, "moth_httpworkaround_check");
+  GLADE_HOOKUP_OBJECT (config_win, moth_opmaxused_hbox, "moth_opmaxused_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, moth_opmaxused_check, "moth_opmaxused_check");
+  GLADE_HOOKUP_OBJECT (config_win, moth_opmaxused_spin, "moth_opmaxused_spin");
+  GLADE_HOOKUP_OBJECT (config_win, moth_quantaudio_check, "moth_quantaudio_check");
+  GLADE_HOOKUP_OBJECT (config_win, moth_outputkeepopened_check, "moth_outputkeepopened_check");
+  GLADE_HOOKUP_OBJECT (config_win, label28, "label28");
+  GLADE_HOOKUP_OBJECT (config_win, config_misc_label, "config_misc_label");
+  GLADE_HOOKUP_OBJECT (config_win, config_presets_page, "config_presets_page");
+  GLADE_HOOKUP_OBJECT (config_win, presets_name_hbox, "presets_name_hbox");
+  GLADE_HOOKUP_OBJECT (config_win, presets_name_entry, "presets_name_entry");
+  GLADE_HOOKUP_OBJECT (config_win, presets_delete_button, "presets_delete_button");
+  GLADE_HOOKUP_OBJECT (config_win, presets_new_button, "presets_new_button");
+  GLADE_HOOKUP_OBJECT (config_win, presets_list_scrolledwindow, "presets_list_scrolledwindow");
+  GLADE_HOOKUP_OBJECT (config_win, presets_list_list, "presets_list_list");
+  GLADE_HOOKUP_OBJECT (config_win, presets_list_bbox, "presets_list_bbox");
+  GLADE_HOOKUP_OBJECT (config_win, presets_load_button, "presets_load_button");
+  GLADE_HOOKUP_OBJECT (config_win, presets_save_button, "presets_save_button");
+  GLADE_HOOKUP_OBJECT (config_win, config_presets_label, "config_presets_label");
+  GLADE_HOOKUP_OBJECT (config_win, config_bbox, "config_bbox");
+  GLADE_HOOKUP_OBJECT (config_win, config_ok, "config_ok");
+  GLADE_HOOKUP_OBJECT (config_win, config_cancel, "config_cancel");
+  GLADE_HOOKUP_OBJECT (config_win, config_apply, "config_apply");
+  GLADE_HOOKUP_OBJECT_NO_REF (config_win, tooltips, "tooltips");
+
+  return config_win;
+}
+
+GtkWidget*
+create_monitor_win (void)
+{
+  GtkWidget *monitor_win;
+  GtkWidget *monitor_table;
+  GtkWidget *monitor_output_hbox;
+  GtkWidget *monitor_output_progress;
+  GtkWidget *monitor_output_label2;
+  GtkWidget *monitor_displaylabel_hbox;
+  GtkWidget *monitor_display_label;
+  GtkWidget *monitor_position_hbox;
+  GtkWidget *monpos_position_label;
+  GtkWidget *monpos_label1;
+  GtkWidget *monpos_total_label;
+  GtkWidget *monpos_label2;
+  GtkWidget *monpos_left_label;
+  GtkWidget *monpos_label3;
+  GtkWidget *monpos_written_time_label;
+  GtkWidget *monpos_output_time_separator_label;
+  GtkWidget *monpos_output_time_label;
+  GtkWidget *monitor_outputlabel_hbox;
+  GtkWidget *monitor_output_label;
+  GtkWidget *monitor_positionlabel_hbox;
+  GtkWidget *monitor_position_label;
+  GtkWidget *monitor_display_frame;
+  GtkWidget *monitor_display_drawingarea;
+
+  monitor_win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  gtk_window_set_title (GTK_WINDOW (monitor_win), "Crossfade Buffer Monitor");
+  gtk_window_set_default_size (GTK_WINDOW (monitor_win), 320, -1);
+
+  monitor_table = gtk_table_new (3, 2, FALSE);
+  gtk_widget_show (monitor_table);
+  gtk_container_add (GTK_CONTAINER (monitor_win), monitor_table);
+  gtk_container_set_border_width (GTK_CONTAINER (monitor_table), 5);
+  gtk_table_set_row_spacings (GTK_TABLE (monitor_table), 3);
+  gtk_table_set_col_spacings (GTK_TABLE (monitor_table), 5);
+
+  monitor_output_hbox = gtk_hbox_new (FALSE, 3);
+  gtk_widget_show (monitor_output_hbox);
+  gtk_table_attach (GTK_TABLE (monitor_table), monitor_output_hbox, 1, 2, 1, 2,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+
+  monitor_output_progress = gtk_progress_bar_new ();
+  gtk_widget_show (monitor_output_progress);
+  gtk_box_pack_start (GTK_BOX (monitor_output_hbox), monitor_output_progress, TRUE, TRUE, 0);
+
+  monitor_output_label2 = gtk_label_new ("ms");
+  gtk_widget_show (monitor_output_label2);
+  gtk_box_pack_start (GTK_BOX (monitor_output_hbox), monitor_output_label2, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (monitor_output_label2), GTK_JUSTIFY_CENTER);
+
+  monitor_displaylabel_hbox = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (monitor_displaylabel_hbox);
+  gtk_table_attach (GTK_TABLE (monitor_table), monitor_displaylabel_hbox, 0, 1, 0, 1,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+
+  monitor_display_label = gtk_label_new ("Mixing Buffer:");
+  gtk_widget_show (monitor_display_label);
+  gtk_box_pack_end (GTK_BOX (monitor_displaylabel_hbox), monitor_display_label, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (monitor_display_label), GTK_JUSTIFY_CENTER);
+
+  monitor_position_hbox = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (monitor_position_hbox);
+  gtk_table_attach (GTK_TABLE (monitor_table), monitor_position_hbox, 1, 2, 2, 3,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+
+  monpos_position_label = gtk_label_new ("-:--.-");
+  gtk_widget_show (monpos_position_label);
+  gtk_box_pack_start (GTK_BOX (monitor_position_hbox), monpos_position_label, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (monpos_position_label), GTK_JUSTIFY_CENTER);
+
+  monpos_label1 = gtk_label_new (" / ");
+  gtk_widget_show (monpos_label1);
+  gtk_box_pack_start (GTK_BOX (monitor_position_hbox), monpos_label1, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (monpos_label1), GTK_JUSTIFY_CENTER);
+
+  monpos_total_label = gtk_label_new ("-:--");
+  gtk_widget_show (monpos_total_label);
+  gtk_box_pack_start (GTK_BOX (monitor_position_hbox), monpos_total_label, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (monpos_total_label), GTK_JUSTIFY_CENTER);
+
+  monpos_label2 = gtk_label_new (" total, ");
+  gtk_widget_show (monpos_label2);
+  gtk_box_pack_start (GTK_BOX (monitor_position_hbox), monpos_label2, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (monpos_label2), GTK_JUSTIFY_CENTER);
+
+  monpos_left_label = gtk_label_new ("-:--");
+  gtk_widget_show (monpos_left_label);
+  gtk_box_pack_start (GTK_BOX (monitor_position_hbox), monpos_left_label, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (monpos_left_label), GTK_JUSTIFY_CENTER);
+
+  monpos_label3 = gtk_label_new (" left");
+  gtk_widget_show (monpos_label3);
+  gtk_box_pack_start (GTK_BOX (monitor_position_hbox), monpos_label3, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (monpos_label3), GTK_JUSTIFY_CENTER);
+
+  monpos_written_time_label = gtk_label_new ("-:--:--.-");
+  gtk_widget_show (monpos_written_time_label);
+  gtk_box_pack_end (GTK_BOX (monitor_position_hbox), monpos_written_time_label, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (monpos_written_time_label), GTK_JUSTIFY_CENTER);
+
+  monpos_output_time_separator_label = gtk_label_new (" / ");
+  gtk_widget_show (monpos_output_time_separator_label);
+  gtk_box_pack_end (GTK_BOX (monitor_position_hbox), monpos_output_time_separator_label, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (monpos_output_time_separator_label), GTK_JUSTIFY_CENTER);
+
+  monpos_output_time_label = gtk_label_new ("-:--.---");
+  gtk_widget_show (monpos_output_time_label);
+  gtk_box_pack_end (GTK_BOX (monitor_position_hbox), monpos_output_time_label, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (monpos_output_time_label), GTK_JUSTIFY_CENTER);
+
+  monitor_outputlabel_hbox = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (monitor_outputlabel_hbox);
+  gtk_table_attach (GTK_TABLE (monitor_table), monitor_outputlabel_hbox, 0, 1, 1, 2,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (GTK_FILL), 0, 0);
+
+  monitor_output_label = gtk_label_new ("Output Buffer:");
+  gtk_widget_show (monitor_output_label);
+  gtk_box_pack_end (GTK_BOX (monitor_outputlabel_hbox), monitor_output_label, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (monitor_output_label), GTK_JUSTIFY_CENTER);
+
+  monitor_positionlabel_hbox = gtk_hbox_new (FALSE, 0);
+  gtk_widget_show (monitor_positionlabel_hbox);
+  gtk_table_attach (GTK_TABLE (monitor_table), monitor_positionlabel_hbox, 0, 1, 2, 3,
+                    (GtkAttachOptions) (GTK_FILL),
+                    (GtkAttachOptions) (0), 0, 0);
+
+  monitor_position_label = gtk_label_new ("Position:");
+  gtk_widget_show (monitor_position_label);
+  gtk_box_pack_end (GTK_BOX (monitor_positionlabel_hbox), monitor_position_label, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (monitor_position_label), GTK_JUSTIFY_CENTER);
+
+  monitor_display_frame = gtk_frame_new (NULL);
+  gtk_widget_show (monitor_display_frame);
+  gtk_table_attach (GTK_TABLE (monitor_table), monitor_display_frame, 1, 2, 0, 1,
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                    (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+
+  monitor_display_drawingarea = gtk_drawing_area_new ();
+  gtk_widget_show (monitor_display_drawingarea);
+  gtk_container_add (GTK_CONTAINER (monitor_display_frame), monitor_display_drawingarea);
+
+  g_signal_connect ((gpointer) monitor_win, "delete_event",
+                    G_CALLBACK (on_monitor_win_delete_event),
+                    NULL);
+  g_signal_connect ((gpointer) monitor_display_drawingarea, "expose_event",
+                    G_CALLBACK (on_monitor_display_drawingarea_expose_event),
+                    NULL);
+
+  /* Store pointers to all widgets, for use by lookup_widget(). */
+  GLADE_HOOKUP_OBJECT_NO_REF (monitor_win, monitor_win, "monitor_win");
+  GLADE_HOOKUP_OBJECT (monitor_win, monitor_table, "monitor_table");
+  GLADE_HOOKUP_OBJECT (monitor_win, monitor_output_hbox, "monitor_output_hbox");
+  GLADE_HOOKUP_OBJECT (monitor_win, monitor_output_progress, "monitor_output_progress");
+  GLADE_HOOKUP_OBJECT (monitor_win, monitor_output_label2, "monitor_output_label2");
+  GLADE_HOOKUP_OBJECT (monitor_win, monitor_displaylabel_hbox, "monitor_displaylabel_hbox");
+  GLADE_HOOKUP_OBJECT (monitor_win, monitor_display_label, "monitor_display_label");
+  GLADE_HOOKUP_OBJECT (monitor_win, monitor_position_hbox, "monitor_position_hbox");
+  GLADE_HOOKUP_OBJECT (monitor_win, monpos_position_label, "monpos_position_label");
+  GLADE_HOOKUP_OBJECT (monitor_win, monpos_label1, "monpos_label1");
+  GLADE_HOOKUP_OBJECT (monitor_win, monpos_total_label, "monpos_total_label");
+  GLADE_HOOKUP_OBJECT (monitor_win, monpos_label2, "monpos_label2");
+  GLADE_HOOKUP_OBJECT (monitor_win, monpos_left_label, "monpos_left_label");
+  GLADE_HOOKUP_OBJECT (monitor_win, monpos_label3, "monpos_label3");
+  GLADE_HOOKUP_OBJECT (monitor_win, monpos_written_time_label, "monpos_written_time_label");
+  GLADE_HOOKUP_OBJECT (monitor_win, monpos_output_time_separator_label, "monpos_output_time_separator_label");
+  GLADE_HOOKUP_OBJECT (monitor_win, monpos_output_time_label, "monpos_output_time_label");
+  GLADE_HOOKUP_OBJECT (monitor_win, monitor_outputlabel_hbox, "monitor_outputlabel_hbox");
+  GLADE_HOOKUP_OBJECT (monitor_win, monitor_output_label, "monitor_output_label");
+  GLADE_HOOKUP_OBJECT (monitor_win, monitor_positionlabel_hbox, "monitor_positionlabel_hbox");
+  GLADE_HOOKUP_OBJECT (monitor_win, monitor_position_label, "monitor_position_label");
+  GLADE_HOOKUP_OBJECT (monitor_win, monitor_display_frame, "monitor_display_frame");
+  GLADE_HOOKUP_OBJECT (monitor_win, monitor_display_drawingarea, "monitor_display_drawingarea");
+
+  return monitor_win;
+}
+
+GtkWidget*
+create_about_win (void)
+{
+  GtkWidget *about_win;
+  GtkWidget *about_vbox;
+  GtkWidget *about_label;
+  GtkWidget *about_actionarea;
+  GtkWidget *about_ok;
+
+  about_win = gtk_dialog_new ();
+  gtk_window_set_title (GTK_WINDOW (about_win), "About XMMS Crossfade Plugin");
+  gtk_window_set_type_hint (GTK_WINDOW (about_win), GDK_WINDOW_TYPE_HINT_DIALOG);
+
+  about_vbox = GTK_DIALOG (about_win)->vbox;
+  gtk_widget_show (about_vbox);
+
+  about_label = gtk_label_new ("dummy");
+  gtk_widget_show (about_label);
+  gtk_box_pack_start (GTK_BOX (about_vbox), about_label, FALSE, FALSE, 0);
+  gtk_label_set_justify (GTK_LABEL (about_label), GTK_JUSTIFY_CENTER);
+
+  about_actionarea = GTK_DIALOG (about_win)->action_area;
+  gtk_widget_show (about_actionarea);
+  gtk_button_box_set_layout (GTK_BUTTON_BOX (about_actionarea), GTK_BUTTONBOX_END);
+
+  about_ok = gtk_button_new_with_mnemonic ("OK");
+  gtk_widget_show (about_ok);
+  gtk_dialog_add_action_widget (GTK_DIALOG (about_win), about_ok, 0);
+
+  g_signal_connect_swapped ((gpointer) about_ok, "clicked",
+                            G_CALLBACK (gtk_widget_destroy),
+                            GTK_OBJECT (about_win));
+  g_signal_connect_after ((gpointer) about_ok, "leave",
+                          G_CALLBACK (gtk_widget_hide),
+                          NULL);
+
+  /* Store pointers to all widgets, for use by lookup_widget(). */
+  GLADE_HOOKUP_OBJECT_NO_REF (about_win, about_win, "about_win");
+  GLADE_HOOKUP_OBJECT_NO_REF (about_win, about_vbox, "about_vbox");
+  GLADE_HOOKUP_OBJECT (about_win, about_label, "about_label");
+  GLADE_HOOKUP_OBJECT_NO_REF (about_win, about_actionarea, "about_actionarea");
+  GLADE_HOOKUP_OBJECT (about_win, about_ok, "about_ok");
+
+  return about_win;
+}
+
+GtkWidget*
+create_help_win (void)
+{
+  GtkWidget *help_win;
+  GtkWidget *help_vbox;
+  GtkWidget *help_scrolledwindow;
+  GtkWidget *help_text;
+  GtkWidget *help_buttonbox;
+  GtkWidget *help_close_button;
+
+  help_win = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  gtk_window_set_title (GTK_WINDOW (help_win), "Help");
+
+  help_vbox = gtk_vbox_new (FALSE, 0);
+  gtk_widget_show (help_vbox);
+  gtk_container_add (GTK_CONTAINER (help_win), help_vbox);
+  gtk_container_set_border_width (GTK_CONTAINER (help_vbox), 5);
+
+  help_scrolledwindow = gtk_scrolled_window_new (NULL, NULL);
+  gtk_widget_show (help_scrolledwindow);
+  gtk_box_pack_start (GTK_BOX (help_vbox), help_scrolledwindow, TRUE, TRUE, 0);
+  GTK_WIDGET_UNSET_FLAGS (help_scrolledwindow, GTK_CAN_FOCUS);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (help_scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
+  gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (help_scrolledwindow), GTK_SHADOW_IN);
+
+  help_text = gtk_text_view_new ();
+  gtk_widget_show (help_text);
+  gtk_container_add (GTK_CONTAINER (help_scrolledwindow), help_text);
+  gtk_text_view_set_editable (GTK_TEXT_VIEW (help_text), FALSE);
+  gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (help_text), GTK_WRAP_WORD);
+  gtk_text_buffer_set_text (gtk_text_view_get_buffer (GTK_TEXT_VIEW (help_text)), "<dummy>\n", -1);
+
+  help_buttonbox = gtk_hbutton_box_new ();
+  gtk_widget_show (help_buttonbox);
+  gtk_box_pack_start (GTK_BOX (help_vbox), help_buttonbox, FALSE, FALSE, 0);
+  gtk_button_box_set_layout (GTK_BUTTON_BOX (help_buttonbox), GTK_BUTTONBOX_END);
+  gtk_box_set_spacing (GTK_BOX (help_buttonbox), 30);
+
+  help_close_button = gtk_button_new_with_mnemonic ("Close");
+  gtk_widget_show (help_close_button);
+  gtk_container_add (GTK_CONTAINER (help_buttonbox), help_close_button);
+  GTK_WIDGET_SET_FLAGS (help_close_button, GTK_CAN_DEFAULT);
+
+  g_signal_connect ((gpointer) help_close_button, "clicked",
+                    G_CALLBACK (on_help_close_button_clicked),
+                    NULL);
+
+  /* Store pointers to all widgets, for use by lookup_widget(). */
+  GLADE_HOOKUP_OBJECT_NO_REF (help_win, help_win, "help_win");
+  GLADE_HOOKUP_OBJECT (help_win, help_vbox, "help_vbox");
+  GLADE_HOOKUP_OBJECT (help_win, help_scrolledwindow, "help_scrolledwindow");
+  GLADE_HOOKUP_OBJECT (help_win, help_text, "help_text");
+  GLADE_HOOKUP_OBJECT (help_win, help_buttonbox, "help_buttonbox");
+  GLADE_HOOKUP_OBJECT (help_win, help_close_button, "help_close_button");
+
+  return help_win;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/Output/crossfade/interface-2.0.h	Tue Dec 06 16:09:32 2005 -0800
@@ -0,0 +1,8 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+GtkWidget* create_config_win (void);
+GtkWidget* create_monitor_win (void);
+GtkWidget* create_about_win (void);
+GtkWidget* create_help_win (void);
--- a/Plugins/Output/crossfade/monitor.c	Tue Dec 06 14:02:16 2005 -0800
+++ b/Plugins/Output/crossfade/monitor.c	Tue Dec 06 16:09:32 2005 -0800
@@ -234,11 +234,7 @@
 
     /*** Position ***/
     if(1 || (monitor_position_label && monitor_total_label && monitor_left_label)) {
-#ifndef HAVE_BEEP
-      if(!get_input_playing() || (monitor_closing == CLOSED)) {  /* XMMS */
-#else
       if(!bmp_playback_get_playing() || (monitor_closing == CLOSED)) {  /* XMMS */
-#endif
 	gtk_label_set_text(monitor_position_label, default_position_str);
 	gtk_label_set_text(monitor_total_label,    default_total_str);
 	gtk_label_set_text(monitor_left_label,     default_left_str);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/Output/crossfade/support-2.0.c	Tue Dec 06 16:09:32 2005 -0800
@@ -0,0 +1,144 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdio.h>
+
+#include <gtk/gtk.h>
+
+#include "support-2.0.h"
+
+GtkWidget*
+lookup_widget                          (GtkWidget       *widget,
+                                        const gchar     *widget_name)
+{
+  GtkWidget *parent, *found_widget;
+
+  for (;;)
+    {
+      if (GTK_IS_MENU (widget))
+        parent = gtk_menu_get_attach_widget (GTK_MENU (widget));
+      else
+        parent = widget->parent;
+      if (!parent)
+        parent = (GtkWidget*) g_object_get_data (G_OBJECT (widget), "GladeParentKey");
+      if (parent == NULL)
+        break;
+      widget = parent;
+    }
+
+  found_widget = (GtkWidget*) g_object_get_data (G_OBJECT (widget),
+                                                 widget_name);
+  if (!found_widget)
+    g_warning ("Widget not found: %s", widget_name);
+  return found_widget;
+}
+
+static GList *pixmaps_directories = NULL;
+
+/* Use this function to set the directory containing installed pixmaps. */
+void
+add_pixmap_directory                   (const gchar     *directory)
+{
+  pixmaps_directories = g_list_prepend (pixmaps_directories,
+                                        g_strdup (directory));
+}
+
+/* This is an internally used function to find pixmap files. */
+static gchar*
+find_pixmap_file                       (const gchar     *filename)
+{
+  GList *elem;
+
+  /* We step through each of the pixmaps directory to find it. */
+  elem = pixmaps_directories;
+  while (elem)
+    {
+      gchar *pathname = g_strdup_printf ("%s%s%s", (gchar*)elem->data,
+                                         G_DIR_SEPARATOR_S, filename);
+      if (g_file_test (pathname, G_FILE_TEST_EXISTS))
+        return pathname;
+      g_free (pathname);
+      elem = elem->next;
+    }
+  return NULL;
+}
+
+/* This is an internally used function to create pixmaps. */
+GtkWidget*
+create_pixmap                          (GtkWidget       *widget,
+                                        const gchar     *filename)
+{
+  gchar *pathname = NULL;
+  GtkWidget *pixmap;
+
+  if (!filename || !filename[0])
+      return gtk_image_new ();
+
+  pathname = find_pixmap_file (filename);
+
+  if (!pathname)
+    {
+      g_warning ("Couldn't find pixmap file: %s", filename);
+      return gtk_image_new ();
+    }
+
+  pixmap = gtk_image_new_from_file (pathname);
+  g_free (pathname);
+  return pixmap;
+}
+
+/* This is an internally used function to create pixmaps. */
+GdkPixbuf*
+create_pixbuf                          (const gchar     *filename)
+{
+  gchar *pathname = NULL;
+  GdkPixbuf *pixbuf;
+  GError *error = NULL;
+
+  if (!filename || !filename[0])
+      return NULL;
+
+  pathname = find_pixmap_file (filename);
+
+  if (!pathname)
+    {
+      g_warning ("Couldn't find pixmap file: %s", filename);
+      return NULL;
+    }
+
+  pixbuf = gdk_pixbuf_new_from_file (pathname, &error);
+  if (!pixbuf)
+    {
+      fprintf (stderr, "Failed to load pixbuf file: %s: %s\n",
+               pathname, error->message);
+      g_error_free (error);
+    }
+  g_free (pathname);
+  return pixbuf;
+}
+
+/* This is used to set ATK action descriptions. */
+void
+glade_set_atk_action_description       (AtkAction       *action,
+                                        const gchar     *action_name,
+                                        const gchar     *description)
+{
+  gint n_actions, i;
+
+  n_actions = atk_action_get_n_actions (action);
+  for (i = 0; i < n_actions; i++)
+    {
+      if (!strcmp (atk_action_get_name (action, i), action_name))
+        atk_action_set_description (action, i, description);
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Plugins/Output/crossfade/support-2.0.h	Tue Dec 06 16:09:32 2005 -0800
@@ -0,0 +1,44 @@
+/*
+ * DO NOT EDIT THIS FILE - it is generated by Glade.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+
+/*
+ * Public Functions.
+ */
+
+/*
+ * This function returns a widget in a component created by Glade.
+ * Call it with the toplevel widget in the component (i.e. a window/dialog),
+ * or alternatively any widget in the component, and the name of the widget
+ * you want returned.
+ */
+GtkWidget*  lookup_widget              (GtkWidget       *widget,
+                                        const gchar     *widget_name);
+
+
+/* Use this function to set the directory containing installed pixmaps. */
+void        add_pixmap_directory       (const gchar     *directory);
+
+
+/*
+ * Private Functions.
+ */
+
+/* This is used to create the pixmaps used in the interface. */
+GtkWidget*  create_pixmap              (GtkWidget       *widget,
+                                        const gchar     *filename);
+
+/* This is used to create the pixbufs used in the interface. */
+GdkPixbuf*  create_pixbuf              (const gchar     *filename);
+
+/* This is used to set ATK action descriptions. */
+void        glade_set_atk_action_description (AtkAction       *action,
+                                              const gchar     *action_name,
+                                              const gchar     *description);
+