changeset 2775:5df83337516f

branch merge
author Andrew O. Shadoura <bugzilla@tut.by>
date Fri, 13 Jun 2008 05:57:25 +0300
parents f1f7ee810de8 (current diff) 99dd09396885 (diff)
children 4c092042129b
files configure.ac extra.mk.in m4/libmikmod.m4 src/OSS/about.c src/OSS/convert.c src/OSS/init.c src/OSS4/about.c src/OSS4/init.c src/alsa/init.c src/filewriter/filewriter.c src/filewriter/filewriter.h src/filewriter/mp3.c src/filewriter/vorbis.c src/lirc/lirc_cfg.c src/modplug/gui/Makefile src/modplug/load_j2b.cxx src/modplug/load_mid.cxx src/modplug/modplug.h src/scrobbler/md5.c src/scrobbler/md5.h src/sid/xs_md5.c src/sid/xs_md5.h
diffstat 374 files changed, 36328 insertions(+), 17644 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.hgignore	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,27 @@
+syntax: regexp
+^aclocal\.m4
+^autom4te\.cache
+^audacious\.pc
+^audclient\.pc
+^buildsys\.mk
+^config\.h
+^config\.h\.in
+^config\.log
+^config\.status
+^configure
+^extra\.mk
+^po/Makefile
+^po/Makefile\.in
+^po/POTFILES
+^po/stamp-po
+syntax: glob
+.deps
+*.a
+*.dylib
+*.gmo
+*.o
+*.so
+*~
+*.swp
+*.patch
+*.diff
--- a/AUTHORS	Fri Jun 13 04:58:39 2008 +0300
+++ b/AUTHORS	Fri Jun 13 05:57:25 2008 +0300
@@ -1,10 +1,11 @@
-Audacious (C) GPL 2005-2006
+Audacious (C) GPL 2005-2008
 
 Authors listed alphabetically, by last name:
 --------------------------------------------
 
 George Averill <nhjm449@gmail.com>
 Michael Färber <0102@gmx.at>
+Matti Hämäläinen <ccr@tnsp.org>
 Giacomo Lozito <james@develia.org>
 William Pitcock <nenolod@nenolod.net>
 Derek Pomery <nemo@m8y.org>
--- a/acinclude.m4	Fri Jun 13 04:58:39 2008 +0300
+++ b/acinclude.m4	Fri Jun 13 05:57:25 2008 +0300
@@ -1,9 +1,232 @@
-dnl ADD_PKG_REQUIRES([requirement])
+
+dnl ** ADD_PKG_REQUIRES([requirement])
+AC_DEFUN([ADD_PC_REQUIRES], [
+   if test "x$PC_REQUIRES" = "x"; then
+       PC_REQUIRES="$1"
+   else
+       PC_REQUIRES="$PC_REQUIRES, $1"
+   fi
+   AC_SUBST([PC_REQUIRES])
+])
+
+
+dnl ** Like PKG_CHECK_MODULES, but provides an informative error message.
+dnl ** AUD_CHECK_MODULE([define name], [module], [version required],
+dnl **     [informational name], [additional error message])
+dnl **
+dnl ** AUD_CHECK_MODULE([GLIB], [gtk+-2.0], [>= 2.10.0], [Gtk+2], [See http://www.gtk.org/])
+AC_DEFUN([AUD_CHECK_MODULE], [
+    PKG_CHECK_MODULES([$1], [$2 $3], [
+        ADD_PC_REQUIRES([$2 $3])
+    ],[
+        PKG_CHECK_EXISTS([$2], [
+            cv_pkg_version=`$PKG_CONFIG --modversion "$2" 2>/dev/null`
+            AC_MSG_ERROR([[
+$4 version $cv_pkg_version was found, but $2 $3 is required.
+$5]])
+        ],[
+            AC_MSG_ERROR([[
+Cannot find $4! If you are using binary packages based system, check that you
+have the corresponding -dev/devel packages installed.
+$5]])
+        ])
+    ])
+])
+
+
+dnl ** Simplifying wrapper
+AC_DEFUN([AUD_CONDITIONAL],
+[if test "x${$2}" = m4_ifval([$3], ["x$3"],["xyes"]) ; then
+    $1="yes"
+else
+    $1="no"
+fi
+AC_SUBST([$1])dnl
+])
+
+
+dnl ** Simple wrapper for AC_ARG_ENABLE
+dnl ** AUD_ARG_ENABLE([name], [default value], [help string], [if enabled], [if disabled])
+AC_DEFUN([AUD_ARG_ENABLE], [dnl
+    define([Name], [translit([$1], [./-], [___])])
+    AC_ARG_ENABLE([$1], [$3],, [enable_[]Name=$2])
+    if test "x${enable_[]Name}" = "xyes"; then
+        m4_ifvaln([$4], [$4], [:])dnl
+        m4_ifvaln([$5], [else $5])dnl
+    fi
+])
+
+
+AC_DEFUN([AUD_ARG_SIMPLE], [dnl
+    define([Name], [translit([$1], [./-], [___])])
+    AC_ARG_ENABLE([$1], [$3],, [enable_[]Name=$2])
+    if test "x${enable_[]Name}" = "xyes"; then
+        AC_DEFINE([$4], [$5], [$6])
+    fi
+    AUD_CONDITIONAL([$4], [enable_$1])
+    AC_SUBST([$4])
+])
+
+
+dnl ** Wrapper for cached compilation check
+dnl ** AUD_TRY_COMPILE([message], [result variable], [includes], [body], [if ok], [if not ok])
+AC_DEFUN([AUD_TRY_COMPILE], [dnl
+    AC_CACHE_CHECK([$1], [$2],
+    [AC_TRY_COMPILE([$3], [$4], [$2="yes"], [$2="no"])])
+    if test "x${$2}" = "xyes"; then
+        m4_ifvaln([$5], [$5], [:])dnl
+        m4_ifvaln([$6], [else $6])dnl
+    fi
+])
+
 
-AC_DEFUN([ADD_PC_REQUIRES],
+dnl ** Check for GNU make
+AC_DEFUN([AUD_CHECK_GNU_MAKE],[
+    AC_CACHE_CHECK([for GNU make],cv_gnu_make_command,[
+    cv_gnu_make_command=""
+    for a in "$MAKE" make gmake gnumake; do
+        test "x$a" = "x" && continue
+        if ( sh -c "$a --version" 2>/dev/null | grep "GNU Make" >/dev/null ) ; then
+            cv_gnu_make_command="$a"
+            break
+        fi
+    done
+    ])
+    if test "x$cv_gnu_make_command" != "x" ; then
+        MAKE="$cv_gnu_make_command"
+    else
+        AC_MSG_ERROR([** GNU make not found. If it is installed, try setting MAKE environment variable. **])
+    fi
+    AC_SUBST([MAKE])
+])
+
+
+dnl *** Define plugin directories
+AC_DEFUN([AUD_DEFINE_PLUGIN_DIR],[
+define([Name], [translit([$1], [a-z], [A-Z])])dnl
+if test "x$enable_one_plugin_dir" = "xyes"; then
+ifdef([aud_plugin_dirs_defined],[],
+[    pluginsubs="\\\"Plugins\\\""
+])dnl
+    Name[]_PLUGIN_DIR="Plugins"
+else
+    ifdef([aud_def_plugin_dirs_defined],
+    [pluginsubs="$pluginsubs,\\\"$1\\\""],
+    [pluginsubs="\\\"$1\\\""])
+    Name[]_PLUGIN_DIR="$1"
+fi
+AC_SUBST(Name[]_PLUGIN_DIR)dnl
+define([aud_def_plugin_dirs_defined],[1])dnl
+])dnl
+
+
+dnl *** Get plugin directories
+AC_DEFUN([AUD_GET_PLUGIN_DIR],[
+define([Name], [translit([$1_plugin_dir], [A-Z], [a-z])])dnl
+define([BigName], [translit([$1], [a-z], [A-Z])])dnl
+ifdef([aud_get_plugin_dirs_defined],
+[pluginsubs="$pluginsubs,\\\"$1\\\""],
+[pluginsubs="\\\"$1\\\""])
+BigName[]_PLUGIN_DIR=`pkg-config audacious --variable=[]Name[]`
+AC_SUBST(BigName[]_PLUGIN_DIR)dnl
+define([aud_get_plugin_dirs_defined],[1])dnl
+])dnl
+
+
+
+dnl ***
+dnl *** Common checks
+dnl ***
+AC_DEFUN([AUD_COMMON_PROGS], [
+
+dnl Check for C and C++ compilers
+dnl =============================
+AUD_CHECK_GNU_MAKE
+AC_PROG_CC
+AC_PROG_CXX
+AM_PROG_AS
+AC_ISC_POSIX
+AC_C_BIGENDIAN
+
+if test "x$GCC" = "xyes"; then
+    CFLAGS="$CFLAGS -Wall -pipe"
+    CXXFLAGS="$CXXFLAGS -pipe -Wall"
+fi
+
+dnl Checks for various programs
+dnl ===========================
+AC_PROG_LN_S
+AC_PROG_MAKE_SET
+AC_PATH_PROG([RM], [rm])
+AC_PATH_PROG([MV], [mv])
+AC_PATH_PROG([CP], [cp])
+AC_PATH_PROG([AR], [ar])
+AC_PATH_PROG([RANLIB], [ranlib])
+
+
+dnl Check for Gtk+/GLib and pals
+dnl ============================
+AUD_CHECK_MODULE([GLIB], [glib-2.0], [>= 2.14.0], [Glib2])
+AUD_CHECK_MODULE([GTHREAD], [gthread-2.0], [>= 2.14.0], [gthread-2.0])
+AUD_CHECK_MODULE([GTK], [gtk+-2.0], [>= 2.10.0], [Gtk+2])
+AUD_CHECK_MODULE([PANGO], [pango], [>= 1.8.0], [Pango])
+AUD_CHECK_MODULE([CAIRO], [cairo], [>= 1.2.4], [Cairo])
+
+
+dnl Check for libmowgli
+dnl ===================
+AUD_CHECK_MODULE([MOWGLI], [libmowgli], [>= 0.4.0], [libmowgli],
+    [http://www.atheme.org/projects/mowgli.shtml])
+
+
+dnl Check for libmcs
+dnl ================
+AUD_CHECK_MODULE([LIBMCS], [libmcs], [>= 0.7], [libmcs],
+    [http://www.atheme.org/projects/mcs.shtml])
+
+
+dnl SSE2 support
+dnl ============
+AUD_ARG_ENABLE([sse2], [yes],
+[  --disable-sse2               Disable SSE2 support (def: enabled)],
 [
-   test -z "$PC_REQUIRES" && PC_REQUIRES="$1" || PC_REQUIRES="$PC_REQUIRES, $1"
-   AC_SUBST(PC_REQUIRES)
-]
-)
+    AC_MSG_CHECKING([SSE2 support])
+    aud_my_save_CFLAGS="$CFLAGS"
+    CFLAGS="-msse2"
+    AC_TRY_RUN([
+#include <emmintrin.h>
+int main()
+{
+  _mm_setzero_pd();
+  return 0;
+}
+    ],[
+        AC_MSG_RESULT([yes])
+        AC_DEFINE([HAVE_SSE2], 1, [Define to 1 if your system has SSE2 support])
+        SIMD_CFLAGS="-msse2"
+    ],[
+        AC_MSG_RESULT([no])
+        enable_sse2="no"
+    ])
+    AC_SUBST([SIMD_CFLAGS])
+    CFLAGS="$aud_my_save_CFLAGS"
+])
 
+dnl AltiVec support 
+dnl ===============
+AUD_ARG_ENABLE([altivec], [yes],
+[  --disable-altivec            Disable AltiVec support (def: enabled)],
+[
+    AC_CHECK_HEADERS([altivec.h],
+    [
+        AC_DEFINE([HAVE_ALTIVEC], 1, [Define to 1 if your system has AltiVec.])
+        AC_DEFINE([HAVE_ALTIVEC_H], 1, [Define to 1 if your system has an altivec.h file.])
+        AC_DEFINE([ARCH_POWERPC], 1, [Define to 1 if your system is a PowerPC.])
+        SIMD_CFLAGS="-maltivec"
+        AC_SUBST([SIMD_CFLAGS])
+    ],[
+        enable_altivec="no"
+    ])
+])    
+
+])
--- a/buildsys.mk.in	Fri Jun 13 04:58:39 2008 +0300
+++ b/buildsys.mk.in	Fri Jun 13 05:57:25 2008 +0300
@@ -132,7 +132,7 @@
 		${LINK_FAILED}; \
 	fi
 
-${PLUGIN} ${PLUGIN_NONST}: ${EXT_DEPS} ${OBJS}
+${PLUGIN} ${PLUGIN_NOINST}: ${EXT_DEPS} ${OBJS}
 	${LINK_STATUS}
 	if ${LD} -o $@ ${OBJS} ${PLUGIN_LDFLAGS} ${LDFLAGS} ${LIBS}; then \
 		${LINK_OK}; \
--- a/m4/libmikmod.m4	Fri Jun 13 04:58:39 2008 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,86 +0,0 @@
-# Configure paths for libmikmod
-#
-# Derived from libmikmod.m4 (Owen Taylor 97-11-3)
-#
-
-dnl AM_PATH_LIBMIKMOD([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]])
-dnl Test for libmikmod, and define LIBMIKMOD_CFLAGS, LIBMIKMOD_LIBS and
-dnl LIBMIKMOD_LDADD
-dnl
-AC_DEFUN([AM_PATH_LIBMIKMOD],
-[dnl 
-dnl Get the cflags and libraries from the libmikmod-config script
-dnl
-AC_ARG_WITH(libmikmod-prefix,[  --with-libmikmod-prefix=PFX   Prefix where libmikmod is installed (optional)],
-            libmikmod_config_prefix="$withval", libmikmod_config_prefix="")
-AC_ARG_WITH(libmikmod-exec-prefix,[  --with-libmikmod-exec-prefix=PFX Exec prefix where libmikmod is installed (optional)],
-            libmikmod_config_exec_prefix="$withval", libmikmod_config_exec_prefix="")
-
-  if test x$libmikmod_config_exec_prefix != x ; then
-     libmikmod_config_args="$libmikmod_config_args --exec-prefix=$libmikmod_config_exec_prefix"
-     if test x${LIBMIKMOD_CONFIG+set} != xset ; then
-        LIBMIKMOD_CONFIG=$libmikmod_config_exec_prefix/bin/libmikmod-config
-     fi
-  fi
-  if test x$libmikmod_config_prefix != x ; then
-     libmikmod_config_args="$libmikmod_config_args --prefix=$libmikmod_config_prefix"
-     if test x${LIBMIKMOD_CONFIG+set} != xset ; then
-        LIBMIKMOD_CONFIG=$libmikmod_config_prefix/bin/libmikmod-config
-     fi
-  fi
-
-  AC_PATH_PROG(LIBMIKMOD_CONFIG, libmikmod-config, no)
-  min_libmikmod_version=ifelse([$1], ,3.1.5,$1)
-  AC_MSG_CHECKING(for libmikmod - version >= $min_libmikmod_version)
-  no_libmikmod=""
-  if test "$LIBMIKMOD_CONFIG" = "no" ; then
-    no_libmikmod=yes
-  else
-    LIBMIKMOD_CFLAGS=`$LIBMIKMOD_CONFIG $libmikmod_config_args --cflags`
-    LIBMIKMOD_LIBS=`$LIBMIKMOD_CONFIG $libmikmod_config_args --libs`
-    LIBMIKMOD_LDADD=`$LIBMIKMOD_CONFIG $libmikmod_config_args --ldadd`
-    libmikmod_config_major_version=`$LIBMIKMOD_CONFIG $libmikmod_config_args --version | \
-           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\).*/\1/'`
-    libmikmod_config_minor_version=`$LIBMIKMOD_CONFIG $libmikmod_config_args --version | \
-           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\).*/\2/'`
-    libmikmod_config_micro_version=`$LIBMIKMOD_CONFIG $libmikmod_config_args --version | \
-           sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\).*/\3/'`
-  fi
-  if test "x$no_libmikmod" = x ; then
-     AC_MSG_RESULT(yes)
-     ifelse([$2], , :, [$2])     
-  else
-     AC_MSG_RESULT(no)
-     if test "$LIBMIKMOD_CONFIG" = "no" ; then
-       echo "*** The libmikmod-config script installed by libmikmod could not be found"
-       echo "*** If libmikmod was installed in PREFIX, make sure PREFIX/bin is in"
-       echo "*** your path, or set the LIBMIKMOD_CONFIG environment variable to the"
-       echo "*** full path to libmikmod-config."
-     fi
-     LIBMIKMOD_CFLAGS=""
-     LIBMIKMOD_LIBS=""
-     LIBMIKMOD_LDADD=""
-     ifelse([$3], , :, [$3])
-  fi
-  AC_SUBST(LIBMIKMOD_CFLAGS)
-  AC_SUBST(LIBMIKMOD_LIBS)
-  AC_SUBST(LIBMIKMOD_LDADD)
-  rm -f conf.mikmodtest
-])
-
-AC_DEFUN([AC_FIND_FILE],
-    [
-	$3=NO
-	for i in $2;
-	do
-	  for j in $1;
-	  do
-	    if test -r "$i/$j"; then
-		  $3=$i
-		  break 2
-		fi
-	  done
-	done
-    ]
-)
-
--- a/m4/pkg.m4	Fri Jun 13 04:58:39 2008 +0300
+++ b/m4/pkg.m4	Fri Jun 13 05:57:25 2008 +0300
@@ -1,58 +1,157 @@
-
-dnl PKG_CHECK_MODULES(GSTUFF, gtk+-2.0 >= 1.3 glib = 1.3.4, action-if, action-not)
-dnl defines GSTUFF_LIBS, GSTUFF_CFLAGS, see pkg-config man page
-dnl also defines GSTUFF_PKG_ERRORS on error
-AC_DEFUN([PKG_CHECK_MODULES], [
-  succeeded=no
-
-  if test -z "$PKG_CONFIG"; then
-    AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
-  fi
-
-  if test "$PKG_CONFIG" = "no" ; then
-     echo "*** The pkg-config script could not be found. Make sure it is"
-     echo "*** in your path, or set the PKG_CONFIG environment variable"
-     echo "*** to the full path to pkg-config."
-     echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config."
-  else
-     PKG_CONFIG_MIN_VERSION=0.9.0
-     if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then
-        AC_MSG_CHECKING(for $2)
-
-        if $PKG_CONFIG --exists "$2" ; then
-            AC_MSG_RESULT(yes)
-            succeeded=yes
+# pkg.m4 - Macros to locate and utilise pkg-config.            -*- Autoconf -*-
+# 
+# Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
+#
+# 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.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
 
-            AC_MSG_CHECKING($1_CFLAGS)
-            $1_CFLAGS=`$PKG_CONFIG --cflags "$2"`
-            AC_MSG_RESULT($$1_CFLAGS)
+# PKG_PROG_PKG_CONFIG([MIN-VERSION])
+# ----------------------------------
+AC_DEFUN([PKG_PROG_PKG_CONFIG],
+[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
+m4_pattern_allow([^PKG_CONFIG(_PATH)?$])
+AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl
+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
+	AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
+fi
+if test "x$PKG_CONFIG" != "x"; then
+	_pkg_min_version=m4_default([$1], [0.9.0])
+	AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
+	if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version ; then
+		AC_MSG_RESULT([yes])
+	else
+		AC_MSG_RESULT([no])
+		PKG_CONFIG=""
+	fi
+		
+fi[]dnl
+])# PKG_PROG_PKG_CONFIG
 
-            AC_MSG_CHECKING($1_LIBS)
-            $1_LIBS=`$PKG_CONFIG --libs "$2"`
-            AC_MSG_RESULT($$1_LIBS)
-        else
-	    AC_MSG_RESULT(no)
-            $1_CFLAGS=""
-            $1_LIBS=""
-            ## If we have a custom action on failure, don't print errors, but 
-            ## do set a variable so people can do so.
-            $1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"`
-            ifelse([$4], ,echo $$1_PKG_ERRORS,)
-        fi
-
-        AC_SUBST($1_CFLAGS)
-        AC_SUBST($1_LIBS)
-     else
-        echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer."
-        echo "*** See http://www.freedesktop.org/software/pkgconfig"
-     fi
-  fi
-
-  if test $succeeded = yes; then
-     ifelse([$3], , :, [$3])
-  else
-     ifelse([$4], , AC_MSG_ERROR([Library requirements ($2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.]), [$4])
-  fi
-])
+# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+#
+# Check to see whether a particular set of modules exists.  Similar
+# to PKG_CHECK_MODULES(), but does not set variables or print errors.
+#
+#
+# Similar to PKG_CHECK_MODULES, make sure that the first instance of
+# this or PKG_CHECK_MODULES is called, or make sure to call
+# PKG_CHECK_EXISTS manually
+# --------------------------------------------------------------
+AC_DEFUN([PKG_CHECK_EXISTS],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+if test "x$PKG_CONFIG" != "x" && \
+    AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
+  m4_ifval([$2], [$2], [:])
+m4_ifvaln([$3], [else
+  $3])dnl
+fi])
 
 
+# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
+# ---------------------------------------------
+m4_define([_PKG_CONFIG],
+[if test "x$PKG_CONFIG" != "x"; then
+    if test "x$$1" != "x"; then
+        pkg_cv_[]$1="$$1"
+    else
+        PKG_CHECK_EXISTS([$3],
+                         [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`],
+			 [pkg_failed=yes])
+    fi
+else
+	pkg_failed=untried
+fi[]dnl
+])# _PKG_CONFIG
+
+# _PKG_SHORT_ERRORS_SUPPORTED
+# -----------------------------
+AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi[]dnl
+])# _PKG_SHORT_ERRORS_SUPPORTED
+
+
+# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
+# [ACTION-IF-NOT-FOUND])
+#
+#
+# Note that if there is a possibility the first call to
+# PKG_CHECK_MODULES might not happen, you should be sure to include an
+# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
+#
+#
+# --------------------------------------------------------------
+AC_DEFUN([PKG_CHECK_MODULES],
+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
+AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
+AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
+
+pkg_failed=no
+AC_MSG_CHECKING([for $1])
+
+_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
+_PKG_CONFIG([$1][_LIBS], [libs], [$2])
+
+m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS
+and $1[]_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.])
+
+if test "x$pkg_failed" = "xyes"; then
+        _PKG_SHORT_ERRORS_SUPPORTED
+        if test "x$_pkg_short_errors_supported" = "xyes"; then
+	        $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2" 2>&1`
+        else 
+	        $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2" 2>&1`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
+
+	ifelse([$4], , [AC_MSG_ERROR(dnl
+[Package requirements ($2) were not met:
+
+$$1_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+_PKG_TEXT
+])],
+		[AC_MSG_RESULT([no])
+                $4])
+elif test "x$pkg_failed" = "xuntried"; then
+	ifelse([$4], , [AC_MSG_FAILURE(dnl
+[The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+_PKG_TEXT
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.])],
+		[$4])
+else
+	$1[]_CFLAGS="$pkg_cv_[]$1[]_CFLAGS"
+	$1[]_LIBS="$pkg_cv_[]$1[]_LIBS"
+        AC_MSG_RESULT([yes])
+	ifelse([$3], , :, [$3])
+fi[]dnl
+])# PKG_CHECK_MODULES
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/m4/sid.m4	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,26 @@
+
+AC_DEFUN([AM_PATH_SIDPLAY],
+[
+XS_ARG_WITH([sidplay1], [libSIDPlay1], [XS_PATH_LIBSIDPLAY1])
+if test "x$xs_have_sidplay1" = "xyes"; then
+	AC_DEFINE([HAVE_SIDPLAY1])
+fi
+
+XS_ARG_WITH([sidplay2], [libSIDPlay2], [XS_PATH_LIBSIDPLAY2])
+if test "x$xs_have_sidplay2" = "xyes"; then
+	AC_DEFINE([HAVE_SIDPLAY2])
+	AC_LANG_PUSH([C++])
+	XS_BUILDERS_CHECK
+	XS_BUILDERS_FIND([reSID], [resid-builder], [resid.h], [ReSIDBuilder])
+	XS_BUILDERS_FIND([HardSID], [hardsid-builder], [hardsid.h], [HardSID])
+	AC_LANG_POP([C++])
+	if test "x$xs_builders_available" = "xno"; then
+		AC_MSG_ERROR([No builder modules were found in the sidbuilders directory!]);
+	fi
+fi
+
+if test "x$xs_have_sidplay1" = "xyes" || test "x$xs_have_sidplay2" = "xyes"; then
+	m4_ifvaln([$1], [$1], [:])
+	m4_ifvaln([$2], [else $2])
+fi
+])
--- a/m4/sidplay.m4	Fri Jun 13 04:58:39 2008 +0300
+++ b/m4/sidplay.m4	Fri Jun 13 05:57:25 2008 +0300
@@ -1,44 +1,124 @@
-# Configure paths for SID support
+dnl *** These m4-macros are originally based on XSIDPLAY v1.6.5's acinclude.m4
+dnl *** (C) Copyright 2002 Michael Schwendt, licensed under GNU GPL v2.
+dnl ***
+dnl *** Updated for new autotools, plus namespace, added portability
+dnl *** fixes and other minor changes by Matti 'ccr' Hamalainen
+dnl *** (C) Copyright 2003-2008 Tecnic Software productions (TNSP)
 
-dnl -------------------------------------------------------------------------
-dnl Try to find a file (or one of more files in a list of dirs).
-dnl -------------------------------------------------------------------------
-
-AC_DEFUN([SIDPLAY_FIND_FILE],
+AC_DEFUN([XS_FIND_FILE],
 [
-$3=""
-for i in $2; do
-for j in $1; do
-if test -r "$i/$j"; then
-	$3=$i
-	break 2
-	fi
-done
-done
+    $3=""
+    for i in $2; do
+        for j in $1; do
+            if test -r "$i/$j"; then
+                $3="$i"
+                break 2
+            fi
+        done
+    done
 ])
 
-AC_DEFUN([SIDPLAY_TRY_LINK_SAVE],
+
+AC_DEFUN([XS_TRY_LIBRARY],
 [
-    xs_cxx_save="$CXX"
-    xs_cxxflags_save="$CXXFLAGS"
-    xs_ldflags_save="$LDFLAGS"
-    xs_libs_save="$LIBS"
+# xs_try_library ( $1:$2:$3:$4:$5:$6 )
+    AC_LANG_ASSERT([C++])
+    m4_ifvaln([$2], [xs_cxxflags_save="$CXXFLAGS"
+    CXXFLAGS="$CXXFLAGS $2"])dnl
+    m4_ifvaln([$3], [xs_ldflags_save="$LDFLAGS"
+    LDFLAGS="$LDFLAGS $3"])dnl
+    m4_ifvaln([$4], [xs_libs_save="$LIBS"
+    LIBS="$LIBS -l$4"])dnl
+    AC_LINK_IFELSE(
+        [
+        AC_LANG_PROGRAM(
+            [#include <$5>],
+            [$6]
+        )],
+        [xs_$1_works="yes"],
+        [xs_$1_works="no"]
+    )
+    m4_ifvaln([$2], [CXXFLAGS="$xs_cxxflags_save"])dnl
+    m4_ifvaln([$3], [LDFLAGS="$xs_ldflags_save"])dnl
+    m4_ifvaln([$4], [LIBS="$xs_libs_save"])dnl
 ])
 
 
-AC_DEFUN([SIDPLAY_TRY_LINK_RESTORE],
+AC_DEFUN([XS_LIB_RESULT],
+[
+# xs_lib_result ( $1:$2:$3 )
+    define([Name], [translit([$1], [a-z], [A-Z])])dnl
+    if test "x$xs_have_$1" = "xyes"; then
+        if test "x$xs_$1_cxxflags" != "x" || test "x$xs_$1_ldflags" != "x"; then
+            AC_MSG_RESULT([$xs_$1_cxxflags $2 $xs_$1_ldflags $3])
+        else
+            AC_MSG_RESULT([yes])
+        fi
+
+        Name[]_LIBS="$xs_$1_ldflags $2"
+        Name[]_CFLAGS="$xs_$1_cxxflags $3"
+        AC_SUBST(Name[]_LIBS)dnl
+        AC_SUBST(Name[]_CFLAGS)dnl
+    else
+        AC_MSG_RESULT([no])
+    fi
+])
+
+
+AC_DEFUN([XS_PROG_PKGCONFIG],
 [
-    CXX="$xs_cxx_save"
-    CXXFLAGS="$xs_cxxflags_save"
-    LDFLAGS="$xs_ldflags_save"
-    LIBS="$xs_libs_save"
+    AC_PATH_PROG([PKG_CONFIG], [pkg-config])dnl
+])
+
+
+AC_DEFUN([XS_ARG_WITH], [dnl
+# xs_arg_with ( $1:$2:$3 )
+    define([Name], [translit([$1], [a-z], [A-Z])])dnl
+    AH_TEMPLATE(HAVE_[]Name, [Define if you have and want to use $2])dnl
+    AC_ARG_WITH([$1],
+        [  --with-$1=PREFIX   Enable $2 with install-PREFIX], [dnl
+        if test "x$withval" = "xyes"; then
+            xs_use_$1="yes"
+            xs_$1_library=""
+            xs_$1_includes=""
+        else
+            if test "x$withval" = "xno"; then
+                xs_use_$1="no"
+            else
+                xs_use_$1="yes"
+                xs_$1_includes="$withval/include"
+                xs_$1_library="$withval/lib"
+            fi
+        fi
+    ],[dnl
+        xs_use_$1="try"
+        xs_$1_library=""
+        xs_$1_includes=""
+    ])dnl
+    AC_ARG_WITH([$1-inc],
+    [  --with-$1-inc=DIR    Where the $2 headers are located],
+    [xs_$1_includes="$withval"])dnl
+    AC_ARG_WITH([$1-lib],
+    [  --with-$1-lib=DIR    Where the $2 library is installed],
+    [xs_$1_library="$withval"])dnl
+
+    dnl Okay, handle this
+    xs_have_$1="no"
+    if test "x$xs_use_$1" = "xtry"; then
+        $3
+    elif test "x$xs_use_$1" = "xyes"; then
+        $3
+        if test "x$xs_have_$1" = "xno"; then
+            AC_MSG_ERROR([$2 library and/or headers were not found!])
+        fi
+    fi
 ])
 
 
 dnl -------------------------------------------------------------------------
 dnl Try to find SIDPLAY library and header files.
 dnl $xs_have_sidplay1 will be "yes" or "no"
-dnl @SIDPLAY1_LDADD@ will be substituted with linker parameters
+dnl @SIDPLAY1_LIBS@ will be substituted with linker parameters
 dnl @SIDPLAY1_INCLUDES@ will be substituted with compiler parameters
 dnl -------------------------------------------------------------------------
 
@@ -48,107 +128,75 @@
 
     AC_LANG_PUSH([C++])
     
-    # Use include path given by user (if any).
-    if test -n "$xs_sidplay1_includes"; then
+    dnl Use include path given by user (if any).
+    if test "x$xs_sidplay1_includes" != "x"; then
         xs_sidplay1_cxxflags="-I$xs_sidplay1_includes"
     else
         xs_sidplay1_cxxflags=""
     fi
 
-    # Use library path given by user (if any).
-    if test -n "$xs_sidplay1_library"; then
+    dnl Use library path given by user (if any).
+    if test "x$xs_sidplay1_library" != "x"; then
         xs_sidplay1_ldflags="-L$xs_sidplay1_library"
     else
         xs_sidplay1_ldflags=""
     fi
 
-    AC_CACHE_VAL(xs_cv_have_sidplay1,
+    AC_CACHE_VAL([xs_cv_have_sidplay1],
     [
-        # Run test compilation with either standard search path
-        # or user-defined paths.
-        SIDPLAY_TRY_LIBSIDPLAY1
-        if test "$xs_sidplay1_works" = yes; then
+        dnl Run test compilation with either standard search path
+        dnl or user-defined paths.
+        XS_TRY_LIBSIDPLAY1
+        if test "x$xs_sidplay1_works" = "xyes"; then
           xs_cv_have_sidplay1="xs_have_sidplay1=yes  \
             xs_sidplay1_cxxflags=\"$xs_sidplay1_cxxflags\"  \
             xs_sidplay1_ldflags=\"$xs_sidplay1_ldflags\"  "
         else
-            SIDPLAY_FIND_LIBSIDPLAY1        
+            XS_FIND_LIBSIDPLAY1        
         fi
     ])
-
     eval "$xs_cv_have_sidplay1"
-
-    if test "$xs_have_sidplay1" = yes; then
-        if test -n "$xs_sidplay1_cxxflags" || test -n "$xs_sidplay1_ldflags"; then
-            AC_MSG_RESULT([$xs_sidplay1_cxxflags $xs_sidplay1_ldflags])
-        else
-            AC_MSG_RESULT([yes])
-        fi
-
-    SIDPLAY1_LDADD="$xs_sidplay1_ldflags -lsidplay"
-    SIDPLAY1_INCLUDES="$xs_sidplay1_cxxflags"
-    AC_SUBST([SIDPLAY1_LDADD])
-    AC_SUBST([SIDPLAY1_INCLUDES])
-    else
-        AC_MSG_RESULT([no])
-    fi
-
+    XS_LIB_RESULT([sidplay1], [-lsidplay], [])
     AC_LANG_POP([C++])
 ])
 
 dnl Functions used by XS_PATH_LIBSIDPLAY1.
 
-AC_DEFUN([SIDPLAY_FIND_LIBSIDPLAY1],
+AC_DEFUN([XS_FIND_LIBSIDPLAY1],
 [
-    # Search common locations where header files might be stored.
-   xs_sidplay1_incdirs="$xs_sidplay1_includes /usr/include /usr/local/include /usr/lib/sidplay/include /usr/local/lib/sidplay/include /opt/sfw/include /opt/csw/include"
-    SIDPLAY_FIND_FILE(sidplay/sidtune.h, $xs_sidplay1_incdirs, xs_sidplay1_includes)
+    dnl Search common locations where header files might be stored.
+    XS_FIND_FILE([xs_sidplay1_includes], [sidplay/sidtune.h],
+    [$xs_sidplay1_includes /usr/include /usr/local/include /usr/lib/sidplay/include /usr/local/lib/sidplay/include /opt/sfw/include /opt/csw/include])
 
-    # Search common locations where library might be stored.
-    xs_sidplay1_libdirs="$xs_sidplay1_library /usr/lib /usr/lib/sidplay /usr/local/lib/sidplay /opt/sfw/lib /opt/csw/lib"
-    SIDPLAY_FIND_FILE(libsidplay.a libsidplay.so libsidplay.so.1 libsidplay.so.1.36 libsidplay.so.1.37,
-                 $xs_sidplay1_libdirs, xs_sidplay1_library)
+    dnl Search common locations where library might be stored.
+    XS_FIND_FILE([xs_sidplay1_library],
+    [libsidplay.a libsidplay.so libsidplay.so.1 libsidplay.so.1.36 libsidplay.so.1.37],
+    [$xs_sidplay1_library /usr/lib /usr/lib/sidplay /usr/local/lib/sidplay /opt/sfw/lib /opt/csw/lib])
 
-    if test -z "$xs_sidplay1_includes" || test -z "$xs_sidplay1_library"; then
+    if test "x$xs_sidplay1_includes" = "x" || test "x$xs_sidplay1_library" = "x"; then
         xs_cv_have_sidplay1="xs_have_sidplay1=no  \
           xs_sidplay1_ldflags=\"\" xs_sidplay1_cxxflags=\"\"  "
     else
-        # Test compilation with found paths.
+        dnl Test compilation with found paths.
         xs_sidplay1_ldflags="-L$xs_sidplay1_library"
         xs_sidplay1_cxxflags="-I$xs_sidplay1_includes"
-        SIDPLAY_TRY_LIBSIDPLAY1
+        XS_TRY_LIBSIDPLAY1
         xs_cv_have_sidplay1="xs_have_sidplay1=$xs_sidplay1_works  \
           xs_sidplay1_ldflags=\"$xs_sidplay1_ldflags\"  \
           xs_sidplay1_cxxflags=\"$xs_sidplay1_cxxflags\"  "
     fi
 ])
 
-AC_DEFUN([SIDPLAY_TRY_LIBSIDPLAY1],
-[
-    SIDPLAY_TRY_LINK_SAVE
-
-    CXXFLAGS="$CXXFLAGS $xs_sidplay1_cxxflags"
-    LDFLAGS="$LDFLAGS $xs_sidplay1_ldflags"
-    LIBS="$LIBS -lsidplay"
-
-    AC_LINK_IFELSE([AC_LANG_PROGRAM(
-        [[#include <sidplay/sidtune.h>]],
-        [[sidTune* myTest = new sidTune(0);]])],
-        [xs_sidplay1_works=yes],
-        [xs_sidplay1_works=no]
-    )
-
-    SIDPLAY_TRY_LINK_RESTORE
+AC_DEFUN([XS_TRY_LIBSIDPLAY1],[
+    XS_TRY_LIBRARY([sidplay1], [$xs_sidplay1_cxxflags], [$xs_sidplay1_ldflags],
+    [sidplay], [sidplay/sidtune.h], [sidTune* myTest = new sidTune(0);])
 ])
 
 
-
-
-
 dnl -------------------------------------------------------------------------
 dnl Try to find SIDPLAY2 library and header files.
 dnl $xs_have_sidplay2 will be "yes" or "no"
-dnl @SIDPLAY_LDADD@ will be substituted with linker parameters
+dnl @SIDPLAY_LIBS@ will be substituted with linker parameters
 dnl @SIDPLAY_INCLUDES@ will be substituted with compiler parameters
 dnl -------------------------------------------------------------------------
 AC_DEFUN([XS_PATH_LIBSIDPLAY2],
@@ -157,141 +205,115 @@
 
     AC_LANG_PUSH([C++])
     
-    AC_PATH_PROG([PKG_CONFIG], [pkg-config])
-    if test -n "$PKG_CONFIG" && $PKG_CONFIG --atleast-version $LIBSIDPLAY2_REQUIRED_VERSION libsidplay2; then
-        xs_pkgcfg_knows=yes
+    AC_REQUIRE([XS_PROG_PKGCONFIG])
+    if test "x$PKG_CONFIG" != "x" && $PKG_CONFIG --atleast-version m4_ifval([$1], [$1], [2.1.0]) libsidplay2; then
+        xs_pkgcfg_knows="yes"
     else
-        xs_pkgcfg_knows=no
+        xs_pkgcfg_knows="no"
     fi
 
-    # Derive sidbuilders path from libsidplay2 root.
-    if test -n "$xs_sidplay2_library"; then
+    dnl Derive sidbuilders path from libsidplay2 root.
+    if test "x$xs_sidplay2_library" != "x"; then
         xs_sidplay2_builders="$xs_sidplay2_library/sidplay/builders"
-    elif test "$xs_pkgcfg_knows" = yes ; then
+    elif test "x$xs_pkgcfg_knows" = "xyes" ; then
         xs_sidplay2_builders=`$PKG_CONFIG --variable=builders libsidplay2`
     fi
 
-    AC_CACHE_VAL(xs_cv_have_sidplay2,
+    AC_CACHE_VAL([xs_cv_have_sidplay2],
     [
-        # Run test compilation with either standard search path
-        # or user-defined paths.
-        xs_sidplay2_ldadd="-lsidplay2"
-        SIDPLAY_TRY_LIBSIDPLAY2
-        if test "$xs_sidplay2_works" = yes; then
+        dnl Run test compilation with either standard search path
+        dnl or user-defined paths.
+        xs_sidplay2_ldflags="-lsidplay2"
+        XS_TRY_LIBSIDPLAY2
+        if test "x$xs_sidplay2_works" = "xyes"; then
           xs_cv_have_sidplay2="xs_have_sidplay2=yes  \
             xs_sidplay2_cxxflags=\"$xs_sidplay2_cxxflags\"  \
-            xs_sidplay2_ldadd=\"$xs_sidplay2_ldadd\"  \
+            xs_sidplay2_ldflags=\"$xs_sidplay2_ldflags\"  \
             xs_sidplay2_builders=\"$xs_sidplay2_builders\"  "
         else
-            SIDPLAY_FIND_LIBSIDPLAY2
+            XS_FIND_LIBSIDPLAY2
         fi
     ])
     eval "$xs_cv_have_sidplay2"
-    if test "$xs_have_sidplay2" = yes; then
-        if test -n "$xs_sidplay2_cxxflags" || test -n "$xs_sidplay2_ldadd"; then
-            AC_MSG_RESULT([$xs_sidplay2_cxxflags $xs_sidplay2_ldadd])
-        else
-            AC_MSG_RESULT([yes])
-        fi
-
-    SIDPLAY2_LDADD="$xs_sidplay2_ldadd"
-    SIDPLAY2_INCLUDES="$xs_sidplay2_cxxflags"
-    AC_SUBST([SIDPLAY2_LDADD])
-    AC_SUBST([SIDPLAY2_INCLUDES])
-    else
-        AC_MSG_RESULT([no])
-    fi
-
+    XS_LIB_RESULT([sidplay2], [], [])
     AC_LANG_POP([C++])
 ])
 
 
 dnl Functions used by XS_PATH_LIBSIDPLAY2.
-AC_DEFUN([SIDPLAY_FIND_LIBSIDPLAY2],
+AC_DEFUN([XS_FIND_LIBSIDPLAY2],
 [
-    # See whether user didn't provide paths.
-    if test -z "$xs_sidplay2_includes"; then
-        if test "$xs_pkgcfg_knows" = yes ; then
+    dnl See whether user didn't provide paths.
+    if test "x$xs_sidplay2_includes" = "x"; then
+        if test "x$xs_pkgcfg_knows" = "xyes" ; then
             xs_sidplay2_includes=`$PKG_CONFIG --variable=includedir libsidplay2`
             xs_sidplay2_cxxflags=`$PKG_CONFIG --cflags libsidplay2`
         else
-            # Search common locations where header files might be stored.
-            xs_sidplay2_incdirs="$xs_sidplay2_includes $xs_sidplay2_includes/include /usr/include /usr/local/include /usr/lib/sidplay/include /usr/local/lib/sidplay/include /opt/sfw/include /opt/csw/include"
-            SIDPLAY_FIND_FILE(sidplay/sidplay2.h,$xs_sidplay2_incdirs,xs_sidplay2_includes)
+            dnl Search common locations where header files might be stored.
+            XS_FIND_FILE([xs_sidplay2_includes], [sidplay/sidplay2.h],
+            [$xs_sidplay2_includes $xs_sidplay2_includes/include /usr/include /usr/local/include /usr/lib/sidplay/include /usr/local/lib/sidplay/include /opt/sfw/include /opt/csw/include])
             xs_sidplay2_cxxflags="-I$xs_sidplay2_includes"
         fi
     else
         xs_sidplay2_cxxflags="-I$xs_sidplay2_includes"
     fi
-    if test -z "$xs_sidplay2_library"; then
-        if test "$xs_pkgcfg_knows" = yes ; then
+    if test "x$xs_sidplay2_library" = "x"; then
+        if test "x$xs_pkgcfg_knows" = "xyes" ; then
             xs_sidplay2_library=`$PKG_CONFIG --variable=libdir libsidplay2`
-            xs_sidplay2_ldadd=`$PKG_CONFIG --libs libsidplay2`
+            xs_sidplay2_ldflags=`$PKG_CONFIG --libs libsidplay2`
             xs_sidplay2_builders=`$PKG_CONFIG --variable=builders libsidplay2`
         else
-            # Search common locations where library might be stored.
-            xs_sidplay2_libdirs="$xs_sidplay2_library $xs_sidplay2_library/lib $xs_sidplay2_library/src /usr/lib /usr/lib/sidplay /usr/local/lib/sidplay /opt/sfw/lib /opt/csw/lib"
-            SIDPLAY_FIND_FILE(libsidplay2.la,$xs_sidplay2_libdirs,xs_sidplay2_library)
-            xs_sidplay2_ldadd="-L$xs_sidplay2_library -lsidplay2"
+            dnl Search common locations where library might be stored.
+            XS_FIND_FILE([xs_sidplay2_library], [libsidplay2.la],
+            [$xs_sidplay2_library $xs_sidplay2_library/lib $xs_sidplay2_library/src /usr/lib /usr/lib/sidplay /usr/local/lib/sidplay /opt/sfw/lib /opt/csw/lib])
+            xs_sidplay2_ldflags="-L$xs_sidplay2_library -lsidplay2"
             xs_sidplay2_builders="$xs_sidplay2_library/sidplay/builders"
         fi
     else
-        xs_sidplay2_ldadd="-L$xs_sidplay2_library -lsidplay2"
+        xs_sidplay2_ldflags="-L$xs_sidplay2_library -lsidplay2"
     fi
-    if test -z "$xs_sidplay2_includes" || test -z "$xs_sidplay2_library"; then
+    if test "x$xs_sidplay2_includes" = "x" || test "x$xs_sidplay2_library" = "x"; then
         xs_cv_have_sidplay2="xs_have_sidplay2=no \
-          xs_sidplay2_ldadd=\"\" xs_sidplay2_cxxflags=\"\" \
+          xs_sidplay2_ldflags=\"\" xs_sidplay2_cxxflags=\"\" \
           xs_sidplay2_builders=\"\" "
     else
-        # Test compilation with found paths.
-        xs_sidplay2_ldadd="-L$xs_sidplay2_library -lsidplay2"
+        dnl Test compilation with found paths.
+        xs_sidplay2_ldflags="-L$xs_sidplay2_library -lsidplay2"
         xs_sidplay2_cxxflags="-I$xs_sidplay2_includes"
-        SIDPLAY_TRY_LIBSIDPLAY2
+        XS_TRY_LIBSIDPLAY2
         xs_cv_have_sidplay2="xs_have_sidplay2=$xs_sidplay2_works \
-          xs_sidplay2_ldadd=\"$xs_sidplay2_ldadd\" \
+          xs_sidplay2_ldflags=\"$xs_sidplay2_ldflags\" \
           xs_sidplay2_cxxflags=\"$xs_sidplay2_cxxflags\" \
           xs_sidplay2_builders=\"$xs_sidplay2_builders\" "
     fi
 ])
 
 
-AC_DEFUN([SIDPLAY_TRY_LIBSIDPLAY2],
+AC_DEFUN([XS_TRY_LIBSIDPLAY2],
 [
-    SIDPLAY_TRY_LINK_SAVE
-
-    CXXFLAGS="$CXXFLAGS $xs_sidplay2_cxxflags -DHAVE_UNIX"
-    LDFLAGS="$LDFLAGS $xs_sidplay2_ldadd"
-
-    AC_LINK_IFELSE([AC_LANG_PROGRAM(
-        [[#include <sidplay/sidplay2.h>]],
-        [[sidplay2 *myEngine;]])],
-        [xs_sidplay2_works=yes],
-        [xs_sidplay2_works=no]
-    )
-
-    SIDPLAY_TRY_LINK_RESTORE
+    XS_TRY_LIBRARY([sidplay2],
+        [$xs_sidplay2_cxxflags -DHAVE_UNIX], [$xs_sidplay2_ldflags],
+        [sidplay2], [sidplay/sidplay2.h], [sidplay2 *myEngine;])
 ])
 
 
 dnl -------------------------------------------------------------------------
 dnl Find libsidplay2 builders (sidbuilders) dir.
-dnl @BUILDERS_INCLUDES@
+dnl @BUILDERS_CFLAGS@
 dnl @BUILDERS_LDFLAGS@
 dnl -------------------------------------------------------------------------
-AC_DEFUN([BUILDERS_FIND],
+AC_DEFUN([XS_BUILDERS_CHECK],
 [
     AC_MSG_CHECKING([for SIDPlay2 builders directory])
-
-    AC_LANG_PUSH([C++])
-
+    AC_LANG_ASSERT([C++])
     AC_REQUIRE([XS_PATH_LIBSIDPLAY2])
 
     dnl Be pessimistic.
-    builders_available=no
+    builders_available="no"
 
     dnl Sidbuilder headers are included with "builders" prefix.
-    builders_includedir=$xs_sidplay2_includes
-    builders_libdir=$xs_sidplay2_builders
+    builders_includedir="$xs_sidplay2_includes"
+    builders_libdir="$xs_sidplay2_builders"
 
     dnl If libsidplay2 is in standard library search path, we need
     dnl to get an argument whether /usr, /usr/local, etc. Else we
@@ -300,36 +322,36 @@
     dnl is not defined in the configure script. So, this is a bit
     dnl ugly, but a satisfactory fallback default for those who
     dnl define ${prefix} and ${exec_prefix}.
-    if test -z $builders_libdir; then
+    if test "x$builders_libdir" = "x"; then
         eval "builders_libdir=$libdir/sidplay/builders"
     fi
 
-    AC_ARG_WITH(sidbuilders,
+    AC_ARG_WITH([sidbuilders],
         [  --with-sidbuilders=DIR  what the SIDPlay2 builders install PREFIX is],
         [builders_includedir="$withval/include"
          builders_libdir="$withval/lib/sidplay/builders"])
 
-    AC_ARG_WITH(builders-inc,
+    AC_ARG_WITH([builders-inc],
         [  --with-builders-inc=DIR where the SIDPlay2 builders headers are located],
         [builders_includedir="$withval"])
 
-    AC_ARG_WITH(builders-lib,
+    AC_ARG_WITH([builders-lib],
         [  --with-builders-lib=DIR where the SIDPlay2 builders libraries are installed],
         [builders_libdir="$withval"])
     
-    if test -n "$builders_includedir"; then
-        BUILDERS_INCLUDES="-I$builders_includedir"
+    if test "x$builders_includedir" != "x"; then
+        BUILDERS_CFLAGS="-I$builders_includedir"
     fi
 
-    if test -n "$builders_libdir"; then
+    if test "x$builders_libdir" != "x"; then
         BUILDERS_LDFLAGS="-L$builders_libdir"
     fi
 
-    if test -d $builders_libdir; then
-        xs_have_sidbuilders_dir=yes
+    if test -d "$builders_libdir"; then
+        xs_have_sidbuilders_dir="yes"
         AC_MSG_RESULT([$builders_libdir])
     else
-        xs_have_sidbuilders_dir=no
+        xs_have_sidbuilders_dir="no"
         AC_MSG_RESULT([$xs_have_sidbuilders_dir])
         AC_MSG_ERROR([$builders_libdir not found!
 Check --help on how to specify SIDPlay2 and/or builders library and
@@ -338,215 +360,26 @@
         ])
     fi
 
-    AC_SUBST([BUILDERS_INCLUDES])
+    AC_SUBST([BUILDERS_CFLAGS])
     AC_SUBST([BUILDERS_LDFLAGS])
-
-    AC_LANG_POP([C++])
-])
-
-
-dnl -------------------------------------------------------------------------
-dnl Test for working reSID builder.
-dnl sets $(RESID_LDADD), substitutes @RESID_LDADD@
-dnl -------------------------------------------------------------------------
-AC_DEFUN([BUILDERS_FIND_RESID],
-[
-    AC_MSG_CHECKING([for reSID builder module])
-    AC_LANG_PUSH([C++])
-    SIDPLAY_TRY_LINK_SAVE
-    
-    CXXFLAGS="$CXXFLAGS $BUILDERS_INCLUDES"
-    LDFLAGS="$LDFLAGS $BUILDERS_LDFLAGS"
-    LIBS="$LIBS -lresid-builder"
-
-    AC_LINK_IFELSE([AC_LANG_PROGRAM(
-        [[#include <sidplay/builders/resid.h>]],
-        [[ReSIDBuilder *sid;]])],
-        [builders_work=yes],
-        [builders_work=no]
-    )
-
-    SIDPLAY_TRY_LINK_RESTORE
-
-    if test "$builders_work" = yes; then
-        builders_available=yes
-        xs_builders="reSID $xs_builders"
-        AC_DEFINE([HAVE_RESID_BUILDER], [], [resid builder])
-        RESID_LDADD="-lresid-builder"
-    fi
-    AC_MSG_RESULT($builders_work)
-    AC_SUBST([RESID_LDADD])
-    AC_LANG_POP([C++])
 ])
 
 
 dnl -------------------------------------------------------------------------
-dnl Test for working HardSID builder.
-dnl sets $(HARDSID_LDADD), substitutes @HARDSID_LDADD@
+dnl Test for working builders
 dnl -------------------------------------------------------------------------
-AC_DEFUN([BUILDERS_FIND_HARDSID],
-[
-    AC_MSG_CHECKING([for HardSID builder module])
-    AC_LANG_PUSH([C++])
-    SIDPLAY_TRY_LINK_SAVE
-
-    CXXFLAGS="$CXXFLAGS $BUILDERS_INCLUDES"
-    LDFLAGS="$LDFLAGS $BUILDERS_LDFLAGS"
-    LIBS="$LIBS -lhardsid-builder"
-
-    AC_LINK_IFELSE([AC_LANG_PROGRAM(
-        [[#include <sidplay/builders/hardsid.h>]],
-        [[HardSID *sid;]])],
-        [builders_work=yes],
-        [builders_work=no]
-    )
-
-    SIDPLAY_TRY_LINK_RESTORE
-
-    if test "$builders_work" = yes; then
-        builders_available=yes
-        xs_builders="HardSID $xs_builders"
-        AC_DEFINE([HAVE_HARDSID_BUILDER], [], [harsid builder])
-        HARDSID_LDADD="-lhardsid-builder"
+AC_DEFUN([XS_BUILDERS_FIND], [dnl
+    define([Name], [translit([$1], [a-z], [A-Z])])dnl
+    AH_TEMPLATE(HAVE_[]Name[]_BUILDER, [Define if you have $1 for libSIDPlay 2])
+    AC_MSG_CHECKING([for $1 builder module])
+    XS_TRY_LIBRARY([builders], [$BUILDERS_CFLAGS], [$BUILDERS_LDFLAGS],
+    [$2], [sidplay/builders/$3], [$4 *sid;])
+    if test "x$xs_builders_works" = "xyes"; then
+        xs_builders_available="yes"
+        xs_builders="$1 $xs_builders"
+        AC_DEFINE(HAVE_[]Name[]_BUILDER)
+        BUILDERS_LIBS="$BUILDERS_LIBS -l$2"
     fi
-    AC_MSG_RESULT($builders_work)
-    AC_SUBST([HARDSID_LDADD])
-    AC_LANG_POP([C++])
-])
-
-
-dnl AM_PATH_SIDPLAY([ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
-dnl Test for SID libraries, and define SIDPLAY_CFLAGS and SIDPLAY_LIBS
-dnl
-AC_DEFUN([AM_PATH_SIDPLAY],
-[
-dnl 
-dnl Get the cflags and libraries
-dnl
-
-dnl ***
-dnl *** libSIDPlay 1 options
-dnl ***
-AC_ARG_WITH(sidplay1,
-[  --with-sidplay1=PREFIX   Enable SIDPlay1 with install-PREFIX],
-[
-if test "x$withval" = xyes; then
-xs_sidplay1=yes
-xs_sidplay1_library=""
-xs_sidplay1_includes=""
-else
-if test "x$withval" = xno; then
-	xs_sidplay1=no
-	else
-	xs_sidplay1=yes
-	xs_sidplay1_includes="$withval/include"
-	xs_sidplay1_library="$withval/lib"
-	fi
-fi
-],[
-xs_sidplay1=try
-xs_sidplay1_library=""
-xs_sidplay1_includes=""
+    AC_MSG_RESULT([$xs_builders_works])
+    AC_SUBST([BUILDERS_LIBS])
 ])
-
-AC_ARG_WITH(sidplay1-inc,
-[  --with-sidplay1-inc=DIR    Where the SIDPlay1 headers are located],
-[xs_sidplay1_includes="$withval"],)
-
-AC_ARG_WITH(sidplay1-lib,
-[  --with-sidplay1-lib=DIR    Where the SIDPlay1 library is installed],
-[xs_sidplay1_library="$withval"],)
-
-dnl ***
-dnl *** libSIDPlay 2 options
-dnl ***
-AC_ARG_WITH(sidplay2,
-[  --with-sidplay2=PREFIX   Enable SIDPlay2 with install-PREFIX],
-[
-if test "x$withval" = xyes; then
-xs_sidplay2=yes
-xs_sidplay2_library=""
-xs_sidplay2_includes=""
-else
-if test "x$withval" = xno; then
-	xs_sidplay2=no
-	else
-	xs_sidplay2=yes
-	xs_sidplay2_includes="$withval/include"
-	xs_sidplay2_library="$withval/lib"
-	fi
-fi
-],[
-xs_sidplay2=try
-xs_sidplay2_library=""
-xs_sidplay2_includes=""
-])
-
-AC_ARG_WITH(sidplay2-inc,
-[  --with-sidplay2-inc=DIR    Where the SIDPlay2 headers are located],
-[xs_sidplay2_includes="$withval"],)
-
-
-AC_ARG_WITH(sidplay2-lib,
-[  --with-sidplay2-lib=DIR    Where the SIDPlay2 library is installed],
-[xs_sidplay2_library="$withval"],)
-
-dnl ***
-dnl *** Determine if libraries are wanted and available
-dnl ***
-OPT_SIDPLAY1="no"
-if test "x$xs_sidplay1" = xtry; then
-	XS_PATH_LIBSIDPLAY1
-	else
-	if test "x$xs_sidplay1" = xyes; then
-		XS_PATH_LIBSIDPLAY1
-		if test "x$xs_have_sidplay1" = xno; then
-		AC_MSG_WARN([libSIDPlay1 library and/or headers were not found!])
-		fi
-	fi
-fi
-if test "x$xs_have_sidplay1" = xyes; then
-	AC_DEFINE([HAVE_SIDPLAY1],[],[sidplay1 available])
-	OPT_SIDPLAY1="yes"
-fi
-
-OPT_SIDPLAY2="no"
-LIBSIDPLAY2_REQUIRED_VERSION="2.1.0"
-if test "x$xs_sidplay2" = xtry; then
-	XS_PATH_LIBSIDPLAY2
-	else
-	if test "x$xs_sidplay2" = xyes; then
-		XS_PATH_LIBSIDPLAY2
-		if test "x$xs_have_sidplay2" = xno; then
-		AC_MSG_WARN([libSIDPlay2 library and/or headers were not found!])
-		fi
-	fi
-fi
-if test "x$xs_have_sidplay2" = xyes; then
-	AC_DEFINE([HAVE_SIDPLAY2],[],[sidplay2 available])
-	OPT_SIDPLAY2="yes"
-	BUILDERS_FIND
-	BUILDERS_FIND_RESID
-	BUILDERS_FIND_HARDSID
-	if test "x$builders_available" = xno; then
-		AC_MSG_WARN([No builder modules were found in the sidbuilders directory!]);
-	fi
-fi
-
-
-dnl ***
-dnl *** Check if we have some emulator library available?
-dnl ***
-if test "x$OPT_SIDPLAY1" = xno; then
-if test "x$OPT_SIDPLAY2" = xno; then
-SIDPLAY_HAVESOMETHING="no"
-fi
-fi
-
-if test "x$SIDPLAY_HAVESOMETHING" = xno; then
-  ifelse([$2], , :, [$2])
-else
-  ifelse([$1], , :, [$1])
-fi
-
-])
--- a/po/Makevars	Fri Jun 13 04:58:39 2008 +0300
+++ b/po/Makevars	Fri Jun 13 05:57:25 2008 +0300
@@ -16,7 +16,7 @@
 # message catalogs shall be used.  It is usually empty.
 EXTRA_LOCALE_CATEGORIES =
 
-MSGID_BUGS_ADDRESS = http://bugs.audacious-media-player.org
+MSGID_BUGS_ADDRESS = http://bugzilla.atheme.org/
 
 build: all
 
--- a/po/POTFILES.in	Fri Jun 13 04:58:39 2008 +0300
+++ b/po/POTFILES.in	Fri Jun 13 05:57:25 2008 +0300
@@ -94,6 +94,7 @@
 src/OSS/configure.c
 src/paranormal-ng/plugin.c
 src/paranormal/plugin.c
+src/projectm-1.0/main.c
 src/pulse_audio/pulse_audio.c
 src/scrobbler/configure.c
 src/scrobbler/gerpok.c
@@ -127,7 +128,6 @@
 src/tta/libtta.c
 src/vorbis/configure.c
 src/vorbis/vorbis.c
-src/vorbis/vorbis.c~
 src/vtx/about.c
 src/vtx/info.c
 src/wavpack/ui.cxx
--- a/po/audacious-plugins.pot	Fri Jun 13 04:58:39 2008 +0300
+++ b/po/audacious-plugins.pot	Fri Jun 13 05:57:25 2008 +0300
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: http://bugs.audacious-media-player.org\n"
-"POT-Creation-Date: 2008-02-03 20:33+0200\n"
+"POT-Creation-Date: 2008-03-30 17:25+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -35,22 +35,22 @@
 #: src/adplug/adplug-xmms.cc:265 src/adplug/adplug-xmms.cc:526
 #: src/alac/plugin.c:77 src/arts/arts.c:26 src/arts/configure.c:90
 #: src/audiocompress/audacious-glue.c:102
-#: src/audiocompress/audacious-glue.c:552 src/cdaudio-ng/configure.c:227
-#: src/console/Audacious_Driver.cxx:449 src/demac/plugin.c:392
+#: src/audiocompress/audacious-glue.c:552 src/cdaudio-ng/configure.c:228
+#: src/console/Audacious_Driver.cxx:449 src/demac/plugin.c:393
 #: src/echo_plugin/gui.c:26 src/echo_plugin/gui.c:137 src/esd/about.c:49
 #: src/filewriter/filewriter.c:183 src/jack/configure.c:141
-#: src/jack/jack.c:493 src/madplug/plugin.c:600 src/madplug/plugin.c:624
+#: src/jack/jack.c:456 src/madplug/plugin.c:542 src/madplug/plugin.c:566
 #: src/metronom/metronom.c:88 src/modplug/gui/main.cxx:49
 #: src/musepack/libmpc.cxx:232 src/null/null.c:67 src/null/null.c:110
 #: src/OSS4/about.c:59 src/OSS/about.c:54 src/paranormal-ng/plugin.c:283
 #: src/paranormal/plugin.c:291 src/scrobbler/gtkstuff.c:25
-#: src/sndfile/plugin.c:565 src/statusicon/si_ui.c:593
+#: src/sndfile/plugin.c:565 src/statusicon/si_ui.c:628
 #: src/stereo_plugin/stereo.c:53 src/stereo_plugin/stereo.c:116
 #: src/sun/about.c:38 src/sun/configure.c:559 src/timidity/interface.c:222
 #: src/timidity/xmms-timidity.c:120 src/tonegen/tonegen.c:62
 #: src/tta/libtta.c:153 src/tta/libtta.c:267 src/tta/libtta.c:402
-#: src/vorbis/vorbis.c:769 src/vorbis/vorbis.c~:777 src/vtx/about.c:32
-#: src/vtx/info.c:43 src/wavpack/ui.cxx:56 src/wavpack/ui.cxx:556
+#: src/vorbis/vorbis.c:700 src/vtx/about.c:32 src/vtx/info.c:43
+#: src/wavpack/ui.cxx:56 src/wavpack/ui.cxx:556
 msgid "Ok"
 msgstr ""
 
@@ -77,7 +77,7 @@
 
 #: src/adplug/adplug-xmms.cc:275 src/alarm/interface.c:1398
 #: src/alsa/configure.c:389 src/arts/configure.c:91
-#: src/audiocompress/audacious-glue.c:557 src/cdaudio-ng/configure.c:231
+#: src/audiocompress/audacious-glue.c:557 src/cdaudio-ng/configure.c:232
 #: src/echo_plugin/gui.c:145 src/jack/configure.c:148
 #: src/modplug/gui/interface.cxx:714 src/modplug/gui/modplug.glade:1668
 #: src/musepack/libmpc.cxx:237 src/musepack/libmpc.cxx:557 src/null/null.c:111
@@ -88,7 +88,7 @@
 msgstr ""
 
 #: src/adplug/adplug-xmms.cc:291 src/console/Audacious_Config.cxx:145
-#: src/madplug/configure.c:421 src/modplug/gui/interface.cxx:628
+#: src/madplug/configure.c:290 src/modplug/gui/interface.cxx:628
 #: src/modplug/gui/interface.cxx:887 src/modplug/gui/modplug.glade:1404
 #: src/modplug/gui/modplug.glade:1804
 msgid "General"
@@ -116,13 +116,13 @@
 msgid "Channels"
 msgstr ""
 
-#: src/adplug/adplug-xmms.cc:325 src/filewriter/mp3.c:894
+#: src/adplug/adplug-xmms.cc:325 src/filewriter/mp3.c:900
 #: src/sid/xmms-sid.glade:157 src/sid/xs_interface.c:288
 #: src/timidity/interface.c:165
 msgid "Mono"
 msgstr ""
 
-#: src/adplug/adplug-xmms.cc:330 src/filewriter/mp3.c:889
+#: src/adplug/adplug-xmms.cc:330 src/filewriter/mp3.c:895
 #: src/modplug/gui/interface.cxx:204 src/modplug/gui/modplug.glade:159
 #: src/sid/xmms-sid.glade:176 src/sid/xs_interface.c:295
 #: src/timidity/interface.c:173
@@ -287,7 +287,7 @@
 
 #: src/alarm/interface.c:71 src/lirc/about.c:115
 #: src/modplug/gui/interface.cxx:971 src/modplug/gui/modplug.glade:2030
-#: src/sid/xmms-sid.glade:3643 src/sid/xs_about.c:213
+#: src/sid/xmms-sid.glade:3643 src/sid/xs_about.c:214
 #: src/sid/xs_interface.c:1740
 msgid "Close"
 msgstr ""
@@ -301,10 +301,10 @@
 msgstr ""
 
 #: src/alarm/interface.c:124 src/alarm/interface.c:1389 src/alsa/about.c:46
-#: src/alsa/configure.c:383 src/cdaudio-ng/cdaudio-ng.c:228
-#: src/flacng/plugin.c:747 src/gnomeshortcuts/gnomeshortcuts.c:292
+#: src/alsa/configure.c:383 src/cdaudio-ng/cdaudio-ng.c:247
+#: src/flacng/plugin.c:706 src/gnomeshortcuts/gnomeshortcuts.c:311
 #: src/hotkey/gui.c:671 src/modplug/gui/interface.cxx:702
-#: src/modplug/gui/modplug.glade:1642 src/pulse_audio/pulse_audio.c:712
+#: src/modplug/gui/modplug.glade:1642 src/pulse_audio/pulse_audio.c:738
 #: src/scrobbler/gtkstuff.c:45 src/sid/xmms-sid.glade:3066
 #: src/sid/xs_interface.c:1243
 msgid "OK"
@@ -1509,7 +1509,7 @@
 msgid "Trigger"
 msgstr ""
 
-#: src/aosd/aosd_ui.c:1076 src/cdaudio-ng/configure.c:166
+#: src/aosd/aosd_ui.c:1076 src/cdaudio-ng/configure.c:167
 #: src/modplug/gui/interface.cxx:688 src/modplug/gui/modplug.glade:1603
 #: src/sid/xmms-sid.glade:3026 src/sid/xs_interface.c:1229
 msgid "Misc"
@@ -1686,15 +1686,19 @@
 msgid "Options:"
 msgstr ""
 
-#: src/cdaudio-ng/cdaudio-ng.c:198
+#: src/cdaudio-ng/cdaudio-ng.c:204
+msgid "Rescan CD"
+msgstr ""
+
+#: src/cdaudio-ng/cdaudio-ng.c:217
 msgid "Add CD"
 msgstr ""
 
-#: src/cdaudio-ng/cdaudio-ng.c:223
+#: src/cdaudio-ng/cdaudio-ng.c:242
 msgid "About CD Audio Plugin NG"
 msgstr ""
 
-#: src/cdaudio-ng/cdaudio-ng.c:224
+#: src/cdaudio-ng/cdaudio-ng.c:243
 msgid ""
 "Copyright (c) 2007, by Calin Crisan <ccrisan@gmail.com> and The Audacious "
 "Team.\n"
@@ -1707,54 +1711,54 @@
 "This was a Google Summer of Code 2007 project."
 msgstr ""
 
-#: src/cdaudio-ng/cdaudio-ng.c:627
+#: src/cdaudio-ng/cdaudio-ng.c:814
 msgid ""
 "<b><big>No playable CD found.</big></b>\n"
 "\n"
 "No CD inserted, or inserted CD is not an audio CD.\n"
 msgstr ""
 
-#: src/cdaudio-ng/configure.c:146
+#: src/cdaudio-ng/configure.c:147
 msgid "CD Audio Plugin Configuration"
 msgstr ""
 
-#: src/cdaudio-ng/configure.c:156
+#: src/cdaudio-ng/configure.c:157
 msgid "Digital audio extraction"
 msgstr ""
 
-#: src/cdaudio-ng/configure.c:161
+#: src/cdaudio-ng/configure.c:162
 msgid "Title information"
 msgstr ""
 
-#: src/cdaudio-ng/configure.c:178
+#: src/cdaudio-ng/configure.c:179
 msgid "Limit read speed to: "
 msgstr ""
 
-#: src/cdaudio-ng/configure.c:185
+#: src/cdaudio-ng/configure.c:186
 msgid "Use cd-text if available"
 msgstr ""
 
-#: src/cdaudio-ng/configure.c:189
+#: src/cdaudio-ng/configure.c:190
 msgid "Use CDDB if available"
 msgstr ""
 
-#: src/cdaudio-ng/configure.c:193
+#: src/cdaudio-ng/configure.c:194
 msgid "Server: "
 msgstr ""
 
-#: src/cdaudio-ng/configure.c:196
+#: src/cdaudio-ng/configure.c:197
 msgid "Port: "
 msgstr ""
 
-#: src/cdaudio-ng/configure.c:202
+#: src/cdaudio-ng/configure.c:203
 msgid "Use HTTP instead of CDDBP"
 msgstr ""
 
-#: src/cdaudio-ng/configure.c:210
+#: src/cdaudio-ng/configure.c:211
 msgid "Override default device: "
 msgstr ""
 
-#: src/cdaudio-ng/configure.c:217
+#: src/cdaudio-ng/configure.c:218
 msgid "Print debug information"
 msgstr ""
 
@@ -1823,11 +1827,11 @@
 "        Shay Green <gblargg@gmail.com>"
 msgstr ""
 
-#: src/demac/plugin.c:387
+#: src/demac/plugin.c:388
 msgid "About Monkey's Audio Plugin"
 msgstr ""
 
-#: src/demac/plugin.c:388
+#: src/demac/plugin.c:389
 msgid ""
 "Copyright (C) 2007 Eugene Zagidullin <e.asphyx@gmail.com>\n"
 "Based on ffape decoder, Copyright (C) 2007 Benjamin Zores\n"
@@ -2093,7 +2097,7 @@
 "Ensure that the device has been correctly plugged in."
 msgstr ""
 
-#: src/evdev-plug/ed_ui.c:319 src/madplug/plugin.c:624
+#: src/evdev-plug/ed_ui.c:319 src/madplug/plugin.c:566
 msgid "Error"
 msgstr ""
 
@@ -2289,15 +2293,15 @@
 msgid "Prepend track number to filename"
 msgstr ""
 
-#: src/filewriter/mp3.c:670
+#: src/filewriter/mp3.c:676
 msgid "MP3 Configuration"
 msgstr ""
 
-#: src/filewriter/mp3.c:697
+#: src/filewriter/mp3.c:703
 msgid "Algorithm Quality:"
 msgstr ""
 
-#: src/filewriter/mp3.c:719
+#: src/filewriter/mp3.c:725
 msgid ""
 "best/slowest:0;\n"
 "worst/fastest:9;\n"
@@ -2305,157 +2309,157 @@
 "default:5;"
 msgstr ""
 
-#: src/filewriter/mp3.c:727
+#: src/filewriter/mp3.c:733
 msgid "Output Samplerate:"
 msgstr ""
 
-#: src/filewriter/mp3.c:738 src/filewriter/mp3.c:879
+#: src/filewriter/mp3.c:744 src/filewriter/mp3.c:885
 msgid "Auto"
 msgstr ""
 
-#: src/filewriter/mp3.c:760
+#: src/filewriter/mp3.c:766
 msgid "(Hz)"
 msgstr ""
 
-#: src/filewriter/mp3.c:772
+#: src/filewriter/mp3.c:778
 msgid "Bitrate / Compression ratio:"
 msgstr ""
 
-#: src/filewriter/mp3.c:798
+#: src/filewriter/mp3.c:804
 msgid "Bitrate (kbps):"
 msgstr ""
 
-#: src/filewriter/mp3.c:839
+#: src/filewriter/mp3.c:845
 msgid "Compression ratio:"
 msgstr ""
 
-#: src/filewriter/mp3.c:869
+#: src/filewriter/mp3.c:875
 msgid "Audio Mode:"
 msgstr ""
 
-#: src/filewriter/mp3.c:884
+#: src/filewriter/mp3.c:890
 msgid "Joint-Stereo"
 msgstr ""
 
-#: src/filewriter/mp3.c:925
+#: src/filewriter/mp3.c:931
 msgid "auto-M/S mode"
 msgstr ""
 
-#: src/filewriter/mp3.c:937
+#: src/filewriter/mp3.c:943
 msgid "Misc:"
 msgstr ""
 
-#: src/filewriter/mp3.c:948
+#: src/filewriter/mp3.c:954
 msgid "Enforce strict ISO complience"
 msgstr ""
 
-#: src/filewriter/mp3.c:959
+#: src/filewriter/mp3.c:965
 msgid "Error protection"
 msgstr ""
 
-#: src/filewriter/mp3.c:971
+#: src/filewriter/mp3.c:977
 msgid "Adds 16 bit checksum to every frame"
 msgstr ""
 
-#: src/filewriter/mp3.c:976 src/filewriter/vorbis.c:274
+#: src/filewriter/mp3.c:982 src/filewriter/vorbis.c:274
 #: src/modplug/gui/interface.cxx:319 src/modplug/gui/modplug.glade:507
 msgid "Quality"
 msgstr ""
 
-#: src/filewriter/mp3.c:988
+#: src/filewriter/mp3.c:994
 msgid "Enable VBR/ABR"
 msgstr ""
 
-#: src/filewriter/mp3.c:1000
+#: src/filewriter/mp3.c:1006
 msgid "Type:"
 msgstr ""
 
-#: src/filewriter/mp3.c:1011
+#: src/filewriter/mp3.c:1017
 msgid "Variable bitrate"
 msgstr ""
 
-#: src/filewriter/mp3.c:1023
+#: src/filewriter/mp3.c:1029
 msgid "Average bitrate"
 msgstr ""
 
-#: src/filewriter/mp3.c:1037
+#: src/filewriter/mp3.c:1043
 msgid "VBR Options:"
 msgstr ""
 
-#: src/filewriter/mp3.c:1053
+#: src/filewriter/mp3.c:1059
 msgid "Minimum bitrate (kbps):"
 msgstr ""
 
-#: src/filewriter/mp3.c:1089
+#: src/filewriter/mp3.c:1095
 msgid "Maximum bitrate (kbps):"
 msgstr ""
 
-#: src/filewriter/mp3.c:1121
+#: src/filewriter/mp3.c:1127
 msgid "Strictly enforce minimum bitrate"
 msgstr ""
 
-#: src/filewriter/mp3.c:1123
+#: src/filewriter/mp3.c:1129
 msgid ""
 "For use with players that do not support low bitrate mp3 (Apex AD600-A DVD/"
 "mp3 player)"
 msgstr ""
 
-#: src/filewriter/mp3.c:1136
+#: src/filewriter/mp3.c:1142
 msgid "ABR Options:"
 msgstr ""
 
-#: src/filewriter/mp3.c:1146
+#: src/filewriter/mp3.c:1152
 msgid "Average bitrate (kbps):"
 msgstr ""
 
-#: src/filewriter/mp3.c:1183
+#: src/filewriter/mp3.c:1189
 msgid "VBR quality level:"
 msgstr ""
 
-#: src/filewriter/mp3.c:1198
+#: src/filewriter/mp3.c:1204
 msgid ""
 "highest:0;\n"
 "lowest:9;\n"
 "default:4;"
 msgstr ""
 
-#: src/filewriter/mp3.c:1206
+#: src/filewriter/mp3.c:1212
 msgid "Don't write Xing VBR header"
 msgstr ""
 
-#: src/filewriter/mp3.c:1221
+#: src/filewriter/mp3.c:1227
 msgid "VBR/ABR"
 msgstr ""
 
-#: src/filewriter/mp3.c:1233
+#: src/filewriter/mp3.c:1239
 msgid "Frame params:"
 msgstr ""
 
-#: src/filewriter/mp3.c:1245
+#: src/filewriter/mp3.c:1251
 msgid "Mark as copyright"
 msgstr ""
 
-#: src/filewriter/mp3.c:1256
+#: src/filewriter/mp3.c:1262
 msgid "Mark as original"
 msgstr ""
 
-#: src/filewriter/mp3.c:1268
+#: src/filewriter/mp3.c:1274
 msgid "ID3 params:"
 msgstr ""
 
-#: src/filewriter/mp3.c:1279
+#: src/filewriter/mp3.c:1285
 msgid "Force addition of version 2 tag"
 msgstr ""
 
-#: src/filewriter/mp3.c:1289
+#: src/filewriter/mp3.c:1295
 msgid "Only add v1 tag"
 msgstr ""
 
-#: src/filewriter/mp3.c:1296
+#: src/filewriter/mp3.c:1302
 msgid "Only add v2 tag"
 msgstr ""
 
-#: src/filewriter/mp3.c:1317
+#: src/filewriter/mp3.c:1323
 msgid "Tags"
 msgstr ""
 
@@ -2467,11 +2471,11 @@
 msgid "Quality level (0 - 10):"
 msgstr ""
 
-#: src/flacng/plugin.c:739
+#: src/flacng/plugin.c:698
 msgid "FLAC Audio Plugin "
 msgstr ""
 
-#: src/flacng/plugin.c:740
+#: src/flacng/plugin.c:699
 msgid ""
 "\n"
 "\n"
@@ -2481,20 +2485,20 @@
 "http://www.skytale.net/projects/bmp-flac2/"
 msgstr ""
 
-#: src/flacng/plugin.c:745
+#: src/flacng/plugin.c:704
 msgid "About FLAC Audio Plugin"
 msgstr ""
 
-#: src/gnomeshortcuts/gnomeshortcuts.c:287
+#: src/gnomeshortcuts/gnomeshortcuts.c:306
 msgid "About Gnome Shortcut Plugin"
 msgstr ""
 
-#: src/gnomeshortcuts/gnomeshortcuts.c:288
+#: src/gnomeshortcuts/gnomeshortcuts.c:307
 msgid ""
 "Gnome Shortcut Plugin\n"
 "Let's you control the player with Gnome's shortcuts.\n"
 "\n"
-"Copyright (C) 2007 Sascha Hlusiak <contact@saschahlusiak.de>\n"
+"Copyright (C) 2007-2008 Sascha Hlusiak <contact@saschahlusiak.de>\n"
 "\n"
 msgstr ""
 
@@ -2632,11 +2636,11 @@
 msgid "Enable debug printing"
 msgstr ""
 
-#: src/jack/jack.c:95
+#: src/jack/jack.c:84
 msgid "Sample rate mismatch"
 msgstr ""
 
-#: src/jack/jack.c:98
+#: src/jack/jack.c:87
 msgid ""
 "Xmms is asking for a sample rate that differs from\n"
 " that of the jack server.  Xmms 1.2.8 or later\n"
@@ -2650,15 +2654,15 @@
 "Chris Morgan <cmorgan@alum.wpi.edu>\n"
 msgstr ""
 
-#: src/jack/jack.c:111 src/wma/wma.c:157
+#: src/jack/jack.c:100 src/wma/wma.c:148
 msgid " Close "
 msgstr ""
 
-#: src/jack/jack.c:489
+#: src/jack/jack.c:452
 msgid "About JACK Output Plugin 0.17"
 msgstr ""
 
-#: src/jack/jack.c:490
+#: src/jack/jack.c:453
 msgid ""
 "XMMS jack Driver 0.17\n"
 "\n"
@@ -2784,104 +2788,56 @@
 msgid "%s: will try reconnect every %d seconds...\n"
 msgstr ""
 
-#: src/madplug/configure.c:332
+#: src/madplug/configure.c:209
 msgid "MPEG Audio Plugin Configuration"
 msgstr ""
 
-#: src/madplug/configure.c:349
+#: src/madplug/configure.c:226
 msgid "Audio Settings"
 msgstr ""
 
-#: src/madplug/configure.c:358
-msgid "Dither output when rounding to 16-bit"
-msgstr ""
-
-#: src/madplug/configure.c:365
+#: src/madplug/configure.c:234
 msgid "Force reopen audio when audio type changed"
 msgstr ""
 
-#: src/madplug/configure.c:374
+#: src/madplug/configure.c:243
 msgid "Metadata Settings"
 msgstr ""
 
-#: src/madplug/configure.c:383
+#: src/madplug/configure.c:252
 msgid "Enable fast play-length calculation"
 msgstr ""
 
-#: src/madplug/configure.c:390
+#: src/madplug/configure.c:259
 msgid "Parse XING headers"
 msgstr ""
 
-#: src/madplug/configure.c:397
+#: src/madplug/configure.c:266
 msgid "Use SJIS to write ID3 tags (not recommended)"
 msgstr ""
 
-#: src/madplug/configure.c:404
+#: src/madplug/configure.c:273
 msgid "Miscellaneous Settings"
 msgstr ""
 
-#: src/madplug/configure.c:413
+#: src/madplug/configure.c:282
 msgid "Display average bitrate for VBR"
 msgstr ""
 
-#: src/madplug/configure.c:432
-msgid "Base gain (dB):"
-msgstr ""
-
-#: src/madplug/configure.c:446 src/musepack/libmpc.cxx:190
-msgid "ReplayGain Settings"
-msgstr ""
-
-#: src/madplug/configure.c:457
-msgid "Enable ReplayGain processing"
-msgstr ""
-
-#: src/madplug/configure.c:467 src/musepack/libmpc.cxx:207
-msgid "ReplayGain Type"
-msgstr ""
-
-#: src/madplug/configure.c:477 src/musepack/libmpc.cxx:215
-msgid "Use Track Gain"
-msgstr ""
-
-#: src/madplug/configure.c:485 src/musepack/libmpc.cxx:219
-msgid "Use Album Gain"
-msgstr ""
-
-#: src/madplug/configure.c:498
-msgid "Pre-gain with RG info (dB):"
-msgstr ""
-
-#: src/madplug/configure.c:514
-msgid "Pre-gain without RG info (dB):"
-msgstr ""
-
-#: src/madplug/configure.c:530
-msgid "Enable peak info clip prevention"
-msgstr ""
-
-#: src/madplug/configure.c:552
-msgid "Enable adaptive scaler clip prevention"
-msgstr ""
-
-#: src/madplug/configure.c:561
-msgid "Gain Control"
-msgstr ""
-
-#: src/madplug/configure.c:569 src/vorbis/configure.c:135
+#: src/madplug/configure.c:296 src/vorbis/configure.c:102
 msgid "Override generic titles"
 msgstr ""
 
-#: src/madplug/configure.c:581
+#: src/madplug/configure.c:308
 msgid "ID3 format:"
 msgstr ""
 
-#: src/madplug/configure.c:593 src/sid/xmms-sid.glade:2540
-#: src/sid/xs_interface.c:1070 src/vorbis/configure.c:158
+#: src/madplug/configure.c:320 src/sid/xmms-sid.glade:2540
+#: src/sid/xs_interface.c:1070
 msgid "Title"
 msgstr ""
 
-#: src/madplug/plugin.c:582
+#: src/madplug/plugin.c:524
 #, c-format
 msgid ""
 "Audacious MPEG Audio Plugin\n"
@@ -2899,7 +2855,7 @@
 "    Samuel Krempp"
 msgstr ""
 
-#: src/madplug/plugin.c:598
+#: src/madplug/plugin.c:540
 msgid "About MPEG Audio Plugin"
 msgstr ""
 
@@ -3187,18 +3143,31 @@
 msgid "Plugin"
 msgstr ""
 
-#: src/musepack/libmpc.cxx:197 src/vorbis/configure.c:170
-#: src/wavpack/ui.cxx:510
+#: src/musepack/libmpc.cxx:190
+msgid "ReplayGain Settings"
+msgstr ""
+
+#: src/musepack/libmpc.cxx:197 src/wavpack/ui.cxx:510
 msgid "Enable Clipping Prevention"
 msgstr ""
 
-#: src/musepack/libmpc.cxx:202 src/vorbis/configure.c:175
-#: src/wavpack/ui.cxx:515
+#: src/musepack/libmpc.cxx:202 src/wavpack/ui.cxx:515
 msgid "Enable ReplayGain"
 msgstr ""
 
-#: src/musepack/libmpc.cxx:224 src/vorbis/configure.c:219
-#: src/wavpack/ui.cxx:547
+#: src/musepack/libmpc.cxx:207
+msgid "ReplayGain Type"
+msgstr ""
+
+#: src/musepack/libmpc.cxx:215
+msgid "Use Track Gain"
+msgstr ""
+
+#: src/musepack/libmpc.cxx:219
+msgid "Use Album Gain"
+msgstr ""
+
+#: src/musepack/libmpc.cxx:224 src/wavpack/ui.cxx:547
 msgid "ReplayGain"
 msgstr ""
 
@@ -3423,11 +3392,15 @@
 msgid "Volume controls Master not PCM"
 msgstr ""
 
-#: src/pulse_audio/pulse_audio.c:696
+#: src/projectm-1.0/main.c:70
+msgid "_Random"
+msgstr ""
+
+#: src/pulse_audio/pulse_audio.c:722
 msgid "About Audacious PulseAudio Output Plugin"
 msgstr ""
 
-#: src/pulse_audio/pulse_audio.c:697
+#: src/pulse_audio/pulse_audio.c:723
 msgid ""
 "Audacious PulseAudio Output Plugin\n"
 "\n"
@@ -3493,36 +3466,6 @@
 msgid "Scrobbler Error"
 msgstr ""
 
-#: src/sid/xmms-sid.c:203
-msgid "Error initializing song-length database!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:209
-msgid "Error initializing STIL database!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:347
-msgid "Couldn't allocate memory for audio data buffer!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:355
-msgid "Couldn't allocate memory for audio oversampling buffer!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:371
-#, c-format
-msgid "Couldn't initialize SID-tune '%s' (sub-tune #%i)!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:382
-#, c-format
-msgid "Couldn't open XMMS audio output (fmt=%x, freq=%i, nchan=%i)!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:432
-msgid "Oversampling rate-conversion pass failed.\n"
-msgstr ""
-
 #: src/sid/xmms-sid.glade:8 src/sid/xs_interface.c:221
 msgid "Audacious-SID configuration"
 msgstr ""
@@ -4052,19 +3995,11 @@
 msgid "No"
 msgstr ""
 
-#: src/sid/xs_about.c:84 src/wma/wma.c:130
+#: src/sid/xs_about.c:84 src/wma/wma.c:121
 #, c-format
 msgid "About %s"
 msgstr ""
 
-#: src/sid/xs_config.c:580
-msgid "Allocation of sid2FilterPresets structure failed!\n"
-msgstr ""
-
-#: src/sid/xs_config.c:908
-msgid "Warning: Could not set filter curve widget points!\n"
-msgstr ""
-
 #: src/sid/xs_fileinfo.c:232
 msgid "General info"
 msgstr ""
@@ -4074,176 +4009,6 @@
 msgid "Tune #%i: "
 msgstr ""
 
-#: src/sid/xs_length.c:113
-msgid "Error allocating new node. Fatal error.\n"
-msgstr ""
-
-#: src/sid/xs_length.c:128
-#, c-format
-msgid "'=' expected on column #%d.\n"
-msgstr ""
-
-#: src/sid/xs_length.c:153
-msgid "Could not allocate memory for node.\n"
-msgstr ""
-
-#: src/sid/xs_length.c:204
-#, c-format
-msgid "Could not open SongLengthDB '%s'\n"
-msgstr ""
-
-#: src/sid/xs_length.c:224
-#, c-format
-msgid "Invalid MD5-hash in SongLengthDB file '%s' line #%d!\n"
-msgstr ""
-
-#: src/sid/xs_length.c:231
-#, c-format
-msgid "Invalid entry in SongLengthDB file '%s' line #%d!\n"
-msgstr ""
-
-#: src/sid/xs_length.c:236
-#, c-format
-msgid "Invalid line in SongLengthDB file '%s' line #%d\n"
-msgstr ""
-
-#: src/sid/xs_length.c:398
-#, c-format
-msgid "Not a PSID or RSID file '%s'\n"
-msgstr ""
-
-#: src/sid/xs_length.c:417
-#, c-format
-msgid "Error reading SID file header from '%s'\n"
-msgstr ""
-
-#: src/sid/xs_length.c:436
-#, c-format
-msgid "Error allocating temp data buffer for file '%s'\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:96
-msgid "[SIDPlay1] Could not initialize emulation engine.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:103
-msgid "[SIDPlay1] Endianess verification failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:238
-msgid "[SIDPlay1] Emulator engine configuration failed!\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:245
-msgid "[SIDPlay1] Could not initialize SIDTune object.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:291
-msgid ""
-"[SIDPlay1] SID-tune struct pointer was NULL. This should not happen, report "
-"to XMMS-SID author.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:296
-msgid ""
-"[SIDPlay1] SID-tune status check failed. This should not happen, report to "
-"XMMS-SID author.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:101
-msgid "[SIDPlay2] Could not initialize emulation engine.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:208
-#, c-format
-msgid "[SIDPlay2] Invalid number of filter curve points (%d > %d)\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:229
-msgid "reSID->create() failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:235
-#, c-format
-msgid "reSID->filter(%d) failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:243
-#, c-format
-msgid "reSID->sampling(%d) failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:253
-msgid "reSID->filter(NULL) failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:267
-msgid "hardSID->create() failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:273
-#, c-format
-msgid "hardSID->filter(%d) failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:281
-msgid "[SIDPlay2] Could not initialize SIDBuilder object.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:295
-#, c-format
-msgid "[SIDPlay2] Invalid clockSpeed=%d, falling back to PAL.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:319
-#, c-format
-msgid "Invalid sid2OptLevel=%d, falling back to %d.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:343
-msgid "[SIDPlay2] Emulator engine configuration failed!\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:350
-msgid "[SIDPlay2] Could not initialize SIDTune object.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:401
-msgid "[SIDPlay2] currTune->selectSong() failed\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:406
-msgid "[SIDPlay2] currEng->load() failed\n"
-msgstr ""
-
-#: src/sid/xs_slsup.c:217
-#, c-format
-msgid "Could not allocate memory for t_xs_tuneinfo ('%s')\n"
-msgstr ""
-
-#: src/sid/xs_slsup.c:224
-#, c-format
-msgid "Could not allocate sidFilename ('%s')\n"
-msgstr ""
-
-#: src/sid/xs_slsup.c:233
-#, c-format
-msgid "Could not allocate memory for t_xs_subtuneinfo ('%s', %i)\n"
-msgstr ""
-
-#: src/sid/xs_stil.c:46
-msgid "SubTune pointer structure realloc failed.\n"
-msgstr ""
-
-#: src/sid/xs_stil.c:69
-msgid "SubTune structure malloc failed!\n"
-msgstr ""
-
-#: src/sid/xs_stil.c:176
-#, c-format
-msgid "Could not open STILDB '%s'\n"
-msgstr ""
-
 #: src/sndfile/plugin.c:548
 msgid "About sndfile plugin"
 msgstr ""
@@ -4360,11 +4125,11 @@
 msgid "The orientation of the tray"
 msgstr ""
 
-#: src/statusicon/si_ui.c:587
+#: src/statusicon/si_ui.c:622
 msgid "About Status Icon Plugin"
 msgstr ""
 
-#: src/statusicon/si_ui.c:589
+#: src/statusicon/si_ui.c:624
 msgid ""
 "\n"
 "written by Giacomo Lozito < james@develia.org >\n"
@@ -4373,35 +4138,35 @@
 "the system tray area of the window manager.\n"
 msgstr ""
 
-#: src/statusicon/si_ui.c:661
+#: src/statusicon/si_ui.c:696
 msgid "Status Icon Plugin - Preferences"
 msgstr ""
 
-#: src/statusicon/si_ui.c:672
+#: src/statusicon/si_ui.c:707
 msgid "Right-Click Menu"
 msgstr ""
 
-#: src/statusicon/si_ui.c:677
+#: src/statusicon/si_ui.c:712
 msgid "Audacious standard menu"
 msgstr ""
 
-#: src/statusicon/si_ui.c:682
+#: src/statusicon/si_ui.c:717
 msgid "Small playback menu #1"
 msgstr ""
 
-#: src/statusicon/si_ui.c:687
+#: src/statusicon/si_ui.c:722
 msgid "Small playback menu #2"
 msgstr ""
 
-#: src/statusicon/si_ui.c:710
+#: src/statusicon/si_ui.c:745
 msgid "Mouse Scroll Action"
 msgstr ""
 
-#: src/statusicon/si_ui.c:715
+#: src/statusicon/si_ui.c:750
 msgid "Change volume"
 msgstr ""
 
-#: src/statusicon/si_ui.c:720
+#: src/statusicon/si_ui.c:755
 msgid "Change playing song"
 msgstr ""
 
@@ -4505,12 +4270,12 @@
 "e.g. tone://2000;2005 to play a 2000Hz tone and a 2005Hz tone"
 msgstr ""
 
-#: src/tonegen/tonegen.c:168
+#: src/tonegen/tonegen.c:167
 #, c-format
 msgid "%s %.1f Hz"
 msgstr ""
 
-#: src/tonegen/tonegen.c:168
+#: src/tonegen/tonegen.c:167
 msgid "Tone Generator: "
 msgstr ""
 
@@ -4568,43 +4333,23 @@
 msgid "Track number:"
 msgstr ""
 
-#: src/vorbis/configure.c:115
+#: src/vorbis/configure.c:84
 msgid "Ogg Vorbis Audio Plugin Configuration"
 msgstr ""
 
-#: src/vorbis/configure.c:127
+#: src/vorbis/configure.c:94
 msgid "Ogg Vorbis Tags:"
 msgstr ""
 
-#: src/vorbis/configure.c:148
+#: src/vorbis/configure.c:115
 msgid "Title format:"
 msgstr ""
 
-#: src/vorbis/configure.c:162 src/wavpack/ui.cxx:502
-msgid "ReplayGain Settings:"
-msgstr ""
-
-#: src/vorbis/configure.c:180 src/wavpack/ui.cxx:520
-msgid "ReplayGain Type:"
-msgstr ""
-
-#: src/vorbis/configure.c:191 src/wavpack/ui.cxx:531
-msgid "use Track Gain/Peak"
-msgstr ""
-
-#: src/vorbis/configure.c:201 src/wavpack/ui.cxx:539
-msgid "use Album Gain/Peak"
-msgstr ""
-
-#: src/vorbis/configure.c:213
-msgid "Enable 6dB Boost + Hard Limiting"
-msgstr ""
-
-#: src/vorbis/vorbis.c:751 src/vorbis/vorbis.c~:759
+#: src/vorbis/vorbis.c:681
 msgid "About Ogg Vorbis Audio Plugin"
 msgstr ""
 
-#: src/vorbis/vorbis.c:757 src/vorbis/vorbis.c~:765
+#: src/vorbis/vorbis.c:687
 msgid ""
 "Ogg Vorbis Plugin by the Xiph.org Foundation\n"
 "\n"
@@ -4618,6 +4363,7 @@
 "Jorn Baayen <jorn@nl.linux.org>\n"
 "Haavard Kvaalen <havardk@xmms.org>\n"
 "Gian-Carlo Pascutto <gcp@sjeng.org>\n"
+"Eugene Zagidullin <e.asphyx@gmail.com>\n"
 "\n"
 "Visit the Xiph.org Foundation at http://www.xiph.org/\n"
 msgstr ""
@@ -4718,7 +4464,23 @@
 msgid "General Plugin Settings:"
 msgstr ""
 
-#: src/wma/wma.c:132
+#: src/wavpack/ui.cxx:502
+msgid "ReplayGain Settings:"
+msgstr ""
+
+#: src/wavpack/ui.cxx:520
+msgid "ReplayGain Type:"
+msgstr ""
+
+#: src/wavpack/ui.cxx:531
+msgid "use Track Gain/Peak"
+msgstr ""
+
+#: src/wavpack/ui.cxx:539
+msgid "use Album Gain/Peak"
+msgstr ""
+
+#: src/wma/wma.c:123
 msgid ""
 "Adapted for use in Audacious by Tony Vroon (chainsaw@gentoo.org) from\n"
 "the BEEP-WMA plugin which is Copyright (C) 2004,2005 Mokrushin I.V. aka "
--- a/po/ca.po	Fri Jun 13 04:58:39 2008 +0300
+++ b/po/ca.po	Fri Jun 13 05:57:25 2008 +0300
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: audacious-plugins 1.3.0-alpha4\n"
 "Report-Msgid-Bugs-To: http://bugs.audacious-media-player.org\n"
-"POT-Creation-Date: 2008-02-03 20:33+0200\n"
+"POT-Creation-Date: 2008-03-30 17:25+0200\n"
 "PO-Revision-Date: 2007-02-09 21:12+0100\n"
 "Last-Translator: Ernest Adrogué <eadrogue@gmx.net>\n"
 "Language-Team: Catalan <ca@dodds.net>\n"
@@ -35,22 +35,22 @@
 #: src/adplug/adplug-xmms.cc:265 src/adplug/adplug-xmms.cc:526
 #: src/alac/plugin.c:77 src/arts/arts.c:26 src/arts/configure.c:90
 #: src/audiocompress/audacious-glue.c:102
-#: src/audiocompress/audacious-glue.c:552 src/cdaudio-ng/configure.c:227
-#: src/console/Audacious_Driver.cxx:449 src/demac/plugin.c:392
+#: src/audiocompress/audacious-glue.c:552 src/cdaudio-ng/configure.c:228
+#: src/console/Audacious_Driver.cxx:449 src/demac/plugin.c:393
 #: src/echo_plugin/gui.c:26 src/echo_plugin/gui.c:137 src/esd/about.c:49
 #: src/filewriter/filewriter.c:183 src/jack/configure.c:141
-#: src/jack/jack.c:493 src/madplug/plugin.c:600 src/madplug/plugin.c:624
+#: src/jack/jack.c:456 src/madplug/plugin.c:542 src/madplug/plugin.c:566
 #: src/metronom/metronom.c:88 src/modplug/gui/main.cxx:49
 #: src/musepack/libmpc.cxx:232 src/null/null.c:67 src/null/null.c:110
 #: src/OSS4/about.c:59 src/OSS/about.c:54 src/paranormal-ng/plugin.c:283
 #: src/paranormal/plugin.c:291 src/scrobbler/gtkstuff.c:25
-#: src/sndfile/plugin.c:565 src/statusicon/si_ui.c:593
+#: src/sndfile/plugin.c:565 src/statusicon/si_ui.c:628
 #: src/stereo_plugin/stereo.c:53 src/stereo_plugin/stereo.c:116
 #: src/sun/about.c:38 src/sun/configure.c:559 src/timidity/interface.c:222
 #: src/timidity/xmms-timidity.c:120 src/tonegen/tonegen.c:62
 #: src/tta/libtta.c:153 src/tta/libtta.c:267 src/tta/libtta.c:402
-#: src/vorbis/vorbis.c:769 src/vorbis/vorbis.c~:777 src/vtx/about.c:32
-#: src/vtx/info.c:43 src/wavpack/ui.cxx:56 src/wavpack/ui.cxx:556
+#: src/vorbis/vorbis.c:700 src/vtx/about.c:32 src/vtx/info.c:43
+#: src/wavpack/ui.cxx:56 src/wavpack/ui.cxx:556
 msgid "Ok"
 msgstr "D'acord"
 
@@ -88,7 +88,7 @@
 
 #: src/adplug/adplug-xmms.cc:275 src/alarm/interface.c:1398
 #: src/alsa/configure.c:389 src/arts/configure.c:91
-#: src/audiocompress/audacious-glue.c:557 src/cdaudio-ng/configure.c:231
+#: src/audiocompress/audacious-glue.c:557 src/cdaudio-ng/configure.c:232
 #: src/echo_plugin/gui.c:145 src/jack/configure.c:148
 #: src/modplug/gui/interface.cxx:714 src/modplug/gui/modplug.glade:1668
 #: src/musepack/libmpc.cxx:237 src/musepack/libmpc.cxx:557 src/null/null.c:111
@@ -99,7 +99,7 @@
 msgstr "Cancel·la"
 
 #: src/adplug/adplug-xmms.cc:291 src/console/Audacious_Config.cxx:145
-#: src/madplug/configure.c:421 src/modplug/gui/interface.cxx:628
+#: src/madplug/configure.c:290 src/modplug/gui/interface.cxx:628
 #: src/modplug/gui/interface.cxx:887 src/modplug/gui/modplug.glade:1404
 #: src/modplug/gui/modplug.glade:1804
 msgid "General"
@@ -131,13 +131,13 @@
 msgid "Channels"
 msgstr "Canals"
 
-#: src/adplug/adplug-xmms.cc:325 src/filewriter/mp3.c:894
+#: src/adplug/adplug-xmms.cc:325 src/filewriter/mp3.c:900
 #: src/sid/xmms-sid.glade:157 src/sid/xs_interface.c:288
 #: src/timidity/interface.c:165
 msgid "Mono"
 msgstr "Mono"
 
-#: src/adplug/adplug-xmms.cc:330 src/filewriter/mp3.c:889
+#: src/adplug/adplug-xmms.cc:330 src/filewriter/mp3.c:895
 #: src/modplug/gui/interface.cxx:204 src/modplug/gui/modplug.glade:159
 #: src/sid/xmms-sid.glade:176 src/sid/xs_interface.c:295
 #: src/timidity/interface.c:173
@@ -311,7 +311,7 @@
 
 #: src/alarm/interface.c:71 src/lirc/about.c:115
 #: src/modplug/gui/interface.cxx:971 src/modplug/gui/modplug.glade:2030
-#: src/sid/xmms-sid.glade:3643 src/sid/xs_about.c:213
+#: src/sid/xmms-sid.glade:3643 src/sid/xs_about.c:214
 #: src/sid/xs_interface.c:1740
 msgid "Close"
 msgstr "Tanca"
@@ -325,10 +325,10 @@
 msgstr ""
 
 #: src/alarm/interface.c:124 src/alarm/interface.c:1389 src/alsa/about.c:46
-#: src/alsa/configure.c:383 src/cdaudio-ng/cdaudio-ng.c:228
-#: src/flacng/plugin.c:747 src/gnomeshortcuts/gnomeshortcuts.c:292
+#: src/alsa/configure.c:383 src/cdaudio-ng/cdaudio-ng.c:247
+#: src/flacng/plugin.c:706 src/gnomeshortcuts/gnomeshortcuts.c:311
 #: src/hotkey/gui.c:671 src/modplug/gui/interface.cxx:702
-#: src/modplug/gui/modplug.glade:1642 src/pulse_audio/pulse_audio.c:712
+#: src/modplug/gui/modplug.glade:1642 src/pulse_audio/pulse_audio.c:738
 #: src/scrobbler/gtkstuff.c:45 src/sid/xmms-sid.glade:3066
 #: src/sid/xs_interface.c:1243
 msgid "OK"
@@ -1602,7 +1602,7 @@
 msgid "Trigger"
 msgstr "Tràiler"
 
-#: src/aosd/aosd_ui.c:1076 src/cdaudio-ng/configure.c:166
+#: src/aosd/aosd_ui.c:1076 src/cdaudio-ng/configure.c:167
 #: src/modplug/gui/interface.cxx:688 src/modplug/gui/modplug.glade:1603
 #: src/sid/xmms-sid.glade:3026 src/sid/xs_interface.c:1229
 #, fuzzy
@@ -1792,16 +1792,20 @@
 msgid "Options:"
 msgstr "Opcions:"
 
-#: src/cdaudio-ng/cdaudio-ng.c:198
+#: src/cdaudio-ng/cdaudio-ng.c:204
+msgid "Rescan CD"
+msgstr ""
+
+#: src/cdaudio-ng/cdaudio-ng.c:217
 msgid "Add CD"
 msgstr ""
 
-#: src/cdaudio-ng/cdaudio-ng.c:223
+#: src/cdaudio-ng/cdaudio-ng.c:242
 #, fuzzy
 msgid "About CD Audio Plugin NG"
 msgstr "Quant al plugin per a àudio MPEG"
 
-#: src/cdaudio-ng/cdaudio-ng.c:224
+#: src/cdaudio-ng/cdaudio-ng.c:243
 msgid ""
 "Copyright (c) 2007, by Calin Crisan <ccrisan@gmail.com> and The Audacious "
 "Team.\n"
@@ -1814,60 +1818,60 @@
 "This was a Google Summer of Code 2007 project."
 msgstr ""
 
-#: src/cdaudio-ng/cdaudio-ng.c:627
+#: src/cdaudio-ng/cdaudio-ng.c:814
 msgid ""
 "<b><big>No playable CD found.</big></b>\n"
 "\n"
 "No CD inserted, or inserted CD is not an audio CD.\n"
 msgstr ""
 
-#: src/cdaudio-ng/configure.c:146
+#: src/cdaudio-ng/configure.c:147
 #, fuzzy
 msgid "CD Audio Plugin Configuration"
 msgstr "Configuració del plugin d'àudio MPEG"
 
-#: src/cdaudio-ng/configure.c:156
+#: src/cdaudio-ng/configure.c:157
 msgid "Digital audio extraction"
 msgstr "Extracció d'àudio digital"
 
-#: src/cdaudio-ng/configure.c:161
+#: src/cdaudio-ng/configure.c:162
 #, fuzzy
 msgid "Title information"
 msgstr "Format del títol:"
 
-#: src/cdaudio-ng/configure.c:178
+#: src/cdaudio-ng/configure.c:179
 msgid "Limit read speed to: "
 msgstr ""
 
-#: src/cdaudio-ng/configure.c:185
+#: src/cdaudio-ng/configure.c:186
 #, fuzzy
 msgid "Use cd-text if available"
 msgstr "Estèreo (si està disponible)"
 
-#: src/cdaudio-ng/configure.c:189
+#: src/cdaudio-ng/configure.c:190
 #, fuzzy
 msgid "Use CDDB if available"
 msgstr "Estèreo (si està disponible)"
 
-#: src/cdaudio-ng/configure.c:193
+#: src/cdaudio-ng/configure.c:194
 #, fuzzy
 msgid "Server: "
 msgstr "Servidor"
 
-#: src/cdaudio-ng/configure.c:196
+#: src/cdaudio-ng/configure.c:197
 #, fuzzy
 msgid "Port: "
 msgstr "Port:"
 
-#: src/cdaudio-ng/configure.c:202
+#: src/cdaudio-ng/configure.c:203
 msgid "Use HTTP instead of CDDBP"
 msgstr ""
 
-#: src/cdaudio-ng/configure.c:210
+#: src/cdaudio-ng/configure.c:211
 msgid "Override default device: "
 msgstr ""
 
-#: src/cdaudio-ng/configure.c:217
+#: src/cdaudio-ng/configure.c:218
 msgid "Print debug information"
 msgstr ""
 
@@ -1945,12 +1949,12 @@
 "Implemetació en l'Audacious per: William Pitcock <nenolod@nenolod.net>,\n"
 "Shay Green <gblargg@gmail.com>"
 
-#: src/demac/plugin.c:387
+#: src/demac/plugin.c:388
 #, fuzzy
 msgid "About Monkey's Audio Plugin"
 msgstr "Quant al plugin per a àudio MPEG"
 
-#: src/demac/plugin.c:388
+#: src/demac/plugin.c:389
 msgid ""
 "Copyright (C) 2007 Eugene Zagidullin <e.asphyx@gmail.com>\n"
 "Based on ffape decoder, Copyright (C) 2007 Benjamin Zores\n"
@@ -2243,7 +2247,7 @@
 "Ensure that the device has been correctly plugged in."
 msgstr ""
 
-#: src/evdev-plug/ed_ui.c:319 src/madplug/plugin.c:624
+#: src/evdev-plug/ed_ui.c:319 src/madplug/plugin.c:566
 msgid "Error"
 msgstr "Error"
 
@@ -2470,16 +2474,16 @@
 msgid "Prepend track number to filename"
 msgstr ""
 
-#: src/filewriter/mp3.c:670
+#: src/filewriter/mp3.c:676
 #, fuzzy
 msgid "MP3 Configuration"
 msgstr "Configuració del TiMidity"
 
-#: src/filewriter/mp3.c:697
+#: src/filewriter/mp3.c:703
 msgid "Algorithm Quality:"
 msgstr ""
 
-#: src/filewriter/mp3.c:719
+#: src/filewriter/mp3.c:725
 msgid ""
 "best/slowest:0;\n"
 "worst/fastest:9;\n"
@@ -2487,169 +2491,169 @@
 "default:5;"
 msgstr ""
 
-#: src/filewriter/mp3.c:727
+#: src/filewriter/mp3.c:733
 #, fuzzy
 msgid "Output Samplerate:"
 msgstr "Freqüència de mostreig:"
 
-#: src/filewriter/mp3.c:738 src/filewriter/mp3.c:879
+#: src/filewriter/mp3.c:744 src/filewriter/mp3.c:885
 #, fuzzy
 msgid "Auto"
 msgstr "Quant a "
 
-#: src/filewriter/mp3.c:760
+#: src/filewriter/mp3.c:766
 #, fuzzy
 msgid "(Hz)"
 msgstr "Hz"
 
-#: src/filewriter/mp3.c:772
+#: src/filewriter/mp3.c:778
 msgid "Bitrate / Compression ratio:"
 msgstr ""
 
-#: src/filewriter/mp3.c:798
+#: src/filewriter/mp3.c:804
 #, fuzzy
 msgid "Bitrate (kbps):"
 msgstr "Ràtio de bits:"
 
-#: src/filewriter/mp3.c:839
+#: src/filewriter/mp3.c:845
 msgid "Compression ratio:"
 msgstr ""
 
-#: src/filewriter/mp3.c:869
+#: src/filewriter/mp3.c:875
 #, fuzzy
 msgid "Audio Mode:"
 msgstr "Dispositiu d'àudio:"
 
-#: src/filewriter/mp3.c:884
+#: src/filewriter/mp3.c:890
 #, fuzzy
 msgid "Joint-Stereo"
 msgstr "Estèreo conjunt"
 
-#: src/filewriter/mp3.c:925
+#: src/filewriter/mp3.c:931
 msgid "auto-M/S mode"
 msgstr ""
 
-#: src/filewriter/mp3.c:937
+#: src/filewriter/mp3.c:943
 #, fuzzy
 msgid "Misc:"
 msgstr "Disco"
 
-#: src/filewriter/mp3.c:948
+#: src/filewriter/mp3.c:954
 msgid "Enforce strict ISO complience"
 msgstr ""
 
-#: src/filewriter/mp3.c:959
+#: src/filewriter/mp3.c:965
 #, fuzzy
 msgid "Error protection"
 msgstr "Protecció d'errors:"
 
-#: src/filewriter/mp3.c:971
+#: src/filewriter/mp3.c:977
 msgid "Adds 16 bit checksum to every frame"
 msgstr ""
 
-#: src/filewriter/mp3.c:976 src/filewriter/vorbis.c:274
+#: src/filewriter/mp3.c:982 src/filewriter/vorbis.c:274
 #: src/modplug/gui/interface.cxx:319 src/modplug/gui/modplug.glade:507
 msgid "Quality"
 msgstr ""
 
-#: src/filewriter/mp3.c:988
+#: src/filewriter/mp3.c:994
 msgid "Enable VBR/ABR"
 msgstr ""
 
-#: src/filewriter/mp3.c:1000
+#: src/filewriter/mp3.c:1006
 msgid "Type:"
 msgstr ""
 
-#: src/filewriter/mp3.c:1011
+#: src/filewriter/mp3.c:1017
 msgid "Variable bitrate"
 msgstr ""
 
-#: src/filewriter/mp3.c:1023
+#: src/filewriter/mp3.c:1029
 msgid "Average bitrate"
 msgstr ""
 
-#: src/filewriter/mp3.c:1037
+#: src/filewriter/mp3.c:1043
 #, fuzzy
 msgid "VBR Options:"
 msgstr "Opcions:"
 
-#: src/filewriter/mp3.c:1053
+#: src/filewriter/mp3.c:1059
 #, fuzzy
 msgid "Minimum bitrate (kbps):"
 msgstr "Ràtio de bits:"
 
-#: src/filewriter/mp3.c:1089
+#: src/filewriter/mp3.c:1095
 msgid "Maximum bitrate (kbps):"
 msgstr ""
 
-#: src/filewriter/mp3.c:1121
+#: src/filewriter/mp3.c:1127
 msgid "Strictly enforce minimum bitrate"
 msgstr ""
 
-#: src/filewriter/mp3.c:1123
+#: src/filewriter/mp3.c:1129
 msgid ""
 "For use with players that do not support low bitrate mp3 (Apex AD600-A DVD/"
 "mp3 player)"
 msgstr ""
 
-#: src/filewriter/mp3.c:1136
+#: src/filewriter/mp3.c:1142
 #, fuzzy
 msgid "ABR Options:"
 msgstr "Opcions:"
 
-#: src/filewriter/mp3.c:1146
+#: src/filewriter/mp3.c:1152
 msgid "Average bitrate (kbps):"
 msgstr ""
 
-#: src/filewriter/mp3.c:1183
+#: src/filewriter/mp3.c:1189
 msgid "VBR quality level:"
 msgstr ""
 
-#: src/filewriter/mp3.c:1198
+#: src/filewriter/mp3.c:1204
 msgid ""
 "highest:0;\n"
 "lowest:9;\n"
 "default:4;"
 msgstr ""
 
-#: src/filewriter/mp3.c:1206
+#: src/filewriter/mp3.c:1212
 msgid "Don't write Xing VBR header"
 msgstr ""
 
-#: src/filewriter/mp3.c:1221
+#: src/filewriter/mp3.c:1227
 msgid "VBR/ABR"
 msgstr ""
 
-#: src/filewriter/mp3.c:1233
+#: src/filewriter/mp3.c:1239
 msgid "Frame params:"
 msgstr ""
 
-#: src/filewriter/mp3.c:1245
+#: src/filewriter/mp3.c:1251
 msgid "Mark as copyright"
 msgstr ""
 
-#: src/filewriter/mp3.c:1256
+#: src/filewriter/mp3.c:1262
 msgid "Mark as original"
 msgstr ""
 
-#: src/filewriter/mp3.c:1268
+#: src/filewriter/mp3.c:1274
 #, fuzzy
 msgid "ID3 params:"
 msgstr "Etiquetes ID3:"
 
-#: src/filewriter/mp3.c:1279
+#: src/filewriter/mp3.c:1285
 msgid "Force addition of version 2 tag"
 msgstr ""
 
-#: src/filewriter/mp3.c:1289
+#: src/filewriter/mp3.c:1295
 msgid "Only add v1 tag"
 msgstr ""
 
-#: src/filewriter/mp3.c:1296
+#: src/filewriter/mp3.c:1302
 msgid "Only add v2 tag"
 msgstr ""
 
-#: src/filewriter/mp3.c:1317
+#: src/filewriter/mp3.c:1323
 #, fuzzy
 msgid "Tags"
 msgstr "Tango"
@@ -2663,12 +2667,12 @@
 msgid "Quality level (0 - 10):"
 msgstr ""
 
-#: src/flacng/plugin.c:739
+#: src/flacng/plugin.c:698
 #, fuzzy
 msgid "FLAC Audio Plugin "
 msgstr "Plugin CD d'àudio"
 
-#: src/flacng/plugin.c:740
+#: src/flacng/plugin.c:699
 msgid ""
 "\n"
 "\n"
@@ -2678,22 +2682,22 @@
 "http://www.skytale.net/projects/bmp-flac2/"
 msgstr ""
 
-#: src/flacng/plugin.c:745
+#: src/flacng/plugin.c:704
 #, fuzzy
 msgid "About FLAC Audio Plugin"
 msgstr "Quant al plugin per a LIRC de l'Audacious"
 
-#: src/gnomeshortcuts/gnomeshortcuts.c:287
+#: src/gnomeshortcuts/gnomeshortcuts.c:306
 #, fuzzy
 msgid "About Gnome Shortcut Plugin"
 msgstr "Quant al plugin ESounD"
 
-#: src/gnomeshortcuts/gnomeshortcuts.c:288
+#: src/gnomeshortcuts/gnomeshortcuts.c:307
 msgid ""
 "Gnome Shortcut Plugin\n"
 "Let's you control the player with Gnome's shortcuts.\n"
 "\n"
-"Copyright (C) 2007 Sascha Hlusiak <contact@saschahlusiak.de>\n"
+"Copyright (C) 2007-2008 Sascha Hlusiak <contact@saschahlusiak.de>\n"
 "\n"
 msgstr ""
 
@@ -2844,12 +2848,12 @@
 msgid "Enable debug printing"
 msgstr ""
 
-#: src/jack/jack.c:95
+#: src/jack/jack.c:84
 #, fuzzy
 msgid "Sample rate mismatch"
 msgstr "Freqüència de mostreig:"
 
-#: src/jack/jack.c:98
+#: src/jack/jack.c:87
 msgid ""
 "Xmms is asking for a sample rate that differs from\n"
 " that of the jack server.  Xmms 1.2.8 or later\n"
@@ -2863,15 +2867,15 @@
 "Chris Morgan <cmorgan@alum.wpi.edu>\n"
 msgstr ""
 
-#: src/jack/jack.c:111 src/wma/wma.c:157
+#: src/jack/jack.c:100 src/wma/wma.c:148
 msgid " Close "
 msgstr " Tanca "
 
-#: src/jack/jack.c:489
+#: src/jack/jack.c:452
 msgid "About JACK Output Plugin 0.17"
 msgstr "Quant al plugin de sortida JACK 0.17"
 
-#: src/jack/jack.c:490
+#: src/jack/jack.c:453
 msgid ""
 "XMMS jack Driver 0.17\n"
 "\n"
@@ -3022,116 +3026,59 @@
 msgid "%s: will try reconnect every %d seconds...\n"
 msgstr ""
 
-#: src/madplug/configure.c:332
+#: src/madplug/configure.c:209
 msgid "MPEG Audio Plugin Configuration"
 msgstr "Configuració del plugin d'àudio MPEG"
 
-#: src/madplug/configure.c:349
+#: src/madplug/configure.c:226
 #, fuzzy
 msgid "Audio Settings"
 msgstr "Paràmetres del mesclador:"
 
-#: src/madplug/configure.c:358
-msgid "Dither output when rounding to 16-bit"
-msgstr ""
-
-#: src/madplug/configure.c:365
+#: src/madplug/configure.c:234
 msgid "Force reopen audio when audio type changed"
 msgstr ""
 
-#: src/madplug/configure.c:374
+#: src/madplug/configure.c:243
 #, fuzzy
 msgid "Metadata Settings"
 msgstr "Paràmetres del mesclador:"
 
-#: src/madplug/configure.c:383
+#: src/madplug/configure.c:252
 msgid "Enable fast play-length calculation"
 msgstr ""
 
-#: src/madplug/configure.c:390
+#: src/madplug/configure.c:259
 msgid "Parse XING headers"
 msgstr ""
 
-#: src/madplug/configure.c:397
+#: src/madplug/configure.c:266
 msgid "Use SJIS to write ID3 tags (not recommended)"
 msgstr ""
 
-#: src/madplug/configure.c:404
+#: src/madplug/configure.c:273
 #, fuzzy
 msgid "Miscellaneous Settings"
 msgstr "Paràmetres del mesclador:"
 
-#: src/madplug/configure.c:413
+#: src/madplug/configure.c:282
 msgid "Display average bitrate for VBR"
 msgstr ""
 
-#: src/madplug/configure.c:432
-#, fuzzy
-msgid "Base gain (dB):"
-msgstr "Per defecte (%s)"
-
-#: src/madplug/configure.c:446 src/musepack/libmpc.cxx:190
-#, fuzzy
-msgid "ReplayGain Settings"
-msgstr "Paràmetres de ReplayGain:"
-
-#: src/madplug/configure.c:457
-#, fuzzy
-msgid "Enable ReplayGain processing"
-msgstr "Habilita el ReplayGain"
-
-#: src/madplug/configure.c:467 src/musepack/libmpc.cxx:207
-#, fuzzy
-msgid "ReplayGain Type"
-msgstr "Tipus de ReplayGain:"
-
-#: src/madplug/configure.c:477 src/musepack/libmpc.cxx:215
-#, fuzzy
-msgid "Use Track Gain"
-msgstr "usa el guany/pic de la pista"
-
-#: src/madplug/configure.c:485 src/musepack/libmpc.cxx:219
-#, fuzzy
-msgid "Use Album Gain"
-msgstr "usa el guany/pic del disc"
-
-#: src/madplug/configure.c:498
-msgid "Pre-gain with RG info (dB):"
-msgstr ""
-
-#: src/madplug/configure.c:514
-msgid "Pre-gain without RG info (dB):"
-msgstr ""
-
-#: src/madplug/configure.c:530
-#, fuzzy
-msgid "Enable peak info clip prevention"
-msgstr "Prevenció de distorsions"
-
-#: src/madplug/configure.c:552
-#, fuzzy
-msgid "Enable adaptive scaler clip prevention"
-msgstr "Prevenció de distorsions"
-
-#: src/madplug/configure.c:561
-#, fuzzy
-msgid "Gain Control"
-msgstr "Control del volum:"
-
-#: src/madplug/configure.c:569 src/vorbis/configure.c:135
+#: src/madplug/configure.c:296 src/vorbis/configure.c:102
 msgid "Override generic titles"
 msgstr "Ignora els títols genèrics"
 
-#: src/madplug/configure.c:581
+#: src/madplug/configure.c:308
 msgid "ID3 format:"
 msgstr "Format ID3:"
 
-#: src/madplug/configure.c:593 src/sid/xmms-sid.glade:2540
-#: src/sid/xs_interface.c:1070 src/vorbis/configure.c:158
+#: src/madplug/configure.c:320 src/sid/xmms-sid.glade:2540
+#: src/sid/xs_interface.c:1070
 msgid "Title"
 msgstr "Títol"
 
-#: src/madplug/plugin.c:582
+#: src/madplug/plugin.c:524
 #, c-format
 msgid ""
 "Audacious MPEG Audio Plugin\n"
@@ -3149,7 +3096,7 @@
 "    Samuel Krempp"
 msgstr ""
 
-#: src/madplug/plugin.c:598
+#: src/madplug/plugin.c:540
 msgid "About MPEG Audio Plugin"
 msgstr "Quant al plugin per a àudio MPEG"
 
@@ -3457,18 +3404,35 @@
 msgid "Plugin"
 msgstr "Plugin LIRC"
 
-#: src/musepack/libmpc.cxx:197 src/vorbis/configure.c:170
-#: src/wavpack/ui.cxx:510
+#: src/musepack/libmpc.cxx:190
+#, fuzzy
+msgid "ReplayGain Settings"
+msgstr "Paràmetres de ReplayGain:"
+
+#: src/musepack/libmpc.cxx:197 src/wavpack/ui.cxx:510
 msgid "Enable Clipping Prevention"
 msgstr "Prevenció de distorsions"
 
-#: src/musepack/libmpc.cxx:202 src/vorbis/configure.c:175
-#: src/wavpack/ui.cxx:515
+#: src/musepack/libmpc.cxx:202 src/wavpack/ui.cxx:515
 msgid "Enable ReplayGain"
 msgstr "Habilita el ReplayGain"
 
-#: src/musepack/libmpc.cxx:224 src/vorbis/configure.c:219
-#: src/wavpack/ui.cxx:547
+#: src/musepack/libmpc.cxx:207
+#, fuzzy
+msgid "ReplayGain Type"
+msgstr "Tipus de ReplayGain:"
+
+#: src/musepack/libmpc.cxx:215
+#, fuzzy
+msgid "Use Track Gain"
+msgstr "usa el guany/pic de la pista"
+
+#: src/musepack/libmpc.cxx:219
+#, fuzzy
+msgid "Use Album Gain"
+msgstr "usa el guany/pic del disc"
+
+#: src/musepack/libmpc.cxx:224 src/wavpack/ui.cxx:547
 msgid "ReplayGain"
 msgstr "ReplayGain"
 
@@ -3737,12 +3701,16 @@
 msgid "Volume controls Master not PCM"
 msgstr "El volum canvia el Master, no el PCM"
 
-#: src/pulse_audio/pulse_audio.c:696
+#: src/projectm-1.0/main.c:70
+msgid "_Random"
+msgstr ""
+
+#: src/pulse_audio/pulse_audio.c:722
 #, fuzzy
 msgid "About Audacious PulseAudio Output Plugin"
 msgstr "Plugin de sortida CoreAudio"
 
-#: src/pulse_audio/pulse_audio.c:697
+#: src/pulse_audio/pulse_audio.c:723
 #, fuzzy
 msgid ""
 "Audacious PulseAudio Output Plugin\n"
@@ -3826,36 +3794,6 @@
 msgid "Scrobbler Error"
 msgstr "Plugin per a Scrobbler"
 
-#: src/sid/xmms-sid.c:203
-msgid "Error initializing song-length database!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:209
-msgid "Error initializing STIL database!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:347
-msgid "Couldn't allocate memory for audio data buffer!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:355
-msgid "Couldn't allocate memory for audio oversampling buffer!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:371
-#, c-format
-msgid "Couldn't initialize SID-tune '%s' (sub-tune #%i)!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:382
-#, c-format
-msgid "Couldn't open XMMS audio output (fmt=%x, freq=%i, nchan=%i)!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:432
-msgid "Oversampling rate-conversion pass failed.\n"
-msgstr ""
-
 #: src/sid/xmms-sid.glade:8 src/sid/xs_interface.c:221
 #, fuzzy
 msgid "Audacious-SID configuration"
@@ -4405,19 +4343,11 @@
 msgid "No"
 msgstr "No"
 
-#: src/sid/xs_about.c:84 src/wma/wma.c:130
+#: src/sid/xs_about.c:84 src/wma/wma.c:121
 #, c-format
 msgid "About %s"
 msgstr "Quant a %s"
 
-#: src/sid/xs_config.c:580
-msgid "Allocation of sid2FilterPresets structure failed!\n"
-msgstr ""
-
-#: src/sid/xs_config.c:908
-msgid "Warning: Could not set filter curve widget points!\n"
-msgstr ""
-
 #: src/sid/xs_fileinfo.c:232
 #, fuzzy
 msgid "General info"
@@ -4428,176 +4358,6 @@
 msgid "Tune #%i: "
 msgstr ""
 
-#: src/sid/xs_length.c:113
-msgid "Error allocating new node. Fatal error.\n"
-msgstr ""
-
-#: src/sid/xs_length.c:128
-#, c-format
-msgid "'=' expected on column #%d.\n"
-msgstr ""
-
-#: src/sid/xs_length.c:153
-msgid "Could not allocate memory for node.\n"
-msgstr ""
-
-#: src/sid/xs_length.c:204
-#, c-format
-msgid "Could not open SongLengthDB '%s'\n"
-msgstr ""
-
-#: src/sid/xs_length.c:224
-#, c-format
-msgid "Invalid MD5-hash in SongLengthDB file '%s' line #%d!\n"
-msgstr ""
-
-#: src/sid/xs_length.c:231
-#, c-format
-msgid "Invalid entry in SongLengthDB file '%s' line #%d!\n"
-msgstr ""
-
-#: src/sid/xs_length.c:236
-#, c-format
-msgid "Invalid line in SongLengthDB file '%s' line #%d\n"
-msgstr ""
-
-#: src/sid/xs_length.c:398
-#, c-format
-msgid "Not a PSID or RSID file '%s'\n"
-msgstr ""
-
-#: src/sid/xs_length.c:417
-#, c-format
-msgid "Error reading SID file header from '%s'\n"
-msgstr ""
-
-#: src/sid/xs_length.c:436
-#, c-format
-msgid "Error allocating temp data buffer for file '%s'\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:96
-msgid "[SIDPlay1] Could not initialize emulation engine.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:103
-msgid "[SIDPlay1] Endianess verification failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:238
-msgid "[SIDPlay1] Emulator engine configuration failed!\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:245
-msgid "[SIDPlay1] Could not initialize SIDTune object.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:291
-msgid ""
-"[SIDPlay1] SID-tune struct pointer was NULL. This should not happen, report "
-"to XMMS-SID author.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:296
-msgid ""
-"[SIDPlay1] SID-tune status check failed. This should not happen, report to "
-"XMMS-SID author.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:101
-msgid "[SIDPlay2] Could not initialize emulation engine.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:208
-#, c-format
-msgid "[SIDPlay2] Invalid number of filter curve points (%d > %d)\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:229
-msgid "reSID->create() failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:235
-#, c-format
-msgid "reSID->filter(%d) failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:243
-#, c-format
-msgid "reSID->sampling(%d) failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:253
-msgid "reSID->filter(NULL) failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:267
-msgid "hardSID->create() failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:273
-#, c-format
-msgid "hardSID->filter(%d) failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:281
-msgid "[SIDPlay2] Could not initialize SIDBuilder object.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:295
-#, c-format
-msgid "[SIDPlay2] Invalid clockSpeed=%d, falling back to PAL.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:319
-#, c-format
-msgid "Invalid sid2OptLevel=%d, falling back to %d.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:343
-msgid "[SIDPlay2] Emulator engine configuration failed!\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:350
-msgid "[SIDPlay2] Could not initialize SIDTune object.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:401
-msgid "[SIDPlay2] currTune->selectSong() failed\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:406
-msgid "[SIDPlay2] currEng->load() failed\n"
-msgstr ""
-
-#: src/sid/xs_slsup.c:217
-#, c-format
-msgid "Could not allocate memory for t_xs_tuneinfo ('%s')\n"
-msgstr ""
-
-#: src/sid/xs_slsup.c:224
-#, c-format
-msgid "Could not allocate sidFilename ('%s')\n"
-msgstr ""
-
-#: src/sid/xs_slsup.c:233
-#, c-format
-msgid "Could not allocate memory for t_xs_subtuneinfo ('%s', %i)\n"
-msgstr ""
-
-#: src/sid/xs_stil.c:46
-msgid "SubTune pointer structure realloc failed.\n"
-msgstr ""
-
-#: src/sid/xs_stil.c:69
-msgid "SubTune structure malloc failed!\n"
-msgstr ""
-
-#: src/sid/xs_stil.c:176
-#, c-format
-msgid "Could not open STILDB '%s'\n"
-msgstr ""
-
 #: src/sndfile/plugin.c:548
 #, fuzzy
 msgid "About sndfile plugin"
@@ -4756,12 +4516,12 @@
 msgid "The orientation of the tray"
 msgstr ""
 
-#: src/statusicon/si_ui.c:587
+#: src/statusicon/si_ui.c:622
 #, fuzzy
 msgid "About Status Icon Plugin"
 msgstr "Quant al plugin ESounD"
 
-#: src/statusicon/si_ui.c:589
+#: src/statusicon/si_ui.c:624
 msgid ""
 "\n"
 "written by Giacomo Lozito < james@develia.org >\n"
@@ -4770,35 +4530,35 @@
 "the system tray area of the window manager.\n"
 msgstr ""
 
-#: src/statusicon/si_ui.c:661
+#: src/statusicon/si_ui.c:696
 msgid "Status Icon Plugin - Preferences"
 msgstr ""
 
-#: src/statusicon/si_ui.c:672
+#: src/statusicon/si_ui.c:707
 msgid "Right-Click Menu"
 msgstr ""
 
-#: src/statusicon/si_ui.c:677
+#: src/statusicon/si_ui.c:712
 msgid "Audacious standard menu"
 msgstr ""
 
-#: src/statusicon/si_ui.c:682
+#: src/statusicon/si_ui.c:717
 msgid "Small playback menu #1"
 msgstr ""
 
-#: src/statusicon/si_ui.c:687
+#: src/statusicon/si_ui.c:722
 msgid "Small playback menu #2"
 msgstr ""
 
-#: src/statusicon/si_ui.c:710
+#: src/statusicon/si_ui.c:745
 msgid "Mouse Scroll Action"
 msgstr ""
 
-#: src/statusicon/si_ui.c:715
+#: src/statusicon/si_ui.c:750
 msgid "Change volume"
 msgstr ""
 
-#: src/statusicon/si_ui.c:720
+#: src/statusicon/si_ui.c:755
 msgid "Change playing song"
 msgstr ""
 
@@ -4918,12 +4678,12 @@
 "e.g. tone://2000;2005 per a generar un to de 2000 Hz i un to\n"
 "de 2005 Hz."
 
-#: src/tonegen/tonegen.c:168
+#: src/tonegen/tonegen.c:167
 #, c-format
 msgid "%s %.1f Hz"
 msgstr ""
 
-#: src/tonegen/tonegen.c:168
+#: src/tonegen/tonegen.c:167
 msgid "Tone Generator: "
 msgstr "Generador de tons:"
 
@@ -4985,43 +4745,24 @@
 msgid "Track number:"
 msgstr "Número de pista:"
 
-#: src/vorbis/configure.c:115
+#: src/vorbis/configure.c:84
 msgid "Ogg Vorbis Audio Plugin Configuration"
 msgstr "Configuració del plugin d'àudio Ogg Vorbis"
 
-#: src/vorbis/configure.c:127
+#: src/vorbis/configure.c:94
 msgid "Ogg Vorbis Tags:"
 msgstr "Etiquetes Ogg Vorbis:"
 
-#: src/vorbis/configure.c:148
+#: src/vorbis/configure.c:115
 msgid "Title format:"
 msgstr "Format del títol:"
 
-#: src/vorbis/configure.c:162 src/wavpack/ui.cxx:502
-msgid "ReplayGain Settings:"
-msgstr "Paràmetres de ReplayGain:"
-
-#: src/vorbis/configure.c:180 src/wavpack/ui.cxx:520
-msgid "ReplayGain Type:"
-msgstr "Tipus de ReplayGain:"
-
-#: src/vorbis/configure.c:191 src/wavpack/ui.cxx:531
-msgid "use Track Gain/Peak"
-msgstr "usa el guany/pic de la pista"
-
-#: src/vorbis/configure.c:201 src/wavpack/ui.cxx:539
-msgid "use Album Gain/Peak"
-msgstr "usa el guany/pic del disc"
-
-#: src/vorbis/configure.c:213
-msgid "Enable 6dB Boost + Hard Limiting"
-msgstr "Habilita guany de 6dB + limit rígid"
-
-#: src/vorbis/vorbis.c:751 src/vorbis/vorbis.c~:759
+#: src/vorbis/vorbis.c:681
 msgid "About Ogg Vorbis Audio Plugin"
 msgstr "Quant al plugin d'àudio Ogg Vorbis"
 
-#: src/vorbis/vorbis.c:757 src/vorbis/vorbis.c~:765
+#: src/vorbis/vorbis.c:687
+#, fuzzy
 msgid ""
 "Ogg Vorbis Plugin by the Xiph.org Foundation\n"
 "\n"
@@ -5035,6 +4776,7 @@
 "Jorn Baayen <jorn@nl.linux.org>\n"
 "Haavard Kvaalen <havardk@xmms.org>\n"
 "Gian-Carlo Pascutto <gcp@sjeng.org>\n"
+"Eugene Zagidullin <e.asphyx@gmail.com>\n"
 "\n"
 "Visit the Xiph.org Foundation at http://www.xiph.org/\n"
 msgstr ""
@@ -5157,7 +4899,23 @@
 msgid "General Plugin Settings:"
 msgstr "Paràmetres de ReplayGain:"
 
-#: src/wma/wma.c:132
+#: src/wavpack/ui.cxx:502
+msgid "ReplayGain Settings:"
+msgstr "Paràmetres de ReplayGain:"
+
+#: src/wavpack/ui.cxx:520
+msgid "ReplayGain Type:"
+msgstr "Tipus de ReplayGain:"
+
+#: src/wavpack/ui.cxx:531
+msgid "use Track Gain/Peak"
+msgstr "usa el guany/pic de la pista"
+
+#: src/wavpack/ui.cxx:539
+msgid "use Album Gain/Peak"
+msgstr "usa el guany/pic del disc"
+
+#: src/wma/wma.c:123
 msgid ""
 "Adapted for use in Audacious by Tony Vroon (chainsaw@gentoo.org) from\n"
 "the BEEP-WMA plugin which is Copyright (C) 2004,2005 Mokrushin I.V. aka "
@@ -5168,6 +4926,29 @@
 msgstr ""
 
 #, fuzzy
+#~ msgid "Base gain (dB):"
+#~ msgstr "Per defecte (%s)"
+
+#, fuzzy
+#~ msgid "Enable ReplayGain processing"
+#~ msgstr "Habilita el ReplayGain"
+
+#, fuzzy
+#~ msgid "Enable peak info clip prevention"
+#~ msgstr "Prevenció de distorsions"
+
+#, fuzzy
+#~ msgid "Enable adaptive scaler clip prevention"
+#~ msgstr "Prevenció de distorsions"
+
+#, fuzzy
+#~ msgid "Gain Control"
+#~ msgstr "Control del volum:"
+
+#~ msgid "Enable 6dB Boost + Hard Limiting"
+#~ msgstr "Habilita guany de 6dB + limit rígid"
+
+#, fuzzy
 #~ msgid "<b>Playback:</b>"
 #~ msgstr "Reproducció"
 
--- a/po/cs.po	Fri Jun 13 04:58:39 2008 +0300
+++ b/po/cs.po	Fri Jun 13 05:57:25 2008 +0300
@@ -9,7 +9,7 @@
 msgstr ""
 "Project-Id-Version: audacious-plugins hg-2287\n"
 "Report-Msgid-Bugs-To: http://bugs.audacious-media-player.org\n"
-"POT-Creation-Date: 2008-02-03 20:33+0200\n"
+"POT-Creation-Date: 2008-03-30 17:25+0200\n"
 "PO-Revision-Date: 2008-01-09 18:56+0100\n"
 "Last-Translator: Petr Písař <petr.pisar@atlas.cz>\n"
 "Language-Team: Czech <translation-team-cs@lists.sourceforge.net>\n"
@@ -39,22 +39,22 @@
 #: src/adplug/adplug-xmms.cc:265 src/adplug/adplug-xmms.cc:526
 #: src/alac/plugin.c:77 src/arts/arts.c:26 src/arts/configure.c:90
 #: src/audiocompress/audacious-glue.c:102
-#: src/audiocompress/audacious-glue.c:552 src/cdaudio-ng/configure.c:227
-#: src/console/Audacious_Driver.cxx:449 src/demac/plugin.c:392
+#: src/audiocompress/audacious-glue.c:552 src/cdaudio-ng/configure.c:228
+#: src/console/Audacious_Driver.cxx:449 src/demac/plugin.c:393
 #: src/echo_plugin/gui.c:26 src/echo_plugin/gui.c:137 src/esd/about.c:49
 #: src/filewriter/filewriter.c:183 src/jack/configure.c:141
-#: src/jack/jack.c:493 src/madplug/plugin.c:600 src/madplug/plugin.c:624
+#: src/jack/jack.c:456 src/madplug/plugin.c:542 src/madplug/plugin.c:566
 #: src/metronom/metronom.c:88 src/modplug/gui/main.cxx:49
 #: src/musepack/libmpc.cxx:232 src/null/null.c:67 src/null/null.c:110
 #: src/OSS4/about.c:59 src/OSS/about.c:54 src/paranormal-ng/plugin.c:283
 #: src/paranormal/plugin.c:291 src/scrobbler/gtkstuff.c:25
-#: src/sndfile/plugin.c:565 src/statusicon/si_ui.c:593
+#: src/sndfile/plugin.c:565 src/statusicon/si_ui.c:628
 #: src/stereo_plugin/stereo.c:53 src/stereo_plugin/stereo.c:116
 #: src/sun/about.c:38 src/sun/configure.c:559 src/timidity/interface.c:222
 #: src/timidity/xmms-timidity.c:120 src/tonegen/tonegen.c:62
 #: src/tta/libtta.c:153 src/tta/libtta.c:267 src/tta/libtta.c:402
-#: src/vorbis/vorbis.c:769 src/vorbis/vorbis.c~:777 src/vtx/about.c:32
-#: src/vtx/info.c:43 src/wavpack/ui.cxx:56 src/wavpack/ui.cxx:556
+#: src/vorbis/vorbis.c:700 src/vtx/about.c:32 src/vtx/info.c:43
+#: src/wavpack/ui.cxx:56 src/wavpack/ui.cxx:556
 msgid "Ok"
 msgstr "OK"
 
@@ -89,7 +89,7 @@
 
 #: src/adplug/adplug-xmms.cc:275 src/alarm/interface.c:1398
 #: src/alsa/configure.c:389 src/arts/configure.c:91
-#: src/audiocompress/audacious-glue.c:557 src/cdaudio-ng/configure.c:231
+#: src/audiocompress/audacious-glue.c:557 src/cdaudio-ng/configure.c:232
 #: src/echo_plugin/gui.c:145 src/jack/configure.c:148
 #: src/modplug/gui/interface.cxx:714 src/modplug/gui/modplug.glade:1668
 #: src/musepack/libmpc.cxx:237 src/musepack/libmpc.cxx:557 src/null/null.c:111
@@ -100,7 +100,7 @@
 msgstr "Zrušit"
 
 #: src/adplug/adplug-xmms.cc:291 src/console/Audacious_Config.cxx:145
-#: src/madplug/configure.c:421 src/modplug/gui/interface.cxx:628
+#: src/madplug/configure.c:290 src/modplug/gui/interface.cxx:628
 #: src/modplug/gui/interface.cxx:887 src/modplug/gui/modplug.glade:1404
 #: src/modplug/gui/modplug.glade:1804
 msgid "General"
@@ -128,13 +128,13 @@
 msgid "Channels"
 msgstr "Kanály"
 
-#: src/adplug/adplug-xmms.cc:325 src/filewriter/mp3.c:894
+#: src/adplug/adplug-xmms.cc:325 src/filewriter/mp3.c:900
 #: src/sid/xmms-sid.glade:157 src/sid/xs_interface.c:288
 #: src/timidity/interface.c:165
 msgid "Mono"
 msgstr "Mono"
 
-#: src/adplug/adplug-xmms.cc:330 src/filewriter/mp3.c:889
+#: src/adplug/adplug-xmms.cc:330 src/filewriter/mp3.c:895
 #: src/modplug/gui/interface.cxx:204 src/modplug/gui/modplug.glade:159
 #: src/sid/xmms-sid.glade:176 src/sid/xs_interface.c:295
 #: src/timidity/interface.c:173
@@ -317,7 +317,7 @@
 
 #: src/alarm/interface.c:71 src/lirc/about.c:115
 #: src/modplug/gui/interface.cxx:971 src/modplug/gui/modplug.glade:2030
-#: src/sid/xmms-sid.glade:3643 src/sid/xs_about.c:213
+#: src/sid/xmms-sid.glade:3643 src/sid/xs_about.c:214
 #: src/sid/xs_interface.c:1740
 msgid "Close"
 msgstr "Zavřít"
@@ -331,10 +331,10 @@
 msgstr "Toto je váš budící signál."
 
 #: src/alarm/interface.c:124 src/alarm/interface.c:1389 src/alsa/about.c:46
-#: src/alsa/configure.c:383 src/cdaudio-ng/cdaudio-ng.c:228
-#: src/flacng/plugin.c:747 src/gnomeshortcuts/gnomeshortcuts.c:292
+#: src/alsa/configure.c:383 src/cdaudio-ng/cdaudio-ng.c:247
+#: src/flacng/plugin.c:706 src/gnomeshortcuts/gnomeshortcuts.c:311
 #: src/hotkey/gui.c:671 src/modplug/gui/interface.cxx:702
-#: src/modplug/gui/modplug.glade:1642 src/pulse_audio/pulse_audio.c:712
+#: src/modplug/gui/modplug.glade:1642 src/pulse_audio/pulse_audio.c:738
 #: src/scrobbler/gtkstuff.c:45 src/sid/xmms-sid.glade:3066
 #: src/sid/xs_interface.c:1243
 msgid "OK"
@@ -1793,7 +1793,7 @@
 msgid "Trigger"
 msgstr "SpouÅ¡tÄ›Ä"
 
-#: src/aosd/aosd_ui.c:1076 src/cdaudio-ng/configure.c:166
+#: src/aosd/aosd_ui.c:1076 src/cdaudio-ng/configure.c:167
 #: src/modplug/gui/interface.cxx:688 src/modplug/gui/modplug.glade:1603
 #: src/sid/xmms-sid.glade:3026 src/sid/xs_interface.c:1229
 msgid "Misc"
@@ -1996,15 +1996,19 @@
 msgid "Options:"
 msgstr "Volby:"
 
-#: src/cdaudio-ng/cdaudio-ng.c:198
+#: src/cdaudio-ng/cdaudio-ng.c:204
+msgid "Rescan CD"
+msgstr ""
+
+#: src/cdaudio-ng/cdaudio-ng.c:217
 msgid "Add CD"
 msgstr "Přidat CD"
 
-#: src/cdaudio-ng/cdaudio-ng.c:223
+#: src/cdaudio-ng/cdaudio-ng.c:242
 msgid "About CD Audio Plugin NG"
 msgstr "O modulu CD Audio NG"
 
-#: src/cdaudio-ng/cdaudio-ng.c:224
+#: src/cdaudio-ng/cdaudio-ng.c:243
 msgid ""
 "Copyright (c) 2007, by Calin Crisan <ccrisan@gmail.com> and The Audacious "
 "Team.\n"
@@ -2025,7 +2029,7 @@
 "\n"
 "Toto byl projekt z Google Summer of Code 2007."
 
-#: src/cdaudio-ng/cdaudio-ng.c:627
+#: src/cdaudio-ng/cdaudio-ng.c:814
 msgid ""
 "<b><big>No playable CD found.</big></b>\n"
 "\n"
@@ -2035,47 +2039,47 @@
 "\n"
 "Není vloženo CD, nebo vložené CD není typu Audio CD.\n"
 
-#: src/cdaudio-ng/configure.c:146
+#: src/cdaudio-ng/configure.c:147
 msgid "CD Audio Plugin Configuration"
 msgstr "Nastavení modulu pro zvuková CD"
 
-#: src/cdaudio-ng/configure.c:156
+#: src/cdaudio-ng/configure.c:157
 msgid "Digital audio extraction"
 msgstr "Digitální získání zvuku"
 
-#: src/cdaudio-ng/configure.c:161
+#: src/cdaudio-ng/configure.c:162
 msgid "Title information"
 msgstr "Informace o titulu"
 
-#: src/cdaudio-ng/configure.c:178
+#: src/cdaudio-ng/configure.c:179
 msgid "Limit read speed to: "
 msgstr "Omezit rychlost Ätení na:"
 
-#: src/cdaudio-ng/configure.c:185
+#: src/cdaudio-ng/configure.c:186
 msgid "Use cd-text if available"
 msgstr "Pokud možno, použít cd-text"
 
-#: src/cdaudio-ng/configure.c:189
+#: src/cdaudio-ng/configure.c:190
 msgid "Use CDDB if available"
 msgstr "Pokud možno, použít CDDB"
 
-#: src/cdaudio-ng/configure.c:193
+#: src/cdaudio-ng/configure.c:194
 msgid "Server: "
 msgstr "Server: "
 
-#: src/cdaudio-ng/configure.c:196
+#: src/cdaudio-ng/configure.c:197
 msgid "Port: "
 msgstr "Port: "
 
-#: src/cdaudio-ng/configure.c:202
+#: src/cdaudio-ng/configure.c:203
 msgid "Use HTTP instead of CDDBP"
 msgstr "Použít HTTP místo CDDBP"
 
-#: src/cdaudio-ng/configure.c:210
+#: src/cdaudio-ng/configure.c:211
 msgid "Override default device: "
 msgstr "Přebít výchozí zařízení: "
 
-#: src/cdaudio-ng/configure.c:217
+#: src/cdaudio-ng/configure.c:218
 msgid "Print debug information"
 msgstr "Zobrazovat ladící informace"
 
@@ -2150,11 +2154,11 @@
 "Implementace v Audacious: William Pitcock <nenold@nenold.net>,\n"
 "        Shay Green <gblargg@gmail.com>"
 
-#: src/demac/plugin.c:387
+#: src/demac/plugin.c:388
 msgid "About Monkey's Audio Plugin"
 msgstr "O modulu pro Monkey's Audio"
 
-#: src/demac/plugin.c:388
+#: src/demac/plugin.c:389
 msgid ""
 "Copyright (C) 2007 Eugene Zagidullin <e.asphyx@gmail.com>\n"
 "Based on ffape decoder, Copyright (C) 2007 Benjamin Zores\n"
@@ -2473,7 +2477,7 @@
 "Nelze otevřít okno s vazbami pro nerozpoznané zařízení.\n"
 "Ujistěte se, že zařízení bylo správně zapojeno."
 
-#: src/evdev-plug/ed_ui.c:319 src/madplug/plugin.c:624
+#: src/evdev-plug/ed_ui.c:319 src/madplug/plugin.c:566
 msgid "Error"
 msgstr "Chyba"
 
@@ -2707,15 +2711,15 @@
 msgid "Prepend track number to filename"
 msgstr "PÅ™edÅ™adit jménu souboru Äíslo stopy"
 
-#: src/filewriter/mp3.c:670
+#: src/filewriter/mp3.c:676
 msgid "MP3 Configuration"
 msgstr "Nastavení MP3"
 
-#: src/filewriter/mp3.c:697
+#: src/filewriter/mp3.c:703
 msgid "Algorithm Quality:"
 msgstr "Kvalita algoritmu:"
 
-#: src/filewriter/mp3.c:719
+#: src/filewriter/mp3.c:725
 msgid ""
 "best/slowest:0;\n"
 "worst/fastest:9;\n"
@@ -2727,96 +2731,96 @@
 "doporuÄená:2;\n"
 "výchozí:5;"
 
-#: src/filewriter/mp3.c:727
+#: src/filewriter/mp3.c:733
 msgid "Output Samplerate:"
 msgstr "Výstupní vzorkovací kmitoÄet"
 
-#: src/filewriter/mp3.c:738 src/filewriter/mp3.c:879
+#: src/filewriter/mp3.c:744 src/filewriter/mp3.c:885
 msgid "Auto"
 msgstr "Auto"
 
-#: src/filewriter/mp3.c:760
+#: src/filewriter/mp3.c:766
 msgid "(Hz)"
 msgstr "(Hz)"
 
-#: src/filewriter/mp3.c:772
+#: src/filewriter/mp3.c:778
 msgid "Bitrate / Compression ratio:"
 msgstr "Datový tok / Kompresní poměr:"
 
-#: src/filewriter/mp3.c:798
+#: src/filewriter/mp3.c:804
 msgid "Bitrate (kbps):"
 msgstr "Datový tok (kb/s):"
 
-#: src/filewriter/mp3.c:839
+#: src/filewriter/mp3.c:845
 msgid "Compression ratio:"
 msgstr "Kompresní poměr:"
 
-#: src/filewriter/mp3.c:869
+#: src/filewriter/mp3.c:875
 msgid "Audio Mode:"
 msgstr "Zvukový režim:"
 
-#: src/filewriter/mp3.c:884
+#: src/filewriter/mp3.c:890
 msgid "Joint-Stereo"
 msgstr "Joint-Stereo"
 
-#: src/filewriter/mp3.c:925
+#: src/filewriter/mp3.c:931
 msgid "auto-M/S mode"
 msgstr "režim auto–M/S"
 
-#: src/filewriter/mp3.c:937
+#: src/filewriter/mp3.c:943
 msgid "Misc:"
 msgstr "Různé:"
 
-#: src/filewriter/mp3.c:948
+#: src/filewriter/mp3.c:954
 msgid "Enforce strict ISO complience"
 msgstr "Vynutit přísnou shodu s ISO"
 
-#: src/filewriter/mp3.c:959
+#: src/filewriter/mp3.c:965
 msgid "Error protection"
 msgstr "Ochrana před chybami"
 
-#: src/filewriter/mp3.c:971
+#: src/filewriter/mp3.c:977
 msgid "Adds 16 bit checksum to every frame"
 msgstr "Ke každému rámci pÅ™idat 16b kontrolní souÄet"
 
-#: src/filewriter/mp3.c:976 src/filewriter/vorbis.c:274
+#: src/filewriter/mp3.c:982 src/filewriter/vorbis.c:274
 #: src/modplug/gui/interface.cxx:319 src/modplug/gui/modplug.glade:507
 msgid "Quality"
 msgstr "Kvalita"
 
-#: src/filewriter/mp3.c:988
+#: src/filewriter/mp3.c:994
 msgid "Enable VBR/ABR"
 msgstr "Povolit VBR/ABR"
 
-#: src/filewriter/mp3.c:1000
+#: src/filewriter/mp3.c:1006
 msgid "Type:"
 msgstr "Druh:"
 
-#: src/filewriter/mp3.c:1011
+#: src/filewriter/mp3.c:1017
 msgid "Variable bitrate"
 msgstr "Proměnný datový tok"
 
-#: src/filewriter/mp3.c:1023
+#: src/filewriter/mp3.c:1029
 msgid "Average bitrate"
 msgstr "Průměrný datový tok"
 
-#: src/filewriter/mp3.c:1037
+#: src/filewriter/mp3.c:1043
 msgid "VBR Options:"
 msgstr "Nastavení VBR:"
 
-#: src/filewriter/mp3.c:1053
+#: src/filewriter/mp3.c:1059
 msgid "Minimum bitrate (kbps):"
 msgstr "Nejmenší datový tok (kb/s):"
 
-#: src/filewriter/mp3.c:1089
+#: src/filewriter/mp3.c:1095
 msgid "Maximum bitrate (kbps):"
 msgstr "Největší datový tok (kb/s):"
 
-#: src/filewriter/mp3.c:1121
+#: src/filewriter/mp3.c:1127
 msgid "Strictly enforce minimum bitrate"
 msgstr "Přísně vynucovat nejmenší datový tok"
 
-#: src/filewriter/mp3.c:1123
+#: src/filewriter/mp3.c:1129
 msgid ""
 "For use with players that do not support low bitrate mp3 (Apex AD600-A DVD/"
 "mp3 player)"
@@ -2824,19 +2828,19 @@
 "Pro použití v pÅ™ehrávaÄích, které nepodporují nízkotokové MP3 (pÅ™ehrávaÄ "
 "Apex AD600-A DVD/MP3)"
 
-#: src/filewriter/mp3.c:1136
+#: src/filewriter/mp3.c:1142
 msgid "ABR Options:"
 msgstr "Nastavení ABR:"
 
-#: src/filewriter/mp3.c:1146
+#: src/filewriter/mp3.c:1152
 msgid "Average bitrate (kbps):"
 msgstr "Průměrný datový tok (kb/s):"
 
-#: src/filewriter/mp3.c:1183
+#: src/filewriter/mp3.c:1189
 msgid "VBR quality level:"
 msgstr "Úroveň kvality VBR:"
 
-#: src/filewriter/mp3.c:1198
+#: src/filewriter/mp3.c:1204
 msgid ""
 "highest:0;\n"
 "lowest:9;\n"
@@ -2846,43 +2850,43 @@
 "nejnižší:9;\n"
 "výchozí:4;"
 
-#: src/filewriter/mp3.c:1206
+#: src/filewriter/mp3.c:1212
 msgid "Don't write Xing VBR header"
 msgstr "Nezapisovat VBR hlaviÄku Xing"
 
-#: src/filewriter/mp3.c:1221
+#: src/filewriter/mp3.c:1227
 msgid "VBR/ABR"
 msgstr "VBR/ABR"
 
-#: src/filewriter/mp3.c:1233
+#: src/filewriter/mp3.c:1239
 msgid "Frame params:"
 msgstr "Parametry rámců:"
 
-#: src/filewriter/mp3.c:1245
+#: src/filewriter/mp3.c:1251
 msgid "Mark as copyright"
 msgstr "OznaÄit jako podléhající autorskému právu"
 
-#: src/filewriter/mp3.c:1256
+#: src/filewriter/mp3.c:1262
 msgid "Mark as original"
 msgstr "OznaÄit jako původní"
 
-#: src/filewriter/mp3.c:1268
+#: src/filewriter/mp3.c:1274
 msgid "ID3 params:"
 msgstr "Parametry ID3:"
 
-#: src/filewriter/mp3.c:1279
+#: src/filewriter/mp3.c:1285
 msgid "Force addition of version 2 tag"
 msgstr "Vynutit pÅ™idání znaÄek verze 2"
 
-#: src/filewriter/mp3.c:1289
+#: src/filewriter/mp3.c:1295
 msgid "Only add v1 tag"
 msgstr "PÅ™idávat jen znaÄky verze 1"
 
-#: src/filewriter/mp3.c:1296
+#: src/filewriter/mp3.c:1302
 msgid "Only add v2 tag"
 msgstr "PÅ™idávat jen znaÄky verze 2"
 
-#: src/filewriter/mp3.c:1317
+#: src/filewriter/mp3.c:1323
 msgid "Tags"
 msgstr "ZnaÄky"
 
@@ -2894,11 +2898,11 @@
 msgid "Quality level (0 - 10):"
 msgstr "Úroveň kvality (0–10):"
 
-#: src/flacng/plugin.c:739
+#: src/flacng/plugin.c:698
 msgid "FLAC Audio Plugin "
 msgstr "Zvukový modul FLAC"
 
-#: src/flacng/plugin.c:740
+#: src/flacng/plugin.c:699
 msgid ""
 "\n"
 "\n"
@@ -2914,20 +2918,21 @@
 "\n"
 "http://www.skytale.net/projects/bmp-flac2/"
 
-#: src/flacng/plugin.c:745
+#: src/flacng/plugin.c:704
 msgid "About FLAC Audio Plugin"
 msgstr "O zvukovém modulu FLAC"
 
-#: src/gnomeshortcuts/gnomeshortcuts.c:287
+#: src/gnomeshortcuts/gnomeshortcuts.c:306
 msgid "About Gnome Shortcut Plugin"
 msgstr "O modulu pro zkratky Gnome"
 
-#: src/gnomeshortcuts/gnomeshortcuts.c:288
+#: src/gnomeshortcuts/gnomeshortcuts.c:307
+#, fuzzy
 msgid ""
 "Gnome Shortcut Plugin\n"
 "Let's you control the player with Gnome's shortcuts.\n"
 "\n"
-"Copyright (C) 2007 Sascha Hlusiak <contact@saschahlusiak.de>\n"
+"Copyright (C) 2007-2008 Sascha Hlusiak <contact@saschahlusiak.de>\n"
 "\n"
 msgstr ""
 "Modul pro zkratky Gnome\n"
@@ -3101,11 +3106,11 @@
 msgid "Enable debug printing"
 msgstr "Povolit ladící výpisy"
 
-#: src/jack/jack.c:95
+#: src/jack/jack.c:84
 msgid "Sample rate mismatch"
 msgstr "Vzorkovací kmitoÄet nesouhlasí"
 
-#: src/jack/jack.c:98
+#: src/jack/jack.c:87
 msgid ""
 "Xmms is asking for a sample rate that differs from\n"
 " that of the jack server.  Xmms 1.2.8 or later\n"
@@ -3128,15 +3133,15 @@
 "\n"
 "Chris Morgan <cmorgan@alum.wpi.edu>\n"
 
-#: src/jack/jack.c:111 src/wma/wma.c:157
+#: src/jack/jack.c:100 src/wma/wma.c:148
 msgid " Close "
 msgstr " Zavřít "
 
-#: src/jack/jack.c:489
+#: src/jack/jack.c:452
 msgid "About JACK Output Plugin 0.17"
 msgstr "O výstupním modulu JACK 0.17"
 
-#: src/jack/jack.c:490
+#: src/jack/jack.c:453
 msgid ""
 "XMMS jack Driver 0.17\n"
 "\n"
@@ -3287,111 +3292,60 @@
 msgid "%s: will try reconnect every %d seconds...\n"
 msgstr "%s: pokus o připojení budu opakovat každých %d sekund…\n"
 
-#: src/madplug/configure.c:332
+#: src/madplug/configure.c:209
 msgid "MPEG Audio Plugin Configuration"
 msgstr "Nastavení modulu MPEG Audio"
 
-#: src/madplug/configure.c:349
+#: src/madplug/configure.c:226
 #, fuzzy
 msgid "Audio Settings"
 msgstr "Nastavení budíku"
 
-#: src/madplug/configure.c:358
-msgid "Dither output when rounding to 16-bit"
-msgstr "Diterovat výstup při zaokrouhlování na 16 bitů"
-
-#: src/madplug/configure.c:365
+#: src/madplug/configure.c:234
 msgid "Force reopen audio when audio type changed"
 msgstr "Vynutit znovuotevření zvuku, když se typ zvuku změní"
 
-#: src/madplug/configure.c:374
+#: src/madplug/configure.c:243
 #, fuzzy
 msgid "Metadata Settings"
 msgstr "Nastavení mixéru:"
 
-#: src/madplug/configure.c:383
+#: src/madplug/configure.c:252
 msgid "Enable fast play-length calculation"
 msgstr "Povolit rychlý výpoÄet doby hraní"
 
-#: src/madplug/configure.c:390
+#: src/madplug/configure.c:259
 msgid "Parse XING headers"
 msgstr "Rozebrat hlaviÄku XING"
 
-#: src/madplug/configure.c:397
+#: src/madplug/configure.c:266
 #, fuzzy
 msgid "Use SJIS to write ID3 tags (not recommended)"
 msgstr "Pro zápis ID3 tagů použít SJIS na místo UTF-8"
 
-#: src/madplug/configure.c:404
+#: src/madplug/configure.c:273
 #, fuzzy
 msgid "Miscellaneous Settings"
 msgstr "Nastavení mixéru:"
 
-#: src/madplug/configure.c:413
+#: src/madplug/configure.c:282
 msgid "Display average bitrate for VBR"
 msgstr "U VBR zobrazovat průměrný datový tok"
 
-#: src/madplug/configure.c:432
-#, fuzzy
-msgid "Base gain (dB):"
-msgstr "Implicitní zesílení (dB):"
-
-#: src/madplug/configure.c:446 src/musepack/libmpc.cxx:190
-msgid "ReplayGain Settings"
-msgstr "Nastavení pro zesílení přehrávání"
-
-#: src/madplug/configure.c:457
-msgid "Enable ReplayGain processing"
-msgstr "Zapnout zesílení pro přehrávání"
-
-#: src/madplug/configure.c:467 src/musepack/libmpc.cxx:207
-msgid "ReplayGain Type"
-msgstr "Typ zesílení pro přehrávání"
-
-#: src/madplug/configure.c:477 src/musepack/libmpc.cxx:215
-msgid "Use Track Gain"
-msgstr "Použít zesílení stopy"
-
-#: src/madplug/configure.c:485 src/musepack/libmpc.cxx:219
-msgid "Use Album Gain"
-msgstr "Použít zesílení alba"
-
-#: src/madplug/configure.c:498
-msgid "Pre-gain with RG info (dB):"
-msgstr ""
-
-#: src/madplug/configure.c:514
-msgid "Pre-gain without RG info (dB):"
-msgstr ""
-
-#: src/madplug/configure.c:530
-#, fuzzy
-msgid "Enable peak info clip prevention"
-msgstr "Povolit prevenci před oříznutím"
-
-#: src/madplug/configure.c:552
-#, fuzzy
-msgid "Enable adaptive scaler clip prevention"
-msgstr "Povolit prevenci před oříznutím"
-
-#: src/madplug/configure.c:561
-msgid "Gain Control"
-msgstr ""
-
-#: src/madplug/configure.c:569 src/vorbis/configure.c:135
+#: src/madplug/configure.c:296 src/vorbis/configure.c:102
 msgid "Override generic titles"
 msgstr "Přepsat původní názvy"
 
-#: src/madplug/configure.c:581
+#: src/madplug/configure.c:308
 msgid "ID3 format:"
 msgstr "Formát ID3:"
 
-#: src/madplug/configure.c:593 src/sid/xmms-sid.glade:2540
-#: src/sid/xs_interface.c:1070 src/vorbis/configure.c:158
+#: src/madplug/configure.c:320 src/sid/xmms-sid.glade:2540
+#: src/sid/xs_interface.c:1070
 msgid "Title"
 msgstr "Název"
 
-#: src/madplug/plugin.c:582
+#: src/madplug/plugin.c:524
 #, c-format
 msgid ""
 "Audacious MPEG Audio Plugin\n"
@@ -3422,7 +3376,7 @@
 "Podpora zesílení přehrávání od:\n"
 "    Samuel Krempp"
 
-#: src/madplug/plugin.c:598
+#: src/madplug/plugin.c:540
 msgid "About MPEG Audio Plugin"
 msgstr "O modul pro MPEG zvuk"
 
@@ -3750,18 +3704,31 @@
 msgid "Plugin"
 msgstr "Modul"
 
-#: src/musepack/libmpc.cxx:197 src/vorbis/configure.c:170
-#: src/wavpack/ui.cxx:510
+#: src/musepack/libmpc.cxx:190
+msgid "ReplayGain Settings"
+msgstr "Nastavení pro zesílení přehrávání"
+
+#: src/musepack/libmpc.cxx:197 src/wavpack/ui.cxx:510
 msgid "Enable Clipping Prevention"
 msgstr "Povolit prevenci před oříznutím"
 
-#: src/musepack/libmpc.cxx:202 src/vorbis/configure.c:175
-#: src/wavpack/ui.cxx:515
+#: src/musepack/libmpc.cxx:202 src/wavpack/ui.cxx:515
 msgid "Enable ReplayGain"
 msgstr "Zapnout zesílení pro přehrávání"
 
-#: src/musepack/libmpc.cxx:224 src/vorbis/configure.c:219
-#: src/wavpack/ui.cxx:547
+#: src/musepack/libmpc.cxx:207
+msgid "ReplayGain Type"
+msgstr "Typ zesílení pro přehrávání"
+
+#: src/musepack/libmpc.cxx:215
+msgid "Use Track Gain"
+msgstr "Použít zesílení stopy"
+
+#: src/musepack/libmpc.cxx:219
+msgid "Use Album Gain"
+msgstr "Použít zesílení alba"
+
+#: src/musepack/libmpc.cxx:224 src/wavpack/ui.cxx:547
 msgid "ReplayGain"
 msgstr "Zesílení přehrávání"
 
@@ -4019,11 +3986,15 @@
 msgid "Volume controls Master not PCM"
 msgstr "Hlasitost ovládána Master kanálem místo PCM"
 
-#: src/pulse_audio/pulse_audio.c:696
+#: src/projectm-1.0/main.c:70
+msgid "_Random"
+msgstr ""
+
+#: src/pulse_audio/pulse_audio.c:722
 msgid "About Audacious PulseAudio Output Plugin"
 msgstr "O výstupním modulu PulseAudio pro Audacious"
 
-#: src/pulse_audio/pulse_audio.c:697
+#: src/pulse_audio/pulse_audio.c:723
 msgid ""
 "Audacious PulseAudio Output Plugin\n"
 "\n"
@@ -4111,36 +4082,6 @@
 msgid "Scrobbler Error"
 msgstr "Chyba Scrobbleru"
 
-#: src/sid/xmms-sid.c:203
-msgid "Error initializing song-length database!\n"
-msgstr "Chyba při inicializaci databáze délek skladeb!\n"
-
-#: src/sid/xmms-sid.c:209
-msgid "Error initializing STIL database!\n"
-msgstr "Chyba při inicializaci databáze STIL!\n"
-
-#: src/sid/xmms-sid.c:347
-msgid "Couldn't allocate memory for audio data buffer!\n"
-msgstr "Pro zvukový buffer nelze alokovat paměť!\n"
-
-#: src/sid/xmms-sid.c:355
-msgid "Couldn't allocate memory for audio oversampling buffer!\n"
-msgstr "Pro buffer na převzorkování nelze alokovat paměť!\n"
-
-#: src/sid/xmms-sid.c:371
-#, c-format
-msgid "Couldn't initialize SID-tune '%s' (sub-tune #%i)!\n"
-msgstr "Nelze inicializovat SID skladbu „%s“ (podskladba Ä. %i)!\n"
-
-#: src/sid/xmms-sid.c:382
-#, c-format
-msgid "Couldn't open XMMS audio output (fmt=%x, freq=%i, nchan=%i)!\n"
-msgstr "Nelze otevřít zvukový výstup XMMS (form=%x, frekv=%i, kanálů=%i)!\n"
-
-#: src/sid/xmms-sid.c:432
-msgid "Oversampling rate-conversion pass failed.\n"
-msgstr "PÅ™evzorkování kmitoÄtu se nezdaÅ™ilo.\n"
-
 #: src/sid/xmms-sid.glade:8 src/sid/xs_interface.c:221
 msgid "Audacious-SID configuration"
 msgstr "Nastavení Audacious-SID"
@@ -4726,19 +4667,11 @@
 msgid "No"
 msgstr "Ne"
 
-#: src/sid/xs_about.c:84 src/wma/wma.c:130
+#: src/sid/xs_about.c:84 src/wma/wma.c:121
 #, c-format
 msgid "About %s"
 msgstr "O %s"
 
-#: src/sid/xs_config.c:580
-msgid "Allocation of sid2FilterPresets structure failed!\n"
-msgstr "Alokace struktury sid2FilterPresets selhala!\n"
-
-#: src/sid/xs_config.c:908
-msgid "Warning: Could not set filter curve widget points!\n"
-msgstr "Varování: Nelze nastavit widgetové body křivky filtru!\n"
-
 #: src/sid/xs_fileinfo.c:232
 msgid "General info"
 msgstr "Obecné informace"
@@ -4748,180 +4681,6 @@
 msgid "Tune #%i: "
 msgstr "Skladba Ä. %i:"
 
-#: src/sid/xs_length.c:113
-msgid "Error allocating new node. Fatal error.\n"
-msgstr "Chyba při alokaci nového uzlu. Fatální chyba.\n"
-
-#: src/sid/xs_length.c:128
-#, c-format
-msgid "'=' expected on column #%d.\n"
-msgstr "OÄekáváno „=“ na sloupci Ä. %d\n"
-
-#: src/sid/xs_length.c:153
-msgid "Could not allocate memory for node.\n"
-msgstr "Pro uzel nelze alokovat paměť.\n"
-
-#: src/sid/xs_length.c:204
-#, c-format
-msgid "Could not open SongLengthDB '%s'\n"
-msgstr "SongLengthDB „%s“ nelze otevřít.\n"
-
-#: src/sid/xs_length.c:224
-#, c-format
-msgid "Invalid MD5-hash in SongLengthDB file '%s' line #%d!\n"
-msgstr "Chybný MD5 hash v SongLengthDB souboru „%s“ na řádku %d!\n"
-
-#: src/sid/xs_length.c:231
-#, c-format
-msgid "Invalid entry in SongLengthDB file '%s' line #%d!\n"
-msgstr "Chybný záznam v SongLengthDB souboru „%s“ na řádku %d!\n"
-
-#: src/sid/xs_length.c:236
-#, c-format
-msgid "Invalid line in SongLengthDB file '%s' line #%d\n"
-msgstr "Chybný řádek v SongLengthDB souboru „%s“ na řádku %d\n"
-
-#: src/sid/xs_length.c:398
-#, c-format
-msgid "Not a PSID or RSID file '%s'\n"
-msgstr "„%s“ není PSID nebo RSID souborem\n"
-
-#: src/sid/xs_length.c:417
-#, c-format
-msgid "Error reading SID file header from '%s'\n"
-msgstr "Chyba pÅ™i Ätení hlaviÄky SID souboru „%s\n"
-
-#: src/sid/xs_length.c:436
-#, c-format
-msgid "Error allocating temp data buffer for file '%s'\n"
-msgstr "Chyba pÅ™i alokování doÄasného datového bufferu pro souboru „%s“\n"
-
-#: src/sid/xs_sidplay1.cc:96
-msgid "[SIDPlay1] Could not initialize emulation engine.\n"
-msgstr "[SIDPlay1] EmulaÄní jádro nelze inicializovat.\n"
-
-#: src/sid/xs_sidplay1.cc:103
-msgid "[SIDPlay1] Endianess verification failed.\n"
-msgstr "[SIDPlay1] Kontrola pořadí bajtů selhala.\n"
-
-#: src/sid/xs_sidplay1.cc:238
-msgid "[SIDPlay1] Emulator engine configuration failed!\n"
-msgstr "[SIDPlay1] Konfigurace emulaÄního jádra selhala!\n"
-
-#: src/sid/xs_sidplay1.cc:245
-msgid "[SIDPlay1] Could not initialize SIDTune object.\n"
-msgstr "[SIDPlay1] SIDTune objekt nelze inicializovat.\n"
-
-#: src/sid/xs_sidplay1.cc:291
-msgid ""
-"[SIDPlay1] SID-tune struct pointer was NULL. This should not happen, report "
-"to XMMS-SID author.\n"
-msgstr ""
-"[SIDPlay1] Ukazatel na strukturu skladby SID byl NULL. Toto by se stát "
-"nemělo. Podejte hlášení autorovi XMMS-SID modulu.\n"
-
-#: src/sid/xs_sidplay1.cc:296
-msgid ""
-"[SIDPlay1] SID-tune status check failed. This should not happen, report to "
-"XMMS-SID author.\n"
-msgstr ""
-"[SIDPlay1] Kontrola stavu SID skladby selhala. Toto by se stát nemělo. "
-"Podejte hlášení autorovi XMMS-SID modulu.\n"
-
-#: src/sid/xs_sidplay2.cc:101
-msgid "[SIDPlay2] Could not initialize emulation engine.\n"
-msgstr "[SIDPlay2] EmulaÄní jádro nelze inicializovat.\n"
-
-#: src/sid/xs_sidplay2.cc:208
-#, c-format
-msgid "[SIDPlay2] Invalid number of filter curve points (%d > %d)\n"
-msgstr "[SIDPlay2] Chybný poÄet bodů kÅ™ivky filtru (%d > %d)\n"
-
-#: src/sid/xs_sidplay2.cc:229
-msgid "reSID->create() failed.\n"
-msgstr "selhalo reSID->create().\n"
-
-#: src/sid/xs_sidplay2.cc:235
-#, c-format
-msgid "reSID->filter(%d) failed.\n"
-msgstr "selhalo reSID->filter(%d).\n"
-
-#: src/sid/xs_sidplay2.cc:243
-#, c-format
-msgid "reSID->sampling(%d) failed.\n"
-msgstr "selhalo reSID->sampling(%d).\n"
-
-#: src/sid/xs_sidplay2.cc:253
-msgid "reSID->filter(NULL) failed.\n"
-msgstr "selhalo reSID->filter(NULL).\n"
-
-#: src/sid/xs_sidplay2.cc:267
-msgid "hardSID->create() failed.\n"
-msgstr "selhalo hardSID->create().\n"
-
-#: src/sid/xs_sidplay2.cc:273
-#, c-format
-msgid "hardSID->filter(%d) failed.\n"
-msgstr "selhalo hardSID->filter(%d).\n"
-
-#: src/sid/xs_sidplay2.cc:281
-msgid "[SIDPlay2] Could not initialize SIDBuilder object.\n"
-msgstr "[SIDPlay2] Objekt SIDBuilder nelze inicializovat.\n"
-
-#: src/sid/xs_sidplay2.cc:295
-#, c-format
-msgid "[SIDPlay2] Invalid clockSpeed=%d, falling back to PAL.\n"
-msgstr "[SIDPlay2] Chybný clockSpeed=%d, vracím se k PALU.\n"
-
-#: src/sid/xs_sidplay2.cc:319
-#, c-format
-msgid "Invalid sid2OptLevel=%d, falling back to %d.\n"
-msgstr "Chybný sid2OptLevel=%d, vracím se k %d.\n"
-
-#: src/sid/xs_sidplay2.cc:343
-msgid "[SIDPlay2] Emulator engine configuration failed!\n"
-msgstr "[SIDPlay2] Konfigurace emulaÄního jádra selhala!\n"
-
-#: src/sid/xs_sidplay2.cc:350
-msgid "[SIDPlay2] Could not initialize SIDTune object.\n"
-msgstr "[SIDPlay2] SIDTune objekt nelze inicializovat.\n"
-
-#: src/sid/xs_sidplay2.cc:401
-msgid "[SIDPlay2] currTune->selectSong() failed\n"
-msgstr "[SIDPlay2] selhalo currTune->selectSong()\n"
-
-#: src/sid/xs_sidplay2.cc:406
-msgid "[SIDPlay2] currEng->load() failed\n"
-msgstr "[SIDPlay2] selhalo currEng->load()\n"
-
-#: src/sid/xs_slsup.c:217
-#, c-format
-msgid "Could not allocate memory for t_xs_tuneinfo ('%s')\n"
-msgstr "Paměť pro t_xs_tuneinfo („%s“) nelze alokovat\n"
-
-#: src/sid/xs_slsup.c:224
-#, c-format
-msgid "Could not allocate sidFilename ('%s')\n"
-msgstr "sidFilename („%s“) nelze alokovat\n"
-
-#: src/sid/xs_slsup.c:233
-#, c-format
-msgid "Could not allocate memory for t_xs_subtuneinfo ('%s', %i)\n"
-msgstr "Paměť pro t_xs_subtuneinfo („%s“, %i) nelze alokovat\n"
-
-#: src/sid/xs_stil.c:46
-msgid "SubTune pointer structure realloc failed.\n"
-msgstr "Přemístění ukazatele na strukturu SubTune selhalo.\n"
-
-#: src/sid/xs_stil.c:69
-msgid "SubTune structure malloc failed!\n"
-msgstr "malloc() na struktuře SubTune selhal!\n"
-
-#: src/sid/xs_stil.c:176
-#, c-format
-msgid "Could not open STILDB '%s'\n"
-msgstr "STILDB „%s“ nelze otevřít\n"
-
 #: src/sndfile/plugin.c:548
 #, fuzzy
 msgid "About sndfile plugin"
@@ -5074,11 +4833,11 @@
 msgid "The orientation of the tray"
 msgstr "Orientace traye"
 
-#: src/statusicon/si_ui.c:587
+#: src/statusicon/si_ui.c:622
 msgid "About Status Icon Plugin"
 msgstr "O modulu Stavová ikona"
 
-#: src/statusicon/si_ui.c:589
+#: src/statusicon/si_ui.c:624
 msgid ""
 "\n"
 "written by Giacomo Lozito < james@develia.org >\n"
@@ -5092,35 +4851,35 @@
 "Tento modul poskytuje stavovou ikonu, která\n"
 "je umístěna v systémové oblasti desktopu.\n"
 
-#: src/statusicon/si_ui.c:661
+#: src/statusicon/si_ui.c:696
 msgid "Status Icon Plugin - Preferences"
 msgstr "Modul stavové ikony – Nastavení"
 
-#: src/statusicon/si_ui.c:672
+#: src/statusicon/si_ui.c:707
 msgid "Right-Click Menu"
 msgstr "Nabídka pÅ™i stisku pravého tlaÄítka"
 
-#: src/statusicon/si_ui.c:677
+#: src/statusicon/si_ui.c:712
 msgid "Audacious standard menu"
 msgstr "Standardní nabídka Audacious"
 
-#: src/statusicon/si_ui.c:682
+#: src/statusicon/si_ui.c:717
 msgid "Small playback menu #1"
 msgstr "Drobná nabídka pro pÅ™ehrávání Ä. 1"
 
-#: src/statusicon/si_ui.c:687
+#: src/statusicon/si_ui.c:722
 msgid "Small playback menu #2"
 msgstr "Drobná nabídka pro pÅ™ehrávání Ä. 2"
 
-#: src/statusicon/si_ui.c:710
+#: src/statusicon/si_ui.c:745
 msgid "Mouse Scroll Action"
 msgstr "Reakce na rolování myší"
 
-#: src/statusicon/si_ui.c:715
+#: src/statusicon/si_ui.c:750
 msgid "Change volume"
 msgstr "Změnit hlasitost"
 
-#: src/statusicon/si_ui.c:720
+#: src/statusicon/si_ui.c:755
 msgid "Change playing song"
 msgstr "Změnit hranou skladbu"
 
@@ -5239,12 +4998,12 @@
 "Pro jeho aktivaci zadejte URL: tone://frekvence1;frekvence2;frekvence3;...\n"
 "např. tone://2000;2005 pro přehrání tónů o frekvenci 2000 a 2005 Hz."
 
-#: src/tonegen/tonegen.c:168
+#: src/tonegen/tonegen.c:167
 #, c-format
 msgid "%s %.1f Hz"
 msgstr "%s %.1f Hz"
 
-#: src/tonegen/tonegen.c:168
+#: src/tonegen/tonegen.c:167
 msgid "Tone Generator: "
 msgstr "Generátor tónů:"
 
@@ -5304,43 +5063,24 @@
 msgid "Track number:"
 msgstr "Číslo stopy:"
 
-#: src/vorbis/configure.c:115
+#: src/vorbis/configure.c:84
 msgid "Ogg Vorbis Audio Plugin Configuration"
 msgstr "Nastavení modulu Ogg Vorbis Audio"
 
-#: src/vorbis/configure.c:127
+#: src/vorbis/configure.c:94
 msgid "Ogg Vorbis Tags:"
 msgstr "Popisky Ogg Vorbis:"
 
-#: src/vorbis/configure.c:148
+#: src/vorbis/configure.c:115
 msgid "Title format:"
 msgstr "Formát názvu:"
 
-#: src/vorbis/configure.c:162 src/wavpack/ui.cxx:502
-msgid "ReplayGain Settings:"
-msgstr "Nastavení pro zesílení přehrávání:"
-
-#: src/vorbis/configure.c:180 src/wavpack/ui.cxx:520
-msgid "ReplayGain Type:"
-msgstr "Typ zesílení pro přehrávání:"
-
-#: src/vorbis/configure.c:191 src/wavpack/ui.cxx:531
-msgid "use Track Gain/Peak"
-msgstr "použít zesílení/vrchol skladby"
-
-#: src/vorbis/configure.c:201 src/wavpack/ui.cxx:539
-msgid "use Album Gain/Peak"
-msgstr "použít zesílení/vrchol alba"
-
-#: src/vorbis/configure.c:213
-msgid "Enable 6dB Boost + Hard Limiting"
-msgstr "Povolit 6dB zesílení + tvrdé omezení"
-
-#: src/vorbis/vorbis.c:751 src/vorbis/vorbis.c~:759
+#: src/vorbis/vorbis.c:681
 msgid "About Ogg Vorbis Audio Plugin"
 msgstr "O modulu Ogg Vorbis Audio"
 
-#: src/vorbis/vorbis.c:757 src/vorbis/vorbis.c~:765
+#: src/vorbis/vorbis.c:687
+#, fuzzy
 msgid ""
 "Ogg Vorbis Plugin by the Xiph.org Foundation\n"
 "\n"
@@ -5354,6 +5094,7 @@
 "Jorn Baayen <jorn@nl.linux.org>\n"
 "Haavard Kvaalen <havardk@xmms.org>\n"
 "Gian-Carlo Pascutto <gcp@sjeng.org>\n"
+"Eugene Zagidullin <e.asphyx@gmail.com>\n"
 "\n"
 "Visit the Xiph.org Foundation at http://www.xiph.org/\n"
 msgstr ""
@@ -5481,7 +5222,23 @@
 msgid "General Plugin Settings:"
 msgstr "Obecná nastavení modulu:"
 
-#: src/wma/wma.c:132
+#: src/wavpack/ui.cxx:502
+msgid "ReplayGain Settings:"
+msgstr "Nastavení pro zesílení přehrávání:"
+
+#: src/wavpack/ui.cxx:520
+msgid "ReplayGain Type:"
+msgstr "Typ zesílení pro přehrávání:"
+
+#: src/wavpack/ui.cxx:531
+msgid "use Track Gain/Peak"
+msgstr "použít zesílení/vrchol skladby"
+
+#: src/wavpack/ui.cxx:539
+msgid "use Album Gain/Peak"
+msgstr "použít zesílení/vrchol alba"
+
+#: src/wma/wma.c:123
 msgid ""
 "Adapted for use in Audacious by Tony Vroon (chainsaw@gentoo.org) from\n"
 "the BEEP-WMA plugin which is Copyright (C) 2004,2005 Mokrushin I.V. aka "
@@ -5497,6 +5254,173 @@
 "<bogorodskiy@inbox.ru>.\n"
 "Tento modul je postaven na otevřeném zdrojovém kódu "
 
+#~ msgid "Error initializing song-length database!\n"
+#~ msgstr "Chyba při inicializaci databáze délek skladeb!\n"
+
+#~ msgid "Error initializing STIL database!\n"
+#~ msgstr "Chyba při inicializaci databáze STIL!\n"
+
+#~ msgid "Couldn't allocate memory for audio data buffer!\n"
+#~ msgstr "Pro zvukový buffer nelze alokovat paměť!\n"
+
+#~ msgid "Couldn't allocate memory for audio oversampling buffer!\n"
+#~ msgstr "Pro buffer na převzorkování nelze alokovat paměť!\n"
+
+#~ msgid "Couldn't initialize SID-tune '%s' (sub-tune #%i)!\n"
+#~ msgstr "Nelze inicializovat SID skladbu „%s“ (podskladba Ä. %i)!\n"
+
+#~ msgid "Couldn't open XMMS audio output (fmt=%x, freq=%i, nchan=%i)!\n"
+#~ msgstr "Nelze otevřít zvukový výstup XMMS (form=%x, frekv=%i, kanálů=%i)!\n"
+
+#~ msgid "Oversampling rate-conversion pass failed.\n"
+#~ msgstr "PÅ™evzorkování kmitoÄtu se nezdaÅ™ilo.\n"
+
+#~ msgid "Allocation of sid2FilterPresets structure failed!\n"
+#~ msgstr "Alokace struktury sid2FilterPresets selhala!\n"
+
+#~ msgid "Warning: Could not set filter curve widget points!\n"
+#~ msgstr "Varování: Nelze nastavit widgetové body křivky filtru!\n"
+
+#~ msgid "Error allocating new node. Fatal error.\n"
+#~ msgstr "Chyba při alokaci nového uzlu. Fatální chyba.\n"
+
+#~ msgid "'=' expected on column #%d.\n"
+#~ msgstr "OÄekáváno „=“ na sloupci Ä. %d\n"
+
+#~ msgid "Could not allocate memory for node.\n"
+#~ msgstr "Pro uzel nelze alokovat paměť.\n"
+
+#~ msgid "Could not open SongLengthDB '%s'\n"
+#~ msgstr "SongLengthDB „%s“ nelze otevřít.\n"
+
+#~ msgid "Invalid MD5-hash in SongLengthDB file '%s' line #%d!\n"
+#~ msgstr "Chybný MD5 hash v SongLengthDB souboru „%s“ na řádku %d!\n"
+
+#~ msgid "Invalid entry in SongLengthDB file '%s' line #%d!\n"
+#~ msgstr "Chybný záznam v SongLengthDB souboru „%s“ na řádku %d!\n"
+
+#~ msgid "Invalid line in SongLengthDB file '%s' line #%d\n"
+#~ msgstr "Chybný řádek v SongLengthDB souboru „%s“ na řádku %d\n"
+
+#~ msgid "Not a PSID or RSID file '%s'\n"
+#~ msgstr "„%s“ není PSID nebo RSID souborem\n"
+
+#~ msgid "Error reading SID file header from '%s'\n"
+#~ msgstr "Chyba pÅ™i Ätení hlaviÄky SID souboru „%s\n"
+
+#~ msgid "Error allocating temp data buffer for file '%s'\n"
+#~ msgstr "Chyba pÅ™i alokování doÄasného datového bufferu pro souboru „%s“\n"
+
+#~ msgid "[SIDPlay1] Could not initialize emulation engine.\n"
+#~ msgstr "[SIDPlay1] EmulaÄní jádro nelze inicializovat.\n"
+
+#~ msgid "[SIDPlay1] Endianess verification failed.\n"
+#~ msgstr "[SIDPlay1] Kontrola pořadí bajtů selhala.\n"
+
+#~ msgid "[SIDPlay1] Emulator engine configuration failed!\n"
+#~ msgstr "[SIDPlay1] Konfigurace emulaÄního jádra selhala!\n"
+
+#~ msgid "[SIDPlay1] Could not initialize SIDTune object.\n"
+#~ msgstr "[SIDPlay1] SIDTune objekt nelze inicializovat.\n"
+
+#~ msgid ""
+#~ "[SIDPlay1] SID-tune struct pointer was NULL. This should not happen, "
+#~ "report to XMMS-SID author.\n"
+#~ msgstr ""
+#~ "[SIDPlay1] Ukazatel na strukturu skladby SID byl NULL. Toto by se stát "
+#~ "nemělo. Podejte hlášení autorovi XMMS-SID modulu.\n"
+
+#~ msgid ""
+#~ "[SIDPlay1] SID-tune status check failed. This should not happen, report "
+#~ "to XMMS-SID author.\n"
+#~ msgstr ""
+#~ "[SIDPlay1] Kontrola stavu SID skladby selhala. Toto by se stát nemělo. "
+#~ "Podejte hlášení autorovi XMMS-SID modulu.\n"
+
+#~ msgid "[SIDPlay2] Could not initialize emulation engine.\n"
+#~ msgstr "[SIDPlay2] EmulaÄní jádro nelze inicializovat.\n"
+
+#~ msgid "[SIDPlay2] Invalid number of filter curve points (%d > %d)\n"
+#~ msgstr "[SIDPlay2] Chybný poÄet bodů kÅ™ivky filtru (%d > %d)\n"
+
+#~ msgid "reSID->create() failed.\n"
+#~ msgstr "selhalo reSID->create().\n"
+
+#~ msgid "reSID->filter(%d) failed.\n"
+#~ msgstr "selhalo reSID->filter(%d).\n"
+
+#~ msgid "reSID->sampling(%d) failed.\n"
+#~ msgstr "selhalo reSID->sampling(%d).\n"
+
+#~ msgid "reSID->filter(NULL) failed.\n"
+#~ msgstr "selhalo reSID->filter(NULL).\n"
+
+#~ msgid "hardSID->create() failed.\n"
+#~ msgstr "selhalo hardSID->create().\n"
+
+#~ msgid "hardSID->filter(%d) failed.\n"
+#~ msgstr "selhalo hardSID->filter(%d).\n"
+
+#~ msgid "[SIDPlay2] Could not initialize SIDBuilder object.\n"
+#~ msgstr "[SIDPlay2] Objekt SIDBuilder nelze inicializovat.\n"
+
+#~ msgid "[SIDPlay2] Invalid clockSpeed=%d, falling back to PAL.\n"
+#~ msgstr "[SIDPlay2] Chybný clockSpeed=%d, vracím se k PALU.\n"
+
+#~ msgid "Invalid sid2OptLevel=%d, falling back to %d.\n"
+#~ msgstr "Chybný sid2OptLevel=%d, vracím se k %d.\n"
+
+#~ msgid "[SIDPlay2] Emulator engine configuration failed!\n"
+#~ msgstr "[SIDPlay2] Konfigurace emulaÄního jádra selhala!\n"
+
+#~ msgid "[SIDPlay2] Could not initialize SIDTune object.\n"
+#~ msgstr "[SIDPlay2] SIDTune objekt nelze inicializovat.\n"
+
+#~ msgid "[SIDPlay2] currTune->selectSong() failed\n"
+#~ msgstr "[SIDPlay2] selhalo currTune->selectSong()\n"
+
+#~ msgid "[SIDPlay2] currEng->load() failed\n"
+#~ msgstr "[SIDPlay2] selhalo currEng->load()\n"
+
+#~ msgid "Could not allocate memory for t_xs_tuneinfo ('%s')\n"
+#~ msgstr "Paměť pro t_xs_tuneinfo („%s“) nelze alokovat\n"
+
+#~ msgid "Could not allocate sidFilename ('%s')\n"
+#~ msgstr "sidFilename („%s“) nelze alokovat\n"
+
+#~ msgid "Could not allocate memory for t_xs_subtuneinfo ('%s', %i)\n"
+#~ msgstr "Paměť pro t_xs_subtuneinfo („%s“, %i) nelze alokovat\n"
+
+#~ msgid "SubTune pointer structure realloc failed.\n"
+#~ msgstr "Přemístění ukazatele na strukturu SubTune selhalo.\n"
+
+#~ msgid "SubTune structure malloc failed!\n"
+#~ msgstr "malloc() na struktuře SubTune selhal!\n"
+
+#~ msgid "Could not open STILDB '%s'\n"
+#~ msgstr "STILDB „%s“ nelze otevřít\n"
+
+#~ msgid "Dither output when rounding to 16-bit"
+#~ msgstr "Diterovat výstup při zaokrouhlování na 16 bitů"
+
+#, fuzzy
+#~ msgid "Base gain (dB):"
+#~ msgstr "Implicitní zesílení (dB):"
+
+#~ msgid "Enable ReplayGain processing"
+#~ msgstr "Zapnout zesílení pro přehrávání"
+
+#, fuzzy
+#~ msgid "Enable peak info clip prevention"
+#~ msgstr "Povolit prevenci před oříznutím"
+
+#, fuzzy
+#~ msgid "Enable adaptive scaler clip prevention"
+#~ msgstr "Povolit prevenci před oříznutím"
+
+#~ msgid "Enable 6dB Boost + Hard Limiting"
+#~ msgstr "Povolit 6dB zesílení + tvrdé omezení"
+
 #~ msgid "<b>Playback:</b>"
 #~ msgstr "<b>Přehrávání:</b>"
 
--- a/po/cy.po	Fri Jun 13 04:58:39 2008 +0300
+++ b/po/cy.po	Fri Jun 13 05:57:25 2008 +0300
@@ -5,7 +5,7 @@
 msgstr ""
 "Project-Id-Version: audacious-plugins 1.3\n"
 "Report-Msgid-Bugs-To: http://bugs.audacious-media-player.org\n"
-"POT-Creation-Date: 2008-02-03 20:33+0200\n"
+"POT-Creation-Date: 2008-03-30 17:25+0200\n"
 "PO-Revision-Date: 2007-02-12 03:37-0600\n"
 "Last-Translator: William Pitcock <nenolod@sacredspiral.co.uk>\n"
 "Language-Team: Welsh <i18n+cy@sacredspiral.co.uk>\n"
@@ -35,22 +35,22 @@
 #: src/adplug/adplug-xmms.cc:265 src/adplug/adplug-xmms.cc:526
 #: src/alac/plugin.c:77 src/arts/arts.c:26 src/arts/configure.c:90
 #: src/audiocompress/audacious-glue.c:102
-#: src/audiocompress/audacious-glue.c:552 src/cdaudio-ng/configure.c:227
-#: src/console/Audacious_Driver.cxx:449 src/demac/plugin.c:392
+#: src/audiocompress/audacious-glue.c:552 src/cdaudio-ng/configure.c:228
+#: src/console/Audacious_Driver.cxx:449 src/demac/plugin.c:393
 #: src/echo_plugin/gui.c:26 src/echo_plugin/gui.c:137 src/esd/about.c:49
 #: src/filewriter/filewriter.c:183 src/jack/configure.c:141
-#: src/jack/jack.c:493 src/madplug/plugin.c:600 src/madplug/plugin.c:624
+#: src/jack/jack.c:456 src/madplug/plugin.c:542 src/madplug/plugin.c:566
 #: src/metronom/metronom.c:88 src/modplug/gui/main.cxx:49
 #: src/musepack/libmpc.cxx:232 src/null/null.c:67 src/null/null.c:110
 #: src/OSS4/about.c:59 src/OSS/about.c:54 src/paranormal-ng/plugin.c:283
 #: src/paranormal/plugin.c:291 src/scrobbler/gtkstuff.c:25
-#: src/sndfile/plugin.c:565 src/statusicon/si_ui.c:593
+#: src/sndfile/plugin.c:565 src/statusicon/si_ui.c:628
 #: src/stereo_plugin/stereo.c:53 src/stereo_plugin/stereo.c:116
 #: src/sun/about.c:38 src/sun/configure.c:559 src/timidity/interface.c:222
 #: src/timidity/xmms-timidity.c:120 src/tonegen/tonegen.c:62
 #: src/tta/libtta.c:153 src/tta/libtta.c:267 src/tta/libtta.c:402
-#: src/vorbis/vorbis.c:769 src/vorbis/vorbis.c~:777 src/vtx/about.c:32
-#: src/vtx/info.c:43 src/wavpack/ui.cxx:56 src/wavpack/ui.cxx:556
+#: src/vorbis/vorbis.c:700 src/vtx/about.c:32 src/vtx/info.c:43
+#: src/wavpack/ui.cxx:56 src/wavpack/ui.cxx:556
 msgid "Ok"
 msgstr "Iawn"
 
@@ -87,7 +87,7 @@
 
 #: src/adplug/adplug-xmms.cc:275 src/alarm/interface.c:1398
 #: src/alsa/configure.c:389 src/arts/configure.c:91
-#: src/audiocompress/audacious-glue.c:557 src/cdaudio-ng/configure.c:231
+#: src/audiocompress/audacious-glue.c:557 src/cdaudio-ng/configure.c:232
 #: src/echo_plugin/gui.c:145 src/jack/configure.c:148
 #: src/modplug/gui/interface.cxx:714 src/modplug/gui/modplug.glade:1668
 #: src/musepack/libmpc.cxx:237 src/musepack/libmpc.cxx:557 src/null/null.c:111
@@ -98,7 +98,7 @@
 msgstr "Dileu"
 
 #: src/adplug/adplug-xmms.cc:291 src/console/Audacious_Config.cxx:145
-#: src/madplug/configure.c:421 src/modplug/gui/interface.cxx:628
+#: src/madplug/configure.c:290 src/modplug/gui/interface.cxx:628
 #: src/modplug/gui/interface.cxx:887 src/modplug/gui/modplug.glade:1404
 #: src/modplug/gui/modplug.glade:1804
 msgid "General"
@@ -130,13 +130,13 @@
 msgid "Channels"
 msgstr "Sianeli:"
 
-#: src/adplug/adplug-xmms.cc:325 src/filewriter/mp3.c:894
+#: src/adplug/adplug-xmms.cc:325 src/filewriter/mp3.c:900
 #: src/sid/xmms-sid.glade:157 src/sid/xs_interface.c:288
 #: src/timidity/interface.c:165
 msgid "Mono"
 msgstr "Mono"
 
-#: src/adplug/adplug-xmms.cc:330 src/filewriter/mp3.c:889
+#: src/adplug/adplug-xmms.cc:330 src/filewriter/mp3.c:895
 #: src/modplug/gui/interface.cxx:204 src/modplug/gui/modplug.glade:159
 #: src/sid/xmms-sid.glade:176 src/sid/xs_interface.c:295
 #: src/timidity/interface.c:173
@@ -312,7 +312,7 @@
 
 #: src/alarm/interface.c:71 src/lirc/about.c:115
 #: src/modplug/gui/interface.cxx:971 src/modplug/gui/modplug.glade:2030
-#: src/sid/xmms-sid.glade:3643 src/sid/xs_about.c:213
+#: src/sid/xmms-sid.glade:3643 src/sid/xs_about.c:214
 #: src/sid/xs_interface.c:1740
 msgid "Close"
 msgstr "Cau"
@@ -326,10 +326,10 @@
 msgstr ""
 
 #: src/alarm/interface.c:124 src/alarm/interface.c:1389 src/alsa/about.c:46
-#: src/alsa/configure.c:383 src/cdaudio-ng/cdaudio-ng.c:228
-#: src/flacng/plugin.c:747 src/gnomeshortcuts/gnomeshortcuts.c:292
+#: src/alsa/configure.c:383 src/cdaudio-ng/cdaudio-ng.c:247
+#: src/flacng/plugin.c:706 src/gnomeshortcuts/gnomeshortcuts.c:311
 #: src/hotkey/gui.c:671 src/modplug/gui/interface.cxx:702
-#: src/modplug/gui/modplug.glade:1642 src/pulse_audio/pulse_audio.c:712
+#: src/modplug/gui/modplug.glade:1642 src/pulse_audio/pulse_audio.c:738
 #: src/scrobbler/gtkstuff.c:45 src/sid/xmms-sid.glade:3066
 #: src/sid/xs_interface.c:1243
 msgid "OK"
@@ -1577,7 +1577,7 @@
 msgid "Trigger"
 msgstr "Trailer"
 
-#: src/aosd/aosd_ui.c:1076 src/cdaudio-ng/configure.c:166
+#: src/aosd/aosd_ui.c:1076 src/cdaudio-ng/configure.c:167
 #: src/modplug/gui/interface.cxx:688 src/modplug/gui/modplug.glade:1603
 #: src/sid/xmms-sid.glade:3026 src/sid/xs_interface.c:1229
 #, fuzzy
@@ -1777,16 +1777,20 @@
 msgid "Options:"
 msgstr "Dewisiadau:"
 
-#: src/cdaudio-ng/cdaudio-ng.c:198
+#: src/cdaudio-ng/cdaudio-ng.c:204
+msgid "Rescan CD"
+msgstr ""
+
+#: src/cdaudio-ng/cdaudio-ng.c:217
 msgid "Add CD"
 msgstr ""
 
-#: src/cdaudio-ng/cdaudio-ng.c:223
+#: src/cdaudio-ng/cdaudio-ng.c:242
 #, fuzzy
 msgid "About CD Audio Plugin NG"
 msgstr "Ynghylch Ategyn Sain MPEG"
 
-#: src/cdaudio-ng/cdaudio-ng.c:224
+#: src/cdaudio-ng/cdaudio-ng.c:243
 msgid ""
 "Copyright (c) 2007, by Calin Crisan <ccrisan@gmail.com> and The Audacious "
 "Team.\n"
@@ -1799,60 +1803,60 @@
 "This was a Google Summer of Code 2007 project."
 msgstr ""
 
-#: src/cdaudio-ng/cdaudio-ng.c:627
+#: src/cdaudio-ng/cdaudio-ng.c:814
 msgid ""
 "<b><big>No playable CD found.</big></b>\n"
 "\n"
 "No CD inserted, or inserted CD is not an audio CD.\n"
 msgstr ""
 
-#: src/cdaudio-ng/configure.c:146
+#: src/cdaudio-ng/configure.c:147
 #, fuzzy
 msgid "CD Audio Plugin Configuration"
 msgstr "Ffurfweddiad Chwaraeydd MPEG Sain"
 
-#: src/cdaudio-ng/configure.c:156
+#: src/cdaudio-ng/configure.c:157
 msgid "Digital audio extraction"
 msgstr "Tynnu awdio digidôl"
 
-#: src/cdaudio-ng/configure.c:161
+#: src/cdaudio-ng/configure.c:162
 #, fuzzy
 msgid "Title information"
 msgstr "Fformat y teitl:"
 
-#: src/cdaudio-ng/configure.c:178
+#: src/cdaudio-ng/configure.c:179
 msgid "Limit read speed to: "
 msgstr ""
 
-#: src/cdaudio-ng/configure.c:185
+#: src/cdaudio-ng/configure.c:186
 #, fuzzy
 msgid "Use cd-text if available"
 msgstr "Stereo (os ar gael)"
 
-#: src/cdaudio-ng/configure.c:189
+#: src/cdaudio-ng/configure.c:190
 #, fuzzy
 msgid "Use CDDB if available"
 msgstr "Stereo (os ar gael)"
 
-#: src/cdaudio-ng/configure.c:193
+#: src/cdaudio-ng/configure.c:194
 #, fuzzy
 msgid "Server: "
 msgstr "Gwasanaethwr"
 
-#: src/cdaudio-ng/configure.c:196
+#: src/cdaudio-ng/configure.c:197
 #, fuzzy
 msgid "Port: "
 msgstr "Porth:"
 
-#: src/cdaudio-ng/configure.c:202
+#: src/cdaudio-ng/configure.c:203
 msgid "Use HTTP instead of CDDBP"
 msgstr ""
 
-#: src/cdaudio-ng/configure.c:210
+#: src/cdaudio-ng/configure.c:211
 msgid "Override default device: "
 msgstr ""
 
-#: src/cdaudio-ng/configure.c:217
+#: src/cdaudio-ng/configure.c:218
 msgid "Print debug information"
 msgstr ""
 
@@ -1929,12 +1933,12 @@
 "Audacious fersiwn at: William Pitcock <nenolod@nenolod.net>, \n"
 "        Shay Green <gblargg@gmail.com>"
 
-#: src/demac/plugin.c:387
+#: src/demac/plugin.c:388
 #, fuzzy
 msgid "About Monkey's Audio Plugin"
 msgstr "Ynghylch Ategyn Sain MPEG"
 
-#: src/demac/plugin.c:388
+#: src/demac/plugin.c:389
 msgid ""
 "Copyright (C) 2007 Eugene Zagidullin <e.asphyx@gmail.com>\n"
 "Based on ffape decoder, Copyright (C) 2007 Benjamin Zores\n"
@@ -2227,7 +2231,7 @@
 "Ensure that the device has been correctly plugged in."
 msgstr ""
 
-#: src/evdev-plug/ed_ui.c:319 src/madplug/plugin.c:624
+#: src/evdev-plug/ed_ui.c:319 src/madplug/plugin.c:566
 msgid "Error"
 msgstr "Gwall"
 
@@ -2454,16 +2458,16 @@
 msgid "Prepend track number to filename"
 msgstr ""
 
-#: src/filewriter/mp3.c:670
+#: src/filewriter/mp3.c:676
 #, fuzzy
 msgid "MP3 Configuration"
 msgstr "Ffurfweddiad TiMidity"
 
-#: src/filewriter/mp3.c:697
+#: src/filewriter/mp3.c:703
 msgid "Algorithm Quality:"
 msgstr ""
 
-#: src/filewriter/mp3.c:719
+#: src/filewriter/mp3.c:725
 msgid ""
 "best/slowest:0;\n"
 "worst/fastest:9;\n"
@@ -2471,169 +2475,169 @@
 "default:5;"
 msgstr ""
 
-#: src/filewriter/mp3.c:727
+#: src/filewriter/mp3.c:733
 #, fuzzy
 msgid "Output Samplerate:"
 msgstr "Graddfa samplo:"
 
-#: src/filewriter/mp3.c:738 src/filewriter/mp3.c:879
+#: src/filewriter/mp3.c:744 src/filewriter/mp3.c:885
 #, fuzzy
 msgid "Auto"
 msgstr "Ynghylch"
 
-#: src/filewriter/mp3.c:760
+#: src/filewriter/mp3.c:766
 #, fuzzy
 msgid "(Hz)"
 msgstr "Hz"
 
-#: src/filewriter/mp3.c:772
+#: src/filewriter/mp3.c:778
 msgid "Bitrate / Compression ratio:"
 msgstr ""
 
-#: src/filewriter/mp3.c:798
+#: src/filewriter/mp3.c:804
 #, fuzzy
 msgid "Bitrate (kbps):"
 msgstr "Didradd:"
 
-#: src/filewriter/mp3.c:839
+#: src/filewriter/mp3.c:845
 msgid "Compression ratio:"
 msgstr ""
 
-#: src/filewriter/mp3.c:869
+#: src/filewriter/mp3.c:875
 #, fuzzy
 msgid "Audio Mode:"
 msgstr "Dyfais sain:"
 
-#: src/filewriter/mp3.c:884
+#: src/filewriter/mp3.c:890
 #, fuzzy
 msgid "Joint-Stereo"
 msgstr "Stereo ar y cyd"
 
-#: src/filewriter/mp3.c:925
+#: src/filewriter/mp3.c:931
 msgid "auto-M/S mode"
 msgstr ""
 
-#: src/filewriter/mp3.c:937
+#: src/filewriter/mp3.c:943
 #, fuzzy
 msgid "Misc:"
 msgstr "Disgo"
 
-#: src/filewriter/mp3.c:948
+#: src/filewriter/mp3.c:954
 msgid "Enforce strict ISO complience"
 msgstr ""
 
-#: src/filewriter/mp3.c:959
+#: src/filewriter/mp3.c:965
 #, fuzzy
 msgid "Error protection"
 msgstr "Amddiffyn Gwall:"
 
-#: src/filewriter/mp3.c:971
+#: src/filewriter/mp3.c:977
 msgid "Adds 16 bit checksum to every frame"
 msgstr ""
 
-#: src/filewriter/mp3.c:976 src/filewriter/vorbis.c:274
+#: src/filewriter/mp3.c:982 src/filewriter/vorbis.c:274
 #: src/modplug/gui/interface.cxx:319 src/modplug/gui/modplug.glade:507
 msgid "Quality"
 msgstr ""
 
-#: src/filewriter/mp3.c:988
+#: src/filewriter/mp3.c:994
 msgid "Enable VBR/ABR"
 msgstr ""
 
-#: src/filewriter/mp3.c:1000
+#: src/filewriter/mp3.c:1006
 msgid "Type:"
 msgstr ""
 
-#: src/filewriter/mp3.c:1011
+#: src/filewriter/mp3.c:1017
 msgid "Variable bitrate"
 msgstr ""
 
-#: src/filewriter/mp3.c:1023
+#: src/filewriter/mp3.c:1029
 msgid "Average bitrate"
 msgstr ""
 
-#: src/filewriter/mp3.c:1037
+#: src/filewriter/mp3.c:1043
 #, fuzzy
 msgid "VBR Options:"
 msgstr "Dewisiadau:"
 
-#: src/filewriter/mp3.c:1053
+#: src/filewriter/mp3.c:1059
 #, fuzzy
 msgid "Minimum bitrate (kbps):"
 msgstr "Didradd:"
 
-#: src/filewriter/mp3.c:1089
+#: src/filewriter/mp3.c:1095
 msgid "Maximum bitrate (kbps):"
 msgstr ""
 
-#: src/filewriter/mp3.c:1121
+#: src/filewriter/mp3.c:1127
 msgid "Strictly enforce minimum bitrate"
 msgstr ""
 
-#: src/filewriter/mp3.c:1123
+#: src/filewriter/mp3.c:1129
 msgid ""
 "For use with players that do not support low bitrate mp3 (Apex AD600-A DVD/"
 "mp3 player)"
 msgstr ""
 
-#: src/filewriter/mp3.c:1136
+#: src/filewriter/mp3.c:1142
 #, fuzzy
 msgid "ABR Options:"
 msgstr "Dewisiadau:"
 
-#: src/filewriter/mp3.c:1146
+#: src/filewriter/mp3.c:1152
 msgid "Average bitrate (kbps):"
 msgstr ""
 
-#: src/filewriter/mp3.c:1183
+#: src/filewriter/mp3.c:1189
 msgid "VBR quality level:"
 msgstr ""
 
-#: src/filewriter/mp3.c:1198
+#: src/filewriter/mp3.c:1204
 msgid ""
 "highest:0;\n"
 "lowest:9;\n"
 "default:4;"
 msgstr ""
 
-#: src/filewriter/mp3.c:1206
+#: src/filewriter/mp3.c:1212
 msgid "Don't write Xing VBR header"
 msgstr ""
 
-#: src/filewriter/mp3.c:1221
+#: src/filewriter/mp3.c:1227
 msgid "VBR/ABR"
 msgstr ""
 
-#: src/filewriter/mp3.c:1233
+#: src/filewriter/mp3.c:1239
 msgid "Frame params:"
 msgstr ""
 
-#: src/filewriter/mp3.c:1245
+#: src/filewriter/mp3.c:1251
 msgid "Mark as copyright"
 msgstr ""
 
-#: src/filewriter/mp3.c:1256
+#: src/filewriter/mp3.c:1262
 msgid "Mark as original"
 msgstr ""
 
-#: src/filewriter/mp3.c:1268
+#: src/filewriter/mp3.c:1274
 #, fuzzy
 msgid "ID3 params:"
 msgstr "Tagiau ID3:"
 
-#: src/filewriter/mp3.c:1279
+#: src/filewriter/mp3.c:1285
 msgid "Force addition of version 2 tag"
 msgstr ""
 
-#: src/filewriter/mp3.c:1289
+#: src/filewriter/mp3.c:1295
 msgid "Only add v1 tag"
 msgstr ""
 
-#: src/filewriter/mp3.c:1296
+#: src/filewriter/mp3.c:1302
 msgid "Only add v2 tag"
 msgstr ""
 
-#: src/filewriter/mp3.c:1317
+#: src/filewriter/mp3.c:1323
 #, fuzzy
 msgid "Tags"
 msgstr "Tango"
@@ -2647,12 +2651,12 @@
 msgid "Quality level (0 - 10):"
 msgstr ""
 
-#: src/flacng/plugin.c:739
+#: src/flacng/plugin.c:698
 #, fuzzy
 msgid "FLAC Audio Plugin "
 msgstr "Ategynnau Sain FLAC"
 
-#: src/flacng/plugin.c:740
+#: src/flacng/plugin.c:699
 msgid ""
 "\n"
 "\n"
@@ -2662,22 +2666,22 @@
 "http://www.skytale.net/projects/bmp-flac2/"
 msgstr ""
 
-#: src/flacng/plugin.c:745
+#: src/flacng/plugin.c:704
 #, fuzzy
 msgid "About FLAC Audio Plugin"
 msgstr "Ategynnau Sain FLAC"
 
-#: src/gnomeshortcuts/gnomeshortcuts.c:287
+#: src/gnomeshortcuts/gnomeshortcuts.c:306
 #, fuzzy
 msgid "About Gnome Shortcut Plugin"
 msgstr "Ynghylch Ategyn ESounD"
 
-#: src/gnomeshortcuts/gnomeshortcuts.c:288
+#: src/gnomeshortcuts/gnomeshortcuts.c:307
 msgid ""
 "Gnome Shortcut Plugin\n"
 "Let's you control the player with Gnome's shortcuts.\n"
 "\n"
-"Copyright (C) 2007 Sascha Hlusiak <contact@saschahlusiak.de>\n"
+"Copyright (C) 2007-2008 Sascha Hlusiak <contact@saschahlusiak.de>\n"
 "\n"
 msgstr ""
 
@@ -2829,12 +2833,12 @@
 msgid "Enable debug printing"
 msgstr "Galluogi ReplayGain"
 
-#: src/jack/jack.c:95
+#: src/jack/jack.c:84
 #, fuzzy
 msgid "Sample rate mismatch"
 msgstr "Graddfa samplo:"
 
-#: src/jack/jack.c:98
+#: src/jack/jack.c:87
 msgid ""
 "Xmms is asking for a sample rate that differs from\n"
 " that of the jack server.  Xmms 1.2.8 or later\n"
@@ -2848,15 +2852,15 @@
 "Chris Morgan <cmorgan@alum.wpi.edu>\n"
 msgstr ""
 
-#: src/jack/jack.c:111 src/wma/wma.c:157
+#: src/jack/jack.c:100 src/wma/wma.c:148
 msgid " Close "
 msgstr "Cau"
 
-#: src/jack/jack.c:489
+#: src/jack/jack.c:452
 msgid "About JACK Output Plugin 0.17"
 msgstr "Ynghylch Ategyn Allbwn JACK 0.17"
 
-#: src/jack/jack.c:490
+#: src/jack/jack.c:453
 msgid ""
 "XMMS jack Driver 0.17\n"
 "\n"
@@ -2996,116 +3000,59 @@
 msgid "%s: will try reconnect every %d seconds...\n"
 msgstr ""
 
-#: src/madplug/configure.c:332
+#: src/madplug/configure.c:209
 msgid "MPEG Audio Plugin Configuration"
 msgstr "Ffurfweddiad Chwaraeydd MPEG Sain"
 
-#: src/madplug/configure.c:349
+#: src/madplug/configure.c:226
 #, fuzzy
 msgid "Audio Settings"
 msgstr "Gosodiadau Cymysgu"
 
-#: src/madplug/configure.c:358
-msgid "Dither output when rounding to 16-bit"
-msgstr ""
-
-#: src/madplug/configure.c:365
+#: src/madplug/configure.c:234
 msgid "Force reopen audio when audio type changed"
 msgstr ""
 
-#: src/madplug/configure.c:374
+#: src/madplug/configure.c:243
 #, fuzzy
 msgid "Metadata Settings"
 msgstr "Gosodiadau Cymysgu"
 
-#: src/madplug/configure.c:383
+#: src/madplug/configure.c:252
 msgid "Enable fast play-length calculation"
 msgstr ""
 
-#: src/madplug/configure.c:390
+#: src/madplug/configure.c:259
 msgid "Parse XING headers"
 msgstr ""
 
-#: src/madplug/configure.c:397
+#: src/madplug/configure.c:266
 msgid "Use SJIS to write ID3 tags (not recommended)"
 msgstr ""
 
-#: src/madplug/configure.c:404
+#: src/madplug/configure.c:273
 #, fuzzy
 msgid "Miscellaneous Settings"
 msgstr "Gosodiadau Cymysgu"
 
-#: src/madplug/configure.c:413
+#: src/madplug/configure.c:282
 msgid "Display average bitrate for VBR"
 msgstr ""
 
-#: src/madplug/configure.c:432
-#, fuzzy
-msgid "Base gain (dB):"
-msgstr "Rhagosodedig (%s)"
-
-#: src/madplug/configure.c:446 src/musepack/libmpc.cxx:190
-#, fuzzy
-msgid "ReplayGain Settings"
-msgstr "Gosodiadau'r ReplayGain:"
-
-#: src/madplug/configure.c:457
-#, fuzzy
-msgid "Enable ReplayGain processing"
-msgstr "Galluogi ReplayGain"
-
-#: src/madplug/configure.c:467 src/musepack/libmpc.cxx:207
-#, fuzzy
-msgid "ReplayGain Type"
-msgstr "Math ReplayGain:"
-
-#: src/madplug/configure.c:477 src/musepack/libmpc.cxx:215
-#, fuzzy
-msgid "Use Track Gain"
-msgstr "defnyddiwch Cynnydd/Brig Trac"
-
-#: src/madplug/configure.c:485 src/musepack/libmpc.cxx:219
-#, fuzzy
-msgid "Use Album Gain"
-msgstr "defnyddio Cynnydd/Brig Albwm"
-
-#: src/madplug/configure.c:498
-msgid "Pre-gain with RG info (dB):"
-msgstr ""
-
-#: src/madplug/configure.c:514
-msgid "Pre-gain without RG info (dB):"
-msgstr ""
-
-#: src/madplug/configure.c:530
-#, fuzzy
-msgid "Enable peak info clip prevention"
-msgstr "Galluogi Atal Clipio"
-
-#: src/madplug/configure.c:552
-#, fuzzy
-msgid "Enable adaptive scaler clip prevention"
-msgstr "Galluogi Atal Clipio"
-
-#: src/madplug/configure.c:561
-#, fuzzy
-msgid "Gain Control"
-msgstr "Rheolwr sain"
-
-#: src/madplug/configure.c:569 src/vorbis/configure.c:135
+#: src/madplug/configure.c:296 src/vorbis/configure.c:102
 msgid "Override generic titles"
 msgstr "Diystyru'r teitlau cyffredinol"
 
-#: src/madplug/configure.c:581
+#: src/madplug/configure.c:308
 msgid "ID3 format:"
 msgstr "Fformat ID3:"
 
-#: src/madplug/configure.c:593 src/sid/xmms-sid.glade:2540
-#: src/sid/xs_interface.c:1070 src/vorbis/configure.c:158
+#: src/madplug/configure.c:320 src/sid/xmms-sid.glade:2540
+#: src/sid/xs_interface.c:1070
 msgid "Title"
 msgstr "Teitl"
 
-#: src/madplug/plugin.c:582
+#: src/madplug/plugin.c:524
 #, c-format
 msgid ""
 "Audacious MPEG Audio Plugin\n"
@@ -3123,7 +3070,7 @@
 "    Samuel Krempp"
 msgstr ""
 
-#: src/madplug/plugin.c:598
+#: src/madplug/plugin.c:540
 msgid "About MPEG Audio Plugin"
 msgstr "Ynghylch Ategyn Sain MPEG"
 
@@ -3432,18 +3379,35 @@
 msgid "Plugin"
 msgstr "Ategyn LIRC"
 
-#: src/musepack/libmpc.cxx:197 src/vorbis/configure.c:170
-#: src/wavpack/ui.cxx:510
+#: src/musepack/libmpc.cxx:190
+#, fuzzy
+msgid "ReplayGain Settings"
+msgstr "Gosodiadau'r ReplayGain:"
+
+#: src/musepack/libmpc.cxx:197 src/wavpack/ui.cxx:510
 msgid "Enable Clipping Prevention"
 msgstr "Galluogi Atal Clipio"
 
-#: src/musepack/libmpc.cxx:202 src/vorbis/configure.c:175
-#: src/wavpack/ui.cxx:515
+#: src/musepack/libmpc.cxx:202 src/wavpack/ui.cxx:515
 msgid "Enable ReplayGain"
 msgstr "Galluogi ReplayGain"
 
-#: src/musepack/libmpc.cxx:224 src/vorbis/configure.c:219
-#: src/wavpack/ui.cxx:547
+#: src/musepack/libmpc.cxx:207
+#, fuzzy
+msgid "ReplayGain Type"
+msgstr "Math ReplayGain:"
+
+#: src/musepack/libmpc.cxx:215
+#, fuzzy
+msgid "Use Track Gain"
+msgstr "defnyddiwch Cynnydd/Brig Trac"
+
+#: src/musepack/libmpc.cxx:219
+#, fuzzy
+msgid "Use Album Gain"
+msgstr "defnyddio Cynnydd/Brig Albwm"
+
+#: src/musepack/libmpc.cxx:224 src/wavpack/ui.cxx:547
 msgid "ReplayGain"
 msgstr "ReplayGain"
 
@@ -3712,12 +3676,16 @@
 msgid "Volume controls Master not PCM"
 msgstr "Nid yw'r Prif reolwr sain yn PCM"
 
-#: src/pulse_audio/pulse_audio.c:696
+#: src/projectm-1.0/main.c:70
+msgid "_Random"
+msgstr ""
+
+#: src/pulse_audio/pulse_audio.c:722
 #, fuzzy
 msgid "About Audacious PulseAudio Output Plugin"
 msgstr "Ategyn Allbwn CoreAudio"
 
-#: src/pulse_audio/pulse_audio.c:697
+#: src/pulse_audio/pulse_audio.c:723
 #, fuzzy
 msgid ""
 "Audacious PulseAudio Output Plugin\n"
@@ -3801,36 +3769,6 @@
 msgid "Scrobbler Error"
 msgstr "Ategyn Scrobbler"
 
-#: src/sid/xmms-sid.c:203
-msgid "Error initializing song-length database!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:209
-msgid "Error initializing STIL database!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:347
-msgid "Couldn't allocate memory for audio data buffer!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:355
-msgid "Couldn't allocate memory for audio oversampling buffer!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:371
-#, c-format
-msgid "Couldn't initialize SID-tune '%s' (sub-tune #%i)!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:382
-#, c-format
-msgid "Couldn't open XMMS audio output (fmt=%x, freq=%i, nchan=%i)!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:432
-msgid "Oversampling rate-conversion pass failed.\n"
-msgstr ""
-
 #: src/sid/xmms-sid.glade:8 src/sid/xs_interface.c:221
 #, fuzzy
 msgid "Audacious-SID configuration"
@@ -4391,19 +4329,11 @@
 msgid "No"
 msgstr "Na"
 
-#: src/sid/xs_about.c:84 src/wma/wma.c:130
+#: src/sid/xs_about.c:84 src/wma/wma.c:121
 #, c-format
 msgid "About %s"
 msgstr "Ynghylch %s"
 
-#: src/sid/xs_config.c:580
-msgid "Allocation of sid2FilterPresets structure failed!\n"
-msgstr ""
-
-#: src/sid/xs_config.c:908
-msgid "Warning: Could not set filter curve widget points!\n"
-msgstr ""
-
 #: src/sid/xs_fileinfo.c:232
 #, fuzzy
 msgid "General info"
@@ -4414,176 +4344,6 @@
 msgid "Tune #%i: "
 msgstr ""
 
-#: src/sid/xs_length.c:113
-msgid "Error allocating new node. Fatal error.\n"
-msgstr ""
-
-#: src/sid/xs_length.c:128
-#, c-format
-msgid "'=' expected on column #%d.\n"
-msgstr ""
-
-#: src/sid/xs_length.c:153
-msgid "Could not allocate memory for node.\n"
-msgstr ""
-
-#: src/sid/xs_length.c:204
-#, c-format
-msgid "Could not open SongLengthDB '%s'\n"
-msgstr ""
-
-#: src/sid/xs_length.c:224
-#, c-format
-msgid "Invalid MD5-hash in SongLengthDB file '%s' line #%d!\n"
-msgstr ""
-
-#: src/sid/xs_length.c:231
-#, c-format
-msgid "Invalid entry in SongLengthDB file '%s' line #%d!\n"
-msgstr ""
-
-#: src/sid/xs_length.c:236
-#, c-format
-msgid "Invalid line in SongLengthDB file '%s' line #%d\n"
-msgstr ""
-
-#: src/sid/xs_length.c:398
-#, c-format
-msgid "Not a PSID or RSID file '%s'\n"
-msgstr ""
-
-#: src/sid/xs_length.c:417
-#, c-format
-msgid "Error reading SID file header from '%s'\n"
-msgstr ""
-
-#: src/sid/xs_length.c:436
-#, c-format
-msgid "Error allocating temp data buffer for file '%s'\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:96
-msgid "[SIDPlay1] Could not initialize emulation engine.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:103
-msgid "[SIDPlay1] Endianess verification failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:238
-msgid "[SIDPlay1] Emulator engine configuration failed!\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:245
-msgid "[SIDPlay1] Could not initialize SIDTune object.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:291
-msgid ""
-"[SIDPlay1] SID-tune struct pointer was NULL. This should not happen, report "
-"to XMMS-SID author.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:296
-msgid ""
-"[SIDPlay1] SID-tune status check failed. This should not happen, report to "
-"XMMS-SID author.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:101
-msgid "[SIDPlay2] Could not initialize emulation engine.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:208
-#, c-format
-msgid "[SIDPlay2] Invalid number of filter curve points (%d > %d)\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:229
-msgid "reSID->create() failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:235
-#, c-format
-msgid "reSID->filter(%d) failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:243
-#, c-format
-msgid "reSID->sampling(%d) failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:253
-msgid "reSID->filter(NULL) failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:267
-msgid "hardSID->create() failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:273
-#, c-format
-msgid "hardSID->filter(%d) failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:281
-msgid "[SIDPlay2] Could not initialize SIDBuilder object.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:295
-#, c-format
-msgid "[SIDPlay2] Invalid clockSpeed=%d, falling back to PAL.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:319
-#, c-format
-msgid "Invalid sid2OptLevel=%d, falling back to %d.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:343
-msgid "[SIDPlay2] Emulator engine configuration failed!\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:350
-msgid "[SIDPlay2] Could not initialize SIDTune object.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:401
-msgid "[SIDPlay2] currTune->selectSong() failed\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:406
-msgid "[SIDPlay2] currEng->load() failed\n"
-msgstr ""
-
-#: src/sid/xs_slsup.c:217
-#, c-format
-msgid "Could not allocate memory for t_xs_tuneinfo ('%s')\n"
-msgstr ""
-
-#: src/sid/xs_slsup.c:224
-#, c-format
-msgid "Could not allocate sidFilename ('%s')\n"
-msgstr ""
-
-#: src/sid/xs_slsup.c:233
-#, c-format
-msgid "Could not allocate memory for t_xs_subtuneinfo ('%s', %i)\n"
-msgstr ""
-
-#: src/sid/xs_stil.c:46
-msgid "SubTune pointer structure realloc failed.\n"
-msgstr ""
-
-#: src/sid/xs_stil.c:69
-msgid "SubTune structure malloc failed!\n"
-msgstr ""
-
-#: src/sid/xs_stil.c:176
-#, c-format
-msgid "Could not open STILDB '%s'\n"
-msgstr ""
-
 #: src/sndfile/plugin.c:548
 #, fuzzy
 msgid "About sndfile plugin"
@@ -4731,12 +4491,12 @@
 msgid "The orientation of the tray"
 msgstr ""
 
-#: src/statusicon/si_ui.c:587
+#: src/statusicon/si_ui.c:622
 #, fuzzy
 msgid "About Status Icon Plugin"
 msgstr "Ynghylch Ategyn ESounD"
 
-#: src/statusicon/si_ui.c:589
+#: src/statusicon/si_ui.c:624
 msgid ""
 "\n"
 "written by Giacomo Lozito < james@develia.org >\n"
@@ -4745,36 +4505,36 @@
 "the system tray area of the window manager.\n"
 msgstr ""
 
-#: src/statusicon/si_ui.c:661
+#: src/statusicon/si_ui.c:696
 #, fuzzy
 msgid "Status Icon Plugin - Preferences"
 msgstr "Ynghylch Ategyn ESounD"
 
-#: src/statusicon/si_ui.c:672
+#: src/statusicon/si_ui.c:707
 msgid "Right-Click Menu"
 msgstr ""
 
-#: src/statusicon/si_ui.c:677
+#: src/statusicon/si_ui.c:712
 msgid "Audacious standard menu"
 msgstr ""
 
-#: src/statusicon/si_ui.c:682
+#: src/statusicon/si_ui.c:717
 msgid "Small playback menu #1"
 msgstr ""
 
-#: src/statusicon/si_ui.c:687
+#: src/statusicon/si_ui.c:722
 msgid "Small playback menu #2"
 msgstr ""
 
-#: src/statusicon/si_ui.c:710
+#: src/statusicon/si_ui.c:745
 msgid "Mouse Scroll Action"
 msgstr ""
 
-#: src/statusicon/si_ui.c:715
+#: src/statusicon/si_ui.c:750
 msgid "Change volume"
 msgstr ""
 
-#: src/statusicon/si_ui.c:720
+#: src/statusicon/si_ui.c:755
 msgid "Change playing song"
 msgstr ""
 
@@ -4894,12 +4654,12 @@
 "frequency3;...\n"
 "e.e. tôn://2000;2005 i chwarae tôn 2000Hz a thôn 2005Hz"
 
-#: src/tonegen/tonegen.c:168
+#: src/tonegen/tonegen.c:167
 #, c-format
 msgid "%s %.1f Hz"
 msgstr ""
 
-#: src/tonegen/tonegen.c:168
+#: src/tonegen/tonegen.c:167
 msgid "Tone Generator: "
 msgstr "Cynhyrchydd Tôn:"
 
@@ -4962,43 +4722,24 @@
 msgid "Track number:"
 msgstr "Rhif y Trac:"
 
-#: src/vorbis/configure.c:115
+#: src/vorbis/configure.c:84
 msgid "Ogg Vorbis Audio Plugin Configuration"
 msgstr "Ffurfweddiad Ogg Vorbis"
 
-#: src/vorbis/configure.c:127
+#: src/vorbis/configure.c:94
 msgid "Ogg Vorbis Tags:"
 msgstr "Tagiau Ogg Vorbis:"
 
-#: src/vorbis/configure.c:148
+#: src/vorbis/configure.c:115
 msgid "Title format:"
 msgstr "Fformat y teitl:"
 
-#: src/vorbis/configure.c:162 src/wavpack/ui.cxx:502
-msgid "ReplayGain Settings:"
-msgstr "Gosodiadau'r ReplayGain:"
-
-#: src/vorbis/configure.c:180 src/wavpack/ui.cxx:520
-msgid "ReplayGain Type:"
-msgstr "Math ReplayGain:"
-
-#: src/vorbis/configure.c:191 src/wavpack/ui.cxx:531
-msgid "use Track Gain/Peak"
-msgstr "defnyddiwch Cynnydd/Brig Trac"
-
-#: src/vorbis/configure.c:201 src/wavpack/ui.cxx:539
-msgid "use Album Gain/Peak"
-msgstr "defnyddio Cynnydd/Brig Albwm"
-
-#: src/vorbis/configure.c:213
-msgid "Enable 6dB Boost + Hard Limiting"
-msgstr "Galluogi Chwydd 6dB a Hard Limiting"
-
-#: src/vorbis/vorbis.c:751 src/vorbis/vorbis.c~:759
+#: src/vorbis/vorbis.c:681
 msgid "About Ogg Vorbis Audio Plugin"
 msgstr "Ynghylch Ategyn Ogg Vorbis"
 
-#: src/vorbis/vorbis.c:757 src/vorbis/vorbis.c~:765
+#: src/vorbis/vorbis.c:687
+#, fuzzy
 msgid ""
 "Ogg Vorbis Plugin by the Xiph.org Foundation\n"
 "\n"
@@ -5012,6 +4753,7 @@
 "Jorn Baayen <jorn@nl.linux.org>\n"
 "Haavard Kvaalen <havardk@xmms.org>\n"
 "Gian-Carlo Pascutto <gcp@sjeng.org>\n"
+"Eugene Zagidullin <e.asphyx@gmail.com>\n"
 "\n"
 "Visit the Xiph.org Foundation at http://www.xiph.org/\n"
 msgstr ""
@@ -5134,7 +4876,23 @@
 msgid "General Plugin Settings:"
 msgstr "Gosodiadau'r ReplayGain:"
 
-#: src/wma/wma.c:132
+#: src/wavpack/ui.cxx:502
+msgid "ReplayGain Settings:"
+msgstr "Gosodiadau'r ReplayGain:"
+
+#: src/wavpack/ui.cxx:520
+msgid "ReplayGain Type:"
+msgstr "Math ReplayGain:"
+
+#: src/wavpack/ui.cxx:531
+msgid "use Track Gain/Peak"
+msgstr "defnyddiwch Cynnydd/Brig Trac"
+
+#: src/wavpack/ui.cxx:539
+msgid "use Album Gain/Peak"
+msgstr "defnyddio Cynnydd/Brig Albwm"
+
+#: src/wma/wma.c:123
 msgid ""
 "Adapted for use in Audacious by Tony Vroon (chainsaw@gentoo.org) from\n"
 "the BEEP-WMA plugin which is Copyright (C) 2004,2005 Mokrushin I.V. aka "
@@ -5145,6 +4903,29 @@
 msgstr ""
 
 #, fuzzy
+#~ msgid "Base gain (dB):"
+#~ msgstr "Rhagosodedig (%s)"
+
+#, fuzzy
+#~ msgid "Enable ReplayGain processing"
+#~ msgstr "Galluogi ReplayGain"
+
+#, fuzzy
+#~ msgid "Enable peak info clip prevention"
+#~ msgstr "Galluogi Atal Clipio"
+
+#, fuzzy
+#~ msgid "Enable adaptive scaler clip prevention"
+#~ msgstr "Galluogi Atal Clipio"
+
+#, fuzzy
+#~ msgid "Gain Control"
+#~ msgstr "Rheolwr sain"
+
+#~ msgid "Enable 6dB Boost + Hard Limiting"
+#~ msgstr "Galluogi Chwydd 6dB a Hard Limiting"
+
+#, fuzzy
 #~ msgid "<b>Playback:</b>"
 #~ msgstr "Chwarae"
 
--- a/po/de.po	Fri Jun 13 04:58:39 2008 +0300
+++ b/po/de.po	Fri Jun 13 05:57:25 2008 +0300
@@ -2,8 +2,8 @@
 msgstr ""
 "Project-Id-Version: de\n"
 "Report-Msgid-Bugs-To: http://bugs.audacious-media-player.org\n"
-"POT-Creation-Date: 2008-02-03 20:33+0200\n"
-"PO-Revision-Date: 2007-11-01 21:10+0100\n"
+"POT-Creation-Date: 2008-03-30 17:25+0200\n"
+"PO-Revision-Date: 2008-03-30 17:07+0100\n"
 "Last-Translator: Michael Färber <0102@gmx.at>\n"
 "Language-Team: german <0102@gmx.at>\n"
 "MIME-Version: 1.0\n"
@@ -33,22 +33,22 @@
 #: src/adplug/adplug-xmms.cc:265 src/adplug/adplug-xmms.cc:526
 #: src/alac/plugin.c:77 src/arts/arts.c:26 src/arts/configure.c:90
 #: src/audiocompress/audacious-glue.c:102
-#: src/audiocompress/audacious-glue.c:552 src/cdaudio-ng/configure.c:227
-#: src/console/Audacious_Driver.cxx:449 src/demac/plugin.c:392
+#: src/audiocompress/audacious-glue.c:552 src/cdaudio-ng/configure.c:228
+#: src/console/Audacious_Driver.cxx:449 src/demac/plugin.c:393
 #: src/echo_plugin/gui.c:26 src/echo_plugin/gui.c:137 src/esd/about.c:49
 #: src/filewriter/filewriter.c:183 src/jack/configure.c:141
-#: src/jack/jack.c:493 src/madplug/plugin.c:600 src/madplug/plugin.c:624
+#: src/jack/jack.c:456 src/madplug/plugin.c:542 src/madplug/plugin.c:566
 #: src/metronom/metronom.c:88 src/modplug/gui/main.cxx:49
 #: src/musepack/libmpc.cxx:232 src/null/null.c:67 src/null/null.c:110
 #: src/OSS4/about.c:59 src/OSS/about.c:54 src/paranormal-ng/plugin.c:283
 #: src/paranormal/plugin.c:291 src/scrobbler/gtkstuff.c:25
-#: src/sndfile/plugin.c:565 src/statusicon/si_ui.c:593
+#: src/sndfile/plugin.c:565 src/statusicon/si_ui.c:628
 #: src/stereo_plugin/stereo.c:53 src/stereo_plugin/stereo.c:116
 #: src/sun/about.c:38 src/sun/configure.c:559 src/timidity/interface.c:222
 #: src/timidity/xmms-timidity.c:120 src/tonegen/tonegen.c:62
 #: src/tta/libtta.c:153 src/tta/libtta.c:267 src/tta/libtta.c:402
-#: src/vorbis/vorbis.c:769 src/vorbis/vorbis.c~:777 src/vtx/about.c:32
-#: src/vtx/info.c:43 src/wavpack/ui.cxx:56 src/wavpack/ui.cxx:556
+#: src/vorbis/vorbis.c:700 src/vtx/about.c:32 src/vtx/info.c:43
+#: src/wavpack/ui.cxx:56 src/wavpack/ui.cxx:556
 msgid "Ok"
 msgstr "OK"
 
@@ -85,7 +85,7 @@
 
 #: src/adplug/adplug-xmms.cc:275 src/alarm/interface.c:1398
 #: src/alsa/configure.c:389 src/arts/configure.c:91
-#: src/audiocompress/audacious-glue.c:557 src/cdaudio-ng/configure.c:231
+#: src/audiocompress/audacious-glue.c:557 src/cdaudio-ng/configure.c:232
 #: src/echo_plugin/gui.c:145 src/jack/configure.c:148
 #: src/modplug/gui/interface.cxx:714 src/modplug/gui/modplug.glade:1668
 #: src/musepack/libmpc.cxx:237 src/musepack/libmpc.cxx:557 src/null/null.c:111
@@ -96,7 +96,7 @@
 msgstr "Abbrechen"
 
 #: src/adplug/adplug-xmms.cc:291 src/console/Audacious_Config.cxx:145
-#: src/madplug/configure.c:421 src/modplug/gui/interface.cxx:628
+#: src/madplug/configure.c:290 src/modplug/gui/interface.cxx:628
 #: src/modplug/gui/interface.cxx:887 src/modplug/gui/modplug.glade:1404
 #: src/modplug/gui/modplug.glade:1804
 msgid "General"
@@ -124,13 +124,13 @@
 msgid "Channels"
 msgstr "Kanäle"
 
-#: src/adplug/adplug-xmms.cc:325 src/filewriter/mp3.c:894
+#: src/adplug/adplug-xmms.cc:325 src/filewriter/mp3.c:900
 #: src/sid/xmms-sid.glade:157 src/sid/xs_interface.c:288
 #: src/timidity/interface.c:165
 msgid "Mono"
 msgstr "Mono"
 
-#: src/adplug/adplug-xmms.cc:330 src/filewriter/mp3.c:889
+#: src/adplug/adplug-xmms.cc:330 src/filewriter/mp3.c:895
 #: src/modplug/gui/interface.cxx:204 src/modplug/gui/modplug.glade:159
 #: src/sid/xmms-sid.glade:176 src/sid/xs_interface.c:295
 #: src/timidity/interface.c:173
@@ -311,7 +311,7 @@
 
 #: src/alarm/interface.c:71 src/lirc/about.c:115
 #: src/modplug/gui/interface.cxx:971 src/modplug/gui/modplug.glade:2030
-#: src/sid/xmms-sid.glade:3643 src/sid/xs_about.c:213
+#: src/sid/xmms-sid.glade:3643 src/sid/xs_about.c:214
 #: src/sid/xs_interface.c:1740
 msgid "Close"
 msgstr "Schließen"
@@ -325,10 +325,10 @@
 msgstr ""
 
 #: src/alarm/interface.c:124 src/alarm/interface.c:1389 src/alsa/about.c:46
-#: src/alsa/configure.c:383 src/cdaudio-ng/cdaudio-ng.c:228
-#: src/flacng/plugin.c:747 src/gnomeshortcuts/gnomeshortcuts.c:292
+#: src/alsa/configure.c:383 src/cdaudio-ng/cdaudio-ng.c:247
+#: src/flacng/plugin.c:706 src/gnomeshortcuts/gnomeshortcuts.c:311
 #: src/hotkey/gui.c:671 src/modplug/gui/interface.cxx:702
-#: src/modplug/gui/modplug.glade:1642 src/pulse_audio/pulse_audio.c:712
+#: src/modplug/gui/modplug.glade:1642 src/pulse_audio/pulse_audio.c:738
 #: src/scrobbler/gtkstuff.c:45 src/sid/xmms-sid.glade:3066
 #: src/sid/xs_interface.c:1243
 msgid "OK"
@@ -1601,7 +1601,7 @@
 msgid "Trigger"
 msgstr "Auslöser"
 
-#: src/aosd/aosd_ui.c:1076 src/cdaudio-ng/configure.c:166
+#: src/aosd/aosd_ui.c:1076 src/cdaudio-ng/configure.c:167
 #: src/modplug/gui/interface.cxx:688 src/modplug/gui/modplug.glade:1603
 #: src/sid/xmms-sid.glade:3026 src/sid/xs_interface.c:1229
 msgid "Misc"
@@ -1789,15 +1789,19 @@
 msgid "Options:"
 msgstr "Optionen:"
 
-#: src/cdaudio-ng/cdaudio-ng.c:198
+#: src/cdaudio-ng/cdaudio-ng.c:204
+msgid "Rescan CD"
+msgstr ""
+
+#: src/cdaudio-ng/cdaudio-ng.c:217
 msgid "Add CD"
 msgstr "CD hinzufügen"
 
-#: src/cdaudio-ng/cdaudio-ng.c:223
+#: src/cdaudio-ng/cdaudio-ng.c:242
 msgid "About CD Audio Plugin NG"
 msgstr "Ãœber CD-Audio-Plugin NG"
 
-#: src/cdaudio-ng/cdaudio-ng.c:224
+#: src/cdaudio-ng/cdaudio-ng.c:243
 msgid ""
 "Copyright (c) 2007, by Calin Crisan <ccrisan@gmail.com> and The Audacious "
 "Team.\n"
@@ -1820,7 +1824,7 @@
 "\n"
 "Das war ein Google Summer of Code 2007 Projektt."
 
-#: src/cdaudio-ng/cdaudio-ng.c:627
+#: src/cdaudio-ng/cdaudio-ng.c:814
 msgid ""
 "<b><big>No playable CD found.</big></b>\n"
 "\n"
@@ -1830,47 +1834,47 @@
 "\n"
 "Keine CD eingelegt, oder die eingelegte CD ist keine Audio-CD.\n"
 
-#: src/cdaudio-ng/configure.c:146
+#: src/cdaudio-ng/configure.c:147
 msgid "CD Audio Plugin Configuration"
 msgstr "CD-Audio-Plugin-Konfiguration"
 
-#: src/cdaudio-ng/configure.c:156
+#: src/cdaudio-ng/configure.c:157
 msgid "Digital audio extraction"
 msgstr "Digitale Audioextraktion"
 
-#: src/cdaudio-ng/configure.c:161
+#: src/cdaudio-ng/configure.c:162
 msgid "Title information"
 msgstr "Titelinformation"
 
-#: src/cdaudio-ng/configure.c:178
+#: src/cdaudio-ng/configure.c:179
 msgid "Limit read speed to: "
 msgstr "Lesegeschwindigkeit beschränken auf: "
 
-#: src/cdaudio-ng/configure.c:185
+#: src/cdaudio-ng/configure.c:186
 msgid "Use cd-text if available"
 msgstr "CD-Text benutzen, falls vorhanden"
 
-#: src/cdaudio-ng/configure.c:189
+#: src/cdaudio-ng/configure.c:190
 msgid "Use CDDB if available"
 msgstr "CDDB benutzen, falls vorhanden"
 
-#: src/cdaudio-ng/configure.c:193
+#: src/cdaudio-ng/configure.c:194
 msgid "Server: "
 msgstr "Server: "
 
-#: src/cdaudio-ng/configure.c:196
+#: src/cdaudio-ng/configure.c:197
 msgid "Port: "
 msgstr "Port: "
 
-#: src/cdaudio-ng/configure.c:202
+#: src/cdaudio-ng/configure.c:203
 msgid "Use HTTP instead of CDDBP"
 msgstr ""
 
-#: src/cdaudio-ng/configure.c:210
+#: src/cdaudio-ng/configure.c:211
 msgid "Override default device: "
 msgstr "Anderes Device verwenden: "
 
-#: src/cdaudio-ng/configure.c:217
+#: src/cdaudio-ng/configure.c:218
 msgid "Print debug information"
 msgstr "Debug-Informationen ausgeben"
 
@@ -1945,12 +1949,11 @@
 "Implementierung für Audacious von: William Pitcock <nenolod@nenolod.net>, \n"
 "        Shay Green <gblargg@gmail.com>"
 
-#: src/demac/plugin.c:387
-#, fuzzy
+#: src/demac/plugin.c:388
 msgid "About Monkey's Audio Plugin"
-msgstr "Ãœber MPEG-Audio-Plugin"
-
-#: src/demac/plugin.c:388
+msgstr "Ãœber Monkey's Audio-Plugin"
+
+#: src/demac/plugin.c:389
 msgid ""
 "Copyright (C) 2007 Eugene Zagidullin <e.asphyx@gmail.com>\n"
 "Based on ffape decoder, Copyright (C) 2007 Benjamin Zores\n"
@@ -2216,7 +2219,7 @@
 "Ensure that the device has been correctly plugged in."
 msgstr ""
 
-#: src/evdev-plug/ed_ui.c:319 src/madplug/plugin.c:624
+#: src/evdev-plug/ed_ui.c:319 src/madplug/plugin.c:566
 msgid "Error"
 msgstr "Fehler"
 
@@ -2414,15 +2417,15 @@
 msgid "Prepend track number to filename"
 msgstr "Track-Nummer vor Dateinamen anhängen"
 
-#: src/filewriter/mp3.c:670
+#: src/filewriter/mp3.c:676
 msgid "MP3 Configuration"
 msgstr "MP3-Konfiguration"
 
-#: src/filewriter/mp3.c:697
+#: src/filewriter/mp3.c:703
 msgid "Algorithm Quality:"
 msgstr "Algorithmen-Qualität:"
 
-#: src/filewriter/mp3.c:719
+#: src/filewriter/mp3.c:725
 msgid ""
 "best/slowest:0;\n"
 "worst/fastest:9;\n"
@@ -2434,96 +2437,96 @@
 "empfohlen:2;\n"
 "voreingestellt:5;"
 
-#: src/filewriter/mp3.c:727
+#: src/filewriter/mp3.c:733
 msgid "Output Samplerate:"
 msgstr "Ausgabe-Abtastfrequenz:"
 
-#: src/filewriter/mp3.c:738 src/filewriter/mp3.c:879
+#: src/filewriter/mp3.c:744 src/filewriter/mp3.c:885
 msgid "Auto"
 msgstr "Automatisch"
 
-#: src/filewriter/mp3.c:760
+#: src/filewriter/mp3.c:766
 msgid "(Hz)"
 msgstr "(Hz)"
 
-#: src/filewriter/mp3.c:772
+#: src/filewriter/mp3.c:778
 msgid "Bitrate / Compression ratio:"
 msgstr "Bitrate / Kompressionsverhältnis:"
 
-#: src/filewriter/mp3.c:798
+#: src/filewriter/mp3.c:804
 msgid "Bitrate (kbps):"
 msgstr "Bitrate (kbps):"
 
-#: src/filewriter/mp3.c:839
+#: src/filewriter/mp3.c:845
 msgid "Compression ratio:"
 msgstr "Kompressionsverhältnis:"
 
-#: src/filewriter/mp3.c:869
+#: src/filewriter/mp3.c:875
 msgid "Audio Mode:"
 msgstr "Audio-Modus:"
 
-#: src/filewriter/mp3.c:884
+#: src/filewriter/mp3.c:890
 msgid "Joint-Stereo"
 msgstr "Joint-Stereo"
 
-#: src/filewriter/mp3.c:925
+#: src/filewriter/mp3.c:931
 msgid "auto-M/S mode"
 msgstr ""
 
-#: src/filewriter/mp3.c:937
+#: src/filewriter/mp3.c:943
 msgid "Misc:"
 msgstr "Verschiedenes:"
 
-#: src/filewriter/mp3.c:948
+#: src/filewriter/mp3.c:954
 msgid "Enforce strict ISO complience"
 msgstr "Strikte ISO-Erfüllung erzwingen"
 
-#: src/filewriter/mp3.c:959
+#: src/filewriter/mp3.c:965
 msgid "Error protection"
 msgstr "Fehlerschutz"
 
-#: src/filewriter/mp3.c:971
+#: src/filewriter/mp3.c:977
 msgid "Adds 16 bit checksum to every frame"
 msgstr "16-Bit-Prüfsumme zu jedem Frame hinzufügen"
 
-#: src/filewriter/mp3.c:976 src/filewriter/vorbis.c:274
+#: src/filewriter/mp3.c:982 src/filewriter/vorbis.c:274
 #: src/modplug/gui/interface.cxx:319 src/modplug/gui/modplug.glade:507
 msgid "Quality"
 msgstr "Qualität"
 
-#: src/filewriter/mp3.c:988
+#: src/filewriter/mp3.c:994
 msgid "Enable VBR/ABR"
 msgstr "VBR/ABR aktivieren"
 
-#: src/filewriter/mp3.c:1000
+#: src/filewriter/mp3.c:1006
 msgid "Type:"
 msgstr "Typ:"
 
-#: src/filewriter/mp3.c:1011
+#: src/filewriter/mp3.c:1017
 msgid "Variable bitrate"
 msgstr "Variable Bitrate"
 
-#: src/filewriter/mp3.c:1023
+#: src/filewriter/mp3.c:1029
 msgid "Average bitrate"
 msgstr "Durchschnittliche Bitrate"
 
-#: src/filewriter/mp3.c:1037
+#: src/filewriter/mp3.c:1043
 msgid "VBR Options:"
 msgstr "VBR-Optionen:"
 
-#: src/filewriter/mp3.c:1053
+#: src/filewriter/mp3.c:1059
 msgid "Minimum bitrate (kbps):"
 msgstr "Minimale Bitrate (kbps):"
 
-#: src/filewriter/mp3.c:1089
+#: src/filewriter/mp3.c:1095
 msgid "Maximum bitrate (kbps):"
 msgstr "Maximale Bitrate (kbps):"
 
-#: src/filewriter/mp3.c:1121
+#: src/filewriter/mp3.c:1127
 msgid "Strictly enforce minimum bitrate"
 msgstr "Minimale Bitrate erzwingen"
 
-#: src/filewriter/mp3.c:1123
+#: src/filewriter/mp3.c:1129
 msgid ""
 "For use with players that do not support low bitrate mp3 (Apex AD600-A DVD/"
 "mp3 player)"
@@ -2531,19 +2534,19 @@
 "Zur Benutzung mit Playern, die kein MP3 mit niedriger Bitrate unterstützen "
 "(Apex AD600-A DVD/MP3 player)"
 
-#: src/filewriter/mp3.c:1136
+#: src/filewriter/mp3.c:1142
 msgid "ABR Options:"
 msgstr "ABR-Optionen:"
 
-#: src/filewriter/mp3.c:1146
+#: src/filewriter/mp3.c:1152
 msgid "Average bitrate (kbps):"
 msgstr "Durchschnittliche Bitrate (kbps):"
 
-#: src/filewriter/mp3.c:1183
+#: src/filewriter/mp3.c:1189
 msgid "VBR quality level:"
 msgstr "VBR-Qualitätsstufe:"
 
-#: src/filewriter/mp3.c:1198
+#: src/filewriter/mp3.c:1204
 msgid ""
 "highest:0;\n"
 "lowest:9;\n"
@@ -2553,43 +2556,43 @@
 "niedrigste:9;\n"
 "voreingestellt:4;"
 
-#: src/filewriter/mp3.c:1206
+#: src/filewriter/mp3.c:1212
 msgid "Don't write Xing VBR header"
 msgstr "Xing-VBR-Header nicht schreiben"
 
-#: src/filewriter/mp3.c:1221
+#: src/filewriter/mp3.c:1227
 msgid "VBR/ABR"
 msgstr "VBR/ABR"
 
-#: src/filewriter/mp3.c:1233
+#: src/filewriter/mp3.c:1239
 msgid "Frame params:"
 msgstr "Frame-Parameter:"
 
-#: src/filewriter/mp3.c:1245
+#: src/filewriter/mp3.c:1251
 msgid "Mark as copyright"
 msgstr "Als Copyright kennzeichnen"
 
-#: src/filewriter/mp3.c:1256
+#: src/filewriter/mp3.c:1262
 msgid "Mark as original"
 msgstr "Als Original kennzeichnen"
 
-#: src/filewriter/mp3.c:1268
+#: src/filewriter/mp3.c:1274
 msgid "ID3 params:"
 msgstr "ID3-Parameter:"
 
-#: src/filewriter/mp3.c:1279
+#: src/filewriter/mp3.c:1285
 msgid "Force addition of version 2 tag"
 msgstr "Hinzufügen von Version-2-Tags erzwingen"
 
-#: src/filewriter/mp3.c:1289
+#: src/filewriter/mp3.c:1295
 msgid "Only add v1 tag"
 msgstr "Nur v1-Tag hinzufügen"
 
-#: src/filewriter/mp3.c:1296
+#: src/filewriter/mp3.c:1302
 msgid "Only add v2 tag"
 msgstr "Nur v2-Tag hinzufügen"
 
-#: src/filewriter/mp3.c:1317
+#: src/filewriter/mp3.c:1323
 msgid "Tags"
 msgstr "Tags"
 
@@ -2601,11 +2604,11 @@
 msgid "Quality level (0 - 10):"
 msgstr "Qualitätsstufe (0 - 10):"
 
-#: src/flacng/plugin.c:739
+#: src/flacng/plugin.c:698
 msgid "FLAC Audio Plugin "
 msgstr "FLAC-Audio-Plugin "
 
-#: src/flacng/plugin.c:740
+#: src/flacng/plugin.c:699
 msgid ""
 "\n"
 "\n"
@@ -2621,87 +2624,75 @@
 "\n"
 "http://www.skytale.net/projects/bmp-flac2/"
 
-#: src/flacng/plugin.c:745
+#: src/flacng/plugin.c:704
 msgid "About FLAC Audio Plugin"
 msgstr "Ãœber FLAC-Audio-Plugin"
 
-#: src/gnomeshortcuts/gnomeshortcuts.c:287
+#: src/gnomeshortcuts/gnomeshortcuts.c:306
 msgid "About Gnome Shortcut Plugin"
 msgstr "Ãœber das Gnome-Shortcut-Plugin"
 
-#: src/gnomeshortcuts/gnomeshortcuts.c:288
+#: src/gnomeshortcuts/gnomeshortcuts.c:307
 msgid ""
 "Gnome Shortcut Plugin\n"
 "Let's you control the player with Gnome's shortcuts.\n"
 "\n"
-"Copyright (C) 2007 Sascha Hlusiak <contact@saschahlusiak.de>\n"
+"Copyright (C) 2007-2008 Sascha Hlusiak <contact@saschahlusiak.de>\n"
 "\n"
 msgstr ""
 "Gnome-Shortcut-Plugin\n"
-"Ermöglicht die Kontrolle des Players mit den Tastaturkürzeln von GNOME.\n"
+"Ermöglicht die Kontrolle des Players mit GNOME-Tastaturkürzeln.\n"
 "\n"
-"Copyright (C) 2007 Sascha Hlusiak <contact@saschahlusiak.de>\n"
+"Copyright (C) 2007-2008 Sascha Hlusiak <contact@saschahlusiak.de>\n"
 "\n"
 
 #: src/hotkey/gui.c:68
-#, fuzzy
 msgid "Previous Track"
-msgstr "Voriger Titel:"
+msgstr "Voriger Titel"
 
 #: src/hotkey/gui.c:69
-#, fuzzy
 msgid "Play"
-msgstr "Spielzeit:"
+msgstr "Wiedergeben"
 
 #: src/hotkey/gui.c:70
-#, fuzzy
 msgid "Pause/Resume"
-msgstr "Pause:"
+msgstr "Pause"
 
 #: src/hotkey/gui.c:71
-#, fuzzy
 msgid "Stop"
-msgstr "Stop:"
+msgstr "Stop"
 
 #: src/hotkey/gui.c:72
-#, fuzzy
 msgid "Next Track"
-msgstr "Nächster Titel:"
+msgstr "Nächster Titel"
 
 #: src/hotkey/gui.c:73
-#, fuzzy
 msgid "Forward 5 Seconds"
-msgstr "5 Sek. vorspulen:"
+msgstr "5 Sek. vorspulen"
 
 #: src/hotkey/gui.c:74
-#, fuzzy
 msgid "Rewind 5 Seconds"
-msgstr "5 Sek. zurückspulen:"
+msgstr "5 Sek. zurückspulen"
 
 #: src/hotkey/gui.c:75
-#, fuzzy
 msgid "Mute"
-msgstr "Stumm:"
+msgstr "Stumm"
 
 #: src/hotkey/gui.c:76
-#, fuzzy
 msgid "Volume Up"
-msgstr "Lautstärke erhöhen:"
+msgstr "Lautstärke erhöhen"
 
 #: src/hotkey/gui.c:77
-#, fuzzy
 msgid "Volume Down"
-msgstr "Lautstärke verringern:"
+msgstr "Lautstärke verringern"
 
 #: src/hotkey/gui.c:78
-#, fuzzy
 msgid "Jump to File"
-msgstr "Zu Datei springen:"
+msgstr "Zu Datei springen"
 
 #: src/hotkey/gui.c:79
-#, fuzzy
 msgid "Toggle Player Windows"
-msgstr "Player zeigen/verstecken:"
+msgstr "Player zeigen/verstecken"
 
 #: src/hotkey/gui.c:80
 msgid "Show On-Screen-Display"
@@ -2728,11 +2719,12 @@
 msgstr "Global-Hotkey-Konfiguration"
 
 #: src/hotkey/gui.c:395
-#, fuzzy
 msgid ""
 "Press a key combination inside a text field.\n"
 "You can also bind mouse buttons."
-msgstr "Tastenkombination innerhalb eines Textfelds drücken."
+msgstr ""
+"Bitte eine Tastenkombination innerhalb eines Textfelds drücken.\n"
+"Es ist auch möglich, Maustasten zu verwenden."
 
 #: src/hotkey/gui.c:400
 #, fuzzy
@@ -2806,11 +2798,11 @@
 msgid "Enable debug printing"
 msgstr ""
 
-#: src/jack/jack.c:95
+#: src/jack/jack.c:84
 msgid "Sample rate mismatch"
 msgstr ""
 
-#: src/jack/jack.c:98
+#: src/jack/jack.c:87
 msgid ""
 "Xmms is asking for a sample rate that differs from\n"
 " that of the jack server.  Xmms 1.2.8 or later\n"
@@ -2824,15 +2816,15 @@
 "Chris Morgan <cmorgan@alum.wpi.edu>\n"
 msgstr ""
 
-#: src/jack/jack.c:111 src/wma/wma.c:157
+#: src/jack/jack.c:100 src/wma/wma.c:148
 msgid " Close "
 msgstr " Schliessen"
 
-#: src/jack/jack.c:489
+#: src/jack/jack.c:452
 msgid "About JACK Output Plugin 0.17"
 msgstr ""
 
-#: src/jack/jack.c:490
+#: src/jack/jack.c:453
 msgid ""
 "XMMS jack Driver 0.17\n"
 "\n"
@@ -2917,9 +2909,8 @@
 "http://fsinfo.cs.uni-sb.de/~columbus/lirc/index.html"
 
 #: src/lirc/interface.c:37
-#, fuzzy
 msgid "LIRC plugin settings"
-msgstr "LIRC-Plugin "
+msgstr "LIRC-Plugin-Einstellungen"
 
 #: src/lirc/interface.c:61
 msgid "Reconnect to LIRC server"
@@ -2934,9 +2925,8 @@
 msgstr ""
 
 #: src/lirc/interface.c:79
-#, fuzzy
 msgid "Connection"
-msgstr "Ort:"
+msgstr "Verbindung"
 
 #: src/lirc/lirc.c:83
 #, c-format
@@ -2971,111 +2961,58 @@
 msgid "%s: will try reconnect every %d seconds...\n"
 msgstr ""
 
-#: src/madplug/configure.c:332
+#: src/madplug/configure.c:209
 msgid "MPEG Audio Plugin Configuration"
 msgstr "MPEG-Audio-Plugin-Konfiguration"
 
-#: src/madplug/configure.c:349
-#, fuzzy
+#: src/madplug/configure.c:226
 msgid "Audio Settings"
-msgstr "Alarm-Einstellungen"
-
-#: src/madplug/configure.c:358
-msgid "Dither output when rounding to 16-bit"
-msgstr "Ausgabe beim Runden auf 16-Bit dithern"
-
-#: src/madplug/configure.c:365
+msgstr "Audio-Einstellungen"
+
+#: src/madplug/configure.c:234
 msgid "Force reopen audio when audio type changed"
 msgstr "Neuöffnen von Audio bei Änderung des Audiotyps erzwingen"
 
-#: src/madplug/configure.c:374
+#: src/madplug/configure.c:243
 #, fuzzy
 msgid "Metadata Settings"
 msgstr "Mixer-Einstellungen:"
 
-#: src/madplug/configure.c:383
+#: src/madplug/configure.c:252
 msgid "Enable fast play-length calculation"
 msgstr "Schnelle Spieldauer-Berechnung aktivieren"
 
-#: src/madplug/configure.c:390
+#: src/madplug/configure.c:259
 msgid "Parse XING headers"
 msgstr "XING-Header parsen"
 
-#: src/madplug/configure.c:397
+#: src/madplug/configure.c:266
 #, fuzzy
 msgid "Use SJIS to write ID3 tags (not recommended)"
 msgstr "SJIS anstatt UTF-8 zum Schreiben von ID3-Tags benutzen"
 
-#: src/madplug/configure.c:404
-#, fuzzy
+#: src/madplug/configure.c:273
 msgid "Miscellaneous Settings"
-msgstr "Mixer-Einstellungen:"
-
-#: src/madplug/configure.c:413
+msgstr "Verschiedene Einstellungen"
+
+#: src/madplug/configure.c:282
 msgid "Display average bitrate for VBR"
 msgstr "Durchschnittliche Bitrate für VBR anzeigen"
 
-#: src/madplug/configure.c:432
-#, fuzzy
-msgid "Base gain (dB):"
-msgstr "Standard-Verstärkung (dB):"
-
-#: src/madplug/configure.c:446 src/musepack/libmpc.cxx:190
-msgid "ReplayGain Settings"
-msgstr "ReplayGain-Einstellungen"
-
-#: src/madplug/configure.c:457
-msgid "Enable ReplayGain processing"
-msgstr "ReplayGain-Bearbeitung aktivieren"
-
-#: src/madplug/configure.c:467 src/musepack/libmpc.cxx:207
-msgid "ReplayGain Type"
-msgstr "ReplayGain-Typ"
-
-#: src/madplug/configure.c:477 src/musepack/libmpc.cxx:215
-msgid "Use Track Gain"
-msgstr "Track Gain benutzen"
-
-#: src/madplug/configure.c:485 src/musepack/libmpc.cxx:219
-msgid "Use Album Gain"
-msgstr "Album Gain benutzen"
-
-#: src/madplug/configure.c:498
-msgid "Pre-gain with RG info (dB):"
-msgstr ""
-
-#: src/madplug/configure.c:514
-msgid "Pre-gain without RG info (dB):"
-msgstr ""
-
-#: src/madplug/configure.c:530
-#, fuzzy
-msgid "Enable peak info clip prevention"
-msgstr "Clipping-Verhinderung aktivieren"
-
-#: src/madplug/configure.c:552
-#, fuzzy
-msgid "Enable adaptive scaler clip prevention"
-msgstr "Clipping-Verhinderung aktivieren"
-
-#: src/madplug/configure.c:561
-msgid "Gain Control"
-msgstr ""
-
-#: src/madplug/configure.c:569 src/vorbis/configure.c:135
+#: src/madplug/configure.c:296 src/vorbis/configure.c:102
 msgid "Override generic titles"
 msgstr "Allgemeine Titel überschreiben"
 
-#: src/madplug/configure.c:581
+#: src/madplug/configure.c:308
 msgid "ID3 format:"
 msgstr "ID3-Format:"
 
-#: src/madplug/configure.c:593 src/sid/xmms-sid.glade:2540
-#: src/sid/xs_interface.c:1070 src/vorbis/configure.c:158
+#: src/madplug/configure.c:320 src/sid/xmms-sid.glade:2540
+#: src/sid/xs_interface.c:1070
 msgid "Title"
 msgstr "Titel"
 
-#: src/madplug/plugin.c:582
+#: src/madplug/plugin.c:524
 #, c-format
 msgid ""
 "Audacious MPEG Audio Plugin\n"
@@ -3106,7 +3043,7 @@
 "ReplayGain-Unterstützung von:\n"
 "    Samuel Krempp"
 
-#: src/madplug/plugin.c:598
+#: src/madplug/plugin.c:540
 msgid "About MPEG Audio Plugin"
 msgstr "Ãœber MPEG-Audio-Plugin"
 
@@ -3173,9 +3110,8 @@
 msgstr "8-tap Fir (extrem hohe Qualität)"
 
 #: src/modplug/gui/interface.cxx:285 src/modplug/gui/modplug.glade:384
-#, fuzzy
 msgid "48 kHz"
-msgstr "44 kHz"
+msgstr "48 kHz"
 
 #: src/modplug/gui/interface.cxx:292 src/modplug/gui/modplug.glade:403
 msgid "44 kHz"
@@ -3424,18 +3360,31 @@
 msgid "Plugin"
 msgstr "Plugin"
 
-#: src/musepack/libmpc.cxx:197 src/vorbis/configure.c:170
-#: src/wavpack/ui.cxx:510
+#: src/musepack/libmpc.cxx:190
+msgid "ReplayGain Settings"
+msgstr "ReplayGain-Einstellungen"
+
+#: src/musepack/libmpc.cxx:197 src/wavpack/ui.cxx:510
 msgid "Enable Clipping Prevention"
 msgstr "Clipping-Verhinderung aktivieren"
 
-#: src/musepack/libmpc.cxx:202 src/vorbis/configure.c:175
-#: src/wavpack/ui.cxx:515
+#: src/musepack/libmpc.cxx:202 src/wavpack/ui.cxx:515
 msgid "Enable ReplayGain"
 msgstr "ReplayGain aktivieren"
 
-#: src/musepack/libmpc.cxx:224 src/vorbis/configure.c:219
-#: src/wavpack/ui.cxx:547
+#: src/musepack/libmpc.cxx:207
+msgid "ReplayGain Type"
+msgstr "ReplayGain-Typ"
+
+#: src/musepack/libmpc.cxx:215
+msgid "Use Track Gain"
+msgstr "Track Gain benutzen"
+
+#: src/musepack/libmpc.cxx:219
+msgid "Use Album Gain"
+msgstr "Album Gain benutzen"
+
+#: src/musepack/libmpc.cxx:224 src/wavpack/ui.cxx:547
 msgid "ReplayGain"
 msgstr "ReplayGain"
 
@@ -3662,11 +3611,15 @@
 msgid "Volume controls Master not PCM"
 msgstr ""
 
-#: src/pulse_audio/pulse_audio.c:696
+#: src/projectm-1.0/main.c:70
+msgid "_Random"
+msgstr ""
+
+#: src/pulse_audio/pulse_audio.c:722
 msgid "About Audacious PulseAudio Output Plugin"
 msgstr "Ãœber Audacious-PulseAudio-Ausgabe-Plugin"
 
-#: src/pulse_audio/pulse_audio.c:697
+#: src/pulse_audio/pulse_audio.c:723
 msgid ""
 "Audacious PulseAudio Output Plugin\n"
 "\n"
@@ -3736,36 +3689,6 @@
 msgid "Scrobbler Error"
 msgstr "Scrobbler-Fehler"
 
-#: src/sid/xmms-sid.c:203
-msgid "Error initializing song-length database!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:209
-msgid "Error initializing STIL database!\n"
-msgstr "Fehler beim Initialisieren der STIL-Datenbank!\n"
-
-#: src/sid/xmms-sid.c:347
-msgid "Couldn't allocate memory for audio data buffer!\n"
-msgstr "Konnte keinen Speicher für den Audio-Daten-Buffer allozieren!\n"
-
-#: src/sid/xmms-sid.c:355
-msgid "Couldn't allocate memory for audio oversampling buffer!\n"
-msgstr "Konnte keinen Speicher für den Audio-Oversampling-Buffer allozieren!\n"
-
-#: src/sid/xmms-sid.c:371
-#, c-format
-msgid "Couldn't initialize SID-tune '%s' (sub-tune #%i)!\n"
-msgstr "Konnte SID-Tune '%s' (Unter-Tune #%i) nicht initialisieren!\n"
-
-#: src/sid/xmms-sid.c:382
-#, c-format
-msgid "Couldn't open XMMS audio output (fmt=%x, freq=%i, nchan=%i)!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:432
-msgid "Oversampling rate-conversion pass failed.\n"
-msgstr ""
-
 #: src/sid/xmms-sid.glade:8 src/sid/xs_interface.c:221
 msgid "Audacious-SID configuration"
 msgstr "Audacious-SID-Konfiguration"
@@ -4157,7 +4080,6 @@
 msgstr ""
 
 #: src/sid/xmms-sid.glade:2511 src/sid/xs_interface.c:1065
-#, fuzzy
 msgid "Song title format:"
 msgstr "Titelformat:"
 
@@ -4305,19 +4227,11 @@
 msgid "No"
 msgstr "Nein"
 
-#: src/sid/xs_about.c:84 src/wma/wma.c:130
+#: src/sid/xs_about.c:84 src/wma/wma.c:121
 #, c-format
 msgid "About %s"
 msgstr "Ãœber %s"
 
-#: src/sid/xs_config.c:580
-msgid "Allocation of sid2FilterPresets structure failed!\n"
-msgstr ""
-
-#: src/sid/xs_config.c:908
-msgid "Warning: Could not set filter curve widget points!\n"
-msgstr ""
-
 #: src/sid/xs_fileinfo.c:232
 msgid "General info"
 msgstr ""
@@ -4327,180 +4241,9 @@
 msgid "Tune #%i: "
 msgstr ""
 
-#: src/sid/xs_length.c:113
-msgid "Error allocating new node. Fatal error.\n"
-msgstr ""
-
-#: src/sid/xs_length.c:128
-#, c-format
-msgid "'=' expected on column #%d.\n"
-msgstr ""
-
-#: src/sid/xs_length.c:153
-msgid "Could not allocate memory for node.\n"
-msgstr ""
-
-#: src/sid/xs_length.c:204
-#, c-format
-msgid "Could not open SongLengthDB '%s'\n"
-msgstr ""
-
-#: src/sid/xs_length.c:224
-#, c-format
-msgid "Invalid MD5-hash in SongLengthDB file '%s' line #%d!\n"
-msgstr ""
-
-#: src/sid/xs_length.c:231
-#, c-format
-msgid "Invalid entry in SongLengthDB file '%s' line #%d!\n"
-msgstr ""
-
-#: src/sid/xs_length.c:236
-#, c-format
-msgid "Invalid line in SongLengthDB file '%s' line #%d\n"
-msgstr ""
-
-#: src/sid/xs_length.c:398
-#, c-format
-msgid "Not a PSID or RSID file '%s'\n"
-msgstr ""
-
-#: src/sid/xs_length.c:417
-#, c-format
-msgid "Error reading SID file header from '%s'\n"
-msgstr ""
-
-#: src/sid/xs_length.c:436
-#, c-format
-msgid "Error allocating temp data buffer for file '%s'\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:96
-msgid "[SIDPlay1] Could not initialize emulation engine.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:103
-msgid "[SIDPlay1] Endianess verification failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:238
-msgid "[SIDPlay1] Emulator engine configuration failed!\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:245
-msgid "[SIDPlay1] Could not initialize SIDTune object.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:291
-msgid ""
-"[SIDPlay1] SID-tune struct pointer was NULL. This should not happen, report "
-"to XMMS-SID author.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:296
-msgid ""
-"[SIDPlay1] SID-tune status check failed. This should not happen, report to "
-"XMMS-SID author.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:101
-msgid "[SIDPlay2] Could not initialize emulation engine.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:208
-#, c-format
-msgid "[SIDPlay2] Invalid number of filter curve points (%d > %d)\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:229
-msgid "reSID->create() failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:235
-#, c-format
-msgid "reSID->filter(%d) failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:243
-#, c-format
-msgid "reSID->sampling(%d) failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:253
-msgid "reSID->filter(NULL) failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:267
-msgid "hardSID->create() failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:273
-#, c-format
-msgid "hardSID->filter(%d) failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:281
-msgid "[SIDPlay2] Could not initialize SIDBuilder object.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:295
-#, c-format
-msgid "[SIDPlay2] Invalid clockSpeed=%d, falling back to PAL.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:319
-#, c-format
-msgid "Invalid sid2OptLevel=%d, falling back to %d.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:343
-msgid "[SIDPlay2] Emulator engine configuration failed!\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:350
-msgid "[SIDPlay2] Could not initialize SIDTune object.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:401
-msgid "[SIDPlay2] currTune->selectSong() failed\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:406
-msgid "[SIDPlay2] currEng->load() failed\n"
-msgstr ""
-
-#: src/sid/xs_slsup.c:217
-#, fuzzy, c-format
-msgid "Could not allocate memory for t_xs_tuneinfo ('%s')\n"
-msgstr "Konnte keinen Speicher für den Audio-Daten-Buffer allozieren!\n"
-
-#: src/sid/xs_slsup.c:224
-#, c-format
-msgid "Could not allocate sidFilename ('%s')\n"
-msgstr ""
-
-#: src/sid/xs_slsup.c:233
-#, fuzzy, c-format
-msgid "Could not allocate memory for t_xs_subtuneinfo ('%s', %i)\n"
-msgstr "Konnte keinen Speicher für den Audio-Daten-Buffer allozieren!\n"
-
-#: src/sid/xs_stil.c:46
-msgid "SubTune pointer structure realloc failed.\n"
-msgstr ""
-
-#: src/sid/xs_stil.c:69
-msgid "SubTune structure malloc failed!\n"
-msgstr ""
-
-#: src/sid/xs_stil.c:176
-#, c-format
-msgid "Could not open STILDB '%s'\n"
-msgstr ""
-
 #: src/sndfile/plugin.c:548
-#, fuzzy
 msgid "About sndfile plugin"
-msgstr "sndfile-WAV-Plugin"
+msgstr "Ãœber das sndfile-Plugin"
 
 #: src/sndfile/plugin.c:549
 msgid ""
@@ -4648,11 +4391,11 @@
 msgid "The orientation of the tray"
 msgstr "Die Ausrichtung des Trays"
 
-#: src/statusicon/si_ui.c:587
+#: src/statusicon/si_ui.c:622
 msgid "About Status Icon Plugin"
 msgstr "About Status-Icon-Plugin"
 
-#: src/statusicon/si_ui.c:589
+#: src/statusicon/si_ui.c:624
 msgid ""
 "\n"
 "written by Giacomo Lozito < james@develia.org >\n"
@@ -4666,35 +4409,35 @@
 "Dieses Plugin stellt ein Status-Icon bereit, im\n"
 "System-Tray des Fenstermanagers.\n"
 
-#: src/statusicon/si_ui.c:661
+#: src/statusicon/si_ui.c:696
 msgid "Status Icon Plugin - Preferences"
 msgstr "Status-Icon-Plugin - Einstellungen"
 
-#: src/statusicon/si_ui.c:672
+#: src/statusicon/si_ui.c:707
 msgid "Right-Click Menu"
 msgstr "Rechtsklick-Menü"
 
-#: src/statusicon/si_ui.c:677
+#: src/statusicon/si_ui.c:712
 msgid "Audacious standard menu"
 msgstr "Audacious-Standard-Menü"
 
-#: src/statusicon/si_ui.c:682
+#: src/statusicon/si_ui.c:717
 msgid "Small playback menu #1"
 msgstr "Kleines Wiedergabe-Menü #1"
 
-#: src/statusicon/si_ui.c:687
+#: src/statusicon/si_ui.c:722
 msgid "Small playback menu #2"
 msgstr "Kleines Wiedergabe-Menü #2"
 
-#: src/statusicon/si_ui.c:710
+#: src/statusicon/si_ui.c:745
 msgid "Mouse Scroll Action"
 msgstr "Maus-Scroll-Aktion"
 
-#: src/statusicon/si_ui.c:715
+#: src/statusicon/si_ui.c:750
 msgid "Change volume"
 msgstr "Lautstärke ändern"
 
-#: src/statusicon/si_ui.c:720
+#: src/statusicon/si_ui.c:755
 msgid "Change playing song"
 msgstr "Aktiven Titel ändern"
 
@@ -4811,12 +4554,12 @@
 "frequency3;...\n"
 "z.B. tone://2000;2005 für einen Ton mit 2000Hz und einen mit 2005Hz"
 
-#: src/tonegen/tonegen.c:168
+#: src/tonegen/tonegen.c:167
 #, c-format
 msgid "%s %.1f Hz"
 msgstr "%s %.1f Hz"
 
-#: src/tonegen/tonegen.c:168
+#: src/tonegen/tonegen.c:167
 msgid "Tone Generator: "
 msgstr "Ton-Generator: "
 
@@ -4876,43 +4619,23 @@
 msgid "Track number:"
 msgstr "Titelnummer:"
 
-#: src/vorbis/configure.c:115
+#: src/vorbis/configure.c:84
 msgid "Ogg Vorbis Audio Plugin Configuration"
 msgstr "Ogg-Vorbis-Audio-Plugin-Konfiguration"
 
-#: src/vorbis/configure.c:127
+#: src/vorbis/configure.c:94
 msgid "Ogg Vorbis Tags:"
 msgstr "Ogg-Vorbis-Tags:"
 
-#: src/vorbis/configure.c:148
+#: src/vorbis/configure.c:115
 msgid "Title format:"
 msgstr "Titelformat:"
 
-#: src/vorbis/configure.c:162 src/wavpack/ui.cxx:502
-msgid "ReplayGain Settings:"
-msgstr "ReplayGain-Einstellungen:"
-
-#: src/vorbis/configure.c:180 src/wavpack/ui.cxx:520
-msgid "ReplayGain Type:"
-msgstr "ReplayGain-Typ:"
-
-#: src/vorbis/configure.c:191 src/wavpack/ui.cxx:531
-msgid "use Track Gain/Peak"
-msgstr "Benutze Track Gain/Peak"
-
-#: src/vorbis/configure.c:201 src/wavpack/ui.cxx:539
-msgid "use Album Gain/Peak"
-msgstr "Benutze Album Gain/Peak"
-
-#: src/vorbis/configure.c:213
-msgid "Enable 6dB Boost + Hard Limiting"
-msgstr ""
-
-#: src/vorbis/vorbis.c:751 src/vorbis/vorbis.c~:759
+#: src/vorbis/vorbis.c:681
 msgid "About Ogg Vorbis Audio Plugin"
 msgstr "Ãœber Ogg-Vorbis-Audio-Plugin"
 
-#: src/vorbis/vorbis.c:757 src/vorbis/vorbis.c~:765
+#: src/vorbis/vorbis.c:687
 msgid ""
 "Ogg Vorbis Plugin by the Xiph.org Foundation\n"
 "\n"
@@ -4926,6 +4649,7 @@
 "Jorn Baayen <jorn@nl.linux.org>\n"
 "Haavard Kvaalen <havardk@xmms.org>\n"
 "Gian-Carlo Pascutto <gcp@sjeng.org>\n"
+"Eugene Zagidullin <e.asphyx@gmail.com>\n"
 "\n"
 "Visit the Xiph.org Foundation at http://www.xiph.org/\n"
 msgstr ""
@@ -4941,8 +4665,9 @@
 "Jorn Baayen <jorn@nl.linux.org>\n"
 "Haavard Kvaalen <havardk@xmms.org>\n"
 "Gian-Carlo Pascutto <gcp@sjeng.org>\n"
+"Eugene Zagidullin <e.asphyx@gmail.com>\n"
 "\n"
-"Die Xiph.org Foundation besuchen auf http://www.xiph.org/\n"
+"Xiph.org Foundation, http://www.xiph.org/\n"
 
 #: src/vtx/about.c:23
 msgid "About Vortex Player"
@@ -5053,7 +4778,23 @@
 msgid "General Plugin Settings:"
 msgstr "Allgemeine Plugin-Einstellungen:"
 
-#: src/wma/wma.c:132
+#: src/wavpack/ui.cxx:502
+msgid "ReplayGain Settings:"
+msgstr "ReplayGain-Einstellungen:"
+
+#: src/wavpack/ui.cxx:520
+msgid "ReplayGain Type:"
+msgstr "ReplayGain-Typ:"
+
+#: src/wavpack/ui.cxx:531
+msgid "use Track Gain/Peak"
+msgstr "Benutze Track Gain/Peak"
+
+#: src/wavpack/ui.cxx:539
+msgid "use Album Gain/Peak"
+msgstr "Benutze Album Gain/Peak"
+
+#: src/wma/wma.c:123
 msgid ""
 "Adapted for use in Audacious by Tony Vroon (chainsaw@gentoo.org) from\n"
 "the BEEP-WMA plugin which is Copyright (C) 2004,2005 Mokrushin I.V. aka "
@@ -5063,6 +4804,45 @@
 "This plugin based on source code "
 msgstr ""
 
+#~ msgid "Error initializing STIL database!\n"
+#~ msgstr "Fehler beim Initialisieren der STIL-Datenbank!\n"
+
+#~ msgid "Couldn't allocate memory for audio data buffer!\n"
+#~ msgstr "Konnte keinen Speicher für den Audio-Daten-Buffer allozieren!\n"
+
+#~ msgid "Couldn't allocate memory for audio oversampling buffer!\n"
+#~ msgstr ""
+#~ "Konnte keinen Speicher für den Audio-Oversampling-Buffer allozieren!\n"
+
+#~ msgid "Couldn't initialize SID-tune '%s' (sub-tune #%i)!\n"
+#~ msgstr "Konnte SID-Tune '%s' (Unter-Tune #%i) nicht initialisieren!\n"
+
+#, fuzzy
+#~ msgid "Could not allocate memory for t_xs_tuneinfo ('%s')\n"
+#~ msgstr "Konnte keinen Speicher für den Audio-Daten-Buffer allozieren!\n"
+
+#, fuzzy
+#~ msgid "Could not allocate memory for t_xs_subtuneinfo ('%s', %i)\n"
+#~ msgstr "Konnte keinen Speicher für den Audio-Daten-Buffer allozieren!\n"
+
+#~ msgid "Dither output when rounding to 16-bit"
+#~ msgstr "Ausgabe beim Runden auf 16-Bit dithern"
+
+#, fuzzy
+#~ msgid "Base gain (dB):"
+#~ msgstr "Standard-Verstärkung (dB):"
+
+#~ msgid "Enable ReplayGain processing"
+#~ msgstr "ReplayGain-Bearbeitung aktivieren"
+
+#, fuzzy
+#~ msgid "Enable peak info clip prevention"
+#~ msgstr "Clipping-Verhinderung aktivieren"
+
+#, fuzzy
+#~ msgid "Enable adaptive scaler clip prevention"
+#~ msgstr "Clipping-Verhinderung aktivieren"
+
 #~ msgid "<b>Playback:</b>"
 #~ msgstr "<b>Wiedergabe:</b>"
 
@@ -5128,450 +4908,6 @@
 #~ msgid "%d:%02d (%d seconds)"
 #~ msgstr "%d:%02d (%d Sekunden)"
 
-#~ msgid "Blues"
-#~ msgstr "Blues"
-
-#~ msgid "Classic Rock"
-#~ msgstr "Classic Rock"
-
-#~ msgid "Country"
-#~ msgstr "Country"
-
-#~ msgid "Dance"
-#~ msgstr "Dance"
-
-#~ msgid "Disco"
-#~ msgstr "Disco"
-
-#~ msgid "Funk"
-#~ msgstr "Funk"
-
-#~ msgid "Grunge"
-#~ msgstr "Grunge"
-
-#~ msgid "Hip-Hop"
-#~ msgstr "Hip-Hop"
-
-#~ msgid "Jazz"
-#~ msgstr "Jazz"
-
-#~ msgid "Metal"
-#~ msgstr "Metal"
-
-#~ msgid "New Age"
-#~ msgstr "New Age"
-
-#~ msgid "Oldies"
-#~ msgstr "Oldies"
-
-#~ msgid "Other"
-#~ msgstr "Andere"
-
-#~ msgid "Pop"
-#~ msgstr "Pop"
-
-#~ msgid "R&B"
-#~ msgstr "R&B"
-
-#~ msgid "Rap"
-#~ msgstr "Rap"
-
-#~ msgid "Reggae"
-#~ msgstr "Reggae"
-
-#~ msgid "Rock"
-#~ msgstr "Rock"
-
-#~ msgid "Techno"
-#~ msgstr "Techno"
-
-#~ msgid "Industrial"
-#~ msgstr "Industrial"
-
-#~ msgid "Alternative"
-#~ msgstr "Alternative"
-
-#~ msgid "Ska"
-#~ msgstr "Ska"
-
-#~ msgid "Death Metal"
-#~ msgstr "Death Metal"
-
-#~ msgid "Pranks"
-#~ msgstr "Pranks"
-
-#~ msgid "Soundtrack"
-#~ msgstr "Soundtrack"
-
-#~ msgid "Euro-Techno"
-#~ msgstr "Euro-Techno"
-
-#~ msgid "Ambient"
-#~ msgstr "Ambient"
-
-#~ msgid "Trip-Hop"
-#~ msgstr "Trip-Hop"
-
-#~ msgid "Vocal"
-#~ msgstr "Vocal"
-
-#~ msgid "Jazz+Funk"
-#~ msgstr "Jazz+Funk"
-
-#~ msgid "Fusion"
-#~ msgstr "Fusion"
-
-#~ msgid "Trance"
-#~ msgstr "Trance"
-
-#~ msgid "Classical"
-#~ msgstr "Klassisch"
-
-#~ msgid "Instrumental"
-#~ msgstr "Instrumental"
-
-#~ msgid "Acid"
-#~ msgstr "Acid"
-
-#~ msgid "House"
-#~ msgstr "House"
-
-#~ msgid "Game"
-#~ msgstr "Spiel"
-
-#~ msgid "Sound Clip"
-#~ msgstr "Soundclip"
-
-#~ msgid "Gospel"
-#~ msgstr "Gospel"
-
-#~ msgid "Noise"
-#~ msgstr "Noise"
-
-#~ msgid "AlternRock"
-#~ msgstr "AlternRock"
-
-#~ msgid "Bass"
-#~ msgstr "Bass"
-
-#~ msgid "Soul"
-#~ msgstr "Soul"
-
-#~ msgid "Punk"
-#~ msgstr "Punk"
-
-#~ msgid "Space"
-#~ msgstr "Space"
-
-#~ msgid "Meditative"
-#~ msgstr "Meditative"
-
-#~ msgid "Instrumental Pop"
-#~ msgstr "Instrumental Pop"
-
-#~ msgid "Instrumental Rock"
-#~ msgstr "Instrumental Rock"
-
-#~ msgid "Ethnic"
-#~ msgstr "Ethnic"
-
-#~ msgid "Gothic"
-#~ msgstr "Gothic"
-
-#~ msgid "Darkwave"
-#~ msgstr "Darkwave"
-
-#~ msgid "Techno-Industrial"
-#~ msgstr "Techno-Industrial"
-
-#~ msgid "Electronic"
-#~ msgstr "Electronic"
-
-#~ msgid "Pop-Folk"
-#~ msgstr "Pop-Folk"
-
-#~ msgid "Eurodance"
-#~ msgstr "Eurodance"
-
-#~ msgid "Dream"
-#~ msgstr "Dream"
-
-#~ msgid "Southern Rock"
-#~ msgstr "Southern Rock"
-
-#~ msgid "Comedy"
-#~ msgstr "Komödie"
-
-#~ msgid "Cult"
-#~ msgstr "Cult"
-
-#~ msgid "Gangsta Rap"
-#~ msgstr "Gangsta Rap"
-
-#~ msgid "Top 40"
-#~ msgstr "Top 40"
-
-#~ msgid "Christian Rap"
-#~ msgstr "Christian Rap"
-
-#~ msgid "Pop/Funk"
-#~ msgstr "Pop/Funk"
-
-#~ msgid "Jungle"
-#~ msgstr "Jungle"
-
-#~ msgid "Native American"
-#~ msgstr "Native American"
-
-#~ msgid "Cabaret"
-#~ msgstr "Kabarett"
-
-#~ msgid "New Wave"
-#~ msgstr "New Wave"
-
-#~ msgid "Psychedelic"
-#~ msgstr "Psychedelic"
-
-#~ msgid "Rave"
-#~ msgstr "Rave"
-
-#~ msgid "Showtunes"
-#~ msgstr "Showtunes"
-
-#~ msgid "Trailer"
-#~ msgstr "Trailer"
-
-#~ msgid "Lo-Fi"
-#~ msgstr "Lo-Fi"
-
-#~ msgid "Tribal"
-#~ msgstr "Tribal"
-
-#~ msgid "Acid Punk"
-#~ msgstr "Acid Punk"
-
-#~ msgid "Acid Jazz"
-#~ msgstr "Acid Jazz"
-
-#~ msgid "Polka"
-#~ msgstr "Polka"
-
-#~ msgid "Retro"
-#~ msgstr "Retro"
-
-#~ msgid "Musical"
-#~ msgstr "Musical"
-
-#~ msgid "Rock & Roll"
-#~ msgstr "Rock & Roll"
-
-#~ msgid "Hard Rock"
-#~ msgstr "Hard Rock"
-
-#~ msgid "Folk"
-#~ msgstr "Folk"
-
-#~ msgid "Folk/Rock"
-#~ msgstr "Folk/Rock"
-
-#~ msgid "National Folk"
-#~ msgstr "National Folk"
-
-#~ msgid "Swing"
-#~ msgstr "Swing"
-
-#~ msgid "Fast-Fusion"
-#~ msgstr "Fast-Fusion"
-
-#~ msgid "Bebob"
-#~ msgstr "Bebob"
-
-#~ msgid "Latin"
-#~ msgstr "Latin"
-
-#~ msgid "Revival"
-#~ msgstr "Revival"
-
-#~ msgid "Celtic"
-#~ msgstr "Keltisch"
-
-#~ msgid "Bluegrass"
-#~ msgstr "Bluegrass"
-
-#~ msgid "Avantgarde"
-#~ msgstr "Avantgarde"
-
-#~ msgid "Gothic Rock"
-#~ msgstr "Gothic Rock"
-
-#~ msgid "Progressive Rock"
-#~ msgstr "Progressive Rock"
-
-#~ msgid "Psychedelic Rock"
-#~ msgstr "Psychedelic Rock"
-
-#~ msgid "Symphonic Rock"
-#~ msgstr "Symphonic Rock"
-
-#~ msgid "Slow Rock"
-#~ msgstr "Slow Rock"
-
-#~ msgid "Big Band"
-#~ msgstr "Big Band"
-
-#~ msgid "Chorus"
-#~ msgstr "Chor"
-
-#~ msgid "Easy Listening"
-#~ msgstr "Easy Listening"
-
-#~ msgid "Acoustic"
-#~ msgstr "Acoustic"
-
-#~ msgid "Humour"
-#~ msgstr "Humor"
-
-#~ msgid "Speech"
-#~ msgstr "Rede"
-
-#~ msgid "Chanson"
-#~ msgstr "Chanson"
-
-#~ msgid "Opera"
-#~ msgstr "Oper"
-
-#~ msgid "Chamber Music"
-#~ msgstr "Kammermusik"
-
-#~ msgid "Sonata"
-#~ msgstr "Sonate"
-
-#~ msgid "Symphony"
-#~ msgstr "Symphonie"
-
-#~ msgid "Booty Bass"
-#~ msgstr "Booty Bass"
-
-#~ msgid "Primus"
-#~ msgstr "Primus"
-
-#~ msgid "Porn Groove"
-#~ msgstr "Porn Groove"
-
-#~ msgid "Satire"
-#~ msgstr "Satire"
-
-#~ msgid "Slow Jam"
-#~ msgstr "Slow Jam"
-
-#~ msgid "Club"
-#~ msgstr "Club"
-
-#~ msgid "Tango"
-#~ msgstr "Tango"
-
-#~ msgid "Samba"
-#~ msgstr "Samba"
-
-#~ msgid "Folklore"
-#~ msgstr "Folklore"
-
-#~ msgid "Ballad"
-#~ msgstr "Ballad"
-
-#~ msgid "Power Ballad"
-#~ msgstr "Power Ballad"
-
-#~ msgid "Rhythmic Soul"
-#~ msgstr "Rhythmic Soul"
-
-#~ msgid "Freestyle"
-#~ msgstr "Freestyle"
-
-#~ msgid "Duet"
-#~ msgstr "Duett"
-
-#~ msgid "Punk Rock"
-#~ msgstr "Punk Rock"
-
-#~ msgid "Drum Solo"
-#~ msgstr "Schlagzeug-Solo"
-
-#~ msgid "A Cappella"
-#~ msgstr "A Cappella"
-
-#~ msgid "Euro-House"
-#~ msgstr "Euro-House"
-
-#~ msgid "Dance Hall"
-#~ msgstr "Dance Hall"
-
-#~ msgid "Goa"
-#~ msgstr "Goa"
-
-#~ msgid "Drum & Bass"
-#~ msgstr "Schlagzeug & Bass"
-
-#~ msgid "Club-House"
-#~ msgstr "Club-House"
-
-#~ msgid "Hardcore"
-#~ msgstr "Hardcore"
-
-#~ msgid "Terror"
-#~ msgstr "Terror"
-
-#~ msgid "Indie"
-#~ msgstr "Indie"
-
-#~ msgid "BritPop"
-#~ msgstr "BritPop"
-
-#~ msgid "Negerpunk"
-#~ msgstr "Negerpunk"
-
-#~ msgid "Polsk Punk"
-#~ msgstr "Polsk Punk"
-
-#~ msgid "Beat"
-#~ msgstr "Beat"
-
-#~ msgid "Christian Gangsta Rap"
-#~ msgstr "Christian Gangsta Rap"
-
-#~ msgid "Heavy Metal"
-#~ msgstr "Heavy Metal"
-
-#~ msgid "Black Metal"
-#~ msgstr "Black Metal"
-
-#~ msgid "Crossover"
-#~ msgstr "Crossover"
-
-#~ msgid "Contemporary Christian"
-#~ msgstr "Contemporary Christian"
-
-#~ msgid "Christian Rock"
-#~ msgstr "Christian Rock"
-
-#~ msgid "Merengue"
-#~ msgstr "Merengue"
-
-#~ msgid "Salsa"
-#~ msgstr "Salsa"
-
-#~ msgid "Thrash Metal"
-#~ msgstr "Thrash Metal"
-
-#~ msgid "Anime"
-#~ msgstr "Anime"
-
-#~ msgid "JPop"
-#~ msgstr "JPop"
-
-#~ msgid "Synthpop"
-#~ msgstr "Synthpop"
-
 #~ msgid ""
 #~ "An error occured:\n"
 #~ "%s"
@@ -5626,15 +4962,3 @@
 
 #~ msgid "%d KBit/s (nominal)"
 #~ msgstr "%d KBit/s (nominell)"
-
-#~ msgid "%d"
-#~ msgstr "%d"
-
-#~ msgid "%d:%.2d"
-#~ msgstr "%d:%.2d"
-
-#~ msgid "%d Bytes"
-#~ msgstr "%d Bytes"
-
-#~ msgid "%s - Audacious"
-#~ msgstr "%s - Audacious"
--- a/po/et.po	Fri Jun 13 04:58:39 2008 +0300
+++ b/po/et.po	Fri Jun 13 05:57:25 2008 +0300
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: audacious-plugins 1.4.2\n"
 "Report-Msgid-Bugs-To: http://bugs.audacious-media-player.org\n"
-"POT-Creation-Date: 2008-02-03 20:33+0200\n"
+"POT-Creation-Date: 2008-03-30 17:25+0200\n"
 "PO-Revision-Date: 2007-12-30 17:49+0200\n"
 "Last-Translator: Ivar Smolin <okul@linux.ee>\n"
 "Language-Team: Estonian <et@li.org>\n"
@@ -35,22 +35,22 @@
 #: src/adplug/adplug-xmms.cc:265 src/adplug/adplug-xmms.cc:526
 #: src/alac/plugin.c:77 src/arts/arts.c:26 src/arts/configure.c:90
 #: src/audiocompress/audacious-glue.c:102
-#: src/audiocompress/audacious-glue.c:552 src/cdaudio-ng/configure.c:227
-#: src/console/Audacious_Driver.cxx:449 src/demac/plugin.c:392
+#: src/audiocompress/audacious-glue.c:552 src/cdaudio-ng/configure.c:228
+#: src/console/Audacious_Driver.cxx:449 src/demac/plugin.c:393
 #: src/echo_plugin/gui.c:26 src/echo_plugin/gui.c:137 src/esd/about.c:49
 #: src/filewriter/filewriter.c:183 src/jack/configure.c:141
-#: src/jack/jack.c:493 src/madplug/plugin.c:600 src/madplug/plugin.c:624
+#: src/jack/jack.c:456 src/madplug/plugin.c:542 src/madplug/plugin.c:566
 #: src/metronom/metronom.c:88 src/modplug/gui/main.cxx:49
 #: src/musepack/libmpc.cxx:232 src/null/null.c:67 src/null/null.c:110
 #: src/OSS4/about.c:59 src/OSS/about.c:54 src/paranormal-ng/plugin.c:283
 #: src/paranormal/plugin.c:291 src/scrobbler/gtkstuff.c:25
-#: src/sndfile/plugin.c:565 src/statusicon/si_ui.c:593
+#: src/sndfile/plugin.c:565 src/statusicon/si_ui.c:628
 #: src/stereo_plugin/stereo.c:53 src/stereo_plugin/stereo.c:116
 #: src/sun/about.c:38 src/sun/configure.c:559 src/timidity/interface.c:222
 #: src/timidity/xmms-timidity.c:120 src/tonegen/tonegen.c:62
 #: src/tta/libtta.c:153 src/tta/libtta.c:267 src/tta/libtta.c:402
-#: src/vorbis/vorbis.c:769 src/vorbis/vorbis.c~:777 src/vtx/about.c:32
-#: src/vtx/info.c:43 src/wavpack/ui.cxx:56 src/wavpack/ui.cxx:556
+#: src/vorbis/vorbis.c:700 src/vtx/about.c:32 src/vtx/info.c:43
+#: src/wavpack/ui.cxx:56 src/wavpack/ui.cxx:556
 msgid "Ok"
 msgstr "Olgu"
 
@@ -77,7 +77,7 @@
 
 #: src/adplug/adplug-xmms.cc:275 src/alarm/interface.c:1398
 #: src/alsa/configure.c:389 src/arts/configure.c:91
-#: src/audiocompress/audacious-glue.c:557 src/cdaudio-ng/configure.c:231
+#: src/audiocompress/audacious-glue.c:557 src/cdaudio-ng/configure.c:232
 #: src/echo_plugin/gui.c:145 src/jack/configure.c:148
 #: src/modplug/gui/interface.cxx:714 src/modplug/gui/modplug.glade:1668
 #: src/musepack/libmpc.cxx:237 src/musepack/libmpc.cxx:557 src/null/null.c:111
@@ -88,7 +88,7 @@
 msgstr "Loobu"
 
 #: src/adplug/adplug-xmms.cc:291 src/console/Audacious_Config.cxx:145
-#: src/madplug/configure.c:421 src/modplug/gui/interface.cxx:628
+#: src/madplug/configure.c:290 src/modplug/gui/interface.cxx:628
 #: src/modplug/gui/interface.cxx:887 src/modplug/gui/modplug.glade:1404
 #: src/modplug/gui/modplug.glade:1804
 msgid "General"
@@ -116,13 +116,13 @@
 msgid "Channels"
 msgstr "Kanaleid"
 
-#: src/adplug/adplug-xmms.cc:325 src/filewriter/mp3.c:894
+#: src/adplug/adplug-xmms.cc:325 src/filewriter/mp3.c:900
 #: src/sid/xmms-sid.glade:157 src/sid/xs_interface.c:288
 #: src/timidity/interface.c:165
 msgid "Mono"
 msgstr "Mono"
 
-#: src/adplug/adplug-xmms.cc:330 src/filewriter/mp3.c:889
+#: src/adplug/adplug-xmms.cc:330 src/filewriter/mp3.c:895
 #: src/modplug/gui/interface.cxx:204 src/modplug/gui/modplug.glade:159
 #: src/sid/xmms-sid.glade:176 src/sid/xs_interface.c:295
 #: src/timidity/interface.c:173
@@ -297,7 +297,7 @@
 
 #: src/alarm/interface.c:71 src/lirc/about.c:115
 #: src/modplug/gui/interface.cxx:971 src/modplug/gui/modplug.glade:2030
-#: src/sid/xmms-sid.glade:3643 src/sid/xs_about.c:213
+#: src/sid/xmms-sid.glade:3643 src/sid/xs_about.c:214
 #: src/sid/xs_interface.c:1740
 msgid "Close"
 msgstr "Sulge"
@@ -311,10 +311,10 @@
 msgstr "See on sinu äratus."
 
 #: src/alarm/interface.c:124 src/alarm/interface.c:1389 src/alsa/about.c:46
-#: src/alsa/configure.c:383 src/cdaudio-ng/cdaudio-ng.c:228
-#: src/flacng/plugin.c:747 src/gnomeshortcuts/gnomeshortcuts.c:292
+#: src/alsa/configure.c:383 src/cdaudio-ng/cdaudio-ng.c:247
+#: src/flacng/plugin.c:706 src/gnomeshortcuts/gnomeshortcuts.c:311
 #: src/hotkey/gui.c:671 src/modplug/gui/interface.cxx:702
-#: src/modplug/gui/modplug.glade:1642 src/pulse_audio/pulse_audio.c:712
+#: src/modplug/gui/modplug.glade:1642 src/pulse_audio/pulse_audio.c:738
 #: src/scrobbler/gtkstuff.c:45 src/sid/xmms-sid.glade:3066
 #: src/sid/xs_interface.c:1243
 msgid "OK"
@@ -1537,7 +1537,7 @@
 msgid "Trigger"
 msgstr "Päästikud"
 
-#: src/aosd/aosd_ui.c:1076 src/cdaudio-ng/configure.c:166
+#: src/aosd/aosd_ui.c:1076 src/cdaudio-ng/configure.c:167
 #: src/modplug/gui/interface.cxx:688 src/modplug/gui/modplug.glade:1603
 #: src/sid/xmms-sid.glade:3026 src/sid/xs_interface.c:1229
 msgid "Misc"
@@ -1714,15 +1714,19 @@
 msgid "Options:"
 msgstr "Valikud:"
 
-#: src/cdaudio-ng/cdaudio-ng.c:198
+#: src/cdaudio-ng/cdaudio-ng.c:204
+msgid "Rescan CD"
+msgstr ""
+
+#: src/cdaudio-ng/cdaudio-ng.c:217
 msgid "Add CD"
 msgstr "Lisa CD"
 
-#: src/cdaudio-ng/cdaudio-ng.c:223
+#: src/cdaudio-ng/cdaudio-ng.c:242
 msgid "About CD Audio Plugin NG"
 msgstr "CD Audio Plugin NG'st lähemalt"
 
-#: src/cdaudio-ng/cdaudio-ng.c:224
+#: src/cdaudio-ng/cdaudio-ng.c:243
 msgid ""
 "Copyright (c) 2007, by Calin Crisan <ccrisan@gmail.com> and The Audacious "
 "Team.\n"
@@ -1744,7 +1748,7 @@
 "\n"
 "See projekt loodi Google Summer of Code 2007 raames."
 
-#: src/cdaudio-ng/cdaudio-ng.c:627
+#: src/cdaudio-ng/cdaudio-ng.c:814
 msgid ""
 "<b><big>No playable CD found.</big></b>\n"
 "\n"
@@ -1754,47 +1758,47 @@
 "\n"
 "CD-plaati pole sisestatud või pole see audioplaat.\n"
 
-#: src/cdaudio-ng/configure.c:146
+#: src/cdaudio-ng/configure.c:147
 msgid "CD Audio Plugin Configuration"
 msgstr "Audioplaatide plugina sätted"
 
-#: src/cdaudio-ng/configure.c:156
+#: src/cdaudio-ng/configure.c:157
 msgid "Digital audio extraction"
 msgstr "Digitaalne audiolugemine"
 
-#: src/cdaudio-ng/configure.c:161
+#: src/cdaudio-ng/configure.c:162
 msgid "Title information"
 msgstr "Pealkirja andmed"
 
-#: src/cdaudio-ng/configure.c:178
+#: src/cdaudio-ng/configure.c:179
 msgid "Limit read speed to: "
 msgstr "Lugemiskiiruse piirang:"
 
-#: src/cdaudio-ng/configure.c:185
+#: src/cdaudio-ng/configure.c:186
 msgid "Use cd-text if available"
 msgstr "Võimaluse korral kasutatakse cd-teksti"
 
-#: src/cdaudio-ng/configure.c:189
+#: src/cdaudio-ng/configure.c:190
 msgid "Use CDDB if available"
 msgstr "Võimaluse korral kasutatakse CDDB-d"
 
-#: src/cdaudio-ng/configure.c:193
+#: src/cdaudio-ng/configure.c:194
 msgid "Server: "
 msgstr "Server: "
 
-#: src/cdaudio-ng/configure.c:196
+#: src/cdaudio-ng/configure.c:197
 msgid "Port: "
 msgstr "Port: "
 
-#: src/cdaudio-ng/configure.c:202
+#: src/cdaudio-ng/configure.c:203
 msgid "Use HTTP instead of CDDBP"
 msgstr ""
 
-#: src/cdaudio-ng/configure.c:210
+#: src/cdaudio-ng/configure.c:211
 msgid "Override default device: "
 msgstr "Vaikimisi seadme asemel kasutatakse: "
 
-#: src/cdaudio-ng/configure.c:217
+#: src/cdaudio-ng/configure.c:218
 msgid "Print debug information"
 msgstr "Silumisandmeid prinditakse"
 
@@ -1863,12 +1867,12 @@
 "        Shay Green <gblargg@gmail.com>"
 msgstr ""
 
-#: src/demac/plugin.c:387
+#: src/demac/plugin.c:388
 #, fuzzy
 msgid "About Monkey's Audio Plugin"
 msgstr "MPEG audiopluginast lähemalt"
 
-#: src/demac/plugin.c:388
+#: src/demac/plugin.c:389
 msgid ""
 "Copyright (C) 2007 Eugene Zagidullin <e.asphyx@gmail.com>\n"
 "Based on ffape decoder, Copyright (C) 2007 Benjamin Zores\n"
@@ -2153,7 +2157,7 @@
 "Ensure that the device has been correctly plugged in."
 msgstr ""
 
-#: src/evdev-plug/ed_ui.c:319 src/madplug/plugin.c:624
+#: src/evdev-plug/ed_ui.c:319 src/madplug/plugin.c:566
 msgid "Error"
 msgstr ""
 
@@ -2364,15 +2368,15 @@
 msgid "Prepend track number to filename"
 msgstr ""
 
-#: src/filewriter/mp3.c:670
+#: src/filewriter/mp3.c:676
 msgid "MP3 Configuration"
 msgstr "MP3 sätted"
 
-#: src/filewriter/mp3.c:697
+#: src/filewriter/mp3.c:703
 msgid "Algorithm Quality:"
 msgstr "Algoritmi kvaliteet:"
 
-#: src/filewriter/mp3.c:719
+#: src/filewriter/mp3.c:725
 msgid ""
 "best/slowest:0;\n"
 "worst/fastest:9;\n"
@@ -2384,157 +2388,157 @@
 "soovitatav:2;\n"
 "vaikimisi:5;"
 
-#: src/filewriter/mp3.c:727
+#: src/filewriter/mp3.c:733
 msgid "Output Samplerate:"
 msgstr ""
 
-#: src/filewriter/mp3.c:738 src/filewriter/mp3.c:879
+#: src/filewriter/mp3.c:744 src/filewriter/mp3.c:885
 msgid "Auto"
 msgstr ""
 
-#: src/filewriter/mp3.c:760
+#: src/filewriter/mp3.c:766
 msgid "(Hz)"
 msgstr "(Hz)"
 
-#: src/filewriter/mp3.c:772
+#: src/filewriter/mp3.c:778
 msgid "Bitrate / Compression ratio:"
 msgstr "Bitikiirus / pakkimistihedus:"
 
-#: src/filewriter/mp3.c:798
+#: src/filewriter/mp3.c:804
 msgid "Bitrate (kbps):"
 msgstr "Bitikiirus (kbps):"
 
-#: src/filewriter/mp3.c:839
+#: src/filewriter/mp3.c:845
 msgid "Compression ratio:"
 msgstr ""
 
-#: src/filewriter/mp3.c:869
+#: src/filewriter/mp3.c:875
 msgid "Audio Mode:"
 msgstr ""
 
-#: src/filewriter/mp3.c:884
+#: src/filewriter/mp3.c:890
 msgid "Joint-Stereo"
 msgstr ""
 
-#: src/filewriter/mp3.c:925
+#: src/filewriter/mp3.c:931
 msgid "auto-M/S mode"
 msgstr ""
 
-#: src/filewriter/mp3.c:937
+#: src/filewriter/mp3.c:943
 msgid "Misc:"
 msgstr ""
 
-#: src/filewriter/mp3.c:948
+#: src/filewriter/mp3.c:954
 msgid "Enforce strict ISO complience"
 msgstr ""
 
-#: src/filewriter/mp3.c:959
+#: src/filewriter/mp3.c:965
 msgid "Error protection"
 msgstr ""
 
-#: src/filewriter/mp3.c:971
+#: src/filewriter/mp3.c:977
 msgid "Adds 16 bit checksum to every frame"
 msgstr ""
 
-#: src/filewriter/mp3.c:976 src/filewriter/vorbis.c:274
+#: src/filewriter/mp3.c:982 src/filewriter/vorbis.c:274
 #: src/modplug/gui/interface.cxx:319 src/modplug/gui/modplug.glade:507
 msgid "Quality"
 msgstr "Kvaliteet"
 
-#: src/filewriter/mp3.c:988
+#: src/filewriter/mp3.c:994
 msgid "Enable VBR/ABR"
 msgstr ""
 
-#: src/filewriter/mp3.c:1000
+#: src/filewriter/mp3.c:1006
 msgid "Type:"
 msgstr "Liik:"
 
-#: src/filewriter/mp3.c:1011
+#: src/filewriter/mp3.c:1017
 msgid "Variable bitrate"
 msgstr "Muutuv bitikiirus"
 
-#: src/filewriter/mp3.c:1023
+#: src/filewriter/mp3.c:1029
 msgid "Average bitrate"
 msgstr "Keskmine bitikiirus"
 
-#: src/filewriter/mp3.c:1037
+#: src/filewriter/mp3.c:1043
 msgid "VBR Options:"
 msgstr ""
 
-#: src/filewriter/mp3.c:1053
+#: src/filewriter/mp3.c:1059
 msgid "Minimum bitrate (kbps):"
 msgstr "Vähim bitikiirus (kbps):"
 
-#: src/filewriter/mp3.c:1089
+#: src/filewriter/mp3.c:1095
 msgid "Maximum bitrate (kbps):"
 msgstr "Suurim bitikiirus (kbps):"
 
-#: src/filewriter/mp3.c:1121
+#: src/filewriter/mp3.c:1127
 msgid "Strictly enforce minimum bitrate"
 msgstr ""
 
-#: src/filewriter/mp3.c:1123
+#: src/filewriter/mp3.c:1129
 msgid ""
 "For use with players that do not support low bitrate mp3 (Apex AD600-A DVD/"
 "mp3 player)"
 msgstr ""
 
-#: src/filewriter/mp3.c:1136
+#: src/filewriter/mp3.c:1142
 msgid "ABR Options:"
 msgstr ""
 
-#: src/filewriter/mp3.c:1146
+#: src/filewriter/mp3.c:1152
 msgid "Average bitrate (kbps):"
 msgstr "Keskmine bitikiirus (kbps):"
 
-#: src/filewriter/mp3.c:1183
+#: src/filewriter/mp3.c:1189
 msgid "VBR quality level:"
 msgstr ""
 
-#: src/filewriter/mp3.c:1198
+#: src/filewriter/mp3.c:1204
 msgid ""
 "highest:0;\n"
 "lowest:9;\n"
 "default:4;"
 msgstr ""
 
-#: src/filewriter/mp3.c:1206
+#: src/filewriter/mp3.c:1212
 msgid "Don't write Xing VBR header"
 msgstr ""
 
-#: src/filewriter/mp3.c:1221
+#: src/filewriter/mp3.c:1227
 msgid "VBR/ABR"
 msgstr ""
 
-#: src/filewriter/mp3.c:1233
+#: src/filewriter/mp3.c:1239
 msgid "Frame params:"
 msgstr ""
 
-#: src/filewriter/mp3.c:1245
+#: src/filewriter/mp3.c:1251
 msgid "Mark as copyright"
 msgstr ""
 
-#: src/filewriter/mp3.c:1256
+#: src/filewriter/mp3.c:1262
 msgid "Mark as original"
 msgstr ""
 
-#: src/filewriter/mp3.c:1268
+#: src/filewriter/mp3.c:1274
 msgid "ID3 params:"
 msgstr ""
 
-#: src/filewriter/mp3.c:1279
+#: src/filewriter/mp3.c:1285
 msgid "Force addition of version 2 tag"
 msgstr ""
 
-#: src/filewriter/mp3.c:1289
+#: src/filewriter/mp3.c:1295
 msgid "Only add v1 tag"
 msgstr ""
 
-#: src/filewriter/mp3.c:1296
+#: src/filewriter/mp3.c:1302
 msgid "Only add v2 tag"
 msgstr ""
 
-#: src/filewriter/mp3.c:1317
+#: src/filewriter/mp3.c:1323
 msgid "Tags"
 msgstr ""
 
@@ -2546,11 +2550,11 @@
 msgid "Quality level (0 - 10):"
 msgstr "Kvaliteedi tase (0-10):"
 
-#: src/flacng/plugin.c:739
+#: src/flacng/plugin.c:698
 msgid "FLAC Audio Plugin "
 msgstr "FLAC audioplugin "
 
-#: src/flacng/plugin.c:740
+#: src/flacng/plugin.c:699
 msgid ""
 "\n"
 "\n"
@@ -2566,20 +2570,21 @@
 "\n"
 "http://www.skytale.net/projects/bmp-flac2/"
 
-#: src/flacng/plugin.c:745
+#: src/flacng/plugin.c:704
 msgid "About FLAC Audio Plugin"
 msgstr "FLAC audiopluginast lähemalt"
 
-#: src/gnomeshortcuts/gnomeshortcuts.c:287
+#: src/gnomeshortcuts/gnomeshortcuts.c:306
 msgid "About Gnome Shortcut Plugin"
 msgstr "Gnome kiirklahvide pluginast lähemalt"
 
-#: src/gnomeshortcuts/gnomeshortcuts.c:288
+#: src/gnomeshortcuts/gnomeshortcuts.c:307
+#, fuzzy
 msgid ""
 "Gnome Shortcut Plugin\n"
 "Let's you control the player with Gnome's shortcuts.\n"
 "\n"
-"Copyright (C) 2007 Sascha Hlusiak <contact@saschahlusiak.de>\n"
+"Copyright (C) 2007-2008 Sascha Hlusiak <contact@saschahlusiak.de>\n"
 "\n"
 msgstr ""
 "Gnome kiirklahvide plugin\n"
@@ -2728,11 +2733,11 @@
 msgid "Enable debug printing"
 msgstr ""
 
-#: src/jack/jack.c:95
+#: src/jack/jack.c:84
 msgid "Sample rate mismatch"
 msgstr ""
 
-#: src/jack/jack.c:98
+#: src/jack/jack.c:87
 msgid ""
 "Xmms is asking for a sample rate that differs from\n"
 " that of the jack server.  Xmms 1.2.8 or later\n"
@@ -2746,15 +2751,15 @@
 "Chris Morgan <cmorgan@alum.wpi.edu>\n"
 msgstr ""
 
-#: src/jack/jack.c:111 src/wma/wma.c:157
+#: src/jack/jack.c:100 src/wma/wma.c:148
 msgid " Close "
 msgstr " Sulge "
 
-#: src/jack/jack.c:489
+#: src/jack/jack.c:452
 msgid "About JACK Output Plugin 0.17"
 msgstr "JACK väljundplugina versioonist 0.17 lähemalt"
 
-#: src/jack/jack.c:490
+#: src/jack/jack.c:453
 msgid ""
 "XMMS jack Driver 0.17\n"
 "\n"
@@ -2881,107 +2886,59 @@
 msgid "%s: will try reconnect every %d seconds...\n"
 msgstr ""
 
-#: src/madplug/configure.c:332
+#: src/madplug/configure.c:209
 msgid "MPEG Audio Plugin Configuration"
 msgstr "MPEG audioplugina sätted"
 
-#: src/madplug/configure.c:349
+#: src/madplug/configure.c:226
 #, fuzzy
 msgid "Audio Settings"
 msgstr "Alarmi sätted"
 
-#: src/madplug/configure.c:358
-msgid "Dither output when rounding to 16-bit"
-msgstr ""
-
-#: src/madplug/configure.c:365
+#: src/madplug/configure.c:234
 msgid "Force reopen audio when audio type changed"
 msgstr ""
 
-#: src/madplug/configure.c:374
+#: src/madplug/configure.c:243
 #, fuzzy
 msgid "Metadata Settings"
 msgstr "Mikseri sätted"
 
-#: src/madplug/configure.c:383
+#: src/madplug/configure.c:252
 msgid "Enable fast play-length calculation"
 msgstr ""
 
-#: src/madplug/configure.c:390
+#: src/madplug/configure.c:259
 msgid "Parse XING headers"
 msgstr ""
 
-#: src/madplug/configure.c:397
+#: src/madplug/configure.c:266
 msgid "Use SJIS to write ID3 tags (not recommended)"
 msgstr ""
 
-#: src/madplug/configure.c:404
+#: src/madplug/configure.c:273
 #, fuzzy
 msgid "Miscellaneous Settings"
 msgstr "Mikseri sätted"
 
-#: src/madplug/configure.c:413
+#: src/madplug/configure.c:282
 msgid "Display average bitrate for VBR"
 msgstr ""
 
-#: src/madplug/configure.c:432
-msgid "Base gain (dB):"
-msgstr ""
-
-#: src/madplug/configure.c:446 src/musepack/libmpc.cxx:190
-msgid "ReplayGain Settings"
-msgstr ""
-
-#: src/madplug/configure.c:457
-msgid "Enable ReplayGain processing"
-msgstr ""
-
-#: src/madplug/configure.c:467 src/musepack/libmpc.cxx:207
-msgid "ReplayGain Type"
-msgstr ""
-
-#: src/madplug/configure.c:477 src/musepack/libmpc.cxx:215
-msgid "Use Track Gain"
-msgstr ""
-
-#: src/madplug/configure.c:485 src/musepack/libmpc.cxx:219
-msgid "Use Album Gain"
-msgstr ""
-
-#: src/madplug/configure.c:498
-msgid "Pre-gain with RG info (dB):"
-msgstr ""
-
-#: src/madplug/configure.c:514
-msgid "Pre-gain without RG info (dB):"
-msgstr ""
-
-#: src/madplug/configure.c:530
-msgid "Enable peak info clip prevention"
-msgstr ""
-
-#: src/madplug/configure.c:552
-msgid "Enable adaptive scaler clip prevention"
-msgstr ""
-
-#: src/madplug/configure.c:561
-msgid "Gain Control"
-msgstr ""
-
-#: src/madplug/configure.c:569 src/vorbis/configure.c:135
+#: src/madplug/configure.c:296 src/vorbis/configure.c:102
 msgid "Override generic titles"
 msgstr "Kasutatakse oma pealkirjavormingut"
 
-#: src/madplug/configure.c:581
+#: src/madplug/configure.c:308
 msgid "ID3 format:"
 msgstr "ID3 vorming:"
 
-#: src/madplug/configure.c:593 src/sid/xmms-sid.glade:2540
-#: src/sid/xs_interface.c:1070 src/vorbis/configure.c:158
+#: src/madplug/configure.c:320 src/sid/xmms-sid.glade:2540
+#: src/sid/xs_interface.c:1070
 msgid "Title"
 msgstr "Pealkiri"
 
-#: src/madplug/plugin.c:582
+#: src/madplug/plugin.c:524
 #, c-format
 msgid ""
 "Audacious MPEG Audio Plugin\n"
@@ -3012,7 +2969,7 @@
 "ReplayGain tugi:\n"
 "    Samuel Krempp"
 
-#: src/madplug/plugin.c:598
+#: src/madplug/plugin.c:540
 msgid "About MPEG Audio Plugin"
 msgstr "MPEG audiopluginast lähemalt"
 
@@ -3327,18 +3284,31 @@
 msgid "Plugin"
 msgstr ""
 
-#: src/musepack/libmpc.cxx:197 src/vorbis/configure.c:170
-#: src/wavpack/ui.cxx:510
+#: src/musepack/libmpc.cxx:190
+msgid "ReplayGain Settings"
+msgstr ""
+
+#: src/musepack/libmpc.cxx:197 src/wavpack/ui.cxx:510
 msgid "Enable Clipping Prevention"
 msgstr ""
 
-#: src/musepack/libmpc.cxx:202 src/vorbis/configure.c:175
-#: src/wavpack/ui.cxx:515
+#: src/musepack/libmpc.cxx:202 src/wavpack/ui.cxx:515
 msgid "Enable ReplayGain"
 msgstr ""
 
-#: src/musepack/libmpc.cxx:224 src/vorbis/configure.c:219
-#: src/wavpack/ui.cxx:547
+#: src/musepack/libmpc.cxx:207
+msgid "ReplayGain Type"
+msgstr ""
+
+#: src/musepack/libmpc.cxx:215
+msgid "Use Track Gain"
+msgstr ""
+
+#: src/musepack/libmpc.cxx:219
+msgid "Use Album Gain"
+msgstr ""
+
+#: src/musepack/libmpc.cxx:224 src/wavpack/ui.cxx:547
 msgid "ReplayGain"
 msgstr ""
 
@@ -3593,11 +3563,15 @@
 msgid "Volume controls Master not PCM"
 msgstr ""
 
-#: src/pulse_audio/pulse_audio.c:696
+#: src/projectm-1.0/main.c:70
+msgid "_Random"
+msgstr ""
+
+#: src/pulse_audio/pulse_audio.c:722
 msgid "About Audacious PulseAudio Output Plugin"
 msgstr "Audacious'e PulseAudio väljundpluginast lähemalt"
 
-#: src/pulse_audio/pulse_audio.c:697
+#: src/pulse_audio/pulse_audio.c:723
 msgid ""
 "Audacious PulseAudio Output Plugin\n"
 "\n"
@@ -3678,36 +3652,6 @@
 msgid "Scrobbler Error"
 msgstr ""
 
-#: src/sid/xmms-sid.c:203
-msgid "Error initializing song-length database!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:209
-msgid "Error initializing STIL database!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:347
-msgid "Couldn't allocate memory for audio data buffer!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:355
-msgid "Couldn't allocate memory for audio oversampling buffer!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:371
-#, c-format
-msgid "Couldn't initialize SID-tune '%s' (sub-tune #%i)!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:382
-#, c-format
-msgid "Couldn't open XMMS audio output (fmt=%x, freq=%i, nchan=%i)!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:432
-msgid "Oversampling rate-conversion pass failed.\n"
-msgstr ""
-
 #: src/sid/xmms-sid.glade:8 src/sid/xs_interface.c:221
 msgid "Audacious-SID configuration"
 msgstr ""
@@ -4237,19 +4181,11 @@
 msgid "No"
 msgstr ""
 
-#: src/sid/xs_about.c:84 src/wma/wma.c:130
+#: src/sid/xs_about.c:84 src/wma/wma.c:121
 #, c-format
 msgid "About %s"
 msgstr "\"%s\" pluginast lähemalt"
 
-#: src/sid/xs_config.c:580
-msgid "Allocation of sid2FilterPresets structure failed!\n"
-msgstr ""
-
-#: src/sid/xs_config.c:908
-msgid "Warning: Could not set filter curve widget points!\n"
-msgstr ""
-
 #: src/sid/xs_fileinfo.c:232
 msgid "General info"
 msgstr "Ãœldandmed"
@@ -4259,176 +4195,6 @@
 msgid "Tune #%i: "
 msgstr ""
 
-#: src/sid/xs_length.c:113
-msgid "Error allocating new node. Fatal error.\n"
-msgstr ""
-
-#: src/sid/xs_length.c:128
-#, c-format
-msgid "'=' expected on column #%d.\n"
-msgstr ""
-
-#: src/sid/xs_length.c:153
-msgid "Could not allocate memory for node.\n"
-msgstr ""
-
-#: src/sid/xs_length.c:204
-#, c-format
-msgid "Could not open SongLengthDB '%s'\n"
-msgstr ""
-
-#: src/sid/xs_length.c:224
-#, c-format
-msgid "Invalid MD5-hash in SongLengthDB file '%s' line #%d!\n"
-msgstr ""
-
-#: src/sid/xs_length.c:231
-#, c-format
-msgid "Invalid entry in SongLengthDB file '%s' line #%d!\n"
-msgstr ""
-
-#: src/sid/xs_length.c:236
-#, c-format
-msgid "Invalid line in SongLengthDB file '%s' line #%d\n"
-msgstr ""
-
-#: src/sid/xs_length.c:398
-#, c-format
-msgid "Not a PSID or RSID file '%s'\n"
-msgstr ""
-
-#: src/sid/xs_length.c:417
-#, c-format
-msgid "Error reading SID file header from '%s'\n"
-msgstr ""
-
-#: src/sid/xs_length.c:436
-#, c-format
-msgid "Error allocating temp data buffer for file '%s'\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:96
-msgid "[SIDPlay1] Could not initialize emulation engine.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:103
-msgid "[SIDPlay1] Endianess verification failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:238
-msgid "[SIDPlay1] Emulator engine configuration failed!\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:245
-msgid "[SIDPlay1] Could not initialize SIDTune object.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:291
-msgid ""
-"[SIDPlay1] SID-tune struct pointer was NULL. This should not happen, report "
-"to XMMS-SID author.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:296
-msgid ""
-"[SIDPlay1] SID-tune status check failed. This should not happen, report to "
-"XMMS-SID author.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:101
-msgid "[SIDPlay2] Could not initialize emulation engine.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:208
-#, c-format
-msgid "[SIDPlay2] Invalid number of filter curve points (%d > %d)\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:229
-msgid "reSID->create() failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:235
-#, c-format
-msgid "reSID->filter(%d) failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:243
-#, c-format
-msgid "reSID->sampling(%d) failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:253
-msgid "reSID->filter(NULL) failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:267
-msgid "hardSID->create() failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:273
-#, c-format
-msgid "hardSID->filter(%d) failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:281
-msgid "[SIDPlay2] Could not initialize SIDBuilder object.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:295
-#, c-format
-msgid "[SIDPlay2] Invalid clockSpeed=%d, falling back to PAL.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:319
-#, c-format
-msgid "Invalid sid2OptLevel=%d, falling back to %d.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:343
-msgid "[SIDPlay2] Emulator engine configuration failed!\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:350
-msgid "[SIDPlay2] Could not initialize SIDTune object.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:401
-msgid "[SIDPlay2] currTune->selectSong() failed\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:406
-msgid "[SIDPlay2] currEng->load() failed\n"
-msgstr ""
-
-#: src/sid/xs_slsup.c:217
-#, c-format
-msgid "Could not allocate memory for t_xs_tuneinfo ('%s')\n"
-msgstr ""
-
-#: src/sid/xs_slsup.c:224
-#, c-format
-msgid "Could not allocate sidFilename ('%s')\n"
-msgstr ""
-
-#: src/sid/xs_slsup.c:233
-#, c-format
-msgid "Could not allocate memory for t_xs_subtuneinfo ('%s', %i)\n"
-msgstr ""
-
-#: src/sid/xs_stil.c:46
-msgid "SubTune pointer structure realloc failed.\n"
-msgstr ""
-
-#: src/sid/xs_stil.c:69
-msgid "SubTune structure malloc failed!\n"
-msgstr ""
-
-#: src/sid/xs_stil.c:176
-#, c-format
-msgid "Could not open STILDB '%s'\n"
-msgstr ""
-
 #: src/sndfile/plugin.c:548
 #, fuzzy
 msgid "About sndfile plugin"
@@ -4546,11 +4312,11 @@
 msgid "The orientation of the tray"
 msgstr ""
 
-#: src/statusicon/si_ui.c:587
+#: src/statusicon/si_ui.c:622
 msgid "About Status Icon Plugin"
 msgstr "Olekuikooni pluginast lähemalt"
 
-#: src/statusicon/si_ui.c:589
+#: src/statusicon/si_ui.c:624
 msgid ""
 "\n"
 "written by Giacomo Lozito < james@develia.org >\n"
@@ -4559,35 +4325,35 @@
 "the system tray area of the window manager.\n"
 msgstr ""
 
-#: src/statusicon/si_ui.c:661
+#: src/statusicon/si_ui.c:696
 msgid "Status Icon Plugin - Preferences"
 msgstr "Olekuikooni plugina eelistused"
 
-#: src/statusicon/si_ui.c:672
+#: src/statusicon/si_ui.c:707
 msgid "Right-Click Menu"
 msgstr "Paremklõpsu menüü"
 
-#: src/statusicon/si_ui.c:677
+#: src/statusicon/si_ui.c:712
 msgid "Audacious standard menu"
 msgstr "Audacious'e standardmenüü"
 
-#: src/statusicon/si_ui.c:682
+#: src/statusicon/si_ui.c:717
 msgid "Small playback menu #1"
 msgstr "Väike esitusmenüü nr. 1"
 
-#: src/statusicon/si_ui.c:687
+#: src/statusicon/si_ui.c:722
 msgid "Small playback menu #2"
 msgstr "Väike esitusmenüü nr. 2"
 
-#: src/statusicon/si_ui.c:710
+#: src/statusicon/si_ui.c:745
 msgid "Mouse Scroll Action"
 msgstr "Hiire kerimisel"
 
-#: src/statusicon/si_ui.c:715
+#: src/statusicon/si_ui.c:750
 msgid "Change volume"
 msgstr "Muudetakse valjust"
 
-#: src/statusicon/si_ui.c:720
+#: src/statusicon/si_ui.c:755
 msgid "Change playing song"
 msgstr "Vahetatakse esitatavat lugu"
 
@@ -4694,12 +4460,12 @@
 "e.g. tone://2000;2005 to play a 2000Hz tone and a 2005Hz tone"
 msgstr ""
 
-#: src/tonegen/tonegen.c:168
+#: src/tonegen/tonegen.c:167
 #, c-format
 msgid "%s %.1f Hz"
 msgstr ""
 
-#: src/tonegen/tonegen.c:168
+#: src/tonegen/tonegen.c:167
 msgid "Tone Generator: "
 msgstr ""
 
@@ -4757,43 +4523,24 @@
 msgid "Track number:"
 msgstr "Loo number:"
 
-#: src/vorbis/configure.c:115
+#: src/vorbis/configure.c:84
 msgid "Ogg Vorbis Audio Plugin Configuration"
 msgstr "Ogg Vorbis audioplugina sätted"
 
-#: src/vorbis/configure.c:127
+#: src/vorbis/configure.c:94
 msgid "Ogg Vorbis Tags:"
 msgstr "Ogg Vorbis sildid:"
 
-#: src/vorbis/configure.c:148
+#: src/vorbis/configure.c:115
 msgid "Title format:"
 msgstr "Pealkirja vorming:"
 
-#: src/vorbis/configure.c:162 src/wavpack/ui.cxx:502
-msgid "ReplayGain Settings:"
-msgstr ""
-
-#: src/vorbis/configure.c:180 src/wavpack/ui.cxx:520
-msgid "ReplayGain Type:"
-msgstr ""
-
-#: src/vorbis/configure.c:191 src/wavpack/ui.cxx:531
-msgid "use Track Gain/Peak"
-msgstr ""
-
-#: src/vorbis/configure.c:201 src/wavpack/ui.cxx:539
-msgid "use Album Gain/Peak"
-msgstr ""
-
-#: src/vorbis/configure.c:213
-msgid "Enable 6dB Boost + Hard Limiting"
-msgstr ""
-
-#: src/vorbis/vorbis.c:751 src/vorbis/vorbis.c~:759
+#: src/vorbis/vorbis.c:681
 msgid "About Ogg Vorbis Audio Plugin"
 msgstr "Ogg Vorbis audiopluginast lähemalt"
 
-#: src/vorbis/vorbis.c:757 src/vorbis/vorbis.c~:765
+#: src/vorbis/vorbis.c:687
+#, fuzzy
 msgid ""
 "Ogg Vorbis Plugin by the Xiph.org Foundation\n"
 "\n"
@@ -4807,6 +4554,7 @@
 "Jorn Baayen <jorn@nl.linux.org>\n"
 "Haavard Kvaalen <havardk@xmms.org>\n"
 "Gian-Carlo Pascutto <gcp@sjeng.org>\n"
+"Eugene Zagidullin <e.asphyx@gmail.com>\n"
 "\n"
 "Visit the Xiph.org Foundation at http://www.xiph.org/\n"
 msgstr ""
@@ -4921,7 +4669,23 @@
 msgid "General Plugin Settings:"
 msgstr ""
 
-#: src/wma/wma.c:132
+#: src/wavpack/ui.cxx:502
+msgid "ReplayGain Settings:"
+msgstr ""
+
+#: src/wavpack/ui.cxx:520
+msgid "ReplayGain Type:"
+msgstr ""
+
+#: src/wavpack/ui.cxx:531
+msgid "use Track Gain/Peak"
+msgstr ""
+
+#: src/wavpack/ui.cxx:539
+msgid "use Album Gain/Peak"
+msgstr ""
+
+#: src/wma/wma.c:123
 msgid ""
 "Adapted for use in Audacious by Tony Vroon (chainsaw@gentoo.org) from\n"
 "the BEEP-WMA plugin which is Copyright (C) 2004,2005 Mokrushin I.V. aka "
--- a/po/fr.po	Fri Jun 13 04:58:39 2008 +0300
+++ b/po/fr.po	Fri Jun 13 05:57:25 2008 +0300
@@ -8,8 +8,8 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: 1.5.x\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-02-20 13:58+0100\n"
+"Report-Msgid-Bugs-To: http://bugs.audacious-media-player.org\n"
+"POT-Creation-Date: 2008-03-30 17:25+0200\n"
 "PO-Revision-Date: 2008-02-20 14:00+0100\n"
 "Last-Translator: Stany Henry <StrassBoy@gmail.com>\n"
 "Language-Team: fr_FR\n"
@@ -39,56 +39,253 @@
 msgid "About MP4 AAC player plugin"
 msgstr "À propos du module 'MP4 AAC'"
 
-#: src/aac/libmp4.c:293
-#: src/alac/plugin.c:77
-#: src/arts/configure.c:90
-#: src/arts/arts.c:26
+#: src/aac/libmp4.c:293 src/adplug/adplug-xmms.cc:182
+#: src/adplug/adplug-xmms.cc:265 src/adplug/adplug-xmms.cc:526
+#: src/alac/plugin.c:77 src/arts/arts.c:26 src/arts/configure.c:90
 #: src/audiocompress/audacious-glue.c:102
-#: src/audiocompress/audacious-glue.c:552
-#: src/cdaudio-ng/configure.c:228
-#: src/demac/plugin.c:392
-#: src/echo_plugin/gui.c:26
-#: src/echo_plugin/gui.c:137
-#: src/esd/about.c:49
-#: src/filewriter/filewriter.c:183
-#: src/jack/configure.c:141
-#: src/jack/jack.c:456
-#: src/madplug/plugin.c:542
-#: src/madplug/plugin.c:566
-#: src/metronom/metronom.c:88
-#: src/null/null.c:67
-#: src/null/null.c:110
-#: src/OSS/about.c:54
-#: src/OSS4/about.c:59
-#: src/paranormal/plugin.c:291
-#: src/paranormal-ng/plugin.c:283
-#: src/scrobbler/gtkstuff.c:25
-#: src/sndfile/plugin.c:565
-#: src/statusicon/si_ui.c:593
-#: src/stereo_plugin/stereo.c:53
-#: src/stereo_plugin/stereo.c:116
-#: src/sun/configure.c:559
-#: src/sun/about.c:38
-#: src/timidity/interface.c:222
-#: src/timidity/xmms-timidity.c:120
-#: src/tonegen/tonegen.c:62
-#: src/tta/libtta.c:153
-#: src/tta/libtta.c:267
-#: src/tta/libtta.c:402
-#: src/vorbis/vorbis.c:700
-#: src/vtx/info.c:43
-#: src/vtx/about.c:32
-#: src/adplug/adplug-xmms.cc:182
-#: src/adplug/adplug-xmms.cc:265
-#: src/adplug/adplug-xmms.cc:526
-#: src/console/Audacious_Driver.cxx:449
-#: src/modplug/gui/main.cxx:49
-#: src/musepack/libmpc.cxx:232
-#: src/wavpack/ui.cxx:56
-#: src/wavpack/ui.cxx:556
+#: src/audiocompress/audacious-glue.c:552 src/cdaudio-ng/configure.c:228
+#: src/console/Audacious_Driver.cxx:449 src/demac/plugin.c:393
+#: src/echo_plugin/gui.c:26 src/echo_plugin/gui.c:137 src/esd/about.c:49
+#: src/filewriter/filewriter.c:183 src/jack/configure.c:141
+#: src/jack/jack.c:456 src/madplug/plugin.c:542 src/madplug/plugin.c:566
+#: src/metronom/metronom.c:88 src/modplug/gui/main.cxx:49
+#: src/musepack/libmpc.cxx:232 src/null/null.c:67 src/null/null.c:110
+#: src/OSS4/about.c:59 src/OSS/about.c:54 src/paranormal-ng/plugin.c:283
+#: src/paranormal/plugin.c:291 src/scrobbler/gtkstuff.c:25
+#: src/sndfile/plugin.c:565 src/statusicon/si_ui.c:628
+#: src/stereo_plugin/stereo.c:53 src/stereo_plugin/stereo.c:116
+#: src/sun/about.c:38 src/sun/configure.c:559 src/timidity/interface.c:222
+#: src/timidity/xmms-timidity.c:120 src/tonegen/tonegen.c:62
+#: src/tta/libtta.c:153 src/tta/libtta.c:267 src/tta/libtta.c:402
+#: src/vorbis/vorbis.c:700 src/vtx/about.c:32 src/vtx/info.c:43
+#: src/wavpack/ui.cxx:56 src/wavpack/ui.cxx:556
 msgid "Ok"
 msgstr "OK"
 
+#: src/adplug/adplug-xmms.cc:171
+msgid "About "
+msgstr "À propos de "
+
+#: src/adplug/adplug-xmms.cc:175
+msgid ""
+"\n"
+"Copyright (C) 2002, 2003 Simon Peter <dn.tlp@gmx.net>\n"
+"\n"
+"This plugin is released under the terms and conditions of the GNU LGPL.\n"
+"See http://www.gnu.org/licenses/lgpl.html for details.\n"
+"\n"
+"This plugin uses the AdPlug library, which is copyright (C) Simon Peter, et "
+"al.\n"
+"Linked AdPlug library version: "
+msgstr ""
+"\n"
+"Droits d'utilisation (2002, 2003) : Simon Peter <dn.tlp@gmx.net>\n"
+"\n"
+"Ce module est distribué sous les termes et les conditions de la licence GNU "
+"LGPL.\n"
+"Consultez la page suivante pour les détails : http://www.gnu.org/licenses/"
+"lgpl.html\n"
+"\n"
+"Cette extension utilise la bibliothèque 'AdPlug'.\n"
+"Droits d'utilisation : Simon Peter, et al.\n"
+"\n"
+"Version de la bibliothèque 'AdPlug' liée : "
+
+#: src/adplug/adplug-xmms.cc:256
+msgid "AdPlug :: Configuration"
+msgstr "Configuration de 'AdPlug'"
+
+#: src/adplug/adplug-xmms.cc:275 src/alarm/interface.c:1398
+#: src/alsa/configure.c:389 src/arts/configure.c:91
+#: src/audiocompress/audacious-glue.c:557 src/cdaudio-ng/configure.c:232
+#: src/echo_plugin/gui.c:145 src/jack/configure.c:148
+#: src/modplug/gui/interface.cxx:714 src/modplug/gui/modplug.glade:1668
+#: src/musepack/libmpc.cxx:237 src/musepack/libmpc.cxx:557 src/null/null.c:111
+#: src/sid/xmms-sid.glade:3080 src/sid/xs_interface.c:1250
+#: src/stereo_plugin/stereo.c:125 src/sun/configure.c:567
+#: src/timidity/interface.c:230 src/wavpack/ui.cxx:280 src/wavpack/ui.cxx:563
+msgid "Cancel"
+msgstr "Annuler"
+
+#: src/adplug/adplug-xmms.cc:291 src/console/Audacious_Config.cxx:145
+#: src/madplug/configure.c:290 src/modplug/gui/interface.cxx:628
+#: src/modplug/gui/interface.cxx:887 src/modplug/gui/modplug.glade:1404
+#: src/modplug/gui/modplug.glade:1804
+msgid "General"
+msgstr "Général"
+
+#: src/adplug/adplug-xmms.cc:303
+msgid "Sound quality"
+msgstr "Qualité du son"
+
+#: src/adplug/adplug-xmms.cc:308 src/modplug/gui/interface.cxx:187
+#: src/modplug/gui/modplug.glade:113
+msgid "Resolution"
+msgstr "Résolution"
+
+#: src/adplug/adplug-xmms.cc:310
+msgid "8bit"
+msgstr "8 bits"
+
+#: src/adplug/adplug-xmms.cc:315
+msgid "16bit"
+msgstr "16 bits"
+
+#: src/adplug/adplug-xmms.cc:323 src/modplug/gui/interface.cxx:218
+#: src/modplug/gui/modplug.glade:199 src/timidity/interface.c:148
+msgid "Channels"
+msgstr "Sortie"
+
+#: src/adplug/adplug-xmms.cc:325 src/filewriter/mp3.c:900
+#: src/sid/xmms-sid.glade:157 src/sid/xs_interface.c:288
+#: src/timidity/interface.c:165
+msgid "Mono"
+msgstr "Mono"
+
+#: src/adplug/adplug-xmms.cc:330 src/filewriter/mp3.c:895
+#: src/modplug/gui/interface.cxx:204 src/modplug/gui/modplug.glade:159
+#: src/sid/xmms-sid.glade:176 src/sid/xs_interface.c:295
+#: src/timidity/interface.c:173
+msgid "Stereo"
+msgstr "Stéréo"
+
+#: src/adplug/adplug-xmms.cc:334
+msgid ""
+"Setting stereo is not recommended, unless you need to. This won't add any "
+"stereo effects to the sound - OPL2 is just mono - but eats up more CPU power!"
+msgstr ""
+"Activer le mode stéréo n'est pas recommandé, à moins que vous ne le vouliez "
+"vraiment. Cette option n'ajoutera pas d'effet stéréo au son produit (OPL2 "
+"n'utilise que le mode mono), mais nécessitera beaucoup plus de puissance "
+"CPU !"
+
+#: src/adplug/adplug-xmms.cc:342
+msgid "Frequency"
+msgstr "Fréquence"
+
+#: src/adplug/adplug-xmms.cc:378 src/adplug/adplug-xmms.cc:582
+#: src/console/Audacious_Config.cxx:147
+msgid "Playback"
+msgstr "Lecture"
+
+#: src/adplug/adplug-xmms.cc:382
+msgid "Detect songend"
+msgstr "Détecter la fin du morceau"
+
+#: src/adplug/adplug-xmms.cc:386
+msgid ""
+"If enabled, XMMS will detect a song's ending, stop it and advance in the "
+"playlist. If disabled, XMMS won't take notice of a song's ending and loop it "
+"all over again and again."
+msgstr ""
+"Si cette option est activée, Audacious détectera la fin du morceau, "
+"interrompra la lecture, puis passera au titre suivant dans la liste de "
+"lecture. Dans le cas contraire, Audacious ne se préoccupera pas de la fin "
+"des morceaux : le titre sera lu en boucle."
+
+#: src/adplug/adplug-xmms.cc:397
+msgid "Formats"
+msgstr "Formats"
+
+#: src/adplug/adplug-xmms.cc:404
+msgid "Format selection"
+msgstr "Choix des formats"
+
+#: src/adplug/adplug-xmms.cc:407
+msgid "Format"
+msgstr "Format"
+
+#: src/adplug/adplug-xmms.cc:407
+msgid "Extension"
+msgstr "Extension"
+
+#: src/adplug/adplug-xmms.cc:447
+msgid ""
+"Selected file types will be recognized and played back by this plugin. "
+"Deselected types will be ignored to make room for other plugins to play "
+"these files."
+msgstr ""
+"Les types de fichiers sélectionnés seront reconnus et gérés par ce module. "
+"Les autres seront ignorés, de manière à pouvoir être supportés par d'autres "
+"extensions."
+
+#: src/adplug/adplug-xmms.cc:533
+msgid "AdPlug :: File Info"
+msgstr "Informations sur le fichier"
+
+#: src/adplug/adplug-xmms.cc:555 src/amidi-plug/i_configure-fluidsynth.c:448
+msgid "Filename"
+msgstr "Nom du fichier"
+
+#: src/adplug/adplug-xmms.cc:559
+msgid "Title: "
+msgstr "Titre : "
+
+#: src/adplug/adplug-xmms.cc:560
+msgid "Author: "
+msgstr "Auteur : "
+
+#: src/adplug/adplug-xmms.cc:561
+msgid "File Type: "
+msgstr "Format : "
+
+#: src/adplug/adplug-xmms.cc:562
+msgid "Subsongs: "
+msgstr "Sous-modules : "
+
+#: src/adplug/adplug-xmms.cc:563
+msgid "Instruments: "
+msgstr "Instruments : "
+
+#: src/adplug/adplug-xmms.cc:568
+msgid "Orders: "
+msgstr "Partitions : "
+
+#: src/adplug/adplug-xmms.cc:569
+msgid "Patterns: "
+msgstr "Séquences : "
+
+#: src/adplug/adplug-xmms.cc:573
+msgid "Song"
+msgstr "Morceau"
+
+#: src/adplug/adplug-xmms.cc:599
+msgid "Instrument name"
+msgstr "Nom de l'instrument"
+
+#: src/adplug/adplug-xmms.cc:641
+msgid "Song message"
+msgstr "Commentaires"
+
+#: src/adplug/adplug-xmms.cc:663
+msgid "Subsong selection"
+msgstr "Sélection du sous-module"
+
+#: src/adplug/adplug-xmms.cc:727
+msgid "Order: "
+msgstr "Partition : "
+
+#: src/adplug/adplug-xmms.cc:728
+msgid "Pattern: "
+msgstr "Séquence : "
+
+#: src/adplug/adplug-xmms.cc:730
+msgid "Row: "
+msgstr "Ligne : "
+
+#: src/adplug/adplug-xmms.cc:731
+msgid "Speed: "
+msgstr "Vitesse : "
+
+#: src/adplug/adplug-xmms.cc:732
+msgid "Timer: "
+msgstr "Fréquence : "
+
+#: src/adplug/adplug-xmms.cc:733 src/console/Audacious_Config.cxx:225
+#: src/sid/xmms-sid.glade:332 src/sid/xs_interface.c:341
+msgid "Hz"
+msgstr "Hz"
+
 #: src/alac/plugin.c:74
 msgid "About Apple Lossless Audio Plugin"
 msgstr "À propos du module audio 'Apple Lossless'"
@@ -134,13 +331,10 @@
 "\n"
 "http://www.snika.uklinux.net/xmms-alarm/"
 
-#: src/alarm/interface.c:71
-#: src/lirc/about.c:115
+#: src/alarm/interface.c:71 src/lirc/about.c:115
+#: src/modplug/gui/interface.cxx:971 src/modplug/gui/modplug.glade:2030
+#: src/sid/xmms-sid.glade:3643 src/sid/xs_about.c:214
 #: src/sid/xs_interface.c:1740
-#: src/sid/xs_about.c:213
-#: src/modplug/gui/interface.cxx:971
-#: src/modplug/gui/modplug.glade:2030
-#: src/sid/xmms-sid.glade:3643
 msgid "Close"
 msgstr "Fermer"
 
@@ -152,20 +346,13 @@
 msgid "This is your wakeup call."
 msgstr "L'appel du réveil... ;-)"
 
-#: src/alarm/interface.c:124
-#: src/alarm/interface.c:1389
-#: src/alsa/configure.c:383
-#: src/alsa/about.c:46
-#: src/cdaudio-ng/cdaudio-ng.c:224
-#: src/flacng/plugin.c:700
-#: src/gnomeshortcuts/gnomeshortcuts.c:311
-#: src/hotkey/gui.c:671
-#: src/pulse_audio/pulse_audio.c:738
-#: src/scrobbler/gtkstuff.c:45
+#: src/alarm/interface.c:124 src/alarm/interface.c:1389 src/alsa/about.c:46
+#: src/alsa/configure.c:383 src/cdaudio-ng/cdaudio-ng.c:247
+#: src/flacng/plugin.c:706 src/gnomeshortcuts/gnomeshortcuts.c:311
+#: src/hotkey/gui.c:671 src/modplug/gui/interface.cxx:702
+#: src/modplug/gui/modplug.glade:1642 src/pulse_audio/pulse_audio.c:738
+#: src/scrobbler/gtkstuff.c:45 src/sid/xmms-sid.glade:3066
 #: src/sid/xs_interface.c:1243
-#: src/modplug/gui/interface.cxx:702
-#: src/modplug/gui/modplug.glade:1642
-#: src/sid/xmms-sid.glade:3066
 msgid "OK"
 msgstr "OK"
 
@@ -183,14 +370,21 @@
 
 #: src/alarm/interface.c:213
 msgid ""
-"For safety reasons the \"quiet\" time must be at least 65 seconds longer than the fading time, it must also be more than 10 seconds.  This basically means that there is a bug in the code and until I find a way of really fixing it this message will appear :)\n"
+"For safety reasons the \"quiet\" time must be at least 65 seconds longer "
+"than the fading time, it must also be more than 10 seconds.  This basically "
+"means that there is a bug in the code and until I find a way of really "
+"fixing it this message will appear :)\n"
 "\n"
 "Your fading settings have NOT been saved\n"
 "\n"
 "--\n"
 "Adam"
 msgstr ""
-"Pour des raisons de sécurité, le temps de \"repos\" doit au moins durer 65 secondes de plus que le temps du fondu. Il doit aussi être supérieur à 10 secondes. Cela signifie simplement que le code du module comporte une erreur... Jusqu'à ce que je trouve un moyen de le corriger de manière définitive, ce message apparaîtra :)\n"
+"Pour des raisons de sécurité, le temps de \"repos\" doit au moins durer 65 "
+"secondes de plus que le temps du fondu. Il doit aussi être supérieur à 10 "
+"secondes. Cela signifie simplement que le code du module comporte une "
+"erreur... Jusqu'à ce que je trouve un moyen de le corriger de manière "
+"définitive, ce message apparaîtra :)\n"
 "\n"
 "Les préférences relatives au fondu n'ont pas été enregistrées.\n"
 "\n"
@@ -205,8 +399,7 @@
 msgid "Alarm Settings"
 msgstr "Préférences de 'Alarm'"
 
-#: src/alarm/interface.c:404
-#: src/alarm/interface.c:576
+#: src/alarm/interface.c:404 src/alarm/interface.c:576
 #: src/alarm/interface.c:948
 msgid "Time"
 msgstr "Heure"
@@ -235,15 +428,10 @@
 msgid "Choose the days for the alarm to come on"
 msgstr "Jours d'activation de l'alarme"
 
-#: src/alarm/interface.c:612
-#: src/alarm/interface.c:660
-#: src/alarm/interface.c:708
-#: src/alarm/interface.c:756
-#: src/alarm/interface.c:804
-#: src/alarm/interface.c:852
-#: src/alarm/interface.c:900
-#: src/OSS/configure.c:169
-#: src/OSS4/configure.c:138
+#: src/alarm/interface.c:612 src/alarm/interface.c:660
+#: src/alarm/interface.c:708 src/alarm/interface.c:756
+#: src/alarm/interface.c:804 src/alarm/interface.c:852
+#: src/alarm/interface.c:900 src/OSS4/configure.c:138 src/OSS/configure.c:169
 msgid "Default"
 msgstr "Défaut"
 
@@ -287,20 +475,15 @@
 msgid "Fading"
 msgstr "Fondu"
 
-#: src/alarm/interface.c:1087
-#: src/sid/xs_interface.c:908
-#: src/sid/xs_interface.c:962
+#: src/alarm/interface.c:1087 src/sid/xmms-sid.glade:2007
+#: src/sid/xmms-sid.glade:2178 src/sid/xmms-sid.glade:2676
+#: src/sid/xs_interface.c:908 src/sid/xs_interface.c:962
 #: src/sid/xs_interface.c:1122
-#: src/sid/xmms-sid.glade:2007
-#: src/sid/xmms-sid.glade:2178
-#: src/sid/xmms-sid.glade:2676
 msgid "seconds"
 msgstr "secondes"
 
-#: src/alarm/interface.c:1095
-#: src/alarm/interface.c:1211
-#: src/modplug/gui/interface.cxx:549
-#: src/modplug/gui/modplug.glade:1133
+#: src/alarm/interface.c:1095 src/alarm/interface.c:1211
+#: src/modplug/gui/interface.cxx:549 src/modplug/gui/modplug.glade:1133
 msgid "Volume"
 msgstr "Volume"
 
@@ -316,8 +499,7 @@
 msgid "Start at"
 msgstr "Début"
 
-#: src/alarm/interface.c:1158
-#: src/alarm/interface.c:1202
+#: src/alarm/interface.c:1158 src/alarm/interface.c:1202
 msgid "%"
 msgstr "%"
 
@@ -341,8 +523,7 @@
 msgid "Browse..."
 msgstr "Parcourir"
 
-#: src/alarm/interface.c:1295
-#: src/alarm/interface.c:1460
+#: src/alarm/interface.c:1295 src/alarm/interface.c:1460
 msgid "Reminder"
 msgstr "Pense-bête"
 
@@ -350,8 +531,7 @@
 msgid "Use reminder"
 msgstr "Utiliser le pense-bête"
 
-#: src/alarm/interface.c:1328
-#: src/sndstretch/sndstretch_xmms.c:377
+#: src/alarm/interface.c:1328 src/sndstretch/sndstretch_xmms.c:377
 msgid "Options"
 msgstr "Options"
 
@@ -473,43 +653,23 @@
 "Liste de lecture :\n"
 "\n"
 "lis une liste de lecture particulière (l'extension doit être '.m3u').\n"
-"Si aucune liste particulière n'est spécifiée, ce sont les titres de la liste active\n"
+"Si aucune liste particulière n'est spécifiée, ce sont les titres de la liste "
+"active\n"
 "du lecteur qui seront utilisés.\n"
-"L'adresse d'un flux distant 'mp3' ou 'ogg' peut également constituer une source.\n"
+"L'adresse d'un flux distant 'mp3' ou 'ogg' peut également constituer une "
+"source.\n"
 "\n"
 "\n"
 "Pense-bête :\n"
 "\n"
 "affiche un texte de rappel, lors de l'extinction de l'alarme\n"
-"(écrivez le message dans le champ prévu à cet effet, puis cochez l'option du pense-bête).\n"
+"(écrivez le message dans le champ prévu à cet effet, puis cochez l'option du "
+"pense-bête).\n"
 
 #: src/alarm/interface.c:1366
 msgid "Help"
 msgstr "Aide"
 
-#: src/alarm/interface.c:1398
-#: src/alsa/configure.c:389
-#: src/arts/configure.c:91
-#: src/audiocompress/audacious-glue.c:557
-#: src/cdaudio-ng/configure.c:232
-#: src/echo_plugin/gui.c:145
-#: src/jack/configure.c:148
-#: src/null/null.c:111
-#: src/sid/xs_interface.c:1250
-#: src/stereo_plugin/stereo.c:125
-#: src/sun/configure.c:567
-#: src/timidity/interface.c:230
-#: src/adplug/adplug-xmms.cc:275
-#: src/modplug/gui/interface.cxx:714
-#: src/musepack/libmpc.cxx:237
-#: src/musepack/libmpc.cxx:557
-#: src/wavpack/ui.cxx:280
-#: src/wavpack/ui.cxx:563
-#: src/modplug/gui/modplug.glade:1668
-#: src/sid/xmms-sid.glade:3080
-msgid "Cancel"
-msgstr "Annuler"
-
 #: src/alarm/interface.c:1468
 msgid "Your reminder for today is.."
 msgstr "Le pense-bête du jour est..."
@@ -518,61 +678,6 @@
 msgid "Thankyou"
 msgstr "Merci"
 
-#: src/alsa/configure.c:146
-msgid "Unknown soundcard"
-msgstr "Carte son inconnue"
-
-#: src/alsa/configure.c:201
-#, c-format
-msgid "Default PCM device (%s)"
-msgstr "Périphérique PCM par défaut (%s)"
-
-#: src/alsa/configure.c:260
-msgid "ALSA Driver configuration"
-msgstr "Configuration du pilote 'ALSA'"
-
-#: src/alsa/configure.c:274
-#: src/OSS/configure.c:217
-#: src/OSS4/configure.c:186
-#: src/sun/configure.c:183
-msgid "Audio device:"
-msgstr "Périphérique audio :"
-
-#: src/alsa/configure.c:288
-msgid "Mixer:"
-msgstr "Mélangeur audio :"
-
-#: src/alsa/configure.c:300
-msgid "Mixer card:"
-msgstr "Carte de mélange audio :"
-
-#: src/alsa/configure.c:313
-#: src/OSS/configure.c:260
-#: src/sun/configure.c:220
-msgid "Mixer device:"
-msgstr "Mélangeur audio :"
-
-#: src/alsa/configure.c:328
-msgid "Device settings"
-msgstr "Paramètres du périphérique"
-
-#: src/alsa/configure.c:334
-msgid "Soundcard:"
-msgstr "Carte son :"
-
-#: src/alsa/configure.c:347
-msgid "Buffer time (ms):"
-msgstr "Tampon (ms) :"
-
-#: src/alsa/configure.c:361
-msgid "Period time (ms):"
-msgstr "Période (ms) :"
-
-#: src/alsa/configure.c:376
-#: src/amidi-plug/i_configure-ap.c:287
-msgid "Advanced settings"
-msgstr "Paramètres avancés"
-
 #: src/alsa/about.c:30
 msgid "About ALSA Driver"
 msgstr "À propos du pilote 'ALSA'"
@@ -603,12 +708,14 @@
 "Ceci est une traduction non officielle de la \"GNU General Public License\"\n"
 "en français. Elle n'a pas été publiée par la \"Free Software Foundation\",\n"
 "et ne détermine pas les termes de distribution pour les logiciels qui\n"
-"utilisent la \"GNU GPL\" -- seul le texte anglais original de la \"GNU GPL\" en a\n"
+"utilisent la \"GNU GPL\" -- seul le texte anglais original de la \"GNU GPL\" "
+"en a\n"
 "le droit. Cependant, nous espérons que cette traduction aidera les\n"
 "francophones à mieux comprendre la \"GNU GPL\".\n"
 "\n"
 "Ce programme est un logiciel libre : vous pouvez le redistribuer et/ou le\n"
-"modifier selon les termes de la \"Licence Publique Générale GNU\" (GNU GPL),\n"
+"modifier selon les termes de la \"Licence Publique Générale GNU\" (GNU "
+"GPL),\n"
 "telle que publiée par la \"Free Software Foundation\", soit la version 2 de\n"
 "la Licence, soit (à votre convenance) toute version postérieure.\n"
 "\n"
@@ -626,21 +733,459 @@
 "\n"
 "Auteur : Matthieu Sozeau (mattam@altern.org)"
 
-#: src/amidi-plug/i_configure-timidity.c:39
-msgid "TIMIDITY BACKEND CONFIGURATION"
-msgstr "CONFIGURATION DU SYSTÈME DE SORTIE 'TIMIDITY'"
-
-#: src/amidi-plug/i_configure-timidity.c:64
-msgid "TiMidity Backend not loaded or not available"
-msgstr "Le système de sortie 'TiMidity' n'est pas chargé ou n'est pas disponible"
-
-#: src/amidi-plug/i_configure-timidity.c:83
+#: src/alsa/configure.c:146
+msgid "Unknown soundcard"
+msgstr "Carte son inconnue"
+
+#: src/alsa/configure.c:201
+#, c-format
+msgid "Default PCM device (%s)"
+msgstr "Périphérique PCM par défaut (%s)"
+
+#: src/alsa/configure.c:260
+msgid "ALSA Driver configuration"
+msgstr "Configuration du pilote 'ALSA'"
+
+#: src/alsa/configure.c:274 src/OSS4/configure.c:186 src/OSS/configure.c:217
+#: src/sun/configure.c:183
+msgid "Audio device:"
+msgstr "Périphérique audio :"
+
+#: src/alsa/configure.c:288
+msgid "Mixer:"
+msgstr "Mélangeur audio :"
+
+#: src/alsa/configure.c:300
+msgid "Mixer card:"
+msgstr "Carte de mélange audio :"
+
+#: src/alsa/configure.c:313 src/OSS/configure.c:260 src/sun/configure.c:220
+msgid "Mixer device:"
+msgstr "Mélangeur audio :"
+
+#: src/alsa/configure.c:328
+msgid "Device settings"
+msgstr "Paramètres du périphérique"
+
+#: src/alsa/configure.c:334
+msgid "Soundcard:"
+msgstr "Carte son :"
+
+#: src/alsa/configure.c:347
+msgid "Buffer time (ms):"
+msgstr "Tampon (ms) :"
+
+#: src/alsa/configure.c:361
+msgid "Period time (ms):"
+msgstr "Période (ms) :"
+
+#: src/alsa/configure.c:376 src/amidi-plug/i_configure-ap.c:287
+msgid "Advanced settings"
+msgstr "Paramètres avancés"
+
+#: src/amidi-plug/backend-alsa/b-alsa.c:35
+msgid "ALSA Backend "
+msgstr "ALSA "
+
+#: src/amidi-plug/backend-alsa/b-alsa.c:37
+msgid ""
+"This backend sends MIDI events to a group of user-chosen ALSA sequencer "
+"ports. The ALSA sequencer interface is very versatile, it can provide ports "
+"for audio cards hardware synthesizers (i.e. emu10k1) but also for software "
+"synths, external devices, etc.\n"
+"This backend does not produce audio, MIDI events are handled directly from "
+"devices/programs behind the ALSA ports; in example, MIDI events sent to the "
+"hardware synth will be directly played.\n"
+"Backend written by Giacomo Lozito."
+msgstr ""
+"Ce système envoie les événements MIDI à l'ensemble des ports du séquenceur "
+"'ALSA' que l'utilisateur a spécifié. L'interface du séquenceur 'ALSA' offre "
+"des possibilités variées : elle peut fournir des ports aux synthétiseurs "
+"matériels des cartes sons ('emu10k1', par exemple), mais aussi aux "
+"synthétiseurs logiciels, aux périphériques externes, etc.\n"
+"Ce système de sortie ne produit pas de flux audio : les événements MIDI sont "
+"gérés directement par les périphériques et les applications associés aux "
+"ports 'ALSA'. Par exemple, les événements MIDI envoyés au synthétiseur "
+"matériel seront directement interprétés.\n"
+"\n"
+"Auteur : Giacomo Lozito."
+
+#: src/amidi-plug/backend-dummy/b-dummy.c:35
+msgid "Dummy Backend "
+msgstr "Dummy "
+
+#: src/amidi-plug/backend-dummy/b-dummy.c:37
 msgid ""
-"<span size=\"smaller\">TiMidity\n"
+"This backend does not produce audio at all. It is mostly useful for analysis "
+"and testing purposes, as it can log all MIDI events to standard output, "
+"standard error or file.\n"
+"Backend written by Giacomo Lozito."
+msgstr ""
+"Ce système de sortie ne produit absolument pas de flux audio. Il est "
+"principalement utile à des fins d'analyses et d'essais, parce qu'il peut "
+"consigner tous les événements MIDI dans la sortie standard, dans la sortie "
+"d'erreurs ou dans un fichier.\n"
+"\n"
+"Auteur : Giacomo Lozito."
+
+#: src/amidi-plug/backend-fluidsynth/b-fluidsynth.c:35
+msgid "FluidSynth Backend "
+msgstr "FluidSynth "
+
+#: src/amidi-plug/backend-fluidsynth/b-fluidsynth.c:37
+msgid ""
+"This backend produces audio by sending MIDI events to FluidSynth, a real-"
+"time software synthesizer based on the SoundFont2 specification (www."
+"fluidsynth.org).\n"
+"Produced audio can be manipulated via player effect plugins and is processed "
+"by chosen ouput plugin.\n"
+"Backend written by Giacomo Lozito."
+msgstr ""
+"Ce système de sortie produit des flux audio en envoyant les événements MIDI "
+"à 'FluidSynth', un synthétiseur logiciel en temps réel sur les "
+"caractéristiques de 'SoundFont2' (www.fluidsynth.org).\n"
+"Les flux générés peuvent être manipulés grâce aux modules d'effets du "
+"lecteur et sont traités par le module de sortie sélectionné.\n"
+"\n"
+"Auteur : Giacomo Lozito."
+
+#: src/amidi-plug/i_configure-alsa.c:221
+msgid "ALSA BACKEND CONFIGURATION"
+msgstr "CONFIGURATION DU SYSTÈME DE SORTIE 'ALSA'"
+
+#: src/amidi-plug/i_configure-alsa.c:326
+msgid "Port"
+msgstr "Port"
+
+#: src/amidi-plug/i_configure-alsa.c:328
+msgid "Client name"
+msgstr "Nom du client"
+
+#: src/amidi-plug/i_configure-alsa.c:330
+msgid "Port name"
+msgstr "Nom du port"
+
+#: src/amidi-plug/i_configure-alsa.c:341
+msgid "ALSA output ports"
+msgstr "Ports de sortie 'ALSA'"
+
+#: src/amidi-plug/i_configure-alsa.c:394
+msgid "Soundcard: "
+msgstr "Périphérique audio : "
+
+#: src/amidi-plug/i_configure-alsa.c:396
+msgid "Mixer control: "
+msgstr "Canal du mélangeur audio : "
+
+#: src/amidi-plug/i_configure-alsa.c:408
+msgid "Mixer settings"
+msgstr "Paramètres du mélangeur"
+
+#: src/amidi-plug/i_configure-alsa.c:421
+msgid ""
+"* Select ALSA output ports *\n"
+"MIDI events will be sent to the ports selected here. In example, if your "
+"audio card provides a hardware synth and you want to play MIDI with it, "
+"you'll probably want to select the wavetable synthesizer ports."
+msgstr ""
+"* Choix des ports de sortie 'ALSA' *\n"
+"Les événements MIDI seront envoyés aux ports spécifiés. Par exemple, si "
+"votre carte son dispose d'un synthétiseur matériel et que vous désirez "
+"écouter les fichiers MIDI avec celui-ci, vous voudrez probabement choisir "
+"les ports du synthétiseur à tables d'ondes."
+
+#: src/amidi-plug/i_configure-alsa.c:426
+msgid ""
+"* Select ALSA mixer card *\n"
+"The ALSA backend outputs directly through ALSA, it doesn't use effect and "
+"ouput plugins from the player. During playback, the player volumeslider will "
+"manipulate the mixer control you select here. If you're using wavetable "
+"synthesizer ports, you'll probably want to select the Synth control here."
+msgstr ""
+"* Choix du périphérique audio 'ALSA' *\n"
+"Le système de sortie 'ALSA' émet directement via 'ALSA' : il n'utilise pas "
+"les modules d'effets du lecteur, ni les modules de sortie. Lors de la "
+"lecture, le curseur du volume du lecteur manipulera le contrôleur du "
+"mélangeur audio que vous avez sélectionné. Si vous utilisez les ports d'un "
+"synthétiseur à tables d'ondes, vous voudrez probabement choisir le "
+"contrôleur du synthétiseur."
+
+#: src/amidi-plug/i_configure-alsa.c:433
+msgid ""
+"* Select ALSA mixer control *\n"
+"The ALSA backend outputs directly through ALSA, it doesn't use effect and "
+"ouput plugins from the player. During playback, the player volume slider "
+"will manipulate the mixer control you select here. If you're using wavetable "
+"synthesizer ports, you'll probably want to select the Synth control here."
+msgstr ""
+"* Choix du canal du mélangeur audio 'ALSA' *\n"
+"Le système de sortie 'ALSA' émet directement via 'ALSA' : il n'utilise pas "
+"les modules d'effets du lecteur, ni les modules de sortie. Lors de la "
+"lecture, le curseur du volume du lecteur manipulera le canal du mélangeur "
+"audio que vous avez sélectionné. Si vous utilisez les ports d'un "
+"synthétiseur à tables d'ondes, vous voudrez probabement choisir le canal du "
+"synthétiseur."
+
+#: src/amidi-plug/i_configure-alsa.c:444
+msgid "ALSA Backend not loaded or not available"
+msgstr "Le système de sortie 'ALSA' n'est pas chargé ou n'est pas disponible"
+
+#: src/amidi-plug/i_configure-alsa.c:463
+msgid ""
+"<span size=\"smaller\">ALSA\n"
 "backend</span>"
 msgstr ""
 "<span size=\"smaller\">Sortie\n"
-"'TiMidity'</span>"
+"'ALSA'</span>"
+
+#: src/amidi-plug/i_configure-ap.c:56
+msgid "AMIDI-Plug - backend information"
+msgstr "Informations sur le système de sortie"
+
+#: src/amidi-plug/i_configure-ap.c:194
+msgid "AMIDI-PLUG PREFERENCES"
+msgstr "PRÉFÉRENCES DE 'AMIDI-PLUG'"
+
+#: src/amidi-plug/i_configure-ap.c:221
+msgid "Backend selection"
+msgstr "Choix du système de sortie"
+
+#: src/amidi-plug/i_configure-ap.c:225
+msgid "Available backends"
+msgstr "Systèmes disponibles :"
+
+#: src/amidi-plug/i_configure-ap.c:255
+msgid "Playback settings"
+msgstr "Paramètres de lecture"
+
+#: src/amidi-plug/i_configure-ap.c:260
+msgid "Transpose: "
+msgstr "Transposition : "
+
+#: src/amidi-plug/i_configure-ap.c:269
+msgid "Drum shift: "
+msgstr "Décalage des percussions :"
+
+#: src/amidi-plug/i_configure-ap.c:291
+msgid "pre-calculate length of MIDI files in playlist"
+msgstr "Précalculer la durée des fichiers MIDI dans la liste de lecture"
+
+#: src/amidi-plug/i_configure-ap.c:296
+msgid "extract comments from MIDI file (if available)"
+msgstr "Extraire les commentaires des fichiers MIDI (s'ils sont disponibles)"
+
+#: src/amidi-plug/i_configure-ap.c:301
+msgid "extract lyrics from MIDI file (if available)"
+msgstr "Extraire les paroles des fichiers MIDI (si elles sont disponible)"
+
+#: src/amidi-plug/i_configure-ap.c:320
+msgid ""
+"* Backend selection *\n"
+"AMIDI-Plug works with backends, in a modular fashion; here you should select "
+"your backend; that is, the way MIDI events are going to be handled and "
+"played.\n"
+"If you have a hardware synthesizer on your audio card, and ALSA supports it, "
+"you'll want to use the ALSA backend. It can also be used with anything that "
+"provides an interface to the ALSA sequencer, including software synths or "
+"external devices.\n"
+"If you want to rely on a software synthesizer and/or want to pipe audio into "
+"effect and output plugins of the player you'll want to use the good "
+"FluidSynth backend.\n"
+"Press the info button to read specific information about each backend."
+msgstr ""
+"* Choix du système de sortie *\n"
+"'AMIDI-Plug' utilise des systèmes de sortie, de manière modulaire. C'est par "
+"le système de sortie que vous aurez choisi que seront gérés et restitués les "
+"événements MIDI. Si votre périphérique audio dispose d'un synthétiseur "
+"matériel supporté par 'ALSA', vous voudrez utiliser le système de sortie "
+"'ALSA'. Celui-ci peut aussi être utilisé par tout ce qui peut offrir une "
+"interface au séquenceur 'ALSA' (les synthétiseurs logiciels ou les "
+"périphériques externes, notamment).\n"
+" Si vous désirez dépendre d'un synthétiseur logiciel et/ou si vous voulez "
+"rediriger le flux audio vers les modules de sortie du lecteur, vous pourrez "
+"utiliser le système de sortie 'FluidSynth'. N'hésitez pas à activer le "
+"bouton d'informations, afin d'obtenir des renseignements spécifiques à "
+"chaque système de sortie."
+
+#: src/amidi-plug/i_configure-ap.c:331
+msgid ""
+"* Transpose function *\n"
+"This option allows you to play the midi file transposed in a different key, "
+"by shifting of the desired number of semitones all its notes (excepting "
+"those on midi channel 10, reserved for percussions). Expecially useful if "
+"you wish to sing or play along with another instrument."
+msgstr ""
+"* Fonction de transposition *\n"
+"Cette option permet de restituer le fichier MIDI alors transposé dans une "
+"tonalité différente, en décalant du nombre désiré de demi-tons toutes les "
+"les notes du morceau (à l'exception de celles du canal MIDI 10, réservé aux "
+"percussions). Cette fonction est particulièrement utile, si vous désirez "
+"chanter ou jouer accompagné d'un autre instrument."
+
+#: src/amidi-plug/i_configure-ap.c:337
+msgid ""
+"* Drumshift function *\n"
+"This option allows you to shift notes on midi channel 10 (the standard "
+"percussions channel) of the desired number of semitones. This results in "
+"different drumset and percussions being used during midi playback, so if you "
+"wish to enhance (or reduce, or alter) percussion sounds, try to play with "
+"this value."
+msgstr ""
+"* Fonction de décalage des percussions *\n"
+"Cette option permet de décaler toutes les notes du canal MIDI 10 (le canal "
+"standard des percussions) du nombre désiré de demi-tons. Cela se traduit par "
+"l'utilisation d'un ensemble de batteries et de percussions différent, lors "
+"de la lecture. Donc, si vous désirez amémiorer (ou réduire, ou bien encore "
+"altérer) les percussions, n'hésitez pas à essayer différentes valeurs."
+
+#: src/amidi-plug/i_configure-ap.c:344
+msgid ""
+"* Pre-calculate MIDI length *\n"
+"If this option is enabled, AMIDI-Plug will calculate the MIDI file length as "
+"soon as the player requests it, instead of doing that only when the MIDI "
+"file is being played. In example, MIDI length will be calculated straight "
+"after adding MIDI files in a playlist. Disable this option if you want "
+"faster playlist loading (when a lot of MIDI files are added), enable it to "
+"display more information in the playlist straight after loading."
+msgstr ""
+"* Pré-calculer la durée des fichiers MIDI *\n"
+"Si cette option est activée, 'AMIDI-Plug' déterminera la durée du fichier "
+"MIDI dès que le lecteur le demandera, au lieu le faire seulement lorsque le "
+"morceau est lu. Par exemple, la durée des fichiers MIDI sera calculée "
+"immédiatement après l'ajout des titres dans la liste de lecture. Désactivez "
+"cette option, si vous voulez un chargement plus rapide de la liste de "
+"lecture (lorsque de nombreux fichiers MIDI sont ajoutés) ; activez cette "
+"option pour que s'affichent plus d'informations dans la liste de lecture, "
+"directement après le chargement des fichiers."
+
+#: src/amidi-plug/i_configure-ap.c:353
+msgid ""
+"* Extract comments from MIDI files *\n"
+"Some MIDI files contain text comments (author, copyright, instrument notes, "
+"etc.). If this option is enabled, AMIDI-Plug will extract and display "
+"comments (if available) in the file information dialog."
+msgstr ""
+"* Extraire les commentaires des fichiers MIDI *\n"
+"Certains fichiers MIDI contiennent des commentaires (auteur, droits "
+"d'utilisation, notes relatives aux instruments, etc.). Si cette option est "
+"activée, 'AMIDI-Plug' extraira et afficher ces commentaires (s'ils sont "
+"disponibles) dans la fenêtre d'informations sur le fichier."
+
+#: src/amidi-plug/i_configure-ap.c:358
+msgid ""
+"* Extract lyrics from MIDI files *\n"
+"Some MIDI files contain song lyrics. If this option is enabled, AMIDI-Plug "
+"will extract and display song lyrics (if available) in the file information "
+"dialog."
+msgstr ""
+"* Extraire les paroles des fichiers MIDI *\n"
+"Certains fichiers MIDI contiennent les paroles relatives au morceau joué. Si "
+"cette option est activée, 'AMIDI-Plug' extraira et affichera les paroles (si "
+"elles sont disponibles) dans la fenêtre d'informations sur le fichier."
+
+#: src/amidi-plug/i_configure-ap.c:375
+msgid ""
+"<span size=\"smaller\">AMIDI\n"
+"Plug</span>"
+msgstr ""
+"<span size=\"smaller\">AMIDI\n"
+"Plug</span>"
+
+#: src/amidi-plug/i_configure.c:75
+msgid "AMIDI-Plug - select file"
+msgstr "'AMIDI-Plug' - choix du fichier"
+
+#: src/amidi-plug/i_configure.c:122
+msgid "AMIDI-Plug - configuration"
+msgstr "Configuration de 'AMIDI-Plug'"
+
+#: src/amidi-plug/i_configure.c:241
+msgid "AMIDI-Plug message"
+msgstr "Message de 'AMIDI-Plug'"
+
+#: src/amidi-plug/i_configure.c:242
+msgid "Please stop the player before changing AMIDI-Plug settings."
+msgstr "Veuillez arrêter le lecture avant de modifier les paramètres."
+
+#: src/amidi-plug/i_configure-dummy.c:137
+msgid "DUMMY BACKEND CONFIGURATION"
+msgstr "CONFIGURATION DU SYSTÈME DE SORTIE 'DUMMY'"
+
+#: src/amidi-plug/i_configure-dummy.c:173
+msgid "MIDI logger settings"
+msgstr "Paramètres du journal des événements MIDI"
+
+#: src/amidi-plug/i_configure-dummy.c:181
+msgid "Do not log anything"
+msgstr "Ne rien écrire dans le journal"
+
+#: src/amidi-plug/i_configure-dummy.c:185
+msgid "Log MIDI events to standard output"
+msgstr "Consigner les événements MIDI dans la sortie standard"
+
+#: src/amidi-plug/i_configure-dummy.c:189
+msgid "Log MIDI events to standard error"
+msgstr "Consigner les événements MIDI dans la sortie d'erreur standard"
+
+#: src/amidi-plug/i_configure-dummy.c:193
+msgid "Log MIDI events to file"
+msgstr "Consigner les événements MIDI dans un fichier"
+
+#: src/amidi-plug/i_configure-dummy.c:202
+msgid "Logfile settings"
+msgstr "Paramètres du fichier du journal"
+
+#: src/amidi-plug/i_configure-dummy.c:209
+msgid "Use a single file to log everything (rewrite)"
+msgstr ""
+"Utiliser un fichier unique pour tout consigner (remplacement du contenu "
+"existant)"
+
+#: src/amidi-plug/i_configure-dummy.c:213
+msgid "Use a single file to log everything (append)"
+msgstr ""
+"Utiliser un fichier unique pour tout consigner (ajout au contenu existant)"
+
+#: src/amidi-plug/i_configure-dummy.c:217
+msgid "Use a different logfile for each MIDI file"
+msgstr "Utiliser un fichier journal par fichier MIDI"
+
+#: src/amidi-plug/i_configure-dummy.c:223
+msgid "» Log dir:"
+msgstr "» Emplacement du journal :"
+
+#: src/amidi-plug/i_configure-dummy.c:229
+#: src/amidi-plug/i_configure-dummy.c:241
+msgid "browse"
+msgstr "Parcourir"
+
+#: src/amidi-plug/i_configure-dummy.c:235
+msgid "» Log file:"
+msgstr "» Fichier du journal :"
+
+#: src/amidi-plug/i_configure-dummy.c:267
+msgid "Playback speed"
+msgstr "Vitesse de lecture"
+
+#: src/amidi-plug/i_configure-dummy.c:272
+msgid "Play at normal speed"
+msgstr "Lire à une vitesse normale"
+
+#: src/amidi-plug/i_configure-dummy.c:275
+msgid "Play as fast as possible"
+msgstr "Lire le plus rapidement possible"
+
+#: src/amidi-plug/i_configure-dummy.c:329
+msgid "Dummy Backend not loaded or not available"
+msgstr "Le système de sortie 'Dummy' n'est pas chargé ou n'est pas disponible"
+
+#: src/amidi-plug/i_configure-dummy.c:348
+msgid ""
+"<span size=\"smaller\">Dummy\n"
+"backend</span>"
+msgstr ""
+"<span size=\"smaller\">Sortie\n"
+"'Dummy'</span>"
 
 #: src/amidi-plug/i_configure-fluidsynth.c:83
 msgid "AMIDI-Plug - select SoundFont file"
@@ -654,11 +1199,6 @@
 msgid "SoundFont settings"
 msgstr "Paramètres de la banque de sons 'SoundFont'"
 
-#: src/amidi-plug/i_configure-fluidsynth.c:448
-#: src/adplug/adplug-xmms.cc:555
-msgid "Filename"
-msgstr "Nom du fichier"
-
 #: src/amidi-plug/i_configure-fluidsynth.c:452
 msgid "Size (bytes)"
 msgstr "Taille (bytes)"
@@ -764,60 +1304,119 @@
 #: src/amidi-plug/i_configure-fluidsynth.c:807
 msgid ""
 "* Select SoundFont files *\n"
-"In order to play MIDI with FluidSynth, you need to specify at least one valid SoundFont file here (use absolute paths). The loading order is from the top (first) to the bottom (last)."
+"In order to play MIDI with FluidSynth, you need to specify at least one "
+"valid SoundFont file here (use absolute paths). The loading order is from "
+"the top (first) to the bottom (last)."
 msgstr ""
 "* Sélectionner les fichier 'SoundFont' *\n"
-"Afin de pouvoir écouter des fichiers MIDI avec 'FluidSynth', vous devez spécifier au moins un fichier 'SoundFont' valide (veillez à utiliser des chemins absolus). Le chargement s'opère, par ordre, du haut (le premier fichier) vers le bas (le dernier fichier)."
+"Afin de pouvoir écouter des fichiers MIDI avec 'FluidSynth', vous devez "
+"spécifier au moins un fichier 'SoundFont' valide (veillez à utiliser des "
+"chemins absolus). Le chargement s'opère, par ordre, du haut (le premier "
+"fichier) vers le bas (le dernier fichier)."
 
 #: src/amidi-plug/i_configure-fluidsynth.c:812
 msgid ""
 "* Load SoundFont on player start *\n"
-"Depending on your system speed, SoundFont loading in FluidSynth will require up to a few seconds. This is a one-time task (the soundfont will stay loaded until it is changed or the backend is unloaded) that can be done at player start, or before the first MIDI file is played (the latter is a better choice if you don't use your player to listen MIDI files only)."
+"Depending on your system speed, SoundFont loading in FluidSynth will require "
+"up to a few seconds. This is a one-time task (the soundfont will stay loaded "
+"until it is changed or the backend is unloaded) that can be done at player "
+"start, or before the first MIDI file is played (the latter is a better "
+"choice if you don't use your player to listen MIDI files only)."
 msgstr ""
 "* Charger la banque de sons au démarrage du lecteur *\n"
-"En fonction de la vitesse de votre système, le chargement du fichier 'SoundFont' dans 'FluidSynth' nécessitera quelques secondes. Cette opération, qui ne sera exécutée qu'une fois (la banque de sons restera en mémoire, jusqu'à ce qu'elle soit modifiée ou que le système de sortie ne soit supprimé de la mémoire), peut être accomplie au démarrage du lecteur, ou avant que ne soit lu le premier fichier MIDI (la seconde proposition constitue un meilleur choix, si vous n'utilisez pas le lecteur pour écouter des fichiers MIDI uniquement)."
+"En fonction de la vitesse de votre système, le chargement du fichier "
+"'SoundFont' dans 'FluidSynth' nécessitera quelques secondes. Cette "
+"opération, qui ne sera exécutée qu'une fois (la banque de sons restera en "
+"mémoire, jusqu'à ce qu'elle soit modifiée ou que le système de sortie ne "
+"soit supprimé de la mémoire), peut être accomplie au démarrage du lecteur, "
+"ou avant que ne soit lu le premier fichier MIDI (la seconde proposition "
+"constitue un meilleur choix, si vous n'utilisez pas le lecteur pour écouter "
+"des fichiers MIDI uniquement)."
 
 #: src/amidi-plug/i_configure-fluidsynth.c:820
 msgid ""
 "* Load SoundFont on first midifile play *\n"
-"Depending on your system speed, SoundFont loading in FluidSynth will require up to a few seconds. This is a one-time task (the soundfont will stay loaded until it is changed or the backend is unloaded) that can be done at player start, or before the first MIDI file is played (the latter is a better choice if you don't use your player to listen MIDI files only)."
+"Depending on your system speed, SoundFont loading in FluidSynth will require "
+"up to a few seconds. This is a one-time task (the soundfont will stay loaded "
+"until it is changed or the backend is unloaded) that can be done at player "
+"start, or before the first MIDI file is played (the latter is a better "
+"choice if you don't use your player to listen MIDI files only)."
 msgstr ""
 "* Charger la banque de sons à la lecture du premier fichier MIDI *\n"
-"En fonction de la vitesse de votre système, le chargement du fichier 'SoundFont' dans 'FluidSynth' nécessitera quelques secondes. Cette opération, qui ne sera exécutée qu'une fois (la banque de sons restera en mémoire, jusqu'à ce qu'elle soit modifiée ou que le système de sortie ne soit supprimé de la mémoire), peut être accomplie au démarrage du lecteur, ou avant que ne soit lu le premier fichier MIDI (la seconde proposition constitue un meilleur choix, si vous n'utilisez pas le lecteur pour écouter des fichiers MIDI uniquement)."
+"En fonction de la vitesse de votre système, le chargement du fichier "
+"'SoundFont' dans 'FluidSynth' nécessitera quelques secondes. Cette "
+"opération, qui ne sera exécutée qu'une fois (la banque de sons restera en "
+"mémoire, jusqu'à ce qu'elle soit modifiée ou que le système de sortie ne "
+"soit supprimé de la mémoire), peut être accomplie au démarrage du lecteur, "
+"ou avant que ne soit lu le premier fichier MIDI (la seconde proposition "
+"constitue un meilleur choix, si vous n'utilisez pas le lecteur pour écouter "
+"des fichiers MIDI uniquement)."
 
 #: src/amidi-plug/i_configure-fluidsynth.c:828
 msgid ""
 "* Synthesizer gain *\n"
-"From FluidSynth docs: the gain is applied to the final or master output of the synthesizer; it is set to a low value by default to avoid the saturation of the output when random MIDI files are played."
+"From FluidSynth docs: the gain is applied to the final or master output of "
+"the synthesizer; it is set to a low value by default to avoid the saturation "
+"of the output when random MIDI files are played."
 msgstr ""
 "* Gain du synthétiseur *\n"
-"Selon la documentation de 'FluidSynth', le gain est appliqué à la sortie finale ou principale du synthétiseur. Par défaut, il est réglé sur une valeur basse, afin d'éviter la saturation de la sortie, lorsque des fichiers MIDI sont lus de manière aléatoire."
+"Selon la documentation de 'FluidSynth', le gain est appliqué à la sortie "
+"finale ou principale du synthétiseur. Par défaut, il est réglé sur une "
+"valeur basse, afin d'éviter la saturation de la sortie, lorsque des fichiers "
+"MIDI sont lus de manière aléatoire."
 
 #: src/amidi-plug/i_configure-fluidsynth.c:833
 msgid ""
 "* Synthesizer polyphony *\n"
-"From FluidSynth docs: the polyphony defines how many voices can be played in parallel; the number of voices is not necessarily equivalent to the number of notes played simultaneously; indeed, when a note is struck on a specific MIDI channel, the preset on that channel may create several voices, for example, one for the left audio channel and one for the right audio channels; the number of voices activated depends on the number of instrument zones that fall in the correspond to the velocity and key of the played note."
+"From FluidSynth docs: the polyphony defines how many voices can be played in "
+"parallel; the number of voices is not necessarily equivalent to the number "
+"of notes played simultaneously; indeed, when a note is struck on a specific "
+"MIDI channel, the preset on that channel may create several voices, for "
+"example, one for the left audio channel and one for the right audio "
+"channels; the number of voices activated depends on the number of instrument "
+"zones that fall in the correspond to the velocity and key of the played note."
 msgstr ""
 "* Polyphonie du synthétiseur *\n"
-"Selon la documentation de 'FluidSynth', la polyphonie définit le nombre de voix qui peuvent être jouées en parallèle ; le nombre de voix ne correspond pas nécessairement au nombre de notes jouées simultanément. En effet, lorsqu'une note est envoyée à un canal MIDI spécifique, le préréglage de ce canal peut créer plusieurs voix (par exemple, une voix pour le canal audio gauche et une autre pour le canal audio droit). Le nombre de voix activées dépend du nombre de pistes d'instruments relatives à la vélocité et à la tonalité de la note jouée."
+"Selon la documentation de 'FluidSynth', la polyphonie définit le nombre de "
+"voix qui peuvent être jouées en parallèle ; le nombre de voix ne correspond "
+"pas nécessairement au nombre de notes jouées simultanément. En effet, "
+"lorsqu'une note est envoyée à un canal MIDI spécifique, le préréglage de ce "
+"canal peut créer plusieurs voix (par exemple, une voix pour le canal audio "
+"gauche et une autre pour le canal audio droit). Le nombre de voix activées "
+"dépend du nombre de pistes d'instruments relatives à la vélocité et à la "
+"tonalité de la note jouée."
 
 #: src/amidi-plug/i_configure-fluidsynth.c:843
 #: src/amidi-plug/i_configure-fluidsynth.c:849
 msgid ""
 "* Synthesizer reverb *\n"
-"From FluidSynth docs: when set to \"yes\" the reverb effects module is activated; note that when the reverb module is active, the amount of signal sent to the reverb module depends on the \"reverb send\" generator defined in the SoundFont."
+"From FluidSynth docs: when set to \"yes\" the reverb effects module is "
+"activated; note that when the reverb module is active, the amount of signal "
+"sent to the reverb module depends on the \"reverb send\" generator defined "
+"in the SoundFont."
 msgstr ""
 "* Réverbération du synthétiseur *\n"
-"Selon la documentation de 'FluidSynth', lorsque l'option \"Oui\" est cochée, le module d'effet de réverbération est activé. Veuillez noter que, lorsque le module de réverbération est actif, la quantité de signaux envoyés au module dépend du générateur d'\"envoi de réverbération\" défini dans le fichier 'SoundFont'."
+"Selon la documentation de 'FluidSynth', lorsque l'option \"Oui\" est cochée, "
+"le module d'effet de réverbération est activé. Veuillez noter que, lorsque "
+"le module de réverbération est actif, la quantité de signaux envoyés au "
+"module dépend du générateur d'\"envoi de réverbération\" défini dans le "
+"fichier 'SoundFont'."
 
 #: src/amidi-plug/i_configure-fluidsynth.c:855
 #: src/amidi-plug/i_configure-fluidsynth.c:861
 msgid ""
 "* Synthesizer chorus *\n"
-"From FluidSynth docs: when set to \"yes\" the chorus effects module is activated; note that when the chorus module is active, the amount of signal sent to the chorus module depends on the \"chorus send\" generator defined in the SoundFont."
+"From FluidSynth docs: when set to \"yes\" the chorus effects module is "
+"activated; note that when the chorus module is active, the amount of signal "
+"sent to the chorus module depends on the \"chorus send\" generator defined "
+"in the SoundFont."
 msgstr ""
 "* Effet de choeur du synthétiseur *\n"
-"Selon la documentation de 'FluidSynth', lorsque l'option \"Oui\" est cochée, le module d'effet de choeur est activé. Veuillez noter que, lorsque le module d'effet de choeur est actif, la quantité de signaux envoyés au module dépend du générateur d'\"envoi d'effet de choeur\" défini dans le fichier 'SoundFont'."
+"Selon la documentation de 'FluidSynth', lorsque l'option \"Oui\" est cochée, "
+"le module d'effet de choeur est activé. Veuillez noter que, lorsque le "
+"module d'effet de choeur est actif, la quantité de signaux envoyés au module "
+"dépend du générateur d'\"envoi d'effet de choeur\" défini dans le fichier "
+"'SoundFont'."
 
 #: src/amidi-plug/i_configure-fluidsynth.c:867
 #: src/amidi-plug/i_configure-fluidsynth.c:873
@@ -825,12 +1424,18 @@
 #: src/amidi-plug/i_configure-fluidsynth.c:885
 msgid ""
 "* Synthesizer samplerate *\n"
-"The sample rate of the audio generated by the synthesizer. You can also specify a custom value in the interval 22050Hz-96000Hz.\n"
-"NOTE: the default buffer parameters are tuned for 44100Hz; changing the sample rate may require buffer params tuning to obtain good sound quality."
+"The sample rate of the audio generated by the synthesizer. You can also "
+"specify a custom value in the interval 22050Hz-96000Hz.\n"
+"NOTE: the default buffer parameters are tuned for 44100Hz; changing the "
+"sample rate may require buffer params tuning to obtain good sound quality."
 msgstr ""
 "* Taux d'échantillonnage du synthétiseur *\n"
-"Cette option définit le taux d'échantillonnage du flux audio produit par le synthétiseur. Vous pouvez aussi spécifier une valeur personnalisée, située dans l'intervalle 22050 - 96000 Hz.\n"
-"Veuillez noter que les paramètres du tampon par défaut sont optimisées pour 44100 Hz : modifier le taux d'échantillonnage peut nécessiter un réglage des paramètres du tampon, afin d'obtenir une bonne qualité audio."
+"Cette option définit le taux d'échantillonnage du flux audio produit par le "
+"synthétiseur. Vous pouvez aussi spécifier une valeur personnalisée, située "
+"dans l'intervalle 22050 - 96000 Hz.\n"
+"Veuillez noter que les paramètres du tampon par défaut sont optimisées pour "
+"44100 Hz : modifier le taux d'échantillonnage peut nécessiter un réglage des "
+"paramètres du tampon, afin d'obtenir une bonne qualité audio."
 
 #: src/amidi-plug/i_configure-fluidsynth.c:891
 msgid ""
@@ -843,30 +1448,52 @@
 #: src/amidi-plug/i_configure-fluidsynth.c:894
 msgid ""
 "* FluidSynth backend buffer *\n"
-"If you notice skips or slowness during song playback and your system is not performing any cpu-intensive task (except FluidSynth itself), you may want to adjust the buffer parameters. Try to move the \"handy buffer tuner\" some steps to the right until playback is fluid again."
+"If you notice skips or slowness during song playback and your system is not "
+"performing any cpu-intensive task (except FluidSynth itself), you may want "
+"to adjust the buffer parameters. Try to move the \"handy buffer tuner\" some "
+"steps to the right until playback is fluid again."
 msgstr ""
 "* Tampon du système de sortie 'FluidSynth' *\n"
-"Si vous constatez des coupures ou des ralentissements lors de la lecture, alors que votre système n'exécute pas de tâche qui pourrait utiliser les ressources du processeur de manière intensive (hormis 'FluidSynth'), vous pouvez ajuster les paramètres du tampon. Essayez de déplacer l' \"ajusteur de tampon pratique\" vers la droite, de manière progressive, jusqu'à ce que la lecture soit à nouveau fluide."
+"Si vous constatez des coupures ou des ralentissements lors de la lecture, "
+"alors que votre système n'exécute pas de tâche qui pourrait utiliser les "
+"ressources du processeur de manière intensive (hormis 'FluidSynth'), vous "
+"pouvez ajuster les paramètres du tampon. Essayez de déplacer l' \"ajusteur "
+"de tampon pratique\" vers la droite, de manière progressive, jusqu'à ce que "
+"la lecture soit à nouveau fluide."
 
 #: src/amidi-plug/i_configure-fluidsynth.c:900
 #: src/amidi-plug/i_configure-fluidsynth.c:911
 #: src/amidi-plug/i_configure-fluidsynth.c:922
 msgid ""
 "* FluidSynth backend buffer *\n"
-"It is a good idea to make buffer adjustments with the \"handy buffer tuner\" before resorting to manual editing of buffer parameters.\n"
-"However, if you want to fine-tune something and want to know what you're doing, you can understand how these parameters work by reading the backend code (b-fluidsynth.c). In short words, every amount of time (proportional to buffer_SIZE and sample rate), right before gathering samples, the buffer is resized as follows:\n"
+"It is a good idea to make buffer adjustments with the \"handy buffer tuner\" "
+"before resorting to manual editing of buffer parameters.\n"
+"However, if you want to fine-tune something and want to know what you're "
+"doing, you can understand how these parameters work by reading the backend "
+"code (b-fluidsynth.c). In short words, every amount of time (proportional to "
+"buffer_SIZE and sample rate), right before gathering samples, the buffer is "
+"resized as follows:\n"
 "buffer_SIZE + buffer_MARGIN + extramargin\n"
-"where extramargin is a value computed as number_of_seconds_of_playback / margin_INCREMENT ."
+"where extramargin is a value computed as number_of_seconds_of_playback / "
+"margin_INCREMENT ."
 msgstr ""
 "* Tampon du système de sortie 'FluidSynth' *\n"
-"Il est judicieux de procéder à des réglages avec l'\"ajusteur de tampon pratique\" avant de procéder à l'édition manuelle des paramètres du tampon.\n"
-"Toutefois, si vous désirez obtenir des réglages plus précis et savoir ce que vous faites, vous pouvez comprendre comment fonctionnent ces paramètres en consultant le code du système de sortie ('b-fluidsynth.c'). En résumé, à chaque unité de temps, directement avant l'assemblage des échantillons, la taille du tampon est redéfinie de cette manière :\n"
-"buffer_SIZE (taille du tampon) + buffer_MARGIN (marge du tampon) + marge supplémentaire\n"
-"(la marge supplémentaire est la valeur calculée suivant l'opération suivante : nombre de secondes de lecture / différentiel de la marge"
+"Il est judicieux de procéder à des réglages avec l'\"ajusteur de tampon "
+"pratique\" avant de procéder à l'édition manuelle des paramètres du tampon.\n"
+"Toutefois, si vous désirez obtenir des réglages plus précis et savoir ce que "
+"vous faites, vous pouvez comprendre comment fonctionnent ces paramètres en "
+"consultant le code du système de sortie ('b-fluidsynth.c'). En résumé, à "
+"chaque unité de temps, directement avant l'assemblage des échantillons, la "
+"taille du tampon est redéfinie de cette manière :\n"
+"buffer_SIZE (taille du tampon) + buffer_MARGIN (marge du tampon) + marge "
+"supplémentaire\n"
+"(la marge supplémentaire est la valeur calculée suivant l'opération "
+"suivante : nombre de secondes de lecture / différentiel de la marge"
 
 #: src/amidi-plug/i_configure-fluidsynth.c:937
 msgid "FluidSynth Backend not loaded or not available"
-msgstr "Le système de sortie 'FluidSynth' n'est pas chargé ou n'est pas disponible"
+msgstr ""
+"Le système de sortie 'FluidSynth' n'est pas chargé ou n'est pas disponible"
 
 #: src/amidi-plug/i_configure-fluidsynth.c:956
 msgid ""
@@ -876,21 +1503,76 @@
 "<span size=\"smaller\">Sortie\n"
 "'FluidSynth'</span>"
 
-#: src/amidi-plug/i_configure.c:75
-msgid "AMIDI-Plug - select file"
-msgstr "'AMIDI-Plug' - choix du fichier"
-
-#: src/amidi-plug/i_configure.c:122
-msgid "AMIDI-Plug - configuration"
-msgstr "Configuration de 'AMIDI-Plug'"
-
-#: src/amidi-plug/i_configure.c:241
-msgid "AMIDI-Plug message"
-msgstr "Message de 'AMIDI-Plug'"
-
-#: src/amidi-plug/i_configure.c:242
-msgid "Please stop the player before changing AMIDI-Plug settings."
-msgstr "Veuillez arrêter le lecture avant de modifier les paramètres."
+#: src/amidi-plug/i_configure-timidity.c:39
+msgid "TIMIDITY BACKEND CONFIGURATION"
+msgstr "CONFIGURATION DU SYSTÈME DE SORTIE 'TIMIDITY'"
+
+#: src/amidi-plug/i_configure-timidity.c:64
+msgid "TiMidity Backend not loaded or not available"
+msgstr ""
+"Le système de sortie 'TiMidity' n'est pas chargé ou n'est pas disponible"
+
+#: src/amidi-plug/i_configure-timidity.c:83
+msgid ""
+"<span size=\"smaller\">TiMidity\n"
+"backend</span>"
+msgstr ""
+"<span size=\"smaller\">Sortie\n"
+"'TiMidity'</span>"
+
+#: src/amidi-plug/i_fileinfo.c:169 src/sid/xmms-sid.glade:3465
+#: src/sid/xs_interface.c:1684
+msgid "Name:"
+msgstr "Nom :"
+
+#: src/amidi-plug/i_fileinfo.c:193
+msgid "<span size=\"smaller\"> MIDI Info </span>"
+msgstr "<span size=\"smaller\"> Informations sur le fichier MIDI </span>"
+
+#: src/amidi-plug/i_fileinfo.c:205
+msgid "Format:"
+msgstr "Format :"
+
+#: src/amidi-plug/i_fileinfo.c:208
+msgid "Length (msec):"
+msgstr "Durée (msec) :"
+
+#: src/amidi-plug/i_fileinfo.c:211
+msgid "Num of Tracks:"
+msgstr "Nombre de pistes :"
+
+#: src/amidi-plug/i_fileinfo.c:216
+msgid "variable"
+msgstr "variable"
+
+#: src/amidi-plug/i_fileinfo.c:217
+msgid "BPM:"
+msgstr "BPM :"
+
+#: src/amidi-plug/i_fileinfo.c:223
+msgid "BPM (wavg):"
+msgstr "BPM (wavg) :"
+
+#: src/amidi-plug/i_fileinfo.c:226
+msgid "Time Div:"
+msgstr "Division du temps :"
+
+#: src/amidi-plug/i_fileinfo.c:237
+msgid "<span size=\"smaller\"> MIDI Comments and Lyrics </span>"
+msgstr ""
+"<span size=\"smaller\"> Commentaires et paroles du fichier MIDI </span>"
+
+#: src/amidi-plug/i_fileinfo.c:288
+msgid "* no comments available in this MIDI file *"
+msgstr "* aucun commentaire n'est disponible dans ce fichier MIDI *"
+
+#: src/amidi-plug/i_fileinfo.c:301
+msgid "* no lyrics available in this MIDI file *"
+msgstr "* aucune parole ne sont pas disponible dans ce fichier MIDI"
+
+#: src/amidi-plug/i_fileinfo.c:349
+msgid "  (invalid UTF-8)"
+msgstr "  (format UTF-8 invalide)"
 
 #: src/amidi-plug/i_utils.c:43
 msgid "AMIDI-Plug - about"
@@ -952,347 +1634,70 @@
 "pour son aide précieuse, lors de la phase alpha.\n"
 "\n"
 
-#: src/amidi-plug/i_configure-ap.c:56
-msgid "AMIDI-Plug - backend information"
-msgstr "Informations sur le système de sortie"
-
-#: src/amidi-plug/i_configure-ap.c:194
-msgid "AMIDI-PLUG PREFERENCES"
-msgstr "PRÉFÉRENCES DE 'AMIDI-PLUG'"
-
-#: src/amidi-plug/i_configure-ap.c:221
-msgid "Backend selection"
-msgstr "Choix du système de sortie"
-
-#: src/amidi-plug/i_configure-ap.c:225
-msgid "Available backends"
-msgstr "Systèmes disponibles :"
-
-#: src/amidi-plug/i_configure-ap.c:255
-msgid "Playback settings"
-msgstr "Paramètres de lecture"
-
-#: src/amidi-plug/i_configure-ap.c:260
-msgid "Transpose: "
-msgstr "Transposition : "
-
-#: src/amidi-plug/i_configure-ap.c:269
-msgid "Drum shift: "
-msgstr "Décalage des percussions :"
-
-#: src/amidi-plug/i_configure-ap.c:291
-msgid "pre-calculate length of MIDI files in playlist"
-msgstr "Précalculer la durée des fichiers MIDI dans la liste de lecture"
-
-#: src/amidi-plug/i_configure-ap.c:296
-msgid "extract comments from MIDI file (if available)"
-msgstr "Extraire les commentaires des fichiers MIDI (s'ils sont disponibles)"
-
-#: src/amidi-plug/i_configure-ap.c:301
-msgid "extract lyrics from MIDI file (if available)"
-msgstr "Extraire les paroles des fichiers MIDI (si elles sont disponible)"
-
-#: src/amidi-plug/i_configure-ap.c:320
-msgid ""
-"* Backend selection *\n"
-"AMIDI-Plug works with backends, in a modular fashion; here you should select your backend; that is, the way MIDI events are going to be handled and played.\n"
-"If you have a hardware synthesizer on your audio card, and ALSA supports it, you'll want to use the ALSA backend. It can also be used with anything that provides an interface to the ALSA sequencer, including software synths or external devices.\n"
-"If you want to rely on a software synthesizer and/or want to pipe audio into effect and output plugins of the player you'll want to use the good FluidSynth backend.\n"
-"Press the info button to read specific information about each backend."
-msgstr ""
-"* Choix du système de sortie *\n"
-"'AMIDI-Plug' utilise des systèmes de sortie, de manière modulaire. C'est par le système de sortie que vous aurez choisi que seront gérés et restitués les événements MIDI. Si votre périphérique audio dispose d'un synthétiseur matériel supporté par 'ALSA', vous voudrez utiliser le système de sortie 'ALSA'. Celui-ci peut aussi être utilisé par tout ce qui peut offrir une interface au séquenceur 'ALSA' (les synthétiseurs logiciels ou les périphériques externes, notamment).\n"
-" Si vous désirez dépendre d'un synthétiseur logiciel et/ou si vous voulez rediriger le flux audio vers les modules de sortie du lecteur, vous pourrez utiliser le système de sortie 'FluidSynth'. N'hésitez pas à activer le bouton d'informations, afin d'obtenir des renseignements spécifiques à chaque système de sortie."
-
-#: src/amidi-plug/i_configure-ap.c:331
-msgid ""
-"* Transpose function *\n"
-"This option allows you to play the midi file transposed in a different key, by shifting of the desired number of semitones all its notes (excepting those on midi channel 10, reserved for percussions). Expecially useful if you wish to sing or play along with another instrument."
-msgstr ""
-"* Fonction de transposition *\n"
-"Cette option permet de restituer le fichier MIDI alors transposé dans une tonalité différente, en décalant du nombre désiré de demi-tons toutes les les notes du morceau (à l'exception de celles du canal MIDI 10, réservé aux percussions). Cette fonction est particulièrement utile, si vous désirez chanter ou jouer accompagné d'un autre instrument."
-
-#: src/amidi-plug/i_configure-ap.c:337
-msgid ""
-"* Drumshift function *\n"
-"This option allows you to shift notes on midi channel 10 (the standard percussions channel) of the desired number of semitones. This results in different drumset and percussions being used during midi playback, so if you wish to enhance (or reduce, or alter) percussion sounds, try to play with this value."
-msgstr ""
-"* Fonction de décalage des percussions *\n"
-"Cette option permet de décaler toutes les notes du canal MIDI 10 (le canal standard des percussions) du nombre désiré de demi-tons. Cela se traduit par l'utilisation d'un ensemble de batteries et de percussions différent, lors de la lecture. Donc, si vous désirez amémiorer (ou réduire, ou bien encore altérer) les percussions, n'hésitez pas à essayer différentes valeurs."
-
-#: src/amidi-plug/i_configure-ap.c:344
-msgid ""
-"* Pre-calculate MIDI length *\n"
-"If this option is enabled, AMIDI-Plug will calculate the MIDI file length as soon as the player requests it, instead of doing that only when the MIDI file is being played. In example, MIDI length will be calculated straight after adding MIDI files in a playlist. Disable this option if you want faster playlist loading (when a lot of MIDI files are added), enable it to display more information in the playlist straight after loading."
-msgstr ""
-"* Pré-calculer la durée des fichiers MIDI *\n"
-"Si cette option est activée, 'AMIDI-Plug' déterminera la durée du fichier MIDI dès que le lecteur le demandera, au lieu le faire seulement lorsque le morceau est lu. Par exemple, la durée des fichiers MIDI sera calculée immédiatement après l'ajout des titres dans la liste de lecture. Désactivez cette option, si vous voulez un chargement plus rapide de la liste de lecture (lorsque de nombreux fichiers MIDI sont ajoutés) ; activez cette option pour que s'affichent plus d'informations dans la liste de lecture, directement après le chargement des fichiers."
-
-#: src/amidi-plug/i_configure-ap.c:353
-msgid ""
-"* Extract comments from MIDI files *\n"
-"Some MIDI files contain text comments (author, copyright, instrument notes, etc.). If this option is enabled, AMIDI-Plug will extract and display comments (if available) in the file information dialog."
+#: src/aosd/aosd_style.c:75
+msgid "Rectangle"
+msgstr "Rectangle"
+
+#: src/aosd/aosd_style.c:79
+msgid "Rounded Rectangle"
+msgstr "Rectangle arrondi"
+
+#: src/aosd/aosd_style.c:83
+msgid "Concave Rectangle"
+msgstr "Rectangle concave"
+
+#: src/aosd/aosd_style.c:87
+msgid "None"
+msgstr "Aucun"
+
+#: src/aosd/aosd_trigger.c:75
+msgid "Playback Start"
+msgstr "Début de la lecture"
+
+#: src/aosd/aosd_trigger.c:76
+msgid "Triggers OSD when a playlist entry is played."
 msgstr ""
-"* Extraire les commentaires des fichiers MIDI *\n"
-"Certains fichiers MIDI contiennent des commentaires (auteur, droits d'utilisation, notes relatives aux instruments, etc.). Si cette option est activée, 'AMIDI-Plug' extraira et afficher ces commentaires (s'ils sont disponibles) dans la fenêtre d'informations sur le fichier."
-
-#: src/amidi-plug/i_configure-ap.c:358
-msgid ""
-"* Extract lyrics from MIDI files *\n"
-"Some MIDI files contain song lyrics. If this option is enabled, AMIDI-Plug will extract and display song lyrics (if available) in the file information dialog."
-msgstr ""
-"* Extraire les paroles des fichiers MIDI *\n"
-"Certains fichiers MIDI contiennent les paroles relatives au morceau joué. Si cette option est activée, 'AMIDI-Plug' extraira et affichera les paroles (si elles sont disponibles) dans la fenêtre d'informations sur le fichier."
-
-#: src/amidi-plug/i_configure-ap.c:375
-msgid ""
-"<span size=\"smaller\">AMIDI\n"
-"Plug</span>"
-msgstr ""
-"<span size=\"smaller\">AMIDI\n"
-"Plug</span>"
-
-#: src/amidi-plug/i_configure-dummy.c:137
-msgid "DUMMY BACKEND CONFIGURATION"
-msgstr "CONFIGURATION DU SYSTÈME DE SORTIE 'DUMMY'"
-
-#: src/amidi-plug/i_configure-dummy.c:173
-msgid "MIDI logger settings"
-msgstr "Paramètres du journal des événements MIDI"
-
-#: src/amidi-plug/i_configure-dummy.c:181
-msgid "Do not log anything"
-msgstr "Ne rien écrire dans le journal"
-
-#: src/amidi-plug/i_configure-dummy.c:185
-msgid "Log MIDI events to standard output"
-msgstr "Consigner les événements MIDI dans la sortie standard"
-
-#: src/amidi-plug/i_configure-dummy.c:189
-msgid "Log MIDI events to standard error"
-msgstr "Consigner les événements MIDI dans la sortie d'erreur standard"
-
-#: src/amidi-plug/i_configure-dummy.c:193
-msgid "Log MIDI events to file"
-msgstr "Consigner les événements MIDI dans un fichier"
-
-#: src/amidi-plug/i_configure-dummy.c:202
-msgid "Logfile settings"
-msgstr "Paramètres du fichier du journal"
-
-#: src/amidi-plug/i_configure-dummy.c:209
-msgid "Use a single file to log everything (rewrite)"
-msgstr "Utiliser un fichier unique pour tout consigner (remplacement du contenu existant)"
-
-#: src/amidi-plug/i_configure-dummy.c:213
-msgid "Use a single file to log everything (append)"
-msgstr "Utiliser un fichier unique pour tout consigner (ajout au contenu existant)"
-
-#: src/amidi-plug/i_configure-dummy.c:217
-msgid "Use a different logfile for each MIDI file"
-msgstr "Utiliser un fichier journal par fichier MIDI"
-
-#: src/amidi-plug/i_configure-dummy.c:223
-msgid "» Log dir:"
-msgstr "» Emplacement du journal :"
-
-#: src/amidi-plug/i_configure-dummy.c:229
-#: src/amidi-plug/i_configure-dummy.c:241
-msgid "browse"
-msgstr "Parcourir"
-
-#: src/amidi-plug/i_configure-dummy.c:235
-msgid "» Log file:"
-msgstr "» Fichier du journal :"
-
-#: src/amidi-plug/i_configure-dummy.c:267
-msgid "Playback speed"
-msgstr "Vitesse de lecture"
-
-#: src/amidi-plug/i_configure-dummy.c:272
-msgid "Play at normal speed"
-msgstr "Lire à une vitesse normale"
-
-#: src/amidi-plug/i_configure-dummy.c:275
-msgid "Play as fast as possible"
-msgstr "Lire le plus rapidement possible"
-
-#: src/amidi-plug/i_configure-dummy.c:329
-msgid "Dummy Backend not loaded or not available"
-msgstr "Le système de sortie 'Dummy' n'est pas chargé ou n'est pas disponible"
-
-#: src/amidi-plug/i_configure-dummy.c:348
+"Déclenche la fonction 'OSD' lorsqu'une entrée de la liste de lecture est lue."
+
+#: src/aosd/aosd_trigger.c:80
+msgid "Title Change"
+msgstr "Changement de titre"
+
+#: src/aosd/aosd_trigger.c:81
 msgid ""
-"<span size=\"smaller\">Dummy\n"
-"backend</span>"
+"Triggers OSD when, during playback, the song title changes but the filename "
+"is the same. This is mostly useful to display title changes in internet "
+"streams."
 msgstr ""
-"<span size=\"smaller\">Sortie\n"
-"'Dummy'</span>"
-
-#: src/amidi-plug/i_fileinfo.c:169
-#: src/sid/xs_interface.c:1684
-#: src/sid/xmms-sid.glade:3465
-msgid "Name:"
-msgstr "Nom :"
-
-#: src/amidi-plug/i_fileinfo.c:193
-msgid "<span size=\"smaller\"> MIDI Info </span>"
-msgstr "<span size=\"smaller\"> Informations sur le fichier MIDI </span>"
-
-#: src/amidi-plug/i_fileinfo.c:205
-msgid "Format:"
-msgstr "Format :"
-
-#: src/amidi-plug/i_fileinfo.c:208
-msgid "Length (msec):"
-msgstr "Durée (msec) :"
-
-#: src/amidi-plug/i_fileinfo.c:211
-msgid "Num of Tracks:"
-msgstr "Nombre de pistes :"
-
-#: src/amidi-plug/i_fileinfo.c:216
-msgid "variable"
-msgstr "variable"
-
-#: src/amidi-plug/i_fileinfo.c:217
-msgid "BPM:"
-msgstr "BPM :"
-
-#: src/amidi-plug/i_fileinfo.c:223
-msgid "BPM (wavg):"
-msgstr "BPM (wavg) :"
-
-#: src/amidi-plug/i_fileinfo.c:226
-msgid "Time Div:"
-msgstr "Division du temps :"
-
-#: src/amidi-plug/i_fileinfo.c:237
-msgid "<span size=\"smaller\"> MIDI Comments and Lyrics </span>"
-msgstr "<span size=\"smaller\"> Commentaires et paroles du fichier MIDI </span>"
-
-#: src/amidi-plug/i_fileinfo.c:288
-msgid "* no comments available in this MIDI file *"
-msgstr "* aucun commentaire n'est disponible dans ce fichier MIDI *"
-
-#: src/amidi-plug/i_fileinfo.c:301
-msgid "* no lyrics available in this MIDI file *"
-msgstr "* aucune parole ne sont pas disponible dans ce fichier MIDI"
-
-#: src/amidi-plug/i_fileinfo.c:349
-msgid "  (invalid UTF-8)"
-msgstr "  (format UTF-8 invalide)"
-
-#: src/amidi-plug/i_configure-alsa.c:221
-msgid "ALSA BACKEND CONFIGURATION"
-msgstr "CONFIGURATION DU SYSTÈME DE SORTIE 'ALSA'"
-
-#: src/amidi-plug/i_configure-alsa.c:326
-msgid "Port"
-msgstr "Port"
-
-#: src/amidi-plug/i_configure-alsa.c:328
-msgid "Client name"
-msgstr "Nom du client"
-
-#: src/amidi-plug/i_configure-alsa.c:330
-msgid "Port name"
-msgstr "Nom du port"
-
-#: src/amidi-plug/i_configure-alsa.c:341
-msgid "ALSA output ports"
-msgstr "Ports de sortie 'ALSA'"
-
-#: src/amidi-plug/i_configure-alsa.c:394
-msgid "Soundcard: "
-msgstr "Périphérique audio : "
-
-#: src/amidi-plug/i_configure-alsa.c:396
-msgid "Mixer control: "
-msgstr "Canal du mélangeur audio : "
-
-#: src/amidi-plug/i_configure-alsa.c:408
-msgid "Mixer settings"
-msgstr "Paramètres du mélangeur"
-
-#: src/amidi-plug/i_configure-alsa.c:421
-msgid ""
-"* Select ALSA output ports *\n"
-"MIDI events will be sent to the ports selected here. In example, if your audio card provides a hardware synth and you want to play MIDI with it, you'll probably want to select the wavetable synthesizer ports."
+"Déclenche la fonction 'OSD' si, pendant la lecture, le titre du morceau "
+"change, alors que le nom du fichier est identique. Cette option est "
+"particulièrement utile pour afficher le changement de titre des flux "
+"Internet."
+
+#: src/aosd/aosd_trigger.c:87
+msgid "Volume Change"
+msgstr "Changement de volume"
+
+#: src/aosd/aosd_trigger.c:88
+msgid "Triggers OSD when volume is changed."
+msgstr "Déclenche la fonction 'OSD' en cas de changement de volume."
+
+#: src/aosd/aosd_trigger.c:92
+msgid "Pause On"
+msgstr "Mode 'pause' activé"
+
+#: src/aosd/aosd_trigger.c:93
+msgid "Triggers OSD when playback is paused."
+msgstr "Déclenche la fonction 'OSD' lorsque la lecture est en mode 'pause'."
+
+#: src/aosd/aosd_trigger.c:97
+msgid "Pause Off"
+msgstr "Mode 'pause' désactivé"
+
+#: src/aosd/aosd_trigger.c:98
+msgid "Triggers OSD when playback is unpaused."
 msgstr ""
-"* Choix des ports de sortie 'ALSA' *\n"
-"Les événements MIDI seront envoyés aux ports spécifiés. Par exemple, si votre carte son dispose d'un synthétiseur matériel et que vous désirez écouter les fichiers MIDI avec celui-ci, vous voudrez probabement choisir les ports du synthétiseur à tables d'ondes."
-
-#: src/amidi-plug/i_configure-alsa.c:426
-msgid ""
-"* Select ALSA mixer card *\n"
-"The ALSA backend outputs directly through ALSA, it doesn't use effect and ouput plugins from the player. During playback, the player volumeslider will manipulate the mixer control you select here. If you're using wavetable synthesizer ports, you'll probably want to select the Synth control here."
-msgstr ""
-"* Choix du périphérique audio 'ALSA' *\n"
-"Le système de sortie 'ALSA' émet directement via 'ALSA' : il n'utilise pas les modules d'effets du lecteur, ni les modules de sortie. Lors de la lecture, le curseur du volume du lecteur manipulera le contrôleur du mélangeur audio que vous avez sélectionné. Si vous utilisez les ports d'un synthétiseur à tables d'ondes, vous voudrez probabement choisir le contrôleur du synthétiseur."
-
-#: src/amidi-plug/i_configure-alsa.c:433
-msgid ""
-"* Select ALSA mixer control *\n"
-"The ALSA backend outputs directly through ALSA, it doesn't use effect and ouput plugins from the player. During playback, the player volume slider will manipulate the mixer control you select here. If you're using wavetable synthesizer ports, you'll probably want to select the Synth control here."
-msgstr ""
-"* Choix du canal du mélangeur audio 'ALSA' *\n"
-"Le système de sortie 'ALSA' émet directement via 'ALSA' : il n'utilise pas les modules d'effets du lecteur, ni les modules de sortie. Lors de la lecture, le curseur du volume du lecteur manipulera le canal du mélangeur audio que vous avez sélectionné. Si vous utilisez les ports d'un synthétiseur à tables d'ondes, vous voudrez probabement choisir le canal du synthétiseur."
-
-#: src/amidi-plug/i_configure-alsa.c:444
-msgid "ALSA Backend not loaded or not available"
-msgstr "Le système de sortie 'ALSA' n'est pas chargé ou n'est pas disponible"
-
-#: src/amidi-plug/i_configure-alsa.c:463
-msgid ""
-"<span size=\"smaller\">ALSA\n"
-"backend</span>"
-msgstr ""
-"<span size=\"smaller\">Sortie\n"
-"'ALSA'</span>"
-
-#: src/amidi-plug/backend-fluidsynth/b-fluidsynth.c:35
-msgid "FluidSynth Backend "
-msgstr "FluidSynth "
-
-#: src/amidi-plug/backend-fluidsynth/b-fluidsynth.c:37
-msgid ""
-"This backend produces audio by sending MIDI events to FluidSynth, a real-time software synthesizer based on the SoundFont2 specification (www.fluidsynth.org).\n"
-"Produced audio can be manipulated via player effect plugins and is processed by chosen ouput plugin.\n"
-"Backend written by Giacomo Lozito."
-msgstr ""
-"Ce système de sortie produit des flux audio en envoyant les événements MIDI à 'FluidSynth', un synthétiseur logiciel en temps réel sur les caractéristiques de 'SoundFont2' (www.fluidsynth.org).\n"
-"Les flux générés peuvent être manipulés grâce aux modules d'effets du lecteur et sont traités par le module de sortie sélectionné.\n"
-"\n"
-"Auteur : Giacomo Lozito."
-
-#: src/amidi-plug/backend-dummy/b-dummy.c:35
-msgid "Dummy Backend "
-msgstr "Dummy "
-
-#: src/amidi-plug/backend-dummy/b-dummy.c:37
-msgid ""
-"This backend does not produce audio at all. It is mostly useful for analysis and testing purposes, as it can log all MIDI events to standard output, standard error or file.\n"
-"Backend written by Giacomo Lozito."
-msgstr ""
-"Ce système de sortie ne produit absolument pas de flux audio. Il est principalement utile à des fins d'analyses et d'essais, parce qu'il peut consigner tous les événements MIDI dans la sortie standard, dans la sortie d'erreurs ou dans un fichier.\n"
-"\n"
-"Auteur : Giacomo Lozito."
-
-#: src/amidi-plug/backend-alsa/b-alsa.c:35
-msgid "ALSA Backend "
-msgstr "ALSA "
-
-#: src/amidi-plug/backend-alsa/b-alsa.c:37
-msgid ""
-"This backend sends MIDI events to a group of user-chosen ALSA sequencer ports. The ALSA sequencer interface is very versatile, it can provide ports for audio cards hardware synthesizers (i.e. emu10k1) but also for software synths, external devices, etc.\n"
-"This backend does not produce audio, MIDI events are handled directly from devices/programs behind the ALSA ports; in example, MIDI events sent to the hardware synth will be directly played.\n"
-"Backend written by Giacomo Lozito."
-msgstr ""
-"Ce système envoie les événements MIDI à l'ensemble des ports du séquenceur 'ALSA' que l'utilisateur a spécifié. L'interface du séquenceur 'ALSA' offre des possibilités variées : elle peut fournir des ports aux synthétiseurs matériels des cartes sons ('emu10k1', par exemple), mais aussi aux synthétiseurs logiciels, aux périphériques externes, etc.\n"
-"Ce système de sortie ne produit pas de flux audio : les événements MIDI sont gérés directement par les périphériques et les applications associés aux ports 'ALSA'. Par exemple, les événements MIDI envoyés au synthétiseur matériel seront directement interprétés.\n"
-"\n"
-"Auteur : Giacomo Lozito."
+"Déclenche la fonction 'OSD' lorsque la lecture n'est plus en mode 'pause'."
 
 #: src/aosd/aosd_ui.c:168
 msgid "Placement"
@@ -1389,13 +1794,10 @@
 msgid "Skin file:"
 msgstr "Fichier du thème"
 
-#: src/aosd/aosd_ui.c:644
-#: src/sid/xs_interface.c:1010
-#: src/sid/xs_interface.c:1182
+#: src/aosd/aosd_ui.c:644 src/sid/xmms-sid.glade:2331
+#: src/sid/xmms-sid.glade:2856 src/sid/xmms-sid.glade:2962
+#: src/sid/xs_interface.c:1010 src/sid/xs_interface.c:1182
 #: src/sid/xs_interface.c:1218
-#: src/sid/xmms-sid.glade:2331
-#: src/sid/xmms-sid.glade:2856
-#: src/sid/xmms-sid.glade:2962
 msgid "Browse"
 msgstr "Parcourir"
 
@@ -1414,10 +1816,13 @@
 #: src/aosd/aosd_ui.c:808
 msgid ""
 "Composite manager not detected;\n"
-"unless you know that you have one running, please activate a composite manager otherwise the OSD won't work properly"
+"unless you know that you have one running, please activate a composite "
+"manager otherwise the OSD won't work properly"
 msgstr ""
-"Aucun gestionnaire composite n'a été détecté. À moins que vous ne soyez certain d'utiliser un tel gestionnaire,\n"
-"veuillez activer un gestionnaire composite approprié. Sinon, l'affichage 'OSD' ne fonctionnera pas correctement."
+"Aucun gestionnaire composite n'a été détecté. À moins que vous ne soyez "
+"certain d'utiliser un tel gestionnaire,\n"
+"veuillez activer un gestionnaire composite approprié. Sinon, l'affichage "
+"'OSD' ne fonctionnera pas correctement."
 
 #: src/aosd/aosd_ui.c:816
 msgid "Composite manager not required for fake transparency"
@@ -1476,12 +1881,9 @@
 msgid "Trigger"
 msgstr "Déclenchement"
 
-#: src/aosd/aosd_ui.c:1076
-#: src/cdaudio-ng/configure.c:167
-#: src/sid/xs_interface.c:1229
-#: src/modplug/gui/interface.cxx:688
-#: src/modplug/gui/modplug.glade:1603
-#: src/sid/xmms-sid.glade:3026
+#: src/aosd/aosd_ui.c:1076 src/cdaudio-ng/configure.c:167
+#: src/modplug/gui/interface.cxx:688 src/modplug/gui/modplug.glade:1603
+#: src/sid/xmms-sid.glade:3026 src/sid/xs_interface.c:1229
 msgid "Misc"
 msgstr "Divers"
 
@@ -1517,34 +1919,6 @@
 "'On-Screen-Display' est basé sur la bibliothèque 'Ghosd' de Evan Martin\n"
 "http://neugierig.org/software/ghosd/\n"
 
-#: src/arts/configure.c:50
-msgid "aRts Driver configuration"
-msgstr "Configuration du pilote 'aRts'"
-
-#: src/arts/configure.c:61
-#: src/esd/configure.c:171
-#: src/OSS/configure.c:304
-#: src/OSS4/configure.c:232
-#: src/sun/configure.c:259
-msgid "Buffering:"
-msgstr "Tampon"
-
-#: src/arts/configure.c:73
-#: src/esd/configure.c:184
-#: src/OSS/configure.c:317
-#: src/OSS4/configure.c:245
-#: src/sun/configure.c:272
-msgid "Buffer size (ms):"
-msgstr "Taille du tampon (ms) :"
-
-#: src/arts/configure.c:83
-#: src/esd/configure.c:209
-#: src/OSS/configure.c:342
-#: src/OSS4/configure.c:270
-#: src/sun/configure.c:304
-msgid "Buffering"
-msgstr "Tampon"
-
 #: src/arts/arts.c:22
 msgid "About aRts Output"
 msgstr "À propos du pilote 'aRts'"
@@ -1563,6 +1937,25 @@
 "\n"
 "Giacomo Lozito, de 'develia.org'"
 
+#: src/arts/configure.c:50
+msgid "aRts Driver configuration"
+msgstr "Configuration du pilote 'aRts'"
+
+#: src/arts/configure.c:61 src/esd/configure.c:171 src/OSS4/configure.c:232
+#: src/OSS/configure.c:304 src/sun/configure.c:259
+msgid "Buffering:"
+msgstr "Tampon"
+
+#: src/arts/configure.c:73 src/esd/configure.c:184 src/OSS4/configure.c:245
+#: src/OSS/configure.c:317 src/sun/configure.c:272
+msgid "Buffer size (ms):"
+msgstr "Taille du tampon (ms) :"
+
+#: src/arts/configure.c:83 src/esd/configure.c:209 src/OSS4/configure.c:270
+#: src/OSS/configure.c:342 src/sun/configure.c:304
+msgid "Buffering"
+msgstr "Tampon"
+
 #: src/audiocompress/audacious-glue.c:95
 msgid "AudioCompress "
 msgstr "AudioCompress "
@@ -1592,8 +1985,14 @@
 msgstr "À propos de 'AudioCompress'"
 
 #: src/audiocompress/audacious-glue.c:320
-msgid "If checked, when the sound peaks the volume will be cut instantly; otherwise, it will ramp down just in time for the peak (but some minor clipping may still occur)."
-msgstr "Si cette option est activée, en cas de pic sonore, le volume sera immédiatement coupé ; sinon, il diminuera juste à temps, de manière à éviter le pic (malgré tout, une saturation faible peut survenir)."
+msgid ""
+"If checked, when the sound peaks the volume will be cut instantly; "
+"otherwise, it will ramp down just in time for the peak (but some minor "
+"clipping may still occur)."
+msgstr ""
+"Si cette option est activée, en cas de pic sonore, le volume sera "
+"immédiatement coupé ; sinon, il diminuera juste à temps, de manière à éviter "
+"le pic (malgré tout, une saturation faible peut survenir)."
 
 #: src/audiocompress/audacious-glue.c:324
 msgid "The maximum amount to amplify the audio by"
@@ -1601,11 +2000,18 @@
 
 #: src/audiocompress/audacious-glue.c:326
 msgid "Defines how smoothly the volume will ramp up"
-msgstr "Détermine la vitesse à laquelle le volume sera réduit. Une valeur élevée correspond à une vitesse plus lente."
+msgstr ""
+"Détermine la vitesse à laquelle le volume sera réduit. Une valeur élevée "
+"correspond à une vitesse plus lente."
 
 #: src/audiocompress/audacious-glue.c:328
-msgid "The target audio level for ramping up. Lowering the value gives a bit more dynamic range for peaks, but will make the overall sound quieter."
-msgstr "Détermine le niveau sonore à partir duquel la compression sera appliquée. Des valeurs faibles permettent d'obtenir une variation des pics plus dynamique, mais rendent l'ensemble du flux moins audible."
+msgid ""
+"The target audio level for ramping up. Lowering the value gives a bit more "
+"dynamic range for peaks, but will make the overall sound quieter."
+msgstr ""
+"Détermine le niveau sonore à partir duquel la compression sera appliquée. "
+"Des valeurs faibles permettent d'obtenir une variation des pics plus "
+"dynamique, mais rendent l'ensemble du flux moins audible."
 
 #: src/audiocompress/audacious-glue.c:331
 msgid "How long of a window to maintain"
@@ -1644,8 +2050,12 @@
 msgstr " Relâchement "
 
 #: src/audiocompress/audacious-glue.c:517
-msgid "How long of a history to maintain.  A higher number will make the volume changes less responsive."
-msgstr "Détermine la durée (exprimée en millisecondes) pendant laquelle la compression sera appliquée."
+msgid ""
+"How long of a history to maintain.  A higher number will make the volume "
+"changes less responsive."
+msgstr ""
+"Détermine la durée (exprimée en millisecondes) pendant laquelle la "
+"compression sera appliquée."
 
 #: src/audiocompress/audacious-glue.c:528
 msgid "Load default values"
@@ -1655,14 +2065,24 @@
 msgid "Audio values"
 msgstr "Paramètres audio"
 
-#: src/audiocompress/audacious-glue.c:562
-#: src/echo_plugin/gui.c:152
+#: src/audiocompress/audacious-glue.c:562 src/echo_plugin/gui.c:152
+#: src/modplug/gui/interface.cxx:708 src/modplug/gui/modplug.glade:1655
 #: src/stereo_plugin/stereo.c:132
-#: src/modplug/gui/interface.cxx:708
-#: src/modplug/gui/modplug.glade:1655
 msgid "Apply"
 msgstr "Appliquer"
 
+#: src/blur_scope/blur_scope.c:54
+msgid "/Toggle Decorations"
+msgstr "/Montrer les décorations"
+
+#: src/blur_scope/blur_scope.c:56
+msgid "/-"
+msgstr "/-"
+
+#: src/blur_scope/blur_scope.c:57
+msgid "/Close"
+msgstr "/Fermer"
+
 #: src/blur_scope/blur_scope.c:181
 msgid "Blur scope"
 msgstr "'Blur Scope'"
@@ -1671,11 +2091,59 @@
 msgid "Blur Scope: Color selection"
 msgstr "'Blur Scope' : sélection de la couleur"
 
-#: src/blur_scope/config.c:82
-#: src/jack/configure.c:108
+#: src/blur_scope/config.c:82 src/jack/configure.c:108
 msgid "Options:"
 msgstr "Options :"
 
+#: src/cdaudio-ng/cdaudio-ng.c:204
+msgid "Rescan CD"
+msgstr ""
+
+#: src/cdaudio-ng/cdaudio-ng.c:217
+msgid "Add CD"
+msgstr "Ajouter un CD"
+
+#: src/cdaudio-ng/cdaudio-ng.c:242
+msgid "About CD Audio Plugin NG"
+msgstr "À propos du module 'CD Audio NG'"
+
+#: src/cdaudio-ng/cdaudio-ng.c:243
+msgid ""
+"Copyright (c) 2007, by Calin Crisan <ccrisan@gmail.com> and The Audacious "
+"Team.\n"
+"\n"
+"Many thanks to libcdio developers <http://www.gnu.org/software/libcdio/>\n"
+"\tand to libcddb developers <http://libcddb.sourceforge.net/>.\n"
+"\n"
+"Also thank you Tony Vroon for mentoring & guiding me.\n"
+"\n"
+"This was a Google Summer of Code 2007 project."
+msgstr ""
+"Droits d'utilisation (2007) :\n"
+"\n"
+"Calin Crisan <ccrisan@gmail.com>\n"
+"Équipe de développement Audacious.\n"
+"\n"
+"Remerciements cordiaux aux développeurs de :\n"
+"\n"
+"'libcdio'  <http://www.gnu.org/software/libcdio/>\n"
+"'libcddb' <http://libcddb.sourceforge.net/>.\n"
+"\n"
+"Je remercie également Tony Vroon de m'avoir guidé et soutenu.\n"
+"\n"
+"Ce module était un projet de 'Google Summer of Code 2007'."
+
+#: src/cdaudio-ng/cdaudio-ng.c:814
+msgid ""
+"<b><big>No playable CD found.</big></b>\n"
+"\n"
+"No CD inserted, or inserted CD is not an audio CD.\n"
+msgstr ""
+"<b><big>Aucune piste audio n'a été détectée.</big></b>\n"
+"\n"
+"Le lecteur ne comporte pas de CD ou le support inséré n'est pas un CD "
+"audio.\n"
+
 #: src/cdaudio-ng/configure.c:147
 msgid "CD Audio Plugin Configuration"
 msgstr "Configuration du module 'CD Audio'"
@@ -1720,44 +2188,88 @@
 msgid "Print debug information"
 msgstr "Afficher les informations de débogage"
 
-#: src/cdaudio-ng/cdaudio-ng.c:194
-msgid "Add CD"
-msgstr "Ajouter un CD"
-
-#: src/cdaudio-ng/cdaudio-ng.c:219
-msgid "About CD Audio Plugin NG"
-msgstr "À propos du module 'CD Audio NG'"
-
-#: src/cdaudio-ng/cdaudio-ng.c:220
+#: src/console/Audacious_Config.cxx:125
+msgid "Console Music Decoder"
+msgstr "Décodeur 'Console Music'"
+
+#: src/console/Audacious_Config.cxx:162
+msgid "Bass:"
+msgstr "Basses :"
+
+#: src/console/Audacious_Config.cxx:166 src/console/Audacious_Config.cxx:177
+#: src/console/Audacious_Config.cxx:198
+msgid "secs"
+msgstr "secondes"
+
+#: src/console/Audacious_Config.cxx:173
+msgid "Treble:"
+msgstr "Aiguës :"
+
+#: src/console/Audacious_Config.cxx:194
+msgid "Default song length:"
+msgstr "Durée par défaut :"
+
+#: src/console/Audacious_Config.cxx:200 src/modplug/gui/interface.cxx:268
+#: src/modplug/gui/modplug.glade:338 src/sid/xmms-sid.glade:1243
+#: src/sid/xs_interface.c:653
+msgid "Resampling"
+msgstr "Rééchantillonnage"
+
+#: src/console/Audacious_Config.cxx:206
+msgid "Enable audio resampling"
+msgstr "Activer le rééchantillonnage"
+
+#: src/console/Audacious_Config.cxx:221
+msgid "Resampling rate:"
+msgstr "Taux de rééchantillonnage"
+
+#: src/console/Audacious_Config.cxx:236
+msgid "SPC"
+msgstr "SPC"
+
+#: src/console/Audacious_Config.cxx:237
+msgid "Ignore length from SPC tags"
+msgstr "Ignorer la durée des métadonnées SPC"
+
+#: src/console/Audacious_Config.cxx:238
+msgid "Increase reverb"
+msgstr "Augmenter la réverbération"
+
+#: src/console/Audacious_Config.cxx:263
 msgid ""
-"Copyright (c) 2007, by Calin Crisan <ccrisan@gmail.com> and The Audacious Team.\n"
-"\n"
-"Many thanks to libcdio developers <http://www.gnu.org/software/libcdio/>\n"
-"\tand to libcddb developers <http://libcddb.sourceforge.net/>.\n"
-"\n"
-"Also thank you Tony Vroon for mentoring & guiding me.\n"
-"\n"
-"This was a Google Summer of Code 2007 project."
+"The default song length, expressed in seconds, is used for songs that do not "
+"provide length information (i.e. looping tracks)."
 msgstr ""
-"Droits d'utilisation (2007) :\n"
-"\n"
-"Calin Crisan <ccrisan@gmail.com>\n"
-"Équipe de développement Audacious.\n"
-"\n"
-"Remerciements cordiaux aux développeurs de :\n"
-"\n"
-"'libcdio'  <http://www.gnu.org/software/libcdio/>\n"
-"'libcddb' <http://libcddb.sourceforge.net/>.\n"
-"\n"
-"Je remercie également Tony Vroon de m'avoir guidé et soutenu.\n"
-"\n"
-"Ce module était un projet de 'Google Summer of Code 2007'."
-
-#: src/demac/plugin.c:387
+"* Durée par défaut *\n"
+"La durée par défaut, exprimée en secondes, est utilisée pour les morceaux "
+"qui ne disposent pas d'informations quant à leur durée (les pistes en "
+"boucle, par exemple)."
+
+#: src/console/Audacious_Driver.cxx:444
+msgid "About the Console Music Decoder"
+msgstr "À propos de 'Console Music Decoder'"
+
+#: src/console/Audacious_Driver.cxx:445
+msgid ""
+"Console music decoder engine based on Game_Music_Emu 0.5.2.\n"
+"Supported formats: AY, GBS, GYM, HES, KSS, NSF, NSFE, SAP, SPC, VGM, VGZ\n"
+"Audacious implementation by: William Pitcock <nenolod@nenolod.net>, \n"
+"        Shay Green <gblargg@gmail.com>"
+msgstr ""
+"Le moteur de 'Console Music Decoder' est basé sur 'Game_Music_Emu' 0.5.2.\n"
+"\n"
+"Formats supportés : AY, GBS, GYM, HES, KSS, NSF, NSFE, SAP, SPC, VGM, VGZ\n"
+"\n"
+"Support pour Audacious par :\n"
+"\n"
+"William Pitcock <nenolod@nenolod.net>\n"
+"Shay Green <gblargg@gmail.com>"
+
+#: src/demac/plugin.c:388
 msgid "About Monkey's Audio Plugin"
 msgstr "À propos du module 'Monkey's Audio'"
 
-#: src/demac/plugin.c:388
+#: src/demac/plugin.c:389
 msgid ""
 "Copyright (C) 2007 Eugene Zagidullin <e.asphyx@gmail.com>\n"
 "Based on ffape decoder, Copyright (C) 2007 Benjamin Zores\n"
@@ -1774,6 +2286,19 @@
 "\n"
 "'ffape' fait partie du projet 'FFmpeg' (http://ffmpeg.mplayerhq.hu/)"
 
+#: src/echo_plugin/gui.c:11
+msgid ""
+"Echo Plugin\n"
+"By Johan Levin 1999.\n"
+"\n"
+"Surround echo by Carl van Schaik 1999"
+msgstr ""
+"Module 'Écho'\n"
+"\n"
+"Écrit par Johan Levin (1999).\n"
+"\n"
+"'Surround echo' est écrit par Carl van Schaik (1999)"
+
 #: src/echo_plugin/gui.c:25
 msgid "About Echo Plugin"
 msgstr "À propos du module 'Écho'"
@@ -1798,38 +2323,6 @@
 msgid "Surround echo"
 msgstr "Écho d'ambiance"
 
-#: src/esd/configure.c:102
-msgid "ESD Output Plugin configuration"
-msgstr "Configuration du module de sortie 'ESD'"
-
-#: src/esd/configure.c:114
-#: src/esd/configure.c:144
-msgid "Host:"
-msgstr "Hôte :"
-
-#: src/esd/configure.c:125
-msgid "Use remote host"
-msgstr "Utiliser un hôte distant"
-
-#: src/esd/configure.c:132
-msgid "Volume controls OSS mixer"
-msgstr "Utiliser le contrôle du volume du mélangeur OSS"
-
-#: src/esd/configure.c:153
-msgid "Port:"
-msgstr "Port :"
-
-#: src/esd/configure.c:169
-msgid "Server"
-msgstr "Serveur"
-
-#: src/esd/configure.c:198
-#: src/OSS/configure.c:331
-#: src/OSS4/configure.c:259
-#: src/sun/configure.c:290
-msgid "Pre-buffer (percent):"
-msgstr "Pré-tampon (pourcents) :"
-
 #: src/esd/about.c:34
 msgid "About ESounD Plugin"
 msgstr "À propos du module 'ESounD'"
@@ -1858,12 +2351,14 @@
 "Ceci est une traduction non officielle de la \"GNU General Public License\"\n"
 "en français. Elle n'a pas été publiée par la \"Free Software Foundation\",\n"
 "et ne détermine pas les termes de distribution pour les logiciels qui\n"
-"utilisent la \"GNU GPL\" -- seul le texte anglais original de la \"GNU GPL\" en a\n"
+"utilisent la \"GNU GPL\" -- seul le texte anglais original de la \"GNU GPL\" "
+"en a\n"
 "le droit. Cependant, nous espérons que cette traduction aidera les\n"
 "francophones à mieux comprendre la \"GNU GPL\".\n"
 "\n"
 "Ce programme est un logiciel libre : vous pouvez le redistribuer et/ou le\n"
-"modifier selon les termes de la \"Licence Publique Générale GNU\" (GNU GPL),\n"
+"modifier selon les termes de la \"Licence Publique Générale GNU\" (GNU "
+"GPL),\n"
 "telle que publiée par la \"Free Software Foundation\", soit la version 2 de\n"
 "la Licence, soit (à votre convenance) toute version postérieure.\n"
 "\n"
@@ -1878,77 +2373,228 @@
 "Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,\n"
 "MA 02110-1301, USA."
 
+#: src/esd/configure.c:102
+msgid "ESD Output Plugin configuration"
+msgstr "Configuration du module de sortie 'ESD'"
+
+#: src/esd/configure.c:114 src/esd/configure.c:144
+msgid "Host:"
+msgstr "Hôte :"
+
+#: src/esd/configure.c:125
+msgid "Use remote host"
+msgstr "Utiliser un hôte distant"
+
+#: src/esd/configure.c:132
+msgid "Volume controls OSS mixer"
+msgstr "Utiliser le contrôle du volume du mélangeur OSS"
+
+#: src/esd/configure.c:153
+msgid "Port:"
+msgstr "Port :"
+
+#: src/esd/configure.c:169
+msgid "Server"
+msgstr "Serveur"
+
+#: src/esd/configure.c:198 src/OSS4/configure.c:259 src/OSS/configure.c:331
+#: src/sun/configure.c:290
+msgid "Pre-buffer (percent):"
+msgstr "Pré-tampon (pourcents) :"
+
+#: src/evdev-plug/ed.c:59
+msgid "Playback->Play"
+msgstr "Lecture -> Lire"
+
+#: src/evdev-plug/ed.c:60
+msgid "Playback->Stop"
+msgstr "Lecture -> Arrêter"
+
+#: src/evdev-plug/ed.c:61
+msgid "Playback->Pause"
+msgstr "Lecture -> Pause"
+
+#: src/evdev-plug/ed.c:62
+msgid "Playback->Prev"
+msgstr "Lecture -> Précédent"
+
+#: src/evdev-plug/ed.c:63
+msgid "Playback->Next"
+msgstr "Lecture -> Suivant"
+
+#: src/evdev-plug/ed.c:64
+msgid "Playback->Eject"
+msgstr "Lecture -> Éjecter"
+
+#: src/evdev-plug/ed.c:66
+msgid "Playlist->Repeat"
+msgstr "Liste de lecture -> Répéter"
+
+#: src/evdev-plug/ed.c:67
+msgid "Playlist->Shuffle"
+msgstr "Liste de lecture -> Aléatoire"
+
+#: src/evdev-plug/ed.c:69
+msgid "Volume->Up_5"
+msgstr "Volume -> Augmenter de 5"
+
+#: src/evdev-plug/ed.c:70
+msgid "Volume->Down_5"
+msgstr "Volume -> Diminuer de 5"
+
+#: src/evdev-plug/ed.c:71
+msgid "Volume->Up_10"
+msgstr "Volume -> Augmenter de 10"
+
+#: src/evdev-plug/ed.c:72
+msgid "Volume->Down_10"
+msgstr "Volume -> Diminuer de 10"
+
+#: src/evdev-plug/ed.c:73
+msgid "Volume->Mute"
+msgstr "Volume -> Couper"
+
+#: src/evdev-plug/ed.c:75
+msgid "Window->Main"
+msgstr "Fenêtre -> Principale"
+
+#: src/evdev-plug/ed.c:76
+msgid "Window->Playlist"
+msgstr "Fenêtre -> Liste de lecture"
+
+#: src/evdev-plug/ed.c:77
+msgid "Window->Equalizer"
+msgstr "Fenêtre -> Égaliseur"
+
+#: src/evdev-plug/ed.c:78
+msgid "Window->JumpToFile"
+msgstr "Fenêtre -> Aller au titre..."
+
 #: src/evdev-plug/ed_internals.c:94
 #, c-format
-msgid "event-device-plugin: unable to open device file %s , skipping this device; check that the file exists and that you have read permission for it\n"
-msgstr "Module 'Event-Device' : impossible d'ouvrir le fichier de périphérique %s ; le périphérique sera ignoré...Veuillez vérifier que le fichier existe et que disposez des permissions de lecture requises.\n"
+msgid ""
+"event-device-plugin: unable to open device file %s , skipping this device; "
+"check that the file exists and that you have read permission for it\n"
+msgstr ""
+"Module 'Event-Device' : impossible d'ouvrir le fichier de périphérique %s ; "
+"le périphérique sera ignoré...Veuillez vérifier que le fichier existe et que "
+"disposez des permissions de lecture requises.\n"
 
 #: src/evdev-plug/ed_internals.c:103
 #, c-format
-msgid "event-device-plugin: unable to create a io_channel for device file %s ,skipping this device\n"
-msgstr "Module 'Event-Device' : impossible de créer un canal 'io' pour le fichier de périphérique %s ; le périphérique sera ignoré...\n"
+msgid ""
+"event-device-plugin: unable to create a io_channel for device file %s ,"
+"skipping this device\n"
+msgstr ""
+"Module 'Event-Device' : impossible de créer un canal 'io' pour le fichier de "
+"périphérique %s ; le périphérique sera ignoré...\n"
 
 #: src/evdev-plug/ed_internals.c:342
-msgid "event-device-plugin: unable to open /proc/bus/input/devices , automatic detection of event devices won't work.\n"
-msgstr "Module 'Event-Device' : impossible d'ouvrir '/proc/bus/input/devices' ; la détection automatique des périphériques échouera...\n"
+msgid ""
+"event-device-plugin: unable to open /proc/bus/input/devices , automatic "
+"detection of event devices won't work.\n"
+msgstr ""
+"Module 'Event-Device' : impossible d'ouvrir '/proc/bus/input/devices' ; la "
+"détection automatique des périphériques échouera...\n"
 
 #: src/evdev-plug/ed_internals.c:351
-msgid "event-device-plugin: unable to open a io_channel for /proc/bus/input/devices , automatic detection of event devices won't work.\n"
-msgstr "Module 'Event-Device' : impossible de créer un canal 'io' pour '/proc/bus/input/devices' ; la détection automatique des périphériques échouera...\n"
+msgid ""
+"event-device-plugin: unable to open a io_channel for /proc/bus/input/"
+"devices , automatic detection of event devices won't work.\n"
+msgstr ""
+"Module 'Event-Device' : impossible de créer un canal 'io' pour '/proc/bus/"
+"input/devices' ; la détection automatique des périphériques échouera...\n"
 
 #: src/evdev-plug/ed_internals.c:361
-msgid "event-device-plugin: an error occurred while reading /proc/bus/input/devices , automatic detection of event devices won't work.\n"
-msgstr "Module 'Event-Device' : une erreur s'est produite lors de lecture de '/proc/bus/input/devices' ; la détection automatique des périphériques échouera...\n"
+msgid ""
+"event-device-plugin: an error occurred while reading /proc/bus/input/"
+"devices , automatic detection of event devices won't work.\n"
+msgstr ""
+"Module 'Event-Device' : une erreur s'est produite lors de lecture de '/proc/"
+"bus/input/devices' ; la détection automatique des périphériques échouera...\n"
 
 #: src/evdev-plug/ed_internals.c:424
 #, c-format
 msgid "event-device-plugin: device %s not found in /dev/input , skipping.\n"
-msgstr "Module 'Event-Device' : le périphérique %s n'a pas été trouvé dans '/dev/input' ; le périphérique sera ignoré...\n"
-
-#: src/evdev-plug/ed_internals.c:489
-#: src/evdev-plug/ed_internals.c:583
+msgstr ""
+"Module 'Event-Device' : le périphérique %s n'a pas été trouvé dans '/dev/"
+"input' ; le périphérique sera ignoré...\n"
+
+#: src/evdev-plug/ed_internals.c:489 src/evdev-plug/ed_internals.c:583
 #, c-format
-msgid "event-device-plugin: unable to load config file %s , default settings will be used.\n"
-msgstr "Module 'Event-Device' : impossible de charger le fichier de configuration %s ; les paramètres par défaut seront utilisés...\n"
+msgid ""
+"event-device-plugin: unable to load config file %s , default settings will "
+"be used.\n"
+msgstr ""
+"Module 'Event-Device' : impossible de charger le fichier de configuration %"
+"s ; les paramètres par défaut seront utilisés...\n"
 
 #: src/evdev-plug/ed_internals.c:535
 #, c-format
-msgid "event-device-plugin: incomplete information in config file for device \"%s\" , skipping.\n"
-msgstr "Module 'Event-Device' : information incomplète au sujet du périphérique \"%s\" ; le périphérique sera ignoré...\n"
-
-#: src/evdev-plug/ed_internals.c:604
-#: src/evdev-plug/ed_internals.c:936
+msgid ""
+"event-device-plugin: incomplete information in config file for device \"%s"
+"\" , skipping.\n"
+msgstr ""
+"Module 'Event-Device' : information incomplète au sujet du périphérique \"%s"
+"\" ; le périphérique sera ignoré...\n"
+
+#: src/evdev-plug/ed_internals.c:604 src/evdev-plug/ed_internals.c:936
 #, c-format
-msgid "event-device-plugin: configuration, unable to get is_active value for device \"%s\", skipping it.\n"
-msgstr "Module 'Event-Device' : impossible d'obtenir la valeur de 'is_active' dans le fichier de configuration pour le périphérique  \"%s\" ; le périphérique sera ignoré...\n"
+msgid ""
+"event-device-plugin: configuration, unable to get is_active value for device "
+"\"%s\", skipping it.\n"
+msgstr ""
+"Module 'Event-Device' : impossible d'obtenir la valeur de 'is_active' dans "
+"le fichier de configuration pour le périphérique  \"%s\" ; le périphérique "
+"sera ignoré...\n"
 
 #: src/evdev-plug/ed_internals.c:840
 #, c-format
-msgid "event-device-plugin: unable to access local directory %s , settings will not be saved.\n"
-msgstr "Module 'Event-Device' : impossible d'accéder au dossier local %s ; les paramètres ne seront pas enregistrés...\n"
+msgid ""
+"event-device-plugin: unable to access local directory %s , settings will not "
+"be saved.\n"
+msgstr ""
+"Module 'Event-Device' : impossible d'accéder au dossier local %s ; les "
+"paramètres ne seront pas enregistrés...\n"
 
 #: src/evdev-plug/ed_internals.c:890
 #, c-format
-msgid "event-device-plugin: configuration, unable to get filename value for device \"%s\", skipping it.\n"
-msgstr "Module 'Event-Device' : impossible d'obtenir, dans le fichier de configuration, le nom du fichier du périphérique \"%s\" ;le périphérique sera ignoré...\n"
+msgid ""
+"event-device-plugin: configuration, unable to get filename value for device "
+"\"%s\", skipping it.\n"
+msgstr ""
+"Module 'Event-Device' : impossible d'obtenir, dans le fichier de "
+"configuration, le nom du fichier du périphérique \"%s\" ;le périphérique "
+"sera ignoré...\n"
 
 #: src/evdev-plug/ed_internals.c:906
 #, c-format
-msgid "event-device-plugin: configuration, unable to get phys value for device \"%s\", skipping it.\n"
-msgstr "event-device-plugin : configuration ; impossible d'obtenir la valeur physique du périphérique \"%s\" ; opération ignorée.\n"
+msgid ""
+"event-device-plugin: configuration, unable to get phys value for device \"%s"
+"\", skipping it.\n"
+msgstr ""
+"event-device-plugin : configuration ; impossible d'obtenir la valeur "
+"physique du périphérique \"%s\" ; opération ignorée.\n"
 
 #: src/evdev-plug/ed_internals.c:922
 #, c-format
-msgid "event-device-plugin: configuration, unable to get is_custom value for device \"%s\", skipping it.\n"
-msgstr "event-device-plugin : configuration ; impossible d'obtenir la valeur \"is_custom\" pour le périphérique \"%s\" ; opération ignorée.\n"
+msgid ""
+"event-device-plugin: configuration, unable to get is_custom value for device "
+"\"%s\", skipping it.\n"
+msgstr ""
+"event-device-plugin : configuration ; impossible d'obtenir la valeur "
+"\"is_custom\" pour le périphérique \"%s\" ; opération ignorée.\n"
 
 #: src/evdev-plug/ed_internals.c:946
 #, c-format
-msgid "event-device-plugin: configuration, unexpected value for device \"%s\", skipping it.\n"
-msgstr "event-device-plugin : configuration ; valeur inattendue pour le périphérique  \"%s\" ; opération ignorée.\n"
-
-#: src/evdev-plug/ed_ui.c:275
-#: src/evdev-plug/ed_ui.c:411
+msgid ""
+"event-device-plugin: configuration, unexpected value for device \"%s\", "
+"skipping it.\n"
+msgstr ""
+"event-device-plugin : configuration ; valeur inattendue pour le "
+"périphérique  \"%s\" ; opération ignorée.\n"
+
+#: src/evdev-plug/ed_ui.c:275 src/evdev-plug/ed_ui.c:411
 #: src/evdev-plug/ed_ui.c:874
 msgid "Information"
 msgstr "Informations"
@@ -1958,11 +2604,11 @@
 "Cannot open bindings window for a not-detected device.\n"
 "Ensure that the device has been correctly plugged in."
 msgstr ""
-"Il n'est pas possible d'ouvrir la fenêtre des associations pour un périphérique qui n'a pas été détecté.\n"
+"Il n'est pas possible d'ouvrir la fenêtre des associations pour un "
+"périphérique qui n'a pas été détecté.\n"
 "Veuillez vous assurer que le périphérique a été correctement branché."
 
-#: src/evdev-plug/ed_ui.c:319
-#: src/madplug/plugin.c:566
+#: src/evdev-plug/ed_ui.c:319 src/madplug/plugin.c:566
 msgid "Error"
 msgstr "Erreur"
 
@@ -2026,8 +2672,7 @@
 msgid "Active"
 msgstr "Actif"
 
-#: src/evdev-plug/ed_ui.c:655
-#: src/sun/configure.c:488
+#: src/evdev-plug/ed_ui.c:655 src/sun/configure.c:488
 msgid "Status"
 msgstr "Statut"
 
@@ -2061,11 +2706,14 @@
 msgid ""
 "This input event has been already assigned.\n"
 "\n"
-"It's not possible to assign multiple actions to the same input event (although it's possible to assign the same action to multiple events)."
+"It's not possible to assign multiple actions to the same input event "
+"(although it's possible to assign the same action to multiple events)."
 msgstr ""
 "Cet événement a déjà été assigné.\n"
 "\n"
-"Il n'est pas possible d'associer des plusieurs actions au même événement (cepndant, il est possible d'attribuer la même action à plusieurs événements)."
+"Il n'est pas possible d'associer des plusieurs actions au même événement "
+"(cepndant, il est possible d'attribuer la même action à plusieurs "
+"événements)."
 
 #: src/evdev-plug/ed_ui.c:1323
 msgid "EvDev-Plug - Bindings Configuration"
@@ -2105,210 +2753,6 @@
 "Écrit par Giacomo Lozito < james@develia.org >\n"
 "\n"
 
-#: src/filewriter/vorbis.c:267
-msgid "Vorbis Encoder Configuration"
-msgstr "Encodeur 'Vorbis'"
-
-#: src/filewriter/vorbis.c:274
-#: src/filewriter/mp3.c:976
-#: src/modplug/gui/interface.cxx:319
-#: src/modplug/gui/modplug.glade:507
-msgid "Quality"
-msgstr "Qualité"
-
-#: src/filewriter/vorbis.c:287
-msgid "Quality level (0 - 10):"
-msgstr "Niveau de qualité (0 - 10) :"
-
-#: src/filewriter/mp3.c:670
-msgid "MP3 Configuration"
-msgstr "Configuration de l'encodeur MP3"
-
-#: src/filewriter/mp3.c:697
-msgid "Algorithm Quality:"
-msgstr "Qualité de l'algorithme :"
-
-#: src/filewriter/mp3.c:719
-msgid ""
-"best/slowest:0;\n"
-"worst/fastest:9;\n"
-"recommended:2;\n"
-"default:5;"
-msgstr ""
-"meilleure / la plus lente : 0\n"
-"pire / la plus rapide : 9\n"
-"recommandée : 2\n"
-"par défaut : 5"
-
-#: src/filewriter/mp3.c:727
-msgid "Output Samplerate:"
-msgstr "Taux d'échantillonnage de sortie :"
-
-#: src/filewriter/mp3.c:738
-#: src/filewriter/mp3.c:879
-msgid "Auto"
-msgstr "Auto"
-
-#: src/filewriter/mp3.c:760
-msgid "(Hz)"
-msgstr "(Hz)"
-
-#: src/filewriter/mp3.c:772
-msgid "Bitrate / Compression ratio:"
-msgstr "Débit / Taux de compression :"
-
-#: src/filewriter/mp3.c:798
-msgid "Bitrate (kbps):"
-msgstr "Débit (kbps)"
-
-#: src/filewriter/mp3.c:839
-msgid "Compression ratio:"
-msgstr "Taux de compression :"
-
-#: src/filewriter/mp3.c:869
-msgid "Audio Mode:"
-msgstr "Mode audio :"
-
-#: src/filewriter/mp3.c:884
-msgid "Joint-Stereo"
-msgstr "Stéréo jointe"
-
-#: src/filewriter/mp3.c:889
-#: src/sid/xs_interface.c:295
-#: src/timidity/interface.c:173
-#: src/adplug/adplug-xmms.cc:330
-#: src/modplug/gui/interface.cxx:204
-#: src/modplug/gui/modplug.glade:159
-#: src/sid/xmms-sid.glade:176
-msgid "Stereo"
-msgstr "Stéréo"
-
-#: src/filewriter/mp3.c:894
-#: src/sid/xs_interface.c:288
-#: src/timidity/interface.c:165
-#: src/adplug/adplug-xmms.cc:325
-#: src/sid/xmms-sid.glade:157
-msgid "Mono"
-msgstr "Mono"
-
-#: src/filewriter/mp3.c:925
-msgid "auto-M/S mode"
-msgstr "Mode mono/stéréo automatique"
-
-#: src/filewriter/mp3.c:937
-msgid "Misc:"
-msgstr "Divers :"
-
-#: src/filewriter/mp3.c:948
-msgid "Enforce strict ISO complience"
-msgstr "Forcer le respect strict des normes ISO"
-
-#: src/filewriter/mp3.c:959
-msgid "Error protection"
-msgstr "Protection contre les erreurs"
-
-#: src/filewriter/mp3.c:971
-msgid "Adds 16 bit checksum to every frame"
-msgstr "Ajoute à chaque trame une somme de contrôle sur 16 bits"
-
-#: src/filewriter/mp3.c:988
-msgid "Enable VBR/ABR"
-msgstr "Activer VBR/ABR"
-
-#: src/filewriter/mp3.c:1000
-msgid "Type:"
-msgstr "Type :"
-
-#: src/filewriter/mp3.c:1011
-msgid "Variable bitrate"
-msgstr "Débit variable"
-
-#: src/filewriter/mp3.c:1023
-msgid "Average bitrate"
-msgstr "Débit moyen"
-
-#: src/filewriter/mp3.c:1037
-msgid "VBR Options:"
-msgstr "Options VBR :"
-
-#: src/filewriter/mp3.c:1053
-msgid "Minimum bitrate (kbps):"
-msgstr "Débit minimal (kbps) :"
-
-#: src/filewriter/mp3.c:1089
-msgid "Maximum bitrate (kbps):"
-msgstr "Débit maximal (kbps) :"
-
-#: src/filewriter/mp3.c:1121
-msgid "Strictly enforce minimum bitrate"
-msgstr "Forcer de manière stricte le débit minimal"
-
-#: src/filewriter/mp3.c:1123
-msgid "For use with players that do not support low bitrate mp3 (Apex AD600-A DVD/mp3 player)"
-msgstr "Cette option est destinée aux lecteurs qui ne supportent pas les fichiers mp3 dont le débit est bas (le lecteur DVD/mp3 'Apex AD600-A', notamment)"
-
-#: src/filewriter/mp3.c:1136
-msgid "ABR Options:"
-msgstr "Options ABR :"
-
-#: src/filewriter/mp3.c:1146
-msgid "Average bitrate (kbps):"
-msgstr "Débit moyen (kbps) :"
-
-#: src/filewriter/mp3.c:1183
-msgid "VBR quality level:"
-msgstr "Niveau de qualité VBR :"
-
-#: src/filewriter/mp3.c:1198
-msgid ""
-"highest:0;\n"
-"lowest:9;\n"
-"default:4;"
-msgstr ""
-"Le plus élevé : 0\n"
-"Le plus bas : 9\n"
-"Défaut : 4"
-
-#: src/filewriter/mp3.c:1206
-msgid "Don't write Xing VBR header"
-msgstr "Ne pas écrire l'en-tête VBR 'Xing'"
-
-#: src/filewriter/mp3.c:1221
-msgid "VBR/ABR"
-msgstr "VBR/ABR"
-
-#: src/filewriter/mp3.c:1233
-msgid "Frame params:"
-msgstr "Paramètres des trames :"
-
-#: src/filewriter/mp3.c:1245
-msgid "Mark as copyright"
-msgstr "Marquer comme soumises aux droits d'utilisation"
-
-#: src/filewriter/mp3.c:1256
-msgid "Mark as original"
-msgstr "Marquer comme originales"
-
-#: src/filewriter/mp3.c:1268
-msgid "ID3 params:"
-msgstr "Paramètres ID3 :"
-
-#: src/filewriter/mp3.c:1279
-msgid "Force addition of version 2 tag"
-msgstr "Forcer l'ajout de la version 2 des métadonnées"
-
-#: src/filewriter/mp3.c:1289
-msgid "Only add v1 tag"
-msgstr "Ajouter uniquement la version 1 des métadonnées"
-
-#: src/filewriter/mp3.c:1296
-msgid "Only add v2 tag"
-msgstr "Ajouter uniquement la version 2 des métadonnées"
-
-#: src/filewriter/mp3.c:1317
-msgid "Tags"
-msgstr "Métadonnées"
-
 #: src/filewriter/filewriter.c:168
 msgid "About FileWriter-Plugin"
 msgstr "À propos du module 'FileWriter'"
@@ -2337,12 +2781,14 @@
 "Ceci est une traduction non officielle de la \"GNU General Public License\"\n"
 "en français. Elle n'a pas été publiée par la \"Free Software Foundation\",\n"
 "et ne détermine pas les termes de distribution pour les logiciels qui\n"
-"utilisent la \"GNU GPL\" -- seul le texte anglais original de la \"GNU GPL\" en a\n"
+"utilisent la \"GNU GPL\" -- seul le texte anglais original de la \"GNU GPL\" "
+"en a\n"
 "le droit. Cependant, nous espérons que cette traduction aidera les\n"
 "francophones à mieux comprendre la \"GNU GPL\".\n"
 "\n"
 "Ce programme est un logiciel libre : vous pouvez le redistribuer et/ou le\n"
-"modifier selon les termes de la \"Licence Publique Générale GNU\" (GNU GPL),\n"
+"modifier selon les termes de la \"Licence Publique Générale GNU\" (GNU "
+"GPL),\n"
 "telle que publiée par la \"Free Software Foundation\", soit la version 2 de\n"
 "la Licence, soit (à votre convenance) toute version postérieure.\n"
 "\n"
@@ -2365,8 +2811,7 @@
 msgid "Output file format:"
 msgstr "Format du fichier de sortie :"
 
-#: src/filewriter/filewriter.c:511
-#: src/ladspa/ladspa.c:960
+#: src/filewriter/filewriter.c:511 src/ladspa/ladspa.c:960
 msgid "Configure"
 msgstr "Configurer"
 
@@ -2403,18 +2848,209 @@
 msgstr "Conserver l'extension du nom de fichier"
 
 #: src/filewriter/filewriter.c:590
-msgid "If enabled, the extension from the original filename will not be stripped before adding the new file extension to the end."
-msgstr "Si cette option est activée, l'extension du nom du fichier source ne sera pas supprimée avant l'ajout de la nouvelle extension."
+msgid ""
+"If enabled, the extension from the original filename will not be stripped "
+"before adding the new file extension to the end."
+msgstr ""
+"Si cette option est activée, l'extension du nom du fichier source ne sera "
+"pas supprimée avant l'ajout de la nouvelle extension."
 
 #: src/filewriter/filewriter.c:604
 msgid "Prepend track number to filename"
 msgstr "Ajouter le numéro de la piste au début du nom du fichier"
 
-#: src/flacng/plugin.c:692
+#: src/filewriter/mp3.c:676
+msgid "MP3 Configuration"
+msgstr "Configuration de l'encodeur MP3"
+
+#: src/filewriter/mp3.c:703
+msgid "Algorithm Quality:"
+msgstr "Qualité de l'algorithme :"
+
+#: src/filewriter/mp3.c:725
+msgid ""
+"best/slowest:0;\n"
+"worst/fastest:9;\n"
+"recommended:2;\n"
+"default:5;"
+msgstr ""
+"meilleure / la plus lente : 0\n"
+"pire / la plus rapide : 9\n"
+"recommandée : 2\n"
+"par défaut : 5"
+
+#: src/filewriter/mp3.c:733
+msgid "Output Samplerate:"
+msgstr "Taux d'échantillonnage de sortie :"
+
+#: src/filewriter/mp3.c:744 src/filewriter/mp3.c:885
+msgid "Auto"
+msgstr "Auto"
+
+#: src/filewriter/mp3.c:766
+msgid "(Hz)"
+msgstr "(Hz)"
+
+#: src/filewriter/mp3.c:778
+msgid "Bitrate / Compression ratio:"
+msgstr "Débit / Taux de compression :"
+
+#: src/filewriter/mp3.c:804
+msgid "Bitrate (kbps):"
+msgstr "Débit (kbps)"
+
+#: src/filewriter/mp3.c:845
+msgid "Compression ratio:"
+msgstr "Taux de compression :"
+
+#: src/filewriter/mp3.c:875
+msgid "Audio Mode:"
+msgstr "Mode audio :"
+
+#: src/filewriter/mp3.c:890
+msgid "Joint-Stereo"
+msgstr "Stéréo jointe"
+
+#: src/filewriter/mp3.c:931
+msgid "auto-M/S mode"
+msgstr "Mode mono/stéréo automatique"
+
+#: src/filewriter/mp3.c:943
+msgid "Misc:"
+msgstr "Divers :"
+
+#: src/filewriter/mp3.c:954
+msgid "Enforce strict ISO complience"
+msgstr "Forcer le respect strict des normes ISO"
+
+#: src/filewriter/mp3.c:965
+msgid "Error protection"
+msgstr "Protection contre les erreurs"
+
+#: src/filewriter/mp3.c:977
+msgid "Adds 16 bit checksum to every frame"
+msgstr "Ajoute à chaque trame une somme de contrôle sur 16 bits"
+
+#: src/filewriter/mp3.c:982 src/filewriter/vorbis.c:274
+#: src/modplug/gui/interface.cxx:319 src/modplug/gui/modplug.glade:507
+msgid "Quality"
+msgstr "Qualité"
+
+#: src/filewriter/mp3.c:994
+msgid "Enable VBR/ABR"
+msgstr "Activer VBR/ABR"
+
+#: src/filewriter/mp3.c:1006
+msgid "Type:"
+msgstr "Type :"
+
+#: src/filewriter/mp3.c:1017
+msgid "Variable bitrate"
+msgstr "Débit variable"
+
+#: src/filewriter/mp3.c:1029
+msgid "Average bitrate"
+msgstr "Débit moyen"
+
+#: src/filewriter/mp3.c:1043
+msgid "VBR Options:"
+msgstr "Options VBR :"
+
+#: src/filewriter/mp3.c:1059
+msgid "Minimum bitrate (kbps):"
+msgstr "Débit minimal (kbps) :"
+
+#: src/filewriter/mp3.c:1095
+msgid "Maximum bitrate (kbps):"
+msgstr "Débit maximal (kbps) :"
+
+#: src/filewriter/mp3.c:1127
+msgid "Strictly enforce minimum bitrate"
+msgstr "Forcer de manière stricte le débit minimal"
+
+#: src/filewriter/mp3.c:1129
+msgid ""
+"For use with players that do not support low bitrate mp3 (Apex AD600-A DVD/"
+"mp3 player)"
+msgstr ""
+"Cette option est destinée aux lecteurs qui ne supportent pas les fichiers "
+"mp3 dont le débit est bas (le lecteur DVD/mp3 'Apex AD600-A', notamment)"
+
+#: src/filewriter/mp3.c:1142
+msgid "ABR Options:"
+msgstr "Options ABR :"
+
+#: src/filewriter/mp3.c:1152
+msgid "Average bitrate (kbps):"
+msgstr "Débit moyen (kbps) :"
+
+#: src/filewriter/mp3.c:1189
+msgid "VBR quality level:"
+msgstr "Niveau de qualité VBR :"
+
+#: src/filewriter/mp3.c:1204
+msgid ""
+"highest:0;\n"
+"lowest:9;\n"
+"default:4;"
+msgstr ""
+"Le plus élevé : 0\n"
+"Le plus bas : 9\n"
+"Défaut : 4"
+
+#: src/filewriter/mp3.c:1212
+msgid "Don't write Xing VBR header"
+msgstr "Ne pas écrire l'en-tête VBR 'Xing'"
+
+#: src/filewriter/mp3.c:1227
+msgid "VBR/ABR"
+msgstr "VBR/ABR"
+
+#: src/filewriter/mp3.c:1239
+msgid "Frame params:"
+msgstr "Paramètres des trames :"
+
+#: src/filewriter/mp3.c:1251
+msgid "Mark as copyright"
+msgstr "Marquer comme soumises aux droits d'utilisation"
+
+#: src/filewriter/mp3.c:1262
+msgid "Mark as original"
+msgstr "Marquer comme originales"
+
+#: src/filewriter/mp3.c:1274
+msgid "ID3 params:"
+msgstr "Paramètres ID3 :"
+
+#: src/filewriter/mp3.c:1285
+msgid "Force addition of version 2 tag"
+msgstr "Forcer l'ajout de la version 2 des métadonnées"
+
+#: src/filewriter/mp3.c:1295
+msgid "Only add v1 tag"
+msgstr "Ajouter uniquement la version 1 des métadonnées"
+
+#: src/filewriter/mp3.c:1302
+msgid "Only add v2 tag"
+msgstr "Ajouter uniquement la version 2 des métadonnées"
+
+#: src/filewriter/mp3.c:1323
+msgid "Tags"
+msgstr "Métadonnées"
+
+#: src/filewriter/vorbis.c:267
+msgid "Vorbis Encoder Configuration"
+msgstr "Encodeur 'Vorbis'"
+
+#: src/filewriter/vorbis.c:287
+msgid "Quality level (0 - 10):"
+msgstr "Niveau de qualité (0 - 10) :"
+
+#: src/flacng/plugin.c:698
 msgid "FLAC Audio Plugin "
 msgstr "Module audio 'Flac' "
 
-#: src/flacng/plugin.c:693
+#: src/flacng/plugin.c:699
 msgid ""
 "\n"
 "\n"
@@ -2430,7 +3066,7 @@
 "\n"
 "http://www.skytale.net/projects/bmp-flac2/"
 
-#: src/flacng/plugin.c:698
+#: src/flacng/plugin.c:704
 msgid "About FLAC Audio Plugin"
 msgstr "À propos du module audio 'FLAC'"
 
@@ -2450,8 +3086,61 @@
 "\n"
 "Ce module permet de contrôler le lecteur avec les raccourcis de Gnome.\n"
 "\n"
-"Droits d'utilisation : Sascha Hlusiak <contact@saschahlusiak.de> (2007-2008)\n"
-"\n"
+"Droits d'utilisation : Sascha Hlusiak <contact@saschahlusiak.de> (2007-"
+"2008)\n"
+"\n"
+
+#: src/hotkey/gui.c:68
+msgid "Previous Track"
+msgstr "Piste précédente"
+
+#: src/hotkey/gui.c:69
+msgid "Play"
+msgstr "Lecture"
+
+#: src/hotkey/gui.c:70
+msgid "Pause/Resume"
+msgstr "Pause / Reprise"
+
+#: src/hotkey/gui.c:71
+msgid "Stop"
+msgstr "Arrêt"
+
+#: src/hotkey/gui.c:72
+msgid "Next Track"
+msgstr "Piste suivante"
+
+#: src/hotkey/gui.c:73
+msgid "Forward 5 Seconds"
+msgstr "Avancer de 5 secondes"
+
+#: src/hotkey/gui.c:74
+msgid "Rewind 5 Seconds"
+msgstr "Reculer de 5 secondes"
+
+#: src/hotkey/gui.c:75
+msgid "Mute"
+msgstr "Rendre le volume nul"
+
+#: src/hotkey/gui.c:76
+msgid "Volume Up"
+msgstr "Augmenter le volume"
+
+#: src/hotkey/gui.c:77
+msgid "Volume Down"
+msgstr "Réduire le volume"
+
+#: src/hotkey/gui.c:78
+msgid "Jump to File"
+msgstr "Aller au fichier..."
+
+#: src/hotkey/gui.c:79
+msgid "Toggle Player Windows"
+msgstr "Afficher / Cacher les fenêtres du lecteur"
+
+#: src/hotkey/gui.c:80
+msgid "Show On-Screen-Display"
+msgstr "Activer l'affichage à l'écran ('OSD')"
 
 #: src/hotkey/gui.c:90
 msgid "(none)"
@@ -2459,7 +3148,8 @@
 
 #: src/hotkey/gui.c:227
 msgid ""
-"It is not recommended to bind the primary mouse buttons without modificators.\n"
+"It is not recommended to bind the primary mouse buttons without "
+"modificators.\n"
 "\n"
 "Do you want to continue?"
 msgstr ""
@@ -2523,13 +3213,16 @@
 "Permet de contrôler le lecteur à l'aide de combinaisons de touches\n"
 "ou des fonctions multimédia du clavier.\n"
 "\n"
-"Droits d'utilisation (2007-2008) : Sascha Hlusiak <contact@saschahlusiak.de>\n"
+"Droits d'utilisation (2007-2008) : Sascha Hlusiak <contact@saschahlusiak."
+"de>\n"
 "\n"
 "\n"
 "Ont contribué :\n"
 "\n"
-"Vladimir Paskov     <vlado.paskov@gmail.com> (Droits d'utilisation 2006-2007)\n"
-"Ville Syrjälä            <syrjala@sci.fi>                    (Droits d'utilisation 2000-2002)\n"
+"Vladimir Paskov     <vlado.paskov@gmail.com> (Droits d'utilisation 2006-"
+"2007)\n"
+"Ville Syrjälä            <syrjala@sci.fi>                    (Droits "
+"d'utilisation 2000-2002)\n"
 "Bryn Davies           <curious@ihug.com.au>\n"
 "Jonathan A. Davis  <davis@jdhouse.org>\n"
 "Jeremy Tan             <nsx@nsx.homeip.net>\n"
@@ -2588,8 +3281,7 @@
 "\n"
 "Chris Morgan <cmorgan@alum.wpi.edu>\n"
 
-#: src/jack/jack.c:100
-#: src/wma/wma.c:157
+#: src/jack/jack.c:100 src/wma/wma.c:148
 msgid " Close "
 msgstr " Fermer "
 
@@ -2620,8 +3312,7 @@
 msgid "This LADSPA plugin has no user controls"
 msgstr "Cette extension LADSPA ne dispose pas de contrôles utilisateur"
 
-#: src/ladspa/ladspa.c:767
-#: src/ladspa/ladspa.c:853
+#: src/ladspa/ladspa.c:767 src/ladspa/ladspa.c:853
 msgid "Name"
 msgstr "Nom"
 
@@ -2649,61 +3340,16 @@
 msgid "LADSPA Plugin Catalog"
 msgstr "Liste des extensions 'LADSPA'"
 
-#: src/lirc/lirc.c:83
-#, c-format
-msgid "%s: could not init LIRC support\n"
-msgstr "%s: impossible d'initialiser le support 'LIRC'\n"
-
-#: src/lirc/lirc.c:91
-#, c-format
+#: src/lastfm/lastfm.c:96
 msgid ""
-"%s: could not read LIRC config file\n"
-"%s: please read the documentation of LIRC\n"
-"%s: how to create a proper config file\n"
+"<b><big>Couldn't initialize the last.fm radio plugin.</big></b>\n"
+"\n"
+"Check if your Scrobbler's plugin login data is set up properly."
 msgstr ""
-"%s: impossible de lire le fichier de configuration de 'LIRC'\n"
-"%s: veuillez consulter la documentation de 'LIRC'\n"
-"%s: relative à la création d'un fichier de configuration correct\n"
-
-#: src/lirc/lirc.c:118
-#, c-format
-msgid "%s: trying to reconnect...\n"
-msgstr "%s: tentative de reconnexion...\n"
-
-#: src/lirc/lirc.c:339
-#, c-format
-msgid "%s: unknown command \"%s\"\n"
-msgstr "%s: commande inconnue \"%s\"\n"
-
-#: src/lirc/lirc.c:349
-#, c-format
-msgid "%s: disconnected from LIRC\n"
-msgstr "%s: déconnecté de 'LIRC'\n"
-
-#: src/lirc/lirc.c:353
-#, c-format
-msgid "%s: will try reconnect every %d seconds...\n"
-msgstr "%s: le système va essayer de se reconnecter toutes les %d seconds...\n"
-
-#: src/lirc/interface.c:37
-msgid "LIRC plugin settings"
-msgstr "Paramètres du module 'LIRC' "
-
-#: src/lirc/interface.c:61
-msgid "Reconnect to LIRC server"
-msgstr "Se reconnecter au serveur 'LIRC'"
-
-#: src/lirc/interface.c:68
-msgid "Timeout before reconnecting (seconds): "
-msgstr "Délai (secondes) avant la reconnexion :"
-
-#: src/lirc/interface.c:75
-msgid "Reconnect"
-msgstr "Reconnexion"
-
-#: src/lirc/interface.c:79
-msgid "Connection"
-msgstr "Connexion"
+"<b><big>Impossible d'initialiser le module 'Radio last.fm'.</big></b>\n"
+"\n"
+"Veuillez vérifier si les informations de connexion de 'Scrobbler' sont "
+"correctes."
 
 #: src/lirc/about.c:63
 msgid "About LIRC Audacious Plugin"
@@ -2743,6 +3389,62 @@
 "Vous pouvez obtenir des informations sur 'LIRC' à cette adresse :\n"
 "http://lirc.org"
 
+#: src/lirc/interface.c:37
+msgid "LIRC plugin settings"
+msgstr "Paramètres du module 'LIRC' "
+
+#: src/lirc/interface.c:61
+msgid "Reconnect to LIRC server"
+msgstr "Se reconnecter au serveur 'LIRC'"
+
+#: src/lirc/interface.c:68
+msgid "Timeout before reconnecting (seconds): "
+msgstr "Délai (secondes) avant la reconnexion :"
+
+#: src/lirc/interface.c:75
+msgid "Reconnect"
+msgstr "Reconnexion"
+
+#: src/lirc/interface.c:79
+msgid "Connection"
+msgstr "Connexion"
+
+#: src/lirc/lirc.c:83
+#, c-format
+msgid "%s: could not init LIRC support\n"
+msgstr "%s: impossible d'initialiser le support 'LIRC'\n"
+
+#: src/lirc/lirc.c:91
+#, c-format
+msgid ""
+"%s: could not read LIRC config file\n"
+"%s: please read the documentation of LIRC\n"
+"%s: how to create a proper config file\n"
+msgstr ""
+"%s: impossible de lire le fichier de configuration de 'LIRC'\n"
+"%s: veuillez consulter la documentation de 'LIRC'\n"
+"%s: relative à la création d'un fichier de configuration correct\n"
+
+#: src/lirc/lirc.c:118
+#, c-format
+msgid "%s: trying to reconnect...\n"
+msgstr "%s: tentative de reconnexion...\n"
+
+#: src/lirc/lirc.c:339
+#, c-format
+msgid "%s: unknown command \"%s\"\n"
+msgstr "%s: commande inconnue \"%s\"\n"
+
+#: src/lirc/lirc.c:349
+#, c-format
+msgid "%s: disconnected from LIRC\n"
+msgstr "%s: déconnecté de 'LIRC'\n"
+
+#: src/lirc/lirc.c:353
+#, c-format
+msgid "%s: will try reconnect every %d seconds...\n"
+msgstr "%s: le système va essayer de se reconnecter toutes les %d seconds...\n"
+
 #: src/madplug/configure.c:209
 msgid "MPEG Audio Plugin Configuration"
 msgstr "Configuration du module audio 'MPEG'"
@@ -2753,7 +3455,8 @@
 
 #: src/madplug/configure.c:234
 msgid "Force reopen audio when audio type changed"
-msgstr "Forcer la réouverture de la sortie audio lorsque le format du flux a changé"
+msgstr ""
+"Forcer la réouverture de la sortie audio lorsque le format du flux a changé"
 
 #: src/madplug/configure.c:243
 msgid "Metadata Settings"
@@ -2769,7 +3472,9 @@
 
 #: src/madplug/configure.c:266
 msgid "Use SJIS to write ID3 tags (not recommended)"
-msgstr "Utiliser 'SJIS' pour écrire les métadonnées ID3 (l'opération n'est pas recommandée)"
+msgstr ""
+"Utiliser 'SJIS' pour écrire les métadonnées ID3 (l'opération n'est pas "
+"recommandée)"
 
 #: src/madplug/configure.c:273
 msgid "Miscellaneous Settings"
@@ -2779,18 +3484,7 @@
 msgid "Display average bitrate for VBR"
 msgstr "Afficher le débit moyen pour l'encodage VBR"
 
-#: src/madplug/configure.c:290
-#: src/adplug/adplug-xmms.cc:291
-#: src/console/Audacious_Config.cxx:145
-#: src/modplug/gui/interface.cxx:628
-#: src/modplug/gui/interface.cxx:887
-#: src/modplug/gui/modplug.glade:1404
-#: src/modplug/gui/modplug.glade:1804
-msgid "General"
-msgstr "Général"
-
-#: src/madplug/configure.c:296
-#: src/vorbis/configure.c:102
+#: src/madplug/configure.c:296 src/vorbis/configure.c:102
 msgid "Override generic titles"
 msgstr "Remplacer les titres génériques"
 
@@ -2798,9 +3492,8 @@
 msgid "ID3 format:"
 msgstr "Format ID3 :"
 
-#: src/madplug/configure.c:320
+#: src/madplug/configure.c:320 src/sid/xmms-sid.glade:2540
 #: src/sid/xs_interface.c:1070
-#: src/sid/xmms-sid.glade:2540
 msgid "Title"
 msgstr "Titre"
 
@@ -2864,2040 +3557,109 @@
 "'tact://77' produira 77 battements par minute\n"
 "'tact://60*3/4' produira 60 battements par minute (mesure à 3/4)"
 
-#: src/metronom/metronom.c:198
-#: src/metronom/metronom.c:262
+#: src/metronom/metronom.c:198 src/metronom/metronom.c:262
 #, c-format
 msgid "Tact generator: %d bpm"
 msgstr "Métronome : %d bpm"
 
-#: src/metronom/metronom.c:200
-#: src/metronom/metronom.c:264
+#: src/metronom/metronom.c:200 src/metronom/metronom.c:264
 #, c-format
 msgid "Tact generator: %d bpm %d/%d"
 msgstr "Métronome : %d bpm %d/%d"
 
-#: src/mtp_up/mtp.c:35
-msgid "Upload selected track(s)"
-msgstr "Transférer la sélection"
-
-#: src/mtp_up/mtp.c:296
-msgid "Upload in progress..."
-msgstr "Transfert en cours..."
-
-#: src/mtp_up/mtp.c:305
-msgid "MTP device handler"
-msgstr "Support MTP"
-
-#: src/mtp_up/mtp.c:309
-msgid "Disconnect the device"
-msgstr "Déconnecter le périphérique"
-
-#: src/null/null.c:61
-msgid "Null output plugin "
-msgstr "Module de sortie 'Null' "
-
-#: src/null/null.c:62
-msgid ""
-" by Christian Birchinger <joker@netswarm.net>\n"
-"based on the XMMS plugin by Håvard Kvål <havardk@xmms.org>"
-msgstr ""
-" \n"
-"\n"
-"Écrit par Christian Birchinger <joker@netswarm.net>,\n"
-"à partir du module pour XMMS de Håvard Kvål <havardk@xmms.org>"
-
-#: src/null/null.c:65
-msgid "About Null Output"
-msgstr "À propos du module de sortie 'Null'"
-
-#: src/null/null.c:94
-msgid "Null output preferences"
-msgstr "Préférences du module de sortie 'Null'"
-
-#: src/null/null.c:103
-msgid "Run in real time"
-msgstr "Utiliser en temps réel"
-
-#: src/OSS/configure.c:151
-#: src/OSS4/configure.c:120
-#, c-format
-msgid "Default (%s)"
-msgstr "Défaut (%s)"
-
-#: src/OSS/configure.c:201
-#: src/OSS4/configure.c:170
-msgid "OSS Driver configuration"
-msgstr "Configuration du pilote 'OSS'"
-
-#: src/OSS/configure.c:239
-#: src/OSS/configure.c:280
-#: src/OSS4/configure.c:208
-msgid "Use alternate device:"
-msgstr "Utiliser un autre périphérique :"
-
-#: src/OSS/configure.c:302
-#: src/OSS4/configure.c:230
-#: src/sun/configure.c:248
-msgid "Devices"
-msgstr "Périphériques"
-
-#: src/OSS/configure.c:343
-#: src/OSS4/configure.c:272
-msgid "Mixer Settings:"
-msgstr "Paramètres du mélangeur :"
-
-#: src/OSS/configure.c:349
-msgid "Volume controls Master not PCM"
-msgstr "Contrôle du volume via le canal 'maître' au lieu du canal 'PCM'"
-
-#: src/OSS/configure.c:355
-#: src/OSS4/configure.c:284
-#: src/sun/configure.c:394
-msgid "Mixer"
-msgstr "Mélangeur audio"
-
-#: src/OSS/about.c:39
-msgid "About OSS Driver"
-msgstr "À propos du pilote 'OSS'"
-
-#: src/OSS/about.c:40
-msgid ""
-"Audacious OSS Driver\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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,\n"
-"USA."
-msgstr ""
-"Pilote 'OSS' pour Audacious\n"
-"\n"
-"Ceci est une traduction non officielle de la \"GNU General Public License\"\n"
-"en français. Elle n'a pas été publiée par la \"Free Software Foundation\",\n"
-"et ne détermine pas les termes de distribution pour les logiciels qui\n"
-"utilisent la \"GNU GPL\" -- seul le texte anglais original de la \"GNU GPL\" en a\n"
-"le droit. Cependant, nous espérons que cette traduction aidera les\n"
-"francophones à mieux comprendre la \"GNU GPL\".\n"
-"\n"
-"Ce programme est un logiciel libre : vous pouvez le redistribuer et/ou le\n"
-"modifier selon les termes de la \"Licence Publique Générale GNU\" (GNU GPL),\n"
-"telle que publiée par la \"Free Software Foundation\", soit la version 2 de\n"
-"la Licence, soit (à votre convenance) toute version postérieure.\n"
-"\n"
-"Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE\n"
-"GARANTIE, sans même la garantie implicite d'une possible VALEUR MARCHANDE\n"
-"ou de l'ADÉQUATION à UN BESOIN PARTICULIER. Consultez la \"Licence Publique\n"
-"Générale GNU\" (GNU GPL) pour plus de détails.\n"
-"\n"
-"Vous devriez avoir reçu une copie de la \"Licence Publique Générale GNU\"\n"
-"(GNU GPL) avec ce programme. Dans le cas contraire, vous pouvez consulter\n"
-"la Licence sur la page <http://www.gnu.org/licenses/> ou écrire à la\n"
-"Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,\n"
-"MA 02110-1301, USA."
-
-#: src/OSS4/configure.c:278
-msgid "Save VMIX volume between sessions"
-msgstr "Conserver le volume de 'VMIX', d'une session à l'autre"
-
-#: src/OSS4/about.c:42
-msgid "About OSSv4 Driver"
-msgstr "À propos du pilote 'OSSv4'"
-
-#: src/OSS4/about.c:43
-msgid ""
-"Audacious OSSv4 Driver\n"
-"\n"
-"Based on the OSSv3 Output plugin,\n"
-"Ported to OSSv4's VMIX by Cristi Magherusan <majeru@gentoo.ro>\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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,\n"
-"USA."
-msgstr ""
-"Pilote 'OSSv4' pour Audacious\n"
-"\n"
-"Basé sur le module de sortie 'OSSv3'\n"
-"Rétroporté pour 'VMIX' du pilote 'OSSv4' par\n"
-"Cristi Magherusan <majeru@gentoo.ro>\n"
-"\n"
-"Ceci est une traduction non officielle de la \"GNU General Public License\"\n"
-"en français. Elle n'a pas été publiée par la \"Free Software Foundation\",\n"
-"et ne détermine pas les termes de distribution pour les logiciels qui\n"
-"utilisent la \"GNU GPL\" -- seul le texte anglais original de la \"GNU GPL\" en a\n"
-"le droit. Cependant, nous espérons que cette traduction aidera les\n"
-"francophones à mieux comprendre la \"GNU GPL\".\n"
-"\n"
-"Ce programme est un logiciel libre : vous pouvez le redistribuer et/ou le\n"
-"modifier selon les termes de la \"Licence Publique Générale GNU\" (GNU GPL),\n"
-"telle que publiée par la \"Free Software Foundation\", soit la version 2 de\n"
-"la Licence, soit (à votre convenance) toute version postérieure.\n"
-"\n"
-"Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE\n"
-"GARANTIE, sans même la garantie implicite d'une possible VALEUR MARCHANDE\n"
-"ou de l'ADÉQUATION à UN BESOIN PARTICULIER. Consultez la \"Licence Publique\n"
-"Générale GNU\" (GNU GPL) pour plus de détails.\n"
-"\n"
-"Vous devriez avoir reçu une copie de la \"Licence Publique Générale GNU\"\n"
-"(GNU GPL) avec ce programme. Dans le cas contraire, vous pouvez consulter\n"
-"la Licence sur la page <http://www.gnu.org/licenses/> ou écrire à la\n"
-"Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,\n"
-"MA 02110-1301, USA."
-
-#: src/projectm-1.0/main.c:70
-msgid "_Random"
-msgstr "_Aléatoire"
-
-#: src/pulse_audio/pulse_audio.c:722
-msgid "About Audacious PulseAudio Output Plugin"
-msgstr "À propos du module de sortie 'PulseAudio' pour Audacious"
-
-#: src/pulse_audio/pulse_audio.c:723
-msgid ""
-"Audacious PulseAudio Output Plugin\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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,\n"
-"USA."
-msgstr ""
-"Module de sortie 'PulseAudio' pour Audacious\n"
-"\n"
-"Ceci est une traduction non officielle de la \"GNU General Public License\"\n"
-"en français. Elle n'a pas été publiée par la \"Free Software Foundation\",\n"
-"et ne détermine pas les termes de distribution pour les logiciels qui\n"
-"utilisent la \"GNU GPL\" -- seul le texte anglais original de la \"GNU GPL\" en a\n"
-"le droit. Cependant, nous espérons que cette traduction aidera les\n"
-"francophones à mieux comprendre la \"GNU GPL\".\n"
-"\n"
-"Ce programme est un logiciel libre : vous pouvez le redistribuer et/ou le\n"
-"modifier selon les termes de la \"Licence Publique Générale GNU\" (GNU GPL),\n"
-"telle que publiée par la \"Free Software Foundation\", soit la version 2 de\n"
-"la Licence, soit (à votre convenance) toute version postérieure.\n"
-"\n"
-"Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE\n"
-"GARANTIE, sans même la garantie implicite d'une possible VALEUR MARCHANDE\n"
-"ou de l'ADÉQUATION à UN BESOIN PARTICULIER. Consultez la \"Licence Publique\n"
-"Générale GNU\" (GNU GPL) pour plus de détails.\n"
-"\n"
-"Vous devriez avoir reçu une copie de la \"Licence Publique Générale GNU\"\n"
-"(GNU GPL) avec ce programme. Dans le cas contraire, vous pouvez consulter\n"
-"la Licence sur la page <http://www.gnu.org/licenses/> ou écrire à la\n"
-"Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,\n"
-"MA 02110-1301, USA."
-
-#: src/scrobbler/configure.c:138
-msgid "<b>Services</b>"
-msgstr "<b>Services</b>"
-
-#: src/scrobbler/configure.c:160
-#: src/scrobbler/configure.c:199
-msgid "Username:"
-msgstr "Utilisateur :"
-
-#: src/scrobbler/configure.c:166
-#: src/scrobbler/configure.c:205
-msgid "Password:"
-msgstr "Mot de passe :"
-
-#: src/scrobbler/configure.c:183
-msgid "<b>Last.FM</b>"
-msgstr "<b>Last.FM</b>"
-
-#: src/scrobbler/configure.c:222
-msgid "<b>Gerpok</b>"
-msgstr "<b>Gerpok</b>"
-
-#: src/scrobbler/gtkstuff.c:21
-msgid ""
-"Audacious AudioScrobbler Plugin\n"
-"\n"
-"Originally created by Audun Hove <audun@nlc.no> and Pipian <pipian@pipian.com>\n"
-msgstr ""
-"Module 'Scrobbler' pour Audacious\n"
-"\n"
-"Auteurs du code original :\n"
-"\n"
-"Audun Hove  <audun@nlc.no>\n"
-"Pipian            <pipian@pipian.com>\n"
-
-#: src/scrobbler/gtkstuff.c:23
-msgid "About Scrobbler Plugin"
-msgstr "À propos du module 'Scrobbler'"
-
-#: src/scrobbler/gtkstuff.c:36
-#, c-format
-msgid ""
-"There has been an error that may require your attention.\n"
-"\n"
-"Contents of server error:\n"
-"\n"
-"%s\n"
-msgstr ""
-"L'erreur qui s'est produite à l'instant peut nécessiter votre attention.\n"
-"\n"
-"Nature de l'erreur du serveur : \n"
-"\n"
-"%s\n"
-
-#: src/scrobbler/gtkstuff.c:43
-msgid "Scrobbler Error"
-msgstr "Erreur de 'Scrobbler'"
-
-#: src/sid/xs_interface.c:221
-#: src/sid/xmms-sid.glade:8
-msgid "Audacious-SID configuration"
-msgstr "Configuration de 'Audacious-SID'"
-
-#: src/sid/xs_interface.c:257
-#: src/sid/xmms-sid.glade:71
-msgid "8-bit"
-msgstr "8 bits"
-
-#: src/sid/xs_interface.c:264
-#: src/sid/xmms-sid.glade:90
-msgid "16-bit"
+#: src/modplug/gui/interface.cxx:136 src/modplug/gui/modplug.glade:9
+msgid "ModPlug Configuration"
+msgstr "Configuration de 'ModPlug'"
+
+#: src/modplug/gui/interface.cxx:173 src/modplug/gui/modplug.glade:73
+#: src/timidity/interface.c:140
+msgid "16 bit"
 msgstr "16 bits"
 
-#: src/sid/xs_interface.c:271
-#: src/sid/xmms-sid.glade:111
-msgid "Resolution:"
-msgstr "Résolution :"
-
-#: src/sid/xs_interface.c:302
-#: src/sid/xmms-sid.glade:196
-msgid "Autopanning"
-msgstr "Son panoramique"
-
-#: src/sid/xs_interface.c:309
-#: src/sid/xmms-sid.glade:217
-msgid "Channels:"
-msgstr "Sortie :"
-
-#: src/sid/xs_interface.c:341
-#: src/adplug/adplug-xmms.cc:733
-#: src/console/Audacious_Config.cxx:225
-#: src/sid/xmms-sid.glade:332
-msgid "Hz"
-msgstr "Hz"
-
-#: src/sid/xs_interface.c:353
-#: src/sid/xmms-sid.glade:384
-msgid "Samplerate:"
-msgstr "Taux d'échantillonnage :"
-
-#: src/sid/xs_interface.c:370
-#: src/sid/xmms-sid.glade:430
-msgid "Use oversampling"
-msgstr "Utiliser le suréchantillonnage"
-
-#: src/sid/xs_interface.c:381
-#: src/sid/xmms-sid.glade:456
-msgid "Factor:"
-msgstr "Facteur :"
-
-#: src/sid/xs_interface.c:393
-#: src/sid/xmms-sid.glade:500
-msgid "Large factors require more CPU-power"
-msgstr "Les facteurs élevés nécessitent plus de ressources du processeur"
-
-#: src/sid/xs_interface.c:399
-#: src/sid/xmms-sid.glade:534
-msgid "Oversampling:"
-msgstr "Suréchantillonnage :"
-
-#: src/sid/xs_interface.c:404
-#: src/sid/xmms-sid.glade:570
-msgid "Audio"
-msgstr "Audio"
-
-#: src/sid/xs_interface.c:432
-#: src/sid/xmms-sid.glade:622
-msgid "Force speed"
-msgstr "Forcer la vitesse"
-
-#: src/sid/xs_interface.c:436
-#: src/sid/xmms-sid.glade:620
-msgid "If enabled, this option \"forces\" the emulation engine to use the selected clock speed/frequency. Otherwise the speed is determined from played file itself."
-msgstr "Activée, cette option \"force\" le moteur de l'émulation à utiliser la vitesse/fréquence de l'horloge sélectionnée. Dans le cas contraire, la vitesse est déterminée par le fichier lui-même."
-
-#: src/sid/xs_interface.c:438
-#: src/sid/xmms-sid.glade:642
-msgid "PAL (50 Hz)"
-msgstr "PAL (50 Hz)"
-
-#: src/sid/xs_interface.c:442
-#: src/sid/xmms-sid.glade:640
-msgid "PAL is the european TV standard, which uses 50Hz vertical refresh frequency. Most of SID-tunes have been made for PAL computers."
-msgstr "'PAL' est le standard télévisuel européen ; il utilise une fréquence de rafraîchissement vertical de 50 hz. La plupart des compositions 'SID' ont été réalisées pour les ordinateurs 'PAL'."
-
-#: src/sid/xs_interface.c:446
-#: src/sid/xmms-sid.glade:662
-msgid "NTSC (60 Hz)"
-msgstr "NTSC (60 Hz)"
-
-#: src/sid/xs_interface.c:450
-#: src/sid/xmms-sid.glade:660
-msgid "NTSC is the TV standard with 60Hz vertical refresh rate (and other features that differ from PAL). It is mainly used in United States, Japan and certain other countries."
-msgstr "'NTSC' est le standard télévisuel qui utilise un taux de rafraîchissement vertical de 60 Hz (et d'autres caractéristiques qui diffèrent du standard 'PAL'). Il est principalement utilisé aux États-Unis, au Japon et dans d'autres pays."
-
-#: src/sid/xs_interface.c:454
-#: src/sid/xmms-sid.glade:683
-msgid "Clock speed:"
-msgstr "Vitesse d'horloge :"
-
-#: src/sid/xs_interface.c:471
-#: src/sid/xmms-sid.glade:730
-msgid "Force model"
-msgstr "Forcer le modèle"
-
-#: src/sid/xs_interface.c:475
-#: src/sid/xmms-sid.glade:728
-msgid "If enabled, this option \"forces\" the emulation engine to use the selected SID-chip model. Otherwise the preferred SID model is determined from the file (if PSIDv2NG type) or if not available, this setting is used."
-msgstr "Activée, cette option \"force\" le moteur de l'émulation à utiliser le modèle de puce 'SID' sélectionné. Dans le cas contraire, le modèle 'SID' adéquat est déterminé à partir du fichier (s'il est du type 'PSIDv2NG'). Si l'information concernant le modèle n'est pas disponible, c'est le réglage choisi via cette option qui sera utilisé."
-
-#: src/sid/xs_interface.c:477
-#: src/sid/xmms-sid.glade:750
-msgid "MOS 6581"
-msgstr "MOS 6581"
-
-#: src/sid/xs_interface.c:481
-#: src/sid/xmms-sid.glade:748
-msgid "MOS/CSG 6581 is the earlier major version of SID chip. It differs from 8580 in few ways, having much fuller filter (which, due to design error, is never same between two different SID-chips) and has the \"volume adjustment bug\", which enables playing of digital samples."
-msgstr "'MOS/CSG 6581 est la toute première version majeure de la puce 'SID'. Elle diffère du modèle '8580' de plusieurs manières : elle dispose d'un filtre plus complet (qui, à cause d'une erreur de conception, n'est jamais le même, d'un modèle de puce 'SID' à l'autre) et présente le \"problème d'ajustement du volume\" qui permet la lecture des échantillons digitaux."
-
-#: src/sid/xs_interface.c:485
-#: src/sid/xmms-sid.glade:769
-msgid "MOS 8580"
-msgstr "MOS 8580"
-
-#: src/sid/xs_interface.c:492
-#: src/sid/xmms-sid.glade:790
-msgid "SID model:"
-msgstr "Modèle 'SID' :"
-
-#: src/sid/xs_interface.c:509
-#: src/sid/xmms-sid.glade:844
-msgid "SIDPlay 1 (frame-based)"
-msgstr "SIDPlay 1 (synchronisation de la trame)"
-
-#: src/sid/xs_interface.c:513
-#: src/sid/xmms-sid.glade:842
-msgid "Use libSIDPlay 1.x emulation, faster but not so accurate. Good in most cases, though."
-msgstr "Utilise la bibliothèque 'libSIDPlay 1.x'. L'émulation est plus rapide, mais moins précise (toutefois, elle offre une bonne restitution, dans la plupart des cas)."
-
-#: src/sid/xs_interface.c:517
-#: src/sid/xmms-sid.glade:865
-msgid "SIDPlay 2 (cycle-based)"
-msgstr "SIDPlay 2 (synchronisation du cycle)"
-
-#: src/sid/xs_interface.c:521
-#: src/sid/xmms-sid.glade:863
-msgid "Use libSIDPlay 2.x emulation, which requires powerful CPU due to more exact emulation."
-msgstr "Utilise la bibliothèque 'libSIDPlay 2.x'. L'émulation nécessite un processeur puissant, mais est plus précise."
-
-#: src/sid/xs_interface.c:525
-#: src/sid/xmms-sid.glade:887
-msgid "Emulation library selection:"
-msgstr "Choix de la bibliothèque d'émulation :"
-
-#: src/sid/xs_interface.c:542
-#: src/sid/xmms-sid.glade:933
-msgid "Real C64 (SIDPlay 2 only)"
-msgstr "C64 réel (SIDPlay 2 uniquement)"
-
-#: src/sid/xs_interface.c:549
-#: src/sid/xmms-sid.glade:952
-msgid "Bank switching"
-msgstr "Pagination"
-
-#: src/sid/xs_interface.c:556
-#: src/sid/xmms-sid.glade:972
-msgid "Transparent ROM"
-msgstr "ROM transparente"
-
-#: src/sid/xs_interface.c:563
-#: src/sid/xmms-sid.glade:992
-msgid "PlaySID environment"
-msgstr "Environnement 'PlaySID'"
-
-#: src/sid/xs_interface.c:570
-#: src/sid/xmms-sid.glade:1013
-msgid "Memory mode:"
-msgstr "Gestion de la mémoire :"
-
-#: src/sid/xs_interface.c:575
-#: src/sid/xmms-sid.glade:1049
-msgid "Emu#1"
-msgstr "Émulation #1"
-
-#: src/sid/xs_interface.c:598
-#: src/sid/xmms-sid.glade:1095
-msgid "Optimization mode (faster, inaccurate)"
-msgstr "Mode 'optimisation' (plus rapide, mais imprécis)"
-
-#: src/sid/xs_interface.c:602
-#: src/sid/xmms-sid.glade:1093
-msgid "This setting can be used to enable libSIDPlay2's \"optimization mode\", which in downgrades the emulation from cycle-exact to something similar to frame-exact. The result is lower CPU usage, but worse accuracy."
-msgstr "Ce réglage peut être utilisé pour activer le \"mode d'optimisation\" de la bibliothèque 'libSIDPlay2'. Ce mode réduit l'émulation de 'synchronisation du cycle' à quelque chose équivalant à 'synchronisation de la trame'."
-
-#: src/sid/xs_interface.c:604
-#: src/sid/xmms-sid.glade:1115
-msgid "reSID-emulation"
-msgstr "Émulation 'reSID'"
-
-#: src/sid/xs_interface.c:608
-#: src/sid/xmms-sid.glade:1113
-msgid "reSID is the software SID-chip simulator based on SID reverse-engineering, created by Dag Lem. It is probably the closest thing to real SID available as software-only emulation."
-msgstr "'reSID' est le simulateur logiciel de puces 'SID' créé par Dag Lem par ingénierie inverse. Il constitue probablement l'émulation logicielle la plus proche des véritables puces 'SID'."
-
-#: src/sid/xs_interface.c:612
-#: src/sid/xmms-sid.glade:1135
-msgid "HardSID"
-msgstr "HardSID"
-
-#: src/sid/xs_interface.c:616
-#: src/sid/xmms-sid.glade:1133
-msgid "HardSID is a EISA/PCI card for PC-compatibles, which can be fitted with a real SID-chip. Software can be used to control the HardSID and combined with software emulation of rest of C64 via libSIDPlay2 HardSID can be used to achieve \"near 100%\" similarity to real C64. For more information, see http://www.hardsid.com/"
-msgstr "'HardSID' est une carte EISA/PCI destinée aux systèmes compatibles PC, dans laquelle peut être insérée une véritable puce 'SID'. La carte 'HardSID' peut être contrôlée par un logiciel, mais, combinée à l'émulation d'un système C64 fournie par la bibliothèque 'libSIDPlay2', elle permet d'obtenir un rendu sonore \"presque\" similaire à celui d'un véritable C64. Pour de plus amples informations, vous pouvez consulter le site suivant : http://www.hardsid.com/"
-
-#: src/sid/xs_interface.c:620
-#: src/sid/xmms-sid.glade:1156
-msgid "SIDPlay 2 options:"
-msgstr "Options de 'SIDPlay 2' :"
-
-#: src/sid/xs_interface.c:637
-#: src/sid/xmms-sid.glade:1203
-msgid "Fast (nearest neighbour)"
-msgstr "Rapide (méthode du 'plus proche voisin')"
-
-#: src/sid/xs_interface.c:641
-#: src/sid/xmms-sid.glade:1201
-msgid "Fastest and also worst sounding sampling method, simply picks nearest neighbouring sample."
-msgstr "La plus rapide, mais aussi la pire méthode de restitution sonore : les échantillons sont choisis selon la méthode du 'plus proche voisin'."
-
-#: src/sid/xs_interface.c:645
-#: src/sid/xmms-sid.glade:1223
-msgid "Linear interpolation"
-msgstr "Interpolation linéaire"
-
-#: src/sid/xs_interface.c:649
-#: src/sid/xmms-sid.glade:1221
-msgid "Uses linear interpolation between samples, yielding higher audio quality with less sampling noise."
-msgstr "Utilise l'interpolation linéaire entre les échantillons. Le flux audio est alors de plus grande qualité et est moins affecté par le bruit. "
-
-#: src/sid/xs_interface.c:653
-#: src/console/Audacious_Config.cxx:200
-#: src/modplug/gui/interface.cxx:268
-#: src/modplug/gui/modplug.glade:338
-#: src/sid/xmms-sid.glade:1243
-msgid "Resampling"
-msgstr "Rééchantillonnage"
-
-#: src/sid/xs_interface.c:660
-#: src/sid/xmms-sid.glade:1263
-msgid "Resampling (FIR)"
-msgstr "Filtre à réponse impulsionnelle finie (FIR)"
-
-#: src/sid/xs_interface.c:667
-#: src/sid/xmms-sid.glade:1284
-msgid "reSID sampling options:"
-msgstr "Options d'échantillonnage de 'reSID' :"
-
-#: src/sid/xs_interface.c:672
-#: src/sid/xmms-sid.glade:1320
-msgid "Emu#2"
-msgstr "Émulation #2"
-
-#: src/sid/xs_interface.c:684
-#: src/sid/xmms-sid.glade:1352
-msgid "Emulate filters"
-msgstr "Émuler les filtres"
-
-#: src/sid/xs_interface.c:688
-#: src/sid/xmms-sid.glade:1350
-msgid "This option enables emulation of SID filter. The filter is an essential part of SID's sound capacity, but accurate emulation of it may require quite much CPU power. However, if filter emulation is disabled, tunes won't sound authentic at all if they utilize the filter."
-msgstr "Cette option active l'émulation des filtres 'SID'. Le filtre constitue l'élément' essentiel de la qualité du son 'SID', mais une émulation précise peut utiliser beaucoup de ressources du processeur. Cependant, si l'émulation est désactivée, alors qu'un module audio a été composé avec les fonctions d'un filtre, le son ne sera pas restitué de manière authentique."
-
-#: src/sid/xs_interface.c:713
-#: src/sid/xmms-sid.glade:1409
-msgid "FS"
-msgstr "FS"
-
-#: src/sid/xs_interface.c:730
-#: src/sid/xmms-sid.glade:1460
-msgid "FM"
-msgstr "FM"
-
-#: src/sid/xs_interface.c:747
-#: src/sid/xmms-sid.glade:1511
-msgid "FT"
-msgstr "FT"
-
-#: src/sid/xs_interface.c:758
-#: src/sid/xmms-sid.glade:1549
-msgid "Reset values"
-msgstr "Réinitialiser"
-
-#: src/sid/xs_interface.c:763
-#: src/sid/xmms-sid.glade:1578
-msgid "SIDPlay1"
-msgstr "SIDPlay 1"
-
-#: src/sid/xs_interface.c:804
-#: src/sid/xmms-sid.glade:1690
-msgid "Export"
-msgstr "Exporter"
-
-#: src/sid/xs_interface.c:812
-#: src/sid/xmms-sid.glade:1711
-msgid "Use"
-msgstr "Utiliser"
-
-#: src/sid/xs_interface.c:820
-#: src/musepack/libmpc.cxx:551
-#: src/wavpack/ui.cxx:267
-#: src/sid/xmms-sid.glade:1732
-msgid "Save"
-msgstr "Enregistrer"
-
-#: src/sid/xs_interface.c:828
-#: src/sid/xmms-sid.glade:1753
-msgid "Import"
-msgstr "Importer"
-
-#: src/sid/xs_interface.c:836
-#: src/sid/xmms-sid.glade:1774
-msgid "Delete"
-msgstr "Supprimer"
-
-#: src/sid/xs_interface.c:850
-#: src/sid/xmms-sid.glade:1819
-msgid "Filter curve:"
-msgstr "Courbe du filtre :"
-
-#: src/sid/xs_interface.c:855
-#: src/sid/xmms-sid.glade:1855
-msgid "SIDPlay2"
-msgstr "SIDPlay 2"
-
-#: src/sid/xs_interface.c:861
-#: src/sid/xmms-sid.glade:1891
-msgid "Filters"
-msgstr "Filtres"
-
-#: src/sid/xs_interface.c:884
-#: src/sid/xmms-sid.glade:1937
-msgid "Play at least for specified time"
-msgstr "Lire au moins pendant la durée indiquée"
-
-#: src/sid/xs_interface.c:888
-#: src/sid/xmms-sid.glade:1935
-msgid "If enabled, the tune is played at least for the specified time, adding silence to the end if necessary."
-msgstr "Si cette option est activée, le module audio sera lu au moins pendant la durée indiquée. Si cela s'avère nécessaire, un silence sera ajouté à la fin du morceau."
-
-#: src/sid/xs_interface.c:895
-#: src/sid/xs_interface.c:949
-#: src/sid/xs_interface.c:1109
-#: src/sid/xmms-sid.glade:1962
-#: src/sid/xmms-sid.glade:2133
-#: src/sid/xmms-sid.glade:2632
-msgid "Playtime:"
-msgstr "Durée :"
-
-#: src/sid/xs_interface.c:915
-#: src/sid/xmms-sid.glade:2041
-msgid "Minimum playtime:"
-msgstr "Durée de lecture minimale :"
-
-#: src/sid/xs_interface.c:932
-#: src/sid/xmms-sid.glade:2088
-msgid "Play for specified time maximum"
-msgstr "Lire au maximum pendant la durée indiquée"
-
-#: src/sid/xs_interface.c:936
-#: src/sid/xmms-sid.glade:2086
-msgid "If enabled, tune is played until specified duration is reached (aka maximum playtime)."
-msgstr "Si cette option est activée, le module audio sera lu jusqu'à ce que soit atteinte la durée indiquée (la durée de lecture maximale, en d'autres termes)."
-
-#: src/sid/xs_interface.c:938
-#: src/sid/xmms-sid.glade:2109
-msgid "Only when song length is unknown"
-msgstr "Uniquement si la durée du module audio est inconnue"
-
-#: src/sid/xs_interface.c:942
-#: src/sid/xmms-sid.glade:2107
-msgid "If enabled, the maximum playtime is applied only if song/tune length is not known."
-msgstr "Si cette option est activée, la durée de lecture maximale ne sera appliquée que si la durée du module audio ne peut pas être déterminée."
-
-#: src/sid/xs_interface.c:969
-#: src/sid/xmms-sid.glade:2212
-msgid "Maximum playtime:"
-msgstr "Durée de lecture maximale :"
-
-#: src/sid/xs_interface.c:986
-#: src/sid/xmms-sid.glade:2259
-msgid "Use XSIDPLAY-compatible database"
-msgstr "Utiliser une base de données compatible 'XSIDPLAY'"
-
-#: src/sid/xs_interface.c:990
-#: src/sid/xmms-sid.glade:2257
-msgid "This option enables using of XSIDPLAY compatible song length database. (Refer to Audacious-SID documentation for more information)"
-msgstr "Cette option active l'utilisation d'une base de données compatible 'XSIDPLAY' relative à la durée des modules audio. Pour de plus amples informations, vous pouvez consulter la documentation de 'Audacious-SID'."
-
-#: src/sid/xs_interface.c:997
-#: src/sid/xmms-sid.glade:2284
-msgid "DB-file:"
-msgstr "Fichier :"
-
-#: src/sid/xs_interface.c:1007
-#: src/sid/xmms-sid.glade:2309
-msgid "Database path and filename"
-msgstr "Emplacement et nom du fichier de la base de données"
-
-#: src/sid/xs_interface.c:1014
-#: src/sid/xmms-sid.glade:2329
-msgid "Browse for song length-database file"
-msgstr "Permet de parcourir l'arborescence pour sélectionner le fichier de la base de données"
-
-#: src/sid/xs_interface.c:1016
-#: src/sid/xmms-sid.glade:2356
-msgid "Song length database:"
-msgstr "Base de données relative à la durée des modules audio :"
-
-#: src/sid/xs_interface.c:1021
-#: src/sid/xmms-sid.glade:2392
-msgid "Songlength"
-msgstr "Durée"
-
-#: src/sid/xs_interface.c:1039
-#: src/sid/xmms-sid.glade:2432
-msgid "Override generic Tuplez format string"
-msgstr "Remplacer les titres génériques"
-
-#: src/sid/xs_interface.c:1043
-#: src/sid/xmms-sid.glade:2430
-msgid "By enabling this option you can specify a custom Tuplez formatting string for SID-files. The SID-plugin specific Tuplez tags are described shortly below."
-msgstr "Si vous cochez cette option, vous pourrez indiquer un format de titre personnalisé pour les fichiers 'SID'. Les métadonnées propres au module d'extension 'SID' sont brièvement expliquées ci-dessous."
-
-#: src/sid/xs_interface.c:1054
-#: src/sid/xmms-sid.glade:2457
-msgid "Tuplez format string for SID-files"
-msgstr "Format du titre des modules audio 'SID'"
-
-#: src/sid/xs_interface.c:1057
-#: src/sid/xmms-sid.glade:2477
-msgid "Descriptions of <i>SID-specific</i> Tuplez fields go here. <b>:D</b>"
-msgstr "La description des métadonnées <i>propres à 'SID'</i> est prévue à cet endroit. <b>:D</b>"
-
-#: src/sid/xs_interface.c:1065
-#: src/sid/xmms-sid.glade:2511
-msgid "Song title format:"
-msgstr "Format du titre :"
-
-#: src/sid/xs_interface.c:1092
-#: src/sid/xmms-sid.glade:2586
-msgid "Add sub-tunes to playlist"
-msgstr "Ajouter les sous-modules à la liste de lecture"
-
-#: src/sid/xs_interface.c:1096
-#: src/sid/xmms-sid.glade:2584
-msgid "If enabled, sub-tunes of each file will be added to playlist. If disabled, only the default sub-tune will be added."
-msgstr "Si cette option est activée, les sous-modules de chaque fichier seront ajoutés à la liste de lecture. Dans le cas contraire, seul le sous-module par défaut sera ajouté."
-
-#: src/sid/xs_interface.c:1098
-#: src/sid/xmms-sid.glade:2607
-msgid "Only tunes with specified minimum duration"
-msgstr "Uniquement les morceaux dont la durée minimale est la suivante :"
-
-#: src/sid/xs_interface.c:1102
-#: src/sid/xmms-sid.glade:2605
-msgid "Only add sub-tunes that have a duration of at least specified time."
-msgstr "Ajoute uniquement les sous-modules dont la durée est au moins égale au temps spécifié."
-
-#: src/sid/xs_interface.c:1129
-#: src/sid/xmms-sid.glade:2710
-msgid "Sub-tune handling:"
-msgstr "Gestion des sous-modules :"
-
-#: src/sid/xs_interface.c:1146
-#: src/sid/xmms-sid.glade:2757
-msgid "Use STIL database"
-msgstr "Utiliser une base de données 'STIL'"
-
-#: src/sid/xs_interface.c:1150
-#: src/sid/xmms-sid.glade:2755
-msgid "If this option is enabled (and the database & HVSC settings below are correctly set), Audacious-SID will use and display additional information from STIL database when HVSC SIDs are played."
-msgstr "Si cette option est activée (et que la base de données ainsi que les paramètres 'HVSC' ci-dessous sont correctement configurés), 'Audacious-SID' utilisera et affichera des informations supplémentaires, à partir de la base de données 'STIL', lorsque des modules audio 'SID' de la collection 'HVSC' seront lus."
-
-#: src/sid/xs_interface.c:1157
-#: src/sid/xmms-sid.glade:2782
-msgid "STIL file:"
-msgstr "Fichier 'STIL' :"
-
-#: src/sid/xs_interface.c:1173
-#: src/sid/xmms-sid.glade:2819
-msgid "Path and filename of STIL database file (STIL.txt), usually found from HVSC's DOCUMENTS-subdirectory."
-msgstr "Emplacement et nom du fichier de la base de données 'STIL' (le fichier 'STIL.txt' est habituellement situé dans le sous-répertoire 'DOCUMENTS' du dossier 'HVSC')."
-
-#: src/sid/xs_interface.c:1186
-#: src/sid/xmms-sid.glade:2854
-msgid "Browse for STIL-database file"
-msgstr "Permet de parcourir l'arborescence pour sélectionner le fichier de la base de données 'STIL'"
-
-#: src/sid/xs_interface.c:1193
-#: src/sid/xmms-sid.glade:2888
-msgid "HVSC path:"
-msgstr "Emplacement de 'HVSC' :"
-
-#: src/sid/xs_interface.c:1209
-#: src/sid/xmms-sid.glade:2925
-msgid "Path to base-directory of your High Voltage SID Collection (HVSC), for example /media/C64Music/"
-msgstr "Emplacement du dossier de base de 'High Voltage SID Collection' (HVSC) ('/media/C64Music/', par exemple)"
-
-#: src/sid/xs_interface.c:1222
-#: src/sid/xmms-sid.glade:2960
-msgid "Browse for HVSC path"
-msgstr "Permet de parcourir l'arborescence pour sélectionner le dossier 'HVSC'"
-
-#: src/sid/xs_interface.c:1224
-#: src/sid/xmms-sid.glade:2990
-msgid "SID Tune Information List (STIL) database:"
-msgstr "Base de données 'STIL' (SID Tune Information List) :"
-
-#: src/sid/xs_interface.c:1248
-#: src/sid/xmms-sid.glade:3063
-msgid "Accept and update changes"
-msgstr "Valide et applique les changements"
-
-#: src/sid/xs_interface.c:1255
-#: src/sid/xmms-sid.glade:3077
-msgid "Cancel any changes"
-msgstr "Annule tous les changements"
-
-#: src/sid/xs_interface.c:1543
-#: src/sid/xmms-sid.glade:3102
-msgid "Audacious-SID Fileinfo"
-msgstr "Infomations sur le fichier 'Audacious-SID'"
-
-#: src/sid/xs_interface.c:1564
-#: src/tta/libtta.c:304
-#: src/musepack/libmpc.cxx:491
-#: src/wavpack/ui.cxx:152
-#: src/sid/xmms-sid.glade:3144
-msgid "Filename:"
-msgstr "Nom du fichier :"
-
-#: src/sid/xs_interface.c:1572
-#: src/sid/xmms-sid.glade:3172
-msgid "Songname:"
-msgstr "Nom du morceau :"
-
-#: src/sid/xs_interface.c:1580
-#: src/sid/xmms-sid.glade:3200
-msgid "Composer:"
-msgstr "Compositeur :"
-
-#: src/sid/xs_interface.c:1588
-#: src/sid/xmms-sid.glade:3228
-msgid "Copyright:"
-msgstr "Droits :"
-
-#: src/sid/xs_interface.c:1632
-#: src/sid/xmms-sid.glade:3342
-msgid "Song Information:"
-msgstr "Informations sur le module :"
-
-#: src/sid/xs_interface.c:1667
-#: src/sid/xmms-sid.glade:3416
-msgid "Author:"
-msgstr "Auteur :"
-
-#: src/sid/xs_interface.c:1701
-#: src/sid/xmms-sid.glade:3514
-msgid "Duration:"
-msgstr "Durée :"
-
-#: src/sid/xs_interface.c:1735
-#: src/sid/xmms-sid.glade:3608
-msgid "Sub-tune Information:"
-msgstr "Informations sur les sous-modules :"
-
-#: src/sid/xs_interface.c:1796
-#: src/sid/xmms-sid.glade:3662
-msgid "Select HVSC song length database"
-msgstr "Choix de la base de données 'HVSC'"
-
-#: src/sid/xs_interface.c:1837
-#: src/sid/xmms-sid.glade:3704
-msgid "Select STIL-database"
-msgstr "Choix de la base de données 'STIL'"
-
-#: src/sid/xs_interface.c:1878
-#: src/sid/xmms-sid.glade:3746
-msgid "Select HVSC location prefix"
-msgstr "Emplacement de 'HVSC'"
-
-#: src/sid/xs_interface.c:1919
-#: src/sid/xmms-sid.glade:3788
-msgid "Select SIDPlay2 filters file for importing"
-msgstr "Fichier de filtres 'SIDPlay2' à importer :"
-
-#: src/sid/xs_interface.c:1960
-#: src/sid/xmms-sid.glade:3830
-msgid "Select SIDPlay2 filters file for exporting"
-msgstr "Fichier de filtres 'SIDPlay2' à exporter :"
-
-#: src/sid/xs_interface.c:2008
-#: src/sid/xs_interface.c:2021
-#: src/sid/xmms-sid.glade:3871
-#: src/sid/xmms-sid.glade:3953
-msgid "Confirm selected action"
-msgstr "Confirmer l'action choisie"
-
-#: src/sid/xs_interface.c:2038
-#: src/sid/xmms-sid.glade:3909
-msgid "Yes"
-msgstr "Oui"
-
-#: src/sid/xs_interface.c:2044
-#: src/sid/xmms-sid.glade:3921
-msgid "No"
-msgstr "Aucun"
-
-#: src/sid/xs_length.c:113
-msgid "Error allocating new node. Fatal error.\n"
-msgstr "Erreur lors de l'allocation du nouveau bloc. Erreur fatale.\n"
-
-#: src/sid/xs_length.c:128
-#, c-format
-msgid "'=' expected on column #%d.\n"
-msgstr "Caractère '=' attendu à la position #%d.\n"
-
-#: src/sid/xs_length.c:153
-msgid "Could not allocate memory for node.\n"
-msgstr "Impossible d'allouer de la mémoire pour le bloc.\n"
-
-#: src/sid/xs_length.c:204
-#, c-format
-msgid "Could not open SongLengthDB '%s'\n"
-msgstr "Impossible d'ouvrir la base de données '%s'\n"
-
-#: src/sid/xs_length.c:224
-#, c-format
-msgid "Invalid MD5-hash in SongLengthDB file '%s' line #%d!\n"
-msgstr "Signature 'MD5' invalide, dans la base de données '%s', à la ligne #%d !\n"
-
-#: src/sid/xs_length.c:231
-#, c-format
-msgid "Invalid entry in SongLengthDB file '%s' line #%d!\n"
-msgstr "Entrée invalide dans la base de données '%s', à la ligne #%d!\n"
-
-#: src/sid/xs_length.c:236
-#, c-format
-msgid "Invalid line in SongLengthDB file '%s' line #%d\n"
-msgstr "Ligne invalide dans la base de données '%s' (ligne #%d) !\n"
-
-#: src/sid/xs_length.c:398
-#, c-format
-msgid "Not a PSID or RSID file '%s'\n"
-msgstr "Le fichier '%s' n'est pas au format 'PSID' ou 'RSID'\n"
-
-#: src/sid/xs_length.c:417
-#, c-format
-msgid "Error reading SID file header from '%s'\n"
-msgstr "Erreur lors de la lecture de l'en-tête du fichier '%s'\n"
-
-#: src/sid/xs_length.c:436
-#, c-format
-msgid "Error allocating temp data buffer for file '%s'\n"
-msgstr "Erreur lors de l'allocation des données provisoires du tampon relatif au fichier '%s'\n"
-
-#: src/sid/xs_about.c:84
-#: src/wma/wma.c:130
-#, c-format
-msgid "About %s"
-msgstr "À propos de '%s'"
-
-#: src/sid/xs_glade.c:90
-#: src/sid/xs_glade.c:114
-#: src/modplug/gui/support.cxx:90
-#: src/modplug/gui/support.cxx:114
-#, c-format
-msgid "Couldn't find pixmap file: %s"
-msgstr "Impossible d'ouvrir l'image : %s"
-
-#: src/sid/xs_slsup.c:217
-#, c-format
-msgid "Could not allocate memory for t_xs_tuneinfo ('%s')\n"
-msgstr "Impossible d'allouer de la mémoire pour t_xs_tuneinfo ('%s')\n"
-
-#: src/sid/xs_slsup.c:224
-#, c-format
-msgid "Could not allocate sidFilename ('%s')\n"
-msgstr "Erreur lors de l'allocation du fichier 'SID' ('%s').\n"
-
-#: src/sid/xs_slsup.c:233
-#, c-format
-msgid "Could not allocate memory for t_xs_subtuneinfo ('%s', %i)\n"
-msgstr "Impossible d'allouer de la mémoire pour t_xs_subtuneinfo ('%s', %i)\n"
-
-#: src/sid/xs_config.c:580
-msgid "Allocation of sid2FilterPresets structure failed!\n"
-msgstr "Erreur lors de l'allocation de la structure de 'sid2FilterPresets' !\n"
-
-#: src/sid/xs_config.c:908
-msgid "Warning: Could not set filter curve widget points!\n"
-msgstr "Avertissement : erreur lors du placement des points de la courbe du filtre !\n"
-
-#: src/sid/xmms-sid.c:203
-msgid "Error initializing song-length database!\n"
-msgstr "Erreur lors de l'initialisation de la base de données relative à la durée des modules audio !\n"
-
-#: src/sid/xmms-sid.c:209
-msgid "Error initializing STIL database!\n"
-msgstr "Erreur lors de l'initialisation de la base de données 'STIL' !\n"
-
-#: src/sid/xmms-sid.c:347
-msgid "Couldn't allocate memory for audio data buffer!\n"
-msgstr "Impossible d'allouer la mémoire pour les données du tampon audio !\n"
-
-#: src/sid/xmms-sid.c:355
-msgid "Couldn't allocate memory for audio oversampling buffer!\n"
-msgstr "Impossible d'allouer la mémoire pour le tampon du suréchantillonage audio !\n"
-
-#: src/sid/xmms-sid.c:371
-#, c-format
-msgid "Couldn't initialize SID-tune '%s' (sub-tune #%i)!\n"
-msgstr "Impossible d'initialiser le module SID '%s' (sous-module #%i) !\n"
-
-#: src/sid/xmms-sid.c:382
-#, c-format
-msgid "Couldn't open XMMS audio output (fmt=%x, freq=%i, nchan=%i)!\n"
-msgstr "Erreur lors de l'ouverture de la sortie audio de XMMS (fmt=%x, freq=%i, nchan=%i) !\n"
-
-#: src/sid/xmms-sid.c:432
-msgid "Oversampling rate-conversion pass failed.\n"
-msgstr "L'opération de conversion par suréchantillonnage a échoué.\n"
-
-#: src/sid/xs_stil.c:46
-msgid "SubTune pointer structure realloc failed.\n"
-msgstr "Erreur lors du redimensionnement de l'allocation de mémoire dynamique du pointeur de structure 'SubTune'.\n"
-
-#: src/sid/xs_stil.c:69
-msgid "SubTune structure malloc failed!\n"
-msgstr "Erreur lors de l'allocation de mémoire dynamique de la structure 'SubTune' !\n"
-
-#: src/sid/xs_stil.c:176
-#, c-format
-msgid "Could not open STILDB '%s'\n"
-msgstr "Impossible d'ouvrir la base de données STILDB '%s'\n"
-
-#: src/sid/xs_fileinfo.c:232
-msgid "General info"
-msgstr "Général"
-
-#: src/sid/xs_fileinfo.c:247
-#, c-format
-msgid "Tune #%i: "
-msgstr "Module #%i : "
-
-#: src/sndfile/plugin.c:548
-msgid "About sndfile plugin"
-msgstr "À propos du module 'sndfile'"
-
-#: src/sndfile/plugin.c:549
-msgid ""
-"Adapted for Audacious usage by Tony Vroon <chainsaw@gentoo.org>\n"
-"from the xmms_sndfile plugin which is:\n"
-"Copyright (C) 2000, 2002 Erik de Castro Lopo\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.  \n"
-"See the GNU General Public License for more details. \n"
-"\n"
-"You should have received a copy of the GNU General Public \n"
-"License along with this program ; if not, write to \n"
-"the Free Software Foundation, Inc., \n"
-"51 Franklin Street, Fifth Floor, \n"
-"Boston, MA  02110-1301  USA"
-msgstr ""
-"Adapté pour Audacious par Tony Vroon <chainsaw@gentoo.org>\n"
-"à partir du module 'xmms_sndfile' de Erik de Castro Lopo\n"
-"(Droits d'utilisation 2000, 2002)\n"
-"\n"
-"\n"
-"Ceci est une traduction non officielle de la \"GNU General Public License\"\n"
-"en français. Elle n'a pas été publiée par la \"Free Software Foundation\",\n"
-"et ne détermine pas les termes de distribution pour les logiciels qui\n"
-"utilisent la \"GNU GPL\" -- seul le texte anglais original de la \"GNU GPL\" en a\n"
-"le droit. Cependant, nous espérons que cette traduction aidera les\n"
-"francophones à mieux comprendre la \"GNU GPL\".\n"
-"\n"
-"Ce programme est un logiciel libre : vous pouvez le redistribuer et/ou le\n"
-"modifier selon les termes de la \"Licence Publique Générale GNU\" (GNU GPL),\n"
-"telle que publiée par la \"Free Software Foundation\", soit la version 2 de\n"
-"la Licence, soit (à votre convenance) toute version postérieure.\n"
-"\n"
-"Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE\n"
-"GARANTIE, sans même la garantie implicite d'une possible VALEUR MARCHANDE\n"
-"ou de l'ADÉQUATION à UN BESOIN PARTICULIER. Consultez la \"Licence Publique\n"
-"Générale GNU\" (GNU GPL) pour plus de détails.\n"
-"\n"
-"Vous devriez avoir reçu une copie de la \"Licence Publique Générale GNU\"\n"
-"(GNU GPL) avec ce programme. Dans le cas contraire, vous pouvez consulter\n"
-"la Licence sur la page <http://www.gnu.org/licenses/> ou écrire à la\n"
-"Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,\n"
-"MA 02110-1301, USA."
-
-#: src/sndstretch/sndstretch_xmms.c:159
-msgid "About SndStretch"
-msgstr "À propos de 'SndStretch'"
-
-#: src/sndstretch/sndstretch_xmms.c:319
-msgid "Volume corr."
-msgstr "Correction du volume"
-
-#: src/sndstretch/sndstretch_xmms.c:320
-msgid "Short Overlap"
-msgstr "Chevauchement léger"
-
-#: src/sndstretch/sndstretch_xmms.c:374
-msgid "Speed"
-msgstr "Vitesse"
-
-#: src/sndstretch/sndstretch_xmms.c:375
-msgid "Pitch"
-msgstr "Hauteur"
-
-#: src/sndstretch/sndstretch_xmms.c:376
-msgid "Scale"
-msgstr "Échelle"
-
-#: src/sndstretch/sndstretch_xmms.c:396
-msgid "SndStretch - Configuration"
-msgstr "Configuration de 'SndStretch'"
-
-#: src/song_change/song_change.c:312
-msgid "Commands"
-msgstr "Commandes"
-
-#: src/song_change/song_change.c:319
-msgid "Command to run when Audacious starts a new song."
-msgstr "Commande à exécuter lorsqu'un nouveau morceau commence :"
-
-#: src/song_change/song_change.c:328
-#: src/song_change/song_change.c:350
-#: src/song_change/song_change.c:371
-#: src/song_change/song_change.c:392
-msgid "Command:"
-msgstr "Commande :"
-
-#: src/song_change/song_change.c:342
-msgid "Command to run toward the end of a song."
-msgstr "Commande à exécuter lorsque la lecture d'un morceau se termine :"
-
-#: src/song_change/song_change.c:362
-msgid "Command to run when Audacious reaches the end of the playlist."
-msgstr "Commande à exécuter lorsque la fin de la liste de lecture est atteinte :"
-
-#: src/song_change/song_change.c:383
-msgid "Command to run when title changes for a song (i.e. network streams titles)."
-msgstr "Commande à exécuter lorsque le titre d'un morceau change (le titre d'un flux distant, par exemple) :"
-
-#: src/song_change/song_change.c:404
-#, c-format
-msgid ""
-"You can use the following format strings which\n"
-"will be substituted before calling the command\n"
-"(not all are useful for the end-of-playlist command).\n"
-"\n"
-"%%F: Frequency (in hertz)\n"
-"%%c: Number of channels\n"
-"%%f: filename (full path)\n"
-"%%l: length (in milliseconds)\n"
-"%%n or %%s: Song name\n"
-"%%r: Rate (in bits per second)\n"
-"%%t: Playlist position (%%02d)\n"
-"%%p: Currently playing (1 or 0)"
-msgstr ""
-"Vous pouvez utiliser les chaînes de la liste ci-dessous.\n"
-"Elles seront remplacées avant l'appel de la commande à exécuter\n"
-"(toutes ne sont pas utiles pour la fonction 'fin de liste') :\n"
-"\n"
-"%%F: Fréquence (en Hertz)\n"
-"%%c: Nombre de voies\n"
-"%%f: Nom du fichier (chemin complet)\n"
-"%%l: Durée (en millisecondes)\n"
-"%%n ou %%s: Titre du morceau\n"
-"%%r: Taux d'encodage (en 'bits' par seconde)\n"
-"%%t: Position dans la liste de lecture (%%02d)\n"
-"%%p: Statut de la lecture (1 ou 0)"
-
-#: src/song_change/song_change.c:429
-msgid "<span size='small'>Parameters passed to the shell should be encapsulated in quotes. Doing otherwise is a security risk.</span>"
-msgstr ""
-"<span size='small'>Les arguments à lancer dans la console doivent être entourés de guillemets.\n"
-"Une utilisation différente constitue un risque en matière de sécurité.</span>"
-
-#: src/spectrum/spectrum.c:90
-msgid "Spectrum Analyzer"
-msgstr "Analyseur Spectral"
-
-#: src/statusicon/si_ui.c:587
-msgid "About Status Icon Plugin"
-msgstr "À propos du module 'Status Icon'"
-
-#: src/statusicon/si_ui.c:589
-msgid ""
-"\n"
-"written by Giacomo Lozito < james@develia.org >\n"
-"\n"
-"This plugin provides a status icon, placed in\n"
-"the system tray area of the window manager.\n"
-msgstr ""
-"\n"
-"Écrit par Giacomo Lozito < james@develia.org >\n"
-"\n"
-"Ce module affiche une icône de statut dans la\n"
-"boîte de notification du gestionnaire de fenêtres.\n"
-
-#: src/statusicon/si_ui.c:661
-msgid "Status Icon Plugin - Preferences"
-msgstr "Préférences de 'Status Icon'"
-
-#: src/statusicon/si_ui.c:672
-msgid "Right-Click Menu"
-msgstr "Menu disponible via le clic droit :"
-
-#: src/statusicon/si_ui.c:677
-msgid "Audacious standard menu"
-msgstr "Menu standard d'Audacious"
-
-#: src/statusicon/si_ui.c:682
-msgid "Small playback menu #1"
-msgstr "Menu de lecture compact #1"
-
-#: src/statusicon/si_ui.c:687
-msgid "Small playback menu #2"
-msgstr "Menu de lecture compact #2"
-
-#: src/statusicon/si_ui.c:710
-msgid "Mouse Scroll Action"
-msgstr "Effet du défilement de la souris :"
-
-#: src/statusicon/si_ui.c:715
-msgid "Change volume"
-msgstr "Changement du volume"
-
-#: src/statusicon/si_ui.c:720
-msgid "Change playing song"
-msgstr "Changement du titre en cours de lecture"
-
-#: src/statusicon/gtktrayicon-x11.c:133
-msgid "Orientation"
-msgstr "Orientation"
-
-#: src/statusicon/gtktrayicon-x11.c:134
-msgid "The orientation of the tray"
-msgstr "Définit l'orientation de l'icône"
-
-#: src/stereo_plugin/stereo.c:52
-msgid "About Extra Stereo Plugin"
-msgstr "À propos..."
-
-#: src/stereo_plugin/stereo.c:93
-msgid "Configure Extra Stereo"
-msgstr "Configurer 'Extra Stereo'"
-
-#: src/stereo_plugin/stereo.c:95
-msgid "Effect intensity:"
-msgstr "Intensité de l'effet :"
-
-#: src/sun/configure.c:201
-msgid "Audio control device:"
-msgstr "Périphérique de contrôle audio :"
-
-#: src/sun/configure.c:350
-msgid "Volume controls device:"
-msgstr "Périphérique de contrôle du volume :"
-
-#: src/sun/configure.c:363
-msgid "XMMS uses mixer exclusively."
-msgstr "XMMS utilise le mélangeur audio de manière exclusive."
-
-#: src/sun/configure.c:538
-msgid "Sun driver configuration"
-msgstr "Configuration du pilote 'Sun'"
-
-#: src/sun/about.c:34
-msgid "About the Sun Driver"
-msgstr "À propos du pilote 'Sun'"
-
-#: src/sun/about.c:35
-msgid ""
-"XMMS BSD Sun Driver\n"
-"\n"
-"Copyright (c) 2001 CubeSoft Communications, Inc.\n"
-"Maintainer: <vedge at csoft.org>.\n"
-msgstr ""
-"Pilote 'Sun BSD' pour XMMS\n"
-"\n"
-"Droits d'utilisation :\n"
-"(c) 2001, CubeSoft Communications, Inc.\n"
-"\n"
-"Responsable de la maintenance :\n"
-"<vedge at csoft.org>.\n"
-
-#: src/timidity/interface.c:54
-msgid "TiMidity Configuration"
-msgstr "Configuration de 'TiMidity'"
-
+#: src/modplug/gui/interface.cxx:180 src/modplug/gui/modplug.glade:92
+#: src/timidity/interface.c:132
+msgid "8 bit"
+msgstr "8 bits"
+
+#: src/modplug/gui/interface.cxx:211 src/modplug/gui/modplug.glade:178
+msgid "Mono (downmix)"
+msgstr "Mono (sous-mélange)"
+
+#: src/modplug/gui/interface.cxx:240 src/modplug/gui/modplug.glade:258
+msgid "Nearest (fastest)"
+msgstr "Méthode du 'plus proche voisin' (la plus rapide)"
+
+#: src/modplug/gui/interface.cxx:247 src/modplug/gui/modplug.glade:277
+msgid "Linear (fast)"
+msgstr "Interpolation linéaire (rapide)"
+
+#: src/modplug/gui/interface.cxx:254 src/modplug/gui/modplug.glade:297
+msgid "Spline (good quality)"
+msgstr "Interpolation par segments ('spline') (bonne qualité)"
+
+#: src/modplug/gui/interface.cxx:261 src/modplug/gui/modplug.glade:317
+msgid "8-tap Fir (extremely high quality)"
+msgstr "Filtre à réponse impulsionnelle finie '8-tap FIR' (qualité optimale)"
+
+#: src/modplug/gui/interface.cxx:285 src/modplug/gui/modplug.glade:384
+msgid "48 kHz"
+msgstr "48 kHz"
+
+#: src/modplug/gui/interface.cxx:292 src/modplug/gui/modplug.glade:403
+msgid "44 kHz"
+msgstr "44 kHz"
+
+#: src/modplug/gui/interface.cxx:299 src/modplug/gui/modplug.glade:423
+msgid "22 kHz"
+msgstr "22 kHz"
+
+#: src/modplug/gui/interface.cxx:306 src/modplug/gui/modplug.glade:443
+msgid "11 kHz"
+msgstr "11 kHz"
+
+#: src/modplug/gui/interface.cxx:314 src/modplug/gui/modplug.glade:464
 #: src/timidity/interface.c:74
-#: src/modplug/gui/interface.cxx:314
-#: src/modplug/gui/modplug.glade:464
 msgid "Sampling Rate"
 msgstr "Taux d'échantillonnage"
 
-#: src/timidity/interface.c:91
-msgid "11000 Hz"
-msgstr "11000 Hz"
-
-#: src/timidity/interface.c:99
-msgid "22000 Hz"
-msgstr "22000 Hz"
-
-#: src/timidity/interface.c:107
-msgid "44100 Hz"
-msgstr "44100 Hz"
-
-#: src/timidity/interface.c:115
-msgid "Sample Width"
-msgstr "Résolution"
-
-#: src/timidity/interface.c:132
-#: src/modplug/gui/interface.cxx:180
-#: src/modplug/gui/modplug.glade:92
-msgid "8 bit"
-msgstr "8 bits"
-
-#: src/timidity/interface.c:140
-#: src/modplug/gui/interface.cxx:173
-#: src/modplug/gui/modplug.glade:73
-msgid "16 bit"
-msgstr "16 bits"
-
-#: src/timidity/interface.c:148
-#: src/adplug/adplug-xmms.cc:323
-#: src/modplug/gui/interface.cxx:218
-#: src/modplug/gui/modplug.glade:199
-msgid "Channels"
-msgstr "Sortie"
-
-#: src/timidity/interface.c:181
-msgid "TiMidity Configuration File"
-msgstr "Fichier de configuration de 'TiMidity'"
-
-#: src/timidity/xmms-timidity.c:118
-msgid ""
-"TiMidity Plugin\n"
-"http://libtimidity.sourceforge.net\n"
-"by Konstantin Korikov"
-msgstr ""
-"Module 'TiMidity'\n"
-"\n"
-"http://libtimidity.sourceforge.net\n"
-"\n"
-"Écrit par Konstantin Korikov"
-
-#: src/timidity/xmms-timidity.c:119
-#, c-format
-msgid "TiMidity Plugin %s"
-msgstr "Module 'TiMidity' %s"
-
-#: src/timidity/xmms-timidity.c:336
-msgid "Couldn't load MIDI file"
-msgstr "Impossible de lire le fichier MIDI"
-
-#: src/tonegen/tonegen.c:56
-msgid "About Tone Generator"
-msgstr "À propos de 'Tone Generator'"
-
-#: src/tonegen/tonegen.c:58
-msgid ""
-"Sinus tone generator by Haavard Kvaalen <havardk@xmms.org>\n"
-"Modified by Daniel J. Peng <danielpeng@bigfoot.com>\n"
-"\n"
-"To use it, add a URL: tone://frequency1;frequency2;frequency3;...\n"
-"e.g. tone://2000;2005 to play a 2000Hz tone and a 2005Hz tone"
-msgstr ""
-"Générateur de sons sinusoïdaux écrit par Håvard Kvålen <havardk@xmms.org>\n"
-"\n"
-"Modifié par Daniel J. Peng <danielpeng@bigfoot.com>\n"
-"\n"
-"Pour utiliser ce module, il suffit d'ajouter une adresse du type :\n"
-"tone://fréquence1;fréquence2;fréquence3;...\n"
-"\n"
-"Par exemple, 'tone://2000;2005' émettra un son de 2000 Hz et un son de 2005 Hz."
-
-#: src/tonegen/tonegen.c:167
-#, c-format
-msgid "%s %.1f Hz"
-msgstr "%s %.1f Hz"
-
-#: src/tonegen/tonegen.c:167
-msgid "Tone Generator: "
-msgstr "Générateur de sons : "
-
-#: src/tta/libtta.c:130
-msgid "Can't open file\n"
-msgstr "Impossible d'ouvrir le fichier\n"
-
-#: src/tta/libtta.c:133
-msgid "Not supported file format\n"
-msgstr "Le format du fichier n'est pas supporté\n"
-
-#: src/tta/libtta.c:136
-msgid "File is corrupted\n"
-msgstr "Le fichier est corrompu\n"
-
-#: src/tta/libtta.c:139
-msgid "Can't read from file\n"
-msgstr "Impossible de lire le fichier\n"
-
-#: src/tta/libtta.c:142
-msgid "Insufficient memory available\n"
-msgstr "La mémoire disponible est insuffisante\n"
-
-#: src/tta/libtta.c:145
-msgid "Output plugin error\n"
-msgstr "Erreur relative au module de sortie\n"
-
-#: src/tta/libtta.c:148
-msgid "Unknown error\n"
-msgstr "Erreur inconnue\n"
-
-#: src/tta/libtta.c:152
-msgid "TTA Decoder Error"
-msgstr "Erreur du décodeur 'TTA'"
-
-#: src/tta/libtta.c:261
-msgid "TTA input plugin "
-msgstr "Module d'entrée 'TTA' "
-
-#: src/tta/libtta.c:262
-msgid ""
-" for BMP\n"
-"Copyright (c) 2004 True Audio Software\n"
-msgstr ""
-" pour BMP\n"
-"\n"
-"Droits d'utilisation (2004) :\n"
-"\n"
-"True Audio Software\n"
-
-#: src/tta/libtta.c:265
-msgid "About True Audio Plugin"
-msgstr "À propos du module 'True Audio'"
-
-#: src/tta/libtta.c:316
-msgid "ID3 Tag:"
-msgstr "Métadonnées ID3"
-
-#: src/tta/libtta.c:323
-#: src/musepack/libmpc.cxx:514
-#: src/wavpack/ui.cxx:172
-msgid "Title:"
-msgstr "Titre :"
-
-#: src/tta/libtta.c:333
-#: src/musepack/libmpc.cxx:518
-#: src/wavpack/ui.cxx:184
-msgid "Artist:"
-msgstr "Artiste :"
-
-#: src/tta/libtta.c:344
-#: src/musepack/libmpc.cxx:522
-#: src/wavpack/ui.cxx:196
-msgid "Album:"
-msgstr "Album :"
-
-#: src/tta/libtta.c:355
-#: src/musepack/libmpc.cxx:526
-#: src/wavpack/ui.cxx:208
-msgid "Comment:"
-msgstr "Commentaire :"
-
-#: src/tta/libtta.c:366
-#: src/musepack/libmpc.cxx:530
-#: src/wavpack/ui.cxx:221
-msgid "Year:"
-msgstr "Année :"
-
-#: src/tta/libtta.c:378
-#: src/wavpack/ui.cxx:234
-msgid "Track number:"
-msgstr "Piste :"
-
-#: src/tta/libtta.c:390
-#: src/musepack/libmpc.cxx:540
-#: src/wavpack/ui.cxx:248
-msgid "Genre:"
-msgstr "Genre :"
-
-#: src/tta/libtta.c:413
-#: src/musepack/libmpc.cxx:634
-#: src/wavpack/ui.cxx:409
-#, c-format
-msgid "File Info - %s"
-msgstr "Informations sur le fichier : %s"
-
-#: src/vorbis/vorbis.c:681
-msgid "About Ogg Vorbis Audio Plugin"
-msgstr "À propos du module audio 'Ogg Vorbis'"
-
-#: src/vorbis/vorbis.c:687
-msgid ""
-"Ogg Vorbis Plugin by the Xiph.org Foundation\n"
-"\n"
-"Original code by\n"
-"Tony Arcieri <bascule@inferno.tusculum.edu>\n"
-"Contributions from\n"
-"Chris Montgomery <monty@xiph.org>\n"
-"Peter Alm <peter@xmms.org>\n"
-"Michael Smith <msmith@labyrinth.edu.au>\n"
-"Jack Moffitt <jack@icecast.org>\n"
-"Jorn Baayen <jorn@nl.linux.org>\n"
-"Haavard Kvaalen <havardk@xmms.org>\n"
-"Gian-Carlo Pascutto <gcp@sjeng.org>\n"
-"Eugene Zagidullin <e.asphyx@gmail.com>\n"
-"\n"
-"Visit the Xiph.org Foundation at http://www.xiph.org/\n"
-msgstr ""
-"Module 'Ogg Vorbis' de 'Xiph.org Foundation'\n"
-"\n"
-"\n"
-"Code original :\n"
-"Tony Arcieri                <bascule@inferno.tusculum.edu>\n"
-"\n"
-"Contributions :\n"
-"Chris Montgomery     <monty@xiph.org>\n"
-"Peter Alm                  <peter@xmms.org>\n"
-"Michael Smith           <msmith@labyrinth.edu.au>\n"
-"Jack Moffitt                <jack@icecast.org>\n"
-"Jorn Baayen              <jorn@nl.linux.org>\n"
-"Håvard Kvålen          <havardk@xmms.org>\n"
-"Gian-Carlo Pascutto  <gcp@sjeng.org>\n"
-"\n"
-"\n"
-"Vous pouvez visiter 'Xiph.org Foundation' à cette adresse :\n"
-"http://www.xiph.org/\n"
-
-#: src/vorbis/configure.c:84
-msgid "Ogg Vorbis Audio Plugin Configuration"
-msgstr "Configuration du module audio 'Ogg Vorbis'"
-
-#: src/vorbis/configure.c:94
-msgid "Ogg Vorbis Tags:"
-msgstr "Métadonnées 'Ogg Vorbis' :"
-
-#: src/vorbis/configure.c:115
-msgid "Title format:"
-msgstr "Format du titre :"
-
-#: src/vtx/about.c:23
-msgid "About Vortex Player"
-msgstr "À propos du lecteur 'Vortex'"
-
-#: src/vtx/about.c:25
-msgid ""
-"Vortex file format player by Sashnov Alexander <sashnov@ngs.ru>\n"
-"Founded on original source in_vtx.dll by Roman Sherbakov <v_soft@microfor.ru>\n"
-"\n"
-"Music in vtx format can be found at http://vtx.microfor.ru/music.htm\n"
-"and other AY/YM music sites.\n"
-"\n"
-"Audacious implementation by Pavel Vymetalek <pvymetalek@seznam.cz>"
-msgstr ""
-"Lecteur de fichiers au format 'Vortex' de\n"
-"Sashnov Alexander <sashnov@ngs.ru>\n"
-"\n"
-"Source originale : 'in_vtx.dll' de\n"
-"Roman Sherbakov <v_soft@microfor.ru>\n"
-"\n"
-"La musique au format 'vtx' peut être trouvée à l'adresse suivante :\n"
-"\n"
-"http://vtx.microfor.ru/music.htm\n"
-"(et sur les autres sites de musique AY/YM).\n"
-"\n"
-"Adaptation pour Audacious :\n"
-"Pavel Vymetalek <pvymetalek@seznam.cz>"
-
-#: src/wma/wma.c:132
-msgid ""
-"Adapted for use in Audacious by Tony Vroon (chainsaw@gentoo.org) from\n"
-"the BEEP-WMA plugin which is Copyright (C) 2004,2005 Mokrushin I.V. aka McMCC (mcmcc@mail.ru)\n"
-"and the BMP-WMA plugin which is Copyright (C) 2004 Roman Bogorodskiy <bogorodskiy@inbox.ru>.\n"
-"This plugin based on source code "
-msgstr ""
-"Adapté pour Audacious par Tony Vroon (chainsaw@gentoo.org), à partir des modules\n"
-"'BEEP-WMA' - Droits d'utilisation (2004, 2005) : Mokrushin I.V., connu sous 'McMCC' <mcmcc@mail.ru>)\n"
-"'BMP-WMA'  - Droits d'utilisation (2004)           : Roman Bogorodskiy <bogorodskiy@inbox.ru>).\n"
-"Ce module est basé sur le code source de la bibliothèque "
-
-#: src/adplug/adplug-xmms.cc:171
-msgid "About "
-msgstr "À propos de "
-
-#: src/adplug/adplug-xmms.cc:175
-msgid ""
-"\n"
-"Copyright (C) 2002, 2003 Simon Peter <dn.tlp@gmx.net>\n"
-"\n"
-"This plugin is released under the terms and conditions of the GNU LGPL.\n"
-"See http://www.gnu.org/licenses/lgpl.html for details.\n"
-"\n"
-"This plugin uses the AdPlug library, which is copyright (C) Simon Peter, et al.\n"
-"Linked AdPlug library version: "
-msgstr ""
-"\n"
-"Droits d'utilisation (2002, 2003) : Simon Peter <dn.tlp@gmx.net>\n"
-"\n"
-"Ce module est distribué sous les termes et les conditions de la licence GNU LGPL.\n"
-"Consultez la page suivante pour les détails : http://www.gnu.org/licenses/lgpl.html\n"
-"\n"
-"Cette extension utilise la bibliothèque 'AdPlug'.\n"
-"Droits d'utilisation : Simon Peter, et al.\n"
-"\n"
-"Version de la bibliothèque 'AdPlug' liée : "
-
-#: src/adplug/adplug-xmms.cc:256
-msgid "AdPlug :: Configuration"
-msgstr "Configuration de 'AdPlug'"
-
-#: src/adplug/adplug-xmms.cc:303
-msgid "Sound quality"
-msgstr "Qualité du son"
-
-#: src/adplug/adplug-xmms.cc:308
-#: src/modplug/gui/interface.cxx:187
-#: src/modplug/gui/modplug.glade:113
-msgid "Resolution"
-msgstr "Résolution"
-
-#: src/adplug/adplug-xmms.cc:310
-msgid "8bit"
-msgstr "8 bits"
-
-#: src/adplug/adplug-xmms.cc:315
-msgid "16bit"
-msgstr "16 bits"
-
-#: src/adplug/adplug-xmms.cc:334
-msgid "Setting stereo is not recommended, unless you need to. This won't add any stereo effects to the sound - OPL2 is just mono - but eats up more CPU power!"
-msgstr "Activer le mode stéréo n'est pas recommandé, à moins que vous ne le vouliez vraiment. Cette option n'ajoutera pas d'effet stéréo au son produit (OPL2 n'utilise que le mode mono), mais nécessitera beaucoup plus de puissance CPU !"
-
-#: src/adplug/adplug-xmms.cc:342
-msgid "Frequency"
-msgstr "Fréquence"
-
-#: src/adplug/adplug-xmms.cc:378
-#: src/adplug/adplug-xmms.cc:582
-#: src/console/Audacious_Config.cxx:147
-msgid "Playback"
-msgstr "Lecture"
-
-#: src/adplug/adplug-xmms.cc:382
-msgid "Detect songend"
-msgstr "Détecter la fin du morceau"
-
-#: src/adplug/adplug-xmms.cc:386
-msgid "If enabled, XMMS will detect a song's ending, stop it and advance in the playlist. If disabled, XMMS won't take notice of a song's ending and loop it all over again and again."
-msgstr "Si cette option est activée, Audacious détectera la fin du morceau, interrompra la lecture, puis passera au titre suivant dans la liste de lecture. Dans le cas contraire, Audacious ne se préoccupera pas de la fin des morceaux : le titre sera lu en boucle."
-
-#: src/adplug/adplug-xmms.cc:397
-msgid "Formats"
-msgstr "Formats"
-
-#: src/adplug/adplug-xmms.cc:404
-msgid "Format selection"
-msgstr "Choix des formats"
-
-#: src/adplug/adplug-xmms.cc:407
-msgid "Format"
-msgstr "Format"
-
-#: src/adplug/adplug-xmms.cc:407
-msgid "Extension"
-msgstr "Extension"
-
-#: src/adplug/adplug-xmms.cc:447
-msgid "Selected file types will be recognized and played back by this plugin. Deselected types will be ignored to make room for other plugins to play these files."
-msgstr "Les types de fichiers sélectionnés seront reconnus et gérés par ce module. Les autres seront ignorés, de manière à pouvoir être supportés par d'autres extensions."
-
-#: src/adplug/adplug-xmms.cc:533
-msgid "AdPlug :: File Info"
-msgstr "Informations sur le fichier"
-
-#: src/adplug/adplug-xmms.cc:559
-msgid "Title: "
-msgstr "Titre : "
-
-#: src/adplug/adplug-xmms.cc:560
-msgid "Author: "
-msgstr "Auteur : "
-
-#: src/adplug/adplug-xmms.cc:561
-msgid "File Type: "
-msgstr "Format : "
-
-#: src/adplug/adplug-xmms.cc:562
-msgid "Subsongs: "
-msgstr "Sous-modules : "
-
-#: src/adplug/adplug-xmms.cc:563
-msgid "Instruments: "
-msgstr "Instruments : "
-
-#: src/adplug/adplug-xmms.cc:568
-msgid "Orders: "
-msgstr "Partitions : "
-
-#: src/adplug/adplug-xmms.cc:569
-msgid "Patterns: "
-msgstr "Séquences : "
-
-#: src/adplug/adplug-xmms.cc:573
-msgid "Song"
-msgstr "Morceau"
-
-#: src/adplug/adplug-xmms.cc:599
-msgid "Instrument name"
-msgstr "Nom de l'instrument"
-
-#: src/adplug/adplug-xmms.cc:641
-msgid "Song message"
-msgstr "Commentaires"
-
-#: src/adplug/adplug-xmms.cc:663
-msgid "Subsong selection"
-msgstr "Sélection du sous-module"
-
-#: src/adplug/adplug-xmms.cc:727
-msgid "Order: "
-msgstr "Partition : "
-
-#: src/adplug/adplug-xmms.cc:728
-msgid "Pattern: "
-msgstr "Séquence : "
-
-#: src/adplug/adplug-xmms.cc:730
-msgid "Row: "
-msgstr "Ligne : "
-
-#: src/adplug/adplug-xmms.cc:731
-msgid "Speed: "
-msgstr "Vitesse : "
-
-#: src/adplug/adplug-xmms.cc:732
-msgid "Timer: "
-msgstr "Fréquence : "
-
-#: src/sid/xs_sidplay2.cc:101
-msgid "[SIDPlay2] Could not initialize emulation engine.\n"
-msgstr "[SIDPlay2]  : impossible d'initialiser le moteur de l'émulation.\n"
-
-#: src/sid/xs_sidplay2.cc:208
-#, c-format
-msgid "[SIDPlay2] Invalid number of filter curve points (%d > %d)\n"
-msgstr "[SIDPlay2] : le nombre de points de la courbe du filtre est invalide (%d > %d)\n"
-
-#: src/sid/xs_sidplay2.cc:229
-msgid "reSID->create() failed.\n"
-msgstr "reSID->create() : erreur.\n"
-
-#: src/sid/xs_sidplay2.cc:235
-#, c-format
-msgid "reSID->filter(%d) failed.\n"
-msgstr "reSID->filter(%d) : erreur.\n"
-
-#: src/sid/xs_sidplay2.cc:243
-#, c-format
-msgid "reSID->sampling(%d) failed.\n"
-msgstr "reSID->sampling(%d) : erreur.\n"
-
-#: src/sid/xs_sidplay2.cc:253
-msgid "reSID->filter(NULL) failed.\n"
-msgstr "reSID->filter(NULL) : erreur.\n"
-
-#: src/sid/xs_sidplay2.cc:267
-msgid "hardSID->create() failed.\n"
-msgstr "hardSID->create() : erreur.\n"
-
-#: src/sid/xs_sidplay2.cc:273
-#, c-format
-msgid "hardSID->filter(%d) failed.\n"
-msgstr "hardSID->filter(%d) : erreur.\n"
-
-#: src/sid/xs_sidplay2.cc:281
-msgid "[SIDPlay2] Could not initialize SIDBuilder object.\n"
-msgstr "[SIDPlay2] : impossible d'initialiser l'objet 'SIDBuilder'.\n"
-
-#: src/sid/xs_sidplay2.cc:295
-#, c-format
-msgid "[SIDPlay2] Invalid clockSpeed=%d, falling back to PAL.\n"
-msgstr "[SIDPlay2] : vitesse d'horloge invalide (%d) ; utilisation de 'PAL' à la place.\n"
-
-#: src/sid/xs_sidplay2.cc:319
-#, c-format
-msgid "Invalid sid2OptLevel=%d, falling back to %d.\n"
-msgstr "Valeur de 'sid2OptLevel' invalide (%d) : utilisation de '%d' à la place.\n"
-
-#: src/sid/xs_sidplay2.cc:343
-msgid "[SIDPlay2] Emulator engine configuration failed!\n"
-msgstr "[SIDPlay2] : erreur lors de la configuration du moteur d'émulation !\n"
-
-#: src/sid/xs_sidplay2.cc:350
-msgid "[SIDPlay2] Could not initialize SIDTune object.\n"
-msgstr "[SIDPlay2] : impossible d'initialiser l'objet 'SIDTune'.\n"
-
-#: src/sid/xs_sidplay2.cc:401
-msgid "[SIDPlay2] currTune->selectSong() failed\n"
-msgstr "[SIDPlay2] currTune->selectSong() : erreur\n"
-
-#: src/sid/xs_sidplay2.cc:406
-msgid "[SIDPlay2] currEng->load() failed\n"
-msgstr "[SIDPlay2] currEng->load() : erreur\n"
-
-#: src/sid/xs_sidplay1.cc:96
-msgid "[SIDPlay1] Could not initialize emulation engine.\n"
-msgstr "[SIDPlay1]  : impossible d'initialiser le moteur de l'émulation.\n"
-
-#: src/sid/xs_sidplay1.cc:103
-msgid "[SIDPlay1] Endianess verification failed.\n"
-msgstr "[SIDPlay1] : erreur lors de la vérification de la méthode d'alignement de données ('endianess').\n"
-
-#: src/sid/xs_sidplay1.cc:238
-msgid "[SIDPlay1] Emulator engine configuration failed!\n"
-msgstr "[SIDPlay1] : échec lors de la configuration du moteur de l'émulation !\n"
-
-#: src/sid/xs_sidplay1.cc:245
-msgid "[SIDPlay1] Could not initialize SIDTune object.\n"
-msgstr "[SIDPlay1] : impossible d'initialiser l'objet 'SIDTune'.\n"
-
-#: src/sid/xs_sidplay1.cc:291
-msgid "[SIDPlay1] SID-tune struct pointer was NULL. This should not happen, report to XMMS-SID author.\n"
-msgstr "[SIDPlay1] : le pointeur de structure du module audio 'SID' a renvoyé 'NULL'. Cette situation ne devrait pas arriver : veuillez en avertir l'auteur de 'XMMS-SID'.\n"
-
-#: src/sid/xs_sidplay1.cc:296
-msgid "[SIDPlay1] SID-tune status check failed. This should not happen, report to XMMS-SID author.\n"
-msgstr "[SIDPlay1] : erreur lors de la vérification de l'état du module audio 'SID'. Cette situation ne devrait pas arriver : veuillez en avertir l'auteur de 'XMMS-SID'.\n"
-
-#: src/console/Audacious_Config.cxx:125
-msgid "Console Music Decoder"
-msgstr "Décodeur 'Console Music'"
-
-#: src/console/Audacious_Config.cxx:162
-msgid "Bass:"
-msgstr "Basses :"
-
-#: src/console/Audacious_Config.cxx:166
-#: src/console/Audacious_Config.cxx:177
-#: src/console/Audacious_Config.cxx:198
-msgid "secs"
-msgstr "secondes"
-
-#: src/console/Audacious_Config.cxx:173
-msgid "Treble:"
-msgstr "Aiguës :"
-
-#: src/console/Audacious_Config.cxx:194
-msgid "Default song length:"
-msgstr "Durée par défaut :"
-
-#: src/console/Audacious_Config.cxx:206
-msgid "Enable audio resampling"
-msgstr "Activer le rééchantillonnage"
-
-#: src/console/Audacious_Config.cxx:221
-msgid "Resampling rate:"
-msgstr "Taux de rééchantillonnage"
-
-#: src/console/Audacious_Config.cxx:236
-msgid "SPC"
-msgstr "SPC"
-
-#: src/console/Audacious_Config.cxx:237
-msgid "Ignore length from SPC tags"
-msgstr "Ignorer la durée des métadonnées SPC"
-
-#: src/console/Audacious_Config.cxx:238
-msgid "Increase reverb"
-msgstr "Augmenter la réverbération"
-
-#: src/console/Audacious_Config.cxx:263
-msgid "The default song length, expressed in seconds, is used for songs that do not provide length information (i.e. looping tracks)."
-msgstr ""
-"* Durée par défaut *\n"
-"La durée par défaut, exprimée en secondes, est utilisée pour les morceaux qui ne disposent pas d'informations quant à leur durée (les pistes en boucle, par exemple)."
-
-#: src/console/Audacious_Driver.cxx:444
-msgid "About the Console Music Decoder"
-msgstr "À propos de 'Console Music Decoder'"
-
-#: src/console/Audacious_Driver.cxx:445
-msgid ""
-"Console music decoder engine based on Game_Music_Emu 0.5.2.\n"
-"Supported formats: AY, GBS, GYM, HES, KSS, NSF, NSFE, SAP, SPC, VGM, VGZ\n"
-"Audacious implementation by: William Pitcock <nenolod@nenolod.net>, \n"
-"        Shay Green <gblargg@gmail.com>"
-msgstr ""
-"Le moteur de 'Console Music Decoder' est basé sur 'Game_Music_Emu' 0.5.2.\n"
-"\n"
-"Formats supportés : AY, GBS, GYM, HES, KSS, NSF, NSFE, SAP, SPC, VGM, VGZ\n"
-"\n"
-"Support pour Audacious par :\n"
-"\n"
-"William Pitcock <nenolod@nenolod.net>\n"
-"Shay Green <gblargg@gmail.com>"
-
-#: src/modplug/gui/interface.cxx:136
-#: src/modplug/gui/modplug.glade:9
-msgid "ModPlug Configuration"
-msgstr "Configuration de 'ModPlug'"
-
-#: src/modplug/gui/interface.cxx:211
-#: src/modplug/gui/modplug.glade:178
-msgid "Mono (downmix)"
-msgstr "Mono (sous-mélange)"
-
-#: src/modplug/gui/interface.cxx:240
-#: src/modplug/gui/modplug.glade:258
-msgid "Nearest (fastest)"
-msgstr "Méthode du 'plus proche voisin' (la plus rapide)"
-
-#: src/modplug/gui/interface.cxx:247
-#: src/modplug/gui/modplug.glade:277
-msgid "Linear (fast)"
-msgstr "Interpolation linéaire (rapide)"
-
-#: src/modplug/gui/interface.cxx:254
-#: src/modplug/gui/modplug.glade:297
-msgid "Spline (good quality)"
-msgstr "Interpolation par segments ('spline') (bonne qualité)"
-
-#: src/modplug/gui/interface.cxx:261
-#: src/modplug/gui/modplug.glade:317
-msgid "8-tap Fir (extremely high quality)"
-msgstr "Filtre à réponse impulsionnelle finie '8-tap FIR' (qualité optimale)"
-
-#: src/modplug/gui/interface.cxx:285
-#: src/modplug/gui/modplug.glade:384
-msgid "48 kHz"
-msgstr "48 kHz"
-
-#: src/modplug/gui/interface.cxx:292
-#: src/modplug/gui/modplug.glade:403
-msgid "44 kHz"
-msgstr "44 kHz"
-
-#: src/modplug/gui/interface.cxx:299
-#: src/modplug/gui/modplug.glade:423
-msgid "22 kHz"
-msgstr "22 kHz"
-
-#: src/modplug/gui/interface.cxx:306
-#: src/modplug/gui/modplug.glade:443
-msgid "11 kHz"
-msgstr "11 kHz"
-
-#: src/modplug/gui/interface.cxx:348
-#: src/modplug/gui/interface.cxx:410
-#: src/modplug/gui/interface.cxx:476
-#: src/modplug/gui/interface.cxx:538
-#: src/modplug/gui/modplug.glade:560
-#: src/modplug/gui/modplug.glade:739
-#: src/modplug/gui/modplug.glade:930
-#: src/modplug/gui/modplug.glade:1109
+#: src/modplug/gui/interface.cxx:348 src/modplug/gui/interface.cxx:410
+#: src/modplug/gui/interface.cxx:476 src/modplug/gui/interface.cxx:538
+#: src/modplug/gui/modplug.glade:560 src/modplug/gui/modplug.glade:739
+#: src/modplug/gui/modplug.glade:930 src/modplug/gui/modplug.glade:1109
 msgid "Enable"
 msgstr "Activer  "
 
-#: src/modplug/gui/interface.cxx:377
-#: src/modplug/gui/interface.cxx:505
-#: src/modplug/gui/modplug.glade:627
-#: src/modplug/gui/modplug.glade:997
+#: src/modplug/gui/interface.cxx:377 src/modplug/gui/interface.cxx:505
+#: src/modplug/gui/modplug.glade:627 src/modplug/gui/modplug.glade:997
 msgid "Depth"
 msgstr "Profondeur"
 
-#: src/modplug/gui/interface.cxx:385
-#: src/modplug/gui/interface.cxx:513
-#: src/modplug/gui/modplug.glade:655
-#: src/modplug/gui/modplug.glade:1025
+#: src/modplug/gui/interface.cxx:385 src/modplug/gui/interface.cxx:513
+#: src/modplug/gui/modplug.glade:655 src/modplug/gui/modplug.glade:1025
 msgid "Delay"
 msgstr "Délai"
 
-#: src/modplug/gui/interface.cxx:393
-#: src/modplug/gui/modplug.glade:692
+#: src/modplug/gui/interface.cxx:393 src/modplug/gui/modplug.glade:692
 msgid "Reverb"
 msgstr "Réverbération"
 
-#: src/modplug/gui/interface.cxx:439
-#: src/modplug/gui/modplug.glade:806
+#: src/modplug/gui/interface.cxx:439 src/modplug/gui/modplug.glade:806
 msgid "Amount"
 msgstr "Intensité"
 
-#: src/modplug/gui/interface.cxx:447
-#: src/modplug/gui/modplug.glade:834
+#: src/modplug/gui/interface.cxx:447 src/modplug/gui/modplug.glade:834
 msgid "Range"
 msgstr "Portée"
 
-#: src/modplug/gui/interface.cxx:455
-#: src/modplug/gui/modplug.glade:871
+#: src/modplug/gui/interface.cxx:455 src/modplug/gui/modplug.glade:871
 msgid "Bass Boost"
 msgstr "Amplification des basses"
 
-#: src/modplug/gui/interface.cxx:521
-#: src/modplug/gui/modplug.glade:1062
+#: src/modplug/gui/interface.cxx:521 src/modplug/gui/modplug.glade:1062
 msgid "Surround"
 msgstr "Son d'ambiance"
 
-#: src/modplug/gui/interface.cxx:560
-#: src/modplug/gui/modplug.glade:1183
+#: src/modplug/gui/interface.cxx:560 src/modplug/gui/modplug.glade:1183
 msgid ""
 "Note:  Setting the preamp\n"
 "too high may cause clipping\n"
@@ -4907,68 +3669,55 @@
 "peut produire des coupures et des distorsions\n"
 "(des clics et des bruits secs assez agaçants) !"
 
-#: src/modplug/gui/interface.cxx:566
-#: src/modplug/gui/modplug.glade:1212
+#: src/modplug/gui/interface.cxx:566 src/modplug/gui/modplug.glade:1212
 msgid "Preamp"
 msgstr "Préamplification"
 
-#: src/modplug/gui/interface.cxx:571
-#: src/modplug/gui/modplug.glade:1255
+#: src/modplug/gui/interface.cxx:571 src/modplug/gui/modplug.glade:1255
 msgid "Effects"
 msgstr "Effets"
 
-#: src/modplug/gui/interface.cxx:600
-#: src/modplug/gui/modplug.glade:1307
+#: src/modplug/gui/interface.cxx:600 src/modplug/gui/modplug.glade:1307
 msgid "Use Filename as Song Title"
 msgstr "Utiliser le nom du fichier comme titre du morceau"
 
-#: src/modplug/gui/interface.cxx:605
-#: src/modplug/gui/modplug.glade:1326
+#: src/modplug/gui/interface.cxx:605 src/modplug/gui/modplug.glade:1326
 msgid "Fast Playlist Info"
 msgstr "Informations rapides sur la liste de lecture"
 
-#: src/modplug/gui/interface.cxx:616
-#: src/modplug/gui/modplug.glade:1358
+#: src/modplug/gui/interface.cxx:616 src/modplug/gui/modplug.glade:1358
 msgid "Noise Reduction"
 msgstr "Réduction du bruit"
 
-#: src/modplug/gui/interface.cxx:622
-#: src/modplug/gui/modplug.glade:1377
+#: src/modplug/gui/interface.cxx:622 src/modplug/gui/modplug.glade:1377
 msgid "Play Amiga MOD"
 msgstr "Lire les modules musicaux Amiga"
 
-#: src/modplug/gui/interface.cxx:645
-#: src/modplug/gui/modplug.glade:1450
+#: src/modplug/gui/interface.cxx:645 src/modplug/gui/modplug.glade:1450
 msgid "Don't loop"
 msgstr "Ne pas répéter"
 
-#: src/modplug/gui/interface.cxx:657
-#: src/modplug/gui/modplug.glade:1475
+#: src/modplug/gui/interface.cxx:657 src/modplug/gui/modplug.glade:1475
 msgid "Loop"
 msgstr "Répéter"
 
-#: src/modplug/gui/interface.cxx:670
-#: src/modplug/gui/modplug.glade:1513
+#: src/modplug/gui/interface.cxx:670 src/modplug/gui/modplug.glade:1513
 msgid "time(s)"
 msgstr "fois"
 
-#: src/modplug/gui/interface.cxx:676
-#: src/modplug/gui/modplug.glade:1546
+#: src/modplug/gui/interface.cxx:676 src/modplug/gui/modplug.glade:1546
 msgid "Loop forever"
 msgstr "Répéter en boucle"
 
-#: src/modplug/gui/interface.cxx:683
-#: src/modplug/gui/modplug.glade:1567
+#: src/modplug/gui/interface.cxx:683 src/modplug/gui/modplug.glade:1567
 msgid "Looping"
 msgstr "Répétition"
 
-#: src/modplug/gui/interface.cxx:858
-#: src/modplug/gui/modplug.glade:1688
+#: src/modplug/gui/interface.cxx:858 src/modplug/gui/modplug.glade:1688
 msgid "MOD Info"
 msgstr "Informations sur le module"
 
-#: src/modplug/gui/interface.cxx:877
-#: src/modplug/gui/modplug.glade:1730
+#: src/modplug/gui/interface.cxx:877 src/modplug/gui/modplug.glade:1730
 msgid ""
 "Filename:\n"
 "Title:\n"
@@ -4992,8 +3741,7 @@
 "Séquences :\n"
 "Voies :"
 
-#: src/modplug/gui/interface.cxx:882
-#: src/modplug/gui/modplug.glade:1764
+#: src/modplug/gui/interface.cxx:882 src/modplug/gui/modplug.glade:1764
 msgid ""
 "---\n"
 "---\n"
@@ -5017,18 +3765,15 @@
 "---\n"
 "---"
 
-#: src/modplug/gui/interface.cxx:912
-#: src/modplug/gui/modplug.glade:1869
+#: src/modplug/gui/interface.cxx:912 src/modplug/gui/modplug.glade:1869
 msgid "Samples"
 msgstr "Échantillons"
 
-#: src/modplug/gui/interface.cxx:937
-#: src/modplug/gui/modplug.glade:1934
+#: src/modplug/gui/interface.cxx:937 src/modplug/gui/modplug.glade:1934
 msgid "Instruments"
 msgstr "Instruments"
 
-#: src/modplug/gui/interface.cxx:958
-#: src/modplug/gui/modplug.glade:1991
+#: src/modplug/gui/interface.cxx:958 src/modplug/gui/modplug.glade:1991
 msgid "Message"
 msgstr "Commentaires"
 
@@ -5059,6 +3804,28 @@
 msgid "About Modplug"
 msgstr "À propos de 'Modplug'"
 
+#: src/modplug/gui/support.cxx:90 src/modplug/gui/support.cxx:114
+#: src/sid/xs_glade.c:90 src/sid/xs_glade.c:114
+#, c-format
+msgid "Couldn't find pixmap file: %s"
+msgstr "Impossible d'ouvrir l'image : %s"
+
+#: src/mtp_up/mtp.c:35
+msgid "Upload selected track(s)"
+msgstr "Transférer la sélection"
+
+#: src/mtp_up/mtp.c:296
+msgid "Upload in progress..."
+msgstr "Transfert en cours..."
+
+#: src/mtp_up/mtp.c:305
+msgid "MTP device handler"
+msgstr "Support MTP"
+
+#: src/mtp_up/mtp.c:309
+msgid "Disconnect the device"
+msgstr "Déconnecter le périphérique"
+
 #: src/musepack/libmpc.cxx:146
 msgid "Musepack Decoder Plugin 1.2"
 msgstr "Décodeur 'Musepack' 1.2"
@@ -5093,13 +3860,11 @@
 msgid "General Settings"
 msgstr "Réglages généraux"
 
-#: src/musepack/libmpc.cxx:183
-#: src/wavpack/ui.cxx:492
+#: src/musepack/libmpc.cxx:183 src/wavpack/ui.cxx:492
 msgid "Enable Dynamic Bitrate Display"
 msgstr "Activer l'affichage dynamique du débit"
 
-#: src/musepack/libmpc.cxx:187
-#: src/wavpack/ui.cxx:498
+#: src/musepack/libmpc.cxx:187 src/wavpack/ui.cxx:498
 msgid "Plugin"
 msgstr "Module"
 
@@ -5107,13 +3872,11 @@
 msgid "ReplayGain Settings"
 msgstr "Paramètres de 'ReplayGain'"
 
-#: src/musepack/libmpc.cxx:197
-#: src/wavpack/ui.cxx:510
+#: src/musepack/libmpc.cxx:197 src/wavpack/ui.cxx:510
 msgid "Enable Clipping Prevention"
 msgstr "Activer la prévention de la saturation"
 
-#: src/musepack/libmpc.cxx:202
-#: src/wavpack/ui.cxx:515
+#: src/musepack/libmpc.cxx:202 src/wavpack/ui.cxx:515
 msgid "Enable ReplayGain"
 msgstr "Activer 'ReplayGain'"
 
@@ -5129,21 +3892,53 @@
 msgid "Use Album Gain"
 msgstr "Utiliser le gain 'album'"
 
-#: src/musepack/libmpc.cxx:224
-#: src/wavpack/ui.cxx:547
+#: src/musepack/libmpc.cxx:224 src/wavpack/ui.cxx:547
 msgid "ReplayGain"
 msgstr "ReplayGain"
 
+#: src/musepack/libmpc.cxx:491 src/sid/xmms-sid.glade:3144
+#: src/sid/xs_interface.c:1564 src/tta/libtta.c:304 src/wavpack/ui.cxx:152
+msgid "Filename:"
+msgstr "Nom du fichier :"
+
 #: src/musepack/libmpc.cxx:506
 msgid "Musepack Tag"
 msgstr "Métadonnées 'Musepack'"
 
+#: src/musepack/libmpc.cxx:514 src/tta/libtta.c:323 src/wavpack/ui.cxx:172
+msgid "Title:"
+msgstr "Titre :"
+
+#: src/musepack/libmpc.cxx:518 src/tta/libtta.c:333 src/wavpack/ui.cxx:184
+msgid "Artist:"
+msgstr "Artiste :"
+
+#: src/musepack/libmpc.cxx:522 src/tta/libtta.c:344 src/wavpack/ui.cxx:196
+msgid "Album:"
+msgstr "Album :"
+
+#: src/musepack/libmpc.cxx:526 src/tta/libtta.c:355 src/wavpack/ui.cxx:208
+msgid "Comment:"
+msgstr "Commentaire :"
+
+#: src/musepack/libmpc.cxx:530 src/tta/libtta.c:366 src/wavpack/ui.cxx:221
+msgid "Year:"
+msgstr "Année :"
+
 #: src/musepack/libmpc.cxx:535
 msgid "Track:"
 msgstr "Piste :"
 
-#: src/musepack/libmpc.cxx:554
-#: src/wavpack/ui.cxx:273
+#: src/musepack/libmpc.cxx:540 src/tta/libtta.c:390 src/wavpack/ui.cxx:248
+msgid "Genre:"
+msgstr "Genre :"
+
+#: src/musepack/libmpc.cxx:551 src/sid/xmms-sid.glade:1732
+#: src/sid/xs_interface.c:820 src/wavpack/ui.cxx:267
+msgid "Save"
+msgstr "Enregistrer"
+
+#: src/musepack/libmpc.cxx:554 src/wavpack/ui.cxx:273
 msgid "Remove Tag"
 msgstr "Supprimer les métadonnées"
 
@@ -5211,6 +4006,1400 @@
 msgid "Album Gain: %-+5.2f dB"
 msgstr "Gain 'album': %-+5.2f dB"
 
+#: src/musepack/libmpc.cxx:634 src/tta/libtta.c:413 src/wavpack/ui.cxx:409
+#, c-format
+msgid "File Info - %s"
+msgstr "Informations sur le fichier : %s"
+
+#: src/null/null.c:61
+msgid "Null output plugin "
+msgstr "Module de sortie 'Null' "
+
+#: src/null/null.c:62
+msgid ""
+" by Christian Birchinger <joker@netswarm.net>\n"
+"based on the XMMS plugin by Håvard Kvål <havardk@xmms.org>"
+msgstr ""
+" \n"
+"\n"
+"Écrit par Christian Birchinger <joker@netswarm.net>,\n"
+"à partir du module pour XMMS de Håvard Kvål <havardk@xmms.org>"
+
+#: src/null/null.c:65
+msgid "About Null Output"
+msgstr "À propos du module de sortie 'Null'"
+
+#: src/null/null.c:94
+msgid "Null output preferences"
+msgstr "Préférences du module de sortie 'Null'"
+
+#: src/null/null.c:103
+msgid "Run in real time"
+msgstr "Utiliser en temps réel"
+
+#: src/OSS4/about.c:42
+msgid "About OSSv4 Driver"
+msgstr "À propos du pilote 'OSSv4'"
+
+#: src/OSS4/about.c:43
+msgid ""
+"Audacious OSSv4 Driver\n"
+"\n"
+"Based on the OSSv3 Output plugin,\n"
+"Ported to OSSv4's VMIX by Cristi Magherusan <majeru@gentoo.ro>\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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,\n"
+"USA."
+msgstr ""
+"Pilote 'OSSv4' pour Audacious\n"
+"\n"
+"Basé sur le module de sortie 'OSSv3'\n"
+"Rétroporté pour 'VMIX' du pilote 'OSSv4' par\n"
+"Cristi Magherusan <majeru@gentoo.ro>\n"
+"\n"
+"Ceci est une traduction non officielle de la \"GNU General Public License\"\n"
+"en français. Elle n'a pas été publiée par la \"Free Software Foundation\",\n"
+"et ne détermine pas les termes de distribution pour les logiciels qui\n"
+"utilisent la \"GNU GPL\" -- seul le texte anglais original de la \"GNU GPL\" "
+"en a\n"
+"le droit. Cependant, nous espérons que cette traduction aidera les\n"
+"francophones à mieux comprendre la \"GNU GPL\".\n"
+"\n"
+"Ce programme est un logiciel libre : vous pouvez le redistribuer et/ou le\n"
+"modifier selon les termes de la \"Licence Publique Générale GNU\" (GNU "
+"GPL),\n"
+"telle que publiée par la \"Free Software Foundation\", soit la version 2 de\n"
+"la Licence, soit (à votre convenance) toute version postérieure.\n"
+"\n"
+"Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE\n"
+"GARANTIE, sans même la garantie implicite d'une possible VALEUR MARCHANDE\n"
+"ou de l'ADÉQUATION à UN BESOIN PARTICULIER. Consultez la \"Licence Publique\n"
+"Générale GNU\" (GNU GPL) pour plus de détails.\n"
+"\n"
+"Vous devriez avoir reçu une copie de la \"Licence Publique Générale GNU\"\n"
+"(GNU GPL) avec ce programme. Dans le cas contraire, vous pouvez consulter\n"
+"la Licence sur la page <http://www.gnu.org/licenses/> ou écrire à la\n"
+"Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,\n"
+"MA 02110-1301, USA."
+
+#: src/OSS4/configure.c:120 src/OSS/configure.c:151
+#, c-format
+msgid "Default (%s)"
+msgstr "Défaut (%s)"
+
+#: src/OSS4/configure.c:170 src/OSS/configure.c:201
+msgid "OSS Driver configuration"
+msgstr "Configuration du pilote 'OSS'"
+
+#: src/OSS4/configure.c:208 src/OSS/configure.c:239 src/OSS/configure.c:280
+msgid "Use alternate device:"
+msgstr "Utiliser un autre périphérique :"
+
+#: src/OSS4/configure.c:230 src/OSS/configure.c:302 src/sun/configure.c:248
+msgid "Devices"
+msgstr "Périphériques"
+
+#: src/OSS4/configure.c:272 src/OSS/configure.c:343
+msgid "Mixer Settings:"
+msgstr "Paramètres du mélangeur :"
+
+#: src/OSS4/configure.c:278
+msgid "Save VMIX volume between sessions"
+msgstr "Conserver le volume de 'VMIX', d'une session à l'autre"
+
+#: src/OSS4/configure.c:284 src/OSS/configure.c:355 src/sun/configure.c:394
+msgid "Mixer"
+msgstr "Mélangeur audio"
+
+#: src/OSS/about.c:39
+msgid "About OSS Driver"
+msgstr "À propos du pilote 'OSS'"
+
+#: src/OSS/about.c:40
+msgid ""
+"Audacious OSS Driver\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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,\n"
+"USA."
+msgstr ""
+"Pilote 'OSS' pour Audacious\n"
+"\n"
+"Ceci est une traduction non officielle de la \"GNU General Public License\"\n"
+"en français. Elle n'a pas été publiée par la \"Free Software Foundation\",\n"
+"et ne détermine pas les termes de distribution pour les logiciels qui\n"
+"utilisent la \"GNU GPL\" -- seul le texte anglais original de la \"GNU GPL\" "
+"en a\n"
+"le droit. Cependant, nous espérons que cette traduction aidera les\n"
+"francophones à mieux comprendre la \"GNU GPL\".\n"
+"\n"
+"Ce programme est un logiciel libre : vous pouvez le redistribuer et/ou le\n"
+"modifier selon les termes de la \"Licence Publique Générale GNU\" (GNU "
+"GPL),\n"
+"telle que publiée par la \"Free Software Foundation\", soit la version 2 de\n"
+"la Licence, soit (à votre convenance) toute version postérieure.\n"
+"\n"
+"Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE\n"
+"GARANTIE, sans même la garantie implicite d'une possible VALEUR MARCHANDE\n"
+"ou de l'ADÉQUATION à UN BESOIN PARTICULIER. Consultez la \"Licence Publique\n"
+"Générale GNU\" (GNU GPL) pour plus de détails.\n"
+"\n"
+"Vous devriez avoir reçu une copie de la \"Licence Publique Générale GNU\"\n"
+"(GNU GPL) avec ce programme. Dans le cas contraire, vous pouvez consulter\n"
+"la Licence sur la page <http://www.gnu.org/licenses/> ou écrire à la\n"
+"Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,\n"
+"MA 02110-1301, USA."
+
+#: src/OSS/configure.c:349
+msgid "Volume controls Master not PCM"
+msgstr "Contrôle du volume via le canal 'maître' au lieu du canal 'PCM'"
+
+#: src/projectm-1.0/main.c:70
+msgid "_Random"
+msgstr "_Aléatoire"
+
+#: src/pulse_audio/pulse_audio.c:722
+msgid "About Audacious PulseAudio Output Plugin"
+msgstr "À propos du module de sortie 'PulseAudio' pour Audacious"
+
+#: src/pulse_audio/pulse_audio.c:723
+msgid ""
+"Audacious PulseAudio Output Plugin\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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,\n"
+"USA."
+msgstr ""
+"Module de sortie 'PulseAudio' pour Audacious\n"
+"\n"
+"Ceci est une traduction non officielle de la \"GNU General Public License\"\n"
+"en français. Elle n'a pas été publiée par la \"Free Software Foundation\",\n"
+"et ne détermine pas les termes de distribution pour les logiciels qui\n"
+"utilisent la \"GNU GPL\" -- seul le texte anglais original de la \"GNU GPL\" "
+"en a\n"
+"le droit. Cependant, nous espérons que cette traduction aidera les\n"
+"francophones à mieux comprendre la \"GNU GPL\".\n"
+"\n"
+"Ce programme est un logiciel libre : vous pouvez le redistribuer et/ou le\n"
+"modifier selon les termes de la \"Licence Publique Générale GNU\" (GNU "
+"GPL),\n"
+"telle que publiée par la \"Free Software Foundation\", soit la version 2 de\n"
+"la Licence, soit (à votre convenance) toute version postérieure.\n"
+"\n"
+"Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE\n"
+"GARANTIE, sans même la garantie implicite d'une possible VALEUR MARCHANDE\n"
+"ou de l'ADÉQUATION à UN BESOIN PARTICULIER. Consultez la \"Licence Publique\n"
+"Générale GNU\" (GNU GPL) pour plus de détails.\n"
+"\n"
+"Vous devriez avoir reçu une copie de la \"Licence Publique Générale GNU\"\n"
+"(GNU GPL) avec ce programme. Dans le cas contraire, vous pouvez consulter\n"
+"la Licence sur la page <http://www.gnu.org/licenses/> ou écrire à la\n"
+"Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,\n"
+"MA 02110-1301, USA."
+
+#: src/scrobbler/configure.c:138
+msgid "<b>Services</b>"
+msgstr "<b>Services</b>"
+
+#: src/scrobbler/configure.c:160 src/scrobbler/configure.c:199
+msgid "Username:"
+msgstr "Utilisateur :"
+
+#: src/scrobbler/configure.c:166 src/scrobbler/configure.c:205
+msgid "Password:"
+msgstr "Mot de passe :"
+
+#: src/scrobbler/configure.c:183
+msgid "<b>Last.FM</b>"
+msgstr "<b>Last.FM</b>"
+
+#: src/scrobbler/configure.c:222
+msgid "<b>Gerpok</b>"
+msgstr "<b>Gerpok</b>"
+
+#: src/scrobbler/gtkstuff.c:21
+msgid ""
+"Audacious AudioScrobbler Plugin\n"
+"\n"
+"Originally created by Audun Hove <audun@nlc.no> and Pipian <pipian@pipian."
+"com>\n"
+msgstr ""
+"Module 'Scrobbler' pour Audacious\n"
+"\n"
+"Auteurs du code original :\n"
+"\n"
+"Audun Hove  <audun@nlc.no>\n"
+"Pipian            <pipian@pipian.com>\n"
+
+#: src/scrobbler/gtkstuff.c:23
+msgid "About Scrobbler Plugin"
+msgstr "À propos du module 'Scrobbler'"
+
+#: src/scrobbler/gtkstuff.c:36
+#, c-format
+msgid ""
+"There has been an error that may require your attention.\n"
+"\n"
+"Contents of server error:\n"
+"\n"
+"%s\n"
+msgstr ""
+"L'erreur qui s'est produite à l'instant peut nécessiter votre attention.\n"
+"\n"
+"Nature de l'erreur du serveur : \n"
+"\n"
+"%s\n"
+
+#: src/scrobbler/gtkstuff.c:43
+msgid "Scrobbler Error"
+msgstr "Erreur de 'Scrobbler'"
+
+#: src/sid/xmms-sid.glade:8 src/sid/xs_interface.c:221
+msgid "Audacious-SID configuration"
+msgstr "Configuration de 'Audacious-SID'"
+
+#: src/sid/xmms-sid.glade:71 src/sid/xs_interface.c:257
+msgid "8-bit"
+msgstr "8 bits"
+
+#: src/sid/xmms-sid.glade:90 src/sid/xs_interface.c:264
+msgid "16-bit"
+msgstr "16 bits"
+
+#: src/sid/xmms-sid.glade:111 src/sid/xs_interface.c:271
+msgid "Resolution:"
+msgstr "Résolution :"
+
+#: src/sid/xmms-sid.glade:196 src/sid/xs_interface.c:302
+msgid "Autopanning"
+msgstr "Son panoramique"
+
+#: src/sid/xmms-sid.glade:217 src/sid/xs_interface.c:309
+msgid "Channels:"
+msgstr "Sortie :"
+
+#: src/sid/xmms-sid.glade:384 src/sid/xs_interface.c:353
+msgid "Samplerate:"
+msgstr "Taux d'échantillonnage :"
+
+#: src/sid/xmms-sid.glade:430 src/sid/xs_interface.c:370
+msgid "Use oversampling"
+msgstr "Utiliser le suréchantillonnage"
+
+#: src/sid/xmms-sid.glade:456 src/sid/xs_interface.c:381
+msgid "Factor:"
+msgstr "Facteur :"
+
+#: src/sid/xmms-sid.glade:500 src/sid/xs_interface.c:393
+msgid "Large factors require more CPU-power"
+msgstr "Les facteurs élevés nécessitent plus de ressources du processeur"
+
+#: src/sid/xmms-sid.glade:534 src/sid/xs_interface.c:399
+msgid "Oversampling:"
+msgstr "Suréchantillonnage :"
+
+#: src/sid/xmms-sid.glade:570 src/sid/xs_interface.c:404
+msgid "Audio"
+msgstr "Audio"
+
+#: src/sid/xmms-sid.glade:620 src/sid/xs_interface.c:436
+msgid ""
+"If enabled, this option \"forces\" the emulation engine to use the selected "
+"clock speed/frequency. Otherwise the speed is determined from played file "
+"itself."
+msgstr ""
+"Activée, cette option \"force\" le moteur de l'émulation à utiliser la "
+"vitesse/fréquence de l'horloge sélectionnée. Dans le cas contraire, la "
+"vitesse est déterminée par le fichier lui-même."
+
+#: src/sid/xmms-sid.glade:622 src/sid/xs_interface.c:432
+msgid "Force speed"
+msgstr "Forcer la vitesse"
+
+#: src/sid/xmms-sid.glade:640 src/sid/xs_interface.c:442
+msgid ""
+"PAL is the european TV standard, which uses 50Hz vertical refresh frequency. "
+"Most of SID-tunes have been made for PAL computers."
+msgstr ""
+"'PAL' est le standard télévisuel européen ; il utilise une fréquence de "
+"rafraîchissement vertical de 50 hz. La plupart des compositions 'SID' ont "
+"été réalisées pour les ordinateurs 'PAL'."
+
+#: src/sid/xmms-sid.glade:642 src/sid/xs_interface.c:438
+msgid "PAL (50 Hz)"
+msgstr "PAL (50 Hz)"
+
+#: src/sid/xmms-sid.glade:660 src/sid/xs_interface.c:450
+msgid ""
+"NTSC is the TV standard with 60Hz vertical refresh rate (and other features "
+"that differ from PAL). It is mainly used in United States, Japan and certain "
+"other countries."
+msgstr ""
+"'NTSC' est le standard télévisuel qui utilise un taux de rafraîchissement "
+"vertical de 60 Hz (et d'autres caractéristiques qui diffèrent du standard "
+"'PAL'). Il est principalement utilisé aux États-Unis, au Japon et dans "
+"d'autres pays."
+
+#: src/sid/xmms-sid.glade:662 src/sid/xs_interface.c:446
+msgid "NTSC (60 Hz)"
+msgstr "NTSC (60 Hz)"
+
+#: src/sid/xmms-sid.glade:683 src/sid/xs_interface.c:454
+msgid "Clock speed:"
+msgstr "Vitesse d'horloge :"
+
+#: src/sid/xmms-sid.glade:728 src/sid/xs_interface.c:475
+msgid ""
+"If enabled, this option \"forces\" the emulation engine to use the selected "
+"SID-chip model. Otherwise the preferred SID model is determined from the "
+"file (if PSIDv2NG type) or if not available, this setting is used."
+msgstr ""
+"Activée, cette option \"force\" le moteur de l'émulation à utiliser le "
+"modèle de puce 'SID' sélectionné. Dans le cas contraire, le modèle 'SID' "
+"adéquat est déterminé à partir du fichier (s'il est du type 'PSIDv2NG'). Si "
+"l'information concernant le modèle n'est pas disponible, c'est le réglage "
+"choisi via cette option qui sera utilisé."
+
+#: src/sid/xmms-sid.glade:730 src/sid/xs_interface.c:471
+msgid "Force model"
+msgstr "Forcer le modèle"
+
+#: src/sid/xmms-sid.glade:748 src/sid/xs_interface.c:481
+msgid ""
+"MOS/CSG 6581 is the earlier major version of SID chip. It differs from 8580 "
+"in few ways, having much fuller filter (which, due to design error, is never "
+"same between two different SID-chips) and has the \"volume adjustment bug\", "
+"which enables playing of digital samples."
+msgstr ""
+"'MOS/CSG 6581 est la toute première version majeure de la puce 'SID'. Elle "
+"diffère du modèle '8580' de plusieurs manières : elle dispose d'un filtre "
+"plus complet (qui, à cause d'une erreur de conception, n'est jamais le même, "
+"d'un modèle de puce 'SID' à l'autre) et présente le \"problème d'ajustement "
+"du volume\" qui permet la lecture des échantillons digitaux."
+
+#: src/sid/xmms-sid.glade:750 src/sid/xs_interface.c:477
+msgid "MOS 6581"
+msgstr "MOS 6581"
+
+#: src/sid/xmms-sid.glade:769 src/sid/xs_interface.c:485
+msgid "MOS 8580"
+msgstr "MOS 8580"
+
+#: src/sid/xmms-sid.glade:790 src/sid/xs_interface.c:492
+msgid "SID model:"
+msgstr "Modèle 'SID' :"
+
+#: src/sid/xmms-sid.glade:842 src/sid/xs_interface.c:513
+msgid ""
+"Use libSIDPlay 1.x emulation, faster but not so accurate. Good in most "
+"cases, though."
+msgstr ""
+"Utilise la bibliothèque 'libSIDPlay 1.x'. L'émulation est plus rapide, mais "
+"moins précise (toutefois, elle offre une bonne restitution, dans la plupart "
+"des cas)."
+
+#: src/sid/xmms-sid.glade:844 src/sid/xs_interface.c:509
+msgid "SIDPlay 1 (frame-based)"
+msgstr "SIDPlay 1 (synchronisation de la trame)"
+
+#: src/sid/xmms-sid.glade:863 src/sid/xs_interface.c:521
+msgid ""
+"Use libSIDPlay 2.x emulation, which requires powerful CPU due to more exact "
+"emulation."
+msgstr ""
+"Utilise la bibliothèque 'libSIDPlay 2.x'. L'émulation nécessite un "
+"processeur puissant, mais est plus précise."
+
+#: src/sid/xmms-sid.glade:865 src/sid/xs_interface.c:517
+msgid "SIDPlay 2 (cycle-based)"
+msgstr "SIDPlay 2 (synchronisation du cycle)"
+
+#: src/sid/xmms-sid.glade:887 src/sid/xs_interface.c:525
+msgid "Emulation library selection:"
+msgstr "Choix de la bibliothèque d'émulation :"
+
+#: src/sid/xmms-sid.glade:933 src/sid/xs_interface.c:542
+msgid "Real C64 (SIDPlay 2 only)"
+msgstr "C64 réel (SIDPlay 2 uniquement)"
+
+#: src/sid/xmms-sid.glade:952 src/sid/xs_interface.c:549
+msgid "Bank switching"
+msgstr "Pagination"
+
+#: src/sid/xmms-sid.glade:972 src/sid/xs_interface.c:556
+msgid "Transparent ROM"
+msgstr "ROM transparente"
+
+#: src/sid/xmms-sid.glade:992 src/sid/xs_interface.c:563
+msgid "PlaySID environment"
+msgstr "Environnement 'PlaySID'"
+
+#: src/sid/xmms-sid.glade:1013 src/sid/xs_interface.c:570
+msgid "Memory mode:"
+msgstr "Gestion de la mémoire :"
+
+#: src/sid/xmms-sid.glade:1049 src/sid/xs_interface.c:575
+msgid "Emu#1"
+msgstr "Émulation #1"
+
+#: src/sid/xmms-sid.glade:1093 src/sid/xs_interface.c:602
+msgid ""
+"This setting can be used to enable libSIDPlay2's \"optimization mode\", "
+"which in downgrades the emulation from cycle-exact to something similar to "
+"frame-exact. The result is lower CPU usage, but worse accuracy."
+msgstr ""
+"Ce réglage peut être utilisé pour activer le \"mode d'optimisation\" de la "
+"bibliothèque 'libSIDPlay2'. Ce mode réduit l'émulation de 'synchronisation "
+"du cycle' à quelque chose équivalant à 'synchronisation de la trame'."
+
+#: src/sid/xmms-sid.glade:1095 src/sid/xs_interface.c:598
+msgid "Optimization mode (faster, inaccurate)"
+msgstr "Mode 'optimisation' (plus rapide, mais imprécis)"
+
+#: src/sid/xmms-sid.glade:1113 src/sid/xs_interface.c:608
+msgid ""
+"reSID is the software SID-chip simulator based on SID reverse-engineering, "
+"created by Dag Lem. It is probably the closest thing to real SID available "
+"as software-only emulation."
+msgstr ""
+"'reSID' est le simulateur logiciel de puces 'SID' créé par Dag Lem par "
+"ingénierie inverse. Il constitue probablement l'émulation logicielle la plus "
+"proche des véritables puces 'SID'."
+
+#: src/sid/xmms-sid.glade:1115 src/sid/xs_interface.c:604
+msgid "reSID-emulation"
+msgstr "Émulation 'reSID'"
+
+#: src/sid/xmms-sid.glade:1133 src/sid/xs_interface.c:616
+msgid ""
+"HardSID is a EISA/PCI card for PC-compatibles, which can be fitted with a "
+"real SID-chip. Software can be used to control the HardSID and combined with "
+"software emulation of rest of C64 via libSIDPlay2 HardSID can be used to "
+"achieve \"near 100%\" similarity to real C64. For more information, see "
+"http://www.hardsid.com/"
+msgstr ""
+"'HardSID' est une carte EISA/PCI destinée aux systèmes compatibles PC, dans "
+"laquelle peut être insérée une véritable puce 'SID'. La carte 'HardSID' peut "
+"être contrôlée par un logiciel, mais, combinée à l'émulation d'un système "
+"C64 fournie par la bibliothèque 'libSIDPlay2', elle permet d'obtenir un "
+"rendu sonore \"presque\" similaire à celui d'un véritable C64. Pour de plus "
+"amples informations, vous pouvez consulter le site suivant : http://www."
+"hardsid.com/"
+
+#: src/sid/xmms-sid.glade:1135 src/sid/xs_interface.c:612
+msgid "HardSID"
+msgstr "HardSID"
+
+#: src/sid/xmms-sid.glade:1156 src/sid/xs_interface.c:620
+msgid "SIDPlay 2 options:"
+msgstr "Options de 'SIDPlay 2' :"
+
+#: src/sid/xmms-sid.glade:1201 src/sid/xs_interface.c:641
+msgid ""
+"Fastest and also worst sounding sampling method, simply picks nearest "
+"neighbouring sample."
+msgstr ""
+"La plus rapide, mais aussi la pire méthode de restitution sonore : les "
+"échantillons sont choisis selon la méthode du 'plus proche voisin'."
+
+#: src/sid/xmms-sid.glade:1203 src/sid/xs_interface.c:637
+msgid "Fast (nearest neighbour)"
+msgstr "Rapide (méthode du 'plus proche voisin')"
+
+#: src/sid/xmms-sid.glade:1221 src/sid/xs_interface.c:649
+msgid ""
+"Uses linear interpolation between samples, yielding higher audio quality "
+"with less sampling noise."
+msgstr ""
+"Utilise l'interpolation linéaire entre les échantillons. Le flux audio est "
+"alors de plus grande qualité et est moins affecté par le bruit. "
+
+#: src/sid/xmms-sid.glade:1223 src/sid/xs_interface.c:645
+msgid "Linear interpolation"
+msgstr "Interpolation linéaire"
+
+#: src/sid/xmms-sid.glade:1263 src/sid/xs_interface.c:660
+msgid "Resampling (FIR)"
+msgstr "Filtre à réponse impulsionnelle finie (FIR)"
+
+#: src/sid/xmms-sid.glade:1284 src/sid/xs_interface.c:667
+msgid "reSID sampling options:"
+msgstr "Options d'échantillonnage de 'reSID' :"
+
+#: src/sid/xmms-sid.glade:1320 src/sid/xs_interface.c:672
+msgid "Emu#2"
+msgstr "Émulation #2"
+
+#: src/sid/xmms-sid.glade:1350 src/sid/xs_interface.c:688
+msgid ""
+"This option enables emulation of SID filter. The filter is an essential part "
+"of SID's sound capacity, but accurate emulation of it may require quite much "
+"CPU power. However, if filter emulation is disabled, tunes won't sound "
+"authentic at all if they utilize the filter."
+msgstr ""
+"Cette option active l'émulation des filtres 'SID'. Le filtre constitue "
+"l'élément' essentiel de la qualité du son 'SID', mais une émulation précise "
+"peut utiliser beaucoup de ressources du processeur. Cependant, si "
+"l'émulation est désactivée, alors qu'un module audio a été composé avec les "
+"fonctions d'un filtre, le son ne sera pas restitué de manière authentique."
+
+#: src/sid/xmms-sid.glade:1352 src/sid/xs_interface.c:684
+msgid "Emulate filters"
+msgstr "Émuler les filtres"
+
+#: src/sid/xmms-sid.glade:1409 src/sid/xs_interface.c:713
+msgid "FS"
+msgstr "FS"
+
+#: src/sid/xmms-sid.glade:1460 src/sid/xs_interface.c:730
+msgid "FM"
+msgstr "FM"
+
+#: src/sid/xmms-sid.glade:1511 src/sid/xs_interface.c:747
+msgid "FT"
+msgstr "FT"
+
+#: src/sid/xmms-sid.glade:1549 src/sid/xs_interface.c:758
+msgid "Reset values"
+msgstr "Réinitialiser"
+
+#: src/sid/xmms-sid.glade:1578 src/sid/xs_interface.c:763
+msgid "SIDPlay1"
+msgstr "SIDPlay 1"
+
+#: src/sid/xmms-sid.glade:1690 src/sid/xs_interface.c:804
+msgid "Export"
+msgstr "Exporter"
+
+#: src/sid/xmms-sid.glade:1711 src/sid/xs_interface.c:812
+msgid "Use"
+msgstr "Utiliser"
+
+#: src/sid/xmms-sid.glade:1753 src/sid/xs_interface.c:828
+msgid "Import"
+msgstr "Importer"
+
+#: src/sid/xmms-sid.glade:1774 src/sid/xs_interface.c:836
+msgid "Delete"
+msgstr "Supprimer"
+
+#: src/sid/xmms-sid.glade:1819 src/sid/xs_interface.c:850
+msgid "Filter curve:"
+msgstr "Courbe du filtre :"
+
+#: src/sid/xmms-sid.glade:1855 src/sid/xs_interface.c:855
+msgid "SIDPlay2"
+msgstr "SIDPlay 2"
+
+#: src/sid/xmms-sid.glade:1891 src/sid/xs_interface.c:861
+msgid "Filters"
+msgstr "Filtres"
+
+#: src/sid/xmms-sid.glade:1935 src/sid/xs_interface.c:888
+msgid ""
+"If enabled, the tune is played at least for the specified time, adding "
+"silence to the end if necessary."
+msgstr ""
+"Si cette option est activée, le module audio sera lu au moins pendant la "
+"durée indiquée. Si cela s'avère nécessaire, un silence sera ajouté à la fin "
+"du morceau."
+
+#: src/sid/xmms-sid.glade:1937 src/sid/xs_interface.c:884
+msgid "Play at least for specified time"
+msgstr "Lire au moins pendant la durée indiquée"
+
+#: src/sid/xmms-sid.glade:1962 src/sid/xmms-sid.glade:2133
+#: src/sid/xmms-sid.glade:2632 src/sid/xs_interface.c:895
+#: src/sid/xs_interface.c:949 src/sid/xs_interface.c:1109
+msgid "Playtime:"
+msgstr "Durée :"
+
+#: src/sid/xmms-sid.glade:2041 src/sid/xs_interface.c:915
+msgid "Minimum playtime:"
+msgstr "Durée de lecture minimale :"
+
+#: src/sid/xmms-sid.glade:2086 src/sid/xs_interface.c:936
+msgid ""
+"If enabled, tune is played until specified duration is reached (aka maximum "
+"playtime)."
+msgstr ""
+"Si cette option est activée, le module audio sera lu jusqu'à ce que soit "
+"atteinte la durée indiquée (la durée de lecture maximale, en d'autres "
+"termes)."
+
+#: src/sid/xmms-sid.glade:2088 src/sid/xs_interface.c:932
+msgid "Play for specified time maximum"
+msgstr "Lire au maximum pendant la durée indiquée"
+
+#: src/sid/xmms-sid.glade:2107 src/sid/xs_interface.c:942
+msgid ""
+"If enabled, the maximum playtime is applied only if song/tune length is not "
+"known."
+msgstr ""
+"Si cette option est activée, la durée de lecture maximale ne sera appliquée "
+"que si la durée du module audio ne peut pas être déterminée."
+
+#: src/sid/xmms-sid.glade:2109 src/sid/xs_interface.c:938
+msgid "Only when song length is unknown"
+msgstr "Uniquement si la durée du module audio est inconnue"
+
+#: src/sid/xmms-sid.glade:2212 src/sid/xs_interface.c:969
+msgid "Maximum playtime:"
+msgstr "Durée de lecture maximale :"
+
+#: src/sid/xmms-sid.glade:2257 src/sid/xs_interface.c:990
+msgid ""
+"This option enables using of XSIDPLAY compatible song length database. "
+"(Refer to Audacious-SID documentation for more information)"
+msgstr ""
+"Cette option active l'utilisation d'une base de données compatible "
+"'XSIDPLAY' relative à la durée des modules audio. Pour de plus amples "
+"informations, vous pouvez consulter la documentation de 'Audacious-SID'."
+
+#: src/sid/xmms-sid.glade:2259 src/sid/xs_interface.c:986
+msgid "Use XSIDPLAY-compatible database"
+msgstr "Utiliser une base de données compatible 'XSIDPLAY'"
+
+#: src/sid/xmms-sid.glade:2284 src/sid/xs_interface.c:997
+msgid "DB-file:"
+msgstr "Fichier :"
+
+#: src/sid/xmms-sid.glade:2309 src/sid/xs_interface.c:1007
+msgid "Database path and filename"
+msgstr "Emplacement et nom du fichier de la base de données"
+
+#: src/sid/xmms-sid.glade:2329 src/sid/xs_interface.c:1014
+msgid "Browse for song length-database file"
+msgstr ""
+"Permet de parcourir l'arborescence pour sélectionner le fichier de la base "
+"de données"
+
+#: src/sid/xmms-sid.glade:2356 src/sid/xs_interface.c:1016
+msgid "Song length database:"
+msgstr "Base de données relative à la durée des modules audio :"
+
+#: src/sid/xmms-sid.glade:2392 src/sid/xs_interface.c:1021
+msgid "Songlength"
+msgstr "Durée"
+
+#: src/sid/xmms-sid.glade:2430 src/sid/xs_interface.c:1043
+msgid ""
+"By enabling this option you can specify a custom Tuplez formatting string "
+"for SID-files. The SID-plugin specific Tuplez tags are described shortly "
+"below."
+msgstr ""
+"Si vous cochez cette option, vous pourrez indiquer un format de titre "
+"personnalisé pour les fichiers 'SID'. Les métadonnées propres au module "
+"d'extension 'SID' sont brièvement expliquées ci-dessous."
+
+#: src/sid/xmms-sid.glade:2432 src/sid/xs_interface.c:1039
+msgid "Override generic Tuplez format string"
+msgstr "Remplacer les titres génériques"
+
+#: src/sid/xmms-sid.glade:2457 src/sid/xs_interface.c:1054
+msgid "Tuplez format string for SID-files"
+msgstr "Format du titre des modules audio 'SID'"
+
+#: src/sid/xmms-sid.glade:2477 src/sid/xs_interface.c:1057
+msgid "Descriptions of <i>SID-specific</i> Tuplez fields go here. <b>:D</b>"
+msgstr ""
+"La description des métadonnées <i>propres à 'SID'</i> est prévue à cet "
+"endroit. <b>:D</b>"
+
+#: src/sid/xmms-sid.glade:2511 src/sid/xs_interface.c:1065
+msgid "Song title format:"
+msgstr "Format du titre :"
+
+#: src/sid/xmms-sid.glade:2584 src/sid/xs_interface.c:1096
+msgid ""
+"If enabled, sub-tunes of each file will be added to playlist. If disabled, "
+"only the default sub-tune will be added."
+msgstr ""
+"Si cette option est activée, les sous-modules de chaque fichier seront "
+"ajoutés à la liste de lecture. Dans le cas contraire, seul le sous-module "
+"par défaut sera ajouté."
+
+#: src/sid/xmms-sid.glade:2586 src/sid/xs_interface.c:1092
+msgid "Add sub-tunes to playlist"
+msgstr "Ajouter les sous-modules à la liste de lecture"
+
+#: src/sid/xmms-sid.glade:2605 src/sid/xs_interface.c:1102
+msgid "Only add sub-tunes that have a duration of at least specified time."
+msgstr ""
+"Ajoute uniquement les sous-modules dont la durée est au moins égale au temps "
+"spécifié."
+
+#: src/sid/xmms-sid.glade:2607 src/sid/xs_interface.c:1098
+msgid "Only tunes with specified minimum duration"
+msgstr "Uniquement les morceaux dont la durée minimale est la suivante :"
+
+#: src/sid/xmms-sid.glade:2710 src/sid/xs_interface.c:1129
+msgid "Sub-tune handling:"
+msgstr "Gestion des sous-modules :"
+
+#: src/sid/xmms-sid.glade:2755 src/sid/xs_interface.c:1150
+msgid ""
+"If this option is enabled (and the database & HVSC settings below are "
+"correctly set), Audacious-SID will use and display additional information "
+"from STIL database when HVSC SIDs are played."
+msgstr ""
+"Si cette option est activée (et que la base de données ainsi que les "
+"paramètres 'HVSC' ci-dessous sont correctement configurés), 'Audacious-SID' "
+"utilisera et affichera des informations supplémentaires, à partir de la base "
+"de données 'STIL', lorsque des modules audio 'SID' de la collection 'HVSC' "
+"seront lus."
+
+#: src/sid/xmms-sid.glade:2757 src/sid/xs_interface.c:1146
+msgid "Use STIL database"
+msgstr "Utiliser une base de données 'STIL'"
+
+#: src/sid/xmms-sid.glade:2782 src/sid/xs_interface.c:1157
+msgid "STIL file:"
+msgstr "Fichier 'STIL' :"
+
+#: src/sid/xmms-sid.glade:2819 src/sid/xs_interface.c:1173
+msgid ""
+"Path and filename of STIL database file (STIL.txt), usually found from "
+"HVSC's DOCUMENTS-subdirectory."
+msgstr ""
+"Emplacement et nom du fichier de la base de données 'STIL' (le fichier 'STIL."
+"txt' est habituellement situé dans le sous-répertoire 'DOCUMENTS' du dossier "
+"'HVSC')."
+
+#: src/sid/xmms-sid.glade:2854 src/sid/xs_interface.c:1186
+msgid "Browse for STIL-database file"
+msgstr ""
+"Permet de parcourir l'arborescence pour sélectionner le fichier de la base "
+"de données 'STIL'"
+
+#: src/sid/xmms-sid.glade:2888 src/sid/xs_interface.c:1193
+msgid "HVSC path:"
+msgstr "Emplacement de 'HVSC' :"
+
+#: src/sid/xmms-sid.glade:2925 src/sid/xs_interface.c:1209
+msgid ""
+"Path to base-directory of your High Voltage SID Collection (HVSC), for "
+"example /media/C64Music/"
+msgstr ""
+"Emplacement du dossier de base de 'High Voltage SID Collection' (HVSC) ('/"
+"media/C64Music/', par exemple)"
+
+#: src/sid/xmms-sid.glade:2960 src/sid/xs_interface.c:1222
+msgid "Browse for HVSC path"
+msgstr "Permet de parcourir l'arborescence pour sélectionner le dossier 'HVSC'"
+
+#: src/sid/xmms-sid.glade:2990 src/sid/xs_interface.c:1224
+msgid "SID Tune Information List (STIL) database:"
+msgstr "Base de données 'STIL' (SID Tune Information List) :"
+
+#: src/sid/xmms-sid.glade:3063 src/sid/xs_interface.c:1248
+msgid "Accept and update changes"
+msgstr "Valide et applique les changements"
+
+#: src/sid/xmms-sid.glade:3077 src/sid/xs_interface.c:1255
+msgid "Cancel any changes"
+msgstr "Annule tous les changements"
+
+#: src/sid/xmms-sid.glade:3102 src/sid/xs_interface.c:1543
+msgid "Audacious-SID Fileinfo"
+msgstr "Infomations sur le fichier 'Audacious-SID'"
+
+#: src/sid/xmms-sid.glade:3172 src/sid/xs_interface.c:1572
+msgid "Songname:"
+msgstr "Nom du morceau :"
+
+#: src/sid/xmms-sid.glade:3200 src/sid/xs_interface.c:1580
+msgid "Composer:"
+msgstr "Compositeur :"
+
+#: src/sid/xmms-sid.glade:3228 src/sid/xs_interface.c:1588
+msgid "Copyright:"
+msgstr "Droits :"
+
+#: src/sid/xmms-sid.glade:3342 src/sid/xs_interface.c:1632
+msgid "Song Information:"
+msgstr "Informations sur le module :"
+
+#: src/sid/xmms-sid.glade:3416 src/sid/xs_interface.c:1667
+msgid "Author:"
+msgstr "Auteur :"
+
+#: src/sid/xmms-sid.glade:3514 src/sid/xs_interface.c:1701
+msgid "Duration:"
+msgstr "Durée :"
+
+#: src/sid/xmms-sid.glade:3608 src/sid/xs_interface.c:1735
+msgid "Sub-tune Information:"
+msgstr "Informations sur les sous-modules :"
+
+#: src/sid/xmms-sid.glade:3662 src/sid/xs_interface.c:1796
+msgid "Select HVSC song length database"
+msgstr "Choix de la base de données 'HVSC'"
+
+#: src/sid/xmms-sid.glade:3704 src/sid/xs_interface.c:1837
+msgid "Select STIL-database"
+msgstr "Choix de la base de données 'STIL'"
+
+#: src/sid/xmms-sid.glade:3746 src/sid/xs_interface.c:1878
+msgid "Select HVSC location prefix"
+msgstr "Emplacement de 'HVSC'"
+
+#: src/sid/xmms-sid.glade:3788 src/sid/xs_interface.c:1919
+msgid "Select SIDPlay2 filters file for importing"
+msgstr "Fichier de filtres 'SIDPlay2' à importer :"
+
+#: src/sid/xmms-sid.glade:3830 src/sid/xs_interface.c:1960
+msgid "Select SIDPlay2 filters file for exporting"
+msgstr "Fichier de filtres 'SIDPlay2' à exporter :"
+
+#: src/sid/xmms-sid.glade:3871 src/sid/xmms-sid.glade:3953
+#: src/sid/xs_interface.c:2008 src/sid/xs_interface.c:2021
+msgid "Confirm selected action"
+msgstr "Confirmer l'action choisie"
+
+#: src/sid/xmms-sid.glade:3909 src/sid/xs_interface.c:2038
+msgid "Yes"
+msgstr "Oui"
+
+#: src/sid/xmms-sid.glade:3921 src/sid/xs_interface.c:2044
+msgid "No"
+msgstr "Aucun"
+
+#: src/sid/xs_about.c:84 src/wma/wma.c:121
+#, c-format
+msgid "About %s"
+msgstr "À propos de '%s'"
+
+#: src/sid/xs_fileinfo.c:232
+msgid "General info"
+msgstr "Général"
+
+#: src/sid/xs_fileinfo.c:247
+#, c-format
+msgid "Tune #%i: "
+msgstr "Module #%i : "
+
+#: src/sndfile/plugin.c:548
+msgid "About sndfile plugin"
+msgstr "À propos du module 'sndfile'"
+
+#: src/sndfile/plugin.c:549
+msgid ""
+"Adapted for Audacious usage by Tony Vroon <chainsaw@gentoo.org>\n"
+"from the xmms_sndfile plugin which is:\n"
+"Copyright (C) 2000, 2002 Erik de Castro Lopo\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.  \n"
+"See the GNU General Public License for more details. \n"
+"\n"
+"You should have received a copy of the GNU General Public \n"
+"License along with this program ; if not, write to \n"
+"the Free Software Foundation, Inc., \n"
+"51 Franklin Street, Fifth Floor, \n"
+"Boston, MA  02110-1301  USA"
+msgstr ""
+"Adapté pour Audacious par Tony Vroon <chainsaw@gentoo.org>\n"
+"à partir du module 'xmms_sndfile' de Erik de Castro Lopo\n"
+"(Droits d'utilisation 2000, 2002)\n"
+"\n"
+"\n"
+"Ceci est une traduction non officielle de la \"GNU General Public License\"\n"
+"en français. Elle n'a pas été publiée par la \"Free Software Foundation\",\n"
+"et ne détermine pas les termes de distribution pour les logiciels qui\n"
+"utilisent la \"GNU GPL\" -- seul le texte anglais original de la \"GNU GPL\" "
+"en a\n"
+"le droit. Cependant, nous espérons que cette traduction aidera les\n"
+"francophones à mieux comprendre la \"GNU GPL\".\n"
+"\n"
+"Ce programme est un logiciel libre : vous pouvez le redistribuer et/ou le\n"
+"modifier selon les termes de la \"Licence Publique Générale GNU\" (GNU "
+"GPL),\n"
+"telle que publiée par la \"Free Software Foundation\", soit la version 2 de\n"
+"la Licence, soit (à votre convenance) toute version postérieure.\n"
+"\n"
+"Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE\n"
+"GARANTIE, sans même la garantie implicite d'une possible VALEUR MARCHANDE\n"
+"ou de l'ADÉQUATION à UN BESOIN PARTICULIER. Consultez la \"Licence Publique\n"
+"Générale GNU\" (GNU GPL) pour plus de détails.\n"
+"\n"
+"Vous devriez avoir reçu une copie de la \"Licence Publique Générale GNU\"\n"
+"(GNU GPL) avec ce programme. Dans le cas contraire, vous pouvez consulter\n"
+"la Licence sur la page <http://www.gnu.org/licenses/> ou écrire à la\n"
+"Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,\n"
+"MA 02110-1301, USA."
+
+#: src/sndstretch/sndstretch_xmms.c:159
+msgid "About SndStretch"
+msgstr "À propos de 'SndStretch'"
+
+#: src/sndstretch/sndstretch_xmms.c:319
+msgid "Volume corr."
+msgstr "Correction du volume"
+
+#: src/sndstretch/sndstretch_xmms.c:320
+msgid "Short Overlap"
+msgstr "Chevauchement léger"
+
+#: src/sndstretch/sndstretch_xmms.c:374
+msgid "Speed"
+msgstr "Vitesse"
+
+#: src/sndstretch/sndstretch_xmms.c:375
+msgid "Pitch"
+msgstr "Hauteur"
+
+#: src/sndstretch/sndstretch_xmms.c:376
+msgid "Scale"
+msgstr "Échelle"
+
+#: src/sndstretch/sndstretch_xmms.c:396
+msgid "SndStretch - Configuration"
+msgstr "Configuration de 'SndStretch'"
+
+#: src/song_change/song_change.c:312
+msgid "Commands"
+msgstr "Commandes"
+
+#: src/song_change/song_change.c:319
+msgid "Command to run when Audacious starts a new song."
+msgstr "Commande à exécuter lorsqu'un nouveau morceau commence :"
+
+#: src/song_change/song_change.c:328 src/song_change/song_change.c:350
+#: src/song_change/song_change.c:371 src/song_change/song_change.c:392
+msgid "Command:"
+msgstr "Commande :"
+
+#: src/song_change/song_change.c:342
+msgid "Command to run toward the end of a song."
+msgstr "Commande à exécuter lorsque la lecture d'un morceau se termine :"
+
+#: src/song_change/song_change.c:362
+msgid "Command to run when Audacious reaches the end of the playlist."
+msgstr ""
+"Commande à exécuter lorsque la fin de la liste de lecture est atteinte :"
+
+#: src/song_change/song_change.c:383
+msgid ""
+"Command to run when title changes for a song (i.e. network streams titles)."
+msgstr ""
+"Commande à exécuter lorsque le titre d'un morceau change (le titre d'un flux "
+"distant, par exemple) :"
+
+#: src/song_change/song_change.c:404
+#, c-format
+msgid ""
+"You can use the following format strings which\n"
+"will be substituted before calling the command\n"
+"(not all are useful for the end-of-playlist command).\n"
+"\n"
+"%%F: Frequency (in hertz)\n"
+"%%c: Number of channels\n"
+"%%f: filename (full path)\n"
+"%%l: length (in milliseconds)\n"
+"%%n or %%s: Song name\n"
+"%%r: Rate (in bits per second)\n"
+"%%t: Playlist position (%%02d)\n"
+"%%p: Currently playing (1 or 0)"
+msgstr ""
+"Vous pouvez utiliser les chaînes de la liste ci-dessous.\n"
+"Elles seront remplacées avant l'appel de la commande à exécuter\n"
+"(toutes ne sont pas utiles pour la fonction 'fin de liste') :\n"
+"\n"
+"%%F: Fréquence (en Hertz)\n"
+"%%c: Nombre de voies\n"
+"%%f: Nom du fichier (chemin complet)\n"
+"%%l: Durée (en millisecondes)\n"
+"%%n ou %%s: Titre du morceau\n"
+"%%r: Taux d'encodage (en 'bits' par seconde)\n"
+"%%t: Position dans la liste de lecture (%%02d)\n"
+"%%p: Statut de la lecture (1 ou 0)"
+
+#: src/song_change/song_change.c:429
+msgid ""
+"<span size='small'>Parameters passed to the shell should be encapsulated in "
+"quotes. Doing otherwise is a security risk.</span>"
+msgstr ""
+"<span size='small'>Les arguments à lancer dans la console doivent être "
+"entourés de guillemets.\n"
+"Une utilisation différente constitue un risque en matière de sécurité.</span>"
+
+#: src/spectrum/spectrum.c:90
+msgid "Spectrum Analyzer"
+msgstr "Analyseur Spectral"
+
+#: src/statusicon/gtktrayicon-x11.c:133
+msgid "Orientation"
+msgstr "Orientation"
+
+#: src/statusicon/gtktrayicon-x11.c:134
+msgid "The orientation of the tray"
+msgstr "Définit l'orientation de l'icône"
+
+#: src/statusicon/si_ui.c:622
+msgid "About Status Icon Plugin"
+msgstr "À propos du module 'Status Icon'"
+
+#: src/statusicon/si_ui.c:624
+msgid ""
+"\n"
+"written by Giacomo Lozito < james@develia.org >\n"
+"\n"
+"This plugin provides a status icon, placed in\n"
+"the system tray area of the window manager.\n"
+msgstr ""
+"\n"
+"Écrit par Giacomo Lozito < james@develia.org >\n"
+"\n"
+"Ce module affiche une icône de statut dans la\n"
+"boîte de notification du gestionnaire de fenêtres.\n"
+
+#: src/statusicon/si_ui.c:696
+msgid "Status Icon Plugin - Preferences"
+msgstr "Préférences de 'Status Icon'"
+
+#: src/statusicon/si_ui.c:707
+msgid "Right-Click Menu"
+msgstr "Menu disponible via le clic droit :"
+
+#: src/statusicon/si_ui.c:712
+msgid "Audacious standard menu"
+msgstr "Menu standard d'Audacious"
+
+#: src/statusicon/si_ui.c:717
+msgid "Small playback menu #1"
+msgstr "Menu de lecture compact #1"
+
+#: src/statusicon/si_ui.c:722
+msgid "Small playback menu #2"
+msgstr "Menu de lecture compact #2"
+
+#: src/statusicon/si_ui.c:745
+msgid "Mouse Scroll Action"
+msgstr "Effet du défilement de la souris :"
+
+#: src/statusicon/si_ui.c:750
+msgid "Change volume"
+msgstr "Changement du volume"
+
+#: src/statusicon/si_ui.c:755
+msgid "Change playing song"
+msgstr "Changement du titre en cours de lecture"
+
+#: src/stereo_plugin/stereo.c:26
+msgid ""
+"Extra Stereo Plugin\n"
+"\n"
+"By Johan Levin 1999."
+msgstr ""
+"Module 'Extra Stereo'\n"
+"\n"
+"Écrit par Johan Levin (1999)."
+
+#: src/stereo_plugin/stereo.c:52
+msgid "About Extra Stereo Plugin"
+msgstr "À propos..."
+
+#: src/stereo_plugin/stereo.c:93
+msgid "Configure Extra Stereo"
+msgstr "Configurer 'Extra Stereo'"
+
+#: src/stereo_plugin/stereo.c:95
+msgid "Effect intensity:"
+msgstr "Intensité de l'effet :"
+
+#: src/sun/about.c:34
+msgid "About the Sun Driver"
+msgstr "À propos du pilote 'Sun'"
+
+#: src/sun/about.c:35
+msgid ""
+"XMMS BSD Sun Driver\n"
+"\n"
+"Copyright (c) 2001 CubeSoft Communications, Inc.\n"
+"Maintainer: <vedge at csoft.org>.\n"
+msgstr ""
+"Pilote 'Sun BSD' pour XMMS\n"
+"\n"
+"Droits d'utilisation :\n"
+"(c) 2001, CubeSoft Communications, Inc.\n"
+"\n"
+"Responsable de la maintenance :\n"
+"<vedge at csoft.org>.\n"
+
+#: src/sun/configure.c:201
+msgid "Audio control device:"
+msgstr "Périphérique de contrôle audio :"
+
+#: src/sun/configure.c:350
+msgid "Volume controls device:"
+msgstr "Périphérique de contrôle du volume :"
+
+#: src/sun/configure.c:363
+msgid "XMMS uses mixer exclusively."
+msgstr "XMMS utilise le mélangeur audio de manière exclusive."
+
+#: src/sun/configure.c:538
+msgid "Sun driver configuration"
+msgstr "Configuration du pilote 'Sun'"
+
+#: src/timidity/interface.c:54
+msgid "TiMidity Configuration"
+msgstr "Configuration de 'TiMidity'"
+
+#: src/timidity/interface.c:91
+msgid "11000 Hz"
+msgstr "11000 Hz"
+
+#: src/timidity/interface.c:99
+msgid "22000 Hz"
+msgstr "22000 Hz"
+
+#: src/timidity/interface.c:107
+msgid "44100 Hz"
+msgstr "44100 Hz"
+
+#: src/timidity/interface.c:115
+msgid "Sample Width"
+msgstr "Résolution"
+
+#: src/timidity/interface.c:181
+msgid "TiMidity Configuration File"
+msgstr "Fichier de configuration de 'TiMidity'"
+
+#: src/timidity/xmms-timidity.c:118
+msgid ""
+"TiMidity Plugin\n"
+"http://libtimidity.sourceforge.net\n"
+"by Konstantin Korikov"
+msgstr ""
+"Module 'TiMidity'\n"
+"\n"
+"http://libtimidity.sourceforge.net\n"
+"\n"
+"Écrit par Konstantin Korikov"
+
+#: src/timidity/xmms-timidity.c:119
+#, c-format
+msgid "TiMidity Plugin %s"
+msgstr "Module 'TiMidity' %s"
+
+#: src/timidity/xmms-timidity.c:336
+msgid "Couldn't load MIDI file"
+msgstr "Impossible de lire le fichier MIDI"
+
+#: src/tonegen/tonegen.c:56
+msgid "About Tone Generator"
+msgstr "À propos de 'Tone Generator'"
+
+#: src/tonegen/tonegen.c:58
+msgid ""
+"Sinus tone generator by Haavard Kvaalen <havardk@xmms.org>\n"
+"Modified by Daniel J. Peng <danielpeng@bigfoot.com>\n"
+"\n"
+"To use it, add a URL: tone://frequency1;frequency2;frequency3;...\n"
+"e.g. tone://2000;2005 to play a 2000Hz tone and a 2005Hz tone"
+msgstr ""
+"Générateur de sons sinusoïdaux écrit par Håvard Kvålen <havardk@xmms.org>\n"
+"\n"
+"Modifié par Daniel J. Peng <danielpeng@bigfoot.com>\n"
+"\n"
+"Pour utiliser ce module, il suffit d'ajouter une adresse du type :\n"
+"tone://fréquence1;fréquence2;fréquence3;...\n"
+"\n"
+"Par exemple, 'tone://2000;2005' émettra un son de 2000 Hz et un son de 2005 "
+"Hz."
+
+#: src/tonegen/tonegen.c:167
+#, c-format
+msgid "%s %.1f Hz"
+msgstr "%s %.1f Hz"
+
+#: src/tonegen/tonegen.c:167
+msgid "Tone Generator: "
+msgstr "Générateur de sons : "
+
+#: src/tta/libtta.c:130
+msgid "Can't open file\n"
+msgstr "Impossible d'ouvrir le fichier\n"
+
+#: src/tta/libtta.c:133
+msgid "Not supported file format\n"
+msgstr "Le format du fichier n'est pas supporté\n"
+
+#: src/tta/libtta.c:136
+msgid "File is corrupted\n"
+msgstr "Le fichier est corrompu\n"
+
+#: src/tta/libtta.c:139
+msgid "Can't read from file\n"
+msgstr "Impossible de lire le fichier\n"
+
+#: src/tta/libtta.c:142
+msgid "Insufficient memory available\n"
+msgstr "La mémoire disponible est insuffisante\n"
+
+#: src/tta/libtta.c:145
+msgid "Output plugin error\n"
+msgstr "Erreur relative au module de sortie\n"
+
+#: src/tta/libtta.c:148
+msgid "Unknown error\n"
+msgstr "Erreur inconnue\n"
+
+#: src/tta/libtta.c:152
+msgid "TTA Decoder Error"
+msgstr "Erreur du décodeur 'TTA'"
+
+#: src/tta/libtta.c:261
+msgid "TTA input plugin "
+msgstr "Module d'entrée 'TTA' "
+
+#: src/tta/libtta.c:262
+msgid ""
+" for BMP\n"
+"Copyright (c) 2004 True Audio Software\n"
+msgstr ""
+" pour BMP\n"
+"\n"
+"Droits d'utilisation (2004) :\n"
+"\n"
+"True Audio Software\n"
+
+#: src/tta/libtta.c:265
+msgid "About True Audio Plugin"
+msgstr "À propos du module 'True Audio'"
+
+#: src/tta/libtta.c:316
+msgid "ID3 Tag:"
+msgstr "Métadonnées ID3"
+
+#: src/tta/libtta.c:378 src/wavpack/ui.cxx:234
+msgid "Track number:"
+msgstr "Piste :"
+
+#: src/vorbis/configure.c:84
+msgid "Ogg Vorbis Audio Plugin Configuration"
+msgstr "Configuration du module audio 'Ogg Vorbis'"
+
+#: src/vorbis/configure.c:94
+msgid "Ogg Vorbis Tags:"
+msgstr "Métadonnées 'Ogg Vorbis' :"
+
+#: src/vorbis/configure.c:115
+msgid "Title format:"
+msgstr "Format du titre :"
+
+#: src/vorbis/vorbis.c:681
+msgid "About Ogg Vorbis Audio Plugin"
+msgstr "À propos du module audio 'Ogg Vorbis'"
+
+#: src/vorbis/vorbis.c:687
+msgid ""
+"Ogg Vorbis Plugin by the Xiph.org Foundation\n"
+"\n"
+"Original code by\n"
+"Tony Arcieri <bascule@inferno.tusculum.edu>\n"
+"Contributions from\n"
+"Chris Montgomery <monty@xiph.org>\n"
+"Peter Alm <peter@xmms.org>\n"
+"Michael Smith <msmith@labyrinth.edu.au>\n"
+"Jack Moffitt <jack@icecast.org>\n"
+"Jorn Baayen <jorn@nl.linux.org>\n"
+"Haavard Kvaalen <havardk@xmms.org>\n"
+"Gian-Carlo Pascutto <gcp@sjeng.org>\n"
+"Eugene Zagidullin <e.asphyx@gmail.com>\n"
+"\n"
+"Visit the Xiph.org Foundation at http://www.xiph.org/\n"
+msgstr ""
+"Module 'Ogg Vorbis' de 'Xiph.org Foundation'\n"
+"\n"
+"\n"
+"Code original :\n"
+"Tony Arcieri                <bascule@inferno.tusculum.edu>\n"
+"\n"
+"Contributions :\n"
+"Chris Montgomery     <monty@xiph.org>\n"
+"Peter Alm                  <peter@xmms.org>\n"
+"Michael Smith           <msmith@labyrinth.edu.au>\n"
+"Jack Moffitt                <jack@icecast.org>\n"
+"Jorn Baayen              <jorn@nl.linux.org>\n"
+"Håvard Kvålen          <havardk@xmms.org>\n"
+"Gian-Carlo Pascutto  <gcp@sjeng.org>\n"
+"\n"
+"\n"
+"Vous pouvez visiter 'Xiph.org Foundation' à cette adresse :\n"
+"http://www.xiph.org/\n"
+
+#: src/vtx/about.c:23
+msgid "About Vortex Player"
+msgstr "À propos du lecteur 'Vortex'"
+
+#: src/vtx/about.c:25
+msgid ""
+"Vortex file format player by Sashnov Alexander <sashnov@ngs.ru>\n"
+"Founded on original source in_vtx.dll by Roman Sherbakov <v_soft@microfor."
+"ru>\n"
+"\n"
+"Music in vtx format can be found at http://vtx.microfor.ru/music.htm\n"
+"and other AY/YM music sites.\n"
+"\n"
+"Audacious implementation by Pavel Vymetalek <pvymetalek@seznam.cz>"
+msgstr ""
+"Lecteur de fichiers au format 'Vortex' de\n"
+"Sashnov Alexander <sashnov@ngs.ru>\n"
+"\n"
+"Source originale : 'in_vtx.dll' de\n"
+"Roman Sherbakov <v_soft@microfor.ru>\n"
+"\n"
+"La musique au format 'vtx' peut être trouvée à l'adresse suivante :\n"
+"\n"
+"http://vtx.microfor.ru/music.htm\n"
+"(et sur les autres sites de musique AY/YM).\n"
+"\n"
+"Adaptation pour Audacious :\n"
+"Pavel Vymetalek <pvymetalek@seznam.cz>"
+
 #: src/wavpack/ui.cxx:52
 #, c-format
 msgid "Wavpack Decoder Plugin %s"
@@ -5313,234 +5502,194 @@
 msgid "use Album Gain/Peak"
 msgstr "Utiliser le gain/pic sonore 'album'"
 
-#: src/aosd/aosd_trigger.c:75
-msgid "Playback Start"
-msgstr "Début de la lecture"
-
-#: src/aosd/aosd_trigger.c:76
-msgid "Triggers OSD when a playlist entry is played."
-msgstr "Déclenche la fonction 'OSD' lorsqu'une entrée de la liste de lecture est lue."
-
-#: src/aosd/aosd_trigger.c:80
-msgid "Title Change"
-msgstr "Changement de titre"
-
-#: src/aosd/aosd_trigger.c:81
-msgid "Triggers OSD when, during playback, the song title changes but the filename is the same. This is mostly useful to display title changes in internet streams."
-msgstr "Déclenche la fonction 'OSD' si, pendant la lecture, le titre du morceau change, alors que le nom du fichier est identique. Cette option est particulièrement utile pour afficher le changement de titre des flux Internet."
-
-#: src/aosd/aosd_trigger.c:87
-msgid "Volume Change"
-msgstr "Changement de volume"
-
-#: src/aosd/aosd_trigger.c:88
-msgid "Triggers OSD when volume is changed."
-msgstr "Déclenche la fonction 'OSD' en cas de changement de volume."
-
-#: src/aosd/aosd_trigger.c:92
-msgid "Pause On"
-msgstr "Mode 'pause' activé"
-
-#: src/aosd/aosd_trigger.c:93
-msgid "Triggers OSD when playback is paused."
-msgstr "Déclenche la fonction 'OSD' lorsque la lecture est en mode 'pause'."
-
-#: src/aosd/aosd_trigger.c:97
-msgid "Pause Off"
-msgstr "Mode 'pause' désactivé"
-
-#: src/aosd/aosd_trigger.c:98
-msgid "Triggers OSD when playback is unpaused."
-msgstr "Déclenche la fonction 'OSD' lorsque la lecture n'est plus en mode 'pause'."
-
-#: src/aosd/aosd_style.c:75
-msgid "Rectangle"
-msgstr "Rectangle"
-
-#: src/aosd/aosd_style.c:79
-msgid "Rounded Rectangle"
-msgstr "Rectangle arrondi"
-
-#: src/aosd/aosd_style.c:83
-msgid "Concave Rectangle"
-msgstr "Rectangle concave"
-
-#: src/aosd/aosd_style.c:87
-msgid "None"
-msgstr "Aucun"
-
-#: src/blur_scope/blur_scope.c:54
-msgid "/Toggle Decorations"
-msgstr "/Montrer les décorations"
-
-#: src/blur_scope/blur_scope.c:56
-msgid "/-"
-msgstr "/-"
-
-#: src/blur_scope/blur_scope.c:57
-msgid "/Close"
-msgstr "/Fermer"
-
-#: src/cdaudio-ng/cdaudio-ng.c:623
+#: src/wma/wma.c:123
 msgid ""
-"<b><big>No playable CD found.</big></b>\n"
-"\n"
-"No CD inserted, or inserted CD is not an audio CD.\n"
-msgstr ""
-"<b><big>Aucune piste audio n'a été détectée.</big></b>\n"
-"\n"
-"Le lecteur ne comporte pas de CD ou le support inséré n'est pas un CD audio.\n"
-
-#: src/echo_plugin/gui.c:11
-msgid ""
-"Echo Plugin\n"
-"By Johan Levin 1999.\n"
-"\n"
-"Surround echo by Carl van Schaik 1999"
+"Adapted for use in Audacious by Tony Vroon (chainsaw@gentoo.org) from\n"
+"the BEEP-WMA plugin which is Copyright (C) 2004,2005 Mokrushin I.V. aka "
+"McMCC (mcmcc@mail.ru)\n"
+"and the BMP-WMA plugin which is Copyright (C) 2004 Roman Bogorodskiy "
+"<bogorodskiy@inbox.ru>.\n"
+"This plugin based on source code "
 msgstr ""
-"Module 'Écho'\n"
-"\n"
-"Écrit par Johan Levin (1999).\n"
-"\n"
-"'Surround echo' est écrit par Carl van Schaik (1999)"
-
-#: src/evdev-plug/ed.c:59
-msgid "Playback->Play"
-msgstr "Lecture -> Lire"
-
-#: src/evdev-plug/ed.c:60
-msgid "Playback->Stop"
-msgstr "Lecture -> Arrêter"
-
-#: src/evdev-plug/ed.c:61
-msgid "Playback->Pause"
-msgstr "Lecture -> Pause"
-
-#: src/evdev-plug/ed.c:62
-msgid "Playback->Prev"
-msgstr "Lecture -> Précédent"
-
-#: src/evdev-plug/ed.c:63
-msgid "Playback->Next"
-msgstr "Lecture -> Suivant"
-
-#: src/evdev-plug/ed.c:64
-msgid "Playback->Eject"
-msgstr "Lecture -> Éjecter"
-
-#: src/evdev-plug/ed.c:66
-msgid "Playlist->Repeat"
-msgstr "Liste de lecture -> Répéter"
-
-#: src/evdev-plug/ed.c:67
-msgid "Playlist->Shuffle"
-msgstr "Liste de lecture -> Aléatoire"
-
-#: src/evdev-plug/ed.c:69
-msgid "Volume->Up_5"
-msgstr "Volume -> Augmenter de 5"
-
-#: src/evdev-plug/ed.c:70
-msgid "Volume->Down_5"
-msgstr "Volume -> Diminuer de 5"
-
-#: src/evdev-plug/ed.c:71
-msgid "Volume->Up_10"
-msgstr "Volume -> Augmenter de 10"
-
-#: src/evdev-plug/ed.c:72
-msgid "Volume->Down_10"
-msgstr "Volume -> Diminuer de 10"
-
-#: src/evdev-plug/ed.c:73
-msgid "Volume->Mute"
-msgstr "Volume -> Couper"
-
-#: src/evdev-plug/ed.c:75
-msgid "Window->Main"
-msgstr "Fenêtre -> Principale"
-
-#: src/evdev-plug/ed.c:76
-msgid "Window->Playlist"
-msgstr "Fenêtre -> Liste de lecture"
-
-#: src/evdev-plug/ed.c:77
-msgid "Window->Equalizer"
-msgstr "Fenêtre -> Égaliseur"
-
-#: src/evdev-plug/ed.c:78
-msgid "Window->JumpToFile"
-msgstr "Fenêtre -> Aller au titre..."
-
-#: src/hotkey/gui.c:68
-msgid "Previous Track"
-msgstr "Piste précédente"
-
-#: src/hotkey/gui.c:69
-msgid "Play"
-msgstr "Lecture"
-
-#: src/hotkey/gui.c:70
-msgid "Pause/Resume"
-msgstr "Pause / Reprise"
-
-#: src/hotkey/gui.c:71
-msgid "Stop"
-msgstr "Arrêt"
-
-#: src/hotkey/gui.c:72
-msgid "Next Track"
-msgstr "Piste suivante"
-
-#: src/hotkey/gui.c:73
-msgid "Forward 5 Seconds"
-msgstr "Avancer de 5 secondes"
-
-#: src/hotkey/gui.c:74
-msgid "Rewind 5 Seconds"
-msgstr "Reculer de 5 secondes"
-
-#: src/hotkey/gui.c:75
-msgid "Mute"
-msgstr "Rendre le volume nul"
-
-#: src/hotkey/gui.c:76
-msgid "Volume Up"
-msgstr "Augmenter le volume"
-
-#: src/hotkey/gui.c:77
-msgid "Volume Down"
-msgstr "Réduire le volume"
-
-#: src/hotkey/gui.c:78
-msgid "Jump to File"
-msgstr "Aller au fichier..."
-
-#: src/hotkey/gui.c:79
-msgid "Toggle Player Windows"
-msgstr "Afficher / Cacher les fenêtres du lecteur"
-
-#: src/hotkey/gui.c:80
-msgid "Show On-Screen-Display"
-msgstr "Activer l'affichage à l'écran ('OSD')"
-
-#: src/lastfm/lastfm.c:96
-msgid ""
-"<b><big>Couldn't initialize the last.fm radio plugin.</big></b>\n"
-"\n"
-"Check if your Scrobbler's plugin login data is set up properly."
-msgstr ""
-"<b><big>Impossible d'initialiser le module 'Radio last.fm'.</big></b>\n"
-"\n"
-"Veuillez vérifier si les informations de connexion de 'Scrobbler' sont correctes."
-
-#: src/stereo_plugin/stereo.c:26
-msgid ""
-"Extra Stereo Plugin\n"
-"\n"
-"By Johan Levin 1999."
-msgstr ""
-"Module 'Extra Stereo'\n"
-"\n"
-"Écrit par Johan Levin (1999)."
-
+"Adapté pour Audacious par Tony Vroon (chainsaw@gentoo.org), à partir des "
+"modules\n"
+"'BEEP-WMA' - Droits d'utilisation (2004, 2005) : Mokrushin I.V., connu sous "
+"'McMCC' <mcmcc@mail.ru>)\n"
+"'BMP-WMA'  - Droits d'utilisation (2004)           : Roman Bogorodskiy "
+"<bogorodskiy@inbox.ru>).\n"
+"Ce module est basé sur le code source de la bibliothèque "
+
+#~ msgid "Error initializing song-length database!\n"
+#~ msgstr ""
+#~ "Erreur lors de l'initialisation de la base de données relative à la durée "
+#~ "des modules audio !\n"
+
+#~ msgid "Error initializing STIL database!\n"
+#~ msgstr "Erreur lors de l'initialisation de la base de données 'STIL' !\n"
+
+#~ msgid "Couldn't allocate memory for audio data buffer!\n"
+#~ msgstr ""
+#~ "Impossible d'allouer la mémoire pour les données du tampon audio !\n"
+
+#~ msgid "Couldn't allocate memory for audio oversampling buffer!\n"
+#~ msgstr ""
+#~ "Impossible d'allouer la mémoire pour le tampon du suréchantillonage "
+#~ "audio !\n"
+
+#~ msgid "Couldn't initialize SID-tune '%s' (sub-tune #%i)!\n"
+#~ msgstr "Impossible d'initialiser le module SID '%s' (sous-module #%i) !\n"
+
+#~ msgid "Couldn't open XMMS audio output (fmt=%x, freq=%i, nchan=%i)!\n"
+#~ msgstr ""
+#~ "Erreur lors de l'ouverture de la sortie audio de XMMS (fmt=%x, freq=%i, "
+#~ "nchan=%i) !\n"
+
+#~ msgid "Oversampling rate-conversion pass failed.\n"
+#~ msgstr "L'opération de conversion par suréchantillonnage a échoué.\n"
+
+#~ msgid "Allocation of sid2FilterPresets structure failed!\n"
+#~ msgstr ""
+#~ "Erreur lors de l'allocation de la structure de 'sid2FilterPresets' !\n"
+
+#~ msgid "Warning: Could not set filter curve widget points!\n"
+#~ msgstr ""
+#~ "Avertissement : erreur lors du placement des points de la courbe du "
+#~ "filtre !\n"
+
+#~ msgid "Error allocating new node. Fatal error.\n"
+#~ msgstr "Erreur lors de l'allocation du nouveau bloc. Erreur fatale.\n"
+
+#~ msgid "'=' expected on column #%d.\n"
+#~ msgstr "Caractère '=' attendu à la position #%d.\n"
+
+#~ msgid "Could not allocate memory for node.\n"
+#~ msgstr "Impossible d'allouer de la mémoire pour le bloc.\n"
+
+#~ msgid "Could not open SongLengthDB '%s'\n"
+#~ msgstr "Impossible d'ouvrir la base de données '%s'\n"
+
+#~ msgid "Invalid MD5-hash in SongLengthDB file '%s' line #%d!\n"
+#~ msgstr ""
+#~ "Signature 'MD5' invalide, dans la base de données '%s', à la ligne #%d !\n"
+
+#~ msgid "Invalid entry in SongLengthDB file '%s' line #%d!\n"
+#~ msgstr "Entrée invalide dans la base de données '%s', à la ligne #%d!\n"
+
+#~ msgid "Invalid line in SongLengthDB file '%s' line #%d\n"
+#~ msgstr "Ligne invalide dans la base de données '%s' (ligne #%d) !\n"
+
+#~ msgid "Not a PSID or RSID file '%s'\n"
+#~ msgstr "Le fichier '%s' n'est pas au format 'PSID' ou 'RSID'\n"
+
+#~ msgid "Error reading SID file header from '%s'\n"
+#~ msgstr "Erreur lors de la lecture de l'en-tête du fichier '%s'\n"
+
+#~ msgid "Error allocating temp data buffer for file '%s'\n"
+#~ msgstr ""
+#~ "Erreur lors de l'allocation des données provisoires du tampon relatif au "
+#~ "fichier '%s'\n"
+
+#~ msgid "[SIDPlay1] Could not initialize emulation engine.\n"
+#~ msgstr "[SIDPlay1]  : impossible d'initialiser le moteur de l'émulation.\n"
+
+#~ msgid "[SIDPlay1] Endianess verification failed.\n"
+#~ msgstr ""
+#~ "[SIDPlay1] : erreur lors de la vérification de la méthode d'alignement de "
+#~ "données ('endianess').\n"
+
+#~ msgid "[SIDPlay1] Emulator engine configuration failed!\n"
+#~ msgstr ""
+#~ "[SIDPlay1] : échec lors de la configuration du moteur de l'émulation !\n"
+
+#~ msgid "[SIDPlay1] Could not initialize SIDTune object.\n"
+#~ msgstr "[SIDPlay1] : impossible d'initialiser l'objet 'SIDTune'.\n"
+
+#~ msgid ""
+#~ "[SIDPlay1] SID-tune struct pointer was NULL. This should not happen, "
+#~ "report to XMMS-SID author.\n"
+#~ msgstr ""
+#~ "[SIDPlay1] : le pointeur de structure du module audio 'SID' a renvoyé "
+#~ "'NULL'. Cette situation ne devrait pas arriver : veuillez en avertir "
+#~ "l'auteur de 'XMMS-SID'.\n"
+
+#~ msgid ""
+#~ "[SIDPlay1] SID-tune status check failed. This should not happen, report "
+#~ "to XMMS-SID author.\n"
+#~ msgstr ""
+#~ "[SIDPlay1] : erreur lors de la vérification de l'état du module audio "
+#~ "'SID'. Cette situation ne devrait pas arriver : veuillez en avertir "
+#~ "l'auteur de 'XMMS-SID'.\n"
+
+#~ msgid "[SIDPlay2] Could not initialize emulation engine.\n"
+#~ msgstr "[SIDPlay2]  : impossible d'initialiser le moteur de l'émulation.\n"
+
+#~ msgid "[SIDPlay2] Invalid number of filter curve points (%d > %d)\n"
+#~ msgstr ""
+#~ "[SIDPlay2] : le nombre de points de la courbe du filtre est invalide (%d "
+#~ "> %d)\n"
+
+#~ msgid "reSID->create() failed.\n"
+#~ msgstr "reSID->create() : erreur.\n"
+
+#~ msgid "reSID->filter(%d) failed.\n"
+#~ msgstr "reSID->filter(%d) : erreur.\n"
+
+#~ msgid "reSID->sampling(%d) failed.\n"
+#~ msgstr "reSID->sampling(%d) : erreur.\n"
+
+#~ msgid "reSID->filter(NULL) failed.\n"
+#~ msgstr "reSID->filter(NULL) : erreur.\n"
+
+#~ msgid "hardSID->create() failed.\n"
+#~ msgstr "hardSID->create() : erreur.\n"
+
+#~ msgid "hardSID->filter(%d) failed.\n"
+#~ msgstr "hardSID->filter(%d) : erreur.\n"
+
+#~ msgid "[SIDPlay2] Could not initialize SIDBuilder object.\n"
+#~ msgstr "[SIDPlay2] : impossible d'initialiser l'objet 'SIDBuilder'.\n"
+
+#~ msgid "[SIDPlay2] Invalid clockSpeed=%d, falling back to PAL.\n"
+#~ msgstr ""
+#~ "[SIDPlay2] : vitesse d'horloge invalide (%d) ; utilisation de 'PAL' à la "
+#~ "place.\n"
+
+#~ msgid "Invalid sid2OptLevel=%d, falling back to %d.\n"
+#~ msgstr ""
+#~ "Valeur de 'sid2OptLevel' invalide (%d) : utilisation de '%d' à la place.\n"
+
+#~ msgid "[SIDPlay2] Emulator engine configuration failed!\n"
+#~ msgstr ""
+#~ "[SIDPlay2] : erreur lors de la configuration du moteur d'émulation !\n"
+
+#~ msgid "[SIDPlay2] Could not initialize SIDTune object.\n"
+#~ msgstr "[SIDPlay2] : impossible d'initialiser l'objet 'SIDTune'.\n"
+
+#~ msgid "[SIDPlay2] currTune->selectSong() failed\n"
+#~ msgstr "[SIDPlay2] currTune->selectSong() : erreur\n"
+
+#~ msgid "[SIDPlay2] currEng->load() failed\n"
+#~ msgstr "[SIDPlay2] currEng->load() : erreur\n"
+
+#~ msgid "Could not allocate memory for t_xs_tuneinfo ('%s')\n"
+#~ msgstr "Impossible d'allouer de la mémoire pour t_xs_tuneinfo ('%s')\n"
+
+#~ msgid "Could not allocate sidFilename ('%s')\n"
+#~ msgstr "Erreur lors de l'allocation du fichier 'SID' ('%s').\n"
+
+#~ msgid "Could not allocate memory for t_xs_subtuneinfo ('%s', %i)\n"
+#~ msgstr ""
+#~ "Impossible d'allouer de la mémoire pour t_xs_subtuneinfo ('%s', %i)\n"
+
+#~ msgid "SubTune pointer structure realloc failed.\n"
+#~ msgstr ""
+#~ "Erreur lors du redimensionnement de l'allocation de mémoire dynamique du "
+#~ "pointeur de structure 'SubTune'.\n"
+
+#~ msgid "SubTune structure malloc failed!\n"
+#~ msgstr ""
+#~ "Erreur lors de l'allocation de mémoire dynamique de la structure "
+#~ "'SubTune' !\n"
+
+#~ msgid "Could not open STILDB '%s'\n"
+#~ msgstr "Impossible d'ouvrir la base de données STILDB '%s'\n"
--- a/po/ja.po	Fri Jun 13 04:58:39 2008 +0300
+++ b/po/ja.po	Fri Jun 13 05:57:25 2008 +0300
@@ -13,8 +13,8 @@
 msgstr ""
 "Project-Id-Version: audacious-plugins HEAD\n"
 "Report-Msgid-Bugs-To: http://bugs.audacious-media-player.org\n"
-"POT-Creation-Date: 2008-02-03 20:33+0200\n"
-"PO-Revision-Date: 2008-02-12 15:53+0900\n"
+"POT-Creation-Date: 2008-03-30 17:25+0200\n"
+"PO-Revision-Date: 2008-03-31 15:01+0900\n"
 "Last-Translator: dai <d+po@vdr.jp>\n"
 "Language-Team: Japanese <ja@li.org>\n"
 "MIME-Version: 1.0\n"
@@ -43,22 +43,22 @@
 #: src/adplug/adplug-xmms.cc:265 src/adplug/adplug-xmms.cc:526
 #: src/alac/plugin.c:77 src/arts/arts.c:26 src/arts/configure.c:90
 #: src/audiocompress/audacious-glue.c:102
-#: src/audiocompress/audacious-glue.c:552 src/cdaudio-ng/configure.c:227
-#: src/console/Audacious_Driver.cxx:449 src/demac/plugin.c:392
+#: src/audiocompress/audacious-glue.c:552 src/cdaudio-ng/configure.c:228
+#: src/console/Audacious_Driver.cxx:449 src/demac/plugin.c:393
 #: src/echo_plugin/gui.c:26 src/echo_plugin/gui.c:137 src/esd/about.c:49
 #: src/filewriter/filewriter.c:183 src/jack/configure.c:141
-#: src/jack/jack.c:493 src/madplug/plugin.c:600 src/madplug/plugin.c:624
+#: src/jack/jack.c:456 src/madplug/plugin.c:542 src/madplug/plugin.c:566
 #: src/metronom/metronom.c:88 src/modplug/gui/main.cxx:49
 #: src/musepack/libmpc.cxx:232 src/null/null.c:67 src/null/null.c:110
 #: src/OSS4/about.c:59 src/OSS/about.c:54 src/paranormal-ng/plugin.c:283
 #: src/paranormal/plugin.c:291 src/scrobbler/gtkstuff.c:25
-#: src/sndfile/plugin.c:565 src/statusicon/si_ui.c:593
+#: src/sndfile/plugin.c:565 src/statusicon/si_ui.c:628
 #: src/stereo_plugin/stereo.c:53 src/stereo_plugin/stereo.c:116
 #: src/sun/about.c:38 src/sun/configure.c:559 src/timidity/interface.c:222
 #: src/timidity/xmms-timidity.c:120 src/tonegen/tonegen.c:62
 #: src/tta/libtta.c:153 src/tta/libtta.c:267 src/tta/libtta.c:402
-#: src/vorbis/vorbis.c:769 src/vorbis/vorbis.c~:777 src/vtx/about.c:32
-#: src/vtx/info.c:43 src/wavpack/ui.cxx:56 src/wavpack/ui.cxx:556
+#: src/vorbis/vorbis.c:700 src/vtx/about.c:32 src/vtx/info.c:43
+#: src/wavpack/ui.cxx:56 src/wavpack/ui.cxx:556
 msgid "Ok"
 msgstr "OK"
 
@@ -94,7 +94,7 @@
 
 #: src/adplug/adplug-xmms.cc:275 src/alarm/interface.c:1398
 #: src/alsa/configure.c:389 src/arts/configure.c:91
-#: src/audiocompress/audacious-glue.c:557 src/cdaudio-ng/configure.c:231
+#: src/audiocompress/audacious-glue.c:557 src/cdaudio-ng/configure.c:232
 #: src/echo_plugin/gui.c:145 src/jack/configure.c:148
 #: src/modplug/gui/interface.cxx:714 src/modplug/gui/modplug.glade:1668
 #: src/musepack/libmpc.cxx:237 src/musepack/libmpc.cxx:557 src/null/null.c:111
@@ -105,7 +105,7 @@
 msgstr "キャンセル"
 
 #: src/adplug/adplug-xmms.cc:291 src/console/Audacious_Config.cxx:145
-#: src/madplug/configure.c:421 src/modplug/gui/interface.cxx:628
+#: src/madplug/configure.c:290 src/modplug/gui/interface.cxx:628
 #: src/modplug/gui/interface.cxx:887 src/modplug/gui/modplug.glade:1404
 #: src/modplug/gui/modplug.glade:1804
 msgid "General"
@@ -133,13 +133,13 @@
 msgid "Channels"
 msgstr "ãƒãƒ£ãƒ³ãƒãƒ«æ•°"
 
-#: src/adplug/adplug-xmms.cc:325 src/filewriter/mp3.c:894
+#: src/adplug/adplug-xmms.cc:325 src/filewriter/mp3.c:900
 #: src/sid/xmms-sid.glade:157 src/sid/xs_interface.c:288
 #: src/timidity/interface.c:165
 msgid "Mono"
 msgstr "モノラル"
 
-#: src/adplug/adplug-xmms.cc:330 src/filewriter/mp3.c:889
+#: src/adplug/adplug-xmms.cc:330 src/filewriter/mp3.c:895
 #: src/modplug/gui/interface.cxx:204 src/modplug/gui/modplug.glade:159
 #: src/sid/xmms-sid.glade:176 src/sid/xs_interface.c:295
 #: src/timidity/interface.c:173
@@ -321,7 +321,7 @@
 
 #: src/alarm/interface.c:71 src/lirc/about.c:115
 #: src/modplug/gui/interface.cxx:971 src/modplug/gui/modplug.glade:2030
-#: src/sid/xmms-sid.glade:3643 src/sid/xs_about.c:213
+#: src/sid/xmms-sid.glade:3643 src/sid/xs_about.c:214
 #: src/sid/xs_interface.c:1740
 msgid "Close"
 msgstr "é–‰ã˜ã‚‹"
@@ -335,10 +335,10 @@
 msgstr "目覚ã¾ã—ã§ã™."
 
 #: src/alarm/interface.c:124 src/alarm/interface.c:1389 src/alsa/about.c:46
-#: src/alsa/configure.c:383 src/cdaudio-ng/cdaudio-ng.c:228
-#: src/flacng/plugin.c:747 src/gnomeshortcuts/gnomeshortcuts.c:292
+#: src/alsa/configure.c:383 src/cdaudio-ng/cdaudio-ng.c:247
+#: src/flacng/plugin.c:706 src/gnomeshortcuts/gnomeshortcuts.c:311
 #: src/hotkey/gui.c:671 src/modplug/gui/interface.cxx:702
-#: src/modplug/gui/modplug.glade:1642 src/pulse_audio/pulse_audio.c:712
+#: src/modplug/gui/modplug.glade:1642 src/pulse_audio/pulse_audio.c:738
 #: src/scrobbler/gtkstuff.c:45 src/sid/xmms-sid.glade:3066
 #: src/sid/xs_interface.c:1243
 msgid "OK"
@@ -1786,7 +1786,7 @@
 msgid "Trigger"
 msgstr "トリガー"
 
-#: src/aosd/aosd_ui.c:1076 src/cdaudio-ng/configure.c:166
+#: src/aosd/aosd_ui.c:1076 src/cdaudio-ng/configure.c:167
 #: src/modplug/gui/interface.cxx:688 src/modplug/gui/modplug.glade:1603
 #: src/sid/xmms-sid.glade:3026 src/sid/xs_interface.c:1229
 msgid "Misc"
@@ -1987,15 +1987,19 @@
 msgid "Options:"
 msgstr "オプション:"
 
-#: src/cdaudio-ng/cdaudio-ng.c:198
+#: src/cdaudio-ng/cdaudio-ng.c:204
+msgid "Rescan CD"
+msgstr "CD ã‚’å†ã‚¹ã‚­ãƒ£ãƒ³"
+
+#: src/cdaudio-ng/cdaudio-ng.c:217
 msgid "Add CD"
 msgstr "CD を追加"
 
-#: src/cdaudio-ng/cdaudio-ng.c:223
+#: src/cdaudio-ng/cdaudio-ng.c:242
 msgid "About CD Audio Plugin NG"
 msgstr "CD オーディオプラグイン NG ã«ã¤ã„ã¦"
 
-#: src/cdaudio-ng/cdaudio-ng.c:224
+#: src/cdaudio-ng/cdaudio-ng.c:243
 msgid ""
 "Copyright (c) 2007, by Calin Crisan <ccrisan@gmail.com> and The Audacious "
 "Team.\n"
@@ -2017,7 +2021,7 @@
 "\n"
 "ã“れ㯠Google Summer of Code 2007 ã®ãƒ—ロジェクトã§ã—ãŸ."
 
-#: src/cdaudio-ng/cdaudio-ng.c:627
+#: src/cdaudio-ng/cdaudio-ng.c:814
 msgid ""
 "<b><big>No playable CD found.</big></b>\n"
 "\n"
@@ -2027,47 +2031,47 @@
 "\n"
 "CD ãŒæŒ¿å…¥ã•ã‚Œã¦ã„ãªã„ã‹, オーディオ CD ã§ã¯ã‚ã‚Šã¾ã›ã‚“.\n"
 
-#: src/cdaudio-ng/configure.c:146
+#: src/cdaudio-ng/configure.c:147
 msgid "CD Audio Plugin Configuration"
 msgstr "CD オーディオプラグインã®è¨­å®š"
 
-#: src/cdaudio-ng/configure.c:156
+#: src/cdaudio-ng/configure.c:157
 msgid "Digital audio extraction"
 msgstr "ディジタルオーディオ抽出"
 
-#: src/cdaudio-ng/configure.c:161
+#: src/cdaudio-ng/configure.c:162
 msgid "Title information"
 msgstr "タイトル情報"
 
-#: src/cdaudio-ng/configure.c:178
+#: src/cdaudio-ng/configure.c:179
 msgid "Limit read speed to: "
 msgstr "読ã¿è¾¼ã¿é€Ÿåº¦ã®åˆ¶é™å€¤: "
 
-#: src/cdaudio-ng/configure.c:185
+#: src/cdaudio-ng/configure.c:186
 msgid "Use cd-text if available"
 msgstr "有効ãªã‚‰ã° cd-text を使ã†"
 
-#: src/cdaudio-ng/configure.c:189
+#: src/cdaudio-ng/configure.c:190
 msgid "Use CDDB if available"
 msgstr "有効ãªã‚‰ã° CDDB を使ã†"
 
-#: src/cdaudio-ng/configure.c:193
+#: src/cdaudio-ng/configure.c:194
 msgid "Server: "
 msgstr "サーãƒ: "
 
-#: src/cdaudio-ng/configure.c:196
+#: src/cdaudio-ng/configure.c:197
 msgid "Port: "
 msgstr "ãƒãƒ¼ãƒˆç•ªå·: "
 
-#: src/cdaudio-ng/configure.c:202
+#: src/cdaudio-ng/configure.c:203
 msgid "Use HTTP instead of CDDBP"
 msgstr "CDDBP ã®ä»£ã‚ã‚Šã« HTTP を使ã†"
 
-#: src/cdaudio-ng/configure.c:210
+#: src/cdaudio-ng/configure.c:211
 msgid "Override default device: "
 msgstr "デフォルトデãƒã‚¤ã‚¹ã‚’上書ãã™ã‚‹: "
 
-#: src/cdaudio-ng/configure.c:217
+#: src/cdaudio-ng/configure.c:218
 msgid "Print debug information"
 msgstr "デãƒã‚°æƒ…報を出力ã™ã‚‹"
 
@@ -2144,11 +2148,11 @@
 "Audacious ã®å®Ÿè£…㯠William Pitcock <nenolod@nenolod.net> ã¨\n"
 "Shay Green <hotpop.com@blargg> ã«ã‚ˆã‚Šã¾ã™."
 
-#: src/demac/plugin.c:387
+#: src/demac/plugin.c:388
 msgid "About Monkey's Audio Plugin"
 msgstr "Monkey's オーディオプラグインã«ã¤ã„ã¦"
 
-#: src/demac/plugin.c:388
+#: src/demac/plugin.c:389
 msgid ""
 "Copyright (C) 2007 Eugene Zagidullin <e.asphyx@gmail.com>\n"
 "Based on ffape decoder, Copyright (C) 2007 Benjamin Zores\n"
@@ -2470,7 +2474,7 @@
 "デãƒã‚¤ã‚¹ãŒæ¤œå‡ºã•ã‚Œã¦ã„ãªã„ãŸã‚, ãƒã‚¤ãƒ³ãƒ‡ã‚£ãƒ³ã‚°ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ãŒé–‹ã‘ã¾ã›ã‚“.\n"
 "デãƒã‚¤ã‚¹ãŒæ­£ã—ã接続ã•ã‚Œã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„."
 
-#: src/evdev-plug/ed_ui.c:319 src/madplug/plugin.c:624
+#: src/evdev-plug/ed_ui.c:319 src/madplug/plugin.c:566
 msgid "Error"
 msgstr "エラー"
 
@@ -2706,15 +2710,15 @@
 msgid "Prepend track number to filename"
 msgstr "ファイルåã®å…ˆé ­ã«ãƒˆãƒ©ãƒƒã‚¯ç•ªå·ã‚’付加ã™ã‚‹"
 
-#: src/filewriter/mp3.c:670
+#: src/filewriter/mp3.c:676
 msgid "MP3 Configuration"
 msgstr "MP3 設定"
 
-#: src/filewriter/mp3.c:697
+#: src/filewriter/mp3.c:703
 msgid "Algorithm Quality:"
 msgstr "アルゴリズムå“質:"
 
-#: src/filewriter/mp3.c:719
+#: src/filewriter/mp3.c:725
 msgid ""
 "best/slowest:0;\n"
 "worst/fastest:9;\n"
@@ -2726,96 +2730,96 @@
 "推奨:2;\n"
 "デフォルト:5;"
 
-#: src/filewriter/mp3.c:727
+#: src/filewriter/mp3.c:733
 msgid "Output Samplerate:"
 msgstr "出力サンプリングレート:"
 
-#: src/filewriter/mp3.c:738 src/filewriter/mp3.c:879
+#: src/filewriter/mp3.c:744 src/filewriter/mp3.c:885
 msgid "Auto"
 msgstr "自動"
 
-#: src/filewriter/mp3.c:760
+#: src/filewriter/mp3.c:766
 msgid "(Hz)"
 msgstr "(Hz)"
 
-#: src/filewriter/mp3.c:772
+#: src/filewriter/mp3.c:778
 msgid "Bitrate / Compression ratio:"
 msgstr "ビットレート / 圧縮率:"
 
-#: src/filewriter/mp3.c:798
+#: src/filewriter/mp3.c:804
 msgid "Bitrate (kbps):"
 msgstr "ビットレート (kbps):"
 
-#: src/filewriter/mp3.c:839
+#: src/filewriter/mp3.c:845
 msgid "Compression ratio:"
 msgstr "圧縮率:"
 
-#: src/filewriter/mp3.c:869
+#: src/filewriter/mp3.c:875
 msgid "Audio Mode:"
 msgstr "オーディオ モード:"
 
-#: src/filewriter/mp3.c:884
+#: src/filewriter/mp3.c:890
 msgid "Joint-Stereo"
 msgstr "ジョイントステレオ"
 
-#: src/filewriter/mp3.c:925
+#: src/filewriter/mp3.c:931
 msgid "auto-M/S mode"
 msgstr "自動 M/S モード"
 
-#: src/filewriter/mp3.c:937
+#: src/filewriter/mp3.c:943
 msgid "Misc:"
 msgstr "ãã®ä»–:"
 
-#: src/filewriter/mp3.c:948
+#: src/filewriter/mp3.c:954
 msgid "Enforce strict ISO complience"
 msgstr "厳格㪠ISO éµå®ˆã‚’強制ã™ã‚‹"
 
-#: src/filewriter/mp3.c:959
+#: src/filewriter/mp3.c:965
 msgid "Error protection"
 msgstr "エラーä¿è­·"
 
-#: src/filewriter/mp3.c:971
+#: src/filewriter/mp3.c:977
 msgid "Adds 16 bit checksum to every frame"
 msgstr "ã™ã¹ã¦ã®ãƒ•ãƒ¬ãƒ¼ãƒ ã« 16 ビットãƒã‚§ãƒƒã‚¯ã‚µãƒ ã‚’付加ã™ã‚‹"
 
-#: src/filewriter/mp3.c:976 src/filewriter/vorbis.c:274
+#: src/filewriter/mp3.c:982 src/filewriter/vorbis.c:274
 #: src/modplug/gui/interface.cxx:319 src/modplug/gui/modplug.glade:507
 msgid "Quality"
 msgstr "å“質"
 
-#: src/filewriter/mp3.c:988
+#: src/filewriter/mp3.c:994
 msgid "Enable VBR/ABR"
 msgstr "VBR/ABR を有効ã«ã™ã‚‹"
 
-#: src/filewriter/mp3.c:1000
+#: src/filewriter/mp3.c:1006
 msgid "Type:"
 msgstr "タイプ:"
 
-#: src/filewriter/mp3.c:1011
+#: src/filewriter/mp3.c:1017
 msgid "Variable bitrate"
 msgstr "å¯å¤‰ãƒ“ットレート"
 
-#: src/filewriter/mp3.c:1023
+#: src/filewriter/mp3.c:1029
 msgid "Average bitrate"
 msgstr "å¹³å‡ãƒ“ットレート"
 
-#: src/filewriter/mp3.c:1037
+#: src/filewriter/mp3.c:1043
 msgid "VBR Options:"
 msgstr "VBR オプション:"
 
-#: src/filewriter/mp3.c:1053
+#: src/filewriter/mp3.c:1059
 msgid "Minimum bitrate (kbps):"
 msgstr "最å°ãƒ“ットレート (kbps):"
 
-#: src/filewriter/mp3.c:1089
+#: src/filewriter/mp3.c:1095
 msgid "Maximum bitrate (kbps):"
 msgstr "最大ビットレート (kbps):"
 
-#: src/filewriter/mp3.c:1121
+#: src/filewriter/mp3.c:1127
 msgid "Strictly enforce minimum bitrate"
 msgstr "最å°ãƒ“ットレートを厳格ã«å¼·åˆ¶ã™ã‚‹"
 
-#: src/filewriter/mp3.c:1123
+#: src/filewriter/mp3.c:1129
 msgid ""
 "For use with players that do not support low bitrate mp3 (Apex AD600-A DVD/"
 "mp3 player)"
@@ -2823,19 +2827,19 @@
 "低ã„ビットレート㮠mp3 をサãƒãƒ¼ãƒˆã—ãªã„プレイヤ (Apex AD600-A DVD/mp3 player)"
 "ã®ãŸã‚ã«ä½¿ã„ã¾ã™"
 
-#: src/filewriter/mp3.c:1136
+#: src/filewriter/mp3.c:1142
 msgid "ABR Options:"
 msgstr "ABR オプション:"
 
-#: src/filewriter/mp3.c:1146
+#: src/filewriter/mp3.c:1152
 msgid "Average bitrate (kbps):"
 msgstr "å¹³å‡ãƒ“ットレート (kbps):"
 
-#: src/filewriter/mp3.c:1183
+#: src/filewriter/mp3.c:1189
 msgid "VBR quality level:"
 msgstr "VBR å“質レベル:"
 
-#: src/filewriter/mp3.c:1198
+#: src/filewriter/mp3.c:1204
 msgid ""
 "highest:0;\n"
 "lowest:9;\n"
@@ -2845,43 +2849,43 @@
 "最低:9;\n"
 "デフォルト:4;"
 
-#: src/filewriter/mp3.c:1206
+#: src/filewriter/mp3.c:1212
 msgid "Don't write Xing VBR header"
 msgstr "Xing VBR ヘッダを書ãè¾¼ã¾ãªã„"
 
-#: src/filewriter/mp3.c:1221
+#: src/filewriter/mp3.c:1227
 msgid "VBR/ABR"
 msgstr "VBR/ABR"
 
-#: src/filewriter/mp3.c:1233
+#: src/filewriter/mp3.c:1239
 msgid "Frame params:"
 msgstr "フレーム パラメータ:"
 
-#: src/filewriter/mp3.c:1245
+#: src/filewriter/mp3.c:1251
 msgid "Mark as copyright"
 msgstr "著作権物ã¨ã—ã¦ãƒžãƒ¼ã‚¯"
 
-#: src/filewriter/mp3.c:1256
+#: src/filewriter/mp3.c:1262
 msgid "Mark as original"
 msgstr "オリジナルã¨ã—ã¦ãƒžãƒ¼ã‚¯"
 
-#: src/filewriter/mp3.c:1268
+#: src/filewriter/mp3.c:1274
 msgid "ID3 params:"
 msgstr "ID3 パラメータ:"
 
-#: src/filewriter/mp3.c:1279
+#: src/filewriter/mp3.c:1285
 msgid "Force addition of version 2 tag"
 msgstr "ヴァージョン 2 ã‚¿ã‚°ã®ä»˜åŠ ã‚’強制ã™ã‚‹"
 
-#: src/filewriter/mp3.c:1289
+#: src/filewriter/mp3.c:1295
 msgid "Only add v1 tag"
 msgstr "v1 ã‚¿ã‚°ã®ã¿ä»˜åŠ ã™ã‚‹"
 
-#: src/filewriter/mp3.c:1296
+#: src/filewriter/mp3.c:1302
 msgid "Only add v2 tag"
 msgstr "v2 ã‚¿ã‚°ã®ã¿ä»˜åŠ ã™ã‚‹"
 
-#: src/filewriter/mp3.c:1317
+#: src/filewriter/mp3.c:1323
 msgid "Tags"
 msgstr "ã‚¿ã‚°"
 
@@ -2893,11 +2897,11 @@
 msgid "Quality level (0 - 10):"
 msgstr "å“質レベル (0 - 10):"
 
-#: src/flacng/plugin.c:739
+#: src/flacng/plugin.c:698
 msgid "FLAC Audio Plugin "
 msgstr "FLAC オーディオ プラグイン"
 
-#: src/flacng/plugin.c:740
+#: src/flacng/plugin.c:699
 msgid ""
 "\n"
 "\n"
@@ -2913,26 +2917,26 @@
 "\n"
 "http://www.skytale.net/projects/bmp-flac2/"
 
-#: src/flacng/plugin.c:745
+#: src/flacng/plugin.c:704
 msgid "About FLAC Audio Plugin"
 msgstr "FLAC オーディオプラグインã«ã¤ã„ã¦"
 
-#: src/gnomeshortcuts/gnomeshortcuts.c:287
+#: src/gnomeshortcuts/gnomeshortcuts.c:306
 msgid "About Gnome Shortcut Plugin"
 msgstr "Gnome ショートカットプラグインã«ã¤ã„ã¦"
 
-#: src/gnomeshortcuts/gnomeshortcuts.c:288
+#: src/gnomeshortcuts/gnomeshortcuts.c:307
 msgid ""
 "Gnome Shortcut Plugin\n"
 "Let's you control the player with Gnome's shortcuts.\n"
 "\n"
-"Copyright (C) 2007 Sascha Hlusiak <contact@saschahlusiak.de>\n"
+"Copyright (C) 2007-2008 Sascha Hlusiak <contact@saschahlusiak.de>\n"
 "\n"
 msgstr ""
 "Gnome ショートカットプラグイン\n"
 "Gnome ショートカットã§ãƒ—レイヤをæ“作ã—よã†ï¼Ž\n"
 "\n"
-"Copyright (C) 2007 Sascha Hlusiak <contact@saschahlusiak.de>\n"
+"Copyright (C) 2007-2008 Sascha Hlusiak <contact@saschahlusiak.de>\n"
 "\n"
 
 #: src/hotkey/gui.c:68
@@ -3086,11 +3090,11 @@
 msgid "Enable debug printing"
 msgstr "デãƒã‚°å‡ºåŠ›ã‚’有効ã«ã™ã‚‹"
 
-#: src/jack/jack.c:95
+#: src/jack/jack.c:84
 msgid "Sample rate mismatch"
 msgstr "サンプリングレートã®ä¸ä¸€è‡´"
 
-#: src/jack/jack.c:98
+#: src/jack/jack.c:87
 msgid ""
 "Xmms is asking for a sample rate that differs from\n"
 " that of the jack server.  Xmms 1.2.8 or later\n"
@@ -3113,15 +3117,15 @@
 "\n"
 "Chris Morgan <cmorgan@alum.wpi.edu>\n"
 
-#: src/jack/jack.c:111 src/wma/wma.c:157
+#: src/jack/jack.c:100 src/wma/wma.c:148
 msgid " Close "
 msgstr " é–‰ã˜ã‚‹ "
 
-#: src/jack/jack.c:489
+#: src/jack/jack.c:452
 msgid "About JACK Output Plugin 0.17"
 msgstr "JACK 出力プラグイン 0.17 ã«ã¤ã„ã¦"
 
-#: src/jack/jack.c:490
+#: src/jack/jack.c:453
 msgid ""
 "XMMS jack Driver 0.17\n"
 "\n"
@@ -3271,104 +3275,56 @@
 msgid "%s: will try reconnect every %d seconds...\n"
 msgstr "%s: %d 秒ã”ã¨ã«å†æŽ¥ç¶šã‚’試ã¿ã¾ã™...\n"
 
-#: src/madplug/configure.c:332
+#: src/madplug/configure.c:209
 msgid "MPEG Audio Plugin Configuration"
 msgstr "MPEG オーディオ プラグインã®è¨­å®š"
 
-#: src/madplug/configure.c:349
+#: src/madplug/configure.c:226
 msgid "Audio Settings"
 msgstr "オーディオ設定"
 
-#: src/madplug/configure.c:358
-msgid "Dither output when rounding to 16-bit"
-msgstr "16ビットã«ä¸¸ã‚ã‚‹ã¨ã出力をディザリングã™ã‚‹"
-
-#: src/madplug/configure.c:365
+#: src/madplug/configure.c:234
 msgid "Force reopen audio when audio type changed"
 msgstr "オーディオタイプãŒå¤‰æ›´ã•ã‚ŒãŸã¨ã強制的ã«ã‚ªãƒ¼ãƒ‡ã‚£ã‚ªã‚’å†ã‚ªãƒ¼ãƒ—ンã™ã‚‹"
 
-#: src/madplug/configure.c:374
+#: src/madplug/configure.c:243
 msgid "Metadata Settings"
 msgstr "メタデータ設定"
 
-#: src/madplug/configure.c:383
+#: src/madplug/configure.c:252
 msgid "Enable fast play-length calculation"
 msgstr "高速演å¥é•·è¨ˆç®—を有効ã«ã™ã‚‹"
 
-#: src/madplug/configure.c:390
+#: src/madplug/configure.c:259
 msgid "Parse XING headers"
 msgstr "XING ヘッダをパースã™ã‚‹"
 
-#: src/madplug/configure.c:397
+#: src/madplug/configure.c:266
 msgid "Use SJIS to write ID3 tags (not recommended)"
 msgstr "ID3 ã‚¿ã‚°ã®æ›¸ãè¾¼ã¿ã« SJIS を使ㆠ(éžæŽ¨å¥¨)"
 
-#: src/madplug/configure.c:404
+#: src/madplug/configure.c:273
 msgid "Miscellaneous Settings"
 msgstr "雑多ãªè¨­å®š"
 
-#: src/madplug/configure.c:413
+#: src/madplug/configure.c:282
 msgid "Display average bitrate for VBR"
 msgstr "VBR ã®å¹³å‡ãƒ“ットレートを表示ã™ã‚‹"
 
-#: src/madplug/configure.c:432
-msgid "Base gain (dB):"
-msgstr "基本ゲイン (dB):"
-
-#: src/madplug/configure.c:446 src/musepack/libmpc.cxx:190
-msgid "ReplayGain Settings"
-msgstr "リプレイゲインã®è¨­å®š"
-
-#: src/madplug/configure.c:457
-msgid "Enable ReplayGain processing"
-msgstr "リプレイゲイン処ç†ã‚’有効ã«ã™ã‚‹"
-
-#: src/madplug/configure.c:467 src/musepack/libmpc.cxx:207
-msgid "ReplayGain Type"
-msgstr "リプレイゲインã®ç¨®é¡ž"
-
-#: src/madplug/configure.c:477 src/musepack/libmpc.cxx:215
-msgid "Use Track Gain"
-msgstr "トラックゲインを使用ã™ã‚‹"
-
-#: src/madplug/configure.c:485 src/musepack/libmpc.cxx:219
-msgid "Use Album Gain"
-msgstr "アルãƒãƒ ã‚²ã‚¤ãƒ³ã‚’使用ã™ã‚‹"
-
-#: src/madplug/configure.c:498
-msgid "Pre-gain with RG info (dB):"
-msgstr "リプレイゲイン情報ã‚ã‚Šã®ãƒ—リゲイン (dB):"
-
-#: src/madplug/configure.c:514
-msgid "Pre-gain without RG info (dB):"
-msgstr "リプレイゲイン情報ãªã—ã®ãƒ—リゲイン (dB):"
-
-#: src/madplug/configure.c:530
-msgid "Enable peak info clip prevention"
-msgstr "クリッピング防止ã®ãŸã‚ã«ãƒ”ーク情報を有効ã«ã™ã‚‹"
-
-#: src/madplug/configure.c:552
-msgid "Enable adaptive scaler clip prevention"
-msgstr "クリッピング防止ã«é©å¿œã—ãŸã‚¹ã‚±ãƒ¼ãƒ©ã‚’有効ã«ã™ã‚‹"
-
-#: src/madplug/configure.c:561
-msgid "Gain Control"
-msgstr "ゲインコントロール"
-
-#: src/madplug/configure.c:569 src/vorbis/configure.c:135
+#: src/madplug/configure.c:296 src/vorbis/configure.c:102
 msgid "Override generic titles"
 msgstr "オリジナルã®ã‚¿ã‚¤ãƒˆãƒ«ã‚’上書ãã™ã‚‹"
 
-#: src/madplug/configure.c:581
+#: src/madplug/configure.c:308
 msgid "ID3 format:"
 msgstr "ID3 ã®æ›¸å¼:"
 
-#: src/madplug/configure.c:593 src/sid/xmms-sid.glade:2540
-#: src/sid/xs_interface.c:1070 src/vorbis/configure.c:158
+#: src/madplug/configure.c:320 src/sid/xmms-sid.glade:2540
+#: src/sid/xs_interface.c:1070
 msgid "Title"
 msgstr "タイトル"
 
-#: src/madplug/plugin.c:582
+#: src/madplug/plugin.c:524
 #, c-format
 msgid ""
 "Audacious MPEG Audio Plugin\n"
@@ -3399,7 +3355,7 @@
 "リプレイゲインサãƒãƒ¼ãƒˆ:\n"
 "    Samuel Krempp"
 
-#: src/madplug/plugin.c:598
+#: src/madplug/plugin.c:540
 msgid "About MPEG Audio Plugin"
 msgstr "MPEG オーディオプラグインã«ã¤ã„ã¦"
 
@@ -3727,18 +3683,31 @@
 msgid "Plugin"
 msgstr "プラグイン"
 
-#: src/musepack/libmpc.cxx:197 src/vorbis/configure.c:170
-#: src/wavpack/ui.cxx:510
+#: src/musepack/libmpc.cxx:190
+msgid "ReplayGain Settings"
+msgstr "リプレイゲインã®è¨­å®š"
+
+#: src/musepack/libmpc.cxx:197 src/wavpack/ui.cxx:510
 msgid "Enable Clipping Prevention"
 msgstr "クリッピング回é¿æ©Ÿèƒ½ã‚’有効ã«ã™ã‚‹"
 
-#: src/musepack/libmpc.cxx:202 src/vorbis/configure.c:175
-#: src/wavpack/ui.cxx:515
+#: src/musepack/libmpc.cxx:202 src/wavpack/ui.cxx:515
 msgid "Enable ReplayGain"
 msgstr "リプレイゲインを有効ã«ã™ã‚‹"
 
-#: src/musepack/libmpc.cxx:224 src/vorbis/configure.c:219
-#: src/wavpack/ui.cxx:547
+#: src/musepack/libmpc.cxx:207
+msgid "ReplayGain Type"
+msgstr "リプレイゲインã®ç¨®é¡ž"
+
+#: src/musepack/libmpc.cxx:215
+msgid "Use Track Gain"
+msgstr "トラックゲインを使用ã™ã‚‹"
+
+#: src/musepack/libmpc.cxx:219
+msgid "Use Album Gain"
+msgstr "アルãƒãƒ ã‚²ã‚¤ãƒ³ã‚’使用ã™ã‚‹"
+
+#: src/musepack/libmpc.cxx:224 src/wavpack/ui.cxx:547
 msgid "ReplayGain"
 msgstr "リプレイゲイン"
 
@@ -4000,11 +3969,15 @@
 msgid "Volume controls Master not PCM"
 msgstr "音é‡ã®èª¿æ•´ã¯ PCM ã§ã¯ãªãマスタを使用ã™ã‚‹"
 
-#: src/pulse_audio/pulse_audio.c:696
+#: src/projectm-1.0/main.c:70
+msgid "_Random"
+msgstr "ランダム(R_)"
+
+#: src/pulse_audio/pulse_audio.c:722
 msgid "About Audacious PulseAudio Output Plugin"
 msgstr "Audacious PulseAudio 出力プラグインã«ã¤ã„ã¦"
 
-#: src/pulse_audio/pulse_audio.c:697
+#: src/pulse_audio/pulse_audio.c:723
 msgid ""
 "Audacious PulseAudio Output Plugin\n"
 "\n"
@@ -4095,36 +4068,6 @@
 msgid "Scrobbler Error"
 msgstr "Scrobbler エラー"
 
-#: src/sid/xmms-sid.c:203
-msgid "Error initializing song-length database!\n"
-msgstr "曲ã®é•·ã•ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹åˆæœŸåŒ–エラー!\n"
-
-#: src/sid/xmms-sid.c:209
-msgid "Error initializing STIL database!\n"
-msgstr "STIL データベースåˆæœŸåŒ–エラー!\n"
-
-#: src/sid/xmms-sid.c:347
-msgid "Couldn't allocate memory for audio data buffer!\n"
-msgstr "オーディオデータãƒãƒƒãƒ•ã‚¡ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‰ã‚Œã¾ã›ã‚“ã§ã—ãŸ!\n"
-
-#: src/sid/xmms-sid.c:355
-msgid "Couldn't allocate memory for audio oversampling buffer!\n"
-msgstr "オーãƒãƒ¼ã‚µãƒ³ãƒ—リングãƒãƒƒãƒ•ã‚¡ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‰ã‚Œã¾ã›ã‚“ã§ã—ãŸ!\n"
-
-#: src/sid/xmms-sid.c:371
-#, c-format
-msgid "Couldn't initialize SID-tune '%s' (sub-tune #%i)!\n"
-msgstr "SID-tune '%s' (サブãƒãƒ¥ãƒ¼ãƒ³ #%i)ã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸ!\n"
-
-#: src/sid/xmms-sid.c:382
-#, c-format
-msgid "Couldn't open XMMS audio output (fmt=%x, freq=%i, nchan=%i)!\n"
-msgstr "XMMS オーディオ出力 (fmt=%x, freq=%i, nchan=%i) ã‚’é–‹ã‘ã¾ã›ã‚“ã§ã—ãŸ!\n"
-
-#: src/sid/xmms-sid.c:432
-msgid "Oversampling rate-conversion pass failed.\n"
-msgstr "オーãƒãƒ¼ã‚µãƒ³ãƒ—リングレート変æ›ãƒ‘スã«å¤±æ•—ã—ã¾ã—ãŸ.\n"
-
 #: src/sid/xmms-sid.glade:8 src/sid/xs_interface.c:221
 msgid "Audacious-SID configuration"
 msgstr "Audacious-SID 設定"
@@ -4707,19 +4650,11 @@
 msgid "No"
 msgstr "ã„ã„ãˆ"
 
-#: src/sid/xs_about.c:84 src/wma/wma.c:130
+#: src/sid/xs_about.c:84 src/wma/wma.c:121
 #, c-format
 msgid "About %s"
 msgstr "%s ã«ã¤ã„ã¦"
 
-#: src/sid/xs_config.c:580
-msgid "Allocation of sid2FilterPresets structure failed!\n"
-msgstr "sid2FilterPresets 構造体ã®å‰²ã‚Šå½“ã¦ã«å¤±æ•—ã—ã¾ã—ãŸ!\n"
-
-#: src/sid/xs_config.c:908
-msgid "Warning: Could not set filter curve widget points!\n"
-msgstr "警告: フィルタ曲線ã®åˆ†ç‚¹ãŒã‚»ãƒƒãƒˆã§ãã¾ã›ã‚“ã§ã—ãŸ!\n"
-
 #: src/sid/xs_fileinfo.c:232
 msgid "General info"
 msgstr "一般情報"
@@ -4729,180 +4664,6 @@
 msgid "Tune #%i: "
 msgstr "ãƒãƒ¥ãƒ¼ãƒ³ #%i:"
 
-#: src/sid/xs_length.c:113
-msgid "Error allocating new node. Fatal error.\n"
-msgstr "æ–°ã—ã„ノードã®å‰²ã‚Šå½“ã¦ã«å¤±æ•—. 致命的エラー.\n"
-
-#: src/sid/xs_length.c:128
-#, c-format
-msgid "'=' expected on column #%d.\n"
-msgstr "'=' 㯠#%d 列ã«ã‚ã‚‹ã“ã¨ã‚’期待ã•ã‚Œã¾ã™.\n"
-
-#: src/sid/xs_length.c:153
-msgid "Could not allocate memory for node.\n"
-msgstr "ノードã«ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‰ã‚Œã¾ã›ã‚“ã§ã—ãŸ.\n"
-
-#: src/sid/xs_length.c:204
-#, c-format
-msgid "Could not open SongLengthDB '%s'\n"
-msgstr "曲ã®é•·ã• DB '%s' ã‚’é–‹ã‘ã¾ã›ã‚“ã§ã—ãŸ.\n"
-
-#: src/sid/xs_length.c:224
-#, c-format
-msgid "Invalid MD5-hash in SongLengthDB file '%s' line #%d!\n"
-msgstr "曲ã®é•·ã• DB ファイル '%s' ã® #%d 行㮠MD5 ãƒãƒƒã‚·ãƒ¥ãŒç„¡åŠ¹ã§ã™!\n"
-
-#: src/sid/xs_length.c:231
-#, c-format
-msgid "Invalid entry in SongLengthDB file '%s' line #%d!\n"
-msgstr "曲ã®é•·ã• DB ファイル '%s' ã® #%d è¡Œã®ã‚¨ãƒ³ãƒˆãƒªãŒç„¡åŠ¹ã§ã™!\n"
-
-#: src/sid/xs_length.c:236
-#, c-format
-msgid "Invalid line in SongLengthDB file '%s' line #%d\n"
-msgstr "曲ã®é•·ã• DB ファイル '%s' ã® #%d è¡ŒãŒç„¡åŠ¹ã§ã™!\n"
-
-#: src/sid/xs_length.c:398
-#, c-format
-msgid "Not a PSID or RSID file '%s'\n"
-msgstr "ファイル '%s' 㯠PSID ã§ã‚‚ RSID ã§ã‚‚ã‚ã‚Šã¾ã›ã‚“.\n"
-
-#: src/sid/xs_length.c:417
-#, c-format
-msgid "Error reading SID file header from '%s'\n"
-msgstr "'%s' ã‹ã‚‰ã® SID ファイルヘッダ読ã¿è¾¼ã¿ã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ.\n"
-
-#: src/sid/xs_length.c:436
-#, c-format
-msgid "Error allocating temp data buffer for file '%s'\n"
-msgstr "ファイル '%s' ã®ä¸€æ™‚データãƒãƒƒãƒ•ã‚¡ã®å‰²ã‚Šå½“ã¦ã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ.\n"
-
-#: src/sid/xs_sidplay1.cc:96
-msgid "[SIDPlay1] Could not initialize emulation engine.\n"
-msgstr "[SIDPlay1] エミュレーションエンジンをåˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸ.\n"
-
-#: src/sid/xs_sidplay1.cc:103
-msgid "[SIDPlay1] Endianess verification failed.\n"
-msgstr "[SIDPlay1] エンディアンã®æ¤œè¨¼ã«å¤±æ•—ã—ã¾ã—ãŸ.\n"
-
-#: src/sid/xs_sidplay1.cc:238
-msgid "[SIDPlay1] Emulator engine configuration failed!\n"
-msgstr "[SIDPlay1] エミュレータエンジンã®è¨­å®šã«å¤±æ•—ã—ã¾ã—ãŸ!\n"
-
-#: src/sid/xs_sidplay1.cc:245
-msgid "[SIDPlay1] Could not initialize SIDTune object.\n"
-msgstr "[SIDPlay1] SIDTune オブジェクトをåˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸ.\n"
-
-#: src/sid/xs_sidplay1.cc:291
-msgid ""
-"[SIDPlay1] SID-tune struct pointer was NULL. This should not happen, report "
-"to XMMS-SID author.\n"
-msgstr ""
-"[SIDPlay1] SID-tune 構造体ãƒã‚¤ãƒ³ã‚¿ãŒ NULL ã§ã—ãŸ. ã“ã‚Œã¯ç™ºç”Ÿã—ãªã„ã¯ãšãªã®"
-"ã§, XMMS-SID 作者ã«å ±å‘Šã—ã¦ãã ã•ã„.\n"
-
-#: src/sid/xs_sidplay1.cc:296
-msgid ""
-"[SIDPlay1] SID-tune status check failed. This should not happen, report to "
-"XMMS-SID author.\n"
-msgstr ""
-"[SIDPlay1] SID-tune 状態確èªã«å¤±æ•—ã—ã¾ã—ãŸ. ã“ã‚Œã¯ç™ºç”Ÿã—ãªã„ã¯ãšãªã®ã§, XMMS-"
-"SID 作者ã«å ±å‘Šã—ã¦ãã ã•ã„.\n"
-
-#: src/sid/xs_sidplay2.cc:101
-msgid "[SIDPlay2] Could not initialize emulation engine.\n"
-msgstr "[SIDPlay2] エミュレーションエンジンをåˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸ.\n"
-
-#: src/sid/xs_sidplay2.cc:208
-#, c-format
-msgid "[SIDPlay2] Invalid number of filter curve points (%d > %d)\n"
-msgstr "[SIDPlay2] フィルタ曲線ã®åˆ†ç‚¹ã®æ•°ãŒä¸æ­£ã§ã™ (%d > %d)\n"
-
-#: src/sid/xs_sidplay2.cc:229
-msgid "reSID->create() failed.\n"
-msgstr "reSID->create() ã«å¤±æ•—ã—ã¾ã—ãŸ.\n"
-
-#: src/sid/xs_sidplay2.cc:235
-#, c-format
-msgid "reSID->filter(%d) failed.\n"
-msgstr "reSID->filter(%d) ã«å¤±æ•—ã—ã¾ã—ãŸ.\n"
-
-#: src/sid/xs_sidplay2.cc:243
-#, c-format
-msgid "reSID->sampling(%d) failed.\n"
-msgstr "reSID->sampling(%d) ã«å¤±æ•—ã—ã¾ã—ãŸ.\n"
-
-#: src/sid/xs_sidplay2.cc:253
-msgid "reSID->filter(NULL) failed.\n"
-msgstr "reSID->filter(NULL) ã«å¤±æ•—ã—ã¾ã—ãŸ.\n"
-
-#: src/sid/xs_sidplay2.cc:267
-msgid "hardSID->create() failed.\n"
-msgstr "hardSID->create() ã«å¤±æ•—ã—ã¾ã—ãŸ.\n"
-
-#: src/sid/xs_sidplay2.cc:273
-#, c-format
-msgid "hardSID->filter(%d) failed.\n"
-msgstr "hardSID->filter(%d) ã«å¤±æ•—ã—ã¾ã—ãŸ.\n"
-
-#: src/sid/xs_sidplay2.cc:281
-msgid "[SIDPlay2] Could not initialize SIDBuilder object.\n"
-msgstr "[SIDPlay2] SIDBuilder オブジェクトをåˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸ.\n"
-
-#: src/sid/xs_sidplay2.cc:295
-#, c-format
-msgid "[SIDPlay2] Invalid clockSpeed=%d, falling back to PAL.\n"
-msgstr "[SIDPlay2] clockSpeed=%d ã¯ç„¡åŠ¹ã§ã™. PAL ã«ãƒ•ã‚©ãƒ¼ãƒ«ãƒãƒƒã‚¯ã—ã¾ã™.\n"
-
-#: src/sid/xs_sidplay2.cc:319
-#, c-format
-msgid "Invalid sid2OptLevel=%d, falling back to %d.\n"
-msgstr "sid2OptLevel %d ã¯ç„¡åŠ¹ã§ã™. %d ã«ãƒ•ã‚©ãƒ¼ãƒ«ãƒãƒƒã‚¯ã—ã¾ã™.\n"
-
-#: src/sid/xs_sidplay2.cc:343
-msgid "[SIDPlay2] Emulator engine configuration failed!\n"
-msgstr "[SIDPlay2] エミュレーションエンジンã®è¨­å®šã«å¤±æ•—ã—ã¾ã—ãŸ!\n"
-
-#: src/sid/xs_sidplay2.cc:350
-msgid "[SIDPlay2] Could not initialize SIDTune object.\n"
-msgstr "[SIDPlay2] SIDTune オブジェクトをåˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸ.\n"
-
-#: src/sid/xs_sidplay2.cc:401
-msgid "[SIDPlay2] currTune->selectSong() failed\n"
-msgstr "[SIDPlay2] currTune->selectSong() ã«å¤±æ•—ã—ã¾ã—ãŸ.\n"
-
-#: src/sid/xs_sidplay2.cc:406
-msgid "[SIDPlay2] currEng->load() failed\n"
-msgstr "[SIDPlay2] currEng->load() ã«å¤±æ•—ã—ã¾ã—ãŸ.\n"
-
-#: src/sid/xs_slsup.c:217
-#, c-format
-msgid "Could not allocate memory for t_xs_tuneinfo ('%s')\n"
-msgstr "t_xs_tuneinfo ('%s') ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‰ã‚Œã¾ã›ã‚“ã§ã—ãŸ\n"
-
-#: src/sid/xs_slsup.c:224
-#, c-format
-msgid "Could not allocate sidFilename ('%s')\n"
-msgstr "sidFilename ('%s') を割り当ã¦ã‚‰ã‚Œã¾ã›ã‚“ã§ã—ãŸ\n"
-
-#: src/sid/xs_slsup.c:233
-#, c-format
-msgid "Could not allocate memory for t_xs_subtuneinfo ('%s', %i)\n"
-msgstr "t_xs_subtuneinfo ('%s', %i) ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‰ã‚Œã¾ã›ã‚“ã§ã—ãŸ\n"
-
-#: src/sid/xs_stil.c:46
-msgid "SubTune pointer structure realloc failed.\n"
-msgstr "SubTune ãƒã‚¤ãƒ³ã‚¿æ§‹é€ ä½“ã® realloc ã«å¤±æ•—ã—ã¾ã—ãŸ.\n"
-
-#: src/sid/xs_stil.c:69
-msgid "SubTune structure malloc failed!\n"
-msgstr "SubTune 構造体㮠malloc ã«å¤±æ•—ã—ã¾ã—ãŸ!\n"
-
-#: src/sid/xs_stil.c:176
-#, c-format
-msgid "Could not open STILDB '%s'\n"
-msgstr "STILDB '%s' ã‚’é–‹ã‘ã¾ã›ã‚“ã§ã—ãŸ.\n"
-
 #: src/sndfile/plugin.c:548
 msgid "About sndfile plugin"
 msgstr "sndfile プラグインã«ã¤ã„ã¦"
@@ -5053,11 +4814,11 @@
 msgid "The orientation of the tray"
 msgstr "トレイã®å‘ã"
 
-#: src/statusicon/si_ui.c:587
+#: src/statusicon/si_ui.c:622
 msgid "About Status Icon Plugin"
 msgstr "ステータスアイコン プラグインã«ã¤ã„ã¦"
 
-#: src/statusicon/si_ui.c:589
+#: src/statusicon/si_ui.c:624
 msgid ""
 "\n"
 "written by Giacomo Lozito < james@develia.org >\n"
@@ -5071,35 +4832,35 @@
 "ã“ã®ãƒ—ラグインã¯, ウィンドウマãƒãƒ¼ã‚¸ãƒ£ã®\n"
 "システムトレイエリアã«ç½®ã‹ã‚Œã‚‹ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚¢ã‚¤ã‚³ãƒ³ã‚’æä¾›ã—ã¾ã™.\n"
 
-#: src/statusicon/si_ui.c:661
+#: src/statusicon/si_ui.c:696
 msgid "Status Icon Plugin - Preferences"
 msgstr "ステータスアイコンプラグイン - 設定"
 
-#: src/statusicon/si_ui.c:672
+#: src/statusicon/si_ui.c:707
 msgid "Right-Click Menu"
 msgstr "å³ã‚¯ãƒªãƒƒã‚¯ãƒ¡ãƒ‹ãƒ¥ãƒ¼"
 
-#: src/statusicon/si_ui.c:677
+#: src/statusicon/si_ui.c:712
 msgid "Audacious standard menu"
 msgstr "Audacious 標準メニュー"
 
-#: src/statusicon/si_ui.c:682
+#: src/statusicon/si_ui.c:717
 msgid "Small playback menu #1"
 msgstr "å°åž‹å†ç”Ÿãƒ¡ãƒ‹ãƒ¥ãƒ¼ #1"
 
-#: src/statusicon/si_ui.c:687
+#: src/statusicon/si_ui.c:722
 msgid "Small playback menu #2"
 msgstr "å°åž‹å†ç”Ÿãƒ¡ãƒ‹ãƒ¥ãƒ¼ #2"
 
-#: src/statusicon/si_ui.c:710
+#: src/statusicon/si_ui.c:745
 msgid "Mouse Scroll Action"
 msgstr "マウススクロールã®å‹•ä½œ"
 
-#: src/statusicon/si_ui.c:715
+#: src/statusicon/si_ui.c:750
 msgid "Change volume"
 msgstr "音é‡ã®å¤‰æ›´"
 
-#: src/statusicon/si_ui.c:720
+#: src/statusicon/si_ui.c:755
 msgid "Change playing song"
 msgstr "æ¼”å¥æ›²ã®å¤‰æ›´"
 
@@ -5218,12 +4979,12 @@
 "URLã« tone://frequency1;frequency2;frequency3;... ã¨è¿½åŠ ã—ã¦ä½¿ç”¨ã—ã¾ã™\n"
 "例 tone://2000;2005 㯠2000Hz トーン㨠2005Hz トーンを演å¥ã—ã¾ã™"
 
-#: src/tonegen/tonegen.c:168
+#: src/tonegen/tonegen.c:167
 #, c-format
 msgid "%s %.1f Hz"
 msgstr "%s %.1f Hz"
 
-#: src/tonegen/tonegen.c:168
+#: src/tonegen/tonegen.c:167
 msgid "Tone Generator: "
 msgstr "トーンジェãƒãƒ¬ãƒ¼ã‚¿: "
 
@@ -5283,43 +5044,23 @@
 msgid "Track number:"
 msgstr "トラック番å·:"
 
-#: src/vorbis/configure.c:115
+#: src/vorbis/configure.c:84
 msgid "Ogg Vorbis Audio Plugin Configuration"
 msgstr "Ogg Vorbis オーディオプラグインã®è¨­å®š"
 
-#: src/vorbis/configure.c:127
+#: src/vorbis/configure.c:94
 msgid "Ogg Vorbis Tags:"
 msgstr "Ogg Vorbis ã‚¿ã‚°:"
 
-#: src/vorbis/configure.c:148
+#: src/vorbis/configure.c:115
 msgid "Title format:"
 msgstr "タイトルã®æ›¸å¼:"
 
-#: src/vorbis/configure.c:162 src/wavpack/ui.cxx:502
-msgid "ReplayGain Settings:"
-msgstr "リプレイゲインã®è¨­å®š:"
-
-#: src/vorbis/configure.c:180 src/wavpack/ui.cxx:520
-msgid "ReplayGain Type:"
-msgstr "リプレイゲインã®ç¨®é¡ž:"
-
-#: src/vorbis/configure.c:191 src/wavpack/ui.cxx:531
-msgid "use Track Gain/Peak"
-msgstr "トラックã®ã‚²ã‚¤ãƒ³/ピークを使用ã™ã‚‹"
-
-#: src/vorbis/configure.c:201 src/wavpack/ui.cxx:539
-msgid "use Album Gain/Peak"
-msgstr "アルãƒãƒ ã®ã‚²ã‚¤ãƒ³/ピークを使用ã™ã‚‹"
-
-#: src/vorbis/configure.c:213
-msgid "Enable 6dB Boost + Hard Limiting"
-msgstr "6dB ブースト + ãƒãƒ¼ãƒ‰ãƒªãƒŸãƒƒãƒˆã‚’有効ã«ã™ã‚‹"
-
-#: src/vorbis/vorbis.c:751 src/vorbis/vorbis.c~:759
+#: src/vorbis/vorbis.c:681
 msgid "About Ogg Vorbis Audio Plugin"
 msgstr "Ogg Vorbis オーディオ プラグインã«ã¤ã„ã¦"
 
-#: src/vorbis/vorbis.c:757 src/vorbis/vorbis.c~:765
+#: src/vorbis/vorbis.c:687
 msgid ""
 "Ogg Vorbis Plugin by the Xiph.org Foundation\n"
 "\n"
@@ -5333,14 +5074,15 @@
 "Jorn Baayen <jorn@nl.linux.org>\n"
 "Haavard Kvaalen <havardk@xmms.org>\n"
 "Gian-Carlo Pascutto <gcp@sjeng.org>\n"
+"Eugene Zagidullin <e.asphyx@gmail.com>\n"
 "\n"
 "Visit the Xiph.org Foundation at http://www.xiph.org/\n"
 msgstr ""
-"Ogg Vorbis プラグインã®æä¾›: Xiph.org Foundation\n"
+"Xiph.org Foundation ã«ã‚ˆã‚‹ Ogg Vorbis プラグイン\n"
 "\n"
 "オリジナルã®ã‚³ãƒ¼ãƒ‰:\n"
 "Tony Arcieri <bascule@inferno.tusculum.edu>\n"
-"Contributions from\n"
+"貢献者:\n"
 "Chris Montgomery <monty@xiph.org>\n"
 "Peter Alm <peter@xmms.org>\n"
 "Michael Smith <msmith@labyrinth.edu.au>\n"
@@ -5348,6 +5090,7 @@
 "Jorn Baayen <jorn@nl.linux.org>\n"
 "Haavard Kvaalen <havardk@xmms.org>\n"
 "Gian-Carlo Pascutto <gcp@sjeng.org>\n"
+"Eugene Zagidullin <e.asphyx@gmail.com>\n"
 "\n"
 "Xiph.org Foundation <http://www.xiph.org/> ã‚‚ã”覧下ã•ã„.\n"
 
@@ -5459,7 +5202,23 @@
 msgid "General Plugin Settings:"
 msgstr "一般的ãªãƒ—ラグイン設定:"
 
-#: src/wma/wma.c:132
+#: src/wavpack/ui.cxx:502
+msgid "ReplayGain Settings:"
+msgstr "リプレイゲインã®è¨­å®š:"
+
+#: src/wavpack/ui.cxx:520
+msgid "ReplayGain Type:"
+msgstr "リプレイゲインã®ç¨®é¡ž:"
+
+#: src/wavpack/ui.cxx:531
+msgid "use Track Gain/Peak"
+msgstr "トラックã®ã‚²ã‚¤ãƒ³/ピークを使用ã™ã‚‹"
+
+#: src/wavpack/ui.cxx:539
+msgid "use Album Gain/Peak"
+msgstr "アルãƒãƒ ã®ã‚²ã‚¤ãƒ³/ピークを使用ã™ã‚‹"
+
+#: src/wma/wma.c:123
 msgid ""
 "Adapted for use in Audacious by Tony Vroon (chainsaw@gentoo.org) from\n"
 "the BEEP-WMA plugin which is Copyright (C) 2004,2005 Mokrushin I.V. aka "
@@ -5475,6 +5234,181 @@
 "Tony Vroon <chainsaw@gentoo.org> ã«ã‚ˆã‚‹ Audacious ã¸ã®é©ç”¨.\n"
 "ã“ã®ãƒ—ラグインã¯ä»¥ä¸‹ã®ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã‚’å…ƒã¨ã™ã‚‹: "
 
+#~ msgid "Error initializing song-length database!\n"
+#~ msgstr "曲ã®é•·ã•ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹åˆæœŸåŒ–エラー!\n"
+
+#~ msgid "Error initializing STIL database!\n"
+#~ msgstr "STIL データベースåˆæœŸåŒ–エラー!\n"
+
+#~ msgid "Couldn't allocate memory for audio data buffer!\n"
+#~ msgstr "オーディオデータãƒãƒƒãƒ•ã‚¡ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‰ã‚Œã¾ã›ã‚“ã§ã—ãŸ!\n"
+
+#~ msgid "Couldn't allocate memory for audio oversampling buffer!\n"
+#~ msgstr "オーãƒãƒ¼ã‚µãƒ³ãƒ—リングãƒãƒƒãƒ•ã‚¡ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‰ã‚Œã¾ã›ã‚“ã§ã—ãŸ!\n"
+
+#~ msgid "Couldn't initialize SID-tune '%s' (sub-tune #%i)!\n"
+#~ msgstr "SID-tune '%s' (サブãƒãƒ¥ãƒ¼ãƒ³ #%i)ã‚’åˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸ!\n"
+
+#~ msgid "Couldn't open XMMS audio output (fmt=%x, freq=%i, nchan=%i)!\n"
+#~ msgstr ""
+#~ "XMMS オーディオ出力 (fmt=%x, freq=%i, nchan=%i) ã‚’é–‹ã‘ã¾ã›ã‚“ã§ã—ãŸ!\n"
+
+#~ msgid "Oversampling rate-conversion pass failed.\n"
+#~ msgstr "オーãƒãƒ¼ã‚µãƒ³ãƒ—リングレート変æ›ãƒ‘スã«å¤±æ•—ã—ã¾ã—ãŸ.\n"
+
+#~ msgid "Allocation of sid2FilterPresets structure failed!\n"
+#~ msgstr "sid2FilterPresets 構造体ã®å‰²ã‚Šå½“ã¦ã«å¤±æ•—ã—ã¾ã—ãŸ!\n"
+
+#~ msgid "Warning: Could not set filter curve widget points!\n"
+#~ msgstr "警告: フィルタ曲線ã®åˆ†ç‚¹ãŒã‚»ãƒƒãƒˆã§ãã¾ã›ã‚“ã§ã—ãŸ!\n"
+
+#~ msgid "Error allocating new node. Fatal error.\n"
+#~ msgstr "æ–°ã—ã„ノードã®å‰²ã‚Šå½“ã¦ã«å¤±æ•—. 致命的エラー.\n"
+
+#~ msgid "'=' expected on column #%d.\n"
+#~ msgstr "'=' 㯠#%d 列ã«ã‚ã‚‹ã“ã¨ã‚’期待ã•ã‚Œã¾ã™.\n"
+
+#~ msgid "Could not allocate memory for node.\n"
+#~ msgstr "ノードã«ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‰ã‚Œã¾ã›ã‚“ã§ã—ãŸ.\n"
+
+#~ msgid "Could not open SongLengthDB '%s'\n"
+#~ msgstr "曲ã®é•·ã• DB '%s' ã‚’é–‹ã‘ã¾ã›ã‚“ã§ã—ãŸ.\n"
+
+#~ msgid "Invalid MD5-hash in SongLengthDB file '%s' line #%d!\n"
+#~ msgstr "曲ã®é•·ã• DB ファイル '%s' ã® #%d 行㮠MD5 ãƒãƒƒã‚·ãƒ¥ãŒç„¡åŠ¹ã§ã™!\n"
+
+#~ msgid "Invalid entry in SongLengthDB file '%s' line #%d!\n"
+#~ msgstr "曲ã®é•·ã• DB ファイル '%s' ã® #%d è¡Œã®ã‚¨ãƒ³ãƒˆãƒªãŒç„¡åŠ¹ã§ã™!\n"
+
+#~ msgid "Invalid line in SongLengthDB file '%s' line #%d\n"
+#~ msgstr "曲ã®é•·ã• DB ファイル '%s' ã® #%d è¡ŒãŒç„¡åŠ¹ã§ã™!\n"
+
+#~ msgid "Not a PSID or RSID file '%s'\n"
+#~ msgstr "ファイル '%s' 㯠PSID ã§ã‚‚ RSID ã§ã‚‚ã‚ã‚Šã¾ã›ã‚“.\n"
+
+#~ msgid "Error reading SID file header from '%s'\n"
+#~ msgstr "'%s' ã‹ã‚‰ã® SID ファイルヘッダ読ã¿è¾¼ã¿ã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ.\n"
+
+#~ msgid "Error allocating temp data buffer for file '%s'\n"
+#~ msgstr ""
+#~ "ファイル '%s' ã®ä¸€æ™‚データãƒãƒƒãƒ•ã‚¡ã®å‰²ã‚Šå½“ã¦ã§ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ.\n"
+
+#~ msgid "[SIDPlay1] Could not initialize emulation engine.\n"
+#~ msgstr "[SIDPlay1] エミュレーションエンジンをåˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸ.\n"
+
+#~ msgid "[SIDPlay1] Endianess verification failed.\n"
+#~ msgstr "[SIDPlay1] エンディアンã®æ¤œè¨¼ã«å¤±æ•—ã—ã¾ã—ãŸ.\n"
+
+#~ msgid "[SIDPlay1] Emulator engine configuration failed!\n"
+#~ msgstr "[SIDPlay1] エミュレータエンジンã®è¨­å®šã«å¤±æ•—ã—ã¾ã—ãŸ!\n"
+
+#~ msgid "[SIDPlay1] Could not initialize SIDTune object.\n"
+#~ msgstr "[SIDPlay1] SIDTune オブジェクトをåˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸ.\n"
+
+#~ msgid ""
+#~ "[SIDPlay1] SID-tune struct pointer was NULL. This should not happen, "
+#~ "report to XMMS-SID author.\n"
+#~ msgstr ""
+#~ "[SIDPlay1] SID-tune 構造体ãƒã‚¤ãƒ³ã‚¿ãŒ NULL ã§ã—ãŸ. ã“ã‚Œã¯ç™ºç”Ÿã—ãªã„ã¯ãšãªã®"
+#~ "ã§, XMMS-SID 作者ã«å ±å‘Šã—ã¦ãã ã•ã„.\n"
+
+#~ msgid ""
+#~ "[SIDPlay1] SID-tune status check failed. This should not happen, report "
+#~ "to XMMS-SID author.\n"
+#~ msgstr ""
+#~ "[SIDPlay1] SID-tune 状態確èªã«å¤±æ•—ã—ã¾ã—ãŸ. ã“ã‚Œã¯ç™ºç”Ÿã—ãªã„ã¯ãšãªã®ã§, "
+#~ "XMMS-SID 作者ã«å ±å‘Šã—ã¦ãã ã•ã„.\n"
+
+#~ msgid "[SIDPlay2] Could not initialize emulation engine.\n"
+#~ msgstr "[SIDPlay2] エミュレーションエンジンをåˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸ.\n"
+
+#~ msgid "[SIDPlay2] Invalid number of filter curve points (%d > %d)\n"
+#~ msgstr "[SIDPlay2] フィルタ曲線ã®åˆ†ç‚¹ã®æ•°ãŒä¸æ­£ã§ã™ (%d > %d)\n"
+
+#~ msgid "reSID->create() failed.\n"
+#~ msgstr "reSID->create() ã«å¤±æ•—ã—ã¾ã—ãŸ.\n"
+
+#~ msgid "reSID->filter(%d) failed.\n"
+#~ msgstr "reSID->filter(%d) ã«å¤±æ•—ã—ã¾ã—ãŸ.\n"
+
+#~ msgid "reSID->sampling(%d) failed.\n"
+#~ msgstr "reSID->sampling(%d) ã«å¤±æ•—ã—ã¾ã—ãŸ.\n"
+
+#~ msgid "reSID->filter(NULL) failed.\n"
+#~ msgstr "reSID->filter(NULL) ã«å¤±æ•—ã—ã¾ã—ãŸ.\n"
+
+#~ msgid "hardSID->create() failed.\n"
+#~ msgstr "hardSID->create() ã«å¤±æ•—ã—ã¾ã—ãŸ.\n"
+
+#~ msgid "hardSID->filter(%d) failed.\n"
+#~ msgstr "hardSID->filter(%d) ã«å¤±æ•—ã—ã¾ã—ãŸ.\n"
+
+#~ msgid "[SIDPlay2] Could not initialize SIDBuilder object.\n"
+#~ msgstr "[SIDPlay2] SIDBuilder オブジェクトをåˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸ.\n"
+
+#~ msgid "[SIDPlay2] Invalid clockSpeed=%d, falling back to PAL.\n"
+#~ msgstr "[SIDPlay2] clockSpeed=%d ã¯ç„¡åŠ¹ã§ã™. PAL ã«ãƒ•ã‚©ãƒ¼ãƒ«ãƒãƒƒã‚¯ã—ã¾ã™.\n"
+
+#~ msgid "Invalid sid2OptLevel=%d, falling back to %d.\n"
+#~ msgstr "sid2OptLevel %d ã¯ç„¡åŠ¹ã§ã™. %d ã«ãƒ•ã‚©ãƒ¼ãƒ«ãƒãƒƒã‚¯ã—ã¾ã™.\n"
+
+#~ msgid "[SIDPlay2] Emulator engine configuration failed!\n"
+#~ msgstr "[SIDPlay2] エミュレーションエンジンã®è¨­å®šã«å¤±æ•—ã—ã¾ã—ãŸ!\n"
+
+#~ msgid "[SIDPlay2] Could not initialize SIDTune object.\n"
+#~ msgstr "[SIDPlay2] SIDTune オブジェクトをåˆæœŸåŒ–ã§ãã¾ã›ã‚“ã§ã—ãŸ.\n"
+
+#~ msgid "[SIDPlay2] currTune->selectSong() failed\n"
+#~ msgstr "[SIDPlay2] currTune->selectSong() ã«å¤±æ•—ã—ã¾ã—ãŸ.\n"
+
+#~ msgid "[SIDPlay2] currEng->load() failed\n"
+#~ msgstr "[SIDPlay2] currEng->load() ã«å¤±æ•—ã—ã¾ã—ãŸ.\n"
+
+#~ msgid "Could not allocate memory for t_xs_tuneinfo ('%s')\n"
+#~ msgstr "t_xs_tuneinfo ('%s') ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‰ã‚Œã¾ã›ã‚“ã§ã—ãŸ\n"
+
+#~ msgid "Could not allocate sidFilename ('%s')\n"
+#~ msgstr "sidFilename ('%s') を割り当ã¦ã‚‰ã‚Œã¾ã›ã‚“ã§ã—ãŸ\n"
+
+#~ msgid "Could not allocate memory for t_xs_subtuneinfo ('%s', %i)\n"
+#~ msgstr "t_xs_subtuneinfo ('%s', %i) ã®ãƒ¡ãƒ¢ãƒªã‚’割り当ã¦ã‚‰ã‚Œã¾ã›ã‚“ã§ã—ãŸ\n"
+
+#~ msgid "SubTune pointer structure realloc failed.\n"
+#~ msgstr "SubTune ãƒã‚¤ãƒ³ã‚¿æ§‹é€ ä½“ã® realloc ã«å¤±æ•—ã—ã¾ã—ãŸ.\n"
+
+#~ msgid "SubTune structure malloc failed!\n"
+#~ msgstr "SubTune 構造体㮠malloc ã«å¤±æ•—ã—ã¾ã—ãŸ!\n"
+
+#~ msgid "Could not open STILDB '%s'\n"
+#~ msgstr "STILDB '%s' ã‚’é–‹ã‘ã¾ã›ã‚“ã§ã—ãŸ.\n"
+
+#~ msgid "Dither output when rounding to 16-bit"
+#~ msgstr "16ビットã«ä¸¸ã‚ã‚‹ã¨ã出力をディザリングã™ã‚‹"
+
+#~ msgid "Base gain (dB):"
+#~ msgstr "基本ゲイン (dB):"
+
+#~ msgid "Enable ReplayGain processing"
+#~ msgstr "リプレイゲイン処ç†ã‚’有効ã«ã™ã‚‹"
+
+#~ msgid "Pre-gain with RG info (dB):"
+#~ msgstr "リプレイゲイン情報ã‚ã‚Šã®ãƒ—リゲイン (dB):"
+
+#~ msgid "Pre-gain without RG info (dB):"
+#~ msgstr "リプレイゲイン情報ãªã—ã®ãƒ—リゲイン (dB):"
+
+#~ msgid "Enable peak info clip prevention"
+#~ msgstr "クリッピング防止ã®ãŸã‚ã«ãƒ”ーク情報を有効ã«ã™ã‚‹"
+
+#~ msgid "Enable adaptive scaler clip prevention"
+#~ msgstr "クリッピング防止ã«é©å¿œã—ãŸã‚¹ã‚±ãƒ¼ãƒ©ã‚’有効ã«ã™ã‚‹"
+
+#~ msgid "Gain Control"
+#~ msgstr "ゲインコントロール"
+
+#~ msgid "Enable 6dB Boost + Hard Limiting"
+#~ msgstr "6dB ブースト + ãƒãƒ¼ãƒ‰ãƒªãƒŸãƒƒãƒˆã‚’有効ã«ã™ã‚‹"
+
 #~ msgid "<b>Playback:</b>"
 #~ msgstr "<b>æ¼”å¥:</b>"
 
--- a/po/ro.po	Fri Jun 13 04:58:39 2008 +0300
+++ b/po/ro.po	Fri Jun 13 05:57:25 2008 +0300
@@ -10,7 +10,7 @@
 msgstr ""
 "Project-Id-Version: audacious-plugins 1.4.0\n"
 "Report-Msgid-Bugs-To: http://bugs.audacious-media-player.org\n"
-"POT-Creation-Date: 2008-02-03 20:33+0200\n"
+"POT-Creation-Date: 2008-03-30 17:25+0200\n"
 "PO-Revision-Date: 2007-08-28 20:44+0200\n"
 "Last-Translator: Daniel Patriche <m4st3rth0r@gmail.com>\n"
 "Language-Team: Romanian <audacious@atheme.org>\n"
@@ -41,22 +41,22 @@
 #: src/adplug/adplug-xmms.cc:265 src/adplug/adplug-xmms.cc:526
 #: src/alac/plugin.c:77 src/arts/arts.c:26 src/arts/configure.c:90
 #: src/audiocompress/audacious-glue.c:102
-#: src/audiocompress/audacious-glue.c:552 src/cdaudio-ng/configure.c:227
-#: src/console/Audacious_Driver.cxx:449 src/demac/plugin.c:392
+#: src/audiocompress/audacious-glue.c:552 src/cdaudio-ng/configure.c:228
+#: src/console/Audacious_Driver.cxx:449 src/demac/plugin.c:393
 #: src/echo_plugin/gui.c:26 src/echo_plugin/gui.c:137 src/esd/about.c:49
 #: src/filewriter/filewriter.c:183 src/jack/configure.c:141
-#: src/jack/jack.c:493 src/madplug/plugin.c:600 src/madplug/plugin.c:624
+#: src/jack/jack.c:456 src/madplug/plugin.c:542 src/madplug/plugin.c:566
 #: src/metronom/metronom.c:88 src/modplug/gui/main.cxx:49
 #: src/musepack/libmpc.cxx:232 src/null/null.c:67 src/null/null.c:110
 #: src/OSS4/about.c:59 src/OSS/about.c:54 src/paranormal-ng/plugin.c:283
 #: src/paranormal/plugin.c:291 src/scrobbler/gtkstuff.c:25
-#: src/sndfile/plugin.c:565 src/statusicon/si_ui.c:593
+#: src/sndfile/plugin.c:565 src/statusicon/si_ui.c:628
 #: src/stereo_plugin/stereo.c:53 src/stereo_plugin/stereo.c:116
 #: src/sun/about.c:38 src/sun/configure.c:559 src/timidity/interface.c:222
 #: src/timidity/xmms-timidity.c:120 src/tonegen/tonegen.c:62
 #: src/tta/libtta.c:153 src/tta/libtta.c:267 src/tta/libtta.c:402
-#: src/vorbis/vorbis.c:769 src/vorbis/vorbis.c~:777 src/vtx/about.c:32
-#: src/vtx/info.c:43 src/wavpack/ui.cxx:56 src/wavpack/ui.cxx:556
+#: src/vorbis/vorbis.c:700 src/vtx/about.c:32 src/vtx/info.c:43
+#: src/wavpack/ui.cxx:56 src/wavpack/ui.cxx:556
 msgid "Ok"
 msgstr "Ok"
 
@@ -92,7 +92,7 @@
 
 #: src/adplug/adplug-xmms.cc:275 src/alarm/interface.c:1398
 #: src/alsa/configure.c:389 src/arts/configure.c:91
-#: src/audiocompress/audacious-glue.c:557 src/cdaudio-ng/configure.c:231
+#: src/audiocompress/audacious-glue.c:557 src/cdaudio-ng/configure.c:232
 #: src/echo_plugin/gui.c:145 src/jack/configure.c:148
 #: src/modplug/gui/interface.cxx:714 src/modplug/gui/modplug.glade:1668
 #: src/musepack/libmpc.cxx:237 src/musepack/libmpc.cxx:557 src/null/null.c:111
@@ -103,7 +103,7 @@
 msgstr "Anulează"
 
 #: src/adplug/adplug-xmms.cc:291 src/console/Audacious_Config.cxx:145
-#: src/madplug/configure.c:421 src/modplug/gui/interface.cxx:628
+#: src/madplug/configure.c:290 src/modplug/gui/interface.cxx:628
 #: src/modplug/gui/interface.cxx:887 src/modplug/gui/modplug.glade:1404
 #: src/modplug/gui/modplug.glade:1804
 msgid "General"
@@ -131,13 +131,13 @@
 msgid "Channels"
 msgstr "Canale"
 
-#: src/adplug/adplug-xmms.cc:325 src/filewriter/mp3.c:894
+#: src/adplug/adplug-xmms.cc:325 src/filewriter/mp3.c:900
 #: src/sid/xmms-sid.glade:157 src/sid/xs_interface.c:288
 #: src/timidity/interface.c:165
 msgid "Mono"
 msgstr "Mono"
 
-#: src/adplug/adplug-xmms.cc:330 src/filewriter/mp3.c:889
+#: src/adplug/adplug-xmms.cc:330 src/filewriter/mp3.c:895
 #: src/modplug/gui/interface.cxx:204 src/modplug/gui/modplug.glade:159
 #: src/sid/xmms-sid.glade:176 src/sid/xs_interface.c:295
 #: src/timidity/interface.c:173
@@ -320,7 +320,7 @@
 
 #: src/alarm/interface.c:71 src/lirc/about.c:115
 #: src/modplug/gui/interface.cxx:971 src/modplug/gui/modplug.glade:2030
-#: src/sid/xmms-sid.glade:3643 src/sid/xs_about.c:213
+#: src/sid/xmms-sid.glade:3643 src/sid/xs_about.c:214
 #: src/sid/xs_interface.c:1740
 msgid "Close"
 msgstr "ÃŽnchide"
@@ -334,10 +334,10 @@
 msgstr "Acesta este semnalul de deșteptare."
 
 #: src/alarm/interface.c:124 src/alarm/interface.c:1389 src/alsa/about.c:46
-#: src/alsa/configure.c:383 src/cdaudio-ng/cdaudio-ng.c:228
-#: src/flacng/plugin.c:747 src/gnomeshortcuts/gnomeshortcuts.c:292
+#: src/alsa/configure.c:383 src/cdaudio-ng/cdaudio-ng.c:247
+#: src/flacng/plugin.c:706 src/gnomeshortcuts/gnomeshortcuts.c:311
 #: src/hotkey/gui.c:671 src/modplug/gui/interface.cxx:702
-#: src/modplug/gui/modplug.glade:1642 src/pulse_audio/pulse_audio.c:712
+#: src/modplug/gui/modplug.glade:1642 src/pulse_audio/pulse_audio.c:738
 #: src/scrobbler/gtkstuff.c:45 src/sid/xmms-sid.glade:3066
 #: src/sid/xs_interface.c:1243
 msgid "OK"
@@ -1708,7 +1708,7 @@
 msgid "Trigger"
 msgstr "DeclanÅŸator"
 
-#: src/aosd/aosd_ui.c:1076 src/cdaudio-ng/configure.c:166
+#: src/aosd/aosd_ui.c:1076 src/cdaudio-ng/configure.c:167
 #: src/modplug/gui/interface.cxx:688 src/modplug/gui/modplug.glade:1603
 #: src/sid/xmms-sid.glade:3026 src/sid/xs_interface.c:1229
 msgid "Misc"
@@ -1898,17 +1898,21 @@
 msgid "Options:"
 msgstr "Meniu de Opțiuni"
 
-#: src/cdaudio-ng/cdaudio-ng.c:198
+#: src/cdaudio-ng/cdaudio-ng.c:204
+msgid "Rescan CD"
+msgstr ""
+
+#: src/cdaudio-ng/cdaudio-ng.c:217
 #, fuzzy
 msgid "Add CD"
 msgstr "Adauga CD..."
 
-#: src/cdaudio-ng/cdaudio-ng.c:223
+#: src/cdaudio-ng/cdaudio-ng.c:242
 #, fuzzy
 msgid "About CD Audio Plugin NG"
 msgstr "Despre plugin-ul·Apple·Lossless·Audio"
 
-#: src/cdaudio-ng/cdaudio-ng.c:224
+#: src/cdaudio-ng/cdaudio-ng.c:243
 msgid ""
 "Copyright (c) 2007, by Calin Crisan <ccrisan@gmail.com> and The Audacious "
 "Team.\n"
@@ -1921,7 +1925,7 @@
 "This was a Google Summer of Code 2007 project."
 msgstr ""
 
-#: src/cdaudio-ng/cdaudio-ng.c:627
+#: src/cdaudio-ng/cdaudio-ng.c:814
 #, fuzzy
 msgid ""
 "<b><big>No playable CD found.</big></b>\n"
@@ -1932,54 +1936,54 @@
 "\n"
 "Nici un CD inserat, sau CD-ul inserat nu este audio.\n"
 
-#: src/cdaudio-ng/configure.c:146
+#: src/cdaudio-ng/configure.c:147
 #, fuzzy
 msgid "CD Audio Plugin Configuration"
 msgstr "Despre plugin-ul·Apple·Lossless·Audio"
 
-#: src/cdaudio-ng/configure.c:156
+#: src/cdaudio-ng/configure.c:157
 #, fuzzy
 msgid "Digital audio extraction"
 msgstr "Despre plugin-ul·Apple·Lossless·Audio"
 
-#: src/cdaudio-ng/configure.c:161
+#: src/cdaudio-ng/configure.c:162
 #, fuzzy
 msgid "Title information"
 msgstr "Informații despre Track"
 
-#: src/cdaudio-ng/configure.c:178
+#: src/cdaudio-ng/configure.c:179
 msgid "Limit read speed to: "
 msgstr "Limitează viteza de citire la:"
 
-#: src/cdaudio-ng/configure.c:185
+#: src/cdaudio-ng/configure.c:186
 #, fuzzy
 msgid "Use cd-text if available"
 msgstr "Folosește fonturi Bitmap dacă sunt disponibile"
 
-#: src/cdaudio-ng/configure.c:189
+#: src/cdaudio-ng/configure.c:190
 #, fuzzy
 msgid "Use CDDB if available"
 msgstr "Folosește fonturi Bitmap dacă sunt disponibile"
 
-#: src/cdaudio-ng/configure.c:193
+#: src/cdaudio-ng/configure.c:194
 msgid "Server: "
 msgstr "Server:"
 
-#: src/cdaudio-ng/configure.c:196
+#: src/cdaudio-ng/configure.c:197
 #, fuzzy
 msgid "Port: "
 msgstr "Port-ul:"
 
-#: src/cdaudio-ng/configure.c:202
+#: src/cdaudio-ng/configure.c:203
 msgid "Use HTTP instead of CDDBP"
 msgstr ""
 
-#: src/cdaudio-ng/configure.c:210
+#: src/cdaudio-ng/configure.c:211
 #, fuzzy
 msgid "Override default device: "
 msgstr "Salvează Lista Implicită"
 
-#: src/cdaudio-ng/configure.c:217
+#: src/cdaudio-ng/configure.c:218
 #, fuzzy
 msgid "Print debug information"
 msgstr "Informații despre Pluginul de ieșire"
@@ -2052,12 +2056,12 @@
 "        Shay Green <gblargg@gmail.com>"
 msgstr ""
 
-#: src/demac/plugin.c:387
+#: src/demac/plugin.c:388
 #, fuzzy
 msgid "About Monkey's Audio Plugin"
 msgstr "Despre plugin-ul·Apple·Lossless·Audio"
 
-#: src/demac/plugin.c:388
+#: src/demac/plugin.c:389
 msgid ""
 "Copyright (C) 2007 Eugene Zagidullin <e.asphyx@gmail.com>\n"
 "Based on ffape decoder, Copyright (C) 2007 Benjamin Zores\n"
@@ -2346,7 +2350,7 @@
 "Ensure that the device has been correctly plugged in."
 msgstr ""
 
-#: src/evdev-plug/ed_ui.c:319 src/madplug/plugin.c:624
+#: src/evdev-plug/ed_ui.c:319 src/madplug/plugin.c:566
 #, fuzzy
 msgid "Error"
 msgstr "Eroare în Audacious"
@@ -2559,17 +2563,17 @@
 msgid "Prepend track number to filename"
 msgstr ""
 
-#: src/filewriter/mp3.c:670
+#: src/filewriter/mp3.c:676
 #, fuzzy
 msgid "MP3 Configuration"
 msgstr "AdPlug·::·Configurare"
 
-#: src/filewriter/mp3.c:697
+#: src/filewriter/mp3.c:703
 #, fuzzy
 msgid "Algorithm Quality:"
 msgstr "Calitatea sunetului"
 
-#: src/filewriter/mp3.c:719
+#: src/filewriter/mp3.c:725
 msgid ""
 "best/slowest:0;\n"
 "worst/fastest:9;\n"
@@ -2577,170 +2581,170 @@
 "default:5;"
 msgstr ""
 
-#: src/filewriter/mp3.c:727
+#: src/filewriter/mp3.c:733
 #, fuzzy
 msgid "Output Samplerate:"
 msgstr "Plugin-ul de ieșire curent"
 
-#: src/filewriter/mp3.c:738 src/filewriter/mp3.c:879
+#: src/filewriter/mp3.c:744 src/filewriter/mp3.c:885
 #, fuzzy
 msgid "Auto"
 msgstr "Auto-Încarcă Preset-ul"
 
-#: src/filewriter/mp3.c:760
+#: src/filewriter/mp3.c:766
 #, fuzzy
 msgid "(Hz)"
 msgstr "Hz"
 
-#: src/filewriter/mp3.c:772
+#: src/filewriter/mp3.c:778
 msgid "Bitrate / Compression ratio:"
 msgstr ""
 
-#: src/filewriter/mp3.c:798
+#: src/filewriter/mp3.c:804
 msgid "Bitrate (kbps):"
 msgstr "Bitrate-ul (kbps):"
 
-#: src/filewriter/mp3.c:839
+#: src/filewriter/mp3.c:845
 msgid "Compression ratio:"
 msgstr ""
 
-#: src/filewriter/mp3.c:869
+#: src/filewriter/mp3.c:875
 #, fuzzy
 msgid "Audio Mode:"
 msgstr "Mod de Vizualizare"
 
-#: src/filewriter/mp3.c:884
+#: src/filewriter/mp3.c:890
 msgid "Joint-Stereo"
 msgstr ""
 
-#: src/filewriter/mp3.c:925
+#: src/filewriter/mp3.c:931
 #, fuzzy
 msgid "auto-M/S mode"
 msgstr "Mod de Vizualizare"
 
-#: src/filewriter/mp3.c:937
+#: src/filewriter/mp3.c:943
 msgid "Misc:"
 msgstr ""
 
-#: src/filewriter/mp3.c:948
+#: src/filewriter/mp3.c:954
 msgid "Enforce strict ISO complience"
 msgstr ""
 
-#: src/filewriter/mp3.c:959
+#: src/filewriter/mp3.c:965
 #, fuzzy
 msgid "Error protection"
 msgstr "Eroare în Audacious"
 
-#: src/filewriter/mp3.c:971
+#: src/filewriter/mp3.c:977
 msgid "Adds 16 bit checksum to every frame"
 msgstr ""
 
-#: src/filewriter/mp3.c:976 src/filewriter/vorbis.c:274
+#: src/filewriter/mp3.c:982 src/filewriter/vorbis.c:274
 #: src/modplug/gui/interface.cxx:319 src/modplug/gui/modplug.glade:507
 #, fuzzy
 msgid "Quality"
 msgstr "Calitatea sunetului"
 
-#: src/filewriter/mp3.c:988
+#: src/filewriter/mp3.c:994
 #, fuzzy
 msgid "Enable VBR/ABR"
 msgstr "Activează proxy"
 
-#: src/filewriter/mp3.c:1000
+#: src/filewriter/mp3.c:1006
 #, fuzzy
 msgid "Type:"
 msgstr "Tipul Fișierului: "
 
-#: src/filewriter/mp3.c:1011
+#: src/filewriter/mp3.c:1017
 msgid "Variable bitrate"
 msgstr "Bitrate variabil"
 
-#: src/filewriter/mp3.c:1023
+#: src/filewriter/mp3.c:1029
 msgid "Average bitrate"
 msgstr "Bitrate mediu"
 
-#: src/filewriter/mp3.c:1037
+#: src/filewriter/mp3.c:1043
 #, fuzzy
 msgid "VBR Options:"
 msgstr "Meniu de Opțiuni"
 
-#: src/filewriter/mp3.c:1053
+#: src/filewriter/mp3.c:1059
 msgid "Minimum bitrate (kbps):"
 msgstr "Bitrate minim (kbps)"
 
-#: src/filewriter/mp3.c:1089
+#: src/filewriter/mp3.c:1095
 msgid "Maximum bitrate (kbps):"
 msgstr "Bitrate maxim (kbps)"
 
-#: src/filewriter/mp3.c:1121
+#: src/filewriter/mp3.c:1127
 msgid "Strictly enforce minimum bitrate"
 msgstr ""
 
-#: src/filewriter/mp3.c:1123
+#: src/filewriter/mp3.c:1129
 msgid ""
 "For use with players that do not support low bitrate mp3 (Apex AD600-A DVD/"
 "mp3 player)"
 msgstr ""
 
-#: src/filewriter/mp3.c:1136
+#: src/filewriter/mp3.c:1142
 #, fuzzy
 msgid "ABR Options:"
 msgstr "Meniu de Opțiuni"
 
-#: src/filewriter/mp3.c:1146
+#: src/filewriter/mp3.c:1152
 msgid "Average bitrate (kbps):"
 msgstr ""
 
-#: src/filewriter/mp3.c:1183
+#: src/filewriter/mp3.c:1189
 msgid "VBR quality level:"
 msgstr ""
 
-#: src/filewriter/mp3.c:1198
+#: src/filewriter/mp3.c:1204
 msgid ""
 "highest:0;\n"
 "lowest:9;\n"
 "default:4;"
 msgstr ""
 
-#: src/filewriter/mp3.c:1206
+#: src/filewriter/mp3.c:1212
 msgid "Don't write Xing VBR header"
 msgstr ""
 
-#: src/filewriter/mp3.c:1221
+#: src/filewriter/mp3.c:1227
 msgid "VBR/ABR"
 msgstr "VBR/ABR"
 
-#: src/filewriter/mp3.c:1233
+#: src/filewriter/mp3.c:1239
 msgid "Frame params:"
 msgstr ""
 
-#: src/filewriter/mp3.c:1245
+#: src/filewriter/mp3.c:1251
 #, fuzzy
 msgid "Mark as copyright"
 msgstr "Salvează ca și playlist static"
 
-#: src/filewriter/mp3.c:1256
+#: src/filewriter/mp3.c:1262
 #, fuzzy
 msgid "Mark as original"
 msgstr "Salvează ca și playlist static"
 
-#: src/filewriter/mp3.c:1268
+#: src/filewriter/mp3.c:1274
 msgid "ID3 params:"
 msgstr ""
 
-#: src/filewriter/mp3.c:1279
+#: src/filewriter/mp3.c:1285
 msgid "Force addition of version 2 tag"
 msgstr ""
 
-#: src/filewriter/mp3.c:1289
+#: src/filewriter/mp3.c:1295
 msgid "Only add v1 tag"
 msgstr "Adaugă numai tag-ul v1"
 
-#: src/filewriter/mp3.c:1296
+#: src/filewriter/mp3.c:1302
 msgid "Only add v2 tag"
 msgstr "Adaugă numai tag-ul v2"
 
-#: src/filewriter/mp3.c:1317
+#: src/filewriter/mp3.c:1323
 msgid "Tags"
 msgstr "Tag-uri"
 
@@ -2752,12 +2756,12 @@
 msgid "Quality level (0 - 10):"
 msgstr "Nivelul de calitate (0 - 10):"
 
-#: src/flacng/plugin.c:739
+#: src/flacng/plugin.c:698
 #, fuzzy
 msgid "FLAC Audio Plugin "
 msgstr "Despre plugin-ul·Apple·Lossless·Audio"
 
-#: src/flacng/plugin.c:740
+#: src/flacng/plugin.c:699
 msgid ""
 "\n"
 "\n"
@@ -2767,22 +2771,22 @@
 "http://www.skytale.net/projects/bmp-flac2/"
 msgstr ""
 
-#: src/flacng/plugin.c:745
+#: src/flacng/plugin.c:704
 #, fuzzy
 msgid "About FLAC Audio Plugin"
 msgstr "Despre plugin-ul·Apple·Lossless·Audio"
 
-#: src/gnomeshortcuts/gnomeshortcuts.c:287
+#: src/gnomeshortcuts/gnomeshortcuts.c:306
 #, fuzzy
 msgid "About Gnome Shortcut Plugin"
 msgstr "Despre plugin-ul decodor MP4·AAC"
 
-#: src/gnomeshortcuts/gnomeshortcuts.c:288
+#: src/gnomeshortcuts/gnomeshortcuts.c:307
 msgid ""
 "Gnome Shortcut Plugin\n"
 "Let's you control the player with Gnome's shortcuts.\n"
 "\n"
-"Copyright (C) 2007 Sascha Hlusiak <contact@saschahlusiak.de>\n"
+"Copyright (C) 2007-2008 Sascha Hlusiak <contact@saschahlusiak.de>\n"
 "\n"
 msgstr ""
 
@@ -2936,12 +2940,12 @@
 msgid "Enable debug printing"
 msgstr "Activează proxy"
 
-#: src/jack/jack.c:95
+#: src/jack/jack.c:84
 #, fuzzy
 msgid "Sample rate mismatch"
 msgstr "<b>Convertor pentru rata de eșantionare</b>"
 
-#: src/jack/jack.c:98
+#: src/jack/jack.c:87
 msgid ""
 "Xmms is asking for a sample rate that differs from\n"
 " that of the jack server.  Xmms 1.2.8 or later\n"
@@ -2955,16 +2959,16 @@
 "Chris Morgan <cmorgan@alum.wpi.edu>\n"
 msgstr ""
 
-#: src/jack/jack.c:111 src/wma/wma.c:157
+#: src/jack/jack.c:100 src/wma/wma.c:148
 #, fuzzy
 msgid " Close "
 msgstr "ÃŽnchide"
 
-#: src/jack/jack.c:489
+#: src/jack/jack.c:452
 msgid "About JACK Output Plugin 0.17"
 msgstr ""
 
-#: src/jack/jack.c:490
+#: src/jack/jack.c:453
 msgid ""
 "XMMS jack Driver 0.17\n"
 "\n"
@@ -3100,118 +3104,62 @@
 msgid "%s: will try reconnect every %d seconds...\n"
 msgstr ""
 
-#: src/madplug/configure.c:332
+#: src/madplug/configure.c:209
 #, fuzzy
 msgid "MPEG Audio Plugin Configuration"
 msgstr "Despre plugin-ul·Apple·Lossless·Audio"
 
-#: src/madplug/configure.c:349
+#: src/madplug/configure.c:226
 #, fuzzy
 msgid "Audio Settings"
 msgstr "Opțiuni ale plugin-ului Alarm"
 
-#: src/madplug/configure.c:358
-msgid "Dither output when rounding to 16-bit"
-msgstr ""
-
-#: src/madplug/configure.c:365
+#: src/madplug/configure.c:234
 msgid "Force reopen audio when audio type changed"
 msgstr ""
 
-#: src/madplug/configure.c:374
+#: src/madplug/configure.c:243
 #, fuzzy
 msgid "Metadata Settings"
 msgstr "Opțiuni pentru Popup-ul cu informații suplimentare"
 
-#: src/madplug/configure.c:383
+#: src/madplug/configure.c:252
 msgid "Enable fast play-length calculation"
 msgstr ""
 
-#: src/madplug/configure.c:390
+#: src/madplug/configure.c:259
 msgid "Parse XING headers"
 msgstr ""
 
-#: src/madplug/configure.c:397
+#: src/madplug/configure.c:266
 msgid "Use SJIS to write ID3 tags (not recommended)"
 msgstr ""
 
-#: src/madplug/configure.c:404
+#: src/madplug/configure.c:273
 #, fuzzy
 msgid "Miscellaneous Settings"
 msgstr "Meniu de Opțiuni"
 
-#: src/madplug/configure.c:413
+#: src/madplug/configure.c:282
 msgid "Display average bitrate for VBR"
 msgstr ""
 
-#: src/madplug/configure.c:432
-#, fuzzy
-msgid "Base gain (dB):"
-msgstr "Salvează Lista Implicită"
-
-#: src/madplug/configure.c:446 src/musepack/libmpc.cxx:190
-#, fuzzy
-msgid "ReplayGain Settings"
-msgstr "Opțiuni pentru Popup-ul cu informații suplimentare"
-
-#: src/madplug/configure.c:457
-#, fuzzy
-msgid "Enable ReplayGain processing"
-msgstr "Activează proxy"
-
-#: src/madplug/configure.c:467 src/musepack/libmpc.cxx:207
-#, fuzzy
-msgid "ReplayGain Type"
-msgstr "Tipul Fișierului: "
-
-#: src/madplug/configure.c:477 src/musepack/libmpc.cxx:215
-#, fuzzy
-msgid "Use Track Gain"
-msgstr "Fereastra cu informații despre Track"
-
-#: src/madplug/configure.c:485 src/musepack/libmpc.cxx:219
-#, fuzzy
-msgid "Use Album Gain"
-msgstr "Folosește cursoare de mouse personalizate (oferite de skin)"
-
-#: src/madplug/configure.c:498
-msgid "Pre-gain with RG info (dB):"
-msgstr ""
-
-#: src/madplug/configure.c:514
-msgid "Pre-gain without RG info (dB):"
-msgstr ""
-
-#: src/madplug/configure.c:530
-#, fuzzy
-msgid "Enable peak info clip prevention"
-msgstr "Activează proxy"
-
-#: src/madplug/configure.c:552
-#, fuzzy
-msgid "Enable adaptive scaler clip prevention"
-msgstr "Activează proxy"
-
-#: src/madplug/configure.c:561
-msgid "Gain Control"
-msgstr ""
-
-#: src/madplug/configure.c:569 src/vorbis/configure.c:135
+#: src/madplug/configure.c:296 src/vorbis/configure.c:102
 msgid "Override generic titles"
 msgstr ""
 
-#: src/madplug/configure.c:581
+#: src/madplug/configure.c:308
 #, fuzzy
 msgid "ID3 format:"
 msgstr "Selecția formatelor"
 
-#: src/madplug/configure.c:593 src/sid/xmms-sid.glade:2540
-#: src/sid/xs_interface.c:1070 src/vorbis/configure.c:158
+#: src/madplug/configure.c:320 src/sid/xmms-sid.glade:2540
+#: src/sid/xs_interface.c:1070
 #, fuzzy
 msgid "Title"
 msgstr "Titlu"
 
-#: src/madplug/plugin.c:582
+#: src/madplug/plugin.c:524
 #, c-format
 msgid ""
 "Audacious MPEG Audio Plugin\n"
@@ -3229,7 +3177,7 @@
 "    Samuel Krempp"
 msgstr ""
 
-#: src/madplug/plugin.c:598
+#: src/madplug/plugin.c:540
 #, fuzzy
 msgid "About MPEG Audio Plugin"
 msgstr "Despre plugin-ul·Apple·Lossless·Audio"
@@ -3536,20 +3484,37 @@
 msgid "Plugin"
 msgstr "Plugin de intrare: %s"
 
-#: src/musepack/libmpc.cxx:197 src/vorbis/configure.c:170
-#: src/wavpack/ui.cxx:510
+#: src/musepack/libmpc.cxx:190
+#, fuzzy
+msgid "ReplayGain Settings"
+msgstr "Opțiuni pentru Popup-ul cu informații suplimentare"
+
+#: src/musepack/libmpc.cxx:197 src/wavpack/ui.cxx:510
 #, fuzzy
 msgid "Enable Clipping Prevention"
 msgstr "Activează proxy"
 
-#: src/musepack/libmpc.cxx:202 src/vorbis/configure.c:175
-#: src/wavpack/ui.cxx:515
+#: src/musepack/libmpc.cxx:202 src/wavpack/ui.cxx:515
 #, fuzzy
 msgid "Enable ReplayGain"
 msgstr "Activează modul 'Mărime Dublă'"
 
-#: src/musepack/libmpc.cxx:224 src/vorbis/configure.c:219
-#: src/wavpack/ui.cxx:547
+#: src/musepack/libmpc.cxx:207
+#, fuzzy
+msgid "ReplayGain Type"
+msgstr "Tipul Fișierului: "
+
+#: src/musepack/libmpc.cxx:215
+#, fuzzy
+msgid "Use Track Gain"
+msgstr "Fereastra cu informații despre Track"
+
+#: src/musepack/libmpc.cxx:219
+#, fuzzy
+msgid "Use Album Gain"
+msgstr "Folosește cursoare de mouse personalizate (oferite de skin)"
+
+#: src/musepack/libmpc.cxx:224 src/wavpack/ui.cxx:547
 msgid "ReplayGain"
 msgstr ""
 
@@ -3792,11 +3757,15 @@
 msgid "Volume controls Master not PCM"
 msgstr ""
 
-#: src/pulse_audio/pulse_audio.c:696
+#: src/projectm-1.0/main.c:70
+msgid "_Random"
+msgstr ""
+
+#: src/pulse_audio/pulse_audio.c:722
 msgid "About Audacious PulseAudio Output Plugin"
 msgstr ""
 
-#: src/pulse_audio/pulse_audio.c:697
+#: src/pulse_audio/pulse_audio.c:723
 msgid ""
 "Audacious PulseAudio Output Plugin\n"
 "\n"
@@ -3867,36 +3836,6 @@
 msgid "Scrobbler Error"
 msgstr "Eroare în Audacious"
 
-#: src/sid/xmms-sid.c:203
-msgid "Error initializing song-length database!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:209
-msgid "Error initializing STIL database!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:347
-msgid "Couldn't allocate memory for audio data buffer!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:355
-msgid "Couldn't allocate memory for audio oversampling buffer!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:371
-#, c-format
-msgid "Couldn't initialize SID-tune '%s' (sub-tune #%i)!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:382
-#, c-format
-msgid "Couldn't open XMMS audio output (fmt=%x, freq=%i, nchan=%i)!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:432
-msgid "Oversampling rate-conversion pass failed.\n"
-msgstr ""
-
 #: src/sid/xmms-sid.glade:8 src/sid/xs_interface.c:221
 #, fuzzy
 msgid "Audacious-SID configuration"
@@ -4454,19 +4393,11 @@
 msgid "No"
 msgstr "Deselectează tot"
 
-#: src/sid/xs_about.c:84 src/wma/wma.c:130
+#: src/sid/xs_about.c:84 src/wma/wma.c:121
 #, c-format
 msgid "About %s"
 msgstr "Despre %s"
 
-#: src/sid/xs_config.c:580
-msgid "Allocation of sid2FilterPresets structure failed!\n"
-msgstr ""
-
-#: src/sid/xs_config.c:908
-msgid "Warning: Could not set filter curve widget points!\n"
-msgstr ""
-
 #: src/sid/xs_fileinfo.c:232
 #, fuzzy
 msgid "General info"
@@ -4477,178 +4408,6 @@
 msgid "Tune #%i: "
 msgstr "Pornește"
 
-#: src/sid/xs_length.c:113
-msgid "Error allocating new node. Fatal error.\n"
-msgstr ""
-
-#: src/sid/xs_length.c:128
-#, fuzzy, c-format
-msgid "'=' expected on column #%d.\n"
-msgstr "Închide dialogul după salt"
-
-#: src/sid/xs_length.c:153
-msgid "Could not allocate memory for node.\n"
-msgstr ""
-
-#: src/sid/xs_length.c:204
-#, fuzzy, c-format
-msgid "Could not open SongLengthDB '%s'\n"
-msgstr "Nu s-a putut crea directorul (%s): %s\n"
-
-#: src/sid/xs_length.c:224
-#, c-format
-msgid "Invalid MD5-hash in SongLengthDB file '%s' line #%d!\n"
-msgstr ""
-
-#: src/sid/xs_length.c:231
-#, c-format
-msgid "Invalid entry in SongLengthDB file '%s' line #%d!\n"
-msgstr ""
-
-#: src/sid/xs_length.c:236
-#, c-format
-msgid "Invalid line in SongLengthDB file '%s' line #%d\n"
-msgstr ""
-
-#: src/sid/xs_length.c:398
-#, c-format
-msgid "Not a PSID or RSID file '%s'\n"
-msgstr ""
-
-#: src/sid/xs_length.c:417
-#, c-format
-msgid "Error reading SID file header from '%s'\n"
-msgstr ""
-
-#: src/sid/xs_length.c:436
-#, c-format
-msgid "Error allocating temp data buffer for file '%s'\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:96
-msgid "[SIDPlay1] Could not initialize emulation engine.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:103
-msgid "[SIDPlay1] Endianess verification failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:238
-msgid "[SIDPlay1] Emulator engine configuration failed!\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:245
-msgid "[SIDPlay1] Could not initialize SIDTune object.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:291
-msgid ""
-"[SIDPlay1] SID-tune struct pointer was NULL. This should not happen, report "
-"to XMMS-SID author.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:296
-msgid ""
-"[SIDPlay1] SID-tune status check failed. This should not happen, report to "
-"XMMS-SID author.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:101
-msgid "[SIDPlay2] Could not initialize emulation engine.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:208
-#, c-format
-msgid "[SIDPlay2] Invalid number of filter curve points (%d > %d)\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:229
-#, fuzzy
-msgid "reSID->create() failed.\n"
-msgstr "Nu s-a putut crea directorul (%s): %s\n"
-
-#: src/sid/xs_sidplay2.cc:235
-#, c-format
-msgid "reSID->filter(%d) failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:243
-#, fuzzy, c-format
-msgid "reSID->sampling(%d) failed.\n"
-msgstr "<b>Convertor pentru rata de eșantionare</b>"
-
-#: src/sid/xs_sidplay2.cc:253
-msgid "reSID->filter(NULL) failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:267
-#, fuzzy
-msgid "hardSID->create() failed.\n"
-msgstr "Nu s-a putut crea directorul (%s): %s\n"
-
-#: src/sid/xs_sidplay2.cc:273
-#, c-format
-msgid "hardSID->filter(%d) failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:281
-msgid "[SIDPlay2] Could not initialize SIDBuilder object.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:295
-#, c-format
-msgid "[SIDPlay2] Invalid clockSpeed=%d, falling back to PAL.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:319
-#, c-format
-msgid "Invalid sid2OptLevel=%d, falling back to %d.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:343
-msgid "[SIDPlay2] Emulator engine configuration failed!\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:350
-msgid "[SIDPlay2] Could not initialize SIDTune object.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:401
-msgid "[SIDPlay2] currTune->selectSong() failed\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:406
-msgid "[SIDPlay2] currEng->load() failed\n"
-msgstr ""
-
-#: src/sid/xs_slsup.c:217
-#, fuzzy, c-format
-msgid "Could not allocate memory for t_xs_tuneinfo ('%s')\n"
-msgstr "Nu s-a putut crea directorul (%s): %s\n"
-
-#: src/sid/xs_slsup.c:224
-#, fuzzy, c-format
-msgid "Could not allocate sidFilename ('%s')\n"
-msgstr "Nu s-a putut crea directorul (%s): %s\n"
-
-#: src/sid/xs_slsup.c:233
-#, fuzzy, c-format
-msgid "Could not allocate memory for t_xs_subtuneinfo ('%s', %i)\n"
-msgstr "Nu s-a putut crea directorul (%s): %s\n"
-
-#: src/sid/xs_stil.c:46
-msgid "SubTune pointer structure realloc failed.\n"
-msgstr ""
-
-#: src/sid/xs_stil.c:69
-msgid "SubTune structure malloc failed!\n"
-msgstr ""
-
-#: src/sid/xs_stil.c:176
-#, fuzzy, c-format
-msgid "Could not open STILDB '%s'\n"
-msgstr "Nu s-a putut crea directorul (%s): %s\n"
-
 #: src/sndfile/plugin.c:548
 #, fuzzy
 msgid "About sndfile plugin"
@@ -4771,12 +4530,12 @@
 msgid "The orientation of the tray"
 msgstr ""
 
-#: src/statusicon/si_ui.c:587
+#: src/statusicon/si_ui.c:622
 #, fuzzy
 msgid "About Status Icon Plugin"
 msgstr "Despre plugin-ul decodor MP4·AAC"
 
-#: src/statusicon/si_ui.c:589
+#: src/statusicon/si_ui.c:624
 msgid ""
 "\n"
 "written by Giacomo Lozito < james@develia.org >\n"
@@ -4785,39 +4544,39 @@
 "the system tray area of the window manager.\n"
 msgstr ""
 
-#: src/statusicon/si_ui.c:661
+#: src/statusicon/si_ui.c:696
 msgid "Status Icon Plugin - Preferences"
 msgstr ""
 
-#: src/statusicon/si_ui.c:672
+#: src/statusicon/si_ui.c:707
 msgid "Right-Click Menu"
 msgstr ""
 
-#: src/statusicon/si_ui.c:677
+#: src/statusicon/si_ui.c:712
 #, fuzzy
 msgid "Audacious standard menu"
 msgstr "Developerii Audacious:"
 
-#: src/statusicon/si_ui.c:682
+#: src/statusicon/si_ui.c:717
 #, fuzzy
 msgid "Small playback menu #1"
 msgstr "Continuă redarea la pornire"
 
-#: src/statusicon/si_ui.c:687
+#: src/statusicon/si_ui.c:722
 #, fuzzy
 msgid "Small playback menu #2"
 msgstr "Continuă redarea la pornire"
 
-#: src/statusicon/si_ui.c:710
+#: src/statusicon/si_ui.c:745
 msgid "Mouse Scroll Action"
 msgstr ""
 
-#: src/statusicon/si_ui.c:715
+#: src/statusicon/si_ui.c:750
 #, fuzzy
 msgid "Change volume"
 msgstr "Schimbă volumul cu"
 
-#: src/statusicon/si_ui.c:720
+#: src/statusicon/si_ui.c:755
 #, fuzzy
 msgid "Change playing song"
 msgstr "Pauză"
@@ -4931,12 +4690,12 @@
 "e.g. tone://2000;2005 to play a 2000Hz tone and a 2005Hz tone"
 msgstr ""
 
-#: src/tonegen/tonegen.c:168
+#: src/tonegen/tonegen.c:167
 #, c-format
 msgid "%s %.1f Hz"
 msgstr "%s %.1f Hz"
 
-#: src/tonegen/tonegen.c:168
+#: src/tonegen/tonegen.c:167
 msgid "Tone Generator: "
 msgstr ""
 
@@ -5004,47 +4763,25 @@
 msgid "Track number:"
 msgstr "Numărul Trackului"
 
-#: src/vorbis/configure.c:115
+#: src/vorbis/configure.c:84
 msgid "Ogg Vorbis Audio Plugin Configuration"
 msgstr ""
 
-#: src/vorbis/configure.c:127
+#: src/vorbis/configure.c:94
 msgid "Ogg Vorbis Tags:"
 msgstr ""
 
-#: src/vorbis/configure.c:148
+#: src/vorbis/configure.c:115
 #, fuzzy
 msgid "Title format:"
 msgstr "Formatul titlului:"
 
-#: src/vorbis/configure.c:162 src/wavpack/ui.cxx:502
-#, fuzzy
-msgid "ReplayGain Settings:"
-msgstr "Opțiuni pentru Popup-ul cu informații suplimentare"
-
-#: src/vorbis/configure.c:180 src/wavpack/ui.cxx:520
-#, fuzzy
-msgid "ReplayGain Type:"
-msgstr "Tipul Fișierului: "
-
-#: src/vorbis/configure.c:191 src/wavpack/ui.cxx:531
-msgid "use Track Gain/Peak"
-msgstr ""
-
-#: src/vorbis/configure.c:201 src/wavpack/ui.cxx:539
-msgid "use Album Gain/Peak"
-msgstr ""
-
-#: src/vorbis/configure.c:213
-msgid "Enable 6dB Boost + Hard Limiting"
-msgstr ""
-
-#: src/vorbis/vorbis.c:751 src/vorbis/vorbis.c~:759
+#: src/vorbis/vorbis.c:681
 #, fuzzy
 msgid "About Ogg Vorbis Audio Plugin"
 msgstr "Despre plugin-ul·Apple·Lossless·Audio"
 
-#: src/vorbis/vorbis.c:757 src/vorbis/vorbis.c~:765
+#: src/vorbis/vorbis.c:687
 msgid ""
 "Ogg Vorbis Plugin by the Xiph.org Foundation\n"
 "\n"
@@ -5058,6 +4795,7 @@
 "Jorn Baayen <jorn@nl.linux.org>\n"
 "Haavard Kvaalen <havardk@xmms.org>\n"
 "Gian-Carlo Pascutto <gcp@sjeng.org>\n"
+"Eugene Zagidullin <e.asphyx@gmail.com>\n"
 "\n"
 "Visit the Xiph.org Foundation at http://www.xiph.org/\n"
 msgstr ""
@@ -5166,7 +4904,25 @@
 msgid "General Plugin Settings:"
 msgstr "Lista plugin-urilor _Generale"
 
-#: src/wma/wma.c:132
+#: src/wavpack/ui.cxx:502
+#, fuzzy
+msgid "ReplayGain Settings:"
+msgstr "Opțiuni pentru Popup-ul cu informații suplimentare"
+
+#: src/wavpack/ui.cxx:520
+#, fuzzy
+msgid "ReplayGain Type:"
+msgstr "Tipul Fișierului: "
+
+#: src/wavpack/ui.cxx:531
+msgid "use Track Gain/Peak"
+msgstr ""
+
+#: src/wavpack/ui.cxx:539
+msgid "use Album Gain/Peak"
+msgstr ""
+
+#: src/wma/wma.c:123
 msgid ""
 "Adapted for use in Audacious by Tony Vroon (chainsaw@gentoo.org) from\n"
 "the BEEP-WMA plugin which is Copyright (C) 2004,2005 Mokrushin I.V. aka "
@@ -5177,6 +4933,58 @@
 msgstr ""
 
 #, fuzzy
+#~ msgid "'=' expected on column #%d.\n"
+#~ msgstr "Închide dialogul după salt"
+
+#, fuzzy
+#~ msgid "Could not open SongLengthDB '%s'\n"
+#~ msgstr "Nu s-a putut crea directorul (%s): %s\n"
+
+#, fuzzy
+#~ msgid "reSID->create() failed.\n"
+#~ msgstr "Nu s-a putut crea directorul (%s): %s\n"
+
+#, fuzzy
+#~ msgid "reSID->sampling(%d) failed.\n"
+#~ msgstr "<b>Convertor pentru rata de eșantionare</b>"
+
+#, fuzzy
+#~ msgid "hardSID->create() failed.\n"
+#~ msgstr "Nu s-a putut crea directorul (%s): %s\n"
+
+#, fuzzy
+#~ msgid "Could not allocate memory for t_xs_tuneinfo ('%s')\n"
+#~ msgstr "Nu s-a putut crea directorul (%s): %s\n"
+
+#, fuzzy
+#~ msgid "Could not allocate sidFilename ('%s')\n"
+#~ msgstr "Nu s-a putut crea directorul (%s): %s\n"
+
+#, fuzzy
+#~ msgid "Could not allocate memory for t_xs_subtuneinfo ('%s', %i)\n"
+#~ msgstr "Nu s-a putut crea directorul (%s): %s\n"
+
+#, fuzzy
+#~ msgid "Could not open STILDB '%s'\n"
+#~ msgstr "Nu s-a putut crea directorul (%s): %s\n"
+
+#, fuzzy
+#~ msgid "Base gain (dB):"
+#~ msgstr "Salvează Lista Implicită"
+
+#, fuzzy
+#~ msgid "Enable ReplayGain processing"
+#~ msgstr "Activează proxy"
+
+#, fuzzy
+#~ msgid "Enable peak info clip prevention"
+#~ msgstr "Activează proxy"
+
+#, fuzzy
+#~ msgid "Enable adaptive scaler clip prevention"
+#~ msgstr "Activează proxy"
+
+#, fuzzy
 #~ msgid "<b>Playback:</b>"
 #~ msgstr "Redare"
 
--- a/po/ru.po	Fri Jun 13 04:58:39 2008 +0300
+++ b/po/ru.po	Fri Jun 13 05:57:25 2008 +0300
@@ -10,7 +10,7 @@
 msgstr ""
 "Project-Id-Version: audacious-plugins 1.5\n"
 "Report-Msgid-Bugs-To: http://bugs.audacious-media-player.org\n"
-"POT-Creation-Date: 2008-02-03 20:33+0200\n"
+"POT-Creation-Date: 2008-03-30 17:25+0200\n"
 "PO-Revision-Date: 2008-01-11 04:59+0300\n"
 "Last-Translator: Eugene Zagidullin <e.asphyx@gmail.com>\n"
 "Language-Team: none\n"
@@ -42,22 +42,22 @@
 #: src/adplug/adplug-xmms.cc:265 src/adplug/adplug-xmms.cc:526
 #: src/alac/plugin.c:77 src/arts/arts.c:26 src/arts/configure.c:90
 #: src/audiocompress/audacious-glue.c:102
-#: src/audiocompress/audacious-glue.c:552 src/cdaudio-ng/configure.c:227
-#: src/console/Audacious_Driver.cxx:449 src/demac/plugin.c:392
+#: src/audiocompress/audacious-glue.c:552 src/cdaudio-ng/configure.c:228
+#: src/console/Audacious_Driver.cxx:449 src/demac/plugin.c:393
 #: src/echo_plugin/gui.c:26 src/echo_plugin/gui.c:137 src/esd/about.c:49
 #: src/filewriter/filewriter.c:183 src/jack/configure.c:141
-#: src/jack/jack.c:493 src/madplug/plugin.c:600 src/madplug/plugin.c:624
+#: src/jack/jack.c:456 src/madplug/plugin.c:542 src/madplug/plugin.c:566
 #: src/metronom/metronom.c:88 src/modplug/gui/main.cxx:49
 #: src/musepack/libmpc.cxx:232 src/null/null.c:67 src/null/null.c:110
 #: src/OSS4/about.c:59 src/OSS/about.c:54 src/paranormal-ng/plugin.c:283
 #: src/paranormal/plugin.c:291 src/scrobbler/gtkstuff.c:25
-#: src/sndfile/plugin.c:565 src/statusicon/si_ui.c:593
+#: src/sndfile/plugin.c:565 src/statusicon/si_ui.c:628
 #: src/stereo_plugin/stereo.c:53 src/stereo_plugin/stereo.c:116
 #: src/sun/about.c:38 src/sun/configure.c:559 src/timidity/interface.c:222
 #: src/timidity/xmms-timidity.c:120 src/tonegen/tonegen.c:62
 #: src/tta/libtta.c:153 src/tta/libtta.c:267 src/tta/libtta.c:402
-#: src/vorbis/vorbis.c:769 src/vorbis/vorbis.c~:777 src/vtx/about.c:32
-#: src/vtx/info.c:43 src/wavpack/ui.cxx:56 src/wavpack/ui.cxx:556
+#: src/vorbis/vorbis.c:700 src/vtx/about.c:32 src/vtx/info.c:43
+#: src/wavpack/ui.cxx:56 src/wavpack/ui.cxx:556
 msgid "Ok"
 msgstr "ОК"
 
@@ -93,7 +93,7 @@
 
 #: src/adplug/adplug-xmms.cc:275 src/alarm/interface.c:1398
 #: src/alsa/configure.c:389 src/arts/configure.c:91
-#: src/audiocompress/audacious-glue.c:557 src/cdaudio-ng/configure.c:231
+#: src/audiocompress/audacious-glue.c:557 src/cdaudio-ng/configure.c:232
 #: src/echo_plugin/gui.c:145 src/jack/configure.c:148
 #: src/modplug/gui/interface.cxx:714 src/modplug/gui/modplug.glade:1668
 #: src/musepack/libmpc.cxx:237 src/musepack/libmpc.cxx:557 src/null/null.c:111
@@ -104,7 +104,7 @@
 msgstr "Отмена"
 
 #: src/adplug/adplug-xmms.cc:291 src/console/Audacious_Config.cxx:145
-#: src/madplug/configure.c:421 src/modplug/gui/interface.cxx:628
+#: src/madplug/configure.c:290 src/modplug/gui/interface.cxx:628
 #: src/modplug/gui/interface.cxx:887 src/modplug/gui/modplug.glade:1404
 #: src/modplug/gui/modplug.glade:1804
 msgid "General"
@@ -132,13 +132,13 @@
 msgid "Channels"
 msgstr "Каналы"
 
-#: src/adplug/adplug-xmms.cc:325 src/filewriter/mp3.c:894
+#: src/adplug/adplug-xmms.cc:325 src/filewriter/mp3.c:900
 #: src/sid/xmms-sid.glade:157 src/sid/xs_interface.c:288
 #: src/timidity/interface.c:165
 msgid "Mono"
 msgstr "Моно"
 
-#: src/adplug/adplug-xmms.cc:330 src/filewriter/mp3.c:889
+#: src/adplug/adplug-xmms.cc:330 src/filewriter/mp3.c:895
 #: src/modplug/gui/interface.cxx:204 src/modplug/gui/modplug.glade:159
 #: src/sid/xmms-sid.glade:176 src/sid/xs_interface.c:295
 #: src/timidity/interface.c:173
@@ -303,7 +303,7 @@
 
 #: src/alarm/interface.c:71 src/lirc/about.c:115
 #: src/modplug/gui/interface.cxx:971 src/modplug/gui/modplug.glade:2030
-#: src/sid/xmms-sid.glade:3643 src/sid/xs_about.c:213
+#: src/sid/xmms-sid.glade:3643 src/sid/xs_about.c:214
 #: src/sid/xs_interface.c:1740
 msgid "Close"
 msgstr "Закрыть"
@@ -317,10 +317,10 @@
 msgstr ""
 
 #: src/alarm/interface.c:124 src/alarm/interface.c:1389 src/alsa/about.c:46
-#: src/alsa/configure.c:383 src/cdaudio-ng/cdaudio-ng.c:228
-#: src/flacng/plugin.c:747 src/gnomeshortcuts/gnomeshortcuts.c:292
+#: src/alsa/configure.c:383 src/cdaudio-ng/cdaudio-ng.c:247
+#: src/flacng/plugin.c:706 src/gnomeshortcuts/gnomeshortcuts.c:311
 #: src/hotkey/gui.c:671 src/modplug/gui/interface.cxx:702
-#: src/modplug/gui/modplug.glade:1642 src/pulse_audio/pulse_audio.c:712
+#: src/modplug/gui/modplug.glade:1642 src/pulse_audio/pulse_audio.c:738
 #: src/scrobbler/gtkstuff.c:45 src/sid/xmms-sid.glade:3066
 #: src/sid/xs_interface.c:1243
 msgid "OK"
@@ -1699,7 +1699,7 @@
 msgid "Trigger"
 msgstr "СобытиÑ"
 
-#: src/aosd/aosd_ui.c:1076 src/cdaudio-ng/configure.c:166
+#: src/aosd/aosd_ui.c:1076 src/cdaudio-ng/configure.c:167
 #: src/modplug/gui/interface.cxx:688 src/modplug/gui/modplug.glade:1603
 #: src/sid/xmms-sid.glade:3026 src/sid/xs_interface.c:1229
 msgid "Misc"
@@ -1893,15 +1893,19 @@
 msgid "Options:"
 msgstr "Параметры:"
 
-#: src/cdaudio-ng/cdaudio-ng.c:198
+#: src/cdaudio-ng/cdaudio-ng.c:204
+msgid "Rescan CD"
+msgstr ""
+
+#: src/cdaudio-ng/cdaudio-ng.c:217
 msgid "Add CD"
 msgstr "Добавить CD"
 
-#: src/cdaudio-ng/cdaudio-ng.c:223
+#: src/cdaudio-ng/cdaudio-ng.c:242
 msgid "About CD Audio Plugin NG"
 msgstr "О модуле CD Audio NG"
 
-#: src/cdaudio-ng/cdaudio-ng.c:224
+#: src/cdaudio-ng/cdaudio-ng.c:243
 msgid ""
 "Copyright (c) 2007, by Calin Crisan <ccrisan@gmail.com> and The Audacious "
 "Team.\n"
@@ -1924,7 +1928,7 @@
 "\n"
 "Этот модуль ÑвлÑлÑÑ Ñ‡Ð°Ñтью проекта Google Summer of Code в 2007 году."
 
-#: src/cdaudio-ng/cdaudio-ng.c:627
+#: src/cdaudio-ng/cdaudio-ng.c:814
 msgid ""
 "<b><big>No playable CD found.</big></b>\n"
 "\n"
@@ -1934,47 +1938,47 @@
 "\n"
 "ДиÑк не вÑтавлен в привод, или вÑтавленный диÑк не ÑвлÑетÑÑ Audio CD.\n"
 
-#: src/cdaudio-ng/configure.c:146
+#: src/cdaudio-ng/configure.c:147
 msgid "CD Audio Plugin Configuration"
 msgstr "ÐаÑтройки Ð¼Ð¾Ð´ÑƒÐ»Ñ CD Audio"
 
-#: src/cdaudio-ng/configure.c:156
+#: src/cdaudio-ng/configure.c:157
 msgid "Digital audio extraction"
 msgstr "Цифровое Ñчитывание аудио"
 
-#: src/cdaudio-ng/configure.c:161
+#: src/cdaudio-ng/configure.c:162
 msgid "Title information"
 msgstr "Формат названиÑ"
 
-#: src/cdaudio-ng/configure.c:178
+#: src/cdaudio-ng/configure.c:179
 msgid "Limit read speed to: "
 msgstr "Ограничить ÑкороÑÑ‚ÑŒ чтениÑ:"
 
-#: src/cdaudio-ng/configure.c:185
+#: src/cdaudio-ng/configure.c:186
 msgid "Use cd-text if available"
 msgstr "ИÑпользовать CD-Text, еÑли возможно"
 
-#: src/cdaudio-ng/configure.c:189
+#: src/cdaudio-ng/configure.c:190
 msgid "Use CDDB if available"
 msgstr "ИÑпользовать CDDB, еÑли возможно"
 
-#: src/cdaudio-ng/configure.c:193
+#: src/cdaudio-ng/configure.c:194
 msgid "Server: "
 msgstr "Сервер:"
 
-#: src/cdaudio-ng/configure.c:196
+#: src/cdaudio-ng/configure.c:197
 msgid "Port: "
 msgstr "Порт:"
 
-#: src/cdaudio-ng/configure.c:202
+#: src/cdaudio-ng/configure.c:203
 msgid "Use HTTP instead of CDDBP"
 msgstr "ИÑпользовать HTTP вмеÑто CDDBP"
 
-#: src/cdaudio-ng/configure.c:210
+#: src/cdaudio-ng/configure.c:211
 msgid "Override default device: "
 msgstr "Переопределить уÑтройÑтво по-умолчанию:"
 
-#: src/cdaudio-ng/configure.c:217
+#: src/cdaudio-ng/configure.c:218
 msgid "Print debug information"
 msgstr "Выводить отладочную информацию"
 
@@ -2051,11 +2055,11 @@
 "Портирование под Audacious: William Pitcock <nenolod@nenolod.net>, \n"
 "        Shay Green <gblargg@gmail.com>"
 
-#: src/demac/plugin.c:387
+#: src/demac/plugin.c:388
 msgid "About Monkey's Audio Plugin"
 msgstr "О модуле Monkey's Audio"
 
-#: src/demac/plugin.c:388
+#: src/demac/plugin.c:389
 msgid ""
 "Copyright (C) 2007 Eugene Zagidullin <e.asphyx@gmail.com>\n"
 "Based on ffape decoder, Copyright (C) 2007 Benjamin Zores\n"
@@ -2378,7 +2382,7 @@
 "Ðевозможно открыть окно Ð´Ð»Ñ Ð½ÐµÐ¾Ð¿Ð¾Ð·Ð½Ð°Ð½Ð½Ð¾Ð³Ð¾ уÑтройÑтва.\n"
 "УбедитеÑÑŒ, что уÑтройÑтво правильно подключено."
 
-#: src/evdev-plug/ed_ui.c:319 src/madplug/plugin.c:624
+#: src/evdev-plug/ed_ui.c:319 src/madplug/plugin.c:566
 msgid "Error"
 msgstr "Ошибка"
 
@@ -2617,15 +2621,15 @@
 msgid "Prepend track number to filename"
 msgstr ""
 
-#: src/filewriter/mp3.c:670
+#: src/filewriter/mp3.c:676
 msgid "MP3 Configuration"
 msgstr "ÐаÑтройка MP3"
 
-#: src/filewriter/mp3.c:697
+#: src/filewriter/mp3.c:703
 msgid "Algorithm Quality:"
 msgstr ""
 
-#: src/filewriter/mp3.c:719
+#: src/filewriter/mp3.c:725
 msgid ""
 "best/slowest:0;\n"
 "worst/fastest:9;\n"
@@ -2633,157 +2637,157 @@
 "default:5;"
 msgstr ""
 
-#: src/filewriter/mp3.c:727
+#: src/filewriter/mp3.c:733
 msgid "Output Samplerate:"
 msgstr "Ð’Ñ‹Ñ…Ð¾Ð´Ð½Ð°Ñ Ñ‡Ð°Ñтота:"
 
-#: src/filewriter/mp3.c:738 src/filewriter/mp3.c:879
+#: src/filewriter/mp3.c:744 src/filewriter/mp3.c:885
 msgid "Auto"
 msgstr "ÐвтоматичеÑки"
 
-#: src/filewriter/mp3.c:760
+#: src/filewriter/mp3.c:766
 msgid "(Hz)"
 msgstr "(Гц)"
 
-#: src/filewriter/mp3.c:772
+#: src/filewriter/mp3.c:778
 msgid "Bitrate / Compression ratio:"
 msgstr "Битрейт/ Степень ÑжатиÑ:"
 
-#: src/filewriter/mp3.c:798
+#: src/filewriter/mp3.c:804
 msgid "Bitrate (kbps):"
 msgstr "Битрейт (кб/Ñ)"
 
-#: src/filewriter/mp3.c:839
+#: src/filewriter/mp3.c:845
 msgid "Compression ratio:"
 msgstr ""
 
-#: src/filewriter/mp3.c:869
+#: src/filewriter/mp3.c:875
 msgid "Audio Mode:"
 msgstr "Режим аудио:"
 
-#: src/filewriter/mp3.c:884
+#: src/filewriter/mp3.c:890
 msgid "Joint-Stereo"
 msgstr "Совмещенное Ñтерео"
 
-#: src/filewriter/mp3.c:925
+#: src/filewriter/mp3.c:931
 msgid "auto-M/S mode"
 msgstr ""
 
-#: src/filewriter/mp3.c:937
+#: src/filewriter/mp3.c:943
 msgid "Misc:"
 msgstr "Прочее:"
 
-#: src/filewriter/mp3.c:948
+#: src/filewriter/mp3.c:954
 msgid "Enforce strict ISO complience"
 msgstr ""
 
-#: src/filewriter/mp3.c:959
+#: src/filewriter/mp3.c:965
 msgid "Error protection"
 msgstr ""
 
-#: src/filewriter/mp3.c:971
+#: src/filewriter/mp3.c:977
 msgid "Adds 16 bit checksum to every frame"
 msgstr ""
 
-#: src/filewriter/mp3.c:976 src/filewriter/vorbis.c:274
+#: src/filewriter/mp3.c:982 src/filewriter/vorbis.c:274
 #: src/modplug/gui/interface.cxx:319 src/modplug/gui/modplug.glade:507
 msgid "Quality"
 msgstr "КачеÑтво"
 
-#: src/filewriter/mp3.c:988
+#: src/filewriter/mp3.c:994
 msgid "Enable VBR/ABR"
 msgstr "Включить VBR/ABR"
 
-#: src/filewriter/mp3.c:1000
+#: src/filewriter/mp3.c:1006
 msgid "Type:"
 msgstr "Тип:"
 
-#: src/filewriter/mp3.c:1011
+#: src/filewriter/mp3.c:1017
 msgid "Variable bitrate"
 msgstr "Переменный битрейт"
 
-#: src/filewriter/mp3.c:1023
+#: src/filewriter/mp3.c:1029
 msgid "Average bitrate"
 msgstr "Средний битрейт"
 
-#: src/filewriter/mp3.c:1037
+#: src/filewriter/mp3.c:1043
 msgid "VBR Options:"
 msgstr "Параметры VBR:"
 
-#: src/filewriter/mp3.c:1053
+#: src/filewriter/mp3.c:1059
 msgid "Minimum bitrate (kbps):"
 msgstr "Минимальный битрейт (кб/Ñ):"
 
-#: src/filewriter/mp3.c:1089
+#: src/filewriter/mp3.c:1095
 msgid "Maximum bitrate (kbps):"
 msgstr "МакÑимальный битрейт (кб/Ñ):"
 
-#: src/filewriter/mp3.c:1121
+#: src/filewriter/mp3.c:1127
 msgid "Strictly enforce minimum bitrate"
 msgstr ""
 
-#: src/filewriter/mp3.c:1123
+#: src/filewriter/mp3.c:1129
 msgid ""
 "For use with players that do not support low bitrate mp3 (Apex AD600-A DVD/"
 "mp3 player)"
 msgstr ""
 
-#: src/filewriter/mp3.c:1136
+#: src/filewriter/mp3.c:1142
 msgid "ABR Options:"
 msgstr "Параметры ABR:"
 
-#: src/filewriter/mp3.c:1146
+#: src/filewriter/mp3.c:1152
 msgid "Average bitrate (kbps):"
 msgstr ""
 
-#: src/filewriter/mp3.c:1183
+#: src/filewriter/mp3.c:1189
 msgid "VBR quality level:"
 msgstr ""
 
-#: src/filewriter/mp3.c:1198
+#: src/filewriter/mp3.c:1204
 msgid ""
 "highest:0;\n"
 "lowest:9;\n"
 "default:4;"
 msgstr ""
 
-#: src/filewriter/mp3.c:1206
+#: src/filewriter/mp3.c:1212
 msgid "Don't write Xing VBR header"
 msgstr ""
 
-#: src/filewriter/mp3.c:1221
+#: src/filewriter/mp3.c:1227
 msgid "VBR/ABR"
 msgstr ""
 
-#: src/filewriter/mp3.c:1233
+#: src/filewriter/mp3.c:1239
 msgid "Frame params:"
 msgstr ""
 
-#: src/filewriter/mp3.c:1245
+#: src/filewriter/mp3.c:1251
 msgid "Mark as copyright"
 msgstr ""
 
-#: src/filewriter/mp3.c:1256
+#: src/filewriter/mp3.c:1262
 msgid "Mark as original"
 msgstr ""
 
-#: src/filewriter/mp3.c:1268
+#: src/filewriter/mp3.c:1274
 msgid "ID3 params:"
 msgstr "Параметры ID3:"
 
-#: src/filewriter/mp3.c:1279
+#: src/filewriter/mp3.c:1285
 msgid "Force addition of version 2 tag"
 msgstr ""
 
-#: src/filewriter/mp3.c:1289
+#: src/filewriter/mp3.c:1295
 msgid "Only add v1 tag"
 msgstr ""
 
-#: src/filewriter/mp3.c:1296
+#: src/filewriter/mp3.c:1302
 msgid "Only add v2 tag"
 msgstr ""
 
-#: src/filewriter/mp3.c:1317
+#: src/filewriter/mp3.c:1323
 msgid "Tags"
 msgstr "ТÑги"
 
@@ -2795,11 +2799,11 @@
 msgid "Quality level (0 - 10):"
 msgstr ""
 
-#: src/flacng/plugin.c:739
+#: src/flacng/plugin.c:698
 msgid "FLAC Audio Plugin "
 msgstr "Модуль поддержки FLAC "
 
-#: src/flacng/plugin.c:740
+#: src/flacng/plugin.c:699
 msgid ""
 "\n"
 "\n"
@@ -2809,20 +2813,21 @@
 "http://www.skytale.net/projects/bmp-flac2/"
 msgstr ""
 
-#: src/flacng/plugin.c:745
+#: src/flacng/plugin.c:704
 msgid "About FLAC Audio Plugin"
 msgstr "О модуле поддержки FLAC"
 
-#: src/gnomeshortcuts/gnomeshortcuts.c:287
+#: src/gnomeshortcuts/gnomeshortcuts.c:306
 msgid "About Gnome Shortcut Plugin"
 msgstr "О модуле горÑчих клавиш Ð´Ð»Ñ Gnome"
 
-#: src/gnomeshortcuts/gnomeshortcuts.c:288
+#: src/gnomeshortcuts/gnomeshortcuts.c:307
+#, fuzzy
 msgid ""
 "Gnome Shortcut Plugin\n"
 "Let's you control the player with Gnome's shortcuts.\n"
 "\n"
-"Copyright (C) 2007 Sascha Hlusiak <contact@saschahlusiak.de>\n"
+"Copyright (C) 2007-2008 Sascha Hlusiak <contact@saschahlusiak.de>\n"
 "\n"
 msgstr ""
 "Модуль горÑчих клавиш Ð´Ð»Ñ Gnome\n"
@@ -2995,11 +3000,11 @@
 msgid "Enable debug printing"
 msgstr "Выводить отладочную информацию"
 
-#: src/jack/jack.c:95
+#: src/jack/jack.c:84
 msgid "Sample rate mismatch"
 msgstr "ÐÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ Ñ‡Ð°Ñтота ÑÑмплированиÑ"
 
-#: src/jack/jack.c:98
+#: src/jack/jack.c:87
 msgid ""
 "Xmms is asking for a sample rate that differs from\n"
 " that of the jack server.  Xmms 1.2.8 or later\n"
@@ -3013,15 +3018,15 @@
 "Chris Morgan <cmorgan@alum.wpi.edu>\n"
 msgstr ""
 
-#: src/jack/jack.c:111 src/wma/wma.c:157
+#: src/jack/jack.c:100 src/wma/wma.c:148
 msgid " Close "
 msgstr " Закрыть "
 
-#: src/jack/jack.c:489
+#: src/jack/jack.c:452
 msgid "About JACK Output Plugin 0.17"
 msgstr "О модуле вывода JACK 0.17"
 
-#: src/jack/jack.c:490
+#: src/jack/jack.c:453
 msgid ""
 "XMMS jack Driver 0.17\n"
 "\n"
@@ -3173,112 +3178,60 @@
 msgid "%s: will try reconnect every %d seconds...\n"
 msgstr ""
 
-#: src/madplug/configure.c:332
+#: src/madplug/configure.c:209
 msgid "MPEG Audio Plugin Configuration"
 msgstr "ÐаÑтройка Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ MPEG"
 
-#: src/madplug/configure.c:349
+#: src/madplug/configure.c:226
 #, fuzzy
 msgid "Audio Settings"
 msgstr "ÐаÑтройки будильника"
 
-#: src/madplug/configure.c:358
-msgid "Dither output when rounding to 16-bit"
-msgstr "Размыть вывод при округлении до 16 бит"
-
-#: src/madplug/configure.c:365
+#: src/madplug/configure.c:234
 msgid "Force reopen audio when audio type changed"
 msgstr "Принудительно пере-открывать аудио-вывод при Ñмене типа аудио"
 
-#: src/madplug/configure.c:374
+#: src/madplug/configure.c:243
 #, fuzzy
 msgid "Metadata Settings"
 msgstr "ÐаÑтройки микшера:"
 
-#: src/madplug/configure.c:383
+#: src/madplug/configure.c:252
 msgid "Enable fast play-length calculation"
 msgstr "Включить быÑтрое определение длительноÑти"
 
-#: src/madplug/configure.c:390
+#: src/madplug/configure.c:259
 msgid "Parse XING headers"
 msgstr "Обрабатывать заголовки XING"
 
-#: src/madplug/configure.c:397
+#: src/madplug/configure.c:266
 #, fuzzy
 msgid "Use SJIS to write ID3 tags (not recommended)"
 msgstr "ИÑпользовать SJIS Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи тегов ID3 вмеÑто UTF-8"
 
-#: src/madplug/configure.c:404
+#: src/madplug/configure.c:273
 #, fuzzy
 msgid "Miscellaneous Settings"
 msgstr "ÐаÑтройки микшера:"
 
-#: src/madplug/configure.c:413
+#: src/madplug/configure.c:282
 msgid "Display average bitrate for VBR"
 msgstr "Отображать Ñредний битрейт Ð´Ð»Ñ VBR"
 
-#: src/madplug/configure.c:432
-#, fuzzy
-msgid "Base gain (dB):"
-msgstr "УÑиление по-умолачнию (дБ):"
-
-#: src/madplug/configure.c:446 src/musepack/libmpc.cxx:190
-msgid "ReplayGain Settings"
-msgstr "ÐаÑтройки ReplayGain"
-
-#: src/madplug/configure.c:457
-msgid "Enable ReplayGain processing"
-msgstr "Включить ReplayGain"
-
-#: src/madplug/configure.c:467 src/musepack/libmpc.cxx:207
-msgid "ReplayGain Type"
-msgstr "Тип ReplayGain"
-
-#: src/madplug/configure.c:477 src/musepack/libmpc.cxx:215
-msgid "Use Track Gain"
-msgstr "ИÑпользовать Gain/Peak дорожки"
-
-#: src/madplug/configure.c:485 src/musepack/libmpc.cxx:219
-msgid "Use Album Gain"
-msgstr "ИÑпользовать Gain/Peak альбома"
-
-#: src/madplug/configure.c:498
-msgid "Pre-gain with RG info (dB):"
-msgstr ""
-
-#: src/madplug/configure.c:514
-msgid "Pre-gain without RG info (dB):"
-msgstr ""
-
-#: src/madplug/configure.c:530
-#, fuzzy
-msgid "Enable peak info clip prevention"
-msgstr "Включить предотвращение ÑрезаниÑ"
-
-#: src/madplug/configure.c:552
-#, fuzzy
-msgid "Enable adaptive scaler clip prevention"
-msgstr "Включить предотвращение ÑрезаниÑ"
-
-#: src/madplug/configure.c:561
-#, fuzzy
-msgid "Gain Control"
-msgstr "РегулÑтор громкоÑти:"
-
-#: src/madplug/configure.c:569 src/vorbis/configure.c:135
+#: src/madplug/configure.c:296 src/vorbis/configure.c:102
 msgid "Override generic titles"
 msgstr "Ðе иÑпользовать Ñтандартные названиÑ"
 
-#: src/madplug/configure.c:581
+#: src/madplug/configure.c:308
 msgid "ID3 format:"
 msgstr "Формат ID3-тега:"
 
-#: src/madplug/configure.c:593 src/sid/xmms-sid.glade:2540
-#: src/sid/xs_interface.c:1070 src/vorbis/configure.c:158
+#: src/madplug/configure.c:320 src/sid/xmms-sid.glade:2540
+#: src/sid/xs_interface.c:1070
 msgid "Title"
 msgstr "Ðазвание"
 
-#: src/madplug/plugin.c:582
+#: src/madplug/plugin.c:524
 #, c-format
 msgid ""
 "Audacious MPEG Audio Plugin\n"
@@ -3309,7 +3262,7 @@
 "Поддержка ReplayGain:\n"
 "    Samuel Krempp"
 
-#: src/madplug/plugin.c:598
+#: src/madplug/plugin.c:540
 msgid "About MPEG Audio Plugin"
 msgstr "О модуле поддержки MPEG"
 
@@ -3606,18 +3559,31 @@
 msgid "Plugin"
 msgstr "Модуль"
 
-#: src/musepack/libmpc.cxx:197 src/vorbis/configure.c:170
-#: src/wavpack/ui.cxx:510
+#: src/musepack/libmpc.cxx:190
+msgid "ReplayGain Settings"
+msgstr "ÐаÑтройки ReplayGain"
+
+#: src/musepack/libmpc.cxx:197 src/wavpack/ui.cxx:510
 msgid "Enable Clipping Prevention"
 msgstr "Включить предотвращение ÑрезаниÑ"
 
-#: src/musepack/libmpc.cxx:202 src/vorbis/configure.c:175
-#: src/wavpack/ui.cxx:515
+#: src/musepack/libmpc.cxx:202 src/wavpack/ui.cxx:515
 msgid "Enable ReplayGain"
 msgstr "Включить ReplayGain"
 
-#: src/musepack/libmpc.cxx:224 src/vorbis/configure.c:219
-#: src/wavpack/ui.cxx:547
+#: src/musepack/libmpc.cxx:207
+msgid "ReplayGain Type"
+msgstr "Тип ReplayGain"
+
+#: src/musepack/libmpc.cxx:215
+msgid "Use Track Gain"
+msgstr "ИÑпользовать Gain/Peak дорожки"
+
+#: src/musepack/libmpc.cxx:219
+msgid "Use Album Gain"
+msgstr "ИÑпользовать Gain/Peak альбома"
+
+#: src/musepack/libmpc.cxx:224 src/wavpack/ui.cxx:547
 msgid "ReplayGain"
 msgstr "ReplayGain"
 
@@ -3882,11 +3848,15 @@
 msgid "Volume controls Master not PCM"
 msgstr "ГромкоÑÑ‚ÑŒ регулирует МаÑтер, а не PCM"
 
-#: src/pulse_audio/pulse_audio.c:696
+#: src/projectm-1.0/main.c:70
+msgid "_Random"
+msgstr ""
+
+#: src/pulse_audio/pulse_audio.c:722
 msgid "About Audacious PulseAudio Output Plugin"
 msgstr "О модуле вывода PulseAudio"
 
-#: src/pulse_audio/pulse_audio.c:697
+#: src/pulse_audio/pulse_audio.c:723
 msgid ""
 "Audacious PulseAudio Output Plugin\n"
 "\n"
@@ -3974,36 +3944,6 @@
 msgid "Scrobbler Error"
 msgstr "Ошибка Scrobbler"
 
-#: src/sid/xmms-sid.c:203
-msgid "Error initializing song-length database!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:209
-msgid "Error initializing STIL database!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:347
-msgid "Couldn't allocate memory for audio data buffer!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:355
-msgid "Couldn't allocate memory for audio oversampling buffer!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:371
-#, c-format
-msgid "Couldn't initialize SID-tune '%s' (sub-tune #%i)!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:382
-#, c-format
-msgid "Couldn't open XMMS audio output (fmt=%x, freq=%i, nchan=%i)!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:432
-msgid "Oversampling rate-conversion pass failed.\n"
-msgstr ""
-
 #: src/sid/xmms-sid.glade:8 src/sid/xs_interface.c:221
 msgid "Audacious-SID configuration"
 msgstr "ÐаÑтройка Audacious-SID"
@@ -4533,19 +4473,11 @@
 msgid "No"
 msgstr "No"
 
-#: src/sid/xs_about.c:84 src/wma/wma.c:130
+#: src/sid/xs_about.c:84 src/wma/wma.c:121
 #, c-format
 msgid "About %s"
 msgstr "О программе %s"
 
-#: src/sid/xs_config.c:580
-msgid "Allocation of sid2FilterPresets structure failed!\n"
-msgstr ""
-
-#: src/sid/xs_config.c:908
-msgid "Warning: Could not set filter curve widget points!\n"
-msgstr ""
-
 #: src/sid/xs_fileinfo.c:232
 msgid "General info"
 msgstr "ОÑÐ½Ð¾Ð²Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ"
@@ -4555,176 +4487,6 @@
 msgid "Tune #%i: "
 msgstr ""
 
-#: src/sid/xs_length.c:113
-msgid "Error allocating new node. Fatal error.\n"
-msgstr ""
-
-#: src/sid/xs_length.c:128
-#, c-format
-msgid "'=' expected on column #%d.\n"
-msgstr ""
-
-#: src/sid/xs_length.c:153
-msgid "Could not allocate memory for node.\n"
-msgstr ""
-
-#: src/sid/xs_length.c:204
-#, c-format
-msgid "Could not open SongLengthDB '%s'\n"
-msgstr ""
-
-#: src/sid/xs_length.c:224
-#, c-format
-msgid "Invalid MD5-hash in SongLengthDB file '%s' line #%d!\n"
-msgstr ""
-
-#: src/sid/xs_length.c:231
-#, c-format
-msgid "Invalid entry in SongLengthDB file '%s' line #%d!\n"
-msgstr ""
-
-#: src/sid/xs_length.c:236
-#, c-format
-msgid "Invalid line in SongLengthDB file '%s' line #%d\n"
-msgstr ""
-
-#: src/sid/xs_length.c:398
-#, c-format
-msgid "Not a PSID or RSID file '%s'\n"
-msgstr ""
-
-#: src/sid/xs_length.c:417
-#, c-format
-msgid "Error reading SID file header from '%s'\n"
-msgstr ""
-
-#: src/sid/xs_length.c:436
-#, c-format
-msgid "Error allocating temp data buffer for file '%s'\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:96
-msgid "[SIDPlay1] Could not initialize emulation engine.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:103
-msgid "[SIDPlay1] Endianess verification failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:238
-msgid "[SIDPlay1] Emulator engine configuration failed!\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:245
-msgid "[SIDPlay1] Could not initialize SIDTune object.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:291
-msgid ""
-"[SIDPlay1] SID-tune struct pointer was NULL. This should not happen, report "
-"to XMMS-SID author.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:296
-msgid ""
-"[SIDPlay1] SID-tune status check failed. This should not happen, report to "
-"XMMS-SID author.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:101
-msgid "[SIDPlay2] Could not initialize emulation engine.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:208
-#, c-format
-msgid "[SIDPlay2] Invalid number of filter curve points (%d > %d)\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:229
-msgid "reSID->create() failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:235
-#, c-format
-msgid "reSID->filter(%d) failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:243
-#, c-format
-msgid "reSID->sampling(%d) failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:253
-msgid "reSID->filter(NULL) failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:267
-msgid "hardSID->create() failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:273
-#, c-format
-msgid "hardSID->filter(%d) failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:281
-msgid "[SIDPlay2] Could not initialize SIDBuilder object.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:295
-#, c-format
-msgid "[SIDPlay2] Invalid clockSpeed=%d, falling back to PAL.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:319
-#, c-format
-msgid "Invalid sid2OptLevel=%d, falling back to %d.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:343
-msgid "[SIDPlay2] Emulator engine configuration failed!\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:350
-msgid "[SIDPlay2] Could not initialize SIDTune object.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:401
-msgid "[SIDPlay2] currTune->selectSong() failed\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:406
-msgid "[SIDPlay2] currEng->load() failed\n"
-msgstr ""
-
-#: src/sid/xs_slsup.c:217
-#, c-format
-msgid "Could not allocate memory for t_xs_tuneinfo ('%s')\n"
-msgstr ""
-
-#: src/sid/xs_slsup.c:224
-#, c-format
-msgid "Could not allocate sidFilename ('%s')\n"
-msgstr ""
-
-#: src/sid/xs_slsup.c:233
-#, c-format
-msgid "Could not allocate memory for t_xs_subtuneinfo ('%s', %i)\n"
-msgstr ""
-
-#: src/sid/xs_stil.c:46
-msgid "SubTune pointer structure realloc failed.\n"
-msgstr ""
-
-#: src/sid/xs_stil.c:69
-msgid "SubTune structure malloc failed!\n"
-msgstr ""
-
-#: src/sid/xs_stil.c:176
-#, c-format
-msgid "Could not open STILDB '%s'\n"
-msgstr ""
-
 #: src/sndfile/plugin.c:548
 #, fuzzy
 msgid "About sndfile plugin"
@@ -4879,11 +4641,11 @@
 msgid "The orientation of the tray"
 msgstr "Положение ÑиÑтемного лотка"
 
-#: src/statusicon/si_ui.c:587
+#: src/statusicon/si_ui.c:622
 msgid "About Status Icon Plugin"
 msgstr "О модуле Status Icon"
 
-#: src/statusicon/si_ui.c:589
+#: src/statusicon/si_ui.c:624
 msgid ""
 "\n"
 "written by Giacomo Lozito < james@develia.org >\n"
@@ -4897,35 +4659,35 @@
 "Этот модуль показывает значок программы\n"
 "в ÑиÑтемном лотке.\n"
 
-#: src/statusicon/si_ui.c:661
+#: src/statusicon/si_ui.c:696
 msgid "Status Icon Plugin - Preferences"
 msgstr "ÐаÑтройка Ð¼Ð¾Ð´ÑƒÐ»Ñ Status Icon"
 
-#: src/statusicon/si_ui.c:672
+#: src/statusicon/si_ui.c:707
 msgid "Right-Click Menu"
 msgstr "Меню вызываемое правой кнопкой мыши"
 
-#: src/statusicon/si_ui.c:677
+#: src/statusicon/si_ui.c:712
 msgid "Audacious standard menu"
 msgstr "Стандартное меню Audacious"
 
-#: src/statusicon/si_ui.c:682
+#: src/statusicon/si_ui.c:717
 msgid "Small playback menu #1"
 msgstr "Уменьшенное меню #1"
 
-#: src/statusicon/si_ui.c:687
+#: src/statusicon/si_ui.c:722
 msgid "Small playback menu #2"
 msgstr "Уменьшенное меню #2"
 
-#: src/statusicon/si_ui.c:710
+#: src/statusicon/si_ui.c:745
 msgid "Mouse Scroll Action"
 msgstr "Ð ÐµÐ°ÐºÑ†Ð¸Ñ Ð½Ð° колёÑико прокрутки"
 
-#: src/statusicon/si_ui.c:715
+#: src/statusicon/si_ui.c:750
 msgid "Change volume"
 msgstr "Изменить громкоÑÑ‚ÑŒ"
 
-#: src/statusicon/si_ui.c:720
+#: src/statusicon/si_ui.c:755
 msgid "Change playing song"
 msgstr "Сменить текущую дорожку"
 
@@ -5044,12 +4806,12 @@
 "Ð”Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð¾Ð±Ð°Ð²ÑŒÑ‚Ðµ URL: tone://чаÑтота1;чаÑтота2;чаÑтота3;...\n"
 "Ðапример tone://2000;2005 Ð´Ð»Ñ Ð²Ð¾ÑÐ¿Ñ€Ð¾Ð¸Ð·Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ñигналов 2000 Гц и 2005 Гц"
 
-#: src/tonegen/tonegen.c:168
+#: src/tonegen/tonegen.c:167
 #, c-format
 msgid "%s %.1f Hz"
 msgstr "%s %.1f Гц"
 
-#: src/tonegen/tonegen.c:168
+#: src/tonegen/tonegen.c:167
 msgid "Tone Generator: "
 msgstr "Генератор Ñигналов: "
 
@@ -5107,43 +4869,24 @@
 msgid "Track number:"
 msgstr "Ðомер дорожки:"
 
-#: src/vorbis/configure.c:115
+#: src/vorbis/configure.c:84
 msgid "Ogg Vorbis Audio Plugin Configuration"
 msgstr "Изменение наÑтроек Ð¼Ð¾Ð´ÑƒÐ»Ñ Ogg Vorbis"
 
-#: src/vorbis/configure.c:127
+#: src/vorbis/configure.c:94
 msgid "Ogg Vorbis Tags:"
 msgstr "Теги Ogg Vorbis:"
 
-#: src/vorbis/configure.c:148
+#: src/vorbis/configure.c:115
 msgid "Title format:"
 msgstr "Формат названиÑ:"
 
-#: src/vorbis/configure.c:162 src/wavpack/ui.cxx:502
-msgid "ReplayGain Settings:"
-msgstr "ÐаÑтройки ReplayGain:"
-
-#: src/vorbis/configure.c:180 src/wavpack/ui.cxx:520
-msgid "ReplayGain Type:"
-msgstr "Тип ReplayGain:"
-
-#: src/vorbis/configure.c:191 src/wavpack/ui.cxx:531
-msgid "use Track Gain/Peak"
-msgstr "иÑпользовать Gain/Peak Дорожки"
-
-#: src/vorbis/configure.c:201 src/wavpack/ui.cxx:539
-msgid "use Album Gain/Peak"
-msgstr "иÑпользовать Gain/Peak Ðльбома"
-
-#: src/vorbis/configure.c:213
-msgid "Enable 6dB Boost + Hard Limiting"
-msgstr "Включить уÑиление на 6dB + жёÑткое ограничение"
-
-#: src/vorbis/vorbis.c:751 src/vorbis/vorbis.c~:759
+#: src/vorbis/vorbis.c:681
 msgid "About Ogg Vorbis Audio Plugin"
 msgstr "О модуле поддержки Ogg Vorbis"
 
-#: src/vorbis/vorbis.c:757 src/vorbis/vorbis.c~:765
+#: src/vorbis/vorbis.c:687
+#, fuzzy
 msgid ""
 "Ogg Vorbis Plugin by the Xiph.org Foundation\n"
 "\n"
@@ -5157,6 +4900,7 @@
 "Jorn Baayen <jorn@nl.linux.org>\n"
 "Haavard Kvaalen <havardk@xmms.org>\n"
 "Gian-Carlo Pascutto <gcp@sjeng.org>\n"
+"Eugene Zagidullin <e.asphyx@gmail.com>\n"
 "\n"
 "Visit the Xiph.org Foundation at http://www.xiph.org/\n"
 msgstr ""
@@ -5271,7 +5015,23 @@
 msgid "General Plugin Settings:"
 msgstr "ОÑновные наÑтройки модулÑ"
 
-#: src/wma/wma.c:132
+#: src/wavpack/ui.cxx:502
+msgid "ReplayGain Settings:"
+msgstr "ÐаÑтройки ReplayGain:"
+
+#: src/wavpack/ui.cxx:520
+msgid "ReplayGain Type:"
+msgstr "Тип ReplayGain:"
+
+#: src/wavpack/ui.cxx:531
+msgid "use Track Gain/Peak"
+msgstr "иÑпользовать Gain/Peak Дорожки"
+
+#: src/wavpack/ui.cxx:539
+msgid "use Album Gain/Peak"
+msgstr "иÑпользовать Gain/Peak Ðльбома"
+
+#: src/wma/wma.c:123
 msgid ""
 "Adapted for use in Audacious by Tony Vroon (chainsaw@gentoo.org) from\n"
 "the BEEP-WMA plugin which is Copyright (C) 2004,2005 Mokrushin I.V. aka "
@@ -5281,6 +5041,31 @@
 "This plugin based on source code "
 msgstr ""
 
+#~ msgid "Dither output when rounding to 16-bit"
+#~ msgstr "Размыть вывод при округлении до 16 бит"
+
+#, fuzzy
+#~ msgid "Base gain (dB):"
+#~ msgstr "УÑиление по-умолачнию (дБ):"
+
+#~ msgid "Enable ReplayGain processing"
+#~ msgstr "Включить ReplayGain"
+
+#, fuzzy
+#~ msgid "Enable peak info clip prevention"
+#~ msgstr "Включить предотвращение ÑрезаниÑ"
+
+#, fuzzy
+#~ msgid "Enable adaptive scaler clip prevention"
+#~ msgstr "Включить предотвращение ÑрезаниÑ"
+
+#, fuzzy
+#~ msgid "Gain Control"
+#~ msgstr "РегулÑтор громкоÑти:"
+
+#~ msgid "Enable 6dB Boost + Hard Limiting"
+#~ msgstr "Включить уÑиление на 6dB + жёÑткое ограничение"
+
 #~ msgid "<b>Playback:</b>"
 #~ msgstr "<b>ВоÑпроизведение:</b>"
 
--- a/po/sk.po	Fri Jun 13 04:58:39 2008 +0300
+++ b/po/sk.po	Fri Jun 13 05:57:25 2008 +0300
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: audacious-plugins\n"
 "Report-Msgid-Bugs-To: http://bugs.audacious-media-player.org\n"
-"POT-Creation-Date: 2008-02-03 20:33+0200\n"
+"POT-Creation-Date: 2008-03-30 17:25+0200\n"
 "PO-Revision-Date: 2007-03-14 02:18+0100\n"
 "Last-Translator: Andrej Herceg <herceg.andrej@zoznam.sk>\n"
 "Language-Team: \n"
@@ -36,22 +36,22 @@
 #: src/adplug/adplug-xmms.cc:265 src/adplug/adplug-xmms.cc:526
 #: src/alac/plugin.c:77 src/arts/arts.c:26 src/arts/configure.c:90
 #: src/audiocompress/audacious-glue.c:102
-#: src/audiocompress/audacious-glue.c:552 src/cdaudio-ng/configure.c:227
-#: src/console/Audacious_Driver.cxx:449 src/demac/plugin.c:392
+#: src/audiocompress/audacious-glue.c:552 src/cdaudio-ng/configure.c:228
+#: src/console/Audacious_Driver.cxx:449 src/demac/plugin.c:393
 #: src/echo_plugin/gui.c:26 src/echo_plugin/gui.c:137 src/esd/about.c:49
 #: src/filewriter/filewriter.c:183 src/jack/configure.c:141
-#: src/jack/jack.c:493 src/madplug/plugin.c:600 src/madplug/plugin.c:624
+#: src/jack/jack.c:456 src/madplug/plugin.c:542 src/madplug/plugin.c:566
 #: src/metronom/metronom.c:88 src/modplug/gui/main.cxx:49
 #: src/musepack/libmpc.cxx:232 src/null/null.c:67 src/null/null.c:110
 #: src/OSS4/about.c:59 src/OSS/about.c:54 src/paranormal-ng/plugin.c:283
 #: src/paranormal/plugin.c:291 src/scrobbler/gtkstuff.c:25
-#: src/sndfile/plugin.c:565 src/statusicon/si_ui.c:593
+#: src/sndfile/plugin.c:565 src/statusicon/si_ui.c:628
 #: src/stereo_plugin/stereo.c:53 src/stereo_plugin/stereo.c:116
 #: src/sun/about.c:38 src/sun/configure.c:559 src/timidity/interface.c:222
 #: src/timidity/xmms-timidity.c:120 src/tonegen/tonegen.c:62
 #: src/tta/libtta.c:153 src/tta/libtta.c:267 src/tta/libtta.c:402
-#: src/vorbis/vorbis.c:769 src/vorbis/vorbis.c~:777 src/vtx/about.c:32
-#: src/vtx/info.c:43 src/wavpack/ui.cxx:56 src/wavpack/ui.cxx:556
+#: src/vorbis/vorbis.c:700 src/vtx/about.c:32 src/vtx/info.c:43
+#: src/wavpack/ui.cxx:56 src/wavpack/ui.cxx:556
 msgid "Ok"
 msgstr "OK"
 
@@ -87,7 +87,7 @@
 
 #: src/adplug/adplug-xmms.cc:275 src/alarm/interface.c:1398
 #: src/alsa/configure.c:389 src/arts/configure.c:91
-#: src/audiocompress/audacious-glue.c:557 src/cdaudio-ng/configure.c:231
+#: src/audiocompress/audacious-glue.c:557 src/cdaudio-ng/configure.c:232
 #: src/echo_plugin/gui.c:145 src/jack/configure.c:148
 #: src/modplug/gui/interface.cxx:714 src/modplug/gui/modplug.glade:1668
 #: src/musepack/libmpc.cxx:237 src/musepack/libmpc.cxx:557 src/null/null.c:111
@@ -98,7 +98,7 @@
 msgstr "Zrušiť"
 
 #: src/adplug/adplug-xmms.cc:291 src/console/Audacious_Config.cxx:145
-#: src/madplug/configure.c:421 src/modplug/gui/interface.cxx:628
+#: src/madplug/configure.c:290 src/modplug/gui/interface.cxx:628
 #: src/modplug/gui/interface.cxx:887 src/modplug/gui/modplug.glade:1404
 #: src/modplug/gui/modplug.glade:1804
 msgid "General"
@@ -129,13 +129,13 @@
 msgid "Channels"
 msgstr "PoÄet kanálov"
 
-#: src/adplug/adplug-xmms.cc:325 src/filewriter/mp3.c:894
+#: src/adplug/adplug-xmms.cc:325 src/filewriter/mp3.c:900
 #: src/sid/xmms-sid.glade:157 src/sid/xs_interface.c:288
 #: src/timidity/interface.c:165
 msgid "Mono"
 msgstr "Mono"
 
-#: src/adplug/adplug-xmms.cc:330 src/filewriter/mp3.c:889
+#: src/adplug/adplug-xmms.cc:330 src/filewriter/mp3.c:895
 #: src/modplug/gui/interface.cxx:204 src/modplug/gui/modplug.glade:159
 #: src/sid/xmms-sid.glade:176 src/sid/xs_interface.c:295
 #: src/timidity/interface.c:173
@@ -313,7 +313,7 @@
 
 #: src/alarm/interface.c:71 src/lirc/about.c:115
 #: src/modplug/gui/interface.cxx:971 src/modplug/gui/modplug.glade:2030
-#: src/sid/xmms-sid.glade:3643 src/sid/xs_about.c:213
+#: src/sid/xmms-sid.glade:3643 src/sid/xs_about.c:214
 #: src/sid/xs_interface.c:1740
 msgid "Close"
 msgstr "Zatvoriť"
@@ -327,10 +327,10 @@
 msgstr ""
 
 #: src/alarm/interface.c:124 src/alarm/interface.c:1389 src/alsa/about.c:46
-#: src/alsa/configure.c:383 src/cdaudio-ng/cdaudio-ng.c:228
-#: src/flacng/plugin.c:747 src/gnomeshortcuts/gnomeshortcuts.c:292
+#: src/alsa/configure.c:383 src/cdaudio-ng/cdaudio-ng.c:247
+#: src/flacng/plugin.c:706 src/gnomeshortcuts/gnomeshortcuts.c:311
 #: src/hotkey/gui.c:671 src/modplug/gui/interface.cxx:702
-#: src/modplug/gui/modplug.glade:1642 src/pulse_audio/pulse_audio.c:712
+#: src/modplug/gui/modplug.glade:1642 src/pulse_audio/pulse_audio.c:738
 #: src/scrobbler/gtkstuff.c:45 src/sid/xmms-sid.glade:3066
 #: src/sid/xs_interface.c:1243
 msgid "OK"
@@ -1724,7 +1724,7 @@
 msgid "Trigger"
 msgstr "SpúšťaÄ"
 
-#: src/aosd/aosd_ui.c:1076 src/cdaudio-ng/configure.c:166
+#: src/aosd/aosd_ui.c:1076 src/cdaudio-ng/configure.c:167
 #: src/modplug/gui/interface.cxx:688 src/modplug/gui/modplug.glade:1603
 #: src/sid/xmms-sid.glade:3026 src/sid/xs_interface.c:1229
 #, fuzzy
@@ -1924,16 +1924,20 @@
 msgid "Options:"
 msgstr "Nastavenia:"
 
-#: src/cdaudio-ng/cdaudio-ng.c:198
+#: src/cdaudio-ng/cdaudio-ng.c:204
+msgid "Rescan CD"
+msgstr ""
+
+#: src/cdaudio-ng/cdaudio-ng.c:217
 msgid "Add CD"
 msgstr ""
 
-#: src/cdaudio-ng/cdaudio-ng.c:223
+#: src/cdaudio-ng/cdaudio-ng.c:242
 #, fuzzy
 msgid "About CD Audio Plugin NG"
 msgstr "O module LIRC pre Audacious"
 
-#: src/cdaudio-ng/cdaudio-ng.c:224
+#: src/cdaudio-ng/cdaudio-ng.c:243
 msgid ""
 "Copyright (c) 2007, by Calin Crisan <ccrisan@gmail.com> and The Audacious "
 "Team.\n"
@@ -1946,58 +1950,58 @@
 "This was a Google Summer of Code 2007 project."
 msgstr ""
 
-#: src/cdaudio-ng/cdaudio-ng.c:627
+#: src/cdaudio-ng/cdaudio-ng.c:814
 msgid ""
 "<b><big>No playable CD found.</big></b>\n"
 "\n"
 "No CD inserted, or inserted CD is not an audio CD.\n"
 msgstr ""
 
-#: src/cdaudio-ng/configure.c:146
+#: src/cdaudio-ng/configure.c:147
 #, fuzzy
 msgid "CD Audio Plugin Configuration"
 msgstr "Nastavenie modulu MPEG Audio"
 
-#: src/cdaudio-ng/configure.c:156
+#: src/cdaudio-ng/configure.c:157
 msgid "Digital audio extraction"
 msgstr "Digitálne"
 
-#: src/cdaudio-ng/configure.c:161
+#: src/cdaudio-ng/configure.c:162
 #, fuzzy
 msgid "Title information"
 msgstr "Formát názvu:"
 
-#: src/cdaudio-ng/configure.c:178
+#: src/cdaudio-ng/configure.c:179
 msgid "Limit read speed to: "
 msgstr ""
 
-#: src/cdaudio-ng/configure.c:185
+#: src/cdaudio-ng/configure.c:186
 msgid "Use cd-text if available"
 msgstr ""
 
-#: src/cdaudio-ng/configure.c:189
+#: src/cdaudio-ng/configure.c:190
 msgid "Use CDDB if available"
 msgstr ""
 
-#: src/cdaudio-ng/configure.c:193
+#: src/cdaudio-ng/configure.c:194
 #, fuzzy
 msgid "Server: "
 msgstr "Server"
 
-#: src/cdaudio-ng/configure.c:196
+#: src/cdaudio-ng/configure.c:197
 #, fuzzy
 msgid "Port: "
 msgstr "Port:"
 
-#: src/cdaudio-ng/configure.c:202
+#: src/cdaudio-ng/configure.c:203
 msgid "Use HTTP instead of CDDBP"
 msgstr ""
 
-#: src/cdaudio-ng/configure.c:210
+#: src/cdaudio-ng/configure.c:211
 msgid "Override default device: "
 msgstr ""
 
-#: src/cdaudio-ng/configure.c:217
+#: src/cdaudio-ng/configure.c:218
 msgid "Print debug information"
 msgstr ""
 
@@ -2074,12 +2078,12 @@
 "Pre Audiacious upravili: William Pitcock <nenolod@nenolod.net>,\n"
 "        Shay Green <gblargg@gmail.com>"
 
-#: src/demac/plugin.c:387
+#: src/demac/plugin.c:388
 #, fuzzy
 msgid "About Monkey's Audio Plugin"
 msgstr "Modul MPEG Audio"
 
-#: src/demac/plugin.c:388
+#: src/demac/plugin.c:389
 msgid ""
 "Copyright (C) 2007 Eugene Zagidullin <e.asphyx@gmail.com>\n"
 "Based on ffape decoder, Copyright (C) 2007 Benjamin Zores\n"
@@ -2395,7 +2399,7 @@
 "Okno s prepojeniami pre nedetekované zariadenie sa nedá otvoriť.\n"
 "Uistite sa, že zariadenie je správne pripojené."
 
-#: src/evdev-plug/ed_ui.c:319 src/madplug/plugin.c:624
+#: src/evdev-plug/ed_ui.c:319 src/madplug/plugin.c:566
 msgid "Error"
 msgstr "Chyba"
 
@@ -2637,16 +2641,16 @@
 msgid "Prepend track number to filename"
 msgstr ""
 
-#: src/filewriter/mp3.c:670
+#: src/filewriter/mp3.c:676
 #, fuzzy
 msgid "MP3 Configuration"
 msgstr "Nastavenia Flac"
 
-#: src/filewriter/mp3.c:697
+#: src/filewriter/mp3.c:703
 msgid "Algorithm Quality:"
 msgstr ""
 
-#: src/filewriter/mp3.c:719
+#: src/filewriter/mp3.c:725
 msgid ""
 "best/slowest:0;\n"
 "worst/fastest:9;\n"
@@ -2654,171 +2658,171 @@
 "default:5;"
 msgstr ""
 
-#: src/filewriter/mp3.c:727
+#: src/filewriter/mp3.c:733
 #, fuzzy
 msgid "Output Samplerate:"
 msgstr "Vzorkovacia frekvencia:"
 
-#: src/filewriter/mp3.c:738 src/filewriter/mp3.c:879
+#: src/filewriter/mp3.c:744 src/filewriter/mp3.c:885
 #, fuzzy
 msgid "Auto"
 msgstr "O "
 
-#: src/filewriter/mp3.c:760
+#: src/filewriter/mp3.c:766
 #, fuzzy
 msgid "(Hz)"
 msgstr "Hz"
 
-#: src/filewriter/mp3.c:772
+#: src/filewriter/mp3.c:778
 #, fuzzy
 msgid "Bitrate / Compression ratio:"
 msgstr ""
 "Priemerný dátový tok: %.1f kb/s\n"
 "Kompresný pomer: %.1f%%"
 
-#: src/filewriter/mp3.c:798
+#: src/filewriter/mp3.c:804
 #, fuzzy
 msgid "Bitrate (kbps):"
 msgstr "Dátový tok:"
 
-#: src/filewriter/mp3.c:839
+#: src/filewriter/mp3.c:845
 msgid "Compression ratio:"
 msgstr ""
 
-#: src/filewriter/mp3.c:869
+#: src/filewriter/mp3.c:875
 #, fuzzy
 msgid "Audio Mode:"
 msgstr "Zvukové zariadenie:"
 
-#: src/filewriter/mp3.c:884
+#: src/filewriter/mp3.c:890
 #, fuzzy
 msgid "Joint-Stereo"
 msgstr "Stereo"
 
-#: src/filewriter/mp3.c:925
+#: src/filewriter/mp3.c:931
 msgid "auto-M/S mode"
 msgstr ""
 
-#: src/filewriter/mp3.c:937
+#: src/filewriter/mp3.c:943
 #, fuzzy
 msgid "Misc:"
 msgstr "Disko"
 
-#: src/filewriter/mp3.c:948
+#: src/filewriter/mp3.c:954
 msgid "Enforce strict ISO complience"
 msgstr ""
 
-#: src/filewriter/mp3.c:959
+#: src/filewriter/mp3.c:965
 msgid "Error protection"
 msgstr ""
 
-#: src/filewriter/mp3.c:971
+#: src/filewriter/mp3.c:977
 msgid "Adds 16 bit checksum to every frame"
 msgstr ""
 
-#: src/filewriter/mp3.c:976 src/filewriter/vorbis.c:274
+#: src/filewriter/mp3.c:982 src/filewriter/vorbis.c:274
 #: src/modplug/gui/interface.cxx:319 src/modplug/gui/modplug.glade:507
 msgid "Quality"
 msgstr ""
 
-#: src/filewriter/mp3.c:988
+#: src/filewriter/mp3.c:994
 msgid "Enable VBR/ABR"
 msgstr ""
 
-#: src/filewriter/mp3.c:1000
+#: src/filewriter/mp3.c:1006
 msgid "Type:"
 msgstr ""
 
-#: src/filewriter/mp3.c:1011
+#: src/filewriter/mp3.c:1017
 msgid "Variable bitrate"
 msgstr ""
 
-#: src/filewriter/mp3.c:1023
+#: src/filewriter/mp3.c:1029
 msgid "Average bitrate"
 msgstr ""
 
-#: src/filewriter/mp3.c:1037
+#: src/filewriter/mp3.c:1043
 #, fuzzy
 msgid "VBR Options:"
 msgstr "Nastavenia:"
 
-#: src/filewriter/mp3.c:1053
+#: src/filewriter/mp3.c:1059
 #, fuzzy
 msgid "Minimum bitrate (kbps):"
 msgstr "Dátový tok:"
 
-#: src/filewriter/mp3.c:1089
+#: src/filewriter/mp3.c:1095
 msgid "Maximum bitrate (kbps):"
 msgstr ""
 
-#: src/filewriter/mp3.c:1121
+#: src/filewriter/mp3.c:1127
 msgid "Strictly enforce minimum bitrate"
 msgstr ""
 
-#: src/filewriter/mp3.c:1123
+#: src/filewriter/mp3.c:1129
 msgid ""
 "For use with players that do not support low bitrate mp3 (Apex AD600-A DVD/"
 "mp3 player)"
 msgstr ""
 
-#: src/filewriter/mp3.c:1136
+#: src/filewriter/mp3.c:1142
 #, fuzzy
 msgid "ABR Options:"
 msgstr "Nastavenia:"
 
-#: src/filewriter/mp3.c:1146
+#: src/filewriter/mp3.c:1152
 msgid "Average bitrate (kbps):"
 msgstr ""
 
-#: src/filewriter/mp3.c:1183
+#: src/filewriter/mp3.c:1189
 msgid "VBR quality level:"
 msgstr ""
 
-#: src/filewriter/mp3.c:1198
+#: src/filewriter/mp3.c:1204
 msgid ""
 "highest:0;\n"
 "lowest:9;\n"
 "default:4;"
 msgstr ""
 
-#: src/filewriter/mp3.c:1206
+#: src/filewriter/mp3.c:1212
 msgid "Don't write Xing VBR header"
 msgstr ""
 
-#: src/filewriter/mp3.c:1221
+#: src/filewriter/mp3.c:1227
 msgid "VBR/ABR"
 msgstr ""
 
-#: src/filewriter/mp3.c:1233
+#: src/filewriter/mp3.c:1239
 msgid "Frame params:"
 msgstr ""
 
-#: src/filewriter/mp3.c:1245
+#: src/filewriter/mp3.c:1251
 msgid "Mark as copyright"
 msgstr ""
 
-#: src/filewriter/mp3.c:1256
+#: src/filewriter/mp3.c:1262
 msgid "Mark as original"
 msgstr ""
 
-#: src/filewriter/mp3.c:1268
+#: src/filewriter/mp3.c:1274
 #, fuzzy
 msgid "ID3 params:"
 msgstr "Formát ID3:"
 
-#: src/filewriter/mp3.c:1279
+#: src/filewriter/mp3.c:1285
 msgid "Force addition of version 2 tag"
 msgstr ""
 
-#: src/filewriter/mp3.c:1289
+#: src/filewriter/mp3.c:1295
 msgid "Only add v1 tag"
 msgstr ""
 
-#: src/filewriter/mp3.c:1296
+#: src/filewriter/mp3.c:1302
 msgid "Only add v2 tag"
 msgstr ""
 
-#: src/filewriter/mp3.c:1317
+#: src/filewriter/mp3.c:1323
 #, fuzzy
 msgid "Tags"
 msgstr "ZnaÄka"
@@ -2832,12 +2836,12 @@
 msgid "Quality level (0 - 10):"
 msgstr ""
 
-#: src/flacng/plugin.c:739
+#: src/flacng/plugin.c:698
 #, fuzzy
 msgid "FLAC Audio Plugin "
 msgstr "Modul Flac Audio"
 
-#: src/flacng/plugin.c:740
+#: src/flacng/plugin.c:699
 msgid ""
 "\n"
 "\n"
@@ -2847,22 +2851,22 @@
 "http://www.skytale.net/projects/bmp-flac2/"
 msgstr ""
 
-#: src/flacng/plugin.c:745
+#: src/flacng/plugin.c:704
 #, fuzzy
 msgid "About FLAC Audio Plugin"
 msgstr "Modul Flac Audio"
 
-#: src/gnomeshortcuts/gnomeshortcuts.c:287
+#: src/gnomeshortcuts/gnomeshortcuts.c:306
 #, fuzzy
 msgid "About Gnome Shortcut Plugin"
 msgstr "O module ESounD"
 
-#: src/gnomeshortcuts/gnomeshortcuts.c:288
+#: src/gnomeshortcuts/gnomeshortcuts.c:307
 msgid ""
 "Gnome Shortcut Plugin\n"
 "Let's you control the player with Gnome's shortcuts.\n"
 "\n"
-"Copyright (C) 2007 Sascha Hlusiak <contact@saschahlusiak.de>\n"
+"Copyright (C) 2007-2008 Sascha Hlusiak <contact@saschahlusiak.de>\n"
 "\n"
 msgstr ""
 
@@ -3016,12 +3020,12 @@
 msgid "Enable debug printing"
 msgstr "Povoliť rozptýlenie"
 
-#: src/jack/jack.c:95
+#: src/jack/jack.c:84
 #, fuzzy
 msgid "Sample rate mismatch"
 msgstr "Vzorkovacia frekvencia:"
 
-#: src/jack/jack.c:98
+#: src/jack/jack.c:87
 msgid ""
 "Xmms is asking for a sample rate that differs from\n"
 " that of the jack server.  Xmms 1.2.8 or later\n"
@@ -3035,15 +3039,15 @@
 "Chris Morgan <cmorgan@alum.wpi.edu>\n"
 msgstr ""
 
-#: src/jack/jack.c:111 src/wma/wma.c:157
+#: src/jack/jack.c:100 src/wma/wma.c:148
 msgid " Close "
 msgstr " Zatvoriť "
 
-#: src/jack/jack.c:489
+#: src/jack/jack.c:452
 msgid "About JACK Output Plugin 0.17"
 msgstr "O výstupnom module JACK 0.17"
 
-#: src/jack/jack.c:490
+#: src/jack/jack.c:453
 msgid ""
 "XMMS jack Driver 0.17\n"
 "\n"
@@ -3194,115 +3198,59 @@
 msgid "%s: will try reconnect every %d seconds...\n"
 msgstr ""
 
-#: src/madplug/configure.c:332
+#: src/madplug/configure.c:209
 msgid "MPEG Audio Plugin Configuration"
 msgstr "Nastavenie modulu MPEG Audio"
 
-#: src/madplug/configure.c:349
+#: src/madplug/configure.c:226
 #, fuzzy
 msgid "Audio Settings"
 msgstr "Nastavenia mixéru:"
 
-#: src/madplug/configure.c:358
-msgid "Dither output when rounding to 16-bit"
-msgstr "Pri zaokrúhľovaní výstupu na 16 bitov výstup rozptýliť"
-
-#: src/madplug/configure.c:365
+#: src/madplug/configure.c:234
 msgid "Force reopen audio when audio type changed"
 msgstr ""
 
-#: src/madplug/configure.c:374
+#: src/madplug/configure.c:243
 #, fuzzy
 msgid "Metadata Settings"
 msgstr "Nastavenia mixéru:"
 
-#: src/madplug/configure.c:383
+#: src/madplug/configure.c:252
 msgid "Enable fast play-length calculation"
 msgstr "PovoliÅ¥ rýchly výpoÄet dĺžky hrania"
 
-#: src/madplug/configure.c:390
+#: src/madplug/configure.c:259
 msgid "Parse XING headers"
 msgstr "SpracovaÅ¥ XING hlaviÄky"
 
-#: src/madplug/configure.c:397
+#: src/madplug/configure.c:266
 msgid "Use SJIS to write ID3 tags (not recommended)"
 msgstr ""
 
-#: src/madplug/configure.c:404
+#: src/madplug/configure.c:273
 #, fuzzy
 msgid "Miscellaneous Settings"
 msgstr "Nastavenia mixéru:"
 
-#: src/madplug/configure.c:413
+#: src/madplug/configure.c:282
 msgid "Display average bitrate for VBR"
 msgstr ""
 
-#: src/madplug/configure.c:432
-#, fuzzy
-msgid "Base gain (dB):"
-msgstr "Štandardné zosilnenie (dB):"
-
-#: src/madplug/configure.c:446 src/musepack/libmpc.cxx:190
-#, fuzzy
-msgid "ReplayGain Settings"
-msgstr "Nastavenia zosilnenia prehrávania:"
-
-#: src/madplug/configure.c:457
-msgid "Enable ReplayGain processing"
-msgstr "Pri prehrávaní zapnúť zosilnenie"
-
-#: src/madplug/configure.c:467 src/musepack/libmpc.cxx:207
-#, fuzzy
-msgid "ReplayGain Type"
-msgstr "Typ zosilnenia:"
-
-#: src/madplug/configure.c:477 src/musepack/libmpc.cxx:215
-#, fuzzy
-msgid "Use Track Gain"
-msgstr "použiť zosilnenie podľa vrcholu v skladbe"
-
-#: src/madplug/configure.c:485 src/musepack/libmpc.cxx:219
-#, fuzzy
-msgid "Use Album Gain"
-msgstr "použiť zosilnenie podľa vrcholu na albume"
-
-#: src/madplug/configure.c:498
-msgid "Pre-gain with RG info (dB):"
-msgstr ""
-
-#: src/madplug/configure.c:514
-msgid "Pre-gain without RG info (dB):"
-msgstr ""
-
-#: src/madplug/configure.c:530
-#, fuzzy
-msgid "Enable peak info clip prevention"
-msgstr "Povoliť prevenciu orezania"
-
-#: src/madplug/configure.c:552
-#, fuzzy
-msgid "Enable adaptive scaler clip prevention"
-msgstr "Povoliť prevenciu orezania"
-
-#: src/madplug/configure.c:561
-#, fuzzy
-msgid "Gain Control"
-msgstr "Ovládanie hlasitosti:"
-
-#: src/madplug/configure.c:569 src/vorbis/configure.c:135
+#: src/madplug/configure.c:296 src/vorbis/configure.c:102
 msgid "Override generic titles"
 msgstr "Používať vlastný formát názvu"
 
-#: src/madplug/configure.c:581
+#: src/madplug/configure.c:308
 msgid "ID3 format:"
 msgstr "Formát ID3:"
 
-#: src/madplug/configure.c:593 src/sid/xmms-sid.glade:2540
-#: src/sid/xs_interface.c:1070 src/vorbis/configure.c:158
+#: src/madplug/configure.c:320 src/sid/xmms-sid.glade:2540
+#: src/sid/xs_interface.c:1070
 msgid "Title"
 msgstr "Názov"
 
-#: src/madplug/plugin.c:582
+#: src/madplug/plugin.c:524
 #, c-format
 msgid ""
 "Audacious MPEG Audio Plugin\n"
@@ -3320,7 +3268,7 @@
 "    Samuel Krempp"
 msgstr ""
 
-#: src/madplug/plugin.c:598
+#: src/madplug/plugin.c:540
 #, fuzzy
 msgid "About MPEG Audio Plugin"
 msgstr "Modul MPEG Audio"
@@ -3630,18 +3578,35 @@
 msgid "Plugin"
 msgstr "Modul LIRC"
 
-#: src/musepack/libmpc.cxx:197 src/vorbis/configure.c:170
-#: src/wavpack/ui.cxx:510
+#: src/musepack/libmpc.cxx:190
+#, fuzzy
+msgid "ReplayGain Settings"
+msgstr "Nastavenia zosilnenia prehrávania:"
+
+#: src/musepack/libmpc.cxx:197 src/wavpack/ui.cxx:510
 msgid "Enable Clipping Prevention"
 msgstr "Povoliť prevenciu orezania"
 
-#: src/musepack/libmpc.cxx:202 src/vorbis/configure.c:175
-#: src/wavpack/ui.cxx:515
+#: src/musepack/libmpc.cxx:202 src/wavpack/ui.cxx:515
 msgid "Enable ReplayGain"
 msgstr "Zapnúť zosilnenie pri prehrávaní"
 
-#: src/musepack/libmpc.cxx:224 src/vorbis/configure.c:219
-#: src/wavpack/ui.cxx:547
+#: src/musepack/libmpc.cxx:207
+#, fuzzy
+msgid "ReplayGain Type"
+msgstr "Typ zosilnenia:"
+
+#: src/musepack/libmpc.cxx:215
+#, fuzzy
+msgid "Use Track Gain"
+msgstr "použiť zosilnenie podľa vrcholu v skladbe"
+
+#: src/musepack/libmpc.cxx:219
+#, fuzzy
+msgid "Use Album Gain"
+msgstr "použiť zosilnenie podľa vrcholu na albume"
+
+#: src/musepack/libmpc.cxx:224 src/wavpack/ui.cxx:547
 msgid "ReplayGain"
 msgstr "Zosilnenie prehrávanie"
 
@@ -3904,12 +3869,16 @@
 msgid "Volume controls Master not PCM"
 msgstr "Hlasitosť je ovládaná kanálom Master a nie PCM"
 
-#: src/pulse_audio/pulse_audio.c:696
+#: src/projectm-1.0/main.c:70
+msgid "_Random"
+msgstr ""
+
+#: src/pulse_audio/pulse_audio.c:722
 #, fuzzy
 msgid "About Audacious PulseAudio Output Plugin"
 msgstr "Základný zvukový výstupný modul"
 
-#: src/pulse_audio/pulse_audio.c:697
+#: src/pulse_audio/pulse_audio.c:723
 #, fuzzy
 msgid ""
 "Audacious PulseAudio Output Plugin\n"
@@ -3992,36 +3961,6 @@
 msgid "Scrobbler Error"
 msgstr "Modul Scrobbler"
 
-#: src/sid/xmms-sid.c:203
-msgid "Error initializing song-length database!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:209
-msgid "Error initializing STIL database!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:347
-msgid "Couldn't allocate memory for audio data buffer!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:355
-msgid "Couldn't allocate memory for audio oversampling buffer!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:371
-#, c-format
-msgid "Couldn't initialize SID-tune '%s' (sub-tune #%i)!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:382
-#, c-format
-msgid "Couldn't open XMMS audio output (fmt=%x, freq=%i, nchan=%i)!\n"
-msgstr ""
-
-#: src/sid/xmms-sid.c:432
-msgid "Oversampling rate-conversion pass failed.\n"
-msgstr ""
-
 #: src/sid/xmms-sid.glade:8 src/sid/xs_interface.c:221
 #, fuzzy
 msgid "Audacious-SID configuration"
@@ -4586,19 +4525,11 @@
 msgid "No"
 msgstr "Žiadne"
 
-#: src/sid/xs_about.c:84 src/wma/wma.c:130
+#: src/sid/xs_about.c:84 src/wma/wma.c:121
 #, c-format
 msgid "About %s"
 msgstr "O %s"
 
-#: src/sid/xs_config.c:580
-msgid "Allocation of sid2FilterPresets structure failed!\n"
-msgstr ""
-
-#: src/sid/xs_config.c:908
-msgid "Warning: Could not set filter curve widget points!\n"
-msgstr ""
-
 #: src/sid/xs_fileinfo.c:232
 #, fuzzy
 msgid "General info"
@@ -4609,176 +4540,6 @@
 msgid "Tune #%i: "
 msgstr ""
 
-#: src/sid/xs_length.c:113
-msgid "Error allocating new node. Fatal error.\n"
-msgstr ""
-
-#: src/sid/xs_length.c:128
-#, c-format
-msgid "'=' expected on column #%d.\n"
-msgstr ""
-
-#: src/sid/xs_length.c:153
-msgid "Could not allocate memory for node.\n"
-msgstr ""
-
-#: src/sid/xs_length.c:204
-#, c-format
-msgid "Could not open SongLengthDB '%s'\n"
-msgstr ""
-
-#: src/sid/xs_length.c:224
-#, c-format
-msgid "Invalid MD5-hash in SongLengthDB file '%s' line #%d!\n"
-msgstr ""
-
-#: src/sid/xs_length.c:231
-#, c-format
-msgid "Invalid entry in SongLengthDB file '%s' line #%d!\n"
-msgstr ""
-
-#: src/sid/xs_length.c:236
-#, c-format
-msgid "Invalid line in SongLengthDB file '%s' line #%d\n"
-msgstr ""
-
-#: src/sid/xs_length.c:398
-#, c-format
-msgid "Not a PSID or RSID file '%s'\n"
-msgstr ""
-
-#: src/sid/xs_length.c:417
-#, c-format
-msgid "Error reading SID file header from '%s'\n"
-msgstr ""
-
-#: src/sid/xs_length.c:436
-#, c-format
-msgid "Error allocating temp data buffer for file '%s'\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:96
-msgid "[SIDPlay1] Could not initialize emulation engine.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:103
-msgid "[SIDPlay1] Endianess verification failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:238
-msgid "[SIDPlay1] Emulator engine configuration failed!\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:245
-msgid "[SIDPlay1] Could not initialize SIDTune object.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:291
-msgid ""
-"[SIDPlay1] SID-tune struct pointer was NULL. This should not happen, report "
-"to XMMS-SID author.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay1.cc:296
-msgid ""
-"[SIDPlay1] SID-tune status check failed. This should not happen, report to "
-"XMMS-SID author.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:101
-msgid "[SIDPlay2] Could not initialize emulation engine.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:208
-#, c-format
-msgid "[SIDPlay2] Invalid number of filter curve points (%d > %d)\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:229
-msgid "reSID->create() failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:235
-#, c-format
-msgid "reSID->filter(%d) failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:243
-#, c-format
-msgid "reSID->sampling(%d) failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:253
-msgid "reSID->filter(NULL) failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:267
-msgid "hardSID->create() failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:273
-#, c-format
-msgid "hardSID->filter(%d) failed.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:281
-msgid "[SIDPlay2] Could not initialize SIDBuilder object.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:295
-#, c-format
-msgid "[SIDPlay2] Invalid clockSpeed=%d, falling back to PAL.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:319
-#, c-format
-msgid "Invalid sid2OptLevel=%d, falling back to %d.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:343
-msgid "[SIDPlay2] Emulator engine configuration failed!\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:350
-msgid "[SIDPlay2] Could not initialize SIDTune object.\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:401
-msgid "[SIDPlay2] currTune->selectSong() failed\n"
-msgstr ""
-
-#: src/sid/xs_sidplay2.cc:406
-msgid "[SIDPlay2] currEng->load() failed\n"
-msgstr ""
-
-#: src/sid/xs_slsup.c:217
-#, c-format
-msgid "Could not allocate memory for t_xs_tuneinfo ('%s')\n"
-msgstr ""
-
-#: src/sid/xs_slsup.c:224
-#, c-format
-msgid "Could not allocate sidFilename ('%s')\n"
-msgstr ""
-
-#: src/sid/xs_slsup.c:233
-#, c-format
-msgid "Could not allocate memory for t_xs_subtuneinfo ('%s', %i)\n"
-msgstr ""
-
-#: src/sid/xs_stil.c:46
-msgid "SubTune pointer structure realloc failed.\n"
-msgstr ""
-
-#: src/sid/xs_stil.c:69
-msgid "SubTune structure malloc failed!\n"
-msgstr ""
-
-#: src/sid/xs_stil.c:176
-#, c-format
-msgid "Could not open STILDB '%s'\n"
-msgstr ""
-
 #: src/sndfile/plugin.c:548
 #, fuzzy
 msgid "About sndfile plugin"
@@ -4933,11 +4694,11 @@
 msgid "The orientation of the tray"
 msgstr "Orientácia oznamovacej oblasti"
 
-#: src/statusicon/si_ui.c:587
+#: src/statusicon/si_ui.c:622
 msgid "About Status Icon Plugin"
 msgstr "O module Stavová ikona"
 
-#: src/statusicon/si_ui.c:589
+#: src/statusicon/si_ui.c:624
 msgid ""
 "\n"
 "written by Giacomo Lozito < james@develia.org >\n"
@@ -4951,36 +4712,36 @@
 "Tento modul poskytuje stavovú ikonu umiestnenú\n"
 "v oznamovacej oblasti správcu okien.\n"
 
-#: src/statusicon/si_ui.c:661
+#: src/statusicon/si_ui.c:696
 #, fuzzy
 msgid "Status Icon Plugin - Preferences"
 msgstr "O module Stavová ikona"
 
-#: src/statusicon/si_ui.c:672
+#: src/statusicon/si_ui.c:707
 msgid "Right-Click Menu"
 msgstr ""
 
-#: src/statusicon/si_ui.c:677
+#: src/statusicon/si_ui.c:712
 msgid "Audacious standard menu"
 msgstr ""
 
-#: src/statusicon/si_ui.c:682
+#: src/statusicon/si_ui.c:717
 msgid "Small playback menu #1"
 msgstr ""
 
-#: src/statusicon/si_ui.c:687
+#: src/statusicon/si_ui.c:722
 msgid "Small playback menu #2"
 msgstr ""
 
-#: src/statusicon/si_ui.c:710
+#: src/statusicon/si_ui.c:745
 msgid "Mouse Scroll Action"
 msgstr ""
 
-#: src/statusicon/si_ui.c:715
+#: src/statusicon/si_ui.c:750
 msgid "Change volume"
 msgstr ""
 
-#: src/statusicon/si_ui.c:720
+#: src/statusicon/si_ui.c:755
 msgid "Change playing song"
 msgstr ""
 
@@ -5101,12 +4862,12 @@
 "napr. na prehranie tónov o frekvencii 2000Hz a 2005Hz zadajte "
 "tone://2000;2005"
 
-#: src/tonegen/tonegen.c:168
+#: src/tonegen/tonegen.c:167
 #, c-format
 msgid "%s %.1f Hz"
 msgstr ""
 
-#: src/tonegen/tonegen.c:168
+#: src/tonegen/tonegen.c:167
 msgid "Tone Generator: "
 msgstr "Generátor tónov:"
 
@@ -5169,43 +4930,24 @@
 msgid "Track number:"
 msgstr "Číslo stopy:"
 
-#: src/vorbis/configure.c:115
+#: src/vorbis/configure.c:84
 msgid "Ogg Vorbis Audio Plugin Configuration"
 msgstr "Nastavenie modulu Ogg Vorbis"
 
-#: src/vorbis/configure.c:127
+#: src/vorbis/configure.c:94
 msgid "Ogg Vorbis Tags:"
 msgstr "ZnaÄky Ogg Vorbis:"
 
-#: src/vorbis/configure.c:148
+#: src/vorbis/configure.c:115
 msgid "Title format:"
 msgstr "Formát názvu:"
 
-#: src/vorbis/configure.c:162 src/wavpack/ui.cxx:502
-msgid "ReplayGain Settings:"
-msgstr "Nastavenia zosilnenia prehrávania:"
-
-#: src/vorbis/configure.c:180 src/wavpack/ui.cxx:520
-msgid "ReplayGain Type:"
-msgstr "Typ zosilnenia:"
-
-#: src/vorbis/configure.c:191 src/wavpack/ui.cxx:531
-msgid "use Track Gain/Peak"
-msgstr "použiť zosilnenie podľa vrcholu v skladbe"
-
-#: src/vorbis/configure.c:201 src/wavpack/ui.cxx:539
-msgid "use Album Gain/Peak"
-msgstr "použiť zosilnenie podľa vrcholu na albume"
-
-#: src/vorbis/configure.c:213
-msgid "Enable 6dB Boost + Hard Limiting"
-msgstr "Povoliť 6dB zosilnenie a pevné obmedzenie"
-
-#: src/vorbis/vorbis.c:751 src/vorbis/vorbis.c~:759
+#: src/vorbis/vorbis.c:681
 msgid "About Ogg Vorbis Audio Plugin"
 msgstr "O module Ogg Vorbis Audio"
 
-#: src/vorbis/vorbis.c:757 src/vorbis/vorbis.c~:765
+#: src/vorbis/vorbis.c:687
+#, fuzzy
 msgid ""
 "Ogg Vorbis Plugin by the Xiph.org Foundation\n"
 "\n"
@@ -5219,6 +4961,7 @@
 "Jorn Baayen <jorn@nl.linux.org>\n"
 "Haavard Kvaalen <havardk@xmms.org>\n"
 "Gian-Carlo Pascutto <gcp@sjeng.org>\n"
+"Eugene Zagidullin <e.asphyx@gmail.com>\n"
 "\n"
 "Visit the Xiph.org Foundation at http://www.xiph.org/\n"
 msgstr ""
@@ -5341,7 +5084,23 @@
 msgid "General Plugin Settings:"
 msgstr "Nastavenia zosilnenia prehrávania:"
 
-#: src/wma/wma.c:132
+#: src/wavpack/ui.cxx:502
+msgid "ReplayGain Settings:"
+msgstr "Nastavenia zosilnenia prehrávania:"
+
+#: src/wavpack/ui.cxx:520
+msgid "ReplayGain Type:"
+msgstr "Typ zosilnenia:"
+
+#: src/wavpack/ui.cxx:531
+msgid "use Track Gain/Peak"
+msgstr "použiť zosilnenie podľa vrcholu v skladbe"
+
+#: src/wavpack/ui.cxx:539
+msgid "use Album Gain/Peak"
+msgstr "použiť zosilnenie podľa vrcholu na albume"
+
+#: src/wma/wma.c:123
 msgid ""
 "Adapted for use in Audacious by Tony Vroon (chainsaw@gentoo.org) from\n"
 "the BEEP-WMA plugin which is Copyright (C) 2004,2005 Mokrushin I.V. aka "
@@ -5351,6 +5110,31 @@
 "This plugin based on source code "
 msgstr ""
 
+#~ msgid "Dither output when rounding to 16-bit"
+#~ msgstr "Pri zaokrúhľovaní výstupu na 16 bitov výstup rozptýliť"
+
+#, fuzzy
+#~ msgid "Base gain (dB):"
+#~ msgstr "Štandardné zosilnenie (dB):"
+
+#~ msgid "Enable ReplayGain processing"
+#~ msgstr "Pri prehrávaní zapnúť zosilnenie"
+
+#, fuzzy
+#~ msgid "Enable peak info clip prevention"
+#~ msgstr "Povoliť prevenciu orezania"
+
+#, fuzzy
+#~ msgid "Enable adaptive scaler clip prevention"
+#~ msgstr "Povoliť prevenciu orezania"
+
+#, fuzzy
+#~ msgid "Gain Control"
+#~ msgstr "Ovládanie hlasitosti:"
+
+#~ msgid "Enable 6dB Boost + Hard Limiting"
+#~ msgstr "Povoliť 6dB zosilnenie a pevné obmedzenie"
+
 #, fuzzy
 #~ msgid "<b>Playback:</b>"
 #~ msgstr "Prehrať"
--- a/po/tr.po	Fri Jun 13 04:58:39 2008 +0300
+++ b/po/tr.po	Fri Jun 13 05:57:25 2008 +0300
@@ -15,7 +15,7 @@
 msgstr ""
 "Project-Id-Version: audacious-plugins\n"
 "Report-Msgid-Bugs-To: http://bugs.audacious-media-player.org\n"
-"POT-Creation-Date: 2008-02-03 20:33+0200\n"
+"POT-Creation-Date: 2008-03-30 17:25+0200\n"
 "PO-Revision-Date: 2007-12-22 23:09+0200\n"
 "Last-Translator: Onur Küçük <onur@pardus.org.tr>\n"
 "Language-Team: Turkish\n"
@@ -46,22 +46,22 @@
 #: src/adplug/adplug-xmms.cc:265 src/adplug/adplug-xmms.cc:526
 #: src/alac/plugin.c:77 src/arts/arts.c:26 src/arts/configure.c:90
 #: src/audiocompress/audacious-glue.c:102
-#: src/audiocompress/audacious-glue.c:552 src/cdaudio-ng/configure.c:227
-#: src/console/Audacious_Driver.cxx:449 src/demac/plugin.c:392
+#: src/audiocompress/audacious-glue.c:552 src/cdaudio-ng/configure.c:228
+#: src/console/Audacious_Driver.cxx:449 src/demac/plugin.c:393
 #: src/echo_plugin/gui.c:26 src/echo_plugin/gui.c:137 src/esd/about.c:49
 #: src/filewriter/filewriter.c:183 src/jack/configure.c:141
-#: src/jack/jack.c:493 src/madplug/plugin.c:600 src/madplug/plugin.c:624
+#: src/jack/jack.c:456 src/madplug/plugin.c:542 src/madplug/plugin.c:566
 #: src/metronom/metronom.c:88 src/modplug/gui/main.cxx:49
 #: src/musepack/libmpc.cxx:232 src/null/null.c:67 src/null/null.c:110
 #: src/OSS4/about.c:59 src/OSS/about.c:54 src/paranormal-ng/plugin.c:283
 #: src/paranormal/plugin.c:291 src/scrobbler/gtkstuff.c:25
-#: src/sndfile/plugin.c:565 src/statusicon/si_ui.c:593
+#: src/sndfile/plugin.c:565 src/statusicon/si_ui.c:628
 #: src/stereo_plugin/stereo.c:53 src/stereo_plugin/stereo.c:116
 #: src/sun/about.c:38 src/sun/configure.c:559 src/timidity/interface.c:222
 #: src/timidity/xmms-timidity.c:120 src/tonegen/tonegen.c:62
 #: src/tta/libtta.c:153 src/tta/libtta.c:267 src/tta/libtta.c:402
-#: src/vorbis/vorbis.c:769 src/vorbis/vorbis.c~:777 src/vtx/about.c:32
-#: src/vtx/info.c:43 src/wavpack/ui.cxx:56 src/wavpack/ui.cxx:556
+#: src/vorbis/vorbis.c:700 src/vtx/about.c:32 src/vtx/info.c:43
+#: src/wavpack/ui.cxx:56 src/wavpack/ui.cxx:556
 msgid "Ok"
 msgstr "Tamam"
 
@@ -98,7 +98,7 @@
 
 #: src/adplug/adplug-xmms.cc:275 src/alarm/interface.c:1398
 #: src/alsa/configure.c:389 src/arts/configure.c:91
-#: src/audiocompress/audacious-glue.c:557 src/cdaudio-ng/configure.c:231
+#: src/audiocompress/audacious-glue.c:557 src/cdaudio-ng/configure.c:232
 #: src/echo_plugin/gui.c:145 src/jack/configure.c:148
 #: src/modplug/gui/interface.cxx:714 src/modplug/gui/modplug.glade:1668
 #: src/musepack/libmpc.cxx:237 src/musepack/libmpc.cxx:557 src/null/null.c:111
@@ -109,7 +109,7 @@
 msgstr "Ä°ptal"
 
 #: src/adplug/adplug-xmms.cc:291 src/console/Audacious_Config.cxx:145
-#: src/madplug/configure.c:421 src/modplug/gui/interface.cxx:628
+#: src/madplug/configure.c:290 src/modplug/gui/interface.cxx:628
 #: src/modplug/gui/interface.cxx:887 src/modplug/gui/modplug.glade:1404
 #: src/modplug/gui/modplug.glade:1804
 msgid "General"
@@ -137,13 +137,13 @@
 msgid "Channels"
 msgstr "Kanallar"
 
-#: src/adplug/adplug-xmms.cc:325 src/filewriter/mp3.c:894
+#: src/adplug/adplug-xmms.cc:325 src/filewriter/mp3.c:900
 #: src/sid/xmms-sid.glade:157 src/sid/xs_interface.c:288
 #: src/timidity/interface.c:165
 msgid "Mono"
 msgstr "Mono"
 
-#: src/adplug/adplug-xmms.cc:330 src/filewriter/mp3.c:889
+#: src/adplug/adplug-xmms.cc:330 src/filewriter/mp3.c:895
 #: src/modplug/gui/interface.cxx:204 src/modplug/gui/modplug.glade:159
 #: src/sid/xmms-sid.glade:176 src/sid/xs_interface.c:295
 #: src/timidity/interface.c:173
@@ -327,7 +327,7 @@
 
 #: src/alarm/interface.c:71 src/lirc/about.c:115
 #: src/modplug/gui/interface.cxx:971 src/modplug/gui/modplug.glade:2030
-#: src/sid/xmms-sid.glade:3643 src/sid/xs_about.c:213
+#: src/sid/xmms-sid.glade:3643 src/sid/xs_about.c:214
 #: src/sid/xs_interface.c:1740
 msgid "Close"
 msgstr "Kapat"
@@ -341,10 +341,10 @@
 msgstr "Bu sizin uyandırma çağrınız."
 
 #: src/alarm/interface.c:124 src/alarm/interface.c:1389 src/alsa/about.c:46
-#: src/alsa/configure.c:383 src/cdaudio-ng/cdaudio-ng.c:228
-#: src/flacng/plugin.c:747 src/gnomeshortcuts/gnomeshortcuts.c:292
+#: src/alsa/configure.c:383 src/cdaudio-ng/cdaudio-ng.c:247
+#: src/flacng/plugin.c:706 src/gnomeshortcuts/gnomeshortcuts.c:311
 #: src/hotkey/gui.c:671 src/modplug/gui/interface.cxx:702
-#: src/modplug/gui/modplug.glade:1642 src/pulse_audio/pulse_audio.c:712
+#: src/modplug/gui/modplug.glade:1642 src/pulse_audio/pulse_audio.c:738
 #: src/scrobbler/gtkstuff.c:45 src/sid/xmms-sid.glade:3066
 #: src/sid/xs_interface.c:1243
 msgid "OK"
@@ -1784,7 +1784,7 @@
 msgid "Trigger"
 msgstr "BaÅŸlat"
 
-#: src/aosd/aosd_ui.c:1076 src/cdaudio-ng/configure.c:166
+#: src/aosd/aosd_ui.c:1076 src/cdaudio-ng/configure.c:167
 #: src/modplug/gui/interface.cxx:688 src/modplug/gui/modplug.glade:1603
 #: src/sid/xmms-sid.glade:3026 src/sid/xs_interface.c:1229
 msgid "Misc"
@@ -1989,15 +1989,19 @@
 msgid "Options:"
 msgstr "Seçenekler:"
 
-#: src/cdaudio-ng/cdaudio-ng.c:198
+#: src/cdaudio-ng/cdaudio-ng.c:204
+msgid "Rescan CD"
+msgstr ""
+
+#: src/cdaudio-ng/cdaudio-ng.c:217
 msgid "Add CD"
 msgstr "CD Ekle"
 
-#: src/cdaudio-ng/cdaudio-ng.c:223
+#: src/cdaudio-ng/cdaudio-ng.c:242
 msgid "About CD Audio Plugin NG"
 msgstr "CD Audio Eklentisi Hakkında"
 
-#: src/cdaudio-ng/cdaudio-ng.c:224
+#: src/cdaudio-ng/cdaudio-ng.c:243
 msgid ""
 "Copyright (c) 2007, by Calin Crisan <ccrisan@gmail.com> and The Audacious "
 "Team.\n"
@@ -2021,7 +2025,7 @@
 "\n"
 "Bu bir Google Summer of Code 2007 projesidir."
 
-#: src/cdaudio-ng/cdaudio-ng.c:627
+#: src/cdaudio-ng/cdaudio-ng.c:814
 msgid ""
 "<b><big>No playable CD found.</big></b>\n"
 "\n"
@@ -2031,47 +2035,47 @@
 "\n"
 "CD yok veya CD ses CD'si deÄŸi.\n"
 
-#: src/cdaudio-ng/configure.c:146
+#: src/cdaudio-ng/configure.c:147
 msgid "CD Audio Plugin Configuration"
 msgstr "CD Audio Eklentisi Yapılandırması"
 
-#: src/cdaudio-ng/configure.c:156
+#: src/cdaudio-ng/configure.c:157
 msgid "Digital audio extraction"
 msgstr "Sayısal ses elde etme"
 
-#: src/cdaudio-ng/configure.c:161
+#: src/cdaudio-ng/configure.c:162
 msgid "Title information"
 msgstr "Başlık bilgisi"
 
-#: src/cdaudio-ng/configure.c:178
+#: src/cdaudio-ng/configure.c:179
 msgid "Limit read speed to: "
 msgstr "Okuma hızını sınırla: "
 
-#: src/cdaudio-ng/configure.c:185
+#: src/cdaudio-ng/configure.c:186
 msgid "Use cd-text if available"
 msgstr "Varsa CD Bilgisini kullan"
 
-#: src/cdaudio-ng/configure.c:189
+#: src/cdaudio-ng/configure.c:190
 msgid "Use CDDB if available"
 msgstr "Varsa CDDB kullan"
 
-#: src/cdaudio-ng/configure.c:193
+#: src/cdaudio-ng/configure.c:194
 msgid "Server: "
 msgstr "Sunucu: "
 
-#: src/cdaudio-ng/configure.c:196
+#: src/cdaudio-ng/configure.c:197
 msgid "Port: "
 msgstr "Port: "
 
-#: src/cdaudio-ng/configure.c:202
+#: src/cdaudio-ng/configure.c:203
 msgid "Use HTTP instead of CDDBP"
 msgstr ""
 
-#: src/cdaudio-ng/configure.c:210
+#: src/cdaudio-ng/configure.c:211
 msgid "Override default device: "
 msgstr "Öntanımlı aygıtın üstüne yaz: "
 
-#: src/cdaudio-ng/configure.c:217
+#: src/cdaudio-ng/configure.c:218
 msgid "Print debug information"
 msgstr "Hata ayıklama bilgisini yazdır"
 
@@ -2146,12 +2150,12 @@
 "Audacious için uyarlayan: William Pitcock <nenolod@nenolod.net>, \n"
 "        Shay Green <gblargg@gmail.com>"
 
-#: src/demac/plugin.c:387
+#: src/demac/plugin.c:388
 #, fuzzy
 msgid "About Monkey's Audio Plugin"
 msgstr "MPEG Ses Eklentisi Hakkında"
 
-#: src/demac/plugin.c:388
+#: src/demac/plugin.c:389
 msgid ""
 "Copyright (C) 2007 Eugene Zagidullin <e.asphyx@gmail.com>\n"
 "Based on ffape decoder, Copyright (C) 2007 Benjamin Zores\n"
@@ -2469,7 +2473,7 @@
 "Tanınmamış bir aygıt için ilişkilendirme penceresi açılamıyor.\n"
 "Aygıtın düzgün bir şekilde sisteme takılı olduğundan emin olun."
 
-#: src/evdev-plug/ed_ui.c:319 src/madplug/plugin.c:624
+#: src/evdev-plug/ed_ui.c:319 src/madplug/plugin.c:566
 msgid "Error"
 msgstr "Hata"
 
@@ -2710,15 +2714,15 @@
 msgid "Prepend track number to filename"
 msgstr "Parça numarısını dosya adına ekle"
 
-#: src/filewriter/mp3.c:670
+#: src/filewriter/mp3.c:676
 msgid "MP3 Configuration"
 msgstr "MP3 Yapılandırması"
 
-#: src/filewriter/mp3.c:697
+#: src/filewriter/mp3.c:703
 msgid "Algorithm Quality:"
 msgstr "Algoritma Kalitesi:"
 
-#: src/filewriter/mp3.c:719
+#: src/filewriter/mp3.c:725
 msgid ""
 "best/slowest:0;\n"
 "worst/fastest:9;\n"
@@ -2730,96 +2734,96 @@
 "önerilen:2;\n"
 "öntanımlı:5;"
 
-#: src/filewriter/mp3.c:727
+#: src/filewriter/mp3.c:733
 msgid "Output Samplerate:"
 msgstr "Çıktı Örnekleme Oranı:"
 
-#: src/filewriter/mp3.c:738 src/filewriter/mp3.c:879
+#: src/filewriter/mp3.c:744 src/filewriter/mp3.c:885
 msgid "Auto"
 msgstr "Otomatik"
 
-#: src/filewriter/mp3.c:760
+#: src/filewriter/mp3.c:766
 msgid "(Hz)"
 msgstr "(Hz)"
 
-#: src/filewriter/mp3.c:772
+#: src/filewriter/mp3.c:778
 msgid "Bitrate / Compression ratio:"
 msgstr "Bit oranı / Sıkıştırma oranı:"
 
-#: src/filewriter/mp3.c:798
+#: src/filewriter/mp3.c:804
 msgid "Bitrate (kbps):"
 msgstr "Bit oranı (kbps):"
 
-#: src/filewriter/mp3.c:839
+#: src/filewriter/mp3.c:845
 msgid "Compression ratio:"
 msgstr "Sıkıştırma oranı:"
 
-#: src/filewriter/mp3.c:869
+#: src/filewriter/mp3.c:875
 msgid "Audio Mode:"
 msgstr "Ses Kipi:"
 
-#: src/filewriter/mp3.c:884
+#: src/filewriter/mp3.c:890
 msgid "Joint-Stereo"
 msgstr "BirleÅŸik Stereo"
 
-#: src/filewriter/mp3.c:925
+#: src/filewriter/mp3.c:931
 msgid "auto-M/S mode"
 msgstr "otomatik-M/S kipi"
 
-#: src/filewriter/mp3.c:937
+#: src/filewriter/mp3.c:943
 msgid "Misc:"
 msgstr "Çeşitli"
 
-#: src/filewriter/mp3.c:948
+#: src/filewriter/mp3.c:954
 msgid "Enforce strict ISO complience"
 msgstr "ISO standartlarına mutlak uyum gözetmeye zorla"
 
-#: src/filewriter/mp3.c:959
+#: src/filewriter/mp3.c:965
 msgid "Error protection"
 msgstr "Hata koruması"
 
-#: src/filewriter/mp3.c:971
+#: src/filewriter/mp3.c:977
 msgid "Adds 16 bit checksum to every frame"
 msgstr "Her çerçeveye 16 bit checksum ekler"
 
-#: src/filewriter/mp3.c:976 src/filewriter/vorbis.c:274
+#: src/filewriter/mp3.c:982 src/filewriter/vorbis.c:274
 #: src/modplug/gui/interface.cxx:319 src/modplug/gui/modplug.glade:507
 msgid "Quality"
 msgstr "Kalite"
 
-#: src/filewriter/mp3.c:988
+#: src/filewriter/mp3.c:994
 msgid "Enable VBR/ABR"
 msgstr "VBR/ABR etkinleÅŸtir"
 
-#: src/filewriter/mp3.c:1000
+#: src/filewriter/mp3.c:1006
 msgid "Type:"
 msgstr "Tür:"
 
-#: src/filewriter/mp3.c:1011
+#: src/filewriter/mp3.c:1017
 msgid "Variable bitrate"
 msgstr "Değişken bit oranı"
 
-#: src/filewriter/mp3.c:1023
+#: src/filewriter/mp3.c:1029
 msgid "Average bitrate"
 msgstr "Ortalama bit oranı"
 
-#: src/filewriter/mp3.c:1037
+#: src/filewriter/mp3.c:1043
 msgid "VBR Options:"
 msgstr "VBR Seçenekleri:"
 
-#: src/filewriter/mp3.c:1053
+#: src/filewriter/mp3.c:1059
 msgid "Minimum bitrate (kbps):"
 msgstr "En düşük bit oranı (kbps):"
 
-#: src/filewriter/mp3.c:1089
+#: src/filewriter/mp3.c:1095
 msgid "Maximum bitrate (kbps):"
 msgstr "En yüksek bit oranı (kbps):"
 
-#: src/filewriter/mp3.c:1121
+#: src/filewriter/mp3.c:1127
 msgid "Strictly enforce minimum bitrate"
 msgstr "En düşük bit oranını tam olarak zorla"
 
-#: src/filewriter/mp3.c:1123
+#: src/filewriter/mp3.c:1129
 msgid ""
 "For use with players that do not support low bitrate mp3 (Apex AD600-A DVD/"
 "mp3 player)"
@@ -2827,19 +2831,19 @@
 "Düşük bit oranlı mp3'leri desteklemeyen çalıcılarla kullanılması için (Apex "
 "AD600-A DVD/mp3 player)"
 
-#: src/filewriter/mp3.c:1136
+#: src/filewriter/mp3.c:1142
 msgid "ABR Options:"
 msgstr "ABR Seçenekleri:"
 
-#: src/filewriter/mp3.c:1146
+#: src/filewriter/mp3.c:1152
 msgid "Average bitrate (kbps):"
 msgstr "Ortalama bit oranı (kbps):"
 
-#: src/filewriter/mp3.c:1183
+#: src/filewriter/mp3.c:1189
 msgid "VBR quality level:"
 msgstr "VBR kalite seviyesi:"
 
-#: src/filewriter/mp3.c:1198
+#: src/filewriter/mp3.c:1204
 msgid ""
 "highest:0;\n"
 "lowest:9;\n"
@@ -2849,43 +2853,43 @@
 "alçak:9;\n"
 "öntanımlı:4;"
 
-#: src/filewriter/mp3.c:1206
+#: src/filewriter/mp3.c:1212
 msgid "Don't write Xing VBR header"
 msgstr "Xing VBR başlığını yazma"
 
-#: src/filewriter/mp3.c:1221
+#: src/filewriter/mp3.c:1227
 msgid "VBR/ABR"
 msgstr "VBR/ABR"
 
-#: src/filewriter/mp3.c:1233
+#: src/filewriter/mp3.c:1239
 msgid "Frame params:"
 msgstr "Çerçeve parametreleri:"
 
-#: src/filewriter/mp3.c:1245
+#: src/filewriter/mp3.c:1251
 msgid "Mark as copyright"
 msgstr "Telif hakkı olarak işaretle"
 
-#: src/filewriter/mp3.c:1256
+#: src/filewriter/mp3.c:1262
 msgid "Mark as original"
 msgstr "Orijinal olarak iÅŸaretle"
 
-#: src/filewriter/mp3.c:1268
+#: src/filewriter/mp3.c:1274
 msgid "ID3 params:"
 msgstr "ID3 parametreleri:"
 
-#: src/filewriter/mp3.c:1279
+#: src/filewriter/mp3.c:1285
 msgid "Force addition of version 2 tag"
 msgstr "sürüm 2 etkiketin eklenmesini zorla"
 
-#: src/filewriter/mp3.c:1289
+#: src/filewriter/mp3.c:1295
 msgid "Only add v1 tag"
 msgstr "Sadece v1 etiketini ekle"
 
-#: src/filewriter/mp3.c:1296
+#: src/filewriter/mp3.c:1302
 msgid "Only add v2 tag"
 msgstr "Sadece v2 etiketini ekle"
 
-#: src/filewriter/mp3.c:1317
+#: src/filewriter/mp3.c:1323
 msgid "Tags"
 msgstr "Etiketler:"
 
@@ -2897,11 +2901,11 @@
 msgid "Quality level (0 - 10):"
 msgstr "Kalite seviyesi (0 - 10):"
 
-#: src/flacng/plugin.c:739
+#: src/flacng/plugin.c:698
 msgid "FLAC Audio Plugin "
 msgstr "FLAC Ses Eklentisi "
 
-#: src/flacng/plugin.c:740
+#: src/flacng/plugin.c:699
 msgid ""
 "\n"
 "\n"
@@ -2917,20 +2921,21 @@
 "\n"
 "http://www.skytale.net/projects/bmp-flac2/"
 
-#: src/flacng/plugin.c:745
+#: src/flacng/plugin.c:704
 msgid "About FLAC Audio Plugin"
 msgstr "FLAC Ses Eklentisi Hakkında"
 
-#: src/gnomeshortcuts/gnomeshortcuts.c:287
+#: src/gnomeshortcuts/gnomeshortcuts.c:306
 msgid "About Gnome Shortcut Plugin"
 msgstr "Gnome Kısayol Eklentisi Hakkında"
 
-#: src/gnomeshortcuts/gnomeshortcuts.c:288
+#: src/gnomeshortcuts/gnomeshortcuts.c:307
+#, fuzzy
 msgid ""
 "Gnome Shortcut Plugin\n"
 "Let's you control the player with Gnome's shortcuts.\n"
 "\n"
-"Copyright (C) 2007 Sascha Hlusiak <contact@saschahlusiak.de>\n"
+"Copyright (C) 2007-2008 Sascha Hlusiak <contact@saschahlusiak.de>\n"
 "\n"
 msgstr ""
 "Gnome Kısayol Eklentisi\n"
@@ -3102,11 +3107,11 @@
 msgid "Enable debug printing"
 msgstr "Hata ayıklama yazdırmasını etkinleştir"
 
-#: src/jack/jack.c:95
+#: src/jack/jack.c:84
 msgid "Sample rate mismatch"
 msgstr "Örnekleme oranı uyumsuzluğu"
 
-#: src/jack/jack.c:98
+#: src/jack/jack.c:87
 msgid ""
 "Xmms is asking for a sample rate that differs from\n"
 " that of the jack server.  Xmms 1.2.8 or later\n"
@@ -3130,15 +3135,15 @@
 "\n"
 "Chris Morgan <cmorgan@alum.wpi.edu>\n"
 
-#: src/jack/jack.c:111 src/wma/wma.c:157
+#: src/jack/jack.c:100 src/wma/wma.c:148
 msgid " Close "
 msgstr " Kapat "
 
-#: src/jack/jack.c:489
+#: src/jack/jack.c:452
 msgid "About JACK Output Plugin 0.17"
 msgstr "JACK Çıkış Eklentisi 0.17 Hakkında"
 
-#: src/jack/jack.c:490
+#: src/jack/jack.c:453
 msgid ""
 "XMMS jack Driver 0.17\n"
 "\n"
@@ -3290,111 +3295,60 @@
 msgid "%s: will try reconnect every %d seconds...\n"
 msgstr ""
 
-#: src/madplug/configure.c:332
+#: src/madplug/configure.c:209
 msgid "MPEG Audio Plugin Configuration"
 msgstr "MPEG Ses Eklentisi Yapılandırması"
 
-#: src/madplug/configure.c:349
+#: src/madplug/configure.c:226
 #, fuzzy
 msgid "Audio Settings"
 msgstr "Alarm Ayarları"
 
-#: src/madplug/configure.c:358
-msgid "Dither output when rounding to 16-bit"
-msgstr "16 bite çevirirken kararlaştır"
-
-#: src/madplug/configure.c:365
+#: src/madplug/configure.c:234
 msgid "Force reopen audio when audio type changed"
 msgstr "Ses tipi değişince sesi tekrar yüklemeye zorla"
 
-#: src/madplug/configure.c:374
+#: src/madplug/configure.c:243
 #, fuzzy
 msgid "Metadata Settings"
 msgstr "Karıştırıcı Ayarları:"
 
-#: src/madplug/configure.c:383
+#: src/madplug/configure.c:252
 msgid "Enable fast play-length calculation"
 msgstr "Hızlı parça uzunluğu hesaplamayı etkinleştir"
 
-#: src/madplug/configure.c:390
+#: src/madplug/configure.c:259
 msgid "Parse XING headers"
 msgstr "XING başlıklarını işle"
 
-#: src/madplug/configure.c:397
+#: src/madplug/configure.c:266
 #, fuzzy
 msgid "Use SJIS to write ID3 tags (not recommended)"
 msgstr "ID3 etiketini yazarken UTF-8 yerine SjIS kullan"
 
-#: src/madplug/configure.c:404
+#: src/madplug/configure.c:273
 #, fuzzy
 msgid "Miscellaneous Settings"
 msgstr "Karıştırıcı Ayarları:"
 
-#: src/madplug/configure.c:413
+#: src/madplug/configure.c:282
 msgid "Display average bitrate for VBR"
 msgstr "VBR için ortalama bitoranını göster"
 
-#: src/madplug/configure.c:432
-#, fuzzy
-msgid "Base gain (dB):"
-msgstr "Varsayılan artış miktarı (dB):"
-
-#: src/madplug/configure.c:446 src/musepack/libmpc.cxx:190
-msgid "ReplayGain Settings"
-msgstr "ReplayGain Ayarları"
-
-#: src/madplug/configure.c:457
-msgid "Enable ReplayGain processing"
-msgstr "ReplayGain Ä°ÅŸlemesini EtkinleÅŸtir"
-
-#: src/madplug/configure.c:467 src/musepack/libmpc.cxx:207
-msgid "ReplayGain Type"
-msgstr "ReplayGain Türü"
-
-#: src/madplug/configure.c:477 src/musepack/libmpc.cxx:215
-msgid "Use Track Gain"
-msgstr "Parça Kazancı Kullan"
-
-#: src/madplug/configure.c:485 src/musepack/libmpc.cxx:219
-msgid "Use Album Gain"
-msgstr "Albüm Kazancı Kullan"
-
-#: src/madplug/configure.c:498
-msgid "Pre-gain with RG info (dB):"
-msgstr ""
-
-#: src/madplug/configure.c:514
-msgid "Pre-gain without RG info (dB):"
-msgstr ""
-
-#: src/madplug/configure.c:530
-#, fuzzy
-msgid "Enable peak info clip prevention"
-msgstr " Çatlama Korumasını Etkinleştir"
-
-#: src/madplug/configure.c:552
-#, fuzzy
-msgid "Enable adaptive scaler clip prevention"
-msgstr " Çatlama Korumasını Etkinleştir"
-
-#: src/madplug/configure.c:561
-msgid "Gain Control"
-msgstr ""
-
-#: src/madplug/configure.c:569 src/vorbis/configure.c:135
+#: src/madplug/configure.c:296 src/vorbis/configure.c:102
 msgid "Override generic titles"
 msgstr "Genel başlıkları geçersiz kıl"
 
-#: src/madplug/configure.c:581
+#: src/madplug/configure.c:308
 msgid "ID3 format:"
 msgstr "ID3 biçimi:"
 
-#: src/madplug/configure.c:593 src/sid/xmms-sid.glade:2540
-#: src/sid/xs_interface.c:1070 src/vorbis/configure.c:158
+#: src/madplug/configure.c:320 src/sid/xmms-sid.glade:2540
+#: src/sid/xs_interface.c:1070
 msgid "Title"
 msgstr "Başlık"
 
-#: src/madplug/plugin.c:582
+#: src/madplug/plugin.c:524
 #, c-format
 msgid ""
 "Audacious MPEG Audio Plugin\n"
@@ -3425,7 +3379,7 @@
 "ReplayGain desteÄŸi:\n"
 "    Samuel Krempp"
 
-#: src/madplug/plugin.c:598
+#: src/madplug/plugin.c:540
 msgid "About MPEG Audio Plugin"
 msgstr "MPEG Ses Eklentisi Hakkında"
 
@@ -3754,18 +3708,31 @@
 msgid "Plugin"
 msgstr "Eklenti"
 
-#: src/musepack/libmpc.cxx:197 src/vorbis/configure.c:170
-#: src/wavpack/ui.cxx:510
+#: src/musepack/libmpc.cxx:190
+msgid "ReplayGain Settings"
+msgstr "ReplayGain Ayarları"
+
+#: src/musepack/libmpc.cxx:197 src/wavpack/ui.cxx:510
 msgid "Enable Clipping Prevention"
 msgstr " Çatlama Korumasını Etkinleştir"
 
-#: src/musepack/libmpc.cxx:202 src/vorbis/configure.c:175
-#: src/wavpack/ui.cxx:515
+#: src/musepack/libmpc.cxx:202 src/wavpack/ui.cxx:515
 msgid "Enable ReplayGain"
 msgstr "ReplayGain EtkinleÅŸtir"
 
-#: src/musepack/libmpc.cxx:224 src/vorbis/configure.c:219
-#: src/wavpack/ui.cxx:547
+#: src/musepack/libmpc.cxx:207
+msgid "ReplayGain Type"
+msgstr "ReplayGain Türü"
+
+#: src/musepack/libmpc.cxx:215
+msgid "Use Track Gain"
+msgstr "Parça Kazancı Kullan"
+
+#: src/musepack/libmpc.cxx:219
+msgid "Use Album Gain"
+msgstr "Albüm Kazancı Kullan"
+
+#: src/musepack/libmpc.cxx:224 src/wavpack/ui.cxx:547
 msgid "ReplayGain"
 msgstr "ReplayGain"
 
@@ -4028,11 +3995,15 @@
 msgid "Volume controls Master not PCM"
 msgstr "Ses ayarı PCM değil, ana kanalı ayarlasın"
 
-#: src/pulse_audio/pulse_audio.c:696
+#: src/projectm-1.0/main.c:70
+msgid "_Random"
+msgstr ""
+
+#: src/pulse_audio/pulse_audio.c:722
 msgid "About Audacious PulseAudio Output Plugin"
 msgstr "Audacious PulseAudio Çıktı Eklentisi Hakkında"
 
-#: src/pulse_audio/pulse_audio.c:697
+#: src/pulse_audio/pulse_audio.c:723
 msgid ""
 "Audacious PulseAudio Output Plugin\n"
 "\n"
@@ -4124,36 +4095,6 @@
 msgid "Scrobbler Error"
 msgstr "Scrobbler Hatası"
 
-#: src/sid/xmms-sid.c:203
-msgid "Error initializing song-length database!\n"
-msgstr "Şarkı-uzunluğu veritabanını başlatırken hata oluştu!\n"
-
-#: src/sid/xmms-sid.c:209
-msgid "Error initializing STIL database!\n"
-msgstr "STIL veritabanını başlatırken hata oluştu!\n"
-
-#: src/sid/xmms-sid.c:347
-msgid "Couldn't allocate memory for audio data buffer!\n"
-msgstr "Ses verisi tampon belleği için hafıza ayrılamadı!\n"
-
-#: src/sid/xmms-sid.c:355
-msgid "Couldn't allocate memory for audio oversampling buffer!\n"
-msgstr "Ses fazlaörnekleme tampon belleği için hafıza ayrılamadı!\n"
-
-#: src/sid/xmms-sid.c:371
-#, c-format
-msgid "Couldn't initialize SID-tune '%s' (sub-tune #%i)!\n"
-msgstr "SID-tınısı '%s' (alt-tını #%i) başlatılamadı!\n"
-
-#: src/sid/xmms-sid.c:382
-#, c-format
-msgid "Couldn't open XMMS audio output (fmt=%x, freq=%i, nchan=%i)!\n"
-msgstr "XMMS ses çıktısı açılamadı (fmt=%x, freq=%i, nchan=%i)!\n"
-
-#: src/sid/xmms-sid.c:432
-msgid "Oversampling rate-conversion pass failed.\n"
-msgstr "FAzlaörnekleme oran-dönüşümü geçişinde başarısız oldu.\n"
-
 #: src/sid/xmms-sid.glade:8 src/sid/xs_interface.c:221
 msgid "Audacious-SID configuration"
 msgstr "Audacious-SID - yapılandırması"
@@ -4741,19 +4682,11 @@
 msgid "No"
 msgstr "Hayır"
 
-#: src/sid/xs_about.c:84 src/wma/wma.c:130
+#: src/sid/xs_about.c:84 src/wma/wma.c:121
 #, c-format
 msgid "About %s"
 msgstr "%s Hakkında"
 
-#: src/sid/xs_config.c:580
-msgid "Allocation of sid2FilterPresets structure failed!\n"
-msgstr "sid2FilterPresets yapısı için alan ayrılamadı!\n"
-
-#: src/sid/xs_config.c:908
-msgid "Warning: Could not set filter curve widget points!\n"
-msgstr "Uyarı: Filtre eğrisi noktaları ayarlanamadı!\n"
-
 #: src/sid/xs_fileinfo.c:232
 msgid "General info"
 msgstr "Genel bilgi"
@@ -4763,180 +4696,6 @@
 msgid "Tune #%i: "
 msgstr "Tını #%i: "
 
-#: src/sid/xs_length.c:113
-msgid "Error allocating new node. Fatal error.\n"
-msgstr "Yeni nod için yer ayrılamadı. Ölümcül hata.\n"
-
-#: src/sid/xs_length.c:128
-#, c-format
-msgid "'=' expected on column #%d.\n"
-msgstr "kolon #%d için '=' bekleniyordu.\n"
-
-#: src/sid/xs_length.c:153
-msgid "Could not allocate memory for node.\n"
-msgstr "Nokta için hafıza ayrılamadı.\n"
-
-#: src/sid/xs_length.c:204
-#, c-format
-msgid "Could not open SongLengthDB '%s'\n"
-msgstr "SongLengthDB '%s' açılamadı\n"
-
-#: src/sid/xs_length.c:224
-#, c-format
-msgid "Invalid MD5-hash in SongLengthDB file '%s' line #%d!\n"
-msgstr "SongLengthDB dosyası '%s' satır #%d MD5 doğrulaması başarısız!\n"
-
-#: src/sid/xs_length.c:231
-#, c-format
-msgid "Invalid entry in SongLengthDB file '%s' line #%d!\n"
-msgstr "SongLengthDB dosyası '%s' satır #%d geçersiz bilgi içeriyor!\n"
-
-#: src/sid/xs_length.c:236
-#, c-format
-msgid "Invalid line in SongLengthDB file '%s' line #%d\n"
-msgstr "SongLengthDB dosyası '%s' satır #%d geçersiz!\n"
-
-#: src/sid/xs_length.c:398
-#, c-format
-msgid "Not a PSID or RSID file '%s'\n"
-msgstr "'%s' geçerli bir PSID ya da RSID dosyası değil\n"
-
-#: src/sid/xs_length.c:417
-#, c-format
-msgid "Error reading SID file header from '%s'\n"
-msgstr "SID dosyası '%s' başlığı okunurken hata oluştu\n"
-
-#: src/sid/xs_length.c:436
-#, c-format
-msgid "Error allocating temp data buffer for file '%s'\n"
-msgstr "'%s' dosyası için geçici tampon bellek ayrılırken hata oluştu\n"
-
-#: src/sid/xs_sidplay1.cc:96
-msgid "[SIDPlay1] Could not initialize emulation engine.\n"
-msgstr "[SIDPlay1] Emülasyon motoru başlatılamadı.\n"
-
-#: src/sid/xs_sidplay1.cc:103
-msgid "[SIDPlay1] Endianess verification failed.\n"
-msgstr "[sıDplay1] Donanım mimarisi kontrolü başarısız.\n"
-
-#: src/sid/xs_sidplay1.cc:238
-msgid "[SIDPlay1] Emulator engine configuration failed!\n"
-msgstr "[SIDPlay1] Emülasyon motoru ayarlanamadı!\n"
-
-#: src/sid/xs_sidplay1.cc:245
-msgid "[SIDPlay1] Could not initialize SIDTune object.\n"
-msgstr "[SIDPlay1] SID Tını objesi başlatılamadı.\n"
-
-#: src/sid/xs_sidplay1.cc:291
-msgid ""
-"[SIDPlay1] SID-tune struct pointer was NULL. This should not happen, report "
-"to XMMS-SID author.\n"
-msgstr ""
-"[SIDPlay1] SID tını yapısı işaretcisinin değeri NULL. Bunun olmaması "
-"gerekiyordu, lütfen durumu XMMS-SID yazarına iletiniz.\n"
-
-#: src/sid/xs_sidplay1.cc:296
-msgid ""
-"[SIDPlay1] SID-tune status check failed. This should not happen, report to "
-"XMMS-SID author.\n"
-msgstr ""
-"[SIDPlay1] SID tını durum kontrolü başarısız. Bunun olmaması gerekiyordu, "
-"lütfen durumu XMMS-SID yazarına iletiniz.\n"
-
-#: src/sid/xs_sidplay2.cc:101
-msgid "[SIDPlay2] Could not initialize emulation engine.\n"
-msgstr "[SIDPlay2] Emülasyon motoru başlatılamadı.\n"
-
-#: src/sid/xs_sidplay2.cc:208
-#, c-format
-msgid "[SIDPlay2] Invalid number of filter curve points (%d > %d)\n"
-msgstr "[SIDPlay2] Geçersiz sayıda filtre eğrisi noktası (%d > %d)\n"
-
-#: src/sid/xs_sidplay2.cc:229
-msgid "reSID->create() failed.\n"
-msgstr "reSID->create() başarısız.\n"
-
-#: src/sid/xs_sidplay2.cc:235
-#, c-format
-msgid "reSID->filter(%d) failed.\n"
-msgstr "reSID->filter(%d) başarısız.\n"
-
-#: src/sid/xs_sidplay2.cc:243
-#, c-format
-msgid "reSID->sampling(%d) failed.\n"
-msgstr "reSID->sampling(%d) başarısız.\n"
-
-#: src/sid/xs_sidplay2.cc:253
-msgid "reSID->filter(NULL) failed.\n"
-msgstr "reSID->filter(NULL) başarısız.\n"
-
-#: src/sid/xs_sidplay2.cc:267
-msgid "hardSID->create() failed.\n"
-msgstr "hardSID->create() başarısız.\n"
-
-#: src/sid/xs_sidplay2.cc:273
-#, c-format
-msgid "hardSID->filter(%d) failed.\n"
-msgstr "hardSID->filter(%d) başarısız.\n"
-
-#: src/sid/xs_sidplay2.cc:281
-msgid "[SIDPlay2] Could not initialize SIDBuilder object.\n"
-msgstr "[SIDPlay2] SIDBuilder objesi başlatılamadı.\n"
-
-#: src/sid/xs_sidplay2.cc:295
-#, c-format
-msgid "[SIDPlay2] Invalid clockSpeed=%d, falling back to PAL.\n"
-msgstr "[SIDPlay2] Geçersiz clockSpeed=%d, PAL kullanılacak.\n"
-
-#: src/sid/xs_sidplay2.cc:319
-#, c-format
-msgid "Invalid sid2OptLevel=%d, falling back to %d.\n"
-msgstr "Geçersiz sid2OptLevel0%d, %d kullanılacak.\n"
-
-#: src/sid/xs_sidplay2.cc:343
-msgid "[SIDPlay2] Emulator engine configuration failed!\n"
-msgstr "[SIDPlay2]Emülator motoru ayarlama başarısız!\n"
-
-#: src/sid/xs_sidplay2.cc:350
-msgid "[SIDPlay2] Could not initialize SIDTune object.\n"
-msgstr "[SIDPlay2] SIDTune objesi başlatma başarısız.\n"
-
-#: src/sid/xs_sidplay2.cc:401
-msgid "[SIDPlay2] currTune->selectSong() failed\n"
-msgstr "[SIDPlay2] currTune->selectSong() başarısız\n"
-
-#: src/sid/xs_sidplay2.cc:406
-msgid "[SIDPlay2] currEng->load() failed\n"
-msgstr "[SIDPlay2] currEng->load() başarısız\n"
-
-#: src/sid/xs_slsup.c:217
-#, c-format
-msgid "Could not allocate memory for t_xs_tuneinfo ('%s')\n"
-msgstr "t_xs_tuneinfo ('%s') için hafıza ayrılamadı\n"
-
-#: src/sid/xs_slsup.c:224
-#, c-format
-msgid "Could not allocate sidFilename ('%s')\n"
-msgstr "sidFilename ('%s') ayrılamadı\n"
-
-#: src/sid/xs_slsup.c:233
-#, c-format
-msgid "Could not allocate memory for t_xs_subtuneinfo ('%s', %i)\n"
-msgstr "t_xs_subtuneinfo ('%s', %i) için hafıza ayrılamadı\n"
-
-#: src/sid/xs_stil.c:46
-msgid "SubTune pointer structure realloc failed.\n"
-msgstr "SubTune işaretçisi yapısı için realloc başarısız.\n"
-
-#: src/sid/xs_stil.c:69
-msgid "SubTune structure malloc failed!\n"
-msgstr "SubTune yapısı için malloc başarısız!\n"
-
-#: src/sid/xs_stil.c:176
-#, c-format
-msgid "Could not open STILDB '%s'\n"
-msgstr "STILDB '%s' açılamadı\n"
-
 #: src/sndfile/plugin.c:548
 #, fuzzy
 msgid "About sndfile plugin"
@@ -5090,11 +4849,11 @@
 msgid "The orientation of the tray"
 msgstr "Sistem ikonu canlandırması"
 
-#: src/statusicon/si_ui.c:587
+#: src/statusicon/si_ui.c:622
 msgid "About Status Icon Plugin"
 msgstr "Durum Simgesi Eklentisi Hakkında"
 
-#: src/statusicon/si_ui.c:589
+#: src/statusicon/si_ui.c:624
 msgid ""
 "\n"
 "written by Giacomo Lozito < james@develia.org >\n"
@@ -5107,35 +4866,35 @@
 "\n"
 "Bu eklenti durum simgesinin sistem araç cubuğunda görüntülenmesini sağlar.\n"
 
-#: src/statusicon/si_ui.c:661
+#: src/statusicon/si_ui.c:696
 msgid "Status Icon Plugin - Preferences"
 msgstr "Durum Simgesi Eklentisi - Tercihler"
 
-#: src/statusicon/si_ui.c:672
+#: src/statusicon/si_ui.c:707
 msgid "Right-Click Menu"
 msgstr "Sağ-Tık Menüsü"
 
-#: src/statusicon/si_ui.c:677
+#: src/statusicon/si_ui.c:712
 msgid "Audacious standard menu"
 msgstr "Audacious standart menü"
 
-#: src/statusicon/si_ui.c:682
+#: src/statusicon/si_ui.c:717
 msgid "Small playback menu #1"
 msgstr "Küçük oynatma menüsü #1"
 
-#: src/statusicon/si_ui.c:687
+#: src/statusicon/si_ui.c:722
 msgid "Small playback menu #2"
 msgstr "Küçük oynatma menüsü #2"
 
-#: src/statusicon/si_ui.c:710
+#: src/statusicon/si_ui.c:745
 msgid "Mouse Scroll Action"
 msgstr "Fare TekerleÄŸi Eylemi"
 
-#: src/statusicon/si_ui.c:715
+#: src/statusicon/si_ui.c:750
 msgid "Change volume"
 msgstr "Ses seviyesini deÄŸiÅŸtir"
 
-#: src/statusicon/si_ui.c:720
+#: src/statusicon/si_ui.c:755
 msgid "Change playing song"
 msgstr "Çalan şarkıyı değiştir"
 
@@ -5254,12 +5013,12 @@
 "Kullanmak için bir URL ekleyin: tone://frequency1;frequency2;frequency3;...\n"
 "ör: 2000Hz ton ve 2005Hz ton çalmak için tone://2000;2005"
 
-#: src/tonegen/tonegen.c:168
+#: src/tonegen/tonegen.c:167
 #, c-format
 msgid "%s %.1f Hz"
 msgstr "%s %.1f Hz"
 
-#: src/tonegen/tonegen.c:168
+#: src/tonegen/tonegen.c:167
 msgid "Tone Generator: "
 msgstr "Ton OluÅŸturucu: "
 
@@ -5319,43 +5078,24 @@
 msgid "Track number:"
 msgstr "Parça numarası:"
 
-#: src/vorbis/configure.c:115
+#: src/vorbis/configure.c:84
 msgid "Ogg Vorbis Audio Plugin Configuration"
 msgstr "Ogg Vorbis Ses Eklentisi Yapılandırması"
 
-#: src/vorbis/configure.c:127
+#: src/vorbis/configure.c:94
 msgid "Ogg Vorbis Tags:"
 msgstr "Ogg Vorbis Etiketleri:"
 
-#: src/vorbis/configure.c:148
+#: src/vorbis/configure.c:115
 msgid "Title format:"
 msgstr "Başlık biçimi:"
 
-#: src/vorbis/configure.c:162 src/wavpack/ui.cxx:502
-msgid "ReplayGain Settings:"
-msgstr "ReplayGain Ayarları:"
-
-#: src/vorbis/configure.c:180 src/wavpack/ui.cxx:520
-msgid "ReplayGain Type:"
-msgstr "ReplayGain Türü:"
-
-#: src/vorbis/configure.c:191 src/wavpack/ui.cxx:531
-msgid "use Track Gain/Peak"
-msgstr "Parçada Gain/Peak kullan"
-
-#: src/vorbis/configure.c:201 src/wavpack/ui.cxx:539
-msgid "use Album Gain/Peak"
-msgstr "Albümde Gain/Peak kullan"
-
-#: src/vorbis/configure.c:213
-msgid "Enable 6dB Boost + Hard Limiting"
-msgstr "6dB artırma (kompresör) + sınırlayıcı (limitır) Aktif"
-
-#: src/vorbis/vorbis.c:751 src/vorbis/vorbis.c~:759
+#: src/vorbis/vorbis.c:681
 msgid "About Ogg Vorbis Audio Plugin"
 msgstr "OGG Vorbis Ses Eklentisi Hakkında"
 
-#: src/vorbis/vorbis.c:757 src/vorbis/vorbis.c~:765
+#: src/vorbis/vorbis.c:687
+#, fuzzy
 msgid ""
 "Ogg Vorbis Plugin by the Xiph.org Foundation\n"
 "\n"
@@ -5369,6 +5109,7 @@
 "Jorn Baayen <jorn@nl.linux.org>\n"
 "Haavard Kvaalen <havardk@xmms.org>\n"
 "Gian-Carlo Pascutto <gcp@sjeng.org>\n"
+"Eugene Zagidullin <e.asphyx@gmail.com>\n"
 "\n"
 "Visit the Xiph.org Foundation at http://www.xiph.org/\n"
 msgstr ""
@@ -5496,7 +5237,23 @@
 msgid "General Plugin Settings:"
 msgstr "Genel Eklenti Ayarları:"
 
-#: src/wma/wma.c:132
+#: src/wavpack/ui.cxx:502
+msgid "ReplayGain Settings:"
+msgstr "ReplayGain Ayarları:"
+
+#: src/wavpack/ui.cxx:520
+msgid "ReplayGain Type:"
+msgstr "ReplayGain Türü:"
+
+#: src/wavpack/ui.cxx:531
+msgid "use Track Gain/Peak"
+msgstr "Parçada Gain/Peak kullan"
+
+#: src/wavpack/ui.cxx:539
+msgid "use Album Gain/Peak"
+msgstr "Albümde Gain/Peak kullan"
+
+#: src/wma/wma.c:123
 msgid ""
 "Adapted for use in Audacious by Tony Vroon (chainsaw@gentoo.org) from\n"
 "the BEEP-WMA plugin which is Copyright (C) 2004,2005 Mokrushin I.V. aka "
@@ -5513,6 +5270,173 @@
 "ru>. baz alınarak hazırlanmıştır\n"
 "Bu eklenti hazırlanırken kaynak kod baz alınmıştır"
 
+#~ msgid "Error initializing song-length database!\n"
+#~ msgstr "Şarkı-uzunluğu veritabanını başlatırken hata oluştu!\n"
+
+#~ msgid "Error initializing STIL database!\n"
+#~ msgstr "STIL veritabanını başlatırken hata oluştu!\n"
+
+#~ msgid "Couldn't allocate memory for audio data buffer!\n"
+#~ msgstr "Ses verisi tampon belleği için hafıza ayrılamadı!\n"
+
+#~ msgid "Couldn't allocate memory for audio oversampling buffer!\n"
+#~ msgstr "Ses fazlaörnekleme tampon belleği için hafıza ayrılamadı!\n"
+
+#~ msgid "Couldn't initialize SID-tune '%s' (sub-tune #%i)!\n"
+#~ msgstr "SID-tınısı '%s' (alt-tını #%i) başlatılamadı!\n"
+
+#~ msgid "Couldn't open XMMS audio output (fmt=%x, freq=%i, nchan=%i)!\n"
+#~ msgstr "XMMS ses çıktısı açılamadı (fmt=%x, freq=%i, nchan=%i)!\n"
+
+#~ msgid "Oversampling rate-conversion pass failed.\n"
+#~ msgstr "FAzlaörnekleme oran-dönüşümü geçişinde başarısız oldu.\n"
+
+#~ msgid "Allocation of sid2FilterPresets structure failed!\n"
+#~ msgstr "sid2FilterPresets yapısı için alan ayrılamadı!\n"
+
+#~ msgid "Warning: Could not set filter curve widget points!\n"
+#~ msgstr "Uyarı: Filtre eğrisi noktaları ayarlanamadı!\n"
+
+#~ msgid "Error allocating new node. Fatal error.\n"
+#~ msgstr "Yeni nod için yer ayrılamadı. Ölümcül hata.\n"
+
+#~ msgid "'=' expected on column #%d.\n"
+#~ msgstr "kolon #%d için '=' bekleniyordu.\n"
+
+#~ msgid "Could not allocate memory for node.\n"
+#~ msgstr "Nokta için hafıza ayrılamadı.\n"
+
+#~ msgid "Could not open SongLengthDB '%s'\n"
+#~ msgstr "SongLengthDB '%s' açılamadı\n"
+
+#~ msgid "Invalid MD5-hash in SongLengthDB file '%s' line #%d!\n"
+#~ msgstr "SongLengthDB dosyası '%s' satır #%d MD5 doğrulaması başarısız!\n"
+
+#~ msgid "Invalid entry in SongLengthDB file '%s' line #%d!\n"
+#~ msgstr "SongLengthDB dosyası '%s' satır #%d geçersiz bilgi içeriyor!\n"
+
+#~ msgid "Invalid line in SongLengthDB file '%s' line #%d\n"
+#~ msgstr "SongLengthDB dosyası '%s' satır #%d geçersiz!\n"
+
+#~ msgid "Not a PSID or RSID file '%s'\n"
+#~ msgstr "'%s' geçerli bir PSID ya da RSID dosyası değil\n"
+
+#~ msgid "Error reading SID file header from '%s'\n"
+#~ msgstr "SID dosyası '%s' başlığı okunurken hata oluştu\n"
+
+#~ msgid "Error allocating temp data buffer for file '%s'\n"
+#~ msgstr "'%s' dosyası için geçici tampon bellek ayrılırken hata oluştu\n"
+
+#~ msgid "[SIDPlay1] Could not initialize emulation engine.\n"
+#~ msgstr "[SIDPlay1] Emülasyon motoru başlatılamadı.\n"
+
+#~ msgid "[SIDPlay1] Endianess verification failed.\n"
+#~ msgstr "[sıDplay1] Donanım mimarisi kontrolü başarısız.\n"
+
+#~ msgid "[SIDPlay1] Emulator engine configuration failed!\n"
+#~ msgstr "[SIDPlay1] Emülasyon motoru ayarlanamadı!\n"
+
+#~ msgid "[SIDPlay1] Could not initialize SIDTune object.\n"
+#~ msgstr "[SIDPlay1] SID Tını objesi başlatılamadı.\n"
+
+#~ msgid ""
+#~ "[SIDPlay1] SID-tune struct pointer was NULL. This should not happen, "
+#~ "report to XMMS-SID author.\n"
+#~ msgstr ""
+#~ "[SIDPlay1] SID tını yapısı işaretcisinin değeri NULL. Bunun olmaması "
+#~ "gerekiyordu, lütfen durumu XMMS-SID yazarına iletiniz.\n"
+
+#~ msgid ""
+#~ "[SIDPlay1] SID-tune status check failed. This should not happen, report "
+#~ "to XMMS-SID author.\n"
+#~ msgstr ""
+#~ "[SIDPlay1] SID tını durum kontrolü başarısız. Bunun olmaması gerekiyordu, "
+#~ "lütfen durumu XMMS-SID yazarına iletiniz.\n"
+
+#~ msgid "[SIDPlay2] Could not initialize emulation engine.\n"
+#~ msgstr "[SIDPlay2] Emülasyon motoru başlatılamadı.\n"
+
+#~ msgid "[SIDPlay2] Invalid number of filter curve points (%d > %d)\n"
+#~ msgstr "[SIDPlay2] Geçersiz sayıda filtre eğrisi noktası (%d > %d)\n"
+
+#~ msgid "reSID->create() failed.\n"
+#~ msgstr "reSID->create() başarısız.\n"
+
+#~ msgid "reSID->filter(%d) failed.\n"
+#~ msgstr "reSID->filter(%d) başarısız.\n"
+
+#~ msgid "reSID->sampling(%d) failed.\n"
+#~ msgstr "reSID->sampling(%d) başarısız.\n"
+
+#~ msgid "reSID->filter(NULL) failed.\n"
+#~ msgstr "reSID->filter(NULL) başarısız.\n"
+
+#~ msgid "hardSID->create() failed.\n"
+#~ msgstr "hardSID->create() başarısız.\n"
+
+#~ msgid "hardSID->filter(%d) failed.\n"
+#~ msgstr "hardSID->filter(%d) başarısız.\n"
+
+#~ msgid "[SIDPlay2] Could not initialize SIDBuilder object.\n"
+#~ msgstr "[SIDPlay2] SIDBuilder objesi başlatılamadı.\n"
+
+#~ msgid "[SIDPlay2] Invalid clockSpeed=%d, falling back to PAL.\n"
+#~ msgstr "[SIDPlay2] Geçersiz clockSpeed=%d, PAL kullanılacak.\n"
+
+#~ msgid "Invalid sid2OptLevel=%d, falling back to %d.\n"
+#~ msgstr "Geçersiz sid2OptLevel0%d, %d kullanılacak.\n"
+
+#~ msgid "[SIDPlay2] Emulator engine configuration failed!\n"
+#~ msgstr "[SIDPlay2]Emülator motoru ayarlama başarısız!\n"
+
+#~ msgid "[SIDPlay2] Could not initialize SIDTune object.\n"
+#~ msgstr "[SIDPlay2] SIDTune objesi başlatma başarısız.\n"
+
+#~ msgid "[SIDPlay2] currTune->selectSong() failed\n"
+#~ msgstr "[SIDPlay2] currTune->selectSong() başarısız\n"
+
+#~ msgid "[SIDPlay2] currEng->load() failed\n"
+#~ msgstr "[SIDPlay2] currEng->load() başarısız\n"
+
+#~ msgid "Could not allocate memory for t_xs_tuneinfo ('%s')\n"
+#~ msgstr "t_xs_tuneinfo ('%s') için hafıza ayrılamadı\n"
+
+#~ msgid "Could not allocate sidFilename ('%s')\n"
+#~ msgstr "sidFilename ('%s') ayrılamadı\n"
+
+#~ msgid "Could not allocate memory for t_xs_subtuneinfo ('%s', %i)\n"
+#~ msgstr "t_xs_subtuneinfo ('%s', %i) için hafıza ayrılamadı\n"
+
+#~ msgid "SubTune pointer structure realloc failed.\n"
+#~ msgstr "SubTune işaretçisi yapısı için realloc başarısız.\n"
+
+#~ msgid "SubTune structure malloc failed!\n"
+#~ msgstr "SubTune yapısı için malloc başarısız!\n"
+
+#~ msgid "Could not open STILDB '%s'\n"
+#~ msgstr "STILDB '%s' açılamadı\n"
+
+#~ msgid "Dither output when rounding to 16-bit"
+#~ msgstr "16 bite çevirirken kararlaştır"
+
+#, fuzzy
+#~ msgid "Base gain (dB):"
+#~ msgstr "Varsayılan artış miktarı (dB):"
+
+#~ msgid "Enable ReplayGain processing"
+#~ msgstr "ReplayGain Ä°ÅŸlemesini EtkinleÅŸtir"
+
+#, fuzzy
+#~ msgid "Enable peak info clip prevention"
+#~ msgstr " Çatlama Korumasını Etkinleştir"
+
+#, fuzzy
+#~ msgid "Enable adaptive scaler clip prevention"
+#~ msgstr " Çatlama Korumasını Etkinleştir"
+
+#~ msgid "Enable 6dB Boost + Hard Limiting"
+#~ msgstr "6dB artırma (kompresör) + sınırlayıcı (limitır) Aktif"
+
 #~ msgid "<b>Playback:</b>"
 #~ msgstr "<b>Oynatma:</b>"
 
--- a/po/update-potfiles.sh	Fri Jun 13 04:58:39 2008 +0300
+++ b/po/update-potfiles.sh	Fri Jun 13 05:57:25 2008 +0300
@@ -2,4 +2,4 @@
 rm POTFILES*
 echo "# Please don't update this file manually - use ./update-potfiles.sh instead!" > POTFILES.in
 cd ..
-find src/ \( -name "*.c*" -o -name "*.glade" \) -exec grep -lE "translatable|_\(" \{\} \; | sort | uniq >> po/POTFILES.in
+find src/ \( -name "*.c" -o -name "*.cxx" -o -name "*.cc" -o -name "*.glade" \) -exec grep -lE "translatable|_\(" \{\} \; | sort | uniq >> po/POTFILES.in
--- a/src/CoreAudio/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/CoreAudio/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -15,5 +15,5 @@
 plugindir := ${plugindir}/${OUTPUT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} -I../../intl -I../.. ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS}
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} -I../.. ${GTK_CFLAGS} ${GLIB_CFLAGS} 
+LIBS += ${GTK_LIBS} ${GLIB_LIBS} 
--- a/src/CoreAudio/about.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/CoreAudio/about.c	Fri Jun 13 05:57:25 2008 +0300
@@ -16,7 +16,6 @@
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 #include "coreaudio.h"
-#include <audacious/util.h>
 
 void osx_about(void)
 {
--- a/src/CoreAudio/audio.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/CoreAudio/audio.c	Fri Jun 13 05:57:25 2008 +0300
@@ -18,7 +18,6 @@
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 #include "coreaudio.h"
-#include <audacious/util.h>
 #include <errno.h>
 #include <CoreAudio/CoreAudio.h>
 
--- a/src/CoreAudio/configure.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/CoreAudio/configure.c	Fri Jun 13 05:57:25 2008 +0300
@@ -18,9 +18,8 @@
  */
 
 #include "coreaudio.h"
-#include <audacious/configdb.h>
 #include <CoreAudio/CoreAudio.h>
-
+#include <audacious/plugin.h>
 #include <audacious/i18n.h>
 
 static GtkWidget *configure_win = NULL;
@@ -31,7 +30,7 @@
 
 static void configure_win_ok_cb(GtkWidget * w, gpointer data)
 {
-	ConfigDb *cfgfile;
+	mcs_handle_t *cfgfile;
 
 	osx_cfg.audio_device = audio_device;
 	osx_cfg.mixer_device = mixer_device;
--- a/src/CoreAudio/init.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/CoreAudio/init.c	Fri Jun 13 05:57:25 2008 +0300
@@ -16,7 +16,7 @@
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 #include "coreaudio.h"
-#include <audacious/configdb.h>
+#include <audacious/plugin.h>
 
 OSXConfig osx_cfg;
 
@@ -24,7 +24,7 @@
 
 void osx_init(void)
 {
-	ConfigDb *cfgfile;
+	mcs_handle_t *cfgfile;
 
 	left_volume = 1.0;
 	right_volume = 1.0;
--- a/src/OSS/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/OSS/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -2,11 +2,8 @@
 
 SRCS = OSS.c		\
        mixer.c		\
-       about.c		\
        configure.c	\
-       audio.c		\
-       init.c		\
-       convert.c
+       audio.c
 
 include ../../buildsys.mk
 include ../../extra.mk
@@ -14,5 +11,5 @@
 plugindir := ${plugindir}/${OUTPUT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${OSS_CFLAGS} ${DBUS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} -I../../intl -I../.. -I.
-LIBS += ${OSS_LIBS} ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${OSS_CFLAGS}  ${GTK_CFLAGS} ${GLIB_CFLAGS}  -I../.. -I.
+LIBS += ${OSS_LIBS} ${GTK_LIBS} ${GLIB_LIBS} 
--- a/src/OSS/OSS.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/OSS/OSS.c	Fri Jun 13 05:57:25 2008 +0300
@@ -25,7 +25,81 @@
 #include <audacious/i18n.h>
 #include <stdlib.h>
 
-OutputPlugin oss_op = {
+OSSConfig oss_cfg;
+
+static void oss_about(void)
+{
+    static GtkWidget *dialog;
+
+    if (dialog != NULL)
+        return;
+
+    dialog = audacious_info_dialog(_("About OSS Driver"),
+                               _("Audacious OSS Driver\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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,\n"
+                                 "USA."), _("Ok"), FALSE, NULL, NULL);
+    g_signal_connect(G_OBJECT(dialog), "destroy",
+                     G_CALLBACK(gtk_widget_destroyed), &dialog);
+}
+
+static void oss_init(void)
+{
+    mcs_handle_t *db;
+
+    memset(&oss_cfg, 0, sizeof(OSSConfig));
+
+    oss_cfg.audio_device = 0;
+    oss_cfg.mixer_device = 0;
+    oss_cfg.buffer_size = 3000;
+    oss_cfg.prebuffer = 25;
+    oss_cfg.use_alt_audio_device = FALSE;
+    oss_cfg.alt_audio_device = NULL;
+    oss_cfg.use_master = 0;
+
+    if ((db = aud_cfg_db_open())) {
+        aud_cfg_db_get_int(db, "OSS", "audio_device", &oss_cfg.audio_device);
+        aud_cfg_db_get_int(db, "OSS", "mixer_device", &oss_cfg.mixer_device);
+        aud_cfg_db_get_int(db, "OSS", "buffer_size", &oss_cfg.buffer_size);
+        aud_cfg_db_get_int(db, "OSS", "prebuffer", &oss_cfg.prebuffer);
+        aud_cfg_db_get_bool(db, "OSS", "use_master", &oss_cfg.use_master);
+        aud_cfg_db_get_bool(db, "OSS", "use_alt_audio_device",
+                            &oss_cfg.use_alt_audio_device);
+        aud_cfg_db_get_string(db, "OSS", "alt_audio_device",
+                              &oss_cfg.alt_audio_device);
+        aud_cfg_db_get_bool(db, "OSS", "use_alt_mixer_device",
+                            &oss_cfg.use_alt_mixer_device);
+        aud_cfg_db_get_string(db, "OSS", "alt_mixer_device",
+                              &oss_cfg.alt_mixer_device);
+        aud_cfg_db_close(db);
+    }
+}
+
+static void oss_cleanup(void)
+{
+    if (oss_cfg.alt_audio_device) {
+        g_free(oss_cfg.alt_audio_device);
+        oss_cfg.alt_audio_device = NULL;
+    }
+
+    if (oss_cfg.alt_mixer_device) {
+        g_free(oss_cfg.alt_mixer_device);
+        oss_cfg.alt_mixer_device = NULL;
+    }
+}
+
+static OutputPlugin oss_op = {
     .description = "OSS Output Plugin",                       /* Description */
     .init = oss_init,
     .cleanup = oss_cleanup,
@@ -45,19 +119,6 @@
     .tell_audio = oss_tell
 };
 
-OutputPlugin *oss_oplist[] = { &oss_op, NULL };
+static OutputPlugin *oss_oplist[] = { &oss_op, NULL };
 
 DECLARE_PLUGIN(OSS, NULL, NULL, NULL, oss_oplist, NULL, NULL, NULL, NULL);
-
-void oss_cleanup(void)
-{
-    if (oss_cfg.alt_audio_device) {
-        free(oss_cfg.alt_audio_device);
-        oss_cfg.alt_audio_device = NULL;
-    }
-
-    if (oss_cfg.alt_mixer_device) {
-        free(oss_cfg.alt_mixer_device);
-        oss_cfg.alt_mixer_device = NULL;
-    }
-}
--- a/src/OSS/OSS.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/OSS/OSS.h	Fri Jun 13 05:57:25 2008 +0300
@@ -50,9 +50,6 @@
 
 extern OSSConfig oss_cfg;
 
-void oss_init(void);
-void oss_cleanup(void);
-void oss_about(void);
 void oss_configure(void);
 
 void oss_get_volume(int *l, int *r);
@@ -68,12 +65,6 @@
 int oss_get_output_time(void);
 int oss_get_written_time(void);
 void oss_set_audio_params(void);
-
-void oss_free_convert_buffer(void);
-int (*oss_get_convert_func(int output, int input)) (void **, int);
-int (*oss_get_stereo_convert_func(int output, int input)) (void **, int,
-                                                           int);
-
 void oss_tell(AFormat * fmt, gint * rate, gint * nch);
 
 #endif
--- a/src/OSS/about.c	Fri Jun 13 04:58:39 2008 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,57 +0,0 @@
-/*  BMP - Cross-platform multimedia player
- *  Copyright (C) 2003-2004  BMP development team.
- *
- *  Based on XMMS:
- *  Copyright (C) 1998-2003  XMMS development team.
- *
- *  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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-#include "OSS.h"
-
-#include <glib.h>
-#include <audacious/i18n.h>
-#include <gtk/gtk.h>
-
-#include <audacious/util.h>
-
-
-void
-oss_about(void)
-{
-    static GtkWidget *dialog;
-
-    if (dialog != NULL)
-        return;
-
-    dialog = audacious_info_dialog(_("About OSS Driver"),
-                               _("Audacious OSS Driver\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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,\n"
-                                 "USA."), _("Ok"), FALSE, NULL, NULL);
-    g_signal_connect(G_OBJECT(dialog), "destroy",
-                     G_CALLBACK(gtk_widget_destroyed), &dialog);
-}
--- a/src/OSS/audio.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/OSS/audio.c	Fri Jun 13 05:57:25 2008 +0300
@@ -22,7 +22,6 @@
 extern void close_mixer_device();
 
 #include <glib.h>
-#include <audacious/util.h>
 #include <string.h>
 
 #include <unistd.h>
@@ -49,9 +48,6 @@
 static GThread *buffer_thread;
 static gboolean select_works;
 
-static int (*oss_convert_func) (void **data, int length);
-static int (*oss_stereo_convert_func) (void **data, int length, int fmt);
-
 struct format_info {
     union {
         AFormat xmms;
@@ -70,13 +66,6 @@
 struct format_info input;
 
 /*
- * The format we get from the effect plugin.
- * This will be different from input if the effect plugin does
- * some kind of format conversion.
- */
-struct format_info effect;
-
-/*
  * The format of the data we actually send to the soundcard.
  * This might be different from effect if we need to resample or do
  * some other format conversion.
@@ -96,9 +85,6 @@
 }
 
 
-static gint oss_downsample(gpointer ob, guint length, guint speed,
-                           guint espeed);
-
 static int
 oss_calc_bitrate(int oss_fmt, int rate, int channels)
 {
@@ -159,18 +145,14 @@
 static void
 oss_setup_format(AFormat fmt, int rate, int nch)
 {
-    effect.format.xmms = fmt;
-    effect.frequency = rate;
-    effect.channels = nch;
-    effect.bps = oss_calc_bitrate(oss_get_format(fmt), rate, nch);
-
+    output.bps = oss_calc_bitrate(oss_get_format(fmt), rate, nch);
     output.format.oss = oss_get_format(fmt);
     output.frequency = rate;
     output.channels = nch;
 
 
     fragsize = 0;
-    while ((1L << fragsize) < effect.bps / 25)
+    while ((1L << fragsize) < output.bps / 25)
         fragsize++;
     fragsize--;
 
@@ -188,7 +170,7 @@
 {
     if (!going)
         return 0;
-    return (written * 1000) / effect.bps;
+    return (written * 1000) / output.bps;
 }
 
 gint
@@ -242,12 +224,12 @@
     return (buffer_size - (wr_index - rd_index)) - device_buffer_size - 1;
 }
 
-static inline ssize_t
-write_all(int fd, const void *buf, size_t count)
+static void
+oss_write_audio(gpointer data, size_t length)
 {
     size_t done = 0;
     do {
-        ssize_t n = write(fd, (gchar *) buf + done, count - done);
+        ssize_t n = write(fd, (gchar *) data + done, length - done);
         if (n == -1) {
             if (errno == EINTR)
                 continue;
@@ -255,161 +237,9 @@
                 break;
         }
         done += n;
-    } while (count > done);
-
-    return done;
-}
-
-static void
-oss_write_audio(gpointer data, int length)
-{
-    if (oss_convert_func != NULL)
-        length = oss_convert_func(&data, length);
-
-    if (oss_stereo_convert_func != NULL)
-        length = oss_stereo_convert_func(&data, length, output.format.oss);
-
-    if (effect.frequency == output.frequency)
-        output_bytes += write_all(fd, data, length);
-    else
-        output_bytes += oss_downsample(data, length,
-                                       effect.frequency, output.frequency);
-}
-
-static void
-swap_endian(guint16 * data, int length)
-{
-    int i;
-    for (i = 0; i < length; i += 2, data++)
-        *data = GUINT16_SWAP_LE_BE(*data);
-}
-
-#define NOT_NATIVE_ENDIAN ((IS_BIG_ENDIAN &&				\
-			   (output.format.oss == AFMT_S16_LE ||		\
-			    output.format.oss == AFMT_U16_LE)) ||	\
-			  (!IS_BIG_ENDIAN &&				\
-			   (output.format.oss == AFMT_S16_BE ||		\
-			    output.format.oss == AFMT_U16_BE)))
-
+    } while (length > done);
 
-#define RESAMPLE_STEREO(sample_type)				\
-do {								\
-	const gint shift = sizeof (sample_type);		\
-        gint i, in_samples, out_samples, x, delta;		\
-	sample_type *inptr = (sample_type *)ob, *outptr;	\
-	guint nlen = (((length >> shift) * espeed) / speed);	\
-	if (nlen == 0)						\
-		break;						\
-	nlen <<= shift;						\
-	if (NOT_NATIVE_ENDIAN)					\
-		swap_endian(ob, length);			\
-	if(nlen > nbuffer_size)					\
-	{							\
-		nbuffer = g_realloc(nbuffer, nlen);		\
-		nbuffer_size = nlen;				\
-	}							\
-	outptr = (sample_type *)nbuffer;			\
-	in_samples = length >> shift;				\
-        out_samples = nlen >> shift;				\
-	delta = (in_samples << 12) / out_samples;		\
-	for (x = 0, i = 0; i < out_samples; i++)		\
-	{							\
-		gint x1, frac;					\
-		x1 = (x >> 12) << 12;				\
-		frac = x - x1;					\
-		*outptr++ =					\
-			(sample_type)				\
-			((inptr[(x1 >> 12) << 1] *		\
-			  ((1<<12) - frac) +			\
-			  inptr[((x1 >> 12) + 1) << 1] *	\
-			  frac) >> 12);				\
-		*outptr++ =					\
-			(sample_type)				\
-			((inptr[((x1 >> 12) << 1) + 1] *	\
-			  ((1<<12) - frac) +			\
-			  inptr[(((x1 >> 12) + 1) << 1) + 1] *	\
-			  frac) >> 12);				\
-		x += delta;					\
-	}							\
-	if (NOT_NATIVE_ENDIAN)					\
-		swap_endian(nbuffer, nlen);			\
-	w = write_all(fd, nbuffer, nlen);			\
-} while (0)
-
-
-#define RESAMPLE_MONO(sample_type)				\
-do {								\
-	const gint shift = sizeof (sample_type) - 1;		\
-        gint i, x, delta, in_samples, out_samples;		\
-	sample_type *inptr = (sample_type *)ob, *outptr;	\
-	guint nlen = (((length >> shift) * espeed) / speed);	\
-	if (nlen == 0)						\
-		break;						\
-	nlen <<= shift;						\
-	if (NOT_NATIVE_ENDIAN)					\
-		swap_endian(ob, length);			\
-	if(nlen > nbuffer_size)					\
-	{							\
-		nbuffer = g_realloc(nbuffer, nlen);		\
-		nbuffer_size = nlen;				\
-	}							\
-	outptr = (sample_type *)nbuffer;			\
-	in_samples = length >> shift;				\
-        out_samples = nlen >> shift;				\
-	delta = ((length >> shift) << 12) / out_samples;	\
-	for (x = 0, i = 0; i < out_samples; i++)		\
-	{							\
-		gint x1, frac;					\
-		x1 = (x >> 12) << 12;				\
-		frac = x - x1;					\
-		*outptr++ =					\
-			(sample_type)				\
-			((inptr[x1 >> 12] * ((1<<12) - frac) +	\
-			  inptr[(x1 >> 12) + 1] * frac) >> 12);	\
-		x += delta;					\
-	}							\
-	if (NOT_NATIVE_ENDIAN)					\
-		swap_endian(nbuffer, nlen);			\
-	w = write_all(fd, nbuffer, nlen);			\
-} while (0)
-
-
-static gint
-oss_downsample(gpointer ob, guint length, guint speed, guint espeed)
-{
-    guint w = 0;
-    static gpointer nbuffer = NULL;
-    static guint nbuffer_size = 0;
-
-    switch (output.format.oss) {
-    case AFMT_S16_BE:
-    case AFMT_S16_LE:
-        if (output.channels == 2)
-            RESAMPLE_STEREO(gint16);
-        else
-            RESAMPLE_MONO(gint16);
-        break;
-    case AFMT_U16_BE:
-    case AFMT_U16_LE:
-        if (output.channels == 2)
-            RESAMPLE_STEREO(guint16);
-        else
-            RESAMPLE_MONO(guint16);
-        break;
-    case AFMT_S8:
-        if (output.channels == 2)
-            RESAMPLE_STEREO(gint8);
-        else
-            RESAMPLE_MONO(gint8);
-        break;
-    case AFMT_U8:
-        if (output.channels == 2)
-            RESAMPLE_STEREO(guint8);
-        else
-            RESAMPLE_MONO(guint8);
-        break;
-    }
-    return w;
+    output_bytes += done;
 }
 
 void
@@ -439,7 +269,6 @@
     g_thread_join(buffer_thread);
 
     g_free(device_name);
-    oss_free_convert_buffer();
     wr_index = 0;
     rd_index = 0;
 
@@ -555,19 +384,12 @@
     ioctl(fd, SNDCTL_DSP_STEREO, &stereo);
     output.channels = stereo + 1;
 
-    oss_stereo_convert_func = oss_get_stereo_convert_func(output.channels,
-                                                          effect.channels);
-
     if (ioctl(fd, SNDCTL_DSP_SPEED, &output.frequency) == -1)
         g_warning("SNDCTL_DSP_SPEED ioctl failed: %s", strerror(errno));
 
     if (ioctl(fd, SNDCTL_DSP_GETBLKSIZE, &blk_size) == -1)
         blk_size = 1L << fragsize;
 
-    oss_convert_func =
-        oss_get_convert_func(output.format.oss,
-                             oss_get_format(effect.format.xmms));
-
     /*
      * Stupid hack to find out if the driver support selects, some
      * drivers won't work properly without a select and some won't
--- a/src/OSS/configure.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/OSS/configure.c	Fri Jun 13 05:57:25 2008 +0300
@@ -26,7 +26,6 @@
 #include <stdio.h>
 #include <string.h>
 
-#include <audacious/configdb.h>
 #include <audacious/i18n.h>
 
 
@@ -39,7 +38,7 @@
 static void
 configure_win_ok_cb(GtkWidget * w, gpointer data)
 {
-    ConfigDb *db;
+    mcs_handle_t *db;
 
     oss_cfg.audio_device = audio_device;
     oss_cfg.mixer_device = mixer_device;
--- a/src/OSS/convert.c	Fri Jun 13 04:58:39 2008 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,446 +0,0 @@
-/*
- *  Copyright (C) 2001  Haavard Kvaalen
- *
- *  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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-#include "OSS.h"
-
-struct buffer {
-    void *buffer;
-    int size;
-} format_buffer, stereo_buffer;
-
-
-static void *
-oss_get_convert_buffer(struct buffer *buffer, size_t size)
-{
-    if (size > 0 && size <= (size_t)buffer->size)
-        return buffer->buffer;
-
-    buffer->size = size;
-    buffer->buffer = g_realloc(buffer->buffer, size);
-    return buffer->buffer;
-}
-
-void
-oss_free_convert_buffer(void)
-{
-    oss_get_convert_buffer(&format_buffer, 0);
-    oss_get_convert_buffer(&stereo_buffer, 0);
-}
-
-
-static int
-convert_swap_endian(void **data, int length)
-{
-    guint16 *ptr = *data;
-    int i;
-    for (i = 0; i < length; i += 2, ptr++)
-        *ptr = GUINT16_SWAP_LE_BE(*ptr);
-
-    return i;
-}
-
-static int
-convert_swap_sign_and_endian_to_native(void **data, int length)
-{
-    guint16 *ptr = *data;
-    int i;
-    for (i = 0; i < length; i += 2, ptr++)
-        *ptr = GUINT16_SWAP_LE_BE(*ptr) ^ 1 << 15;
-
-    return i;
-}
-
-static int
-convert_swap_sign_and_endian_to_alien(void **data, int length)
-{
-    guint16 *ptr = *data;
-    int i;
-    for (i = 0; i < length; i += 2, ptr++)
-        *ptr = GUINT16_SWAP_LE_BE(*ptr ^ 1 << 15);
-
-    return i;
-}
-
-static int
-convert_swap_sign16(void **data, int length)
-{
-    gint16 *ptr = *data;
-    int i;
-    for (i = 0; i < length; i += 2, ptr++)
-        *ptr ^= 1 << 15;
-
-    return i;
-}
-
-static int
-convert_swap_sign8(void **data, int length)
-{
-    gint8 *ptr = *data;
-    int i;
-    for (i = 0; i < length; i++)
-        *ptr++ ^= 1 << 7;
-
-    return i;
-}
-
-static int
-convert_to_8_native_endian(void **data, int length)
-{
-    gint8 *output = *data;
-    gint16 *input = *data;
-    int i;
-    for (i = 0; i < length / 2; i++)
-        *output++ = *input++ >> 8;
-
-    return i;
-}
-
-static int
-convert_to_8_native_endian_swap_sign(void **data, int length)
-{
-    gint8 *output = *data;
-    gint16 *input = *data;
-    int i;
-    for (i = 0; i < length / 2; i++)
-        *output++ = (*input++ >> 8) ^ (1 << 7);
-
-    return i;
-}
-
-
-static int
-convert_to_8_alien_endian(void **data, int length)
-{
-    gint8 *output = *data;
-    gint16 *input = *data;
-    int i;
-    for (i = 0; i < length / 2; i++)
-        *output++ = *input++ & 0xff;
-
-    return i;
-}
-
-static int
-convert_to_8_alien_endian_swap_sign(void **data, int length)
-{
-    gint8 *output = *data;
-    gint16 *input = *data;
-    int i;
-    for (i = 0; i < length / 2; i++)
-        *output++ = (*input++ & 0xff) ^ (1 << 7);
-
-    return i;
-}
-
-static int
-convert_to_16_native_endian(void **data, int length)
-{
-    guint8 *input = *data;
-    guint16 *output;
-    int i;
-    *data = oss_get_convert_buffer(&format_buffer, length * 2);
-    output = *data;
-    for (i = 0; i < length; i++)
-        *output++ = *input++ << 8;
-
-    return i * 2;
-}
-
-static int
-convert_to_16_native_endian_swap_sign(void **data, int length)
-{
-    guint8 *input = *data;
-    guint16 *output;
-    int i;
-    *data = oss_get_convert_buffer(&format_buffer, length * 2);
-    output = *data;
-    for (i = 0; i < length; i++)
-        *output++ = (*input++ << 8) ^ (1 << 15);
-
-    return i * 2;
-}
-
-
-static int
-convert_to_16_alien_endian(void **data, int length)
-{
-    guint8 *input = *data;
-    guint16 *output;
-    int i;
-    *data = oss_get_convert_buffer(&format_buffer, length * 2);
-    output = *data;
-    for (i = 0; i < length; i++)
-        *output++ = *input++;
-
-    return i * 2;
-}
-
-static int
-convert_to_16_alien_endian_swap_sign(void **data, int length)
-{
-    guint8 *input = *data;
-    guint16 *output;
-    int i;
-    *data = oss_get_convert_buffer(&format_buffer, length * 2);
-    output = *data;
-    for (i = 0; i < length; i++)
-        *output++ = *input++ ^ (1 << 7);
-
-    return i * 2;
-}
-
-int (*oss_get_convert_func(int output, int input)) (void **, int) {
-    if (output == input)
-        return NULL;
-
-    if ((output == AFMT_U16_BE && input == AFMT_U16_LE) ||
-        (output == AFMT_U16_LE && input == AFMT_U16_BE) ||
-        (output == AFMT_S16_BE && input == AFMT_S16_LE) ||
-        (output == AFMT_S16_LE && input == AFMT_S16_BE))
-        return convert_swap_endian;
-
-    if ((output == AFMT_U16_BE && input == AFMT_S16_BE) ||
-        (output == AFMT_U16_LE && input == AFMT_S16_LE) ||
-        (output == AFMT_S16_BE && input == AFMT_U16_BE) ||
-        (output == AFMT_S16_LE && input == AFMT_U16_LE))
-        return convert_swap_sign16;
-
-    if ((IS_BIG_ENDIAN &&
-         ((output == AFMT_U16_BE && input == AFMT_S16_LE) ||
-          (output == AFMT_S16_BE && input == AFMT_U16_LE))) ||
-        (!IS_BIG_ENDIAN &&
-         ((output == AFMT_U16_LE && input == AFMT_S16_BE) ||
-          (output == AFMT_S16_LE && input == AFMT_U16_BE))))
-        return convert_swap_sign_and_endian_to_native;
-
-    if ((!IS_BIG_ENDIAN &&
-         ((output == AFMT_U16_BE && input == AFMT_S16_LE) ||
-          (output == AFMT_S16_BE && input == AFMT_U16_LE))) ||
-        (IS_BIG_ENDIAN &&
-         ((output == AFMT_U16_LE && input == AFMT_S16_BE) ||
-          (output == AFMT_S16_LE && input == AFMT_U16_BE))))
-        return convert_swap_sign_and_endian_to_alien;
-
-    if ((IS_BIG_ENDIAN &&
-         ((output == AFMT_U8 && input == AFMT_U16_BE) ||
-          (output == AFMT_S8 && input == AFMT_S16_BE))) ||
-        (!IS_BIG_ENDIAN &&
-         ((output == AFMT_U8 && input == AFMT_U16_LE) ||
-          (output == AFMT_S8 && input == AFMT_S16_LE))))
-        return convert_to_8_native_endian;
-
-    if ((IS_BIG_ENDIAN &&
-         ((output == AFMT_U8 && input == AFMT_S16_BE) ||
-          (output == AFMT_S8 && input == AFMT_U16_BE))) ||
-        (!IS_BIG_ENDIAN &&
-         ((output == AFMT_U8 && input == AFMT_S16_LE) ||
-          (output == AFMT_S8 && input == AFMT_U16_LE))))
-        return convert_to_8_native_endian_swap_sign;
-
-    if ((!IS_BIG_ENDIAN &&
-         ((output == AFMT_U8 && input == AFMT_U16_BE) ||
-          (output == AFMT_S8 && input == AFMT_S16_BE))) ||
-        (IS_BIG_ENDIAN &&
-         ((output == AFMT_U8 && input == AFMT_U16_LE) ||
-          (output == AFMT_S8 && input == AFMT_S16_LE))))
-        return convert_to_8_alien_endian;
-
-    if ((!IS_BIG_ENDIAN &&
-         ((output == AFMT_U8 && input == AFMT_S16_BE) ||
-          (output == AFMT_S8 && input == AFMT_U16_BE))) ||
-        (IS_BIG_ENDIAN &&
-         ((output == AFMT_U8 && input == AFMT_S16_LE) ||
-          (output == AFMT_S8 && input == AFMT_U16_LE))))
-        return convert_to_8_alien_endian_swap_sign;
-
-    if ((output == AFMT_U8 && input == AFMT_S8) ||
-        (output == AFMT_S8 && input == AFMT_U8))
-        return convert_swap_sign8;
-
-    if ((IS_BIG_ENDIAN &&
-         ((output == AFMT_U16_BE && input == AFMT_U8) ||
-          (output == AFMT_S16_BE && input == AFMT_S8))) ||
-        (!IS_BIG_ENDIAN &&
-         ((output == AFMT_U16_LE && input == AFMT_U8) ||
-          (output == AFMT_S16_LE && input == AFMT_S8))))
-        return convert_to_16_native_endian;
-
-    if ((IS_BIG_ENDIAN &&
-         ((output == AFMT_U16_BE && input == AFMT_S8) ||
-          (output == AFMT_S16_BE && input == AFMT_U8))) ||
-        (!IS_BIG_ENDIAN &&
-         ((output == AFMT_U16_LE && input == AFMT_S8) ||
-          (output == AFMT_S16_LE && input == AFMT_U8))))
-        return convert_to_16_native_endian_swap_sign;
-
-    if ((!IS_BIG_ENDIAN &&
-         ((output == AFMT_U16_BE && input == AFMT_U8) ||
-          (output == AFMT_S16_BE && input == AFMT_S8))) ||
-        (IS_BIG_ENDIAN &&
-         ((output == AFMT_U16_LE && input == AFMT_U8) ||
-          (output == AFMT_S16_LE && input == AFMT_S8))))
-        return convert_to_16_alien_endian;
-
-    if ((!IS_BIG_ENDIAN &&
-         ((output == AFMT_U16_BE && input == AFMT_S8) ||
-          (output == AFMT_S16_BE && input == AFMT_U8))) ||
-        (IS_BIG_ENDIAN &&
-         ((output == AFMT_U16_LE && input == AFMT_S8) ||
-          (output == AFMT_S16_LE && input == AFMT_U8))))
-        return convert_to_16_alien_endian_swap_sign;
-
-    g_warning("Translation needed, but not available.\n"
-              "Input: %d; Output %d.", input, output);
-    return NULL;
-}
-
-static int
-convert_mono_to_stereo(void **data, int length, int fmt)
-{
-    int i;
-    void *outbuf = oss_get_convert_buffer(&stereo_buffer, length * 2);
-
-    if (fmt == AFMT_U8 || fmt == AFMT_S8) {
-        guint8 *output = outbuf, *input = *data;
-        for (i = 0; i < length; i++) {
-            *output++ = *input;
-            *output++ = *input;
-            input++;
-        }
-    }
-    else {
-        guint16 *output = outbuf, *input = *data;
-        for (i = 0; i < length / 2; i++) {
-            *output++ = *input;
-            *output++ = *input;
-            input++;
-        }
-    }
-    *data = outbuf;
-
-    return length * 2;
-}
-
-static int
-convert_stereo_to_mono(void **data, int length, int fmt)
-{
-    int i;
-
-    switch (fmt) {
-    case AFMT_U8:
-        {
-            guint8 *output = *data, *input = *data;
-            for (i = 0; i < length / 2; i++) {
-                guint16 tmp;
-                tmp = *input++;
-                tmp += *input++;
-                *output++ = tmp / 2;
-            }
-        }
-        break;
-    case AFMT_S8:
-        {
-            gint8 *output = *data, *input = *data;
-            for (i = 0; i < length / 2; i++) {
-                gint16 tmp;
-                tmp = *input++;
-                tmp += *input++;
-                *output++ = tmp / 2;
-            }
-        }
-        break;
-    case AFMT_U16_LE:
-        {
-            guint16 *output = *data, *input = *data;
-            for (i = 0; i < length / 4; i++) {
-                guint32 tmp;
-                guint16 stmp;
-                tmp = GUINT16_FROM_LE(*input);
-                input++;
-                tmp += GUINT16_FROM_LE(*input);
-                input++;
-                stmp = tmp / 2;
-                *output++ = GUINT16_TO_LE(stmp);
-            }
-        }
-        break;
-    case AFMT_U16_BE:
-        {
-            guint16 *output = *data, *input = *data;
-            for (i = 0; i < length / 4; i++) {
-                guint32 tmp;
-                guint16 stmp;
-                tmp = GUINT16_FROM_BE(*input);
-                input++;
-                tmp += GUINT16_FROM_BE(*input);
-                input++;
-                stmp = tmp / 2;
-                *output++ = GUINT16_TO_BE(stmp);
-            }
-        }
-        break;
-    case AFMT_S16_LE:
-        {
-            gint16 *output = *data, *input = *data;
-            for (i = 0; i < length / 4; i++) {
-                gint32 tmp;
-                gint16 stmp;
-                tmp = GINT16_FROM_LE(*input);
-                input++;
-                tmp += GINT16_FROM_LE(*input);
-                input++;
-                stmp = tmp / 2;
-                *output++ = GINT16_TO_LE(stmp);
-            }
-        }
-        break;
-    case AFMT_S16_BE:
-        {
-            gint16 *output = *data, *input = *data;
-            for (i = 0; i < length / 4; i++) {
-                gint32 tmp;
-                gint16 stmp;
-                tmp = GINT16_FROM_BE(*input);
-                input++;
-                tmp += GINT16_FROM_BE(*input);
-                input++;
-                stmp = tmp / 2;
-                *output++ = GINT16_TO_BE(stmp);
-            }
-        }
-        break;
-    default:
-        g_error("unknown format");
-    }
-
-    return length / 2;
-}
-
-int (*oss_get_stereo_convert_func(int output, int input)) (void **, int, int) {
-    if (output == input)
-        return NULL;
-
-    if (input == 1 && output == 2)
-        return convert_mono_to_stereo;
-    if (input == 2 && output == 1)
-        return convert_stereo_to_mono;
-
-    g_warning("Input has %d channels, soundcard uses %d channels\n"
-              "No conversion is available", input, output);
-    return NULL;
-}
--- a/src/OSS/init.c	Fri Jun 13 04:58:39 2008 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,61 +0,0 @@
-/*  BMP - Cross-platform multimedia player
- *  Copyright (C) 2003-2004  BMP development team.
- *
- *  Based on XMMS:
- *  Copyright (C) 1998-2003  XMMS development team.
- *
- *  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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-#include <glib.h>
-#include <string.h>
-#include <audacious/configdb.h>
-#include "OSS.h"
-
-
-OSSConfig oss_cfg;
-
-void
-oss_init(void)
-{
-    ConfigDb *db;
-
-    memset(&oss_cfg, 0, sizeof(OSSConfig));
-
-    oss_cfg.audio_device = 0;
-    oss_cfg.mixer_device = 0;
-    oss_cfg.buffer_size = 3000;
-    oss_cfg.prebuffer = 25;
-    oss_cfg.use_alt_audio_device = FALSE;
-    oss_cfg.alt_audio_device = NULL;
-    oss_cfg.use_master = 0;
-
-    if ((db = aud_cfg_db_open())) {
-        aud_cfg_db_get_int(db, "OSS", "audio_device", &oss_cfg.audio_device);
-        aud_cfg_db_get_int(db, "OSS", "mixer_device", &oss_cfg.mixer_device);
-        aud_cfg_db_get_int(db, "OSS", "buffer_size", &oss_cfg.buffer_size);
-        aud_cfg_db_get_int(db, "OSS", "prebuffer", &oss_cfg.prebuffer);
-        aud_cfg_db_get_bool(db, "OSS", "use_master", &oss_cfg.use_master);
-        aud_cfg_db_get_bool(db, "OSS", "use_alt_audio_device",
-                            &oss_cfg.use_alt_audio_device);
-        aud_cfg_db_get_string(db, "OSS", "alt_audio_device",
-                              &oss_cfg.alt_audio_device);
-        aud_cfg_db_get_bool(db, "OSS", "use_alt_mixer_device",
-                            &oss_cfg.use_alt_mixer_device);
-        aud_cfg_db_get_string(db, "OSS", "alt_mixer_device",
-                              &oss_cfg.alt_mixer_device);
-        aud_cfg_db_close(db);
-    }
-}
--- a/src/OSS4/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/OSS4/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -1,10 +1,8 @@
 PLUGIN = OSS4${PLUGIN_SUFFIX}
 
 SRCS = OSS4.c		\
-       about.c		\
        configure.c	\
        audio.c		\
-       init.c		\
        convert.c
 
 include ../../buildsys.mk
@@ -13,5 +11,5 @@
 plugindir := ${plugindir}/${OUTPUT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} -I/usr/lib/oss/include -I../../intl -I../.. ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS}
-LIBS += ${OSS_LIBS} ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} -I/usr/lib/oss/include -I../.. ${GTK_CFLAGS} ${GLIB_CFLAGS} 
+LIBS += ${OSS_LIBS} ${GTK_LIBS} ${GLIB_LIBS} 
--- a/src/OSS4/OSS4.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/OSS4/OSS4.c	Fri Jun 13 05:57:25 2008 +0300
@@ -22,11 +22,85 @@
 #include "OSS4.h"
 
 #include <glib.h>
+#include <audacious/plugin.h>
 #include <audacious/i18n.h>
 #include <stdlib.h>
-#include <audacious/configdb.h>
+
+OSSConfig oss_cfg;
+
+static void oss_about(void)
+{
+    static GtkWidget *dialog;
+
+    if (dialog != NULL)
+        return;
+
+    dialog = audacious_info_dialog(_("About OSSv4 Driver"),
+                               _("Audacious OSSv4 Driver\n\n"
+                                 "Based on the OSSv3 Output plugin,\n" 
+                                 "Ported to OSSv4's VMIX by Cristi Magherusan <majeru@gentoo.ro>\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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,\n"
+                                 "USA."), _("Ok"), FALSE, NULL, NULL);
+    g_signal_connect(G_OBJECT(dialog), "destroy",
+                     G_CALLBACK(gtk_widget_destroyed), &dialog);
+}
+
+static void oss_init(void)
+{
+    mcs_handle_t *db;
+
+    memset(&oss_cfg, 0, sizeof(OSSConfig));
 
-OutputPlugin oss_op = {
+    oss_cfg.audio_device = 0;
+    oss_cfg.buffer_size = 3000;
+    oss_cfg.prebuffer = 25;
+    oss_cfg.use_alt_audio_device = FALSE;
+    oss_cfg.alt_audio_device = NULL;
+
+    if ((db = aud_cfg_db_open())) {
+        aud_cfg_db_get_int(db, "OSS", "audio_device", &oss_cfg.audio_device);
+        aud_cfg_db_get_int(db, "OSS", "buffer_size", &oss_cfg.buffer_size);
+        aud_cfg_db_get_int(db, "OSS", "prebuffer", &oss_cfg.prebuffer);
+        aud_cfg_db_get_bool(db, "OSS", "save_volume", &oss_cfg.save_volume);
+        aud_cfg_db_get_bool(db, "OSS", "use_alt_audio_device",
+                            &oss_cfg.use_alt_audio_device);
+        aud_cfg_db_get_string(db, "OSS", "alt_audio_device",
+                              &oss_cfg.alt_audio_device);
+        aud_cfg_db_get_int(db, "OSS", "saved_volume", &vol);
+        aud_cfg_db_close(db);
+    }
+        //volume gets saved anyway, but is ignored unless "saved_volume" is true
+        if(!oss_cfg.save_volume)
+            vol=0x6464;  //maximum
+}
+
+static void oss_cleanup(void)
+{
+    mcs_handle_t *db;
+    db = aud_cfg_db_open();
+    aud_cfg_db_set_int(db, "OSS", "saved_volume", vol);
+    aud_cfg_db_close(db);
+
+    if (oss_cfg.alt_audio_device) {
+        g_free(oss_cfg.alt_audio_device);
+        oss_cfg.alt_audio_device = NULL;
+    }
+   
+}
+
+static OutputPlugin oss4_op = {
     .description = "OSS4 Output Plugin",                      /* Description */
     .init = oss_init,
     .cleanup = oss_cleanup,
@@ -46,20 +120,6 @@
     .tell_audio = oss_tell
 };
 
-OutputPlugin *oss_oplist[] = { &oss_op, NULL };
-
-DECLARE_PLUGIN(OSS4, NULL, NULL, NULL, oss_oplist, NULL, NULL, NULL, NULL);
+static OutputPlugin *oss4_oplist[] = { &oss4_op, NULL };
 
-void oss_cleanup(void)
-{
-    ConfigDb *db;
-    db = aud_cfg_db_open();
-    aud_cfg_db_set_int(db, "OSS", "saved_volume", vol);
-    aud_cfg_db_close(db);
-
-    if (oss_cfg.alt_audio_device) {
-        free(oss_cfg.alt_audio_device);
-        oss_cfg.alt_audio_device = NULL;
-    }
-   
-}
+DECLARE_PLUGIN(OSS4, NULL, NULL, NULL, oss4_oplist, NULL, NULL, NULL, NULL);
--- a/src/OSS4/OSS4.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/OSS4/OSS4.h	Fri Jun 13 05:57:25 2008 +0300
@@ -48,9 +48,6 @@
 
 extern OSSConfig oss_cfg;
 int vol;
-void oss_init(void);
-void oss_cleanup(void);
-void oss_about(void);
 void oss_configure(void);
 
 void oss_get_volume(int *l, int *r);
--- a/src/OSS4/about.c	Fri Jun 13 04:58:39 2008 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-/*  Audacious OSS4 output plugin
- *  Copyright (C) 2007 Cristi Magherusan
- *  
- *  Based on BMP - Cross-platform multimedia player
- *  Copyright (C) 2003-2004  BMP development team.
- *
- *  Based on XMMS:
- *  Copyright (C) 1998-2003  XMMS development team.
- *
- *  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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-#include "OSS4.h"
-
-#include <glib.h>
-#include <audacious/i18n.h>
-#include <gtk/gtk.h>
-
-#include <audacious/util.h>
-
-
-void
-oss_about(void)
-{
-    static GtkWidget *dialog;
-
-    if (dialog != NULL)
-        return;
-
-    dialog = audacious_info_dialog(_("About OSSv4 Driver"),
-                               _("Audacious OSSv4 Driver\n\n"
-                                 "Based on the OSSv3 Output plugin,\n" 
-                                 "Ported to OSSv4's VMIX by Cristi Magherusan <majeru@gentoo.ro>\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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,\n"
-                                 "USA."), _("Ok"), FALSE, NULL, NULL);
-    g_signal_connect(G_OBJECT(dialog), "destroy",
-                     G_CALLBACK(gtk_widget_destroyed), &dialog);
-}
--- a/src/OSS4/audio.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/OSS4/audio.c	Fri Jun 13 05:57:25 2008 +0300
@@ -22,7 +22,6 @@
 extern void close_mixer_device();
 
 #include <glib.h>
-#include <audacious/util.h>
 #include <string.h>
 
 #include <unistd.h>
--- a/src/OSS4/configure.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/OSS4/configure.c	Fri Jun 13 05:57:25 2008 +0300
@@ -25,9 +25,7 @@
 #include <gtk/gtk.h>
 #include <stdio.h>
 #include <string.h>
-
-#include <audacious/configdb.h>
-#include <audacious/vfs.h>
+#include <audacious/plugin.h>
 #include <audacious/i18n.h>
 
 
@@ -39,7 +37,7 @@
 static void
 configure_win_ok_cb(GtkWidget * w, gpointer data)
 {
-    ConfigDb *db;
+    mcs_handle_t *db;
 
     oss_cfg.audio_device = audio_device;
     oss_cfg.buffer_size =
--- a/src/OSS4/init.c	Fri Jun 13 04:58:39 2008 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-/*  BMP - Cross-platform multimedia player
- *  Copyright (C) 2003-2004  BMP development team.
- *
- *  Based on XMMS:
- *  Copyright (C) 1998-2003  XMMS development team.
- *
- *  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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-#include <glib.h>
-#include <string.h>
-#include <audacious/configdb.h>
-#include "OSS4.h"
-
-
-OSSConfig oss_cfg;
-
-void
-oss_init(void)
-{
-    ConfigDb *db;
-
-    memset(&oss_cfg, 0, sizeof(OSSConfig));
-
-    oss_cfg.audio_device = 0;
-    oss_cfg.buffer_size = 3000;
-    oss_cfg.prebuffer = 25;
-    oss_cfg.use_alt_audio_device = FALSE;
-    oss_cfg.alt_audio_device = NULL;
-
-    if ((db = aud_cfg_db_open())) {
-        aud_cfg_db_get_int(db, "OSS", "audio_device", &oss_cfg.audio_device);
-        aud_cfg_db_get_int(db, "OSS", "buffer_size", &oss_cfg.buffer_size);
-        aud_cfg_db_get_int(db, "OSS", "prebuffer", &oss_cfg.prebuffer);
-        aud_cfg_db_get_bool(db, "OSS", "save_volume", &oss_cfg.save_volume);
-        aud_cfg_db_get_bool(db, "OSS", "use_alt_audio_device",
-                            &oss_cfg.use_alt_audio_device);
-        aud_cfg_db_get_string(db, "OSS", "alt_audio_device",
-                              &oss_cfg.alt_audio_device);
-        aud_cfg_db_get_int(db, "OSS", "saved_volume", &vol);
-        aud_cfg_db_close(db);
-    }
-        //volume gets saved anyway, but is ignored unless "saved_volume" is true
-        if(!oss_cfg.save_volume)
-            vol=0x6464;  //maximum
-           
-
-}
--- a/src/aac/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/aac/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -55,5 +55,5 @@
 plugindir := ${plugindir}/${INPUT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS} -fsigned-char
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${DBUS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} -I../.. -I. -I./include -I./libfaad2 -I./mp4ff -DUSE_TAGGING=1
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${MOWGLI_LIBS} -lm
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS}  ${GTK_CFLAGS} ${GLIB_CFLAGS}  -I../.. -I. -I./include -I./libfaad2 -I./mp4ff -DUSE_TAGGING=1
+LIBS += ${GTK_LIBS} ${GLIB_LIBS}  ${MOWGLI_LIBS} -lm
--- a/src/aac/libmp4.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/aac/libmp4.c	Fri Jun 13 05:57:25 2008 +0300
@@ -8,10 +8,7 @@
 
 #include <audacious/plugin.h>
 #include <audacious/output.h>
-#include <audacious/util.h>
 #include <audacious/i18n.h>
-#include <audacious/strings.h>
-#include <audacious/main.h>
 
 #define MP4_VERSION VERSION
 #define SBR_DEC
--- a/src/aac/mp4_utils.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/aac/mp4_utils.c	Fri Jun 13 05:57:25 2008 +0300
@@ -10,7 +10,6 @@
 #include <string.h>
 #include <stdlib.h>
 #include <audacious/plugin.h>
-#include <audacious/util.h>
 
 const char *mp4AudioNames[]=
   {
--- a/src/adplug/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/adplug/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -60,5 +60,5 @@
 
 CFLAGS += ${PLUGIN_CFLAGS}
 CXXFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${BINIO_CFLAGS} -I../../intl -I../.. -I./core -Dstricmp=strcasecmp
-LIBS += ${BINIO_LIBS} ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${MOWGLI_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS}  ${BINIO_CFLAGS} -I../.. -I./core -Dstricmp=strcasecmp
+LIBS += ${BINIO_LIBS} ${GTK_LIBS} ${GLIB_LIBS}  ${MOWGLI_LIBS}
--- a/src/adplug/adplug-xmms.cc	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/adplug/adplug-xmms.cc	Fri Jun 13 05:57:25 2008 +0300
@@ -33,9 +33,7 @@
 extern "C"
 {
 #include <audacious/plugin.h>
-#include <audacious/configdb.h>
 #include <audacious/output.h>
-#include <audacious/util.h>
 }
 
 
@@ -1038,7 +1036,7 @@
 adplug_init (void)
 {
   dbg_printf ("adplug_init(): open, ");
-  ConfigDb *db = aud_cfg_db_open ();
+  mcs_handle_t *db = aud_cfg_db_open ();
 
   // Read configuration
   dbg_printf ("read, ");
@@ -1090,7 +1088,7 @@
 adplug_quit (void)
 {
   dbg_printf ("adplug_quit(): open, ");
-  ConfigDb *db = aud_cfg_db_open ();
+  mcs_handle_t *db = aud_cfg_db_open ();
 
   // Close database
   dbg_printf ("db, ");
@@ -1126,6 +1124,13 @@
 
 /***** Plugin (exported) *****/
 
+const gchar *fmts[] =
+    { "a2m", "adl", "amd", "bam", "cff", "cmf", "d00", "dfm", "dmo", "dro",
+      "dtm", "hsc", "hsp", "ins", "jbm", "ksm", "laa", "lds", "m", "mad",
+      "mkj", "msc", "rad", "raw", "rix", "rol", "s3m", "sa2", "sat", "sci",
+      "sng", "wlf", "xad", "xsm",
+      NULL };
+
 InputPlugin adplug_ip = {
   NULL,                         // handle (filled by XMMS)
   NULL,                         // filename (filled by XMMS)
@@ -1153,10 +1158,8 @@
   adplug_info_box,
   NULL,                         // output plugin (filled by XMMS)
   adplug_get_tuple,
-  NULL,
-  NULL,
   adplug_is_our_fd,
-  NULL,
+  (gchar **)fmts,
 };
 
 InputPlugin *adplug_iplist[] = { &adplug_ip, NULL };
--- a/src/alac/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/alac/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -11,5 +11,5 @@
 plugindir := ${plugindir}/${INPUT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${DBUS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${ARCH_DEFINES} -I../../intl -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS}  ${GTK_CFLAGS} ${GLIB_CFLAGS}  ${ARCH_DEFINES} -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS} 
--- a/src/alac/alac.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/alac/alac.c	Fri Jun 13 05:57:25 2008 +0300
@@ -263,7 +263,9 @@
     }
     return i;
 }
-#elif defined(__GNUC__) && (defined(_X86) || defined(__i386) || defined(i386))
+
+#elif defined(__GNUC__) && (defined(_X86) || defined(__i386) || defined(i386) \
+                        ||  defined(_X86_64) || defined(__x86_64__) || defined(x86_64))
 /* for some reason the unrolled version (below) is
  * actually faster than this. yay intel!
  */
--- a/src/alac/plugin.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/alac/plugin.c	Fri Jun 13 05:57:25 2008 +0300
@@ -46,10 +46,7 @@
 #include <audacious/i18n.h>
 
 #include <audacious/plugin.h>
-#include <audacious/main.h>
 #include <audacious/output.h>
-#include <audacious/vfs.h>
-#include <audacious/util.h>
 
 #include "demux.h"
 #include "decomp.h"
--- a/src/alac/stream.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/alac/stream.c	Fri Jun 13 05:57:25 2008 +0300
@@ -45,7 +45,6 @@
 #include <errno.h>
 
 #include <audacious/plugin.h>
-#include <audacious/vfs.h>
 
 #include "stream.h"
 
--- a/src/alac/stream.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/alac/stream.h	Fri Jun 13 05:57:25 2008 +0300
@@ -14,7 +14,6 @@
 #endif
 
 #include <audacious/plugin.h>
-#include <audacious/vfs.h>
 
 typedef struct stream_tTAG stream_t;
 
--- a/src/alarm/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/alarm/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -9,5 +9,5 @@
 plugindir := ${plugindir}/${GENERAL_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${BEEP_DEFINES} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} -I../../intl -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${BEEP_DEFINES} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS}  -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS} 
--- a/src/alarm/alarm.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/alarm/alarm.c	Fri Jun 13 05:57:25 2008 +0300
@@ -40,7 +40,6 @@
 #include <stdio.h>
 #include <audacious/plugin.h>
 #include <audacious/auddrct.h>
-#include <audacious/configdb.h>
 #include <gdk/gdk.h>
 #include <gtk/gtk.h>
 #include <pthread.h>
@@ -173,7 +172,7 @@
 void alarm_save(GtkButton *w, gpointer data)
 {
    int daynum = 0;  // used to identify day number
-   ConfigDb *conf;
+   mcs_handle_t *conf;
 
    DEBUG("alarm_save\n");
 
@@ -292,7 +291,7 @@
 static void alarm_read_config()
 {
    int daynum = 0;   // used for day number
-   ConfigDb *conf;
+   mcs_handle_t *conf;
 
    DEBUG("alarm_read_config\n");
 
--- a/src/alsa/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/alsa/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -3,8 +3,7 @@
 SRCS = alsa.c		\
        about.c		\
        audio.c		\
-       configure.c	\
-       init.c
+       configure.c
 
 include ../../buildsys.mk
 include ../../extra.mk
@@ -12,5 +11,5 @@
 plugindir := ${plugindir}/${OUTPUT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${DBUS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${ALSA_CFLAGS} -I../../intl -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${ALSA_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS}  ${GTK_CFLAGS} ${GLIB_CFLAGS}  ${ALSA_CFLAGS} -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS}  ${ALSA_LIBS}
--- a/src/alsa/about.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/alsa/about.c	Fri Jun 13 05:57:25 2008 +0300
@@ -17,7 +17,6 @@
  */
 
 #include "alsa.h"
-#include <audacious/util.h>
 
 void alsa_about(void)
 {
--- a/src/alsa/alsa.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/alsa/alsa.c	Fri Jun 13 05:57:25 2008 +0300
@@ -17,9 +17,64 @@
  */
 
 #include "alsa.h"
+#include <glib.h>
 #include <stdlib.h>
+#include <dlfcn.h>
+#include <ctype.h>
+
+struct alsa_config alsa_cfg;
+
+
+static void alsa_cleanup(void)
+{
+	if (alsa_cfg.pcm_device) {
+		free(alsa_cfg.pcm_device);
+		alsa_cfg.pcm_device = NULL;
+	}
+
+	if (alsa_cfg.mixer_device) {
+		free(alsa_cfg.mixer_device);
+		alsa_cfg.mixer_device = NULL;
+	}
+}
+
+
+static void alsa_init(void)
+{
+	mcs_handle_t *cfgfile;
 
-OutputPlugin alsa_op =
+	memset(&alsa_cfg, 0, sizeof (alsa_cfg));
+	
+	alsa_cfg.buffer_time = 500;
+	alsa_cfg.period_time = 100;
+	alsa_cfg.debug = 0;
+	alsa_cfg.vol.left = 100;
+	alsa_cfg.vol.right = 100;
+
+	cfgfile = aud_cfg_db_open();
+	if (!aud_cfg_db_get_string(cfgfile, ALSA_CFGID, "pcm_device",
+				  &alsa_cfg.pcm_device))
+		alsa_cfg.pcm_device = g_strdup("default");
+	g_message("device: %s", alsa_cfg.pcm_device);
+	if (!aud_cfg_db_get_string(cfgfile, ALSA_CFGID, "mixer_device",
+				  &alsa_cfg.mixer_device))
+		alsa_cfg.mixer_device = g_strdup("PCM");
+	aud_cfg_db_get_int(cfgfile, ALSA_CFGID, "mixer_card", &alsa_cfg.mixer_card);
+	aud_cfg_db_get_int(cfgfile, ALSA_CFGID, "buffer_time", &alsa_cfg.buffer_time);
+	aud_cfg_db_get_int(cfgfile, ALSA_CFGID, "period_time", &alsa_cfg.period_time);
+
+	aud_cfg_db_get_bool(cfgfile, ALSA_CFGID, "debug", &alsa_cfg.debug);
+	aud_cfg_db_close(cfgfile);
+
+	if (dlopen("libasound.so.2", RTLD_NOW | RTLD_GLOBAL) == NULL)
+	{
+		g_message("Cannot load alsa library: %s", dlerror());
+		/* FIXME, this plugin wont work... */
+	}
+}
+
+
+static OutputPlugin alsa_op =
 {
 	.description = "ALSA Output Plugin",
 	.init = alsa_init,
@@ -43,16 +98,3 @@
 OutputPlugin *alsa_oplist[] = { &alsa_op, NULL };
 
 DECLARE_PLUGIN(alsa, NULL, NULL, NULL, alsa_oplist, NULL, NULL, NULL, NULL)
-
-void alsa_cleanup(void)
-{
-	if (alsa_cfg.pcm_device) {
-		free(alsa_cfg.pcm_device);
-		alsa_cfg.pcm_device = NULL;
-	}
-
-	if (alsa_cfg.mixer_device) {
-		free(alsa_cfg.mixer_device);
-		alsa_cfg.mixer_device = NULL;
-	}
-}
--- a/src/alsa/alsa.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/alsa/alsa.h	Fri Jun 13 05:57:25 2008 +0300
@@ -25,9 +25,6 @@
 
 #include "config.h"
 
-#include <audacious/util.h>
-#include <audacious/configdb.h>
-#include <audacious/main.h>
 #include <audacious/plugin.h>
 #include <audacious/i18n.h>
 
@@ -38,11 +35,7 @@
 
 #include <gtk/gtk.h>
 
-#ifdef WORDS_BIGENDIAN
-# define IS_BIG_ENDIAN TRUE
-#else
-# define IS_BIG_ENDIAN FALSE
-#endif
+#define ALSA_CFGID  "ALSA"
 
 extern OutputPlugin op;
 
@@ -62,8 +55,6 @@
 
 extern struct alsa_config alsa_cfg;
 
-void alsa_init(void);
-void alsa_cleanup(void);
 void alsa_about(void);
 void alsa_configure(void);
 int alsa_get_mixer(snd_mixer_t **mixer, int card);
--- a/src/alsa/audio.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/alsa/audio.c	Fri Jun 13 05:57:25 2008 +0300
@@ -53,8 +53,7 @@
 static snd_mixer_elem_t *pcm_element;
 static snd_mixer_t *mixer;
 
-static volatile gboolean going;
-static gboolean paused, mixer_start = TRUE;
+static gboolean going, paused, mixer_start = TRUE;
 static gboolean prebuffer, remove_prebuffer;
 
 static gboolean alsa_can_pause;
@@ -65,12 +64,10 @@
 static char *thread_buffer;	 /* audio intermediate buffer */
 static int rd_index, wr_index;	 /* current read/write position in int-buffer */
 static gboolean pause_request;	 /* pause status currently requested */
-static volatile int flush_request;	 /* flush status (time) currently requested */
+static int flush_request;	 /* flush status (time) currently requested */
 static int prebuffer_size;
 GStaticMutex alsa_mutex = G_STATIC_MUTEX_INIT;
 
-static guint mixer_timeout;
-
 struct snd_format {
 	unsigned int rate;
 	unsigned int channels;
@@ -464,20 +461,6 @@
 	return 0;
 }
 
-static int alsa_mixer_timeout(void *data)
-{
-	if (mixer)
-	{
-		snd_mixer_close(mixer);
-		mixer = NULL;
-		pcm_element = NULL;
-	}
-	mixer_timeout = 0;
-	mixer_start = TRUE;
-
-	return FALSE;
-}
-
 static void alsa_cleanup_mixer(void)
 {
 	pcm_element = NULL;
@@ -511,10 +494,6 @@
 					    &lr);
 	*l = ll;
 	*r = lr;
-
-	if (mixer_timeout)
-		gtk_timeout_remove(mixer_timeout);
-	mixer_timeout = gtk_timeout_add(5000, alsa_mixer_timeout, NULL);
 }
 
 
--- a/src/alsa/configure.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/alsa/configure.c	Fri Jun 13 05:57:25 2008 +0300
@@ -46,15 +46,15 @@
 
 void alsa_save_config(void)
 {
-	ConfigDb *cfgfile = aud_cfg_db_open();
+	mcs_handle_t *cfgfile = aud_cfg_db_open();
 
-	aud_cfg_db_set_int(cfgfile, "ALSA", "buffer_time", alsa_cfg.buffer_time);
-	aud_cfg_db_set_int(cfgfile, "ALSA", "period_time", alsa_cfg.period_time);
-	aud_cfg_db_set_string(cfgfile,"ALSA","pcm_device", alsa_cfg.pcm_device);
-	aud_cfg_db_set_int(cfgfile, "ALSA", "mixer_card", alsa_cfg.mixer_card);
-	aud_cfg_db_set_string(cfgfile,"ALSA","mixer_device", alsa_cfg.mixer_device);
-	aud_cfg_db_set_int(cfgfile, "ALSA", "volume_left", alsa_cfg.vol.left);
-	aud_cfg_db_set_int(cfgfile, "ALSA", "volume_right", alsa_cfg.vol.right);
+	aud_cfg_db_set_int(cfgfile, ALSA_CFGID, "buffer_time", alsa_cfg.buffer_time);
+	aud_cfg_db_set_int(cfgfile, ALSA_CFGID, "period_time", alsa_cfg.period_time);
+	aud_cfg_db_set_string(cfgfile,ALSA_CFGID,"pcm_device", alsa_cfg.pcm_device);
+	aud_cfg_db_set_int(cfgfile, ALSA_CFGID, "mixer_card", alsa_cfg.mixer_card);
+	aud_cfg_db_set_string(cfgfile,ALSA_CFGID,"mixer_device", alsa_cfg.mixer_device);
+	aud_cfg_db_set_int(cfgfile, ALSA_CFGID, "volume_left", alsa_cfg.vol.left);
+	aud_cfg_db_set_int(cfgfile, ALSA_CFGID, "volume_right", alsa_cfg.vol.right);
 	aud_cfg_db_close(cfgfile);
 }
 
--- a/src/alsa/init.c	Fri Jun 13 04:58:39 2008 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,58 +0,0 @@
-/*  XMMS - ALSA output plugin
- *  Copyright (C) 2001-2003 Matthieu Sozeau <mattam@altern.org>
- *  Copyright (C) 2003-2005 Haavard Kvaalen
- *
- *  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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-#include <glib.h>
-#include <audacious/main.h>
-#include "alsa.h"
-#include <dlfcn.h>
-#include <ctype.h>
-
-struct alsa_config alsa_cfg;
-
-void alsa_init(void)
-{
-	ConfigDb *cfgfile;
-
-	memset(&alsa_cfg, 0, sizeof (alsa_cfg));
-	alsa_cfg.buffer_time = 500;
-	alsa_cfg.period_time = 100;
-	alsa_cfg.debug = 0;
-	alsa_cfg.vol.left = 100;
-	alsa_cfg.vol.right = 100;
-
-	cfgfile = aud_cfg_db_open();
-	if (!aud_cfg_db_get_string(cfgfile, "ALSA", "pcm_device",
-				  &alsa_cfg.pcm_device))
-		alsa_cfg.pcm_device = g_strdup("default");
-	g_message("device: %s", alsa_cfg.pcm_device);
-	if (!aud_cfg_db_get_string(cfgfile, "ALSA", "mixer_device",
-				  &alsa_cfg.mixer_device))
-		alsa_cfg.mixer_device = g_strdup("PCM");
-	aud_cfg_db_get_int(cfgfile, "ALSA", "mixer_card", &alsa_cfg.mixer_card);
-	aud_cfg_db_get_int(cfgfile, "ALSA", "buffer_time", &alsa_cfg.buffer_time);
-	aud_cfg_db_get_int(cfgfile, "ALSA", "period_time", &alsa_cfg.period_time);
-
-	aud_cfg_db_get_bool(cfgfile, "ALSA", "debug", &alsa_cfg.debug);
-	aud_cfg_db_close(cfgfile);
-
-	if (dlopen("libasound.so.2", RTLD_NOW | RTLD_GLOBAL) == NULL)
-	{
-		g_message("Cannot load alsa library: %s", dlerror());
-		/* FIXME, this plugin wont work... */
-	}
-}
--- a/src/amidi-plug/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/amidi-plug/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -21,5 +21,5 @@
 
 CFLAGS += ${PLUGIN_CFLAGS}
 CPPFLAGS += ${PLUGIN_CPPFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${GMODULE_CFLAGS} ${MOWGLI_CFLAGS} \
-	-DAMIDIPLUGBACKENDDIR=\"${plugindir}/${AMIDIPLUG_BACKEND_DIR}\" -I../../intl -I../..
+	-DAMIDIPLUGBACKENDDIR=\"${plugindir}/${AMIDIPLUG_BACKEND_DIR}\" -I../..
 LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${GMODULE_LIBS} -lpthread ./pcfg/libpcfg.a
--- a/src/amidi-plug/i_configure.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/amidi-plug/i_configure.c	Fri Jun 13 05:57:25 2008 +0300
@@ -28,8 +28,8 @@
 #include "i_configure-fluidsynth.h"
 #include "i_configure-dummy.h"
 #include "i_utils.h"
+#include <audacious/plugin.h>
 #include <audacious/auddrct.h>
-#include <audacious/util.h>
 
 
 amidiplug_cfg_backend_t * amidiplug_cfg_backend;
--- a/src/aosd/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/aosd/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -15,5 +15,5 @@
 plugindir := ${plugindir}/${GENERAL_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${DBUS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${CAIRO_CFLAGS} ${PANGOCAIRO_CFLAGS} ${XRENDER_CFLAGS} ${XCOMPOSITE_CFLAGS} -I../../intl -I../.. -I..
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS}  ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${CAIRO_CFLAGS} ${PANGOCAIRO_CFLAGS} ${XRENDER_CFLAGS} ${XCOMPOSITE_CFLAGS} -I../..
 LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${CAIRO_LIBS} ${PANGOCAIRO_LIBS} ${XRENDER_LIBS} ${XCOMPOSITE_LIBS}
--- a/src/aosd/aosd_cfg.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/aosd/aosd_cfg.c	Fri Jun 13 05:57:25 2008 +0300
@@ -23,7 +23,6 @@
 #include <glib.h>
 #include <stdlib.h>
 #include <audacious/plugin.h>
-#include <audacious/configdb.h>
 
 
 static gint
@@ -222,7 +221,7 @@
 gint
 aosd_cfg_load ( aosd_cfg_t * cfg )
 {
-  ConfigDb *cfgfile = aud_cfg_db_open();
+  mcs_handle_t *cfgfile = aud_cfg_db_open();
   gint i = 0;
   gint max_numcol;
   gchar *trig_active_str;
@@ -370,7 +369,7 @@
 gint
 aosd_cfg_save ( aosd_cfg_t * cfg )
 {
-  ConfigDb *cfgfile = aud_cfg_db_open();
+  mcs_handle_t *cfgfile = aud_cfg_db_open();
   gint i = 0;
   gint max_numcol;
   GString *string = g_string_new( "" );
--- a/src/aosd/aosd_trigger.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/aosd/aosd_trigger.c	Fri Jun 13 05:57:25 2008 +0300
@@ -25,7 +25,6 @@
 #include <glib.h>
 #include <audacious/i18n.h>
 #include <audacious/playlist.h>
-#include <audacious/strings.h>
 #include <audacious/hook.h>
 #include <audacious/auddrct.h>
 
--- a/src/arts/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/arts/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -13,5 +13,5 @@
 plugindir := ${plugindir}/${OUTPUT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${ARTSC_CFLAGS} -I../../intl -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${ARTSC_LIBS} -lpthread
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS}  ${ARTSC_CFLAGS} -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS}  ${ARTSC_LIBS} -lpthread
--- a/src/arts/arts.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/arts/arts.c	Fri Jun 13 05:57:25 2008 +0300
@@ -10,7 +10,6 @@
  */
 
 #include "arts.h"
-#include <audacious/util.h>
 
 static void about(void)
 {
--- a/src/arts/arts.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/arts/arts.h	Fri Jun 13 05:57:25 2008 +0300
@@ -25,7 +25,6 @@
 #include <string.h>
 
 #include <audacious/plugin.h>
-#include <audacious/configdb.h>
 #include <audacious/i18n.h>
 # include "config.h"
 
--- a/src/arts/audio.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/arts/audio.c	Fri Jun 13 05:57:25 2008 +0300
@@ -56,7 +56,7 @@
 
 void artsxmms_init(void)
 {
-	ConfigDb *db;
+	mcs_handle_t *db;
 
 	memset(&artsxmms_cfg, 0, sizeof (artsxmms_cfg));
 
--- a/src/arts/configure.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/arts/configure.c	Fri Jun 13 05:57:25 2008 +0300
@@ -18,7 +18,7 @@
 
 static void configure_win_ok_cb(GtkWidget * w, gpointer data)
 {
-	ConfigDb *db;
+	mcs_handle_t *db;
 
 	artsxmms_cfg.buffer_size =
 		gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(buffer_size_spin));
--- a/src/audiocompress/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/audiocompress/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -9,5 +9,5 @@
 plugindir := ${plugindir}/${EFFECT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} -I../../intl -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS}  -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS} 
--- a/src/audiocompress/audacious-glue.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/audiocompress/audacious-glue.c	Fri Jun 13 05:57:25 2008 +0300
@@ -10,8 +10,6 @@
 #include <gtk/gtk.h>
 #include <audacious/i18n.h>
 #include <audacious/plugin.h>
-#include <audacious/util.h>
-#include <audacious/configdb.h>
 
 #include "audiocompress_config.h"
 #include "compress.h"
@@ -38,6 +36,7 @@
 static void myPrefs(void);
 static int myModify(gpointer * data, gint length, AFormat fmt,
 		    gint srate, gint nch);
+static void myQueryFormat(AFormat * fmt, gint * rate, gint * nch);
 
 static int inited = 0;
 
@@ -49,6 +48,7 @@
 	.about = myAbout,
 	.configure = myPrefs,
 	.mod_samples = myModify,
+	.query_format = myQueryFormat,
 };
 
 EffectPlugin *audiocompress_eplist[] = { &xmms_plugin, NULL };
@@ -77,6 +77,14 @@
         inited = 0;
 }
 
+void myQueryFormat(AFormat * fmt, gint * rate, gint * nch)
+{
+	if ((*fmt != FMT_S16_NE) ||
+	    (*fmt != FMT_S16_LE && G_BYTE_ORDER == G_LITTLE_ENDIAN) ||
+	    (*fmt != FMT_S16_BE && G_BYTE_ORDER == G_BIG_ENDIAN))
+		*fmt = FMT_S16_NE;
+}
+
 int myModify(gpointer * data, gint length, AFormat fmt, gint srate, gint nch)
 {
 	if (fmt == FMT_S16_NE ||
@@ -120,7 +128,7 @@
 
 void initPrefs(CompressorPrefs * prefs)
 {
-	ConfigDb *db;
+	mcs_handle_t *db;
 
 	db = aud_cfg_db_open();
 
@@ -159,7 +167,7 @@
 
 void savePrefs(CompressorPrefs * prefs)
 {
-	ConfigDb *db;
+	mcs_handle_t *db;
 
 	db = aud_cfg_db_open();
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/bluetooth/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,11 @@
+PLUGIN = bluetooth${PLUGIN_SUFFIX}
+
+SRCS = bluetooth.c gui.c marshal.c
+include ../../buildsys.mk
+include ../../extra.mk
+
+plugindir := ${plugindir}/${GENERAL_PLUGIN_DIR}
+
+CFLAGS += ${PLUGIN_CFLAGS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${BEEP_DEFINES} ${MOWGLI_CFLAGS} ${DBUS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} -I../../intl -I../.. ${BLUEZ_CFLAGS}
+LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${BLUEZ_LIBS}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/bluetooth/bluetooth.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,194 @@
+#include <dbus/dbus.h>
+#include <dbus/dbus-glib.h>
+#include <glib-object.h>
+#include <stdio.h>
+#include "bluetooth.h"
+#include "marshal.h"
+#include "gui.h"
+
+#define DEBUG 1
+static gboolean plugin_active = FALSE,exiting=FALSE;
+GList * current_device = NULL;
+DBusGConnection * bus = NULL;
+gint discover_finish =0;
+GStaticMutex mutex = G_STATIC_MUTEX_INIT;
+
+void bluetooth_init ( void );
+void bluetooth_cleanup ( void );
+void bt_cfg(void);
+void bt_about(void);
+static void remote_device_found(DBusGProxy *object, char *address, const unsigned int class, const int rssi, gpointer user_data);
+static void discovery_started(DBusGProxy *object, gpointer user_data);
+static void remote_name_updated(DBusGProxy *object, const char *address,  char *name, gpointer user_data);
+static void print_results(void);
+static void discovery_completed(DBusGProxy *object, gpointer user_data);
+void discover_devices(void);
+
+
+
+GeneralPlugin bluetooth_gp =
+{
+    .description = "Bluetooth audio support",
+    .init = bluetooth_init,
+    .about = bt_about,
+    .configure = bt_cfg,
+    .cleanup = bluetooth_cleanup
+};
+GeneralPlugin *bluetooth_gplist[] = { &bluetooth_gp, NULL };
+DECLARE_PLUGIN(bluetooth_gp, NULL, NULL, NULL, NULL, NULL, bluetooth_gplist, NULL, NULL)
+void bluetooth_init ( void )
+{
+    audio_devices = NULL;
+    discover_devices();
+}
+
+void bluetooth_cleanup ( void )
+{
+    printf("bluetooth: exit\n");
+    if(discover_finish == 2) {
+        dbus_g_connection_flush (bus);
+        dbus_g_connection_unref(bus);
+    }
+
+}
+/*void bt_cfg( void )
+  {
+
+  }
+  */
+void bt_about( void )
+{
+
+}
+
+
+void refresh_call(void){
+   if(discover_finish == 0 ||discover_finish== 2)
+       discover_devices();
+       else 
+           printf("Scanning please wait!\n");
+    printf("refresh function called\n");
+}
+
+void connect_call(void){
+  printf("connect function \n");
+}
+
+
+static void remote_device_found(DBusGProxy *object, char *address, const unsigned int class, const int rssi, gpointer user_data)
+{
+    int found_in_list=FALSE; 
+    g_static_mutex_lock(&mutex);
+    current_device = audio_devices;
+    if((class & 0x200404)==0x200404)
+    {
+
+        while(current_device != NULL)
+        {
+            if(g_str_equal(address,((DeviceData*)(current_device->data))->address)) 
+            {
+                found_in_list = TRUE;
+                break;
+            }
+            current_device=g_list_next(current_device);
+        }
+        if(!found_in_list) 
+        {        
+            DeviceData *dev= g_new0(DeviceData, 1);
+            dev->class = class;
+            dev->address = g_strdup(address);
+            dev->name = NULL;
+            audio_devices=g_list_prepend(audio_devices, dev);     
+
+        }
+    }
+    g_static_mutex_unlock(&mutex);
+}
+
+static void discovery_started(DBusGProxy *object, gpointer user_data)
+{
+    g_print("Signal: DiscoveryStarted()\n");
+    discover_finish = 1;
+}
+
+static void remote_name_updated(DBusGProxy *object, const char *address,  char *name, gpointer user_data)
+{
+    g_static_mutex_lock(&mutex);
+    current_device=audio_devices;
+    while(current_device != NULL)
+    {
+        if(g_str_equal(address,((DeviceData*)(current_device->data))->address)) 
+        {
+            ((DeviceData*)(current_device->data))->name=g_strdup(name);
+            break;
+        }
+        current_device=g_list_next(current_device);
+    }
+    g_static_mutex_unlock(&mutex);
+}
+static void print_results()
+{
+    int i=0;
+    g_print("Final Scan results:\n");
+    g_print("Number of audio devices: %d \n",g_list_length(audio_devices));
+    current_device=audio_devices;
+    while(current_device != NULL)
+    {
+        g_print("Device %d: Name: %s, Class: 0x%x, Address: %s\n",++i,
+                ((DeviceData*)(current_device->data))-> name,
+                ((DeviceData*)(current_device->data))-> class,
+                ((DeviceData*)(current_device->data))-> address);
+
+        current_device=g_list_next(current_device);
+    }
+
+    refresh_tree();
+}
+
+static void discovery_completed(DBusGProxy *object, gpointer user_data)
+{
+    g_print("Signal: DiscoveryCompleted()\n");
+    print_results();
+    discover_finish =2;
+}
+
+
+void discover_devices(void){
+    GError *error = NULL;
+    DBusGProxy * obj = NULL;
+    g_type_init();
+    g_log_set_always_fatal (G_LOG_LEVEL_WARNING);
+
+    bus = dbus_g_bus_get(DBUS_BUS_SYSTEM, &error);
+    if (error != NULL)
+    {
+        g_printerr("Connecting to system bus failed: %s\n", error->message);
+        g_error_free(error);
+        exit(EXIT_FAILURE);
+    }
+    obj = dbus_g_proxy_new_for_name(bus, "org.bluez", "/org/bluez/hci0", "org.bluez.Adapter");
+
+    dbus_g_object_register_marshaller(marshal_VOID__STRING_UINT_INT, G_TYPE_NONE, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_INT, G_TYPE_INVALID);
+    dbus_g_proxy_add_signal(obj, "RemoteDeviceFound", G_TYPE_STRING, G_TYPE_UINT, G_TYPE_INT, G_TYPE_INVALID);
+    dbus_g_proxy_connect_signal(obj, "RemoteDeviceFound", G_CALLBACK(remote_device_found), bus, NULL);
+
+    dbus_g_proxy_add_signal(obj, "DiscoveryStarted", G_TYPE_INVALID);
+    dbus_g_proxy_connect_signal(obj, "DiscoveryStarted", G_CALLBACK(discovery_started), bus, NULL);
+
+    dbus_g_proxy_add_signal(obj, "DiscoveryCompleted", G_TYPE_INVALID);
+    dbus_g_proxy_connect_signal(obj, "DiscoveryCompleted", G_CALLBACK(discovery_completed), bus, NULL);
+
+    dbus_g_object_register_marshaller(marshal_VOID__STRING_STRING, G_TYPE_NONE, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID);
+    dbus_g_proxy_add_signal(obj, "RemoteNameUpdated", G_TYPE_STRING, G_TYPE_STRING, G_TYPE_INVALID);
+    dbus_g_proxy_connect_signal(obj, "RemoteNameUpdated", G_CALLBACK(remote_name_updated), NULL, NULL);
+
+    dbus_g_proxy_call(obj, "DiscoverDevices", &error, G_TYPE_INVALID, G_TYPE_INVALID);
+    if (error != NULL)
+    {
+        g_printerr("Failed to discover devices: %s\n", error->message);
+        g_error_free(error);
+        exit(EXIT_FAILURE);
+    }
+      dbus_g_connection_flush (bus);
+      dbus_g_connection_unref(bus);
+}    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/bluetooth/bluetooth.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,22 @@
+#include <config.h>
+
+#include <glib.h>
+#include <sys/types.h>
+#include <audacious/plugin.h>
+#include <audacious/ui_plugin_menu.h>
+#include <audacious/i18n.h>
+#include <gtk/gtk.h>
+#include <audacious/util.h>
+#include "gui.h"
+typedef struct {
+    guint class;
+    gchar* address;
+    gchar* name;
+}DeviceData;
+
+
+
+void refresh_call(void);
+void connect_call(void);
+GList * audio_devices;
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/bluetooth/gui.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,263 @@
+#include "gui.h"
+#include "bluetooth.h"
+
+static GtkWidget *window = NULL;
+static GtkTreeModel *model;
+GtkWidget *mainbox;
+GtkWidget *hbox_top;
+GtkWidget *hbox_bottom;
+GtkWidget *box_about;
+GtkWidget *box_about_left;
+GtkWidget *box_about_right;
+GtkWidget *headset_frame;
+GtkWidget *about_frame;
+GtkWidget *refresh;
+GtkWidget *connect_button;
+GtkWidget *close_button;   
+GtkWidget *treeview;
+GtkWidget *label_p;
+GtkWidget *label_c;
+GtkWidget *label_a;
+GtkWidget *label_prod;
+GtkWidget *label_class;
+GtkWidget *label_address;
+GList * dev = NULL;
+enum{
+    COLUMN_PRODUCER,
+    NUM_COLUMNS
+};
+static DeviceData test_data[]=
+{
+    {0,"00:00:00:00:00","Scanning"}
+};
+
+
+static GtkTreeModel * create_model(void)
+{
+    GtkListStore *store;
+    GtkTreeIter iter;
+    gint i=0;
+   /* create list store */
+    store = gtk_list_store_new(NUM_COLUMNS,
+            G_TYPE_STRING);
+         
+    /* add data to the list store */
+    for(i = 0;i<G_N_ELEMENTS(test_data);i++)
+    {
+        gtk_list_store_append(store,&iter);
+        gtk_list_store_set(store,&iter,
+                COLUMN_PRODUCER, test_data[i].name,-1);
+    }
+
+        return GTK_TREE_MODEL(store);                       
+}
+static GtkTreeModel * rebuild_model(void)
+{
+
+    GtkListStore *store;
+    GtkTreeIter iter;
+    gint i=0;
+    gint dev_no=0;
+    GList *dev;
+    gchar *temp;
+    if(!window) 
+        return NULL;
+   /* create list store */
+    store = gtk_list_store_new(NUM_COLUMNS,
+            G_TYPE_STRING);
+         
+    /*add inf to test_data from audio_devices */
+    dev_no = g_list_length(audio_devices);
+    dev = audio_devices;
+    while(dev != NULL)
+    {
+        test_data[i].name = ((DeviceData*)(dev->data))-> name;
+        test_data[i].class = ((DeviceData*)(dev->data))-> class;
+        test_data[i].address = ((DeviceData*)(dev->data))-> address;
+        i++;
+        dev=g_list_next(dev);
+    }
+    if (dev_no == 0) 
+    {
+        test_data[0].name = "No devices found!";
+        test_data[0].class = 0;
+        test_data[0].address = "00:00:00:00:00";
+    }
+
+    /* add data to the list store */
+    for(i = 0;i<G_N_ELEMENTS(test_data);i++)
+    {
+        gtk_list_store_append(store,&iter);
+        gtk_list_store_set(store,&iter,
+        COLUMN_PRODUCER, test_data[i].name,-1);
+    }
+        //set the labels
+         temp = g_strdup_printf("0x%x",test_data[0].class);
+         gtk_label_set_text(GTK_LABEL(label_prod),test_data[0].name);
+         gtk_label_set_text(GTK_LABEL(label_class),temp);
+         gtk_label_set_text(GTK_LABEL(label_address),test_data[0].address);
+
+        return GTK_TREE_MODEL(store);          
+
+}
+
+
+void refresh_tree()
+{
+    if(!window) 
+        return;
+     model = rebuild_model();
+     gtk_tree_view_set_model(GTK_TREE_VIEW(treeview),GTK_TREE_MODEL(model));
+}
+
+
+static void add_columns(GtkTreeView *treeview)
+{
+    GtkCellRenderer *renderer;
+    GtkTreeViewColumn *column;
+    // GtkTreeModel *model = gtk_tree_view_get_model (treeview);
+
+    /* column for producer */
+    renderer = gtk_cell_renderer_text_new ();
+    column = gtk_tree_view_column_new_with_attributes ("Producer",
+            renderer,
+            "text",
+            COLUMN_PRODUCER,
+            NULL);
+    gtk_tree_view_column_set_sort_column_id (column,COLUMN_PRODUCER);
+    gtk_tree_view_append_column (treeview, column);
+
+}
+
+void close_call(void){
+    printf("close callback \n");
+    gtk_widget_destroy (window);
+    window = NULL;
+}
+void select_row(GtkWidget *treeview){
+
+    GtkTreeIter iter;
+    gint sel;
+    gchar *temp;
+    printf("select\n");
+    GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(treeview)); 
+    if(gtk_tree_selection_get_selected (selection, NULL,&iter)){
+        GtkTreePath *path;
+        path = gtk_tree_model_get_path (model, &iter);
+        sel = gtk_tree_path_get_indices (path)[0];
+        printf("i=%d\n",sel);
+        temp = g_strdup_printf("0x%x",test_data[sel].class);
+        gtk_label_set_text(GTK_LABEL(label_prod),test_data[sel].name);
+        gtk_label_set_text(GTK_LABEL(label_class),temp);
+        gtk_label_set_text(GTK_LABEL(label_address),test_data[sel].address);
+        gtk_tree_path_free (path);
+        g_free(temp);
+
+    }
+
+
+
+}
+void bt_cfg()
+{
+
+    if (!window)
+    {
+        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+        g_signal_connect (window, "destroy",G_CALLBACK (gtk_widget_destroyed), &window);
+
+        mainbox = gtk_vbox_new(FALSE,4);
+        gtk_container_set_border_width (GTK_CONTAINER (mainbox), 4); 
+        gtk_container_add (GTK_CONTAINER (window), mainbox);
+
+        hbox_top = gtk_hbox_new(FALSE,4);
+        gtk_container_set_border_width (GTK_CONTAINER(hbox_top), 4); 
+        gtk_container_add (GTK_CONTAINER (mainbox), hbox_top);
+
+        hbox_bottom = gtk_hbox_new(FALSE,4);
+        gtk_container_set_border_width (GTK_CONTAINER (hbox_bottom), 4); 
+        gtk_container_add (GTK_CONTAINER (mainbox), hbox_bottom);
+
+        headset_frame = gtk_frame_new("Available Headsets");
+        gtk_container_add (GTK_CONTAINER (hbox_top), headset_frame);
+
+        about_frame = gtk_frame_new("Current Headset");
+        gtk_container_add(GTK_CONTAINER(hbox_top),about_frame);
+
+        refresh = gtk_button_new_with_mnemonic ("_Refresh");
+        g_signal_connect (refresh, "clicked",G_CALLBACK (refresh_call), NULL);
+        gtk_container_add(GTK_CONTAINER(hbox_bottom),refresh);
+
+        connect_button = gtk_button_new_with_mnemonic("_Connect");
+        g_signal_connect(connect_button,"clicked",G_CALLBACK (connect_call), NULL);
+        gtk_container_add(GTK_CONTAINER(hbox_bottom),connect_button);
+
+        close_button = gtk_button_new_with_mnemonic("_Close");
+        g_signal_connect(close_button,"clicked",G_CALLBACK (close_call),NULL);
+        gtk_container_add(GTK_CONTAINER(hbox_bottom),close_button);
+        /* create tree model */
+        model = create_model ();
+
+        /* create tree view */
+        treeview = gtk_tree_view_new_with_model (model);
+        gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE);
+        gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)),GTK_SELECTION_SINGLE);
+        g_object_unref (model);
+        gtk_container_add (GTK_CONTAINER (headset_frame), treeview);
+        /* add columns to the tree view */
+        add_columns (GTK_TREE_VIEW (treeview));
+        
+        g_signal_connect(treeview,"cursor-changed",G_CALLBACK(select_row),treeview);
+
+
+        box_about = gtk_hbox_new(FALSE,4);
+        gtk_container_set_border_width (GTK_CONTAINER (box_about), 4); 
+        gtk_container_add (GTK_CONTAINER (about_frame), box_about);
+
+        /*about box left - vbox */
+
+        box_about_left = gtk_vbox_new(FALSE,4);
+        gtk_container_set_border_width (GTK_CONTAINER (box_about_left), 4); 
+        gtk_container_add (GTK_CONTAINER (box_about), box_about_left);
+
+        /*about box right - vbox */
+        box_about_right = gtk_vbox_new(TRUE,4);
+        gtk_container_set_border_width (GTK_CONTAINER (box_about_right), 4); 
+        gtk_container_add (GTK_CONTAINER (box_about), box_about_right);
+
+        /* Left labels  */
+        label_p = gtk_label_new("Name:");
+        gtk_container_add(GTK_CONTAINER(box_about_left),label_p);
+
+        label_c = gtk_label_new("Class");
+        gtk_container_add(GTK_CONTAINER(box_about_left),label_c);
+
+
+        label_a = gtk_label_new("Address:");
+        gtk_container_add(GTK_CONTAINER(box_about_left),label_a);
+
+
+        /*right labels */
+        label_prod = gtk_label_new("Scanning");
+        gtk_container_add(GTK_CONTAINER(box_about_right),label_prod);
+
+        label_class = gtk_label_new("  ");
+        gtk_container_add(GTK_CONTAINER(box_about_right),label_class);
+
+
+        label_address = gtk_label_new("   ");
+        gtk_container_add(GTK_CONTAINER(box_about_right),label_address);
+
+        gtk_window_set_default_size (GTK_WINDOW (window), 480, 180);
+        if (!GTK_WIDGET_VISIBLE (window))
+            gtk_widget_show_all (window);
+        else
+        {
+            gtk_widget_destroy (window);
+            window = NULL;
+        }
+        //   return window;
+    }
+    //  return window;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/bluetooth/gui.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,3 @@
+#include <gtk/gtk.h>
+#include <glib.h>
+void refresh_tree(void);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/bluetooth/marshal.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,125 @@
+
+#include	<glib-object.h>
+
+
+#ifdef G_ENABLE_DEBUG
+#define g_marshal_value_peek_boolean(v)  g_value_get_boolean (v)
+#define g_marshal_value_peek_char(v)     g_value_get_char (v)
+#define g_marshal_value_peek_uchar(v)    g_value_get_uchar (v)
+#define g_marshal_value_peek_int(v)      g_value_get_int (v)
+#define g_marshal_value_peek_uint(v)     g_value_get_uint (v)
+#define g_marshal_value_peek_long(v)     g_value_get_long (v)
+#define g_marshal_value_peek_ulong(v)    g_value_get_ulong (v)
+#define g_marshal_value_peek_int64(v)    g_value_get_int64 (v)
+#define g_marshal_value_peek_uint64(v)   g_value_get_uint64 (v)
+#define g_marshal_value_peek_enum(v)     g_value_get_enum (v)
+#define g_marshal_value_peek_flags(v)    g_value_get_flags (v)
+#define g_marshal_value_peek_float(v)    g_value_get_float (v)
+#define g_marshal_value_peek_double(v)   g_value_get_double (v)
+#define g_marshal_value_peek_string(v)   (char*) g_value_get_string (v)
+#define g_marshal_value_peek_param(v)    g_value_get_param (v)
+#define g_marshal_value_peek_boxed(v)    g_value_get_boxed (v)
+#define g_marshal_value_peek_pointer(v)  g_value_get_pointer (v)
+#define g_marshal_value_peek_object(v)   g_value_get_object (v)
+#else /* !G_ENABLE_DEBUG */
+/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API.
+ *          Do not access GValues directly in your code. Instead, use the
+ *          g_value_get_*() functions
+ */
+#define g_marshal_value_peek_boolean(v)  (v)->data[0].v_int
+#define g_marshal_value_peek_char(v)     (v)->data[0].v_int
+#define g_marshal_value_peek_uchar(v)    (v)->data[0].v_uint
+#define g_marshal_value_peek_int(v)      (v)->data[0].v_int
+#define g_marshal_value_peek_uint(v)     (v)->data[0].v_uint
+#define g_marshal_value_peek_long(v)     (v)->data[0].v_long
+#define g_marshal_value_peek_ulong(v)    (v)->data[0].v_ulong
+#define g_marshal_value_peek_int64(v)    (v)->data[0].v_int64
+#define g_marshal_value_peek_uint64(v)   (v)->data[0].v_uint64
+#define g_marshal_value_peek_enum(v)     (v)->data[0].v_long
+#define g_marshal_value_peek_flags(v)    (v)->data[0].v_ulong
+#define g_marshal_value_peek_float(v)    (v)->data[0].v_float
+#define g_marshal_value_peek_double(v)   (v)->data[0].v_double
+#define g_marshal_value_peek_string(v)   (v)->data[0].v_pointer
+#define g_marshal_value_peek_param(v)    (v)->data[0].v_pointer
+#define g_marshal_value_peek_boxed(v)    (v)->data[0].v_pointer
+#define g_marshal_value_peek_pointer(v)  (v)->data[0].v_pointer
+#define g_marshal_value_peek_object(v)   (v)->data[0].v_pointer
+#endif /* !G_ENABLE_DEBUG */
+
+
+/* VOID:STRING,UINT,INT (marshal.list:1) */
+void
+marshal_VOID__STRING_UINT_INT (GClosure     *closure,
+                               GValue       *return_value G_GNUC_UNUSED,
+                               guint         n_param_values,
+                               const GValue *param_values,
+                               gpointer      invocation_hint G_GNUC_UNUSED,
+                               gpointer      marshal_data)
+{
+  typedef void (*GMarshalFunc_VOID__STRING_UINT_INT) (gpointer     data1,
+                                                      gpointer     arg_1,
+                                                      guint        arg_2,
+                                                      gint         arg_3,
+                                                      gpointer     data2);
+  register GMarshalFunc_VOID__STRING_UINT_INT callback;
+  register GCClosure *cc = (GCClosure*) closure;
+  register gpointer data1, data2;
+
+  g_return_if_fail (n_param_values == 4);
+
+  if (G_CCLOSURE_SWAP_DATA (closure))
+    {
+      data1 = closure->data;
+      data2 = g_value_peek_pointer (param_values + 0);
+    }
+  else
+    {
+      data1 = g_value_peek_pointer (param_values + 0);
+      data2 = closure->data;
+    }
+  callback = (GMarshalFunc_VOID__STRING_UINT_INT) (marshal_data ? marshal_data : cc->callback);
+
+  callback (data1,
+            g_marshal_value_peek_string (param_values + 1),
+            g_marshal_value_peek_uint (param_values + 2),
+            g_marshal_value_peek_int (param_values + 3),
+            data2);
+}
+
+/* VOID:STRING,STRING (marshal.list:2) */
+void
+marshal_VOID__STRING_STRING (GClosure     *closure,
+                             GValue       *return_value G_GNUC_UNUSED,
+                             guint         n_param_values,
+                             const GValue *param_values,
+                             gpointer      invocation_hint G_GNUC_UNUSED,
+                             gpointer      marshal_data)
+{
+  typedef void (*GMarshalFunc_VOID__STRING_STRING) (gpointer     data1,
+                                                    gpointer     arg_1,
+                                                    gpointer     arg_2,
+                                                    gpointer     data2);
+  register GMarshalFunc_VOID__STRING_STRING callback;
+  register GCClosure *cc = (GCClosure*) closure;
+  register gpointer data1, data2;
+
+  g_return_if_fail (n_param_values == 3);
+
+  if (G_CCLOSURE_SWAP_DATA (closure))
+    {
+      data1 = closure->data;
+      data2 = g_value_peek_pointer (param_values + 0);
+    }
+  else
+    {
+      data1 = g_value_peek_pointer (param_values + 0);
+      data2 = closure->data;
+    }
+  callback = (GMarshalFunc_VOID__STRING_STRING) (marshal_data ? marshal_data : cc->callback);
+
+  callback (data1,
+            g_marshal_value_peek_string (param_values + 1),
+            g_marshal_value_peek_string (param_values + 2),
+            data2);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/bluetooth/marshal.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,28 @@
+
+#ifndef __marshal_MARSHAL_H__
+#define __marshal_MARSHAL_H__
+
+#include	<glib-object.h>
+
+G_BEGIN_DECLS
+
+/* VOID:STRING,UINT,INT (marshal.list:1) */
+extern void marshal_VOID__STRING_UINT_INT (GClosure     *closure,
+                                           GValue       *return_value,
+                                           guint         n_param_values,
+                                           const GValue *param_values,
+                                           gpointer      invocation_hint,
+                                           gpointer      marshal_data);
+
+/* VOID:STRING,STRING (marshal.list:2) */
+extern void marshal_VOID__STRING_STRING (GClosure     *closure,
+                                         GValue       *return_value,
+                                         guint         n_param_values,
+                                         const GValue *param_values,
+                                         gpointer      invocation_hint,
+                                         gpointer      marshal_data);
+
+G_END_DECLS
+
+#endif /* __marshal_MARSHAL_H__ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/bluetooth/marshal.list	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,2 @@
+VOID:STRING,UINT,INT
+VOID:STRING,STRING
--- a/src/blur_scope/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/blur_scope/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -9,5 +9,5 @@
 plugindir := ${plugindir}/${VISUALIZATION_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} -I../../intl -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS}  -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS} 
--- a/src/blur_scope/blur_scope.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/blur_scope/blur_scope.c	Fri Jun 13 05:57:25 2008 +0300
@@ -26,8 +26,6 @@
 #include <gtk/gtk.h>
 #include <string.h>
 #include <audacious/plugin.h>
-#include <audacious/util.h>
-#include <audacious/configdb.h>
 #include "blur_scope.h"
 #include "bscope_logo.xpm"
 
@@ -95,7 +93,7 @@
 void
 bscope_read_config(void)
 {
-    ConfigDb *db;
+    mcs_handle_t *db;
 
     if (!config_read) {
         bscope_cfg.color = 0xFF3F7F;
--- a/src/blur_scope/config.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/blur_scope/config.c	Fri Jun 13 05:57:25 2008 +0300
@@ -5,7 +5,6 @@
 #include <gtk/gtk.h>
 
 #include <audacious/plugin.h>
-#include <audacious/configdb.h>
 #include "blur_scope.h"
 
 
@@ -17,7 +16,7 @@
 static void
 configure_ok(GtkWidget * w, gpointer data)
 {
-    ConfigDb *db;
+    mcs_handle_t *db;
     gdouble color[3];
 
     gtk_color_selection_get_color(GTK_COLOR_SELECTION(options_colorpicker),
--- a/src/cdaudio-ng/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/cdaudio-ng/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -9,5 +9,5 @@
 plugindir := ${plugindir}/${INPUT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${DBUS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${CDIO_CFLAGS} ${CDDB_CFLAGS} ${ARCH_DEFINES} -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${CDIO_LIBS} ${CDDB_LIBS} ${MOWGLI_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS}  ${GTK_CFLAGS} ${GLIB_CFLAGS}  ${CDIO_CFLAGS} ${CDDB_CFLAGS} ${ARCH_DEFINES} -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS}  ${CDIO_LIBS} ${CDDB_LIBS} ${MOWGLI_LIBS}
--- a/src/cdaudio-ng/cdaudio-ng.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/cdaudio-ng/cdaudio-ng.c	Fri Jun 13 05:57:25 2008 +0300
@@ -48,9 +48,7 @@
 #include <audacious/plugin.h>
 #include <audacious/i18n.h>
 #include <audacious/output.h>
-#include <audacious/playlist.h>
 #include <audacious/ui_plugin_menu.h>
-#include <audacious/util.h>
 
 #include "cdaudio-ng.h"
 #include "configure.h"
@@ -145,7 +143,7 @@
 
 static void cdaudio_init()
 {
-	ConfigDb *db;
+	mcs_handle_t *db;
 	gchar *menu_item_text;
 
 	debug("cdaudio_init()\n");
@@ -156,6 +154,7 @@
 	cdng_cfg.debug = FALSE;
 	cdng_cfg.device = g_strdup("");
 	cdng_cfg.cddb_server = g_strdup(CDDA_DEFAULT_CDDB_SERVER);
+	cdng_cfg.cddb_path = g_strdup("");
 	cdng_cfg.cddb_port = CDDA_DEFAULT_CDDB_PORT;
 	cdng_cfg.cddb_http = FALSE;
 	cdng_cfg.limitspeed = CDDA_DEFAULT_LIMIT_SPEED;
@@ -186,6 +185,7 @@
 	aud_cfg_db_get_bool(db, "CDDA", "debug", &cdng_cfg.debug);
 	aud_cfg_db_get_string(db, "CDDA", "device", &cdng_cfg.device);
 	aud_cfg_db_get_string(db, "CDDA", "cddbserver", &cdng_cfg.cddb_server);
+	aud_cfg_db_get_string(db, "CDDA", "cddbpath", &cdng_cfg.cddb_path);
 	aud_cfg_db_get_int(db, "CDDA", "cddbport", &cdng_cfg.cddb_port);
 	aud_cfg_db_get_bool(db, "CDDA", "cddbhttp", &cdng_cfg.cddb_http);
 	aud_cfg_db_get_int(db, "CDDA", "limitspeed", &cdng_cfg.limitspeed);
@@ -197,9 +197,9 @@
 
 	aud_cfg_db_close(db);
 
-	debug("use_dae = %d, limitspeed = %d, use_cdtext = %d, use_cddb = %d, cddbserver = \"%s\", cddbport = %d, cddbhttp = %d, device = \"%s\", debug = %d\n",
+	debug("use_dae = %d, limitspeed = %d, use_cdtext = %d, use_cddb = %d, cddbserver = \"%s\", cddbpath = \"%s\", cddbport = %d, cddbhttp = %d, device = \"%s\", debug = %d\n",
 		cdng_cfg.use_dae, cdng_cfg.limitspeed, cdng_cfg.use_cdtext, cdng_cfg.use_cddb,
-		cdng_cfg.cddb_server, cdng_cfg.cddb_port, cdng_cfg.cddb_http, cdng_cfg.device, cdng_cfg.debug);
+          cdng_cfg.cddb_server, cdng_cfg.cddb_path, cdng_cfg.cddb_port, cdng_cfg.cddb_http, cdng_cfg.device, cdng_cfg.debug);
 
 	menu_item_text = _("Rescan CD");
 	main_menu_item = gtk_image_menu_item_new_with_label(menu_item_text);
@@ -256,9 +256,9 @@
 
 	configure_show_gui();
 
-	debug("use_dae = %d, limitspeed = %d, use_cdtext = %d, use_cddb = %d, cddbserver = \"%s\", cddbport = %d, cddbhttp = %d, device = \"%s\", debug = %d\n",
+	debug("use_dae = %d, limitspeed = %d, use_cdtext = %d, use_cddb = %d, cddbserver = \"%s\", cddbpath = \"%s\", cddbport = %d, cddbhttp = %d, device = \"%s\", debug = %d\n",
 		cdng_cfg.use_dae, cdng_cfg.limitspeed, cdng_cfg.use_cdtext, cdng_cfg.use_cddb,
-		cdng_cfg.cddb_server, cdng_cfg.cddb_port, cdng_cfg.cddb_http, cdng_cfg.device, cdng_cfg.debug);
+		cdng_cfg.cddb_server, cdng_cfg.cddb_path, cdng_cfg.cddb_port, cdng_cfg.cddb_http, cdng_cfg.device, cdng_cfg.debug);
 }
 
 static gint cdaudio_is_our_file(gchar *filename)
@@ -584,12 +584,13 @@
 
 	// todo: destroy the gui
 
-	ConfigDb *db = aud_cfg_db_open();
+	mcs_handle_t *db = aud_cfg_db_open();
 	aud_cfg_db_set_bool(db, "CDDA", "use_dae", cdng_cfg.use_dae);
 	aud_cfg_db_set_int(db, "CDDA", "limitspeed", cdng_cfg.limitspeed);
 	aud_cfg_db_set_bool(db, "CDDA", "use_cdtext", cdng_cfg.use_cdtext);
 	aud_cfg_db_set_bool(db, "CDDA", "use_cddb", cdng_cfg.use_cddb);
 	aud_cfg_db_set_string(db, "CDDA", "cddbserver", cdng_cfg.cddb_server);
+	aud_cfg_db_set_string(db, "CDDA", "cddbpath", cdng_cfg.cddb_path);
 	aud_cfg_db_set_int(db, "CDDA", "cddbport", cdng_cfg.cddb_port);
 	aud_cfg_db_set_bool(db, "CDDA", "cddbhttp", cdng_cfg.cddb_http);
 	aud_cfg_db_set_string(db, "CDDA", "device", cdng_cfg.device);
@@ -983,6 +984,7 @@
 						cddb_http_enable(pcddb_conn);
 						cddb_set_server_name(pcddb_conn, cdng_cfg.cddb_server);
 						cddb_set_server_port(pcddb_conn, cdng_cfg.cddb_port);
+                        cddb_set_http_path_query(pcddb_conn, cdng_cfg.cddb_path);
 					}
 					else {
 						cddb_set_server_name(pcddb_conn, cdng_cfg.cddb_server);
--- a/src/cdaudio-ng/cdaudio-ng.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/cdaudio-ng/cdaudio-ng.h	Fri Jun 13 05:57:25 2008 +0300
@@ -21,10 +21,10 @@
 #define CDAUDIO_NG_H
 
 
-#define DEF_STRING_LEN				256
-#define CDDA_DUMMYPATH				"cdda://"
-#define CDDA_DAE_FRAMES				8
-#define CDDA_DEFAULT_LIMIT_SPEED		1
+#define DEF_STRING_LEN			256
+#define CDDA_DUMMYPATH			"cdda://"
+#define CDDA_DAE_FRAMES			8
+#define CDDA_DEFAULT_LIMIT_SPEED	1
 #define CDDA_DEFAULT_CDDB_SERVER	"freedb.org"
 #define CDDA_DEFAULT_CDDB_PORT		8880
 #define CDDA_DEFAULT_PROXY_PORT		8080
@@ -46,7 +46,7 @@
 	lsn_t				endlsn;
 	lsn_t				currlsn;
 	lsn_t				seektime;	/* in miliseconds */
-	InputPlayback		*pplayback;
+	InputPlayback                   *pplayback;
 	GThread				*thread;
 
 } dae_params_t;
--- a/src/cdaudio-ng/configure.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/cdaudio-ng/configure.c	Fri Jun 13 05:57:25 2008 +0300
@@ -23,8 +23,10 @@
                  *usecdtextcheckbutton = NULL,
                  *usecddbcheckbutton = NULL,
                  *cddbserverlabel = NULL,
+                 *cddbpathlabel = NULL,
                  *cddbportlabel = NULL,
                  *cddbserverentry = NULL,
+                 *cddbpathentry = NULL,
                  *cddbportentry = NULL,
                  *cddbhttpcheckbutton = NULL,
                  *usedevicecheckbutton = NULL,
@@ -50,9 +52,11 @@
 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(usecddbcheckbutton), cdng_cfg.use_cddb);
 
 	gtk_entry_set_text(GTK_ENTRY(cddbserverentry), cdng_cfg.cddb_server);
+	gtk_entry_set_text(GTK_ENTRY(cddbpathentry), cdng_cfg.cddb_path);
 	g_snprintf(portstr, sizeof(portstr), "%d", cdng_cfg.cddb_port);
 	gtk_entry_set_text(GTK_ENTRY(cddbportentry), portstr);
 	gtk_widget_set_sensitive(cddbserverentry, cdng_cfg.use_cddb);
+	gtk_widget_set_sensitive(cddbpathentry, cdng_cfg.use_cddb);
 	gtk_widget_set_sensitive(cddbportentry, cdng_cfg.use_cddb);
 	
 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(cddbhttpcheckbutton), cdng_cfg.cddb_http);
@@ -79,6 +83,7 @@
 	cdng_cfg.use_cdtext = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(usecdtextcheckbutton));
 	cdng_cfg.use_cddb = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(usecddbcheckbutton));
 	pstrcpy(&cdng_cfg.cddb_server, gtk_entry_get_text(GTK_ENTRY(cddbserverentry)));
+	pstrcpy(&cdng_cfg.cddb_path, gtk_entry_get_text(GTK_ENTRY(cddbpathentry)));
 	cdng_cfg.cddb_http = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(cddbhttpcheckbutton));
 	cdng_cfg.cddb_port = strtol(gtk_entry_get_text(GTK_ENTRY(cddbportentry)), NULL, 10);
 	
@@ -121,6 +126,9 @@
 	gtk_widget_set_sensitive(cddbserverentry,
 		gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(usecddbcheckbutton)));
 
+	gtk_widget_set_sensitive(cddbpathentry,
+		gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(usecddbcheckbutton)));
+
 	gtk_widget_set_sensitive(cddbhttpcheckbutton,
 		gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(usecddbcheckbutton)));
 	
@@ -194,18 +202,24 @@
 	cddbserverlabel = gtk_label_new(_("Server: "));
 	gtk_table_attach_defaults(GTK_TABLE(titleinfotable), cddbserverlabel, 0, 1, 2, 3);
 
+	cddbpathlabel = gtk_label_new(_("Path: "));
+	gtk_table_attach_defaults(GTK_TABLE(titleinfotable), cddbpathlabel, 0, 1, 3, 4);
+
 	cddbportlabel = gtk_label_new(_("Port: "));
-	gtk_table_attach_defaults(GTK_TABLE(titleinfotable), cddbportlabel, 0, 1, 3, 4);
+	gtk_table_attach_defaults(GTK_TABLE(titleinfotable), cddbportlabel, 0, 1, 4, 5);
 
 	cddbserverentry = gtk_entry_new();
 	gtk_table_attach_defaults(GTK_TABLE(titleinfotable), cddbserverentry, 1, 2, 2, 3);
 
+	cddbpathentry = gtk_entry_new();
+	gtk_table_attach_defaults(GTK_TABLE(titleinfotable), cddbpathentry, 1, 2, 3, 4);
+
 	cddbhttpcheckbutton = gtk_check_button_new_with_label(_("Use HTTP instead of CDDBP"));
 	g_signal_connect(G_OBJECT(cddbhttpcheckbutton), "toggled", G_CALLBACK(checkbutton_toggled), NULL);
 	gtk_table_attach_defaults(GTK_TABLE(titleinfotable), cddbhttpcheckbutton, 1, 2, 1, 2);
 
 	cddbportentry = gtk_entry_new();
-	gtk_table_attach_defaults(GTK_TABLE(titleinfotable), cddbportentry, 1, 2, 3, 4);
+	gtk_table_attach_defaults(GTK_TABLE(titleinfotable), cddbportentry, 1, 2, 4, 5);
 
 
 	usedevicecheckbutton = gtk_check_button_new_with_label(_("Override default device: "));
@@ -240,9 +254,11 @@
 	gtk_widget_show(usecdtextcheckbutton);
 	gtk_widget_show(usecddbcheckbutton);
 	gtk_widget_show(cddbserverentry);
+	gtk_widget_show(cddbpathentry);
 	gtk_widget_show(cddbhttpcheckbutton);
 	gtk_widget_show(cddbportentry);
 	gtk_widget_show(cddbserverlabel);
+	gtk_widget_show(cddbpathlabel);
 	gtk_widget_show(cddbportlabel);
 	gtk_widget_show(usedevicecheckbutton);
 	gtk_widget_show(deviceentry);
--- a/src/cdaudio-ng/configure.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/cdaudio-ng/configure.h	Fri Jun 13 05:57:25 2008 +0300
@@ -10,6 +10,7 @@
 	gboolean	debug;
 	gchar		*device;
 	gchar		*cddb_server;
+	gchar		*cddb_path;
 	gint		cddb_port;
 	gboolean	cddb_http;
 	gint		limitspeed;
--- a/src/console/Audacious_Config.cxx	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/console/Audacious_Config.cxx	Fri Jun 13 05:57:25 2008 +0300
@@ -14,14 +14,13 @@
 #include <audacious/i18n.h>
 #include <audacious/plugin.h>
 #include <gtk/gtk.h>
-#include <audacious/configdb.h>
 #include "Audacious_Config.h"
 
 // TODO: add UI for echo
 
 void console_cfg_load( void )
 {
-    ConfigDb *db = aud_cfg_db_open();
+    mcs_handle_t *db = aud_cfg_db_open();
     aud_cfg_db_get_int(db, "console", "loop_length", &audcfg.loop_length);
     aud_cfg_db_get_bool(db, "console", "resample", &audcfg.resample);
     aud_cfg_db_get_int(db, "console", "resample_rate", &audcfg.resample_rate);
@@ -36,7 +35,7 @@
 
 void console_cfg_save( void )
 {
-    ConfigDb *db = aud_cfg_db_open();
+    mcs_handle_t *db = aud_cfg_db_open();
     aud_cfg_db_set_int(db, "console", "loop_length", audcfg.loop_length);
     aud_cfg_db_set_bool(db, "console", "resample", audcfg.resample);
     aud_cfg_db_set_int(db, "console", "resample_rate", audcfg.resample_rate);
--- a/src/console/Audacious_Driver.cxx	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/console/Audacious_Driver.cxx	Fri Jun 13 05:57:25 2008 +0300
@@ -13,9 +13,7 @@
 #include <gtk/gtk.h>
 extern "C" {
 #include <audacious/plugin.h>
-#include <audacious/util.h>
 #include <audacious/output.h>
-#include <audacious/playlist.h>
 }
 #include <string.h>
 #include <stdlib.h>
@@ -485,8 +483,6 @@
 	NULL,
 	get_song_tuple,
 	NULL,
-	NULL,
-	NULL,
 	(gchar **)gme_fmts,
 	NULL,
 	probe_for_tuple,
--- a/src/console/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/console/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -60,5 +60,5 @@
 
 CFLAGS += ${PLUGIN_CFLAGS}
 CXXFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${ARCH_DEFINES} -I../../intl -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} -lz ${MOWGLI_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS}  ${ARCH_DEFINES} -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS}  -lz ${MOWGLI_LIBS}
--- a/src/console/abstract_file.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/console/abstract_file.h	Fri Jun 13 05:57:25 2008 +0300
@@ -5,7 +5,6 @@
 #define ABSTRACT_FILE_H
 
 #include <stdio.h>
-#include <audacious/vfs.h>
 
 // Supports reading and finding out how many bytes are remaining
 class Data_Reader {
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/crystalizer/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,12 @@
+PLUGIN = crystalizer${PLUGIN_SUFFIX}
+
+SRCS = crystalizer.c
+
+include ../../buildsys.mk
+include ../../extra.mk
+
+plugindir := ${plugindir}/${EFFECT_PLUGIN_DIR}
+
+CFLAGS += ${PLUGIN_CFLAGS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS}  -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS} 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/crystalizer/crystalizer.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,186 @@
+/*
+ * Copyright (c) 2008 William Pitcock <nenolod@nenolod.net>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice is present in all copies.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#include <gtk/gtk.h>
+#include <audacious/i18n.h>
+#include <audacious/plugin.h>
+
+static void init(void);
+static void configure(void);
+static int mod_samples(gpointer *d, gint length, AFormat afmt, gint srate, gint nch);
+static void query_format(AFormat * fmt, gint * rate, gint * nch);
+
+EffectPlugin crystalizer_ep =
+{
+	.description = "Crystalizer", /* Description */
+	.init = init,
+	.configure = configure,
+	.mod_samples = mod_samples,
+	.query_format = query_format
+};
+
+static GtkWidget *conf_dialog = NULL;
+static gdouble value;
+
+EffectPlugin *crystalizer_eplist[] = { &crystalizer_ep, NULL };
+
+DECLARE_PLUGIN(crystalizer, NULL, NULL, NULL, NULL, crystalizer_eplist, NULL, NULL, NULL);
+
+static void init(void)
+{
+	mcs_handle_t *db;
+	db = aud_cfg_db_open();
+	if (!aud_cfg_db_get_double(db, "crystalizer", "intensity", &value))
+		value = 1.0;
+	aud_cfg_db_close(db);
+}
+
+/* conf dialog stuff stolen from stereo plugin --nenolod */ 
+static void conf_ok_cb(GtkButton * button, gpointer data)
+{
+	mcs_handle_t *db;
+
+	value = *(gdouble *) data;
+	
+	db = aud_cfg_db_open();
+	aud_cfg_db_set_double(db, "crystalizer", "intensity", value);
+	aud_cfg_db_close(db);
+	gtk_widget_destroy(conf_dialog);
+}
+
+static void conf_cancel_cb(GtkButton * button, gpointer data)
+{
+	gtk_widget_destroy(conf_dialog);
+}
+
+static void conf_apply_cb(GtkButton *button, gpointer data)
+{
+	value = *(gdouble *) data;
+}
+
+static void configure(void)
+{
+	GtkWidget *hbox, *label, *scale, *button, *bbox;
+	GtkObject *adjustment;
+
+	if (conf_dialog != NULL)
+		return;
+
+	conf_dialog = gtk_dialog_new();
+	g_signal_connect(GTK_OBJECT(conf_dialog), "destroy",
+			   GTK_SIGNAL_FUNC(gtk_widget_destroyed), &conf_dialog);
+	gtk_window_set_title(GTK_WINDOW(conf_dialog), _("Configure Crystalizer"));
+
+	label = gtk_label_new(_("Effect intensity:"));
+	gtk_box_pack_start(GTK_BOX(GTK_DIALOG(conf_dialog)->vbox), label,
+			   TRUE, TRUE, 0);
+	gtk_widget_show(label);
+
+	hbox = gtk_hbox_new(FALSE, 10);
+	gtk_box_pack_start(GTK_BOX(GTK_DIALOG(conf_dialog)->vbox), hbox,
+			   TRUE, TRUE, 10);
+	gtk_widget_show(hbox);
+
+	adjustment = gtk_adjustment_new(value, 0.0, 15.0 + 1.0, 0.1, 1.0, 1.0);
+	scale = gtk_hscale_new(GTK_ADJUSTMENT(adjustment));
+	gtk_box_pack_start(GTK_BOX(hbox), scale, TRUE, TRUE, 10);
+	gtk_widget_show(scale);
+
+	bbox = gtk_hbutton_box_new();
+	gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END);
+	gtk_button_box_set_spacing(GTK_BUTTON_BOX(bbox), 5);
+	gtk_box_pack_start(GTK_BOX((GTK_DIALOG(conf_dialog)->action_area)),
+			   bbox, TRUE, TRUE, 0);
+
+	button = gtk_button_new_with_label(_("Ok"));
+	GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
+	gtk_box_pack_start(GTK_BOX(bbox), button, TRUE, TRUE, 0);
+	g_signal_connect(GTK_OBJECT(button), "clicked",
+			   GTK_SIGNAL_FUNC(conf_ok_cb),
+			   &GTK_ADJUSTMENT(adjustment)->value);
+	gtk_widget_grab_default(button);
+	gtk_widget_show(button);
+
+	button = gtk_button_new_with_label(_("Cancel"));
+	GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
+	gtk_box_pack_start(GTK_BOX(bbox), button, TRUE, TRUE, 0);
+	g_signal_connect(GTK_OBJECT(button), "clicked",
+			   GTK_SIGNAL_FUNC(conf_cancel_cb), NULL);
+	gtk_widget_show(button);
+
+	button = gtk_button_new_with_label(_("Apply"));
+	GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
+	gtk_box_pack_start(GTK_BOX(bbox), button, TRUE, TRUE, 0);
+	g_signal_connect(GTK_OBJECT(button), "clicked",
+			   GTK_SIGNAL_FUNC(conf_apply_cb),
+			   &GTK_ADJUSTMENT(adjustment)->value);
+	gtk_widget_show(button);
+
+	gtk_widget_show(bbox);
+
+	gtk_widget_show(conf_dialog);
+}
+
+static void query_format(AFormat * fmt, gint * rate, gint * nch)
+{
+	if (!(*fmt == FMT_S16_NE ||
+	      (*fmt == FMT_S16_LE && G_BYTE_ORDER == G_LITTLE_ENDIAN) ||
+	      (*fmt == FMT_S16_BE && G_BYTE_ORDER == G_BIG_ENDIAN)))
+		*fmt = FMT_S16_NE;
+}
+
+static int mod_samples(gpointer *d, gint length, AFormat afmt, gint srate, gint nch)
+{
+	gint i;
+	gdouble tmp;
+	static gdouble prev[2], diff[2];
+
+	gint16  *data = (gint16 *)*d;
+
+	if (!(afmt == FMT_S16_NE ||
+	      (afmt == FMT_S16_LE && G_BYTE_ORDER == G_LITTLE_ENDIAN) ||
+	      (afmt == FMT_S16_BE && G_BYTE_ORDER == G_BIG_ENDIAN)))
+		return length;
+	
+	for (i = 0; i < length / 2; i += 2)
+	{
+		diff[0] = data[i] - prev[0];
+		diff[1] = data[i + 1] - prev[1];
+		prev[0] = data[i];
+		prev[1] = data[i + 1];
+
+		tmp = data[i] + (diff[0] * value);
+		if (tmp < -32768)
+			tmp = -32768;
+		if (tmp > 32767)
+			tmp = 32767;
+		data[i] = tmp;
+
+		tmp = data[i + 1] + (diff[1] * value);
+		if (tmp < -32768)
+			tmp = -32768;
+		if (tmp > 32767)
+			tmp = 32767;
+		data[i + 1] = tmp;
+	}
+
+	return length;
+}
--- a/src/cue/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/cue/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -8,5 +8,5 @@
 plugindir := ${plugindir}/${INPUT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${DBUS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${ARCH_DEFINES} -I../../intl -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${DBUS_LIB} ${MOWGLI_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${ARCH_DEFINES} -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${MOWGLI_LIBS}
--- a/src/cue/cuesheet.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/cue/cuesheet.c	Fri Jun 13 05:57:25 2008 +0300
@@ -25,10 +25,6 @@
 #include <ctype.h>
 #include <audacious/plugin.h>
 #include <audacious/output.h>
-#include <audacious/playlist.h>
-#include <audacious/util.h>
-#include <audacious/strings.h>
-#include <audacious/main.h>
 
 #define MAX_CUE_LINE_LENGTH 1000
 #define MAX_CUE_TRACKS 1000
@@ -87,6 +83,8 @@
 
 static InputPlayback *real_ip = NULL;
 
+static gchar *cue_fmts[] = { "cue", NULL };
+
 InputPlugin cue_ip =
 {
 	.description = "Cuesheet Plugin",	/* description */
@@ -98,6 +96,7 @@
 	.seek = seek,
 	.cleanup = cue_cleanup,		/* cleanup */
 	.get_song_tuple = get_tuple,
+	.vfs_extensions = cue_fmts,
 };
 
 InputPlugin *cue_iplist[] = { &cue_ip, NULL };
--- a/src/daap/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/daap/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -18,5 +18,5 @@
 WARN = -Wall -pedantic -std=c99 
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${PICFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${INC} ${WARN} ${GCC42_CFLAGS}
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${MDNS_LIBS} ./xmms2-daap/xmms2-daap.a
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${PICFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS}  ${INC} ${WARN} ${GCC42_CFLAGS}
+LIBS += ${GTK_LIBS} ${GLIB_LIBS}  ${MDNS_LIBS} ./xmms2-daap/xmms2-daap.a
--- a/src/demac/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/demac/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -11,5 +11,5 @@
 plugindir := ${plugindir}/${INPUT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${DBUS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${ARCH_DEFINES} -I../../intl -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${MOWGLI_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS}  ${GTK_CFLAGS} ${GLIB_CFLAGS}  ${ARCH_DEFINES} -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS}  ${MOWGLI_LIBS}
--- a/src/demac/ape.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/demac/ape.c	Fri Jun 13 05:57:25 2008 +0300
@@ -22,12 +22,13 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+/* #define DEBUG */
+
 #include <stdio.h>
 #include <stdlib.h> 
 #include <errno.h> 
 #include <string.h> 
 
-#include <audacious/vfs.h>
 #include <audacious/plugin.h> 
 
 #include "ape.h"
@@ -152,32 +153,48 @@
 #define ape_dumpinfo(a) ;
 #endif
 
+#define SEARCH_BUF_SZ 64*1024 /* search header in first 64k, it's enough for skipping id3v2 -- asphyx */
+static int
+find_header(VFSFile *pb, int16_t* ver)
+{
+    uint8_t sbuf[SEARCH_BUF_SZ];
+    unsigned i;
+    uint32_t tag;
+    uint8_t* s;
+
+    if (aud_vfs_fread(sbuf, 1, SEARCH_BUF_SZ, pb) < SEARCH_BUF_SZ) return -1;
+    for (i = 0; i < SEARCH_BUF_SZ - 6; i++) {
+        s = &(sbuf[i]);
+        tag = AV_RL32(s);
+        s += 4;
+        *ver = AV_RL16(s);
+        if (tag == MKTAG('M', 'A', 'C', ' ') &&
+            *ver >= APE_MIN_VERSION &&
+            *ver <= APE_MAX_VERSION) {
+            
+#ifdef DEBUG
+            fprintf(stderr, "found MAC header at offset 0x%0x, version %d.%d\n", i, *ver / 1000, (*ver % 1000) / 10);
+#endif
+            return i;
+        }
+    }
+
+    return -1;
+}
+
 int ape_read_header(APEContext *ape, VFSFile *pb, int probe_only)
 {
-    /*ByteIOContext *pb = &s->pb;
-    APEContext *ape = s->priv_data;
-    AVStream *st;*/
-    uint32_t tag;
-    int i;
-    //int total_blocks;
-    //int64_t pts;
-
-    /* TODO: Skip any leading junk such as id3v2 tags */
-    ape->junklength = 0;
+    int i, header_offset;
 
-    tag = get_le32(pb);
-    if (tag != MKTAG('M', 'A', 'C', ' '))
-        return -1;
-
-    ape->fileversion = get_le16(pb);
-
-    if (ape->fileversion < APE_MIN_VERSION || ape->fileversion > APE_MAX_VERSION) {
+    if ((header_offset = find_header(pb, &(ape->fileversion))) < 0) {
 #ifdef DEBUG
-        fprintf(stderr, "ape.c: ape_read_header(): Unsupported file version - %d.%02d\n",
-	        ape->fileversion / 1000, (ape->fileversion % 1000) / 10);
+        fprintf(stderr, "ape.c: ape_read_header(): header not found or unsupported version\n");
 #endif
         return -1;
     }
+    
+    aud_vfs_fseek(pb, header_offset + 6, SEEK_SET);
+    ape->junklength = header_offset;
 
     if (ape->fileversion >= 3980) {
         ape->padding1             = get_le16(pb);
@@ -262,7 +279,7 @@
           return AVERROR_NOMEM;
     }
 
-    ape->firstframe   = ape->junklength + ape->descriptorlength + ape->headerlength + ape->seektablelength + ape->wavheaderlength;
+    ape->firstframe = ape->junklength + ape->descriptorlength + ape->headerlength + ape->seektablelength + ape->wavheaderlength;
     ape->currentframe = 0;
 
     ape->totalsamples = ape->finalframeblocks;
@@ -280,7 +297,7 @@
         ape->frames[0].nblocks = ape->blocksperframe;
         ape->frames[0].skip    = 0;
         for (i = 1; i < ape->totalframes; i++) {
-            ape->frames[i].pos      = ape->seektable[i]; //ape->frames[i-1].pos + ape->blocksperframe;
+            ape->frames[i].pos      = ape->seektable[i] + ape->junklength;
             ape->frames[i].nblocks  = ape->blocksperframe;
             ape->frames[i - 1].size = ape->frames[i].pos - ape->frames[i - 1].pos;
             ape->frames[i].skip     = (ape->frames[i].pos - ape->frames[0].pos) & 3;
@@ -296,17 +313,14 @@
                 ape->frames[i].size += ape->frames[i].skip;
             }
             ape->frames[i].size = (ape->frames[i].size + 3) & ~3;
-    	    // Eugene:
-    	    ape->max_packet_size = MAX(ape->max_packet_size, ape->frames[i].size + 8);
-    	    // why +8? look in ape_read_packet()
+    	    ape->max_packet_size = MAX(ape->max_packet_size, ape->frames[i].size + 8); /* simplifies future frame buffer allocation --asphyx */
+    	    /* why +8? look in ape_read_packet() */
         }
         ape_dumpinfo(ape);
 
-    } // !probe_only
+    } /* !probe_only */
 
-    //ape->total_blocks = (ape->totalframes == 0) ? 0 : ((ape->totalframes - 1) * ape->blocksperframe) + ape->finalframeblocks;
     ape->frame_size = MAC_SUBFRAME_SIZE;
-    //ape->duration = (uint64_t) total_blocks * AV_TIME_BASE / ape->samplerate;
     ape->duration = (uint64_t) ape->totalsamples * AV_TIME_BASE / ape->samplerate;
 
 #ifdef DEBUG
@@ -315,15 +329,6 @@
 	    ape->totalframes, ape->blocksperframe, ape->channels == 2 ? "stereo" : "mono");
 #endif
 
-    //av_set_pts_info(st, 64, MAC_SUBFRAME_SIZE, ape->samplerate);
-
-    /*pts = 0;
-    for (i = 0; i < ape->totalframes; i++) {
-        ape->frames[i].pts = pts;
-        av_add_index_entry(st, ape->frames[i].pos, ape->frames[i].pts, 0, 0, AVINDEX_KEYFRAME);
-        pts += ape->blocksperframe / MAC_SUBFRAME_SIZE;
-    }*/
-
     return 0;
 }
 
@@ -347,21 +352,11 @@
     else
         nblocks = ape->blocksperframe;
 
-    /*if (av_new_packet(pkt,  ape->frames[ape->currentframe].size + extra_size) < 0)
-        return AVERROR_NOMEM;*/
-
     AV_WL32(pkt    , nblocks);
     AV_WL32(pkt + 4, ape->frames[ape->currentframe].skip);
 
     ret = aud_vfs_fread(pkt + extra_size, 1, ape->frames[ape->currentframe].size, pb);
 
-    /*pkt->pts = ape->frames[ape->currentframe].pts;
-    pkt->stream_index = 0;*/
-
-    /* note: we need to modify the packet size here to handle the last
-       packet */
-    /*pkt->size = ret + extra_size;*/
-
     ape->currentframe++;
     *pkt_size = ape->frames[ape->currentframe].size + extra_size;
 
@@ -374,18 +369,3 @@
     if(ape->seektable != NULL) free(ape->seektable);
     return 0;
 }
-
-/*
-static int ape_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
-{
-    AVStream *st = s->streams[stream_index];
-    APEContext *ape = s->priv_data;
-    int index = av_index_search_timestamp(st, timestamp, flags);
-
-    if (index < 0)
-        return -1;
-
-    ape->currentframe = index;
-    return 0;
-}*/
-
--- a/src/demac/ape.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/demac/ape.h	Fri Jun 13 05:57:25 2008 +0300
@@ -37,6 +37,12 @@
                                  ((uint64_t)e << 32) | ((uint64_t)f << 40) | ((uint64_t)g << 48) | ((uint64_t)h << 56))
 
 #define AV_TIME_BASE 1000
+#define AV_RL16(x) (((uint16_t)(((uint8_t*)(x))[1]) << 8) | (uint16_t)(((uint8_t*)(x))[0]))
+#define AV_RL32(x) (((uint32_t)(((uint8_t*)(x))[3]) << 24) | \
+                    ((uint32_t)(((uint8_t*)(x))[2]) << 16) | \
+                    ((uint32_t)(((uint8_t*)(x))[1]) <<  8) | \
+                     (uint32_t)(((uint8_t*)(x))[0]))
+
 #define AV_WL16(a,b) { \
           ((uint8_t*)(a))[0] =  (uint16_t)(b) & 0x00ff;        \
           ((uint8_t*)(a))[1] = ((uint16_t)(b) & 0xff00) >> 8; \
--- a/src/demac/apedec.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/demac/apedec.c	Fri Jun 13 05:57:25 2008 +0300
@@ -28,7 +28,6 @@
 #include <string.h> 
 #include <assert.h> 
 
-#include <audacious/vfs.h>
 #include <audacious/plugin.h> 
 
 #include "ape.h"
--- a/src/demac/apev2.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/demac/apev2.c	Fri Jun 13 05:57:25 2008 +0300
@@ -26,7 +26,6 @@
 
 #include <glib.h>
 #include <mowgli.h>
-#include <audacious/vfs.h>
 #include <audacious/plugin.h> 
 
 #include "ape.h"
--- a/src/demac/apev2.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/demac/apev2.h	Fri Jun 13 05:57:25 2008 +0300
@@ -2,7 +2,6 @@
 #define APEV2_H
 
 #include <mowgli.h>
-#include <audacious/vfs.h>
 
 mowgli_dictionary_t* parse_apev2_tag(VFSFile *vfd);
 gboolean write_apev2_tag(VFSFile *vfd, mowgli_dictionary_t *tag);
--- a/src/demac/plugin.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/demac/plugin.c	Fri Jun 13 05:57:25 2008 +0300
@@ -44,10 +44,7 @@
 #include <audacious/i18n.h> 
 
 #include <audacious/plugin.h> 
-#include <audacious/main.h> 
 #include <audacious/output.h> 
-#include <audacious/vfs.h> 
-#include <audacious/util.h> 
 
 #include "ape.h"
 #include "apev2.h"
@@ -69,7 +66,7 @@
 static InputPlugin demac_ip;
 static GtkWidget *about_window = NULL;
 
-#ifdef DEBUG
+#ifdef AUD_DEBUG
 # include "crc.c"
 #endif
 
@@ -120,14 +117,12 @@
     APEDecoderContext *dec = NULL;
     int decoded_bytes;
     int pkt_size, bytes_used;
-#ifdef DEBUG
+#ifdef AUD_DEBUG
     uint32_t frame_crc;
 #endif
     
     if ((vfd = aud_vfs_fopen(pb->filename, "r")) == NULL) {
-#ifdef DEBUG
-        fprintf(stderr, "** demac: plugin.c: Error opening URI: %s\n", pb->filename);
-#endif
+        AUDDBG("** demac: plugin.c: Error opening URI: %s\n", pb->filename);
         pb->error = TRUE;
         goto cleanup;
     }
@@ -135,32 +130,24 @@
     ctx = calloc(sizeof(APEContext), 1);
     if(ape_read_header(ctx, vfd, 0) < 0) {
         pb->error = TRUE;
-#ifdef DEBUG
-        fprintf(stderr, "** demac: plugin.c: Cannot parse APE header or unsupported format: %s\n", pb->filename);
-#endif
+        AUDDBG("** demac: plugin.c: Cannot parse APE header or unsupported format: %s\n", pb->filename);
         goto cleanup;
     }
 
     dec = calloc(sizeof(APEDecoderContext), 1);
     if(ape_decode_init(dec, ctx) < 0) {
         pb->error = TRUE;
-#ifdef DEBUG
-        fprintf(stderr, "** demac: plugin.c: Error initializing decoder\n");
-#endif
+        AUDDBG("** demac: plugin.c: Error initializing decoder\n");
         goto cleanup;
     }
     
     frame_buf = malloc(ctx->max_packet_size);
    
-#ifdef DEBUG
-    fprintf(stderr, "** demac: plugin.c: Duration: %u msec\n", ctx->duration);
-#endif
+    AUDDBG("** demac: plugin.c: Duration: %u msec\n", ctx->duration);
 
     if(!pb->output->open_audio(FMT_S16_LE, ctx->samplerate, ctx->channels)) {
         pb->error = TRUE;
-#ifdef DEBUG
-        fprintf(stderr, "** demac: plugin.c: Cannot open audio.\n");
-#endif
+        AUDDBG("** demac: plugin.c: Cannot open audio.\n");
         goto cleanup;
     }
 
@@ -201,17 +188,12 @@
 	}
 
         ape_read_packet(ctx, vfd, frame_buf, &pkt_size);
-#ifdef DEBUG
+#ifdef AUD_DEBUG
         assert(pkt_size <= ctx->max_packet_size);
 	frame_crc = ape_initcrc();
 #endif
 	bytes_used = 0;
 
-/*#ifdef DEBUG
-        fprintf(stderr, "frame %d, %d samples, offset %d, size %d\n", ctx->currentframe-1,
-	        *((uint32_t*)frame_buf), *((uint32_t*)(frame_buf+4)), pkt_size);
-#endif*/
-
         /* Decode the frame a chunk at a time */
         while (playing && (bytes_used != pkt_size) && (local_seek_to == -1))
         {
@@ -232,17 +214,17 @@
 
             /* Write audio data */
             pb->pass_audio(pb, FMT_S16_LE, ctx->channels, decoded_bytes, wav, &playing);
-#if DEBUG
+#ifdef AUD_DEBUG
             frame_crc = ape_updatecrc(wav, decoded_bytes, frame_crc);
 #endif
 
         }
 
-#if DEBUG
+#ifdef AUD_DEBUG
         frame_crc = ape_finishcrc(frame_crc);
 
         if (dec->CRC != frame_crc) {
-            fprintf(stderr, "** demac: plugin.c: CRC error in frame %d\n", ctx->currentframe-1);
+            AUDDBG("** demac: plugin.c: CRC error in frame %d\n", ctx->currentframe-1);
         }
 #endif
     }
@@ -261,9 +243,7 @@
     if(ctx) {ape_read_close(ctx); free(ctx);}
     if(vfd) aud_vfs_fclose(vfd);
 
-#ifdef DEBUG
-    fprintf(stderr, "** demac: plugin.c: decoding loop finished\n");
-#endif
+    AUDDBG("** demac: plugin.c: decoding loop finished\n");
 
     return NULL;
 }
@@ -278,15 +258,9 @@
         g_mutex_lock(demac_mutex);
         pb->playing = 0;
         g_mutex_unlock(demac_mutex);
-#ifdef DEBUG
-        fprintf(stderr, "** demac: plugin.c: waiting for thread finished\n");
-#endif
-        //g_thread_join(pb->thread);
-	/* pb->thread is useless if input plugin initialized from **terrible** cue-sheet plugin */
+        AUDDBG("** demac: plugin.c: waiting for thread finished\n");
         g_thread_join(pb_thread);
-#ifdef DEBUG
-        fprintf(stderr, "** demac: plugin.c: thread finished\n");
-#endif
+        AUDDBG("** demac: plugin.c: thread finished\n");
     }
 }
 
@@ -299,10 +273,7 @@
 }
 
 Tuple *demac_probe_for_tuple (gchar *uri, VFSFile *vfd) {
-#ifdef DEBUG
-    fprintf(stderr, "** demac: plugin.c: demac_probe_for_tuple()\n");
-#endif
-    Tuple *tpl = aud_tuple_new_from_filename(uri);
+    AUDDBG("** demac: plugin.c: demac_probe_for_tuple()\n");
     gchar codec_string[32];
 
     if (aud_vfs_is_streaming(vfd)) {
@@ -310,6 +281,15 @@
         return NULL;
     }
 
+    APEContext *ctx = calloc(sizeof(APEContext), 1);
+    aud_vfs_rewind(vfd);
+    if (ape_read_header(ctx, vfd, 1) < 0) {
+        free(ctx);
+        aud_vfs_rewind(vfd);
+        return NULL;
+    }
+
+    Tuple *tpl = aud_tuple_new_from_filename(uri);
     mowgli_dictionary_t *tag = NULL;
     gchar *item;
     if ((tag = parse_apev2_tag(vfd)) != NULL) {
@@ -322,14 +302,9 @@
         if((item = mowgli_dictionary_retrieve(tag, "Year")) != NULL) aud_tuple_associate_int(tpl, FIELD_YEAR, NULL, atoi(item));
     }
 
-    APEContext *ctx = calloc(sizeof(APEContext), 1);
-    aud_vfs_rewind(vfd);
-    ape_read_header(ctx, vfd, 1);
     aud_tuple_associate_int(tpl, FIELD_LENGTH, NULL, ctx->duration);
-    g_sprintf(codec_string, "Monkey's Audio v%4.2f", (float)ctx->fileversion/1000.0);
-#ifdef DEBUG
-    fprintf(stderr, "** demac: plugin.c: Codec: %s\n", codec_string);
-#endif
+    g_snprintf(codec_string, sizeof(codec_string), "Monkey's Audio v%4.2f", (float)ctx->fileversion/1000.0);
+    AUDDBG("** demac: plugin.c: Codec: %s\n", codec_string);
     aud_tuple_associate_string(tpl, FIELD_CODEC, NULL, codec_string);
     aud_tuple_associate_string(tpl, FIELD_QUALITY, NULL, "lossless");
     aud_tuple_associate_string(tpl, FIELD_MIMETYPE, NULL, "audio/x-ape");
@@ -343,9 +318,7 @@
 }
 
 Tuple *demac_get_tuple(char *filename) {
-#ifdef DEBUG
-  fprintf(stderr, "** demac: plugin.c: demac_get_tuple()\n");
-#endif
+  AUDDBG("** demac: plugin.c: demac_get_tuple()\n");
   VFSFile *vfd;
 
   if ((vfd = aud_vfs_fopen(filename, "r")) == NULL) {
@@ -361,9 +334,7 @@
   g_mutex_lock(demac_mutex);
   seek_to_msec = millisecond;
   g_mutex_unlock(demac_mutex);
-#ifdef DEBUG
-  fprintf(stderr, "** demac: plugin.c: seeking to %u msec\n", millisecond);
-#endif
+  AUDDBG("** demac: plugin.c: seeking to %u msec\n", millisecond);
 }
 
 static void demac_seek (InputPlayback *pb, gint time) {
--- a/src/dockalbumart/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/dockalbumart/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -8,5 +8,5 @@
 plugindir := ${plugindir}/${GENERAL_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${BEEP_DEFINES} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} -I../../intl -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${BEEP_DEFINES} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS}  -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS} 
--- a/src/dockalbumart/dockalbumart.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/dockalbumart/dockalbumart.c	Fri Jun 13 05:57:25 2008 +0300
@@ -28,8 +28,6 @@
 #include <Carbon/Carbon.h>
 
 #include <audacious/plugin.h>
-#include <audacious/util.h>
-#include <audacious/playlist.h>
 
 #include "audacious_player.xpm"
 
--- a/src/echo_plugin/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/echo_plugin/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -9,5 +9,5 @@
 plugindir := ${plugindir}/${EFFECT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} -I../../intl -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS}  -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS} 
--- a/src/echo_plugin/echo.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/echo_plugin/echo.c	Fri Jun 13 05:57:25 2008 +0300
@@ -1,18 +1,17 @@
+#include "config.h"
 #include <audacious/plugin.h>
-
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
 #include <gtk/gtk.h>
 #include <audacious/i18n.h>
-#include <audacious/configdb.h>
 #include "echo.h"
 
-#include "../../config.h"
 
 static void init(void);
 static void cleanup(void);
 static int mod_samples(gpointer * d, gint length, AFormat afmt, gint srate, gint nch);
+static void query_format(AFormat * fmt, gint * rate, gint * nch);
 
 #define MAX_SRATE 50000
 #define MAX_CHANNELS 2
@@ -29,6 +28,7 @@
 	.about = echo_about,
 	.configure = echo_configure,
 	.mod_samples = mod_samples,
+	.query_format = query_format,
 };
 
 static gint16 *buffer = NULL;
@@ -42,7 +42,7 @@
 
 static void init(void)
 {
-	ConfigDb *cfg;
+	mcs_handle_t *cfg;
 	
 	if (sizeof(short) != sizeof(gint16))
 		abort();
@@ -61,6 +61,14 @@
 	buffer = NULL;	
 }
 
+static void query_format(AFormat * fmt, gint * rate, gint * nch)
+{
+	if (!(*fmt == FMT_S16_NE ||
+	      (*fmt == FMT_S16_LE && G_BYTE_ORDER == G_LITTLE_ENDIAN) ||
+	      (*fmt == FMT_S16_BE && G_BYTE_ORDER == G_BIG_ENDIAN)))
+		*fmt = FMT_S16_NE;
+}
+
 static int mod_samples(gpointer * d, gint length, AFormat afmt, gint srate, gint nch)
 {
 	gint i, in, out, buf, r_ofs, fb_div;
--- a/src/echo_plugin/gui.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/echo_plugin/gui.c	Fri Jun 13 05:57:25 2008 +0300
@@ -3,8 +3,6 @@
 #include <gtk/gtk.h>
 #include <audacious/plugin.h>
 #include <audacious/i18n.h>
-#include <audacious/util.h>
-#include <audacious/configdb.h>
 #include "echo.h"
 
 static const char *echo_about_text =
@@ -32,7 +30,7 @@
 
 static void apply_changes(void)
 {
-	ConfigDb *cfg;
+	mcs_handle_t *cfg;
 	echo_delay = GTK_ADJUSTMENT(echo_delay_adj)->value;
 	echo_feedback = GTK_ADJUSTMENT(echo_feedback_adj)->value;
 	echo_volume = GTK_ADJUSTMENT(echo_volume_adj)->value;
--- a/src/esd/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/esd/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -13,5 +13,5 @@
 plugindir := ${plugindir}/${OUTPUT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${DBUS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${ESD_CFLAGS} -I../../intl -I../.. -I..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${ESD_LIBS} ${OSS_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS}  ${GTK_CFLAGS} ${GLIB_CFLAGS}  ${ESD_CFLAGS} -I../.. -I..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS}  ${ESD_LIBS} ${OSS_LIBS}
--- a/src/esd/about.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/esd/about.c	Fri Jun 13 05:57:25 2008 +0300
@@ -20,7 +20,6 @@
 #include <audacious/i18n.h>
 #include <gtk/gtk.h>
 
-#include <audacious/util.h>
 
 
 void
--- a/src/esd/audio.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/esd/audio.c	Fri Jun 13 05:57:25 2008 +0300
@@ -25,7 +25,6 @@
 #include <esd.h>
 
 #include <unistd.h>
-#include <audacious/util.h>
 
 #include "esdout.h"
 
@@ -158,6 +157,9 @@
     case FMT_S16_NE:
         esd_format = ESD_BITS16;
         break;
+    default:
+        /* for warning suppression */
+        break;
     }
 
 #if (G_BYTE_ORDER == G_BIG_ENDIAN)
--- a/src/esd/configure.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/esd/configure.c	Fri Jun 13 05:57:25 2008 +0300
@@ -22,11 +22,11 @@
 #include "esdout.h"
 
 #include <glib.h>
+#include <audacious/plugin.h>
 #include <audacious/i18n.h>
 #include <gtk/gtk.h>
 #include <stdlib.h>
 
-#include <audacious/configdb.h>
 
 
 static GtkWidget *configure_win;
@@ -37,7 +37,7 @@
 static void
 configure_win_ok_cb(GtkWidget * w, gpointer data)
 {
-    ConfigDb *db;
+    mcs_handle_t *db;
 
     esd_cfg.use_remote =
         gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(server_use_remote));
--- a/src/esd/init.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/esd/init.c	Fri Jun 13 05:57:25 2008 +0300
@@ -18,9 +18,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <esd.h>
-
-#include <audacious/configdb.h>
-
+#include <audacious/plugin.h>
 #include "esdout.h"
 
 
@@ -32,7 +30,7 @@
 void
 esdout_init(void)
 {
-    ConfigDb *db;
+    mcs_handle_t *db;
     char *env;
     int lp = 80 , rp = 80;
 
--- a/src/esd/mixer.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/esd/mixer.c	Fri Jun 13 05:57:25 2008 +0300
@@ -23,9 +23,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <esd.h>
-
-#include <audacious/configdb.h>
-
+#include <audacious/plugin.h>
 #include <unistd.h>
 #include <fcntl.h>
 #include <sys/types.h>
@@ -45,7 +43,6 @@
 # define OSS_AVAILABLE FALSE
 #endif
 
-#include <audacious/util.h>
 
 #define QUERY_PLAYER_ID_ATTEMPTS 5
 
@@ -144,7 +141,7 @@
 void
 esdout_set_volume(int l, int r)
 {
-    ConfigDb *db;
+    mcs_handle_t *db;
     lp = l;
     rp = r;
 
--- a/src/evdev-plug/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/evdev-plug/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -11,5 +11,5 @@
 plugindir := ${plugindir}/${GENERAL_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${BEEP_DEFINES} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} -I../../intl -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${BEEP_DEFINES} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS}  -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS} 
--- a/src/evdev-plug/ed_internals.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/evdev-plug/ed_internals.c	Fri Jun 13 05:57:25 2008 +0300
@@ -24,7 +24,6 @@
 #include "ed_bindings_store.h"
 #include "ed_common.h"
 
-#include <audacious/util.h>
 #include <stdint.h>
 #include <stdio.h>
 #include <linux/input.h>
@@ -36,7 +35,7 @@
 #include <regex.h>
 /* for variadic */
 #include <stdarg.h>
-
+#include <audacious/plugin.h>
 #include <audacious/i18n.h>
 #include <glib.h>
 #include <glib/gstdio.h>
--- a/src/filewriter/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/filewriter/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -12,5 +12,5 @@
 plugindir := ${plugindir}/${OUTPUT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${GLIB_CFLAGS} ${GTK_CFLAGS} ${PANGO_CFLAGS} ${MOWGLI_CFLAGS} ${DBUS_CFLAGS} ${FILEWRITER_CFLAGS} ${OGG_VORBIS_CFLAGS} -I../../intl -I../..
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${GLIB_CFLAGS} ${GTK_CFLAGS}  ${MOWGLI_CFLAGS}  ${FILEWRITER_CFLAGS} ${OGG_VORBIS_CFLAGS} -I../..
 LIBS += ${GTK_LIBS} ${FILEWRITER_LIBS}
--- a/src/flacng/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/flacng/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -11,5 +11,5 @@
 plugindir := ${plugindir}/${INPUT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${LIBFLAC_CFLAGS} ${MOWGLI_CFLAGS} ${DBUS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} -I../../intl -I../..
-LIBS += ${LIBFLAC_LIBS} ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${MOWGLI_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${LIBFLAC_CFLAGS} ${MOWGLI_CFLAGS}  ${GTK_CFLAGS} ${GLIB_CFLAGS}  -I../..
+LIBS += ${LIBFLAC_LIBS} ${GTK_LIBS} ${GLIB_LIBS}  ${MOWGLI_LIBS}
--- a/src/flacng/flacng.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/flacng/flacng.h	Fri Jun 13 05:57:25 2008 +0300
@@ -22,7 +22,6 @@
 #include "config.h"
 #include <glib.h>
 #include <audacious/plugin.h>
-#include <audacious/main.h>
 #include <audacious/i18n.h>
 
 #define OUTPUT_BLOCK_SIZE (1024u)
--- a/src/flacng/plugin.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/flacng/plugin.c	Fri Jun 13 05:57:25 2008 +0300
@@ -19,7 +19,6 @@
 /* #define FLACNG_DEBUG */
 
 #include "flacng.h"
-#include <audacious/util.h>
 #include <audacious/output.h>
 #include <audacious/i18n.h>
 #include "tools.h"
--- a/src/flacng/seekable_stream_callbacks.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/flacng/seekable_stream_callbacks.c	Fri Jun 13 05:57:25 2008 +0300
@@ -20,7 +20,6 @@
 #include <string.h>
 #include <FLAC/all.h>
 #include <glib.h>
-#include <audacious/vfs.h>
 #include "flacng.h"
 #include "tools.h"
 #include "seekable_stream_callbacks.h"
--- a/src/gnomeshortcuts/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/gnomeshortcuts/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -8,5 +8,5 @@
 plugindir := ${plugindir}/${GENERAL_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${GTK_CFLAGS} ${MOWGLI_CFLAGS} ${GLIB_CFLAGS} ${DBUS_CFLAGS} -I../../intl -I../.. -I..
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${GTK_CFLAGS} ${MOWGLI_CFLAGS} ${GLIB_CFLAGS} ${DBUS_CFLAGS} -I../.. -I..
 LIBS += ${GLIB_LIBS} ${DBUS_LIBS} ${GTK_LIBS}
--- a/src/gnomeshortcuts/gnomeshortcuts.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/gnomeshortcuts/gnomeshortcuts.c	Fri Jun 13 05:57:25 2008 +0300
@@ -32,7 +32,6 @@
 #include <audacious/auddrct.h>
 
 #include <audacious/i18n.h>
-#include <audacious/util.h>
 
 
 static void init (void);
--- a/src/hotkey/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/hotkey/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -8,5 +8,5 @@
 plugindir := ${plugindir}/${GENERAL_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${GTK_CFLAGS} ${MOWGLI_CFLAGS} ${GLIB_CFLAGS} ${DBUS_CFLAGS} -I../../intl -I../.. -I..
-LIBS += ${GLIB_LIBS} ${DBUS_LIBS} ${GTK_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${GTK_CFLAGS} ${MOWGLI_CFLAGS} ${GLIB_CFLAGS}  -I../.. -I..
+LIBS += ${GLIB_LIBS}  ${GTK_LIBS}
--- a/src/hotkey/gui.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/hotkey/gui.c	Fri Jun 13 05:57:25 2008 +0300
@@ -39,8 +39,8 @@
 #include <gdk/gdkx.h>
 #include <gdk/gdkkeysyms.h>
 
+#include <audacious/plugin.h>
 #include <audacious/i18n.h>
-#include <audacious/util.h>
 
 #include "plugin.h"
 #include "gui.h"
@@ -621,7 +621,7 @@
 		HotkeyConfiguration * old;
 		old = hotkey;
 		hotkey = hotkey->next;
-		free(old);
+		g_free(old);
 	}
 	plugin_cfg->first.next = NULL;
 	plugin_cfg->first.key = 0;
@@ -633,8 +633,7 @@
 	{
 		if (controls->hotkey.key) {
 			if (hotkey->key) {
-				hotkey->next = (HotkeyConfiguration*)
-					malloc(sizeof (HotkeyConfiguration));
+				hotkey->next = g_new(HotkeyConfiguration, 1);
 				hotkey = hotkey->next;
 				hotkey->next = NULL;
 			}
--- a/src/hotkey/plugin.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/hotkey/plugin.c	Fri Jun 13 05:57:25 2008 +0300
@@ -41,7 +41,6 @@
 #include <gdk/gdkx.h>
 #include <audacious/plugin.h>
 #include <audacious/auddrct.h>
-#include <audacious/configdb.h>
 
 #include <audacious/i18n.h>
 
@@ -319,7 +318,7 @@
 /* load plugin configuration */
 void load_config (void)
 {
-	ConfigDb *cfdb;
+	mcs_handle_t *cfdb;
 	HotkeyConfiguration *hotkey;
 	int i,max;
 	
@@ -378,7 +377,7 @@
 /* save plugin configuration */
 void save_config (void)
 {
-	ConfigDb *cfdb;
+	mcs_handle_t *cfdb;
 	int max;
 	HotkeyConfiguration *hotkey;
 
--- a/src/jack/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/jack/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -10,5 +10,5 @@
 plugindir := ${plugindir}/${OUTPUT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${SAMPLERATE_CFLAGS} -I../../intl -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${JACK_LIBS} ${SAMPLERATE_LIBS} -pthread
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS}  ${SAMPLERATE_CFLAGS} -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS}  ${JACK_LIBS} ${SAMPLERATE_LIBS} -pthread
--- a/src/jack/configure.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/jack/configure.c	Fri Jun 13 05:57:25 2008 +0300
@@ -25,7 +25,6 @@
 #include "jack.h"
 
 #include <audacious/plugin.h>
-#include <audacious/configdb.h>
 #include <audacious/i18n.h>
 # include "config.h"
 
@@ -46,7 +45,7 @@
 
 static void configure_win_ok_cb(GtkWidget * w, gpointer data)
 {
-        ConfigDb *cfgfile;
+        mcs_handle_t *cfgfile;
 
         jack_cfg.isTraceEnabled = (gint) GTK_CHECK_BUTTON(GTK_isTraceEnabled)->toggle_button.active;
   jack_cfg.port_connection_mode = GET_CHARS(GTK_COMBO(port_connection_mode_combo)->entry);
--- a/src/jack/jack.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/jack/jack.c	Fri Jun 13 05:57:25 2008 +0300
@@ -7,8 +7,6 @@
  */
 
 #include <audacious/plugin.h>
-#include <audacious/configdb.h>
-#include <audacious/util.h>
 #include <dlfcn.h>
 #include <gtk/gtk.h>
 #include <audacious/i18n.h>
@@ -183,7 +181,7 @@
 void jack_init(void)
 {
   /* read the isTraceEnabled setting from the config file */
-  ConfigDb *cfgfile;
+  mcs_handle_t *cfgfile;
 
   cfgfile = aud_cfg_db_open();
   if (!cfgfile)
@@ -252,7 +250,7 @@
 /* Close the device */
 void jack_close(void)
 {
-  ConfigDb *cfgfile;
+  mcs_handle_t *cfgfile;
 
   cfgfile = aud_cfg_db_open();
   aud_cfg_db_set_int(cfgfile, "jack", "volume_left", jack_cfg.volume_left); /* stores the volume setting */
--- a/src/ladspa/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/ladspa/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -8,5 +8,5 @@
 plugindir := ${plugindir}/${EFFECT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} -I../../intl -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS}  -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS} 
--- a/src/ladspa/ladspa.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/ladspa/ladspa.c	Fri Jun 13 05:57:25 2008 +0300
@@ -30,7 +30,6 @@
 #include <gtk/gtk.h>
 
 #include <audacious/plugin.h>
-#include <audacious/configdb.h>
 #include <audacious/i18n.h>
 
 #include "ladspa.h"
@@ -141,7 +140,7 @@
 
 static void restore (void)
 {
-  ConfigDb *db;
+  mcs_handle_t *db;
   gint k, plugins= 0;
 
   db = aud_cfg_db_open();
@@ -254,7 +253,7 @@
 static void stop (void)
 {
   GSList *list;
-  ConfigDb *db;
+  mcs_handle_t *db;
   gint plugins = 0;
 
   if (state.running == FALSE) {
--- a/src/lastfm/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/lastfm/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -8,5 +8,5 @@
 plugindir := ${plugindir}/${TRANSPORT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${DBUS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${ARCH_DEFINES} ${XML_CPPFLAGS} ${CURL_CFLAGS} -I../../intl -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${XML_LIBS} ${CURL_LIBS} ${MOWGLI_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS}  ${GTK_CFLAGS} ${GLIB_CFLAGS}  ${ARCH_DEFINES} ${XML_CPPFLAGS} ${CURL_CFLAGS} -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS}  ${XML_LIBS} ${CURL_LIBS} ${MOWGLI_LIBS}
--- a/src/lastfm/lastfm.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/lastfm/lastfm.c	Fri Jun 13 05:57:25 2008 +0300
@@ -39,9 +39,7 @@
  *              * Ordinary mp3 streams seem to share this behavior. Didnt tested if others do.
  */
 
-#include <audacious/vfs.h>
 #include <audacious/plugin.h>
-#include <audacious/configdb.h>
 #include <libmowgli/mowgli_global_storage.h>
 #include <curl/curl.h>
 #include <glib.h>
@@ -108,7 +106,7 @@
 
 gchar* lastfm_get_login_uri()  /* reads the audioscrobbler login data from the config */
 {                              /* and then uses them to create a login URL*/
-        ConfigDb *cfg = NULL;
+        mcs_handle_t *cfg = NULL;
         gchar   *buf=NULL,
                 *username = NULL, 
                 *password = NULL;
--- a/src/lirc/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/lirc/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -12,5 +12,5 @@
 plugindir := ${plugindir}/${GENERAL_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${GTK_CFLAGS} ${MOWGLI_CFLAGS} ${PANGO_CFLAGS} ${DBUS_CFLAGS} -I../../intl -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} -llirc_client
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${GTK_CFLAGS} ${MOWGLI_CFLAGS}   -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS}  -llirc_client
--- a/src/m3u/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/m3u/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -8,5 +8,5 @@
 plugindir := ${plugindir}/${CONTAINER_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${DBUS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${ARCH_DEFINES} ${XML_CPPFLAGS} -I../../intl -I../.. -Wall
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${XML_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS}  ${GTK_CFLAGS} ${GLIB_CFLAGS}  ${ARCH_DEFINES} ${XML_CPPFLAGS} -I../.. -Wall
+LIBS += ${GTK_LIBS} ${GLIB_LIBS}  ${XML_LIBS}
--- a/src/m3u/m3u.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/m3u/m3u.c	Fri Jun 13 05:57:25 2008 +0300
@@ -34,11 +34,6 @@
 #include <sys/errno.h>
 
 #include <audacious/plugin.h>
-#include <audacious/main.h>
-#include <audacious/util.h>
-#include <audacious/playlist.h>
-#include <audacious/playlist_container.h>
-#include <audacious/strings.h>
 
 static void
 parse_extm3u_info(const gchar * info, gchar ** title, gint * length)
--- a/src/madplug/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/madplug/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -14,6 +14,6 @@
 plugindir := ${plugindir}/${INPUT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${DBUS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${MOWGLI_CFLAGS} ${ARCH_DEFINES} ${SIMD_CFLAGS} ${MAD_CFLAGS} -I../..
+CPPFLAGS += ${PLUGIN_CPPFLAGS}  ${GTK_CFLAGS} ${GLIB_CFLAGS}  ${MOWGLI_CFLAGS} ${ARCH_DEFINES} ${SIMD_CFLAGS} ${MAD_CFLAGS} -I../..
 LDFLAGS += ${AUDLDFLAGS}
-LIBS += ${MAD_LIBS} -laudid3tag ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${MOWGLI_LIBS}
+LIBS += ${MAD_LIBS} -laudid3tag ${GTK_LIBS} ${GLIB_LIBS}  ${MOWGLI_LIBS}
--- a/src/madplug/configure.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/madplug/configure.c	Fri Jun 13 05:57:25 2008 +0300
@@ -25,7 +25,6 @@
 
 #include <gtk/gtk.h>
 #include <math.h>
-#include <audacious/configdb.h>
 
 static GtkWidget *configure_win = NULL;
 static audmad_config_t *oldconfig = NULL; // undo storage
@@ -91,7 +90,7 @@
 static void
 save_config(void)
 {
-    ConfigDb *db = aud_cfg_db_open();
+    mcs_handle_t *db = aud_cfg_db_open();
 
     AUDDBG("saving\n");
 
--- a/src/madplug/decoder.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/madplug/decoder.c	Fri Jun 13 05:57:25 2008 +0300
@@ -23,17 +23,12 @@
 
 #include <math.h>
 #include <assert.h>
-#include <pthread.h>
-#include <signal.h>
 
 #include <audacious/plugin.h>
-#include <audacious/output.h>
-#include <audacious/util.h>
-#include <sys/time.h>
 #include "plugin.h"
 #include "input.h"
 
-#define BUFFER_SIZE 16*1024
+#define BUFFER_SIZE (16*1024)
 #define N_AVERAGE_FRAMES 10
 
 void
--- a/src/madplug/input.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/madplug/input.c	Fri Jun 13 05:57:25 2008 +0300
@@ -55,7 +55,6 @@
 
 #include <fcntl.h>
 #include <errno.h>
-#include <audacious/util.h>
 
 #include "input.h"
 #include "replaygain.h"
@@ -138,7 +137,7 @@
 id3_ucs4_t *
 mad_ucs4dup(id3_ucs4_t *org)
 {
-    id3_ucs4_t *res = NULL;
+    id3_ucs4_t *res;
     size_t len = mad_ucs4len(org);
 
     res = g_malloc0((len + 1) * sizeof(id3_ucs4_t));
@@ -352,7 +351,7 @@
 static void
 input_read_tag(struct mad_info_t *info)
 {
-    gchar *string = NULL;
+    gchar *string;
     Tuple *tuple;
     glong curpos = 0;
 
@@ -360,7 +359,7 @@
 
     if (info->tuple != NULL)
         aud_tuple_free(info->tuple);
-        
+    
     tuple = aud_tuple_new_from_filename(info->filename);
     info->tuple = tuple;
 
@@ -393,11 +392,9 @@
     if (string) {
         aud_tuple_associate_int(tuple, FIELD_TRACK_NUMBER, NULL, atoi(string));
         g_free(string);
-        string = NULL;
     }
 
     // year
-    string = NULL;
     string = input_id3_get_string(info->tag, ID3_FRAME_YEAR);   //TDRC
     if (!string)
         string = input_id3_get_string(info->tag, "TYER");
@@ -405,7 +402,6 @@
     if (string) {
         aud_tuple_associate_int(tuple, FIELD_YEAR, NULL, atoi(string));
         g_free(string);
-        string = NULL;
     }
 
     // length
@@ -414,7 +410,6 @@
         aud_tuple_associate_int(tuple, FIELD_LENGTH, NULL, atoi(string));
         AUDDBG("input_read_tag: TLEN = %d\n", atoi(string));
         g_free(string);
-        string = NULL;
     } else
         aud_tuple_associate_int(tuple, FIELD_LENGTH, NULL, -1);
     
@@ -439,7 +434,7 @@
     gboolean metadata = FALSE;
 
     if(info->remote && mad_timer_count(info->duration, MAD_UNITS_SECONDS) <= 0){
-        gchar *tmp = NULL;
+        gchar *tmp;
 
 #ifdef DEBUG_INTENSIVELY
         AUDDBG("process_remote_meta\n");
@@ -452,28 +447,20 @@
         tmp = aud_vfs_get_metadata(info->infile, "track-name");
         if(tmp){
             metadata = TRUE;
-            gchar *scratch;
-
-            scratch = aud_str_to_utf8(tmp);
+            gchar *scratch = aud_str_to_utf8(tmp);
             aud_tuple_associate_string(info->tuple, FIELD_TITLE, NULL, scratch);
             g_free(scratch);
-
             g_free(tmp);
-            tmp = NULL;
         }
 
         tmp = aud_vfs_get_metadata(info->infile, "stream-name");
         if(tmp){
             metadata = TRUE;
-            gchar *scratch;
-
-            scratch = aud_str_to_utf8(tmp);
+            gchar *scratch = aud_str_to_utf8(tmp);
             aud_tuple_associate_string(info->tuple, FIELD_ALBUM, NULL, scratch);
             aud_tuple_associate_string(info->tuple, -1, "stream", scratch);
             g_free(scratch);
-
             g_free(tmp);
-            tmp = NULL;
         }
 
         if (metadata)
@@ -482,8 +469,8 @@
             gchar *realfn = g_filename_from_uri(info->filename, NULL, NULL);
             gchar *tmp2 = g_path_get_basename(realfn ? realfn : info->filename); // info->filename is uri. --yaz
             tmp = aud_str_to_utf8(tmp2);
-            g_free(tmp2); tmp2 = NULL;
-            g_free(realfn); realfn = NULL;
+            g_free(tmp2);
+            g_free(realfn);
 //            tmp = g_strdup(g_basename(info->filename)); //XXX maybe ok. --yaz
         }
 
@@ -521,7 +508,7 @@
     input_read_tag(info);
 
     if(!info->remote) { // reduce startup delay
-        read_replaygain(info);
+        audmad_read_replaygain(info);
     }
 
     /* scan mp3 file, decoding headers */
@@ -587,37 +574,27 @@
 {
     AUDDBG("f: input_term\n");
 
-    if (info->title)
-        g_free(info->title);
-    if (info->url)
-        g_free(info->url);
-    if (info->filename)
-        g_free(info->filename);
+    g_free(info->title);
+    g_free(info->url);
+    g_free(info->filename);
     if (info->infile)
         aud_vfs_fclose(info->infile);
     if (info->id3file)
         id3_file_close(info->id3file);
 
-    if (info->replaygain_album_str)
-        g_free(info->replaygain_album_str);
-    if (info->replaygain_track_str)
-        g_free(info->replaygain_track_str);
-    if (info->replaygain_album_peak_str)
-        g_free(info->replaygain_album_peak_str);
-    if (info->replaygain_track_peak_str)
-        g_free(info->replaygain_track_peak_str);
-    if (info->mp3gain_undo_str)
-        g_free(info->mp3gain_undo_str);
-    if (info->mp3gain_minmax_str)
-        g_free(info->mp3gain_minmax_str);
+    g_free(info->replaygain_album_str);
+    g_free(info->replaygain_track_str);
+    g_free(info->replaygain_album_peak_str);
+    g_free(info->replaygain_track_peak_str);
+    g_free(info->mp3gain_undo_str);
+    g_free(info->mp3gain_minmax_str);
 
     if (info->tuple) {
         aud_tuple_free(info->tuple);
         info->tuple = NULL;
     }
 
-    if (info->prev_title)
-        g_free(info->prev_title);
+    g_free(info->prev_title);
 
     /* set everything to zero in case it gets used again. */
     memset(info, 0, sizeof(struct mad_info_t));
--- a/src/madplug/plugin.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/madplug/plugin.c	Fri Jun 13 05:57:25 2008 +0300
@@ -28,11 +28,8 @@
 #include <math.h>
 
 #include <gtk/gtk.h>
-#include <audacious/util.h>
-#include <audacious/configdb.h>
 #include <stdarg.h>
 #include <fcntl.h>
-#include <audacious/vfs.h>
 #include <sys/stat.h>
 #include "tuple.h"
 
@@ -54,8 +51,6 @@
 static GtkWidget *error_dialog = 0;
 #endif
 
-extern gboolean scan_file(struct mad_info_t *info, gboolean fast);
-
 static gint mp3_bitrate_table[5][16] = {
   { 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, -1 }, /* MPEG1 L1 */
   { 0, 32, 48, 56,  64,  80,  96, 112, 128, 160, 192, 224, 256, 320, 384, -1 }, /* MPEG1 L2 */
@@ -71,6 +66,16 @@
   { 44100, 48000, 32000, -1 }   /* MPEG1 */
 };
 
+typedef struct {
+    gint version,
+         layer,
+         bitRate,
+         sampleRate,
+         size,
+         lsf;
+    gboolean hasCRC;
+} mp3_frame_t;
+
 /*
  * Function extname (filename)
  *
@@ -93,7 +98,7 @@
 static void
 audmad_init()
 {
-    ConfigDb *db = NULL;
+    mcs_handle_t *db = NULL;
 
     audmad_config = g_malloc0(sizeof(audmad_config_t));
 
@@ -154,113 +159,161 @@
     g_mutex_free(pb_mutex);
 }
 
-static gboolean
-mp3_head_check(guint32 head, gint *frameSize)
+/* Validate a MPEG Audio header and extract some information from it.
+ * References used:
+ * http://www.mp3-tech.org/programmer/frame_header.html
+ * http://mpgedit.org/mpgedit/mpeg_format/mpeghdr.htm
+ */
+static gint
+mp3_head_validate(guint32 head, mp3_frame_t *frame)
 {
-    gint version, layer, bitIndex, bitRate, sampleIndex, sampleRate, padding;
+    gint bitIndex, sampleIndex, padding;
 
-    /* http://www.mp3-tech.org/programmer/frame_header.html
-     * Bits 21-31 must be set (frame sync)
-     */
+    /* bits 21-31 must be set (frame sync) */
     if ((head & 0xffe00000) != 0xffe00000)
-        return FALSE;
+        return -1;
 
+    /* check for LSF */
+    if ((head >> 20) & 1)
+        frame->lsf = ((head >> 19) & 1) ? 0 : 1;
+    else
+        frame->lsf = 1;
+    
     /* check if layer bits (17-18) are good */
-    layer = (head >> 17) & 0x3;
-    if (!layer)
-        return FALSE; /* 00 = reserved */
-    layer = 4 - layer;
+    frame->layer = (head >> 17) & 3;
+    if (frame->layer == 0)
+        return -2; /* 00 = reserved */
+    frame->layer = 4 - frame->layer;
 
+    /* check CRC bit. if set, a 16-bit CRC follows header (not counted in frameSize!) */
+    frame->hasCRC = (head >> 16) & 1;
+    
     /* check if bitrate index bits (12-15) are acceptable */
     bitIndex = (head >> 12) & 0xf;
 
     /* 1111 and 0000 are reserved values for all layers */
     if (bitIndex == 0xf || bitIndex == 0)
-        return FALSE;
+        return -3;
 
     /* check samplerate index bits (10-11) */
-    sampleIndex = (head >> 10) & 0x3;
-    if (sampleIndex == 0x3)
-        return FALSE;
+    sampleIndex = (head >> 10) & 3;
+    if (sampleIndex == 3)
+        return -4;
 
     /* check version bits (19-20) and get bitRate */
-    version = (head >> 19) & 0x03;
-    switch (version) {
+    frame->version = (head >> 19) & 0x03;
+    switch (frame->version) {
         case 0: /* 00 = MPEG Version 2.5 */
         case 2: /* 10 = MPEG Version 2 */
-            if (layer == 1)
-                bitRate = mp3_bitrate_table[3][bitIndex];
+            if (frame->layer == 1)
+                frame->bitRate = mp3_bitrate_table[3][bitIndex];
             else
-                bitRate = mp3_bitrate_table[4][bitIndex];
+                frame->bitRate = mp3_bitrate_table[4][bitIndex];
             break;
 
         case 1: /* 01 = reserved */
-            return FALSE;
+            return -5;
 
         case 3: /* 11 = MPEG Version 1 */
-            bitRate = mp3_bitrate_table[layer][bitIndex];
+            frame->bitRate = mp3_bitrate_table[frame->layer - 1][bitIndex];
             break;
 
         default:
-            return FALSE;
+            return -6;
     }
+    
+    if (frame->bitRate < 0)
+        return -7;
 
     /* check layer II restrictions vs. bitrate */
-    if (layer == 2) {
+    if (frame->layer == 2) {
         gint chanMode = (head >> 6) & 0x3;
 
         if (chanMode == 0x3) {
             /* single channel with bitrate > 192 */
-            if (bitRate > 192)
-                return FALSE;
+            if (frame->bitRate > 192)
+                return -8;
         } else {
             /* any other mode with bitrates 32-56 and 80.
              * NOTICE! this check is not entirely correct, but I think
              * it is sufficient in most cases.
              */
-            if (((bitRate >= 32 && bitRate <= 56) || bitRate == 80))
-                return FALSE;
+            if (((frame->bitRate >= 32 && frame->bitRate <= 56) || frame->bitRate == 80))
+                return -9;
         }
     }
 
     /* calculate approx. frame size */
     padding = (head >> 9) & 1;
-    sampleRate = mp3_samplerate_table[version][sampleIndex];
-    if (layer == 1)
-        *frameSize = ((12 * bitRate * 1000 / sampleRate) + padding) * 4;
-    else
-        *frameSize = (144 * bitRate * 1000) / (sampleRate + padding);
-
-    /* check if bits 16 - 19 are all set (MPEG 1 Layer I, not protected?) */
-    if (((head >> 19) & 1) == 1 &&
-        ((head >> 17) & 3) == 3 && ((head >> 16) & 1) == 1)
-        return FALSE;
-
-    /* not sure why we check this, but ok! */
-    if ((head & 0xffff0000) == 0xfffe0000)
-        return FALSE;
-
-    return TRUE;
+    frame->sampleRate = mp3_samplerate_table[frame->version][sampleIndex];
+    if (frame->sampleRate < 0)
+        return -10;
+    
+    switch (frame->layer) {
+        case 1:
+            frame->size = ((12 * 1000 * frame->bitRate) / frame->sampleRate + padding) * 4;
+            break;
+        
+        case 2:
+            frame->size = (144 * 1000 * frame->bitRate) / frame->sampleRate + padding;
+            break;
+        
+        case 3:
+        default:
+            frame->size = (144 * 1000 * frame->bitRate) / (frame->sampleRate << frame->lsf) + padding;
+            break;
+    }
+    
+    return 0;
 }
 
 static int
 mp3_head_convert(const guchar * hbuf)
 {
-    return ((unsigned long) hbuf[0] << 24) |
-        ((unsigned long) hbuf[1] << 16) |
-        ((unsigned long) hbuf[2] << 8) | (unsigned long) hbuf[3];
+    return
+        ((guint32) hbuf[0] << 24) |
+        ((guint32) hbuf[1] << 16) |
+        ((guint32) hbuf[2] << 8) |
+        ((guint32) hbuf[3]);
 }
 
+#if 0
+static gchar *mp3_ver_table[4] = { "2.5", "INVALID", "2", "1" };
+#define LULZ(...) do { fprintf(stderr, "madprobe: "); fprintf(stderr, __VA_ARGS__); } while (0)
+#define LOL(...) do { fprintf(stderr, __VA_ARGS__); } while (0)
+#else
+#define LULZ(...) do { } while(0)
+#define LOL(...) do { } while(0)
+#endif
+
 // audacious vfs fast version
 static int
-audmad_is_our_fd(char *filename, VFSFile *fin)
+audmad_is_our_fd(gchar *filename, VFSFile *fin)
 {
-    guint32 check;
     gchar *ext = extname(filename);
-    gint cyc = 0, chkcount = 0, chksize = 4096;
-    guchar buf[4];
-    guchar tmp[4096];
-    gint ret, i, frameSize;
+    guint32 head = 0;
+    guchar chkbuf[2048];
+    gint state,
+         next = -1,
+         tries = 0,
+         chksize = 0,
+         chkpos = 0,
+         chkcount = 0,
+         res, resync_max = -1,
+         skip = 0;
+    glong streampos = 0;
+    mp3_frame_t frame, prev;
+
+    enum {
+        STATE_HEADERS,
+        STATE_REBUFFER,
+        STATE_VALIDATE,
+        STATE_GOTO_NEXT,
+        STATE_GET_NEXT,
+        STATE_RESYNC,
+        STATE_RESYNC_DO,
+        STATE_FATAL
+    };
 
     info.remote = aud_vfs_is_remote(filename);
 
@@ -274,86 +327,170 @@
         return 0;
 
     if (fin == NULL) {
-        g_message("fin = NULL");
-        return 0;
-    }
-
-    if(aud_vfs_fread(buf, 1, 4, fin) == 0) {
-        gchar *tmp = g_filename_to_utf8(filename, -1, NULL, NULL, NULL);
-        g_message("aud_vfs_fread failed @1 %s", tmp);
-        g_free(tmp);
+        g_message("fin = NULL for %s", filename);
         return 0;
     }
 
-    check = mp3_head_convert(buf);
-
-    if (memcmp(buf, "ID3", 3) == 0)
-        return 1;
-    else if (memcmp(buf, "OggS", 4) == 0)
-        return 0;
-    else if (memcmp(buf, "RIFF", 4) == 0)
-    {
-        aud_vfs_fseek(fin, 4, SEEK_CUR);
-        if(aud_vfs_fread(buf, 1, 4, fin) == 0) {
-            gchar *tmp = g_filename_to_utf8(filename, -1, NULL, NULL, NULL);
-            g_message("aud_vfs_fread failed @2 %s", tmp);
-            g_free(tmp);
-            return 0;
-        }
-
-        if (memcmp(buf, "RMP3", 4) == 0)
-            return 1;
-    }
-
-    // check data for frame header
-    while (!mp3_head_check(check, &frameSize))
-    {
-        if((ret = aud_vfs_fread(tmp, 1, chksize, fin)) == 0){
-            gchar *tmp = g_filename_to_utf8(filename, -1, NULL, NULL, NULL);
-            g_message("aud_vfs_fread failed @3 %s", tmp);
-            g_free(tmp);
-            return 0;
-        }
-        for (i = 0; i < ret; i++)
-        {
-            check <<= 8;
-            check |= tmp[i];
+    state = STATE_REBUFFER;
+    next = STATE_HEADERS;
 
-            if (mp3_head_check(check, &frameSize)) {
-                /* when the first matching frame header is found, we check for
-                 * another frame by seeking to the approximate start of the
-                 * next header ... also reduce the check size.
-                 */
-                if (++chkcount >= 3) return 1;
-                aud_vfs_fseek(fin, frameSize-4, SEEK_CUR);
-                check = 0;
-                chksize = 8;
+    /* Check stream data for frame header(s). We employ a simple
+     * state-machine approach here to find number of sequential
+     * valid MPEG frame headers (with similar attributes).
+     */
+    do {
+        switch (state) {
+        case STATE_HEADERS:
+            LULZ("check headers\n");
+            /* Check read size */
+            if (chksize < 32) {
+                LULZ("headers check failed, not enough data!\n");
+                state = STATE_FATAL;
+            } else {
+                state = STATE_GET_NEXT;
+                
+                if (memcmp(&chkbuf[chkpos], "ID3", 3) == 0) {
+                    /* Skip ID3 header */
+                    guint tagsize = (chkbuf[chkpos+6] & 0x7f); tagsize <<= 7;
+                    tagsize |= (chkbuf[chkpos+7] & 0x7f); tagsize <<= 7;
+                    tagsize |= (chkbuf[chkpos+8] & 0x7f); tagsize <<= 7;
+                    tagsize |= (chkbuf[chkpos+9] & 0x7f);
+        
+                    LULZ("ID3 size = %08x\n", tagsize);
+                    state = STATE_GOTO_NEXT;
+                    skip = tagsize + 10;
+                } else
+                if (memcmp(&chkbuf[chkpos], "OggS", 4) == 0)
+                    return 0;
+                else
+                if (memcmp(&chkbuf[chkpos], "RIFF", 4) == 0 &&
+                    memcmp(&chkbuf[chkpos+8], "RMP3", 4) == 0)
+                    return 1;
+            }
+            break;
+        
+        case STATE_REBUFFER:
+            streampos = aud_vfs_ftell(fin);
+            if ((chksize = aud_vfs_fread(chkbuf, 1, sizeof(chkbuf), fin)) == 0)
+                state = STATE_FATAL;
+            else {
+                chkpos = 0;
+                state = next;
             }
+            LULZ("rebuffered = %d bytes\n", chksize);
+            break;
+        
+        case STATE_VALIDATE:
+            LULZ("validate %08x .. ", head);
+            /* Check for valid header */
+            if ((res = mp3_head_validate(head, &frame)) >= 0) {
+                LOL("[is MPEG%s/layer %d, %dHz, %dkbps]",
+                mp3_ver_table[frame.version], frame.layer, frame.sampleRate, frame.bitRate);
+                state = STATE_GOTO_NEXT;
+                skip = frame.size;
+                chkcount++;
+                if (chkcount > 1) {
+                    if (frame.sampleRate != prev.sampleRate ||
+                        frame.layer != prev.layer ||
+                        frame.version != prev.version) {
+                        /* Not similar frame... */
+                        LOL(" .. but does not match (%d)!\n", chkcount);
+                        state = STATE_RESYNC;
+                    } else if (chkcount >= 5) {
+                        /* Okay, accept this stream */
+                        LOL(" .. accepted as mp3!!!\n");
+                        return 1;
+                    } else {
+                        LOL(" .. match %d\n", chkcount);
+                    }
+                } else {
+                    /* First valid frame of sequence */
+                    memcpy(&prev, &frame, sizeof(mp3_frame_t));
+                    LOL(" .. first synced\n");
+                }
+            } else {
+                /* Nope, try (re)synchronizing */
+                if (chkcount > 1) {
+                    LOL("no (%d), trying quick resync ..\n", res);
+                    state = STATE_RESYNC_DO;
+                    resync_max = 32;
+                } else {
+                    LOL("no (%d)\n", res);
+                    state = STATE_RESYNC;
+                }
+            }
+            break;
+        
+        case STATE_GOTO_NEXT:
+            LULZ("goto next (%x :: %x < %x) ? ", chkpos, skip, chksize);
+            /* Check if we have the next possible header in buffer? */
+            gint tmppos = chkpos + skip + sizeof(guint32);
+            if (tmppos < chksize) {
+                LOL("[in buffer]\n");
+                chkpos += skip;
+                state = STATE_GET_NEXT;
+            } else {
+                /* No, re-fill buffer and try again .. */
+                LOL("[rebuffering: %x, %x]\n", skip, chkpos + skip - chksize);
+                aud_vfs_fseek(fin, chkpos + skip - chksize, SEEK_CUR);
+                next = STATE_GET_NEXT;
+                state = STATE_REBUFFER;
+            }
+            break;
+        
+        case STATE_GET_NEXT:
+            /* Get a header */
+            LULZ("get next @ bufpos=%08x, streampos=%08lx, realpos=%08lx\n", chkpos, streampos, streampos+chkpos);
+            head = mp3_head_convert(&chkbuf[chkpos]);
+            //chkpos += sizeof(guint32);
+            state = STATE_VALIDATE;
+            break;
+        
+        case STATE_RESYNC:
+            LULZ("resyncing try #%d ..\n", tries);
+            /* Re-synchronize aka try to find a valid header */
+            head = 0;
+            chkcount = 0;
+            resync_max = -1;
+            state = STATE_RESYNC_DO;
+            tries++;
+            break;
+        
+        case STATE_RESYNC_DO:
+            /* Scan for valid frame header */            
+            for (; chkpos < chksize; chkpos++) {
+                head <<= 8;
+                head |= chkbuf[chkpos];
+                
+                if (mp3_head_validate(head, &frame) >= 0) {
+                    /* Found, exit resync */
+                    chkpos -= 3;
+                    LULZ("resync found @ %x\n", chkpos);
+                    state = STATE_VALIDATE;
+                    break;
+                }
+                
+                /* Check for maximum bytes to search */
+                if (resync_max > 0) {
+                    resync_max--;
+                    if (resync_max == 0) {
+                        state = STATE_RESYNC;
+                        break;
+                    }
+                }
+            }
+            if (state == STATE_RESYNC_DO) {
+                /* Not found, refill buffer */
+                next = state;
+                state = STATE_REBUFFER;
+            }
+            break;
         }
-
-        if (++cyc > 32)
-            return 0;
-    }
+    } while (state != STATE_FATAL && tries < 16);
+    /* Give up after 16 failed resync attempts or fatal errors */
 
-    return 1;
-}
-
-// audacious vfs version
-static int
-audmad_is_our_file(char *filename)
-{
-    VFSFile *fin = NULL;
-    gint rtn;
-
-    fin = aud_vfs_fopen(filename, "rb");
-
-    if (fin == NULL)
-        return 0;
-
-    rtn = audmad_is_our_fd(filename, fin);
-    aud_vfs_fclose(fin);
-
-    return rtn;
+    g_message("Rejecting %s (not an MP3 file?)", filename);
+    return 0;
 }
 
 static void
@@ -759,7 +896,6 @@
     .init = audmad_init,
     .about = audmad_about,
     .configure = audmad_configure,
-    .is_our_file = audmad_is_our_file,
     .play_file = audmad_play_file,
     .stop = audmad_stop,
     .pause = audmad_pause,
--- a/src/madplug/plugin.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/madplug/plugin.h	Fri Jun 13 05:57:25 2008 +0300
@@ -37,9 +37,6 @@
 #include <string.h>
 #include <unistd.h>
 #include <audacious/plugin.h>
-#include <audacious/main.h>
-#include <audacious/util.h>
-#include <audacious/strings.h>
 #include <audacious/i18n.h>
 #include <audacious/id3tag.h>
 #include <mad.h>
--- a/src/madplug/replaygain.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/madplug/replaygain.c	Fri Jun 13 05:57:25 2008 +0300
@@ -27,31 +27,37 @@
 #include <assert.h>
 #include "replaygain.h"
 
-static unsigned long
-Read_LE_Uint32(const unsigned char *p)
-{
-    return ((unsigned long) p[0] << 0) |
-        ((unsigned long) p[1] << 8) |
-        ((unsigned long) p[2] << 16) | ((unsigned long) p[3] << 24);
-}
+#define APE_MATCH_BUF (20000)
+#define APE_HEADER_SIZE (32)
+static const gchar *ape_header_magic_id = "APETAGEX";
 
-static int
-uncase_strcmp(const char *s1, const char *s2)
+typedef struct {
+    guchar id[8];
+    guint32 version;
+    guint32 length;
+    guint32 tagCount;
+    guint32 flags;
+    guchar reserved[8];
+} ape_header_t;
+
+
+static gboolean
+fetchLE32(guint32 *res, gchar **ptr, const gchar *end)
 {
-    int l1 = strlen(s1);
-    int l2 = strlen(s2);
-    int i;
-    for (i = 0; i < l1 && i < l2; ++i) {
-        if (toupper(s1[i]) < toupper(s2[i]))
-            return -1;
+    if (*ptr + sizeof(guint32) > end)
+        return FALSE;
+    else {
+        *res = ((guint32) (*ptr)[0] ) |
+               ((guint32) (*ptr)[1] << 8) |
+               ((guint32) (*ptr)[2] << 16) |
+               ((guint32) (*ptr)[3] << 24);
+        (*ptr) += sizeof(guint32);
+        return TRUE;
     }
-    if (l1 == l2)
-        return 0;
-    return (l1 < l2) ? -1 : +1;
 }
 
 static gdouble
-strgain2double(gchar * s, int len)
+strgain2double(const gchar * s, const size_t len)
 {
     gchar *strval = g_strndup(s, len);
     gdouble res = g_strtod(s, NULL);    // gain, in dB.
@@ -59,85 +65,106 @@
     return res;
 }
 
-// Reads APE v2.0 tag ending at current pos in fp
-
-static int
-ReadAPE2Tag(VFSFile * fp, struct mad_info_t *file_info)
+/* Check for APE tag header in current file position, and read
+ * header data into given structure. Return 0 if OK.
+ */
+static gint checkAPEHeader(VFSFile * fp, ape_header_t *hdr)
 {
-    unsigned long vsize;
-    unsigned long isize;
-    unsigned long flags;
-    char *buff;
-    char *p;
-    char *end;
-    struct APETagFooterStruct T, *tp;
-    unsigned long TagLen;
-    unsigned long TagCount;
-
-    tp = &T;
+    /* Get magic id and check it */
+    if (aud_vfs_fread(&hdr->id, sizeof(hdr->id), 1, fp) != 1)
+        return 2;
+    
+    if (memcmp(hdr->id, ape_header_magic_id, sizeof(hdr->id)) != 0)
+        return 3;
+    
+    /* Currently we only support APEv2 */
+    if (!aud_vfs_fget_le32(&hdr->version, fp) || hdr->version != 2000)
+        return 4;
+    
+    /* Validate header length */
+    if (!aud_vfs_fget_le32(&hdr->length, fp) || hdr->length < APE_HEADER_SIZE)
+        return 5;
+    
+    /* Get other data */
+    if (!aud_vfs_fget_le32(&hdr->tagCount, fp) || !aud_vfs_fget_le32(&hdr->flags, fp) ||
+        aud_vfs_fread(&hdr->reserved, sizeof(hdr->reserved), 1, fp) != 1)
+        return 6;
+    
+    return 0;
+}
 
-    if (aud_vfs_fseek(fp, -sizeof(T), SEEK_CUR) != 0)
+/* Reads APE v2.0 tag ending at current pos in fp
+ */
+static gint
+readAPE2Tag(VFSFile * fp, struct mad_info_t *file_info)
+{
+    gchar *buff, *p, *end;
+    gint res;
+    ape_header_t hdr;
+    
+    if (aud_vfs_fseek(fp, -APE_HEADER_SIZE, SEEK_CUR) != 0)
         return 18;
-    if (aud_vfs_fread(tp, 1, sizeof(T), fp) != sizeof T)
-        return 2;
-    if (memcmp(tp->ID, "APETAGEX", sizeof(tp->ID)) != 0)
-        return 3;
-    if (Read_LE_Uint32(tp->Version) != 2000)
-        return 4;
-    TagLen = Read_LE_Uint32(tp->Length);
-    if (TagLen < sizeof(T))
-        return 5;
-    if (aud_vfs_fseek(fp, -TagLen, SEEK_CUR) != 0)
-        return 6;
-    if ((buff = (char *) malloc(TagLen)) == NULL) {
+    
+    if ((res = checkAPEHeader(fp, &hdr)) != 0)
+        return res;
+    
+    if (aud_vfs_fseek(fp, -hdr.length, SEEK_CUR) != 0)
         return 7;
-    }
-    if (aud_vfs_fread(buff, 1, TagLen - sizeof(T), fp) != TagLen - sizeof(T)) {
-        free(buff);
+    
+    if ((buff = (gchar *) g_malloc(hdr.length)) == NULL)
         return 8;
+    
+    if (aud_vfs_fread(buff, hdr.length - APE_HEADER_SIZE, 1, fp) != 1) {
+        g_free(buff);
+        return 9;
     }
 
-    AUDDBG("ver = %ld\n", Read_LE_Uint32(tp->Version));
-    AUDDBG("taglen = %ld\n", TagLen);
+    AUDDBG("ver = %ld\n", hdr.version);
+    AUDDBG("taglen = %ld\n", hdr.length);
 
-    TagCount = Read_LE_Uint32(tp->TagCount);
-    end = buff + TagLen - sizeof(T);
-    for (p = buff; p < end && TagCount--;) {
-        vsize = Read_LE_Uint32((unsigned char *)p);
-        p += 4;
-        flags = Read_LE_Uint32((unsigned char *)p);
-        p += 4;
-        isize = strlen((char *) p);
-
+    end = buff + hdr.length - APE_HEADER_SIZE;
+    
+    for (p = buff; p < end && hdr.tagCount--;) {
+        guint32 vsize, flags;
+        size_t isize;
+        gchar *tmp;
+        
+        /* Get and check size and string */
+        if (!fetchLE32(&vsize, &p, end)) break;
+        if (!fetchLE32(&flags, &p, end)) break;
+        for (tmp = p, isize = 0; tmp < end && *tmp != 0; isize++, tmp++);
+        if (*tmp != 0) break;
+        tmp++;
+        
         if (isize > 0 && vsize > 0) {
             gdouble *scale = NULL;
             gchar **str = NULL;
-            if (uncase_strcmp(p, "REPLAYGAIN_ALBUM_GAIN") == 0) {
+            if (g_ascii_strcasecmp(p, "REPLAYGAIN_ALBUM_GAIN") == 0) {
                 scale = &file_info->replaygain_album_scale;
                 str = &file_info->replaygain_album_str;
-            }
-            if (uncase_strcmp(p, "REPLAYGAIN_TRACK_GAIN") == 0) {
+            } else
+            if (g_ascii_strcasecmp(p, "REPLAYGAIN_TRACK_GAIN") == 0) {
                 scale = &file_info->replaygain_track_scale;
                 str = &file_info->replaygain_track_str;
             }
             if (str != NULL) {
                 assert(scale != NULL);
-                *scale = strgain2double(p + isize + 1, vsize);
-                *str = g_strndup(p + isize + 1, vsize);
+                *scale = strgain2double(tmp, vsize);
+                *str = g_strndup(tmp, vsize);
             }
-            //* case of peak info tags : */
+            /* case of peak info tags : */
             str = NULL;
-            if (uncase_strcmp(p, "REPLAYGAIN_TRACK_PEAK") == 0) {
+            if (g_ascii_strcasecmp(p, "REPLAYGAIN_TRACK_PEAK") == 0) {
                 scale = &file_info->replaygain_track_peak;
                 str = &file_info->replaygain_track_peak_str;
-            }
-            if (uncase_strcmp(p, "REPLAYGAIN_ALBUM_PEAK") == 0) {
+            } else
+            if (g_ascii_strcasecmp(p, "REPLAYGAIN_ALBUM_PEAK") == 0) {
                 scale = &file_info->replaygain_album_peak;
                 str = &file_info->replaygain_album_peak_str;
             }
             if (str != NULL) {
-                *scale = strgain2double(p + isize + 1, vsize);
-                *str = g_strndup(p + isize + 1, vsize);
+                *scale = strgain2double(tmp, vsize);
+                *str = g_strndup(tmp, vsize);
             }
 
             /* mp3gain additional tags : 
@@ -145,14 +172,14 @@
                i.e., in dB : 20*log(2)/log(10)*gain/4
                -> 1.501*gain dB
              */
-            if (uncase_strcmp(p, "MP3GAIN_UNDO") == 0) {
+            if (g_ascii_strcasecmp(p, "MP3GAIN_UNDO") == 0) {
                 str = &file_info->mp3gain_undo_str;
                 scale = &file_info->mp3gain_undo;
                 assert(4 < vsize);  /* this tag is +left,+right */
                 *str = g_strndup(p + isize + 1, vsize);
                 *scale = 1.50515 * atoi(*str);
-            }
-            if (uncase_strcmp(p, "MP3GAIN_MINMAX") == 0) {
+            } else
+            if (g_ascii_strcasecmp(p, "MP3GAIN_MINMAX") == 0) {
                 str = &file_info->mp3gain_minmax_str;
                 scale = &file_info->mp3gain_minmax;
                 *str = g_strndup(p + isize + 1, vsize);
@@ -160,27 +187,28 @@
                 *scale = 1.50515 * (atoi((*str) + 4) - atoi(*str));
             }
         }
-        p += isize + 1 + vsize;
+        
+        p = tmp;
     }
 
-    free(buff);
+    g_free(buff);
 
     return 0;
 }
 
-static int
-find_offset(VFSFile * fp)
+static gint
+findOffset(VFSFile * fp)
 {
-    static const char *key = "APETAGEX";
-    char buff[20000];
-    int N = 0;
-    if (aud_vfs_fseek(fp, -20000, SEEK_CUR) != 0);
-    if ((N = aud_vfs_fread(buff, 1, 20000, fp)) < 16)
+    gchar buff[APE_MATCH_BUF];
+    gint matched = 0, last_match = -1;
+    size_t N = 0, i;
+    
+    if (aud_vfs_fseek(fp, - APE_MATCH_BUF, SEEK_CUR) != 0);
+    if ((N = aud_vfs_fread(buff, sizeof(gchar), APE_MATCH_BUF, fp)) < 16)
         return 1;
-    int matched = 0;
-    int i, last_match = -1;
+    
     for (i = 0; i < N; ++i) {
-        if (buff[i] == key[matched])
+        if (buff[i] == ape_header_magic_id[matched])
             ++matched;
         else {
             if (matched == 5 && buff[i] == 'P')
@@ -195,18 +223,18 @@
     }
     if (last_match == -1)
         return 1;
-    return last_match + 1 - 8 + sizeof(struct APETagFooterStruct) - N;
+    return last_match + 1 - 8 + APE_HEADER_SIZE - N;
 }
 
 /* Eugene Zagidullin:
- * Read ReplayGain info from foobar2000-style id3v2 frames */
-
-static int
-ReadId3v2TXXX(struct mad_info_t *file_info)
+ * Read ReplayGain info from foobar2000-style id3v2 frames.
+ */
+static gint
+readId3v2TXXX(struct mad_info_t *file_info)
 {
-	int i;
-	char *key;
-	char *value;
+	gint i;
+	gchar *key;
+	gchar *value;
 	struct id3_frame *frame;
 
 	AUDDBG("f: ReadId3v2TXXX\n");
@@ -214,7 +242,7 @@
 	/* tag must be read before! */
 	if (! file_info->tag ) {
 		AUDDBG("id3v2 not found\n");
-		return 0;
+		return FALSE;
 	}
 
 	/* Partially based on code from MPD (http://www.musicpd.org/) */
@@ -222,18 +250,14 @@
 		if (frame->nfields < 3)
 			continue;
 
-		key = (char *)
-		    id3_ucs4_latin1duplicate(id3_field_getstring
-					     (&frame->fields[1]));
-		value = (char *)
-		    id3_ucs4_latin1duplicate(id3_field_getstring
-					     (&frame->fields[2]));
+		key = (gchar *) id3_ucs4_latin1duplicate(id3_field_getstring(&frame->fields[1]));
+		value = (gchar *) id3_ucs4_latin1duplicate(id3_field_getstring(&frame->fields[2]));
 
 		if (strcasecmp(key, "replaygain_track_gain") == 0) {
-			file_info->replaygain_track_scale = strgain2double(value, strlen(value));
+			file_info->replaygain_track_scale = g_strtod(value, NULL);
 			file_info->replaygain_track_str = g_strdup(value);
 		} else if (strcasecmp(key, "replaygain_album_gain") == 0) {
-			file_info->replaygain_album_scale = strgain2double(value, strlen(value));
+			file_info->replaygain_album_scale = g_strtod(value, NULL);
 			file_info->replaygain_album_str = g_strdup(value);
 		} else if (strcasecmp(key, "replaygain_track_peak") == 0) {
 			file_info->replaygain_track_peak = g_strtod(value, NULL);
@@ -245,13 +269,14 @@
 
 		free(key);
 		free(value);
+		return TRUE;
 	}
 
-	return 0;
+	return FALSE;
 }
 
 void
-read_replaygain(struct mad_info_t *file_info)
+audmad_read_replaygain(struct mad_info_t *file_info)
 {
     VFSFile *fp;
     glong curpos = 0;
@@ -265,7 +290,7 @@
     file_info->mp3gain_undo = -77;
     file_info->mp3gain_minmax = -77;
 
-    if (ReadId3v2TXXX(file_info)) {
+    if (readId3v2TXXX(file_info)) {
         AUDDBG("found ReplayGain info in id3v2 tag\n");
 #ifdef AUD_DEBUG
 	gchar *tmp = g_filename_to_utf8(file_info->filename, -1, NULL, NULL, NULL);
@@ -294,24 +319,23 @@
         return;
     }
     
-    long pos = aud_vfs_ftell(fp);
-    int res = -1;
-    int try = 0;
-    while (res != 0 && try < 10) {
+    glong pos = aud_vfs_ftell(fp);
+    gint res = -1, try_pos = 0;
+    while (res != 0 && try_pos < 10) {
         // try skipping an id3 tag
         aud_vfs_fseek(fp, pos, SEEK_SET);
-        aud_vfs_fseek(fp, try * -128, SEEK_CUR);
-        res = ReadAPE2Tag(fp, file_info);
-        ++try;
+        aud_vfs_fseek(fp, try_pos * -128, SEEK_CUR);
+        res = readAPE2Tag(fp, file_info);
+        ++try_pos;
     }
     if (res != 0) {
         // try brute search (don't want to parse all possible kinds of tags..)
         aud_vfs_fseek(fp, pos, SEEK_SET);
-        int offs = find_offset(fp);
+        gint offs = findOffset(fp);
         if (offs <= 0) {        // found !
             aud_vfs_fseek(fp, pos, SEEK_SET);
             aud_vfs_fseek(fp, offs, SEEK_CUR);
-            res = ReadAPE2Tag(fp, file_info);
+            res = readAPE2Tag(fp, file_info);
             if (res != 0) {
                 g_message
                     ("hmpf, was supposed to find a tag.. offs=%d, res=%d",
--- a/src/madplug/replaygain.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/madplug/replaygain.h	Fri Jun 13 05:57:25 2008 +0300
@@ -25,17 +25,6 @@
 #ifndef __replaygain_h__
 #define __replaygain_h__
 
-struct APETagFooterStruct
-{
-    unsigned char ID[8];
-    unsigned char Version[4];
-    unsigned char Length[4];
-    unsigned char TagCount[4];
-    unsigned char Flags[4];
-    unsigned char Reserved[8];
-};
-
-/* prototypes */
-void read_replaygain(struct mad_info_t *file_info);
+void audmad_read_replaygain(struct mad_info_t *file_info);
 
 #endif
--- a/src/madplug/tuple.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/madplug/tuple.c	Fri Jun 13 05:57:25 2008 +0300
@@ -31,7 +31,6 @@
 #include <glib.h> 
 #include <glib/gprintf.h>
 
-#include <audacious/util.h>
 #include <audacious/plugin.h>
 #include <audacious/id3tag.h>
 
--- a/src/madplug/xing.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/madplug/xing.c	Fri Jun 13 05:57:25 2008 +0300
@@ -20,7 +20,6 @@
  */
 
 #include <mad.h>
-
 #include "xing.h"
 
 #define XING_MAGIC	(('X' << 24) | ('i' << 16) | ('n' << 8) | 'g')
@@ -44,8 +43,7 @@
  * DESCRIPTION:	parse a Xing VBR header
  */
 int
-xing_parse(struct xing *xing, struct mad_bitptr ptr,
-               unsigned int bitlen)
+xing_parse(struct xing *xing, struct mad_bitptr ptr, guint bitlen)
 {
     if (bitlen < 64 || mad_bit_read(&ptr, 32) != XING_MAGIC)
         goto fail;
@@ -70,14 +68,14 @@
     }
 
     if (xing->flags & XING_TOC) {
-        int i;
+        gint i;
 
         if (bitlen < 800)
             goto fail;
 
         for (i = 0; i < 100; ++i)
             xing->toc[i] = mad_bit_read(&ptr, 8);
-
+        
         bitlen -= 800;
     }
 
--- a/src/madplug/xing.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/madplug/xing.h	Fri Jun 13 05:57:25 2008 +0300
@@ -20,15 +20,15 @@
 #ifndef XING_H
 #define XING_H
 
-#include "mad.h"
+#include <glib.h>
 
 struct xing
 {
-    long flags;                 /* valid fields (see below) */
-    unsigned long frames;       /* total number of frames */
-    unsigned long bytes;        /* total number of bytes */
-    unsigned char toc[100];     /* 100-point seek table */
-    long scale;                 /* ?? */
+    guint flags;        /* valid fields (see below) */
+    guint frames;       /* total number of frames */
+    guint bytes;        /* total number of bytes */
+    guchar toc[100];    /* 100-point seek table */
+    gulong scale;       /* ?? */
 };
 
 enum
--- a/src/metronom/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/metronom/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -8,5 +8,5 @@
 plugindir := ${plugindir}/${INPUT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${ARCH_DEFINES} -I../../intl -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS}  ${ARCH_DEFINES} -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS} 
--- a/src/metronom/metronom.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/metronom/metronom.c	Fri Jun 13 05:57:25 2008 +0300
@@ -20,7 +20,6 @@
 #include "config.h"
 #include <audacious/plugin.h>
 #include <audacious/output.h>
-#include <audacious/util.h>
 #include <audacious/i18n.h>
 #include <glib.h>
 #include <string.h>
--- a/src/mms/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/mms/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -7,6 +7,6 @@
 
 plugindir := ${plugindir}/${TRANSPORT_PLUGIN_DIR}
 
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${DBUS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${ARCH_DEFINES} ${XML_CPPFLAGS} ${MMS_CFLAGS} -I../../intl -I../.. -Wall
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS}  ${GTK_CFLAGS} ${GLIB_CFLAGS}  ${ARCH_DEFINES} ${XML_CPPFLAGS} ${MMS_CFLAGS} -I../.. -Wall
 CFLAGS += ${PLUGIN_CFLAGS}
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${XML_LIBS} ${MMS_LIBS}
+LIBS += ${GTK_LIBS} ${GLIB_LIBS}  ${XML_LIBS} ${MMS_LIBS}
--- a/src/modplug/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/modplug/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -22,7 +22,6 @@
        load_mtm.cxx		\
        load_mod.cxx		\
        load_med.cxx		\
-       load_mid.cxx		\
        load_mdl.cxx		\
        load_it.cxx		\
        load_far.cxx		\
@@ -32,7 +31,6 @@
        load_ams.cxx		\
        load_amf.cxx		\
        load_669.cxx		\
-       load_j2b.cxx		\
        load_mt2.cxx		\
        load_psm.cxx		\
        archive/archive.cxx	\
@@ -54,5 +52,5 @@
 
 CFLAGS += ${PLUGIN_CFLAGS}
 CXXFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${DBUS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} -I.. -I../.. -I../../intl
-LIBS += ${MOWGLI_LIBS} ${DBUS_LIBS} ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} -lstdc++
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS}  ${GTK_CFLAGS} ${GLIB_CFLAGS}  -I.. -I../.. -I../../intl
+LIBS += ${MOWGLI_LIBS}  ${GTK_LIBS} ${GLIB_LIBS}  -lstdc++
--- a/src/modplug/archive/arch_bz2.cxx	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/modplug/archive/arch_bz2.cxx	Fri Jun 13 05:57:25 2008 +0300
@@ -40,7 +40,7 @@
 		return;
 	}
 	
-	if(fscanf(f, "%u", &mSize) != 1); // this is the size.
+	if(fscanf(f, "%u", &mSize) != 1) // this is the size.
 	{
 		mSize = 0;
 		return;
--- a/src/modplug/archive/archive.cxx	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/modplug/archive/archive.cxx	Fri Jun 13 05:57:25 2008 +0300
@@ -69,8 +69,6 @@
 		return true;
 	if (lExt == ".xm")
 		return true;
-	if (lExt == ".j2b")
-		return true;
 	if (lExt == ".mt2")
 		return true;
 	if (lExt == ".psm")
--- a/src/modplug/archive/open.cxx	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/modplug/archive/open.cxx	Fri Jun 13 05:57:25 2008 +0300
@@ -13,58 +13,62 @@
 
 Archive* OpenArchive(const string& aFileName) //aFilename is url --yaz
 {
+	// TODO: archive support in Modplug plugin is broken - it uses popen() call and Unix commandline tools for that.
+	// Plus Modplug allows only one audio file per archive which is wrong anyway.
+
 	string lExt;
 	uint32 lPos;
-
 	// convert from uri to fs based filepath
-	gchar *filename;
-	filename = g_filename_from_uri(aFileName.c_str(), NULL, NULL);
+	gchar *filename = g_filename_from_uri(aFileName.c_str(), NULL, NULL);
+	if (filename == NULL)
+		return new arch_Raw(aFileName);
 	string lRealFileName(filename);
 	g_free(filename);
 
 	lPos = lRealFileName.find_last_of('.');
-	if(lPos > lRealFileName.length())
-		return NULL;
-	lExt = lRealFileName.substr(lPos);
-	for(uint32 i = 0; i < lExt.length(); i++)
-		lExt[i] = tolower(lExt[i]);
+	if(lPos <= lRealFileName.length() && aFileName.find("file://") == 0)
+	{
+		lExt = lRealFileName.substr(lPos);
+		for(uint32 i = 0; i < lExt.length(); i++)
+			lExt[i] = tolower(lExt[i]);
 
-	if (lExt == ".mdz")
-		return new arch_Zip(lRealFileName);
-	if (lExt == ".mdr")
-		return new arch_Rar(lRealFileName);
-	if (lExt == ".mdgz")
-		return new arch_Gzip(lRealFileName);
-	if (lExt == ".mdbz")
-		return new arch_Bzip2(lRealFileName);
-	if (lExt == ".s3z")
-		return new arch_Zip(lRealFileName);
-	if (lExt == ".s3r")
-		return new arch_Rar(lRealFileName);
-	if (lExt == ".s3gz")
-		return new arch_Gzip(lRealFileName);
-	if (lExt == ".xmz")
-		return new arch_Zip(lRealFileName);
-	if (lExt == ".xmr")
-		return new arch_Rar(lRealFileName);
-	if (lExt == ".xmgz")
-		return new arch_Gzip(lRealFileName);
-	if (lExt == ".itz")
-		return new arch_Zip(lRealFileName);
-	if (lExt == ".itr")
-		return new arch_Rar(lRealFileName);
-	if (lExt == ".itgz")
-		return new arch_Gzip(lRealFileName);
-	if (lExt == ".zip")
-		return new arch_Zip(lRealFileName);
-	if (lExt == ".rar")
-		return new arch_Rar(lRealFileName);
-	if (lExt == ".gz")
-		return new arch_Gzip(lRealFileName);
-	if (lExt == ".bz2")
-		return new arch_Bzip2(lRealFileName);
+		if (lExt == ".mdz")
+			return new arch_Zip(lRealFileName);
+		if (lExt == ".mdr")
+			return new arch_Rar(lRealFileName);
+		if (lExt == ".mdgz")
+			return new arch_Gzip(lRealFileName);
+		if (lExt == ".mdbz")
+			return new arch_Bzip2(lRealFileName);
+		if (lExt == ".s3z")
+			return new arch_Zip(lRealFileName);
+		if (lExt == ".s3r")
+			return new arch_Rar(lRealFileName);
+		if (lExt == ".s3gz")
+			return new arch_Gzip(lRealFileName);
+		if (lExt == ".xmz")
+			return new arch_Zip(lRealFileName);
+		if (lExt == ".xmr")
+			return new arch_Rar(lRealFileName);
+		if (lExt == ".xmgz")
+			return new arch_Gzip(lRealFileName);
+		if (lExt == ".itz")
+			return new arch_Zip(lRealFileName);
+		if (lExt == ".itr")
+			return new arch_Rar(lRealFileName);
+		if (lExt == ".itgz")
+			return new arch_Gzip(lRealFileName);
+		if (lExt == ".zip")
+			return new arch_Zip(lRealFileName);
+		if (lExt == ".rar")
+			return new arch_Rar(lRealFileName);
+		if (lExt == ".gz")
+			return new arch_Gzip(lRealFileName);
+		if (lExt == ".bz2")
+			return new arch_Bzip2(lRealFileName);
+	}
 
-	return new arch_Raw(lRealFileName);
+	return new arch_Raw(aFileName);
 }
 
 bool ContainsMod(const string& aFileName) //aFilename is url --yaz
@@ -79,46 +83,47 @@
 	g_free(filename);
 
 	lPos = lRealFileName.find_last_of('.');
-	if(lPos > lRealFileName.length())
-		return false;
-	lExt = lRealFileName.substr(lPos);
-	for(uint32 i = 0; i < lExt.length(); i++)
-		lExt[i] = tolower(lExt[i]);
+	if(lPos <= lRealFileName.length() && aFileName.find("file://") == 0)
+	{
+		lExt = lRealFileName.substr(lPos);
+		for(uint32 i = 0; i < lExt.length(); i++)
+			lExt[i] = tolower(lExt[i]);
 
-	if (lExt == ".mdz")
-		return arch_Zip::ContainsMod(lRealFileName);
-	if (lExt == ".mdr")
-		return arch_Rar::ContainsMod(lRealFileName);
-	if (lExt == ".mdgz")
-		return arch_Gzip::ContainsMod(lRealFileName);
-	if (lExt == ".mdbz")
-		return arch_Bzip2::ContainsMod(lRealFileName);
-	if (lExt == ".s3z")
-		return arch_Zip::ContainsMod(lRealFileName);
-	if (lExt == ".s3r")
-		return arch_Rar::ContainsMod(lRealFileName);
-	if (lExt == ".s3gz")
-		return arch_Gzip::ContainsMod(lRealFileName);
-	if (lExt == ".xmz")
-		return arch_Zip::ContainsMod(lRealFileName);
-	if (lExt == ".xmr")
-		return arch_Rar::ContainsMod(lRealFileName);
-	if (lExt == ".xmgz")
-		return arch_Gzip::ContainsMod(lRealFileName);
-	if (lExt == ".itz")
-		return arch_Zip::ContainsMod(lRealFileName);
-	if (lExt == ".itr")
-		return arch_Rar::ContainsMod(lRealFileName);
-	if (lExt == ".itgz")
-		return arch_Gzip::ContainsMod(lRealFileName);
-	if (lExt == ".zip")
-		return arch_Zip::ContainsMod(lRealFileName);
-	if (lExt == ".rar")
-		return arch_Rar::ContainsMod(lRealFileName);
-	if (lExt == ".gz")
-		return arch_Gzip::ContainsMod(lRealFileName);
-	if (lExt == ".bz2")
-		return arch_Bzip2::ContainsMod(lRealFileName);
-
-	return arch_Raw::ContainsMod(lRealFileName);
+		if (lExt == ".mdz")
+			return arch_Zip::ContainsMod(lRealFileName);
+		if (lExt == ".mdr")
+			return arch_Rar::ContainsMod(lRealFileName);
+		if (lExt == ".mdgz")
+			return arch_Gzip::ContainsMod(lRealFileName);
+		if (lExt == ".mdbz")
+			return arch_Bzip2::ContainsMod(lRealFileName);
+		if (lExt == ".s3z")
+			return arch_Zip::ContainsMod(lRealFileName);
+		if (lExt == ".s3r")
+			return arch_Rar::ContainsMod(lRealFileName);
+		if (lExt == ".s3gz")
+			return arch_Gzip::ContainsMod(lRealFileName);
+		if (lExt == ".xmz")
+			return arch_Zip::ContainsMod(lRealFileName);
+		if (lExt == ".xmr")
+			return arch_Rar::ContainsMod(lRealFileName);
+		if (lExt == ".xmgz")
+			return arch_Gzip::ContainsMod(lRealFileName);
+		if (lExt == ".itz")
+			return arch_Zip::ContainsMod(lRealFileName);
+		if (lExt == ".itr")
+			return arch_Rar::ContainsMod(lRealFileName);
+		if (lExt == ".itgz")
+			return arch_Gzip::ContainsMod(lRealFileName);
+		if (lExt == ".zip")
+			return arch_Zip::ContainsMod(lRealFileName);
+		if (lExt == ".rar")
+			return arch_Rar::ContainsMod(lRealFileName);
+		if (lExt == ".gz")
+			return arch_Gzip::ContainsMod(lRealFileName);
+		if (lExt == ".bz2")
+			return arch_Bzip2::ContainsMod(lRealFileName);
+	}
+	
+	return arch_Raw::ContainsMod(aFileName);
 }
--- a/src/modplug/gui/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,13 +0,0 @@
-STATIC_LIB_NOINST = libgui.a
-
-SRCS = main.cxx		\
-       support.cxx	\
-       interface.cxx	\
-       callbacks.cxx
-
-include ../../../buildsys.mk
-include ../../../extra.mk
-
-CFLAGS   += ${PLUGIN_CFLAGS}
-CXXFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${MOWGLI_CFLAGS} ${DBUS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} -I../../..
--- a/src/modplug/gui/main.cxx	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/modplug/gui/main.cxx	Fri Jun 13 05:57:25 2008 +0300
@@ -5,11 +5,18 @@
 
 #include <config.h>
 
+#include "../stddefs.h"
+#include "../stdafx.h"
+#include "../sndfile.h"
+#include "../archive/open.h"
+
+// Order of #include is important - UINT is redefined to unsigned long instead of unsigned int 
+// somewhere in the following headers, which leads to unresolved symbol - 
+// linking is okay, error pops up when starting Audacious.
+
 #include <gtk/gtk.h>
 #include <libintl.h>
 extern "C" {
-#include <audacious/util.h>
-#include <audacious/strings.h>
 }
 
 #include "interface.h"
@@ -26,10 +33,6 @@
 #include <sys/mman.h>
 #include <fstream>
 
-#include "../stddefs.h"
-#include "../stdafx.h"
-#include "../sndfile.h"
-#include "../archive/open.h"
 
 #define MAX_MESSAGE_LENGTH 4000
 
--- a/src/modplug/load_j2b.cxx	Fri Jun 13 04:58:39 2008 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,15 +0,0 @@
-/*
- * This source code is public domain.
- *
- * Authors: Olivier Lapicque <olivierl@jps.net>
-*/
-
-
-///////////////////////////////////////////////////
-//
-// J2B module loader
-//
-///////////////////////////////////////////////////
-#include "stdafx.h"
-#include "sndfile.h"
-
--- a/src/modplug/load_mid.cxx	Fri Jun 13 04:58:39 2008 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1126 +0,0 @@
-/*
- * This program is  free software; you can redistribute it  and 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.
- *
- * Authors: Olivier Lapicque <olivierl@jps.net>
-*/
-
-//////////////////////////////////////////////
-// MIDI loader                              //
-//////////////////////////////////////////////
-#include "stdafx.h"
-#include "sndfile.h"
-
-#define MIDI_DRUMCHANNEL	10
-#define MIDI_MAXTRACKS		64
-
-UINT gnMidiImportSpeed = 3;
-UINT gnMidiPatternLen = 128;
-
-#pragma pack(1)
-
-typedef struct MIDIFILEHEADER
-{
-	CHAR id[4];		// "MThd" = 0x6468544D
-	DWORD len;		// 6
-	WORD w1;		// 1?
-	WORD wTrks;		// 2?
-	WORD wDivision;	// F0
-} MIDIFILEHEADER;
-
-
-typedef struct MIDITRACKHEADER
-{
-	CHAR id[4];	// "MTrk" = 0x6B72544D
-	DWORD len;
-} MIDITRACKHEADER;
-
-static LONG midivolumetolinear(UINT nMidiVolume)
-{
-	return (nMidiVolume * nMidiVolume << 16) / (127*127);
-}
-
-//////////////////////////////////////////////////////////////////////
-// Midi Loader Internal Structures
-
-#define CHNSTATE_NOTEOFFPENDING		0x0001
-
-// MOD Channel State description (current volume, panning, etc...)
-typedef struct MODCHANNELSTATE
-{
-	DWORD flags;	// Channel Flags
-	WORD idlecount;
-	WORD pitchsrc, pitchdest;	// Pitch Bend (current position/new position)
-	BYTE parent;	// Midi Channel parent
-	BYTE pan;		// Channel Panning			0-255
-	BYTE note;		// Note On # (0=available)
-} MODCHANNELSTATE;
-
-// MIDI Channel State (Midi Channels 0-15)
-typedef struct MIDICHANNELSTATE
-{
-	DWORD flags;		// Channel Flags
-	WORD pitchbend;		// Pitch Bend Amount (14-bits unsigned)
-	BYTE note_on[128];	// If note=on -> MOD channel # + 1 (0 if note=off)
-	BYTE program;		// Channel Midi Program
-	WORD bank;			// 0-16383
-	// -- Controllers --------- function ---------- CC# --- range  --- init (midi) ---
-	BYTE pan;			// Channel Panning			CC10	[0-255]		128 (64)
-	BYTE expression;	// Channel Expression		CC11	0-128		128	(127)
-	BYTE volume;		// Channel Volume			CC7		0-128		80	(100)
-	BYTE modulation;	// Modulation				CC1		0-127		0
-	BYTE pitchbendrange;// Pitch Bend Range								64
-} MIDICHANNELSTATE;
-
-typedef struct MIDITRACK
-{
-	LPCBYTE ptracks, ptrmax;
-	DWORD status;
-	LONG nexteventtime;
-} MIDITRACK;
-
-#pragma pack()
-
-
-
-LPCSTR szMidiGroupNames[17] =
-{
-	"Piano",
-	"Chromatic Percussion",
-	"Organ",
-	"Guitar",
-	"Bass",
-	"Strings",
-	"Ensemble",
-	"Brass",
-	"Reed",
-	"Pipe",
-	"Synth Lead",
-	"Synth Pad",
-	"Synth Effects",
-	"Ethnic",
-	"Percussive",
-	"Sound Effects",
-	"Percussions"
-};
-
-
-LPCSTR szMidiProgramNames[128] =
-{
-	// 1-8: Piano
-	"Acoustic Grand Piano",
-	"Bright Acoustic Piano",
-	"Electric Grand Piano",
-	"Honky-tonk Piano",
-	"Electric Piano 1",
-	"Electric Piano 2",
-	"Harpsichord",
-	"Clavi",
-	// 9-16: Chromatic Percussion
-	"Celesta",
-	"Glockenspiel",
-	"Music Box",
-	"Vibraphone",
-	"Marimba",
-	"Xylophone",
-	"Tubular Bells",
-	"Dulcimer",
-	// 17-24: Organ
-	"Drawbar Organ",
-	"Percussive Organ",
-	"Rock Organ",
-	"Church Organ",
-	"Reed Organ",
-	"Accordion",
-	"Harmonica",
-	"Tango Accordion",
-	// 25-32: Guitar
-	"Acoustic Guitar (nylon)",
-	"Acoustic Guitar (steel)",
-	"Electric Guitar (jazz)",
-	"Electric Guitar (clean)",
-	"Electric Guitar (muted)",
-	"Overdriven Guitar",
-	"Distortion Guitar",
-	"Guitar harmonics",
-	// 33-40   Bass
-	"Acoustic Bass",
-	"Electric Bass (finger)",
-	"Electric Bass (pick)",
-	"Fretless Bass",
-	"Slap Bass 1",
-	"Slap Bass 2",
-	"Synth Bass 1",
-	"Synth Bass 2",
-	// 41-48   Strings
-	"Violin",
-	"Viola",
-	"Cello",
-	"Contrabass",
-	"Tremolo Strings",
-	"Pizzicato Strings",
-	"Orchestral Harp",
-	"Timpani",
-	// 49-56   Ensemble
-	"String Ensemble 1",
-	"String Ensemble 2",
-	"SynthStrings 1",
-	"SynthStrings 2",
-	"Choir Aahs",
-	"Voice Oohs",
-	"Synth Voice",
-	"Orchestra Hit",
-	// 57-64   Brass
-	"Trumpet",
-	"Trombone",
-	"Tuba",
-	"Muted Trumpet",
-	"French Horn",
-	"Brass Section",
-	"SynthBrass 1",
-	"SynthBrass 2",
-	// 65-72   Reed
-	"Soprano Sax",
-	"Alto Sax",
-	"Tenor Sax",
-	"Baritone Sax",
-	"Oboe",
-	"English Horn",
-	"Bassoon",
-	"Clarinet",
-	// 73-80   Pipe
-	"Piccolo",
-	"Flute",
-	"Recorder",
-	"Pan Flute",
-	"Blown Bottle",
-	"Shakuhachi",
-	"Whistle",
-	"Ocarina",
-	// 81-88   Synth Lead
-	"Lead 1 (square)",
-	"Lead 2 (sawtooth)",
-	"Lead 3 (calliope)",
-	"Lead 4 (chiff)",
-	"Lead 5 (charang)",
-	"Lead 6 (voice)",
-	"Lead 7 (fifths)",
-	"Lead 8 (bass + lead)",
-	// 89-96   Synth Pad
-	"Pad 1 (new age)",
-	"Pad 2 (warm)",
-	"Pad 3 (polysynth)",
-	"Pad 4 (choir)",
-	"Pad 5 (bowed)",
-	"Pad 6 (metallic)",
-	"Pad 7 (halo)",
-	"Pad 8 (sweep)",
-	// 97-104  Synth Effects
-	"FX 1 (rain)",
-	"FX 2 (soundtrack)",
-	"FX 3 (crystal)",
-	"FX 4 (atmosphere)",
-	"FX 5 (brightness)",
-	"FX 6 (goblins)",
-	"FX 7 (echoes)",
-	"FX 8 (sci-fi)",
-	// 105-112 Ethnic
-	"Sitar",
-	"Banjo",
-	"Shamisen",
-	"Koto",
-	"Kalimba",
-	"Bag pipe",
-	"Fiddle",
-	"Shanai",
-	// 113-120 Percussive
-	"Tinkle Bell",
-	"Agogo",
-	"Steel Drums",
-	"Woodblock",
-	"Taiko Drum",
-	"Melodic Tom",
-	"Synth Drum",
-	"Reverse Cymbal",
-	// 121-128 Sound Effects
-	"Guitar Fret Noise",
-	"Breath Noise",
-	"Seashore",
-	"Bird Tweet",
-	"Telephone Ring",
-	"Helicopter",
-	"Applause",
-	"Gunshot"
-};
-
-
-// Notes 25-85
-LPCSTR szMidiPercussionNames[61] =
-{
-	"Seq Click",
-	"Brush Tap",
-	"Brush Swirl",
-	"Brush Slap",
-	"Brush Swirl W/Attack",
-	"Snare Roll",
-	"Castanet",
-	"Snare Lo",
-	"Sticks",
-	"Bass Drum Lo",
-	"Open Rim Shot",
-	"Acoustic Bass Drum",
-	"Bass Drum 1",
-	"Side Stick",
-	"Acoustic Snare",
-	"Hand Clap",
-	"Electric Snare",
-	"Low Floor Tom",
-	"Closed Hi Hat",
-	"High Floor Tom",
-	"Pedal Hi-Hat",
-	"Low Tom",
-	"Open Hi-Hat",
-	"Low-Mid Tom",
-	"Hi Mid Tom",
-	"Crash Cymbal 1",
-	"High Tom",
-	"Ride Cymbal 1",
-	"Chinese Cymbal",
-	"Ride Bell",
-	"Tambourine",
-	"Splash Cymbal",
-	"Cowbell",
-	"Crash Cymbal 2",
-	"Vibraslap",
-	"Ride Cymbal 2",
-	"Hi Bongo",
-	"Low Bongo",
-	"Mute Hi Conga",
-	"Open Hi Conga",
-	"Low Conga",
-	"High Timbale",
-	"Low Timbale",
-	"High Agogo",
-	"Low Agogo",
-	"Cabasa",
-	"Maracas",
-	"Short Whistle",
-	"Long Whistle",
-	"Short Guiro",
-	"Long Guiro",
-	"Claves",
-	"Hi Wood Block",
-	"Low Wood Block",
-	"Mute Cuica",
-	"Open Cuica",
-	"Mute Triangle",
-	"Open Triangle",
-	"Shaker",
-	"Jingle Bell",
-	"Bell Tree",
-};
-
-
-const WORD kMidiChannelPriority[16] =
-{
-	0xFFFE, 0xFFFC, 0xFFF8, 0xFFF0,	0xFFE0, 0xFFC0, 0xFF80, 0xFF00,
-	0xFE00, 0xFDFF, 0xF800, 0xF000,	0xE000, 0xC000, 0x8000, 0x0000,
-};
-
-
-///////////////////////////////////////////////////////////////////////////
-// Helper functions
-
-static LONG getmidilong(LPCBYTE &p, LPCBYTE pmax)
-//----------------------------------------------------------
-{
-	DWORD n;
-	UINT a;
-
-	a = (p < pmax) ? *(p++) : 0;
-	n = 0;
-	while (a&0x80)
-	{
-		n = (n<<7)|(a&0x7F);
-		a = (p < pmax) ? *(p++) : 0;
-	}
-	return (n<<7)|(LONG)a;
-}
-
-
-// Returns MOD tempo and tick multiplier
-static int ConvertMidiTempo(int tempo_us, int *pTickMultiplier)
-//-------------------------------------------------------------
-{
-	int nBestModTempo = 120;
-	int nBestError = 1000000; // 1s
-	int nBestMultiplier = 1;
-	int nSpeed = gnMidiImportSpeed;
-	for (int nModTempo=110; nModTempo<=240; nModTempo++)
-	{
-		int tick_us = (2500000) / nModTempo;
-		int nFactor = (tick_us+tempo_us/2) / tempo_us;
-		if (!nFactor) nFactor = 1;
-		int nError = tick_us - tempo_us * nFactor;
-		if (nError < 0) nError = -nError;
-		if (nError < nBestError)
-		{
-			nBestError = nError;
-			nBestModTempo = nModTempo;
-			nBestMultiplier = nFactor;
-		}
-		if ((!nError) || ((nError<=1) && (nFactor==64))) break;
-	}
-	*pTickMultiplier = nBestMultiplier * nSpeed;
-	return nBestModTempo;
-}
-
-
-////////////////////////////////////////////////////////////////////////////////
-// Maps a midi instrument - returns the instrument number in the file
-UINT CSoundFile::MapMidiInstrument(DWORD dwBankProgram, UINT nChannel, UINT nNote)
-//--------------------------------------------------------------------------------
-{
-	INSTRUMENTHEADER *penv;
-	UINT nProgram = dwBankProgram & 0x7F;
-	UINT nBank = dwBankProgram >> 7;
-
-	nNote &= 0x7F;
-	if (nNote >= 120) return 0;
-	for (UINT i=1; i<=m_nInstruments; i++) if (Headers[i])
-	{
-		INSTRUMENTHEADER *p = Headers[i];
-		// Drum Kit ?
-		if (nChannel == MIDI_DRUMCHANNEL)
-		{
-			if (nNote == p->nMidiDrumKey) return i;
-		} else
-		// Melodic Instrument
-		{
-			if (nProgram == p->nMidiProgram) return i;
-		}
-	}
-	if ((m_nInstruments + 1 >= MAX_INSTRUMENTS) || (m_nSamples + 1 >= MAX_SAMPLES)) return 0;
-	penv = new INSTRUMENTHEADER;
-	if (!penv) return 0;
-	memset(penv, 0, sizeof(INSTRUMENTHEADER));
-	m_nSamples++;
-	m_nInstruments++;
-	Headers[m_nInstruments] = penv;
-	penv->wMidiBank = nBank;
-	penv->nMidiProgram = nProgram;
-	penv->nMidiChannel = nChannel;
-	if (nChannel == MIDI_DRUMCHANNEL) penv->nMidiDrumKey = nNote;
-	penv->nGlobalVol = 128;
-	penv->nFadeOut = 1024;
-	penv->nPan = 128;
-	penv->nPPC = 5*12;
-	penv->nNNA = NNA_NOTEOFF;
-	penv->nDCT = (nChannel == MIDI_DRUMCHANNEL) ? DCT_SAMPLE : DCT_NOTE;
-	penv->nDNA = DNA_NOTEFADE;
-	for (UINT j=0; j<120; j++)
-	{
-		int mapnote = j+1;
-		if (nChannel == MIDI_DRUMCHANNEL)
-		{
-			mapnote = 61;
-			/*mapnote = 61 + j - nNote;
-			if (mapnote < 1) mapnote = 1;
-			if (mapnote > 120) mapnote = 120;*/
-		}
-		penv->Keyboard[j] = m_nSamples;
-		penv->NoteMap[j] = (BYTE)mapnote;
-	}
-	penv->dwFlags |= ENV_VOLUME;
-	if (nChannel != MIDI_DRUMCHANNEL) penv->dwFlags |= ENV_VOLSUSTAIN;
-	penv->VolEnv.nNodes=4;
-	penv->VolEnv.Ticks[0]=0;
-	penv->VolEnv.Values[0] = 64;
-	penv->VolEnv.Ticks[1] = 10;
-	penv->VolEnv.Values[1] = 64;
-	penv->VolEnv.Ticks[2] = 15;
-	penv->VolEnv.Values[2] = 48;
-	penv->VolEnv.Ticks[3] = 20;
-	penv->VolEnv.Values[3] = 0;
-	penv->VolEnv.nSustainStart=1;
-	penv->VolEnv.nSustainEnd=1;
-	// Sample
-	Ins[m_nSamples].nPan = 128;
-	Ins[m_nSamples].nVolume = 256;
-	Ins[m_nSamples].nGlobalVol = 64;
-	if (nChannel != MIDI_DRUMCHANNEL)
-	{
-		// GM Midi Name
-		strcpy((char*)penv->name, (char*)szMidiProgramNames[nProgram]);
-		strcpy((char*)m_szNames[m_nSamples], (char*)szMidiProgramNames[nProgram]);
-	} else
-	{
-		strcpy((char*)penv->name, "Percussions");
-		if ((nNote >= 24) && (nNote <= 84))
-			strcpy((char*)m_szNames[m_nSamples], (char*)szMidiPercussionNames[nNote-24]);
-		else
-			strcpy((char*)m_szNames[m_nSamples], "Percussions");
-	}
-	return m_nInstruments;
-}
-
-
-/////////////////////////////////////////////////////////////////
-// Loader Status
-#define MIDIGLOBAL_SONGENDED		0x0001
-#define MIDIGLOBAL_FROZEN			0x0002
-#define MIDIGLOBAL_UPDATETEMPO		0x0004
-#define MIDIGLOBAL_UPDATEMASTERVOL	0x0008
-// Midi Globals
-#define MIDIGLOBAL_GMSYSTEMON		0x0100
-#define MIDIGLOBAL_XGSYSTEMON		0x0200
-
-
-BOOL CSoundFile::ReadMID(const BYTE *lpStream, DWORD dwMemLength)
-//---------------------------------------------------------------
-{
-	const MIDIFILEHEADER *pmfh = (const MIDIFILEHEADER *)lpStream;
-	const MIDITRACKHEADER *pmth;
-	MODCHANNELSTATE chnstate[MAX_BASECHANNELS];
-	MIDICHANNELSTATE midichstate[16];
-	MIDITRACK miditracks[MIDI_MAXTRACKS];
-	DWORD dwMemPos, dwGlobalFlags, tracks, tempo;
-	UINT row, pat, midimastervol;
-	short int division;
-	int midi_clock, nTempoUsec, nPPQN, nTickMultiplier;
-
-	// Fix import parameters
-	if (gnMidiImportSpeed < 2) gnMidiImportSpeed = 2;
-	if (gnMidiImportSpeed > 6) gnMidiImportSpeed = 6;
-	if (gnMidiPatternLen < 64) gnMidiPatternLen = 64;
-	if (gnMidiPatternLen > 256) gnMidiPatternLen = 256;
-	// Detect RMI files
-	if ((dwMemLength > 12)
-	 && (memcmp(lpStream, "RIFF",4) == 0)
-	 && (memcmp(lpStream, "RMID",4) == 0))
-	{
-		lpStream += 12;
-		dwMemLength -= 12;
-		while (dwMemLength > 8)
-		{
-			char *id = (char*)lpStream;
-			DWORD len = *(DWORD *)(lpStream+4);
-			lpStream += 8;
-			dwMemLength -= 8;
-			if ((memcmp(id, "data",4) == 0) && (len < dwMemLength))
-			{
-				dwMemLength = len;
-				pmfh = (const MIDIFILEHEADER *)lpStream;
-				break;
-			}
-			if (len >= dwMemLength) return FALSE;
-			lpStream += len;
-			dwMemLength -= len;
-		}
-	}
-	// MIDI File Header
-	if ((dwMemLength < sizeof(MIDIFILEHEADER)+8) || (memcmp(pmfh->id, "MThd",4) != 0)) return FALSE;
-	dwMemPos = 8 + bswapBE32(pmfh->len);
-	if (dwMemPos >= dwMemLength - 8) return FALSE;
-	pmth = (MIDITRACKHEADER *)(lpStream+dwMemPos);
-	tracks = bswapBE16(pmfh->wTrks);
-	if ((!tracks) || (memcmp(pmth->id, "MTrk", 4) != 0)) return FALSE;
-	if (tracks > MIDI_MAXTRACKS) tracks = MIDI_MAXTRACKS;
-	// Reading File...
-	m_nType = MOD_TYPE_MID;
-	m_nChannels = 32;
-	m_nSamples = 0;
-	m_nInstruments = 0;
-	m_dwSongFlags |= (SONG_LINEARSLIDES | SONG_INSTRUMENTMODE);
-	m_szNames[0][0] = 0;
-	// MIDI->MOD Tempo Conversion
-	division = bswapBE16(pmfh->wDivision);
-	if (division < 0)
-	{
-		int nFrames = -(division>>8);
-		int nSubFrames = (division & 0xff);
-		nPPQN = nFrames * nSubFrames / 2;
-		if (!nPPQN) nPPQN = 1;
-	} else
-	{
-		nPPQN = (division) ? division : 96;
-	}
-	nTempoUsec = 500000 / nPPQN;
-	tempo = ConvertMidiTempo(nTempoUsec, &nTickMultiplier);
-	m_nDefaultTempo = tempo;
-	m_nDefaultSpeed = gnMidiImportSpeed;
-	m_nDefaultGlobalVolume = 256;
-	midimastervol = m_nDefaultGlobalVolume;
-	
-	// Initializing 
-	memset(Order, 0xFF, sizeof(Order));
-	memset(chnstate, 0, sizeof(chnstate));
-	memset(miditracks, 0, sizeof(miditracks));
-	memset(midichstate, 0, sizeof(midichstate));
-	// Initializing Patterns
-	Order[0] = 0;
-	for (UINT ipat=0; ipat<MAX_PATTERNS; ipat++) PatternSize[ipat] = gnMidiPatternLen;
-	// Initializing Channels
-	for (UINT ics=0; ics<MAX_BASECHANNELS; ics++)
-	{
-		// Channel settings
-		ChnSettings[ics].nPan = 128;
-		ChnSettings[ics].nVolume = 64;
-		ChnSettings[ics].dwFlags = 0;
-		// Channels state
-		chnstate[ics].pan = 128;
-		chnstate[ics].pitchsrc = 0x2000;
-		chnstate[ics].pitchdest = 0x2000;
-	}
-	// Initializing Track Pointers
-	for (UINT itrk=0; itrk<tracks; itrk++)
-	{
-		miditracks[itrk].nexteventtime = -1;
-		miditracks[itrk].status = 0x2F;
-		pmth = (MIDITRACKHEADER *)(lpStream+dwMemPos);
-		if (dwMemPos + 8 >= dwMemLength) break;
-		DWORD len = bswapBE32(pmth->len);
-		if ((memcmp(pmth->id, "MTrk", 4) == 0) && (dwMemPos + 8 + len <= dwMemLength))
-		{
-			// Initializing midi tracks
-			miditracks[itrk].ptracks = lpStream+dwMemPos+8;
-			miditracks[itrk].ptrmax = miditracks[itrk].ptracks + len;
-			miditracks[itrk].nexteventtime = getmidilong(miditracks[itrk].ptracks, miditracks[itrk].ptrmax);
-		}
-		dwMemPos += 8 + len;
-	}
-	// Initializing midi channels state
-	for (UINT imidi=0; imidi<16; imidi++)
-	{
-		midichstate[imidi].pan = 128;			// middle
-		midichstate[imidi].expression = 128;	// no attenuation
-		midichstate[imidi].volume = 80;			// GM specs defaults to 100
-		midichstate[imidi].pitchbend = 0x2000;	// Pitch Bend Amount
-		midichstate[imidi].pitchbendrange = 64;	// Pitch Bend Range: +/- 2 semitones
-	}
-	////////////////////////////////////////////////////////////////////////////
-	// Main Midi Sequencer Loop
-	pat = 0;
-	row = 0;
-	midi_clock = 0;
-	dwGlobalFlags = MIDIGLOBAL_UPDATETEMPO | MIDIGLOBAL_FROZEN;
-	do
-	{
-		// Allocate current pattern if not allocated yet
-		if (!Patterns[pat])
-		{
-			Patterns[pat] = AllocatePattern(PatternSize[pat], m_nChannels);
-			if (!Patterns[pat]) break;
-		}
-		dwGlobalFlags |= MIDIGLOBAL_SONGENDED;
-		MODCOMMAND *m = Patterns[pat] + row * m_nChannels;
-		// Parse Tracks
-		for (UINT trk=0; trk<tracks; trk++) if (miditracks[trk].ptracks)
-		{
-			MIDITRACK *ptrk = &miditracks[trk];
-			dwGlobalFlags &= ~MIDIGLOBAL_SONGENDED;
-			while ((ptrk->ptracks) && (ptrk->nexteventtime >= 0) && (midi_clock+(nTickMultiplier>>2) >= ptrk->nexteventtime))
-			{
-				if (ptrk->ptracks[0] & 0x80) ptrk->status = *(ptrk->ptracks++);
-				switch(ptrk->status)
-				{
-				/////////////////////////////////////////////////////////////////////
-				// End Of Track
-				case 0x2F:
-				// End Of Song
-				case 0xFC:
-					ptrk->ptracks = NULL;
-					break;
-
-				/////////////////////////////////////////////////////////////////////
-				// SYSEX messages
-				case 0xF0:
-				case 0xF7:
-					{
-						LONG len = getmidilong(ptrk->ptracks, ptrk->ptrmax);
-						if ((len > 1) && (ptrk->ptracks + len <ptrk->ptrmax) && (ptrk->ptracks[len-1] == 0xF7))
-						{
-							DWORD dwSysEx1 = 0, dwSysEx2 = 0;
-							if (len >= 4) dwSysEx1 = (*((DWORD *)(ptrk->ptracks))) & 0x7F7F7F7F;
-							if (len >= 8) dwSysEx2 = (*((DWORD *)(ptrk->ptracks+4))) & 0x7F7F7F7F;
-							// GM System On
-							if ((len == 5) && (dwSysEx1 == 0x01097F7E))
-							{
-								dwGlobalFlags |= MIDIGLOBAL_GMSYSTEMON;
-							} else
-							// XG System On
-							if ((len == 8) && ((dwSysEx1 & 0xFFFFF0FF) == 0x004c1043) && (dwSysEx2 == 0x77007e00))
-							{
-								dwGlobalFlags |= MIDIGLOBAL_XGSYSTEMON;
-							} else
-							// Midi Master Volume
-							if ((len == 7) && (dwSysEx1 == 0x01047F7F))
-							{
-								midimastervol = midivolumetolinear(ptrk->ptracks[5] & 0x7F) >> 8;
-								if (midimastervol < 16) midimastervol = 16;
-								dwGlobalFlags |= MIDIGLOBAL_UPDATEMASTERVOL;
-							}
-						}
-						ptrk->ptracks += len;
-					}
-					break;
-				
-				//////////////////////////////////////////////////////////////////////
-				// META-events: FF.code.len.data[len]
-				case 0xFF:
-					{
-						UINT i = *(ptrk->ptracks++);
-						LONG len = getmidilong(ptrk->ptracks, ptrk->ptrmax);
-						if (ptrk->ptracks+len > ptrk->ptrmax)
-						{
-							// EOF
-							ptrk->ptracks = NULL;
-						} else
-						switch(i)
-						{
-						// FF.01 [text]: Song Information
-						case 0x01:
-							if (!len) break;
-							if ((len < 32) && (!m_szNames[0][0]))
-							{
-								memcpy(m_szNames[0], ptrk->ptracks, len);
-								m_szNames[0][len] = 0;
-							} else
-							if ((!m_lpszSongComments) && (ptrk->ptracks[0]) && (ptrk->ptracks[0] < 0x7F))
-							{
-								m_lpszSongComments = new char [len+1];
-								if (m_lpszSongComments)
-								{
-									memcpy(m_lpszSongComments, ptrk->ptracks, len);
-									m_lpszSongComments[len] = 0;
-								}
-							}
-							break;
-						// FF.02 [text]: Song Copyright
-						case 0x02:
-							if (!len) break;
-							if ((!m_lpszSongComments) && (ptrk->ptracks[0]) && (ptrk->ptracks[0] < 0x7F) && (len > 7))
-							{
-								m_lpszSongComments = new char [len+1];
-								if (m_lpszSongComments)
-								{
-									memcpy(m_lpszSongComments, ptrk->ptracks, len);
-									m_lpszSongComments[len] = 0;
-								}
-							}
-							break;
-						// FF.03: Sequence Name
-						case 0x03:
-						// FF.06: Sequence Text (->Pattern names)
-						case 0x06:
-							if ((len > 1) && (!trk))
-							{
-								UINT k = (len < 32) ? len : 31;
-								CHAR s[32];
-								memcpy(s, ptrk->ptracks, k);
-								s[k] = 0;
-								if ((!strnicmp((char*)s, "Copyri", 6)) || (!s[0])) break;
-								if (i == 0x03)
-								{
-									if (!m_szNames[0][0]) strcpy((char*)m_szNames[0], (char*)s);
-								}
-							}
-							break;
-						// FF.07: Cue Point (marker)
-						// FF.20: Channel Prefix
-						// FF.2F: End of Track
-						case 0x2F:
-							ptrk->status = 0x2F;
-							ptrk->ptracks = NULL;
-							break;
-						// FF.51 [tttttt]: Set Tempo
-						case 0x51:
-							{
-								LONG l = ptrk->ptracks[0];
-								l = (l << 8) | ptrk->ptracks[1];
-								l = (l << 8) | ptrk->ptracks[2];
-								if (l <= 0) break;
-								nTempoUsec = l / nPPQN;
-								if (nTempoUsec < 100) nTempoUsec = 100;
-								tempo = ConvertMidiTempo(nTempoUsec, &nTickMultiplier);
-								dwGlobalFlags |= MIDIGLOBAL_UPDATETEMPO;
-							}
-							break;
-						// FF.58: Time Signature
-						// FF.7F: Sequencer-Specific
-						}
-						if (ptrk->ptracks) ptrk->ptracks += len;
-					}
-					break;
-
-				//////////////////////////////////////////////////////////////////////////
-				// Regular Voice Events
-				default:
-				{
-					UINT midich = (ptrk->status & 0x0F)+1;
-					UINT midist = ptrk->status & 0xF0;
-					MIDICHANNELSTATE *pmidich = &midichstate[midich-1];
-					UINT note, velocity;
-
-					switch(midist)
-					{
-					//////////////////////////////////
-					// Note Off:	80.note.velocity
-					case 0x80:
-					// Note On:		90.note.velocity
-					case 0x90:
-						note = ptrk->ptracks[0] & 0x7F;
-						velocity = (midist == 0x90) ? (ptrk->ptracks[1] & 0x7F) : 0;
-						ptrk->ptracks += 2;
-						// Note On: 90.note.velocity
-						if (velocity)
-						{
-							// Start counting rows
-							dwGlobalFlags &= ~MIDIGLOBAL_FROZEN;
-							// if the note is already playing, we reuse this channel
-							UINT nchn = pmidich->note_on[note];
-							if ((nchn) && (chnstate[nchn-1].parent != midich)) nchn = 0;
-							// or else, we look for an available child channel
-							if (!nchn)
-							{
-								for (UINT i=0; i<m_nChannels; i++) if (chnstate[i].parent == midich)
-								{
-									if ((!chnstate[i].note) && ((!m[i].note) || (m[i].note & 0x80)))
-									{
-										// found an available channel
-										nchn = i+1;
-										break;
-									}
-								}
-							}
-							// still nothing? in this case, we try to allocate a new mod channel
-							if (!nchn)
-							{
-								for (UINT i=0; i<m_nChannels; i++) if (!chnstate[i].parent)
-								{
-									nchn = i+1;
-									chnstate[i].parent = midich;
-									break;
-								}
-							}
-							// still not? we have to steal a voice from another channel
-							// We found our channel: let's do the note on
-							if (nchn)
-							{
-								pmidich->note_on[note] = nchn;
-								nchn--;
-								chnstate[nchn].pitchsrc = pmidich->pitchbend;
-								chnstate[nchn].pitchdest = pmidich->pitchbend;
-								chnstate[nchn].flags &= ~CHNSTATE_NOTEOFFPENDING;
-								chnstate[nchn].idlecount = 0;
-								chnstate[nchn].note = note+1;
-								int realnote = note;
-								if (midich != 10)
-								{
-									realnote += (((int)pmidich->pitchbend - 0x2000) * pmidich->pitchbendrange) / (0x2000*32);
-									if (realnote < 0) realnote = 0;
-									if (realnote > 119) realnote = 119;
-								}
-								m[nchn].note = realnote+1;
-								m[nchn].instr = MapMidiInstrument(pmidich->program + ((UINT)pmidich->bank << 7), midich, note);
-								m[nchn].volcmd = VOLCMD_VOLUME;
-								LONG vol = midivolumetolinear(velocity) >> 8;
-								vol = (vol * (LONG)pmidich->volume * (LONG)pmidich->expression) >> 13;
-								if (vol > 256) vol = 256;
-								if (vol < 4) vol = 4;
-								m[nchn].vol = (BYTE)(vol>>2);
-								// Channel Panning
-								if ((!m[nchn].command) && (pmidich->pan != chnstate[nchn].pan))
-								{
-									chnstate[nchn].pan = pmidich->pan;
-									m[nchn].param = pmidich->pan;
-									m[nchn].command = CMD_PANNING8;
-								}
-							}
-						} else
-						// Note Off; 90.note.00
-						if (!(dwGlobalFlags & MIDIGLOBAL_FROZEN))
-						{
-							UINT nchn = pmidich->note_on[note];
-							if (nchn)
-							{
-								nchn--;
-								chnstate[nchn].flags |= CHNSTATE_NOTEOFFPENDING;
-								chnstate[nchn].note = 0;
-								pmidich->note_on[note] = 0;
-							} else
-							{
-								for (UINT i=0; i<m_nChannels; i++)
-								{
-									if ((chnstate[i].parent == midich) && (chnstate[i].note == note+1))
-									{
-										chnstate[i].note = 0;
-										chnstate[i].flags |= CHNSTATE_NOTEOFFPENDING;
-									}
-								}
-							}
-						}
-						break;
-
-					///////////////////////////////////
-					// A0.xx.yy: Aftertouch
-					case 0xA0:
-						{
-							ptrk->ptracks += 2;
-						}
-						break;
-
-					///////////////////////////////////
-					// B0: Control Change
-					case 0xB0:
-						{
-							UINT controller = ptrk->ptracks[0];
-							UINT value = ptrk->ptracks[1] & 0x7F;
-							ptrk->ptracks += 2;
-							switch(controller)
-							{
-							// Bn.00.xx: Bank Select MSB (GS)
-							case 0x00:
-								pmidich->bank &= 0x7F;
-								pmidich->bank |= (value << 7);
-								break;
-							// Bn.01.xx: Modulation Depth
-							case 0x01:
-								pmidich->pitchbendrange = value;
-								break;
-							// Bn.07.xx: Volume
-							case 0x07:
-								pmidich->volume = (BYTE)(midivolumetolinear(value) >> 9);
-								break;
-							// Bn.0B.xx: Expression
-							case 0x0B:
-								pmidich->expression = (BYTE)(midivolumetolinear(value) >> 9);
-								break;
-							// Bn.0A.xx: Pan
-							case 0x0A:
-								pmidich->pan = value * 2;
-								break;
-							// Bn.20.xx: Bank Select LSB (GS)
-							case 0x20:
-								pmidich->bank &= (0x7F << 7);
-								pmidich->bank |= value;
-								break;
-							// Bn.79.00: Reset All Controllers (GM)
-							case 0x79:
-								pmidich->modulation = 0;
-								pmidich->expression = 128;
-								pmidich->pitchbend = 0x2000;
-								pmidich->pitchbendrange = 64;
-								// Should also reset pedals (40h-43h), NRP, RPN, aftertouch
-								break;
-							// Bn.78.00: All Sound Off (GS)
-							// Bn.7B.00: All Notes Off (GM)
-							case 0x78:
-							case 0x7B:
-								if (value == 0x00)
-								{
-									// All Notes Off
-									for (UINT k=0; k<m_nChannels; k++)
-									{
-										if (chnstate[k].note)
-										{
-											chnstate[k].flags |= CHNSTATE_NOTEOFFPENDING;
-											chnstate[k].note = 0;
-										}
-									}
-								}
-								break;
-							////////////////////////////////////
-							// Controller List
-							//
-							// Bn.02.xx: Breath Control
-							// Bn.04.xx: Foot Pedal
-							// Bn.05.xx: Portamento Time (Glissando Time)
-							// Bn.06.xx: Data Entry MSB
-							// Bn.08.xx: Balance
-							// Bn.10-13.xx: GP Control #1-#4
-							// Bn.20-3F.xx: Data LSB for controllers 0-31
-							// Bn.26.xx: Data Entry LSB
-							// Bn.40.xx: Hold Pedal #1
-							// Bn.41.xx: Portamento (GS)
-							// Bn.42.xx: Sostenuto (GS)
-							// Bn.43.xx: Soft Pedal (GS)
-							// Bn.44.xx: Legato Pedal
-							// Bn.45.xx: Hold Pedal #2
-							// Bn.46.xx: Sound Variation
-							// Bn.47.xx: Sound Timbre
-							// Bn.48.xx: Sound Release Time
-							// Bn.49.xx: Sound Attack Time
-							// Bn.4A.xx: Sound Brightness
-							// Bn.4B-4F.xx: Sound Control #6-#10
-							// Bn.50-53.xx: GP Control #5-#8
-							// Bn.54.xx: Portamento Control (GS)
-							// Bn.5B.xx: Reverb Level (GS)
-							// Bn.5C.xx: Tremolo Depth
-							// Bn.5D.xx: Chorus Level (GS)
-							// Bn.5E.xx: Celeste Depth
-							// Bn.5F.xx: Phaser Depth
-							// Bn.60.xx: Data Increment
-							// Bn.61.xx: Data Decrement
-							// Bn.62.xx: Non-RPN Parameter LSB (GS)
-							// Bn.63.xx: Non-RPN Parameter MSB (GS)
-							// Bn.64.xx: RPN Parameter LSB (GM)
-							// Bn.65.xx: RPN Parameter MSB (GM)
-							// Bn.7A.00: Local On/Off
-							// Bn.7C.00: Omni Mode Off
-							// Bn.7D.00: Omni Mode On
-							// Bn.7E.mm: Mono Mode On
-							// Bn.7F.00: Poly Mode On
-							}
-						}
-						break;
-
-					////////////////////////////////
-					// C0.pp: Program Change
-					case 0xC0:
-						{
-							pmidich->program = ptrk->ptracks[0] & 0x7F;
-							ptrk->ptracks++;
-						}
-						break;
-
-					////////////////////////////////
-					// D0: Channel Aftertouch (Polyphonic Key Pressure)
-					case 0xD0:
-						{
-							ptrk->ptracks++;
-						}
-						break;
-					
-					////////////////////////////////
-					// E0: Pitch Bend
-					case 0xE0:
-						{
-							pmidich->pitchbend = (WORD)(((UINT)ptrk->ptracks[1] << 7) + (ptrk->ptracks[0] & 0x7F));
-							for (UINT i=0; i<128; i++) if (pmidich->note_on[i])
-							{
-								UINT nchn = pmidich->note_on[i]-1;
-								if (chnstate[nchn].parent == midich)
-								{
-									chnstate[nchn].pitchdest = pmidich->pitchbend;
-								}
-							}
-							ptrk->ptracks+=2;
-						}
-						break;
-
-					//////////////////////////////////////
-					// F0 & Unsupported commands: skip it
-					default:
-						ptrk->ptracks++;
-					}
-				}} // switch+default
-				// Process to next event
-				if (ptrk->ptracks)
-				{
-					ptrk->nexteventtime += getmidilong(ptrk->ptracks, ptrk->ptrmax);
-				}
-				if (ptrk->ptracks >= ptrk->ptrmax) ptrk->ptracks = NULL;
-			}
-			// End reached?
-			if (ptrk->ptracks >= ptrk->ptrmax) ptrk->ptracks = NULL;
-		}
-
-		////////////////////////////////////////////////////////////////////
-		// Move to next row
-		if (!(dwGlobalFlags & MIDIGLOBAL_FROZEN))
-		{
-			// Check MOD channels status
-			for (UINT ichn=0; ichn<m_nChannels; ichn++)
-			{
-				// Pending Global Effects ?
-				if (!m[ichn].command)
-				{
-					if ((chnstate[ichn].pitchsrc != chnstate[ichn].pitchdest) && (chnstate[ichn].parent))
-					{
-						int newpitch = chnstate[ichn].pitchdest;
-						int pitchbendrange = midichstate[chnstate[ichn].parent-1].pitchbendrange;
-						// +/- 256 for +/- pitch bend range
-						int slideamount = (newpitch - (int)chnstate[ichn].pitchsrc) / (int)32;
-						if (slideamount)
-						{
-							const int ppdiv = (16 * 128 * (gnMidiImportSpeed-1));
-							newpitch = (int)chnstate[ichn].pitchsrc + slideamount;
-							if (slideamount < 0)
-							{
-								int param = (-slideamount * pitchbendrange + ppdiv/2) / ppdiv;
-								if (param >= 0x80) param = 0x80;
-								if (param > 0)
-								{
-									m[ichn].param = (BYTE)param;
-									m[ichn].command = CMD_PORTAMENTODOWN;
-								}
-							} else
-							{
-								int param = (slideamount * pitchbendrange + ppdiv/2) / ppdiv;
-								if (param >= 0x80) param = 0x80;
-								if (param > 0)
-								{
-									m[ichn].param = (BYTE)param;
-									m[ichn].command = CMD_PORTAMENTOUP;
-								}
-							}
-						}
-						chnstate[ichn].pitchsrc = (WORD)newpitch;
-
-					} else
-					if (dwGlobalFlags & MIDIGLOBAL_UPDATETEMPO)
-					{
-						m[ichn].command = CMD_TEMPO;
-						m[ichn].param = (BYTE)tempo;
-						dwGlobalFlags &= ~MIDIGLOBAL_UPDATETEMPO;
-					} else
-					if (dwGlobalFlags & MIDIGLOBAL_UPDATEMASTERVOL)
-					{
-						m[ichn].command = CMD_GLOBALVOLUME;
-						m[ichn].param = midimastervol >> 1; // 0-128
-						dwGlobalFlags &= ~MIDIGLOBAL_UPDATEMASTERVOL;
-					}
-				}
-				// Check pending noteoff events for m[ichn]
-				if (!m[ichn].note)
-				{
-					if (chnstate[ichn].flags & CHNSTATE_NOTEOFFPENDING)
-					{
-						chnstate[ichn].flags &= ~CHNSTATE_NOTEOFFPENDING;
-						m[ichn].note = 0xFF;
-					}
-					// Check State of channel
-					chnstate[ichn].idlecount++;
-					if ((chnstate[ichn].note) && (chnstate[ichn].idlecount >= 50))
-					{
-						chnstate[ichn].note = 0;
-						m[ichn].note = 0xFF;	// only if not drum channel ?
-					} else
-					if (chnstate[ichn].idlecount >= 500) // 20secs of inactivity
-					{
-						chnstate[ichn].idlecount = 0;
-						chnstate[ichn].parent = 0;
-					}
-				}
-			}
-
-			if ((++row) >= PatternSize[pat])
-			{
-				pat++;
-				if (pat >= MAX_PATTERNS-1) break;
-				Order[pat] = pat;
-				Order[pat+1] = 0xFF;
-				row = 0;
-			}
-		}
-
-		// Increase midi clock
-		midi_clock += nTickMultiplier;
-	} while (!(dwGlobalFlags & MIDIGLOBAL_SONGENDED));
-	return TRUE;
-}
-
-
--- a/src/modplug/load_s3m.cxx	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/modplug/load_s3m.cxx	Fri Jun 13 05:57:25 2008 +0300
@@ -91,7 +91,7 @@
 	case 'S':	command = CMD_S3MCMDEX; break;
 	case 'T':	command = CMD_TEMPO; break;
 	case 'U':	command = CMD_FINEVIBRATO; break;
-	case 'V':	command = CMD_GLOBALVOLUME; break;
+	case 'V':	command = CMD_GLOBALVOLUME; if (!bIT) param *= 2; break;
 	case 'W':	command = CMD_GLOBALVOLSLIDE; break;
 	case 'X':	command = CMD_PANNING8; break;
 	case 'Y':	command = CMD_PANBRELLO; break;
@@ -131,7 +131,7 @@
 	case CMD_S3MCMDEX:			command = 'S'; break;
 	case CMD_TEMPO:				command = 'T'; break;
 	case CMD_FINEVIBRATO:		command = 'U'; break;
-	case CMD_GLOBALVOLUME:		command = 'V'; break;
+	case CMD_GLOBALVOLUME:		command = 'V'; if (!bIT) param >>= 1;break;
 	case CMD_GLOBALVOLSLIDE:	command = 'W'; break;
 	case CMD_PANNING8:			
 		command = 'X';
--- a/src/modplug/load_xm.cxx	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/modplug/load_xm.cxx	Fri Jun 13 05:57:25 2008 +0300
@@ -391,6 +391,9 @@
 		penv->VolEnv.nNodes = xmsh.vnum;
 		if (!xmsh.vnum) penv->dwFlags &= ~ENV_VOLUME;
 		if (!xmsh.pnum) penv->dwFlags &= ~ENV_PANNING;
+		if (!(penv->dwFlags & ENV_VOLUME) && !penv->nFadeOut) {
+			penv->nFadeOut = 8192;
+		}
 		penv->PanEnv.nNodes = xmsh.pnum;
 		penv->VolEnv.nSustainStart = penv->VolEnv.nSustainEnd = xmsh.vsustain;
 		if (xmsh.vsustain >= 12) penv->dwFlags &= ~ENV_VOLSUSTAIN;
--- a/src/modplug/modplug.h	Fri Jun 13 04:58:39 2008 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,151 +0,0 @@
-/*
- * This source code is public domain.
- *
- * Authors: Kenton Varda <temporal@gauge3d.org> (C interface wrapper)
- */
-
-#ifndef MODPLUG_H__INCLUDED
-#define MODPLUG_H__INCLUDED
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-struct _ModPlugFile;
-typedef struct _ModPlugFile ModPlugFile;
-
-struct _ModPlugNote {
-	unsigned char Note;
-	unsigned char Instrument;
-	unsigned char VolumeEffect;
-	unsigned char Effect;
-	unsigned char Volume;
-	unsigned char Parameter;
-};
-typedef struct _ModPlugNote ModPlugNote;
-
-typedef void (*ModPlugMixerProc)(int*, unsigned long, unsigned long);
-
-/* Load a mod file.  [data] should point to a block of memory containing the complete
- * file, and [size] should be the size of that block.
- * Return the loaded mod file on success, or NULL on failure. */
-ModPlugFile* ModPlug_Load(const void* data, int size);
-/* Unload a mod file. */
-void ModPlug_Unload(ModPlugFile* file);
-
-/* Read sample data into the buffer.  Returns the number of bytes read.  If the end
- * of the mod has been reached, zero is returned. */
-int  ModPlug_Read(ModPlugFile* file, void* buffer, int size);
-
-/* Get the name of the mod.  The returned buffer is stored within the ModPlugFile
- * structure and will remain valid until you unload the file. */
-const char* ModPlug_GetName(ModPlugFile* file);
-
-/* Get the length of the mod, in milliseconds.  Note that this result is not always
- * accurate, especially in the case of mods with loops. */
-int ModPlug_GetLength(ModPlugFile* file);
-
-/* Seek to a particular position in the song.  Note that seeking and MODs don't mix very
- * well.  Some mods will be missing instruments for a short time after a seek, as ModPlug
- * does not scan the sequence backwards to find out which instruments were supposed to be
- * playing at that time.  (Doing so would be difficult and not very reliable.)  Also,
- * note that seeking is not very exact in some mods -- especially those for which
- * ModPlug_GetLength() does not report the full length. */
-void ModPlug_Seek(ModPlugFile* file, int millisecond);
-
-enum _ModPlug_Flags
-{
-	MODPLUG_ENABLE_OVERSAMPLING     = 1 << 0,  /* Enable oversampling (*highly* recommended) */
-	MODPLUG_ENABLE_NOISE_REDUCTION  = 1 << 1,  /* Enable noise reduction */
-	MODPLUG_ENABLE_REVERB           = 1 << 2,  /* Enable reverb */
-	MODPLUG_ENABLE_MEGABASS         = 1 << 3,  /* Enable megabass */
-	MODPLUG_ENABLE_SURROUND         = 1 << 4   /* Enable surround sound. */
-};
-
-enum _ModPlug_ResamplingMode
-{
-	MODPLUG_RESAMPLE_NEAREST = 0,  /* No interpolation (very fast, extremely bad sound quality) */
-	MODPLUG_RESAMPLE_LINEAR  = 1,  /* Linear interpolation (fast, good quality) */
-	MODPLUG_RESAMPLE_SPLINE  = 2,  /* Cubic spline interpolation (high quality) */
-	MODPLUG_RESAMPLE_FIR     = 3   /* 8-tap fir filter (extremely high quality) */
-};
-
-typedef struct _ModPlug_Settings
-{
-	int mFlags;  /* One or more of the MODPLUG_ENABLE_* flags above, bitwise-OR'ed */
-	
-	/* Note that ModPlug always decodes sound at 44100kHz, 32 bit, stereo and then
-	 * down-mixes to the settings you choose. */
-	int mChannels;       /* Number of channels - 1 for mono or 2 for stereo */
-	int mBits;           /* Bits per sample - 8, 16, or 32 */
-	int mFrequency;      /* Sampling rate - 11025, 22050, or 44100 */
-	int mResamplingMode; /* One of MODPLUG_RESAMPLE_*, above */
-	
-	int mReverbDepth;    /* Reverb level 0(quiet)-100(loud)      */
-	int mReverbDelay;    /* Reverb delay in ms, usually 40-200ms */
-	int mBassAmount;     /* XBass level 0(quiet)-100(loud)       */
-	int mBassRange;      /* XBass cutoff in Hz 10-100            */
-	int mSurroundDepth;  /* Surround level 0(quiet)-100(heavy)   */
-	int mSurroundDelay;  /* Surround delay in ms, usually 5-40ms */
-	int mLoopCount;      /* Number of times to loop.  Zero prevents looping.
-	                        -1 loops forever. */
-} ModPlug_Settings;
-
-/* Get and set the mod decoder settings.  All options, except for channels, bits-per-sample,
- * sampling rate, and loop count, will take effect immediately.  Those options which don't
- * take effect immediately will take effect the next time you load a mod. */
-void ModPlug_GetSettings(ModPlug_Settings* settings);
-void ModPlug_SetSettings(const ModPlug_Settings* settings);
-
-/* New ModPlug API Functions */
-/* NOTE: Master Volume (1-512) */
-unsigned int ModPlug_GetMasterVolume(ModPlugFile* file) ;
-void ModPlug_SetMasterVolume(ModPlugFile* file,unsigned int cvol) ;
-
-int ModPlug_GetCurrentSpeed(ModPlugFile* file);
-int ModPlug_GetCurrentTempo(ModPlugFile* file);
-int ModPlug_GetCurrentOrder(ModPlugFile* file);
-int ModPlug_GetCurrentPattern(ModPlugFile* file);
-int ModPlug_GetCurrentRow(ModPlugFile* file);
-int ModPlug_GetPlayingChannels(ModPlugFile* file);
-
-void ModPlug_SeekOrder(ModPlugFile* file,int order);
-int ModPlug_GetModuleType(ModPlugFile* file);
-char* ModPlug_GetMessage(ModPlugFile* file);
-
-
-unsigned int ModPlug_NumInstruments(ModPlugFile* file);
-unsigned int ModPlug_NumSamples(ModPlugFile* file);
-unsigned int ModPlug_NumPatterns(ModPlugFile* file);
-unsigned int ModPlug_NumChannels(ModPlugFile* file);
-unsigned int ModPlug_SampleName(ModPlugFile* file, unsigned int qual, char* buff);
-unsigned int ModPlug_InstrumentName(ModPlugFile* file, unsigned int qual, char* buff);
-
-/*
- * Retrieve pattern note-data
- */
-ModPlugNote* ModPlug_GetPattern(ModPlugFile* file, int pattern, unsigned int* numrows);
-
-/*
- * =================
- * Mixer callback
- * =================
- *
- * Use this callback if you want to 'modify' the mixed data of LibModPlug.
- * 
- * void proc(int* buffer,unsigned long channels,unsigned long nsamples) ;
- *
- * 'buffer': A buffer of mixed samples
- * 'channels': N. of channels in the buffer
- * 'nsamples': N. of samples in the buffeer (without taking care of n.channels)
- *
- * (Samples are signed 32-bit integers)
- */
-void ModPlug_InitMixerCallback(ModPlugFile* file,ModPlugMixerProc proc) ;
-void ModPlug_UnloadMixerCallback(ModPlugFile* file) ;
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-
-#endif
--- a/src/modplug/modplugbmp.cxx	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/modplug/modplugbmp.cxx	Fri Jun 13 05:57:25 2008 +0300
@@ -15,9 +15,7 @@
 #include "stddefs.h"
 #include "archive/open.h"
 extern "C" {
-#include <audacious/configdb.h>
 #include <audacious/output.h>
-#include <audacious/strings.h>
 }
 
 static char* format_and_free_ti( Tuple* ti, int* length )
@@ -75,7 +73,7 @@
 
 void ModplugXMMS::Init(void)
 {
-	ConfigDb *db;
+	mcs_handle_t *db;
 	
 	db = aud_cfg_db_open();
 
@@ -199,8 +197,6 @@
 		return true;
 	if (lExt == ".ult")
 		return true;
-	if (lExt == ".j2b")
-		return true;
 	if (lExt == ".mt2")
 		return true;
 
@@ -590,7 +586,7 @@
 
 void ModplugXMMS::SetModProps(const Settings& aModProps)
 {
-	ConfigDb *db;
+	mcs_handle_t *db;
 	mModProps = aModProps;
 
 	// [Reverb level 0(quiet)-100(loud)], [delay in ms, usually 40-200ms]
--- a/src/modplug/modplugbmp.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/modplug/modplugbmp.h	Fri Jun 13 05:57:25 2008 +0300
@@ -9,10 +9,7 @@
 
 #include <string>
 #include <glib.h>
-
-#ifndef __MODPLUGXMMS_STDDEFS_H__INCLUDED__
 #include "stddefs.h"
-#endif
 
 extern "C" {
 #include <audacious/plugin.h>
--- a/src/modplug/plugin.cxx	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/modplug/plugin.cxx	Fri Jun 13 05:57:25 2008 +0300
@@ -6,7 +6,6 @@
 
 // #define AUD_DEBUG 1
 
-#include "modplug.h"
 #include "gui/main.h"
 extern "C" {
 #include <audacious/plugin.h>
@@ -82,7 +81,7 @@
 }
 
 const gchar *fmts[] =
-    { "amf", "ams", "dbm", "dbf", "dsm", "far", "mdl", "stm", "ult", "j2b", "mt2",
+    { "amf", "ams", "dbm", "dbf", "dsm", "far", "mdl", "stm", "ult", "mt2",
       "mdz", "mdr", "mdgz", "mdbz", "mod", "s3z", "s3r", "s3gz", "s3m", "xmz", "xmr", "xmgz",
       "itz", "itr", "itgz", "dmf", "umx", "it", "669", "xm", "mtm", "psm", "ft2",
       "zip", "gz", "bz2", "rar", "rb",
@@ -90,6 +89,7 @@
 
 InputPlugin gModPlug =
 {
+    /* Common plugin fields */
     NULL,
     NULL,
     (gchar *)"ModPlug Audio Plugin",
@@ -98,6 +98,8 @@
     ShowAboutBox,
     ShowConfigureBox,
     FALSE,
+
+    /* Input plugin fields */
     NULL,
     NULL,
     PlayFile,
@@ -116,8 +118,6 @@
     ShowFileInfoBox,
     NULL,   // output
     GetSongTuple,
-    NULL,
-    NULL,
     CanPlayFileFromVFS, // vfs
     (gchar **)fmts,
     NULL,
--- a/src/modplug/sndfile.cxx	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/modplug/sndfile.cxx	Fri Jun 13 05:57:25 2008 +0300
@@ -165,7 +165,6 @@
 		 && (!ReadAMF(lpStream, dwMemLength))
 		 && (!ReadPSM(lpStream, dwMemLength))
 		 && (!ReadMT2(lpStream, dwMemLength))
-		 && (!ReadMID(lpStream, dwMemLength))
 		 && (!ReadMod(lpStream, dwMemLength))) m_nType = MOD_TYPE_NONE;
 #ifdef MMCMP_SUPPORT
 		if (bMMCmp)
--- a/src/modplug/sndfile.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/modplug/sndfile.h	Fri Jun 13 05:57:25 2008 +0300
@@ -649,9 +649,7 @@
 	BOOL ReadAMF(LPCBYTE lpStream, DWORD dwMemLength);
 	BOOL ReadMT2(LPCBYTE lpStream, DWORD dwMemLength);
 	BOOL ReadPSM(LPCBYTE lpStream, DWORD dwMemLength);
-	BOOL ReadJ2B(LPCBYTE lpStream, DWORD dwMemLength);
 	BOOL ReadUMX(LPCBYTE lpStream, DWORD dwMemLength);
-	BOOL ReadMID(LPCBYTE lpStream, DWORD dwMemLength);
 	// MOD Convert function
 	UINT GetBestSaveFormat() const;
 	UINT GetSaveFormats() const;
--- a/src/modplug/sndmix.cxx	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/modplug/sndmix.cxx	Fri Jun 13 05:57:25 2008 +0300
@@ -20,7 +20,7 @@
 // Mixing Configuration (SetWaveConfig)
 DWORD CSoundFile::gdwSysInfo = 0;
 DWORD CSoundFile::gnChannels = 1;
-DWORD CSoundFile::gdwSoundSetup = 0;
+DWORD CSoundFile::gdwSoundSetup = SNDMIX_NOBACKWARDJUMPS; // Do not allow song to loop infinitely
 DWORD CSoundFile::gdwMixingFreq = 44100;
 DWORD CSoundFile::gnBitsPerSample = 16;
 // Mixing data initialized in
@@ -275,75 +275,77 @@
 //---------------------------
 {
 	if (++m_nTickCount >= m_nMusicSpeed * (m_nPatternDelay+1) + m_nFrameDelay)
-        {
+	{
 		m_nPatternDelay = 0;
 		m_nFrameDelay = 0;
 		m_nTickCount = 0;
 		m_nRow = m_nNextRow;
-		
 		// Reset Pattern Loop Effect
-		if (m_nCurrentPattern != m_nNextPattern) {
-			if (m_nLockedPattern < MAX_ORDERS) {
-				m_nCurrentPattern = m_nLockedPattern;
-				if (!(m_dwSongFlags & SONG_ORDERLOCKED))
-					m_nLockedPattern = MAX_ORDERS;
-			} else {
-				m_nCurrentPattern = m_nNextPattern;
-			}
-
-			// Check if pattern is valid
-			if (!(m_dwSongFlags & SONG_PATTERNLOOP))
+		if (m_nCurrentPattern != m_nNextPattern) m_nCurrentPattern = m_nNextPattern;
+		// Check if pattern is valid
+		if (!(m_dwSongFlags & SONG_PATTERNLOOP))
+		{
+			m_nPattern = (m_nCurrentPattern < MAX_ORDERS) ? Order[m_nCurrentPattern] : 0xFF;
+			if ((m_nPattern < MAX_PATTERNS) && (!Patterns[m_nPattern])) m_nPattern = 0xFE;
+			while (m_nPattern >= MAX_PATTERNS)
 			{
+				// End of song ?
+				if ((m_nPattern == 0xFF) || (m_nCurrentPattern >= MAX_ORDERS))
+				{
+					//if (!m_nRepeatCount)
+						return FALSE;     //never repeat entire song
+					if (!m_nRestartPos)
+					{
+						m_nMusicSpeed = m_nDefaultSpeed;
+						m_nMusicTempo = m_nDefaultTempo;
+						m_nGlobalVolume = m_nDefaultGlobalVolume;
+						for (UINT i=0; i<MAX_CHANNELS; i++)
+						{
+							Chn[i].dwFlags |= CHN_NOTEFADE | CHN_KEYOFF;
+							Chn[i].nFadeOutVol = 0;
+							if (i < m_nChannels)
+							{
+								Chn[i].nGlobalVol = ChnSettings[i].nVolume;
+								Chn[i].nVolume = ChnSettings[i].nVolume;
+								Chn[i].nPan = ChnSettings[i].nPan;
+								Chn[i].nPanSwing = Chn[i].nVolSwing = 0;
+								Chn[i].nOldVolParam = 0;
+								Chn[i].nOldOffset = 0;
+								Chn[i].nOldHiOffset = 0;
+								Chn[i].nPortamentoDest = 0;
+								if (!Chn[i].nLength)
+								{
+									Chn[i].dwFlags = ChnSettings[i].dwFlags;
+									Chn[i].nLoopStart = 0;
+									Chn[i].nLoopEnd = 0;
+									Chn[i].pHeader = NULL;
+									Chn[i].pSample = NULL;
+									Chn[i].pInstrument = NULL;
+								}
+							}
+						}
+					}
+//					if (m_nRepeatCount > 0) m_nRepeatCount--;
+					m_nCurrentPattern = m_nRestartPos;
+					m_nRow = 0;
+					if ((Order[m_nCurrentPattern] >= MAX_PATTERNS) || (!Patterns[Order[m_nCurrentPattern]])) return FALSE;
+				} else
+				{
+					m_nCurrentPattern++;
+				}
 				m_nPattern = (m_nCurrentPattern < MAX_ORDERS) ? Order[m_nCurrentPattern] : 0xFF;
 				if ((m_nPattern < MAX_PATTERNS) && (!Patterns[m_nPattern])) m_nPattern = 0xFE;
-				while (m_nPattern >= MAX_PATTERNS)
-				{
-					// End of song ?
-					if ((m_nPattern == 0xFF) || (m_nCurrentPattern >= MAX_ORDERS))
-					{
-						if (m_nRepeatCount > 0) m_nRepeatCount--;
-						if (!m_nRepeatCount) return FALSE;
-						m_nCurrentPattern = m_nRestartPos;
-						if ((Order[m_nCurrentPattern] >= MAX_PATTERNS)
-						    || (!Patterns[Order[m_nCurrentPattern]]))
-							return FALSE;
-					} else {
-						m_nCurrentPattern++;
-					}
-					m_nPattern = (m_nCurrentPattern < MAX_ORDERS) ? Order[m_nCurrentPattern] : 0xFF;
-					if ((m_nPattern < MAX_PATTERNS) && (!Patterns[m_nPattern])) m_nPattern = 0xFE;
-				}
-				m_nNextPattern = m_nCurrentPattern;
-			} else if (m_nCurrentPattern < 255) {
-				if (m_nRepeatCount > 0) m_nRepeatCount--;
-				if (!m_nRepeatCount) return FALSE;
 			}
-		}
-#ifdef MODPLUG_TRACKER
-		if (m_dwSongFlags & SONG_STEP)
-		{
-			m_dwSongFlags &= ~SONG_STEP;
-			m_dwSongFlags |= SONG_PAUSED;
-		}
-#endif // MODPLUG_TRACKER
-		if (!PatternSize[m_nPattern] || !Patterns[m_nPattern]) {
-			/* okay, this is wrong. allocate the pattern _NOW_ */
-			Patterns[m_nPattern] = AllocatePattern(64,64);
-			PatternSize[m_nPattern] = 64;
-			PatternAllocSize[m_nPattern] = 64;
+			m_nNextPattern = m_nCurrentPattern;
 		}
 		// Weird stuff?
-		if (m_nPattern >= MAX_PATTERNS) return FALSE;
+		if ((m_nPattern >= MAX_PATTERNS) || (!Patterns[m_nPattern])) return FALSE;
 		// Should never happen
-		// ... sure it should: suppose there's a C70 effect before a 64-row pattern.
-		// It's in fact very easy to make this happen ;)
-		//       - chisel
 		if (m_nRow >= PatternSize[m_nPattern]) m_nRow = 0;
-                m_nNextRow = m_nRow + 1;
+		m_nNextRow = m_nRow + 1;
 		if (m_nNextRow >= PatternSize[m_nPattern])
 		{
 			if (!(m_dwSongFlags & SONG_PATTERNLOOP)) m_nNextPattern = m_nCurrentPattern + 1;
-			else if (m_nRepeatCount > 0) return FALSE;
 			m_nNextRow = 0;
 		}
 		// Reset channel values
@@ -351,18 +353,7 @@
 		MODCOMMAND *m = Patterns[m_nPattern] + m_nRow * m_nChannels;
 		for (UINT nChn=0; nChn<m_nChannels; pChn++, nChn++, m++)
 		{
-			/* skip realtime copyin */
-			if (pChn->nRealtime) continue;
-
-			// this is where we're going to spit out our midi
-			// commands... ALL WE DO is dump raw midi data to
-			// our super-secret "midi buffer"
-			// -mrsb
-			if (_midi_out_note)
-				_midi_out_note(nChn, m);
-
 			pChn->nRowNote = m->note;
-			if (m->instr) pChn->nLastInstr = m->instr;
 			pChn->nRowInstr = m->instr;
 			pChn->nRowVolCmd = m->volcmd;
 			pChn->nRowVolume = m->vol;
@@ -374,14 +365,6 @@
 			pChn->dwFlags &= ~(CHN_PORTAMENTO | CHN_VIBRATO | CHN_TREMOLO | CHN_PANBRELLO);
 			pChn->nCommand = 0;
 		}
-				
-	} else if (_midi_out_note) {
-		MODCOMMAND *m = Patterns[m_nPattern] + m_nRow * m_nChannels;
-		for (UINT nChn=0; nChn<m_nChannels; nChn++, m++)
-		{
-			/* m==NULL allows schism to receive notification of SDx and Scx commands */
-			_midi_out_note(nChn, 0);
-		}
 	}
 	// Should we process tick0 effects?
 	if (!m_nMusicSpeed) m_nMusicSpeed = 1;
--- a/src/modplug/tables.cxx	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/modplug/tables.cxx	Fri Jun 13 05:57:25 2008 +0300
@@ -7,10 +7,6 @@
 #include "stdafx.h"
 #include "sndfile.h"
 
-#ifndef MODPLUG_FASTSOUNDLIB
-//#pragma data_seg(".tables")
-#endif
-
 BYTE ImpulseTrackerPortaVolCmd[16] =
 {
 	0x00, 0x01, 0x04, 0x08, 0x10, 0x20, 0x40, 0x60,
--- a/src/mtp_up/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/mtp_up/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -8,5 +8,5 @@
 plugindir := ${plugindir}/${GENERAL_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${BEEP_DEFINES} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} -I../../intl -I../.. ${MTP_CFLAGS}
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${MTP_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${BEEP_DEFINES} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS}  -I../.. ${MTP_CFLAGS}
+LIBS += ${GTK_LIBS} ${GLIB_LIBS}  ${MTP_LIBS}
--- a/src/mtp_up/mtp.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/mtp_up/mtp.c	Fri Jun 13 05:57:25 2008 +0300
@@ -22,12 +22,10 @@
 #include <sys/types.h>
 #include <libmtp.h>
 #include <audacious/plugin.h>
-#include <audacious/playlist.h>
 #include <audacious/ui_plugin_menu.h>
 #include <audacious/i18n.h>
 
 #include <gtk/gtk.h>
-#include <audacious/util.h>
 #include "filetype.h"
 
 #define DEBUG 1
--- a/src/musepack/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/musepack/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -8,5 +8,5 @@
 plugindir := ${plugindir}/${INPUT_PLUGIN_DIR}
 
 CXXFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${DBUS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${TAGLIB_CFLAGS} -I../../intl -I../..
-LIBS += ${TAGLIB_LIBS} ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${MOWGLI_LIBS} -lmpcdec
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS}  ${GTK_CFLAGS} ${GLIB_CFLAGS}  ${TAGLIB_CFLAGS} -I../..
+LIBS += ${TAGLIB_LIBS} ${GTK_LIBS} ${GLIB_LIBS}  ${MOWGLI_LIBS} -lmpcdec
--- a/src/musepack/libmpc.cxx	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/musepack/libmpc.cxx	Fri Jun 13 05:57:25 2008 +0300
@@ -37,8 +37,6 @@
     mpcFileInfoBox, //Show File Info Box        [CALLBACK]
     NULL,           //Output Plugin Handle      OutputPlugin output
     mpcGetSongTuple,//Acquire tuple for song    [CALLBACK]
-    NULL,
-    NULL,
     mpcIsOurFD,
     (gchar **)mpc_fmts
 };
@@ -127,7 +125,7 @@
 
 static void mpcOpenPlugin()
 {
-    ConfigDb *cfg;
+    mcs_handle_t *cfg;
     cfg = aud_cfg_db_open();
     aud_cfg_db_get_bool(cfg, "musepack", "clipPrevention", &pluginConfig.clipPrevention);
     aud_cfg_db_get_bool(cfg, "musepack", "albumGain",      &pluginConfig.albumGain);
@@ -251,7 +249,7 @@
 
 static void saveConfigBox(GtkWidget* p_Widget, gpointer p_Data)
 {
-    ConfigDb* cfg;
+    mcs_handle_t* cfg;
     GtkToggleButton* tb;
 
     tb = GTK_TOGGLE_BUTTON(widgets.replaygainCheck);
--- a/src/musepack/libmpc.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/musepack/libmpc.h	Fri Jun 13 05:57:25 2008 +0300
@@ -8,9 +8,6 @@
 {
 #include <audacious/plugin.h>
 #include <audacious/output.h>
-#include <audacious/util.h>
-#include <audacious/configdb.h>
-#include <audacious/main.h>
 #include <audacious/i18n.h>
 }
 
--- a/src/neon/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/neon/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -9,5 +9,5 @@
 plugindir := ${plugindir}/${TRANSPORT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${DBUS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${ARCH_DEFINES} ${XML_CPPFLAGS} ${NEON_CFLAGS} -I../../intl -I../.. -D_RB_USE_GLIB
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${XML_LIBS} ${NEON_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS}  ${GTK_CFLAGS} ${GLIB_CFLAGS}  ${ARCH_DEFINES} ${XML_CPPFLAGS} ${NEON_CFLAGS} -I../.. -D_RB_USE_GLIB
+LIBS += ${GTK_LIBS} ${GLIB_LIBS}  ${XML_LIBS} ${NEON_LIBS}
--- a/src/neon/neon.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/neon/neon.c	Fri Jun 13 05:57:25 2008 +0300
@@ -20,7 +20,6 @@
 #include "neon.h"
 
 #include <audacious/plugin.h>
-#include <audacious/configdb.h>
 
 #include <ne_socket.h>
 #include <ne_utils.h>
@@ -31,10 +30,25 @@
 #include "debug.h"
 #include "rb.h"
 
-#define NBUFSIZ (128u*1024u)
-#define NETBLKSIZ (4096u)
+#define NEON_BUFSIZE        (128u*1024u)
+#define NEON_NETBLKSIZE     (4096u)
+#define NEON_ICY_BUFSIZE    (4096)
+
 
-DECLARE_PLUGIN(neon, init, fini)
+VFSFile *neon_aud_vfs_fopen_impl(const gchar* path, const gchar* mode);
+gint neon_aud_vfs_fclose_impl(VFSFile* file);
+gsize neon_aud_vfs_fread_impl(gpointer ptr_, gsize size, gsize nmemb, VFSFile* file);
+gsize neon_aud_vfs_fwrite_impl(gconstpointer ptr, gsize size, gsize nmemb, VFSFile* file);
+gint neon_aud_vfs_getc_impl(VFSFile* file);
+gint neon_aud_vfs_ungetc_impl(gint c, VFSFile* file);
+void neon_aud_vfs_rewind_impl(VFSFile* file);
+glong neon_aud_vfs_ftell_impl(VFSFile* file);
+gboolean neon_aud_vfs_feof_impl(VFSFile* file);
+gint neon_aud_vfs_truncate_impl(VFSFile* file, glong size);
+gint neon_aud_vfs_fseek_impl(VFSFile* file, glong offset, gint whence);
+gchar *neon_aud_vfs_metadata_impl(VFSFile* file, const gchar * field);
+off_t neon_aud_vfs_fsize_impl(VFSFile* file);
+
 
 VFSConstructor neon_http_const = {
     "http://",
@@ -70,94 +84,14 @@
     neon_aud_vfs_metadata_impl
 };
 
-/* bring ne_set_connect_timeout in as a weak reference, not using it
- * unless we have it available (neon 0.27) --nenolod
- */
-extern void ne_set_connect_timeout(ne_session *sess, int timeout) __attribute__ ((weak));
-
-/*
- * ========
- */
-
-static struct neon_handle* handle_init(void) {
-
-    struct neon_handle* h;
-
-    _ENTER;
-
-    if (NULL == (h = malloc(sizeof(struct neon_handle)))) {
-        _ERROR("Could not allocate memory for handle");
-        _LEAVE NULL;
-    }
-
-    h->reader = NULL;
-    h->reader_status.mutex = g_mutex_new();
-    h->reader_status.cond = g_cond_new();
-    h->reader_status.reading = FALSE;
-    h->reader_status.status = NEON_READER_INIT;
-
-    if (0 != init_rb_with_lock(&(h->rb), NBUFSIZ, h->reader_status.mutex)) {
-        _ERROR("Could not initialize buffer");
-        free(h);
-        _LEAVE NULL;
-    }
-
-    h->url = NULL;
-    h->purl = &purl;
-    memset(h->purl, 0, sizeof(ne_uri));
-    h->session = NULL;
-    h->request = NULL;
-    h->redircount = 0;
-    h->pos = 0;
-    h->content_length = -1;
-    h->can_ranges = FALSE;
-    h->icy_metaint = 0;
-    h->icy_metaleft = 0;
-    h->icy_metadata.stream_name = NULL;
-    h->icy_metadata.stream_title = NULL;
-    h->icy_metadata.stream_url = NULL;
-    h->icy_metadata.stream_contenttype = NULL;
-    h->eof = FALSE;
-
-    _LEAVE h;
-}
-
-/*
- * -----
- */
-
-static void handle_free(struct neon_handle* h) {
-
-    _ENTER;
-
-    _DEBUG("<%p> freeing handle", h);
-
-    ne_uri_free(h->purl);
-    destroy_rb(&h->rb);
-    if (NULL != h->icy_metadata.stream_name) {
-        free(h->icy_metadata.stream_name);
-    }
-    if (NULL != h->icy_metadata.stream_title) {
-        free(h->icy_metadata.stream_title);
-    }
-    if (NULL != h->icy_metadata.stream_url) {
-        free(h->icy_metadata.stream_url);
-    }
-    if (NULL != h->icy_metadata.stream_contenttype) {
-        free(h->icy_metadata.stream_contenttype);
-    }
-    free(h);
-
-    _LEAVE;
-}
 
 /*
  * ----
  */
 
-static void init(void) {
+static void neon_plugin_init(void) {
 
-    int ret;
+    gint ret;
 
     _ENTER;
 
@@ -180,7 +114,7 @@
  * -----
  */
 
-static void fini(void) {
+static void neon_plugin_fini(void) {
 
     _ENTER;
 
@@ -189,27 +123,85 @@
     _LEAVE;
 }
 
+DECLARE_PLUGIN(neon, neon_plugin_init, neon_plugin_fini)
+
+
+/*
+ * ========
+ */
+
+static struct neon_handle* handle_init(void) {
+
+    struct neon_handle* h;
+
+    _ENTER;
+
+    if (NULL == (h = g_new0(struct neon_handle, 1))) {
+        _ERROR("Could not allocate memory for handle");
+        _LEAVE NULL;
+    }
+
+    h->reader_status.mutex = g_mutex_new();
+    h->reader_status.cond = g_cond_new();
+    h->reader_status.reading = FALSE;
+    h->reader_status.status = NEON_READER_INIT;
+
+    if (0 != init_rb_with_lock(&(h->rb), NEON_BUFSIZE, h->reader_status.mutex)) {
+        _ERROR("Could not initialize buffer");
+        g_free(h);
+        _LEAVE NULL;
+    }
+
+    h->purl = g_new0(ne_uri, 1);
+    h->content_length = -1;
+
+    _LEAVE h;
+}
+
 /*
  * -----
  */
 
+static void handle_free(struct neon_handle* h) {
+
+    _ENTER;
+
+    _DEBUG("<%p> freeing handle", h);
+
+    ne_uri_free(h->purl);
+    g_free(h->purl);
+    destroy_rb(&h->rb);
+    g_free(h->icy_metadata.stream_name);
+    g_free(h->icy_metadata.stream_title);
+    g_free(h->icy_metadata.stream_url);
+    g_free(h->icy_metadata.stream_contenttype);
+    g_free(h);
+
+    _LEAVE;
+}
+
+/*
+ * -----
+ */
+static gboolean neon_strcmp(const gchar *str, const gchar *cmp)
+{
+    return (g_ascii_strncasecmp(str, cmp, strlen(cmp)) == 0);
+}
+
+
 static void add_icy(struct icy_metadata* m, gchar* name, gchar* value) { 
 
     _ENTER;
 
-    if (0 == g_ascii_strncasecmp(name, "StreamTitle", 11)) {
+    if (neon_strcmp(name, "StreamTitle")) {
         _DEBUG("Found StreamTitle: %s", value);
-        if (NULL != m->stream_title) {
-            free(m->stream_title);
-        }
+        g_free(m->stream_title);
         m->stream_title = g_strdup(value);
     }
 
-    if (0 == g_ascii_strncasecmp(name, "StreamUrl", 9)) {
+    if (neon_strcmp(name, "StreamUrl")) {
         _DEBUG("Found StreamUrl: %s", value);
-        if (NULL != m->stream_url) {
-            free(m->stream_url);
-        }
+        g_free(m->stream_url);
         m->stream_url = g_strdup(value);
     }
 
@@ -220,15 +212,15 @@
  * -----
  */
 
-static void parse_icy(struct icy_metadata* m, gchar* metadata, int len) {
+static void parse_icy(struct icy_metadata* m, gchar* metadata, gint len) {
 
     gchar* p;
     gchar* tstart;
     gchar* tend;
-    gchar name[4096];
-    gchar value[4096];
-    int state;
-    int pos;
+    gchar name[NEON_ICY_BUFSIZE];
+    gchar value[NEON_ICY_BUFSIZE];
+    gint state;
+    gint pos;
 
     _ENTER;
 
@@ -250,7 +242,7 @@
                      * End of tag name.
                      */
                     *p = '\0';
-                    g_strlcpy(name, tstart, 4096);
+                    g_strlcpy(name, tstart, NEON_ICY_BUFSIZE);
                     _DEBUG("Found tag name: %s", name);
                     state = 2;
                 } else {
@@ -274,12 +266,12 @@
                 /*
                  * Reading value
                  */
-                if ('\'' == *p) {
+                if ('\'' == *p && ';' == *(p+1)) {
                     /*
                      * End of value
                      */
                     *p = '\0';
-                    g_strlcpy(value, tstart, 4096);
+                    g_strlcpy(value, tstart, NEON_ICY_BUFSIZE);
                     _DEBUG("Found tag value: %s", value);
                     add_icy(m, name, value);
                     state = 4;
@@ -324,6 +316,10 @@
 
     _ENTER;
 
+    if (NULL == h) {
+        _LEAVE;
+    }
+
     _DEBUG("Signaling reader thread to terminate");
     g_mutex_lock(h->reader_status.mutex);
     h->reader_status.reading = FALSE;
@@ -334,6 +330,8 @@
     g_thread_join(h->reader);
     _DEBUG("Reader thread has died");
     h->reader = NULL;
+
+    _LEAVE;
 }
 
 /*
@@ -365,17 +363,17 @@
     if ((strlen(authtok[1]) > (NE_ABUFSIZ-1)) || (strlen(authtok[0]) > (NE_ABUFSIZ-1))) {
         _ERROR("Username/Password too long");
         g_strfreev(authtok);
-        free(authcpy);
+        g_free(authcpy);
         _LEAVE 1;
     }
 
-    strncpy(username, authtok[0], NE_ABUFSIZ);
-    strncpy(password, authtok[1], NE_ABUFSIZ);
+    g_strlcpy(username, authtok[0], NE_ABUFSIZ);
+    g_strlcpy(password, authtok[1], NE_ABUFSIZ);
 
     _DEBUG("Authenticating: Username: %s, Password: %s", username, password);
 
     g_strfreev(authtok);
-    free(authcpy);
+    g_free(authcpy);
 
     _LEAVE attempt;
 }
@@ -397,7 +395,7 @@
     _DEBUG("Header responses:");
     while(NULL != (cursor = ne_response_header_iterate(h->request, cursor, &name, &value))) {
         _DEBUG("HEADER: %s: %s", name, value);
-        if (0 == g_ascii_strncasecmp("accept-ranges", name, 13)) {
+        if (neon_strcmp(name, "accept-ranges")) {
             /*
              * The server advertises range capability. we need "bytes"
              */
@@ -409,7 +407,7 @@
             continue;
         }
 
-        if (0 == g_ascii_strncasecmp("content-length", name, 14)) {
+        if (neon_strcmp(name, "content-length")) {
             /*
              * The server sent us the content length. Parse and store.
              */
@@ -427,20 +425,18 @@
             continue;
         }
 
-        if (0 == g_ascii_strncasecmp("content-type", name, 12)) {
+        if (neon_strcmp(name, "content-type")) {
             /*
              * The server sent us a content type. Save it for later
              */
             _DEBUG("Content-Type: %s", value);
-            if (NULL != h->icy_metadata.stream_contenttype) {
-                free(h->icy_metadata.stream_contenttype);
-            }
+            g_free(h->icy_metadata.stream_contenttype);
             h->icy_metadata.stream_contenttype = g_strdup(value);
 
             continue;
         }
 
-        if (0 == g_ascii_strncasecmp("icy-metaint", name, 11)) {
+        if (neon_strcmp(name, "icy-metaint")) {
             /*
              * The server sent us a ICY metaint header. Parse and store.
              */
@@ -459,14 +455,12 @@
             continue;
         }
 
-        if (0 == g_ascii_strncasecmp("icy-name", name, 8)) {
+        if (neon_strcmp(name, "icy-name")) {
             /*
              * The server sent us a ICY name. Save it for later
              */
             _DEBUG("ICY stream name: %s", value);
-            if (NULL != h->icy_metadata.stream_name) {
-                free(h->icy_metadata.stream_name);
-            }
+            g_free(h->icy_metadata.stream_name);
             h->icy_metadata.stream_name = g_strdup(value);
         }
 
@@ -482,7 +476,7 @@
 
 static int neon_proxy_auth_cb(void *userdata, const char *realm, int attempt, char *username, char *password) {
 
-    ConfigDb *db;
+    mcs_handle_t *db;
     gchar *value = NULL;
 
     _ENTER;
@@ -515,7 +509,7 @@
  * -----
  */
 
-static int open_request(struct neon_handle* handle, unsigned long startbyte) {
+static int open_request(struct neon_handle* handle, gulong startbyte) {
 
     int ret;
     const ne_status* status;
@@ -531,7 +525,9 @@
         handle->request = ne_request_create(handle->session, "GET", handle->purl->path);
     }
 
-    ne_print_request_header(handle->request, "Range", "bytes=%ld-", startbyte);
+    if (0 < startbyte) {
+        ne_print_request_header(handle->request, "Range", "bytes=%ld-", startbyte);
+    }
     ne_print_request_header(handle->request, "Icy-MetaData", "1");
 
     /*
@@ -570,13 +566,15 @@
 
     switch (ret) {
         case NE_OK:
-            /* URL opened OK */
-            _DEBUG("<%p> URL opened OK", handle);
-            handle->content_start = startbyte;
-            handle->pos = startbyte;
-            handle_headers(handle);
-            _LEAVE 0;
-            break;
+            if ((status->code > 199) && (status->code < 300)) {
+                /* URL opened OK */
+                _DEBUG("<%p> URL opened OK", handle);
+                handle->content_start = startbyte;
+                handle->pos = startbyte;
+                handle_headers(handle);
+                _LEAVE 0;
+                break;
+            }
 
         case NE_REDIRECT:
             /* We hit a redirect. Handle it. */
@@ -596,7 +594,7 @@
 
         default:
             /* Something went wrong. */
-            _ERROR("<%p> Could not open URL: %d", handle, ret);
+            _ERROR("<%p> Could not open URL: %d (%d)", handle, ret, status->code);
             if (1 == ret) {
                 _ERROR("<%p> neon error string: %s", handle, ne_get_error(handle->session));
             }
@@ -610,14 +608,14 @@
  * -----
  */
 
-static int open_handle(struct neon_handle* handle, unsigned long startbyte) {
+static gint open_handle(struct neon_handle* handle, gulong startbyte) {
 
-    int ret;
-    ConfigDb* db;
+    gint ret;
+    mcs_handle_t* db;
     gchar* proxy_host = NULL;
     gchar* proxy_port_s = NULL;
     gchar* endptr;
-    unsigned int proxy_port = 0;
+    guint proxy_port = 0;
     gboolean use_proxy, use_proxy_auth;
 
     _ENTER;
@@ -672,11 +670,12 @@
         ne_set_session_flag(handle->session, NE_SESSFLAG_ICYPROTO, 1);
         ne_set_session_flag(handle->session, NE_SESSFLAG_PERSIST, 0);
 
-        if (ne_set_connect_timeout != NULL)
-            ne_set_connect_timeout(handle->session, 10);
+#ifdef HAVE_NE_SET_CONNECT_TIMEOUT
+        ne_set_connect_timeout(handle->session, 10);
+#endif
 
         ne_set_read_timeout(handle->session, 10);
-        ne_set_useragent(handle->session, "Audacious/1.5.0");
+        ne_set_useragent(handle->session, "Audacious/" PACKAGE_VERSION );
 
         if (use_proxy) {
             _DEBUG("<%p> Using proxy: %s:%d", handle, proxy_host, proxy_port);
@@ -715,16 +714,16 @@
  * -----
  */
 
-static int fill_buffer(struct neon_handle* h) {
+static gint fill_buffer(struct neon_handle* h) {
 
-    ssize_t bsize;
-    char buffer[NETBLKSIZ];
-    ssize_t to_read;
+    gssize bsize;
+    gchar buffer[NEON_NETBLKSIZE];
+    gssize to_read;
 
     _ENTER;
 
     bsize = free_rb(&h->rb);
-    to_read = MIN(bsize, NETBLKSIZ);
+    to_read = MIN(bsize, NEON_NETBLKSIZE);
 
     _DEBUG("<%p> %d bytes free in buffer, trying to read %d bytes max", h, bsize, to_read);
 
@@ -754,8 +753,8 @@
 
 static int fill_buffer_limit(struct neon_handle* h, unsigned int maxfree) {
 
-    ssize_t bfree;
-    int ret;
+    gssize bfree;
+    gint ret;
 
     _ENTER;
 
@@ -771,7 +770,7 @@
             /*
              * EOF while filling the buffer. Return what we have.
              */
-            _LEAVE 0;
+            _LEAVE 1;
         }
 
         bfree = free_rb(&h->rb);
@@ -787,7 +786,7 @@
 static gpointer reader_thread(void* data) {
 
     struct neon_handle* h = (struct neon_handle*)data;
-    int ret;
+    gint ret;
 
     _ENTER;
 
@@ -796,9 +795,9 @@
     while(h->reader_status.reading) {
 
         /*
-         * Hit the network only if we have more than NETBLKSIZ of free buffer
+         * Hit the network only if we have more than NEON_NETBLKSIZE of free buffer
          */
-        if (NETBLKSIZ < free_rb_locked(&h->rb)) {
+        if (NEON_NETBLKSIZE < free_rb_locked(&h->rb)) {
             g_mutex_unlock(h->reader_status.mutex);
 
             _DEBUG("<%p> Filling buffer...", h);
@@ -853,7 +852,6 @@
  */
 
 VFSFile* neon_aud_vfs_fopen_impl(const gchar* path, const gchar* mode) {
-
     VFSFile* file;
     struct neon_handle* handle;
 
@@ -868,7 +866,7 @@
 
     if (NULL == (handle = handle_init())) {
         _ERROR("Could not allocate memory for neon handle");
-        free(file);
+        g_free(file);
         _LEAVE NULL;
     }
 
@@ -877,14 +875,14 @@
     if (NULL == (handle->url = strdup(path))) {
         _ERROR("<%p> Could not copy URL string", handle);
         handle_free(handle);
-        free(file);
+        g_free(file);
         _LEAVE NULL;
     }
 
     if (0 != open_handle(handle, 0)) {
         _ERROR("<%p> Could not open URL", handle);
         handle_free(handle);
-        free(file);
+        g_free(file);
         _LEAVE NULL;
     }
 
@@ -925,14 +923,14 @@
  * -----
  */
 
-size_t neon_aud_vfs_fread_impl(gpointer ptr_, size_t size, size_t nmemb, VFSFile* file) {
+gsize neon_aud_vfs_fread_impl(gpointer ptr_, gsize size, gsize nmemb, VFSFile* file) {
 
     struct neon_handle* h = (struct neon_handle*)file->handle;
-    int belem;
-    int relem;
-    int ret;
-    char icy_metadata[4096];
-    unsigned char icy_metalen;
+    gint belem;
+    gint relem;
+    gint ret;
+    gchar icy_metadata[NEON_ICY_BUFSIZE];
+    guchar icy_metalen;
 
     _ENTER;
 
@@ -979,36 +977,45 @@
     }
 
     if (NULL == h->reader) {
-        /*
-         * There is no reader thread yet. Read the first bytes from
-         * the network ourselves, and then fire up the reader thread
-         * to keep the buffer filled up.
-         */
-        _DEBUG("<%p> Doing initial buffer fill", h);
-        ret = fill_buffer_limit(h, NBUFSIZ/2);
+        if (NEON_READER_EOF != h->reader_status.status) {
+            /*
+             * There is no reader thread yet. Read the first bytes from
+             * the network ourselves, and then fire up the reader thread
+             * to keep the buffer filled up.
+             */
+            _DEBUG("<%p> Doing initial buffer fill", h);
+            ret = fill_buffer_limit(h, NEON_BUFSIZE/2);
+
+            if (-1 == ret) {
+                _ERROR("<%p> Error while reading from the network", h);
+                _LEAVE 0;
+            } else if (1 == ret) {
+                _DEBUG("<%p> EOF during initial read", h);
+            }
 
-        if (-1 == ret) {
-            _ERROR("<%p> Error while reading from the network", h);
-            _LEAVE 0;
-        } else if (1 == ret) {
-            _ERROR("<%p> EOF during initial read", h);
-            _LEAVE 0;
+            /*
+             * We have some data in the buffer now.
+             * Start the reader thread if we did not reach EOF during
+             * the initial fill
+             */
+            g_mutex_lock(h->reader_status.mutex);
+            if (0 == ret) {
+                h->reader_status.reading = TRUE;
+                _DEBUG("<%p> Starting reader thread", h);
+                if (NULL == (h->reader = g_thread_create(reader_thread, h, TRUE, NULL))) {
+                    h->reader_status.reading = FALSE;
+                    g_mutex_unlock(h->reader_status.mutex);
+                    _ERROR("<%p> Error creating reader thread!", h);
+                    _LEAVE 0;
+                }
+                h->reader_status.status = NEON_READER_RUN;
+            } else {
+                _DEBUG("<%p> No reader thread needed (stream has reached EOF during fill)", h);
+                h->reader_status.reading = FALSE;
+                h->reader_status.status = NEON_READER_EOF;
+            }
+            g_mutex_unlock(h->reader_status.mutex);
         }
-
-        /*
-         * We have some data in the buffer now.
-         * Start the reader thread.
-         */
-        g_mutex_lock(h->reader_status.mutex);
-        h->reader_status.reading = TRUE;
-        if (NULL == (h->reader = g_thread_create(reader_thread, h, TRUE, NULL))) {
-            h->reader_status.reading = FALSE;
-            g_mutex_unlock(h->reader_status.mutex);
-            _ERROR("<%p> Error creating reader thread!", h);
-            _LEAVE 0;
-        }
-        h->reader_status.status = NEON_READER_RUN;
-        g_mutex_unlock(h->reader_status.mutex);
     } else {
         /*
          * There already is a reader thread. Look if it is in good
@@ -1116,9 +1123,16 @@
     /*
      * Signal the network thread to continue reading
      */
-    _DEBUG("<%p> Waking up reader thread", h);
     g_mutex_lock(h->reader_status.mutex);
-    g_cond_signal(h->reader_status.cond);
+    if (NEON_READER_EOF == h->reader_status.status) {
+        if (0 == free_rb_locked(&h->rb)) {
+            _DEBUG("<%p> stream EOF reached and buffer empty", h);
+            h->eof = TRUE;
+        }
+    } else {
+        _DEBUG("<%p> Waking up reader thread", h);
+        g_cond_signal(h->reader_status.cond);
+    }
     g_mutex_unlock(h->reader_status.mutex);
 
     h->pos += (relem*size);
@@ -1134,7 +1148,7 @@
  * -----
  */
 
-size_t neon_aud_vfs_fwrite_impl(gconstpointer ptr, size_t size, size_t nmemb, VFSFile* file) {
+gsize neon_aud_vfs_fwrite_impl(gconstpointer ptr, gsize size, gsize nmemb, VFSFile* file) {
 
     _ENTER;
 
@@ -1212,6 +1226,8 @@
 
     _ENTER;
 
+    _DEBUG("<%p> EOF status: %s", h, h->eof?"TRUE":"FALSE");
+
     _LEAVE h->eof;
 }
 
@@ -1274,7 +1290,7 @@
 	_LEAVE -1;
     }
 
-    if (newpos > content_length) {
+    if (newpos >= content_length) {
         _ERROR("<%p> Can not seek beyond end of stream", h);
         _LEAVE -1;
     }
@@ -1333,15 +1349,15 @@
 
     _DEBUG("<%p> Field name: %s", h, field);
 
-    if (0 == g_ascii_strncasecmp(field, "track-name", 10)) {
+    if (neon_strcmp(field, "track-name")) {
         _LEAVE g_strdup(h->icy_metadata.stream_title);
     }
 
-    if (0 == g_ascii_strncasecmp(field, "stream-name", 11)) {
+    if (neon_strcmp(field, "stream-name")) {
         _LEAVE g_strdup(h->icy_metadata.stream_name);
     }
 
-    if (0 == g_ascii_strncasecmp(field, "content-type", 12)) {
+    if (neon_strcmp(field, "content-type")) {
         _LEAVE g_strdup(h->icy_metadata.stream_contenttype);
     }
 
@@ -1365,3 +1381,6 @@
 
     _LEAVE (h->content_start + h->content_length);
 }
+
+
+
--- a/src/neon/neon.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/neon/neon.h	Fri Jun 13 05:57:25 2008 +0300
@@ -29,26 +29,6 @@
 #include <ne_uri.h>
 #include "rb.h"
 
-
-static void init(void);
-static void fini(void);
-
-VFSFile *neon_aud_vfs_fopen_impl(const gchar* path, const gchar* mode);
-gint neon_aud_vfs_fclose_impl(VFSFile* file);
-size_t neon_aud_vfs_fread_impl(gpointer ptr_, size_t size, size_t nmemb, VFSFile* file);
-size_t neon_aud_vfs_fwrite_impl(gconstpointer ptr, size_t size, size_t nmemb, VFSFile* file);
-gint neon_aud_vfs_getc_impl(VFSFile* file);
-gint neon_aud_vfs_ungetc_impl(gint c, VFSFile* file);
-void neon_aud_vfs_rewind_impl(VFSFile* file);
-glong neon_aud_vfs_ftell_impl(VFSFile* file);
-gboolean neon_aud_vfs_feof_impl(VFSFile* file);
-gint neon_aud_vfs_truncate_impl(VFSFile* file, glong size);
-gint neon_aud_vfs_fseek_impl(VFSFile* file, glong offset, gint whence);
-gchar *neon_aud_vfs_metadata_impl(VFSFile* file, const gchar * field);
-off_t neon_aud_vfs_fsize_impl(VFSFile* file);
-
-ne_uri purl;
-
 typedef enum {
     NEON_READER_INIT=0,
     NEON_READER_RUN=1,
@@ -75,13 +55,13 @@
     gchar* url;                         /* The URL, as passed to us */
     ne_uri* purl;                       /* The URL, parsed into a structure */
     struct ringbuf rb;                  /* Ringbuffer for our data */
-    unsigned char redircount;           /* Redirect count for the opened URL */
+    guchar redircount;                  /* Redirect count for the opened URL */
     long pos;                           /* Current position in the stream (number of last byte delivered to the player) */
-    unsigned long content_start;        /* Start position in the stream */
+    gulong content_start;               /* Start position in the stream */
     long content_length;                /* Total content length, counting from content_start, if known. -1 if unknown */
     gboolean can_ranges;                /* TRUE if the webserver advertised accept-range: bytes */
-    unsigned long icy_metaint;          /* Interval in which the server will send metadata announcements. 0 if no announcments */
-    unsigned long icy_metaleft;         /* Bytes left until the next metadata block */
+    gulong icy_metaint;                 /* Interval in which the server will send metadata announcements. 0 if no announcments */
+    gulong icy_metaleft;                /* Bytes left until the next metadata block */
     struct icy_metadata icy_metadata;   /* Current ICY metadata */
     ne_session* session;
     ne_request* request;
--- a/src/neon/rb.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/neon/rb.c	Fri Jun 13 05:57:25 2008 +0300
@@ -125,11 +125,11 @@
     }
     rb->size = size;
 
-    #ifdef _RB_USE_GLIB
+#ifdef _RB_USE_GLIB
     if (NULL == (rb->lock = g_mutex_new())) {
         _LEAVE -1;
     }
-    #else
+#else
     if (NULL == (rb->lock = malloc(sizeof(pthread_mutex_t)))) {
         _LEAVE -1;
     }
@@ -138,7 +138,7 @@
         free(rb->lock);
         _LEAVE -1;
     }
-    #endif
+#endif
     rb->_free_lock = 1;
 
     reset_rb(rb);
--- a/src/null/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/null/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -8,5 +8,5 @@
 plugindir := ${plugindir}/${OUTPUT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${DBUS_CFLAGS} ${MOWGLI_CFLAGS} -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS}   ${MOWGLI_CFLAGS} -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS} 
--- a/src/null/null.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/null/null.c	Fri Jun 13 05:57:25 2008 +0300
@@ -19,14 +19,11 @@
  *  along with this program; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
-
+#include "config.h"
 #include <glib.h>
-#include <audacious/i18n.h>
 #include <gtk/gtk.h>
 #include <audacious/plugin.h>
-#include <audacious/util.h>
-#include <audacious/configdb.h>
-#include "../../config.h"
+#include <audacious/i18n.h>
 
 static GTimer *timer;
 static gulong offset_time, written;
@@ -44,7 +41,7 @@
 
 static void null_init(void)
 {
-	ConfigDb *db;
+	mcs_handle_t *db;
 	db = aud_cfg_db_open();
 	aud_cfg_db_get_bool(db, "null", "real_time", &real_time);
 	aud_cfg_db_close(db);
@@ -73,7 +70,7 @@
 
 static void null_configure_ok_cb(GtkButton *w, gpointer data)
 {
-	ConfigDb *db;
+	mcs_handle_t *db;
 
 	db = aud_cfg_db_open();
 	real_time = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data));
--- a/src/paranormal-ng/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/paranormal-ng/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -29,5 +29,5 @@
 plugindir := ${plugindir}/${VISUALIZATION_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${DBUS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${ARCH_DEFINES} ${XML_CPPFLAGS} ${SDL_CFLAGS} -I../../intl -I../.. -I.
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${XML_LIBS} ${SDL_LIBS} -lGL -lGLU
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS}  ${GTK_CFLAGS} ${GLIB_CFLAGS}  ${ARCH_DEFINES} ${XML_CPPFLAGS} ${SDL_CFLAGS} -I../.. -I.
+LIBS += ${GTK_LIBS} ${GLIB_LIBS}  ${XML_LIBS} ${SDL_LIBS} -lGL -lGLU
--- a/src/paranormal-ng/cfg.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/paranormal-ng/cfg.c	Fri Jun 13 05:57:25 2008 +0300
@@ -368,7 +368,7 @@
       static const char *fname;
       struct pn_actuator *a;
       GtkCTreeNode *root;
-      ConfigDb *db;
+      mcs_handle_t *db;
 
       db = aud_cfg_db_open();
       fname = (char *) gtk_file_selection_get_filename (selector);
@@ -392,7 +392,7 @@
 load_button_cb (GtkButton *button, gpointer data)
 {
   GtkWidget *selector;
-  ConfigDb *db;
+  mcs_handle_t *db;
   gchar *last_path;
 
   db = aud_cfg_db_open();
--- a/src/paranormal-ng/plugin.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/paranormal-ng/plugin.c	Fri Jun 13 05:57:25 2008 +0300
@@ -38,7 +38,6 @@
 
 #include <gtk/gtk.h>
 #include <audacious/plugin.h>
-#include <audacious/util.h>
 #include <SDL/SDL.h>
 #include <SDL/SDL_thread.h>
 
--- a/src/paranormal/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/paranormal/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -29,5 +29,5 @@
 plugindir := ${plugindir}/${VISUALIZATION_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${DBUS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${ARCH_DEFINES} ${XML_CPPFLAGS} ${SDL_CFLAGS} -I../../intl -I../.. -I.
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${XML_LIBS} ${SDL_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS}  ${GTK_CFLAGS} ${GLIB_CFLAGS}  ${ARCH_DEFINES} ${XML_CPPFLAGS} ${SDL_CFLAGS} -I../.. -I.
+LIBS += ${GTK_LIBS} ${GLIB_LIBS}  ${XML_LIBS} ${SDL_LIBS}
--- a/src/paranormal/cfg.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/paranormal/cfg.c	Fri Jun 13 05:57:25 2008 +0300
@@ -368,7 +368,7 @@
       static const char *fname;
       struct pn_actuator *a;
       GtkCTreeNode *root;
-      ConfigDb *db;
+      mcs_handle_t *db;
 
       db = aud_cfg_db_open();
       fname = (char *) gtk_file_selection_get_filename (selector);
@@ -392,7 +392,7 @@
 load_button_cb (GtkButton *button, gpointer data)
 {
   GtkWidget *selector;
-  ConfigDb *db;
+  mcs_handle_t *db;
   gchar *last_path;
 
   db = aud_cfg_db_open();
--- a/src/paranormal/plugin.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/paranormal/plugin.c	Fri Jun 13 05:57:25 2008 +0300
@@ -38,7 +38,6 @@
 
 #include <gtk/gtk.h>
 #include <audacious/plugin.h>
-#include <audacious/util.h>
 #include <SDL.h>
 #include <SDL_thread.h>
 
--- a/src/pls/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/pls/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -7,5 +7,5 @@
 plugindir := ${plugindir}/${CONTAINER_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${DBUS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${ARCH_DEFINES} ${XML_CPPFLAGS} -I../../intl -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${XML_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS}  ${GTK_CFLAGS} ${GLIB_CFLAGS}  ${ARCH_DEFINES} ${XML_CPPFLAGS} -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS}  ${XML_LIBS}
--- a/src/pls/pls.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/pls/pls.c	Fri Jun 13 05:57:25 2008 +0300
@@ -33,18 +33,13 @@
 #include <sys/stat.h>
 #include <sys/errno.h>
 
-#include <audacious/main.h>
-#include <audacious/util.h>
-#include <audacious/playlist.h>
-#include <audacious/playlist_container.h>
 #include <audacious/plugin.h>
-#include <audacious/strings.h>
 
 static void
 playlist_load_pls(const gchar * filename, gint pos)
 {
     guint i, count, added_count = 0;
-    gchar line_key[10], title_key[10];
+    gchar line_key[16], title_key[16];
     gchar *line, *title;
     Playlist *playlist = aud_playlist_get_active();
     gchar *uri = NULL;
--- a/src/projectm-1.0/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/projectm-1.0/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -10,5 +10,5 @@
 
 CFLAGS += ${PLUGIN_CFLAGS}
 CXXFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${DBUS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${ARCH_DEFINES} ${XML_CPPFLAGS} ${GTKGLEXT_CFLAGS} ${LIBPROJECTM1_CFLAGS} -I../../intl -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${GTKGLEXT_LIBS} ${LIBPROJECTM1_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS}  ${GTK_CFLAGS} ${GLIB_CFLAGS}  ${ARCH_DEFINES} ${XML_CPPFLAGS} ${GTKGLEXT_CFLAGS} ${LIBPROJECTM1_CFLAGS} -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS}  ${GTKGLEXT_LIBS} ${LIBPROJECTM1_LIBS}
--- a/src/projectm-1.0/gtk_projectm_impl.cxx	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/projectm-1.0/gtk_projectm_impl.cxx	Fri Jun 13 05:57:25 2008 +0300
@@ -86,7 +86,7 @@
     g_return_if_fail(priv != NULL);
     g_return_if_fail(priv->pm != NULL);
 
-    priv->pm->pcm->addPCM16(pcm_data);
+    priv->pm->pcm()->addPCM16(pcm_data);
 }
 
 extern "C" void
--- a/src/projectm/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/projectm/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -9,5 +9,5 @@
 plugindir := ${plugindir}/${VISUALIZATION_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${DBUS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${ARCH_DEFINES} ${XML_CPPFLAGS} ${SDL_CFLAGS} ${LIBPROJECTM_CFLAGS} -I../../intl -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${SDL_LIBS} ${LIBPROJECTM_LIBS} -lprojectM
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS}  ${GTK_CFLAGS} ${GLIB_CFLAGS}  ${ARCH_DEFINES} ${XML_CPPFLAGS} ${SDL_CFLAGS} ${LIBPROJECTM_CFLAGS} -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS}  ${SDL_LIBS} ${LIBPROJECTM_LIBS} -lprojectM
--- a/src/projectm/main.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/projectm/main.c	Fri Jun 13 05:57:25 2008 +0300
@@ -35,7 +35,6 @@
 #include <string.h>
 #include <stdlib.h>
 #include <gtk/gtk.h>
-#include <audacious/util.h>
 #include <SDL/SDL.h>
 #include <SDL/SDL_thread.h>
 #include <GL/gl.h>
--- a/src/pulse_audio/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/pulse_audio/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -8,5 +8,5 @@
 plugindir := ${plugindir}/${OUTPUT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${BEEP_DEFINES} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} -I../../intl -I../..
-LIBS += -lpulse ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${BEEP_DEFINES} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS}  -I../..
+LIBS += -lpulse ${GTK_LIBS} ${GLIB_LIBS} 
--- a/src/pulse_audio/pulse_audio.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/pulse_audio/pulse_audio.c	Fri Jun 13 05:57:25 2008 +0300
@@ -28,8 +28,6 @@
 
 #include <gtk/gtk.h>
 #include <audacious/plugin.h>
-#include <audacious/playlist.h>
-#include <audacious/util.h>
 #include <audacious/i18n.h>
 
 #include <pulse/pulseaudio.h>
--- a/src/rocklight/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/rocklight/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -10,5 +10,5 @@
 plugindir := ${plugindir}/${VISUALIZATION_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} -I../../intl -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS}  -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS} 
--- a/src/rootvis/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/rootvis/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -13,5 +13,5 @@
 plugindir := ${plugindir}/${VISUALIZATION_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${IMLIB2_CFLAGS} -I.
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${IMLIB2_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS}  ${IMLIB2_CFLAGS} -I.
+LIBS += ${GTK_LIBS} ${GLIB_LIBS}  ${IMLIB2_LIBS}
--- a/src/rootvis/config_backend.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/rootvis/config_backend.c	Fri Jun 13 05:57:25 2008 +0300
@@ -1,8 +1,7 @@
 #include <string.h>
-#include <audacious/configdb.h>
-
-#include <rootvis.h>
-#include <config.h>
+#include <audacious/plugin.h>
+#include "rootvis.h"
+#include "config.h"
 
 extern void config_def_init(void);
 extern void config_frontend_init(void);
@@ -37,7 +36,7 @@
 	}
 }
 
-void cval_writefile(struct config_value val, ConfigDb *fp, char* sect)
+void cval_writefile(struct config_value val, mcs_handle_t *fp, char* sect)
 {
 	switch (val.type)
 	{
@@ -60,7 +59,7 @@
 	}
 }
 
-void cval_readfile(struct config_value val, ConfigDb *fp, char* sect)
+void cval_readfile(struct config_value val, mcs_handle_t *fp, char* sect)
 {
 	switch (val.type)
 	{
@@ -93,7 +92,7 @@
 // after the configuration dialogue is finished, this won't be necessary any more
 void config_read(int number) {
 	int i, j;
-	ConfigDb *fp;
+	mcs_handle_t *fp;
 
 	fp = aud_cfg_db_open();
 
@@ -120,7 +119,7 @@
 
 void config_write(int number) {
 	int i, j;
-	ConfigDb *fp;
+	mcs_handle_t *fp;
 
 	print_status("Writing configuration");
 	fp = aud_cfg_db_open();
--- a/src/rootvis/config_frontend.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/rootvis/config_frontend.c	Fri Jun 13 05:57:25 2008 +0300
@@ -1,9 +1,7 @@
 #include <stdarg.h>
 #include <string.h>
-
-#include <rootvis.h>
-
-#include <config_frontend.h>
+#include "rootvis.h"
+#include "config_frontend.h"
 
 extern GtkWidget *frontend_create_channel(int channel);
 extern GtkWidget *frontend_create_main(void);
--- a/src/rootvis/config_frontend.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/rootvis/config_frontend.h	Fri Jun 13 05:57:25 2008 +0300
@@ -1,4 +1,4 @@
-#include <config.h>
+#include "config.h"
 
 #define VBOX  	1
 #define HBOX  	2
--- a/src/rootvis/rootvis.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/rootvis/rootvis.h	Fri Jun 13 05:57:25 2008 +0300
@@ -4,7 +4,6 @@
 #include <X11/Xatom.h>
 #include <X11/Xproto.h>
 #include <audacious/plugin.h>
-#include <audacious/util.h>
 
 
 /* following values are used if there is no user configuration */
--- a/src/scrobbler/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/scrobbler/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -3,7 +3,6 @@
 SRCS = fmt.c			\
        configure.c		\
        gtkstuff.c		\
-       md5.c			\
        scrobbler.c		\
        gerpok.c			\
        plugin.c
@@ -19,5 +18,6 @@
 plugindir := ${plugindir}/${GENERAL_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${DBUS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${BEEP_DEFINES} ${CURL_CFLAGS} -I../../intl -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${CURL_LIBS} ${MUSICBRAINZ_LIBS} ${MOWGLI_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS}  ${GTK_CFLAGS} ${GLIB_CFLAGS}  ${BEEP_DEFINES} ${CURL_CFLAGS} -I../..
+LDFLAGS += ${AUDLDFLAGS}
+LIBS += ${GTK_LIBS} ${GLIB_LIBS}  ${CURL_LIBS} ${MUSICBRAINZ_LIBS} ${MOWGLI_LIBS} -laudutil
--- a/src/scrobbler/configure.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/scrobbler/configure.c	Fri Jun 13 05:57:25 2008 +0300
@@ -1,10 +1,6 @@
 #include "settings.h"
 
-#include <config.h>
-
-#include <audacious/util.h>
-#include <audacious/plugin.h>
-#include <audacious/configdb.h>
+#include "config.h"
 
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -12,9 +8,9 @@
 #include <string.h>
 #include <stdio.h>
 
-#include "md5.h"
-
 #include <glib.h>
+#include <audacious/plugin.h>
+#include <audacious/audutil.h>
 #include <audacious/i18n.h>
 
 #include <gdk/gdkkeysyms.h>
@@ -46,7 +42,7 @@
 
 static void saveconfig(void)
 {
-    ConfigDb *cfgfile;
+    mcs_handle_t *cfgfile;
 
     const char *uid = gtk_entry_get_text(GTK_ENTRY(entry1));
     const char *pwd = gtk_entry_get_text(GTK_ENTRY(entry2));
@@ -54,16 +50,16 @@
     const char *ge_pwd = gtk_entry_get_text(GTK_ENTRY(ge_entry2));
 
     if ((cfgfile = aud_cfg_db_open())) {
-        md5_state_t md5state;
+        aud_md5state_t md5state;
         unsigned char md5pword[16], ge_md5pword[16];
 
         if (uid != NULL && uid[0] != '\0' && strlen(uid) &&
             pwd != NULL && pwd[0] != '\0' && strlen(pwd))
         {
             aud_cfg_db_set_string(cfgfile, "audioscrobbler", "username", (char *)uid);
-            md5_init(&md5state);
-            md5_append(&md5state, (unsigned const char *)pwd, strlen(pwd));
-            md5_finish(&md5state, md5pword);
+            aud_md5_init(&md5state);
+            aud_md5_append(&md5state, (unsigned const char *)pwd, strlen(pwd));
+            aud_md5_finish(&md5state, md5pword);
             aud_cfg_db_set_string(cfgfile, "audioscrobbler", "password",
                                  hexify((char*)md5pword, sizeof(md5pword)));
         } else if (!uid || uid[0] == '\0') {
@@ -75,9 +71,9 @@
             ge_pwd != NULL && ge_pwd[0] != '\0' && strlen(ge_pwd))
         {
             aud_cfg_db_set_string(cfgfile, "audioscrobbler", "ge_username", (char *)ge_uid);
-            md5_init(&md5state);
-            md5_append(&md5state, (unsigned const char *)ge_pwd, strlen(ge_pwd));
-            md5_finish(&md5state, ge_md5pword);
+            aud_md5_init(&md5state);
+            aud_md5_append(&md5state, (unsigned const char *)ge_pwd, strlen(ge_pwd));
+            aud_md5_finish(&md5state, ge_md5pword);
             aud_cfg_db_set_string(cfgfile, "audioscrobbler", "ge_password",
                                   hexify((char*)ge_md5pword, sizeof(ge_md5pword)));
         } else if (!ge_uid || ge_uid[0] == '\0') {
@@ -123,7 +119,7 @@
 GtkWidget *
 create_cfgdlg(void)
 {
-  ConfigDb *db;
+  mcs_handle_t *db;
   GtkWidget *vbox2;
   GtkWidget *table1;
   GtkWidget *label3;
--- a/src/scrobbler/gerpok.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/scrobbler/gerpok.c	Fri Jun 13 05:57:25 2008 +0300
@@ -8,13 +8,11 @@
 #include <curl/curl.h>
 #include <stdio.h>
 #include "fmt.h"
-#include "md5.h"
 #include "scrobbler.h"
 #include "config.h"
 #include <glib.h>
-
 #include <audacious/plugin.h>
-#include <audacious/util.h>
+#include <audacious/audutil.h>
 
 #define SCROBBLER_HS_URL "http://post.gerpok.com"
 #define SCROBBLER_CLI_ID "aud"
@@ -446,17 +444,17 @@
 	}
 
 	if (gerpok_sc_challenge_hash != NULL) {
-		md5_state_t md5state;
+		aud_md5state_t md5state;
 		unsigned char md5pword[16];
 		
-		md5_init(&md5state);
+		aud_md5_init(&md5state);
 		/*pdebug(fmt_vastr("Pass Hash: %s", gerpok_sc_password), DEBUG);*/
-		md5_append(&md5state, (unsigned const char *)gerpok_sc_password,
+		aud_md5_append(&md5state, (unsigned const char *)gerpok_sc_password,
 				strlen(gerpok_sc_password));
 		/*pdebug(fmt_vastr("Challenge Hash: %s", gerpok_sc_challenge_hash), DEBUG);*/
-		md5_append(&md5state, (unsigned const char *)gerpok_sc_challenge_hash,
+		aud_md5_append(&md5state, (unsigned const char *)gerpok_sc_challenge_hash,
 				strlen(gerpok_sc_challenge_hash));
-		md5_finish(&md5state, md5pword);
+		aud_md5_finish(&md5state, md5pword);
 		hexify((char*)md5pword, sizeof(md5pword));
 		/*pdebug(fmt_vastr("Response Hash: %s", gerpok_sc_response_hash), DEBUG);*/
 	}
--- a/src/scrobbler/gtkstuff.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/scrobbler/gtkstuff.c	Fri Jun 13 05:57:25 2008 +0300
@@ -1,5 +1,3 @@
-#include <audacious/util.h>
-#include <audacious/configdb.h>
 
 #include <glib.h>
 #include <audacious/i18n.h>
@@ -9,7 +7,6 @@
 #include <string.h>
 #include "settings.h"
 #include "config.h"
-#include "md5.h"
 
 void about_show(void)
 {
--- a/src/scrobbler/md5.c	Fri Jun 13 04:58:39 2008 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,381 +0,0 @@
-/*
-  Copyright (C) 1999, 2000, 2002 Aladdin Enterprises.  All rights reserved.
-
-  This software is provided 'as-is', without any express or implied
-  warranty.  In no event will the authors be held liable for any damages
-  arising from the use of this software.
-
-  Permission is granted to anyone to use this software for any purpose,
-  including commercial applications, and to alter it and redistribute it
-  freely, subject to the following restrictions:
-
-  1. The origin of this software must not be misrepresented; you must not
-     claim that you wrote the original software. If you use this software
-     in a product, an acknowledgment in the product documentation would be
-     appreciated but is not required.
-  2. Altered source versions must be plainly marked as such, and must not be
-     misrepresented as being the original software.
-  3. This notice may not be removed or altered from any source distribution.
-
-  L. Peter Deutsch
-  ghost@aladdin.com
-
- */
-/* $Id: md5.c,v 1.1 2003/08/24 01:20:37 audhov Exp $ */
-/*
-  Independent implementation of MD5 (RFC 1321).
-
-  This code implements the MD5 Algorithm defined in RFC 1321, whose
-  text is available at
-	http://www.ietf.org/rfc/rfc1321.txt
-  The code is derived from the text of the RFC, including the test suite
-  (section A.5) but excluding the rest of Appendix A.  It does not include
-  any code or documentation that is identified in the RFC as being
-  copyrighted.
-
-  The original and principal author of md5.c is L. Peter Deutsch
-  <ghost@aladdin.com>.  Other authors are noted in the change history
-  that follows (in reverse chronological order):
-
-  2002-04-13 lpd Clarified derivation from RFC 1321; now handles byte order
-	either statically or dynamically; added missing #include <string.h>
-	in library.
-  2002-03-11 lpd Corrected argument list for main(), and added int return
-	type, in test program and T value program.
-  2002-02-21 lpd Added missing #include <stdio.h> in test program.
-  2000-07-03 lpd Patched to eliminate warnings about "constant is
-	unsigned in ANSI C, signed in traditional"; made test program
-	self-checking.
-  1999-11-04 lpd Edited comments slightly for automatic TOC extraction.
-  1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5).
-  1999-05-03 lpd Original version.
- */
-
-#include "md5.h"
-#include <string.h>
-
-#undef BYTE_ORDER	/* 1 = big-endian, -1 = little-endian, 0 = unknown */
-#ifdef ARCH_IS_BIG_ENDIAN
-#  define BYTE_ORDER (ARCH_IS_BIG_ENDIAN ? 1 : -1)
-#else
-#  define BYTE_ORDER 0
-#endif
-
-#define T_MASK ((md5_word_t)~0)
-#define T1 /* 0xd76aa478 */ (T_MASK ^ 0x28955b87)
-#define T2 /* 0xe8c7b756 */ (T_MASK ^ 0x173848a9)
-#define T3    0x242070db
-#define T4 /* 0xc1bdceee */ (T_MASK ^ 0x3e423111)
-#define T5 /* 0xf57c0faf */ (T_MASK ^ 0x0a83f050)
-#define T6    0x4787c62a
-#define T7 /* 0xa8304613 */ (T_MASK ^ 0x57cfb9ec)
-#define T8 /* 0xfd469501 */ (T_MASK ^ 0x02b96afe)
-#define T9    0x698098d8
-#define T10 /* 0x8b44f7af */ (T_MASK ^ 0x74bb0850)
-#define T11 /* 0xffff5bb1 */ (T_MASK ^ 0x0000a44e)
-#define T12 /* 0x895cd7be */ (T_MASK ^ 0x76a32841)
-#define T13    0x6b901122
-#define T14 /* 0xfd987193 */ (T_MASK ^ 0x02678e6c)
-#define T15 /* 0xa679438e */ (T_MASK ^ 0x5986bc71)
-#define T16    0x49b40821
-#define T17 /* 0xf61e2562 */ (T_MASK ^ 0x09e1da9d)
-#define T18 /* 0xc040b340 */ (T_MASK ^ 0x3fbf4cbf)
-#define T19    0x265e5a51
-#define T20 /* 0xe9b6c7aa */ (T_MASK ^ 0x16493855)
-#define T21 /* 0xd62f105d */ (T_MASK ^ 0x29d0efa2)
-#define T22    0x02441453
-#define T23 /* 0xd8a1e681 */ (T_MASK ^ 0x275e197e)
-#define T24 /* 0xe7d3fbc8 */ (T_MASK ^ 0x182c0437)
-#define T25    0x21e1cde6
-#define T26 /* 0xc33707d6 */ (T_MASK ^ 0x3cc8f829)
-#define T27 /* 0xf4d50d87 */ (T_MASK ^ 0x0b2af278)
-#define T28    0x455a14ed
-#define T29 /* 0xa9e3e905 */ (T_MASK ^ 0x561c16fa)
-#define T30 /* 0xfcefa3f8 */ (T_MASK ^ 0x03105c07)
-#define T31    0x676f02d9
-#define T32 /* 0x8d2a4c8a */ (T_MASK ^ 0x72d5b375)
-#define T33 /* 0xfffa3942 */ (T_MASK ^ 0x0005c6bd)
-#define T34 /* 0x8771f681 */ (T_MASK ^ 0x788e097e)
-#define T35    0x6d9d6122
-#define T36 /* 0xfde5380c */ (T_MASK ^ 0x021ac7f3)
-#define T37 /* 0xa4beea44 */ (T_MASK ^ 0x5b4115bb)
-#define T38    0x4bdecfa9
-#define T39 /* 0xf6bb4b60 */ (T_MASK ^ 0x0944b49f)
-#define T40 /* 0xbebfbc70 */ (T_MASK ^ 0x4140438f)
-#define T41    0x289b7ec6
-#define T42 /* 0xeaa127fa */ (T_MASK ^ 0x155ed805)
-#define T43 /* 0xd4ef3085 */ (T_MASK ^ 0x2b10cf7a)
-#define T44    0x04881d05
-#define T45 /* 0xd9d4d039 */ (T_MASK ^ 0x262b2fc6)
-#define T46 /* 0xe6db99e5 */ (T_MASK ^ 0x1924661a)
-#define T47    0x1fa27cf8
-#define T48 /* 0xc4ac5665 */ (T_MASK ^ 0x3b53a99a)
-#define T49 /* 0xf4292244 */ (T_MASK ^ 0x0bd6ddbb)
-#define T50    0x432aff97
-#define T51 /* 0xab9423a7 */ (T_MASK ^ 0x546bdc58)
-#define T52 /* 0xfc93a039 */ (T_MASK ^ 0x036c5fc6)
-#define T53    0x655b59c3
-#define T54 /* 0x8f0ccc92 */ (T_MASK ^ 0x70f3336d)
-#define T55 /* 0xffeff47d */ (T_MASK ^ 0x00100b82)
-#define T56 /* 0x85845dd1 */ (T_MASK ^ 0x7a7ba22e)
-#define T57    0x6fa87e4f
-#define T58 /* 0xfe2ce6e0 */ (T_MASK ^ 0x01d3191f)
-#define T59 /* 0xa3014314 */ (T_MASK ^ 0x5cfebceb)
-#define T60    0x4e0811a1
-#define T61 /* 0xf7537e82 */ (T_MASK ^ 0x08ac817d)
-#define T62 /* 0xbd3af235 */ (T_MASK ^ 0x42c50dca)
-#define T63    0x2ad7d2bb
-#define T64 /* 0xeb86d391 */ (T_MASK ^ 0x14792c6e)
-
-
-static void
-md5_process(md5_state_t *pms, const md5_byte_t *data /*[64]*/)
-{
-    md5_word_t
-	a = pms->abcd[0], b = pms->abcd[1],
-	c = pms->abcd[2], d = pms->abcd[3];
-    md5_word_t t;
-#if BYTE_ORDER > 0
-    /* Define storage only for big-endian CPUs. */
-    md5_word_t X[16];
-#else
-    /* Define storage for little-endian or both types of CPUs. */
-    md5_word_t xbuf[16];
-    const md5_word_t *X;
-#endif
-
-    {
-#if BYTE_ORDER == 0
-	/*
-	 * Determine dynamically whether this is a big-endian or
-	 * little-endian machine, since we can use a more efficient
-	 * algorithm on the latter.
-	 */
-	static const int w = 1;
-
-	if (*((const md5_byte_t *)&w)) /* dynamic little-endian */
-#endif
-#if BYTE_ORDER <= 0		/* little-endian */
-	{
-	    /*
-	     * On little-endian machines, we can process properly aligned
-	     * data without copying it.
-	     */
-	    if (!((data - (const md5_byte_t *)0) & 3)) {
-		/* data are properly aligned */
-		X = (const md5_word_t *)data;
-	    } else {
-		/* not aligned */
-		memcpy(xbuf, data, 64);
-		X = xbuf;
-	    }
-	}
-#endif
-#if BYTE_ORDER == 0
-	else			/* dynamic big-endian */
-#endif
-#if BYTE_ORDER >= 0		/* big-endian */
-	{
-	    /*
-	     * On big-endian machines, we must arrange the bytes in the
-	     * right order.
-	     */
-	    const md5_byte_t *xp = data;
-	    int i;
-
-#  if BYTE_ORDER == 0
-	    X = xbuf;		/* (dynamic only) */
-#  else
-#    define xbuf X		/* (static only) */
-#  endif
-	    for (i = 0; i < 16; ++i, xp += 4)
-		xbuf[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24);
-	}
-#endif
-    }
-
-#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
-
-    /* Round 1. */
-    /* Let [abcd k s i] denote the operation
-       a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
-#define F(x, y, z) (((x) & (y)) | (~(x) & (z)))
-#define SET(a, b, c, d, k, s, Ti)\
-  t = a + F(b,c,d) + X[k] + Ti;\
-  a = ROTATE_LEFT(t, s) + b
-    /* Do the following 16 operations. */
-    SET(a, b, c, d,  0,  7,  T1);
-    SET(d, a, b, c,  1, 12,  T2);
-    SET(c, d, a, b,  2, 17,  T3);
-    SET(b, c, d, a,  3, 22,  T4);
-    SET(a, b, c, d,  4,  7,  T5);
-    SET(d, a, b, c,  5, 12,  T6);
-    SET(c, d, a, b,  6, 17,  T7);
-    SET(b, c, d, a,  7, 22,  T8);
-    SET(a, b, c, d,  8,  7,  T9);
-    SET(d, a, b, c,  9, 12, T10);
-    SET(c, d, a, b, 10, 17, T11);
-    SET(b, c, d, a, 11, 22, T12);
-    SET(a, b, c, d, 12,  7, T13);
-    SET(d, a, b, c, 13, 12, T14);
-    SET(c, d, a, b, 14, 17, T15);
-    SET(b, c, d, a, 15, 22, T16);
-#undef SET
-
-     /* Round 2. */
-     /* Let [abcd k s i] denote the operation
-          a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
-#define G(x, y, z) (((x) & (z)) | ((y) & ~(z)))
-#define SET(a, b, c, d, k, s, Ti)\
-  t = a + G(b,c,d) + X[k] + Ti;\
-  a = ROTATE_LEFT(t, s) + b
-     /* Do the following 16 operations. */
-    SET(a, b, c, d,  1,  5, T17);
-    SET(d, a, b, c,  6,  9, T18);
-    SET(c, d, a, b, 11, 14, T19);
-    SET(b, c, d, a,  0, 20, T20);
-    SET(a, b, c, d,  5,  5, T21);
-    SET(d, a, b, c, 10,  9, T22);
-    SET(c, d, a, b, 15, 14, T23);
-    SET(b, c, d, a,  4, 20, T24);
-    SET(a, b, c, d,  9,  5, T25);
-    SET(d, a, b, c, 14,  9, T26);
-    SET(c, d, a, b,  3, 14, T27);
-    SET(b, c, d, a,  8, 20, T28);
-    SET(a, b, c, d, 13,  5, T29);
-    SET(d, a, b, c,  2,  9, T30);
-    SET(c, d, a, b,  7, 14, T31);
-    SET(b, c, d, a, 12, 20, T32);
-#undef SET
-
-     /* Round 3. */
-     /* Let [abcd k s t] denote the operation
-          a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
-#define H(x, y, z) ((x) ^ (y) ^ (z))
-#define SET(a, b, c, d, k, s, Ti)\
-  t = a + H(b,c,d) + X[k] + Ti;\
-  a = ROTATE_LEFT(t, s) + b
-     /* Do the following 16 operations. */
-    SET(a, b, c, d,  5,  4, T33);
-    SET(d, a, b, c,  8, 11, T34);
-    SET(c, d, a, b, 11, 16, T35);
-    SET(b, c, d, a, 14, 23, T36);
-    SET(a, b, c, d,  1,  4, T37);
-    SET(d, a, b, c,  4, 11, T38);
-    SET(c, d, a, b,  7, 16, T39);
-    SET(b, c, d, a, 10, 23, T40);
-    SET(a, b, c, d, 13,  4, T41);
-    SET(d, a, b, c,  0, 11, T42);
-    SET(c, d, a, b,  3, 16, T43);
-    SET(b, c, d, a,  6, 23, T44);
-    SET(a, b, c, d,  9,  4, T45);
-    SET(d, a, b, c, 12, 11, T46);
-    SET(c, d, a, b, 15, 16, T47);
-    SET(b, c, d, a,  2, 23, T48);
-#undef SET
-
-     /* Round 4. */
-     /* Let [abcd k s t] denote the operation
-          a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
-#define I(x, y, z) ((y) ^ ((x) | ~(z)))
-#define SET(a, b, c, d, k, s, Ti)\
-  t = a + I(b,c,d) + X[k] + Ti;\
-  a = ROTATE_LEFT(t, s) + b
-     /* Do the following 16 operations. */
-    SET(a, b, c, d,  0,  6, T49);
-    SET(d, a, b, c,  7, 10, T50);
-    SET(c, d, a, b, 14, 15, T51);
-    SET(b, c, d, a,  5, 21, T52);
-    SET(a, b, c, d, 12,  6, T53);
-    SET(d, a, b, c,  3, 10, T54);
-    SET(c, d, a, b, 10, 15, T55);
-    SET(b, c, d, a,  1, 21, T56);
-    SET(a, b, c, d,  8,  6, T57);
-    SET(d, a, b, c, 15, 10, T58);
-    SET(c, d, a, b,  6, 15, T59);
-    SET(b, c, d, a, 13, 21, T60);
-    SET(a, b, c, d,  4,  6, T61);
-    SET(d, a, b, c, 11, 10, T62);
-    SET(c, d, a, b,  2, 15, T63);
-    SET(b, c, d, a,  9, 21, T64);
-#undef SET
-
-     /* Then perform the following additions. (That is increment each
-        of the four registers by the value it had before this block
-        was started.) */
-    pms->abcd[0] += a;
-    pms->abcd[1] += b;
-    pms->abcd[2] += c;
-    pms->abcd[3] += d;
-}
-
-void
-md5_init(md5_state_t *pms)
-{
-    pms->count[0] = pms->count[1] = 0;
-    pms->abcd[0] = 0x67452301;
-    pms->abcd[1] = /*0xefcdab89*/ T_MASK ^ 0x10325476;
-    pms->abcd[2] = /*0x98badcfe*/ T_MASK ^ 0x67452301;
-    pms->abcd[3] = 0x10325476;
-}
-
-void
-md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes)
-{
-    const md5_byte_t *p = data;
-    int left = nbytes;
-    int offset = (pms->count[0] >> 3) & 63;
-    md5_word_t nbits = (md5_word_t)(nbytes << 3);
-
-    if (nbytes <= 0)
-	return;
-
-    /* Update the message length. */
-    pms->count[1] += nbytes >> 29;
-    pms->count[0] += nbits;
-    if (pms->count[0] < nbits)
-	pms->count[1]++;
-
-    /* Process an initial partial block. */
-    if (offset) {
-	int copy = (offset + nbytes > 64 ? 64 - offset : nbytes);
-
-	memcpy(pms->buf + offset, p, copy);
-	if (offset + copy < 64)
-	    return;
-	p += copy;
-	left -= copy;
-	md5_process(pms, pms->buf);
-    }
-
-    /* Process full blocks. */
-    for (; left >= 64; p += 64, left -= 64)
-	md5_process(pms, p);
-
-    /* Process a final partial block. */
-    if (left)
-	memcpy(pms->buf, p, left);
-}
-
-void
-md5_finish(md5_state_t *pms, md5_byte_t digest[16])
-{
-    static const md5_byte_t pad[64] = {
-	0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-    };
-    md5_byte_t data[8];
-    int i;
-
-    /* Save the length before padding. */
-    for (i = 0; i < 8; ++i)
-	data[i] = (md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3));
-    /* Pad to 56 bytes mod 64. */
-    md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1);
-    /* Append the length. */
-    md5_append(pms, data, 8);
-    for (i = 0; i < 16; ++i)
-	digest[i] = (md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3));
-}
--- a/src/scrobbler/md5.h	Fri Jun 13 04:58:39 2008 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,91 +0,0 @@
-/*
-  Copyright (C) 1999, 2002 Aladdin Enterprises.  All rights reserved.
-
-  This software is provided 'as-is', without any express or implied
-  warranty.  In no event will the authors be held liable for any damages
-  arising from the use of this software.
-
-  Permission is granted to anyone to use this software for any purpose,
-  including commercial applications, and to alter it and redistribute it
-  freely, subject to the following restrictions:
-
-  1. The origin of this software must not be misrepresented; you must not
-     claim that you wrote the original software. If you use this software
-     in a product, an acknowledgment in the product documentation would be
-     appreciated but is not required.
-  2. Altered source versions must be plainly marked as such, and must not be
-     misrepresented as being the original software.
-  3. This notice may not be removed or altered from any source distribution.
-
-  L. Peter Deutsch
-  ghost@aladdin.com
-
- */
-/* $Id: md5.h,v 1.1 2003/08/24 01:20:37 audhov Exp $ */
-/*
-  Independent implementation of MD5 (RFC 1321).
-
-  This code implements the MD5 Algorithm defined in RFC 1321, whose
-  text is available at
-	http://www.ietf.org/rfc/rfc1321.txt
-  The code is derived from the text of the RFC, including the test suite
-  (section A.5) but excluding the rest of Appendix A.  It does not include
-  any code or documentation that is identified in the RFC as being
-  copyrighted.
-
-  The original and principal author of md5.h is L. Peter Deutsch
-  <ghost@aladdin.com>.  Other authors are noted in the change history
-  that follows (in reverse chronological order):
-
-  2002-04-13 lpd Removed support for non-ANSI compilers; removed
-	references to Ghostscript; clarified derivation from RFC 1321;
-	now handles byte order either statically or dynamically.
-  1999-11-04 lpd Edited comments slightly for automatic TOC extraction.
-  1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5);
-	added conditionalization for C++ compilation from Martin
-	Purschke <purschke@bnl.gov>.
-  1999-05-03 lpd Original version.
- */
-
-#ifndef md5_INCLUDED
-#  define md5_INCLUDED
-
-/*
- * This package supports both compile-time and run-time determination of CPU
- * byte order.  If ARCH_IS_BIG_ENDIAN is defined as 0, the code will be
- * compiled to run only on little-endian CPUs; if ARCH_IS_BIG_ENDIAN is
- * defined as non-zero, the code will be compiled to run only on big-endian
- * CPUs; if ARCH_IS_BIG_ENDIAN is not defined, the code will be compiled to
- * run on either big- or little-endian CPUs, but will run slightly less
- * efficiently on either one than if ARCH_IS_BIG_ENDIAN is defined.
- */
-
-typedef unsigned char md5_byte_t; /* 8-bit byte */
-typedef unsigned int md5_word_t; /* 32-bit word */
-
-/* Define the state of the MD5 Algorithm. */
-typedef struct md5_state_s {
-    md5_word_t count[2];	/* message length in bits, lsw first */
-    md5_word_t abcd[4];		/* digest buffer */
-    md5_byte_t buf[64];		/* accumulate block */
-} md5_state_t;
-
-#ifdef __cplusplus
-extern "C" 
-{
-#endif
-
-/* Initialize the algorithm. */
-void md5_init(md5_state_t *pms);
-
-/* Append a string to the message. */
-void md5_append(md5_state_t *pms, const md5_byte_t *data, int nbytes);
-
-/* Finish the message and return the digest. */
-void md5_finish(md5_state_t *pms, md5_byte_t digest[16]);
-
-#ifdef __cplusplus
-}  /* end extern "C" */
-#endif
-
-#endif /* md5_INCLUDED */
--- a/src/scrobbler/plugin.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/scrobbler/plugin.c	Fri Jun 13 05:57:25 2008 +0300
@@ -9,11 +9,7 @@
 
 #include <audacious/plugin.h>
 #include <audacious/ui_preferences.h>
-#include <audacious/playlist.h>
-#include <audacious/configdb.h>
 #include <audacious/hook.h>
-#include <audacious/strings.h>
-#include <audacious/main.h>
 
 #include <unistd.h>
 #include <stdio.h>
@@ -103,7 +99,7 @@
 void start(void) {
 	char *username = NULL, *password = NULL;
 	char *ge_username = NULL, *ge_password = NULL;
-	ConfigDb *cfgfile;
+	mcs_handle_t *cfgfile;
 	sc_going = 1;
 	ge_going = 1;
 	GError **moo = NULL;
--- a/src/scrobbler/scrobbler.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/scrobbler/scrobbler.c	Fri Jun 13 05:57:25 2008 +0300
@@ -6,14 +6,13 @@
 #include <curl/curl.h>
 #include <stdio.h>
 #include "fmt.h"
-#include "md5.h"
 #include "scrobbler.h"
 #include "config.h"
 #include "settings.h"
 #include <glib.h>
 
 #include <audacious/plugin.h>
-#include <audacious/util.h>
+#include <audacious/audutil.h>
 
 #define SCROBBLER_HS_URL "http://post.audioscrobbler.com"
 #define SCROBBLER_CLI_ID "aud"
@@ -441,12 +440,12 @@
 
 static unsigned char *md5_string(char *pass, int len)
 {
-    md5_state_t md5state;
+    aud_md5state_t md5state;
     static unsigned char md5pword[16];
         
-    md5_init(&md5state);
-    md5_append(&md5state, (unsigned const char *)pass, len);
-    md5_finish(&md5state, md5pword);
+    aud_md5_init(&md5state);
+    aud_md5_append(&md5state, (unsigned const char *)pass, len);
+    aud_md5_finish(&md5state, md5pword);
 
     return md5pword;
 }
@@ -518,17 +517,17 @@
     }
 
     if (sc_challenge_hash != NULL) {
-        md5_state_t md5state;
+        aud_md5state_t md5state;
         unsigned char md5pword[16];
         
-        md5_init(&md5state);
+        aud_md5_init(&md5state);
         /*pdebug(fmt_vastr("Pass Hash: %s", sc_password), DEBUG);*/
-        md5_append(&md5state, (unsigned const char *)sc_password,
+        aud_md5_append(&md5state, (unsigned const char *)sc_password,
                 strlen(sc_password));
         /*pdebug(fmt_vastr("Challenge Hash: %s", sc_challenge_hash), DEBUG);*/
-        md5_append(&md5state, (unsigned const char *)sc_challenge_hash,
+        aud_md5_append(&md5state, (unsigned const char *)sc_challenge_hash,
                 strlen(sc_challenge_hash));
-        md5_finish(&md5state, md5pword);
+        aud_md5_finish(&md5state, md5pword);
         hexify((char*)md5pword, sizeof(md5pword));
         /*pdebug(fmt_vastr("Response Hash: %s", sc_response_hash), DEBUG);*/
     }
--- a/src/sexypsf/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sexypsf/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -19,5 +19,5 @@
 plugindir := ${plugindir}/${INPUT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} -I../../intl -I../.. -Ispu/ -I.
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${MOWGLI_LIBS} -lz
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS}  -I../.. -Ispu/ -I.
+LIBS += ${GTK_LIBS} ${GLIB_LIBS}  ${MOWGLI_LIBS} -lz
--- a/src/sexypsf/plugin.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sexypsf/plugin.c	Fri Jun 13 05:57:25 2008 +0300
@@ -18,8 +18,6 @@
 
 #include <audacious/plugin.h>
 #include <audacious/output.h>
-#include <audacious/main.h>
-#include <audacious/util.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
--- a/src/shnplug/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/shnplug/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -22,6 +22,6 @@
 CFLAGS += ${PLUGIN_CFLAGS}
 LDFLAGS += ${AUDLDFLAGS}
 CPPFLAGS += ${PLUGIN_CPPFLAGS} ${PICFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${MOWGLI_CFLAGS} \
-	    ${PANGO_CFLAGS} ${ARCH_DEFINES} ${SIMD_CFLAGS} -I../../intl -I../.. -Wall
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS}
+	     ${ARCH_DEFINES} ${SIMD_CFLAGS} -I../.. -Wall
+LIBS += ${GTK_LIBS} ${GLIB_LIBS} 
 
--- a/src/shnplug/gtk.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/shnplug/gtk.c	Fri Jun 13 05:57:25 2008 +0300
@@ -22,8 +22,6 @@
 
 #include <stdlib.h>
 #include <glib.h>
-#include <audacious/util.h>
-#include <audacious/configdb.h>
 #include "shorten.h"
 
 #undef XMMS_SHN_LOAD_TEXTFILES
@@ -100,7 +98,7 @@
 
 void shn_configurewin_save(void)
 {
-	ConfigDb *cfg;
+	mcs_handle_t *cfg;
 	gchar *filename;
 
 	shn_cfg.error_output_method = ERROR_OUTPUT_DEVNULL;
--- a/src/shnplug/seek.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/shnplug/seek.c	Fri Jun 13 05:57:25 2008 +0300
@@ -22,7 +22,6 @@
 
 #include <stdlib.h>
 #include <glib.h>
-#include <audacious/util.h>
 #include "shorten.h"
 
 #ifdef HAVE_CONFIG_H
--- a/src/shnplug/shn.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/shnplug/shn.c	Fri Jun 13 05:57:25 2008 +0300
@@ -24,8 +24,6 @@
 #include <stdlib.h>
 #include <math.h>
 #include <glib.h>
-#include <audacious/util.h>
-#include <audacious/configdb.h>
 #include "shorten.h"
 
 #ifdef HAVE_CONFIG_H
@@ -90,7 +88,7 @@
 
 static void shn_init()
 {
-	ConfigDb *cfg;
+	mcs_handle_t *cfg;
 
 	shn_cfg.error_output_method = ERROR_OUTPUT_DEVNULL;
 	shn_cfg.error_output_method_config_name = "error_output_method";
--- a/src/shnplug/shn.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/shnplug/shn.h	Fri Jun 13 05:57:25 2008 +0300
@@ -32,7 +32,6 @@
 #include <sys/stat.h>
 
 #include <audacious/plugin.h>
-#include <audacious/vfs.h>
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
--- a/src/sid/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sid/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -4,7 +4,6 @@
        xs_about.c	\
        xs_support.c	\
        xs_config.c	\
-       xs_md5.c		\
        xs_length.c	\
        xs_genui.c	\
        xs_glade.c	\
@@ -25,5 +24,5 @@
 
 CFLAGS += ${PLUGIN_CFLAGS}
 CXXFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} -D_REENTRANT -I../../intl -I../.. -DAUDACIOUS_PLUGIN ${MOWGLI_CFLAGS} ${SIDPLAY1_INCLUDES} ${SIDPLAY2_INCLUDES} ${BUILDERS_INCLUDES} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS}
-LIBS += ${BUILDERS_LDFLAGS} ${SIDPLAY1_LDADD} ${SIDPLAY2_LDADD} ${RESID_LDADD} ${HARDSID_LDADD} ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} -lstdc++
+CPPFLAGS += ${PLUGIN_CPPFLAGS} -D_REENTRANT -I../.. -DAUDACIOUS_PLUGIN ${MOWGLI_CFLAGS} ${SIDPLAY1_CFLAGS} ${SIDPLAY2_CFLAGS} ${BUILDERS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS}
+LIBS += ${BUILDERS_LDFLAGS} ${SIDPLAY1_LIBS} ${SIDPLAY2_LIBS} ${BUILDERS_LIBS} ${GTK_LIBS} ${GLIB_LIBS} -lstdc++ -laudutil
--- a/src/sid/xmms-sid.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sid/xmms-sid.c	Fri Jun 13 05:57:25 2008 +0300
@@ -27,8 +27,6 @@
 #endif
 
 #include <stdarg.h>
-#include <gdk/gdkkeysyms.h>
-
 #include "xs_config.h"
 #include "xs_length.h"
 #include "xs_stil.h"
@@ -54,62 +52,62 @@
 /*
  * List of players and links to their functions
  */
-t_xs_player xs_playerlist[] = {
+static const xs_player_t xs_playerlist[] = {
 #ifdef HAVE_SIDPLAY1
-	{XS_ENG_SIDPLAY1,
-	 xs_sidplay1_probe,
-	 xs_sidplay1_init, xs_sidplay1_close,
-	 xs_sidplay1_initsong, xs_sidplay1_fillbuffer,
-	 xs_sidplay1_load, xs_sidplay1_delete,
-	 xs_sidplay1_getinfo, xs_sidplay1_updateinfo,
-	 NULL
-	},
+    {XS_ENG_SIDPLAY1,
+     xs_sidplay1_probe,
+     xs_sidplay1_init, xs_sidplay1_close,
+     xs_sidplay1_initsong, xs_sidplay1_fillbuffer,
+     xs_sidplay1_load, xs_sidplay1_delete,
+     xs_sidplay1_getinfo, xs_sidplay1_updateinfo,
+     NULL
+    },
 #endif
 #ifdef HAVE_SIDPLAY2
-	{XS_ENG_SIDPLAY2,
-	 xs_sidplay2_probe,
-	 xs_sidplay2_init, xs_sidplay2_close,
-	 xs_sidplay2_initsong, xs_sidplay2_fillbuffer,
-	 xs_sidplay2_load, xs_sidplay2_delete,
-	 xs_sidplay2_getinfo, xs_sidplay2_updateinfo,
-	 xs_sidplay2_flush
-	},
+    {XS_ENG_SIDPLAY2,
+     xs_sidplay2_probe,
+     xs_sidplay2_init, xs_sidplay2_close,
+     xs_sidplay2_initsong, xs_sidplay2_fillbuffer,
+     xs_sidplay2_load, xs_sidplay2_delete,
+     xs_sidplay2_getinfo, xs_sidplay2_updateinfo,
+     xs_sidplay2_flush
+    },
 #endif
 };
 
-const gint xs_nplayerlist = (sizeof(xs_playerlist) / sizeof(t_xs_player));
+static const gint xs_nplayerlist = (sizeof(xs_playerlist) / sizeof(xs_playerlist[0]));
 
 
 /*
  * Global variables
  */
-t_xs_status xs_status;
+xs_status_t xs_status;
 XS_MUTEX(xs_status);
 static XS_THREAD_T xs_decode_thread;
 
-static void xs_get_song_tuple_info(Tuple *pResult, t_xs_tuneinfo *pInfo, gint subTune);
+static void xs_get_song_tuple_info(Tuple *pResult, xs_tuneinfo_t *pInfo, gint subTune);
 
 /*
  * Error messages
  */
 void xs_error(const char *fmt, ...)
 {
-	va_list ap;
-	fprintf(stderr, "AUD-SID: ");
-	va_start(ap, fmt);
-	vfprintf(stderr, fmt, ap);
-	va_end(ap);
+    va_list ap;
+    fprintf(stderr, "AUD-SID: ");
+    va_start(ap, fmt);
+    vfprintf(stderr, fmt, ap);
+    va_end(ap);
 }
 
 #ifndef DEBUG_NP
 void XSDEBUG(const char *fmt, ...)
 {
 #ifdef DEBUG
-	va_list ap;
-	fprintf(stderr, "XSDEBUG: ");
-	va_start(ap, fmt);
-	vfprintf(stderr, fmt, ap);
-	va_end(ap);
+    va_list ap;
+    fprintf(stderr, "XSDEBUG: ");
+    va_start(ap, fmt);
+    vfprintf(stderr, fmt, ap);
+    va_end(ap);
 #endif
 }
 #endif
@@ -120,94 +118,94 @@
  */
 void xs_reinit(void)
 {
-	gint iPlayer;
-	gboolean isInitialized;
+    gint player;
+    gboolean initialized;
 
-	XSDEBUG("xs_reinit() thread = %p\n", g_thread_self());
+    XSDEBUG("xs_reinit() thread = %p\n", g_thread_self());
 
-	/* Stop playing, if we are */
-	XS_MUTEX_LOCK(xs_status);
-	if (xs_status.isPlaying) {
-		XS_MUTEX_UNLOCK(xs_status);
-		xs_stop(NULL);
-	} else {
-		XS_MUTEX_UNLOCK(xs_status);
-	}
+    /* Stop playing, if we are */
+    XS_MUTEX_LOCK(xs_status);
+    if (xs_status.isPlaying) {
+        XS_MUTEX_UNLOCK(xs_status);
+        xs_stop(NULL);
+    } else {
+        XS_MUTEX_UNLOCK(xs_status);
+    }
 
-	XS_MUTEX_LOCK(xs_status);
-	XS_MUTEX_LOCK(xs_cfg);
+    XS_MUTEX_LOCK(xs_status);
+    XS_MUTEX_LOCK(xs_cfg);
 
-	/* Initialize status and sanitize configuration */
-	memset(&xs_status, 0, sizeof(xs_status));
+    /* Initialize status and sanitize configuration */
+    memset(&xs_status, 0, sizeof(xs_status));
 
-	if (xs_cfg.audioFrequency < 8000)
-		xs_cfg.audioFrequency = 8000;
+    if (xs_cfg.audioFrequency < 8000)
+        xs_cfg.audioFrequency = 8000;
 
-	if (xs_cfg.oversampleFactor < XS_MIN_OVERSAMPLE)
-		xs_cfg.oversampleFactor = XS_MIN_OVERSAMPLE;
-	else if (xs_cfg.oversampleFactor > XS_MAX_OVERSAMPLE)
-		xs_cfg.oversampleFactor = XS_MAX_OVERSAMPLE;
+    if (xs_cfg.oversampleFactor < XS_MIN_OVERSAMPLE)
+        xs_cfg.oversampleFactor = XS_MIN_OVERSAMPLE;
+    else if (xs_cfg.oversampleFactor > XS_MAX_OVERSAMPLE)
+        xs_cfg.oversampleFactor = XS_MAX_OVERSAMPLE;
 
-	if (xs_cfg.audioChannels != XS_CHN_MONO)
-		xs_cfg.oversampleEnable = FALSE;
+    if (xs_cfg.audioChannels != XS_CHN_MONO)
+        xs_cfg.oversampleEnable = FALSE;
 
-	xs_status.audioFrequency = xs_cfg.audioFrequency;
-	xs_status.audioBitsPerSample = xs_cfg.audioBitsPerSample;
-	xs_status.audioChannels = xs_cfg.audioChannels;
-	xs_status.audioFormat = -1;
-	xs_status.oversampleEnable = xs_cfg.oversampleEnable;
-	xs_status.oversampleFactor = xs_cfg.oversampleFactor;
+    xs_status.audioFrequency = xs_cfg.audioFrequency;
+    xs_status.audioBitsPerSample = xs_cfg.audioBitsPerSample;
+    xs_status.audioChannels = xs_cfg.audioChannels;
+    xs_status.audioFormat = -1;
+    xs_status.oversampleEnable = xs_cfg.oversampleEnable;
+    xs_status.oversampleFactor = xs_cfg.oversampleFactor;
 
-	/* Try to initialize emulator engine */
-	XSDEBUG("initializing emulator engine #%i...\n", xs_cfg.playerEngine);
+    /* Try to initialize emulator engine */
+    XSDEBUG("initializing emulator engine #%i...\n", xs_cfg.playerEngine);
 
-	iPlayer = 0;
-	isInitialized = FALSE;
-	while ((iPlayer < xs_nplayerlist) && !isInitialized) {
-		if (xs_playerlist[iPlayer].plrIdent == xs_cfg.playerEngine) {
-			if (xs_playerlist[iPlayer].plrInit(&xs_status)) {
-				isInitialized = TRUE;
-				xs_status.sidPlayer = (t_xs_player *) & xs_playerlist[iPlayer];
-			}
-		}
-		iPlayer++;
-	}
+    player = 0;
+    initialized = FALSE;
+    while ((player < xs_nplayerlist) && !initialized) {
+        if (xs_playerlist[player].plrIdent == xs_cfg.playerEngine) {
+            if (xs_playerlist[player].plrInit(&xs_status)) {
+                initialized = TRUE;
+                xs_status.sidPlayer = (xs_player_t *) & xs_playerlist[player];
+            }
+        }
+        player++;
+    }
 
-	XSDEBUG("init#1: %s, %i\n", (isInitialized) ? "OK" : "FAILED", iPlayer);
+    XSDEBUG("init#1: %s, %i\n", (initialized) ? "OK" : "FAILED", player);
 
-	iPlayer = 0;
-	while ((iPlayer < xs_nplayerlist) && !isInitialized) {
-		if (xs_playerlist[iPlayer].plrInit(&xs_status)) {
-			isInitialized = TRUE;
-			xs_status.sidPlayer = (t_xs_player *) & xs_playerlist[iPlayer];
-			xs_cfg.playerEngine = xs_playerlist[iPlayer].plrIdent;
-		} else
-			iPlayer++;
-	}
+    player = 0;
+    while ((player < xs_nplayerlist) && !initialized) {
+        if (xs_playerlist[player].plrInit(&xs_status)) {
+            initialized = TRUE;
+            xs_status.sidPlayer = (xs_player_t *) & xs_playerlist[player];
+            xs_cfg.playerEngine = xs_playerlist[player].plrIdent;
+        } else
+            player++;
+    }
 
-	XSDEBUG("init#2: %s, %i\n", (isInitialized) ? "OK" : "FAILED", iPlayer);
+    XSDEBUG("init#2: %s, %i\n", (initialized) ? "OK" : "FAILED", player);
 
 
-	/* Get settings back, in case the chosen emulator backend changed them */
-	xs_cfg.audioFrequency = xs_status.audioFrequency;
-	xs_cfg.audioBitsPerSample = xs_status.audioBitsPerSample;
-	xs_cfg.audioChannels = xs_status.audioChannels;
-	xs_cfg.oversampleEnable = xs_status.oversampleEnable;
+    /* Get settings back, in case the chosen emulator backend changed them */
+    xs_cfg.audioFrequency = xs_status.audioFrequency;
+    xs_cfg.audioBitsPerSample = xs_status.audioBitsPerSample;
+    xs_cfg.audioChannels = xs_status.audioChannels;
+    xs_cfg.oversampleEnable = xs_status.oversampleEnable;
 
-	XS_MUTEX_UNLOCK(xs_status);
-	XS_MUTEX_UNLOCK(xs_cfg);
+    XS_MUTEX_UNLOCK(xs_status);
+    XS_MUTEX_UNLOCK(xs_cfg);
 
-	/* Initialize song-length database */
-	xs_songlen_close();
-	if (xs_cfg.songlenDBEnable && (xs_songlen_init() != 0)) {
-		xs_error(_("Error initializing song-length database!\n"));
-	}
+    /* Initialize song-length database */
+    xs_songlen_close();
+    if (xs_cfg.songlenDBEnable && (xs_songlen_init() != 0)) {
+        xs_error("Error initializing song-length database!\n");
+    }
 
-	/* Initialize STIL database */
-	xs_stil_close();
-	if (xs_cfg.stilDBEnable && (xs_stil_init() != 0)) {
-		xs_error(_("Error initializing STIL database!\n"));
-	}
+    /* Initialize STIL database */
+    xs_stil_close();
+    if (xs_cfg.stilDBEnable && (xs_stil_init() != 0)) {
+        xs_error("Error initializing STIL database!\n");
+    }
 
 }
 
@@ -217,16 +215,16 @@
  */
 void xs_init(void)
 {
-	XSDEBUG("xs_init()\n");
+    XSDEBUG("xs_init()\n");
 
-	/* Initialize and get configuration */
-	xs_init_configuration();
-	xs_read_configuration();
+    /* Initialize and get configuration */
+    xs_init_configuration();
+    xs_read_configuration();
 
-	/* Initialize subsystems */
-	xs_reinit();
+    /* Initialize subsystems */
+    xs_reinit();
 
-	XSDEBUG("OK\n");
+    XSDEBUG("OK\n");
 }
 
 
@@ -235,50 +233,50 @@
  */
 void xs_close(void)
 {
-	XSDEBUG("xs_close(): shutting down...\n");
+    XSDEBUG("xs_close(): shutting down...\n");
 
-	/* Stop playing, free structures */
-	xs_stop(NULL);
+    /* Stop playing, free structures */
+    xs_stop(NULL);
 
-	xs_tuneinfo_free(xs_status.tuneInfo);
-	xs_status.tuneInfo = NULL;
-	xs_status.sidPlayer->plrDeleteSID(&xs_status);
-	xs_status.sidPlayer->plrClose(&xs_status);
+    xs_tuneinfo_free(xs_status.tuneInfo);
+    xs_status.tuneInfo = NULL;
+    xs_status.sidPlayer->plrDeleteSID(&xs_status);
+    xs_status.sidPlayer->plrClose(&xs_status);
 
-	xs_songlen_close();
-	xs_stil_close();
+    xs_songlen_close();
+    xs_stil_close();
 
-	XSDEBUG("shutdown finished.\n");
+    XSDEBUG("shutdown finished.\n");
 }
 
 
 /*
  * Check whether the given file is handled by this plugin
  */
-static gchar * xs_has_tracknumber(gchar *pcFilename)
+static gchar * xs_has_tracknumber(gchar *filename)
 {
-	gchar *tmpSep = xs_strrchr(pcFilename, '?');
-	if (tmpSep && g_ascii_isdigit(*(tmpSep + 1)))
-		return tmpSep;
-	else
-		return NULL;
+    gchar *sep = xs_strrchr(filename, '?');
+    if (sep && g_ascii_isdigit(*(sep + 1)))
+        return sep;
+    else
+        return NULL;
 }
 
-gboolean xs_get_trackinfo(const gchar *pcFilename, gchar **pcResult, gint *pTrack)
+gboolean xs_get_trackinfo(const gchar *filename, gchar **result, gint *track)
 {
-	gchar *tmpSep;
+    gchar *sep;
 
-	*pcResult = g_strdup(pcFilename);
-	tmpSep = xs_has_tracknumber(*pcResult);
+    *result = g_strdup(filename);
+    sep = xs_has_tracknumber(*result);
 
-	if (tmpSep) {
-		*tmpSep = '\0';
-		*pTrack = atoi(tmpSep + 1);
-		return TRUE;
-	} else {
-		*pTrack = -1;
-		return FALSE;
-	}
+    if (sep) {
+        *sep = '\0';
+        *track = atoi(sep + 1);
+        return TRUE;
+    } else {
+        *track = -1;
+        return FALSE;
+    }
 }
 
 
@@ -287,212 +285,212 @@
  */
 void xs_play_file(InputPlayback *pb)
 {
-	t_xs_tuneinfo *tmpTune;
-	gboolean audioOpen = FALSE;
-	gint audioGot, tmpLength, subTune;
-	gchar *tmpFilename, *audioBuffer = NULL, *oversampleBuffer = NULL, *tmpTitle;
-	Tuple *tmpTuple;
+    xs_tuneinfo_t *tmpTune;
+    gboolean audioOpen = FALSE;
+    gint audioGot, tmpLength, subTune;
+    gchar *tmpFilename, *audioBuffer = NULL, *oversampleBuffer = NULL, *tmpTitle;
+    Tuple *tmpTuple;
 
-	assert(pb);
-	assert(xs_status.sidPlayer);
-	
-	XSDEBUG("play '%s'\n", pb->filename);
+    assert(pb);
+    assert(xs_status.sidPlayer);
+    
+    XSDEBUG("play '%s'\n", pb->filename);
 
-	XS_MUTEX_LOCK(xs_status);
+    XS_MUTEX_LOCK(xs_status);
 
-	/* Get tune information */
-	xs_get_trackinfo(pb->filename, &tmpFilename, &subTune);
-	if ((xs_status.tuneInfo = xs_status.sidPlayer->plrGetSIDInfo(tmpFilename)) == NULL) {
-		XS_MUTEX_UNLOCK(xs_status);
-		g_free(tmpFilename);
-		return;
-	}
+    /* Get tune information */
+    xs_get_trackinfo(pb->filename, &tmpFilename, &subTune);
+    if ((xs_status.tuneInfo = xs_status.sidPlayer->plrGetSIDInfo(tmpFilename)) == NULL) {
+        XS_MUTEX_UNLOCK(xs_status);
+        g_free(tmpFilename);
+        return;
+    }
 
-	/* Initialize the tune */
-	if (!xs_status.sidPlayer->plrLoadSID(&xs_status, tmpFilename)) {
-		XS_MUTEX_UNLOCK(xs_status);
-		g_free(tmpFilename);
-		xs_tuneinfo_free(xs_status.tuneInfo);
-		xs_status.tuneInfo = NULL;
-		return;
-	}
-	
-	g_free(tmpFilename);
-	tmpFilename = NULL;
+    /* Initialize the tune */
+    if (!xs_status.sidPlayer->plrLoadSID(&xs_status, tmpFilename)) {
+        XS_MUTEX_UNLOCK(xs_status);
+        g_free(tmpFilename);
+        xs_tuneinfo_free(xs_status.tuneInfo);
+        xs_status.tuneInfo = NULL;
+        return;
+    }
+    
+    g_free(tmpFilename);
+    tmpFilename = NULL;
 
-	XSDEBUG("load ok\n");
+    XSDEBUG("load ok\n");
 
-	/* Set general status information */
-	xs_status.isPlaying = TRUE;
-	xs_status.isError = FALSE;
-	tmpTune = xs_status.tuneInfo;
+    /* Set general status information */
+    xs_status.isPlaying = TRUE;
+    xs_status.isError = FALSE;
+    tmpTune = xs_status.tuneInfo;
 
-	if (subTune < 1 || subTune > xs_status.tuneInfo->nsubTunes)
-		xs_status.currSong = xs_status.tuneInfo->startTune;
-	else
-		xs_status.currSong = subTune;
+    if (subTune < 1 || subTune > xs_status.tuneInfo->nsubTunes)
+        xs_status.currSong = xs_status.tuneInfo->startTune;
+    else
+        xs_status.currSong = subTune;
 
-	XSDEBUG("subtune #%i selected (#%d wanted), initializing...\n", xs_status.currSong, subTune);
+    XSDEBUG("subtune #%i selected (#%d wanted), initializing...\n", xs_status.currSong, subTune);
 
 
-	/* We are ready */
-	xs_decode_thread = g_thread_self();
-	XSDEBUG("playing thread = %p\n", xs_decode_thread);
-	pb->set_pb_ready(pb);
+    /* We are ready */
+    xs_decode_thread = g_thread_self();
+    XSDEBUG("playing thread = %p\n", xs_decode_thread);
+    pb->set_pb_ready(pb);
 
 
-	/* Allocate audio buffer */
-	audioBuffer = (gchar *) g_malloc(XS_AUDIOBUF_SIZE);
-	if (audioBuffer == NULL) {
-		xs_error(_("Couldn't allocate memory for audio data buffer!\n"));
-		XS_MUTEX_UNLOCK(xs_status);
-		goto xs_err_exit;
-	}
-	
-	if (xs_status.oversampleEnable) {
-		oversampleBuffer = (gchar *) g_malloc(XS_AUDIOBUF_SIZE * xs_status.oversampleFactor);
-		if (oversampleBuffer == NULL) {
-			xs_error(_("Couldn't allocate memory for audio oversampling buffer!\n"));
-			XS_MUTEX_UNLOCK(xs_status);
-			goto xs_err_exit;
-		}
-	}
+    /* Allocate audio buffer */
+    audioBuffer = (gchar *) g_malloc(XS_AUDIOBUF_SIZE);
+    if (audioBuffer == NULL) {
+        xs_error("Couldn't allocate memory for audio data buffer!\n");
+        XS_MUTEX_UNLOCK(xs_status);
+        goto xs_err_exit;
+    }
+    
+    if (xs_status.oversampleEnable) {
+        oversampleBuffer = (gchar *) g_malloc(XS_AUDIOBUF_SIZE * xs_status.oversampleFactor);
+        if (oversampleBuffer == NULL) {
+            xs_error("Couldn't allocate memory for audio oversampling buffer!\n");
+            XS_MUTEX_UNLOCK(xs_status);
+            goto xs_err_exit;
+        }
+    }
 
 
-	/* Check minimum playtime */
-	tmpLength = tmpTune->subTunes[xs_status.currSong - 1].tuneLength;
-	if (xs_cfg.playMinTimeEnable && (tmpLength >= 0)) {
-		if (tmpLength < xs_cfg.playMinTime)
-			tmpLength = xs_cfg.playMinTime;
-	}
+    /* Check minimum playtime */
+    tmpLength = tmpTune->subTunes[xs_status.currSong - 1].tuneLength;
+    if (xs_cfg.playMinTimeEnable && (tmpLength >= 0)) {
+        if (tmpLength < xs_cfg.playMinTime)
+            tmpLength = xs_cfg.playMinTime;
+    }
 
-	/* Initialize song */
-	if (!xs_status.sidPlayer->plrInitSong(&xs_status)) {
-		xs_error(_("Couldn't initialize SID-tune '%s' (sub-tune #%i)!\n"),
-		      tmpTune->sidFilename, xs_status.currSong);
-		XS_MUTEX_UNLOCK(xs_status);
-		goto xs_err_exit;
-	}
-		
-	/* Open the audio output */
-	XSDEBUG("open audio output (%d, %d, %d)\n",
-		xs_status.audioFormat, xs_status.audioFrequency, xs_status.audioChannels);
-		
-	if (!pb->output->open_audio(xs_status.audioFormat, xs_status.audioFrequency, xs_status.audioChannels)) {
-		xs_error(_("Couldn't open XMMS audio output (fmt=%x, freq=%i, nchan=%i)!\n"),
-			xs_status.audioFormat,
-			xs_status.audioFrequency,
-			xs_status.audioChannels);
+    /* Initialize song */
+    if (!xs_status.sidPlayer->plrInitSong(&xs_status)) {
+        xs_error("Couldn't initialize SID-tune '%s' (sub-tune #%i)!\n",
+            tmpTune->sidFilename, xs_status.currSong);
+        XS_MUTEX_UNLOCK(xs_status);
+        goto xs_err_exit;
+    }
+        
+    /* Open the audio output */
+    XSDEBUG("open audio output (%d, %d, %d)\n",
+        xs_status.audioFormat, xs_status.audioFrequency, xs_status.audioChannels);
+        
+    if (!pb->output->open_audio(xs_status.audioFormat, xs_status.audioFrequency, xs_status.audioChannels)) {
+        xs_error("Couldn't open audio output (fmt=%x, freq=%i, nchan=%i)!\n",
+            xs_status.audioFormat,
+            xs_status.audioFrequency,
+            xs_status.audioChannels);
 
-		xs_status.isError = TRUE;
-		XS_MUTEX_UNLOCK(xs_status);
-		goto xs_err_exit;
-	}
+        xs_status.isError = TRUE;
+        XS_MUTEX_UNLOCK(xs_status);
+        goto xs_err_exit;
+    }
 
-	audioOpen = TRUE;
+    audioOpen = TRUE;
 
-	/* Set song information for current subtune */
-	XSDEBUG("foobar #1\n");
-	xs_status.sidPlayer->plrUpdateSIDInfo(&xs_status);
-	XS_MUTEX_UNLOCK(xs_status);
-	tmpTuple = aud_tuple_new_from_filename(tmpTune->sidFilename);
-	xs_get_song_tuple_info(tmpTuple, tmpTune, xs_status.currSong);
+    /* Set song information for current subtune */
+    XSDEBUG("foobar #1\n");
+    xs_status.sidPlayer->plrUpdateSIDInfo(&xs_status);
+    XS_MUTEX_UNLOCK(xs_status);
+    tmpTuple = aud_tuple_new_from_filename(tmpTune->sidFilename);
+    xs_get_song_tuple_info(tmpTuple, tmpTune, xs_status.currSong);
 
-	tmpTitle = aud_tuple_formatter_process_string(tmpTuple,
-		xs_cfg.titleOverride ? xs_cfg.titleFormat : aud_get_gentitle_format());
-	
-	XSDEBUG("foobar #4\n");
-	XS_MUTEX_LOCK(xs_status);
-	pb->set_params(pb,
-		tmpTitle,
-		(tmpLength > 0) ? (tmpLength * 1000) : 0,
-		-1,
-		xs_status.audioFrequency,
-		xs_status.audioChannels);
-		
-	g_free(tmpTitle);
-	
-	XS_MUTEX_UNLOCK(xs_status);
-	XSDEBUG("playing\n");
-	while (xs_status.isPlaying) {
-		/* Render audio data */
-		XS_MUTEX_LOCK(xs_status);
-		if (xs_status.oversampleEnable) {
-			/* Perform oversampled rendering */
-			audioGot = xs_status.sidPlayer->plrFillBuffer(
-				&xs_status,
-				oversampleBuffer,
-				(XS_AUDIOBUF_SIZE * xs_status.oversampleFactor));
+    tmpTitle = aud_tuple_formatter_process_string(tmpTuple,
+        xs_cfg.titleOverride ? xs_cfg.titleFormat : aud_get_gentitle_format());
+    
+    XSDEBUG("foobar #4\n");
+    XS_MUTEX_LOCK(xs_status);
+    pb->set_params(pb,
+        tmpTitle,
+        (tmpLength > 0) ? (tmpLength * 1000) : 0,
+        -1,
+        xs_status.audioFrequency,
+        xs_status.audioChannels);
+        
+    g_free(tmpTitle);
+    
+    XS_MUTEX_UNLOCK(xs_status);
+    XSDEBUG("playing\n");
+    while (xs_status.isPlaying) {
+        /* Render audio data */
+        XS_MUTEX_LOCK(xs_status);
+        if (xs_status.oversampleEnable) {
+            /* Perform oversampled rendering */
+            audioGot = xs_status.sidPlayer->plrFillBuffer(
+                &xs_status,
+                oversampleBuffer,
+                (XS_AUDIOBUF_SIZE * xs_status.oversampleFactor));
 
-			audioGot /= xs_status.oversampleFactor;
+            audioGot /= xs_status.oversampleFactor;
 
-			/* Execute rate-conversion with filtering */
-			if (xs_filter_rateconv(audioBuffer, oversampleBuffer,
-				xs_status.audioFormat, xs_status.oversampleFactor, audioGot) < 0) {
-				xs_error(_("Oversampling rate-conversion pass failed.\n"));
-				xs_status.isError = TRUE;
-				XS_MUTEX_UNLOCK(xs_status);
-				goto xs_err_exit;
-			}
-		} else {
-			audioGot = xs_status.sidPlayer->plrFillBuffer(
-				&xs_status, audioBuffer, XS_AUDIOBUF_SIZE);
-		}
+            /* Execute rate-conversion with filtering */
+            if (xs_filter_rateconv(audioBuffer, oversampleBuffer,
+                xs_status.audioFormat, xs_status.oversampleFactor, audioGot) < 0) {
+                xs_error("Oversampling rate-conversion pass failed.\n");
+                xs_status.isError = TRUE;
+                XS_MUTEX_UNLOCK(xs_status);
+                goto xs_err_exit;
+            }
+        } else {
+            audioGot = xs_status.sidPlayer->plrFillBuffer(
+                &xs_status, audioBuffer, XS_AUDIOBUF_SIZE);
+        }
 
-		/* I <3 visualice/haujobb */
-		pb->pass_audio(pb, xs_status.audioFormat, xs_status.audioChannels,
-			audioGot, audioBuffer, NULL);
-		
-		XS_MUTEX_UNLOCK(xs_status);
+        /* I <3 visualice/haujobb */
+        pb->pass_audio(pb, xs_status.audioFormat, xs_status.audioChannels,
+            audioGot, audioBuffer, NULL);
+        
+        XS_MUTEX_UNLOCK(xs_status);
 
-		/* Wait a little */
-		while (xs_status.isPlaying && (pb->output->buffer_free() < audioGot))
-			g_usleep(500);
+        /* Wait a little */
+        while (xs_status.isPlaying && (pb->output->buffer_free() < audioGot))
+            g_usleep(500);
 
-		/* Check if we have played enough */
-		XS_MUTEX_LOCK(xs_status);
-		if (xs_cfg.playMaxTimeEnable) {
-			if (xs_cfg.playMaxTimeUnknown) {
-				if ((tmpLength < 0) &&
-					(pb->output->output_time() >= (xs_cfg.playMaxTime * 1000)))
-					xs_status.isPlaying = FALSE;
-			} else {
-				if (pb->output->output_time() >= (xs_cfg.playMaxTime * 1000))
-					xs_status.isPlaying = FALSE;
-			}
-		}
+        /* Check if we have played enough */
+        XS_MUTEX_LOCK(xs_status);
+        if (xs_cfg.playMaxTimeEnable) {
+            if (xs_cfg.playMaxTimeUnknown) {
+                if ((tmpLength < 0) &&
+                    (pb->output->output_time() >= (xs_cfg.playMaxTime * 1000)))
+                    xs_status.isPlaying = FALSE;
+            } else {
+                if (pb->output->output_time() >= (xs_cfg.playMaxTime * 1000))
+                    xs_status.isPlaying = FALSE;
+            }
+        }
 
-		if (tmpLength >= 0) {
-			if (pb->output->output_time() >= (tmpLength * 1000))
-				xs_status.isPlaying = FALSE;
-		}
-		XS_MUTEX_UNLOCK(xs_status);
-	}
+        if (tmpLength >= 0) {
+            if (pb->output->output_time() >= (tmpLength * 1000))
+                xs_status.isPlaying = FALSE;
+        }
+        XS_MUTEX_UNLOCK(xs_status);
+    }
 
 xs_err_exit:
-	XSDEBUG("out of playing loop\n");
-	
-	/* Close audio output plugin */
-	if (audioOpen) {
-		XSDEBUG("close audio #2\n");
-		pb->output->close_audio();
-		XSDEBUG("closed\n");
-	}
+    XSDEBUG("out of playing loop\n");
+    
+    /* Close audio output plugin */
+    if (audioOpen) {
+        XSDEBUG("close audio #2\n");
+        pb->output->close_audio();
+        XSDEBUG("closed\n");
+    }
 
-	g_free(audioBuffer);
-	g_free(oversampleBuffer);
+    g_free(audioBuffer);
+    g_free(oversampleBuffer);
 
-	/* Set playing status to false (stopped), thus when
-	 * XMMS next calls xs_get_time(), it can return appropriate
-	 * value "not playing" status and XMMS knows to move to
-	 * next entry in the playlist .. or whatever it wishes.
-	 */
-	XS_MUTEX_LOCK(xs_status);
-	xs_status.isPlaying = FALSE;
-	XS_MUTEX_UNLOCK(xs_status);
+    /* Set playing status to false (stopped), thus when
+     * XMMS next calls xs_get_time(), it can return appropriate
+     * value "not playing" status and XMMS knows to move to
+     * next entry in the playlist .. or whatever it wishes.
+     */
+    XS_MUTEX_LOCK(xs_status);
+    xs_status.isPlaying = FALSE;
+    XS_MUTEX_UNLOCK(xs_status);
 
-	/* Exit the playing thread */
-	XSDEBUG("exiting thread, bye.\n");
+    /* Exit the playing thread */
+    XSDEBUG("exiting thread, bye.\n");
 }
 
 
@@ -508,30 +506,30 @@
  */
 void xs_stop(InputPlayback *pb)
 {
-	(void) pb;
-	
-	XSDEBUG("stop requested\n");
+    (void) pb;
+    
+    XSDEBUG("stop requested\n");
 
-	/* Lock xs_status and stop playing thread */
-	XS_MUTEX_LOCK(xs_status);
-	if (xs_status.isPlaying) {
-		XSDEBUG("stopping...\n");
-		xs_status.isPlaying = FALSE;
-		XS_MUTEX_UNLOCK(xs_status);
-		XS_THREAD_JOIN(xs_decode_thread);
-	} else {
-		XS_MUTEX_UNLOCK(xs_status);
-	}
+    /* Lock xs_status and stop playing thread */
+    XS_MUTEX_LOCK(xs_status);
+    if (xs_status.isPlaying) {
+        XSDEBUG("stopping...\n");
+        xs_status.isPlaying = FALSE;
+        XS_MUTEX_UNLOCK(xs_status);
+        XS_THREAD_JOIN(xs_decode_thread);
+    } else {
+        XS_MUTEX_UNLOCK(xs_status);
+    }
 
-	XSDEBUG("done, updating status\n");
-	
-	/* Free tune information */
-	XS_MUTEX_LOCK(xs_status);
-	xs_status.sidPlayer->plrDeleteSID(&xs_status);
-	xs_tuneinfo_free(xs_status.tuneInfo);
-	xs_status.tuneInfo = NULL;
-	XS_MUTEX_UNLOCK(xs_status);
-	XSDEBUG("ok\n");
+    XSDEBUG("done, updating status\n");
+    
+    /* Free tune information */
+    XS_MUTEX_LOCK(xs_status);
+    xs_status.sidPlayer->plrDeleteSID(&xs_status);
+    xs_tuneinfo_free(xs_status.tuneInfo);
+    xs_status.tuneInfo = NULL;
+    XS_MUTEX_UNLOCK(xs_status);
+    XSDEBUG("ok\n");
 }
 
 
@@ -540,7 +538,7 @@
  */
 void xs_pause(InputPlayback *pb, short pauseState)
 {
-	pb->output->pause(pauseState);
+    pb->output->pause(pauseState);
 }
 
 
@@ -549,7 +547,7 @@
  */
 void xs_seek(InputPlayback *pb, gint time)
 {
-	(void) pb; (void) time;
+    (void) pb; (void) time;
 }
 
 
@@ -562,182 +560,182 @@
  */
 gint xs_get_time(InputPlayback *pb)
 {
-	/* If errorflag is set, return -2 to signal it to XMMS's idle callback */
-	XS_MUTEX_LOCK(xs_status);
-	if (xs_status.isError) {
-		XS_MUTEX_UNLOCK(xs_status);
-		return -2;
-	}
+    /* If errorflag is set, return -2 to signal it to XMMS's idle callback */
+    XS_MUTEX_LOCK(xs_status);
+    if (xs_status.isError) {
+        XS_MUTEX_UNLOCK(xs_status);
+        return -2;
+    }
 
-	/* If there is no tune, return -1 */
-	if (!xs_status.tuneInfo) {
-		XS_MUTEX_UNLOCK(xs_status);
-		return -1;
-	}
+    /* If there is no tune, return -1 */
+    if (!xs_status.tuneInfo) {
+        XS_MUTEX_UNLOCK(xs_status);
+        return -1;
+    }
 
-	/* If tune has ended, return -1 */
-	if (!xs_status.isPlaying) {
-		XS_MUTEX_UNLOCK(xs_status);
-		return -1;
-	}
+    /* If tune has ended, return -1 */
+    if (!xs_status.isPlaying) {
+        XS_MUTEX_UNLOCK(xs_status);
+        return -1;
+    }
 
-	XS_MUTEX_UNLOCK(xs_status);
+    XS_MUTEX_UNLOCK(xs_status);
 
-	/* Return output time reported by audio output plugin */
-	return pb->output->output_time();
+    /* Return output time reported by audio output plugin */
+    return pb->output->output_time();
 }
 
 
 /*
  * Return song information Tuple
  */
-static void xs_get_song_tuple_info(Tuple *pResult, t_xs_tuneinfo *pInfo, gint subTune)
+static void xs_get_song_tuple_info(Tuple *pResult, xs_tuneinfo_t *pInfo, gint subTune)
 {
-	gchar *tmpStr, tmpStr2[64];
+    gchar *tmpStr, tmpStr2[64];
 
-	aud_tuple_associate_string(pResult, FIELD_TITLE, NULL, pInfo->sidName);
-	aud_tuple_associate_string(pResult, FIELD_ARTIST, NULL, pInfo->sidComposer);
-	aud_tuple_associate_string(pResult, FIELD_GENRE, NULL, "SID-tune");
-	aud_tuple_associate_string(pResult, FIELD_COPYRIGHT, NULL, pInfo->sidCopyright);
-	aud_tuple_associate_string(pResult, -1, "sid-format", pInfo->sidFormat);
+    aud_tuple_associate_string(pResult, FIELD_TITLE, NULL, pInfo->sidName);
+    aud_tuple_associate_string(pResult, FIELD_ARTIST, NULL, pInfo->sidComposer);
+    aud_tuple_associate_string(pResult, FIELD_GENRE, NULL, "SID-tune");
+    aud_tuple_associate_string(pResult, FIELD_COPYRIGHT, NULL, pInfo->sidCopyright);
+    aud_tuple_associate_string(pResult, -1, "sid-format", pInfo->sidFormat);
 
-	switch (pInfo->sidModel) {
-		case XS_SIDMODEL_6581: tmpStr = "6581"; break;
-		case XS_SIDMODEL_8580: tmpStr = "8580"; break;
-		case XS_SIDMODEL_ANY: tmpStr = "ANY"; break;
-		default: tmpStr = "?"; break;
-	}
-	aud_tuple_associate_string(pResult, -1, "sid-model", tmpStr);
-	
-	/* Get sub-tune information, if available */
-	if (subTune < 0 || pInfo->startTune > pInfo->nsubTunes)
-		subTune = pInfo->startTune;
-	
-	if ((subTune > 0) && (subTune <= pInfo->nsubTunes)) {
-		gint tmpInt = pInfo->subTunes[subTune - 1].tuneLength;
-		aud_tuple_associate_int(pResult, FIELD_LENGTH, NULL, (tmpInt < 0) ? -1 : tmpInt * 1000);
-		
-		tmpInt = pInfo->subTunes[subTune - 1].tuneSpeed;
-		if (tmpInt > 0) {
-			switch (tmpInt) {
-			case XS_CLOCK_PAL: tmpStr = "PAL"; break;
-			case XS_CLOCK_NTSC: tmpStr = "NTSC"; break;
-			case XS_CLOCK_ANY: tmpStr = "ANY"; break;
-			case XS_CLOCK_VBI: tmpStr = "VBI"; break;
-			case XS_CLOCK_CIA: tmpStr = "CIA"; break;
-			default:
-				g_snprintf(tmpStr2, sizeof(tmpStr2), "%dHz", tmpInt);
-				tmpStr = tmpStr2;
-				break;
-			}
-		} else
-			tmpStr = "?";
+    switch (pInfo->sidModel) {
+        case XS_SIDMODEL_6581: tmpStr = "6581"; break;
+        case XS_SIDMODEL_8580: tmpStr = "8580"; break;
+        case XS_SIDMODEL_ANY: tmpStr = "ANY"; break;
+        default: tmpStr = "?"; break;
+    }
+    aud_tuple_associate_string(pResult, -1, "sid-model", tmpStr);
+    
+    /* Get sub-tune information, if available */
+    if (subTune < 0 || pInfo->startTune > pInfo->nsubTunes)
+        subTune = pInfo->startTune;
+    
+    if ((subTune > 0) && (subTune <= pInfo->nsubTunes)) {
+        gint tmpInt = pInfo->subTunes[subTune - 1].tuneLength;
+        aud_tuple_associate_int(pResult, FIELD_LENGTH, NULL, (tmpInt < 0) ? -1 : tmpInt * 1000);
+        
+        tmpInt = pInfo->subTunes[subTune - 1].tuneSpeed;
+        if (tmpInt > 0) {
+            switch (tmpInt) {
+            case XS_CLOCK_PAL: tmpStr = "PAL"; break;
+            case XS_CLOCK_NTSC: tmpStr = "NTSC"; break;
+            case XS_CLOCK_ANY: tmpStr = "ANY"; break;
+            case XS_CLOCK_VBI: tmpStr = "VBI"; break;
+            case XS_CLOCK_CIA: tmpStr = "CIA"; break;
+            default:
+                g_snprintf(tmpStr2, sizeof(tmpStr2), "%dHz", tmpInt);
+                tmpStr = tmpStr2;
+                break;
+            }
+        } else
+            tmpStr = "?";
 
-		aud_tuple_associate_string(pResult, -1, "sid-speed", tmpStr);
-	} else
-		subTune = 1;
-	
-	aud_tuple_associate_int(pResult, FIELD_SUBSONG_NUM, NULL, pInfo->nsubTunes);
-	aud_tuple_associate_int(pResult, FIELD_SUBSONG_ID, NULL, subTune);
-	aud_tuple_associate_int(pResult, FIELD_TRACK_NUMBER, NULL, subTune);
+        aud_tuple_associate_string(pResult, -1, "sid-speed", tmpStr);
+    } else
+        subTune = 1;
+    
+    aud_tuple_associate_int(pResult, FIELD_SUBSONG_NUM, NULL, pInfo->nsubTunes);
+    aud_tuple_associate_int(pResult, FIELD_SUBSONG_ID, NULL, subTune);
+    aud_tuple_associate_int(pResult, FIELD_TRACK_NUMBER, NULL, subTune);
 
-	if (xs_cfg.titleOverride)
-		aud_tuple_associate_string(pResult, FIELD_FORMATTER, NULL, xs_cfg.titleFormat);
+    if (xs_cfg.titleOverride)
+        aud_tuple_associate_string(pResult, FIELD_FORMATTER, NULL, xs_cfg.titleFormat);
 }
 
 
-Tuple * xs_get_song_tuple(gchar *songFilename)
+Tuple * xs_get_song_tuple(gchar *filename)
 {
-	Tuple *tmpResult;
-	gchar *tmpFilename;
-	t_xs_tuneinfo *tmpInfo;
-	gint tmpTune;
+    Tuple *result;
+    gchar *tmpFilename;
+    xs_tuneinfo_t *tmpInfo;
+    gint tmpTune;
 
-	/* Get information from URL */
-	xs_get_trackinfo(songFilename, &tmpFilename, &tmpTune);
+    /* Get information from URL */
+    xs_get_trackinfo(filename, &tmpFilename, &tmpTune);
 
-	tmpResult = aud_tuple_new_from_filename(tmpFilename);
-	if (!tmpResult) {
-		g_free(tmpFilename);
-		return NULL;
-	}
+    result = aud_tuple_new_from_filename(tmpFilename);
+    if (!result) {
+        g_free(tmpFilename);
+        return NULL;
+    }
 
-	/* Get tune information from emulation engine */
-	XS_MUTEX_LOCK(xs_status);
-	tmpInfo = xs_status.sidPlayer->plrGetSIDInfo(tmpFilename);
-	XS_MUTEX_UNLOCK(xs_status);
-	g_free(tmpFilename);
+    /* Get tune information from emulation engine */
+    XS_MUTEX_LOCK(xs_status);
+    tmpInfo = xs_status.sidPlayer->plrGetSIDInfo(tmpFilename);
+    XS_MUTEX_UNLOCK(xs_status);
+    g_free(tmpFilename);
 
-	if (!tmpInfo)
-		return tmpResult;
-	
-	xs_get_song_tuple_info(tmpResult, tmpInfo, tmpTune);
-	xs_tuneinfo_free(tmpInfo);
+    if (!tmpInfo)
+        return result;
+    
+    xs_get_song_tuple_info(result, tmpInfo, tmpTune);
+    xs_tuneinfo_free(tmpInfo);
 
-	return tmpResult;
+    return result;
 }
 
 
-Tuple *xs_probe_for_tuple(gchar *songFilename, t_xs_file *fd)
+Tuple *xs_probe_for_tuple(gchar *filename, xs_file_t *fd)
 {
-	Tuple *tmpResult;
-	gchar *tmpFilename;
-	t_xs_tuneinfo *tmpInfo;
-	gint tmpTune;
+    Tuple *result;
+    gchar *tmpFilename;
+    xs_tuneinfo_t *tmpInfo;
+    gint tmpTune;
 
-	assert(xs_status.sidPlayer);
+    assert(xs_status.sidPlayer);
 
-	if (songFilename == NULL)
-		return NULL;
+    if (filename == NULL)
+        return NULL;
 
-	XS_MUTEX_LOCK(xs_status);
-	if (!xs_status.sidPlayer->plrProbe(fd)) {
-		XS_MUTEX_UNLOCK(xs_status);
-		return NULL;
-	}
-	XS_MUTEX_UNLOCK(xs_status);
+    XS_MUTEX_LOCK(xs_status);
+    if (!xs_status.sidPlayer->plrProbe(fd)) {
+        XS_MUTEX_UNLOCK(xs_status);
+        return NULL;
+    }
+    XS_MUTEX_UNLOCK(xs_status);
 
 
-	/* Get information from URL */
-	xs_get_trackinfo(songFilename, &tmpFilename, &tmpTune);
-	tmpResult = aud_tuple_new_from_filename(tmpFilename);
-	if (!tmpResult) {
-		g_free(tmpFilename);
-		return NULL;
-	}
+    /* Get information from URL */
+    xs_get_trackinfo(filename, &tmpFilename, &tmpTune);
+    result = aud_tuple_new_from_filename(tmpFilename);
+    if (!result) {
+        g_free(tmpFilename);
+        return NULL;
+    }
 
-	/* Get tune information from emulation engine */
-	XS_MUTEX_LOCK(xs_status);
-	tmpInfo = xs_status.sidPlayer->plrGetSIDInfo(tmpFilename);
-	XS_MUTEX_UNLOCK(xs_status);
-	g_free(tmpFilename);
+    /* Get tune information from emulation engine */
+    XS_MUTEX_LOCK(xs_status);
+    tmpInfo = xs_status.sidPlayer->plrGetSIDInfo(tmpFilename);
+    XS_MUTEX_UNLOCK(xs_status);
+    g_free(tmpFilename);
 
-	if (!tmpInfo)
-		return tmpResult;
-	
-	xs_get_song_tuple_info(tmpResult, tmpInfo, tmpTune);
+    if (!tmpInfo)
+        return result;
+    
+    xs_get_song_tuple_info(result, tmpInfo, tmpTune);
 
-	/* Set subtunes */
-	if (xs_cfg.subAutoEnable && tmpInfo->nsubTunes > 1 && tmpTune < 0) {
-		gint i, n;
-		tmpResult->subtunes = g_new(gint, tmpInfo->nsubTunes);
-		for (n = 0, i = 1; i <= tmpInfo->nsubTunes; i++) {
-			gboolean doAdd = FALSE;
-					
-			if (xs_cfg.subAutoMinOnly) {
-				if (i == tmpInfo->startTune ||
-					tmpInfo->subTunes[i - 1].tuneLength >= xs_cfg.subAutoMinTime)
-					doAdd = TRUE;
-			} else
-				doAdd = TRUE;
-					
-			if (doAdd) tmpResult->subtunes[n++] = i;
-		}
-		tmpResult->nsubtunes = n;
-	} else
-		tmpResult->nsubtunes = 0;
-	
-	xs_tuneinfo_free(tmpInfo);
+    /* Set subtunes */
+    if (xs_cfg.subAutoEnable && tmpInfo->nsubTunes > 1 && tmpTune < 0) {
+        gint i, n;
+        result->subtunes = g_new(gint, tmpInfo->nsubTunes);
+        for (n = 0, i = 1; i <= tmpInfo->nsubTunes; i++) {
+            gboolean doAdd = FALSE;
+                    
+            if (xs_cfg.subAutoMinOnly) {
+                if (i == tmpInfo->startTune ||
+                    tmpInfo->subTunes[i - 1].tuneLength >= xs_cfg.subAutoMinTime)
+                    doAdd = TRUE;
+            } else
+                doAdd = TRUE;
+                    
+            if (doAdd) result->subtunes[n++] = i;
+        }
+        result->nsubtunes = n;
+    } else
+        result->nsubtunes = 0;
+    
+    xs_tuneinfo_free(tmpInfo);
 
-	return tmpResult;
+    return result;
 }
--- a/src/sid/xmms-sid.glade	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sid/xmms-sid.glade	Fri Jun 13 05:57:25 2008 +0300
@@ -2328,11 +2328,73 @@
 			      <property name="visible">True</property>
 			      <property name="tooltip" translatable="yes">Browse for song length-database file</property>
 			      <property name="can_focus">True</property>
-			      <property name="label" translatable="yes">Browse</property>
-			      <property name="use_underline">True</property>
 			      <property name="relief">GTK_RELIEF_NORMAL</property>
 			      <property name="focus_on_click">True</property>
 			      <signal name="clicked" handler="xs_cfg_sldb_browse"/>
+
+			      <child>
+				<widget class="GtkAlignment" id="alignment1">
+				  <property name="visible">True</property>
+				  <property name="xalign">0.5</property>
+				  <property name="yalign">0.5</property>
+				  <property name="xscale">0</property>
+				  <property name="yscale">0</property>
+				  <property name="top_padding">0</property>
+				  <property name="bottom_padding">0</property>
+				  <property name="left_padding">0</property>
+				  <property name="right_padding">0</property>
+
+				  <child>
+				    <widget class="GtkHBox" id="hbox1">
+				      <property name="visible">True</property>
+				      <property name="homogeneous">False</property>
+				      <property name="spacing">2</property>
+
+				      <child>
+					<widget class="GtkImage" id="image1">
+					  <property name="visible">True</property>
+					  <property name="stock">gtk-open</property>
+					  <property name="icon_size">4</property>
+					  <property name="xalign">0.5</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xpad">0</property>
+					  <property name="ypad">0</property>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">False</property>
+					  <property name="fill">False</property>
+					</packing>
+				      </child>
+
+				      <child>
+					<widget class="GtkLabel" id="label30">
+					  <property name="visible">True</property>
+					  <property name="label" translatable="yes">Browse</property>
+					  <property name="use_underline">True</property>
+					  <property name="use_markup">False</property>
+					  <property name="justify">GTK_JUSTIFY_LEFT</property>
+					  <property name="wrap">False</property>
+					  <property name="selectable">False</property>
+					  <property name="xalign">0.5</property>
+					  <property name="yalign">0.5</property>
+					  <property name="xpad">0</property>
+					  <property name="ypad">0</property>
+					  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					  <property name="width_chars">-1</property>
+					  <property name="single_line_mode">False</property>
+					  <property name="angle">0</property>
+					</widget>
+					<packing>
+					  <property name="padding">0</property>
+					  <property name="expand">False</property>
+					  <property name="fill">False</property>
+					</packing>
+				      </child>
+				    </widget>
+				  </child>
+				</widget>
+			      </child>
 			    </widget>
 			    <packing>
 			      <property name="padding">0</property>
@@ -2474,14 +2536,22 @@
 		      <child>
 			<widget class="GtkLabel" id="cfg_ftitle_descs">
 			  <property name="visible">True</property>
-			  <property name="label" translatable="yes">Descriptions of &lt;i&gt;SID-specific&lt;/i&gt; Tuplez fields go here. &lt;b&gt;:D&lt;/b&gt;</property>
+			  <property name="label" translatable="yes">&lt;u&gt;SID-specific Tuplez fields:&lt;/u&gt;
+
+&lt;b&gt;sid-format&lt;/b&gt;		- Specific fileformat
+&lt;b&gt;sid-model&lt;/b&gt;		- 6581 or 8580
+&lt;b&gt;sid-speed&lt;/b&gt;		- Timing or speed: PAL/NTSC/etc.
+
+&lt;u&gt;Other &quot;special&quot; fields set:&lt;/u&gt;
+
+&lt;b&gt;subsong-num, subsong-id&lt;/b&gt;</property>
 			  <property name="use_underline">False</property>
 			  <property name="use_markup">True</property>
 			  <property name="justify">GTK_JUSTIFY_LEFT</property>
-			  <property name="wrap">True</property>
+			  <property name="wrap">False</property>
 			  <property name="selectable">False</property>
-			  <property name="xalign">0.5</property>
-			  <property name="yalign">0.5</property>
+			  <property name="xalign">0</property>
+			  <property name="yalign">0</property>
 			  <property name="xpad">8</property>
 			  <property name="ypad">8</property>
 			  <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
@@ -2853,11 +2923,73 @@
 				  <property name="visible">True</property>
 				  <property name="tooltip" translatable="yes">Browse for STIL-database file</property>
 				  <property name="can_focus">True</property>
-				  <property name="label" translatable="yes">Browse</property>
-				  <property name="use_underline">True</property>
 				  <property name="relief">GTK_RELIEF_NORMAL</property>
 				  <property name="focus_on_click">True</property>
 				  <signal name="clicked" handler="xs_cfg_stil_browse"/>
+
+				  <child>
+				    <widget class="GtkAlignment" id="alignment2">
+				      <property name="visible">True</property>
+				      <property name="xalign">0.5</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xscale">0</property>
+				      <property name="yscale">0</property>
+				      <property name="top_padding">0</property>
+				      <property name="bottom_padding">0</property>
+				      <property name="left_padding">0</property>
+				      <property name="right_padding">0</property>
+
+				      <child>
+					<widget class="GtkHBox" id="hbox2">
+					  <property name="visible">True</property>
+					  <property name="homogeneous">False</property>
+					  <property name="spacing">2</property>
+
+					  <child>
+					    <widget class="GtkImage" id="image2">
+					      <property name="visible">True</property>
+					      <property name="stock">gtk-open</property>
+					      <property name="icon_size">4</property>
+					      <property name="xalign">0.5</property>
+					      <property name="yalign">0.5</property>
+					      <property name="xpad">0</property>
+					      <property name="ypad">0</property>
+					    </widget>
+					    <packing>
+					      <property name="padding">0</property>
+					      <property name="expand">False</property>
+					      <property name="fill">False</property>
+					    </packing>
+					  </child>
+
+					  <child>
+					    <widget class="GtkLabel" id="label31">
+					      <property name="visible">True</property>
+					      <property name="label" translatable="yes">Browse</property>
+					      <property name="use_underline">True</property>
+					      <property name="use_markup">False</property>
+					      <property name="justify">GTK_JUSTIFY_LEFT</property>
+					      <property name="wrap">False</property>
+					      <property name="selectable">False</property>
+					      <property name="xalign">0.5</property>
+					      <property name="yalign">0.5</property>
+					      <property name="xpad">0</property>
+					      <property name="ypad">0</property>
+					      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					      <property name="width_chars">-1</property>
+					      <property name="single_line_mode">False</property>
+					      <property name="angle">0</property>
+					    </widget>
+					    <packing>
+					      <property name="padding">0</property>
+					      <property name="expand">False</property>
+					      <property name="fill">False</property>
+					    </packing>
+					  </child>
+					</widget>
+				      </child>
+				    </widget>
+				  </child>
 				</widget>
 			      </child>
 			    </widget>
@@ -2959,11 +3091,73 @@
 				  <property name="visible">True</property>
 				  <property name="tooltip" translatable="yes">Browse for HVSC path</property>
 				  <property name="can_focus">True</property>
-				  <property name="label" translatable="yes">Browse</property>
-				  <property name="use_underline">True</property>
 				  <property name="relief">GTK_RELIEF_NORMAL</property>
 				  <property name="focus_on_click">True</property>
 				  <signal name="clicked" handler="xs_cfg_hvsc_browse"/>
+
+				  <child>
+				    <widget class="GtkAlignment" id="alignment3">
+				      <property name="visible">True</property>
+				      <property name="xalign">0.5</property>
+				      <property name="yalign">0.5</property>
+				      <property name="xscale">0</property>
+				      <property name="yscale">0</property>
+				      <property name="top_padding">0</property>
+				      <property name="bottom_padding">0</property>
+				      <property name="left_padding">0</property>
+				      <property name="right_padding">0</property>
+
+				      <child>
+					<widget class="GtkHBox" id="hbox3">
+					  <property name="visible">True</property>
+					  <property name="homogeneous">False</property>
+					  <property name="spacing">2</property>
+
+					  <child>
+					    <widget class="GtkImage" id="image3">
+					      <property name="visible">True</property>
+					      <property name="stock">gtk-open</property>
+					      <property name="icon_size">4</property>
+					      <property name="xalign">0.5</property>
+					      <property name="yalign">0.5</property>
+					      <property name="xpad">0</property>
+					      <property name="ypad">0</property>
+					    </widget>
+					    <packing>
+					      <property name="padding">0</property>
+					      <property name="expand">False</property>
+					      <property name="fill">False</property>
+					    </packing>
+					  </child>
+
+					  <child>
+					    <widget class="GtkLabel" id="label32">
+					      <property name="visible">True</property>
+					      <property name="label" translatable="yes">Browse</property>
+					      <property name="use_underline">True</property>
+					      <property name="use_markup">False</property>
+					      <property name="justify">GTK_JUSTIFY_LEFT</property>
+					      <property name="wrap">False</property>
+					      <property name="selectable">False</property>
+					      <property name="xalign">0.5</property>
+					      <property name="yalign">0.5</property>
+					      <property name="xpad">0</property>
+					      <property name="ypad">0</property>
+					      <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property>
+					      <property name="width_chars">-1</property>
+					      <property name="single_line_mode">False</property>
+					      <property name="angle">0</property>
+					    </widget>
+					    <packing>
+					      <property name="padding">0</property>
+					      <property name="expand">False</property>
+					      <property name="fill">False</property>
+					    </packing>
+					  </child>
+					</widget>
+				      </child>
+				    </widget>
+				  </child>
 				</widget>
 			      </child>
 			    </widget>
@@ -3063,8 +3257,8 @@
 	      <property name="tooltip" translatable="yes">Accept and update changes</property>
 	      <property name="can_default">True</property>
 	      <property name="can_focus">True</property>
-	      <property name="label" translatable="yes">OK</property>
-	      <property name="use_underline">True</property>
+	      <property name="label">gtk-ok</property>
+	      <property name="use_stock">True</property>
 	      <property name="relief">GTK_RELIEF_NORMAL</property>
 	      <property name="focus_on_click">True</property>
 	      <signal name="clicked" handler="xs_cfg_ok"/>
@@ -3077,8 +3271,8 @@
 	      <property name="tooltip" translatable="yes">Cancel any changes</property>
 	      <property name="can_default">True</property>
 	      <property name="can_focus">True</property>
-	      <property name="label" translatable="yes">Cancel</property>
-	      <property name="use_underline">True</property>
+	      <property name="label">gtk-cancel</property>
+	      <property name="use_stock">True</property>
 	      <property name="relief">GTK_RELIEF_NORMAL</property>
 	      <property name="focus_on_click">True</property>
 	      <signal name="clicked" handler="xs_cfg_cancel"/>
--- a/src/sid/xmms-sid.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sid/xmms-sid.h	Fri Jun 13 05:57:25 2008 +0300
@@ -55,7 +55,7 @@
 #undef HAVE_HARDSID_BUILDER
 
 /* Size for some small buffers (always static variables) */
-#define XS_BUF_SIZE		(1024)
+#define XS_BUF_SIZE        (1024)
 
 /* If defined, some dynamically allocated temp. buffers are used.
  * Static (#undef) might give slight performance gain,
@@ -64,130 +64,130 @@
 
 /* Configuration section identifier
  */
-#define XS_PACKAGE_STRING	"Audacious-SID"
-#define XS_CONFIG_IDENT		"sid"
+#define XS_PACKAGE_STRING    "Audacious-SID"
+#define XS_CONFIG_IDENT        "sid"
 
 /* Default audio rendering frequency in Hz
  */
-#define XS_AUDIO_FREQ		(44100)
+#define XS_AUDIO_FREQ        (44100)
 
 /* Size of audio buffer. If you are experiencing lots of audio
  * "underruns" or clicks/gaps in output, try increasing this value.
  * Do notice, however, that it also affects the update frequency of
  * XMMS's visualization plugins... 
  */
-#define XS_AUDIOBUF_SIZE	(2*1024)
+#define XS_AUDIOBUF_SIZE    (2*1024)
 
 /* Size of data buffer used for SID-tune MD5 hash calculation.
  * If this is too small, the computed hash will be incorrect.
  * Largest SID files I've seen are ~70kB. */
-#define XS_SIDBUF_SIZE		(80*1024)
+#define XS_SIDBUF_SIZE        (80*1024)
 
 /* libSIDPlay1/2 constants (copied from internal headers/source)
  * For some stupid reason these are not available in public
  * headers, so we have to duplicate them here...
  */
-#define XS_SIDPLAY1_FS		(400.0f)
-#define XS_SIDPLAY1_FM		(60.0f)
-#define XS_SIDPLAY1_FT		(0.05f)
+#define XS_SIDPLAY1_FS        (400.0f)
+#define XS_SIDPLAY1_FM        (60.0f)
+#define XS_SIDPLAY1_FT        (0.05f)
 
-#define XS_SIDPLAY2_NFPOINTS	(0x800)
-#define XS_SIDPLAY2_FMAX	(24000)
+#define XS_SIDPLAY2_NFPOINTS    (0x800)
+#define XS_SIDPLAY2_FMAX    (24000)
 
 /* Limits for oversampling
  */
-#define XS_MIN_OVERSAMPLE	(2)
-#define XS_MAX_OVERSAMPLE	(8)
+#define XS_MIN_OVERSAMPLE    (2)
+#define XS_MAX_OVERSAMPLE    (8)
 
 
 /* Macros for mutexes and threads. These exist to be able to
  * easily change from pthreads to glib threads, etc, if necessary.
  */
-#define XS_THREAD_T		GThread *
-#define XS_THREAD_EXIT(M)	g_thread_exit(M)
-#define XS_THREAD_JOIN(M)	g_thread_join(M)
-#define XS_MPP(M)		M ## _mutex
-#define XS_MUTEX(M)		GStaticMutex XS_MPP(M) = G_STATIC_MUTEX_INIT
-#define XS_MUTEX_H(M)		extern GStaticMutex XS_MPP(M)
+#define XS_THREAD_T        GThread *
+#define XS_THREAD_EXIT(M)    g_thread_exit(M)
+#define XS_THREAD_JOIN(M)    g_thread_join(M)
+#define XS_MPP(M)        M ## _mutex
+#define XS_MUTEX(M)        GStaticMutex XS_MPP(M) = G_STATIC_MUTEX_INIT
+#define XS_MUTEX_H(M)        extern GStaticMutex XS_MPP(M)
 #ifdef XS_MUTEX_DEBUG
-#  define XS_MUTEX_LOCK(M)	{			\
-	gboolean tmpRes;				\
-	XSDEBUG("XS_MUTEX_TRYLOCK(" #M ")\n");	\
-	tmpRes = g_static_mutex_trylock(&XS_MPP(M));	\
-	XSDEBUG("[" #M "] = %s\n", tmpRes ? "TRUE" : "FALSE");	\
-	}
-#  define XS_MUTEX_UNLOCK(M)	{ XSDEBUG("XS_MUTEX_UNLOCK(" #M ")\n"); g_static_mutex_unlock(&XS_MPP(M)); }
+#  define XS_MUTEX_LOCK(M)    {            \
+    gboolean tmpRes;                \
+    XSDEBUG("XS_MUTEX_TRYLOCK(" #M ")\n");    \
+    tmpRes = g_static_mutex_trylock(&XS_MPP(M));    \
+    XSDEBUG("[" #M "] = %s\n", tmpRes ? "TRUE" : "FALSE");    \
+    }
+#  define XS_MUTEX_UNLOCK(M)    { XSDEBUG("XS_MUTEX_UNLOCK(" #M ")\n"); g_static_mutex_unlock(&XS_MPP(M)); }
 #else
-#  define XS_MUTEX_LOCK(M)	g_static_mutex_lock(&XS_MPP(M))
-#  define XS_MUTEX_UNLOCK(M)	g_static_mutex_unlock(&XS_MPP(M))
+#  define XS_MUTEX_LOCK(M)    g_static_mutex_lock(&XS_MPP(M))
+#  define XS_MUTEX_UNLOCK(M)    g_static_mutex_unlock(&XS_MPP(M))
 #endif
 
 /* Character set conversion helper macros
  */
-#define XS_CS_FILENAME(M)	g_filename_to_utf8(M, -1, NULL, NULL, NULL)
-#define XS_CS_SID(M)		g_convert(M, -1, "UTF-8", "ISO-8859-1", NULL, NULL, NULL)
-#define XS_CS_STIL(M)		g_convert(M, -1, "UTF-8", "ISO-8859-1", NULL, NULL, NULL)
-#define XS_CS_FREE(M)		g_free(M)
+#define XS_CS_FILENAME(M)    g_filename_to_utf8(M, -1, NULL, NULL, NULL)
+#define XS_CS_SID(M)        g_convert(M, -1, "UTF-8", "ISO-8859-1", NULL, NULL, NULL)
+#define XS_CS_STIL(M)        g_convert(M, -1, "UTF-8", "ISO-8859-1", NULL, NULL, NULL)
+#define XS_CS_FREE(M)        g_free(M)
 
 /* Shorthands for linked lists
  */
-#define LPREV	(pNode->pPrev)
-#define LTHIS	(pNode)
-#define LNEXT	(pNode->pNext)
+#define LPREV    (node->prev)
+#define LTHIS    (node)
+#define LNEXT    (node->next)
 
 
 /* Plugin-wide typedefs
  */
 typedef struct {
-	gint		tuneSpeed,
-			tuneLength;
-	gboolean	tunePlayed;
-} t_xs_subtuneinfo;
+    gint        tuneSpeed,
+            tuneLength;
+    gboolean    tunePlayed;
+} xs_subtuneinfo_t;
 
 
 typedef struct {
-	gchar		*sidFilename,
-			*sidName,
-			*sidComposer,
-			*sidCopyright,
-			*sidFormat;
-	gint		loadAddr,
-			initAddr,
-			playAddr,
-			dataFileLen,
-			sidModel;
-	gint		nsubTunes, startTune;
-	t_xs_subtuneinfo	*subTunes;
-} t_xs_tuneinfo;
+    gchar        *sidFilename,
+            *sidName,
+            *sidComposer,
+            *sidCopyright,
+            *sidFormat;
+    gint        loadAddr,
+            initAddr,
+            playAddr,
+            dataFileLen,
+            sidModel;
+    gint        nsubTunes, startTune;
+    xs_subtuneinfo_t    *subTunes;
+} xs_tuneinfo_t;
 
 
 /* Global variables
  */
-extern InputPlugin	xs_plugin_ip;
+extern InputPlugin    xs_plugin_ip;
 
 
 /* Plugin function prototypes
  */
-void	xs_init(void);
-void	xs_reinit(void);
-void	xs_close(void);
-void	xs_play_file(InputPlayback *);
-void	xs_stop(InputPlayback *);
-void	xs_pause(InputPlayback *, short);
-void	xs_seek(InputPlayback *, gint);
-gint	xs_get_time(InputPlayback *);
-Tuple *	xs_get_song_tuple(gchar *);
-Tuple *	xs_probe_for_tuple(gchar *, t_xs_file *);
-void	xs_about(void);
+void    xs_init(void);
+void    xs_reinit(void);
+void    xs_close(void);
+void    xs_play_file(InputPlayback *);
+void    xs_stop(InputPlayback *);
+void    xs_pause(InputPlayback *, short);
+void    xs_seek(InputPlayback *, gint);
+gint    xs_get_time(InputPlayback *);
+Tuple *    xs_get_song_tuple(gchar *);
+Tuple *    xs_probe_for_tuple(gchar *, xs_file_t *);
+void    xs_about(void);
 
-void	xs_error(const char *, ...);
+void    xs_error(const char *, ...);
 gboolean xs_get_trackinfo(const gchar *, gchar **, gint *);
 
 
 /* Debugging
  */
 #ifndef DEBUG_NP
-void	XSDEBUG(const char *, ...);
+void    XSDEBUG(const char *, ...);
 #else
 #  ifdef DEBUG
 #    define XSDEBUG(...) { fprintf(stderr, "XS[%s:%s:%d]: ", __FILE__, __FUNCTION__, (int) __LINE__); fprintf(stderr, __VA_ARGS__); }
@@ -199,25 +199,27 @@
 
 /* And even some Gtk+ macro crap here, yay.
  */
-#define XS_DEF_WINDOW_DELETE(ME, MV)					\
-gboolean xs_ ## ME ## _delete(GtkWidget *w, GdkEvent *e, gpointer d) {	\
-	(void) w; (void) e; (void) d;					\
-	if (xs_ ## MV ) {						\
-		gtk_widget_destroy(xs_ ## MV );				\
-		xs_ ## MV = NULL;					\
-	}								\
-	return FALSE;							\
+#define XS_DEF_WINDOW_DELETE(ME, MV)                    \
+gboolean xs_ ## ME ## _delete(GtkWidget *w, GdkEvent *e, gpointer d) {    \
+    (void) w; (void) e; (void) d;                    \
+    if (xs_ ## MV ) {                        \
+        gtk_widget_destroy(xs_ ## MV );                \
+        xs_ ## MV = NULL;                    \
+    }                                \
+    return FALSE;                            \
 }
 
-#define XS_DEF_WINDOW_CLOSE(ME, MV)			\
-void xs_ ## ME (GtkButton *b, gpointer d) {		\
-	(void) b; (void) d;				\
-	gtk_widget_destroy(xs_ ## MV );			\
-	xs_ ## MV = NULL;				\
+#define XS_DEF_WINDOW_CLOSE(ME, MV)            \
+void xs_ ## ME (GtkButton *b, gpointer d) {        \
+    (void) b; (void) d;                \
+    gtk_widget_destroy(xs_ ## MV );            \
+    xs_ ## MV = NULL;                \
 }
 
-#define XS_SIGNAL_CONNECT(SOBJ, SNAME, SFUNC, SDATA)		\
-	g_signal_connect(G_OBJECT(SOBJ), SNAME, G_CALLBACK(SFUNC), SDATA)
+#define XS_SIGNAL_CONNECT(SOBJ, SNAME, SFUNC, SDATA)        \
+    g_signal_connect(G_OBJECT(SOBJ), SNAME, G_CALLBACK(SFUNC), SDATA)
+
+#define XS_WINDOW_PRESENT(XX) gtk_window_present(GTK_WINDOW( XX ))
 
 #ifdef __cplusplus
 }
--- a/src/sid/xs_about.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sid/xs_about.c	Fri Jun 13 05:57:25 2008 +0300
@@ -37,16 +37,16 @@
  */
 gint xs_about_theme(void)
 {
-	const gint iSession = 0;	/* Assume session 0 */
-	gint iPos;
+    const gint iSession = 0;    /* Assume session 0 */
+    gint iPos;
 
-	/* Stop current song, add theme to playlist, play. */
-	xmms_remote_stop(iSession);
-	iPos = xmms_remote_get_playlist_length(iSession);
-	xmms_remote_playlist_add_url_string(iSession, THEMETUNE_FILE);
-	xmms_remote_set_playlist_pos(iSession, iPos);
-	xmms_remote_play(iSession);
-	return 0;
+    /* Stop current song, add theme to playlist, play. */
+    xmms_remote_stop(iSession);
+    iPos = xmms_remote_get_playlist_length(iSession);
+    xmms_remote_playlist_add_url_string(iSession, THEMETUNE_FILE);
+    xmms_remote_set_playlist_pos(iSession, iPos);
+    xmms_remote_play(iSession);
+    return 0;
 }
 #endif
 
@@ -60,167 +60,167 @@
  */
 void xs_about(void)
 {
-	GtkWidget *about_vbox1;
-	GtkWidget *about_frame;
-	GtkWidget *about_logo;
-	GdkPixmap *about_logo_pixmap = NULL, *about_logo_mask = NULL;
-	GtkWidget *about_scrwin;
-	GtkWidget *about_text;
-	GtkWidget *alignment6;
-	GtkWidget *about_close;
-	gchar tmpStr[64];
+    GtkWidget *about_vbox1;
+    GtkWidget *about_frame;
+    GtkWidget *about_logo;
+    GdkPixmap *about_logo_pixmap = NULL, *about_logo_mask = NULL;
+    GtkWidget *about_scrwin;
+    GtkWidget *about_text;
+    GtkWidget *alignment6;
+    GtkWidget *about_close;
+    gchar tmpStr[64];
 
-	/* Check if there already is an open about window */
-	if (xs_aboutwin != NULL) {
+    /* Check if there already is an open about window */
+    if (xs_aboutwin != NULL) {
                 gtk_window_present(GTK_WINDOW(xs_aboutwin));
-		return;
-	}
+        return;
+    }
 
-	/* No, create one ... */
-	xs_aboutwin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
-	gtk_window_set_type_hint(GTK_WINDOW(xs_aboutwin), GDK_WINDOW_TYPE_HINT_DIALOG);
-	gtk_widget_set_name(xs_aboutwin, "xs_aboutwin");
-	gtk_object_set_data(GTK_OBJECT(xs_aboutwin), "xs_aboutwin", xs_aboutwin);
-	g_snprintf(tmpStr, sizeof(tmpStr), _("About %s"), XS_PACKAGE_STRING);
-	gtk_window_set_title(GTK_WINDOW(xs_aboutwin), tmpStr);
-	gtk_window_set_default_size(GTK_WINDOW(xs_aboutwin), 350, -1);
+    /* No, create one ... */
+    xs_aboutwin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+    gtk_window_set_type_hint(GTK_WINDOW(xs_aboutwin), GDK_WINDOW_TYPE_HINT_DIALOG);
+    gtk_widget_set_name(xs_aboutwin, "xs_aboutwin");
+    gtk_object_set_data(GTK_OBJECT(xs_aboutwin), "xs_aboutwin", xs_aboutwin);
+    g_snprintf(tmpStr, sizeof(tmpStr), _("About %s"), XS_PACKAGE_STRING);
+    gtk_window_set_title(GTK_WINDOW(xs_aboutwin), tmpStr);
+    gtk_window_set_default_size(GTK_WINDOW(xs_aboutwin), 350, -1);
 
-	XS_SIGNAL_CONNECT(xs_aboutwin, "delete_event", xs_about_delete, NULL);
+    XS_SIGNAL_CONNECT(xs_aboutwin, "delete_event", xs_about_delete, NULL);
 
-	about_vbox1 = gtk_vbox_new(FALSE, 0);
-	gtk_widget_set_name(about_vbox1, "about_vbox1");
-	gtk_widget_ref(about_vbox1);
-	gtk_object_set_data_full(GTK_OBJECT(xs_aboutwin), "about_vbox1", about_vbox1,
-				 (GtkDestroyNotify) gtk_widget_unref);
-	gtk_widget_show(about_vbox1);
-	gtk_container_add(GTK_CONTAINER(xs_aboutwin), about_vbox1);
+    about_vbox1 = gtk_vbox_new(FALSE, 0);
+    gtk_widget_set_name(about_vbox1, "about_vbox1");
+    gtk_widget_ref(about_vbox1);
+    gtk_object_set_data_full(GTK_OBJECT(xs_aboutwin), "about_vbox1", about_vbox1,
+                 (GtkDestroyNotify) gtk_widget_unref);
+    gtk_widget_show(about_vbox1);
+    gtk_container_add(GTK_CONTAINER(xs_aboutwin), about_vbox1);
 
 #ifdef HAVE_THEMETUNE
-	about_frame = gtk_button_new();
+    about_frame = gtk_button_new();
 #else
-	about_frame = gtk_frame_new(NULL);
+    about_frame = gtk_frame_new(NULL);
 #endif
-	gtk_widget_set_name(about_frame, "about_frame");
-	gtk_widget_ref(about_frame);
-	gtk_object_set_data_full(GTK_OBJECT(xs_aboutwin), "about_frame", about_frame,
-				 (GtkDestroyNotify) gtk_widget_unref);
-	gtk_widget_show(about_frame);
-	gtk_box_pack_start(GTK_BOX(about_vbox1), about_frame, FALSE, FALSE, 0);
-	gtk_container_set_border_width(GTK_CONTAINER(about_frame), 4);
+    gtk_widget_set_name(about_frame, "about_frame");
+    gtk_widget_ref(about_frame);
+    gtk_object_set_data_full(GTK_OBJECT(xs_aboutwin), "about_frame", about_frame,
+                 (GtkDestroyNotify) gtk_widget_unref);
+    gtk_widget_show(about_frame);
+    gtk_box_pack_start(GTK_BOX(about_vbox1), about_frame, FALSE, FALSE, 0);
+    gtk_container_set_border_width(GTK_CONTAINER(about_frame), 4);
 
 #ifdef HAVE_THEMETUNE
-	gtk_signal_connect(GTK_OBJECT(about_frame), "clicked", GTK_SIGNAL_FUNC(xs_about_theme), NULL);
+    gtk_signal_connect(GTK_OBJECT(about_frame), "clicked", GTK_SIGNAL_FUNC(xs_about_theme), NULL);
 #else
-	gtk_frame_set_shadow_type(GTK_FRAME(about_frame), GTK_SHADOW_OUT);
+    gtk_frame_set_shadow_type(GTK_FRAME(about_frame), GTK_SHADOW_OUT);
 #endif
 
-	/* Create the Gdk data for logo pixmap */
-	gtk_widget_realize(xs_aboutwin);
-	about_logo_pixmap = gdk_pixmap_create_from_xpm_d(
-		xs_aboutwin->window, &about_logo_mask,
-		NULL, (gchar **) xmms_sid_logo_xpm);
+    /* Create the Gdk data for logo pixmap */
+    gtk_widget_realize(xs_aboutwin);
+    about_logo_pixmap = gdk_pixmap_create_from_xpm_d(
+        xs_aboutwin->window, &about_logo_mask,
+        NULL, (gchar **) xmms_sid_logo_xpm);
 
-	about_logo = gtk_pixmap_new(about_logo_pixmap, about_logo_mask);
+    about_logo = gtk_pixmap_new(about_logo_pixmap, about_logo_mask);
 
-	/* Create logo widget */
-	gtk_widget_set_name(about_logo, "about_logo");
-	gtk_widget_ref(about_logo);
-	gtk_object_set_data_full(GTK_OBJECT(xs_aboutwin), "about_logo", about_logo,
-		(GtkDestroyNotify) gtk_widget_unref);
-	gtk_widget_show(about_logo);
-	gtk_container_add(GTK_CONTAINER(about_frame), about_logo);
-	gtk_misc_set_padding(GTK_MISC(about_logo), 0, 6);
+    /* Create logo widget */
+    gtk_widget_set_name(about_logo, "about_logo");
+    gtk_widget_ref(about_logo);
+    gtk_object_set_data_full(GTK_OBJECT(xs_aboutwin), "about_logo", about_logo,
+        (GtkDestroyNotify) gtk_widget_unref);
+    gtk_widget_show(about_logo);
+    gtk_container_add(GTK_CONTAINER(about_frame), about_logo);
+    gtk_misc_set_padding(GTK_MISC(about_logo), 0, 6);
 
-	about_scrwin = gtk_scrolled_window_new(NULL, NULL);
-	gtk_widget_set_name(about_scrwin, "about_scrwin");
-	gtk_widget_ref(about_scrwin);
-	gtk_object_set_data_full(GTK_OBJECT(xs_aboutwin), "about_scrwin", about_scrwin,
-		(GtkDestroyNotify) gtk_widget_unref);
-	gtk_widget_show(about_scrwin);
-	gtk_box_pack_start(GTK_BOX(about_vbox1), about_scrwin, TRUE, TRUE, 0);
-	gtk_container_set_border_width(GTK_CONTAINER(about_scrwin), 8);
-	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(about_scrwin),
-		GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
+    about_scrwin = gtk_scrolled_window_new(NULL, NULL);
+    gtk_widget_set_name(about_scrwin, "about_scrwin");
+    gtk_widget_ref(about_scrwin);
+    gtk_object_set_data_full(GTK_OBJECT(xs_aboutwin), "about_scrwin", about_scrwin,
+        (GtkDestroyNotify) gtk_widget_unref);
+    gtk_widget_show(about_scrwin);
+    gtk_box_pack_start(GTK_BOX(about_vbox1), about_scrwin, TRUE, TRUE, 0);
+    gtk_container_set_border_width(GTK_CONTAINER(about_scrwin), 8);
+    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(about_scrwin),
+        GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
 
-	about_text = gtk_text_view_new();
-	gtk_widget_set_name(about_text, "about_text");
-	gtk_widget_ref(about_text);
-	gtk_object_set_data_full(GTK_OBJECT(xs_aboutwin), "about_text", about_text,
-		(GtkDestroyNotify) gtk_widget_unref);
-	gtk_widget_show(about_text);
-	gtk_container_add(GTK_CONTAINER(about_scrwin), about_text);
-	gtk_widget_set_usize(about_text, -2, 100);
-	gtk_text_buffer_set_text(
-	GTK_TEXT_BUFFER(gtk_text_view_get_buffer(GTK_TEXT_VIEW(about_text))),
-			"\n"
-			"This release of XMMS-SID is dedicated to\n"
-			"            Richard Joseph\n"
-			"                  and\n"
-			"      Lauri Sipilä (aka Xaztur/PWP)\n"
-			" - Now gone, but forever in our hearts -\n"
-			"\n"
-			"\n"
-			"(C) Copyright 1999-2007\n"
-			"\tTecnic Software productions (TNSP)\n"
-			"\tLicensed under GNU GPL v2\n"
-			"\n"
-			"Programming and design\n"
-			"\tMatti 'ccr' Hämäläinen\n"
-			"\n"
+    about_text = gtk_text_view_new();
+    gtk_widget_set_name(about_text, "about_text");
+    gtk_widget_ref(about_text);
+    gtk_object_set_data_full(GTK_OBJECT(xs_aboutwin), "about_text", about_text,
+        (GtkDestroyNotify) gtk_widget_unref);
+    gtk_widget_show(about_text);
+    gtk_container_add(GTK_CONTAINER(about_scrwin), about_text);
+    gtk_widget_set_usize(about_text, -2, 100);
+    gtk_text_buffer_set_text(
+    GTK_TEXT_BUFFER(gtk_text_view_get_buffer(GTK_TEXT_VIEW(about_text))),
+            "\n"
+            "This release of XMMS-SID is dedicated to\n"
+            "            Richard Joseph\n"
+            "                  and\n"
+            "      Lauri Sipilä (aka Xaztur/PWP)\n"
+            " - Now gone, but forever in our hearts -\n"
+            "\n"
+            "\n"
+            "(C) Copyright 1999-2007\n"
+            "\tTecnic Software productions (TNSP)\n"
+            "\tLicensed under GNU GPL v2\n"
+            "\n"
+            "Programming and design\n"
+            "\tMatti 'ccr' Hämäläinen\n"
+            "\n"
 #ifdef HAVE_SIDPLAY1
-			"libSIDPlay1 created by\n"
-			"\tMichael Schwendt\n" "\n"
+            "libSIDPlay1 created by\n"
+            "\tMichael Schwendt\n" "\n"
 #endif
 #ifdef HAVE_SIDPLAY2
-			"libSIDPlay2 and reSID created by\n"
-			"\tSimon White, Dag Lem,\n"
-			"\tMichael Schwendt and rest.\n"
-			"\n"
+            "libSIDPlay2 and reSID created by\n"
+            "\tSimon White, Dag Lem,\n"
+            "\tMichael Schwendt and rest.\n"
+            "\n"
 #endif
 #ifdef HAVE_THEMETUNE
-			"\"Kummatti City\", theme of XMMS-SID 0.8\n"
-			"\tby Ari 'Agemixer' Yliaho\n"
-			"\t(C) Copyright 1998 Scallop\n"
-			"\t(Refer to README for license)\n" "\n"
+            "\"Kummatti City\", theme of XMMS-SID 0.8\n"
+            "\tby Ari 'Agemixer' Yliaho\n"
+            "\t(C) Copyright 1998 Scallop\n"
+            "\t(Refer to README for license)\n" "\n"
 #endif
-			"Original XMMS-SID (v0.4) by\n" "\tWillem Monsuwe\n" "\n"
+            "Original XMMS-SID (v0.4) by\n" "\tWillem Monsuwe\n" "\n"
 
-			"Greetings fly out to ...\n"
-			"\tEveryone at #Linux.Fi, #Fireball,\n"
-			"\t#TNSP and #c-64 of IRCNet, #xmms\n"
-			"\tof Freenode.net.\n"
-			"\n"
-			"\tDekadence, PWP, Byterapers,\n"
-			"\tmfx, Unique, Fairlight, iSO,\n"
-			"\tWrath Designs, Padua, Extend,\n"
-			"\tPHn, Creators, Cosine, tAAt,\n"
-			"\tViruz, Crest and Skalaria.\n" "\n"
+            "Greetings fly out to ...\n"
+            "\tEveryone at #Linux.Fi, #Fireball,\n"
+            "\t#TNSP and #c-64 of IRCNet, #xmms\n"
+            "\tof Freenode.net.\n"
+            "\n"
+            "\tDekadence, PWP, Byterapers,\n"
+            "\tmfx, Unique, Fairlight, iSO,\n"
+            "\tWrath Designs, Padua, Extend,\n"
+            "\tPHn, Creators, Cosine, tAAt,\n"
+            "\tViruz, Crest and Skalaria.\n" "\n"
 
-			"Special thanks\n"
-			"\tGerfried 'Alfie' Fuchs\n"
-			"\tAndreas 'mrsid' Varga\n"
-			"\tAll the betatesters.\n"
-			"\tAll the users!\n", -1);
+            "Special thanks\n"
+            "\tGerfried 'Alfie' Fuchs\n"
+            "\tAndreas 'mrsid' Varga\n"
+            "\tAll the betatesters.\n"
+            "\tAll the users!\n", -1);
 
-	alignment6 = gtk_alignment_new(0.5, 0.5, 0.18, 1);
-	gtk_widget_set_name(alignment6, "alignment6");
-	gtk_widget_ref(alignment6);
-	gtk_object_set_data_full(GTK_OBJECT(xs_aboutwin), "alignment6", alignment6,
-		 (GtkDestroyNotify) gtk_widget_unref);
-	gtk_widget_show(alignment6);
-	gtk_box_pack_start(GTK_BOX(about_vbox1), alignment6, FALSE, TRUE, 0);
-	gtk_container_set_border_width(GTK_CONTAINER(alignment6), 8);
+    alignment6 = gtk_alignment_new(0.5, 0.5, 0.18, 1);
+    gtk_widget_set_name(alignment6, "alignment6");
+    gtk_widget_ref(alignment6);
+    gtk_object_set_data_full(GTK_OBJECT(xs_aboutwin), "alignment6", alignment6,
+         (GtkDestroyNotify) gtk_widget_unref);
+    gtk_widget_show(alignment6);
+    gtk_box_pack_start(GTK_BOX(about_vbox1), alignment6, FALSE, TRUE, 0);
+    gtk_container_set_border_width(GTK_CONTAINER(alignment6), 8);
 
-	about_close = gtk_button_new_with_label(_("Close"));
-	gtk_widget_set_name(about_close, "about_close");
-	gtk_widget_ref(about_close);
-	gtk_object_set_data_full(GTK_OBJECT(xs_aboutwin), "about_close", about_close,
-		 (GtkDestroyNotify) gtk_widget_unref);
-	gtk_widget_show(about_close);
-	gtk_container_add(GTK_CONTAINER(alignment6), about_close);
-	GTK_WIDGET_SET_FLAGS(about_close, GTK_CAN_DEFAULT);
+    about_close = gtk_button_new_with_label(_("Close"));
+    gtk_widget_set_name(about_close, "about_close");
+    gtk_widget_ref(about_close);
+    gtk_object_set_data_full(GTK_OBJECT(xs_aboutwin), "about_close", about_close,
+         (GtkDestroyNotify) gtk_widget_unref);
+    gtk_widget_show(about_close);
+    gtk_container_add(GTK_CONTAINER(alignment6), about_close);
+    GTK_WIDGET_SET_FLAGS(about_close, GTK_CAN_DEFAULT);
 
-	XS_SIGNAL_CONNECT(about_close, "clicked", xs_about_ok, NULL);
+    XS_SIGNAL_CONNECT(about_close, "clicked", xs_about_ok, NULL);
 
-	gtk_widget_show(xs_aboutwin);
+    gtk_widget_show(xs_aboutwin);
 }
--- a/src/sid/xs_config.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sid/xs_config.c	Fri Jun 13 05:57:25 2008 +0300
@@ -24,32 +24,32 @@
 
 #ifdef AUDACIOUS_PLUGIN
 #include <audacious/plugin.h>
-#define XS_CONFIG_FILE		ConfigDb
-#define XS_CONFIG_OPEN		aud_cfg_db_open
-#define XS_CONFIG_FREE		aud_cfg_db_close
+#define XS_CONFIG_FILE      ConfigDb
+#define XS_CONFIG_OPEN      aud_cfg_db_open
+#define XS_CONFIG_FREE      aud_cfg_db_close
 
-#define XS_CFG_SET_STRING	aud_cfg_db_set_string
-#define XS_CFG_SET_FLOAT	aud_cfg_db_set_float
-#define XS_CFG_SET_INT		aud_cfg_db_set_int
-#define XS_CFG_SET_BOOL		aud_cfg_db_set_bool
-#define XS_CFG_GET_STRING	aud_cfg_db_get_string
-#define XS_CFG_GET_FLOAT	aud_cfg_db_get_float
-#define XS_CFG_GET_INT		aud_cfg_db_get_int
-#define XS_CFG_GET_BOOL		aud_cfg_db_get_bool
+#define XS_CFG_SET_STRING   aud_cfg_db_set_string
+#define XS_CFG_SET_FLOAT    aud_cfg_db_set_float
+#define XS_CFG_SET_INT      aud_cfg_db_set_int
+#define XS_CFG_SET_BOOL     aud_cfg_db_set_bool
+#define XS_CFG_GET_STRING   aud_cfg_db_get_string
+#define XS_CFG_GET_FLOAT    aud_cfg_db_get_float
+#define XS_CFG_GET_INT      aud_cfg_db_get_int
+#define XS_CFG_GET_BOOL     aud_cfg_db_get_bool
 #else
 #include <xmms/configfile.h>
-#define XS_CONFIG_FILE		ConfigFile
-#define XS_CONFIG_OPEN		xmms_cfg_open_default_file
-#define XS_CONFIG_FREE		xmms_cfg_free
+#define XS_CONFIG_FILE      ConfigFile
+#define XS_CONFIG_OPEN      xmms_cfg_open_default_file
+#define XS_CONFIG_FREE      xmms_cfg_free
 
-#define XS_CFG_SET_STRING	xmms_cfg_write_string
-#define XS_CFG_SET_FLOAT	xmms_cfg_write_float
-#define XS_CFG_SET_INT		xmms_cfg_write_int
-#define XS_CFG_SET_BOOL		xmms_cfg_write_boolean
-#define XS_CFG_GET_STRING	xmms_cfg_read_string
-#define XS_CFG_GET_FLOAT	xmms_cfg_read_float
-#define XS_CFG_GET_INT		xmms_cfg_read_int
-#define XS_CFG_GET_BOOL		xmms_cfg_read_boolean
+#define XS_CFG_SET_STRING   xmms_cfg_write_string
+#define XS_CFG_SET_FLOAT    xmms_cfg_write_float
+#define XS_CFG_SET_INT      xmms_cfg_write_int
+#define XS_CFG_SET_BOOL     xmms_cfg_write_boolean
+#define XS_CFG_GET_STRING   xmms_cfg_read_string
+#define XS_CFG_GET_FLOAT    xmms_cfg_read_float
+#define XS_CFG_GET_INT      xmms_cfg_read_int
+#define XS_CFG_GET_BOOL     xmms_cfg_read_boolean
 #endif
 #include <stdio.h>
 #include <ctype.h>
@@ -62,20 +62,20 @@
  * Global widgets
  */
 static GtkWidget *xs_configwin = NULL,
-	*xs_sldb_fileselector = NULL,
-	*xs_stil_fileselector = NULL,
-	*xs_hvsc_selector = NULL,
-	*xs_filt_importselector = NULL,
-	*xs_filt_exportselector = NULL;
+    *xs_sldb_fileselector = NULL,
+    *xs_stil_fileselector = NULL,
+    *xs_hvsc_selector = NULL,
+    *xs_filt_importselector = NULL,
+    *xs_filt_exportselector = NULL;
 
-#define LUW(x)	lookup_widget(xs_configwin, x)
+#define LUW(x)    lookup_widget(xs_configwin, x)
 
 /* Samplerates
  */
 static const gchar *xs_samplerates_table[] = {
-	"8000", "11025", "22050", 
-	"44100", "48000", "64000",
-	"96000"
+    "8000", "11025", "22050", 
+    "44100", "48000", "64000",
+    "96000"
 };
 
 static const gint xs_nsamplerates_table = (sizeof(xs_samplerates_table) / sizeof(xs_samplerates_table[0]));
@@ -84,171 +84,171 @@
  * Configuration specific stuff
  */
 XS_MUTEX(xs_cfg);
-struct t_xs_cfg xs_cfg;
+struct xs_cfg_t xs_cfg;
 
-static t_xs_cfg_item xs_cfgtable[] = {
-{ CTYPE_INT,	&xs_cfg.audioBitsPerSample,	"audioBitsPerSample" },
-{ CTYPE_INT,	&xs_cfg.audioChannels,		"audioChannels" },
-{ CTYPE_INT,	&xs_cfg.audioFrequency,		"audioFrequency" },
+static xs_cfg_item_t xs_cfgtable[] = {
+{ CTYPE_INT,    &xs_cfg.audioBitsPerSample,     "audioBitsPerSample" },
+{ CTYPE_INT,    &xs_cfg.audioChannels,          "audioChannels" },
+{ CTYPE_INT,    &xs_cfg.audioFrequency,         "audioFrequency" },
 
-{ CTYPE_BOOL,	&xs_cfg.mos8580,		"mos8580" },
-{ CTYPE_BOOL,	&xs_cfg.forceModel,		"forceModel" },
-{ CTYPE_BOOL,	&xs_cfg.emulateFilters,		"emulateFilters" },
-{ CTYPE_FLOAT,	&xs_cfg.sid1FilterFs,		"filterFs" },
-{ CTYPE_FLOAT,	&xs_cfg.sid1FilterFm,		"filterFm" },
-{ CTYPE_FLOAT,	&xs_cfg.sid1FilterFt,		"filterFt" },
-{ CTYPE_INT,	&xs_cfg.memoryMode,		"memoryMode" },
-{ CTYPE_INT,	&xs_cfg.clockSpeed,		"clockSpeed" },
-{ CTYPE_BOOL,	&xs_cfg.forceSpeed,		"forceSpeed" },
+{ CTYPE_BOOL,   &xs_cfg.mos8580,                "mos8580" },
+{ CTYPE_BOOL,   &xs_cfg.forceModel,             "forceModel" },
+{ CTYPE_BOOL,   &xs_cfg.emulateFilters,         "emulateFilters" },
+{ CTYPE_FLOAT,  &xs_cfg.sid1FilterFs,           "filterFs" },
+{ CTYPE_FLOAT,  &xs_cfg.sid1FilterFm,           "filterFm" },
+{ CTYPE_FLOAT,  &xs_cfg.sid1FilterFt,           "filterFt" },
+{ CTYPE_INT,    &xs_cfg.memoryMode,             "memoryMode" },
+{ CTYPE_INT,    &xs_cfg.clockSpeed,             "clockSpeed" },
+{ CTYPE_BOOL,   &xs_cfg.forceSpeed,             "forceSpeed" },
 
-{ CTYPE_INT,	&xs_cfg.playerEngine,		"playerEngine" },
+{ CTYPE_INT,    &xs_cfg.playerEngine,           "playerEngine" },
 
-{ CTYPE_INT,	&xs_cfg.sid2Builder,		"sid2Builder" },
-{ CTYPE_INT,	&xs_cfg.sid2OptLevel,		"sid2OptLevel" },
-{ CTYPE_INT,	&xs_cfg.sid2NFilterPresets,	"sid2NFilterPresets" },
+{ CTYPE_INT,    &xs_cfg.sid2Builder,            "sid2Builder" },
+{ CTYPE_INT,    &xs_cfg.sid2OptLevel,           "sid2OptLevel" },
+{ CTYPE_INT,    &xs_cfg.sid2NFilterPresets,     "sid2NFilterPresets" },
 
-{ CTYPE_BOOL,	&xs_cfg.oversampleEnable,	"oversampleEnable" },
-{ CTYPE_INT,	&xs_cfg.oversampleFactor,	"oversampleFactor" },
+{ CTYPE_BOOL,   &xs_cfg.oversampleEnable,       "oversampleEnable" },
+{ CTYPE_INT,    &xs_cfg.oversampleFactor,       "oversampleFactor" },
 
-{ CTYPE_BOOL,	&xs_cfg.playMaxTimeEnable,	"playMaxTimeEnable" },
-{ CTYPE_BOOL,	&xs_cfg.playMaxTimeUnknown,	"playMaxTimeUnknown" },
-{ CTYPE_INT,	&xs_cfg.playMaxTime,		"playMaxTime" },
-{ CTYPE_BOOL,	&xs_cfg.playMinTimeEnable,	"playMinTimeEnable" },
-{ CTYPE_INT,	&xs_cfg.playMinTime,		"playMinTime" },
-{ CTYPE_BOOL,	&xs_cfg.songlenDBEnable,	"songlenDBEnable" },
-{ CTYPE_STR,	&xs_cfg.songlenDBPath,		"songlenDBPath" },
+{ CTYPE_BOOL,   &xs_cfg.playMaxTimeEnable,      "playMaxTimeEnable" },
+{ CTYPE_BOOL,   &xs_cfg.playMaxTimeUnknown,     "playMaxTimeUnknown" },
+{ CTYPE_INT,    &xs_cfg.playMaxTime,            "playMaxTime" },
+{ CTYPE_BOOL,   &xs_cfg.playMinTimeEnable,      "playMinTimeEnable" },
+{ CTYPE_INT,    &xs_cfg.playMinTime,            "playMinTime" },
+{ CTYPE_BOOL,   &xs_cfg.songlenDBEnable,        "songlenDBEnable" },
+{ CTYPE_STR,    &xs_cfg.songlenDBPath,          "songlenDBPath" },
 
-{ CTYPE_BOOL,	&xs_cfg.stilDBEnable,		"stilDBEnable" },
-{ CTYPE_STR,	&xs_cfg.stilDBPath,		"stilDBPath" },
-{ CTYPE_STR,	&xs_cfg.hvscPath,		"hvscPath" },
+{ CTYPE_BOOL,   &xs_cfg.stilDBEnable,           "stilDBEnable" },
+{ CTYPE_STR,    &xs_cfg.stilDBPath,             "stilDBPath" },
+{ CTYPE_STR,    &xs_cfg.hvscPath,               "hvscPath" },
 
 #ifndef AUDACIOUS_PLUGIN
-{ CTYPE_INT,	&xs_cfg.subsongControl,		"subsongControl" },
-{ CTYPE_BOOL,	&xs_cfg.detectMagic,		"detectMagic" },
+{ CTYPE_INT,    &xs_cfg.subsongControl,         "subsongControl" },
+{ CTYPE_BOOL,   &xs_cfg.detectMagic,            "detectMagic" },
 #endif
 
-{ CTYPE_BOOL,	&xs_cfg.titleOverride,		"titleOverride" },
-{ CTYPE_STR,	&xs_cfg.titleFormat,		"titleFormat" },
+{ CTYPE_BOOL,   &xs_cfg.titleOverride,          "titleOverride" },
+{ CTYPE_STR,    &xs_cfg.titleFormat,            "titleFormat" },
 
-{ CTYPE_BOOL,	&xs_cfg.subAutoEnable,		"subAutoEnable" },
-{ CTYPE_BOOL,	&xs_cfg.subAutoMinOnly,		"subAutoMinOnly" },
-{ CTYPE_INT,	&xs_cfg.subAutoMinTime,		"subAutoMinTime" },
+{ CTYPE_BOOL,   &xs_cfg.subAutoEnable,          "subAutoEnable" },
+{ CTYPE_BOOL,   &xs_cfg.subAutoMinOnly,         "subAutoMinOnly" },
+{ CTYPE_INT,    &xs_cfg.subAutoMinTime,         "subAutoMinTime" },
 };
 
-static const gint xs_cfgtable_max = (sizeof(xs_cfgtable) / sizeof(t_xs_cfg_item));
+static const gint xs_cfgtable_max = (sizeof(xs_cfgtable) / sizeof(xs_cfgtable[0]));
 
 
-static t_xs_wid_item xs_widtable[] = {
-{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_res_16bit",	&xs_cfg.audioBitsPerSample,	XS_RES_16BIT },
-{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_res_8bit",		&xs_cfg.audioBitsPerSample,	XS_RES_8BIT },
-{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_chn_mono",		&xs_cfg.audioChannels,		XS_CHN_MONO },
-{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_chn_stereo",	&xs_cfg.audioChannels,		XS_CHN_STEREO },
-{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_chn_autopan",	&xs_cfg.audioChannels,		XS_CHN_AUTOPAN },
-{ WTYPE_COMBO,	CTYPE_INT,	"cfg_samplerate",	&xs_cfg.audioFrequency,		XS_AUDIO_FREQ },
-{ WTYPE_BUTTON,	CTYPE_BOOL,	"cfg_oversample",	&xs_cfg.oversampleEnable,	0 },
-{ WTYPE_SPIN,	CTYPE_INT,	"cfg_oversample_factor",&xs_cfg.oversampleFactor,	0 },
+static xs_wid_item_t xs_widtable[] = {
+{ WTYPE_BGROUP, CTYPE_INT,      "cfg_res_16bit",        &xs_cfg.audioBitsPerSample,     XS_RES_16BIT },
+{ WTYPE_BGROUP, CTYPE_INT,      "cfg_res_8bit",         &xs_cfg.audioBitsPerSample,     XS_RES_8BIT },
+{ WTYPE_BGROUP, CTYPE_INT,      "cfg_chn_mono",         &xs_cfg.audioChannels,          XS_CHN_MONO },
+{ WTYPE_BGROUP, CTYPE_INT,      "cfg_chn_stereo",       &xs_cfg.audioChannels,          XS_CHN_STEREO },
+{ WTYPE_BGROUP, CTYPE_INT,      "cfg_chn_autopan",      &xs_cfg.audioChannels,          XS_CHN_AUTOPAN },
+{ WTYPE_COMBO,  CTYPE_INT,      "cfg_samplerate",       &xs_cfg.audioFrequency,         XS_AUDIO_FREQ },
+{ WTYPE_BUTTON, CTYPE_BOOL,     "cfg_oversample",       &xs_cfg.oversampleEnable,       0 },
+{ WTYPE_SPIN,   CTYPE_INT,      "cfg_oversample_factor",&xs_cfg.oversampleFactor,       0 },
 
-{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_emu_sidplay1",	&xs_cfg.playerEngine,		XS_ENG_SIDPLAY1 },
-{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_emu_sidplay2",	&xs_cfg.playerEngine,		XS_ENG_SIDPLAY2 },
-{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_emu_mem_real",	&xs_cfg.memoryMode,		XS_MPU_REAL },
-{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_emu_mem_banksw",	&xs_cfg.memoryMode,		XS_MPU_BANK_SWITCHING },
-{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_emu_mem_transrom",	&xs_cfg.memoryMode,		XS_MPU_TRANSPARENT_ROM },
-{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_emu_mem_playsid",	&xs_cfg.memoryMode,		XS_MPU_PLAYSID_ENVIRONMENT },
+{ WTYPE_BGROUP, CTYPE_INT,      "cfg_emu_sidplay1",     &xs_cfg.playerEngine,           XS_ENG_SIDPLAY1 },
+{ WTYPE_BGROUP, CTYPE_INT,      "cfg_emu_sidplay2",     &xs_cfg.playerEngine,           XS_ENG_SIDPLAY2 },
+{ WTYPE_BGROUP, CTYPE_INT,      "cfg_emu_mem_real",     &xs_cfg.memoryMode,             XS_MPU_REAL },
+{ WTYPE_BGROUP, CTYPE_INT,      "cfg_emu_mem_banksw",   &xs_cfg.memoryMode,             XS_MPU_BANK_SWITCHING },
+{ WTYPE_BGROUP, CTYPE_INT,      "cfg_emu_mem_transrom", &xs_cfg.memoryMode,             XS_MPU_TRANSPARENT_ROM },
+{ WTYPE_BGROUP, CTYPE_INT,      "cfg_emu_mem_playsid",  &xs_cfg.memoryMode,             XS_MPU_PLAYSID_ENVIRONMENT },
 
-{ WTYPE_BUTTON,	CTYPE_BOOL,	"cfg_emu_mos8580",	&xs_cfg.mos8580,		0 },
-{ WTYPE_BUTTON,	CTYPE_BOOL,	"cfg_emu_sid_force",	&xs_cfg.forceModel,		0 },
-{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_emu_clock_ntsc",	&xs_cfg.clockSpeed,		XS_CLOCK_NTSC },
-{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_emu_clock_pal",	&xs_cfg.clockSpeed,		XS_CLOCK_PAL },
-{ WTYPE_BUTTON,	CTYPE_BOOL,	"cfg_emu_clock_force",	&xs_cfg.forceSpeed,		0 },
-{ WTYPE_BUTTON,	CTYPE_BOOL,	"cfg_emu_sp2_opt",	&xs_cfg.sid2OptLevel,		0 },
+{ WTYPE_BUTTON, CTYPE_BOOL,     "cfg_emu_mos8580",      &xs_cfg.mos8580,                0 },
+{ WTYPE_BUTTON, CTYPE_BOOL,     "cfg_emu_sid_force",    &xs_cfg.forceModel,             0 },
+{ WTYPE_BGROUP, CTYPE_INT,      "cfg_emu_clock_ntsc",   &xs_cfg.clockSpeed,             XS_CLOCK_NTSC },
+{ WTYPE_BGROUP, CTYPE_INT,      "cfg_emu_clock_pal",    &xs_cfg.clockSpeed,             XS_CLOCK_PAL },
+{ WTYPE_BUTTON, CTYPE_BOOL,     "cfg_emu_clock_force",  &xs_cfg.forceSpeed,             0 },
+{ WTYPE_BUTTON, CTYPE_BOOL,     "cfg_emu_sp2_opt",      &xs_cfg.sid2OptLevel,           0 },
 
-{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_emu_sp2_resid",	&xs_cfg.sid2Builder,		XS_BLD_RESID },
-{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_emu_sp2_hardsid",	&xs_cfg.sid2Builder,		XS_BLD_HARDSID },
+{ WTYPE_BGROUP, CTYPE_INT,      "cfg_emu_sp2_resid",    &xs_cfg.sid2Builder,            XS_BLD_RESID },
+{ WTYPE_BGROUP, CTYPE_INT,      "cfg_emu_sp2_hardsid",  &xs_cfg.sid2Builder,            XS_BLD_HARDSID },
 
-{ WTYPE_BUTTON,	CTYPE_BOOL,	"cfg_emu_filters",	&xs_cfg.emulateFilters,		0 },
-{ WTYPE_SCALE,	CTYPE_FLOAT,	"cfg_sp1_filter_fs",	&xs_cfg.sid1FilterFs,		0 },
-{ WTYPE_SCALE,	CTYPE_FLOAT,	"cfg_sp1_filter_fm",	&xs_cfg.sid1FilterFm,		0 },
-{ WTYPE_SCALE,	CTYPE_FLOAT,	"cfg_sp1_filter_ft",	&xs_cfg.sid1FilterFt,		0 },
+{ WTYPE_BUTTON, CTYPE_BOOL,     "cfg_emu_filters",      &xs_cfg.emulateFilters,         0 },
+{ WTYPE_SCALE,  CTYPE_FLOAT,    "cfg_sp1_filter_fs",    &xs_cfg.sid1FilterFs,           0 },
+{ WTYPE_SCALE,  CTYPE_FLOAT,    "cfg_sp1_filter_fm",    &xs_cfg.sid1FilterFm,           0 },
+{ WTYPE_SCALE,  CTYPE_FLOAT,    "cfg_sp1_filter_ft",    &xs_cfg.sid1FilterFt,           0 },
 
-{ WTYPE_BUTTON,	CTYPE_BOOL,	"cfg_maxtime_enable",	&xs_cfg.playMaxTimeEnable,	0 },
-{ WTYPE_BUTTON,	CTYPE_BOOL,	"cfg_maxtime_unknown",	&xs_cfg.playMaxTimeUnknown,	0 },
-{ WTYPE_SPIN,	CTYPE_INT,	"cfg_maxtime",		&xs_cfg.playMaxTime,		0 },
-{ WTYPE_BUTTON,	CTYPE_BOOL,	"cfg_mintime_enable",	&xs_cfg.playMinTimeEnable,	0 },
-{ WTYPE_SPIN,	CTYPE_INT,	"cfg_mintime",		&xs_cfg.playMinTime,		0 },
-{ WTYPE_BUTTON,	CTYPE_BOOL,	"cfg_sld_enable",	&xs_cfg.songlenDBEnable,	0 },
-{ WTYPE_TEXT,	CTYPE_STR,	"cfg_sld_dbpath",	&xs_cfg.songlenDBPath,		0 },
+{ WTYPE_BUTTON, CTYPE_BOOL,     "cfg_maxtime_enable",   &xs_cfg.playMaxTimeEnable,      0 },
+{ WTYPE_BUTTON, CTYPE_BOOL,     "cfg_maxtime_unknown",  &xs_cfg.playMaxTimeUnknown,     0 },
+{ WTYPE_SPIN,   CTYPE_INT,      "cfg_maxtime",          &xs_cfg.playMaxTime,            0 },
+{ WTYPE_BUTTON, CTYPE_BOOL,     "cfg_mintime_enable",   &xs_cfg.playMinTimeEnable,      0 },
+{ WTYPE_SPIN,   CTYPE_INT,      "cfg_mintime",          &xs_cfg.playMinTime,            0 },
+{ WTYPE_BUTTON, CTYPE_BOOL,     "cfg_sld_enable",       &xs_cfg.songlenDBEnable,        0 },
+{ WTYPE_TEXT,   CTYPE_STR,      "cfg_sld_dbpath",       &xs_cfg.songlenDBPath,          0 },
 
-{ WTYPE_BUTTON,	CTYPE_BOOL,	"cfg_stil_enable",	&xs_cfg.stilDBEnable,		0 },
-{ WTYPE_TEXT,	CTYPE_STR,	"cfg_stil_dbpath",	&xs_cfg.stilDBPath,		0 },
-{ WTYPE_TEXT,	CTYPE_STR,	"cfg_hvsc_path",	&xs_cfg.hvscPath,		0 },
+{ WTYPE_BUTTON, CTYPE_BOOL,     "cfg_stil_enable",      &xs_cfg.stilDBEnable,           0 },
+{ WTYPE_TEXT,   CTYPE_STR,      "cfg_stil_dbpath",      &xs_cfg.stilDBPath,             0 },
+{ WTYPE_TEXT,   CTYPE_STR,      "cfg_hvsc_path",        &xs_cfg.hvscPath,               0 },
 
 #ifndef AUDACIOUS_PLUGIN
-{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_subctrl_none",	&xs_cfg.subsongControl,		XS_SSC_NONE },
-{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_subctrl_seek",	&xs_cfg.subsongControl,		XS_SSC_SEEK },
-{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_subctrl_popup",	&xs_cfg.subsongControl,		XS_SSC_POPUP },
-{ WTYPE_BGROUP,	CTYPE_INT,	"cfg_subctrl_patch",	&xs_cfg.subsongControl,		XS_SSC_PATCH },
+{ WTYPE_BGROUP, CTYPE_INT,      "cfg_subctrl_none",     &xs_cfg.subsongControl,         XS_SSC_NONE },
+{ WTYPE_BGROUP, CTYPE_INT,      "cfg_subctrl_seek",     &xs_cfg.subsongControl,         XS_SSC_SEEK },
+{ WTYPE_BGROUP, CTYPE_INT,      "cfg_subctrl_popup",    &xs_cfg.subsongControl,         XS_SSC_POPUP },
+{ WTYPE_BGROUP, CTYPE_INT,      "cfg_subctrl_patch",    &xs_cfg.subsongControl,         XS_SSC_PATCH },
 
-{ WTYPE_BUTTON,	CTYPE_BOOL,	"cfg_detectmagic",	&xs_cfg.detectMagic,		0 },
+{ WTYPE_BUTTON, CTYPE_BOOL,     "cfg_detectmagic",      &xs_cfg.detectMagic,            0 },
 #endif
 
-{ WTYPE_BUTTON,	CTYPE_BOOL,	"cfg_ftitle_override",	&xs_cfg.titleOverride,		0 },
-{ WTYPE_TEXT,	CTYPE_STR,	"cfg_ftitle_format",	&xs_cfg.titleFormat,		0 },
+{ WTYPE_BUTTON, CTYPE_BOOL,     "cfg_ftitle_override",  &xs_cfg.titleOverride,          0 },
+{ WTYPE_TEXT,   CTYPE_STR,      "cfg_ftitle_format",    &xs_cfg.titleFormat,            0 },
 
-{ WTYPE_BUTTON,	CTYPE_BOOL,	"cfg_subauto_enable",	&xs_cfg.subAutoEnable,		0 },
-{ WTYPE_BUTTON,	CTYPE_BOOL,	"cfg_subauto_min_only",	&xs_cfg.subAutoMinOnly,		0 },
-{ WTYPE_SPIN,	CTYPE_INT,	"cfg_subauto_mintime",	&xs_cfg.subAutoMinTime,		0 },
+{ WTYPE_BUTTON, CTYPE_BOOL,     "cfg_subauto_enable",   &xs_cfg.subAutoEnable,          0 },
+{ WTYPE_BUTTON, CTYPE_BOOL,     "cfg_subauto_min_only", &xs_cfg.subAutoMinOnly,         0 },
+{ WTYPE_SPIN,   CTYPE_INT,      "cfg_subauto_mintime",  &xs_cfg.subAutoMinTime,         0 },
 };
 
-static const gint xs_widtable_max = (sizeof(xs_widtable) / sizeof(t_xs_wid_item));
+static const gint xs_widtable_max = (sizeof(xs_widtable) / sizeof(xs_widtable[0]));
 
 
 /* Reset/initialize the configuration
  */
 void xs_init_configuration(void)
 {
-	/* Lock configuration mutex */
-	XSDEBUG("initializing configuration ...\n");
-	XS_MUTEX_LOCK(xs_cfg);
+    /* Lock configuration mutex */
+    XSDEBUG("initializing configuration ...\n");
+    XS_MUTEX_LOCK(xs_cfg);
 
-	memset(&xs_cfg, 0, sizeof(xs_cfg));
-	
-	/* Initialize values with sensible defaults */
-	xs_cfg.audioBitsPerSample = XS_RES_16BIT;
-	xs_cfg.audioChannels = XS_CHN_MONO;
-	xs_cfg.audioFrequency = XS_AUDIO_FREQ;
+    memset(&xs_cfg, 0, sizeof(xs_cfg));
+    
+    /* Initialize values with sensible defaults */
+    xs_cfg.audioBitsPerSample = XS_RES_16BIT;
+    xs_cfg.audioChannels = XS_CHN_MONO;
+    xs_cfg.audioFrequency = XS_AUDIO_FREQ;
 
-	xs_cfg.mos8580 = FALSE;
-	xs_cfg.forceModel = FALSE;
+    xs_cfg.mos8580 = FALSE;
+    xs_cfg.forceModel = FALSE;
 
-	/* Filter values */
-	xs_cfg.emulateFilters = TRUE;
-	xs_cfg.sid1FilterFs = XS_SIDPLAY1_FS;
-	xs_cfg.sid1FilterFm = XS_SIDPLAY1_FM;
-	xs_cfg.sid1FilterFt = XS_SIDPLAY1_FT;
+    /* Filter values */
+    xs_cfg.emulateFilters = TRUE;
+    xs_cfg.sid1FilterFs = XS_SIDPLAY1_FS;
+    xs_cfg.sid1FilterFm = XS_SIDPLAY1_FM;
+    xs_cfg.sid1FilterFt = XS_SIDPLAY1_FT;
 
 #ifdef HAVE_SIDPLAY2
-	xs_cfg.playerEngine = XS_ENG_SIDPLAY2;
-	xs_cfg.memoryMode = XS_MPU_REAL;
+    xs_cfg.playerEngine = XS_ENG_SIDPLAY2;
+    xs_cfg.memoryMode = XS_MPU_REAL;
 #else
 #ifdef HAVE_SIDPLAY1
-	xs_cfg.playerEngine = XS_ENG_SIDPLAY1;
-	xs_cfg.memoryMode = XS_MPU_BANK_SWITCHING;
+    xs_cfg.playerEngine = XS_ENG_SIDPLAY1;
+    xs_cfg.memoryMode = XS_MPU_BANK_SWITCHING;
 #else
 #error This should not happen! No emulator engines configured in!
 #endif
 #endif
 
-	xs_cfg.clockSpeed = XS_CLOCK_PAL;
-	xs_cfg.forceSpeed = FALSE;
+    xs_cfg.clockSpeed = XS_CLOCK_PAL;
+    xs_cfg.forceSpeed = FALSE;
 
-	xs_cfg.sid2OptLevel = 0;
-	xs_cfg.sid2NFilterPresets = 0;
+    xs_cfg.sid2OptLevel = 0;
+    xs_cfg.sid2NFilterPresets = 0;
 
 #ifdef HAVE_RESID_BUILDER
-	xs_cfg.sid2Builder = XS_BLD_RESID;
+    xs_cfg.sid2Builder = XS_BLD_RESID;
 #else
 #ifdef HAVE_HARDSID_BUILDER
-	xs_cfg.sid2Builder = XS_BLD_HARDSID;
+    xs_cfg.sid2Builder = XS_BLD_HARDSID;
 #else
 #ifdef HAVE_SIDPLAY2
 #error This should not happen! No supported SIDPlay2 builders configured in!
@@ -256,47 +256,47 @@
 #endif
 #endif
 
-	xs_cfg.oversampleEnable = FALSE;
-	xs_cfg.oversampleFactor = XS_MIN_OVERSAMPLE;
+    xs_cfg.oversampleEnable = FALSE;
+    xs_cfg.oversampleFactor = XS_MIN_OVERSAMPLE;
 
-	xs_cfg.playMaxTimeEnable = FALSE;
-	xs_cfg.playMaxTimeUnknown = FALSE;
-	xs_cfg.playMaxTime = 150;
+    xs_cfg.playMaxTimeEnable = FALSE;
+    xs_cfg.playMaxTimeUnknown = FALSE;
+    xs_cfg.playMaxTime = 150;
 
-	xs_cfg.playMinTimeEnable = FALSE;
-	xs_cfg.playMinTime = 15;
+    xs_cfg.playMinTimeEnable = FALSE;
+    xs_cfg.playMinTime = 15;
 
-	xs_cfg.songlenDBEnable = FALSE;
-	xs_pstrcpy(&xs_cfg.songlenDBPath, "~/C64Music/Songlengths.txt");
+    xs_cfg.songlenDBEnable = FALSE;
+    xs_pstrcpy(&xs_cfg.songlenDBPath, "~/C64Music/Songlengths.txt");
 
-	xs_cfg.stilDBEnable = FALSE;
-	xs_pstrcpy(&xs_cfg.stilDBPath, "~/C64Music/DOCUMENTS/STIL.txt");
-	xs_pstrcpy(&xs_cfg.hvscPath, "~/C64Music");
+    xs_cfg.stilDBEnable = FALSE;
+    xs_pstrcpy(&xs_cfg.stilDBPath, "~/C64Music/DOCUMENTS/STIL.txt");
+    xs_pstrcpy(&xs_cfg.hvscPath, "~/C64Music");
 
 #if defined(HAVE_SONG_POSITION) && !defined(AUDACIOUS_PLUGIN)
-	xs_cfg.subsongControl = XS_SSC_PATCH;
+    xs_cfg.subsongControl = XS_SSC_PATCH;
 #else
-	xs_cfg.subsongControl = XS_SSC_POPUP;
+    xs_cfg.subsongControl = XS_SSC_POPUP;
 #endif
-	xs_cfg.detectMagic = FALSE;
+    xs_cfg.detectMagic = FALSE;
 
 #ifndef HAVE_XMMSEXTRA
-	xs_cfg.titleOverride = TRUE;
+    xs_cfg.titleOverride = TRUE;
 #endif
 
 #ifdef AUDACIOUS_PLUGIN
-	xs_pstrcpy(&xs_cfg.titleFormat, "${artist} - ${title} (${copyright}) <${subsong-id}/${subsong-num}> [${sid-model}/${sid-speed}]");
+    xs_pstrcpy(&xs_cfg.titleFormat, "${artist} - ${title} (${copyright}) <${subsong-id}/${subsong-num}> [${sid-model}/${sid-speed}]");
 #else
-	xs_pstrcpy(&xs_cfg.titleFormat, "%p - %t (%c) <%n/%N> [%m/%C]");
+    xs_pstrcpy(&xs_cfg.titleFormat, "%p - %t (%c) <%n/%N> [%m/%C]");
 #endif
 
-	xs_cfg.subAutoEnable = FALSE;
-	xs_cfg.subAutoMinOnly = TRUE;
-	xs_cfg.subAutoMinTime = 15;
+    xs_cfg.subAutoEnable = FALSE;
+    xs_cfg.subAutoMinOnly = TRUE;
+    xs_cfg.subAutoMinTime = 15;
 
 
-	/* Unlock the configuration */
-	XS_MUTEX_UNLOCK(xs_cfg);
+    /* Unlock the configuration */
+    XS_MUTEX_UNLOCK(xs_cfg);
 }
 
 
@@ -304,86 +304,86 @@
  */
 #define XS_FITEM (4 * 2)
 
-static gboolean xs_filter_load_into(XS_CONFIG_FILE *cfg, gint nFilter, t_xs_sid2_filter *pResult)
+static gboolean xs_filter_load_into(XS_CONFIG_FILE *cfg, gint nFilter, xs_sid2_filter_t *pResult)
 {
-	gchar tmpKey[64], *tmpStr;
-	gint i, j;
+    gchar tmpKey[64], *tmpStr;
+    gint i, j;
 
-	/* Get fields from config */
-	g_snprintf(tmpKey, sizeof(tmpKey), "filter%dNPoints", nFilter);
-	if (!XS_CFG_GET_INT(cfg, XS_CONFIG_IDENT, tmpKey, &(pResult->npoints)))
-		return FALSE;
-	
-	g_snprintf(tmpKey, sizeof(tmpKey), "filter%dName", nFilter);
-	if (!XS_CFG_GET_STRING(cfg, XS_CONFIG_IDENT, tmpKey, &tmpStr))
-		return FALSE;
-	
-	pResult->name = g_strdup(tmpStr);
-	if (pResult->name == NULL) {
-		g_free(pResult);
-		return FALSE;
-	}
-	
-	g_snprintf(tmpKey, sizeof(tmpKey), "filter%dPoints", nFilter);
-	if (!XS_CFG_GET_STRING(cfg, XS_CONFIG_IDENT, tmpKey, &tmpStr))
-		return FALSE;
-	
-	for (i = 0, j = 0; i < pResult->npoints; i++, j += XS_FITEM) {
-		if (sscanf(&tmpStr[j], "%4x%4x",
-			&(pResult->points[i].x),
-			&(pResult->points[i].y)) != 2)
-			return FALSE;
-	}
-	
-	return TRUE;
+    /* Get fields from config */
+    g_snprintf(tmpKey, sizeof(tmpKey), "filter%dNPoints", nFilter);
+    if (!XS_CFG_GET_INT(cfg, XS_CONFIG_IDENT, tmpKey, &(pResult->npoints)))
+        return FALSE;
+    
+    g_snprintf(tmpKey, sizeof(tmpKey), "filter%dName", nFilter);
+    if (!XS_CFG_GET_STRING(cfg, XS_CONFIG_IDENT, tmpKey, &tmpStr))
+        return FALSE;
+    
+    pResult->name = g_strdup(tmpStr);
+    if (pResult->name == NULL) {
+        g_free(pResult);
+        return FALSE;
+    }
+    
+    g_snprintf(tmpKey, sizeof(tmpKey), "filter%dPoints", nFilter);
+    if (!XS_CFG_GET_STRING(cfg, XS_CONFIG_IDENT, tmpKey, &tmpStr))
+        return FALSE;
+    
+    for (i = 0, j = 0; i < pResult->npoints; i++, j += XS_FITEM) {
+        if (sscanf(&tmpStr[j], "%4x%4x",
+            &(pResult->points[i].x),
+            &(pResult->points[i].y)) != 2)
+            return FALSE;
+    }
+    
+    return TRUE;
 }
 
 
-static t_xs_sid2_filter * xs_filter_load(XS_CONFIG_FILE *cfg, gint nFilter)
+static xs_sid2_filter_t * xs_filter_load(XS_CONFIG_FILE *cfg, gint nFilter)
 {
-	t_xs_sid2_filter *pResult;
-	
-	/* Allocate filter struct */
-	if ((pResult = g_malloc0(sizeof(t_xs_sid2_filter))) == NULL)
-		return NULL;
-	
-	if (!xs_filter_load_into(cfg, nFilter, pResult)) {
-		g_free(pResult);
-		return NULL;
-	} else
-		return pResult;
+    xs_sid2_filter_t *pResult;
+    
+    /* Allocate filter struct */
+    if ((pResult = g_malloc0(sizeof(xs_sid2_filter_t))) == NULL)
+        return NULL;
+    
+    if (!xs_filter_load_into(cfg, nFilter, pResult)) {
+        g_free(pResult);
+        return NULL;
+    } else
+        return pResult;
 }
 
 #if 0
-static gboolean xs_filter_save(XS_CONFIG_FILE *cfg, t_xs_sid2_filter *pFilter, gint nFilter)
+static gboolean xs_filter_save(XS_CONFIG_FILE *cfg, xs_sid2_filter_t *pFilter, gint nFilter)
 {
-	gchar *tmpValue, tmpKey[64];
-	gint i, j;
-	
-	/* Allocate memory for value string */
-	tmpValue = g_malloc(sizeof(gchar) * XS_FITEM * (pFilter->npoints + 1));
-	if (tmpValue == NULL)
-		return FALSE;
-	
-	/* Make value string */
-	for (i = 0, j = 0; i < pFilter->npoints; i++, j += XS_FITEM) {
-		g_snprintf(&tmpValue[j], XS_FITEM+1, "%04x%04x",
-			pFilter->points[i].x,
-			pFilter->points[i].y);
-	}
-	
-	/* Write into the configuration */
-	g_snprintf(tmpKey, sizeof(tmpKey), "filter%dName", nFilter);
-	XS_CFG_SET_STRING(cfg, XS_CONFIG_IDENT, tmpKey, pFilter->name);
-	
-	g_snprintf(tmpKey, sizeof(tmpKey), "filter%dNPoints", nFilter);
-	XS_CFG_SET_INT(cfg, XS_CONFIG_IDENT, tmpKey, pFilter->npoints);
+    gchar *tmpValue, tmpKey[64];
+    gint i, j;
+    
+    /* Allocate memory for value string */
+    tmpValue = g_malloc(sizeof(gchar) * XS_FITEM * (pFilter->npoints + 1));
+    if (tmpValue == NULL)
+        return FALSE;
+    
+    /* Make value string */
+    for (i = 0, j = 0; i < pFilter->npoints; i++, j += XS_FITEM) {
+        g_snprintf(&tmpValue[j], XS_FITEM+1, "%04x%04x",
+            pFilter->points[i].x,
+            pFilter->points[i].y);
+    }
+    
+    /* Write into the configuration */
+    g_snprintf(tmpKey, sizeof(tmpKey), "filter%dName", nFilter);
+    XS_CFG_SET_STRING(cfg, XS_CONFIG_IDENT, tmpKey, pFilter->name);
+    
+    g_snprintf(tmpKey, sizeof(tmpKey), "filter%dNPoints", nFilter);
+    XS_CFG_SET_INT(cfg, XS_CONFIG_IDENT, tmpKey, pFilter->npoints);
 
-	g_snprintf(tmpKey, sizeof(tmpKey), "filter%dPoints", nFilter);
-	XS_CFG_SET_STRING(cfg, XS_CONFIG_IDENT, tmpKey, tmpValue);
-	
-	g_free(tmpValue);
-	return TRUE;
+    g_snprintf(tmpKey, sizeof(tmpKey), "filter%dPoints", nFilter);
+    XS_CFG_SET_STRING(cfg, XS_CONFIG_IDENT, tmpKey, tmpValue);
+    
+    g_free(tmpValue);
+    return TRUE;
 }
 #endif
 
@@ -392,203 +392,203 @@
  */
 static gboolean xs_fgetitem(gchar *inLine, size_t *linePos, gchar sep, gchar *tmpStr, size_t tmpMax)
 {
-	size_t i;
-	for (i = 0; i < tmpMax && inLine[*linePos] &&
-		!isspace(inLine[*linePos]) &&
-		inLine[*linePos] != sep; i++, (*linePos)++)
-		tmpStr[i] = inLine[*linePos];
-	tmpStr[i] = 0;
-	xs_findnext(inLine, linePos);
-	return (inLine[*linePos] == sep);
+    size_t i;
+    for (i = 0; i < tmpMax && inLine[*linePos] &&
+        !isspace(inLine[*linePos]) &&
+        inLine[*linePos] != sep; i++, (*linePos)++)
+        tmpStr[i] = inLine[*linePos];
+    tmpStr[i] = 0;
+    xs_findnext(inLine, linePos);
+    return (inLine[*linePos] == sep);
 }
 
-static gboolean xs_filters_import(const gchar *pcFilename, t_xs_sid2_filter **pFilters, gint *nFilters)
+static gboolean xs_filters_import(const gchar *pcFilename, xs_sid2_filter_t **pFilters, gint *nFilters)
 {
-	FILE *inFile;
-	gchar inLine[XS_BUF_SIZE], tmpStr[XS_BUF_SIZE];
-	gchar *sectName = NULL;
-	gboolean sectBegin;
-	size_t lineNum, i;
-	t_xs_sid2_filter *tmpFilter;
+    FILE *inFile;
+    gchar inLine[XS_BUF_SIZE], tmpStr[XS_BUF_SIZE];
+    gchar *sectName = NULL;
+    gboolean sectBegin;
+    size_t lineNum, i;
+    xs_sid2_filter_t *tmpFilter;
 
 fprintf(stderr, "xs_filters_import(%s)\n", pcFilename);
 
-	if ((inFile = fopen(pcFilename, "ra")) == NULL)
-		return FALSE;
+    if ((inFile = fopen(pcFilename, "ra")) == NULL)
+        return FALSE;
 
 fprintf(stderr, "importing...\n");
-	
-	sectBegin = FALSE;
-	lineNum = 0;
-	while (fgets(inLine, XS_BUF_SIZE, inFile) != NULL) {
-		size_t linePos = 0;
-		lineNum++;
-		
-		xs_findnext(inLine, &linePos);
-		if (isalpha(inLine[linePos]) && sectBegin) {
-			/* A new key/value pair */
-			if (!xs_fgetitem(inLine, &linePos, '=', tmpStr, XS_BUF_SIZE)) {
-				fprintf(stderr, "invalid line: %s [expect =']'", inLine);
-			} else {
-				linePos++;
-				xs_findnext(inLine, &linePos);
-				if (!strncmp(tmpStr, "points", 6)) {
-					fprintf(stderr, "points=%s\n", &inLine[linePos]);
-				} else if (!strncmp(tmpStr, "point", 5)) {
-				} else if (!strncmp(tmpStr, "type", 4)) {
-				} else {
-					fprintf(stderr, "warning: ukn def: %s @ %s\n",
-						tmpStr, sectName);
-				}
-			}
-		} else if (inLine[linePos] == '[') {
-			/* Check for existing section */
-			if (sectBegin) {
-				/* Submit definition */
-				fprintf(stderr, "filter ends: %s\n", sectName);
-				if ((tmpFilter = g_malloc0(sizeof(t_xs_sid2_filter))) == NULL) {
-					fprintf(stderr, "could not allocate ..\n");
-				} else {
-					
-				}
-				g_free(sectName);
-			}
-			
-			/* New filter(?) section starts */
-			linePos++;
-			for (i = 0; i < XS_BUF_SIZE && inLine[linePos] && inLine[linePos] != ']'; i++, linePos++)
-				tmpStr[i] = inLine[linePos];
-			tmpStr[i] = 0;
-			
-			if (inLine[linePos] != ']') {
-				fprintf(stderr, "invalid! expected ']': %s\n", inLine);
-			} else {
-				sectName = strdup(tmpStr);
-				fprintf(stderr, "filter: %s\n", sectName);
-				sectBegin = TRUE;
-			}
-		} else if ((inLine[linePos] != ';') && (inLine[linePos] != 0)) {
-			/* Syntax error */
-			fprintf(stderr, "syntax error: %s\n", inLine);
-		}
-	}
-	
-	fclose(inFile);
-	return TRUE;
+    
+    sectBegin = FALSE;
+    lineNum = 0;
+    while (fgets(inLine, XS_BUF_SIZE, inFile) != NULL) {
+        size_t linePos = 0;
+        lineNum++;
+        
+        xs_findnext(inLine, &linePos);
+        if (isalpha(inLine[linePos]) && sectBegin) {
+            /* A new key/value pair */
+            if (!xs_fgetitem(inLine, &linePos, '=', tmpStr, XS_BUF_SIZE)) {
+                fprintf(stderr, "invalid line: %s [expect =']'", inLine);
+            } else {
+                linePos++;
+                xs_findnext(inLine, &linePos);
+                if (!strncmp(tmpStr, "points", 6)) {
+                    fprintf(stderr, "points=%s\n", &inLine[linePos]);
+                } else if (!strncmp(tmpStr, "point", 5)) {
+                } else if (!strncmp(tmpStr, "type", 4)) {
+                } else {
+                    fprintf(stderr, "warning: ukn def: %s @ %s\n",
+                        tmpStr, sectName);
+                }
+            }
+        } else if (inLine[linePos] == '[') {
+            /* Check for existing section */
+            if (sectBegin) {
+                /* Submit definition */
+                fprintf(stderr, "filter ends: %s\n", sectName);
+                if ((tmpFilter = g_malloc0(sizeof(xs_sid2_filter_t))) == NULL) {
+                    fprintf(stderr, "could not allocate ..\n");
+                } else {
+                    
+                }
+                g_free(sectName);
+            }
+            
+            /* New filter(?) section starts */
+            linePos++;
+            for (i = 0; i < XS_BUF_SIZE && inLine[linePos] && inLine[linePos] != ']'; i++, linePos++)
+                tmpStr[i] = inLine[linePos];
+            tmpStr[i] = 0;
+            
+            if (inLine[linePos] != ']') {
+                fprintf(stderr, "invalid! expected ']': %s\n", inLine);
+            } else {
+                sectName = strdup(tmpStr);
+                fprintf(stderr, "filter: %s\n", sectName);
+                sectBegin = TRUE;
+            }
+        } else if ((inLine[linePos] != ';') && (inLine[linePos] != 0)) {
+            /* Syntax error */
+            fprintf(stderr, "syntax error: %s\n", inLine);
+        }
+    }
+    
+    fclose(inFile);
+    return TRUE;
 }
 
 
-static gboolean xs_filters_export(const gchar *pcFilename, t_xs_sid2_filter **pFilters, gint nFilters)
+static gboolean xs_filters_export(const gchar *pcFilename, xs_sid2_filter_t **pFilters, gint nFilters)
 {
-	FILE *outFile;
-	t_xs_sid2_filter *f;
-	gint n;
-	
-	/* Open/create the file */
-	if ((outFile = fopen(pcFilename, "wa")) == NULL)
-		return FALSE;
-	
-	/* Header */
-	fprintf(outFile,
-		"; SIDPlay2 compatible filter definition file\n"
-		"; Exported by " PACKAGE_STRING "\n\n");
-	
-	/* Write each filter spec in "INI"-style format */
-	for (n = 0; n < nFilters; n++) {
-		gint i;
-		f = pFilters[n];
-		
-		fprintf(outFile,
-		"[%s]\n"
-		"type=1\n"
-		"points=%d\n",
-		f->name, f->npoints);
-	
-		for (i = 0; i < f->npoints; i++) {
-			fprintf(outFile,
-			"point%d=%d,%d\n",
-			i + 1,
-			f->points[i].x,
-			f->points[i].y);
-		}
-	
-		fprintf(outFile, "\n");
-		f++;
-	}
-	
-	fclose(outFile);
-	return TRUE;
+    FILE *outFile;
+    xs_sid2_filter_t *f;
+    gint n;
+    
+    /* Open/create the file */
+    if ((outFile = fopen(pcFilename, "wa")) == NULL)
+        return FALSE;
+    
+    /* Header */
+    fprintf(outFile,
+        "; SIDPlay2 compatible filter definition file\n"
+        "; Exported by " PACKAGE_STRING "\n\n");
+    
+    /* Write each filter spec in "INI"-style format */
+    for (n = 0; n < nFilters; n++) {
+        gint i;
+        f = pFilters[n];
+        
+        fprintf(outFile,
+        "[%s]\n"
+        "type=1\n"
+        "points=%d\n",
+        f->name, f->npoints);
+    
+        for (i = 0; i < f->npoints; i++) {
+            fprintf(outFile,
+            "point%d=%d,%d\n",
+            i + 1,
+            f->points[i].x,
+            f->points[i].y);
+        }
+    
+        fprintf(outFile, "\n");
+        f++;
+    }
+    
+    fclose(outFile);
+    return TRUE;
 }
 
 /* Get the configuration (from file or default)
  */
 void xs_read_configuration(void)
 {
-	XS_CONFIG_FILE *cfg;
-	gint i;
-	gchar *tmpStr;
+    XS_CONFIG_FILE *cfg;
+    gint i;
+    gchar *tmpStr;
 
-	/* Try to open the XMMS configuration file  */
-	XS_MUTEX_LOCK(xs_cfg);
-	XSDEBUG("loading from config-file ...\n");
+    /* Try to open the XMMS configuration file  */
+    XS_MUTEX_LOCK(xs_cfg);
+    XSDEBUG("loading from config-file ...\n");
 
-	cfg = XS_CONFIG_OPEN();
+    cfg = XS_CONFIG_OPEN();
 
-	if (cfg == NULL) {
-		XSDEBUG("Could not open configuration, trying to write defaults...\n");
-		xs_write_configuration();
-		return;
-	}
+    if (cfg == NULL) {
+        XSDEBUG("Could not open configuration, trying to write defaults...\n");
+        xs_write_configuration();
+        return;
+    }
 
-	/* Read the new settings from XMMS configuration file */
-	for (i = 0; i < xs_cfgtable_max; i++) {
-		switch (xs_cfgtable[i].itemType) {
-		case CTYPE_INT:
-			XS_CFG_GET_INT(cfg, XS_CONFIG_IDENT,
-				xs_cfgtable[i].itemName,
-				(gint *) xs_cfgtable[i].itemData);
-			break;
+    /* Read the new settings from XMMS configuration file */
+    for (i = 0; i < xs_cfgtable_max; i++) {
+        switch (xs_cfgtable[i].itemType) {
+        case CTYPE_INT:
+            XS_CFG_GET_INT(cfg, XS_CONFIG_IDENT,
+                xs_cfgtable[i].itemName,
+                (gint *) xs_cfgtable[i].itemData);
+            break;
 
-		case CTYPE_BOOL:
-			XS_CFG_GET_BOOL(cfg, XS_CONFIG_IDENT,
-				xs_cfgtable[i].itemName,
-				(gboolean *) xs_cfgtable[i].itemData);
-			break;
+        case CTYPE_BOOL:
+            XS_CFG_GET_BOOL(cfg, XS_CONFIG_IDENT,
+                xs_cfgtable[i].itemName,
+                (gboolean *) xs_cfgtable[i].itemData);
+            break;
 
-		case CTYPE_FLOAT:
-			XS_CFG_GET_FLOAT(cfg, XS_CONFIG_IDENT,
-				xs_cfgtable[i].itemName,
-				(gfloat *) xs_cfgtable[i].itemData);
-			break;
-		
-		case CTYPE_STR:
-			if (XS_CFG_GET_STRING(cfg, XS_CONFIG_IDENT,
-				xs_cfgtable[i].itemName, (gchar **) &tmpStr)) {
-				xs_pstrcpy((gchar **) xs_cfgtable[i].itemData, tmpStr);
-				g_free(tmpStr);
-			}
-			break;
-		}
-	}
-	
-	/* Filters and presets are a special case */
-	xs_filter_load_into(cfg, 0, &xs_cfg.sid2Filter);
-	
-	if (xs_cfg.sid2NFilterPresets > 0) {
-		xs_cfg.sid2FilterPresets = g_malloc0(xs_cfg.sid2NFilterPresets * sizeof(t_xs_sid2_filter *));
-		if (!xs_cfg.sid2FilterPresets) {
-			xs_error(_("Allocation of sid2FilterPresets structure failed!\n"));
-		} else {
-			for (i = 0; i < xs_cfg.sid2NFilterPresets; i++) {
-				xs_cfg.sid2FilterPresets[i] = xs_filter_load(cfg, i);
-			}
-		}
-	}
+        case CTYPE_FLOAT:
+            XS_CFG_GET_FLOAT(cfg, XS_CONFIG_IDENT,
+                xs_cfgtable[i].itemName,
+                (gfloat *) xs_cfgtable[i].itemData);
+            break;
+        
+        case CTYPE_STR:
+            if (XS_CFG_GET_STRING(cfg, XS_CONFIG_IDENT,
+                xs_cfgtable[i].itemName, (gchar **) &tmpStr)) {
+                xs_pstrcpy((gchar **) xs_cfgtable[i].itemData, tmpStr);
+                g_free(tmpStr);
+            }
+            break;
+        }
+    }
+    
+    /* Filters and presets are a special case */
+    xs_filter_load_into(cfg, 0, &xs_cfg.sid2Filter);
+    
+    if (xs_cfg.sid2NFilterPresets > 0) {
+        xs_cfg.sid2FilterPresets = g_malloc0(xs_cfg.sid2NFilterPresets * sizeof(xs_sid2_filter_t *));
+        if (!xs_cfg.sid2FilterPresets) {
+            xs_error("Allocation of sid2FilterPresets structure failed!\n");
+        } else {
+            for (i = 0; i < xs_cfg.sid2NFilterPresets; i++) {
+                xs_cfg.sid2FilterPresets[i] = xs_filter_load(cfg, i);
+            }
+        }
+    }
 
-	XS_CONFIG_FREE(cfg);
+    XS_CONFIG_FREE(cfg);
 
-	XS_MUTEX_UNLOCK(xs_cfg);
-	XSDEBUG("OK\n");
+    XS_MUTEX_UNLOCK(xs_cfg);
+    XSDEBUG("OK\n");
 }
 
 
@@ -596,58 +596,58 @@
  */
 gint xs_write_configuration(void)
 {
-	XS_CONFIG_FILE *cfg;
-	gint i;
+    XS_CONFIG_FILE *cfg;
+    gint i;
 
-	XSDEBUG("writing configuration ...\n");
-	XS_MUTEX_LOCK(xs_cfg);
+    XSDEBUG("writing configuration ...\n");
+    XS_MUTEX_LOCK(xs_cfg);
 
-	/* Try to open the XMMS configuration file  */
-	cfg = XS_CONFIG_OPEN();
+    /* Try to open the XMMS configuration file  */
+    cfg = XS_CONFIG_OPEN();
 
 #ifndef AUDACIOUS_PLUGIN
-	if (!cfg) cfg = xmms_cfg_new();
-	if (!cfg) return -1;
+    if (!cfg) cfg = xmms_cfg_new();
+    if (!cfg) return -1;
 #endif
 
-	/* Write the new settings to XMMS configuration file */
-	for (i = 0; i < xs_cfgtable_max; i++) {
-		switch (xs_cfgtable[i].itemType) {
-		case CTYPE_INT:
-			XS_CFG_SET_INT(cfg, XS_CONFIG_IDENT,
-				xs_cfgtable[i].itemName,
-				*(gint *) xs_cfgtable[i].itemData);
-			break;
+    /* Write the new settings to XMMS configuration file */
+    for (i = 0; i < xs_cfgtable_max; i++) {
+        switch (xs_cfgtable[i].itemType) {
+        case CTYPE_INT:
+            XS_CFG_SET_INT(cfg, XS_CONFIG_IDENT,
+                xs_cfgtable[i].itemName,
+                *(gint *) xs_cfgtable[i].itemData);
+            break;
 
-		case CTYPE_BOOL:
-			XS_CFG_SET_BOOL(cfg, XS_CONFIG_IDENT,
-				xs_cfgtable[i].itemName,
-				*(gboolean *) xs_cfgtable[i].itemData);
-			break;
+        case CTYPE_BOOL:
+            XS_CFG_SET_BOOL(cfg, XS_CONFIG_IDENT,
+                xs_cfgtable[i].itemName,
+                *(gboolean *) xs_cfgtable[i].itemData);
+            break;
 
-		case CTYPE_FLOAT:
-			XS_CFG_SET_FLOAT(cfg, XS_CONFIG_IDENT,
-				xs_cfgtable[i].itemName,
-				*(gfloat *) xs_cfgtable[i].itemData);
-			break;
+        case CTYPE_FLOAT:
+            XS_CFG_SET_FLOAT(cfg, XS_CONFIG_IDENT,
+                xs_cfgtable[i].itemName,
+                *(gfloat *) xs_cfgtable[i].itemData);
+            break;
 
-		case CTYPE_STR:
-			XS_CFG_SET_STRING(cfg, XS_CONFIG_IDENT,
-				xs_cfgtable[i].itemName,
-				*(gchar **) xs_cfgtable[i].itemData);
-			break;
-		}
-	}
+        case CTYPE_STR:
+            XS_CFG_SET_STRING(cfg, XS_CONFIG_IDENT,
+                xs_cfgtable[i].itemName,
+                *(gchar **) xs_cfgtable[i].itemData);
+            break;
+        }
+    }
 
 
 #ifndef AUDACIOUS_PLUGIN
-	xmms_cfg_write_default_file(cfg);
+    xmms_cfg_write_default_file(cfg);
 #endif
-	XS_CONFIG_FREE(cfg);
+    XS_CONFIG_FREE(cfg);
 
-	XS_MUTEX_UNLOCK(xs_cfg);
+    XS_MUTEX_UNLOCK(xs_cfg);
 
-	return 0;
+    return 0;
 }
 
 
@@ -660,97 +660,97 @@
  */
 void xs_cfg_ok(void)
 {
-	gint i;
-	gfloat tmpValue;
-	gint tmpInt;
-	const gchar *tmpStr;
+    gint i;
+    gfloat tmpValue;
+    gint tmpInt;
+    const gchar *tmpStr;
 
-	/* Get lock on configuration */
-	XS_MUTEX_LOCK(xs_cfg);
+    /* Get lock on configuration */
+    XS_MUTEX_LOCK(xs_cfg);
 
-	XSDEBUG("get data from widgets to config...\n");
+    XSDEBUG("get data from widgets to config...\n");
 
-	for (i = 0; i < xs_widtable_max; i++) {
-		switch (xs_widtable[i].widType) {
-		case WTYPE_BGROUP:
-			/* Check if toggle-button is active */
-			if (GTK_TOGGLE_BUTTON(LUW(xs_widtable[i].widName))->active) {
-				/* Yes, set the constant value */
-				*((gint *) xs_widtable[i].itemData) = xs_widtable[i].itemSet;
-			}
-			break;
+    for (i = 0; i < xs_widtable_max; i++) {
+        switch (xs_widtable[i].widType) {
+        case WTYPE_BGROUP:
+            /* Check if toggle-button is active */
+            if (GTK_TOGGLE_BUTTON(LUW(xs_widtable[i].widName))->active) {
+                /* Yes, set the constant value */
+                *((gint *) xs_widtable[i].itemData) = xs_widtable[i].itemSet;
+            }
+            break;
 
-		case WTYPE_COMBO:
-			/* Get text from text-widget */
-			tmpStr = gtk_entry_get_text(GTK_ENTRY(LUW(xs_widtable[i].widName)));
-			if (sscanf(tmpStr, "%d", &tmpInt) != 1)
-				tmpInt = xs_widtable[i].itemSet;
+        case WTYPE_COMBO:
+            /* Get text from text-widget */
+            tmpStr = gtk_entry_get_text(GTK_ENTRY(LUW(xs_widtable[i].widName)));
+            if (sscanf(tmpStr, "%d", &tmpInt) != 1)
+                tmpInt = xs_widtable[i].itemSet;
 
-			*((gint *) xs_widtable[i].itemData) = tmpInt;
-			break;
-			
-		case WTYPE_SPIN:
-		case WTYPE_SCALE:
-			/* Get the value */
-			switch (xs_widtable[i].widType) {
-			case WTYPE_SPIN:
-				tmpValue = gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(LUW(xs_widtable[i].widName)))->value;
-				break;
+            *((gint *) xs_widtable[i].itemData) = tmpInt;
+            break;
+            
+        case WTYPE_SPIN:
+        case WTYPE_SCALE:
+            /* Get the value */
+            switch (xs_widtable[i].widType) {
+            case WTYPE_SPIN:
+                tmpValue = gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(LUW(xs_widtable[i].widName)))->value;
+                break;
 
-			case WTYPE_SCALE:
-				tmpValue = gtk_range_get_adjustment(GTK_RANGE(LUW(xs_widtable[i].widName)))->value;
-				break;
-			
-			default:
-				tmpValue = -1;
-				break;
-			}
+            case WTYPE_SCALE:
+                tmpValue = gtk_range_get_adjustment(GTK_RANGE(LUW(xs_widtable[i].widName)))->value;
+                break;
+            
+            default:
+                tmpValue = -1;
+                break;
+            }
 
-			/* Set the value */
-			switch (xs_widtable[i].itemType) {
-			case CTYPE_INT:
-				*((gint *) xs_widtable[i].itemData) = (gint) tmpValue;
-				break;
+            /* Set the value */
+            switch (xs_widtable[i].itemType) {
+            case CTYPE_INT:
+                *((gint *) xs_widtable[i].itemData) = (gint) tmpValue;
+                break;
 
-			case CTYPE_FLOAT:
-				*((gfloat *) xs_widtable[i].itemData) = tmpValue;
-				break;
-			}
-			break;
+            case CTYPE_FLOAT:
+                *((gfloat *) xs_widtable[i].itemData) = tmpValue;
+                break;
+            }
+            break;
 
-		case WTYPE_BUTTON:
-			/* Check if toggle-button is active */
-			*((gboolean *) xs_widtable[i].itemData) =
-				(GTK_TOGGLE_BUTTON(LUW(xs_widtable[i].widName))->active);
-			break;
+        case WTYPE_BUTTON:
+            /* Check if toggle-button is active */
+            *((gboolean *) xs_widtable[i].itemData) =
+                (GTK_TOGGLE_BUTTON(LUW(xs_widtable[i].widName))->active);
+            break;
 
-		case WTYPE_TEXT:
-			/* Get text from text-widget */
-			xs_pstrcpy((gchar **) xs_widtable[i].itemData,
-				gtk_entry_get_text(GTK_ENTRY(LUW(xs_widtable[i].widName))));
-			break;
-		}
-	}
-	
-	/* Get filter settings */
-	/*
-	if (!xs_curve_get_points(XS_CURVE(LUW("")), &xs_cfg.sid2Filter.points, &xs_cfg.sid2Filter.npoints)) {
-		xs_error(_("Warning: Could not get filter curve widget points!\n"));
-	}
-	*/
+        case WTYPE_TEXT:
+            /* Get text from text-widget */
+            xs_pstrcpy((gchar **) xs_widtable[i].itemData,
+                gtk_entry_get_text(GTK_ENTRY(LUW(xs_widtable[i].widName))));
+            break;
+        }
+    }
+    
+    /* Get filter settings */
+    /*
+    if (!xs_curve_get_points(XS_CURVE(LUW("")), &xs_cfg.sid2Filter.points, &xs_cfg.sid2Filter.npoints)) {
+        xs_error("Warning: Could not get filter curve widget points!\n");
+    }
+    */
 
-	/* Release lock */
-	XS_MUTEX_UNLOCK(xs_cfg);
-	
-	/* Close window */
-	gtk_widget_destroy(xs_configwin);
-	xs_configwin = NULL;
+    /* Release lock */
+    XS_MUTEX_UNLOCK(xs_cfg);
+    
+    /* Close window */
+    gtk_widget_destroy(xs_configwin);
+    xs_configwin = NULL;
 
-	/* Write settings */
-	xs_write_configuration();
+    /* Write settings */
+    xs_write_configuration();
 
-	/* Re-initialize */
-	xs_reinit();
+    /* Re-initialize */
+    xs_reinit();
 }
 
 
@@ -758,11 +758,11 @@
  */
 gboolean xs_confirmwin_delete(GtkWidget *widget, GdkEvent *event, gpointer user_data)
 {
-	(void) widget;
-	(void) event;
-	(void) user_data;
-	
-	return FALSE;
+    (void) widget;
+    (void) event;
+    (void) user_data;
+    
+    return FALSE;
 }
 
 
@@ -771,34 +771,34 @@
  */
 void xs_cfg_sldb_browse(GtkButton * button, gpointer user_data)
 {
-	(void) button;
-	(void) user_data;
+    (void) button;
+    (void) user_data;
 
-	if (xs_sldb_fileselector != NULL) {
-                gtk_window_present(GTK_WINDOW(xs_sldb_fileselector));
-		return;
-	}
+    if (xs_sldb_fileselector != NULL) {
+        XS_WINDOW_PRESENT(xs_sldb_fileselector);
+        return;
+    }
 
-	xs_sldb_fileselector = create_xs_sldb_fs();
-	XS_MUTEX_LOCK(xs_cfg);
-	gtk_file_selection_set_filename(GTK_FILE_SELECTION(xs_sldb_fileselector), xs_cfg.songlenDBPath);
-	XS_MUTEX_UNLOCK(xs_cfg);
-	gtk_widget_show(xs_sldb_fileselector);
+    xs_sldb_fileselector = create_xs_sldb_fs();
+    XS_MUTEX_LOCK(xs_cfg);
+    gtk_file_selection_set_filename(GTK_FILE_SELECTION(xs_sldb_fileselector), xs_cfg.songlenDBPath);
+    XS_MUTEX_UNLOCK(xs_cfg);
+    gtk_widget_show(xs_sldb_fileselector);
 }
 
 
 void xs_sldb_fs_ok(GtkButton *button, gpointer user_data)
 {
-	(void) button;
-	(void) user_data;
-	
-	/* Selection was accepted! */
-	gtk_entry_set_text(GTK_ENTRY(LUW("cfg_sld_dbpath")),
-			   gtk_file_selection_get_filename(GTK_FILE_SELECTION(xs_sldb_fileselector)));
+    (void) button;
+    (void) user_data;
+    
+    /* Selection was accepted! */
+    gtk_entry_set_text(GTK_ENTRY(LUW("cfg_sld_dbpath")),
+               gtk_file_selection_get_filename(GTK_FILE_SELECTION(xs_sldb_fileselector)));
 
-	/* Close file selector window */
-	gtk_widget_destroy(xs_sldb_fileselector);
-	xs_sldb_fileselector = NULL;
+    /* Close file selector window */
+    gtk_widget_destroy(xs_sldb_fileselector);
+    xs_sldb_fileselector = NULL;
 }
 
 XS_DEF_WINDOW_CLOSE(sldb_fs_cancel, sldb_fileselector)
@@ -809,34 +809,34 @@
  */
 void xs_cfg_stil_browse(GtkButton * button, gpointer user_data)
 {
-	(void) button;
-	(void) user_data;
+    (void) button;
+    (void) user_data;
 
-	if (xs_stil_fileselector != NULL) {
-                gtk_window_present(GTK_WINDOW(xs_stil_fileselector));
-		return;
-	}
+    if (xs_stil_fileselector != NULL) {
+        XS_WINDOW_PRESENT(xs_stil_fileselector);
+        return;
+    }
 
-	xs_stil_fileselector = create_xs_stil_fs();
-	XS_MUTEX_LOCK(xs_cfg);
-	gtk_file_selection_set_filename(GTK_FILE_SELECTION(xs_stil_fileselector), xs_cfg.stilDBPath);
-	XS_MUTEX_UNLOCK(xs_cfg);
-	gtk_widget_show(xs_stil_fileselector);
+    xs_stil_fileselector = create_xs_stil_fs();
+    XS_MUTEX_LOCK(xs_cfg);
+    gtk_file_selection_set_filename(GTK_FILE_SELECTION(xs_stil_fileselector), xs_cfg.stilDBPath);
+    XS_MUTEX_UNLOCK(xs_cfg);
+    gtk_widget_show(xs_stil_fileselector);
 }
 
 
 void xs_stil_fs_ok(GtkButton *button, gpointer user_data)
 {
-	(void) button;
-	(void) user_data;
+    (void) button;
+    (void) user_data;
 
-	/* Selection was accepted! */
-	gtk_entry_set_text(GTK_ENTRY(LUW("cfg_stil_dbpath")),
-		gtk_file_selection_get_filename(GTK_FILE_SELECTION(xs_stil_fileselector)));
+    /* Selection was accepted! */
+    gtk_entry_set_text(GTK_ENTRY(LUW("cfg_stil_dbpath")),
+        gtk_file_selection_get_filename(GTK_FILE_SELECTION(xs_stil_fileselector)));
 
-	/* Close file selector window */
-	gtk_widget_destroy(xs_stil_fileselector);
-	xs_stil_fileselector = NULL;
+    /* Close file selector window */
+    gtk_widget_destroy(xs_stil_fileselector);
+    xs_stil_fileselector = NULL;
 }
 
 
@@ -848,34 +848,34 @@
  */
 void xs_cfg_hvsc_browse(GtkButton * button, gpointer user_data)
 {
-	(void) button;
-	(void) user_data;
+    (void) button;
+    (void) user_data;
 
-	if (xs_hvsc_selector != NULL) {
-                gtk_window_present(GTK_WINDOW(xs_hvsc_selector));
-		return;
-	}
+    if (xs_hvsc_selector != NULL) {
+        XS_WINDOW_PRESENT(xs_hvsc_selector);
+        return;
+    }
 
-	xs_hvsc_selector = create_xs_hvsc_fs();
-	XS_MUTEX_LOCK(xs_cfg);
-	gtk_file_selection_set_filename(GTK_FILE_SELECTION(xs_hvsc_selector), xs_cfg.hvscPath);
-	XS_MUTEX_UNLOCK(xs_cfg);
-	gtk_widget_show(xs_hvsc_selector);
+    xs_hvsc_selector = create_xs_hvsc_fs();
+    XS_MUTEX_LOCK(xs_cfg);
+    gtk_file_selection_set_filename(GTK_FILE_SELECTION(xs_hvsc_selector), xs_cfg.hvscPath);
+    XS_MUTEX_UNLOCK(xs_cfg);
+    gtk_widget_show(xs_hvsc_selector);
 }
 
 
 void xs_hvsc_fs_ok(GtkButton *button, gpointer user_data)
 {
-	(void) button;
-	(void) user_data;
+    (void) button;
+    (void) user_data;
 
-	/* Selection was accepted! */
-	gtk_entry_set_text(GTK_ENTRY(LUW("cfg_hvsc_path")),
-		gtk_file_selection_get_filename(GTK_FILE_SELECTION(xs_hvsc_selector)));
+    /* Selection was accepted! */
+    gtk_entry_set_text(GTK_ENTRY(LUW("cfg_hvsc_path")),
+        gtk_file_selection_get_filename(GTK_FILE_SELECTION(xs_hvsc_selector)));
 
-	/* Close file selector window */
-	gtk_widget_destroy(xs_hvsc_selector);
-	xs_hvsc_selector = NULL;
+    /* Close file selector window */
+    gtk_widget_destroy(xs_hvsc_selector);
+    xs_hvsc_selector = NULL;
 }
 
 
@@ -887,156 +887,156 @@
  */
 void xs_cfg_sp1_filter_reset(GtkButton * button, gpointer user_data)
 {
-	(void) button;
-	(void) user_data;
+    (void) button;
+    (void) user_data;
 
-	gtk_adjustment_set_value(gtk_range_get_adjustment(GTK_RANGE(LUW("cfg_sp1_filter_fs"))), XS_SIDPLAY1_FS);
-	gtk_adjustment_set_value(gtk_range_get_adjustment(GTK_RANGE(LUW("cfg_sp1_filter_fm"))), XS_SIDPLAY1_FM);
-	gtk_adjustment_set_value(gtk_range_get_adjustment(GTK_RANGE(LUW("cfg_sp1_filter_ft"))), XS_SIDPLAY1_FT);
+    gtk_adjustment_set_value(gtk_range_get_adjustment(GTK_RANGE(LUW("cfg_sp1_filter_fs"))), XS_SIDPLAY1_FS);
+    gtk_adjustment_set_value(gtk_range_get_adjustment(GTK_RANGE(LUW("cfg_sp1_filter_fm"))), XS_SIDPLAY1_FM);
+    gtk_adjustment_set_value(gtk_range_get_adjustment(GTK_RANGE(LUW("cfg_sp1_filter_ft"))), XS_SIDPLAY1_FT);
 }
 
 
-void xs_cfg_sp2_filter_update(XSCurve *curve, t_xs_sid2_filter *f)
+void xs_cfg_sp2_filter_update(XSCurve *curve, xs_sid2_filter_t *f)
 {
-	assert(curve);
-	assert(f);
-	
-	xs_curve_reset(curve);
-	xs_curve_set_range(curve, 0,0, XS_SIDPLAY2_NFPOINTS, XS_SIDPLAY2_FMAX);
-	if (!xs_curve_set_points(curve, f->points, f->npoints)) {
-		// FIXME
-		xs_error(_("Warning: Could not set filter curve widget points!\n"));
-	}
+    assert(curve);
+    assert(f);
+    
+    xs_curve_reset(curve);
+    xs_curve_set_range(curve, 0,0, XS_SIDPLAY2_NFPOINTS, XS_SIDPLAY2_FMAX);
+    if (!xs_curve_set_points(curve, f->points, f->npoints)) {
+        // FIXME
+        xs_error("Warning: Could not set filter curve widget points!\n");
+    }
 }
 
 
 void xs_cfg_sp2_presets_update(void)
 {
-	GList *tmpList = NULL;
-	gint i;
-	
-	for (i = 0; i < xs_cfg.sid2NFilterPresets; i++) {
-		tmpList = g_list_append(tmpList,
-			(gpointer) xs_cfg.sid2FilterPresets[i]->name);
-	}
-	
-	gtk_combo_set_popdown_strings(GTK_COMBO(LUW("cfg_sp2_filter_combo")), tmpList);
-	g_list_free(tmpList);
+    GList *tmpList = NULL;
+    gint i;
+    
+    for (i = 0; i < xs_cfg.sid2NFilterPresets; i++) {
+        tmpList = g_list_append(tmpList,
+            (gpointer) xs_cfg.sid2FilterPresets[i]->name);
+    }
+    
+    gtk_combo_set_popdown_strings(GTK_COMBO(LUW("cfg_sp2_filter_combo")), tmpList);
+    g_list_free(tmpList);
 }
 
 
 void xs_cfg_sp2_filter_load(GtkButton *button, gpointer user_data)
 {
-	const gchar *tmpStr;
-	gint i, j;
-	
-	(void) button;
-	(void) user_data;
-	
-	XS_MUTEX_LOCK(xs_cfg);
-	
-	tmpStr = gtk_entry_get_text(GTK_ENTRY(LUW("cfg_sp2_filter_combo_entry")));
-	for (i = 0, j = -1; i < xs_cfg.sid2NFilterPresets; i++) {
-		if (!strcmp(tmpStr, xs_cfg.sid2FilterPresets[i]->name)) {
-			j = i;
-			break;
-		}
-	}
-	
-	if (j != -1) {
-		fprintf(stderr, "Updating from '%s'\n", tmpStr);
-		xs_cfg_sp2_filter_update(
-			XS_CURVE(LUW("cfg_sp2_filter_curve")),
-			xs_cfg.sid2FilterPresets[i]);
-	} else {
-		/* error/warning: no such filter preset */
-		fprintf(stderr, "No such filter preset '%s'!\n", tmpStr);
-	}
-	
-	XS_MUTEX_UNLOCK(xs_cfg);
+    const gchar *tmpStr;
+    gint i, j;
+    
+    (void) button;
+    (void) user_data;
+    
+    XS_MUTEX_LOCK(xs_cfg);
+    
+    tmpStr = gtk_entry_get_text(GTK_ENTRY(LUW("cfg_sp2_filter_combo_entry")));
+    for (i = 0, j = -1; i < xs_cfg.sid2NFilterPresets; i++) {
+        if (!strcmp(tmpStr, xs_cfg.sid2FilterPresets[i]->name)) {
+            j = i;
+            break;
+        }
+    }
+    
+    if (j != -1) {
+        fprintf(stderr, "Updating from '%s'\n", tmpStr);
+        xs_cfg_sp2_filter_update(
+            XS_CURVE(LUW("cfg_sp2_filter_curve")),
+            xs_cfg.sid2FilterPresets[i]);
+    } else {
+        /* error/warning: no such filter preset */
+        fprintf(stderr, "No such filter preset '%s'!\n", tmpStr);
+    }
+    
+    XS_MUTEX_UNLOCK(xs_cfg);
 }
 
 
 void xs_cfg_sp2_filter_save(GtkButton *button, gpointer user_data)
 {
-	/*
-	1) check if textentry matches any current filter name
-		yes) ask if saving over ok?
-		no) ...
-		
-	2) save current filter to the name		
-	*/
-	const gchar *tmpStr;
-	gint i, j;
-	
-	(void) button;
-	(void) user_data;
-	
-	XS_MUTEX_LOCK(xs_cfg);
-	
-	tmpStr = gtk_entry_get_text(GTK_ENTRY(LUW("cfg_sp2_filter_combo_entry")));
-	for (i = 0, j = -1; i < xs_cfg.sid2NFilterPresets; i++) {
-		if (!strcmp(tmpStr, xs_cfg.sid2FilterPresets[i]->name)) {
-			j = i;
-			break;
-		}
-	}
-	
-	if (j != -1) {
-		fprintf(stderr, "Found, confirm overwrite?\n");
-	}
-	
-	fprintf(stderr, "saving!\n");
-	
-	xs_cfg_sp2_presets_update();
-	
-	XS_MUTEX_UNLOCK(xs_cfg);
+    /*
+    1) check if textentry matches any current filter name
+        yes) ask if saving over ok?
+        no) ...
+        
+    2) save current filter to the name        
+    */
+    const gchar *tmpStr;
+    gint i, j;
+    
+    (void) button;
+    (void) user_data;
+    
+    XS_MUTEX_LOCK(xs_cfg);
+    
+    tmpStr = gtk_entry_get_text(GTK_ENTRY(LUW("cfg_sp2_filter_combo_entry")));
+    for (i = 0, j = -1; i < xs_cfg.sid2NFilterPresets; i++) {
+        if (!strcmp(tmpStr, xs_cfg.sid2FilterPresets[i]->name)) {
+            j = i;
+            break;
+        }
+    }
+    
+    if (j != -1) {
+        fprintf(stderr, "Found, confirm overwrite?\n");
+    }
+    
+    fprintf(stderr, "saving!\n");
+    
+    xs_cfg_sp2_presets_update();
+    
+    XS_MUTEX_UNLOCK(xs_cfg);
 }
 
 
 void xs_cfg_sp2_filter_delete(GtkButton *button, gpointer user_data)
 {
-	(void) button;
-	(void) user_data;
-	/*
-	1) confirm
-	2) delete
-	*/
+    (void) button;
+    (void) user_data;
+    /*
+    1) confirm
+    2) delete
+    */
 }
 
 
 void xs_cfg_sp2_filter_import(GtkButton *button, gpointer user_data)
 {
-	(void) button;
-	(void) user_data;
+    (void) button;
+    (void) user_data;
 
-	if (xs_filt_importselector != NULL) {
-                gtk_window_present(GTK_WINDOW(xs_filt_importselector));
-		return;
-	}
+    if (xs_filt_importselector != NULL) {
+        XS_WINDOW_PRESENT(xs_filt_importselector);
+        return;
+    }
 
-	xs_filt_importselector = create_xs_filter_import_fs();
-	gtk_widget_show(xs_filt_importselector);
+    xs_filt_importselector = create_xs_filter_import_fs();
+    gtk_widget_show(xs_filt_importselector);
 }
 
 
 void xs_filter_import_fs_ok(GtkButton *button, gpointer user_data)
 {
-	const gchar *tmpStr;
-	(void) button;
-	(void) user_data;
-	
-	XS_MUTEX_LOCK(xs_cfg);
+    const gchar *tmpStr;
+    (void) button;
+    (void) user_data;
+    
+    XS_MUTEX_LOCK(xs_cfg);
 
-	/* Selection was accepted! */
-	tmpStr = gtk_file_selection_get_filename(GTK_FILE_SELECTION(xs_filt_importselector));
-	xs_filters_import(tmpStr, xs_cfg.sid2FilterPresets, &xs_cfg.sid2NFilterPresets);
-	xs_cfg_sp2_presets_update();
+    /* Selection was accepted! */
+    tmpStr = gtk_file_selection_get_filename(GTK_FILE_SELECTION(xs_filt_importselector));
+    xs_filters_import(tmpStr, xs_cfg.sid2FilterPresets, &xs_cfg.sid2NFilterPresets);
+    xs_cfg_sp2_presets_update();
 
-	/* Close file selector window */
-	gtk_widget_destroy(xs_filt_importselector);
-	xs_filt_importselector = NULL;
-	XS_MUTEX_UNLOCK(xs_cfg);
+    /* Close file selector window */
+    gtk_widget_destroy(xs_filt_importselector);
+    xs_filt_importselector = NULL;
+    XS_MUTEX_UNLOCK(xs_cfg);
 }
 
 
@@ -1046,35 +1046,35 @@
 
 void xs_cfg_sp2_filter_export(GtkButton *button, gpointer user_data)
 {
-	(void) button;
-	(void) user_data;
+    (void) button;
+    (void) user_data;
 
-	if (xs_filt_exportselector != NULL) {
-                gtk_window_present(GTK_WINDOW(xs_filt_exportselector));
-		return;
-	}
+    if (xs_filt_exportselector != NULL) {
+        XS_WINDOW_PRESENT(xs_filt_exportselector);
+        return;
+    }
 
-	xs_filt_exportselector = create_xs_filter_export_fs();
-	gtk_widget_show(xs_filt_exportselector);
+    xs_filt_exportselector = create_xs_filter_export_fs();
+    gtk_widget_show(xs_filt_exportselector);
 }
 
 
 void xs_filter_export_fs_ok(GtkButton *button, gpointer user_data)
 {
-	const gchar *tmpStr;
-	(void) button;
-	(void) user_data;
+    const gchar *tmpStr;
+    (void) button;
+    (void) user_data;
 
-	XS_MUTEX_LOCK(xs_cfg);
+    XS_MUTEX_LOCK(xs_cfg);
 
-	/* Selection was accepted! */
-	tmpStr = gtk_file_selection_get_filename(GTK_FILE_SELECTION(xs_filt_exportselector));
-	xs_filters_export(tmpStr, xs_cfg.sid2FilterPresets, xs_cfg.sid2NFilterPresets);
+    /* Selection was accepted! */
+    tmpStr = gtk_file_selection_get_filename(GTK_FILE_SELECTION(xs_filt_exportselector));
+    xs_filters_export(tmpStr, xs_cfg.sid2FilterPresets, xs_cfg.sid2NFilterPresets);
 
-	/* Close file selector window */
-	gtk_widget_destroy(xs_filt_exportselector);
-	xs_filt_exportselector = NULL;
-	XS_MUTEX_UNLOCK(xs_cfg);
+    /* Close file selector window */
+    gtk_widget_destroy(xs_filt_exportselector);
+    xs_filt_exportselector = NULL;
+    XS_MUTEX_UNLOCK(xs_cfg);
 }
 
 
@@ -1086,162 +1086,162 @@
  */
 void xs_cfg_emu_filters_toggled(GtkToggleButton * togglebutton, gpointer user_data)
 {
-	gboolean isActive = GTK_TOGGLE_BUTTON(togglebutton)->active;
+    gboolean isActive = GTK_TOGGLE_BUTTON(togglebutton)->active;
 
-	(void) user_data;
+    (void) user_data;
 
-	gtk_widget_set_sensitive(LUW("cfg_filters_notebook"), isActive);
+    gtk_widget_set_sensitive(LUW("cfg_filters_notebook"), isActive);
 }
 
 
 void xs_cfg_ftitle_override_toggled(GtkToggleButton * togglebutton, gpointer user_data)
 {
-	gboolean isActive = GTK_TOGGLE_BUTTON(togglebutton)->active;
+    gboolean isActive = GTK_TOGGLE_BUTTON(togglebutton)->active;
 
-	(void) user_data;
+    (void) user_data;
 
-	gtk_widget_set_sensitive(LUW("cfg_ftitle_box"), isActive);
+    gtk_widget_set_sensitive(LUW("cfg_ftitle_box"), isActive);
 }
 
 
 void xs_cfg_emu_sidplay1_toggled(GtkToggleButton * togglebutton, gpointer user_data)
 {
-	(void) togglebutton;
-	(void) user_data;
+    (void) togglebutton;
+    (void) user_data;
 }
 
 
 void xs_cfg_emu_sidplay2_toggled(GtkToggleButton * togglebutton, gpointer user_data)
 {
-	gboolean isActive = GTK_TOGGLE_BUTTON(togglebutton)->active;
+    gboolean isActive = GTK_TOGGLE_BUTTON(togglebutton)->active;
 
-	(void) user_data;
+    (void) user_data;
 
-	gtk_widget_set_sensitive(LUW("cfg_emu_mem_real"), isActive);
+    gtk_widget_set_sensitive(LUW("cfg_emu_mem_real"), isActive);
 
-	gtk_widget_set_sensitive(LUW("cfg_sidplay2_frame"), isActive);
-	gtk_widget_set_sensitive(LUW("cfg_emu_sp2_opt"), isActive);
+    gtk_widget_set_sensitive(LUW("cfg_sidplay2_frame"), isActive);
+    gtk_widget_set_sensitive(LUW("cfg_emu_sp2_opt"), isActive);
 
-	gtk_widget_set_sensitive(LUW("cfg_chn_autopan"), !isActive);
+    gtk_widget_set_sensitive(LUW("cfg_chn_autopan"), !isActive);
 
 #ifdef HAVE_RESID_BUILDER
-	gtk_widget_set_sensitive(LUW("cfg_emu_sp2_resid"), isActive);
+    gtk_widget_set_sensitive(LUW("cfg_emu_sp2_resid"), isActive);
 #else
-	gtk_widget_set_sensitive(LUW("cfg_emu_sp2_resid"), FALSE);
+    gtk_widget_set_sensitive(LUW("cfg_emu_sp2_resid"), FALSE);
 #endif
 
 #ifdef HAVE_HARDSID_BUILDER
-	gtk_widget_set_sensitive(LUW("cfg_emu_sp2_hardsid"), isActive);
+    gtk_widget_set_sensitive(LUW("cfg_emu_sp2_hardsid"), isActive);
 #else
-	gtk_widget_set_sensitive(LUW("cfg_emu_sp2_hardsid"), FALSE);
+    gtk_widget_set_sensitive(LUW("cfg_emu_sp2_hardsid"), FALSE);
 #endif
 }
 
 
 void xs_cfg_oversample_toggled(GtkToggleButton * togglebutton, gpointer user_data)
 {
-	gboolean isActive = GTK_TOGGLE_BUTTON(togglebutton)->active;
+    gboolean isActive = GTK_TOGGLE_BUTTON(togglebutton)->active;
 
-	(void) user_data;
+    (void) user_data;
 
-	gtk_widget_set_sensitive(LUW("cfg_oversample_box"), isActive);
+    gtk_widget_set_sensitive(LUW("cfg_oversample_box"), isActive);
 }
 
 
 void xs_cfg_mintime_enable_toggled(GtkToggleButton * togglebutton, gpointer user_data)
 {
-	gboolean isActive = GTK_TOGGLE_BUTTON(togglebutton)->active;
+    gboolean isActive = GTK_TOGGLE_BUTTON(togglebutton)->active;
 
-	(void) user_data;
+    (void) user_data;
 
-	gtk_widget_set_sensitive(LUW("cfg_mintime_box"), isActive);
+    gtk_widget_set_sensitive(LUW("cfg_mintime_box"), isActive);
 }
 
 
 void xs_cfg_maxtime_enable_toggled(GtkToggleButton * togglebutton, gpointer user_data)
 {
-	gboolean isActive = GTK_TOGGLE_BUTTON(LUW("cfg_maxtime_enable"))->active;
+    gboolean isActive = GTK_TOGGLE_BUTTON(LUW("cfg_maxtime_enable"))->active;
 
-	(void) togglebutton;
-	(void) user_data;
+    (void) togglebutton;
+    (void) user_data;
 
-	gtk_widget_set_sensitive(LUW("cfg_maxtime_unknown"), isActive);
-	gtk_widget_set_sensitive(LUW("cfg_maxtime_box"), isActive);
+    gtk_widget_set_sensitive(LUW("cfg_maxtime_unknown"), isActive);
+    gtk_widget_set_sensitive(LUW("cfg_maxtime_box"), isActive);
 }
 
 
 void xs_cfg_sldb_enable_toggled(GtkToggleButton * togglebutton, gpointer user_data)
 {
-	gboolean isActive = GTK_TOGGLE_BUTTON(togglebutton)->active;
+    gboolean isActive = GTK_TOGGLE_BUTTON(togglebutton)->active;
 
-	(void) user_data;
+    (void) user_data;
 
-	gtk_widget_set_sensitive(LUW("cfg_sld_box"), isActive);
+    gtk_widget_set_sensitive(LUW("cfg_sld_box"), isActive);
 }
 
 
 void xs_cfg_stil_enable_toggled(GtkToggleButton * togglebutton, gpointer user_data)
 {
-	gboolean isActive = GTK_TOGGLE_BUTTON(togglebutton)->active;
+    gboolean isActive = GTK_TOGGLE_BUTTON(togglebutton)->active;
 
-	(void) user_data;
+    (void) user_data;
 
-	gtk_widget_set_sensitive(LUW("cfg_stil_box1"), isActive);
-	gtk_widget_set_sensitive(LUW("cfg_stil_box2"), isActive);
+    gtk_widget_set_sensitive(LUW("cfg_stil_box1"), isActive);
+    gtk_widget_set_sensitive(LUW("cfg_stil_box2"), isActive);
 }
 
 
 void xs_cfg_subauto_enable_toggled(GtkToggleButton * togglebutton, gpointer user_data)
 {
-	gboolean isActive = GTK_TOGGLE_BUTTON(togglebutton)->active;
+    gboolean isActive = GTK_TOGGLE_BUTTON(togglebutton)->active;
 
-	(void) user_data;
+    (void) user_data;
 
-	gtk_widget_set_sensitive(LUW("cfg_subauto_min_only"), isActive);
-	gtk_widget_set_sensitive(LUW("cfg_subauto_box"), isActive);
+    gtk_widget_set_sensitive(LUW("cfg_subauto_min_only"), isActive);
+    gtk_widget_set_sensitive(LUW("cfg_subauto_box"), isActive);
 }
 
 
 void xs_cfg_subauto_min_only_toggled(GtkToggleButton * togglebutton, gpointer user_data)
 {
-	gboolean isActive = GTK_TOGGLE_BUTTON(togglebutton)->active &&
-		GTK_TOGGLE_BUTTON(LUW("cfg_subauto_enable"))->active;
+    gboolean isActive = GTK_TOGGLE_BUTTON(togglebutton)->active &&
+        GTK_TOGGLE_BUTTON(LUW("cfg_subauto_enable"))->active;
 
-	(void) user_data;
+    (void) user_data;
 
-	gtk_widget_set_sensitive(LUW("cfg_subauto_box"), isActive);
+    gtk_widget_set_sensitive(LUW("cfg_subauto_box"), isActive);
 }
 
 
 void xs_cfg_mintime_changed(GtkEditable * editable, gpointer user_data)
 {
-	gint tmpValue;
-	GtkAdjustment *tmpAdj;
+    gint tmpValue;
+    GtkAdjustment *tmpAdj;
 
-	(void) user_data;
+    (void) user_data;
 
-	tmpAdj = gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(LUW("cfg_maxtime")));
+    tmpAdj = gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(LUW("cfg_maxtime")));
 
-	tmpValue = (gint) gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(editable))->value;
+    tmpValue = (gint) gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(editable))->value;
 
-	if (tmpValue > tmpAdj->value)
-		gtk_adjustment_set_value(tmpAdj, tmpValue);
+    if (tmpValue > tmpAdj->value)
+        gtk_adjustment_set_value(tmpAdj, tmpValue);
 }
 
 
 void xs_cfg_maxtime_changed(GtkEditable * editable, gpointer user_data)
 {
-	gint tmpValue;
-	GtkAdjustment *tmpAdj;
+    gint tmpValue;
+    GtkAdjustment *tmpAdj;
 
-	(void) user_data;
+    (void) user_data;
 
-	tmpAdj = gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(LUW("cfg_mintime")));
+    tmpAdj = gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(LUW("cfg_mintime")));
 
-	tmpValue = (gint) gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(editable))->value;
+    tmpValue = (gint) gtk_spin_button_get_adjustment(GTK_SPIN_BUTTON(editable))->value;
 
-	if (tmpValue < tmpAdj->value)
-		gtk_adjustment_set_value(tmpAdj, tmpValue);
+    if (tmpValue < tmpAdj->value)
+        gtk_adjustment_set_value(tmpAdj, tmpValue);
 }
 
 
@@ -1252,148 +1252,148 @@
  */
 void xs_configure(void)
 {
-	gint i;
-	gfloat tmpValue;
-	gchar tmpStr[64];
-	GList *tmpList = NULL;
-	GtkWidget *tmpCurve;
+    gint i;
+    gfloat tmpValue;
+    gchar tmpStr[64];
+    GList *tmpList = NULL;
+    GtkWidget *tmpCurve;
 
-	/* Check if the window already exists */
-	if (xs_configwin) {
-                gtk_window_present(GTK_WINDOW(xs_configwin));
-		return;
-	}
+    /* Check if the window already exists */
+    if (xs_configwin) {
+        XS_WINDOW_PRESENT(xs_configwin);
+        return;
+    }
 
-	/* Create the window */
-	xs_configwin = create_xs_configwin();
-	
-	/* Get lock on configuration */
-	XS_MUTEX_LOCK(xs_cfg);
+    /* Create the window */
+    xs_configwin = create_xs_configwin();
+    
+    /* Get lock on configuration */
+    XS_MUTEX_LOCK(xs_cfg);
 
-	/* Add samplerates */
-	for (i = 0; i < xs_nsamplerates_table; i++) {
-		tmpList = g_list_append (tmpList,
-			(gpointer) xs_samplerates_table[i]);
-	}
-	gtk_combo_set_popdown_strings(GTK_COMBO(LUW("cfg_samplerate_combo")), tmpList);
-	g_list_free(tmpList);
-	
-	/* Create the custom filter curve widget for libSIDPlay2 */
-	xs_cfg_sp2_presets_update();
-	tmpCurve = xs_curve_new();
-	xs_cfg_sp2_filter_update(XS_CURVE(tmpCurve), &xs_cfg.sid2Filter);
-	gtk_widget_set_name(tmpCurve, "cfg_sp2_filter_curve");
-	gtk_widget_ref(tmpCurve);
-	gtk_object_set_data_full(GTK_OBJECT(xs_configwin),
-		"cfg_sp2_filter_curve", tmpCurve, (GtkDestroyNotify) gtk_widget_unref);
-	gtk_widget_show(tmpCurve);
-	gtk_container_add(GTK_CONTAINER(LUW("cfg_sp2_filter_frame")), tmpCurve);
+    /* Add samplerates */
+    for (i = 0; i < xs_nsamplerates_table; i++) {
+        tmpList = g_list_append (tmpList,
+            (gpointer) xs_samplerates_table[i]);
+    }
+    gtk_combo_set_popdown_strings(GTK_COMBO(LUW("cfg_samplerate_combo")), tmpList);
+    g_list_free(tmpList);
+    
+    /* Create the custom filter curve widget for libSIDPlay2 */
+    xs_cfg_sp2_presets_update();
+    tmpCurve = xs_curve_new();
+    xs_cfg_sp2_filter_update(XS_CURVE(tmpCurve), &xs_cfg.sid2Filter);
+    gtk_widget_set_name(tmpCurve, "cfg_sp2_filter_curve");
+    gtk_widget_ref(tmpCurve);
+    gtk_object_set_data_full(GTK_OBJECT(xs_configwin),
+        "cfg_sp2_filter_curve", tmpCurve, (GtkDestroyNotify) gtk_widget_unref);
+    gtk_widget_show(tmpCurve);
+    gtk_container_add(GTK_CONTAINER(LUW("cfg_sp2_filter_frame")), tmpCurve);
 
 
-	/* Based on available optional parts, gray out options */
+    /* Based on available optional parts, gray out options */
 #ifndef HAVE_SIDPLAY1
-	gtk_widget_set_sensitive(LUW("cfg_emu_sidplay1"), FALSE);
-	gtk_widget_set_sensitive(LUW("cfg_box_filter_sidplay1"), FALSE);
+    gtk_widget_set_sensitive(LUW("cfg_emu_sidplay1"), FALSE);
+    gtk_widget_set_sensitive(LUW("cfg_box_filter_sidplay1"), FALSE);
 #endif
 
 #ifndef HAVE_SIDPLAY2
-	gtk_widget_set_sensitive(LUW("cfg_emu_sidplay2"), FALSE);
-	gtk_widget_set_sensitive(LUW("cfg_box_filter_sidplay2"), FALSE);
+    gtk_widget_set_sensitive(LUW("cfg_emu_sidplay2"), FALSE);
+    gtk_widget_set_sensitive(LUW("cfg_box_filter_sidplay2"), FALSE);
 #endif
 
-	gtk_widget_set_sensitive(LUW("cfg_resid_frame"), FALSE);
+    gtk_widget_set_sensitive(LUW("cfg_resid_frame"), FALSE);
 
 #if !defined(HAVE_XMMSEXTRA) && !defined(AUDACIOUS_PLUGIN)
-	gtk_widget_set_sensitive(LUW("cfg_ftitle_override"), FALSE);
-	xs_cfg.titleOverride = TRUE;
+    gtk_widget_set_sensitive(LUW("cfg_ftitle_override"), FALSE);
+    xs_cfg.titleOverride = TRUE;
 #endif
 
 #if !defined(HAVE_SONG_POSITION) && !defined(AUDACIOUS_PLUGIN)
-	gtk_widget_set_sensitive(LUW("cfg_subctrl_patch"), FALSE);
+    gtk_widget_set_sensitive(LUW("cfg_subctrl_patch"), FALSE);
 #endif
 
-	xs_cfg_ftitle_override_toggled(GTK_TOGGLE_BUTTON(LUW("cfg_ftitle_override")), NULL);
-	xs_cfg_emu_filters_toggled(GTK_TOGGLE_BUTTON(LUW("cfg_emu_filters")), NULL);
-	xs_cfg_emu_sidplay1_toggled(GTK_TOGGLE_BUTTON(LUW("cfg_emu_sidplay1")), NULL);
-	xs_cfg_emu_sidplay2_toggled(GTK_TOGGLE_BUTTON(LUW("cfg_emu_sidplay2")), NULL);
-	xs_cfg_oversample_toggled(GTK_TOGGLE_BUTTON(LUW("cfg_oversample")), NULL);
-	xs_cfg_mintime_enable_toggled(GTK_TOGGLE_BUTTON(LUW("cfg_mintime_enable")), NULL);
-	xs_cfg_maxtime_enable_toggled(GTK_TOGGLE_BUTTON(LUW("cfg_maxtime_enable")), NULL);
-	xs_cfg_sldb_enable_toggled(GTK_TOGGLE_BUTTON(LUW("cfg_sld_enable")), NULL);
-	xs_cfg_stil_enable_toggled(GTK_TOGGLE_BUTTON(LUW("cfg_stil_enable")), NULL);
-	xs_cfg_subauto_enable_toggled(GTK_TOGGLE_BUTTON(LUW("cfg_subauto_enable")), NULL);
-	xs_cfg_subauto_min_only_toggled(GTK_TOGGLE_BUTTON(LUW("cfg_subauto_min_only")), NULL);
+    xs_cfg_ftitle_override_toggled(GTK_TOGGLE_BUTTON(LUW("cfg_ftitle_override")), NULL);
+    xs_cfg_emu_filters_toggled(GTK_TOGGLE_BUTTON(LUW("cfg_emu_filters")), NULL);
+    xs_cfg_emu_sidplay1_toggled(GTK_TOGGLE_BUTTON(LUW("cfg_emu_sidplay1")), NULL);
+    xs_cfg_emu_sidplay2_toggled(GTK_TOGGLE_BUTTON(LUW("cfg_emu_sidplay2")), NULL);
+    xs_cfg_oversample_toggled(GTK_TOGGLE_BUTTON(LUW("cfg_oversample")), NULL);
+    xs_cfg_mintime_enable_toggled(GTK_TOGGLE_BUTTON(LUW("cfg_mintime_enable")), NULL);
+    xs_cfg_maxtime_enable_toggled(GTK_TOGGLE_BUTTON(LUW("cfg_maxtime_enable")), NULL);
+    xs_cfg_sldb_enable_toggled(GTK_TOGGLE_BUTTON(LUW("cfg_sld_enable")), NULL);
+    xs_cfg_stil_enable_toggled(GTK_TOGGLE_BUTTON(LUW("cfg_stil_enable")), NULL);
+    xs_cfg_subauto_enable_toggled(GTK_TOGGLE_BUTTON(LUW("cfg_subauto_enable")), NULL);
+    xs_cfg_subauto_min_only_toggled(GTK_TOGGLE_BUTTON(LUW("cfg_subauto_min_only")), NULL);
 
 
-	/* Set current data to widgets */
-	for (i = 0; i < xs_widtable_max; i++) {
-		switch (xs_widtable[i].widType) {
-		case WTYPE_BGROUP:
-			assert(xs_widtable[i].itemType == CTYPE_INT);
-			/* Check if current value matches the given one */
-			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(LUW(xs_widtable[i].widName)),
-				(*((gint *) xs_widtable[i].itemData) == xs_widtable[i].itemSet));
-			break;
+    /* Set current data to widgets */
+    for (i = 0; i < xs_widtable_max; i++) {
+        switch (xs_widtable[i].widType) {
+        case WTYPE_BGROUP:
+            assert(xs_widtable[i].itemType == CTYPE_INT);
+            /* Check if current value matches the given one */
+            gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(LUW(xs_widtable[i].widName)),
+                (*((gint *) xs_widtable[i].itemData) == xs_widtable[i].itemSet));
+            break;
 
-		case WTYPE_COMBO:
-			assert(xs_widtable[i].itemType == CTYPE_INT);
-			g_snprintf(tmpStr, sizeof(tmpStr), "%d", *(gint *) xs_widtable[i].itemData);
-			gtk_entry_set_text(GTK_ENTRY(LUW(xs_widtable[i].widName)), tmpStr);
-			break;
-			
-		case WTYPE_SPIN:
-		case WTYPE_SCALE:
-			/* Get the value */
-			switch (xs_widtable[i].itemType) {
-			case CTYPE_INT:
-				tmpValue = (gfloat) * ((gint *) xs_widtable[i].itemData);
-				break;
+        case WTYPE_COMBO:
+            assert(xs_widtable[i].itemType == CTYPE_INT);
+            g_snprintf(tmpStr, sizeof(tmpStr), "%d", *(gint *) xs_widtable[i].itemData);
+            gtk_entry_set_text(GTK_ENTRY(LUW(xs_widtable[i].widName)), tmpStr);
+            break;
+            
+        case WTYPE_SPIN:
+        case WTYPE_SCALE:
+            /* Get the value */
+            switch (xs_widtable[i].itemType) {
+            case CTYPE_INT:
+                tmpValue = (gfloat) * ((gint *) xs_widtable[i].itemData);
+                break;
 
-			case CTYPE_FLOAT:
-				tmpValue = *((gfloat *) xs_widtable[i].itemData);
-				break;
+            case CTYPE_FLOAT:
+                tmpValue = *((gfloat *) xs_widtable[i].itemData);
+                break;
 
-			default:
-				tmpValue = -1;
-				assert(0);
-				break;
-			}
+            default:
+                tmpValue = -1;
+                assert(0);
+                break;
+            }
 
-			/* Set the value */
-			switch (xs_widtable[i].widType) {
-			case WTYPE_SPIN:
-				gtk_adjustment_set_value(gtk_spin_button_get_adjustment
-					(GTK_SPIN_BUTTON(LUW(xs_widtable[i].widName))), tmpValue);
-				break;
+            /* Set the value */
+            switch (xs_widtable[i].widType) {
+            case WTYPE_SPIN:
+                gtk_adjustment_set_value(gtk_spin_button_get_adjustment
+                    (GTK_SPIN_BUTTON(LUW(xs_widtable[i].widName))), tmpValue);
+                break;
 
-			case WTYPE_SCALE:
-				gtk_adjustment_set_value(gtk_range_get_adjustment
-					(GTK_RANGE(LUW(xs_widtable[i].widName))), tmpValue);
-				break;
-			}
-			break;
+            case WTYPE_SCALE:
+                gtk_adjustment_set_value(gtk_range_get_adjustment
+                    (GTK_RANGE(LUW(xs_widtable[i].widName))), tmpValue);
+                break;
+            }
+            break;
 
-		case WTYPE_BUTTON:
-			assert(xs_widtable[i].itemType == CTYPE_BOOL);
-			/* Set toggle-button */
-			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(LUW(xs_widtable[i].widName)),
-				*((gboolean *) xs_widtable[i].itemData));
-			break;
+        case WTYPE_BUTTON:
+            assert(xs_widtable[i].itemType == CTYPE_BOOL);
+            /* Set toggle-button */
+            gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(LUW(xs_widtable[i].widName)),
+                *((gboolean *) xs_widtable[i].itemData));
+            break;
 
-		case WTYPE_TEXT:
-			assert(xs_widtable[i].itemType == CTYPE_STR);
-			/* Set text to text-widget */
-			if (*(gchar **) xs_widtable[i].itemData != NULL) {
-				gtk_entry_set_text(GTK_ENTRY(LUW(xs_widtable[i].widName)),
-				*(gchar **) xs_widtable[i].itemData);
-			}
-			break;
-		}
-	}
+        case WTYPE_TEXT:
+            assert(xs_widtable[i].itemType == CTYPE_STR);
+            /* Set text to text-widget */
+            if (*(gchar **) xs_widtable[i].itemData != NULL) {
+                gtk_entry_set_text(GTK_ENTRY(LUW(xs_widtable[i].widName)),
+                *(gchar **) xs_widtable[i].itemData);
+            }
+            break;
+        }
+    }
 
-	/* Release the configuration */
-	XS_MUTEX_UNLOCK(xs_cfg);
+    /* Release the configuration */
+    XS_MUTEX_UNLOCK(xs_cfg);
 
-	/* Show the widget */
-	gtk_widget_show(xs_configwin);
+    /* Show the widget */
+    gtk_widget_show(xs_configwin);
 }
--- a/src/sid/xs_config.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sid/xs_config.h	Fri Jun 13 05:57:25 2008 +0300
@@ -12,124 +12,125 @@
 /* Configuration structure
  */
 enum XS_EMUENGINE {
-	XS_ENG_SIDPLAY1 = 1,
-	XS_ENG_SIDPLAY2
+    XS_ENG_SIDPLAY1 = 1,
+    XS_ENG_SIDPLAY2
 };
 
 
 enum XS_BUILDER {
-	XS_BLD_RESID = 1,
-	XS_BLD_HARDSID
+    XS_BLD_RESID = 1,
+    XS_BLD_HARDSID
 };
 
 enum XS_RESOLUTION {
-	XS_RES_8BIT = 8,
-	XS_RES_16BIT = 16
+    XS_RES_8BIT = 8,
+    XS_RES_16BIT = 16
 };
 
 enum XS_CHANNELS {
-	XS_CHN_MONO = 1,
-	XS_CHN_STEREO = 2,
-	XS_CHN_AUTOPAN = 3
+    XS_CHN_MONO = 1,
+    XS_CHN_STEREO = 2,
+    XS_CHN_AUTOPAN = 3
 };
 
 
 enum XS_CLOCK {
-	XS_CLOCK_PAL = 1,
-	XS_CLOCK_NTSC,
-	XS_CLOCK_VBI,
-	XS_CLOCK_CIA,
-	XS_CLOCK_ANY
+    XS_CLOCK_PAL = 1,
+    XS_CLOCK_NTSC,
+    XS_CLOCK_VBI,
+    XS_CLOCK_CIA,
+    XS_CLOCK_ANY
 };
 
 
 enum XS_MPU {
-	XS_MPU_BANK_SWITCHING = 1,
-	XS_MPU_TRANSPARENT_ROM,
-	XS_MPU_PLAYSID_ENVIRONMENT,
-	XS_MPU_REAL
+    XS_MPU_BANK_SWITCHING = 1,
+    XS_MPU_TRANSPARENT_ROM,
+    XS_MPU_PLAYSID_ENVIRONMENT,
+    XS_MPU_REAL
 };
 
 
 enum XS_SSC {
-	XS_SSC_NONE = 1,
-	XS_SSC_POPUP,
-	XS_SSC_PATCH,
-	XS_SSC_SEEK
+    XS_SSC_NONE = 1,
+    XS_SSC_POPUP,
+    XS_SSC_PATCH,
+    XS_SSC_SEEK
 };
 
 
 enum XS_SIDMODEL {
-	XS_SIDMODEL_UNKNOWN = 0,
-	XS_SIDMODEL_6581,
-	XS_SIDMODEL_8580,
-	XS_SIDMODEL_ANY
+    XS_SIDMODEL_UNKNOWN = 0,
+    XS_SIDMODEL_6581,
+    XS_SIDMODEL_8580,
+    XS_SIDMODEL_ANY
 };
 
 
 typedef struct {
-	t_xs_int_point	points[XS_SIDPLAY2_NFPOINTS];
-	gint		npoints;
-	gchar		*name;
-} t_xs_sid2_filter;
+    gint            type;
+    xs_int_point_t  points[XS_SIDPLAY2_NFPOINTS];
+    gint            npoints;
+    gchar           *name;
+} xs_sid2_filter_t;
 
 
-extern struct t_xs_cfg {
-	/* General audio settings */
-	gint		audioBitsPerSample;
-	gint		audioChannels;
-	gint		audioFrequency;
+extern struct xs_cfg_t {
+    /* General audio settings */
+    gint        audioBitsPerSample;
+    gint        audioChannels;
+    gint        audioFrequency;
 
-	gboolean	oversampleEnable;
-	gint		oversampleFactor;	/* Factor of oversampling */
+    gboolean    oversampleEnable;
+    gint        oversampleFactor;   /* Factor of oversampling */
 
-	/* Emulation settings */
-	gboolean	mos8580;		/* TRUE = 8580, FALSE = 6581 */
-	gboolean	forceModel;
-	gint		memoryMode;		/* See XS_MPU-constants */
-	gint		clockSpeed;		/* PAL (50Hz) or NTSC (60Hz) */
-	gboolean	forceSpeed;		/* TRUE = force to given clockspeed */
+    /* Emulation settings */
+    gboolean    mos8580;            /* TRUE = 8580, FALSE = 6581 */
+    gboolean    forceModel;
+    gint        memoryMode;         /* See XS_MPU-constants */
+    gint        clockSpeed;         /* PAL (50Hz) or NTSC (60Hz) */
+    gboolean    forceSpeed;         /* TRUE = force to given clockspeed */
 
-	gint		playerEngine;		/* Selected player engine */
+    gint        playerEngine;       /* Selected player engine */
 
-	gboolean	emulateFilters;
-	gfloat		sid1FilterFs;
-	gfloat		sid1FilterFm;
-	gfloat		sid1FilterFt;
+    gboolean    emulateFilters;
+    gfloat      sid1FilterFs;
+    gfloat      sid1FilterFm;
+    gfloat      sid1FilterFt;
 
-	gint		sid2OptLevel;		/* SIDPlay2 emulation optimization */
-	gint		sid2Builder;		/* SIDPlay2 "builder" aka SID-emu */
-	t_xs_sid2_filter	sid2Filter;	/* Current SIDPlay2 filter */
-	t_xs_sid2_filter	**sid2FilterPresets;
-	gint		sid2NFilterPresets;
-	
-	
-	/* Playing settings */
-	gboolean	playMaxTimeEnable,
-			playMaxTimeUnknown;	/* Use max-time only when song-length is unknown */
-	gint		playMaxTime;		/* MAX playtime in seconds */
+    gint        sid2OptLevel;       /* SIDPlay2 emulation optimization */
+    gint        sid2Builder;        /* SIDPlay2 "builder" aka SID-emu */
+    xs_sid2_filter_t    sid2Filter; /* Current SIDPlay2 filter */
+    xs_sid2_filter_t    **sid2FilterPresets;
+    gint        sid2NFilterPresets;
+    
+    
+    /* Playing settings */
+    gboolean    playMaxTimeEnable,
+                playMaxTimeUnknown; /* Use max-time only when song-length is unknown */
+    gint        playMaxTime;        /* MAX playtime in seconds */
 
-	gboolean	playMinTimeEnable;
-	gint		playMinTime;		/* MIN playtime in seconds */
+    gboolean    playMinTimeEnable;
+    gint        playMinTime;        /* MIN playtime in seconds */
 
-	gboolean	songlenDBEnable;
-	gchar		*songlenDBPath;		/* Path to Songlengths.txt */
+    gboolean    songlenDBEnable;
+    gchar       *songlenDBPath;     /* Path to Songlengths.txt */
 
 
-	/* Miscellaneous settings */
-	gboolean	stilDBEnable;
-	gchar		*stilDBPath;		/* Path to STIL.txt */
-	gchar		*hvscPath;		/* Path-prefix for HVSC */
+    /* Miscellaneous settings */
+    gboolean    stilDBEnable;
+    gchar       *stilDBPath;        /* Path to STIL.txt */
+    gchar       *hvscPath;          /* Path-prefix for HVSC */
 
-	gint		subsongControl;
-	gboolean	detectMagic;
+    gint        subsongControl;
+    gboolean    detectMagic;
 
-	gboolean	titleOverride;		/* TRUE if XMMS titles are overriden */
-	gchar		*titleFormat;
+    gboolean    titleOverride;      /* TRUE if XMMS titles are overriden */
+    gchar       *titleFormat;
 
-	gboolean	subAutoEnable,
-			subAutoMinOnly;
-	gint		subAutoMinTime;
+    gboolean    subAutoEnable,
+                subAutoMinOnly;
+    gint        subAutoMinTime;
 } xs_cfg;
 
 XS_MUTEX_H(xs_cfg);
@@ -138,46 +139,46 @@
 /* Configuration-file
  */
 enum {
-	CTYPE_INT = 1,
-	CTYPE_FLOAT,
-	CTYPE_STR,
-	CTYPE_BOOL
+    CTYPE_INT = 1,
+    CTYPE_FLOAT,
+    CTYPE_STR,
+    CTYPE_BOOL
 };
 
 enum {
-	WTYPE_BGROUP = 1,
-	WTYPE_SPIN,
-	WTYPE_SCALE,
-	WTYPE_BUTTON,
-	WTYPE_TEXT,
-	WTYPE_COMBO
+    WTYPE_BGROUP = 1,
+    WTYPE_SPIN,
+    WTYPE_SCALE,
+    WTYPE_BUTTON,
+    WTYPE_TEXT,
+    WTYPE_COMBO
 };
 
 
 typedef struct {
-	gint	itemType;	/* Type of item (CTYPE_*) */
-	void	*itemData;	/* Pointer to variable */
-	gchar	*itemName;	/* Name of configuration item */
-} t_xs_cfg_item;
+    gint    itemType;   /* Type of item (CTYPE_*) */
+    void    *itemData;  /* Pointer to variable */
+    gchar   *itemName;  /* Name of configuration item */
+} xs_cfg_item_t;
 
 
 typedef struct {
-	gint	widType;
-	gint	itemType;
-	gchar	*widName;
-	void	*itemData;
-	gint	itemSet;
-} t_xs_wid_item;
+    gint    widType;
+    gint    itemType;
+    gchar   *widName;
+    void    *itemData;
+    gint    itemSet;
+} xs_wid_item_t;
 
 
 /* Functions
  */
-void	xs_init_configuration(void);
-void	xs_configure(void);
-void	xs_read_configuration(void);
-gint	xs_write_configuration(void);
+void    xs_init_configuration(void);
+void    xs_configure(void);
+void    xs_read_configuration(void);
+gint    xs_write_configuration(void);
 
 #ifdef __cplusplus
 }
 #endif
-#endif	/* XS_CONFIG_H */
+#endif    /* XS_CONFIG_H */
--- a/src/sid/xs_curve.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sid/xs_curve.c	Fri Jun 13 05:57:25 2008 +0300
@@ -33,29 +33,29 @@
 #include <gtk/gtkprivate.h>
 
 
-#define RADIUS		3	/* radius of the control points */
-#define RADIUS2		(RADIUS * 2)
-#define MIN_DISTANCE	7	/* min distance between control points */
+#define RADIUS        3    /* radius of the control points */
+#define RADIUS2        (RADIUS * 2)
+#define MIN_DISTANCE    7    /* min distance between control points */
 
 
-#define GRAPH_MASK	(GDK_EXPOSURE_MASK |		\
-			GDK_POINTER_MOTION_MASK |	\
-			GDK_POINTER_MOTION_HINT_MASK |	\
-			GDK_ENTER_NOTIFY_MASK |		\
-			GDK_BUTTON_PRESS_MASK |		\
-			GDK_BUTTON_RELEASE_MASK |	\
-			GDK_BUTTON1_MOTION_MASK)
+#define GRAPH_MASK    (GDK_EXPOSURE_MASK |        \
+            GDK_POINTER_MOTION_MASK |    \
+            GDK_POINTER_MOTION_HINT_MASK |    \
+            GDK_ENTER_NOTIFY_MASK |        \
+            GDK_BUTTON_PRESS_MASK |        \
+            GDK_BUTTON_RELEASE_MASK |    \
+            GDK_BUTTON1_MOTION_MASK)
 
-#define GET_X(i)	curve->ctlpoints[i].x
-#define GET_Y(i)	curve->ctlpoints[i].y
+#define GET_X(i)    curve->ctlpoints[i].x
+#define GET_Y(i)    curve->ctlpoints[i].y
 
 
 enum {
-	PROP_0,
-	PROP_MIN_X,
-	PROP_MAX_X,
-	PROP_MIN_Y,
-	PROP_MAX_Y
+    PROP_0,
+    PROP_MIN_X,
+    PROP_MAX_X,
+    PROP_MIN_Y,
+    PROP_MAX_Y
 };
 
 static GtkDrawingAreaClass *parent_class = NULL;
@@ -63,9 +63,9 @@
 static void xs_curve_class_init(XSCurveClass * class);
 static void xs_curve_init(XSCurve * curve);
 static void xs_curve_get_property(GObject * object, guint param_id,
-			GValue * value, GParamSpec * pspec);
+            GValue * value, GParamSpec * pspec);
 static void xs_curve_set_property(GObject * object, guint param_id,
-			const GValue * value, GParamSpec * pspec);
+            const GValue * value, GParamSpec * pspec);
 static void xs_curve_finalize(GObject * object);
 static gint xs_curve_graph_events(GtkWidget * widget, GdkEvent * event, XSCurve * c);
 static void xs_curve_size_graph(XSCurve * curve);
@@ -73,640 +73,640 @@
 
 GtkType xs_curve_get_type(void)
 {
-	static GType curve_type = 0;
+    static GType curve_type = 0;
 
-	if (!curve_type) {
-		static const GTypeInfo curve_info = {
-			sizeof(XSCurveClass),
-			NULL,	/* base_init */
-			NULL,	/* base_finalize */
-			(GClassInitFunc) xs_curve_class_init,
-			NULL,	/* class_finalize */
-			NULL,	/* class_data */
-			sizeof(XSCurve),
-			0,	/* n_preallocs */
-			(GInstanceInitFunc) xs_curve_init,
-		};
+    if (!curve_type) {
+        static const GTypeInfo curve_info = {
+            sizeof(XSCurveClass),
+            NULL,    /* base_init */
+            NULL,    /* base_finalize */
+            (GClassInitFunc) xs_curve_class_init,
+            NULL,    /* class_finalize */
+            NULL,    /* class_data */
+            sizeof(XSCurve),
+            0,    /* n_preallocs */
+            (GInstanceInitFunc) xs_curve_init,
+        };
 
-		curve_type = g_type_register_static(
-			GTK_TYPE_DRAWING_AREA, "XSCurve",
-			&curve_info, 0);
-	}
-	return curve_type;
+        curve_type = g_type_register_static(
+            GTK_TYPE_DRAWING_AREA, "XSCurve",
+            &curve_info, 0);
+    }
+    return curve_type;
 }
 
 
 static void xs_curve_class_init(XSCurveClass *class)
 {
-	GObjectClass *gobject_class = G_OBJECT_CLASS(class);
+    GObjectClass *gobject_class = G_OBJECT_CLASS(class);
 
-	parent_class = g_type_class_peek_parent(class);
+    parent_class = g_type_class_peek_parent(class);
 
-	gobject_class->finalize = xs_curve_finalize;
+    gobject_class->finalize = xs_curve_finalize;
 
-	gobject_class->set_property = xs_curve_set_property;
-	gobject_class->get_property = xs_curve_get_property;
+    gobject_class->set_property = xs_curve_set_property;
+    gobject_class->get_property = xs_curve_get_property;
 
-	g_object_class_install_property(gobject_class, PROP_MIN_X,
-		g_param_spec_float("min-x",
-			"Minimum X",
-			"Minimum possible value for X",
-			-G_MAXFLOAT, G_MAXFLOAT, 0.0,
-			GTK_PARAM_READWRITE)
-		);
+    g_object_class_install_property(gobject_class, PROP_MIN_X,
+        g_param_spec_float("min-x",
+            "Minimum X",
+            "Minimum possible value for X",
+            -G_MAXFLOAT, G_MAXFLOAT, 0.0,
+            GTK_PARAM_READWRITE)
+        );
 
-	g_object_class_install_property(gobject_class, PROP_MAX_X,
-		g_param_spec_float("max-x",
-			"Maximum X",
-			"Maximum possible X value",
-			-G_MAXFLOAT, G_MAXFLOAT, 1.0,
-			GTK_PARAM_READWRITE)
-		);
-	
-	g_object_class_install_property(gobject_class, PROP_MIN_Y,
-		g_param_spec_float("min-y",
-			"Minimum Y",
-			"Minimum possible value for Y",
-			-G_MAXFLOAT, G_MAXFLOAT, 0.0,
-			GTK_PARAM_READWRITE)
-		);
-	
-	g_object_class_install_property(gobject_class, PROP_MAX_Y,
-		g_param_spec_float("max-y",
-			"Maximum Y",
-			"Maximum possible value for Y",
-			-G_MAXFLOAT, G_MAXFLOAT, 1.0,
-			GTK_PARAM_READWRITE)
-		);
+    g_object_class_install_property(gobject_class, PROP_MAX_X,
+        g_param_spec_float("max-x",
+            "Maximum X",
+            "Maximum possible X value",
+            -G_MAXFLOAT, G_MAXFLOAT, 1.0,
+            GTK_PARAM_READWRITE)
+        );
+    
+    g_object_class_install_property(gobject_class, PROP_MIN_Y,
+        g_param_spec_float("min-y",
+            "Minimum Y",
+            "Minimum possible value for Y",
+            -G_MAXFLOAT, G_MAXFLOAT, 0.0,
+            GTK_PARAM_READWRITE)
+        );
+    
+    g_object_class_install_property(gobject_class, PROP_MAX_Y,
+        g_param_spec_float("max-y",
+            "Maximum Y",
+            "Maximum possible value for Y",
+            -G_MAXFLOAT, G_MAXFLOAT, 1.0,
+            GTK_PARAM_READWRITE)
+        );
 }
 
 
 static void xs_curve_init(XSCurve *curve)
 {
-	gint old_mask;
+    gint old_mask;
 
-	curve->pixmap = NULL;
-	curve->grab_point = -1;
+    curve->pixmap = NULL;
+    curve->grab_point = -1;
 
-	curve->nctlpoints = 0;
-	curve->ctlpoints = NULL;
+    curve->nctlpoints = 0;
+    curve->ctlpoints = NULL;
 
-	curve->min_x = 0.0;
-	curve->max_x = 2047.0;
-	curve->min_y = 0.0;
-	curve->max_y = 24000.0;
+    curve->min_x = 0.0;
+    curve->max_x = 2047.0;
+    curve->min_y = 0.0;
+    curve->max_y = 24000.0;
 
-	old_mask = gtk_widget_get_events(GTK_WIDGET(curve));
-	gtk_widget_set_events(GTK_WIDGET(curve), old_mask | GRAPH_MASK);
-	g_signal_connect(curve, "event", G_CALLBACK(xs_curve_graph_events), curve);
-	xs_curve_size_graph(curve);
+    old_mask = gtk_widget_get_events(GTK_WIDGET(curve));
+    gtk_widget_set_events(GTK_WIDGET(curve), old_mask | GRAPH_MASK);
+    g_signal_connect(curve, "event", G_CALLBACK(xs_curve_graph_events), curve);
+    xs_curve_size_graph(curve);
 }
 
 
 static void xs_curve_set_property(GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec)
 {
-	XSCurve *curve = XS_CURVE(object);
+    XSCurve *curve = XS_CURVE(object);
 
-	switch (prop_id) {
-	case PROP_MIN_X:
-		xs_curve_set_range(curve,
-			g_value_get_float(value), curve->max_x,
-			curve->min_y, curve->max_y);
-		break;
-	case PROP_MAX_X:
-		xs_curve_set_range(curve,
-			curve->min_x, g_value_get_float(value),
-			curve->min_y, curve->max_y);
-		break;
-	case PROP_MIN_Y:
-		xs_curve_set_range(curve,
-			curve->min_x, curve->max_x,
-			g_value_get_float(value), curve->max_y);
-		break;
-	case PROP_MAX_Y:
-		xs_curve_set_range(curve,
-			curve->min_x, curve->max_x,
-			curve->min_y, g_value_get_float(value));
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
-		break;
-	}
+    switch (prop_id) {
+    case PROP_MIN_X:
+        xs_curve_set_range(curve,
+            g_value_get_float(value), curve->max_x,
+            curve->min_y, curve->max_y);
+        break;
+    case PROP_MAX_X:
+        xs_curve_set_range(curve,
+            curve->min_x, g_value_get_float(value),
+            curve->min_y, curve->max_y);
+        break;
+    case PROP_MIN_Y:
+        xs_curve_set_range(curve,
+            curve->min_x, curve->max_x,
+            g_value_get_float(value), curve->max_y);
+        break;
+    case PROP_MAX_Y:
+        xs_curve_set_range(curve,
+            curve->min_x, curve->max_x,
+            curve->min_y, g_value_get_float(value));
+        break;
+    default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+        break;
+    }
 }
 
 
 static void xs_curve_get_property(GObject * object, guint prop_id, GValue * value, GParamSpec * pspec)
 {
-	XSCurve *curve = XS_CURVE(object);
+    XSCurve *curve = XS_CURVE(object);
 
-	switch (prop_id) {
-	case PROP_MIN_X:
-		g_value_set_float(value, curve->min_x);
-		break;
-	case PROP_MAX_X:
-		g_value_set_float(value, curve->max_x);
-		break;
-	case PROP_MIN_Y:
-		g_value_set_float(value, curve->min_y);
-		break;
-	case PROP_MAX_Y:
-		g_value_set_float(value, curve->max_y);
-		break;
-	default:
-		G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
-		break;
-	}
+    switch (prop_id) {
+    case PROP_MIN_X:
+        g_value_set_float(value, curve->min_x);
+        break;
+    case PROP_MAX_X:
+        g_value_set_float(value, curve->max_x);
+        break;
+    case PROP_MIN_Y:
+        g_value_set_float(value, curve->min_y);
+        break;
+    case PROP_MAX_Y:
+        g_value_set_float(value, curve->max_y);
+        break;
+    default:
+        G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
+        break;
+    }
 }
 
 
 static int xs_project(gfloat value, gfloat min, gfloat max, int norm)
 {
-	return (norm - 1) * ((value - min) / (max - min)) + 0.5;
+    return (norm - 1) * ((value - min) / (max - min)) + 0.5;
 }
 
 
 static gfloat xs_unproject(gint value, gfloat min, gfloat max, int norm)
 {
-	return value / (gfloat) (norm - 1) * (max - min) + min;
+    return value / (gfloat) (norm - 1) * (max - min) + min;
 }
 
 
 static inline void xs_cubic_coeff(gfloat x1, gfloat y1,
-			gfloat x2, gfloat y2,
-			gfloat k1, gfloat k2,
-			gfloat *a, gfloat *b,
-			gfloat *c, gfloat *d)
+            gfloat x2, gfloat y2,
+            gfloat k1, gfloat k2,
+            gfloat *a, gfloat *b,
+            gfloat *c, gfloat *d)
 {
-	gfloat dx = x2 - x1, dy = y2 - y1;
+    gfloat dx = x2 - x1, dy = y2 - y1;
 
-	*a = ((k1 + k2) - 2 * dy / dx) / (dx * dx);
-	*b = ((k2 - k1) / dx - 3 * (x1 + x2) * (*a)) / 2;
-	*c = k1 - (3 * x1 * (*a) + 2 * (*b)) * x1;
-	*d = y1 - ((x1 * (*a) + (*b)) * x1 + (*c)) * x1;
+    *a = ((k1 + k2) - 2 * dy / dx) / (dx * dx);
+    *b = ((k2 - k1) / dx - 3 * (x1 + x2) * (*a)) / 2;
+    *c = k1 - (3 * x1 * (*a) + 2 * (*b)) * x1;
+    *d = y1 - ((x1 * (*a) + (*b)) * x1 + (*c)) * x1;
 }
 
 
 static void xs_curve_draw(XSCurve *curve, gint width, gint height)
 {
-	gfloat res = 5.0f;
-	GtkStateType state;
-	GtkStyle *style;
-	gint i, ox = -1, oy = -1;
-	t_xs_point *p0, *p1, *p2, *p3;
+    gfloat res = 5.0f;
+    GtkStateType state;
+    GtkStyle *style;
+    gint i, ox = -1, oy = -1;
+    xs_point_t *p0, *p1, *p2, *p3;
 
-	if (!curve->pixmap)
-		return;
+    if (!curve->pixmap)
+        return;
 
-	state = GTK_STATE_NORMAL;
-	if (!GTK_WIDGET_IS_SENSITIVE(GTK_WIDGET(curve)))
-		state = GTK_STATE_INSENSITIVE;
+    state = GTK_STATE_NORMAL;
+    if (!GTK_WIDGET_IS_SENSITIVE(GTK_WIDGET(curve)))
+        state = GTK_STATE_INSENSITIVE;
 
-	style = GTK_WIDGET(curve)->style;
+    style = GTK_WIDGET(curve)->style;
 
-	/* Clear the pixmap */
-	gtk_paint_flat_box(style, curve->pixmap,
-		GTK_STATE_NORMAL, GTK_SHADOW_NONE,
-		NULL, GTK_WIDGET(curve), "curve_bg",
-		0, 0,
-		width + RADIUS2,
-		height + RADIUS2);
+    /* Clear the pixmap */
+    gtk_paint_flat_box(style, curve->pixmap,
+        GTK_STATE_NORMAL, GTK_SHADOW_NONE,
+        NULL, GTK_WIDGET(curve), "curve_bg",
+        0, 0,
+        width + RADIUS2,
+        height + RADIUS2);
 
-	
-	/* Draw the grid */
-	for (i = 0; i < 5; i++) {
-		gdk_draw_line(curve->pixmap, style->dark_gc[state],
-			RADIUS,		i * (height / 4.0) + RADIUS,
-			width + RADIUS,	i * (height / 4.0) + RADIUS);
+    
+    /* Draw the grid */
+    for (i = 0; i < 5; i++) {
+        gdk_draw_line(curve->pixmap, style->dark_gc[state],
+            RADIUS,        i * (height / 4.0) + RADIUS,
+            width + RADIUS,    i * (height / 4.0) + RADIUS);
 
-		gdk_draw_line(curve->pixmap, style->dark_gc[state],
-			i * (width / 4.0) + RADIUS, RADIUS,
-			i * (width / 4.0) + RADIUS, height + RADIUS);
-	}
+        gdk_draw_line(curve->pixmap, style->dark_gc[state],
+            i * (width / 4.0) + RADIUS, RADIUS,
+            i * (width / 4.0) + RADIUS, height + RADIUS);
+    }
 
 #if 1
-	/* Draw the spline/curve itself */
-	p0 = curve->ctlpoints;
-	p1 = p0;
-	p2 = p1; p2++;
-	p3 = p2; p3++;
+    /* Draw the spline/curve itself */
+    p0 = curve->ctlpoints;
+    p1 = p0;
+    p2 = p1; p2++;
+    p3 = p2; p3++;
 
-	/* Draw each curve segment */
-	if (curve->nctlpoints > 5)
-	for (i = 0; i < curve->nctlpoints; i++, ++p0, ++p1, ++p2, ++p3) {
-		gint n;
-		gfloat k1, k2, a, b, c, d, x;
-		
-		if (p1->x == p2->x)
-			continue;
+    /* Draw each curve segment */
+    if (curve->nctlpoints > 5)
+    for (i = 0; i < curve->nctlpoints; i++, ++p0, ++p1, ++p2, ++p3) {
+        gint n;
+        gfloat k1, k2, a, b, c, d, x;
+        
+        if (p1->x == p2->x)
+            continue;
 
-		if (p0->x == p1->x && p2->x == p3->x) {
-			k1 = k2 = (p2->y - p1->y) / (p2->x - p1->x);
-		} else if (p0->x == p1->x) {
-			k2 = (p3->y - p1->y) / (p3->x - p1->x);
-			k1 = (3 * (p2->y - p1->y) / (p2->x - p1->x) - k2) / 2;
-		} else if (p2->x == p3->x) {
-			k1 = (p2->y - p0->y) / (p2->x - p0->x);
-			k2 = (3 * (p2->y - p1->y) / (p2->x - p1->x) - k1) / 2;
-		} else {
-			k1 = (p2->y - p0->y) / (p2->x - p0->x);
-			k2 = (p3->y - p1->y) / (p3->x - p1->x);
-		}
+        if (p0->x == p1->x && p2->x == p3->x) {
+            k1 = k2 = (p2->y - p1->y) / (p2->x - p1->x);
+        } else if (p0->x == p1->x) {
+            k2 = (p3->y - p1->y) / (p3->x - p1->x);
+            k1 = (3 * (p2->y - p1->y) / (p2->x - p1->x) - k2) / 2;
+        } else if (p2->x == p3->x) {
+            k1 = (p2->y - p0->y) / (p2->x - p0->x);
+            k2 = (3 * (p2->y - p1->y) / (p2->x - p1->x) - k1) / 2;
+        } else {
+            k1 = (p2->y - p0->y) / (p2->x - p0->x);
+            k2 = (p3->y - p1->y) / (p3->x - p1->x);
+        }
 
-		xs_cubic_coeff(p1->x, p1->y, p2->x, p2->y, k1, k2, &a, &b, &c, &d);
+        xs_cubic_coeff(p1->x, p1->y, p2->x, p2->y, k1, k2, &a, &b, &c, &d);
 
-		for (x = p1->x; x <= p2->x; x += res, n++) {
-			gfloat y = ((a * x + b) * x + c) * x + d;
-			gint qx, qy;
-			qx = RADIUS + xs_project(x, curve->min_x, curve->max_x, width);
-			qy = RADIUS + xs_project(y, curve->min_y, curve->max_y, height);
-			
-			if (ox != -1) {
-				gdk_draw_line(curve->pixmap, style->fg_gc[state],
-					ox, oy, qx, qy);
-			}
-			ox = qx; oy = qy;
-		}
-	}
+        for (x = p1->x; x <= p2->x; x += res, n++) {
+            gfloat y = ((a * x + b) * x + c) * x + d;
+            gint qx, qy;
+            qx = RADIUS + xs_project(x, curve->min_x, curve->max_x, width);
+            qy = RADIUS + xs_project(y, curve->min_y, curve->max_y, height);
+            
+            if (ox != -1) {
+                gdk_draw_line(curve->pixmap, style->fg_gc[state],
+                    ox, oy, qx, qy);
+            }
+            ox = qx; oy = qy;
+        }
+    }
 
 #endif
 
-	/* Draw control points */
-	for (i = 0; i < curve->nctlpoints; ++i) {
-		gint x, y;
-		GtkStateType cstate;
+    /* Draw control points */
+    for (i = 0; i < curve->nctlpoints; ++i) {
+        gint x, y;
+        GtkStateType cstate;
 
-		if (GET_X(i) < curve->min_x || GET_Y(i) < curve->min_y ||
-			GET_X(i) >= curve->max_x || GET_Y(i) >= curve->max_y)
-			continue;
+        if (GET_X(i) < curve->min_x || GET_Y(i) < curve->min_y ||
+            GET_X(i) >= curve->max_x || GET_Y(i) >= curve->max_y)
+            continue;
 
-		x = xs_project(GET_X(i), curve->min_x, curve->max_x, width);
-		y = xs_project(GET_Y(i), curve->min_y, curve->max_y, height);
-		
-		if (i == curve->grab_point) {
-			cstate = GTK_STATE_SELECTED;
-			gdk_draw_line(curve->pixmap, style->fg_gc[cstate],
-				x + RADIUS, RADIUS, x + RADIUS, height + RADIUS);
-			gdk_draw_line(curve->pixmap, style->fg_gc[cstate],
-				RADIUS, y + RADIUS, width + RADIUS, y + RADIUS);
-		} else
-			cstate = state;
-		
-		gdk_draw_arc(curve->pixmap, style->fg_gc[cstate], TRUE,
-			x, y, RADIUS2, RADIUS2, 0, 360 * 64);
-	}
-	
-	/* Draw pixmap in the widget */
-	gdk_draw_pixmap(GTK_WIDGET(curve)->window,
-			style->fg_gc[state], curve->pixmap,
-			0, 0, 0, 0,
-			width + RADIUS2,
-			height + RADIUS2);
+        x = xs_project(GET_X(i), curve->min_x, curve->max_x, width);
+        y = xs_project(GET_Y(i), curve->min_y, curve->max_y, height);
+        
+        if (i == curve->grab_point) {
+            cstate = GTK_STATE_SELECTED;
+            gdk_draw_line(curve->pixmap, style->fg_gc[cstate],
+                x + RADIUS, RADIUS, x + RADIUS, height + RADIUS);
+            gdk_draw_line(curve->pixmap, style->fg_gc[cstate],
+                RADIUS, y + RADIUS, width + RADIUS, y + RADIUS);
+        } else
+            cstate = state;
+        
+        gdk_draw_arc(curve->pixmap, style->fg_gc[cstate], TRUE,
+            x, y, RADIUS2, RADIUS2, 0, 360 * 64);
+    }
+    
+    /* Draw pixmap in the widget */
+    gdk_draw_pixmap(GTK_WIDGET(curve)->window,
+            style->fg_gc[state], curve->pixmap,
+            0, 0, 0, 0,
+            width + RADIUS2,
+            height + RADIUS2);
 }
 
 
 static gint xs_curve_graph_events(GtkWidget *widget, GdkEvent *event, XSCurve *curve)
 {
-	GdkCursorType new_type = curve->cursor_type;
-	GdkEventButton *bevent;
-	GtkWidget *w;
-	gint i, width, height, x, y, tx, ty, cx, closest_point = 0, min_x;
-	guint distance;
+    GdkCursorType new_type = curve->cursor_type;
+    GdkEventButton *bevent;
+    GtkWidget *w;
+    gint i, width, height, x, y, tx, ty, cx, closest_point = 0, min_x;
+    guint distance;
 
-	w = GTK_WIDGET(curve);
-	width = w->allocation.width - RADIUS2;
-	height = w->allocation.height - RADIUS2;
+    w = GTK_WIDGET(curve);
+    width = w->allocation.width - RADIUS2;
+    height = w->allocation.height - RADIUS2;
 
-	if ((width < 0) || (height < 0))
-		return FALSE;
+    if ((width < 0) || (height < 0))
+        return FALSE;
 
-	/* get the pointer position */
-	gdk_window_get_pointer(w->window, &tx, &ty, NULL);
-	x = CLAMP((tx - RADIUS), 0, width - 1);
-	y = CLAMP((ty - RADIUS), 0, height - 1);
-	min_x = curve->min_x;
+    /* get the pointer position */
+    gdk_window_get_pointer(w->window, &tx, &ty, NULL);
+    x = CLAMP((tx - RADIUS), 0, width - 1);
+    y = CLAMP((ty - RADIUS), 0, height - 1);
+    min_x = curve->min_x;
 
-	distance = ~0U;
-	for (i = 0; i < curve->nctlpoints; ++i) {
-		cx = xs_project(GET_X(i), min_x, curve->max_x, width);
-		if ((guint) abs(x - cx) < distance) {
-			distance = abs(x - cx);
-			closest_point = i;
-		}
-	}
-	
-	/* Act based on event type */
-	switch (event->type) {
-	case GDK_CONFIGURE:
-		if (curve->pixmap)
-			gdk_pixmap_unref(curve->pixmap);
-		curve->pixmap = 0;
+    distance = ~0U;
+    for (i = 0; i < curve->nctlpoints; ++i) {
+        cx = xs_project(GET_X(i), min_x, curve->max_x, width);
+        if ((guint) abs(x - cx) < distance) {
+            distance = abs(x - cx);
+            closest_point = i;
+        }
+    }
+    
+    /* Act based on event type */
+    switch (event->type) {
+    case GDK_CONFIGURE:
+        if (curve->pixmap)
+            gdk_pixmap_unref(curve->pixmap);
+        curve->pixmap = 0;
 
-		/* fall through */
+        /* fall through */
 
-	case GDK_EXPOSE:
-		if (!curve->pixmap) {
-			curve->pixmap = gdk_pixmap_new(w->window,
-			w->allocation.width, w->allocation.height, -1);
-		}
-		xs_curve_draw(curve, width, height);
-		break;
+    case GDK_EXPOSE:
+        if (!curve->pixmap) {
+            curve->pixmap = gdk_pixmap_new(w->window,
+            w->allocation.width, w->allocation.height, -1);
+        }
+        xs_curve_draw(curve, width, height);
+        break;
 
-	case GDK_BUTTON_PRESS:
-		gtk_grab_add(widget);
+    case GDK_BUTTON_PRESS:
+        gtk_grab_add(widget);
 
-		bevent = (GdkEventButton *) event;
-		new_type = GDK_TCROSS;
+        bevent = (GdkEventButton *) event;
+        new_type = GDK_TCROSS;
 
-		if (distance > MIN_DISTANCE) {
-			/* insert a new control point */
-			if (curve->nctlpoints > 0) {
-				cx = xs_project(GET_X(closest_point), min_x, curve->max_x, width);
-				if (x > cx) closest_point++;
-			}
-			
-			curve->nctlpoints++;
-			
-			curve->ctlpoints = g_realloc(curve->ctlpoints,
-				curve->nctlpoints * sizeof(*curve->ctlpoints));
-			
-			for (i = curve->nctlpoints - 1; i > closest_point; --i) {
-				memcpy(curve->ctlpoints + i,
-					curve->ctlpoints + i - 1,
-					sizeof(*curve->ctlpoints));
-			}
-		}
-		
-		curve->grab_point = closest_point;
-		GET_X(curve->grab_point) = xs_unproject(x, min_x, curve->max_x, width);
-		GET_Y(curve->grab_point) = xs_unproject(y, curve->min_y, curve->max_y, height);
+        if (distance > MIN_DISTANCE) {
+            /* insert a new control point */
+            if (curve->nctlpoints > 0) {
+                cx = xs_project(GET_X(closest_point), min_x, curve->max_x, width);
+                if (x > cx) closest_point++;
+            }
+            
+            curve->nctlpoints++;
+            
+            curve->ctlpoints = g_realloc(curve->ctlpoints,
+                curve->nctlpoints * sizeof(*curve->ctlpoints));
+            
+            for (i = curve->nctlpoints - 1; i > closest_point; --i) {
+                memcpy(curve->ctlpoints + i,
+                    curve->ctlpoints + i - 1,
+                    sizeof(*curve->ctlpoints));
+            }
+        }
+        
+        curve->grab_point = closest_point;
+        GET_X(curve->grab_point) = xs_unproject(x, min_x, curve->max_x, width);
+        GET_Y(curve->grab_point) = xs_unproject(y, curve->min_y, curve->max_y, height);
 
-		xs_curve_draw(curve, width, height);
-		break;
+        xs_curve_draw(curve, width, height);
+        break;
 
-	case GDK_BUTTON_RELEASE:
-		{
-		gint src, dst;
-		
-		gtk_grab_remove(widget);
+    case GDK_BUTTON_RELEASE:
+        {
+        gint src, dst;
+        
+        gtk_grab_remove(widget);
 
-		/* delete inactive points: */
-		for (src = dst = 0; src < curve->nctlpoints; ++src) {
-			if (GET_X(src) >= min_x) {
-				memcpy(curve->ctlpoints + dst,
-					curve->ctlpoints + src,
-					sizeof(*curve->ctlpoints));
-				dst++;
-			}
-		}
+        /* delete inactive points: */
+        for (src = dst = 0; src < curve->nctlpoints; ++src) {
+            if (GET_X(src) >= min_x) {
+                memcpy(curve->ctlpoints + dst,
+                    curve->ctlpoints + src,
+                    sizeof(*curve->ctlpoints));
+                dst++;
+            }
+        }
 
-		if (dst < src) {
-			curve->nctlpoints -= (src - dst);
-			if (curve->nctlpoints <= 0) {
-				curve->nctlpoints = 1;
-				GET_X(0) = min_x;
-				GET_Y(0) = curve->min_y;
-				xs_curve_draw(curve, width, height);
-			}
-			curve->ctlpoints = g_realloc(curve->ctlpoints,
-				curve->nctlpoints * sizeof(*curve->ctlpoints));
-		}
+        if (dst < src) {
+            curve->nctlpoints -= (src - dst);
+            if (curve->nctlpoints <= 0) {
+                curve->nctlpoints = 1;
+                GET_X(0) = min_x;
+                GET_Y(0) = curve->min_y;
+                xs_curve_draw(curve, width, height);
+            }
+            curve->ctlpoints = g_realloc(curve->ctlpoints,
+                curve->nctlpoints * sizeof(*curve->ctlpoints));
+        }
 
-		new_type = GDK_FLEUR;
-		curve->grab_point = -1;
-		}
-		xs_curve_draw(curve, width, height);
-		break;
+        new_type = GDK_FLEUR;
+        curve->grab_point = -1;
+        }
+        xs_curve_draw(curve, width, height);
+        break;
 
-	case GDK_MOTION_NOTIFY:
-		if (curve->grab_point == -1) {
-			/* if no point is grabbed...  */
-			if (distance <= MIN_DISTANCE)
-				new_type = GDK_FLEUR;
-			else
-				new_type = GDK_TCROSS;
-		} else {
-			gint leftbound, rightbound;
-			
-			/* drag the grabbed point  */
-			new_type = GDK_TCROSS;
-			
-			leftbound = -MIN_DISTANCE;
-			if (curve->grab_point > 0) {
-				leftbound = xs_project(
-					GET_X(curve->grab_point-1),
-					min_x, curve->max_x, width);
-			}
+    case GDK_MOTION_NOTIFY:
+        if (curve->grab_point == -1) {
+            /* if no point is grabbed...  */
+            if (distance <= MIN_DISTANCE)
+                new_type = GDK_FLEUR;
+            else
+                new_type = GDK_TCROSS;
+        } else {
+            gint leftbound, rightbound;
+            
+            /* drag the grabbed point  */
+            new_type = GDK_TCROSS;
+            
+            leftbound = -MIN_DISTANCE;
+            if (curve->grab_point > 0) {
+                leftbound = xs_project(
+                    GET_X(curve->grab_point-1),
+                    min_x, curve->max_x, width);
+            }
 
-			rightbound = width + RADIUS2 + MIN_DISTANCE;
-			if (curve->grab_point + 1 < curve->nctlpoints) {
-				rightbound = xs_project(
-					GET_X(curve->grab_point+1),
-					min_x, curve->max_x, width);
-			}
+            rightbound = width + RADIUS2 + MIN_DISTANCE;
+            if (curve->grab_point + 1 < curve->nctlpoints) {
+                rightbound = xs_project(
+                    GET_X(curve->grab_point+1),
+                    min_x, curve->max_x, width);
+            }
 
-			if ((tx <= leftbound) || (tx >= rightbound) ||
-				(ty > height + RADIUS2 + MIN_DISTANCE) || (ty < -MIN_DISTANCE)) {
-				GET_X(curve->grab_point) = min_x - 1.0;
-			} else {
-				GET_X(curve->grab_point) =
-					xs_unproject(x, min_x, curve->max_x, width);
-				GET_Y(curve->grab_point) =
-					xs_unproject(y, curve->min_y, curve->max_y, height);
-			}
-			
-			xs_curve_draw(curve, width, height);
-		}
-		
-		/* See if cursor type was changed and update accordingly */
-		if (new_type != (GdkCursorType) curve->cursor_type) {
-			GdkCursor *cursor;
-			curve->cursor_type = new_type;
-			cursor = gdk_cursor_new(curve->cursor_type);
-			gdk_window_set_cursor(w->window, cursor);
-			gdk_cursor_destroy(cursor);
-		}
-		break;
+            if ((tx <= leftbound) || (tx >= rightbound) ||
+                (ty > height + RADIUS2 + MIN_DISTANCE) || (ty < -MIN_DISTANCE)) {
+                GET_X(curve->grab_point) = min_x - 1.0;
+            } else {
+                GET_X(curve->grab_point) =
+                    xs_unproject(x, min_x, curve->max_x, width);
+                GET_Y(curve->grab_point) =
+                    xs_unproject(y, curve->min_y, curve->max_y, height);
+            }
+            
+            xs_curve_draw(curve, width, height);
+        }
+        
+        /* See if cursor type was changed and update accordingly */
+        if (new_type != (GdkCursorType) curve->cursor_type) {
+            GdkCursor *cursor;
+            curve->cursor_type = new_type;
+            cursor = gdk_cursor_new(curve->cursor_type);
+            gdk_window_set_cursor(w->window, cursor);
+            gdk_cursor_destroy(cursor);
+        }
+        break;
 
-	default:
-		break;
-	}
-	
-	return FALSE;
+    default:
+        break;
+    }
+    
+    return FALSE;
 }
 
 
 static void xs_curve_size_graph(XSCurve *curve)
 {
-	gint width, height;
-	gfloat aspect;
-	GdkScreen *screen = gtk_widget_get_screen(GTK_WIDGET(curve));
+    gint width, height;
+    gfloat aspect;
+    GdkScreen *screen = gtk_widget_get_screen(GTK_WIDGET(curve));
 
-	width = (curve->max_x - curve->min_x) + 1;
-	height = (curve->max_y - curve->min_y) + 1;
-	aspect = width / (gfloat) height;
+    width = (curve->max_x - curve->min_x) + 1;
+    height = (curve->max_y - curve->min_y) + 1;
+    aspect = width / (gfloat) height;
 
-	if (width > gdk_screen_get_width(screen) / 4)
-		width = gdk_screen_get_width(screen) / 4;
+    if (width > gdk_screen_get_width(screen) / 4)
+        width = gdk_screen_get_width(screen) / 4;
 
-	if (height > gdk_screen_get_height(screen) / 4)
-		height = gdk_screen_get_height(screen) / 4;
+    if (height > gdk_screen_get_height(screen) / 4)
+        height = gdk_screen_get_height(screen) / 4;
 
-	if (aspect < 1.0)
-		width = height * aspect;
-	else
-		height = width / aspect;
+    if (aspect < 1.0)
+        width = height * aspect;
+    else
+        height = width / aspect;
 
-	gtk_widget_set_size_request(GTK_WIDGET(curve), width + RADIUS2, height + RADIUS2);
+    gtk_widget_set_size_request(GTK_WIDGET(curve), width + RADIUS2, height + RADIUS2);
 }
 
 
 static void xs_curve_update(XSCurve *curve)
 {
-	if (curve->pixmap) {
-		gint width, height;
+    if (curve->pixmap) {
+        gint width, height;
 
-		width = GTK_WIDGET(curve)->allocation.width - RADIUS2;
-		height = GTK_WIDGET(curve)->allocation.height - RADIUS2;
-		xs_curve_draw(curve, width, height);
-	}
+        width = GTK_WIDGET(curve)->allocation.width - RADIUS2;
+        height = GTK_WIDGET(curve)->allocation.height - RADIUS2;
+        xs_curve_draw(curve, width, height);
+    }
 }
 
 
 void xs_curve_reset(XSCurve *curve)
 {
-	if (curve->ctlpoints)
-		g_free(curve->ctlpoints);
+    if (curve->ctlpoints)
+        g_free(curve->ctlpoints);
 
-	curve->nctlpoints = 4;
-	curve->ctlpoints = g_malloc(curve->nctlpoints * sizeof(curve->ctlpoints[0]));
+    curve->nctlpoints = 4;
+    curve->ctlpoints = g_malloc(curve->nctlpoints * sizeof(curve->ctlpoints[0]));
 
-	GET_X(0) = curve->min_x;
-	GET_Y(0) = curve->min_y;
-	GET_X(1) = curve->min_x;
-	GET_Y(1) = curve->min_y;
+    GET_X(0) = curve->min_x;
+    GET_Y(0) = curve->min_y;
+    GET_X(1) = curve->min_x;
+    GET_Y(1) = curve->min_y;
 
-	GET_X(2) = curve->max_x;
-	GET_Y(2) = curve->max_y;
-	GET_X(3) = curve->max_x;
-	GET_Y(3) = curve->max_y;
-	
-	xs_curve_update(curve);
+    GET_X(2) = curve->max_x;
+    GET_Y(2) = curve->max_y;
+    GET_X(3) = curve->max_x;
+    GET_Y(3) = curve->max_y;
+    
+    xs_curve_update(curve);
 }
 
 
 void xs_curve_set_range(XSCurve *curve, gfloat min_x, gfloat min_y, gfloat max_x, gfloat max_y)
 {
-	g_object_freeze_notify(G_OBJECT(curve));
-	if (curve->min_x != min_x) {
-		curve->min_x = min_x;
-		g_object_notify(G_OBJECT(curve), "min-x");
-	}
-	if (curve->max_x != max_x) {
-		curve->max_x = max_x;
-		g_object_notify(G_OBJECT(curve), "max-x");
-	}
-	if (curve->min_y != min_y) {
-		curve->min_y = min_y;
-		g_object_notify(G_OBJECT(curve), "min-y");
-	}
-	if (curve->max_y != max_y) {
-		curve->max_y = max_y;
-		g_object_notify(G_OBJECT(curve), "max-y");
-	}
-	g_object_thaw_notify(G_OBJECT(curve));
+    g_object_freeze_notify(G_OBJECT(curve));
+    if (curve->min_x != min_x) {
+        curve->min_x = min_x;
+        g_object_notify(G_OBJECT(curve), "min-x");
+    }
+    if (curve->max_x != max_x) {
+        curve->max_x = max_x;
+        g_object_notify(G_OBJECT(curve), "max-x");
+    }
+    if (curve->min_y != min_y) {
+        curve->min_y = min_y;
+        g_object_notify(G_OBJECT(curve), "min-y");
+    }
+    if (curve->max_y != max_y) {
+        curve->max_y = max_y;
+        g_object_notify(G_OBJECT(curve), "max-y");
+    }
+    g_object_thaw_notify(G_OBJECT(curve));
 
-	xs_curve_size_graph(curve);
-	xs_curve_reset(curve);
+    xs_curve_size_graph(curve);
+    xs_curve_reset(curve);
 }
 
 
 gboolean xs_curve_realloc_data(XSCurve *curve, gint npoints)
 {
-	if (npoints != curve->nctlpoints) {
-		curve->nctlpoints = npoints;
-		curve->ctlpoints = (t_xs_point *) g_realloc(curve->ctlpoints,
-			curve->nctlpoints * sizeof(*curve->ctlpoints));
+    if (npoints != curve->nctlpoints) {
+        curve->nctlpoints = npoints;
+        curve->ctlpoints = (xs_point_t *) g_realloc(curve->ctlpoints,
+            curve->nctlpoints * sizeof(*curve->ctlpoints));
 
-		if (curve->ctlpoints == NULL)
-			return FALSE;
-	}
-	
-	return TRUE;
+        if (curve->ctlpoints == NULL)
+            return FALSE;
+    }
+    
+    return TRUE;
 }
 
 
-void xs_curve_get_data(XSCurve *curve, t_xs_point ***points, gint **npoints)
+void xs_curve_get_data(XSCurve *curve, xs_point_t ***points, gint **npoints)
 {
-	*points = &(curve->ctlpoints);
-	*npoints = &(curve->nctlpoints);
+    *points = &(curve->ctlpoints);
+    *npoints = &(curve->nctlpoints);
 }
 
 
-gboolean xs_curve_set_points(XSCurve *curve, t_xs_int_point *points, gint npoints)
+gboolean xs_curve_set_points(XSCurve *curve, xs_int_point_t *points, gint npoints)
 {
-	gint i;
+    gint i;
 
-	if (!xs_curve_realloc_data(curve, npoints + 4))
-		return FALSE;
-	
-	GET_X(0) = curve->min_x;
-	GET_Y(0) = curve->min_y;
-	GET_X(1) = curve->min_x;
-	GET_Y(1) = curve->min_y;
+    if (!xs_curve_realloc_data(curve, npoints + 4))
+        return FALSE;
+    
+    GET_X(0) = curve->min_x;
+    GET_Y(0) = curve->min_y;
+    GET_X(1) = curve->min_x;
+    GET_Y(1) = curve->min_y;
 
-	for (i = 0; i < npoints; i++) {
-		GET_X(i+2) = points[i].x;
-		GET_Y(i+2) = points[i].y;
-	}
+    for (i = 0; i < npoints; i++) {
+        GET_X(i+2) = points[i].x;
+        GET_Y(i+2) = points[i].y;
+    }
 
-	GET_X(npoints+2) = curve->max_x;
-	GET_Y(npoints+2) = curve->max_y;
-	GET_X(npoints+3) = curve->max_x;
-	GET_Y(npoints+3) = curve->max_y;
-	
-	xs_curve_update(curve);
-	return TRUE;
+    GET_X(npoints+2) = curve->max_x;
+    GET_Y(npoints+2) = curve->max_y;
+    GET_X(npoints+3) = curve->max_x;
+    GET_Y(npoints+3) = curve->max_y;
+    
+    xs_curve_update(curve);
+    return TRUE;
 }
 
 
-gboolean xs_curve_get_points(XSCurve *curve, t_xs_int_point **points, gint *npoints)
+gboolean xs_curve_get_points(XSCurve *curve, xs_int_point_t **points, gint *npoints)
 {
-	gint i, n;
-	
-	n = curve->nctlpoints - 4;
-	
-	*points = g_malloc(n * sizeof(t_xs_int_point));
-	if (*points == NULL)
-		return FALSE;
-	
-	*npoints = n;
-	for (i = 2; i < curve->nctlpoints - 2; i++) {
-		(*points)[i].x = GET_X(i);
-		(*points)[i].y = GET_Y(i);
-	}
+    gint i, n;
+    
+    n = curve->nctlpoints - 4;
+    
+    *points = g_malloc(n * sizeof(xs_int_point_t));
+    if (*points == NULL)
+        return FALSE;
+    
+    *npoints = n;
+    for (i = 2; i < curve->nctlpoints - 2; i++) {
+        (*points)[i].x = GET_X(i);
+        (*points)[i].y = GET_Y(i);
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 
 GtkWidget *xs_curve_new(void)
 {
-	return g_object_new(XS_TYPE_CURVE, NULL);
+    return g_object_new(XS_TYPE_CURVE, NULL);
 }
 
 
 static void xs_curve_finalize(GObject *object)
 {
-	XSCurve *curve;
+    XSCurve *curve;
 
-	g_return_if_fail(object != NULL);
-	g_return_if_fail(XS_IS_CURVE(object));
+    g_return_if_fail(object != NULL);
+    g_return_if_fail(XS_IS_CURVE(object));
 
-	curve = XS_CURVE(object);
-	if (curve->pixmap)
-		g_object_unref(curve->pixmap);
-	if (curve->ctlpoints)
-		g_free(curve->ctlpoints);
+    curve = XS_CURVE(object);
+    if (curve->pixmap)
+        g_object_unref(curve->pixmap);
+    if (curve->ctlpoints)
+        g_free(curve->ctlpoints);
 
-	G_OBJECT_CLASS(parent_class)->finalize(object);
+    G_OBJECT_CLASS(parent_class)->finalize(object);
 }
--- a/src/sid/xs_curve.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sid/xs_curve.h	Fri Jun 13 05:57:25 2008 +0300
@@ -8,12 +8,12 @@
 
 /* Macros for type-classing this GtkWidget/object
  */
-#define XS_TYPE_CURVE			(xs_curve_get_type())
-#define XS_CURVE(obj)			(G_TYPE_CHECK_INSTANCE_CAST ((obj), XS_TYPE_CURVE, XSCurve))
-#define XS_CURVE_CLASS(luokka)		(G_TYPE_CHECK_CLASS_CAST ((luokka), XS_TYPE_CURVE, XSCurveClass))
-#define XS_IS_CURVE(obj)		(G_TYPE_CHECK_INSTANCE_TYPE ((obj), XS_TYPE_CURVE))
-#define XS_IS_CURVE_CLASS(luokka)	(G_TYPE_CHECK_CLASS_TYPE ((luokka), XS_TYPE_CURVE))
-#define XS_CURVE_GET_CLASS(obj)		(G_TYPE_INSTANCE_GET_CLASS ((obj), XS_TYPE_CURVE, XSCurveClass))
+#define XS_TYPE_CURVE               (xs_curve_get_type())
+#define XS_CURVE(obj)               (G_TYPE_CHECK_INSTANCE_CAST ((obj), XS_TYPE_CURVE, XSCurve))
+#define XS_CURVE_CLASS(luokka)      (G_TYPE_CHECK_CLASS_CAST ((luokka), XS_TYPE_CURVE, XSCurveClass))
+#define XS_IS_CURVE(obj)            (G_TYPE_CHECK_INSTANCE_TYPE ((obj), XS_TYPE_CURVE))
+#define XS_IS_CURVE_CLASS(luokka)   (G_TYPE_CHECK_CLASS_TYPE ((luokka), XS_TYPE_CURVE))
+#define XS_CURVE_GET_CLASS(obj)     (G_TYPE_INSTANCE_GET_CLASS ((obj), XS_TYPE_CURVE, XSCurveClass))
 
 
 /* Structures
@@ -22,44 +22,44 @@
 typedef struct _XSCurveClass XSCurveClass;
 
 typedef struct {
-	gfloat x,y;
-} t_xs_point;
+    gfloat x,y;
+} xs_point_t;
 
 typedef struct {
-	gint x, y;
-} t_xs_int_point;
+    gint x, y;
+} xs_int_point_t;
 
 struct _XSCurve {
-	GtkDrawingArea graph;
+    GtkDrawingArea graph;
 
-	gint cursor_type;
-	gfloat min_x;
-	gfloat max_x;
-	gfloat min_y;
-	gfloat max_y;
-	GdkPixmap *pixmap;
-	gint grab_point;	/* point currently grabbed */
+    gint cursor_type;
+    gfloat min_x;
+    gfloat max_x;
+    gfloat min_y;
+    gfloat max_y;
+    GdkPixmap *pixmap;
+    gint grab_point;    /* point currently grabbed */
 
-	/* control points */
-	gint nctlpoints;	/* number of control points */
-	t_xs_point *ctlpoints;	/* array of control points */
+    /* control points */
+    gint nctlpoints;    /* number of control points */
+    xs_point_t *ctlpoints;    /* array of control points */
 };
 
 struct _XSCurveClass {
-	GtkDrawingAreaClass parent_class;
+    GtkDrawingAreaClass parent_class;
 };
 
 
-GType		xs_curve_get_type	(void);
-GtkWidget*	xs_curve_new		(void);
-void		xs_curve_reset		(XSCurve *curve);
-void		xs_curve_set_range	(XSCurve *curve,
-					 gfloat min_x, gfloat min_y,
-					 gfloat max_x, gfloat max_y);
-gboolean	xs_curve_realloc_data	(XSCurve *curve, gint npoints);
-void		xs_curve_get_data	(XSCurve *curve, t_xs_point ***points, gint **npoints);
-gboolean	xs_curve_set_points	(XSCurve *curve, t_xs_int_point *points, gint npoints);
-gboolean	xs_curve_get_points	(XSCurve *curve, t_xs_int_point **points, gint *npoints);
+GType        xs_curve_get_type    (void);
+GtkWidget*    xs_curve_new        (void);
+void        xs_curve_reset        (XSCurve *curve);
+void        xs_curve_set_range    (XSCurve *curve,
+                     gfloat min_x, gfloat min_y,
+                     gfloat max_x, gfloat max_y);
+gboolean    xs_curve_realloc_data    (XSCurve *curve, gint npoints);
+void        xs_curve_get_data    (XSCurve *curve, xs_point_t ***points, gint **npoints);
+gboolean    xs_curve_set_points    (XSCurve *curve, xs_int_point_t *points, gint npoints);
+gboolean    xs_curve_get_points    (XSCurve *curve, xs_int_point_t **points, gint *npoints);
 
 G_END_DECLS
 
--- a/src/sid/xs_fileinfo.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sid/xs_fileinfo.c	Fri Jun 13 05:57:25 2008 +0300
@@ -33,261 +33,261 @@
 
 
 static GtkWidget *xs_fileinfowin = NULL;
-static t_xs_stil_node *xs_fileinfostil = NULL;
+static stil_node_t *xs_fileinfostil = NULL;
 XS_MUTEX(xs_fileinfowin);
 
-#define LUW(x)	lookup_widget(xs_fileinfowin, x)
+#define LUW(x)    lookup_widget(xs_fileinfowin, x)
 
 
 #ifndef AUDACIOUS_PLUGIN
 void xs_fileinfo_update(void)
 {
-	XS_MUTEX_LOCK(xs_status);
-	XS_MUTEX_LOCK(xs_fileinfowin);
+    XS_MUTEX_LOCK(xs_status);
+    XS_MUTEX_LOCK(xs_fileinfowin);
 
-	/* Check if control window exists, we are currently playing and have a tune */
-	if (xs_fileinfowin) {
-		gboolean isEnabled;
-		GtkAdjustment *tmpAdj;
+    /* Check if control window exists, we are currently playing and have a tune */
+    if (xs_fileinfowin) {
+        gboolean isEnabled;
+        GtkAdjustment *tmpAdj;
 
-		if (xs_status.tuneInfo && xs_status.isPlaying && (xs_status.tuneInfo->nsubTunes > 1)) {
-			tmpAdj = gtk_range_get_adjustment(GTK_RANGE(LUW("fileinfo_subctrl_adj")));
+        if (xs_status.tuneInfo && xs_status.isPlaying && (xs_status.tuneInfo->nsubTunes > 1)) {
+            tmpAdj = gtk_range_get_adjustment(GTK_RANGE(LUW("fileinfo_subctrl_adj")));
 
-			tmpAdj->value = xs_status.currSong;
-			tmpAdj->lower = 1;
-			tmpAdj->upper = xs_status.tuneInfo->nsubTunes;
-			XS_MUTEX_UNLOCK(xs_status);
-			XS_MUTEX_UNLOCK(xs_fileinfowin);
-			gtk_adjustment_value_changed(tmpAdj);
-			XS_MUTEX_LOCK(xs_status);
-			XS_MUTEX_LOCK(xs_fileinfowin);
-			isEnabled = TRUE;
-		} else
-			isEnabled = FALSE;
+            tmpAdj->value = xs_status.currSong;
+            tmpAdj->lower = 1;
+            tmpAdj->upper = xs_status.tuneInfo->nsubTunes;
+            XS_MUTEX_UNLOCK(xs_status);
+            XS_MUTEX_UNLOCK(xs_fileinfowin);
+            gtk_adjustment_value_changed(tmpAdj);
+            XS_MUTEX_LOCK(xs_status);
+            XS_MUTEX_LOCK(xs_fileinfowin);
+            isEnabled = TRUE;
+        } else
+            isEnabled = FALSE;
 
-		/* Enable or disable subtune-control in fileinfo window */
-		gtk_widget_set_sensitive(LUW("fileinfo_subctrl_prev"), isEnabled);
-		gtk_widget_set_sensitive(LUW("fileinfo_subctrl_adj"), isEnabled);
-		gtk_widget_set_sensitive(LUW("fileinfo_subctrl_next"), isEnabled);
-	}
+        /* Enable or disable subtune-control in fileinfo window */
+        gtk_widget_set_sensitive(LUW("fileinfo_subctrl_prev"), isEnabled);
+        gtk_widget_set_sensitive(LUW("fileinfo_subctrl_adj"), isEnabled);
+        gtk_widget_set_sensitive(LUW("fileinfo_subctrl_next"), isEnabled);
+    }
 
-	XS_MUTEX_UNLOCK(xs_status);
-	XS_MUTEX_UNLOCK(xs_fileinfowin);
+    XS_MUTEX_UNLOCK(xs_status);
+    XS_MUTEX_UNLOCK(xs_fileinfowin);
 }
 
 
 static void xs_fileinfo_setsong(void)
 {
-	gint n;
+    gint n;
 
-	XS_MUTEX_LOCK(xs_status);
-	XS_MUTEX_LOCK(xs_fileinfowin);
+    XS_MUTEX_LOCK(xs_status);
+    XS_MUTEX_LOCK(xs_fileinfowin);
 
-	if (xs_status.tuneInfo && xs_status.isPlaying) {
-		n = (gint) gtk_range_get_adjustment(GTK_RANGE(LUW("fileinfo_subctrl_adj")))->value;
-		if ((n >= 1) && (n <= xs_status.tuneInfo->nsubTunes))
-			xs_status.currSong = n;
-	}
+    if (xs_status.tuneInfo && xs_status.isPlaying) {
+        n = (gint) gtk_range_get_adjustment(GTK_RANGE(LUW("fileinfo_subctrl_adj")))->value;
+        if ((n >= 1) && (n <= xs_status.tuneInfo->nsubTunes))
+            xs_status.currSong = n;
+    }
 
-	XS_MUTEX_UNLOCK(xs_fileinfowin);
-	XS_MUTEX_UNLOCK(xs_status);
+    XS_MUTEX_UNLOCK(xs_fileinfowin);
+    XS_MUTEX_UNLOCK(xs_status);
 }
 #endif /* AUDACIOUS_PLUGIN */
 
 
 void xs_fileinfo_ok(void)
 {
-	XS_MUTEX_LOCK(xs_fileinfowin);
-	if (xs_fileinfowin) {
-		gtk_widget_destroy(xs_fileinfowin);
-		xs_fileinfowin = NULL;
-	}
-	XS_MUTEX_UNLOCK(xs_fileinfowin);
+    XS_MUTEX_LOCK(xs_fileinfowin);
+    if (xs_fileinfowin) {
+        gtk_widget_destroy(xs_fileinfowin);
+        xs_fileinfowin = NULL;
+    }
+    XS_MUTEX_UNLOCK(xs_fileinfowin);
 }
 
 
 gboolean xs_fileinfo_delete(GtkWidget * widget, GdkEvent * event, gpointer user_data)
 {
-	(void) widget;
-	(void) event;
-	(void) user_data;
+    (void) widget;
+    (void) event;
+    (void) user_data;
 
-	XSDEBUG("delete_event\n");
-	xs_fileinfo_ok();
-	return FALSE;
+    XSDEBUG("delete_event\n");
+    xs_fileinfo_ok();
+    return FALSE;
 }
 
 
 static void xs_fileinfo_subtune(GtkWidget * widget, void *data)
 {
-	t_xs_stil_subnode *tmpNode;
-	GtkWidget *tmpText;
-	gchar *subName, *subAuthor, *subInfo;
+    stil_subnode_t *tmpNode;
+    GtkWidget *tmpText;
+    gchar *subName, *subAuthor, *subInfo;
 
-	(void) widget;
-	(void) data;
+    (void) widget;
+    (void) data;
 
-	/* Freeze text-widget and delete the old text */
-	tmpText = LUW("fileinfo_sub_info");
+    /* Freeze text-widget and delete the old text */
+    tmpText = LUW("fileinfo_sub_info");
 #ifndef AUDACIOUS_PLUGIN
-	gtk_text_freeze(GTK_TEXT(tmpText));
-	gtk_text_set_point(GTK_TEXT(tmpText), 0);
-	gtk_text_forward_delete(GTK_TEXT(tmpText), gtk_text_get_length(GTK_TEXT(tmpText)));
+    gtk_text_freeze(GTK_TEXT(tmpText));
+    gtk_text_set_point(GTK_TEXT(tmpText), 0);
+    gtk_text_forward_delete(GTK_TEXT(tmpText), gtk_text_get_length(GTK_TEXT(tmpText)));
 #endif
 
-	/* Get subtune information */
-	tmpNode = (t_xs_stil_subnode *) data;
-	if (!tmpNode && xs_fileinfostil)
-		tmpNode = xs_fileinfostil->subTunes[0];
-	
-	if (tmpNode) {
-		subName = tmpNode->pName;
-		subAuthor = tmpNode->pAuthor;
-		subInfo = tmpNode->pInfo;
-	} else {
-		subName = NULL;
-		subAuthor = NULL;
-		subInfo = NULL;
-	}
+    /* Get subtune information */
+    tmpNode = (stil_subnode_t *) data;
+    if (!tmpNode && xs_fileinfostil)
+        tmpNode = xs_fileinfostil->subTunes[0];
+    
+    if (tmpNode) {
+        subName = tmpNode->name;
+        subAuthor = tmpNode->author;
+        subInfo = tmpNode->info;
+    } else {
+        subName = NULL;
+        subAuthor = NULL;
+        subInfo = NULL;
+    }
 
-	/* Get and set subtune information */
-	gtk_entry_set_text(GTK_ENTRY(LUW("fileinfo_sub_name")), subName ? subName : "");
-	gtk_entry_set_text(GTK_ENTRY(LUW("fileinfo_sub_author")), subAuthor ? subAuthor : "");
+    /* Get and set subtune information */
+    gtk_entry_set_text(GTK_ENTRY(LUW("fileinfo_sub_name")), subName ? subName : "");
+    gtk_entry_set_text(GTK_ENTRY(LUW("fileinfo_sub_author")), subAuthor ? subAuthor : "");
 
 #ifdef AUDACIOUS_PLUGIN
-	gtk_text_buffer_set_text(GTK_TEXT_BUFFER(gtk_text_view_get_buffer(GTK_TEXT_VIEW(tmpText))),
-		subInfo ? subInfo : "", -1);
+    gtk_text_buffer_set_text(GTK_TEXT_BUFFER(gtk_text_view_get_buffer(GTK_TEXT_VIEW(tmpText))),
+        subInfo ? subInfo : "", -1);
 #else
-	gtk_text_insert(GTK_TEXT(tmpText), NULL, NULL, NULL,
-		subInfo ? subInfo : "", -1);
+    gtk_text_insert(GTK_TEXT(tmpText), NULL, NULL, NULL,
+        subInfo ? subInfo : "", -1);
 
-	/* Un-freeze the widget */
-	gtk_text_thaw(GTK_TEXT(tmpText));
+    /* Un-freeze the widget */
+    gtk_text_thaw(GTK_TEXT(tmpText));
 #endif
 }
 
 
-void xs_fileinfo(gchar * pcFilename)
+void xs_fileinfo(gchar * filename)
 {
-	GtkWidget *tmpMenuItem, *tmpMenu, *tmpOptionMenu;
-	t_xs_tuneinfo *tmpInfo;
-	t_xs_stil_subnode *tmpNode;
-	gchar tmpStr[256], *tmpFilename;
-	gint n;
+    GtkWidget *tmpMenuItem, *tmpMenu, *tmpOptionMenu;
+    xs_tuneinfo_t *tmpInfo;
+    stil_subnode_t *tmpNode;
+    gchar tmpStr[256], *tmpFilename;
+    gint n;
 
-	/* Current implementation leaves old fileinfo window untouched if
-	 * no information can be found for the new file. Hmm...
-	 */
+    /* Current implementation leaves old fileinfo window untouched if
+     * no information can be found for the new file. Hmm...
+     */
 #ifdef AUDACIOUS_PLUGIN
-	xs_get_trackinfo(pcFilename, &tmpFilename, &n);
+    xs_get_trackinfo(filename, &tmpFilename, &n);
 #else
-	tmpFilename = pcFilename;
-#endif	
+    tmpFilename = filename;
+#endif    
 
-	/* Get new tune information */
-	XS_MUTEX_LOCK(xs_fileinfowin);
-	XS_MUTEX_LOCK(xs_status);
-	if ((tmpInfo = xs_status.sidPlayer->plrGetSIDInfo(tmpFilename)) == NULL) {
-		XS_MUTEX_UNLOCK(xs_fileinfowin);
-		XS_MUTEX_UNLOCK(xs_status);
-		return;
-	}
-	XS_MUTEX_UNLOCK(xs_status);
+    /* Get new tune information */
+    XS_MUTEX_LOCK(xs_fileinfowin);
+    XS_MUTEX_LOCK(xs_status);
+    if ((tmpInfo = xs_status.sidPlayer->plrGetSIDInfo(tmpFilename)) == NULL) {
+        XS_MUTEX_UNLOCK(xs_fileinfowin);
+        XS_MUTEX_UNLOCK(xs_status);
+        return;
+    }
+    XS_MUTEX_UNLOCK(xs_status);
 
-	xs_fileinfostil = xs_stil_get(tmpFilename);
+    xs_fileinfostil = xs_stil_get(tmpFilename);
 
 #ifdef AUDACIOUS_PLUGIN
-	g_free(tmpFilename);
+    g_free(tmpFilename);
 #endif
 
-	/* Check if there already is an open fileinfo window */
-	if (xs_fileinfowin)
-                gtk_window_present(GTK_WINDOW(xs_fileinfowin));
-	else {
-		xs_fileinfowin = create_xs_fileinfowin();
+    /* Check if there already is an open fileinfo window */
+    if (xs_fileinfowin)
+        XS_WINDOW_PRESENT(xs_fileinfowin);
+    else {
+        xs_fileinfowin = create_xs_fileinfowin();
 #ifndef AUDACIOUS_PLUGIN
-		XS_SIGNAL_CONNECT(gtk_range_get_adjustment(GTK_RANGE(LUW("fileinfo_subctrl_adj"))),
-			"value_changed", xs_fileinfo_setsong, NULL);
+        XS_SIGNAL_CONNECT(gtk_range_get_adjustment(GTK_RANGE(LUW("fileinfo_subctrl_adj"))),
+            "value_changed", xs_fileinfo_setsong, NULL);
 #endif
-	}
+    }
 
-	/* Delete current items */
-	tmpOptionMenu = LUW("fileinfo_sub_tune");
-	tmpMenu = gtk_option_menu_get_menu(GTK_OPTION_MENU(tmpOptionMenu));
-	gtk_widget_destroy(tmpMenu);
-	gtk_option_menu_remove_menu(GTK_OPTION_MENU(tmpOptionMenu));
-	tmpMenu = gtk_menu_new();
+    /* Delete current items */
+    tmpOptionMenu = LUW("fileinfo_sub_tune");
+    tmpMenu = gtk_option_menu_get_menu(GTK_OPTION_MENU(tmpOptionMenu));
+    gtk_widget_destroy(tmpMenu);
+    gtk_option_menu_remove_menu(GTK_OPTION_MENU(tmpOptionMenu));
+    tmpMenu = gtk_menu_new();
 
 
-	/* Set the generic song information */
-	tmpFilename = XS_CS_FILENAME(pcFilename);
-	gtk_entry_set_text(GTK_ENTRY(LUW("fileinfo_filename")), tmpFilename);
-	g_free(tmpFilename);
-	gtk_entry_set_text(GTK_ENTRY(LUW("fileinfo_songname")), tmpInfo->sidName);
-	gtk_entry_set_text(GTK_ENTRY(LUW("fileinfo_composer")), tmpInfo->sidComposer);
-	gtk_entry_set_text(GTK_ENTRY(LUW("fileinfo_copyright")), tmpInfo->sidCopyright);
+    /* Set the generic song information */
+    tmpFilename = XS_CS_FILENAME(filename);
+    gtk_entry_set_text(GTK_ENTRY(LUW("fileinfo_filename")), tmpFilename);
+    g_free(tmpFilename);
+    gtk_entry_set_text(GTK_ENTRY(LUW("fileinfo_songname")), tmpInfo->sidName);
+    gtk_entry_set_text(GTK_ENTRY(LUW("fileinfo_composer")), tmpInfo->sidComposer);
+    gtk_entry_set_text(GTK_ENTRY(LUW("fileinfo_copyright")), tmpInfo->sidCopyright);
 
 
-	/* Main tune - the pseudo tune */
-	tmpMenuItem = gtk_menu_item_new_with_label(_("General info"));
-	gtk_widget_show(tmpMenuItem);
-	gtk_menu_append(GTK_MENU(tmpMenu), tmpMenuItem);
-	if (xs_fileinfostil)
-		tmpNode = xs_fileinfostil->subTunes[0];
-	else
-		tmpNode = NULL;
-	XS_SIGNAL_CONNECT(tmpMenuItem, "activate", xs_fileinfo_subtune, tmpNode);
+    /* Main tune - the pseudo tune */
+    tmpMenuItem = gtk_menu_item_new_with_label(_("General info"));
+    gtk_widget_show(tmpMenuItem);
+    gtk_menu_append(GTK_MENU(tmpMenu), tmpMenuItem);
+    if (xs_fileinfostil)
+        tmpNode = xs_fileinfostil->subTunes[0];
+    else
+        tmpNode = NULL;
+    XS_SIGNAL_CONNECT(tmpMenuItem, "activate", xs_fileinfo_subtune, tmpNode);
 
-	/* Other menu items */
-	for (n = 1; n <= tmpInfo->nsubTunes; n++) {
-		if (xs_fileinfostil && n <= xs_fileinfostil->nsubTunes && xs_fileinfostil->subTunes[n]) {
-			gboolean isSet = FALSE;
-			tmpNode = xs_fileinfostil->subTunes[n];
-			
-			g_snprintf(tmpStr, sizeof(tmpStr), _("Tune #%i: "), n);
+    /* Other menu items */
+    for (n = 1; n <= tmpInfo->nsubTunes; n++) {
+        if (xs_fileinfostil && n <= xs_fileinfostil->nsubTunes && xs_fileinfostil->subTunes[n]) {
+            gboolean isSet = FALSE;
+            tmpNode = xs_fileinfostil->subTunes[n];
+            
+            g_snprintf(tmpStr, sizeof(tmpStr), _("Tune #%i: "), n);
 
-			if (tmpNode->pName) {
-				xs_pnstrcat(tmpStr, sizeof(tmpStr), tmpNode->pName);
-				isSet = TRUE;
-			}
+            if (tmpNode->name) {
+                xs_pnstrcat(tmpStr, sizeof(tmpStr), tmpNode->name);
+                isSet = TRUE;
+            }
 
-			if (tmpNode->pTitle) {
-				xs_pnstrcat(tmpStr, sizeof(tmpStr),
-					isSet ? " [*]" : tmpNode->pTitle);
-				isSet = TRUE;
-			}
+            if (tmpNode->title) {
+                xs_pnstrcat(tmpStr, sizeof(tmpStr),
+                    isSet ? " [*]" : tmpNode->title);
+                isSet = TRUE;
+            }
 
-			if (tmpNode->pInfo) {
-				xs_pnstrcat(tmpStr, sizeof(tmpStr), " [!]");
-				isSet = TRUE;
-			}
+            if (tmpNode->info) {
+                xs_pnstrcat(tmpStr, sizeof(tmpStr), " [!]");
+                isSet = TRUE;
+            }
 
-			if (!isSet)
-				xs_pnstrcat(tmpStr, sizeof(tmpStr), "---");
+            if (!isSet)
+                xs_pnstrcat(tmpStr, sizeof(tmpStr), "---");
 
-			tmpMenuItem = gtk_menu_item_new_with_label(tmpStr);
-			gtk_widget_show(tmpMenuItem);
-			gtk_menu_append(GTK_MENU(tmpMenu), tmpMenuItem);
-			XS_SIGNAL_CONNECT(tmpMenuItem, "activate", xs_fileinfo_subtune, tmpNode);
-		}
+            tmpMenuItem = gtk_menu_item_new_with_label(tmpStr);
+            gtk_widget_show(tmpMenuItem);
+            gtk_menu_append(GTK_MENU(tmpMenu), tmpMenuItem);
+            XS_SIGNAL_CONNECT(tmpMenuItem, "activate", xs_fileinfo_subtune, tmpNode);
+        }
 
-	}
+    }
 
-	gtk_option_menu_set_menu(GTK_OPTION_MENU(tmpOptionMenu), tmpMenu);
-	gtk_widget_show(tmpOptionMenu);
+    gtk_option_menu_set_menu(GTK_OPTION_MENU(tmpOptionMenu), tmpMenu);
+    gtk_widget_show(tmpOptionMenu);
 
-	/* Set the subtune information */
-	xs_fileinfo_subtune(tmpOptionMenu, NULL);
+    /* Set the subtune information */
+    xs_fileinfo_subtune(tmpOptionMenu, NULL);
 
-	/* Free temporary tuneinfo */
-	xs_tuneinfo_free(tmpInfo);
+    /* Free temporary tuneinfo */
+    xs_tuneinfo_free(tmpInfo);
 
-	/* Show the window */
-	gtk_widget_show(xs_fileinfowin);
+    /* Show the window */
+    gtk_widget_show(xs_fileinfowin);
 
-	XS_MUTEX_UNLOCK(xs_fileinfowin);
+    XS_MUTEX_UNLOCK(xs_fileinfowin);
 
 #ifndef AUDACIOUS_PLUGIN
-	xs_fileinfo_update();
+    xs_fileinfo_update();
 #endif
 }
--- a/src/sid/xs_fileinfo.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sid/xs_fileinfo.h	Fri Jun 13 05:57:25 2008 +0300
@@ -8,9 +8,9 @@
 #endif
 
 #ifndef AUDACIOUS_PLUGIN
-void	xs_fileinfo_update(void);
+void    xs_fileinfo_update(void);
 #endif
-void	xs_fileinfo(gchar *);
+void    xs_fileinfo(gchar *);
 
 #ifdef __cplusplus
 }
--- a/src/sid/xs_filter.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sid/xs_filter.c	Fri Jun 13 05:57:25 2008 +0300
@@ -25,60 +25,60 @@
 /* Let's do some preprocessor magic :) */
 #define XS_FVAR(T, P, K) g ## K ## int ## P *sp_ ## T ## P , *dp_ ## T ## P
 
-#define XS_FILTER1(T, P, K, Q)							\
-	dataSize /= sizeof(g ## K ## int ## P); 				\
-	sp_ ## T ## P = (g ## K ## int ## P *) srcBuf;				\
-	dp_ ## T ## P = (g ## K ## int ## P *) destBuf;				\
-	while (dataSize-- > 0) {						\
-		for (tmp = 0, i = 0; i < oversampleFactor; i++)			\
-			tmp += (gint32) ((gint ## P) (*(sp_ ## T ## P ++) Q));	\
-		xs_filter_mbn = (tmp + xs_filter_mbn) / (oversampleFactor + 1);	\
-		*(dp_ ## T ## P ++) = ((g ## K ## int ## P) xs_filter_mbn) Q ;	\
-		}
+#define XS_FILTER1(T, P, K, Q)                            \
+    dataSize /= sizeof(g ## K ## int ## P);                 \
+    sp_ ## T ## P = (g ## K ## int ## P *) srcBuf;                \
+    dp_ ## T ## P = (g ## K ## int ## P *) destBuf;                \
+    while (dataSize-- > 0) {                        \
+        for (tmp = 0, i = 0; i < oversampleFactor; i++)            \
+            tmp += (gint32) ((gint ## P) (*(sp_ ## T ## P ++) Q));    \
+        xs_filter_mbn = (tmp + xs_filter_mbn) / (oversampleFactor + 1);    \
+        *(dp_ ## T ## P ++) = ((g ## K ## int ## P) xs_filter_mbn) Q ;    \
+        }
 
 
 static gint32 xs_filter_mbn = 0;
 
 
 gint xs_filter_rateconv(void *destBuf, void *srcBuf, const AFormat audioFormat,
-			const gint oversampleFactor, const gint bufSize)
+            const gint oversampleFactor, const gint bufSize)
 {
-	static gint32 tmp;
-	XS_FVAR(s, 8,);
-	XS_FVAR(u, 8, u);
-	XS_FVAR(s, 16,);
-	XS_FVAR(u, 16, u);
-	gint i;
-	gint dataSize = bufSize;
+    static gint32 tmp;
+    XS_FVAR(s, 8,);
+    XS_FVAR(u, 8, u);
+    XS_FVAR(s, 16,);
+    XS_FVAR(u, 16, u);
+    gint i;
+    gint dataSize = bufSize;
 
-	if (dataSize <= 0)
-		return dataSize;
+    if (dataSize <= 0)
+        return dataSize;
 
-	switch (audioFormat) {
-	case FMT_U8:
-		XS_FILTER1(u, 8, u, ^0x80)
-		    break;
+    switch (audioFormat) {
+    case FMT_U8:
+        XS_FILTER1(u, 8, u, ^0x80)
+            break;
 
-	case FMT_S8:
-		XS_FILTER1(s, 8,,)
-		    break;
+    case FMT_S8:
+        XS_FILTER1(s, 8,,)
+            break;
 
 
-	case FMT_U16_BE:
-	case FMT_U16_LE:
-	case FMT_U16_NE:
-		XS_FILTER1(u, 16, u, ^0x8000)
-		    break;
+    case FMT_U16_BE:
+    case FMT_U16_LE:
+    case FMT_U16_NE:
+        XS_FILTER1(u, 16, u, ^0x8000)
+            break;
 
-	case FMT_S16_BE:
-	case FMT_S16_LE:
-	case FMT_S16_NE:
-		XS_FILTER1(s, 16,,)
-		    break;
+    case FMT_S16_BE:
+    case FMT_S16_LE:
+    case FMT_S16_NE:
+        XS_FILTER1(s, 16,,)
+            break;
 
-	default:
-		return -1;
-	}
+    default:
+        return -1;
+    }
 
-	return 0;
+    return 0;
 }
--- a/src/sid/xs_filter.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sid/xs_filter.h	Fri Jun 13 05:57:25 2008 +0300
@@ -11,9 +11,9 @@
 typedef struct {
 } t_xs_filter;
 
-void	xs_filter_init(t_xs_filter *);
+void    xs_filter_init(t_xs_filter *);
 */
-gint	xs_filter_rateconv(void *, void *, const AFormat, const gint, const gint);
+gint    xs_filter_rateconv(void *, void *, const AFormat, const gint, const gint);
 
 #ifdef __cplusplus
 }
--- a/src/sid/xs_init.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sid/xs_init.c	Fri Jun 13 05:57:25 2008 +0300
@@ -28,24 +28,24 @@
 
 
 InputPlugin xs_plugin_ip = {
-	.description = XS_PACKAGE_STRING,	/* Plugin description */
-	.init = xs_init,			/* Initialization */
-	.cleanup = xs_close,			/* Cleanup */
-	.about = xs_about,			/* Show aboutbox */
-	.configure = xs_configure,		/* Show/edit configuration */
+    .description = XS_PACKAGE_STRING,   /* Plugin description */
+    .init = xs_init,                    /* Initialization */
+    .cleanup = xs_close,                /* Cleanup */
+    .about = xs_about,                  /* Show aboutbox */
+    .configure = xs_configure,          /* Show/edit configuration */
 
-	.play_file = xs_play_file,		/* Play given file */
-	.stop = xs_stop,			/* Stop playing */
-	.pause = xs_pause,			/* Pause playing */
-	.seek = xs_seek,			/* Seek time */
-	.get_time = xs_get_time,		/* Get playing time */
+    .play_file = xs_play_file,          /* Play given file */
+    .stop = xs_stop,                    /* Stop playing */
+    .pause = xs_pause,                  /* Pause playing */
+    .seek = xs_seek,                    /* Seek time */
+    .get_time = xs_get_time,            /* Get playing time */
 
-	.file_info_box = xs_fileinfo,		/* Show file-information dialog */
+    .file_info_box = xs_fileinfo,       /* Show file-information dialog */
 
-	.get_song_tuple = xs_get_song_tuple,		/* Get Tuple */
-	.vfs_extensions = xs_sid_fmts,			/* File ext assist */
-	.probe_for_tuple = xs_probe_for_tuple,
-	.have_subtune = TRUE
+    .get_song_tuple = xs_get_song_tuple,/* Get Tuple */
+    .vfs_extensions = xs_sid_fmts,      /* File ext assist */
+    .probe_for_tuple = xs_probe_for_tuple,
+    .have_subtune = TRUE
 };
 
 static InputPlugin *sid_iplist[] = { &xs_plugin_ip, NULL };
--- a/src/sid/xs_interface.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sid/xs_interface.c	Fri Jun 13 05:57:25 2008 +0300
@@ -171,6 +171,10 @@
   GtkWidget *cfg_sld_label1;
   GtkWidget *cfg_sld_dbpath;
   GtkWidget *cfg_sld_dbbrowse;
+  GtkWidget *alignment1;
+  GtkWidget *hbox1;
+  GtkWidget *image1;
+  GtkWidget *label30;
   GtkWidget *label17;
   GtkWidget *w_label26;
   GtkWidget *frame1;
@@ -201,12 +205,20 @@
   GtkWidget *cfg_stil_dbpath;
   GtkWidget *w_alignment1;
   GtkWidget *cfg_stil_browse;
+  GtkWidget *alignment2;
+  GtkWidget *hbox2;
+  GtkWidget *image2;
+  GtkWidget *label31;
   GtkWidget *cfg_stil_box2;
   GtkWidget *cfg_hvsc_label1;
   GtkWidget *w_alignment6;
   GtkWidget *cfg_hvsc_path;
   GtkWidget *w_alignment7;
   GtkWidget *cfg_hvsc_browse;
+  GtkWidget *alignment3;
+  GtkWidget *hbox3;
+  GtkWidget *image3;
+  GtkWidget *label32;
   GtkWidget *label18;
   GtkWidget *w_label3;
   GtkWidget *hbuttonbox1;
@@ -1007,12 +1019,32 @@
   gtk_tooltips_set_tip (tooltips, cfg_sld_dbpath, _("Database path and filename"), NULL);
   gtk_entry_set_invisible_char (GTK_ENTRY (cfg_sld_dbpath), 9679);
 
-  cfg_sld_dbbrowse = gtk_button_new_with_mnemonic (_("Browse"));
+  cfg_sld_dbbrowse = gtk_button_new ();
   gtk_widget_set_name (cfg_sld_dbbrowse, "cfg_sld_dbbrowse");
   gtk_widget_show (cfg_sld_dbbrowse);
   gtk_box_pack_start (GTK_BOX (cfg_sld_box), cfg_sld_dbbrowse, FALSE, FALSE, 0);
   gtk_tooltips_set_tip (tooltips, cfg_sld_dbbrowse, _("Browse for song length-database file"), NULL);
 
+  alignment1 = gtk_alignment_new (0.5, 0.5, 0, 0);
+  gtk_widget_set_name (alignment1, "alignment1");
+  gtk_widget_show (alignment1);
+  gtk_container_add (GTK_CONTAINER (cfg_sld_dbbrowse), alignment1);
+
+  hbox1 = gtk_hbox_new (FALSE, 2);
+  gtk_widget_set_name (hbox1, "hbox1");
+  gtk_widget_show (hbox1);
+  gtk_container_add (GTK_CONTAINER (alignment1), hbox1);
+
+  image1 = gtk_image_new_from_stock ("gtk-open", GTK_ICON_SIZE_BUTTON);
+  gtk_widget_set_name (image1, "image1");
+  gtk_widget_show (image1);
+  gtk_box_pack_start (GTK_BOX (hbox1), image1, FALSE, FALSE, 0);
+
+  label30 = gtk_label_new_with_mnemonic (_("Browse"));
+  gtk_widget_set_name (label30, "label30");
+  gtk_widget_show (label30);
+  gtk_box_pack_start (GTK_BOX (hbox1), label30, FALSE, FALSE, 0);
+
   label17 = gtk_label_new (_("Song length database:"));
   gtk_widget_set_name (label17, "label17");
   gtk_widget_show (label17);
@@ -1054,12 +1086,12 @@
   gtk_tooltips_set_tip (tooltips, cfg_ftitle_format, _("Tuplez format string for SID-files"), NULL);
   gtk_entry_set_invisible_char (GTK_ENTRY (cfg_ftitle_format), 9679);
 
-  cfg_ftitle_descs = gtk_label_new (_("Descriptions of <i>SID-specific</i> Tuplez fields go here. <b>:D</b>"));
+  cfg_ftitle_descs = gtk_label_new (_("<u>SID-specific Tuplez fields:</u>\n\n<b>sid-format</b>\t\t- Specific fileformat\n<b>sid-model</b>\t\t- 6581 or 8580\n<b>sid-speed</b>\t\t- Timing or speed: PAL/NTSC/etc.\n\n<u>Other \"special\" fields set:</u>\n\n<b>subsong-num, subsong-id</b>"));
   gtk_widget_set_name (cfg_ftitle_descs, "cfg_ftitle_descs");
   gtk_widget_show (cfg_ftitle_descs);
   gtk_box_pack_start (GTK_BOX (cfg_ftitle_box), cfg_ftitle_descs, TRUE, TRUE, 0);
   gtk_label_set_use_markup (GTK_LABEL (cfg_ftitle_descs), TRUE);
-  gtk_label_set_line_wrap (GTK_LABEL (cfg_ftitle_descs), TRUE);
+  gtk_misc_set_alignment (GTK_MISC (cfg_ftitle_descs), 0, 0);
   gtk_misc_set_padding (GTK_MISC (cfg_ftitle_descs), 8, 8);
 
   label29 = gtk_label_new (_("Song title format:"));
@@ -1179,12 +1211,32 @@
   gtk_box_pack_end (GTK_BOX (cfg_stil_box1), w_alignment1, FALSE, FALSE, 0);
   gtk_container_set_border_width (GTK_CONTAINER (w_alignment1), 4);
 
-  cfg_stil_browse = gtk_button_new_with_mnemonic (_("Browse"));
+  cfg_stil_browse = gtk_button_new ();
   gtk_widget_set_name (cfg_stil_browse, "cfg_stil_browse");
   gtk_widget_show (cfg_stil_browse);
   gtk_container_add (GTK_CONTAINER (w_alignment1), cfg_stil_browse);
   gtk_tooltips_set_tip (tooltips, cfg_stil_browse, _("Browse for STIL-database file"), NULL);
 
+  alignment2 = gtk_alignment_new (0.5, 0.5, 0, 0);
+  gtk_widget_set_name (alignment2, "alignment2");
+  gtk_widget_show (alignment2);
+  gtk_container_add (GTK_CONTAINER (cfg_stil_browse), alignment2);
+
+  hbox2 = gtk_hbox_new (FALSE, 2);
+  gtk_widget_set_name (hbox2, "hbox2");
+  gtk_widget_show (hbox2);
+  gtk_container_add (GTK_CONTAINER (alignment2), hbox2);
+
+  image2 = gtk_image_new_from_stock ("gtk-open", GTK_ICON_SIZE_BUTTON);
+  gtk_widget_set_name (image2, "image2");
+  gtk_widget_show (image2);
+  gtk_box_pack_start (GTK_BOX (hbox2), image2, FALSE, FALSE, 0);
+
+  label31 = gtk_label_new_with_mnemonic (_("Browse"));
+  gtk_widget_set_name (label31, "label31");
+  gtk_widget_show (label31);
+  gtk_box_pack_start (GTK_BOX (hbox2), label31, FALSE, FALSE, 0);
+
   cfg_stil_box2 = gtk_hbox_new (FALSE, 0);
   gtk_widget_set_name (cfg_stil_box2, "cfg_stil_box2");
   gtk_widget_show (cfg_stil_box2);
@@ -1215,12 +1267,32 @@
   gtk_box_pack_end (GTK_BOX (cfg_stil_box2), w_alignment7, FALSE, FALSE, 0);
   gtk_container_set_border_width (GTK_CONTAINER (w_alignment7), 4);
 
-  cfg_hvsc_browse = gtk_button_new_with_mnemonic (_("Browse"));
+  cfg_hvsc_browse = gtk_button_new ();
   gtk_widget_set_name (cfg_hvsc_browse, "cfg_hvsc_browse");
   gtk_widget_show (cfg_hvsc_browse);
   gtk_container_add (GTK_CONTAINER (w_alignment7), cfg_hvsc_browse);
   gtk_tooltips_set_tip (tooltips, cfg_hvsc_browse, _("Browse for HVSC path"), NULL);
 
+  alignment3 = gtk_alignment_new (0.5, 0.5, 0, 0);
+  gtk_widget_set_name (alignment3, "alignment3");
+  gtk_widget_show (alignment3);
+  gtk_container_add (GTK_CONTAINER (cfg_hvsc_browse), alignment3);
+
+  hbox3 = gtk_hbox_new (FALSE, 2);
+  gtk_widget_set_name (hbox3, "hbox3");
+  gtk_widget_show (hbox3);
+  gtk_container_add (GTK_CONTAINER (alignment3), hbox3);
+
+  image3 = gtk_image_new_from_stock ("gtk-open", GTK_ICON_SIZE_BUTTON);
+  gtk_widget_set_name (image3, "image3");
+  gtk_widget_show (image3);
+  gtk_box_pack_start (GTK_BOX (hbox3), image3, FALSE, FALSE, 0);
+
+  label32 = gtk_label_new_with_mnemonic (_("Browse"));
+  gtk_widget_set_name (label32, "label32");
+  gtk_widget_show (label32);
+  gtk_box_pack_start (GTK_BOX (hbox3), label32, FALSE, FALSE, 0);
+
   label18 = gtk_label_new (_("SID Tune Information List (STIL) database:"));
   gtk_widget_set_name (label18, "label18");
   gtk_widget_show (label18);
@@ -1240,14 +1312,14 @@
   gtk_button_box_set_layout (GTK_BUTTON_BOX (hbuttonbox1), GTK_BUTTONBOX_END);
   gtk_box_set_spacing (GTK_BOX (hbuttonbox1), 8);
 
-  cfg_ok = gtk_button_new_with_mnemonic (_("OK"));
+  cfg_ok = gtk_button_new_from_stock ("gtk-ok");
   gtk_widget_set_name (cfg_ok, "cfg_ok");
   gtk_widget_show (cfg_ok);
   gtk_container_add (GTK_CONTAINER (hbuttonbox1), cfg_ok);
   GTK_WIDGET_SET_FLAGS (cfg_ok, GTK_CAN_DEFAULT);
   gtk_tooltips_set_tip (tooltips, cfg_ok, _("Accept and update changes"), NULL);
 
-  cfg_cancel = gtk_button_new_with_mnemonic (_("Cancel"));
+  cfg_cancel = gtk_button_new_from_stock ("gtk-cancel");
   gtk_widget_set_name (cfg_cancel, "cfg_cancel");
   gtk_widget_show (cfg_cancel);
   gtk_container_add (GTK_CONTAINER (hbuttonbox1), cfg_cancel);
@@ -1460,6 +1532,10 @@
   GLADE_HOOKUP_OBJECT (xs_configwin, cfg_sld_label1, "cfg_sld_label1");
   GLADE_HOOKUP_OBJECT (xs_configwin, cfg_sld_dbpath, "cfg_sld_dbpath");
   GLADE_HOOKUP_OBJECT (xs_configwin, cfg_sld_dbbrowse, "cfg_sld_dbbrowse");
+  GLADE_HOOKUP_OBJECT (xs_configwin, alignment1, "alignment1");
+  GLADE_HOOKUP_OBJECT (xs_configwin, hbox1, "hbox1");
+  GLADE_HOOKUP_OBJECT (xs_configwin, image1, "image1");
+  GLADE_HOOKUP_OBJECT (xs_configwin, label30, "label30");
   GLADE_HOOKUP_OBJECT (xs_configwin, label17, "label17");
   GLADE_HOOKUP_OBJECT (xs_configwin, w_label26, "w_label26");
   GLADE_HOOKUP_OBJECT (xs_configwin, frame1, "frame1");
@@ -1489,12 +1565,20 @@
   GLADE_HOOKUP_OBJECT (xs_configwin, cfg_stil_dbpath, "cfg_stil_dbpath");
   GLADE_HOOKUP_OBJECT (xs_configwin, w_alignment1, "w_alignment1");
   GLADE_HOOKUP_OBJECT (xs_configwin, cfg_stil_browse, "cfg_stil_browse");
+  GLADE_HOOKUP_OBJECT (xs_configwin, alignment2, "alignment2");
+  GLADE_HOOKUP_OBJECT (xs_configwin, hbox2, "hbox2");
+  GLADE_HOOKUP_OBJECT (xs_configwin, image2, "image2");
+  GLADE_HOOKUP_OBJECT (xs_configwin, label31, "label31");
   GLADE_HOOKUP_OBJECT (xs_configwin, cfg_stil_box2, "cfg_stil_box2");
   GLADE_HOOKUP_OBJECT (xs_configwin, cfg_hvsc_label1, "cfg_hvsc_label1");
   GLADE_HOOKUP_OBJECT (xs_configwin, w_alignment6, "w_alignment6");
   GLADE_HOOKUP_OBJECT (xs_configwin, cfg_hvsc_path, "cfg_hvsc_path");
   GLADE_HOOKUP_OBJECT (xs_configwin, w_alignment7, "w_alignment7");
   GLADE_HOOKUP_OBJECT (xs_configwin, cfg_hvsc_browse, "cfg_hvsc_browse");
+  GLADE_HOOKUP_OBJECT (xs_configwin, alignment3, "alignment3");
+  GLADE_HOOKUP_OBJECT (xs_configwin, hbox3, "hbox3");
+  GLADE_HOOKUP_OBJECT (xs_configwin, image3, "image3");
+  GLADE_HOOKUP_OBJECT (xs_configwin, label32, "label32");
   GLADE_HOOKUP_OBJECT (xs_configwin, label18, "label18");
   GLADE_HOOKUP_OBJECT (xs_configwin, w_label3, "w_label3");
   GLADE_HOOKUP_OBJECT (xs_configwin, hbuttonbox1, "hbuttonbox1");
--- a/src/sid/xs_length.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sid/xs_length.c	Fri Jun 13 05:57:25 2008 +0300
@@ -30,219 +30,219 @@
 
 /* Free memory allocated for given SLDB node
  */
-static void xs_sldb_node_free(t_xs_sldb_node *pNode)
+static void xs_sldb_node_free(sldb_node_t *node)
 {
-	if (pNode) {
-		/* Nothing much to do here ... */
-		g_free(pNode->sLengths);
-		g_free(pNode);
-	}
+    if (node) {
+        /* Nothing much to do here ... */
+        g_free(node->lengths);
+        g_free(node);
+    }
 }
 
 
 /* Insert given node to db linked list
  */
-static void xs_sldb_node_insert(t_xs_sldb *db, t_xs_sldb_node *pNode)
+static void xs_sldb_node_insert(xs_sldb_t *db, sldb_node_t *node)
 {
-	assert(db);
+    assert(db);
 
-	if (db->pNodes) {
-		/* The first node's pPrev points to last node */
-		LPREV = db->pNodes->pPrev;	/* New node's prev = Previous last node */
-		db->pNodes->pPrev->pNext = pNode;	/* Previous last node's next = New node */
-		db->pNodes->pPrev = pNode;	/* New last node = New node */
-		LNEXT = NULL;	/* But next is NULL! */
-	} else {
-		db->pNodes = pNode;	/* First node ... */
-		LPREV = pNode;	/* ... it's also last */
-		LNEXT = NULL;	/* But next is NULL! */
-	}
+    if (db->nodes) {
+        /* The first node's prev points to last node */
+        LPREV = db->nodes->prev;    /* New node's prev = Previous last node */
+        db->nodes->prev->next = node;    /* Previous last node's next = New node */
+        db->nodes->prev = node;    /* New last node = New node */
+        LNEXT = NULL;    /* But next is NULL! */
+    } else {
+        db->nodes = node;    /* First node ... */
+        LPREV = node;    /* ... it's also last */
+        LNEXT = NULL;    /* But next is NULL! */
+    }
 }
 
 
 /* Parse a time-entry in SLDB format
  */
-static gint xs_sldb_gettime(gchar *pcStr, size_t *piPos)
+static gint xs_sldb_gettime(gchar *str, size_t *pos)
 {
-	gint iResult, iTemp;
+    gint result, tmp;
 
-	/* Check if it starts with a digit */
-	if (isdigit(pcStr[*piPos])) {
-		/* Get minutes-field */
-		iResult = 0;
-		while (isdigit(pcStr[*piPos]))
-			iResult = (iResult * 10) + (pcStr[(*piPos)++] - '0');
+    /* Check if it starts with a digit */
+    if (isdigit(str[*pos])) {
+        /* Get minutes-field */
+        result = 0;
+        while (isdigit(str[*pos]))
+            result = (result * 10) + (str[(*pos)++] - '0');
 
-		iResult *= 60;
+        result *= 60;
 
-		/* Check the field separator char */
-		if (pcStr[*piPos] == ':') {
-			/* Get seconds-field */
-			(*piPos)++;
-			iTemp = 0;
-			while (isdigit(pcStr[*piPos])) {
-				iTemp = (iTemp * 10) + (pcStr[(*piPos)++] - '0');
-			}
+        /* Check the field separator char */
+        if (str[*pos] == ':') {
+            /* Get seconds-field */
+            (*pos)++;
+            tmp = 0;
+            while (isdigit(str[*pos])) {
+                tmp = (tmp * 10) + (str[(*pos)++] - '0');
+            }
 
-			iResult += iTemp;
-		} else
-			iResult = -2;
-	} else
-		iResult = -1;
+            result += tmp;
+        } else
+            result = -2;
+    } else
+        result = -1;
 
-	/* Ignore and skip the possible attributes */
-	while (pcStr[*piPos] && !isspace(pcStr[*piPos]))
-		(*piPos)++;
+    /* Ignore and skip the possible attributes */
+    while (str[*pos] && !isspace(str[*pos]))
+        (*pos)++;
 
-	return iResult;
+    return result;
 }
 
 
 /* Parse one SLDB definition line, return SLDB node
  */
-t_xs_sldb_node * xs_sldb_read_entry(gchar *inLine)
+sldb_node_t * xs_sldb_read_entry(gchar *inLine)
 {
-	size_t linePos;
-	gint i;
-	gboolean iOK;
-	t_xs_sldb_node *tmpNode;
+    size_t linePos;
+    gint i;
+    gboolean isOK;
+    sldb_node_t *tmnode;
 
-	/* Allocate new node */
-	tmpNode = (t_xs_sldb_node *) g_malloc0(sizeof(t_xs_sldb_node));
-	if (!tmpNode) {
-		xs_error(_("Error allocating new node. Fatal error.\n"));
-		return NULL;
-	}
+    /* Allocate new node */
+    tmnode = (sldb_node_t *) g_malloc0(sizeof(sldb_node_t));
+    if (!tmnode) {
+        xs_error("Error allocating new node. Fatal error.\n");
+        return NULL;
+    }
 
-	/* Get hash value */
-	linePos = 0;
-	for (i = 0; i < XS_MD5HASH_LENGTH; i++, linePos += 2) {
-		gint tmpu;
-		sscanf(&inLine[linePos], "%2x", &tmpu);
-		tmpNode->md5Hash[i] = tmpu;
-	}
-		
-	/* Get playtimes */
-	if (inLine[linePos] != 0) {
-		if (inLine[linePos] != '=') {
-			xs_error(_("'=' expected on column #%d.\n"), linePos);
-			xs_sldb_node_free(tmpNode);
-			return NULL;
-		} else {
-			size_t tmpLen, savePos;
-			
-			/* First playtime is after '=' */
-			savePos = ++linePos;
-			tmpLen = strlen(inLine);
-						
-			/* Get number of sub-tune lengths */						
-			iOK = TRUE;
-			while ((linePos < tmpLen) && iOK) {
-				xs_findnext(inLine, &linePos);
+    /* Get hash value */
+    linePos = 0;
+    for (i = 0; i < XS_MD5HASH_LENGTH; i++, linePos += 2) {
+        gint tmpu;
+        sscanf(&inLine[linePos], "%2x", &tmpu);
+        tmnode->md5Hash[i] = tmpu;
+    }
+        
+    /* Get playtimes */
+    if (inLine[linePos] != 0) {
+        if (inLine[linePos] != '=') {
+            xs_error("'=' expected on column #%d.\n", linePos);
+            xs_sldb_node_free(tmnode);
+            return NULL;
+        } else {
+            size_t tmpLen, savePos;
+            
+            /* First playtime is after '=' */
+            savePos = ++linePos;
+            tmpLen = strlen(inLine);
+                        
+            /* Get number of sub-tune lengths */                        
+            isOK = TRUE;
+            while ((linePos < tmpLen) && isOK) {
+                xs_findnext(inLine, &linePos);
 
-				if (xs_sldb_gettime(inLine, &linePos) >= 0)
-					tmpNode->nLengths++;
-				else
-					iOK = FALSE;
-			}
-			
-			/* Allocate memory for lengths */
-			if (tmpNode->nLengths > 0) {
-				tmpNode->sLengths = (gint *) g_malloc0(tmpNode->nLengths * sizeof(gint));
-				if (!tmpNode->sLengths) {
-					xs_error(_("Could not allocate memory for node.\n"));
-					xs_sldb_node_free(tmpNode);
-					return NULL;
-				}
-			} else {
-				xs_sldb_node_free(tmpNode);
-				return NULL;
-			}
-			
-			/* Read lengths in */
-			i = 0;
-			linePos = savePos;
-			iOK = TRUE;
-			while ((linePos < tmpLen) && (i < tmpNode->nLengths) && iOK) {
-				gint l;
-				
-				xs_findnext(inLine, &linePos);
+                if (xs_sldb_gettime(inLine, &linePos) >= 0)
+                    tmnode->nlengths++;
+                else
+                    isOK = FALSE;
+            }
+            
+            /* Allocate memory for lengths */
+            if (tmnode->nlengths > 0) {
+                tmnode->lengths = (gint *) g_malloc0(tmnode->nlengths * sizeof(gint));
+                if (!tmnode->lengths) {
+                    xs_error("Could not allocate memory for node.\n");
+                    xs_sldb_node_free(tmnode);
+                    return NULL;
+                }
+            } else {
+                xs_sldb_node_free(tmnode);
+                return NULL;
+            }
+            
+            /* Read lengths in */
+            i = 0;
+            linePos = savePos;
+            isOK = TRUE;
+            while ((linePos < tmpLen) && (i < tmnode->nlengths) && isOK) {
+                gint l;
+                
+                xs_findnext(inLine, &linePos);
 
-				l = xs_sldb_gettime(inLine, &linePos);
-				if (l >= 0)
-					tmpNode->sLengths[i] = l;
-				else
-					iOK = FALSE;
+                l = xs_sldb_gettime(inLine, &linePos);
+                if (l >= 0)
+                    tmnode->lengths[i] = l;
+                else
+                    isOK = FALSE;
 
-				i++;
-			}
+                i++;
+            }
 
-			if (!iOK) {
-				xs_sldb_node_free(tmpNode);
-				return NULL;
-			} else
-				return tmpNode;
-		}
-	}
+            if (!isOK) {
+                xs_sldb_node_free(tmnode);
+                return NULL;
+            } else
+                return tmnode;
+        }
+    }
 
-	return NULL;
+    return NULL;
 }
 
 
 /* Read database to memory
  */
-gint xs_sldb_read(t_xs_sldb *db, const gchar *dbFilename)
+gint xs_sldb_read(xs_sldb_t *db, const gchar *dbFilename)
 {
-	FILE *inFile;
-	gchar inLine[XS_BUF_SIZE];
-	size_t lineNum;
-	t_xs_sldb_node *tmpNode;
-	assert(db);
+    FILE *inFile;
+    gchar inLine[XS_BUF_SIZE];
+    size_t lineNum;
+    sldb_node_t *tmnode;
+    assert(db);
 
-	/* Try to open the file */
-	if ((inFile = fopen(dbFilename, "ra")) == NULL) {
-		xs_error(_("Could not open SongLengthDB '%s'\n"), dbFilename);
-		return -1;
-	}
+    /* Try to open the file */
+    if ((inFile = fopen(dbFilename, "ra")) == NULL) {
+        xs_error("Could not open SongLengthDB '%s'\n", dbFilename);
+        return -1;
+    }
 
-	/* Read and parse the data */
-	lineNum = 0;
+    /* Read and parse the data */
+    lineNum = 0;
 
-	while (fgets(inLine, XS_BUF_SIZE, inFile) != NULL) {
-		size_t linePos = 0;
-		lineNum++;
-		
-		xs_findnext(inLine, &linePos);
+    while (fgets(inLine, XS_BUF_SIZE, inFile) != NULL) {
+        size_t linePos = 0;
+        lineNum++;
+        
+        xs_findnext(inLine, &linePos);
 
-		/* Check if it is datafield */
-		if (isxdigit(inLine[linePos])) {
-			/* Check the length of the hash */
-			gint hashLen;
-			for (hashLen = 0; inLine[linePos] && isxdigit(inLine[linePos]); hashLen++, linePos++);
+        /* Check if it is datafield */
+        if (isxdigit(inLine[linePos])) {
+            /* Check the length of the hash */
+            gint hashLen;
+            for (hashLen = 0; inLine[linePos] && isxdigit(inLine[linePos]); hashLen++, linePos++);
 
-			if (hashLen != XS_MD5HASH_LENGTH_CH) {
-				xs_error(_("Invalid MD5-hash in SongLengthDB file '%s' line #%d!\n"),
-					dbFilename, lineNum);
-			} else {
-				/* Parse and add node to db */
-				if ((tmpNode = xs_sldb_read_entry(inLine)) != NULL) {
-					xs_sldb_node_insert(db, tmpNode);
-				} else {
-					xs_error(_("Invalid entry in SongLengthDB file '%s' line #%d!\n"),
-						dbFilename, lineNum);
-				}
-			}
-		} else if ((inLine[linePos] != ';') && (inLine[linePos] != '[') && (inLine[linePos] != 0)) {
-			xs_error(_("Invalid line in SongLengthDB file '%s' line #%d\n"),
-				dbFilename, lineNum);
-		}
+            if (hashLen != XS_MD5HASH_LENGTH_CH) {
+                xs_error("Invalid MD5-hash in SongLengthDB file '%s' line #%d!\n",
+                    dbFilename, lineNum);
+            } else {
+                /* Parse and add node to db */
+                if ((tmnode = xs_sldb_read_entry(inLine)) != NULL) {
+                    xs_sldb_node_insert(db, tmnode);
+                } else {
+                    xs_error("Invalid entry in SongLengthDB file '%s' line #%d!\n",
+                        dbFilename, lineNum);
+                }
+            }
+        } else if ((inLine[linePos] != ';') && (inLine[linePos] != '[') && (inLine[linePos] != 0)) {
+            xs_error("Invalid line in SongLengthDB file '%s' line #%d\n",
+                dbFilename, lineNum);
+        }
 
-	}
+    }
 
-	/* Close the file */
-	fclose(inFile);
+    /* Close the file */
+    fclose(inFile);
 
-	return 0;
+    return 0;
 }
 
 
@@ -251,267 +251,269 @@
  *         negative if testHash1 < testHash2
  *         positive if testHash1 > testHash2
  */
-static gint xs_sldb_cmphash(t_xs_md5hash testHash1, t_xs_md5hash testHash2)
+static gint xs_sldb_cmphash(xs_md5hash_t testHash1, xs_md5hash_t testHash2)
 {
-	gint i, d;
+    gint i, d;
 
-	/* Compute difference of hashes */
-	for (i = 0, d = 0; (i < XS_MD5HASH_LENGTH) && !d; i++)
-		d = (testHash1[i] - testHash2[i]);
+    /* Compute difference of hashes */
+    for (i = 0, d = 0; (i < XS_MD5HASH_LENGTH) && !d; i++)
+        d = (testHash1[i] - testHash2[i]);
 
-	return d;
+    return d;
 }
 
 
 /* Compare two nodes
  */
-static gint xs_sldb_cmp(const void *pNode1, const void *pNode2)
+static gint xs_sldb_cmp(const void *node1, const void *node2)
 {
-	/* We assume here that we never ever get NULL-pointers or similar */
-	return xs_sldb_cmphash(
-		(*(t_xs_sldb_node **) pNode1)->md5Hash,
-		(*(t_xs_sldb_node **) pNode2)->md5Hash);
+    /* We assume here that we never ever get NULL-pointers or similar */
+    return xs_sldb_cmphash(
+        (*(sldb_node_t **) node1)->md5Hash,
+        (*(sldb_node_t **) node2)->md5Hash);
 }
 
 
 /* (Re)create index
  */
-gint xs_sldb_index(t_xs_sldb * db)
+gint xs_sldb_index(xs_sldb_t * db)
 {
-	t_xs_sldb_node *pCurr;
-	size_t i;
-	assert(db);
+    sldb_node_t *pCurr;
+    size_t i;
+    assert(db);
 
-	/* Free old index */
-	if (db->ppIndex) {
-		g_free(db->ppIndex);
-		db->ppIndex = NULL;
-	}
+    /* Free old index */
+    if (db->pindex) {
+        g_free(db->pindex);
+        db->pindex = NULL;
+    }
 
-	/* Get size of db */
-	pCurr = db->pNodes;
-	db->n = 0;
-	while (pCurr) {
-		db->n++;
-		pCurr = pCurr->pNext;
-	}
+    /* Get size of db */
+    pCurr = db->nodes;
+    db->n = 0;
+    while (pCurr) {
+        db->n++;
+        pCurr = pCurr->next;
+    }
 
-	/* Check number of nodes */
-	if (db->n > 0) {
-		/* Allocate memory for index-table */
-		db->ppIndex = (t_xs_sldb_node **) g_malloc(sizeof(t_xs_sldb_node *) * db->n);
-		if (!db->ppIndex)
-			return -1;
+    /* Check number of nodes */
+    if (db->n > 0) {
+        /* Allocate memory for index-table */
+        db->pindex = (sldb_node_t **) g_malloc(sizeof(sldb_node_t *) * db->n);
+        if (!db->pindex)
+            return -1;
 
-		/* Get node-pointers to table */
-		i = 0;
-		pCurr = db->pNodes;
-		while (pCurr && (i < db->n)) {
-			db->ppIndex[i++] = pCurr;
-			pCurr = pCurr->pNext;
-		}
+        /* Get node-pointers to table */
+        i = 0;
+        pCurr = db->nodes;
+        while (pCurr && (i < db->n)) {
+            db->pindex[i++] = pCurr;
+            pCurr = pCurr->next;
+        }
 
-		/* Sort the indexes */
-		qsort(db->ppIndex, db->n, sizeof(t_xs_sldb_node *), xs_sldb_cmp);
-	}
+        /* Sort the indexes */
+        qsort(db->pindex, db->n, sizeof(sldb_node_t *), xs_sldb_cmp);
+    }
 
-	return 0;
+    return 0;
 }
 
 
 /* Free a given song-length database
  */
-void xs_sldb_free(t_xs_sldb * db)
+void xs_sldb_free(xs_sldb_t * db)
 {
-	t_xs_sldb_node *pCurr, *pNext;
+    sldb_node_t *pCurr, *next;
 
-	if (!db)
-		return;
+    if (!db)
+        return;
 
-	/* Free the memory allocated for nodes */
-	pCurr = db->pNodes;
-	while (pCurr) {
-		pNext = pCurr->pNext;
-		xs_sldb_node_free(pCurr);
-		pCurr = pNext;
-	}
+    /* Free the memory allocated for nodes */
+    pCurr = db->nodes;
+    while (pCurr) {
+        next = pCurr->next;
+        xs_sldb_node_free(pCurr);
+        pCurr = next;
+    }
 
-	db->pNodes = NULL;
+    db->nodes = NULL;
 
-	/* Free memory allocated for index */
-	if (db->ppIndex) {
-		g_free(db->ppIndex);
-		db->ppIndex = NULL;
-	}
+    /* Free memory allocated for index */
+    if (db->pindex) {
+        g_free(db->pindex);
+        db->pindex = NULL;
+    }
 
-	/* Free structure */
-	db->n = 0;
-	g_free(db);
+    /* Free structure */
+    db->n = 0;
+    g_free(db);
 }
 
 
 /* Compute md5hash of given SID-file
  */
-typedef struct
-{
-	gchar magicID[4];	/* "PSID" / "RSID" magic identifier */
-	guint16 version,	/* Version number */
-		dataOffset,	/* Start of actual c64 data in file */
-		loadAddress,	/* Loading address */
-		initAddress,	/* Initialization address */
-		playAddress,	/* Play one frame */
-		nSongs,		/* Number of subsongs */
-		startSong;	/* Default starting song */
-	guint32 speed;		/* Speed */
-	gchar sidName[32];	/* Descriptive text-fields, ASCIIZ */
-	gchar sidAuthor[32];
-	gchar sidCopyright[32];
-} t_xs_psidv1_header;
+typedef struct {
+    gchar magicID[4];    /* "PSID" / "RSID" magic identifier */
+    guint16 version,    /* Version number */
+        dataOffset,    /* Start of actual c64 data in file */
+        loadAddress,    /* Loading address */
+        initAddress,    /* Initialization address */
+        playAddress,    /* Play one frame */
+        nSongs,        /* Number of subsongs */
+        startSong;    /* Default starting song */
+    guint32 speed;        /* Speed */
+    gchar sidName[32];    /* Descriptive text-fields, ASCIIZ */
+    gchar sidAuthor[32];
+    gchar sidCopyright[32];
+} psidv1_header_t;
 
 
-typedef struct
-{
-	guint16 flags;		/* Flags */
-	guint8 startPage, pageLength;
-	guint16 reserved;
-} t_xs_psidv2_header;
+typedef struct {
+    guint16 flags;        /* Flags */
+    guint8 startPage, pageLength;
+    guint16 reserved;
+} psidv2_header_t;
 
 
-static gint xs_get_sid_hash(const gchar *pcFilename, t_xs_md5hash hash)
+static gint xs_get_sid_hash(const gchar *filename, xs_md5hash_t hash)
 {
-	t_xs_file *inFile;
-	t_xs_md5state inState;
-	t_xs_psidv1_header psidH;
-	t_xs_psidv2_header psidH2;
-	guint8 *songData;
-	guint8 ib8[2], i8;
-	gint iIndex, iRes;
+    xs_file_t *inFile;
+    xs_md5state_t inState;
+    psidv1_header_t psidH;
+    psidv2_header_t psidH2;
+    guint8 *songData;
+    guint8 ib8[2], i8;
+    gint index, result;
 
-	/* Try to open the file */
-	if ((inFile = xs_fopen(pcFilename, "rb")) == NULL)
-		return -1;
+    /* Try to open the file */
+    if ((inFile = xs_fopen(filename, "rb")) == NULL)
+        return -1;
 
-	/* Read PSID header in */
-	xs_fread(psidH.magicID, sizeof(psidH.magicID), 1, inFile);
-	if (strncmp(psidH.magicID, "PSID", 4) && strncmp(psidH.magicID, "RSID", 4)) {
-		xs_fclose(inFile);
-		xs_error(_("Not a PSID or RSID file '%s'\n"), pcFilename);
-		return -2;
-	}
+    /* Read PSID header in */
+    xs_fread(psidH.magicID, sizeof(psidH.magicID), 1, inFile);
+    if (strncmp(psidH.magicID, "PSID", 4) && strncmp(psidH.magicID, "RSID", 4)) {
+        xs_fclose(inFile);
+        xs_error("Not a PSID or RSID file '%s'\n", filename);
+        return -2;
+    }
 
-	psidH.version = xs_fread_be16(inFile);
-	psidH.dataOffset = xs_fread_be16(inFile);
-	psidH.loadAddress = xs_fread_be16(inFile);
-	psidH.initAddress = xs_fread_be16(inFile);
-	psidH.playAddress = xs_fread_be16(inFile);
-	psidH.nSongs = xs_fread_be16(inFile);
-	psidH.startSong = xs_fread_be16(inFile);
-	psidH.speed = xs_fread_be32(inFile);
+    psidH.version = xs_fread_be16(inFile);
+    psidH.dataOffset = xs_fread_be16(inFile);
+    psidH.loadAddress = xs_fread_be16(inFile);
+    psidH.initAddress = xs_fread_be16(inFile);
+    psidH.playAddress = xs_fread_be16(inFile);
+    psidH.nSongs = xs_fread_be16(inFile);
+    psidH.startSong = xs_fread_be16(inFile);
+    psidH.speed = xs_fread_be32(inFile);
 
-	xs_fread(psidH.sidName, sizeof(gchar), sizeof(psidH.sidName), inFile);
-	xs_fread(psidH.sidAuthor, sizeof(gchar), sizeof(psidH.sidAuthor), inFile);
-	xs_fread(psidH.sidCopyright, sizeof(gchar), sizeof(psidH.sidCopyright), inFile);
-	
-	if (xs_feof(inFile) || xs_ferror(inFile)) {
-		xs_fclose(inFile);
-		xs_error(_("Error reading SID file header from '%s'\n"), pcFilename);
-		return -4;
-	}
-	
-	/* Check if we need to load PSIDv2NG header ... */
-	psidH2.flags = 0;	/* Just silence a stupid gcc warning */
-	
-	if (psidH.version == 2) {
-		/* Yes, we need to */
-		psidH2.flags = xs_fread_be16(inFile);
-		psidH2.startPage = xs_fgetc(inFile);
-		psidH2.pageLength = xs_fgetc(inFile);
-		psidH2.reserved = xs_fread_be16(inFile);
-	}
+    xs_fread(psidH.sidName, sizeof(gchar), sizeof(psidH.sidName), inFile);
+    xs_fread(psidH.sidAuthor, sizeof(gchar), sizeof(psidH.sidAuthor), inFile);
+    xs_fread(psidH.sidCopyright, sizeof(gchar), sizeof(psidH.sidCopyright), inFile);
+    
+    if (xs_feof(inFile) || xs_ferror(inFile)) {
+        xs_fclose(inFile);
+        xs_error("Error reading SID file header from '%s'\n", filename);
+        return -4;
+    }
+    
+    /* Check if we need to load PSIDv2NG header ... */
+    psidH2.flags = 0;    /* Just silence a stupid gcc warning */
+    
+    if (psidH.version == 2) {
+        /* Yes, we need to */
+        psidH2.flags = xs_fread_be16(inFile);
+        psidH2.startPage = xs_fgetc(inFile);
+        psidH2.pageLength = xs_fgetc(inFile);
+        psidH2.reserved = xs_fread_be16(inFile);
+    }
+
+    /* Allocate buffer */
+    songData = (guint8 *) g_malloc(XS_SIDBUF_SIZE * sizeof(guint8));
+    if (!songData) {
+        xs_fclose(inFile);
+        xs_error("Error allocating temp data buffer for file '%s'\n", filename);
+        return -3;
+    }
 
-	/* Allocate buffer */
-	songData = (guint8 *) g_malloc(XS_SIDBUF_SIZE * sizeof(guint8));
-	if (!songData) {
-		xs_fclose(inFile);
-		xs_error(_("Error allocating temp data buffer for file '%s'\n"), pcFilename);
-		return -3;
-	}
+    /* Read data to buffer */
+    result = xs_fread(songData, sizeof(guint8), XS_SIDBUF_SIZE, inFile);
+    xs_fclose(inFile);
 
-	/* Read data to buffer */
-	iRes = xs_fread(songData, sizeof(guint8), XS_SIDBUF_SIZE, inFile);
-	xs_fclose(inFile);
-
-	/* Initialize and start MD5-hash calculation */
-	xs_md5_init(&inState);
+    /* Initialize and start MD5-hash calculation */
+    xs_md5_init(&inState);
 
-	if (psidH.loadAddress == 0) {
-		/* Strip load address (2 first bytes) */
-		xs_md5_append(&inState, &songData[2], iRes - 2);
-	} else {
-		/* Append "as is" */
-		xs_md5_append(&inState, songData, iRes);
-	}
+    if (psidH.loadAddress == 0) {
+        /* Strip load address (2 first bytes) */
+        xs_md5_append(&inState, &songData[2], result - 2);
+    } else {
+        /* Append "as is" */
+        xs_md5_append(&inState, songData, result);
+    }
+
+    /* Free buffer */
+    g_free(songData);
 
-	/* Free buffer */
-	g_free(songData);
+    /* Append header data to hash */
+#define XSADDHASH(QDATAB) do {                    \
+    ib8[0] = (QDATAB & 0xff);                \
+    ib8[1] = (QDATAB >> 8);                    \
+    xs_md5_append(&inState, (guint8 *) &ib8, sizeof(ib8));    \
+    } while (0)
 
-	/* Append header data to hash */
-#define XSADDHASH(QDATAB) { ib8[0] = (QDATAB & 0xff); ib8[1] = (QDATAB >> 8); xs_md5_append(&inState, (guint8 *) &ib8, sizeof(ib8)); }
-
-	XSADDHASH(psidH.initAddress)
-	XSADDHASH(psidH.playAddress)
-	XSADDHASH(psidH.nSongs)
+    XSADDHASH(psidH.initAddress);
+    XSADDHASH(psidH.playAddress);
+    XSADDHASH(psidH.nSongs);
 #undef XSADDHASH
 
-	/* Append song speed data to hash */
-	i8 = 0;
-	for (iIndex = 0; (iIndex < psidH.nSongs) && (iIndex < 32); iIndex++) {
-		i8 = (psidH.speed & (1 << iIndex)) ? 60 : 0;
-		xs_md5_append(&inState, &i8, sizeof(i8));
-	}
+    /* Append song speed data to hash */
+    i8 = 0;
+    for (index = 0; (index < psidH.nSongs) && (index < 32); index++) {
+        i8 = (psidH.speed & (1 << index)) ? 60 : 0;
+        xs_md5_append(&inState, &i8, sizeof(i8));
+    }
 
-	/* Rest of songs (more than 32) */
-	for (iIndex = 32; iIndex < psidH.nSongs; iIndex++) {
-		xs_md5_append(&inState, &i8, sizeof(i8));
-	}
+    /* Rest of songs (more than 32) */
+    for (index = 32; index < psidH.nSongs; index++) {
+        xs_md5_append(&inState, &i8, sizeof(i8));
+    }
 
-	/* PSIDv2NG specific */
-	if (psidH.version == 2) {
-		/* SEE SIDPLAY HEADERS FOR INFO */
-		i8 = (psidH2.flags >> 2) & 3;
-		if (i8 == 2)
-			xs_md5_append(&inState, &i8, sizeof(i8));
-	}
+    /* PSIDv2NG specific */
+    if (psidH.version == 2) {
+        /* SEE SIDPLAY HEADERS FOR INFO */
+        i8 = (psidH2.flags >> 2) & 3;
+        if (i8 == 2)
+            xs_md5_append(&inState, &i8, sizeof(i8));
+    }
 
-	/* Calculate the hash */
-	xs_md5_finish(&inState, hash);
+    /* Calculate the hash */
+    xs_md5_finish(&inState, hash);
 
-	return 0;
+    return 0;
 }
 
 
 /* Get node from db index via binary search
  */
-t_xs_sldb_node *xs_sldb_get(t_xs_sldb *db, const gchar *pcFilename)
+sldb_node_t *xs_sldb_get(xs_sldb_t *db, const gchar *filename)
 {
-	t_xs_sldb_node keyItem, *key, **item;
+    sldb_node_t keyItem, *key, **item;
 
-	/* Check the database pointers */
-	if (!db || !db->pNodes || !db->ppIndex)
-		return NULL;
+    /* Check the database pointers */
+    if (!db || !db->nodes || !db->pindex)
+        return NULL;
 
-	/* Get the hash and then look up from db */
-	if (xs_get_sid_hash(pcFilename, keyItem.md5Hash) == 0) {
-		key = &keyItem;
-		item = bsearch(&key, db->ppIndex, db->n,
-			sizeof(db->ppIndex[0]), xs_sldb_cmp);
-		
-		if (item)
-			return *item;
-		else
-			return NULL;
-	} else
-		return NULL;
+    /* Get the hash and then look up from db */
+    if (xs_get_sid_hash(filename, keyItem.md5Hash) == 0) {
+        key = &keyItem;
+        item = bsearch(&key, db->pindex, db->n,
+            sizeof(db->pindex[0]), xs_sldb_cmp);
+        
+        if (item)
+            return *item;
+        else
+            return NULL;
+    } else
+        return NULL;
 }
 
 
--- a/src/sid/xs_length.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sid/xs_length.h	Fri Jun 13 05:57:25 2008 +0300
@@ -2,7 +2,18 @@
 #define XS_LENGTH_H
 
 #include "xmms-sid.h"
+#ifdef AUDACIOUS_PLUGIN
+#include <audacious/audutil.h>
+#define XS_MD5HASH_LENGTH   AUD_MD5HASH_LENGTH
+#define XS_MD5HASH_LENGTH_CH   AUD_MD5HASH_LENGTH_CH
+#define xs_md5hash_t        aud_md5hash_t
+#define xs_md5state_t       aud_md5state_t
+#define xs_md5_init         aud_md5_init
+#define xs_md5_append       aud_md5_append
+#define xs_md5_finish       aud_md5_finish
+#else
 #include "xs_md5.h"
+#endif
 
 #ifdef __cplusplus
 extern "C" {
@@ -10,27 +21,27 @@
 
 /* Types
  */
-typedef struct _t_xs_sldb_node {
-	t_xs_md5hash	md5Hash;	/* 128-bit MD5 hash-digest */
-	gint		nLengths;	/* Number of lengths */
-	gint		*sLengths;	/* Lengths in seconds */
-	struct _t_xs_sldb_node *pPrev, *pNext;
-} t_xs_sldb_node;
+typedef struct _sldb_node_t {
+    xs_md5hash_t    md5Hash;    /* 128-bit MD5 hash-digest */
+    gint            nlengths;   /* Number of lengths */
+    gint            *lengths;   /* Lengths in seconds */
+    struct _sldb_node_t *prev, *next;
+} sldb_node_t;
 
 
 typedef struct {
-	t_xs_sldb_node	*pNodes,
-			**ppIndex;
-	size_t		n;
-} t_xs_sldb;
+    sldb_node_t     *nodes,
+                    **pindex;
+    size_t          n;
+} xs_sldb_t;
 
 
 /* Functions
  */
-gint			xs_sldb_read(t_xs_sldb *, const gchar *);
-gint			xs_sldb_index(t_xs_sldb *);
-void			xs_sldb_free(t_xs_sldb *);
-t_xs_sldb_node *	xs_sldb_get(t_xs_sldb *, const gchar *);
+gint            xs_sldb_read(xs_sldb_t *, const gchar *);
+gint            xs_sldb_index(xs_sldb_t *);
+void            xs_sldb_free(xs_sldb_t *);
+sldb_node_t *   xs_sldb_get(xs_sldb_t *, const gchar *);
 
 #ifdef __cplusplus
 }
--- a/src/sid/xs_md5.c	Fri Jun 13 04:58:39 2008 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,228 +0,0 @@
-/*
- * MD5 implementation, modified for XMMS-SID from
- * Colin Plumb's implementation by Matti 'ccr' Hämäläinen.
- *
- * This code implements the MD5 message-digest algorithm.
- * The algorithm is due to Ron Rivest.  This code was
- * written by Colin Plumb in 1993, no copyright is claimed.
- * This code is in the public domain; do with it what you wish.
- */
-#include "xs_support.h"
-#include "xs_md5.h"
-#include <glib.h>
-
-
-#ifndef WORDS_BIGENDIAN
-#define xs_md5_bytereverse(buf, len)	/* Nothing */
-#else
-void xs_md5_bytereverse(guint8 *buf, guint l)
-{
-	guint32 t;
-	do {
-		t = (guint32) ((guint) buf[3] << 8 | buf[2]) << 16 | ((guint) buf[1] << 8 | buf[0]);
-		*(guint32 *) buf = t;
-		buf += sizeof(guint32);
-	} while (--l);
-}
-#endif
-
-
-/* Start MD5 accumulation.  Set bit count to 0 and buffer to mysterious
- * initialization constants.
- */
-void xs_md5_init(t_xs_md5state *ctx)
-{
-	ctx->buf[0] = 0x67452301;
-	ctx->buf[1] = 0xefcdab89;
-	ctx->buf[2] = 0x98badcfe;
-	ctx->buf[3] = 0x10325476;
-
-	ctx->bits[0] = 0;
-	ctx->bits[1] = 0;
-}
-
-
-/* The core of the MD5 algorithm, this alters an existing MD5 hash to
- * reflect the addition of 16 longwords of new data.  xs_md5_update blocks
- * the data and converts bytes into longwords for this routine.
- */
-#define F1(x, y, z) (z ^ (x & (y ^ z)))
-#define F2(x, y, z) F1(z, x, y)
-#define F3(x, y, z) (x ^ y ^ z)
-#define F4(x, y, z) (y ^ (x | ~z))
-#define MD5STEP(f, w, x, y, z, data, s) \
-	( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
-
-void xs_md5_transform(guint32 buf[4], guint32 const in[16])
-{
-	register guint32 a, b, c, d;
-
-	a = buf[0];
-	b = buf[1];
-	c = buf[2];
-	d = buf[3];
-
-	MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
-	MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
-	MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
-	MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
-	MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
-	MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
-	MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
-	MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
-	MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
-	MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
-	MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
-	MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
-	MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
-	MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
-	MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
-	MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);
-
-	MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
-	MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
-	MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
-	MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
-	MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
-	MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
-	MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
-	MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
-	MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
-	MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
-	MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
-	MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
-	MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
-	MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
-	MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
-	MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
-
-	MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
-	MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
-	MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
-	MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
-	MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
-	MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
-	MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
-	MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
-	MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
-	MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
-	MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
-	MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
-	MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
-	MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
-	MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
-	MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
-
-	MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
-	MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
-	MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
-	MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
-	MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
-	MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
-	MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
-	MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
-	MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
-	MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
-	MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
-	MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
-	MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
-	MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
-	MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
-	MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);
-
-	buf[0] += a;
-	buf[1] += b;
-	buf[2] += c;
-	buf[3] += d;
-}
-
-
-/* Update context to reflect the concatenation of another buffer full
- * of bytes.
- */
-void xs_md5_append(t_xs_md5state *ctx, const guint8 *buf, guint len)
-{
-	guint32 t;
-
-	/* Update bitcount */
-	t = ctx->bits[0];
-	if ((ctx->bits[0] = t + ((guint32) len << 3)) < t)
-		ctx->bits[1]++;	/* Carry from low to high */
-	ctx->bits[1] += len >> 29;
-
-	t = (t >> 3) & 0x3f;	/* Bytes already in shsInfo->data */
-
-	/* Handle any leading odd-sized chunks */
-
-	if (t) {
-		guint8 *p = (guint8 *) ctx->in + t;
-
-		t = 64 - t;
-		if (len < t) {
-			memcpy(p, buf, len);
-			return;
-		}
-		memcpy(p, buf, t);
-		xs_md5_bytereverse(ctx->in, 16);
-		xs_md5_transform(ctx->buf, (guint32 *) ctx->in);
-		buf += t;
-		len -= t;
-	}
-	/* Process data in 64-byte chunks */
-
-	while (len >= 64) {
-		memcpy(ctx->in, buf, 64);
-		xs_md5_bytereverse(ctx->in, 16);
-		xs_md5_transform(ctx->buf, (guint32 *) ctx->in);
-		buf += 64;
-		len -= 64;
-	}
-
-	/* Handle any remaining bytes of data. */
-
-	memcpy(ctx->in, buf, len);
-}
-
-/* Final wrapup - pad to 64-byte boundary with the bit pattern 
- * 1 0* (64-bit count of bits processed, MSB-first)
- */
-void xs_md5_finish(t_xs_md5state *ctx, t_xs_md5hash digest)
-{
-	guint count;
-	guint8 *p;
-
-	/* Compute number of bytes mod 64 */
-	count = (ctx->bits[0] >> 3) & 0x3F;
-
-	/* Set the first char of padding to 0x80.  This is safe since there is
-	   always at least one byte free */
-	p = ctx->in + count;
-	*p++ = 0x80;
-
-	/* Bytes of padding needed to make 64 bytes */
-	count = 64 - 1 - count;
-
-	/* Pad out to 56 mod 64 */
-	if (count < 8) {
-		/* Two lots of padding:  Pad the first block to 64 bytes */
-		memset(p, 0, count);
-		xs_md5_bytereverse(ctx->in, 16);
-		xs_md5_transform(ctx->buf, (guint32 *) ctx->in);
-
-		/* Now fill the next block with 56 bytes */
-		memset(ctx->in, 0, 56);
-	} else {
-		/* Pad block to 56 bytes */
-		memset(p, 0, count - 8);
-	}
-	xs_md5_bytereverse(ctx->in, 14);
-
-	/* Append length in bits and transform */
-	((guint32 *) ctx->in)[14] = ctx->bits[0];
-	((guint32 *) ctx->in)[15] = ctx->bits[1];
-
-	xs_md5_transform(ctx->buf, (guint32 *) ctx->in);
-	xs_md5_bytereverse((guint8 *) ctx->buf, 4);
-	memcpy(digest, ctx->buf, 16);
-	memset(ctx, 0, sizeof(ctx));	/* In case it's sensitive */
-}
--- a/src/sid/xs_md5.h	Fri Jun 13 04:58:39 2008 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,34 +0,0 @@
-#ifndef XS_MD5_H
-#define XS_MD5_H
-
-#include <glib.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Typedefs
- */
-typedef struct md5_state_s {
-	guint32 bits[2];	/* message length in bits, lsw first */
-	guint32 buf[4];		/* digest buffer */
-	guint8 in[64];		/* accumulate block */
-} t_xs_md5state;
-
-#define XS_MD5HASH_LENGTH	(16)
-#define XS_MD5HASH_LENGTH_CH	(XS_MD5HASH_LENGTH * 2)
-
-typedef guint8 t_xs_md5hash[XS_MD5HASH_LENGTH];
-
-
-/* Functions
- */
-void xs_md5_init(t_xs_md5state *ctx);
-void xs_md5_append(t_xs_md5state *ctx, const guint8 *buf, guint len);
-void xs_md5_finish(t_xs_md5state *ctx, t_xs_md5hash digest);
-
-
-#ifdef __cplusplus
-}
-#endif
-#endif /* XS_MD5_H */
--- a/src/sid/xs_player.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sid/xs_player.h	Fri Jun 13 05:57:25 2008 +0300
@@ -8,48 +8,50 @@
 extern "C" {
 #endif
 
-struct t_xs_status;
+struct xs_status_t;
 
 typedef struct {
-	gint		plrIdent;
-	gboolean	(*plrProbe)(t_xs_file *);
-	gboolean	(*plrInit)(struct t_xs_status *);
-	void		(*plrClose)(struct t_xs_status *);
-	gboolean	(*plrInitSong)(struct t_xs_status *);
-	guint		(*plrFillBuffer)(struct t_xs_status *, gchar *, guint);
-	gboolean	(*plrLoadSID)(struct t_xs_status *, gchar *);
-	void		(*plrDeleteSID)(struct t_xs_status *);
-	t_xs_tuneinfo*	(*plrGetSIDInfo)(const gchar *);
-	gboolean	(*plrUpdateSIDInfo)(struct t_xs_status *);
-	void		(*plrFlush)(struct t_xs_status *);
-} t_xs_player;
+    gint        plrIdent;
+    gboolean    (*plrProbe)(xs_file_t *);
+    gboolean    (*plrInit)(struct xs_status_t *);
+    void        (*plrClose)(struct xs_status_t *);
+    gboolean    (*plrInitSong)(struct xs_status_t *);
+    guint       (*plrFillBuffer)(struct xs_status_t *, gchar *, guint);
+    gboolean    (*plrLoadSID)(struct xs_status_t *, gchar *);
+    void        (*plrDeleteSID)(struct xs_status_t *);
+    xs_tuneinfo_t*    (*plrGetSIDInfo)(const gchar *);
+    gboolean    (*plrUpdateSIDInfo)(struct xs_status_t *);
+    void        (*plrFlush)(struct xs_status_t *);
+} xs_player_t;
 
 
-typedef struct t_xs_status {
-	gint		audioFrequency,		/* Audio settings */
-			audioChannels,
-			audioBitsPerSample,
-			oversampleFactor;	/* Factor of oversampling */
-	AFormat		audioFormat;
-	gboolean	oversampleEnable;	/* TRUE after sidEngine initialization,
-						if xs_cfg.oversampleEnable == TRUE and
-						emulation backend supports oversampling.
-						*/
-	void		*sidEngine;		/* SID-emulation internal engine data */
-	t_xs_player	*sidPlayer;		/* Selected player engine */
-	gboolean	isError, isPlaying, isInitialized;
-	gint		currSong,		/* Current sub-tune */
-			lastTime;
+typedef struct xs_status_t {
+    gint        audioFrequency,     /* Audio settings */
+                audioChannels,
+                audioBitsPerSample,
+                oversampleFactor;   /* Factor of oversampling */
+    AFormat     audioFormat;
+    gboolean    oversampleEnable;   /* TRUE after sidEngine initialization,
+                                    if xs_cfg.oversampleEnable == TRUE and
+                                    emulation backend supports oversampling.
+                                    */
+    void        *sidEngine;         /* SID-emulation internal engine data */
+    xs_player_t *sidPlayer;         /* Selected player engine */
+    gboolean    isError,
+                isPlaying,
+                isInitialized;
+    gint        currSong,           /* Current sub-tune */
+                lastTime;
 
-	t_xs_tuneinfo	*tuneInfo;
-} t_xs_status;
+    xs_tuneinfo_t *tuneInfo;
+} xs_status_t;
 
 
 /* Global variables
  */
-extern InputPlugin	xs_plugin_ip;
+extern InputPlugin    xs_plugin_ip;
 
-extern t_xs_status	xs_status;
+extern xs_status_t    xs_status;
 XS_MUTEX_H(xs_status);
 
 
--- a/src/sid/xs_sidplay.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sid/xs_sidplay.h	Fri Jun 13 05:57:25 2008 +0300
@@ -26,126 +26,126 @@
  * (those variables that are only set by libSIDPlay when tune is initialized).
  * Rest of the information is acquired in TFUNCTION2()
  */
-t_xs_tuneinfo *TFUNCTION(const gchar *sidFilename)
+xs_tuneinfo_t *TFUNCTION(const gchar *sidFilename)
 {
-	t_xs_tuneinfo *pResult;
-	TTUNEINFO myInfo;
-	TTUNE *myTune;
-	guint8 *buf = NULL;
-	size_t bufSize = 0;
+    xs_tuneinfo_t *pResult;
+    TTUNEINFO myInfo;
+    TTUNE *myTune;
+    guint8 *buf = NULL;
+    size_t bufSize = 0;
 
-	/* Load file */
-	if (!sidFilename) return NULL;
+    /* Load file */
+    if (!sidFilename) return NULL;
 
-	if (xs_fload_buffer(sidFilename, &buf, &bufSize) != 0)
-		return NULL;
-	
-	/* Check if the tune exists and is readable */
-	if ((myTune = new TTUNE(buf, bufSize)) == NULL) {
-		g_free(buf);
-		return NULL;
-	}
-	g_free(buf);
+    if (xs_fload_buffer(sidFilename, &buf, &bufSize) != 0)
+        return NULL;
+    
+    /* Check if the tune exists and is readable */
+    if ((myTune = new TTUNE(buf, bufSize)) == NULL) {
+        g_free(buf);
+        return NULL;
+    }
+    g_free(buf);
 
-	if (!myTune->getStatus()) {
-		delete myTune;
-		return NULL;
-	}
+    if (!myTune->getStatus()) {
+        delete myTune;
+        return NULL;
+    }
 
-	/* Get general tune information */
+    /* Get general tune information */
 #ifdef XS_SIDPLAY1_H
-	myTune->getInfo(myInfo);
+    myTune->getInfo(myInfo);
 #endif
 #ifdef XS_SIDPLAY2_H
-	myInfo = myTune->getInfo();
+    myInfo = myTune->getInfo();
 #endif
 
-	/* Allocate tuneinfo structure and set information */
-	pResult = xs_tuneinfo_new(sidFilename,
-		myInfo.songs, myInfo.startSong,
-		myInfo.infoString[0], myInfo.infoString[1], myInfo.infoString[2],
-		myInfo.loadAddr, myInfo.initAddr, myInfo.playAddr,
-		myInfo.dataFileLen, myInfo.formatString, myInfo.sidModel);
-	
-	/* NOTICE! libSIDPlay[12] headers specifically state that sidModel,
-	 * songSpeed and clockSpeed are "undefined" before song initialization,
-	 * but in practice sidModel is known after getInfo() invocation...
-	 * This of course does not take the sub-tune specific changes into account,
-	 * but at least we have a reasonable guesstimate.
-	 */
+    /* Allocate tuneinfo structure and set information */
+    pResult = xs_tuneinfo_new(sidFilename,
+        myInfo.songs, myInfo.startSong,
+        myInfo.infoString[0], myInfo.infoString[1], myInfo.infoString[2],
+        myInfo.loadAddr, myInfo.initAddr, myInfo.playAddr,
+        myInfo.dataFileLen, myInfo.formatString, myInfo.sidModel);
+    
+    /* NOTICE! libSIDPlay[12] headers specifically state that sidModel,
+     * songSpeed and clockSpeed are "undefined" before song initialization,
+     * but in practice sidModel is known after getInfo() invocation...
+     * This of course does not take the sub-tune specific changes into account,
+     * but at least we have a reasonable guesstimate.
+     */
 
-	delete myTune;
+    delete myTune;
 
-	return pResult;
+    return pResult;
 }
 
 
 /* Updates the information of currently playing tune
  */
-gboolean TFUNCTION2(t_xs_status *myStatus)
+gboolean TFUNCTION2(xs_status_t *myStatus)
 {
-	TTUNEINFO myInfo;
-	TTUNE *myTune;
-	TENGINE *myEngine;
-	t_xs_tuneinfo *i;
-	
-	/* Check if we have required structures initialized */
-	if (!myStatus || !myStatus->tuneInfo || !myStatus->sidEngine)
-		return FALSE;
+    TTUNEINFO myInfo;
+    TTUNE *myTune;
+    TENGINE *myEngine;
+    xs_tuneinfo_t *i;
+    
+    /* Check if we have required structures initialized */
+    if (!myStatus || !myStatus->tuneInfo || !myStatus->sidEngine)
+        return FALSE;
 
-	myEngine = (TENGINE *) myStatus->sidEngine;
-	myTune = myEngine->currTune;
-	if (!myTune)
-		return FALSE;
+    myEngine = (TENGINE *) myStatus->sidEngine;
+    myTune = myEngine->currTune;
+    if (!myTune)
+        return FALSE;
 
-	/* Get currently playing tune information */
+    /* Get currently playing tune information */
 #ifdef XS_SIDPLAY1_H
-	myTune->getInfo(myInfo);
+    myTune->getInfo(myInfo);
 #endif
 #ifdef XS_SIDPLAY2_H
-	myInfo = myTune->getInfo();
+    myInfo = myTune->getInfo();
 #endif
 
-	/* NOTICE! Here we assume that libSIDPlay[12] headers define
-	 * SIDTUNE_SIDMODEL_* similarly to our enums in xs_config.h ...
-	 */
-	i = myStatus->tuneInfo;
-	i->sidModel = myInfo.sidModel;
+    /* NOTICE! Here we assume that libSIDPlay[12] headers define
+     * SIDTUNE_SIDMODEL_* similarly to our enums in xs_config.h ...
+     */
+    i = myStatus->tuneInfo;
+    i->sidModel = myInfo.sidModel;
 
-	if ((myStatus->currSong > 0) && (myStatus->currSong <= i->nsubTunes)) {
-		gint tmpSpeed = -1;
-		
-		switch (myInfo.clockSpeed) {
-		case SIDTUNE_CLOCK_PAL:
-			tmpSpeed = XS_CLOCK_PAL;
-			break;
-		case SIDTUNE_CLOCK_NTSC:
-			tmpSpeed = XS_CLOCK_NTSC;
-			break;
-		case SIDTUNE_CLOCK_ANY:
-			tmpSpeed = XS_CLOCK_ANY;
-			break;
-		case SIDTUNE_CLOCK_UNKNOWN:
-			switch (myInfo.songSpeed) {
-			case SIDTUNE_SPEED_VBI:
-				tmpSpeed = XS_CLOCK_VBI;
-				break;
-			case SIDTUNE_SPEED_CIA_1A:
-				tmpSpeed = XS_CLOCK_CIA;
-				break;
-			default:
-				tmpSpeed = myInfo.songSpeed;
-				break;
-			}
-		default:
-			tmpSpeed = myInfo.clockSpeed;
-			break;
-		}
-			
-		i->subTunes[myStatus->currSong - 1].tuneSpeed = tmpSpeed;
-	}
+    if ((myStatus->currSong > 0) && (myStatus->currSong <= i->nsubTunes)) {
+        gint tmpSpeed = -1;
+        
+        switch (myInfo.clockSpeed) {
+        case SIDTUNE_CLOCK_PAL:
+            tmpSpeed = XS_CLOCK_PAL;
+            break;
+        case SIDTUNE_CLOCK_NTSC:
+            tmpSpeed = XS_CLOCK_NTSC;
+            break;
+        case SIDTUNE_CLOCK_ANY:
+            tmpSpeed = XS_CLOCK_ANY;
+            break;
+        case SIDTUNE_CLOCK_UNKNOWN:
+            switch (myInfo.songSpeed) {
+            case SIDTUNE_SPEED_VBI:
+                tmpSpeed = XS_CLOCK_VBI;
+                break;
+            case SIDTUNE_SPEED_CIA_1A:
+                tmpSpeed = XS_CLOCK_CIA;
+                break;
+            default:
+                tmpSpeed = myInfo.songSpeed;
+                break;
+            }
+        default:
+            tmpSpeed = myInfo.clockSpeed;
+            break;
+        }
+            
+        i->subTunes[myStatus->currSong - 1].tuneSpeed = tmpSpeed;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 /* Undefine these */
--- a/src/sid/xs_sidplay1.cc	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sid/xs_sidplay1.cc	Fri Jun 13 05:57:25 2008 +0300
@@ -34,16 +34,16 @@
 
 
 /* Maximum audio frequency supported by libSIDPlay v1 */
-#define SIDPLAY1_MAX_FREQ	(48000)
+#define SIDPLAY1_MAX_FREQ    (48000)
 
 
 typedef struct {
-	emuEngine *currEng;
-	emuConfig currConfig;
-	sidTune *currTune;
-	guint8 *buf;
-	size_t bufSize;
-} t_xs_sidplay1;
+    emuEngine *currEng;
+    emuConfig currConfig;
+    sidTune *currTune;
+    guint8 *buf;
+    size_t bufSize;
+} xs_sidplay1_t;
 
 
 /* We need to 'export' all this pseudo-C++ crap */
@@ -52,312 +52,312 @@
 
 /* Return song information
  */
-#define	TFUNCTION	xs_sidplay1_getinfo
-#define	TFUNCTION2	xs_sidplay1_updateinfo
-#define	TTUNEINFO	sidTuneInfo
-#define	TTUNE		sidTune
-#define TENGINE		t_xs_sidplay1
+#define TFUNCTION   xs_sidplay1_getinfo
+#define TFUNCTION2  xs_sidplay1_updateinfo
+#define TTUNEINFO   sidTuneInfo
+#define TTUNE       sidTune
+#define TENGINE     xs_sidplay1_t
 #include "xs_sidplay.h"
 
 
 /* Check if we can play the given file
  */
-gboolean xs_sidplay1_probe(t_xs_file *f)
+gboolean xs_sidplay1_probe(xs_file_t *f)
 {
-	gchar tmpBuf[4];
-	
-	if (!f) return FALSE;
-	
-	if (xs_fread(tmpBuf, sizeof(gchar), 4, f) != 4)
-		return FALSE;
-	
-	if (!strncmp(tmpBuf, "PSID", 4))
-		return TRUE;
-	else
-		return FALSE;
+    gchar tmpBuf[4];
+    
+    if (!f) return FALSE;
+    
+    if (xs_fread(tmpBuf, sizeof(gchar), 4, f) != 4)
+        return FALSE;
+    
+    if (!strncmp(tmpBuf, "PSID", 4))
+        return TRUE;
+    else
+        return FALSE;
 }
 
 
 /* Initialize SIDPlay1
  */
-gboolean xs_sidplay1_init(t_xs_status * myStatus)
+gboolean xs_sidplay1_init(xs_status_t * myStatus)
 {
-	gint tmpFreq;
-	t_xs_sidplay1 *myEngine;
-	assert(myStatus);
+    gint tmpFreq;
+    xs_sidplay1_t *myEngine;
+    assert(myStatus);
 
-	/* Allocate internal structures */
-	myEngine = (t_xs_sidplay1 *) g_malloc0(sizeof(t_xs_sidplay1));
-	if (!myEngine) return FALSE;
+    /* Allocate internal structures */
+    myEngine = (xs_sidplay1_t *) g_malloc0(sizeof(xs_sidplay1_t));
+    if (!myEngine) return FALSE;
 
-	/* Initialize engine */
-	myEngine->currEng = new emuEngine();
-	if (!myEngine->currEng) {
-		xs_error(_("[SIDPlay1] Could not initialize emulation engine.\n"));
-		g_free(myEngine);
-		return FALSE;
-	}
+    /* Initialize engine */
+    myEngine->currEng = new emuEngine();
+    if (!myEngine->currEng) {
+        xs_error("[SIDPlay1] Could not initialize emulation engine.\n");
+        g_free(myEngine);
+        return FALSE;
+    }
 
-	/* Verify endianess */
-	if (!myEngine->currEng->verifyEndianess()) {
-		xs_error(_("[SIDPlay1] Endianess verification failed.\n"));
-		delete myEngine->currEng;
-		g_free(myEngine);
-		return FALSE;
-	}
+    /* Verify endianess */
+    if (!myEngine->currEng->verifyEndianess()) {
+        xs_error("[SIDPlay1] Endianess verification failed.\n");
+        delete myEngine->currEng;
+        g_free(myEngine);
+        return FALSE;
+    }
 
-	myStatus->sidEngine = myEngine;
+    myStatus->sidEngine = myEngine;
 
-	/* Get current configuration */
-	myEngine->currEng->getConfig(myEngine->currConfig);
+    /* Get current configuration */
+    myEngine->currEng->getConfig(myEngine->currConfig);
 
-	/* Configure channel parameters */
-	switch (myStatus->audioChannels) {
+    /* Configure channel parameters */
+    switch (myStatus->audioChannels) {
 
-	case XS_CHN_AUTOPAN:
-		myEngine->currConfig.channels = SIDEMU_STEREO;
-		myEngine->currConfig.autoPanning = SIDEMU_CENTEREDAUTOPANNING;
-		myEngine->currConfig.volumeControl = SIDEMU_FULLPANNING;
-		break;
+    case XS_CHN_AUTOPAN:
+        myEngine->currConfig.channels = SIDEMU_STEREO;
+        myEngine->currConfig.autoPanning = SIDEMU_CENTEREDAUTOPANNING;
+        myEngine->currConfig.volumeControl = SIDEMU_FULLPANNING;
+        break;
 
-	case XS_CHN_STEREO:
-		myEngine->currConfig.channels = SIDEMU_STEREO;
-		myEngine->currConfig.autoPanning = SIDEMU_NONE;
-		myEngine->currConfig.volumeControl = SIDEMU_NONE;
-		break;
+    case XS_CHN_STEREO:
+        myEngine->currConfig.channels = SIDEMU_STEREO;
+        myEngine->currConfig.autoPanning = SIDEMU_NONE;
+        myEngine->currConfig.volumeControl = SIDEMU_NONE;
+        break;
 
-	case XS_CHN_MONO:
-	default:
-		myEngine->currConfig.channels = SIDEMU_MONO;
-		myEngine->currConfig.autoPanning = SIDEMU_NONE;
-		myEngine->currConfig.volumeControl = SIDEMU_NONE;
-		myStatus->audioChannels = XS_CHN_MONO;
-		break;
-	}
+    case XS_CHN_MONO:
+    default:
+        myEngine->currConfig.channels = SIDEMU_MONO;
+        myEngine->currConfig.autoPanning = SIDEMU_NONE;
+        myEngine->currConfig.volumeControl = SIDEMU_NONE;
+        myStatus->audioChannels = XS_CHN_MONO;
+        break;
+    }
 
 
-	/* Memory mode settings */
-	switch (xs_cfg.memoryMode) {
-	case XS_MPU_TRANSPARENT_ROM:
-		myEngine->currConfig.memoryMode = MPU_TRANSPARENT_ROM;
-		break;
+    /* Memory mode settings */
+    switch (xs_cfg.memoryMode) {
+    case XS_MPU_TRANSPARENT_ROM:
+        myEngine->currConfig.memoryMode = MPU_TRANSPARENT_ROM;
+        break;
 
-	case XS_MPU_PLAYSID_ENVIRONMENT:
-		myEngine->currConfig.memoryMode = MPU_PLAYSID_ENVIRONMENT;
-		break;
+    case XS_MPU_PLAYSID_ENVIRONMENT:
+        myEngine->currConfig.memoryMode = MPU_PLAYSID_ENVIRONMENT;
+        break;
 
-	case XS_MPU_BANK_SWITCHING:
-	default:
-		myEngine->currConfig.memoryMode = MPU_BANK_SWITCHING;
-		xs_cfg.memoryMode = XS_MPU_BANK_SWITCHING;
-		break;
-	}
+    case XS_MPU_BANK_SWITCHING:
+    default:
+        myEngine->currConfig.memoryMode = MPU_BANK_SWITCHING;
+        xs_cfg.memoryMode = XS_MPU_BANK_SWITCHING;
+        break;
+    }
 
 
-	/* Audio parameters sanity checking and setup */
-	myEngine->currConfig.bitsPerSample = myStatus->audioBitsPerSample;
-	tmpFreq = myStatus->audioFrequency;
+    /* Audio parameters sanity checking and setup */
+    myEngine->currConfig.bitsPerSample = myStatus->audioBitsPerSample;
+    tmpFreq = myStatus->audioFrequency;
 
-	if (myStatus->oversampleEnable) {
-		if ((tmpFreq * myStatus->oversampleFactor) > SIDPLAY1_MAX_FREQ) {
-			myStatus->oversampleEnable = FALSE;
-		} else {
-			tmpFreq = (tmpFreq * myStatus->oversampleFactor);
-		}
-	} else {
-		if (tmpFreq > SIDPLAY1_MAX_FREQ)
-			tmpFreq = SIDPLAY1_MAX_FREQ;
-	}
+    if (myStatus->oversampleEnable) {
+        if ((tmpFreq * myStatus->oversampleFactor) > SIDPLAY1_MAX_FREQ) {
+            myStatus->oversampleEnable = FALSE;
+        } else {
+            tmpFreq = (tmpFreq * myStatus->oversampleFactor);
+        }
+    } else {
+        if (tmpFreq > SIDPLAY1_MAX_FREQ)
+            tmpFreq = SIDPLAY1_MAX_FREQ;
+    }
 
-	myEngine->currConfig.frequency = tmpFreq;
+    myEngine->currConfig.frequency = tmpFreq;
 
-	switch (myStatus->audioBitsPerSample) {
-	case XS_RES_8BIT:
-		switch (myStatus->audioFormat) {
-		case FMT_S8:
-			myStatus->audioFormat = FMT_S8;
-			myEngine->currConfig.sampleFormat = SIDEMU_SIGNED_PCM;
-			break;
+    switch (myStatus->audioBitsPerSample) {
+    case XS_RES_8BIT:
+        switch (myStatus->audioFormat) {
+        case FMT_S8:
+            myStatus->audioFormat = FMT_S8;
+            myEngine->currConfig.sampleFormat = SIDEMU_SIGNED_PCM;
+            break;
 
-		case FMT_U8:
-		default:
-			myStatus->audioFormat = FMT_U8;
-			myEngine->currConfig.sampleFormat = SIDEMU_UNSIGNED_PCM;
-			break;
-		}
-		break;
+        case FMT_U8:
+        default:
+            myStatus->audioFormat = FMT_U8;
+            myEngine->currConfig.sampleFormat = SIDEMU_UNSIGNED_PCM;
+            break;
+        }
+        break;
 
-	case XS_RES_16BIT:
-	default:
-		switch (myStatus->audioFormat) {
-		case FMT_U16_NE:
-		case FMT_U16_LE:
-		case FMT_U16_BE:
-			myStatus->audioFormat = FMT_U16_NE;
-			myEngine->currConfig.sampleFormat = SIDEMU_UNSIGNED_PCM;
-			break;
+    case XS_RES_16BIT:
+    default:
+        switch (myStatus->audioFormat) {
+        case FMT_U16_NE:
+        case FMT_U16_LE:
+        case FMT_U16_BE:
+            myStatus->audioFormat = FMT_U16_NE;
+            myEngine->currConfig.sampleFormat = SIDEMU_UNSIGNED_PCM;
+            break;
 
-		case FMT_S16_NE:
-		case FMT_S16_LE:
-		case FMT_S16_BE:
-		default:
-			myStatus->audioFormat = FMT_S16_NE;
-			myEngine->currConfig.sampleFormat = SIDEMU_SIGNED_PCM;
-			break;
-		}
-		break;
-	}
+        case FMT_S16_NE:
+        case FMT_S16_LE:
+        case FMT_S16_BE:
+        default:
+            myStatus->audioFormat = FMT_S16_NE;
+            myEngine->currConfig.sampleFormat = SIDEMU_SIGNED_PCM;
+            break;
+        }
+        break;
+    }
 
-	/* Clockspeed settings */
-	switch (xs_cfg.clockSpeed) {
-	case XS_CLOCK_NTSC:
-		myEngine->currConfig.clockSpeed = SIDTUNE_CLOCK_NTSC;
-		break;
+    /* Clockspeed settings */
+    switch (xs_cfg.clockSpeed) {
+    case XS_CLOCK_NTSC:
+        myEngine->currConfig.clockSpeed = SIDTUNE_CLOCK_NTSC;
+        break;
 
-	case XS_CLOCK_PAL:
-	default:
-		myEngine->currConfig.clockSpeed = SIDTUNE_CLOCK_PAL;
-		xs_cfg.clockSpeed = XS_CLOCK_PAL;
-		break;
-	}
+    case XS_CLOCK_PAL:
+    default:
+        myEngine->currConfig.clockSpeed = SIDTUNE_CLOCK_PAL;
+        xs_cfg.clockSpeed = XS_CLOCK_PAL;
+        break;
+    }
 
-	myEngine->currConfig.forceSongSpeed = xs_cfg.forceSpeed;
-	
-	
-	/* Configure rest of the emulation */
-	/* if (xs_cfg.forceModel) */
-	myEngine->currConfig.mos8580 = xs_cfg.mos8580;
-	myEngine->currConfig.emulateFilter = xs_cfg.emulateFilters;
-	myEngine->currConfig.filterFs = xs_cfg.sid1FilterFs;
-	myEngine->currConfig.filterFm = xs_cfg.sid1FilterFm;
-	myEngine->currConfig.filterFt = xs_cfg.sid1FilterFt;
+    myEngine->currConfig.forceSongSpeed = xs_cfg.forceSpeed;
+    
+    
+    /* Configure rest of the emulation */
+    /* if (xs_cfg.forceModel) */
+    myEngine->currConfig.mos8580 = xs_cfg.mos8580;
+    myEngine->currConfig.emulateFilter = xs_cfg.emulateFilters;
+    myEngine->currConfig.filterFs = xs_cfg.sid1FilterFs;
+    myEngine->currConfig.filterFm = xs_cfg.sid1FilterFm;
+    myEngine->currConfig.filterFt = xs_cfg.sid1FilterFt;
 
 
-	/* Now set the emulator configuration */
-	if (!myEngine->currEng->setConfig(myEngine->currConfig)) {
-		xs_error(_("[SIDPlay1] Emulator engine configuration failed!\n"));
-		return FALSE;
-	}
-	
-	/* Create sidtune object */
-	myEngine->currTune = new sidTune(0);
-	if (!myEngine->currTune) {
-		xs_error(_("[SIDPlay1] Could not initialize SIDTune object.\n"));
-		return FALSE;
-	}
-	
-	return TRUE;
+    /* Now set the emulator configuration */
+    if (!myEngine->currEng->setConfig(myEngine->currConfig)) {
+        xs_error("[SIDPlay1] Emulator engine configuration failed!\n");
+        return FALSE;
+    }
+    
+    /* Create sidtune object */
+    myEngine->currTune = new sidTune(0);
+    if (!myEngine->currTune) {
+        xs_error("[SIDPlay1] Could not initialize SIDTune object.\n");
+        return FALSE;
+    }
+    
+    return TRUE;
 }
 
 
 /* Close SIDPlay1 engine
  */
-void xs_sidplay1_close(t_xs_status * myStatus)
+void xs_sidplay1_close(xs_status_t * myStatus)
 {
-	t_xs_sidplay1 *myEngine;
-	assert(myStatus);
+    xs_sidplay1_t *myEngine;
+    assert(myStatus);
 
-	myEngine = (t_xs_sidplay1 *) myStatus->sidEngine;
+    myEngine = (xs_sidplay1_t *) myStatus->sidEngine;
 
-	/* Free internals */
-	if (myEngine->currEng) {
-		delete myEngine->currEng;
-		myEngine->currEng = NULL;
-	}
+    /* Free internals */
+    if (myEngine->currEng) {
+        delete myEngine->currEng;
+        myEngine->currEng = NULL;
+    }
 
-	if (myEngine->currTune) {
-		delete myEngine->currTune;
-		myEngine->currTune = NULL;
-	}
+    if (myEngine->currTune) {
+        delete myEngine->currTune;
+        myEngine->currTune = NULL;
+    }
 
-	xs_sidplay1_delete(myStatus);
-	
-	g_free(myEngine);
-	myStatus->sidEngine = NULL;
+    xs_sidplay1_delete(myStatus);
+    
+    g_free(myEngine);
+    myStatus->sidEngine = NULL;
 }
 
 
 /* Initialize current song and sub-tune
  */
-gboolean xs_sidplay1_initsong(t_xs_status * myStatus)
+gboolean xs_sidplay1_initsong(xs_status_t * myStatus)
 {
-	t_xs_sidplay1 *myEngine;
-	assert(myStatus);
+    xs_sidplay1_t *myEngine;
+    assert(myStatus);
 
-	myEngine = (t_xs_sidplay1 *) myStatus->sidEngine;
-	if (!myEngine) return FALSE;
+    myEngine = (xs_sidplay1_t *) myStatus->sidEngine;
+    if (!myEngine) return FALSE;
 
-	if (!myEngine->currTune) {
-		xs_error(_("[SIDPlay1] SID-tune struct pointer was NULL. This should not happen, report to XMMS-SID author.\n"));
-		return FALSE;
-	}
+    if (!myEngine->currTune) {
+        xs_error("[SIDPlay1] SID-tune struct pointer was NULL. This should not happen, report to XMMS-SID author.\n");
+        return FALSE;
+    }
 
-	if (!myEngine->currTune->getStatus()) {
-		xs_error(_("[SIDPlay1] SID-tune status check failed. This should not happen, report to XMMS-SID author.\n"));
-		return FALSE;
-	}
+    if (!myEngine->currTune->getStatus()) {
+        xs_error("[SIDPlay1] SID-tune status check failed. This should not happen, report to XMMS-SID author.\n");
+        return FALSE;
+    }
 
-	myStatus->isInitialized = TRUE;
+    myStatus->isInitialized = TRUE;
 
-	return sidEmuInitializeSong(*myEngine->currEng, *myEngine->currTune, myStatus->currSong);
+    return sidEmuInitializeSong(*myEngine->currEng, *myEngine->currTune, myStatus->currSong);
 }
 
 
 /* Emulate and render audio data to given buffer
  */
-guint xs_sidplay1_fillbuffer(t_xs_status * myStatus, gchar * audioBuffer, guint audioBufSize)
+guint xs_sidplay1_fillbuffer(xs_status_t * myStatus, gchar * audioBuffer, guint audioBufSize)
 {
-	t_xs_sidplay1 *myEngine;
-	assert(myStatus);
+    xs_sidplay1_t *myEngine;
+    assert(myStatus);
 
-	myEngine = (t_xs_sidplay1 *) myStatus->sidEngine;
-	if (!myEngine) return 0;
+    myEngine = (xs_sidplay1_t *) myStatus->sidEngine;
+    if (!myEngine) return 0;
 
-	sidEmuFillBuffer(*myEngine->currEng, *myEngine->currTune, audioBuffer, audioBufSize);
+    sidEmuFillBuffer(*myEngine->currEng, *myEngine->currTune, audioBuffer, audioBufSize);
 
-	return audioBufSize;
+    return audioBufSize;
 }
 
 
 /* Load a given SID-tune file
  */
-gboolean xs_sidplay1_load(t_xs_status * myStatus, gchar * pcFilename)
+gboolean xs_sidplay1_load(xs_status_t * myStatus, gchar * filename)
 {
-	t_xs_sidplay1 *myEngine;
-	assert(myStatus);
-	myStatus->isInitialized = FALSE;
+    xs_sidplay1_t *myEngine;
+    assert(myStatus);
+    myStatus->isInitialized = FALSE;
 
-	myEngine = (t_xs_sidplay1 *) myStatus->sidEngine;
-	if (!myEngine) return FALSE;
+    myEngine = (xs_sidplay1_t *) myStatus->sidEngine;
+    if (!myEngine) return FALSE;
 
-	/* Try to get the tune */
-	if (!pcFilename) return FALSE;
-	
-	if (xs_fload_buffer(pcFilename, &(myEngine->buf), &(myEngine->bufSize)) != 0)
-		return FALSE;
-	
-	if (!myEngine->currTune->load(myEngine->buf, myEngine->bufSize))
-		return FALSE;
+    /* Try to get the tune */
+    if (!filename) return FALSE;
+    
+    if (xs_fload_buffer(filename, &(myEngine->buf), &(myEngine->bufSize)) != 0)
+        return FALSE;
+    
+    if (!myEngine->currTune->load(myEngine->buf, myEngine->bufSize))
+        return FALSE;
 
-	return TRUE;
+    return TRUE;
 }
 
 
 /* Delete INTERNAL information
  */
-void xs_sidplay1_delete(t_xs_status * myStatus)
+void xs_sidplay1_delete(xs_status_t * myStatus)
 {
-	t_xs_sidplay1 *myEngine;
-	assert(myStatus);
+    xs_sidplay1_t *myEngine;
+    assert(myStatus);
 
-	myEngine = (t_xs_sidplay1 *) myStatus->sidEngine;
-	if (!myEngine) return;
-	
-	g_free(myEngine->buf);
-	myEngine->buf = NULL;
-	myEngine->bufSize = 0;
+    myEngine = (xs_sidplay1_t *) myStatus->sidEngine;
+    if (!myEngine) return;
+    
+    g_free(myEngine->buf);
+    myEngine->buf = NULL;
+    myEngine->bufSize = 0;
 }
 
 
-}	/* extern "C" */
-#endif	/* HAVE_SIDPLAY1 */
+}    /* extern "C" */
+#endif    /* HAVE_SIDPLAY1 */
--- a/src/sid/xs_sidplay1.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sid/xs_sidplay1.h	Fri Jun 13 05:57:25 2008 +0300
@@ -9,15 +9,15 @@
 extern "C" {
 #endif
 
-gboolean	xs_sidplay1_probe(t_xs_file *);
-void		xs_sidplay1_close(t_xs_status *);
-gboolean	xs_sidplay1_init(t_xs_status *);
-gboolean	xs_sidplay1_initsong(t_xs_status *);
-guint		xs_sidplay1_fillbuffer(t_xs_status *, gchar *, guint);
-gboolean	xs_sidplay1_load(t_xs_status *, gchar *);
-void		xs_sidplay1_delete(t_xs_status *);
-t_xs_tuneinfo*	xs_sidplay1_getinfo(const gchar *);
-gboolean	xs_sidplay1_updateinfo(t_xs_status *);
+gboolean    xs_sidplay1_probe(xs_file_t *);
+void        xs_sidplay1_close(xs_status_t *);
+gboolean    xs_sidplay1_init(xs_status_t *);
+gboolean    xs_sidplay1_initsong(xs_status_t *);
+guint        xs_sidplay1_fillbuffer(xs_status_t *, gchar *, guint);
+gboolean    xs_sidplay1_load(xs_status_t *, gchar *);
+void        xs_sidplay1_delete(xs_status_t *);
+xs_tuneinfo_t*    xs_sidplay1_getinfo(const gchar *);
+gboolean    xs_sidplay1_updateinfo(xs_status_t *);
 
 #ifdef __cplusplus
 }
--- a/src/sid/xs_sidplay2.cc	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sid/xs_sidplay2.cc	Fri Jun 13 05:57:25 2008 +0300
@@ -30,22 +30,50 @@
 
 
 #include <sidplay/sidplay2.h>
-#ifdef HAVE_RESID_BUILDER
-#include <sidplay/builders/resid.h>
-#endif
-#ifdef HAVE_HARDSID_BUILDER
-#include <sidplay/builders/hardsid.h>
+#ifdef HAVE_SIDPLAY2_COMI
+#  include <sidplay/sidlazyiptr.h>
 #endif
 
 
-typedef struct {
-	sidplay2 *currEng;
-	sidbuilder *currBuilder;
-	sid2_config_t currConfig;
-	SidTune *currTune;
-	guint8 *buf;
-	size_t bufSize;
-} t_xs_sidplay2;
+class xs_sidplay2_t {
+public:
+#ifdef HAVE_SIDPLAY2_COMI
+    SidIPtr<ISidplay2> currEng;
+    SidLazyIPtr<ISidUnknown> currBuilder;
+#else
+    sidplay2 *currEng;
+    sidbuilder *currBuilder;
+#endif
+    sid2_config_t currConfig;
+    SidTune *currTune;
+    guint8 *buf;
+    size_t bufSize;
+    
+    xs_sidplay2_t(void);
+    virtual ~xs_sidplay2_t(void) { ; }
+};
+
+
+#ifdef HAVE_RESID_BUILDER
+#  include <sidplay/builders/resid.h>
+#endif
+#ifdef HAVE_HARDSID_BUILDER
+#  include <sidplay/builders/hardsid.h>
+#endif
+
+
+xs_sidplay2_t::xs_sidplay2_t(void)
+#ifdef HAVE_SIDPLAY2_COMI
+:currEng(sidplay2::create())
+#else
+:currEng(NULL)
+#endif
+{
+    buf = NULL;
+    bufSize = 0;
+    currTune = NULL;
+    currBuilder = NULL;    
+}
 
 
 /* We need to 'export' all this pseudo-C++ crap */
@@ -54,437 +82,468 @@
 
 /* Return song information
  */
-#define TFUNCTION	xs_sidplay2_getinfo
-#define TFUNCTION2	xs_sidplay2_updateinfo
-#define TTUNEINFO	SidTuneInfo
-#define TTUNE		SidTune
-#define TENGINE		t_xs_sidplay2
+#define TFUNCTION   xs_sidplay2_getinfo
+#define TFUNCTION2  xs_sidplay2_updateinfo
+#define TTUNEINFO   SidTuneInfo
+#define TTUNE       SidTune
+#define TENGINE     xs_sidplay2_t
 #include "xs_sidplay.h"
 
 
 /* Check if we can play the given file
  */
-gboolean xs_sidplay2_probe(t_xs_file *f)
+gboolean xs_sidplay2_probe(xs_file_t *f)
 {
-	gchar tmpBuf[4];
-	
-	if (!f) return FALSE;
-	
-	if (xs_fread(tmpBuf, sizeof(gchar), 4, f) != 4)
-		return FALSE;
-	
-	if (!strncmp(tmpBuf, "PSID", 4) || !strncmp(tmpBuf, "RSID", 4))
-		return TRUE;
-	else
-		return FALSE;
+    gchar tmpBuf[5];
+    
+    if (!f) return FALSE;
+    
+    if (xs_fread(tmpBuf, sizeof(gchar), 4, f) != 4)
+        return FALSE;
+    
+    if (!strncmp(tmpBuf, "PSID", 4) || !strncmp(tmpBuf, "RSID", 4))
+        return TRUE;
+    else
+        return FALSE;
 }
 
 
 /* Initialize SIDPlay2
  */
-gboolean xs_sidplay2_init(t_xs_status * myStatus)
+gboolean xs_sidplay2_init(xs_status_t * myStatus)
 {
-	gint tmpFreq, i;
-	t_xs_sidplay2 *myEngine;
-	sid_filter_t tmpFilter;
-	t_xs_sid2_filter *f;
-	assert(myStatus);
+    gint tmpFreq, i;
+    xs_sidplay2_t *myEngine;
+    sid_filter_t tmpFilter;
+    xs_sid2_filter_t *f;
+    assert(myStatus);
 
-	/* Allocate internal structures */
-	myEngine = (t_xs_sidplay2 *) g_malloc0(sizeof(t_xs_sidplay2));
-	myStatus->sidEngine = myEngine;
-	if (!myEngine) return FALSE;
-
-	/* Initialize the engine */
-	myEngine->currEng = new sidplay2;
-	if (!myEngine->currEng) {
-		xs_error(_("[SIDPlay2] Could not initialize emulation engine.\n"));
-		return FALSE;
-	}
+    /* Allocate internal structures */
+    myEngine = new xs_sidplay2_t();
+    myStatus->sidEngine = myEngine;
+    if (!myEngine) return FALSE;
 
-	/* Get current configuration */
-	myEngine->currConfig = myEngine->currEng->config();
+    /* Initialize the engine */
+#ifndef HAVE_SIDPLAY2_COMI
+    myEngine->currEng = new sidplay2;
+#endif
+    if (!myEngine->currEng) {
+        xs_error("[SIDPlay2] Could not initialize emulation engine.\n");
+        return FALSE;
+    }
 
-	/* Configure channels and stuff */
-	switch (myStatus->audioChannels) {
+    /* Get current configuration */
+    myEngine->currConfig = myEngine->currEng->config();
 
-	case XS_CHN_AUTOPAN:
-		myEngine->currConfig.playback = sid2_stereo;
-		break;
+    /* Configure channels and stuff */
+    switch (myStatus->audioChannels) {
 
-	case XS_CHN_STEREO:
-		myEngine->currConfig.playback = sid2_stereo;
-		break;
+    case XS_CHN_AUTOPAN:
+        myEngine->currConfig.playback = sid2_stereo;
+        break;
 
-	case XS_CHN_MONO:
-	default:
-		myEngine->currConfig.playback = sid2_mono;
-		myStatus->audioChannels = XS_CHN_MONO;
-		break;
-	}
+    case XS_CHN_STEREO:
+        myEngine->currConfig.playback = sid2_stereo;
+        break;
+
+    case XS_CHN_MONO:
+    default:
+        myEngine->currConfig.playback = sid2_mono;
+        myStatus->audioChannels = XS_CHN_MONO;
+        break;
+    }
 
 
-	/* Memory mode settings */
-	switch (xs_cfg.memoryMode) {
-	case XS_MPU_BANK_SWITCHING:
-		myEngine->currConfig.environment = sid2_envBS;
-		break;
+    /* Memory mode settings */
+    switch (xs_cfg.memoryMode) {
+    case XS_MPU_BANK_SWITCHING:
+        myEngine->currConfig.environment = sid2_envBS;
+        break;
 
-	case XS_MPU_TRANSPARENT_ROM:
-		myEngine->currConfig.environment = sid2_envTP;
-		break;
+    case XS_MPU_TRANSPARENT_ROM:
+        myEngine->currConfig.environment = sid2_envTP;
+        break;
 
-	case XS_MPU_PLAYSID_ENVIRONMENT:
-		myEngine->currConfig.environment = sid2_envPS;
-		break;
+    case XS_MPU_PLAYSID_ENVIRONMENT:
+        myEngine->currConfig.environment = sid2_envPS;
+        break;
 
-	case XS_MPU_REAL:
-	default:
-		myEngine->currConfig.environment = sid2_envR;
-		xs_cfg.memoryMode = XS_MPU_REAL;
-		break;
-	}
+    case XS_MPU_REAL:
+    default:
+        myEngine->currConfig.environment = sid2_envR;
+        xs_cfg.memoryMode = XS_MPU_REAL;
+        break;
+    }
 
 
-	/* Audio parameters sanity checking and setup */
-	myEngine->currConfig.precision = myStatus->audioBitsPerSample;
-	tmpFreq = myStatus->audioFrequency;
+    /* Audio parameters sanity checking and setup */
+    myEngine->currConfig.precision = myStatus->audioBitsPerSample;
+    tmpFreq = myStatus->audioFrequency;
 
-	if (myStatus->oversampleEnable)
-		tmpFreq = (tmpFreq * myStatus->oversampleFactor);
+    if (myStatus->oversampleEnable)
+        tmpFreq = (tmpFreq * myStatus->oversampleFactor);
 
-	myEngine->currConfig.frequency = tmpFreq;
+    myEngine->currConfig.frequency = tmpFreq;
 
-	switch (myStatus->audioBitsPerSample) {
-	case XS_RES_8BIT:
-		myStatus->audioFormat = FMT_U8;
-		myEngine->currConfig.sampleFormat = SID2_LITTLE_UNSIGNED;
-		break;
+    switch (myStatus->audioBitsPerSample) {
+    case XS_RES_8BIT:
+        myStatus->audioFormat = FMT_U8;
+        myEngine->currConfig.sampleFormat = SID2_LITTLE_UNSIGNED;
+        break;
 
-	case XS_RES_16BIT:
-	default:
-		switch (myStatus->audioFormat) {
-		case FMT_U16_LE:
-			myEngine->currConfig.sampleFormat = SID2_LITTLE_UNSIGNED;
-			break;
+    case XS_RES_16BIT:
+    default:
+        switch (myStatus->audioFormat) {
+        case FMT_U16_LE:
+            myEngine->currConfig.sampleFormat = SID2_LITTLE_UNSIGNED;
+            break;
+
+        case FMT_U16_BE:
+            myEngine->currConfig.sampleFormat = SID2_BIG_UNSIGNED;
+            break;
 
-		case FMT_U16_BE:
-			myEngine->currConfig.sampleFormat = SID2_BIG_UNSIGNED;
-			break;
+        case FMT_U16_NE:
+#if G_BYTE_ORDER == G_BIG_ENDIAN
+            myEngine->currConfig.sampleFormat = SID2_BIG_UNSIGNED;
+#else
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+            myEngine->currConfig.sampleFormat = SID2_LITTLE_UNSIGNED;
+#else
+#error Unsupported endianess!
+#endif
+#endif
+            break;
 
-		case FMT_U16_NE:
-#ifdef WORDS_BIGENDIAN
-			myEngine->currConfig.sampleFormat = SID2_BIG_UNSIGNED;
-#else
-			myEngine->currConfig.sampleFormat = SID2_LITTLE_UNSIGNED;
-#endif
-			break;
+        case FMT_S16_LE:
+            myEngine->currConfig.sampleFormat = SID2_LITTLE_SIGNED;
+            break;
 
-		case FMT_S16_LE:
-			myEngine->currConfig.sampleFormat = SID2_LITTLE_SIGNED;
-			break;
-
-		case FMT_S16_BE:
-			myEngine->currConfig.sampleFormat = SID2_BIG_SIGNED;
-			break;
+        case FMT_S16_BE:
+            myEngine->currConfig.sampleFormat = SID2_BIG_SIGNED;
+            break;
 
-		default:
-			myStatus->audioFormat = FMT_S16_NE;
-#ifdef WORDS_BIGENDIAN
-			myEngine->currConfig.sampleFormat = SID2_BIG_SIGNED;
+        default:
+            myStatus->audioFormat = FMT_S16_NE;
+#if G_BYTE_ORDER == G_BIG_ENDIAN
+            myEngine->currConfig.sampleFormat = SID2_BIG_SIGNED;
 #else
-			myEngine->currConfig.sampleFormat = SID2_LITTLE_SIGNED;
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+            myEngine->currConfig.sampleFormat = SID2_LITTLE_SIGNED;
+#else
+#error Unsupported endianess!
 #endif
-			break;
+#endif
+            break;
 
-		}
-		break;
-	}
-	
-	/* Convert filter */
-	f = &(xs_cfg.sid2Filter);
-	XSDEBUG("using filter '%s', %d points\n", f->name, f->npoints);
-	if (f->npoints > XS_SIDPLAY2_NFPOINTS) {
-		xs_error(_("[SIDPlay2] Invalid number of filter curve points (%d > %d)\n"),
-			f->npoints, XS_SIDPLAY2_NFPOINTS);
-		f->npoints = XS_SIDPLAY2_NFPOINTS;
-	}
-	
-	tmpFilter.points = f->npoints;
-	for (i = 0; i < f->npoints; i++) {
-		tmpFilter.cutoff[i][0] = f->points[i].x;
-		tmpFilter.cutoff[i][1] = f->points[i].y;
-	}
+        }
+        break;
+    }
+    
+    /* Convert filter */
+    f = &(xs_cfg.sid2Filter);
+    XSDEBUG("using filter '%s', %d points\n", f->name, f->npoints);
+    if (f->npoints > XS_SIDPLAY2_NFPOINTS) {
+        xs_error("[SIDPlay2] Invalid number of filter curve points (%d > %d)\n",
+            f->npoints, XS_SIDPLAY2_NFPOINTS);
+        f->npoints = XS_SIDPLAY2_NFPOINTS;
+    }
+    
+    tmpFilter.points = f->npoints;
+    for (i = 0; i < f->npoints; i++) {
+        tmpFilter.cutoff[i][0] = f->points[i].x;
+        tmpFilter.cutoff[i][1] = f->points[i].y;
+    }
 
-	/* Initialize builder object */
-	XSDEBUG("init builder #%i, maxsids=%i\n", xs_cfg.sid2Builder, (myEngine->currEng->info()).maxsids);
+    /* Initialize builder object */
+    XSDEBUG("init builder #%i, maxsids=%i\n", xs_cfg.sid2Builder, (myEngine->currEng->info()).maxsids);
 #ifdef HAVE_RESID_BUILDER
-	if (xs_cfg.sid2Builder == XS_BLD_RESID) {
-		ReSIDBuilder *rs = new ReSIDBuilder("ReSID builder");
-		myEngine->currBuilder = (sidbuilder *) rs;
-		if (rs) {
-			/* Builder object created, initialize it */
-			rs->create((myEngine->currEng->info()).maxsids);
-			if (!*rs) {
-				xs_error(_("reSID->create() failed.\n"));
-				return FALSE;
-			}
-
-			rs->filter(xs_cfg.emulateFilters);
-			if (!*rs) {
-				xs_error(_("reSID->filter(%d) failed.\n"), xs_cfg.emulateFilters);
-				return FALSE;
-			}
+    if (xs_cfg.sid2Builder == XS_BLD_RESID) {
+#ifdef HAVE_SIDPLAY2_COMI
+        myEngine->currBuilder = ReSIDBuilderCreate("");
+        SidLazyIPtr<IReSIDBuilder> rs(myEngine->currBuilder);
+        if (rs) {
+            myEngine->currConfig.sidEmulation = rs->iaggregate();
+#else
+        ReSIDBuilder *rs = new ReSIDBuilder("ReSID builder");
+        myEngine->currBuilder = (sidbuilder *) rs;
+        if (rs) {
+#endif
+            /* Builder object created, initialize it */
+            rs->create((myEngine->currEng->info()).maxsids);
+            if (!*rs) {
+                xs_error("reSID->create() failed.\n");
+                return FALSE;
+            }
 
-			// FIXME FIX ME: support other configurable parameters ...
-			// ... WHEN/IF resid-builder+libsidplay2 gets fixed
-			rs->sampling(tmpFreq);
-			if (!*rs) {
-				xs_error(_("reSID->sampling(%d) failed.\n"), tmpFreq);
-				return FALSE;
-			}
-			
-			if (tmpFilter.points > 0)
-				rs->filter((sid_filter_t *) &tmpFilter);
-			else
-				rs->filter((sid_filter_t *) NULL);
-			
-			if (!*rs) {
-				xs_error(_("reSID->filter(NULL) failed.\n"));
-				return FALSE;
-			}
-		}
-	}
+            rs->filter(xs_cfg.emulateFilters);
+            if (!*rs) {
+                xs_error("reSID->filter(%d) failed.\n", xs_cfg.emulateFilters);
+                return FALSE;
+            }
+
+#ifndef HAVE_SIDPLAY2_DISTORTION
+            // FIXME FIX ME: support other configurable parameters ...
+            // ... WHEN/IF resid-builder+libsidplay2 gets fixed
+            rs->sampling(tmpFreq);
+            if (!*rs) {
+                xs_error("reSID->sampling(%d) failed.\n", tmpFreq);
+                return FALSE;
+            }
+#endif
+            
+            if (tmpFilter.points > 0)
+                rs->filter((sid_filter_t *) &tmpFilter);
+            else
+                rs->filter((sid_filter_t *) NULL);
+            
+            if (!*rs) {
+                xs_error("reSID->filter(NULL) failed.\n");
+                return FALSE;
+            }
+        }
+    }
 #endif
 #ifdef HAVE_HARDSID_BUILDER
-	if (xs_cfg.sid2Builder == XS_BLD_HARDSID) {
-		HardSIDBuilder *hs = new HardSIDBuilder("HardSID builder");
-		myEngine->currBuilder = (sidbuilder *) hs;
-		if (hs) {
-			/* Builder object created, initialize it */
-			hs->create((myEngine->currEng->info()).maxsids);
-			if (!*hs) {
-				xs_error(_("hardSID->create() failed.\n"));
-				return FALSE;
-			}
+    if (xs_cfg.sid2Builder == XS_BLD_HARDSID) {
+#ifdef HAVE_SIDPLAY2_COMI
+        myEngine->currBuilder = HardSIDBuilderCreate("");
+        SidLazyIPtr<IHardSIDBuilder> hs(myEngine->currBuilder);
+        if (hs) {
+            myEngine->currConfig.sidEmulation = hs->iaggregate();
+#else
+        HardSIDBuilder *hs = new HardSIDBuilder("HardSID builder");
+        myEngine->currBuilder = (sidbuilder *) hs;
+        if (hs) {
+#endif
+            /* Builder object created, initialize it */
+            hs->create((myEngine->currEng->info()).maxsids);
+            if (!*hs) {
+                xs_error("hardSID->create() failed.\n");
+                return FALSE;
+            }
 
-			hs->filter(xs_cfg.emulateFilters);
-			if (!*hs) {
-				xs_error(_("hardSID->filter(%d) failed.\n"), xs_cfg.emulateFilters);
-				return FALSE;
-			}
-		}
-	}
+            hs->filter(xs_cfg.emulateFilters);
+            if (!*hs) {
+                xs_error("hardSID->filter(%d) failed.\n", xs_cfg.emulateFilters);
+                return FALSE;
+            }
+        }
+    }
 #endif
 
-	if (!myEngine->currBuilder) {
-		xs_error(_("[SIDPlay2] Could not initialize SIDBuilder object.\n"));
-		return FALSE;
-	}
+    if (!myEngine->currBuilder) {
+        xs_error("[SIDPlay2] Could not initialize SIDBuilder object.\n");
+        return FALSE;
+    }
 
-	XSDEBUG("%s\n", myEngine->currBuilder->credits());
-
+#ifndef HAVE_SIDPLAY2_COMI
+    myEngine->currConfig.sidEmulation = myEngine->currBuilder;
+    XSDEBUG("%s\n", myEngine->currBuilder->credits());
+#endif
 
-	/* Clockspeed settings */
-	switch (xs_cfg.clockSpeed) {
-	case XS_CLOCK_NTSC:
-		myEngine->currConfig.clockDefault = SID2_CLOCK_NTSC;
-		break;
+    /* Clockspeed settings */
+    switch (xs_cfg.clockSpeed) {
+    case XS_CLOCK_NTSC:
+        myEngine->currConfig.clockDefault = SID2_CLOCK_NTSC;
+        break;
 
-	default:
-		xs_error(_("[SIDPlay2] Invalid clockSpeed=%d, falling back to PAL.\n"),
-			xs_cfg.clockSpeed);
+    default:
+        xs_error("[SIDPlay2] Invalid clockSpeed=%d, falling back to PAL.\n",
+            xs_cfg.clockSpeed);
 
-	case XS_CLOCK_PAL:
-		myEngine->currConfig.clockDefault = SID2_CLOCK_PAL;
-		xs_cfg.clockSpeed = XS_CLOCK_PAL;
-		break;
-	}
+    case XS_CLOCK_PAL:
+        myEngine->currConfig.clockDefault = SID2_CLOCK_PAL;
+        xs_cfg.clockSpeed = XS_CLOCK_PAL;
+        break;
+    }
 
 
-	/* Configure rest of the emulation */
-	myEngine->currConfig.sidEmulation = myEngine->currBuilder;
-	
-	if (xs_cfg.forceSpeed) { 
-		myEngine->currConfig.clockForced = true;
-		myEngine->currConfig.clockSpeed = myEngine->currConfig.clockDefault;
-	} else {
-		myEngine->currConfig.clockForced = false;
-		myEngine->currConfig.clockSpeed = SID2_CLOCK_CORRECT;
-	}
-	
-	if ((xs_cfg.sid2OptLevel >= 0) && (xs_cfg.sid2OptLevel <= SID2_MAX_OPTIMISATION))
-		myEngine->currConfig.optimisation = xs_cfg.sid2OptLevel;
-	else {
-		xs_error(_("Invalid sid2OptLevel=%d, falling back to %d.\n"),
-			xs_cfg.sid2OptLevel, SID2_DEFAULT_OPTIMISATION);
-		
-		xs_cfg.sid2OptLevel =
-		myEngine->currConfig.optimisation = SID2_DEFAULT_OPTIMISATION;
-	}
+    /* Configure rest of the emulation */
+    
+    if (xs_cfg.forceSpeed) { 
+        myEngine->currConfig.clockForced = true;
+        myEngine->currConfig.clockSpeed = myEngine->currConfig.clockDefault;
+    } else {
+        myEngine->currConfig.clockForced = false;
+        myEngine->currConfig.clockSpeed = SID2_CLOCK_CORRECT;
+    }
+    
+    if ((xs_cfg.sid2OptLevel >= 0) && (xs_cfg.sid2OptLevel <= SID2_MAX_OPTIMISATION))
+        myEngine->currConfig.optimisation = xs_cfg.sid2OptLevel;
+    else {
+        xs_error("Invalid sid2OptLevel=%d, falling back to %d.\n",
+            xs_cfg.sid2OptLevel, SID2_DEFAULT_OPTIMISATION);
+        
+        xs_cfg.sid2OptLevel =
+        myEngine->currConfig.optimisation = SID2_DEFAULT_OPTIMISATION;
+    }
 
-	if (xs_cfg.mos8580)
-		myEngine->currConfig.sidDefault = SID2_MOS8580;
-	else
-		myEngine->currConfig.sidDefault = SID2_MOS6581;
+    if (xs_cfg.mos8580)
+        myEngine->currConfig.sidDefault = SID2_MOS8580;
+    else
+        myEngine->currConfig.sidDefault = SID2_MOS6581;
 
-	if (xs_cfg.forceModel)
-		myEngine->currConfig.sidModel = myEngine->currConfig.sidDefault;
-	else
-		myEngine->currConfig.sidModel = SID2_MODEL_CORRECT;
+    if (xs_cfg.forceModel)
+        myEngine->currConfig.sidModel = myEngine->currConfig.sidDefault;
+    else
+        myEngine->currConfig.sidModel = SID2_MODEL_CORRECT;
 
-	
-	/* XXX: Should this be configurable? libSIDPlay1 does not support it, though */
-	myEngine->currConfig.sidSamples = TRUE;
+    
+    /* XXX: Should this be configurable? libSIDPlay1 does not support it, though */
+    myEngine->currConfig.sidSamples = TRUE;
 
 
-	/* Now set the emulator configuration */
-	if (myEngine->currEng->config(myEngine->currConfig) < 0) {
-		xs_error(_("[SIDPlay2] Emulator engine configuration failed!\n"));
-		return FALSE;
-	}
+    /* Now set the emulator configuration */
+    if (myEngine->currEng->config(myEngine->currConfig) < 0) {
+        xs_error("[SIDPlay2] Emulator engine configuration failed!\n");
+        return FALSE;
+    }
 
-	/* Create the sidtune */
-	myEngine->currTune = new SidTune(0);
-	if (!myEngine->currTune) {
-		xs_error(_("[SIDPlay2] Could not initialize SIDTune object.\n"));
-		return FALSE;
-	}
+    /* Create the sidtune */
+    myEngine->currTune = new SidTune(0);
+    if (!myEngine->currTune) {
+        xs_error("[SIDPlay2] Could not initialize SIDTune object.\n");
+        return FALSE;
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 
 /* Close SIDPlay2 engine
  */
-void xs_sidplay2_close(t_xs_status * myStatus)
+void xs_sidplay2_close(xs_status_t * myStatus)
 {
-	t_xs_sidplay2 *myEngine;
-	assert(myStatus);
+    xs_sidplay2_t *myEngine;
+    assert(myStatus);
+
+    myEngine = (xs_sidplay2_t *) myStatus->sidEngine;
 
-	myEngine = (t_xs_sidplay2 *) myStatus->sidEngine;
-
-	/* Free internals */
-	if (myEngine->currBuilder) {
-		delete myEngine->currBuilder;
-		myEngine->currBuilder = NULL;
-	}
+    /* Free internals */
+    if (myEngine->currBuilder) {
+#ifndef HAVE_SIDPLAY2_COMI
+        delete myEngine->currBuilder;
+#endif
+        myEngine->currBuilder = NULL;
+    }
 
-	if (myEngine->currEng) {
-		delete myEngine->currEng;
-		myEngine->currEng = NULL;
-	}
+#ifndef HAVE_SIDPLAY2_COMI
+    if (myEngine->currEng) {
+        delete myEngine->currEng;
+        myEngine->currEng = NULL;
+    }
+#endif
 
-	if (myEngine->currTune) {
-		delete myEngine->currTune;
-		myEngine->currTune = NULL;
-	}
+    if (myEngine->currTune) {
+        delete myEngine->currTune;
+        myEngine->currTune = NULL;
+    }
 
-	xs_sidplay2_delete(myStatus);
+    xs_sidplay2_delete(myStatus);
 
-	g_free(myEngine);
-	myStatus->sidEngine = NULL;
+    delete myEngine;
+    myStatus->sidEngine = NULL;
 }
 
 
 /* Initialize current song and sub-tune
  */
-gboolean xs_sidplay2_initsong(t_xs_status * myStatus)
+gboolean xs_sidplay2_initsong(xs_status_t * myStatus)
 {
-	t_xs_sidplay2 *myEngine;
-	assert(myStatus);
+    xs_sidplay2_t *myEngine;
+    assert(myStatus);
 
-	myEngine = (t_xs_sidplay2 *) myStatus->sidEngine;
-	if (!myEngine) return FALSE;
+    myEngine = (xs_sidplay2_t *) myStatus->sidEngine;
+    if (!myEngine) return FALSE;
 
-	if (!myEngine->currTune->selectSong(myStatus->currSong)) {
-		xs_error(_("[SIDPlay2] currTune->selectSong() failed\n"));
-		return FALSE;
-	}
+    if (!myEngine->currTune->selectSong(myStatus->currSong)) {
+        xs_error("[SIDPlay2] currTune->selectSong() failed\n");
+        return FALSE;
+    }
 
-	if (myEngine->currEng->load(myEngine->currTune) < 0) {
-		xs_error(_("[SIDPlay2] currEng->load() failed\n"));
-		return FALSE;
-	}
-	
-	myStatus->isInitialized = TRUE;
+    if (myEngine->currEng->load(myEngine->currTune) < 0) {
+        xs_error("[SIDPlay2] currEng->load() failed\n");
+        return FALSE;
+    }
+    
+    myStatus->isInitialized = TRUE;
 
-	return TRUE;
+    return TRUE;
 }
 
 
 /* Emulate and render audio data to given buffer
  */
-guint xs_sidplay2_fillbuffer(t_xs_status * myStatus, gchar * audioBuffer, guint audioBufSize)
+guint xs_sidplay2_fillbuffer(xs_status_t * myStatus, gchar * audioBuffer, guint audioBufSize)
 {
-	t_xs_sidplay2 *myEngine;
-	assert(myStatus);
+    xs_sidplay2_t *myEngine;
+    assert(myStatus);
 
-	myEngine = (t_xs_sidplay2 *) myStatus->sidEngine;
-	if (!myEngine) return 0;
+    myEngine = (xs_sidplay2_t *) myStatus->sidEngine;
+    if (!myEngine) return 0;
 
-	return myEngine->currEng->play(audioBuffer, audioBufSize);
+    return myEngine->currEng->play(audioBuffer, audioBufSize);
 }
 
 
 /* Load a given SID-tune file
  */
-gboolean xs_sidplay2_load(t_xs_status * myStatus, gchar * pcFilename)
+gboolean xs_sidplay2_load(xs_status_t * myStatus, gchar * pcFilename)
 {
-	t_xs_sidplay2 *myEngine;
-	assert(myStatus);
-	myStatus->isInitialized = FALSE;
+    xs_sidplay2_t *myEngine;
+    assert(myStatus);
+    myStatus->isInitialized = FALSE;
 
-	myEngine = (t_xs_sidplay2 *) myStatus->sidEngine;
-	if (!myEngine) return FALSE;
+    myEngine = (xs_sidplay2_t *) myStatus->sidEngine;
+    if (!myEngine) return FALSE;
 
-	/* Try to get the tune */
-	if (!pcFilename) return FALSE;
+    /* Try to get the tune */
+    if (!pcFilename) return FALSE;
 
-	if (xs_fload_buffer(pcFilename, &(myEngine->buf), &(myEngine->bufSize)) != 0)
-		return FALSE;
-	
-	if (!myEngine->currTune->read(myEngine->buf, myEngine->bufSize))
-		return FALSE;
+    if (xs_fload_buffer(pcFilename, &(myEngine->buf), &(myEngine->bufSize)) != 0)
+        return FALSE;
+    
+    if (!myEngine->currTune->read(myEngine->buf, myEngine->bufSize))
+        return FALSE;
 
-	return TRUE;
+    return TRUE;
 }
 
 
 /* Delete INTERNAL information
  */
-void xs_sidplay2_delete(t_xs_status * myStatus)
+void xs_sidplay2_delete(xs_status_t * myStatus)
 {
-	t_xs_sidplay2 *myEngine;
-	assert(myStatus);
+    xs_sidplay2_t *myEngine;
+    assert(myStatus);
 
-	myEngine = (t_xs_sidplay2 *) myStatus->sidEngine;
-	if (!myEngine) return;
-	
-	g_free(myEngine->buf);
-	myEngine->buf = NULL;
-	myEngine->bufSize = 0;
+    myEngine = (xs_sidplay2_t *) myStatus->sidEngine;
+    if (!myEngine) return;
+    
+    g_free(myEngine->buf);
+    myEngine->buf = NULL;
+    myEngine->bufSize = 0;
 }
 
 
 /* Hardware backend flushing
  */
-void xs_sidplay2_flush(t_xs_status * myStatus)
+void xs_sidplay2_flush(xs_status_t * myStatus)
 {
-	assert(myStatus);
+    assert(myStatus);
 
 #ifdef HAVE_HARDSID_BUILDER
 #ifdef HSID_SID2_COM
-	IfPtr<HardSIDBuilder> hs(myStatus->currBuilder);
-	if (hs)
-		hs->flush();
+    IfPtr<HardSIDBuilder> hs(myStatus->currBuilder);
+    if (hs)
+        hs->flush();
 #else
-	if (xs_cfg.sid2Builder == XS_BLD_HARDSID)
-		((HardSIDBuilder *) myStatus->currBuilder)->flush();
+    if (xs_cfg.sid2Builder == XS_BLD_HARDSID)
+        ((HardSIDBuilder *) myStatus->currBuilder)->flush();
 #endif
 #endif
 }
 
 
-}	/* extern "C" */
-#endif	/* HAVE_SIDPLAY2 */
+}    /* extern "C" */
+#endif    /* HAVE_SIDPLAY2 */
--- a/src/sid/xs_sidplay2.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sid/xs_sidplay2.h	Fri Jun 13 05:57:25 2008 +0300
@@ -9,16 +9,16 @@
 extern "C" {
 #endif
 
-gboolean	xs_sidplay2_probe(t_xs_file *);
-void		xs_sidplay2_close(t_xs_status *);
-gboolean	xs_sidplay2_init(t_xs_status *);
-gboolean	xs_sidplay2_initsong(t_xs_status *);
-guint		xs_sidplay2_fillbuffer(t_xs_status *, gchar *, guint);
-gboolean	xs_sidplay2_load(t_xs_status *, gchar *);
-void		xs_sidplay2_delete(t_xs_status *);
-t_xs_tuneinfo*	xs_sidplay2_getinfo(const gchar *);
-gboolean	xs_sidplay2_updateinfo(t_xs_status *);
-void		xs_sidplay2_flush(t_xs_status *);
+gboolean    xs_sidplay2_probe(xs_file_t *);
+void        xs_sidplay2_close(xs_status_t *);
+gboolean    xs_sidplay2_init(xs_status_t *);
+gboolean    xs_sidplay2_initsong(xs_status_t *);
+guint        xs_sidplay2_fillbuffer(xs_status_t *, gchar *, guint);
+gboolean    xs_sidplay2_load(xs_status_t *, gchar *);
+void        xs_sidplay2_delete(xs_status_t *);
+xs_tuneinfo_t*    xs_sidplay2_getinfo(const gchar *);
+gboolean    xs_sidplay2_updateinfo(xs_status_t *);
+void        xs_sidplay2_flush(xs_status_t *);
 
 #ifdef __cplusplus
 }
--- a/src/sid/xs_slsup.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sid/xs_slsup.c	Fri Jun 13 05:57:25 2008 +0300
@@ -24,10 +24,10 @@
 #include "xs_config.h"
 
 
-static t_xs_sldb *xs_sldb_db = NULL;
+static xs_sldb_t *xs_sldb_db = NULL;
 XS_MUTEX(xs_sldb_db);
 
-static t_xs_stildb *xs_stildb_db = NULL;
+static xs_stildb_t *xs_stildb_db = NULL;
 XS_MUTEX(xs_stildb_db);
 
 
@@ -35,92 +35,92 @@
  */
 gint xs_stil_init(void)
 {
-	XS_MUTEX_LOCK(xs_cfg);
+    XS_MUTEX_LOCK(xs_cfg);
 
-	if (!xs_cfg.stilDBPath) {
-		XS_MUTEX_UNLOCK(xs_cfg);
-		return -1;
-	}
+    if (!xs_cfg.stilDBPath) {
+        XS_MUTEX_UNLOCK(xs_cfg);
+        return -1;
+    }
 
-	XS_MUTEX_LOCK(xs_stildb_db);
+    XS_MUTEX_LOCK(xs_stildb_db);
 
-	/* Check if already initialized */
-	if (xs_stildb_db)
-		xs_stildb_free(xs_stildb_db);
+    /* Check if already initialized */
+    if (xs_stildb_db)
+        xs_stildb_free(xs_stildb_db);
 
-	/* Allocate database */
-	xs_stildb_db = (t_xs_stildb *) g_malloc0(sizeof(t_xs_stildb));
-	if (!xs_stildb_db) {
-		XS_MUTEX_UNLOCK(xs_cfg);
-		XS_MUTEX_UNLOCK(xs_stildb_db);
-		return -2;
-	}
+    /* Allocate database */
+    xs_stildb_db = (xs_stildb_t *) g_malloc0(sizeof(xs_stildb_t));
+    if (!xs_stildb_db) {
+        XS_MUTEX_UNLOCK(xs_cfg);
+        XS_MUTEX_UNLOCK(xs_stildb_db);
+        return -2;
+    }
 
-	/* Read the database */
-	if (xs_stildb_read(xs_stildb_db, xs_cfg.stilDBPath) != 0) {
-		xs_stildb_free(xs_stildb_db);
-		xs_stildb_db = NULL;
-		XS_MUTEX_UNLOCK(xs_cfg);
-		XS_MUTEX_UNLOCK(xs_stildb_db);
-		return -3;
-	}
+    /* Read the database */
+    if (xs_stildb_read(xs_stildb_db, xs_cfg.stilDBPath) != 0) {
+        xs_stildb_free(xs_stildb_db);
+        xs_stildb_db = NULL;
+        XS_MUTEX_UNLOCK(xs_cfg);
+        XS_MUTEX_UNLOCK(xs_stildb_db);
+        return -3;
+    }
 
-	/* Create index */
-	if (xs_stildb_index(xs_stildb_db) != 0) {
-		xs_stildb_free(xs_stildb_db);
-		xs_stildb_db = NULL;
-		XS_MUTEX_UNLOCK(xs_cfg);
-		XS_MUTEX_UNLOCK(xs_stildb_db);
-		return -4;
-	}
+    /* Create index */
+    if (xs_stildb_index(xs_stildb_db) != 0) {
+        xs_stildb_free(xs_stildb_db);
+        xs_stildb_db = NULL;
+        XS_MUTEX_UNLOCK(xs_cfg);
+        XS_MUTEX_UNLOCK(xs_stildb_db);
+        return -4;
+    }
 
-	XS_MUTEX_UNLOCK(xs_cfg);
-	XS_MUTEX_UNLOCK(xs_stildb_db);
-	return 0;
+    XS_MUTEX_UNLOCK(xs_cfg);
+    XS_MUTEX_UNLOCK(xs_stildb_db);
+    return 0;
 }
 
 
 void xs_stil_close(void)
 {
-	XS_MUTEX_LOCK(xs_stildb_db);
-	xs_stildb_free(xs_stildb_db);
-	xs_stildb_db = NULL;
-	XS_MUTEX_UNLOCK(xs_stildb_db);
+    XS_MUTEX_LOCK(xs_stildb_db);
+    xs_stildb_free(xs_stildb_db);
+    xs_stildb_db = NULL;
+    XS_MUTEX_UNLOCK(xs_stildb_db);
 }
 
 
-t_xs_stil_node *xs_stil_get(gchar *pcFilename)
+stil_node_t *xs_stil_get(gchar *filename)
 {
-	t_xs_stil_node *pResult;
-	gchar *tmpFilename;
+    stil_node_t *result;
+    gchar *tmpFilename;
 
-	XS_MUTEX_LOCK(xs_stildb_db);
-	XS_MUTEX_LOCK(xs_cfg);
+    XS_MUTEX_LOCK(xs_stildb_db);
+    XS_MUTEX_LOCK(xs_cfg);
 
-	if (xs_cfg.stilDBEnable && xs_stildb_db) {
-		if (xs_cfg.hvscPath) {
-			/* Remove postfixed directory separator from HVSC-path */
-			tmpFilename = xs_strrchr(xs_cfg.hvscPath, '/');
-			if (tmpFilename && (tmpFilename[1] == 0))
-				tmpFilename[0] = 0;
+    if (xs_cfg.stilDBEnable && xs_stildb_db) {
+        if (xs_cfg.hvscPath) {
+            /* Remove postfixed directory separator from HVSC-path */
+            tmpFilename = xs_strrchr(xs_cfg.hvscPath, '/');
+            if (tmpFilename && (tmpFilename[1] == 0))
+                tmpFilename[0] = 0;
 
-			/* Remove HVSC location-prefix from filename */
-			tmpFilename = strstr(pcFilename, xs_cfg.hvscPath);
-			if (tmpFilename)
-				tmpFilename += strlen(xs_cfg.hvscPath);
-			else
-				tmpFilename = pcFilename;
-		} else
-			tmpFilename = pcFilename;
+            /* Remove HVSC location-prefix from filename */
+            tmpFilename = strstr(filename, xs_cfg.hvscPath);
+            if (tmpFilename)
+                tmpFilename += strlen(xs_cfg.hvscPath);
+            else
+                tmpFilename = filename;
+        } else
+            tmpFilename = filename;
 
-		pResult = xs_stildb_get_node(xs_stildb_db, tmpFilename);
-	} else
-		pResult = NULL;
+        result = xs_stildb_get_node(xs_stildb_db, tmpFilename);
+    } else
+        result = NULL;
 
-	XS_MUTEX_UNLOCK(xs_stildb_db);
-	XS_MUTEX_UNLOCK(xs_cfg);
+    XS_MUTEX_UNLOCK(xs_stildb_db);
+    XS_MUTEX_UNLOCK(xs_cfg);
 
-	return pResult;
+    return result;
 }
 
 
@@ -128,160 +128,160 @@
  */
 gint xs_songlen_init(void)
 {
-	XS_MUTEX_LOCK(xs_cfg);
+    XS_MUTEX_LOCK(xs_cfg);
 
-	if (!xs_cfg.songlenDBPath) {
-		XS_MUTEX_UNLOCK(xs_cfg);
-		return -1;
-	}
+    if (!xs_cfg.songlenDBPath) {
+        XS_MUTEX_UNLOCK(xs_cfg);
+        return -1;
+    }
 
-	XS_MUTEX_LOCK(xs_sldb_db);
+    XS_MUTEX_LOCK(xs_sldb_db);
 
-	/* Check if already initialized */
-	if (xs_sldb_db)
-		xs_sldb_free(xs_sldb_db);
+    /* Check if already initialized */
+    if (xs_sldb_db)
+        xs_sldb_free(xs_sldb_db);
 
-	/* Allocate database */
-	xs_sldb_db = (t_xs_sldb *) g_malloc0(sizeof(t_xs_sldb));
-	if (!xs_sldb_db) {
-		XS_MUTEX_UNLOCK(xs_cfg);
-		XS_MUTEX_UNLOCK(xs_sldb_db);
-		return -2;
-	}
+    /* Allocate database */
+    xs_sldb_db = (xs_sldb_t *) g_malloc0(sizeof(xs_sldb_t));
+    if (!xs_sldb_db) {
+        XS_MUTEX_UNLOCK(xs_cfg);
+        XS_MUTEX_UNLOCK(xs_sldb_db);
+        return -2;
+    }
 
-	/* Read the database */
-	if (xs_sldb_read(xs_sldb_db, xs_cfg.songlenDBPath) != 0) {
-		xs_sldb_free(xs_sldb_db);
-		xs_sldb_db = NULL;
-		XS_MUTEX_UNLOCK(xs_cfg);
-		XS_MUTEX_UNLOCK(xs_sldb_db);
-		return -3;
-	}
+    /* Read the database */
+    if (xs_sldb_read(xs_sldb_db, xs_cfg.songlenDBPath) != 0) {
+        xs_sldb_free(xs_sldb_db);
+        xs_sldb_db = NULL;
+        XS_MUTEX_UNLOCK(xs_cfg);
+        XS_MUTEX_UNLOCK(xs_sldb_db);
+        return -3;
+    }
 
-	/* Create index */
-	if (xs_sldb_index(xs_sldb_db) != 0) {
-		xs_sldb_free(xs_sldb_db);
-		xs_sldb_db = NULL;
-		XS_MUTEX_UNLOCK(xs_cfg);
-		XS_MUTEX_UNLOCK(xs_sldb_db);
-		return -4;
-	}
+    /* Create index */
+    if (xs_sldb_index(xs_sldb_db) != 0) {
+        xs_sldb_free(xs_sldb_db);
+        xs_sldb_db = NULL;
+        XS_MUTEX_UNLOCK(xs_cfg);
+        XS_MUTEX_UNLOCK(xs_sldb_db);
+        return -4;
+    }
 
-	XS_MUTEX_UNLOCK(xs_cfg);
-	XS_MUTEX_UNLOCK(xs_sldb_db);
-	return 0;
+    XS_MUTEX_UNLOCK(xs_cfg);
+    XS_MUTEX_UNLOCK(xs_sldb_db);
+    return 0;
 }
 
 
 void xs_songlen_close(void)
 {
-	XS_MUTEX_LOCK(xs_sldb_db);
-	xs_sldb_free(xs_sldb_db);
-	xs_sldb_db = NULL;
-	XS_MUTEX_UNLOCK(xs_sldb_db);
+    XS_MUTEX_LOCK(xs_sldb_db);
+    xs_sldb_free(xs_sldb_db);
+    xs_sldb_db = NULL;
+    XS_MUTEX_UNLOCK(xs_sldb_db);
 }
 
 
-t_xs_sldb_node *xs_songlen_get(const gchar * pcFilename)
+sldb_node_t *xs_songlen_get(const gchar * filename)
 {
-	t_xs_sldb_node *pResult;
+    sldb_node_t *result;
 
-	XS_MUTEX_LOCK(xs_sldb_db);
+    XS_MUTEX_LOCK(xs_sldb_db);
 
-	if (xs_cfg.songlenDBEnable && xs_sldb_db)
-		pResult = xs_sldb_get(xs_sldb_db, pcFilename);
-	else
-		pResult = NULL;
+    if (xs_cfg.songlenDBEnable && xs_sldb_db)
+        result = xs_sldb_get(xs_sldb_db, filename);
+    else
+        result = NULL;
 
-	XS_MUTEX_UNLOCK(xs_sldb_db);
+    XS_MUTEX_UNLOCK(xs_sldb_db);
 
-	return pResult;
+    return result;
 }
 
 
 /* Allocate a new tune information structure
  */
-t_xs_tuneinfo *xs_tuneinfo_new(const gchar * pcFilename,
-		gint nsubTunes, gint startTune, const gchar * sidName,
-		const gchar * sidComposer, const gchar * sidCopyright,
-		gint loadAddr, gint initAddr, gint playAddr,
-		gint dataFileLen, const gchar *sidFormat, gint sidModel)
+xs_tuneinfo_t *xs_tuneinfo_new(const gchar * filename,
+        gint nsubTunes, gint startTune, const gchar * sidName,
+        const gchar * sidComposer, const gchar * sidCopyright,
+        gint loadAddr, gint initAddr, gint playAddr,
+        gint dataFileLen, const gchar *sidFormat, gint sidModel)
 {
-	t_xs_tuneinfo *pResult;
-	t_xs_sldb_node *tmpLength;
-	gint i;
+    xs_tuneinfo_t *result;
+    sldb_node_t *tmpLength;
+    gint i;
 
-	/* Allocate structure */
-	pResult = (t_xs_tuneinfo *) g_malloc0(sizeof(t_xs_tuneinfo));
-	if (!pResult) {
-		xs_error(_("Could not allocate memory for t_xs_tuneinfo ('%s')\n"),
-			pcFilename);
-		return NULL;
-	}
+    /* Allocate structure */
+    result = (xs_tuneinfo_t *) g_malloc0(sizeof(xs_tuneinfo_t));
+    if (!result) {
+        xs_error("Could not allocate memory for tuneinfo ('%s')\n",
+            filename);
+        return NULL;
+    }
 
-	pResult->sidFilename = XS_CS_FILENAME(pcFilename);
-	if (!pResult->sidFilename) {
-		xs_error(_("Could not allocate sidFilename ('%s')\n"),
-			pcFilename);
-		g_free(pResult);
-		return NULL;
-	}
+    result->sidFilename = XS_CS_FILENAME(filename);
+    if (!result->sidFilename) {
+        xs_error("Could not allocate sidFilename ('%s')\n",
+            filename);
+        g_free(result);
+        return NULL;
+    }
 
-	/* Allocate space for subtune information */
-	pResult->subTunes = g_malloc0(sizeof(t_xs_subtuneinfo) * (nsubTunes + 1));
-	if (!pResult->subTunes) {
-		xs_error(_("Could not allocate memory for t_xs_subtuneinfo ('%s', %i)\n"),
-			pcFilename, nsubTunes);
+    /* Allocate space for subtune information */
+    result->subTunes = g_malloc0(sizeof(xs_subtuneinfo_t) * (nsubTunes + 1));
+    if (!result->subTunes) {
+        xs_error("Could not allocate memory for subtuneinfo ('%s', %i)\n",
+            filename, nsubTunes);
 
-		g_free(pResult->sidFilename);
-		g_free(pResult);
-		return NULL;
-	}
+        g_free(result->sidFilename);
+        g_free(result);
+        return NULL;
+    }
 
-	/* The following allocations don't matter if they fail */
-	pResult->sidName = XS_CS_SID(sidName);
-	pResult->sidComposer = XS_CS_SID(sidComposer);
-	pResult->sidCopyright = XS_CS_SID(sidCopyright);
+    /* The following allocations don't matter if they fail */
+    result->sidName = XS_CS_SID(sidName);
+    result->sidComposer = XS_CS_SID(sidComposer);
+    result->sidCopyright = XS_CS_SID(sidCopyright);
 
-	pResult->nsubTunes = nsubTunes;
-	pResult->startTune = startTune;
+    result->nsubTunes = nsubTunes;
+    result->startTune = startTune;
 
-	pResult->loadAddr = loadAddr;
-	pResult->initAddr = initAddr;
-	pResult->playAddr = playAddr;
-	pResult->dataFileLen = dataFileLen;
-	pResult->sidFormat = XS_CS_SID(sidFormat);
-	
-	pResult->sidModel = sidModel;
+    result->loadAddr = loadAddr;
+    result->initAddr = initAddr;
+    result->playAddr = playAddr;
+    result->dataFileLen = dataFileLen;
+    result->sidFormat = XS_CS_SID(sidFormat);
+    
+    result->sidModel = sidModel;
 
-	/* Get length information (NOTE: Do not free this!) */
-	tmpLength = xs_songlen_get(pcFilename);
-	
-	/* Fill in sub-tune information */
-	for (i = 0; i < pResult->nsubTunes; i++) {
-		if (tmpLength && (i < tmpLength->nLengths))
-			pResult->subTunes[i].tuneLength = tmpLength->sLengths[i];
-		else
-			pResult->subTunes[i].tuneLength = -1;
-		
-		pResult->subTunes[i].tuneSpeed = -1;
-	}
-	
-	return pResult;
+    /* Get length information (NOTE: Do not free this!) */
+    tmpLength = xs_songlen_get(filename);
+    
+    /* Fill in sub-tune information */
+    for (i = 0; i < result->nsubTunes; i++) {
+        if (tmpLength && (i < tmpLength->nlengths))
+            result->subTunes[i].tuneLength = tmpLength->lengths[i];
+        else
+            result->subTunes[i].tuneLength = -1;
+        
+        result->subTunes[i].tuneSpeed = -1;
+    }
+    
+    return result;
 }
 
 
 /* Free given tune information structure
  */
-void xs_tuneinfo_free(t_xs_tuneinfo * pTune)
+void xs_tuneinfo_free(xs_tuneinfo_t * tune)
 {
-	if (!pTune) return;
+    if (!tune) return;
 
-	g_free(pTune->subTunes);
-	g_free(pTune->sidFilename);
-	g_free(pTune->sidName);
-	g_free(pTune->sidComposer);
-	g_free(pTune->sidCopyright);
-	g_free(pTune->sidFormat);
-	g_free(pTune);
+    g_free(tune->subTunes);
+    g_free(tune->sidFilename);
+    g_free(tune->sidName);
+    g_free(tune->sidComposer);
+    g_free(tune->sidCopyright);
+    g_free(tune->sidFormat);
+    g_free(tune);
 }
--- a/src/sid/xs_slsup.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sid/xs_slsup.h	Fri Jun 13 05:57:25 2008 +0300
@@ -9,20 +9,20 @@
 extern "C" {
 #endif
 
-gint		xs_stil_init(void);
-void		xs_stil_close(void);
-t_xs_stil_node *xs_stil_get(gchar *pcFilename);
+gint        xs_stil_init(void);
+void        xs_stil_close(void);
+stil_node_t *xs_stil_get(gchar *filename);
 
-gint		xs_songlen_init(void);
-void		xs_songlen_close(void);
-t_xs_sldb_node *xs_songlen_get(const gchar *);
+gint        xs_songlen_init(void);
+void        xs_songlen_close(void);
+sldb_node_t *xs_songlen_get(const gchar *);
 
-t_xs_tuneinfo *xs_tuneinfo_new(const gchar * pcFilename,
-		gint nsubTunes, gint startTune, const gchar * sidName,
-		const gchar * sidComposer, const gchar * sidCopyright,
-		gint loadAddr, gint initAddr, gint playAddr,
-		gint dataFileLen, const gchar *sidFormat, gint sidModel);
-void	xs_tuneinfo_free(t_xs_tuneinfo *);
+xs_tuneinfo_t *xs_tuneinfo_new(const gchar * pcFilename,
+            gint nsubTunes, gint startTune, const gchar * sidName,
+            const gchar * sidComposer, const gchar * sidCopyright,
+            gint loadAddr, gint initAddr, gint playAddr,
+            gint dataFileLen, const gchar *sidFormat, gint sidModel);
+void        xs_tuneinfo_free(xs_tuneinfo_t *);
 
 
 #ifdef __cplusplus
--- a/src/sid/xs_stil.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sid/xs_stil.c	Fri Jun 13 05:57:25 2008 +0300
@@ -30,405 +30,402 @@
 
 /* Database handling functions
  */
-static gboolean xs_stildb_node_realloc(t_xs_stil_node *pNode, gint nsubTunes)
+static gboolean xs_stildb_node_realloc(stil_node_t *node, gint nsubTunes)
 {
-	if (!pNode) return FALSE;
+    if (!node) return FALSE;
 
-	/* Re-allocate subTune structure if needed */
-	if (nsubTunes > pNode->nsubTunes) {
-		gint clearIndex, clearLength;
-		
-		pNode->subTunes =
-			(t_xs_stil_subnode **) g_realloc(pNode->subTunes,
-			(nsubTunes + 1) * sizeof(t_xs_stil_subnode **));
+    /* Re-allocate subTune structure if needed */
+    if (nsubTunes > node->nsubTunes) {
+        gint clearIndex, clearLength;
+        
+        node->subTunes =
+            (stil_subnode_t **) g_realloc(node->subTunes,
+            (nsubTunes + 1) * sizeof(stil_subnode_t **));
 
-		if (!pNode->subTunes) {
-			xs_error(_("SubTune pointer structure realloc failed.\n"));
-			return FALSE;
-		}
-		
-		/* Clear the newly allocated memory */
-		if (pNode->nsubTunes == 0) {
-			clearIndex = 0;
-			clearLength = nsubTunes + 1;
-		} else {
-			clearIndex = pNode->nsubTunes + 1;
-			clearLength = (nsubTunes - clearIndex + 1);
-		}
-		memset(&(pNode->subTunes[clearIndex]), 0, clearLength * sizeof(t_xs_stil_subnode **));
-		
-		pNode->nsubTunes = nsubTunes;
-	}
+        if (!node->subTunes) {
+            xs_error("SubTune pointer structure realloc failed.\n");
+            return FALSE;
+        }
+        
+        /* Clear the newly allocated memory */
+        if (node->nsubTunes == 0) {
+            clearIndex = 0;
+            clearLength = nsubTunes + 1;
+        } else {
+            clearIndex = node->nsubTunes + 1;
+            clearLength = (nsubTunes - clearIndex + 1);
+        }
+        memset(&(node->subTunes[clearIndex]), 0, clearLength * sizeof(stil_subnode_t **));
+        
+        node->nsubTunes = nsubTunes;
+    }
 
-	/* Allocate memory for subTune */
-	if (!pNode->subTunes[nsubTunes]) {
-		pNode->subTunes[nsubTunes] = (t_xs_stil_subnode *)
-			g_malloc0(sizeof(t_xs_stil_subnode));
-		
-		if (!pNode->subTunes[nsubTunes]) {
-			xs_error(_("SubTune structure malloc failed!\n"));
-			return FALSE;
-		}
-	}
+    /* Allocate memory for subTune */
+    if (!node->subTunes[nsubTunes]) {
+        node->subTunes[nsubTunes] = (stil_subnode_t *)
+            g_malloc0(sizeof(stil_subnode_t));
+        
+        if (!node->subTunes[nsubTunes]) {
+            xs_error("SubTune structure malloc failed!\n");
+            return FALSE;
+        }
+    }
 
-	return TRUE;
+    return TRUE;
 }
 
 
-static void xs_stildb_node_free(t_xs_stil_node *pNode)
+static void xs_stildb_node_free(stil_node_t *node)
 {
-	gint i;
-	t_xs_stil_subnode *pSub;
+    gint i;
+    stil_subnode_t *subnode;
+
+    if (!node) return;
 
-	if (pNode) {
-		/* Free subtune information */
-		for (i = 0; i <= pNode->nsubTunes; i++) {
-			pSub = pNode->subTunes[i];
-			if (pSub) {
-				g_free(pSub->pName);
-				g_free(pSub->pAuthor);
-				g_free(pSub->pInfo);
-				g_free(pSub->pTitle);
-
-				g_free(pSub);
-			}
-		}
-		
-		g_free(pNode->subTunes);
-		g_free(pNode->pcFilename);
-		g_free(pNode);
-	}
+    /* Free subtune information */
+    for (i = 0; i <= node->nsubTunes; i++) {
+        subnode = node->subTunes[i];
+        if (subnode) {
+            g_free(subnode->name);
+            g_free(subnode->author);
+            g_free(subnode->info);
+            g_free(subnode->title);
+            g_free(subnode);
+        }
+    }
+    g_free(node->subTunes);
+    g_free(node->filename);
+    g_free(node);
 }
 
 
-static t_xs_stil_node *xs_stildb_node_new(gchar *pcFilename)
+static stil_node_t *xs_stildb_node_new(gchar *filename)
 {
-	t_xs_stil_node *pResult;
+    stil_node_t *result;
 
-	/* Allocate memory for new node */
-	pResult = (t_xs_stil_node *) g_malloc0(sizeof(t_xs_stil_node));
-	if (!pResult)
-		return NULL;
+    /* Allocate memory for new node */
+    result = (stil_node_t *) g_malloc0(sizeof(stil_node_t));
+    if (!result)
+        return NULL;
 
-	/* Allocate filename and initial space for one subtune */
-	pResult->pcFilename = g_strdup(pcFilename);
-	if (!pResult->pcFilename || !xs_stildb_node_realloc(pResult, 1)) {
-		xs_stildb_node_free(pResult);
-		return NULL;
-	}
-	
-	return pResult;
+    /* Allocate filename and initial space for one subtune */
+    result->filename = g_strdup(filename);
+    if (!result->filename || !xs_stildb_node_realloc(result, 1)) {
+        xs_stildb_node_free(result);
+        return NULL;
+    }
+    
+    return result;
 }
 
 
 /* Insert given node to db linked list
  */
-static void xs_stildb_node_insert(t_xs_stildb *db, t_xs_stil_node *pNode)
+static void xs_stildb_node_insert(xs_stildb_t *db, stil_node_t *node)
 {
-	assert(db);
+    assert(db != NULL);
 
-	if (db->pNodes) {
-		/* The first node's pPrev points to last node */
-		LPREV = db->pNodes->pPrev;	/* New node's prev = Previous last node */
-		db->pNodes->pPrev->pNext = pNode;	/* Previous last node's next = New node */
-		db->pNodes->pPrev = pNode;	/* New last node = New node */
-		LNEXT = NULL;	/* But next is NULL! */
-	} else {
-		db->pNodes = pNode;	/* First node ... */
-		LPREV = pNode;	/* ... it's also last */
-		LNEXT = NULL;	/* But next is NULL! */
-	}
+    if (db->nodes) {
+        /* The first node's pPrev points to last node */
+        LPREV = db->nodes->prev;    /* New node's prev = Previous last node */
+        db->nodes->prev->next = node;    /* Previous last node's next = New node */
+        db->nodes->prev = node;    /* New last node = New node */
+        LNEXT = NULL;    /* But next is NULL! */
+    } else {
+        db->nodes = node;    /* First node ... */
+        LPREV = node;    /* ... it's also last */
+        LNEXT = NULL;    /* But next is NULL! */
+    }
 }
 
 
 /* Read database (additively) to given db-structure
  */
-#define XS_STILDB_MULTI							\
-	if (isMulti) {							\
-		isMulti = FALSE;					\
-		xs_pstrcat(&(tmpNode->subTunes[subEntry]->pInfo), "\n");\
-	}
+#define XS_STILDB_MULTI                            \
+    if (isMulti) {                            \
+        isMulti = FALSE;                    \
+        xs_pstrcat(&(tmnode->subTunes[subEntry]->info), "\n");\
+    }
 
 static void XS_STILDB_ERR(gint lineNum, gchar *inLine, const char *fmt, ...)
 {
-	va_list ap;
+    va_list ap;
 
-	va_start(ap, fmt);
-	xs_error(fmt, ap);
-	va_end(ap);
-	
-	fprintf(stderr, "#%d: '%s'\n", lineNum, inLine);
+    va_start(ap, fmt);
+    xs_error(fmt, ap);
+    va_end(ap);
+    
+    fprintf(stderr, "#%d: '%s'\n", lineNum, inLine);
 }
 
-gint xs_stildb_read(t_xs_stildb *db, gchar *dbFilename)
+gint xs_stildb_read(xs_stildb_t *db, gchar *dbFilename)
 {
-	FILE *inFile;
-	gchar inLine[XS_BUF_SIZE + 16];	/* Since we add some chars here and there */
-	size_t lineNum;
-	t_xs_stil_node *tmpNode;
-	gboolean isError, isMulti;
-	gint subEntry;
-	gchar *tmpLine = inLine;
-	assert(db);
+    FILE *inFile;
+    gchar inLine[XS_BUF_SIZE + 16];    /* Since we add some chars here and there */
+    size_t lineNum;
+    stil_node_t *tmnode;
+    gboolean isError, isMulti;
+    gint subEntry;
+    gchar *tmpLine = inLine;
+    assert(db != NULL);
 
-	/* Try to open the file */
-	if ((inFile = fopen(dbFilename, "ra")) == NULL) {
-		xs_error(_("Could not open STILDB '%s'\n"),
-			dbFilename);
-		return -1;
-	}
+    /* Try to open the file */
+    if ((inFile = fopen(dbFilename, "ra")) == NULL) {
+        xs_error("Could not open STILDB '%s'\n", dbFilename);
+        return -1;
+    }
 
-	/* Read and parse the data */
-	lineNum = 0;
-	isError = FALSE;
-	isMulti = FALSE;
-	tmpNode = NULL;
-	subEntry = 0;
+    /* Read and parse the data */
+    lineNum = 0;
+    isError = FALSE;
+    isMulti = FALSE;
+    tmnode = NULL;
+    subEntry = 0;
 
-	while (!isError && fgets(inLine, XS_BUF_SIZE, inFile) != NULL) {
-		size_t linePos = 0, eolPos = 0;
-		xs_findeol(inLine, &eolPos);
-		inLine[eolPos] = 0;
-		lineNum++;
-		
-		tmpLine = XS_CS_STIL(inLine);
+    while (!isError && fgets(inLine, XS_BUF_SIZE, inFile) != NULL) {
+        size_t linePos = 0, eolPos = 0;
+        xs_findeol(inLine, &eolPos);
+        inLine[eolPos] = 0;
+        lineNum++;
+        
+        tmpLine = XS_CS_STIL(inLine);
 
-		switch (tmpLine[0]) {
-		case '/':
-			/* Check if we are already parsing entry */
-			isMulti = FALSE;
-			if (tmpNode) {
-				XS_STILDB_ERR(lineNum, tmpLine,
-					"New entry found before end of current ('%s')!\n",
-					tmpNode->pcFilename);
-				xs_stildb_node_free(tmpNode);
-			}
+        switch (tmpLine[0]) {
+        case '/':
+            /* Check if we are already parsing entry */
+            isMulti = FALSE;
+            if (tmnode) {
+                XS_STILDB_ERR(lineNum, tmpLine,
+                    "New entry found before end of current ('%s')!\n",
+                    tmnode->filename);
+                xs_stildb_node_free(tmnode);
+            }
 
-			/* A new node */
-			subEntry = 0;
-			tmpNode = xs_stildb_node_new(tmpLine);
-			if (!tmpNode) {
-				/* Allocation failed */
-				XS_STILDB_ERR(lineNum, tmpLine,
-					"Could not allocate new STILdb-node!\n");
-				isError = TRUE;
-			}
-			break;
+            /* A new node */
+            subEntry = 0;
+            tmnode = xs_stildb_node_new(tmpLine);
+            if (!tmnode) {
+                /* Allocation failed */
+                XS_STILDB_ERR(lineNum, tmpLine,
+                    "Could not allocate new STILdb-node!\n");
+                isError = TRUE;
+            }
+            break;
 
-		case '(':
-			/* A new sub-entry */
-			isMulti = FALSE;
-			linePos++;
-			if (tmpLine[linePos] == '#') {
-				linePos++;
-				if (isdigit(tmpLine[linePos])) {
-					size_t savePos = linePos;
-					xs_findnum(tmpLine, &linePos);
-					tmpLine[linePos] = 0;
-					subEntry = atol(&tmpLine[savePos]);
+        case '(':
+            /* A new sub-entry */
+            isMulti = FALSE;
+            linePos++;
+            if (tmpLine[linePos] == '#') {
+                linePos++;
+                if (isdigit(tmpLine[linePos])) {
+                    size_t savePos = linePos;
+                    xs_findnum(tmpLine, &linePos);
+                    tmpLine[linePos] = 0;
+                    subEntry = atol(&tmpLine[savePos]);
 
-					/* Sanity check */
-					if (subEntry < 1) {
-						XS_STILDB_ERR(lineNum, tmpLine,
-							"Number of subEntry (%i) for '%s' is invalid\n",
-							subEntry, tmpNode->pcFilename);
-						subEntry = 0;
-					}
-				} else {
-					XS_STILDB_ERR(lineNum, tmpLine,
-						"Syntax error, expected subEntry number.\n");
-					subEntry = 0;
-				}
-			} else {
-				XS_STILDB_ERR(lineNum, tmpLine,
-					"Syntax error, expected '#' before subEntry number.\n");
-				subEntry = 0;
-			}
+                    /* Sanity check */
+                    if (subEntry < 1) {
+                        XS_STILDB_ERR(lineNum, tmpLine,
+                            "Number of subEntry (%i) for '%s' is invalid\n",
+                            subEntry, tmnode ? tmnode->filename : "");
+                        subEntry = 0;
+                    }
+                } else {
+                    XS_STILDB_ERR(lineNum, tmpLine,
+                        "Syntax error, expected subEntry number.\n");
+                    subEntry = 0;
+                }
+            } else {
+                XS_STILDB_ERR(lineNum, tmpLine,
+                    "Syntax error, expected '#' before subEntry number.\n");
+                subEntry = 0;
+            }
 
-			break;
+            break;
 
-		case 0:
-		case '#':
-		case '\n':
-		case '\r':
-			/* End of entry/field */
-			isMulti = FALSE;
-			if (tmpNode) {
-				/* Insert to database */
-				xs_stildb_node_insert(db, tmpNode);
-				tmpNode = NULL;
-			}
-			break;
+        case 0:
+        case '#':
+        case '\n':
+        case '\r':
+            /* End of entry/field */
+            isMulti = FALSE;
+            if (tmnode) {
+                /* Insert to database */
+                xs_stildb_node_insert(db, tmnode);
+                tmnode = NULL;
+            }
+            break;
 
-		default:
-			/* Check if we are parsing an entry */
-			xs_findnext(tmpLine, &linePos);
-			
-			if (!tmpNode) {
-				XS_STILDB_ERR(lineNum, tmpLine,
-					"Entry data encountered outside of entry or syntax error!\n");
-				break;
-			}
+        default:
+            /* Check if we are parsing an entry */
+            xs_findnext(tmpLine, &linePos);
+            
+            if (!tmnode) {
+                XS_STILDB_ERR(lineNum, tmpLine,
+                    "Entry data encountered outside of entry or syntax error!\n");
+                break;
+            }
 
-			if (!xs_stildb_node_realloc(tmpNode, subEntry)) {
-				XS_STILDB_ERR(lineNum, tmpLine,
-					"Could not (re)allocate memory for subEntries!\n");
-				isError = TRUE;
-				break;
-			}
-			
-			/* Some other type */
-			if (strncmp(tmpLine, "   NAME:", 8) == 0) {
-				XS_STILDB_MULTI;
-				g_free(tmpNode->subTunes[subEntry]->pName);
-				tmpNode->subTunes[subEntry]->pName = g_strdup(&tmpLine[9]);
-			} else if (strncmp(tmpLine, "  TITLE:", 8) == 0) {
-				XS_STILDB_MULTI;
-				isMulti = TRUE;
-				if (!tmpNode->subTunes[subEntry]->pTitle)
-					tmpNode->subTunes[subEntry]->pTitle = g_strdup(&tmpLine[9]);
-				xs_pstrcat(&(tmpNode->subTunes[subEntry]->pInfo), &tmpLine[2]);
-			} else if (strncmp(tmpLine, " AUTHOR:", 8) == 0) {
-				XS_STILDB_MULTI;
-				g_free(tmpNode->subTunes[subEntry]->pAuthor);
-				tmpNode->subTunes[subEntry]->pAuthor = g_strdup(&tmpLine[9]);
-			} else if (strncmp(tmpLine, " ARTIST:", 8) == 0) {
-				XS_STILDB_MULTI;
-				isMulti = TRUE;
-				xs_pstrcat(&(tmpNode->subTunes[subEntry]->pInfo), &tmpLine[1]);
-			} else if (strncmp(tmpLine, "COMMENT:", 8) == 0) {
-				XS_STILDB_MULTI;
-				isMulti = TRUE;
-				xs_pstrcat(&(tmpNode->subTunes[subEntry]->pInfo), tmpLine);
-			} else {
-				if (isMulti) {
-					xs_pstrcat(&(tmpNode->subTunes[subEntry]->pInfo), " ");
-					xs_pstrcat(&(tmpNode->subTunes[subEntry]->pInfo), &tmpLine[linePos]);
-				} else {
-					XS_STILDB_ERR(lineNum, tmpLine,
-					"Entry continuation found when isMulti == FALSE.\n");
-				}
-			}
-			break;
-		}
-		
-		XS_CS_FREE(tmpLine);
+            if (!xs_stildb_node_realloc(tmnode, subEntry)) {
+                XS_STILDB_ERR(lineNum, tmpLine,
+                    "Could not (re)allocate memory for subEntries!\n");
+                isError = TRUE;
+                break;
+            }
+            
+            /* Some other type */
+            if (strncmp(tmpLine, "   NAME:", 8) == 0) {
+                XS_STILDB_MULTI;
+                g_free(tmnode->subTunes[subEntry]->name);
+                tmnode->subTunes[subEntry]->name = g_strdup(&tmpLine[9]);
+            } else if (strncmp(tmpLine, "  TITLE:", 8) == 0) {
+                XS_STILDB_MULTI;
+                isMulti = TRUE;
+                if (!tmnode->subTunes[subEntry]->title)
+                    tmnode->subTunes[subEntry]->title = g_strdup(&tmpLine[9]);
+                xs_pstrcat(&(tmnode->subTunes[subEntry]->info), &tmpLine[2]);
+            } else if (strncmp(tmpLine, " AUTHOR:", 8) == 0) {
+                XS_STILDB_MULTI;
+                g_free(tmnode->subTunes[subEntry]->author);
+                tmnode->subTunes[subEntry]->author = g_strdup(&tmpLine[9]);
+            } else if (strncmp(tmpLine, " ARTIST:", 8) == 0) {
+                XS_STILDB_MULTI;
+                isMulti = TRUE;
+                xs_pstrcat(&(tmnode->subTunes[subEntry]->info), &tmpLine[1]);
+            } else if (strncmp(tmpLine, "COMMENT:", 8) == 0) {
+                XS_STILDB_MULTI;
+                isMulti = TRUE;
+                xs_pstrcat(&(tmnode->subTunes[subEntry]->info), tmpLine);
+            } else {
+                if (isMulti) {
+                    xs_pstrcat(&(tmnode->subTunes[subEntry]->info), " ");
+                    xs_pstrcat(&(tmnode->subTunes[subEntry]->info), &tmpLine[linePos]);
+                } else {
+                    XS_STILDB_ERR(lineNum, tmpLine,
+                    "Entry continuation found when isMulti == FALSE.\n");
+                }
+            }
+            break;
+        }
+        
+        XS_CS_FREE(tmpLine);
 
-	} /* while */
+    } /* while */
 
-	/* Check if there is one remaining node */
-	if (tmpNode)
-		xs_stildb_node_insert(db, tmpNode);
+    /* Check if there is one remaining node */
+    if (tmnode)
+        xs_stildb_node_insert(db, tmnode);
 
-	/* Close the file */
-	fclose(inFile);
+    /* Close the file */
+    fclose(inFile);
 
-	return 0;
+    return 0;
 }
 
 
 /* Compare two nodes
  */
-static gint xs_stildb_cmp(const void *pNode1, const void *pNode2)
+static gint xs_stildb_cmp(const void *node1, const void *node2)
 {
-	/* We assume here that we never ever get NULL-pointers or similar */
-	return strcmp(
-		(*(t_xs_stil_node **) pNode1)->pcFilename,
-		(*(t_xs_stil_node **) pNode2)->pcFilename);
+    /* We assume here that we never ever get NULL-pointers or similar */
+    return strcmp(
+        (*(stil_node_t **) node1)->filename,
+        (*(stil_node_t **) node2)->filename);
 }
 
 
 /* (Re)create index
  */
-gint xs_stildb_index(t_xs_stildb *db)
+gint xs_stildb_index(xs_stildb_t *db)
 {
-	t_xs_stil_node *pCurr;
-	size_t i;
+    stil_node_t *curr;
+    size_t i;
 
-	/* Free old index */
-	if (db->ppIndex) {
-		g_free(db->ppIndex);
-		db->ppIndex = NULL;
-	}
+    /* Free old index */
+    if (db->pindex) {
+        g_free(db->pindex);
+        db->pindex = NULL;
+    }
 
-	/* Get size of db */
-	pCurr = db->pNodes;
-	db->n = 0;
-	while (pCurr) {
-		db->n++;
-		pCurr = pCurr->pNext;
-	}
+    /* Get size of db */
+    curr = db->nodes;
+    db->n = 0;
+    while (curr) {
+        db->n++;
+        curr = curr->next;
+    }
 
-	/* Check number of nodes */
-	if (db->n > 0) {
-		/* Allocate memory for index-table */
-		db->ppIndex = (t_xs_stil_node **) g_malloc(sizeof(t_xs_stil_node *) * db->n);
-		if (!db->ppIndex)
-			return -1;
+    /* Check number of nodes */
+    if (db->n > 0) {
+        /* Allocate memory for index-table */
+        db->pindex = (stil_node_t **) g_malloc(sizeof(stil_node_t *) * db->n);
+        if (!db->pindex)
+            return -1;
 
-		/* Get node-pointers to table */
-		i = 0;
-		pCurr = db->pNodes;
-		while (pCurr && (i < db->n)) {
-			db->ppIndex[i++] = pCurr;
-			pCurr = pCurr->pNext;
-		}
+        /* Get node-pointers to table */
+        i = 0;
+        curr = db->nodes;
+        while (curr && (i < db->n)) {
+            db->pindex[i++] = curr;
+            curr = curr->next;
+        }
 
-		/* Sort the indexes */
-		qsort(db->ppIndex, db->n, sizeof(t_xs_stil_node *), xs_stildb_cmp);
-	}
+        /* Sort the indexes */
+        qsort(db->pindex, db->n, sizeof(stil_node_t *), xs_stildb_cmp);
+    }
 
-	return 0;
+    return 0;
 }
 
 
 /* Free a given STIL database
  */
-void xs_stildb_free(t_xs_stildb *db)
+void xs_stildb_free(xs_stildb_t *db)
 {
-	t_xs_stil_node *pCurr, *pNext;
+    stil_node_t *curr, *next;
 
-	if (!db)
-		return;
+    if (!db)
+        return;
 
-	/* Free the memory allocated for nodes */
-	pCurr = db->pNodes;
-	while (pCurr) {
-		pNext = pCurr->pNext;
-		xs_stildb_node_free(pCurr);
-		pCurr = pNext;
-	}
+    /* Free the memory allocated for nodes */
+    curr = db->nodes;
+    while (curr) {
+        next = curr->next;
+        xs_stildb_node_free(curr);
+        curr = next;
+    }
 
-	db->pNodes = NULL;
+    db->nodes = NULL;
 
-	/* Free memory allocated for index */
-	if (db->ppIndex) {
-		g_free(db->ppIndex);
-		db->ppIndex = NULL;
-	}
+    /* Free memory allocated for index */
+    if (db->pindex) {
+        g_free(db->pindex);
+        db->pindex = NULL;
+    }
 
-	/* Free structure */
-	db->n = 0;
-	g_free(db);
+    /* Free structure */
+    db->n = 0;
+    g_free(db);
 }
 
 
 /* Get STIL information node from database
  */
-t_xs_stil_node *xs_stildb_get_node(t_xs_stildb *db, gchar *pcFilename)
+stil_node_t *xs_stildb_get_node(xs_stildb_t *db, gchar *filename)
 {
-	t_xs_stil_node keyItem, *key, **item;
+    stil_node_t keyItem, *key, **item;
 
-	/* Check the database pointers */
-	if (!db || !db->pNodes || !db->ppIndex)
-		return NULL;
+    /* Check the database pointers */
+    if (!db || !db->nodes || !db->pindex)
+        return NULL;
 
-	/* Look-up index using binary search */
-	keyItem.pcFilename = pcFilename;
-	key = &keyItem;
-	item = bsearch(&key, db->ppIndex, db->n, sizeof(t_xs_stil_node *), xs_stildb_cmp);
-	if (item)
-		return *item;
-	else
-		return NULL;
+    /* Look-up index using binary search */
+    keyItem.filename = filename;
+    key = &keyItem;
+    item = bsearch(&key, db->pindex, db->n, sizeof(stil_node_t *), xs_stildb_cmp);
+    if (item)
+        return *item;
+    else
+        return NULL;
 }
--- a/src/sid/xs_stil.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sid/xs_stil.h	Fri Jun 13 05:57:25 2008 +0300
@@ -10,35 +10,34 @@
 /* Types
  */
 typedef struct {
-	gchar	*pName,
-		*pAuthor,
-		*pTitle,
-		*pInfo;
-} t_xs_stil_subnode;
+    gchar *name,
+          *author,
+          *title,
+          *info;
+} stil_subnode_t;
 
 
-typedef struct _t_xs_stil_node {
-	gchar			*pcFilename;
-	gint			nsubTunes;
-	t_xs_stil_subnode	**subTunes;
-	
-	struct _t_xs_stil_node	*pPrev, *pNext;
-} t_xs_stil_node;
+typedef struct _stil_node_t {
+    gchar               *filename;
+    gint                nsubTunes;
+    stil_subnode_t      **subTunes;
+    struct _stil_node_t *prev, *next;
+} stil_node_t;
 
 
 typedef struct {
-	t_xs_stil_node	*pNodes,
-			**ppIndex;
-	size_t		n;
-} t_xs_stildb;
+    stil_node_t *nodes,
+                **pindex;
+    size_t      n;
+} xs_stildb_t;
 
 
 /* Functions
  */
-gint			xs_stildb_read(t_xs_stildb *, gchar *);
-gint			xs_stildb_index(t_xs_stildb *);
-void			xs_stildb_free(t_xs_stildb *);
-t_xs_stil_node *	xs_stildb_get_node(t_xs_stildb *, gchar *);
+gint            xs_stildb_read(xs_stildb_t *, gchar *);
+gint            xs_stildb_index(xs_stildb_t *);
+void            xs_stildb_free(xs_stildb_t *);
+stil_node_t *   xs_stildb_get_node(xs_stildb_t *, gchar *);
 
 #ifdef __cplusplus
 }
--- a/src/sid/xs_support.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sid/xs_support.c	Fri Jun 13 05:57:25 2008 +0300
@@ -24,277 +24,222 @@
 #include <ctype.h>
 
 
-#ifndef __AUDACIOUS_NEWVFS__
-/* File handling
- */
-t_xs_file *xs_fopen(const gchar *path, const gchar *mode)
-{
-	return fopen(path, mode);
-}
-
-
-gint xs_fclose(t_xs_file *f)
+guint16 xs_fread_be16(xs_file_t *f)
 {
-	return fclose(f);
-}
-
-
-gint xs_fgetc(t_xs_file *f)
-{
-	return fgetc(f);
-}
-
-
-size_t xs_fread(void *p, size_t s, size_t n, t_xs_file *f)
-{
-	return fread(p, s, n, f);
+    return (((guint16) xs_fgetc(f)) << 8) | ((guint16) xs_fgetc(f));
 }
 
 
-gint xs_feof(t_xs_file *f)
-{
-	return feof(f);
-}
-
-
-gint xs_ferror(t_xs_file *f)
-{
-	return ferror(f);
-}
-
-
-glong xs_ftell(t_xs_file *f)
+guint32 xs_fread_be32(xs_file_t *f)
 {
-	return ftell(f);
-}
-
-
-gint xs_fseek(t_xs_file *f, glong o, gint w)
-{
-	return fseek(f, o, w);
-}
-#endif
-
-
-guint16 xs_fread_be16(t_xs_file *f)
-{
-	return (((guint16) xs_fgetc(f)) << 8) | ((guint16) xs_fgetc(f));
-}
-
-
-guint32 xs_fread_be32(t_xs_file *f)
-{
-	return (((guint32) xs_fgetc(f)) << 24) |
-		(((guint32) xs_fgetc(f)) << 16) |
-		(((guint32) xs_fgetc(f)) << 8) |
-		((guint32) xs_fgetc(f));
+    return (((guint32) xs_fgetc(f)) << 24) |
+        (((guint32) xs_fgetc(f)) << 16) |
+        (((guint32) xs_fgetc(f)) << 8) |
+        ((guint32) xs_fgetc(f));
 }
 
 
 /* Load a file to a buffer, return 0 on success, negative value on error
  */
-gint xs_fload_buffer(const gchar *pcFilename, guint8 **buf, size_t *bufSize)
+gint xs_fload_buffer(const gchar *filename, guint8 **buf, size_t *bufSize)
 {
-	t_xs_file *f;
-	glong seekPos;
-	
-	/* Open file, get file size */
-	if ((f = xs_fopen(pcFilename, "rb")) == NULL)
-		return -1;
+    xs_file_t *f;
+    glong seekPos;
+    
+    /* Open file, get file size */
+    if ((f = xs_fopen(filename, "rb")) == NULL)
+        return -1;
 
-	xs_fseek(f, 0, SEEK_END);
-	seekPos = xs_ftell(f);
-	
-	if (seekPos > 0) {
-		size_t readSize = seekPos;
-		if (readSize >= *bufSize || *buf == NULL) {
-			/* Only re-allocate if the required size > current */
-			if (*buf != NULL) {
-				g_free(*buf);
-				*buf = NULL;
-			}
-	
-			*bufSize = seekPos;
-			
-			*buf = (guint8 *) g_malloc(*bufSize * sizeof(guint8));
-			if (*buf == NULL) {
-				xs_fclose(f);
-				return -2;
-			}
-		}
-		
-		/* Read data */	
-		xs_fseek(f, 0, SEEK_SET);
-		readSize = xs_fread(*buf, sizeof(guint8), *bufSize, f);
-		xs_fclose(f);
-		
-		if (readSize != *bufSize)
-			return -3;
-		else
-			return 0;
-	} else {
-		xs_fclose(f);
-		return -4;
-	}
+    xs_fseek(f, 0, SEEK_END);
+    seekPos = xs_ftell(f);
+    
+    if (seekPos > 0) {
+        size_t readSize = seekPos;
+        if (readSize >= *bufSize || *buf == NULL) {
+            /* Only re-allocate if the required size > current */
+            if (*buf != NULL) {
+                g_free(*buf);
+                *buf = NULL;
+            }
+    
+            *bufSize = seekPos;
+            
+            *buf = (guint8 *) g_malloc(*bufSize * sizeof(guint8));
+            if (*buf == NULL) {
+                xs_fclose(f);
+                return -2;
+            }
+        }
+        
+        /* Read data */    
+        xs_fseek(f, 0, SEEK_SET);
+        readSize = xs_fread(*buf, sizeof(guint8), *bufSize, f);
+        xs_fclose(f);
+        
+        if (readSize != *bufSize)
+            return -3;
+        else
+            return 0;
+    } else {
+        xs_fclose(f);
+        return -4;
+    }
 }
 
 
-
-
-
 /* Copy a string
  */
-gchar *xs_strncpy(gchar *pDest, const gchar *pSource, size_t n)
+gchar *xs_strncpy(gchar *dest, const gchar *src, size_t n)
 {
-	const gchar *s;
-	gchar *d;
-	size_t i;
+    const gchar *s;
+    gchar *d;
+    size_t i;
 
-	/* Check the string pointers */
-	if (!pSource || !pDest)
-		return pDest;
+    /* Check the string pointers */
+    if (!src || !dest)
+        return dest;
 
-	/* Copy to the destination */
-	i = n;
-	s = pSource;
-	d = pDest;
-	while (*s && (i > 0)) {
-		*(d++) = *(s++);
-		i--;
-	}
+    /* Copy to the destination */
+    i = n;
+    s = src;
+    d = dest;
+    while (*s && (i > 0)) {
+        *(d++) = *(s++);
+        i--;
+    }
 
-	/* Fill rest of space with zeros */
-	while (i > 0) {
-		*(d++) = 0;
-		i--;
-	}
+    /* Fill rest of space with zeros */
+    while (i > 0) {
+        *(d++) = 0;
+        i--;
+    }
 
-	/* Ensure that last is always zero */
-	pDest[n - 1] = 0;
+    /* Ensure that last is always zero */
+    dest[n - 1] = 0;
 
-	return pDest;
+    return dest;
 }
 
 
-/* Copy a given string over in *ppResult.
+/* Copy a given string over in *result.
  */
-gint xs_pstrcpy(gchar **ppResult, const gchar *pStr)
+gint xs_pstrcpy(gchar **result, const gchar *str)
 {
-	/* Check the string pointers */
-	if (!ppResult || !pStr)
-		return -1;
+    /* Check the string pointers */
+    if (!result || !str)
+        return -1;
 
-	/* Allocate memory for destination */
-	if (*ppResult)
-		g_free(*ppResult);
-	*ppResult = (gchar *) g_malloc(strlen(pStr) + 1);
-	if (!*ppResult)
-		return -2;
+    /* Allocate memory for destination */
+    if (*result)
+        g_free(*result);
+    *result = (gchar *) g_malloc(strlen(str) + 1);
+    if (!*result)
+        return -2;
 
-	/* Copy to the destination */
-	strcpy(*ppResult, pStr);
+    /* Copy to the destination */
+    strcpy(*result, str);
 
-	return 0;
+    return 0;
 }
 
 
-/* Concatenates a given string into string pointed by *ppResult.
+/* Concatenates a given string into string pointed by *result.
  */
-gint xs_pstrcat(gchar **ppResult, const gchar *pStr)
+gint xs_pstrcat(gchar **result, const gchar *str)
 {
-	/* Check the string pointers */
-	if (!ppResult || !pStr)
-		return -1;
+    /* Check the string pointers */
+    if (!result || !str)
+        return -1;
 
-	if (*ppResult != NULL) {
-		*ppResult = (gchar *) g_realloc(*ppResult, strlen(*ppResult) + strlen(pStr) + 1);
-		if (*ppResult == NULL)
-			return -1;
-		strcat(*ppResult, pStr);
-	} else {
-		*ppResult = (gchar *) g_malloc(strlen(pStr) + 1);
-		if (*ppResult == NULL)
-			return -1;
-		strcpy(*ppResult, pStr);
-	}
+    if (*result != NULL) {
+        *result = (gchar *) g_realloc(*result, strlen(*result) + strlen(str) + 1);
+        if (*result == NULL)
+            return -1;
+        strcat(*result, str);
+    } else {
+        *result = (gchar *) g_malloc(strlen(str) + 1);
+        if (*result == NULL)
+            return -1;
+        strcpy(*result, str);
+    }
 
-	return 0;
+    return 0;
 }
 
 
 /* Concatenate a given string up to given dest size or \n.
  * If size max is reached, change the end to "..."
  */
-void xs_pnstrcat(gchar *pDest, size_t iSize, const gchar *pStr)
+void xs_pnstrcat(gchar *dest, size_t iSize, const gchar *str)
 {
-	size_t i, n;
-	const gchar *s;
-	gchar *d;
+    size_t i, n;
+    const gchar *s;
+    gchar *d;
 
-	d = pDest;
-	i = 0;
-	while (*d && (i < iSize)) {
-		i++;
-		d++;
-	}
+    d = dest;
+    i = 0;
+    while (*d && (i < iSize)) {
+        i++;
+        d++;
+    }
 
-	s = pStr;
-	while (*s && (*s != '\n') && (i < iSize)) {
-		*d = *s;
-		d++;
-		s++;
-		i++;
-	}
+    s = str;
+    while (*s && (*s != '\n') && (i < iSize)) {
+        *d = *s;
+        d++;
+        s++;
+        i++;
+    }
 
-	*d = 0;
+    *d = 0;
 
-	if (i >= iSize) {
-		i--;
-		d--;
-		n = 3;
-		while ((i > 0) && (n > 0)) {
-			*d = '.';
-			d--;
-			i--;
-			n--;
-		}
-	}
+    if (i >= iSize) {
+        i--;
+        d--;
+        n = 3;
+        while ((i > 0) && (n > 0)) {
+            *d = '.';
+            d--;
+            i--;
+            n--;
+        }
+    }
 }
 
 
 /* Locate character in string
  */
-gchar *xs_strrchr(gchar *pcStr, const gchar ch)
+gchar *xs_strrchr(gchar *str, const gchar ch)
 {
-	gchar *lastPos = NULL;
+    gchar *lastPos = NULL;
 
-	while (*pcStr) {
-		if (*pcStr == ch)
-			lastPos = pcStr;
-		pcStr++;
-	}
+    while (*str) {
+        if (*str == ch)
+            lastPos = str;
+        str++;
+    }
 
-	return lastPos;
+    return lastPos;
 }
 
 
-void xs_findnext(const gchar *pcStr, size_t *piPos)
+void xs_findnext(const gchar *str, size_t *pos)
 {
-	while (pcStr[*piPos] && isspace(pcStr[*piPos]))
-		(*piPos)++;
+    while (str[*pos] && isspace(str[*pos]))
+        (*pos)++;
 }
 
 
-void xs_findeol(const gchar *pcStr, size_t *piPos)
+void xs_findeol(const gchar *str, size_t *pos)
 {
-	while (pcStr[*piPos] && (pcStr[*piPos] != '\n') && (pcStr[*piPos] != '\r'))
-		(*piPos)++;
+    while (str[*pos] && (str[*pos] != '\n') && (str[*pos] != '\r'))
+        (*pos)++;
 }
 
 
-void xs_findnum(const gchar *pcStr, size_t *piPos)
+void xs_findnum(const gchar *str, size_t *pos)
 {
-	while (pcStr[*piPos] && isdigit(pcStr[*piPos]))
-		(*piPos)++;
+    while (str[*pos] && isdigit(str[*pos]))
+        (*pos)++;
 }
 
--- a/src/sid/xs_support.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sid/xs_support.h	Fri Jun 13 05:57:25 2008 +0300
@@ -15,8 +15,6 @@
 #ifdef AUDACIOUS_PLUGIN
 #include <audacious/plugin.h>
 #include <audacious/output.h>
-#include <audacious/util.h>
-#define HAVE_MEMSET
 #else
 #include <xmms/plugin.h>
 #include <xmms/util.h>
@@ -68,8 +66,7 @@
 /* VFS replacement functions
  */
 #ifdef __AUDACIOUS_NEWVFS__
-#include <audacious/vfs.h>
-#define t_xs_file VFSFile
+#define xs_file_t VFSFile
 #define xs_fopen(a,b) aud_vfs_fopen(a,b)
 #define xs_fclose(a) aud_vfs_fclose(a)
 #define xs_fgetc(a) aud_vfs_getc(a)
@@ -79,31 +76,31 @@
 #define xs_ftell(a) aud_vfs_ftell(a)
 #define xs_fseek(a,b,c) aud_vfs_fseek(a,b,c)
 #else
-#define t_xs_file FILE
-t_xs_file *xs_fopen(const gchar *, const gchar *);
-gint	xs_fclose(t_xs_file *);
-gint	xs_fgetc(t_xs_file *);
-size_t	xs_fread(void *, size_t, size_t, t_xs_file *);
-gint	xs_feof(t_xs_file *);
-gint	xs_ferror(t_xs_file *);
-glong	xs_ftell(t_xs_file *);
-gint	xs_fseek(t_xs_file *, glong, gint);
+#define xs_file_t FILE
+#define xs_fopen(a,b) fopen(a,b)
+#define xs_fclose(a) fclose(a)
+#define xs_fgetc(a) fgetc(a)
+#define xs_fread(a,b,c,d) fread(a,b,c,d)
+#define xs_feof(a) feof(a)
+#define xs_ferror(a) ferror(a)
+#define xs_ftell(a) ftell(a)
+#define xs_fseek(a,b,c) fseek(a,b,c)
 #endif
-guint16 xs_fread_be16(t_xs_file *);
-guint32 xs_fread_be32(t_xs_file *);
-gint	xs_fload_buffer(const gchar *, guint8 **, size_t *);
+guint16 xs_fread_be16(xs_file_t *);
+guint32 xs_fread_be32(xs_file_t *);
+gint    xs_fload_buffer(const gchar *, guint8 **, size_t *);
 
 
 /* Misc functions
  */
-gchar	*xs_strncpy(gchar *, const gchar *, size_t);
-gint	xs_pstrcpy(gchar **, const gchar *);
-gint	xs_pstrcat(gchar **, const gchar *);
-void	xs_pnstrcat(gchar *, size_t, const gchar *);
-gchar	*xs_strrchr(gchar *, const gchar);
-void	xs_findnext(const gchar *, size_t *);
-void	xs_findeol(const gchar *, size_t *);
-void	xs_findnum(const gchar *, size_t *);
+gchar    *xs_strncpy(gchar *, const gchar *, size_t);
+gint    xs_pstrcpy(gchar **, const gchar *);
+gint    xs_pstrcat(gchar **, const gchar *);
+void    xs_pnstrcat(gchar *, size_t, const gchar *);
+gchar    *xs_strrchr(gchar *, const gchar);
+void    xs_findnext(const gchar *, size_t *);
+void    xs_findeol(const gchar *, size_t *);
+void    xs_findnum(const gchar *, size_t *);
 
 #ifdef __cplusplus
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,41 @@
+PLUGIN = skins${PLUGIN_SUFFIX}
+
+SRCS = plugin.c \
+       skins_cfg.c \
+       pixbuf_effects.c \
+       dnd.c \
+       ui_skin.c \
+       ui_skinned_window.c \
+       ui_dock.c \
+       util.c \
+       ui_vis.c \
+       ui_svis.c \
+       ui_skinned_menurow.c \
+       ui_skinned_button.c \
+       ui_skinned_textbox.c \
+       ui_skinned_playstatus.c \
+       ui_skinned_monostereo.c \
+       ui_skinned_number.c \
+       ui_skinned_horizontal_slider.c \
+       ui_skinned_equalizer_graph.c \
+       ui_skinned_equalizer_slider.c \
+       ui_skinned_playlist.c \
+       ui_skinned_playlist_slider.c \
+       ui_main.c \
+       ui_equalizer.c \
+       ui_playlist.c \
+       ui_main_evlisteners.c \
+       ui_playlist_evlisteners.c \
+       ui_manager.c \
+       ui_hints.c \
+       ui_skinselector.c \
+       icons-stock.c
+
+include ../../buildsys.mk
+include ../../extra.mk
+
+plugindir := ${plugindir}/${GENERAL_PLUGIN_DIR}
+
+CFLAGS += ${PLUGIN_CFLAGS} ${BEEP_DEFINES}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS}  ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${CAIRO_CFLAGS} ${PANGOCAIRO_CFLAGS} ${XRENDER_CFLAGS} ${XCOMPOSITE_CFLAGS} -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${CAIRO_LIBS} ${PANGOCAIRO_LIBS} ${XRENDER_LIBS} ${XCOMPOSITE_LIBS} ${MOWGLI_LIBS}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/actions-equalizer.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,38 @@
+/*  Audacious - Cross-platform multimedia player
+ *  Copyright (C) 2005-2007  Audacious development team.
+ *
+ *  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; under version 3 of the License.
+ *
+ *  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, see <http://www.gnu.org/licenses>.
+ *
+ *  The Audacious team does not consider modular code linking to
+ *  Audacious or using our public API to be a derived work.
+ */
+
+#ifndef AUDACIOUS_ACTIONS_EQUALIZER_H
+#define AUDACIOUS_ACTIONS_EQUALIZER_H
+
+void action_equ_load_preset(void);
+void action_equ_load_auto_preset(void);
+void action_equ_load_default_preset(void);
+void action_equ_zero_preset(void);
+void action_equ_load_preset_file(void);
+void action_equ_load_preset_eqf(void);
+void action_equ_import_winamp_presets(void);
+void action_equ_save_preset(void);
+void action_equ_save_auto_preset(void);
+void action_equ_save_default_preset(void);
+void action_equ_save_preset_file(void);
+void action_equ_save_preset_eqf(void);
+void action_equ_delete_preset(void);
+void action_equ_delete_auto_preset(void);
+
+#endif /* AUDACIOUS_ACTIONS_EQUALIZER_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/actions-mainwin.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,76 @@
+/*  Audacious - Cross-platform multimedia player
+ *  Copyright (C) 2005-2007  Audacious development team.
+ *
+ *  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; under version 3 of the License.
+ *
+ *  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, see <http://www.gnu.org/licenses>.
+ *
+ *  The Audacious team does not consider modular code linking to
+ *  Audacious or using our public API to be a derived work.
+ */
+
+#ifndef AUDACIOUS_ACTIONS_MAINWIN_H
+#define AUDACIOUS_ACTIONS_MAINWIN_H
+
+#include <glib.h>
+#include <gtk/gtk.h>
+
+/* actions below are handled in mainwin.c */
+
+
+/* toggle actions */
+void action_anamode_peaks(GtkToggleAction*);
+void action_autoscroll_songname(GtkToggleAction*);
+void action_playback_noplaylistadvance(GtkToggleAction*);
+void action_playback_repeat(GtkToggleAction*);
+void action_playback_shuffle(GtkToggleAction*);
+void action_stop_after_current_song(GtkToggleAction*);
+void action_view_always_on_top(GtkToggleAction*);
+void action_view_scaled(GtkToggleAction*);
+void action_view_easymove(GtkToggleAction*);
+void action_view_on_all_workspaces(GtkToggleAction*);
+void action_roll_up_equalizer(GtkToggleAction*);
+void action_roll_up_player(GtkToggleAction*);
+void action_roll_up_playlist_editor(GtkToggleAction*);
+void action_show_equalizer(GtkToggleAction*);
+void action_show_player(GtkToggleAction*);
+void action_show_playlist_editor(GtkToggleAction*);
+
+/* radio actions (one for each radio action group) */
+void action_anafoff(GtkAction*,GtkRadioAction*);
+void action_anamode(GtkAction*,GtkRadioAction*);
+void action_anatype(GtkAction*,GtkRadioAction*);
+void action_peafoff(GtkAction*,GtkRadioAction*);
+void action_refrate(GtkAction*,GtkRadioAction*);
+void action_scomode(GtkAction*,GtkRadioAction*);
+void action_vismode(GtkAction*,GtkRadioAction*);
+void action_vprmode(GtkAction*,GtkRadioAction*);
+void action_wshmode(GtkAction*,GtkRadioAction*);
+void action_viewtime(GtkAction*,GtkRadioAction*);
+
+/* normal actions */
+void action_about_audacious(void);
+void action_ab_clear(void);
+void action_ab_set(void);
+void action_jump_to_file(void);
+void action_jump_to_playlist_start(void);
+void action_jump_to_time(void);
+void action_play_file(void);
+void action_play_location(void);
+void action_playback_next(void);
+void action_playback_pause(void);
+void action_playback_play(void);
+void action_playback_previous(void);
+void action_playback_stop(void);
+void action_preferences(void);
+void action_quit(void);
+void action_current_track_info(void);
+#endif /* AUDACIOUS_ACTIONS_MAINWIN_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/actions-playlist.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,74 @@
+/*  Audacious - Cross-platform multimedia player
+ *  Copyright (C) 2005-2007  Audacious development team.
+ *
+ *  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; under version 3 of the License.
+ *
+ *  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, see <http://www.gnu.org/licenses>.
+ *
+ *  The Audacious team does not consider modular code linking to
+ *  Audacious or using our public API to be a derived work.
+ */
+
+#ifndef AUDACIOUS_ACTIONS_PLAYLIST_H
+#define AUDACIOUS_ACTIONS_PLAYLIST_H
+
+void action_playlist_load_list(void);
+void action_playlist_save_list(void);
+void action_playlist_save_default_list(void);
+void action_playlist_refresh_list(void);
+void action_open_list_manager(void);
+
+void action_playlist_prev(void);
+void action_playlist_new(void);
+void action_playlist_next(void);
+void action_playlist_delete(void);
+
+void action_playlist_search_and_select(void);
+void action_playlist_invert_selection(void);
+void action_playlist_select_all(void);
+void action_playlist_select_none(void);
+
+void action_playlist_clear_queue(void);
+void action_playlist_remove_unavailable(void);
+void action_playlist_remove_dupes_by_title(void);
+void action_playlist_remove_dupes_by_filename(void);
+void action_playlist_remove_dupes_by_full_path(void);
+void action_playlist_remove_all(void);
+void action_playlist_remove_selected(void);
+void action_playlist_remove_unselected(void);
+
+/* void action_playlist_add_cd(void); - this is no longer needed, as the respective menu entry is added from within the cdaudio plugin */
+void action_playlist_add_url(void);
+void action_playlist_add_files(void);
+
+void action_playlist_randomize_list(void);
+void action_playlist_reverse_list(void);
+
+void action_playlist_sort_by_title(void);
+void action_playlist_sort_by_artist(void);
+void action_playlist_sort_by_filename(void);
+void action_playlist_sort_by_full_path(void);
+void action_playlist_sort_by_date(void);
+void action_playlist_sort_by_track_number(void);
+void action_playlist_sort_by_playlist_entry(void);
+
+void action_playlist_sort_selected_by_title(void);
+void action_playlist_sort_selected_by_artist(void);
+void action_playlist_sort_selected_by_filename(void);
+void action_playlist_sort_selected_by_full_path(void);
+void action_playlist_sort_selected_by_date(void);
+void action_playlist_sort_selected_by_track_number(void);
+void action_playlist_sort_selected_by_playlist_entry(void);
+
+void action_playlist_track_info(void);
+void action_queue_toggle(void);
+
+#endif /* AUDACIOUS_ACTIONS_PLAYLIST_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/debug.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,44 @@
+#ifndef DEBUG_H
+#define DEBUG_H
+
+#include <glib.h>
+
+#ifdef NDEBUG
+
+/* void REQUIRE_LOCK(GMutex *m); */
+#  define REQUIRE_LOCK(m)
+
+/* void REQUIRE_STR_UTF8(const gchar *str); */
+#  define REQUIRE_STR_UTF8(str)
+
+/* void REQUIRE_STATIC_LOCK(GStaticMutex *m); */
+#  define REQUIRE_STATIC_LOCK(m)
+
+#else                           /* !NDEBUG */
+
+/* void REQUIRE_LOCK(GMutex *m); */
+#  define REQUIRE_LOCK(m) G_STMT_START { \
+       if (g_mutex_trylock(m)) { \
+           g_critical(G_STRLOC ": Mutex not locked!"); \
+           g_mutex_unlock(m); \
+       } \
+   } G_STMT_END
+
+/* void REQUIRE_STATIC_LOCK(GStaticMutex *m); */
+#  define REQUIRE_STATIC_LOCK(m) G_STMT_START { \
+       if (G_TRYLOCK(m)) { \
+           g_critical(G_STRLOC ": Mutex not locked!"); \
+           G_UNLOCK(m); \
+       } \
+   } G_STMT_END
+
+/* void REQUIRE_STR_UTF8(const gchar *str); */
+#  define REQUIRE_STR_UTF8(str) G_STMT_START { \
+       if (!g_utf_validate(str, -1, NULL)) \
+            g_warning(G_STRLOC ": String is not UTF-8!"); \
+   } G_STMT_END
+
+#endif                          /* NDEBUG */
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/dnd.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,34 @@
+/*  Audacious
+ *  Copyright (C) 2005-2007  Audacious development team.
+ *
+ *  Based on BMP:
+ *  Copyright (C) 2003-2004  BMP development team.
+ *
+ *  Based on XMMS:
+ *  Copyright (C) 1998-2003  XMMS development team.
+ *
+ *  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; under version 3 of the License.
+ *
+ *  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, see <http://www.gnu.org/licenses>.
+ *
+ *  The Audacious team does not consider modular code linking to
+ *  Audacious or using our public API to be a derived work.
+ */
+
+#include "dnd.h"
+
+void
+aud_drag_dest_set(GtkWidget *widget)
+{
+    gtk_drag_dest_set(widget, GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP,
+					  aud_drop_types, 5,
+                      GDK_ACTION_COPY | GDK_ACTION_MOVE);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/dnd.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,51 @@
+/*  Audacious - Cross-platform multimedia player
+ *  Copyright (C) 2005-2007  Audacious development team
+ *
+ *  Based on BMP:
+ *  Copyright (C) 2003-2004  BMP development team
+ *
+ *  Based on XMMS:
+ *  Copyright (C) 1998-2003  XMMS development team
+ *
+ *  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; under version 3 of the License.
+ *
+ *  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, see <http://www.gnu.org/licenses>.
+ *
+ *  The Audacious team does not consider modular code linking to
+ *  Audacious or using our public API to be a derived work.
+ */
+
+#ifndef AUDACIOUS_DND_H
+#define AUDACIOUS_DND_H
+
+#include <gtk/gtk.h>
+
+/* Designate dropped data types that we know and care about */
+enum {
+    BMP_DROP_STRING,
+    BMP_DROP_PLAINTEXT,
+    BMP_DROP_URLENCODED,
+    BMP_DROP_SKIN,
+    BMP_DROP_FONT
+};
+
+/* Drag data format listing for gtk_drag_dest_set() */
+static const GtkTargetEntry aud_drop_types[] = {
+    {"text/plain", 0, BMP_DROP_PLAINTEXT},
+    {"text/uri-list", 0, BMP_DROP_URLENCODED},
+    {"STRING", 0, BMP_DROP_STRING},
+    {"interface/x-winamp-skin", 0, BMP_DROP_SKIN},
+    {"application/x-font-ttf", 0, BMP_DROP_FONT},
+};
+
+void aud_drag_dest_set(GtkWidget*);
+
+#endif /* AUDACIOUS_DND_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/icons-stock.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,61 @@
+/*  Audacious - Cross-platform multimedia player
+ *  Copyright (C) 2005-2008  Audacious development team.
+ *
+ *  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; under version 3 of the License.
+ *
+ *  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, see <http://www.gnu.org/licenses>.
+ *
+ *  The Audacious team does not consider modular code linking to
+ *  Audacious or using our public API to be a derived work.
+ */
+
+
+#include "icons-stock.h"
+#include "plugin.h"
+#include <gdk/gdk.h>
+#include <gtk/gtk.h>
+
+
+static void
+load_stock_icon(gchar *id, gchar *filename, GtkIconFactory *iconfactory)
+{
+    GtkIconSet *iconset;
+    GdkPixbuf *pixbuf;
+
+    pixbuf = gdk_pixbuf_new_from_file(filename, NULL);
+    if (pixbuf == NULL)
+        return;
+
+    iconset = gtk_icon_set_new_from_pixbuf(pixbuf);
+    g_object_unref(pixbuf);
+
+    gtk_icon_factory_add(iconfactory, id, iconset);
+}
+
+void
+register_aud_stock_icons(void)
+{
+    GtkIconFactory *iconfactory = gtk_icon_factory_new();
+
+    load_stock_icon(AUD_STOCK_PLAYLIST,
+                    DATA_DIR "/images/menu_playlist.png", iconfactory);
+    load_stock_icon(AUD_STOCK_PLUGIN,
+                    DATA_DIR "/images/menu_plugin.png", iconfactory);
+    load_stock_icon(AUD_STOCK_QUEUETOGGLE,
+                    DATA_DIR "/images/menu_queue_toggle.png", iconfactory);
+    load_stock_icon(AUD_STOCK_RANDOMIZEPL,
+                    DATA_DIR "/images/menu_randomize_playlist.png", iconfactory);
+    
+
+    gtk_icon_factory_add_default( iconfactory );
+    g_object_unref( iconfactory );
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/icons-stock.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,32 @@
+/*  Audacious - Cross-platform multimedia player
+ *  Copyright (C) 2005-2007  Audacious development team.
+ *
+ *  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; under version 3 of the License.
+ *
+ *  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, see <http://www.gnu.org/licenses>.
+ *
+ *  The Audacious team does not consider modular code linking to
+ *  Audacious or using our public API to be a derived work.
+ */
+
+#ifndef AUDACIOUS_ICONS_STOCK_H
+#define AUDACIOUS_ICONS_STOCK_H
+
+void register_aud_stock_icons(void);
+
+/* this header contains macro defines for Audacious stock icons */
+
+#define AUD_STOCK_PLAYLIST			"aud-playlist"
+#define AUD_STOCK_PLUGIN			"aud-plugin"
+#define AUD_STOCK_QUEUETOGGLE		"aud-queuetoggle"
+#define AUD_STOCK_RANDOMIZEPL		"aud-randomizepl"
+
+#endif /* AUDACIOUS_ICONS_STOCK_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/images/audacious_eq.xpm	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,93 @@
+/* XPM */
+static char *audacious_eq_icon[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 39 1",
+"  c #e36d45",
+". c #e3734d",
+"X c #e47650",
+"o c #e57a54",
+"O c #e57d59",
+"+ c #e6805d",
+"@ c #e68462",
+"# c #e78867",
+"$ c #e88665",
+"% c #e88866",
+"& c #e88b6b",
+"* c #e98f70",
+"= c #e99274",
+"- c #ea9678",
+"; c #ea997c",
+": c #eb9d82",
+"> c #eca086",
+", c #eda48b",
+"< c #eda88f",
+"1 c #eeab93",
+"2 c #efae98",
+"3 c #efb09a",
+"4 c #f0b29c",
+"5 c #f0b5a0",
+"6 c #f2bba7",
+"7 c #f2bca9",
+"8 c #f3c5b4",
+"9 c #f4c7b8",
+"0 c #f4cabb",
+"q c #f5cec0",
+"w c #f6d6cb",
+"e c #f7d8ce",
+"r c #f7dad0",
+"t c #f8dcd3",
+"y c #f8e0d7",
+"u c #f9e3db",
+"i c #fae6e0",
+"p c #fae8e2",
+"a c white",
+/* pixels */
+"<2211111<<<<,,:,,:::::::::::-=---=====&=&&&=&&&&",
+"255544422211111<<<<<<::::::::::----======&&&&&##",
+"25554442222111<<,<,,:<:::::::------===&=*&&&%%$&",
+"1544442222111<<<<<<:<:<:::::-:----=====&*&&&&%$%",
+"2554442221111<<<:<:<::<::::::----=====&=&&%&$%%#",
+"154442222111<<,<,,<:<::::-:-----====&&=&&&&&%$@$",
+"14422222111<<<,,,:<<:::::::-:----====&&&&&&%%$@%",
+"1442222211<<<<,,:<:::::::--:=--===&==&&&&&%%$@@%",
+"1442221211<<<,,,,<,:::::-:----=-====&&&&&$$$$@@@",
+"124222111<<<,,,,::::::;::-:---===*=&=&&&&&%@@@@#",
+"1422211111<<<,,,,:::::;;-:----===&=&&&&&$$$#@@@@",
+"12222111<taaaaa4,:::::::---=======&=&&&&%$$@@@+@",
+"<222111<<taaaaa4::::::-----=-====&&&&&&&$$#@+@+@",
+"<2211111<taaaaa4,::::--::---==**=&&&&&$%$#@@@++@",
+"<21211<<<taaaaa3:::::::----====*=&&&&%%%$@@+@+O@",
+"<21211<<<taaaaa3::::-:---=====**&&&&&%%$@@@@+++@",
+"<111<<<<<taaaaa3::::;;----*-*=&&&&&&#%$$@@@+++O+",
+"<111<<<,,raaaaa3:::;;;---*-*==*&&&&&%%$@@@@+++++",
+",1111<<,,raaaaa2::;;-----111111&&&&%%$#@@@+++OO+",
+"<11<<<<,<raaaaa2;;;;;---:aaaaap&&&%%$$@@@+++OOO+",
+",8ppppi8>raaaaa3:;;;--*-;aaaaap&&%&$$$@@++@OOOOO",
+",qaaaaa0,raaaaa1;;;----=-aaaaap&&%#$@@@+@+O+OOO+",
+",qaaaaa0,raaaaa2;;;---==;aaaaap&&%%$#@@@OO+OOooO",
+",qaaaaa0>eaaaaa1;;---===-aaaaap&%%$$@++@++OOOOo+",
+",0aaaaa0,eaaaaa1;;----==-aaaaap#&$$#@@+++OOOOooO",
+",0aaaaa0>raaaaa1-;--====-aaaaap#:ttttt7++OOooooO",
+",qaaaaa0:taaaaa1--;==***-aaaaap$,aaaaaq+OOOooooO",
+":0aaaaa9:eaaaaa1-wuuuuu&-aaaaap$,aaaaaq+OOOooo.O",
+",0aaaaa0:eaaaaa1-paaaaa==aaaaap$,aaaaaqOOOooo.oO",
+":0aaaaa9:eaaaaa1=paaaaa&=aaaaap@,aaaaaqOOOoooo.O",
+":qaaaaa9:waaaaa1-paaaaa=-aaaaap@>aaaaaqOoOoooXXO",
+":0aaaaa9:waaaaa1=paaaaa&*aaaaap@,aaaaa0O;77777*o",
+">0aaaaa9:eaaaaa1=paaaaa&=aaaaap@>aaaaaqO4aaaaa3o",
+":0aaaaa8;eaaaaa,-paaaaa&=aaaaai@>aaaaaqo4aaaaa3o",
+":0aaaaa8;eaaaaa,=paaaaa&=aaaaap+>aaaaa0O5aaaaa3o",
+":9aaaaa9;eaaaaa<*paaaaa&&aaaaai@>aaaaaqo4aaaaa3o",
+":0aaaaa8;eaaaaa,&paaaaa&=aaaaap+>aaaaa0o4aaaaa2o",
+":9aaaaa8-eaaaaa,=paaaaa%&aaaaau+:aaaaa0o4aaaaa2X",
+":9aaaaa8;waaaaa,=paaaaa%=aaaaai+>aaaaa0o4aaaaa2X",
+":9aaaaa8-eaaaaa,&paaaaa#&aaaaai+:aaaaa0o4aaaaa3X",
+";8aaaaa8-waaaaa,*paaaaa#*aaaaapO:aaaaa0o3aaaaa2X",
+";8aaaaa8-waaaaa,*paaaaa#&aaaaaiO:aaaaa0X3aaaaa2.",
+";9aaaaa8-waaaaa>&paaaaa@&aaaaaiO:aaaaa0X3aaaaa1o",
+";9aaaaa8=eaaaaa,&paaaaa@&aaaaauO:aaaaa0.3aaaaa1.",
+";8aaaaa8*waaaaa:&paaaaa@&aaaaauO:aaaaa0.2aaaaa1.",
+";8aaaaa8=waaaaa>&paaaaa@&aaaaaiO;aaaaa0.3aaaaa2.",
+";;;;;=====***&*&#&###@@+++OOOOOooXoX..... .    .",
+"---=--====*****&&&&#####@@@@++++OOOOOooooXXX...o"
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/images/audacious_playlist.xpm	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,97 @@
+/* XPM */
+static char *audacious_playlist_icon[] = {
+/* columns rows colors chars-per-pixel */
+"48 48 43 1",
+"  c #e36e45",
+". c #e3734c",
+"X c #e47650",
+"o c #e57a54",
+"O c #e57d59",
+"+ c #e6815d",
+"@ c #e68462",
+"# c #e78867",
+"$ c #e88665",
+"% c #e88866",
+"& c #e88b6b",
+"* c #e98f70",
+"= c #e99273",
+"- c #ea9679",
+"; c #eb997c",
+": c #eb9d82",
+"> c #eca086",
+", c #eda48b",
+"< c #eda88f",
+"1 c #eeaa93",
+"2 c #efae98",
+"3 c #efb09a",
+"4 c #f0b29c",
+"5 c #f0b5a1",
+"6 c #f0b8a5",
+"7 c #f1bcaa",
+"8 c #f2c0ae",
+"9 c #f3c3b3",
+"0 c #f4c7b8",
+"q c #f4cabb",
+"w c #f5cec1",
+"e c #f5d1c4",
+"r c #f6d5c9",
+"t c #f7d8cd",
+"y c #f8ddd4",
+"u c #f8e0d7",
+"i c #f9e3db",
+"p c #fae6e0",
+"a c #fae8e2",
+"s c #fcf0eb",
+"d c #fcf4f1",
+"f c #fdf9f7",
+"g c white",
+/* pixels */
+"<22111111<<<<,,,::,:::::;;;;;;----====*=&=&&&&#&",
+"2555444423111<<<<<<,,>>>:>:;;;;;---====**&&&&&#&",
+"25444424312111<<<,,,,>,>>:::;;;----===&==&&&%%%#",
+"1554442222111<<<,,,,,>:::::;;;----=====&&&&&%%%#",
+"25544422211111<<,,,,::>::;;;;;---=====**&&&%%%$#",
+"19aat22uaaaapppppppppppipppiiipiiiiiu4*&4iuuue$$",
+"19ggi22sggggggggggggggggggggggggggggg7*&7ggggp%$",
+"10ggi24dggggggggggggggggggggggggggggg7*&7ggggp@#",
+"17trq21errreeeeeewwwwwwwqwqqq0qq00000,&&,99993@$",
+"1333221111<<<,,,,,>::::;;;;-;--===***&&%##$#$@@@",
+"1432211111<<<,,,>>>>:::;;;;---===***&&&&####$@@@",
+"<9aar11upaappppppipipiiiiiiiu5===***&&&%2uyyyw+@",
+"<0ggu11dggggggggggggggggggggg9=&=&&*&&%%7ggggp@@",
+"10ggu11dggggggggggggggggggggg9===&&&&&%%7ggggp+@",
+"<39961<6766666665554544442222:&=**&&&#%%=,,>>;O@",
+"<11111<<<<<,,>::::::;;----=====&*&&&&%%$@@@@++++",
+"<1111<<1<,,>,>::::;;;-;----=*=&&&&&%%%$$@@@+++O@",
+"<0ggy<<sgggggggggggggggggggggggggggs%%$$6ggggpO+",
+"<9ggy<<sgggggggggggggggggggggggggggs%%$@6ggggpO+",
+",9ggy<<sgggggggggggggggggggggggggggs%%$@6ggggiO+",
+",2774<,,,,>:>:::;;;----====&&&&&&%%%$$$+@+++OOO+",
+",111<<,,>>>>::::;;;---=-===&=&&&%#%%$@@+++++OOO+",
+",<<<,,,6665555545444422112111111<#$$@@@@&:>;;-OO",
+",9ggy,,fggggggggggggggggggggggggd$$$@@+@6ggggpoO",
+",9ggy,:fggggggggggggggggggggggggf$$@@@++6ggggpoO",
+",7ggy,,fggggggggggggggggggggggggd$$@@+@+5ggggioO",
+"><<,,,:,>::::;;;---=====&&&&&%%%$$@@+@++OOOooooO",
+":<,,>,>::::;;;;----====&&=&&&%%%$@@@@OOOOOOooo.O",
+":1664,:65535444442121211<11<1<,,,,>>,&+O&:;;;-oO",
+",7ggy><gggggggggggggggggggggggggggggg6OO5ggggp.O",
+":6ggu:,gggggggggggggggggggggggggggggg3OO5ggggi.o",
+":5ppe:,ippiiiiiiiiiuiiuiuuuuuuyyyyuyy1Oo<yyyy0Xo",
+">,,:::::::;;----====&&&&&%%%$$@@++++OOOOoooXXX.o",
+":,,::::::;;;;--=-==***&%&&&%%$@@@+++OOOooooo.X.o",
+":1ww9:<qqqqqq000000000099,%%@@@@+++OOoOo-76662.o",
+":6ggy:1gggggggggggggggggg7$$@@@+++OOOOoo4ggggi.o",
+":6ggy:2gggggggggggggggggg6%@@@++++OOOOoo4ggggi.X",
+":2ppw:1iiiiiiiiuuiuiuuuiu2@@@@+++OOOoooo,yyyy0.o",
+";::::;;;;--======&=&&&%%%$$@+@+++OOOoooo.X.... X",
+";,::;;;;----=====&&&&%#$$$@@@+++OOOoOoo.o... ..X",
+";1wq7;1qqq0q0000900999999979979777777;oo-66661 o",
+";5ggy;5gggggggggggggggggggggggggggggg3..3ggggi .",
+";5ggy;6gggggggggggggggggggggggggggggg2o.3ggggi X",
+"-1wq7;<q0q000000099999979779777777777-X.=66561 .",
+";;;:=;-====**=&&&&#%#$@@@@+++OOOOoooo..o....   .",
+";;;;;;=-====*&&&&&#%$$@@++++OOOOooooo.....     .",
+";;;-;-====***&*&&###$@@@++O+OOOooo.o.... ..    .",
+"----=-======&=&&&#&##$$$@@@@+++OOOOOOoooo.o....o"
+};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/pixbuf_effects.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,88 @@
+/*
+ * Audacious
+ * Copyright (c) 2006-2007 Audacious development team.
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+#include <glib.h>
+
+#include "platform/smartinclude.h"
+
+#include <gdk-pixbuf/gdk-pixbuf.h>
+
+static GdkPixbuf *
+create_new_pixbuf (GdkPixbuf *src)
+{
+    g_return_val_if_fail (gdk_pixbuf_get_colorspace (src) == GDK_COLORSPACE_RGB, NULL);
+    g_return_val_if_fail ((!gdk_pixbuf_get_has_alpha (src)
+                           && gdk_pixbuf_get_n_channels (src) == 3)
+                           || (gdk_pixbuf_get_has_alpha (src)
+                           && gdk_pixbuf_get_n_channels (src) == 4), NULL);
+
+    return gdk_pixbuf_new (gdk_pixbuf_get_colorspace (src),
+                           gdk_pixbuf_get_has_alpha (src),
+                           gdk_pixbuf_get_bits_per_sample (src),
+                           gdk_pixbuf_get_width (src),
+                           gdk_pixbuf_get_height (src));
+}
+
+GdkPixbuf *
+audacious_create_colorized_pixbuf (GdkPixbuf *src,
+                                   int red_value,
+                                   int green_value,
+                                   int blue_value)
+{
+    int i, j;
+    int width, height, has_alpha, src_row_stride, dst_row_stride;
+    guchar *target_pixels;
+    guchar *original_pixels;
+    guchar *pixsrc;
+    guchar *pixdest;
+    GdkPixbuf *dest;
+
+    g_return_val_if_fail (gdk_pixbuf_get_colorspace (src) == GDK_COLORSPACE_RGB, NULL);
+    g_return_val_if_fail ((!gdk_pixbuf_get_has_alpha (src)
+                           && gdk_pixbuf_get_n_channels (src) == 3)
+                           || (gdk_pixbuf_get_has_alpha (src)
+                           && gdk_pixbuf_get_n_channels (src) == 4), NULL);
+    g_return_val_if_fail (gdk_pixbuf_get_bits_per_sample (src) == 8, NULL);
+
+    dest = create_new_pixbuf (src);
+
+    has_alpha = gdk_pixbuf_get_has_alpha (src);
+    width = gdk_pixbuf_get_width (src);
+    height = gdk_pixbuf_get_height (src);
+    src_row_stride = gdk_pixbuf_get_rowstride (src);
+    dst_row_stride = gdk_pixbuf_get_rowstride (dest);
+    target_pixels = gdk_pixbuf_get_pixels (dest);
+    original_pixels = gdk_pixbuf_get_pixels (src);
+
+    for (i = 0; i < height; i++) {
+        pixdest = target_pixels + i*dst_row_stride;
+        pixsrc = original_pixels + i*src_row_stride;
+        for (j = 0; j < width; j++) {
+            *pixdest++ = (*pixsrc++ * red_value) >> 8;
+            *pixdest++ = (*pixsrc++ * green_value) >> 8;
+            *pixdest++ = (*pixsrc++ * blue_value) >> 8;
+            if (has_alpha) {
+               *pixdest++ = *pixsrc++;
+            }
+        }
+    }
+    return dest;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/platform/smartinclude.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,34 @@
+/*
+ *  Copyright (c) 2006-2007 William Pitcock <nenolod -at- nenolod.net>
+ *
+ *  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; under version 3 of the License.
+ *
+ *  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, see <http://www.gnu.org/licenses>.
+ *
+ *  The Audacious team does not consider modular code linking to
+ *  Audacious or using our public API to be a derived work.
+ */
+
+#include <gdk/gdk.h>
+
+#ifdef GDK_WINDOWING_X11
+# include <gdk/gdkx.h>
+#endif
+
+#ifdef GDK_WINDOWING_WIN32
+# include <gdk/gdkwin32.h>
+#endif
+
+#include <gdk/gdkkeysyms.h>
+
+#ifdef GDK_WINDOWING_QUARTZ
+# include <Carbon/Carbon.h>
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/plugin.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,133 @@
+/*
+ * Audacious - a cross-platform multimedia player
+ * Copyright (c) 2008 Tomasz Moń
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+
+#include "plugin.h"
+#include "skins_cfg.h"
+#include "ui_skin.h"
+#include "ui_manager.h"
+#include "icons-stock.h"
+#include "ui_main_evlisteners.h"
+#include "ui_playlist_evlisteners.h"
+#include <audacious/i18n.h>
+#include <libintl.h>
+
+gchar *skins_paths[SKINS_PATH_COUNT] = {};
+
+GeneralPlugin skins_gp =
+{
+    .description= "Audacious Skinned GUI",
+    .init = skins_init,
+    .about = skins_about,
+    .configure = skins_configure,
+    .cleanup = skins_cleanup
+};
+
+GeneralPlugin *skins_gplist[] = { &skins_gp, NULL };
+SIMPLE_GENERAL_PLUGIN(skins, skins_gplist);
+gboolean plugin_is_active = FALSE;
+
+static void skins_free_paths(void) {
+    int i;
+
+    for (i = 0; i < SKINS_PATH_COUNT; i++)  {
+        g_free(skins_paths[i]);
+        skins_paths[i] = NULL;
+    }
+}
+
+static void skins_init_paths() {
+    char *xdg_data_home;
+    char *xdg_cache_home;
+
+    xdg_data_home = (getenv("XDG_DATA_HOME") == NULL
+        ? g_build_filename(g_get_home_dir(), ".local", "share", NULL)
+        : g_strdup(getenv("XDG_DATA_HOME")));
+    xdg_cache_home = (getenv("XDG_CACHE_HOME") == NULL
+        ? g_build_filename(g_get_home_dir(), ".cache", NULL)
+        : g_strdup(getenv("XDG_CACHE_HOME")));
+
+    skins_paths[SKINS_PATH_USER_SKIN_DIR] =
+        g_build_filename(xdg_data_home, "audacious", "Skins", NULL);
+    skins_paths[SKINS_PATH_SKIN_THUMB_DIR] =
+        g_build_filename(xdg_cache_home, "audacious", "thumbs", NULL);
+
+    g_free(xdg_data_home);
+    g_free(xdg_cache_home);
+}
+
+void skins_init(void) {
+    plugin_is_active = TRUE;
+    g_log_set_handler(NULL, G_LOG_LEVEL_WARNING, g_log_default_handler, NULL);
+
+    skins_init_paths();
+    skins_cfg_load();
+
+    register_aud_stock_icons();
+    ui_manager_init();
+    ui_manager_create_menus();
+    mainwin_setup_menus();
+
+    init_skins(config.skin);
+
+    if (config.player_visible) mainwin_real_show();
+    if (config.equalizer_visible) equalizerwin_show(TRUE);
+    if (config.playlist_visible) playlistwin_show();
+
+    return;
+}
+
+void skins_cleanup(void) {
+    if (plugin_is_active == TRUE) {
+        skins_cfg_save();
+        skins_free_paths();
+        ui_main_evlistener_dissociate();
+        ui_playlist_evlistener_dissociate();
+        skins_cfg_free();
+        gtk_widget_destroy(mainwin);
+        gtk_widget_destroy(equalizerwin);
+        gtk_widget_destroy(playlistwin);
+        ui_manager_destroy();
+        skin_destroy(aud_active_skin);
+        aud_active_skin = NULL;
+        mainwin = NULL;
+        equalizerwin = NULL;
+        playlistwin = NULL;
+        mainwin_info = NULL;
+        plugin_is_active = FALSE;
+    }
+
+    return;
+}
+
+void skins_about(void) {
+    static GtkWidget* about_window = NULL;
+
+    if (about_window) {
+        gtk_window_present(GTK_WINDOW(about_window));
+        return;
+    }
+
+    about_window = audacious_info_dialog(_("About Skinned GUI"),
+                   _("Copyright (c) 2008, by Tomasz Moń <desowin@gmail.com>\n\n"),
+                   _("OK"), FALSE, NULL, NULL);
+
+    g_signal_connect(G_OBJECT(about_window), "destroy",	G_CALLBACK(gtk_widget_destroyed), &about_window);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/plugin.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,47 @@
+/*
+ * Audacious - a cross-platform multimedia player
+ * Copyright (c) 2008 Tomasz Moń
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+#ifndef PLUGIN_SKINS_H
+#define PLUGIN_SKINS_H
+
+#include <glib.h>
+#include <audacious/plugin.h>
+#include "skins_cfg.h"
+#include "ui_main.h"
+#include "ui_equalizer.h"
+#include "ui_playlist.h"
+#include "ui_skin.h"
+
+#define PACKAGE "audacious-plugins"
+#define PACKAGE_NAME "audacious-plugins"
+
+enum {
+    SKINS_PATH_USER_SKIN_DIR,
+    SKINS_PATH_SKIN_THUMB_DIR,
+    SKINS_PATH_COUNT
+};
+
+extern gchar *skins_paths[];
+
+void skins_init(void);
+void skins_cleanup(void);
+void skins_about(void);
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/skins_cfg.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,662 @@
+/*
+ * Audacious - a cross-platform multimedia player
+ * Copyright (c) 2008 Tomasz Moń
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+
+#include "skins_cfg.h"
+#include "ui_skin.h"
+#include "ui_vis.h"
+#include "ui_main.h"
+#include "ui_playlist.h"
+#include "ui_skinned_window.h"
+#include "ui_skinned_textbox.h"
+#include "ui_skinned_playlist.h"
+#include "ui_skinselector.h"
+#include "plugin.h"
+#include "dnd.h"
+#include "util.h"
+#include <glib.h>
+#include <stdlib.h>
+#include <audacious/i18n.h>
+#include <libintl.h>
+
+skins_cfg_t config;
+
+
+static GtkWidget *cfg_win = NULL;
+GtkWidget *skin_view;
+GtkWidget *skin_refresh_button;
+static GtkWidget *colorize_settings = NULL;
+/* colorize settings scales */
+GtkWidget *green_scale;
+GtkWidget *red_scale;
+GtkWidget *blue_scale;
+
+
+skins_cfg_t skins_default_config = {
+    .scaled = FALSE,
+    .autoscroll = TRUE,
+    .always_on_top = FALSE,
+    .sticky = FALSE,
+    .scale_factor = 2.0,
+    .always_show_cb = TRUE,
+    .close_dialog_open = TRUE,
+    .close_dialog_add = TRUE,
+    .skin = NULL,
+    .filesel_path = NULL,
+    .playlist_visible = FALSE,
+    .equalizer_visible = FALSE,
+    .player_visible = TRUE,
+    .player_shaded = FALSE,
+    .equalizer_shaded = FALSE,
+    .playlist_shaded = FALSE,
+    .dim_titlebar = TRUE,
+    .show_wm_decorations = FALSE,
+    .easy_move = TRUE,
+    .allow_broken_skins = FALSE,
+    .warn_about_broken_gtk_engines = TRUE,
+    .warn_about_win_visibility = TRUE,
+    .disable_inline_gtk = FALSE,
+    .timer_mode = 0,
+    .vis_type = VIS_ANALYZER,
+    .analyzer_mode = ANALYZER_NORMAL,
+    .analyzer_type = ANALYZER_BARS,
+    .scope_mode = SCOPE_DOT,
+    .voiceprint_mode = VOICEPRINT_NORMAL,
+    .vu_mode = VU_SMOOTH,
+    .vis_refresh = REFRESH_FULL,
+    .analyzer_falloff = FALLOFF_FAST,
+    .peaks_falloff = FALLOFF_SLOW,
+    .player_x = MAINWIN_DEFAULT_POS_X,
+    .player_y = MAINWIN_DEFAULT_POS_Y,
+    .equalizer_x = EQUALIZER_DEFAULT_POS_X,
+    .equalizer_y = EQUALIZER_DEFAULT_POS_Y,
+    .playlist_x = PLAYLISTWIN_DEFAULT_POS_X,
+    .playlist_y = PLAYLISTWIN_DEFAULT_POS_Y,
+    .playlist_width = PLAYLISTWIN_DEFAULT_WIDTH,
+    .playlist_height = PLAYLISTWIN_DEFAULT_HEIGHT,
+    .playlist_position = 0,
+    .mouse_change = 8,                 /* mouse wheel scroll step */
+    .scroll_pl_by = 3,
+    .colorize_r = 255, .colorize_g = 255, .colorize_b = 255,
+    .snap_distance = 10,
+    .snap_windows = TRUE,
+    .save_window_position = TRUE,
+    .analyzer_peaks = TRUE,
+    .twoway_scroll = TRUE,             /* use back and forth scroll */
+    .mainwin_use_bitmapfont = TRUE,
+    .eq_scaled_linked = TRUE,
+    .show_numbers_in_pl = TRUE,
+    .show_separator_in_pl = TRUE,
+    .playlist_font = NULL,
+    .mainwin_font = NULL,
+    .show_filepopup_for_tuple = TRUE,
+    .filepopup_delay = 20,             /* delay until the filepopup comes up */
+    .random_skin_on_play = FALSE,
+};
+
+typedef struct skins_cfg_boolent_t {
+    char const *be_vname;
+    gboolean *be_vloc;
+    gboolean be_wrt;
+} skins_cfg_boolent;
+
+static skins_cfg_boolent skins_boolents[] = {
+    {"always_show_cb", &config.always_show_cb, TRUE},
+    {"always_on_top", &config.always_on_top, TRUE},
+    {"sticky", &config.sticky, TRUE},
+    {"always_show_cb", &config.always_show_cb, TRUE},
+    {"scaled", &config.scaled, TRUE},
+    {"autoscroll_songname", &config.autoscroll, TRUE},
+    {"equalizer_visible", &config.equalizer_visible, TRUE},
+    {"playlist_visible", &config.playlist_visible, TRUE},
+    {"player_visible", &config.player_visible, TRUE},
+    {"player_shaded", &config.player_shaded, TRUE},
+    {"equalizer_shaded", &config.equalizer_shaded, TRUE},
+    {"playlist_shaded", &config.playlist_shaded, TRUE},
+    {"dim_titlebar", &config.dim_titlebar, TRUE},
+    {"show_wm_decorations", &config.show_wm_decorations, TRUE},
+    {"easy_move", &config.easy_move, TRUE},
+    {"allow_broken_skins", &config.allow_broken_skins, TRUE},
+    {"disable_inline_gtk", &config.disable_inline_gtk, TRUE},
+    {"snap_windows", &config.snap_windows, TRUE},
+    {"save_window_positions", &config.save_window_position, TRUE},
+    {"analyzer_peaks", &config.analyzer_peaks, TRUE},
+    {"twoway_scroll", &config.twoway_scroll, TRUE},
+    {"warn_about_win_visibility", &config.warn_about_win_visibility, TRUE},
+    {"warn_about_broken_gtk_engines", &config.warn_about_broken_gtk_engines, TRUE},
+    {"mainwin_use_bitmapfont", &config.mainwin_use_bitmapfont, TRUE},
+    {"eq_scaled_linked", &config.eq_scaled_linked, TRUE},
+    {"show_numbers_in_pl", &config.show_numbers_in_pl, TRUE},
+    {"show_separator_in_pl", &config.show_separator_in_pl, TRUE},
+    {"show_filepopup_for_tuple", &config.show_filepopup_for_tuple, TRUE},
+    {"random_skin_on_play", &config.random_skin_on_play, TRUE},
+};
+
+static gint ncfgbent = G_N_ELEMENTS(skins_boolents);
+
+typedef struct skins_cfg_nument_t {
+    char const *ie_vname;
+    gint *ie_vloc;
+    gboolean ie_wrt;
+} skins_cfg_nument;
+
+static skins_cfg_nument skins_numents[] = {
+    {"player_x", &config.player_x, TRUE},
+    {"player_y", &config.player_y, TRUE},
+    {"timer_mode", &config.timer_mode, TRUE},
+    {"vis_type", &config.vis_type, TRUE},
+    {"analyzer_mode", &config.analyzer_mode, TRUE},
+    {"analyzer_type", &config.analyzer_type, TRUE},
+    {"scope_mode", &config.scope_mode, TRUE},
+    {"vu_mode", &config.vu_mode, TRUE},
+    {"voiceprint_mode", &config.voiceprint_mode, TRUE},
+    {"vis_refresh_rate", &config.vis_refresh, TRUE},
+    {"analyzer_falloff", &config.analyzer_falloff, TRUE},
+    {"peaks_falloff", &config.peaks_falloff, TRUE},
+    {"playlist_x", &config.playlist_x, TRUE},
+    {"playlist_y", &config.playlist_y, TRUE},
+    {"playlist_width", &config.playlist_width, TRUE},
+    {"playlist_height", &config.playlist_height, TRUE},
+    {"playlist_position", &config.playlist_position, TRUE},
+    {"equalizer_x", &config.equalizer_x, TRUE},
+    {"equalizer_y", &config.equalizer_y, TRUE},
+    {"mouse_wheel_change", &config.mouse_change, TRUE},
+    {"scroll_pl_by", &config.scroll_pl_by, TRUE},
+    {"colorize_r", &config.colorize_r, TRUE},
+    {"colorize_g", &config.colorize_g, TRUE},
+    {"colorize_b", &config.colorize_b, TRUE},
+    {"snap_distance", &config.snap_distance, TRUE},
+    {"filepopup_delay", &config.filepopup_delay, TRUE},
+};
+
+static gint ncfgient = G_N_ELEMENTS(skins_numents);
+
+typedef struct skins_cfg_strent_t {
+    char const *se_vname;
+    char **se_vloc;
+    gboolean se_wrt;
+} skins_cfg_strent;
+
+static skins_cfg_strent skins_strents[] = {
+    {"playlist_font", &config.playlist_font, TRUE},
+    {"mainwin_font", &config.mainwin_font, TRUE},
+    {"skin", &config.skin, FALSE},
+};
+
+static gint ncfgsent = G_N_ELEMENTS(skins_strents);
+
+void skins_cfg_free() {
+    gint i;
+    for (i = 0; i < ncfgsent; ++i) {
+        if (*(skins_strents[i].se_vloc) != NULL) {
+            g_free( *(skins_strents[i].se_vloc) );
+            *(skins_strents[i].se_vloc) = NULL;
+        }
+    }
+}
+
+void skins_cfg_load() {
+    mcs_handle_t *cfgfile = aud_cfg_db_open();
+
+    memcpy(&config, &skins_default_config, sizeof(skins_cfg_t));
+    int i;
+
+    for (i = 0; i < ncfgbent; ++i) {
+        aud_cfg_db_get_bool(cfgfile, "skins",
+                            skins_boolents[i].be_vname,
+                            skins_boolents[i].be_vloc);
+    }
+
+    for (i = 0; i < ncfgient; ++i) {
+        aud_cfg_db_get_int(cfgfile, "skins",
+                           skins_numents[i].ie_vname,
+                           skins_numents[i].ie_vloc);
+    }
+
+    for (i = 0; i < ncfgsent; ++i) {
+        aud_cfg_db_get_string(cfgfile, "skins",
+                              skins_strents[i].se_vname,
+                              skins_strents[i].se_vloc);
+    }
+
+    if (!config.mainwin_font)
+        config.mainwin_font = g_strdup(MAINWIN_DEFAULT_FONT);
+
+    if (!config.playlist_font)
+        config.playlist_font = g_strdup(PLAYLISTWIN_DEFAULT_FONT);
+
+    if (!aud_cfg_db_get_float(cfgfile, "skins", "scale_factor", &(config.scale_factor)))
+        config.scale_factor = 2.0;
+
+    aud_cfg_db_close(cfgfile);
+}
+
+
+void skins_cfg_save() {
+    mcs_handle_t *cfgfile = aud_cfg_db_open();
+
+    if (aud_active_skin != NULL) {
+        if (aud_active_skin->path)
+            aud_cfg_db_set_string(cfgfile, "skins", "skin", aud_active_skin->path);
+        else
+            aud_cfg_db_unset_key(cfgfile, "skins", "skin");
+    }
+
+    int i;
+
+    for (i = 0; i < ncfgsent; ++i) {
+        if (skins_strents[i].se_wrt)
+            aud_cfg_db_set_string(cfgfile, "skins",
+                                  skins_strents[i].se_vname,
+                                  *skins_strents[i].se_vloc);
+    }
+
+    for (i = 0; i < ncfgbent; ++i)
+        if (skins_boolents[i].be_wrt)
+            aud_cfg_db_set_bool(cfgfile, "skins",
+                                skins_boolents[i].be_vname,
+                                *skins_boolents[i].be_vloc);
+
+    for (i = 0; i < ncfgient; ++i)
+        if (skins_numents[i].ie_wrt)
+            aud_cfg_db_set_int(cfgfile, "skins",
+                               skins_numents[i].ie_vname,
+                               *skins_numents[i].ie_vloc);
+
+    aud_cfg_db_close(cfgfile);
+}
+
+
+static void
+playlist_show_pl_separator_numbers_cb()
+{
+    playlistwin_update_list(aud_playlist_get_active());
+}
+
+static void
+mainwin_font_set_cb()
+{
+    ui_skinned_textbox_set_xfont(mainwin_info, !config.mainwin_use_bitmapfont, config.mainwin_font);
+}
+
+static void
+playlist_font_set_cb()
+{
+    AUDDBG("Attempt to set font \"%s\"\n", config.playlist_font);
+    ui_skinned_playlist_set_font(config.playlist_font);
+    playlistwin_set_sinfo_font(config.playlist_font);  /* propagate font setting to playlistwin_sinfo */
+    playlistwin_update_list(aud_playlist_get_active());
+}
+
+static void
+bitmap_fonts_cb()
+{
+    ui_skinned_textbox_set_xfont(mainwin_info, !config.mainwin_use_bitmapfont, config.mainwin_font);
+    playlistwin_set_sinfo_font(config.playlist_font);
+
+    if (config.playlist_shaded) {
+        playlistwin_update_list(aud_playlist_get_active());
+        ui_skinned_window_draw_all(playlistwin);
+    }
+}
+
+static void
+show_wm_decorations_cb()
+{
+    gtk_window_set_decorated(GTK_WINDOW(mainwin), config.show_wm_decorations);
+    gtk_window_set_decorated(GTK_WINDOW(playlistwin), config.show_wm_decorations);
+    gtk_window_set_decorated(GTK_WINDOW(equalizerwin), config.show_wm_decorations);
+}
+
+static PreferencesWidget appearance_misc_widgets[] = {
+    {WIDGET_LABEL, N_("<b>_Fonts</b>"), NULL, NULL, NULL, FALSE},
+    {WIDGET_FONT_BTN, N_("_Player:"), &config.mainwin_font, G_CALLBACK(mainwin_font_set_cb), N_("Select main player window font:"), FALSE},
+    {WIDGET_FONT_BTN, N_("_Playlist:"), &config.playlist_font, G_CALLBACK(playlist_font_set_cb), N_("Select playlist font:"), FALSE},
+    {WIDGET_CHK_BTN, N_("Use Bitmap fonts if available"), &config.mainwin_use_bitmapfont, G_CALLBACK(bitmap_fonts_cb), N_("Use bitmap fonts if they are available. Bitmap fonts do not support Unicode strings."), FALSE},
+    {WIDGET_LABEL, N_("<b>_Miscellaneous</b>"), NULL, NULL, NULL, FALSE},
+    {WIDGET_CHK_BTN, N_("Show track numbers in playlist"), &config.show_numbers_in_pl,
+        G_CALLBACK(playlist_show_pl_separator_numbers_cb), NULL, FALSE},
+    {WIDGET_CHK_BTN, N_("Show separators in playlist"), &config.show_separator_in_pl,
+        G_CALLBACK(playlist_show_pl_separator_numbers_cb), NULL, FALSE},
+    {WIDGET_CHK_BTN, N_("Show window manager decoration"), &config.show_wm_decorations, G_CALLBACK(show_wm_decorations_cb),
+        N_("This enables the window manager to show decorations for windows."), FALSE},
+    {WIDGET_CHK_BTN, N_("Use two-way text scroller"), &config.twoway_scroll, NULL,
+        N_("If selected, the file information text in the main window will scroll back and forth. If not selected, the text will only scroll in one direction."), FALSE},
+    {WIDGET_CHK_BTN, N_("Disable inline gtk theme"), &config.disable_inline_gtk, NULL, NULL, FALSE},
+    {WIDGET_CHK_BTN, N_("Allow loading incomplete skins"), &config.allow_broken_skins, NULL,
+        N_("If selected, audacious won't refuse loading broken skins. Use only if your favourite skin doesn't work"), FALSE},
+};
+
+static gboolean
+on_skin_view_realize(GtkTreeView * treeview,
+                     gpointer data)
+{
+    skin_view_realize(treeview);
+    skin_view_update(GTK_TREE_VIEW(skin_view), GTK_WIDGET(skin_refresh_button));
+
+    return TRUE;
+}
+
+static void
+reload_skin()
+{
+    /* reload the skin to apply the change */
+    skin_reload_forced();
+    ui_skinned_window_draw_all(mainwin);
+    ui_skinned_window_draw_all(equalizerwin);
+    ui_skinned_window_draw_all(playlistwin);
+}
+
+static void
+on_red_scale_value_changed(GtkHScale *scale, gpointer data)
+{
+    config.colorize_r = gtk_range_get_value(GTK_RANGE(scale));
+    reload_skin();
+}
+
+static void
+on_green_scale_value_changed(GtkHScale *scale, gpointer data)
+{
+    config.colorize_g = gtk_range_get_value(GTK_RANGE(scale));
+    reload_skin();
+}
+
+static void
+on_blue_scale_value_changed(GtkHScale *scale, gpointer data)
+{
+    config.colorize_b = gtk_range_get_value(GTK_RANGE(scale));
+    reload_skin();
+}
+
+static void
+on_colorize_close_clicked(GtkButton *button, gpointer data)
+{
+    gtk_widget_destroy(colorize_settings);
+    colorize_settings = NULL;
+}
+
+void
+create_colorize_settings(void)
+{
+    GtkWidget *vbox;
+    GtkWidget *label;
+    GtkWidget *table;
+    GtkWidget *hbuttonbox;
+    GtkWidget *colorize_close;
+
+    GtkWidget *green_label;
+    GtkWidget *red_label;
+    GtkWidget *blue_label;
+
+    colorize_settings = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+    gtk_container_set_border_width(GTK_CONTAINER(colorize_settings), 12);
+    gtk_window_set_title(GTK_WINDOW(colorize_settings), _("Color Adjustment"));
+    gtk_window_set_type_hint(GTK_WINDOW(colorize_settings), GDK_WINDOW_TYPE_HINT_DIALOG);
+    gtk_window_set_transient_for(GTK_WINDOW(colorize_settings), GTK_WINDOW(cfg_win));
+
+    vbox = gtk_vbox_new(FALSE, 12);
+    gtk_container_add(GTK_CONTAINER(colorize_settings), vbox);
+
+    label = gtk_label_new(_("Audacious allows you to alter the color balance of the skinned UI. The sliders below will allow you to do this."));
+    gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
+    gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
+    gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
+
+    table = gtk_table_new(3, 2, FALSE);
+    gtk_box_pack_start(GTK_BOX(vbox), table, TRUE, TRUE, 0);
+    gtk_table_set_row_spacings(GTK_TABLE(table), 6);
+    gtk_table_set_col_spacings(GTK_TABLE(table), 12);
+
+    blue_label = gtk_label_new(_("Blue"));
+    gtk_table_attach(GTK_TABLE(table), blue_label, 0, 1, 2, 3,
+                     (GtkAttachOptions) (0),
+                     (GtkAttachOptions) (0), 0, 0);
+    gtk_label_set_justify(GTK_LABEL(blue_label), GTK_JUSTIFY_RIGHT);
+    gtk_misc_set_alignment(GTK_MISC(blue_label), 1, 0.5);
+
+    green_label = gtk_label_new(_("Green"));
+    gtk_table_attach(GTK_TABLE(table), green_label, 0, 1, 1, 2,
+                     (GtkAttachOptions) (0),
+                     (GtkAttachOptions) (0), 0, 0);
+    gtk_label_set_justify(GTK_LABEL(green_label), GTK_JUSTIFY_RIGHT);
+    gtk_misc_set_alignment(GTK_MISC(green_label), 1, 0.5);
+
+    red_label = gtk_label_new(_("Red"));
+    gtk_table_attach(GTK_TABLE(table), red_label, 0, 1, 0, 1,
+                     (GtkAttachOptions) (0),
+                     (GtkAttachOptions) (0), 0, 0);
+    gtk_label_set_justify(GTK_LABEL(red_label), GTK_JUSTIFY_RIGHT);
+    gtk_misc_set_alignment(GTK_MISC(red_label), 1, 0.5);
+
+    red_scale = gtk_hscale_new(GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 255, 0, 0, 0)));
+    gtk_table_attach(GTK_TABLE(table), red_scale, 1, 2, 0, 1,
+                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+    gtk_scale_set_draw_value(GTK_SCALE(red_scale), FALSE);
+    gtk_scale_set_digits(GTK_SCALE(red_scale), 3);
+
+    green_scale = gtk_hscale_new(GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 255, 0, 0, 0)));
+    gtk_table_attach(GTK_TABLE(table), green_scale, 1, 2, 1, 2,
+                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+    gtk_scale_set_draw_value(GTK_SCALE(green_scale), FALSE);
+    gtk_scale_set_digits(GTK_SCALE(green_scale), 3);
+
+    blue_scale = gtk_hscale_new(GTK_ADJUSTMENT(gtk_adjustment_new(0, 0, 255, 0, 0, 0)));
+    gtk_table_attach(GTK_TABLE(table), blue_scale, 1, 2, 2, 3,
+                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
+                     (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0);
+    gtk_scale_set_draw_value(GTK_SCALE(blue_scale), FALSE);
+    gtk_scale_set_digits(GTK_SCALE(blue_scale), 3);
+
+    hbuttonbox = gtk_hbutton_box_new();
+    gtk_box_pack_start(GTK_BOX(vbox), hbuttonbox, FALSE, FALSE, 0);
+    gtk_button_box_set_layout(GTK_BUTTON_BOX(hbuttonbox), GTK_BUTTONBOX_END);
+    gtk_box_set_spacing(GTK_BOX(hbuttonbox), 6);
+
+    colorize_close = gtk_button_new_from_stock("gtk-close");
+    gtk_container_add(GTK_CONTAINER(hbuttonbox), colorize_close);
+    GTK_WIDGET_SET_FLAGS(colorize_close, GTK_CAN_DEFAULT);
+
+    g_signal_connect((gpointer) red_scale, "value_changed",
+                     G_CALLBACK(on_red_scale_value_changed),
+                     NULL);
+    g_signal_connect((gpointer) green_scale, "value_changed",
+                     G_CALLBACK(on_green_scale_value_changed),
+                     NULL);
+    g_signal_connect((gpointer) blue_scale, "value_changed",
+                     G_CALLBACK(on_blue_scale_value_changed),
+                     NULL);
+    g_signal_connect((gpointer) colorize_close, "clicked",
+                     G_CALLBACK(on_colorize_close_clicked),
+                     NULL);
+
+    gtk_range_set_value(GTK_RANGE(red_scale), config.colorize_r);
+    gtk_range_set_value(GTK_RANGE(green_scale), config.colorize_g);
+    gtk_range_set_value(GTK_RANGE(blue_scale), config.colorize_b);
+
+    gtk_widget_grab_default(colorize_close);
+    gtk_widget_show_all(colorize_settings);
+}
+
+static void
+on_colorize_button_clicked(GtkButton *button, gpointer data)
+{
+    if (colorize_settings)
+        gtk_window_present(GTK_WINDOW(colorize_settings));
+    else
+        create_colorize_settings();
+}
+
+void
+on_skin_view_drag_data_received(GtkWidget * widget,
+                                GdkDragContext * context,
+                                gint x, gint y,
+                                GtkSelectionData * selection_data,
+                                guint info, guint time,
+                                gpointer user_data) 
+{
+    mcs_handle_t *db;
+    gchar *path;
+
+    if (!selection_data->data) {
+        g_warning("DND data string is NULL");
+        return;
+    }
+
+    path = (gchar *) selection_data->data;
+
+    /* FIXME: use a real URL validator/parser */
+
+    if (aud_str_has_prefix_nocase(path, "file:///")) {
+        path[strlen(path) - 2] = 0; /* Why the hell a CR&LF? */
+        path += 7;
+    }
+    else if (aud_str_has_prefix_nocase(path, "file:")) {
+        path += 5;
+    }
+
+    if (file_is_archive(path)) {
+        if (!aud_active_skin_load(path))
+            return;
+        skin_install_skin(path);
+        skin_view_update(GTK_TREE_VIEW(widget),
+                         GTK_WIDGET(skin_refresh_button));
+
+        /* Change skin name in the config file */
+        db = aud_cfg_db_open();
+        aud_cfg_db_set_string(db, "skins", "skin", path);
+        aud_cfg_db_close(db);
+    }
+}
+
+void skins_configure(void) {
+    GtkWidget *appearance_page_vbox;
+    GtkWidget *vbox37;
+    GtkWidget *vbox38;
+    GtkWidget *hbox12;
+    GtkWidget *alignment94;
+    GtkWidget *hbox13;
+    GtkWidget *label103;
+    GtkWidget *colorspace_button;
+    GtkWidget *image11;
+    GtkWidget *image12;
+    GtkWidget *alignment95;
+    GtkWidget *skin_view_scrolled_window;
+
+    if (cfg_win != NULL) {
+        gtk_window_present(GTK_WINDOW(cfg_win));
+        return;
+    }
+
+    cfg_win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+    gtk_window_set_type_hint(GTK_WINDOW(cfg_win), GDK_WINDOW_TYPE_HINT_DIALOG);
+    gtk_window_set_title(GTK_WINDOW(cfg_win), _("Audacious Skinned GUI Configuration"));
+    gtk_container_set_border_width(GTK_CONTAINER(cfg_win), 10);
+    g_signal_connect(G_OBJECT(cfg_win), "destroy" ,
+                     G_CALLBACK(gtk_widget_destroyed), &cfg_win);
+    gtk_widget_set_size_request(cfg_win, 500, -1);
+
+    appearance_page_vbox = gtk_vbox_new (FALSE, 0);
+    gtk_container_add(GTK_CONTAINER(cfg_win), appearance_page_vbox);
+
+    vbox37 = gtk_vbox_new (FALSE, 0);
+    gtk_box_pack_start (GTK_BOX (appearance_page_vbox), vbox37, TRUE, TRUE, 0);
+
+    vbox38 = gtk_vbox_new (FALSE, 0);
+    gtk_box_pack_start (GTK_BOX (vbox37), vbox38, FALSE, TRUE, 0);
+
+    hbox12 = gtk_hbox_new (FALSE, 0);
+    gtk_box_pack_start (GTK_BOX (vbox38), hbox12, TRUE, TRUE, 0);
+
+    alignment94 = gtk_alignment_new (0.5, 0.5, 1, 1);
+    gtk_box_pack_start (GTK_BOX (hbox12), alignment94, TRUE, TRUE, 0);
+    gtk_alignment_set_padding (GTK_ALIGNMENT (alignment94), 0, 4, 0, 0);
+
+    hbox13 = gtk_hbox_new (FALSE, 0);
+    gtk_container_add (GTK_CONTAINER (alignment94), hbox13);
+
+    label103 = gtk_label_new_with_mnemonic (_("<b>_Skin</b>"));
+    gtk_box_pack_start (GTK_BOX (hbox13), label103, TRUE, TRUE, 0);
+    gtk_label_set_use_markup (GTK_LABEL (label103), TRUE);
+    gtk_misc_set_alignment (GTK_MISC (label103), 0, 0);
+
+    colorspace_button = gtk_button_new ();
+    gtk_box_pack_start (GTK_BOX (hbox13), colorspace_button, FALSE, FALSE, 0);
+
+    image11 = gtk_image_new_from_stock ("gtk-properties", GTK_ICON_SIZE_BUTTON);
+    gtk_container_add (GTK_CONTAINER (colorspace_button), image11);
+
+    skin_refresh_button = gtk_button_new ();
+    gtk_box_pack_start (GTK_BOX (hbox13), skin_refresh_button, FALSE, FALSE, 0);
+    GTK_WIDGET_UNSET_FLAGS (skin_refresh_button, GTK_CAN_FOCUS);
+    gtk_button_set_relief (GTK_BUTTON (skin_refresh_button), GTK_RELIEF_HALF);
+    gtk_button_set_focus_on_click (GTK_BUTTON (skin_refresh_button), FALSE);
+
+    image12 = gtk_image_new_from_stock ("gtk-refresh", GTK_ICON_SIZE_BUTTON);
+    gtk_container_add (GTK_CONTAINER (skin_refresh_button), image12);
+
+    alignment95 = gtk_alignment_new (0.5, 0.5, 1, 1);
+    gtk_box_pack_start (GTK_BOX (vbox38), alignment95, TRUE, TRUE, 0);
+    gtk_widget_set_size_request (alignment95, -1, 172);
+    gtk_alignment_set_padding (GTK_ALIGNMENT (alignment95), 0, 0, 12, 0);
+
+    skin_view_scrolled_window = gtk_scrolled_window_new (NULL, NULL);
+    gtk_container_add (GTK_CONTAINER (alignment95), skin_view_scrolled_window);
+    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (skin_view_scrolled_window), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
+    gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (skin_view_scrolled_window), GTK_SHADOW_IN);
+
+    skin_view = gtk_tree_view_new ();
+    gtk_container_add (GTK_CONTAINER (skin_view_scrolled_window), skin_view);
+    gtk_widget_set_size_request (skin_view, -1, 100);
+
+    aud_create_widgets(GTK_BOX(vbox37), appearance_misc_widgets, G_N_ELEMENTS(appearance_misc_widgets));
+    gtk_widget_show_all(appearance_page_vbox);
+
+
+    g_signal_connect(G_OBJECT(colorspace_button), "clicked",
+                     G_CALLBACK(on_colorize_button_clicked),
+                     NULL);
+
+    g_signal_connect(skin_view, "drag-data-received",
+                     G_CALLBACK(on_skin_view_drag_data_received),
+                     NULL);
+    aud_drag_dest_set(skin_view);
+
+    g_signal_connect(mainwin, "drag-data-received",
+                     G_CALLBACK(mainwin_drag_data_received),
+                     skin_view);
+#if 0
+    g_signal_connect(skin_refresh_button, "clicked",
+                     G_CALLBACK(on_skin_refresh_button_clicked),
+                     NULL);
+
+    g_signal_connect_swapped(G_OBJECT(skin_refresh_button), "clicked",
+                             G_CALLBACK(on_skin_refresh_button_clicked),
+                             prefswin);
+#endif
+    g_signal_connect_after(G_OBJECT(skin_view), "realize",
+                           G_CALLBACK(on_skin_view_realize),
+                           NULL);
+
+    gtk_window_present(GTK_WINDOW(cfg_win));
+
+    return;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/skins_cfg.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,91 @@
+/*
+ * Audacious - a cross-platform multimedia player
+ * Copyright (c) 2008 Tomasz Moń
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+#ifndef SKINS_CFG_H
+#define SKINS_CFG_H
+
+#include <glib.h>
+
+#define MAINWIN_DEFAULT_POS_X    20
+#define MAINWIN_DEFAULT_POS_Y    20
+#define EQUALIZER_DEFAULT_POS_X  20
+#define EQUALIZER_DEFAULT_POS_Y  136
+#define PLAYLISTWIN_DEFAULT_WIDTH       275
+#define PLAYLISTWIN_DEFAULT_HEIGHT      232
+#define PLAYLISTWIN_DEFAULT_POS_X       295
+#define PLAYLISTWIN_DEFAULT_POS_Y       20
+
+
+typedef struct {
+    gint player_x, player_y;
+    gint equalizer_x, equalizer_y;
+    gint playlist_x, playlist_y;
+    gint playlist_width, playlist_height;
+    gint snap_distance;
+    gboolean snap_windows, save_window_position;
+    gboolean scaled, autoscroll;
+    gboolean always_on_top, sticky;
+    gfloat scale_factor;
+    gboolean always_show_cb;
+    gboolean close_dialog_open;
+    gboolean close_dialog_add;
+    gchar *skin;
+    gchar *filesel_path;
+    gboolean player_visible, equalizer_visible, playlist_visible;
+    gboolean player_shaded, equalizer_shaded, playlist_shaded;
+    gboolean dim_titlebar;
+    gboolean show_wm_decorations;
+    gboolean easy_move;
+    gboolean allow_broken_skins;
+    gboolean disable_inline_gtk;
+    gboolean analyzer_peaks;
+    gboolean twoway_scroll;
+    gint timer_mode;
+    gint vis_type;
+    gint analyzer_mode, analyzer_type;
+    gint scope_mode;
+    gint voiceprint_mode;
+    gint vu_mode, vis_refresh;
+    gint analyzer_falloff, peaks_falloff;
+    gint playlist_position;
+    gint mouse_change;
+    gint colorize_r; gint colorize_g; gint colorize_b;
+    gint scroll_pl_by;
+    gboolean warn_about_win_visibility;
+    gboolean warn_about_broken_gtk_engines;
+    gboolean mainwin_use_bitmapfont;
+    gboolean eq_scaled_linked;
+    gboolean show_numbers_in_pl, show_separator_in_pl;
+    gchar *playlist_font, *mainwin_font;
+    gboolean show_filepopup_for_tuple;
+    gint filepopup_delay;
+    gboolean random_skin_on_play;
+} skins_cfg_t;
+
+extern skins_cfg_t config;
+
+skins_cfg_t * skins_cfg_new(void);
+void skins_cfg_free();
+void skins_cfg_load();
+void skins_cfg_save();
+
+void skins_configure(void);
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_dock.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,531 @@
+/*  Audacious - Cross-platform multimedia player
+ *  Copyright (C) 2005-2007  Audacious development team
+ *
+ *  Based on BMP:
+ *  Copyright (C) 2003-2004  BMP development team.
+ *
+ *  Based on XMMS:
+ *  Copyright (C) 1998-2003  XMMS development team.
+ *
+ *  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; under version 3 of the License.
+ *
+ *  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, see <http://www.gnu.org/licenses>.
+ *
+ *  The Audacious team does not consider modular code linking to
+ *  Audacious or using our public API to be a derived work.
+ */
+
+#include "ui_dock.h"
+#include "skins_cfg.h"
+#include <gdk/gdk.h>
+#include <stdlib.h>
+#include <audacious/plugin.h>
+#include "ui_skinned_window.h"
+
+#include "platform/smartinclude.h"
+
+static GList *dock_window_list = NULL;
+
+struct _DockedWindow {
+    GtkWindow *w;
+    gint offset_x, offset_y;
+};
+
+typedef struct _DockedWindow DockedWindow;
+
+
+static gint
+docked_list_compare(DockedWindow * a, DockedWindow * b)
+{
+    if (a->w == b->w)
+        return 0;
+    return 1;
+}
+
+static void
+snap_edge(gint * x, gint * y, gint w, gint h, gint bx, gint by,
+          gint bw, gint bh)
+{
+    gint sd = config.snap_distance;
+
+    if ((*x + w > bx - sd) && (*x + w < bx + sd) &&
+        (*y > by - h - sd) && (*y < by + bh + sd)) {
+        *x = bx - w;
+        if ((*y > by - sd) && (*y < by + sd))
+            *y = by;
+        if ((*y + h > by + bh - sd) && (*y + h < by + bh + sd))
+            *y = by + bh - h;
+    }
+    if ((*x > bx + bw - sd) && (*x < bx + bw + sd) &&
+        (*y > by - h - sd) && (*y < by + bh + sd)) {
+        *x = bx + bw;
+        if ((*y > by - sd) && (*y < by + sd))
+            *y = by;
+        if ((*y + h > by + bh - sd) && (*y + h < by + bh + sd))
+            *y = by + bh - h;
+    }
+}
+
+static void
+snap(gint * x, gint * y, gint w, gint h, gint bx, gint by, gint bw, gint bh)
+{
+    snap_edge(x, y, w, h, bx, by, bw, bh);
+    snap_edge(y, x, h, w, by, bx, bh, bw);
+}
+
+static void
+calc_snap_offset(GList * dlist, GList * wlist, gint x, gint y,
+                 gint * off_x, gint * off_y)
+{
+    gint nx, ny, nw, nh, sx, sy, sw, sh;
+    GtkWindow *w;
+    GList *dnode, *wnode;
+    DockedWindow temp, *dw;
+
+
+    *off_x = 0;
+    *off_y = 0;
+
+    if (!config.snap_windows)
+        return;
+
+    /*
+     * FIXME: Why not break out of the loop when we find someting
+     * to snap to?
+     */
+    for (dnode = dlist; dnode; dnode = g_list_next(dnode)) {
+        dw = dnode->data;
+        gtk_window_get_size(dw->w, &nw, &nh);
+
+        nx = dw->offset_x + *off_x + x;
+        ny = dw->offset_y + *off_y + y;
+
+        /* Snap to screen edges */
+        if (abs(nx) < config.snap_distance)
+            *off_x -= nx;
+        if (abs(ny) < config.snap_distance)
+            *off_y -= ny;
+        if (abs(nx + nw - gdk_screen_width()) < config.snap_distance)
+            *off_x -= nx + nw - gdk_screen_width();
+        if (abs(ny + nh - gdk_screen_height()) < config.snap_distance)
+            *off_y -= ny + nh - gdk_screen_height();
+
+        /* Snap to other windows */
+        for (wnode = wlist; wnode; wnode = g_list_next(wnode)) {
+            temp.w = wnode->data;
+            if (g_list_find_custom
+                (dlist, &temp, (GCompareFunc) docked_list_compare))
+                /* These windows are already docked */
+                continue;
+
+            w = GTK_WINDOW(wnode->data);
+            gtk_window_get_position(w, &sx, &sy);
+            gtk_window_get_size(w, &sw, &sh);
+
+            nx = dw->offset_x + *off_x + x;
+            ny = dw->offset_y + *off_y + y;
+
+            snap(&nx, &ny, nw, nh, sx, sy, sw, sh);
+
+            *off_x += nx - (dw->offset_x + *off_x + x);
+            *off_y += ny - (dw->offset_y + *off_y + y);
+        }
+    }
+}
+
+
+static gboolean
+is_docked(gint a_x, gint a_y, gint a_w, gint a_h,
+          gint b_x, gint b_y, gint b_w, gint b_h)
+{
+    if (((a_x == b_x + b_w) || (a_x + a_w == b_x)) &&
+        (b_y + b_h >= a_y) && (b_y <= a_y + a_h))
+        return TRUE;
+
+    if (((a_y == b_y + b_h) || (a_y + a_h == b_y)) &&
+        (b_x >= a_x - b_w) && (b_x <= a_x + a_w))
+        return TRUE;
+
+    return FALSE;
+}
+
+/*
+ * Builds a list of all windows that are docked to the window "w".
+ * Recursively adds all windows that are docked to the windows that are
+ * docked to "w" and so on...
+ * FIXME: init_off_?  ?
+ */
+
+static GList *
+get_docked_list(GList * dlist, GList * wlist, GtkWindow * w,
+                gint init_off_x, gint init_off_y)
+{
+    GList *node;
+    DockedWindow *dwin, temp;
+    gint w_x, w_y, w_width, w_height;
+    gint t_x, t_y, t_width, t_height;
+
+
+    gtk_window_get_position(w, &w_x, &w_y);
+    gtk_window_get_size(w, &w_width, &w_height);
+    if (!dlist) {
+        dwin = g_new0(DockedWindow, 1);
+        dwin->w = w;
+        dlist = g_list_append(dlist, dwin);
+    }
+
+    for (node = wlist; node; node = g_list_next(node)) {
+        temp.w = node->data;
+        if (g_list_find_custom
+            (dlist, &temp, (GCompareFunc) docked_list_compare))
+            continue;
+
+        gtk_window_get_position(GTK_WINDOW(node->data), &t_x, &t_y);
+        gtk_window_get_size(GTK_WINDOW(node->data), &t_width, &t_height);
+        if (is_docked
+            (w_x, w_y, w_width, w_height, t_x, t_y, t_width, t_height)) {
+            dwin = g_new0(DockedWindow, 1);
+            dwin->w = node->data;
+
+            dwin->offset_x = t_x - w_x + init_off_x;
+            dwin->offset_y = t_y - w_y + init_off_y;
+
+            dlist = g_list_append(dlist, dwin);
+
+            dlist =
+                get_docked_list(dlist, wlist, dwin->w, dwin->offset_x,
+                                dwin->offset_y);
+        }
+    }
+    return dlist;
+}
+
+static void
+free_docked_list(GList * dlist)
+{
+    GList *node;
+
+    for (node = dlist; node; node = g_list_next(node))
+        g_free(node->data);
+    g_list_free(dlist);
+}
+
+static void
+docked_list_move(GList * list, gint x, gint y)
+{
+    GList *node;
+    DockedWindow *dw;
+
+    for (node = list; node; node = g_list_next(node)) {
+        dw = node->data;
+        gtk_window_move(dw->w, x + dw->offset_x, y + dw->offset_y);
+
+        SkinnedWindow *window = SKINNED_WINDOW(dw->w);
+        if (window) {
+            switch(window->type) {
+
+            case WINDOW_MAIN:
+                config.player_x = x + dw->offset_x;
+                config.player_y = y + dw->offset_y;
+                break;
+            case WINDOW_EQ:
+                config.equalizer_x = x + dw->offset_x;
+                config.equalizer_y = y + dw->offset_y;
+                break;
+            case WINDOW_PLAYLIST:
+                config.playlist_x = x + dw->offset_x;
+                config.playlist_y = y + dw->offset_y;
+                break;
+            }
+
+            window->x = x + dw->offset_x;
+            window->y = y + dw->offset_y;
+        }
+    }
+}
+
+static GList *
+shade_move_list(GList * list, GtkWindow * widget, gint offset)
+{
+    gint x, y, w, h;
+    GList *node;
+    DockedWindow *dw;
+
+    gtk_window_get_position(widget, &x, &y);
+    gtk_window_get_size(widget, &w, &h);
+
+
+    for (node = list; node;) {
+        gint dx, dy, dwidth, dheight;
+
+        dw = node->data;
+        gtk_window_get_position(dw->w, &dx, &dy);
+        gtk_window_get_size(dw->w, &dwidth, &dheight);
+        if (is_docked(x, y, w, h, dx, dy, dwidth, dheight) &&
+            ((dx + dwidth) > x && dx < (x + w))) {
+            list = g_list_remove_link(list, node);
+            g_list_free_1(node);
+
+            node = list = shade_move_list(list, dw->w, offset);
+        }
+        else
+            node = g_list_next(node);
+    }
+    gtk_window_move(widget, x, y + offset);
+    return list;
+}
+
+/*
+ * Builds a list of the windows in the list of DockedWindows "winlist"
+ * that are docked to the top or bottom of the window, and recursively
+ * adds all windows that are docked to the top or bottom of that window,
+ * and so on...
+ * Note: The data in "winlist" is not copied.
+ */
+static GList *
+find_shade_list(GtkWindow * widget, GList * winlist, GList * shade_list)
+{
+    gint x, y, w, h;
+    gint dx, dy, dwidth, dheight;
+    GList *node;
+
+    gtk_window_get_position(widget, &x, &y);
+    gtk_window_get_size(widget, &w, &h);
+    for (node = winlist; node; node = g_list_next(node)) {
+        DockedWindow *dw = node->data;
+        if (g_list_find_custom
+            (shade_list, dw, (GCompareFunc) docked_list_compare))
+            continue;
+        gtk_window_get_position(dw->w, &dx, &dy);
+        gtk_window_get_size(dw->w, &dwidth, &dheight);
+
+        /* FIXME. Is the is_docked() necessary? */
+        if (is_docked(x, y, w, h, dx, dy, dwidth, dheight) &&
+            ((dx + dwidth) > x && dx < (x + w))) {
+            shade_list = g_list_append(shade_list, dw);
+            shade_list = find_shade_list(dw->w, winlist, shade_list);
+        }
+    }
+    return shade_list;
+}
+
+void
+dock_window_resize(GtkWindow * widget, gint new_w, gint new_h, gint w, gint h)
+{
+    gdk_window_set_hints(GTK_WIDGET(widget)->window, 0, 0, MIN(w, new_w),
+                         MIN(h, new_h), MAX(w, new_w), MAX(h, new_h),
+                         GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
+    gdk_window_resize(GTK_WIDGET(widget)->window, new_w, new_h);
+    gdk_window_set_hints(GTK_WIDGET(widget)->window, 0, 0, new_w, new_h,
+                         new_w, new_h, GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE);
+}
+
+void
+dock_shade(GList * window_list, GtkWindow * widget, gint new_h)
+{
+    gint x, y, w, h, off_y, orig_off_y;
+    GList *node, *docked_list, *slist;
+    DockedWindow *dw;
+
+    gtk_window_get_position(widget, &x, &y);
+    gtk_window_get_size(widget, &w, &h);
+
+    if (config.show_wm_decorations) {
+        dock_window_resize(widget, w, new_h, w, h);
+        return;
+    }
+
+    docked_list = get_docked_list(NULL, window_list, widget, 0, 0);
+    slist = find_shade_list(widget, docked_list, NULL);
+
+    off_y = new_h - h;
+    do {
+        orig_off_y = off_y;
+        for (node = slist; node; node = g_list_next(node)) {
+            gint dx, dy, dwidth, dheight;
+
+            dw = node->data;
+            if (dw->w == widget)
+                continue;
+            gtk_window_get_position(dw->w, &dx, &dy);
+            gtk_window_get_size(dw->w, &dwidth, &dheight);
+            if ((dy >= y) && ((dy + off_y + dheight) > gdk_screen_height()))
+                off_y -= (dy + off_y + dheight) - gdk_screen_height();
+            else if ((dy >= y) && ((dy + dheight) == gdk_screen_height()))
+                off_y = 0;
+
+            if (((dy >= y) && ((dy + off_y) < 0)))
+                off_y -= dy + off_y;
+            if ((dy < y) && ((dy + (off_y - (new_h - h))) < 0))
+                off_y -= dy + (off_y - (new_h - h));
+        }
+    } while (orig_off_y != off_y);
+    if (slist) {
+        GList *mlist = g_list_copy(slist);
+
+        /* Remove this widget from the list */
+        for (node = mlist; node; node = g_list_next(node)) {
+            dw = node->data;
+            if (dw->w == widget) {
+                mlist = g_list_remove_link(mlist, node);
+                g_list_free_1(node);
+                break;
+            }
+        }
+        for (node = mlist; node;) {
+            GList *temp;
+            gint dx, dy, dwidth, dheight;
+
+            dw = node->data;
+
+            gtk_window_get_position(dw->w, &dx, &dy);
+            gtk_window_get_size(dw->w, &dwidth, &dheight);
+            /*
+             * Find windows that are directly docked to this window,
+             * move it, and any windows docked to that window again
+             */
+            if (is_docked(x, y, w, h, dx, dy, dwidth, dheight) &&
+                ((dx + dwidth) > x && dx < (x + w))) {
+                mlist = g_list_remove_link(mlist, node);
+                g_list_free_1(node);
+                if (dy > y)
+                    temp = shade_move_list(mlist, dw->w, off_y);
+                else if (off_y - (new_h - h) != 0)
+                    temp = shade_move_list(mlist, dw->w, off_y - (new_h - h));
+                else
+                    temp = mlist;
+                node = mlist = temp;
+            }
+            else
+                node = g_list_next(node);
+        }
+        g_list_free(mlist);
+    }
+    g_list_free(slist);
+    free_docked_list(docked_list);
+    gtk_window_move(widget, x, y + off_y - (new_h - h));
+    dock_window_resize(widget, w, new_h, w, h);
+}
+
+void
+dock_move_press(GList * window_list, GtkWindow * w,
+                GdkEventButton * event, gboolean move_list)
+{
+    gint mx, my;
+    DockedWindow *dwin;
+
+    if (config.show_wm_decorations)
+        return;
+
+    gtk_window_present(w);
+    mx = event->x;
+    my = event->y;
+    gtk_object_set_data(GTK_OBJECT(w), "move_offset_x", GINT_TO_POINTER(mx));
+    gtk_object_set_data(GTK_OBJECT(w), "move_offset_y", GINT_TO_POINTER(my));
+    if (move_list)
+        gtk_object_set_data(GTK_OBJECT(w), "docked_list",
+                            get_docked_list(NULL, window_list, w, 0, 0));
+    else {
+        dwin = g_new0(DockedWindow, 1);
+        dwin->w = w;
+        gtk_object_set_data(GTK_OBJECT(w), "docked_list",
+                            g_list_append(NULL, dwin));
+    }
+    gtk_object_set_data(GTK_OBJECT(w), "window_list", window_list);
+    gtk_object_set_data(GTK_OBJECT(w), "is_moving", GINT_TO_POINTER(1));
+}
+
+void
+dock_move_motion(GtkWindow * w, GdkEventMotion * event)
+{
+    gint offset_x, offset_y, x, y;
+    GList *dlist;
+    GList *window_list;
+
+    if (!gtk_object_get_data(GTK_OBJECT(w), "is_moving"))
+        return;
+
+    offset_x =
+        GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(w), "move_offset_x"));
+    offset_y =
+        GPOINTER_TO_INT(gtk_object_get_data(GTK_OBJECT(w), "move_offset_y"));
+    dlist = gtk_object_get_data(GTK_OBJECT(w), "docked_list");
+    window_list = gtk_object_get_data(GTK_OBJECT(w), "window_list");
+
+    x = event->x_root - offset_x;
+    y = event->y_root - offset_y;
+
+    calc_snap_offset(dlist, window_list, x, y, &offset_x, &offset_y);
+    x += offset_x;
+    y += offset_y;
+
+    docked_list_move(dlist, x, y);
+}
+
+void
+dock_move_release(GtkWindow * w)
+{
+    GList *dlist;
+    gtk_object_remove_data(GTK_OBJECT(w), "is_moving");
+    gtk_object_remove_data(GTK_OBJECT(w), "move_offset_x");
+    gtk_object_remove_data(GTK_OBJECT(w), "move_offset_y");
+    if ((dlist = gtk_object_get_data(GTK_OBJECT(w), "docked_list")) != NULL)
+        free_docked_list(dlist);
+    gtk_object_remove_data(GTK_OBJECT(w), "docked_list");
+    gtk_object_remove_data(GTK_OBJECT(w), "window_list");
+}
+
+gboolean
+dock_is_moving(GtkWindow * w)
+{
+    if (gtk_object_get_data(GTK_OBJECT(w), "is_moving"))
+        return TRUE;
+    return FALSE;
+}
+
+GList *
+dock_add_window(GList * list, GtkWindow * window)
+{
+    return g_list_append(list, window);
+}
+
+GList *
+dock_remove_window(GList * list, GtkWindow * window)
+{
+    return g_list_remove(list, window);
+}
+
+GList *
+dock_window_set_decorated(GList * list, GtkWindow * window,
+                          gboolean decorated)
+{
+    if (gtk_window_get_decorated(window) == decorated)
+        return list;
+
+    if (decorated)
+        list = dock_remove_window(list, window);
+    else
+        list = dock_add_window(list, window);
+
+    gtk_window_set_decorated(window, decorated);
+
+    return list;
+}
+
+GList *
+get_dock_window_list() {
+    return dock_window_list;
+}
+
+void
+set_dock_window_list(GList * list) {
+    dock_window_list = list;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_dock.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,50 @@
+/*  Audacious - Cross-platform multimedia player
+ *  Copyright (C) 2005-2007  Audacious development team
+ *
+ *  Based on BMP:
+ *  Copyright (C) 2003-2004  BMP development team.
+ *
+ *  Based on XMMS:
+ *  Copyright (C) 1998-2003  XMMS development team.
+ *
+ *  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; under version 3 of the License.
+ *
+ *  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, see <http://www.gnu.org/licenses>.
+ *
+ *  The Audacious team does not consider modular code linking to
+ *  Audacious or using our public API to be a derived work.
+ */
+
+#ifndef DOCK_H
+#define DOCK_H
+
+#include <glib.h>
+#include <gtk/gtk.h>
+
+void dock_set_uposition(GtkWindow * widget, gint x, gint y);
+GList *dock_add_window(GList * window_list, GtkWindow * window);
+GList *dock_remove_window(GList * window_list, GtkWindow * window);
+void dock_move_press(GList * window_list, GtkWindow * w,
+                     GdkEventButton * event, gboolean move_list);
+void dock_move_motion(GtkWindow * w, GdkEventMotion * event);
+void dock_move_release(GtkWindow * w);
+void dock_get_widget_pos(GtkWindow * w, gint * x, gint * y);
+gboolean dock_is_moving(GtkWindow * w);
+void dock_shade(GList * window_list, GtkWindow * widget, gint new_h);
+
+GList *dock_window_set_decorated(GList * list, GtkWindow * window,
+                                 gboolean decorated);
+void dock_window_resize(GtkWindow * widget, gint new_w, gint new_h, gint w, gint h);
+
+GList *get_dock_window_list();
+void set_dock_window_list(GList * list);
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_equalizer.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,1531 @@
+/*  Audacious - Cross-platform multimedia player
+ *  Copyright (C) 2005-2007  Audacious development team.
+ *
+ *  Based on BMP:
+ *  Copyright (C) 2003-2004  BMP development team.
+ *
+ *  Based on XMMS:
+ *  Copyright (C) 1998-2003  XMMS development team.
+ *
+ *  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; under version 3 of the License.
+ *
+ *  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, see <http://www.gnu.org/licenses>.
+ *
+ *  The Audacious team does not consider modular code linking to
+ *  Audacious or using our public API to be a derived work.
+ */
+
+/*#define AUD_DEBUG*/
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "ui_equalizer.h"
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <stdio.h>
+#include <math.h>
+#include <string.h>
+
+#include "platform/smartinclude.h"
+#include "ui_skin.h"
+#include "ui_manager.h"
+#include "actions-equalizer.h"
+#include "util.h"
+#include "ui_main.h"
+#include "ui_playlist.h"
+#include <audacious/plugin.h>
+
+#include "images/audacious_eq.xpm"
+
+#include "ui_dock.h"
+#include "ui_skinned_window.h"
+#include "ui_skinned_button.h"
+#include "ui_skinned_horizontal_slider.h"
+#include "ui_skinned_equalizer_slider.h"
+#include "ui_skinned_equalizer_graph.h"
+#include "skins_cfg.h"
+
+enum PresetViewCols {
+    PRESET_VIEW_COL_NAME,
+    PRESET_VIEW_N_COLS
+};
+
+struct _EqualizerPreset {
+    gchar *name;
+    gfloat preamp, bands[10];
+};
+
+typedef struct _EqualizerPreset EqualizerPreset;
+
+
+GtkWidget *equalizerwin;
+GtkWidget *equalizerwin_graph;
+
+static GtkWidget *equalizerwin_load_window = NULL;
+static GtkWidget *equalizerwin_load_auto_window = NULL;
+static GtkWidget *equalizerwin_save_window = NULL;
+static GtkWidget *equalizerwin_save_entry = NULL;
+static GtkWidget *equalizerwin_save_auto_window = NULL;
+static GtkWidget *equalizerwin_save_auto_entry = NULL;
+static GtkWidget *equalizerwin_delete_window = NULL;
+static GtkWidget *equalizerwin_delete_auto_window = NULL;
+
+static GtkWidget *equalizerwin_on, *equalizerwin_auto;
+
+static GtkWidget *equalizerwin_close, *equalizerwin_presets, *equalizerwin_shade;
+static GtkWidget *equalizerwin_preamp,*equalizerwin_bands[10];
+static GtkWidget *equalizerwin_volume, *equalizerwin_balance;
+
+static GList *equalizer_presets = NULL, *equalizer_auto_presets = NULL;
+
+EqualizerPreset *
+equalizer_preset_new(const gchar * name)
+{
+    EqualizerPreset *preset = g_new0(EqualizerPreset, 1);
+    preset->name = g_strdup(name);
+    return preset;
+}
+
+void
+equalizer_preset_free(EqualizerPreset * preset)
+{
+    if (!preset)
+        return;
+
+    g_free(preset->name);
+    g_free(preset);
+}
+
+void
+equalizerwin_set_scaled(gboolean ds)
+{
+    gint height;
+
+    if (config.equalizer_shaded)
+        height = 14;
+    else
+        height = 116;
+
+    if (config.scaled) {
+        dock_window_resize(GTK_WINDOW(equalizerwin), 275 * config.scale_factor, 
+            height * config.scale_factor, 275 * config.scale_factor, height * config.scale_factor);
+    } else {
+        dock_window_resize(GTK_WINDOW(equalizerwin), 275, height, 275, height);
+    }
+
+    GList *iter;
+    for (iter = GTK_FIXED (SKINNED_WINDOW(equalizerwin)->fixed)->children; iter; iter = g_list_next (iter)) {
+        GtkFixedChild *child_data = (GtkFixedChild *) iter->data;
+        GtkWidget *child = child_data->widget;
+        g_signal_emit_by_name(child, "toggle-scaled");
+    }
+    gtk_widget_shape_combine_mask(equalizerwin, skin_get_mask(aud_active_skin, SKIN_MASK_EQ + config.equalizer_shaded), 0, 0);
+}
+
+void
+equalizerwin_set_shade_menu_cb(gboolean shaded)
+{
+    config.equalizer_shaded = shaded;
+
+    if (shaded) {
+        dock_shade(get_dock_window_list(), GTK_WINDOW(equalizerwin),
+                   14 * EQUALIZER_SCALE_FACTOR);
+        ui_skinned_set_push_button_data(equalizerwin_shade, -1, 3, -1, 47);
+        ui_skinned_button_set_skin_index1(equalizerwin_shade, SKIN_EQ_EX);
+        ui_skinned_set_push_button_data(equalizerwin_close, 11, 38, 11, 47);
+        ui_skinned_button_set_skin_index(equalizerwin_close, SKIN_EQ_EX);
+        gtk_widget_show(equalizerwin_volume);
+        gtk_widget_show(equalizerwin_balance);
+    }
+    else {
+        dock_shade(get_dock_window_list(), GTK_WINDOW(equalizerwin),
+                   116 * EQUALIZER_SCALE_FACTOR);
+        ui_skinned_set_push_button_data(equalizerwin_shade, -1, 137, -1, 38);
+        ui_skinned_button_set_skin_index1(equalizerwin_shade, SKIN_EQMAIN);
+        ui_skinned_set_push_button_data(equalizerwin_close, 0, 116, 0, 125);
+        ui_skinned_button_set_skin_index(equalizerwin_close, SKIN_EQMAIN);
+        gtk_widget_hide(equalizerwin_volume);
+        gtk_widget_hide(equalizerwin_balance);
+    }
+
+    gtk_widget_shape_combine_mask(equalizerwin, skin_get_mask(aud_active_skin, SKIN_MASK_EQ + config.equalizer_shaded), 0, 0);
+}
+
+static void
+equalizerwin_set_shade(gboolean shaded)
+{
+    GtkAction *action = gtk_action_group_get_action(
+      toggleaction_group_others , "roll up equalizer" );
+    gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(action) , shaded );
+}
+
+static void
+equalizerwin_shade_toggle(void)
+{
+    equalizerwin_set_shade(!config.equalizer_shaded);
+}
+
+void
+equalizerwin_eq_changed(void)
+{
+    gint i;
+
+    aud_cfg->equalizer_preamp = ui_skinned_equalizer_slider_get_position(equalizerwin_preamp);
+    for (i = 0; i < 10; i++)
+        aud_cfg->equalizer_bands[i] = ui_skinned_equalizer_slider_get_position(equalizerwin_bands[i]);
+
+    aud_hook_call("equalizer changed", NULL);
+    gtk_widget_queue_draw(equalizerwin_graph);
+}
+
+static void
+equalizerwin_on_pushed(void)
+{
+    aud_cfg->equalizer_active = UI_SKINNED_BUTTON(equalizerwin_on)->inside;
+    equalizerwin_eq_changed();
+}
+
+static void
+equalizerwin_presets_pushed(void)
+{
+    GdkModifierType modmask;
+    gint x, y;
+
+    gdk_window_get_pointer(NULL, &x, &y, &modmask);
+    ui_manager_popup_menu_show(GTK_MENU(equalizerwin_presets_menu), x, y, 1, GDK_CURRENT_TIME);
+}
+
+static void
+equalizerwin_auto_pushed(void)
+{
+    aud_cfg->equalizer_autoload = UI_SKINNED_BUTTON(equalizerwin_auto)->inside;
+}
+
+gboolean
+equalizerwin_press(GtkWidget * widget, GdkEventButton * event,
+                   gpointer callback_data)
+{
+    if (event->button == 1 && event->type == GDK_2BUTTON_PRESS
+             && event->y < 14) {
+        equalizerwin_set_shade(!config.equalizer_shaded);
+        if (dock_is_moving(GTK_WINDOW(equalizerwin)))
+            dock_move_release(GTK_WINDOW(equalizerwin));
+        return TRUE;
+    }
+    if (event->button == 3) {
+        /*
+         * Pop up the main menu a few pixels down to avoid
+         * anything to be selected initially.
+         */
+       ui_manager_popup_menu_show(GTK_MENU(mainwin_general_menu), event->x_root,
+                                event->y_root + 2, 3, event->time);
+       return TRUE;
+    }
+
+    return FALSE;
+}
+
+static gboolean
+equalizerwin_keypress(GtkWidget * widget,
+                      GdkEventKey * event,
+                      gpointer data)
+{
+    if (event->keyval == GDK_Tab && event->state & GDK_CONTROL_MASK) {
+        if (config.playlist_visible)
+            gtk_window_present(GTK_WINDOW(playlistwin));
+        else if (config.player_visible)
+            gtk_window_present(GTK_WINDOW(mainwin));
+        return TRUE;
+    }
+    if (!config.equalizer_shaded) {
+        gtk_widget_event(mainwin, (GdkEvent *) event);
+        return TRUE;
+    }
+
+    switch (event->keyval) {
+    case GDK_Left:
+    case GDK_KP_Left:
+        mainwin_set_balance_diff(-4);
+        break;
+    case GDK_Right:
+    case GDK_KP_Right:
+        mainwin_set_balance_diff(4);
+        break;
+    default:
+        gtk_widget_event(mainwin, (GdkEvent *) event);
+        break;
+    }
+
+    return FALSE;
+}
+
+static void
+equalizerwin_close_cb(void)
+{
+    equalizerwin_show(FALSE);
+}
+
+static gboolean
+equalizerwin_delete(GtkWidget * widget,
+                    gpointer data)
+{
+    equalizerwin_show(FALSE);
+    return TRUE;
+}
+
+static GList *
+equalizerwin_read_presets(const gchar * basename)
+{
+#if 0
+    gchar *filename, *name;
+    RcFile *rcfile;
+    GList *list = NULL;
+    gint i, p = 0;
+    EqualizerPreset *preset;
+
+    /* START mod: add check for the default presets locate in system path ({prefix}/share/audacious)
+       by Massimo Cavalleri (submax) */
+
+    filename = g_build_filename(aud_paths[BMP_PATH_USER_DIR], basename, NULL);
+
+    if ((rcfile = aud_rcfile_open(filename)) == NULL) {
+        g_free(filename);
+        // DATA_DIR = "{prefix}/share/audacious" ; example is "/usr/share/audacious"
+        filename = g_build_filename(DATA_DIR, basename, NULL);
+        if ((rcfile = aud_rcfile_open(filename)) == NULL) {
+           g_free(filename);
+           return NULL;
+        }
+    }
+
+    // END mod
+
+    g_free(filename);
+
+    for (;;) {
+        gchar section[21];
+
+        g_snprintf(section, sizeof(section), "Preset%d", p++);
+        if (aud_rcfile_read_string(rcfile, "Presets", section, &name)) {
+            preset = g_new0(EqualizerPreset, 1);
+            preset->name = name;
+            aud_rcfile_read_float(rcfile, name, "Preamp", &preset->preamp);
+            for (i = 0; i < 10; i++) {
+                gchar band[7];
+                g_snprintf(band, sizeof(band), "Band%d", i);
+                aud_rcfile_read_float(rcfile, name, band, &preset->bands[i]);
+            }
+            list = g_list_prepend(list, preset);
+        }
+        else
+            break;
+    }
+    list = g_list_reverse(list);
+    aud_rcfile_free(rcfile);
+    return list;
+#endif
+}
+
+gint
+equalizerwin_volume_frame_cb(gint pos)
+{
+    if (equalizerwin_volume) {
+        gint x;
+        if (pos < 32)
+            x = 1;
+        else if (pos < 63)
+            x = 4;
+        else
+            x = 7;
+
+        UI_SKINNED_HORIZONTAL_SLIDER(equalizerwin_volume)->knob_nx = x;
+        UI_SKINNED_HORIZONTAL_SLIDER(equalizerwin_volume)->knob_px = x;
+    }
+    return 1;
+}
+
+static void
+equalizerwin_volume_motion_cb(GtkWidget *widget, gint pos)
+{
+    gint v = (gint) rint(pos * 100 / 94.0);
+    mainwin_adjust_volume_motion(v);
+    mainwin_set_volume_slider(v);
+}
+
+static void
+equalizerwin_volume_release_cb(GtkWidget *widget, gint pos)
+{
+    mainwin_adjust_volume_release();
+}
+
+static gint
+equalizerwin_balance_frame_cb(gint pos)
+{
+    if (equalizerwin_balance) {
+        gint x;
+        if (pos < 13)
+            x = 11;
+        else if (pos < 26)
+            x = 14;
+        else
+            x = 17;
+
+        UI_SKINNED_HORIZONTAL_SLIDER(equalizerwin_balance)->knob_nx = x;
+        UI_SKINNED_HORIZONTAL_SLIDER(equalizerwin_balance)->knob_px = x;
+    }
+
+    return 1;
+}
+
+static void
+equalizerwin_balance_motion_cb(GtkWidget *widget, gint pos)
+{
+    gint b;
+    pos = MIN(pos, 38);         /* The skin uses a even number of pixels
+                                   for the balance-slider *sigh* */
+    b = (gint) rint((pos - 19) * 100 / 19.0);
+    mainwin_adjust_balance_motion(b);
+    mainwin_set_balance_slider(b);
+}
+
+static void
+equalizerwin_balance_release_cb(GtkWidget *widget, gint pos)
+{
+    mainwin_adjust_balance_release();
+}
+
+void
+equalizerwin_set_balance_slider(gint percent)
+{
+    ui_skinned_horizontal_slider_set_position(equalizerwin_balance,
+                         (gint) rint((percent * 19 / 100.0) + 19));
+}
+
+void
+equalizerwin_set_volume_slider(gint percent)
+{
+    ui_skinned_horizontal_slider_set_position(equalizerwin_volume,
+                         (gint) rint(percent * 94 / 100.0));
+}
+
+static void
+equalizerwin_create_widgets(void)
+{
+    gint i;
+
+    equalizerwin_on = ui_skinned_button_new();
+    ui_skinned_toggle_button_setup(equalizerwin_on, SKINNED_WINDOW(equalizerwin)->fixed,
+                                   14, 18, 25, 12, 10, 119, 128, 119, 69, 119, 187, 119, SKIN_EQMAIN);
+    g_signal_connect(equalizerwin_on, "clicked", equalizerwin_on_pushed, NULL);
+    ui_skinned_button_set_inside(equalizerwin_on, aud_cfg->equalizer_active);
+
+    equalizerwin_auto = ui_skinned_button_new();
+    ui_skinned_toggle_button_setup(equalizerwin_auto, SKINNED_WINDOW(equalizerwin)->fixed,
+                                   39, 18, 33, 12, 35, 119, 153, 119, 94, 119, 212, 119, SKIN_EQMAIN);
+    g_signal_connect(equalizerwin_auto, "clicked", equalizerwin_auto_pushed, NULL);
+    ui_skinned_button_set_inside(equalizerwin_auto, aud_cfg->equalizer_autoload);
+
+    equalizerwin_presets = ui_skinned_button_new();
+    ui_skinned_push_button_setup(equalizerwin_presets, SKINNED_WINDOW(equalizerwin)->fixed,
+                                 217, 18, 44, 12, 224, 164, 224, 176, SKIN_EQMAIN);
+    g_signal_connect(equalizerwin_presets, "clicked", equalizerwin_presets_pushed, NULL );
+
+    equalizerwin_close = ui_skinned_button_new();
+    ui_skinned_push_button_setup(equalizerwin_close, SKINNED_WINDOW(equalizerwin)->fixed,
+                                 264, 3, 9, 9, 0, 116, 0, 125, SKIN_EQMAIN);
+    g_signal_connect(equalizerwin_close, "clicked", equalizerwin_close_cb, NULL );
+
+    equalizerwin_shade = ui_skinned_button_new();
+    ui_skinned_push_button_setup(equalizerwin_shade, SKINNED_WINDOW(equalizerwin)->fixed,
+                                 254, 3, 9, 9, 254, 137, 1, 38, SKIN_EQMAIN);
+    ui_skinned_button_set_skin_index2(equalizerwin_shade, SKIN_EQ_EX);
+    g_signal_connect(equalizerwin_shade, "clicked", equalizerwin_shade_toggle, NULL );
+
+    equalizerwin_graph = ui_skinned_equalizer_graph_new(SKINNED_WINDOW(equalizerwin)->fixed, 86, 17);
+
+    equalizerwin_preamp = ui_skinned_equalizer_slider_new(SKINNED_WINDOW(equalizerwin)->fixed, 21, 38);
+    ui_skinned_equalizer_slider_set_position(equalizerwin_preamp, aud_cfg->equalizer_preamp);
+
+    for (i = 0; i < 10; i++) {
+        equalizerwin_bands[i] =
+            ui_skinned_equalizer_slider_new(SKINNED_WINDOW(equalizerwin)->fixed, 78 + (i * 18), 38);
+        ui_skinned_equalizer_slider_set_position(equalizerwin_bands[i], aud_cfg->equalizer_bands[i]);
+    }
+
+    equalizerwin_volume =
+        ui_skinned_horizontal_slider_new(SKINNED_WINDOW(equalizerwin)->fixed,
+                                         61, 4, 97, 8, 1, 30, 1, 30, 3, 7, 4, 61, 0, 94,
+                                         equalizerwin_volume_frame_cb, SKIN_EQ_EX);
+    g_signal_connect(equalizerwin_volume, "motion", G_CALLBACK(equalizerwin_volume_motion_cb), NULL);
+    g_signal_connect(equalizerwin_volume, "release", G_CALLBACK(equalizerwin_volume_release_cb), NULL);
+
+
+    equalizerwin_balance =
+        ui_skinned_horizontal_slider_new(SKINNED_WINDOW(equalizerwin)->fixed,
+                       164, 4, 42, 8, 11, 30, 11, 30, 3, 7, 4, 164, 0, 39,
+                       equalizerwin_balance_frame_cb, SKIN_EQ_EX);
+    g_signal_connect(equalizerwin_balance, "motion", G_CALLBACK(equalizerwin_balance_motion_cb), NULL);
+    g_signal_connect(equalizerwin_balance, "release", G_CALLBACK(equalizerwin_balance_release_cb), NULL);
+}
+
+
+static void
+equalizerwin_create_window(void)
+{
+    GdkPixbuf *icon;
+    gint width, height;
+
+    width = 275;
+    height = config.equalizer_shaded ? 14 : 116;
+
+    equalizerwin = ui_skinned_window_new("equalizer");
+    gtk_window_set_title(GTK_WINDOW(equalizerwin), _("Audacious Equalizer"));
+    gtk_window_set_role(GTK_WINDOW(equalizerwin), "equalizer");
+    gtk_window_set_resizable(GTK_WINDOW(equalizerwin), FALSE);
+
+    if (config.scaled && config.eq_scaled_linked) {
+        width *= config.scale_factor;
+        height *= config.scale_factor;
+    }
+
+    gtk_widget_set_size_request(equalizerwin, width, height);
+
+    /* this will hide only mainwin. it's annoying! yaz */
+    gtk_window_set_transient_for(GTK_WINDOW(equalizerwin),
+                                 GTK_WINDOW(mainwin));
+    gtk_window_set_skip_taskbar_hint(GTK_WINDOW(equalizerwin), TRUE);
+
+    icon = gdk_pixbuf_new_from_xpm_data((const gchar **) audacious_eq_icon);
+    gtk_window_set_icon(GTK_WINDOW(equalizerwin), icon);
+    g_object_unref(icon);
+
+    gtk_widget_set_app_paintable(equalizerwin, TRUE);
+
+    if (config.equalizer_x != -1 && config.save_window_position)
+        gtk_window_move(GTK_WINDOW(equalizerwin),
+                        config.equalizer_x, config.equalizer_y);
+
+    g_signal_connect(equalizerwin, "delete_event",
+                     G_CALLBACK(equalizerwin_delete), NULL);
+    g_signal_connect(equalizerwin, "button_press_event",
+                     G_CALLBACK(equalizerwin_press), NULL);
+    g_signal_connect(equalizerwin, "key_press_event",
+                     G_CALLBACK(equalizerwin_keypress), NULL);
+}
+
+void
+equalizerwin_create(void)
+{
+    equalizer_presets = equalizerwin_read_presets("eq.preset");
+    equalizer_auto_presets = equalizerwin_read_presets("eq.auto_preset");
+
+    equalizerwin_create_window();
+
+    gtk_window_add_accel_group( GTK_WINDOW(equalizerwin) , ui_manager_get_accel_group() );
+
+    equalizerwin_create_widgets();
+}
+
+
+void
+equalizerwin_show(gboolean show)
+{
+    GtkAction *action = gtk_action_group_get_action(
+      toggleaction_group_others , "show equalizer" );
+    gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(action) , show );
+
+    if (show)
+        equalizerwin_real_show();
+    else
+        equalizerwin_real_hide();
+}
+
+void
+equalizerwin_real_show(void)
+{
+    gtk_window_move(GTK_WINDOW(equalizerwin), config.equalizer_x, config.equalizer_y);
+    if (config.scaled && config.eq_scaled_linked)
+        gtk_widget_set_size_request(equalizerwin, 275 * config.scale_factor,
+                                    ((config.equalizer_shaded ? 14 : 116) * config.scale_factor));
+    else
+        gtk_widget_set_size_request(equalizerwin, 275,
+                                    (config.equalizer_shaded ? 14 : 116));
+    config.equalizer_visible = TRUE;
+    ui_skinned_button_set_inside(mainwin_eq, TRUE);
+    gtk_widget_show_all(equalizerwin);
+
+    if (!config.equalizer_shaded) {
+        gtk_widget_hide(equalizerwin_volume);
+        gtk_widget_hide(equalizerwin_balance);
+    }
+    else {
+        ui_skinned_set_push_button_data(equalizerwin_shade, -1, 3, -1, 47);
+        ui_skinned_button_set_skin_index1(equalizerwin_shade, SKIN_EQ_EX);
+        ui_skinned_set_push_button_data(equalizerwin_close, 11, 38, 11, 47);
+        ui_skinned_button_set_skin_index(equalizerwin_close, SKIN_EQ_EX);
+    }
+
+    gtk_window_present(GTK_WINDOW(equalizerwin));
+}
+
+void
+equalizerwin_real_hide(void)
+{
+    /*
+     * This function should only be called from the
+     * main menu signal handler
+     */
+    gtk_widget_hide(equalizerwin);
+    config.equalizer_visible = FALSE;
+    ui_skinned_button_set_inside(mainwin_eq, FALSE);
+    gtk_widget_queue_draw(mainwin_eq);
+}
+
+static EqualizerPreset *
+equalizerwin_find_preset(GList * list, const gchar * name)
+{
+    GList *node = list;
+    EqualizerPreset *preset;
+
+    while (node) {
+        preset = node->data;
+        if (!strcasecmp(preset->name, name))
+            return preset;
+        node = g_list_next(node);
+    }
+    return NULL;
+}
+
+static void
+equalizerwin_write_preset_file(GList * list, const gchar * basename)
+{
+#if 0
+    gchar *filename, *tmp;
+    gint i, p;
+    EqualizerPreset *preset;
+    RcFile *rcfile;
+    GList *node;
+
+    rcfile = aud_rcfile_new();
+    p = 0;
+    for (node = list; node; node = g_list_next(node)) {
+        preset = node->data;
+        tmp = g_strdup_printf("Preset%d", p++);
+        aud_rcfile_write_string(rcfile, "Presets", tmp, preset->name);
+        g_free(tmp);
+        aud_rcfile_write_float(rcfile, preset->name, "Preamp",
+                               preset->preamp);
+        for (i = 0; i < 10; i++) {
+            tmp = g_strdup_printf("Band%d\n", i);
+            aud_rcfile_write_float(rcfile, preset->name, tmp,
+                                   preset->bands[i]);
+            g_free(tmp);
+        }
+    }
+
+    filename = g_build_filename(aud_paths[BMP_PATH_USER_DIR], basename, NULL);
+    aud_rcfile_write(rcfile, filename);
+    aud_rcfile_free(rcfile);
+    g_free(filename);
+#endif
+}
+
+static gboolean
+equalizerwin_load_preset(GList * list, const gchar * name)
+{
+    EqualizerPreset *preset;
+    gint i;
+
+    if ((preset = equalizerwin_find_preset(list, name)) != NULL) {
+        ui_skinned_equalizer_slider_set_position(equalizerwin_preamp, preset->preamp);
+        for (i = 0; i < 10; i++)
+            ui_skinned_equalizer_slider_set_position(equalizerwin_bands[i], preset->bands[i]);
+        equalizerwin_eq_changed();
+        return TRUE;
+    }
+    return FALSE;
+}
+
+static GList *
+equalizerwin_save_preset(GList * list, const gchar * name,
+                         const gchar * filename)
+{
+    gint i;
+    EqualizerPreset *preset;
+
+    if (!(preset = equalizerwin_find_preset(list, name))) {
+        preset = g_new0(EqualizerPreset, 1);
+        preset->name = g_strdup(name);
+        list = g_list_append(list, preset);
+    }
+
+    preset->preamp = ui_skinned_equalizer_slider_get_position(equalizerwin_preamp);
+    for (i = 0; i < 10; i++)
+        preset->bands[i] = ui_skinned_equalizer_slider_get_position(equalizerwin_bands[i]);
+
+    equalizerwin_write_preset_file(list, filename);
+
+    return list;
+}
+
+static GList *
+equalizerwin_delete_preset(GList * list, gchar * name, gchar * filename)
+{
+    EqualizerPreset *preset;
+    GList *node;
+
+    if (!(preset = equalizerwin_find_preset(list, name)))
+        return list;
+
+    if (!(node = g_list_find(list, preset)))
+        return list;
+
+    list = g_list_remove_link(list, node);
+    equalizer_preset_free(preset);
+    g_list_free_1(node);
+
+    equalizerwin_write_preset_file(list, filename);
+
+    return list;
+}
+
+static void
+equalizerwin_delete_selected_presets(GtkTreeView *view, gchar *filename)
+{
+    gchar *text;
+
+    GtkTreeSelection *selection = gtk_tree_view_get_selection(view);
+    GtkTreeModel *model = gtk_tree_view_get_model(view);
+
+    /*
+     * first we are making a list of the selected rows, then we convert this
+     * list into a list of GtkTreeRowReferences, so that when you delete an
+     * item you can still access the other items
+     * finally we iterate through all GtkTreeRowReferences, convert them to
+     * GtkTreeIters and delete those one after the other
+     */
+
+    GList *list = gtk_tree_selection_get_selected_rows(selection, &model);
+    GList *rrefs = NULL;
+    GList *litr;
+
+    for (litr = list; litr; litr = litr->next)
+    {
+        GtkTreePath *path = litr->data;
+        rrefs = g_list_append(rrefs, gtk_tree_row_reference_new(model, path));
+    }
+
+    for (litr = rrefs; litr; litr = litr->next)
+    {
+        GtkTreeRowReference *ref = litr->data;
+        GtkTreePath *path = gtk_tree_row_reference_get_path(ref);
+        GtkTreeIter iter;
+        gtk_tree_model_get_iter(model, &iter, path);
+
+        gtk_tree_model_get(model, &iter, 0, &text, -1);
+
+        if (!strcmp(filename, "eq.preset"))
+            equalizer_presets = equalizerwin_delete_preset(equalizer_presets, text, filename);
+        else if (!strcmp(filename, "eq.auto_preset"))
+            equalizer_auto_presets = equalizerwin_delete_preset(equalizer_auto_presets, text, filename);
+
+        gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
+    }
+}
+
+static GList *
+import_winamp_eqf(VFSFile * file)
+{
+#if 0
+    gchar header[31];
+    gchar bands[11];
+    gint i = 0;
+    EqualizerPreset *preset = NULL;
+    GList *list = NULL;
+    GtkWidget *dialog;
+    gchar *realfn;
+    gchar preset_name[0xb4];
+
+    vfs_fread(header, 1, 31, file);
+    if (strncmp(header, "Winamp EQ library file v1.1", 27)) goto error;
+
+    AUDDBG("The EQF header is OK\n");
+
+    if (vfs_fseek(file, 0x1f, SEEK_SET) == -1) goto error;
+
+    while (vfs_fread(preset_name, 1, 0xb4, file) == 0xb4) {
+        AUDDBG("The preset name is '%s'\n", preset_name);
+        vfs_fseek(file, 0x4d, SEEK_CUR); /* unknown crap --asphyx */
+        if (vfs_fread(bands, 1, 11, file) != 11) break;
+
+        preset = equalizer_preset_new(preset_name);
+        /*this was divided by 63, but shouldn't it be 64? --majeru*/
+        preset->preamp = EQUALIZER_MAX_GAIN - ((bands[10] * EQUALIZER_MAX_GAIN * 2) / 64.0);
+
+        for (i = 0; i < 10; i++)
+            preset->bands[i] = EQUALIZER_MAX_GAIN - ((bands[i] * EQUALIZER_MAX_GAIN * 2) / 64.0);
+        
+        list = g_list_prepend(list, preset);
+    }
+    
+    list = g_list_reverse(list);
+    if (list == NULL) goto error;
+
+    return list;
+
+error:
+    realfn = g_filename_from_uri(file->uri, NULL, NULL);
+    dialog = gtk_message_dialog_new (GTK_WINDOW(mainwin),
+                                     GTK_DIALOG_DESTROY_WITH_PARENT,
+                                     GTK_MESSAGE_ERROR,
+                                     GTK_BUTTONS_CLOSE,
+                                     _("Error importing Winamp EQF file '%s'"),
+                                     realfn);
+    gtk_dialog_run (GTK_DIALOG (dialog));
+    gtk_widget_destroy (dialog);
+    g_free(realfn);
+    return NULL;
+#endif
+}
+
+static void
+free_cb (gpointer data, gpointer user_data)
+{
+    equalizer_preset_free((EqualizerPreset*)data);
+}
+
+static void
+equalizerwin_read_winamp_eqf(VFSFile * file)
+{
+    GList *presets;
+    gint i;
+
+    if ((presets = import_winamp_eqf(file)) == NULL)
+        return;
+
+    /* just get the first preset --asphyx */
+    EqualizerPreset *preset = (EqualizerPreset*)presets->data;
+    ui_skinned_equalizer_slider_set_position(equalizerwin_preamp,
+                                             preset->preamp);
+
+    for (i = 0; i < 10; i++)
+        ui_skinned_equalizer_slider_set_position(equalizerwin_bands[i],
+                                                 preset->bands[i]);
+
+    g_list_foreach(presets, free_cb, NULL);
+    g_list_free(presets);
+
+    equalizerwin_eq_changed();
+}
+#if 0
+static void
+equalizerwin_read_aud_preset(RcFile * rcfile)
+{
+    gfloat val;
+    gint i;
+
+    if (aud_rcfile_read_float(rcfile, "Equalizer preset", "Preamp", &val))
+        ui_skinned_equalizer_slider_set_position(equalizerwin_preamp, val);
+    for (i = 0; i < 10; i++) {
+        gchar tmp[7];
+        g_snprintf(tmp, sizeof(tmp), "Band%d", i);
+        if (aud_rcfile_read_float(rcfile, "Equalizer preset", tmp, &val))
+            ui_skinned_equalizer_slider_set_position(equalizerwin_bands[i], val);
+    }
+    equalizerwin_eq_changed();
+}
+#endif
+
+static void
+equalizerwin_save_ok(GtkWidget * widget, gpointer data)
+{
+    const gchar *text;
+
+    text = gtk_entry_get_text(GTK_ENTRY(equalizerwin_save_entry));
+    if (strlen(text) != 0)
+        equalizer_presets =
+            equalizerwin_save_preset(equalizer_presets, text, "eq.preset");
+    gtk_widget_destroy(equalizerwin_save_window);
+}
+
+static void
+equalizerwin_save_select(GtkTreeView *treeview, GtkTreePath *path,
+                         GtkTreeViewColumn *col, gpointer data)
+{
+    gchar *text;
+
+    GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview);
+    GtkTreeModel *model;
+    GtkTreeIter iter;
+
+    if (selection)
+    {
+        if (gtk_tree_selection_get_selected(selection, &model, &iter))
+        {
+            gtk_tree_model_get(model, &iter, 0, &text, -1);
+            gtk_entry_set_text(GTK_ENTRY(equalizerwin_save_entry), text);
+            equalizerwin_save_ok(NULL, NULL);
+
+            g_free(text);
+        }
+    }
+}
+
+static void
+equalizerwin_load_ok(GtkWidget *widget, gpointer data)
+{
+    gchar *text;
+
+    GtkTreeView* view = GTK_TREE_VIEW(data);
+    GtkTreeSelection *selection = gtk_tree_view_get_selection(view);
+    GtkTreeModel *model;
+    GtkTreeIter iter;
+
+    if (selection)
+    {
+        if (gtk_tree_selection_get_selected(selection, &model, &iter))
+        {
+            gtk_tree_model_get(model, &iter, 0, &text, -1);
+            equalizerwin_load_preset(equalizer_presets, text);
+
+            g_free(text);
+        }
+    }
+    gtk_widget_destroy(equalizerwin_load_window);
+}
+
+static void
+equalizerwin_load_select(GtkTreeView *treeview, GtkTreePath *path,
+                         GtkTreeViewColumn *col, gpointer data)
+{
+    equalizerwin_load_ok(NULL, treeview);
+}
+
+static void
+equalizerwin_delete_delete(GtkWidget *widget, gpointer data)
+{
+    equalizerwin_delete_selected_presets(GTK_TREE_VIEW(data), "eq.preset");
+}
+
+static void
+equalizerwin_save_auto_ok(GtkWidget *widget, gpointer data)
+{
+    const gchar *text;
+
+    text = gtk_entry_get_text(GTK_ENTRY(equalizerwin_save_auto_entry));
+    if (strlen(text) != 0)
+        equalizer_auto_presets =
+            equalizerwin_save_preset(equalizer_auto_presets, text,
+                                     "eq.auto_preset");
+    gtk_widget_destroy(equalizerwin_save_auto_window);
+}
+
+static void
+equalizerwin_save_auto_select(GtkTreeView *treeview, GtkTreePath *path,
+                              GtkTreeViewColumn *col, gpointer data)
+{
+    gchar *text;
+
+    GtkTreeSelection *selection = gtk_tree_view_get_selection(treeview);
+    GtkTreeModel *model;
+    GtkTreeIter iter;
+
+    if (selection)
+    {
+        if (gtk_tree_selection_get_selected(selection, &model, &iter))
+        {
+            gtk_tree_model_get(model, &iter, 0, &text, -1);
+            gtk_entry_set_text(GTK_ENTRY(equalizerwin_save_auto_entry), text);
+            equalizerwin_save_auto_ok(NULL, NULL);
+
+            g_free(text);
+        }
+    }
+}
+
+static void
+equalizerwin_load_auto_ok(GtkWidget *widget, gpointer data)
+{
+    gchar *text;
+
+    GtkTreeView *view = GTK_TREE_VIEW(data);
+    GtkTreeSelection *selection = gtk_tree_view_get_selection(view);
+    GtkTreeModel *model;
+    GtkTreeIter iter;
+
+    if (selection)
+    {
+        if (gtk_tree_selection_get_selected(selection, &model, &iter))
+        {
+            gtk_tree_model_get(model, &iter, 0, &text, -1);
+            equalizerwin_load_preset(equalizer_auto_presets, text);
+
+            g_free(text);
+        }
+    }
+    gtk_widget_destroy(equalizerwin_load_auto_window);
+}
+
+static void
+equalizerwin_load_auto_select(GtkTreeView *treeview, GtkTreePath *path,
+                              GtkTreeViewColumn *col, gpointer data)
+{
+    equalizerwin_load_auto_ok(NULL, treeview);
+}
+
+static void
+equalizerwin_delete_auto_delete(GtkWidget *widget, gpointer data)
+{
+    equalizerwin_delete_selected_presets(GTK_TREE_VIEW(data), "eq.auto_preset");
+}
+
+
+static void
+load_preset_file(const gchar *filename)
+{
+#if 0
+    RcFile *rcfile;
+
+    if ((rcfile = aud_rcfile_open(filename)) != NULL) {
+        equalizerwin_read_aud_preset(rcfile);
+        aud_rcfile_free(rcfile);
+    }
+#endif
+}
+
+static VFSFile *
+open_vfs_file(const gchar *filename, const gchar *mode)
+{
+    VFSFile *file;
+    GtkWidget *dialog;
+
+    if (!(file = vfs_fopen(filename, mode))) {
+        dialog = gtk_message_dialog_new (GTK_WINDOW (mainwin),
+                                         GTK_DIALOG_DESTROY_WITH_PARENT,
+                                         GTK_MESSAGE_ERROR,
+                                         GTK_BUTTONS_CLOSE,
+                                         "Error loading file '%s'",
+                                         filename);
+        gtk_dialog_run (GTK_DIALOG (dialog));
+        gtk_widget_destroy (dialog);
+    }
+
+    return file;
+}
+
+static void
+load_winamp_file(const gchar * filename)
+{
+#if 0
+    VFSFile *file;
+
+    if (!(file = open_vfs_file(filename, "rb")))
+        return;
+
+    equalizerwin_read_winamp_eqf(file);
+    vfs_fclose(file);
+#endif
+}
+
+static void
+import_winamp_file(const gchar * filename)
+{
+#if 0
+    VFSFile *file;
+    GList *list;
+
+    if (!(file = open_vfs_file(filename, "rb")) ||
+        !(list = import_winamp_eqf(file)))
+        return;
+
+    equalizer_presets = g_list_concat(equalizer_presets, list);
+    equalizerwin_write_preset_file(equalizer_presets, "eq.preset");
+
+    vfs_fclose(file);
+#endif
+}
+
+static void
+save_preset_file(const gchar * filename)
+{
+#if 0
+    RcFile *rcfile;
+    gint i;
+
+    rcfile = aud_rcfile_new();
+    aud_rcfile_write_float(rcfile, "Equalizer preset", "Preamp",
+                           ui_skinned_equalizer_slider_get_position(equalizerwin_preamp));
+
+    for (i = 0; i < 10; i++) {
+        gchar tmp[7];
+        g_snprintf(tmp, sizeof(tmp), "Band%d", i);
+        aud_rcfile_write_float(rcfile, "Equalizer preset", tmp,
+                               ui_skinned_equalizer_slider_get_position(equalizerwin_bands[i]));
+    }
+
+    aud_rcfile_write(rcfile, filename);
+    aud_rcfile_free(rcfile);
+#endif
+}
+
+static void
+save_winamp_file(const gchar * filename)
+{
+#if 0
+    VFSFile *file;
+
+    gchar name[257];
+    gint i;
+    guchar bands[11];
+
+    if (!(file = open_vfs_file(filename, "wb")))
+        return;
+
+    vfs_fwrite("Winamp EQ library file v1.1\x1a!--", 1, 31, file);
+
+    memset(name, 0, 257);
+    g_strlcpy(name, "Entry1", 257);
+    vfs_fwrite(name, 1, 257, file);
+
+    for (i = 0; i < 10; i++)
+        bands[i] = 63 - (((ui_skinned_equalizer_slider_get_position(equalizerwin_bands[i]) + EQUALIZER_MAX_GAIN) * 63) / EQUALIZER_MAX_GAIN / 2);
+    bands[10] = 63 - (((ui_skinned_equalizer_slider_get_position(equalizerwin_preamp) + EQUALIZER_MAX_GAIN) * 63) / EQUALIZER_MAX_GAIN / 2);
+    vfs_fwrite(bands, 1, 11, file);
+
+    vfs_fclose(file);
+#endif
+}
+
+static GtkWidget *
+equalizerwin_create_list_window(GList *preset_list,
+                                const gchar *title,
+                                GtkWidget **window,
+                                GtkSelectionMode sel_mode,
+                                GtkWidget **entry,
+                                const gchar *action_name,
+                                GCallback action_func,
+                                GCallback select_row_func)
+{
+    GtkWidget *vbox, *scrolled_window, *bbox, *view;
+    GtkWidget *button_cancel, *button_action;
+    GList *node;
+
+    GtkListStore *store;
+    GtkTreeIter iter;
+    GtkTreeModel *model;
+    GtkCellRenderer *renderer;
+    GtkTreeSelection *selection;
+    GtkTreeSortable *sortable;
+
+
+
+    *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+    gtk_window_set_title(GTK_WINDOW(*window), title);
+    gtk_window_set_type_hint(GTK_WINDOW(*window), GDK_WINDOW_TYPE_HINT_DIALOG);
+    gtk_window_set_default_size(GTK_WINDOW(*window), 350, 300);
+    gtk_window_set_position(GTK_WINDOW(*window), GTK_WIN_POS_CENTER);
+    gtk_container_set_border_width(GTK_CONTAINER(*window), 10);
+    gtk_window_set_transient_for(GTK_WINDOW(*window),
+                                 GTK_WINDOW(equalizerwin));
+    g_signal_connect(*window, "destroy",
+                     G_CALLBACK(gtk_widget_destroyed), window);
+
+    vbox = gtk_vbox_new(FALSE, 10);
+    gtk_container_add(GTK_CONTAINER(*window), vbox);
+
+    scrolled_window = gtk_scrolled_window_new(NULL, NULL);
+    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window),
+                                   GTK_POLICY_AUTOMATIC, GTK_POLICY_ALWAYS);
+
+
+    /* fill the store with the names of all available presets */
+    store = gtk_list_store_new(1, G_TYPE_STRING);
+    for (node = preset_list; node; node = g_list_next(node))
+    {
+        gtk_list_store_append(store, &iter);
+        gtk_list_store_set(store, &iter,
+                           0, ((EqualizerPreset*)node->data)->name,
+                           -1);
+    }
+    model = GTK_TREE_MODEL(store);
+
+
+    sortable = GTK_TREE_SORTABLE(store);
+    gtk_tree_sortable_set_sort_column_id(sortable, 0, GTK_SORT_ASCENDING);
+
+
+    view = gtk_tree_view_new();
+    renderer = gtk_cell_renderer_text_new();
+    gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(view), -1,
+                                                _("Presets"), renderer,
+                                                "text", 0, NULL);
+    gtk_tree_view_set_model(GTK_TREE_VIEW(view), model);
+    g_object_unref(model);
+
+    selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view));
+    gtk_tree_selection_set_mode(selection, sel_mode);
+
+
+
+
+    gtk_container_add(GTK_CONTAINER(scrolled_window), view);
+    gtk_box_pack_start(GTK_BOX(vbox), scrolled_window, TRUE, TRUE, 0);
+
+    if (entry) {
+        *entry = gtk_entry_new();
+        g_signal_connect(*entry, "activate", action_func, NULL);
+        gtk_box_pack_start(GTK_BOX(vbox), *entry, FALSE, FALSE, 0);
+    }
+
+    bbox = gtk_hbutton_box_new();
+    gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END);
+    gtk_button_box_set_spacing(GTK_BUTTON_BOX(bbox), 5);
+    gtk_box_pack_start(GTK_BOX(vbox), bbox, FALSE, FALSE, 0);
+
+    button_cancel = gtk_button_new_from_stock(GTK_STOCK_CANCEL);
+    g_signal_connect_swapped(button_cancel, "clicked",
+                             G_CALLBACK(gtk_widget_destroy),
+                             GTK_OBJECT(*window));
+    gtk_box_pack_start(GTK_BOX(bbox), button_cancel, TRUE, TRUE, 0);
+
+    button_action = gtk_button_new_from_stock(action_name);
+    g_signal_connect(button_action, "clicked", G_CALLBACK(action_func), view);
+    GTK_WIDGET_SET_FLAGS(button_action, GTK_CAN_DEFAULT);
+
+    if (select_row_func)
+        g_signal_connect(view, "row-activated", G_CALLBACK(select_row_func), NULL);
+
+        
+    gtk_box_pack_start(GTK_BOX(bbox), button_action, TRUE, TRUE, 0);
+
+    gtk_widget_grab_default(button_action);
+
+
+    gtk_widget_show_all(*window);
+
+    return *window;
+}
+
+void
+equalizerwin_load_auto_preset(const gchar * filename)
+{
+#if 0
+    gchar *presetfilename, *directory;
+    RcFile *rcfile;
+
+    g_return_if_fail(filename != NULL);
+
+    if (!aud_cfg->equalizer_autoload)
+        return;
+
+    presetfilename = g_strconcat(filename, ".", aud_cfg->eqpreset_extension, NULL);
+
+    /* First try to find a per file preset file */
+    if (strlen(aud_cfg->eqpreset_extension) > 0 &&
+        (rcfile = aud_rcfile_open(presetfilename)) != NULL) {
+        g_free(presetfilename);
+        equalizerwin_read_aud_preset(rcfile);
+        aud_rcfile_free(rcfile);
+        return;
+    }
+
+    g_free(presetfilename);
+
+    directory = g_path_get_dirname(filename);
+    presetfilename = g_build_filename(directory, aud_cfg->eqpreset_default_file,
+                                      NULL);
+    g_free(directory);
+
+    /* Try to find a per directory preset file */
+    if (strlen(aud_cfg->eqpreset_default_file) > 0 &&
+        (rcfile = aud_rcfile_open(presetfilename)) != NULL) {
+        equalizerwin_read_aud_preset(rcfile);
+        aud_rcfile_free(rcfile);
+    }
+    else if (!equalizerwin_load_preset
+             (equalizer_auto_presets, g_basename(filename))) {
+        /* Fall back to the oldstyle auto presets */
+        equalizerwin_load_preset(equalizer_presets, "Default");
+    }
+
+    g_free(presetfilename);
+#endif
+}
+
+void
+equalizerwin_set_preamp(gfloat preamp)
+{
+    ui_skinned_equalizer_slider_set_position(equalizerwin_preamp, preamp);
+    equalizerwin_eq_changed();
+}
+
+void
+equalizerwin_set_band(gint band, gfloat value)
+{
+    g_return_if_fail(band >= 0 && band < 10);
+    ui_skinned_equalizer_slider_set_position(equalizerwin_bands[band], value);
+}
+
+gfloat
+equalizerwin_get_preamp(void)
+{
+    return ui_skinned_equalizer_slider_get_position(equalizerwin_preamp);
+}
+
+gfloat
+equalizerwin_get_band(gint band)
+{
+    g_return_val_if_fail(band >= 0 && band < 10, 0.0);
+    return ui_skinned_equalizer_slider_get_position(equalizerwin_bands[band]);
+}
+
+void
+action_equ_load_preset(void)
+{
+    if (equalizerwin_load_window) {
+        gtk_window_present(GTK_WINDOW(equalizerwin_load_window));
+        return;
+    }
+    
+    equalizerwin_create_list_window(equalizer_presets,
+                                    Q_("Load preset"),
+                                    &equalizerwin_load_window,
+                                    GTK_SELECTION_SINGLE, NULL,
+                                    GTK_STOCK_OK,
+                                    G_CALLBACK(equalizerwin_load_ok),
+                                    G_CALLBACK(equalizerwin_load_select));
+}
+
+void
+action_equ_load_auto_preset(void)
+{
+    if (equalizerwin_load_auto_window) {
+        gtk_window_present(GTK_WINDOW(equalizerwin_load_auto_window));
+        return;
+    }
+
+    equalizerwin_create_list_window(equalizer_auto_presets,
+                                    Q_("Load auto-preset"),
+                                    &equalizerwin_load_auto_window,
+                                    GTK_SELECTION_SINGLE, NULL,
+                                    GTK_STOCK_OK,
+                                    G_CALLBACK(equalizerwin_load_auto_ok),
+                                    G_CALLBACK(equalizerwin_load_auto_select));
+}
+
+void
+action_equ_load_default_preset(void)
+{
+    equalizerwin_load_preset(equalizer_presets, "Default");
+}
+
+void
+action_equ_zero_preset(void)
+{
+    gint i;
+
+    ui_skinned_equalizer_slider_set_position(equalizerwin_preamp, 0);
+    for (i = 0; i < 10; i++)
+        ui_skinned_equalizer_slider_set_position(equalizerwin_bands[i], 0);
+
+    equalizerwin_eq_changed();
+}
+
+void
+action_equ_load_preset_file(void)
+{
+    GtkWidget *dialog;
+    gchar *file_uri;
+
+    dialog = make_filebrowser(Q_("Load equalizer preset"), FALSE);
+    if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
+    {
+        file_uri = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(dialog));
+        load_preset_file(file_uri);
+        g_free(file_uri);
+    }
+    gtk_widget_destroy(dialog);
+}
+
+void
+action_equ_load_preset_eqf(void)
+{
+    GtkWidget *dialog;
+    gchar *file_uri;
+
+    dialog = make_filebrowser(Q_("Load equalizer preset"), FALSE);
+    if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
+    {
+        file_uri = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(dialog));
+        load_winamp_file(file_uri);
+        g_free(file_uri);
+    }
+    gtk_widget_destroy(dialog);
+}
+
+void
+action_equ_import_winamp_presets(void)
+{
+    GtkWidget *dialog;
+    gchar *file_uri;
+
+    dialog = make_filebrowser(Q_("Load equalizer preset"), FALSE);
+    if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
+    {
+        file_uri = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(dialog));
+        import_winamp_file(file_uri);
+        g_free(file_uri);
+    }
+    gtk_widget_destroy(dialog);
+}
+
+void
+action_equ_save_preset(void)
+{
+    if (equalizerwin_save_window) {
+        gtk_window_present(GTK_WINDOW(equalizerwin_save_window));
+        return;
+    }
+     
+    equalizerwin_create_list_window(equalizer_presets,
+                                    Q_("Save preset"),
+                                    &equalizerwin_save_window,
+                                    GTK_SELECTION_SINGLE,
+                                    &equalizerwin_save_entry,
+                                    GTK_STOCK_OK,
+                                    G_CALLBACK(equalizerwin_save_ok),
+                                    G_CALLBACK(equalizerwin_save_select));
+}
+
+void
+action_equ_save_auto_preset(void)
+{
+    gchar *name;
+    Playlist *playlist = aud_playlist_get_active();
+
+    if (equalizerwin_save_auto_window)
+        gtk_window_present(GTK_WINDOW(equalizerwin_save_auto_window));
+    else
+        equalizerwin_create_list_window(equalizer_auto_presets,
+                                        Q_("Save auto-preset"),
+                                        &equalizerwin_save_auto_window,
+                                        GTK_SELECTION_SINGLE,
+                                        &equalizerwin_save_auto_entry,
+                                        GTK_STOCK_OK,
+                                        G_CALLBACK(equalizerwin_save_auto_ok),
+                                        G_CALLBACK(equalizerwin_save_auto_select));
+
+    name = aud_playlist_get_filename(playlist, aud_playlist_get_position(playlist));
+    if (name) {
+        gtk_entry_set_text(GTK_ENTRY(equalizerwin_save_auto_entry),
+                           g_basename(name));
+        g_free(name);
+    }
+}
+
+void
+action_equ_save_default_preset(void)
+{
+    equalizer_presets =
+        equalizerwin_save_preset(equalizer_presets, Q_("Default"), "eq.preset");
+}
+
+void
+action_equ_save_preset_file(void)
+{
+    GtkWidget *dialog;
+    gchar *file_uri;
+    gchar *songname;
+    Playlist *playlist = aud_playlist_get_active();
+
+    dialog = make_filebrowser(Q_("Save equalizer preset"), TRUE);
+    if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
+    {
+        file_uri = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(dialog));
+        save_preset_file(file_uri);
+        g_free(file_uri);
+    }
+
+    songname = aud_playlist_get_filename(playlist, aud_playlist_get_position(playlist));
+    if (songname) {
+        gchar *eqname = g_strdup_printf("%s.%s", songname,
+                                        aud_cfg->eqpreset_extension);
+        g_free(songname);
+        gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog),
+                                      eqname);
+        g_free(eqname);
+    }
+
+    gtk_widget_destroy(dialog);
+}
+
+void
+action_equ_save_preset_eqf(void)
+{
+    GtkWidget *dialog;
+    gchar *file_uri;
+
+    dialog = make_filebrowser(Q_("Save equalizer preset"), TRUE);
+    if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
+    {
+        file_uri = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(dialog));
+        save_winamp_file(file_uri);
+        g_free(file_uri);
+    }
+    gtk_widget_destroy(dialog);
+}
+
+void
+action_equ_delete_preset(void)
+{
+    if (equalizerwin_delete_window) {
+        gtk_window_present(GTK_WINDOW(equalizerwin_delete_window));
+        return;
+    }
+    
+    equalizerwin_create_list_window(equalizer_presets,
+                                    Q_("Delete preset"),
+                                    &equalizerwin_delete_window,
+                                    GTK_SELECTION_EXTENDED, NULL,
+                                    GTK_STOCK_DELETE,
+                                    G_CALLBACK(equalizerwin_delete_delete),
+                                    NULL);
+}
+
+void
+action_equ_delete_auto_preset(void)
+{
+    if (equalizerwin_delete_auto_window) {
+        gtk_window_present(GTK_WINDOW(equalizerwin_delete_auto_window));
+        return;
+    }
+    
+    equalizerwin_create_list_window(equalizer_auto_presets,
+                                    Q_("Delete auto-preset"),
+                                    &equalizerwin_delete_auto_window,
+                                    GTK_SELECTION_EXTENDED, NULL,
+                                    GTK_STOCK_DELETE,
+                                    G_CALLBACK(equalizerwin_delete_auto_delete),
+                                    NULL);
+}
+
+void
+equalizer_activate(gboolean active)
+{
+    aud_cfg->equalizer_active = active;
+    ui_skinned_button_set_inside(equalizerwin_on, active);
+
+    equalizerwin_eq_changed();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_equalizer.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,69 @@
+/*  Audacious - Cross-platform multimedia player
+ *  Copyright (C) 2005-2007  Audacious development team.
+ *
+ *  Based on BMP:
+ *  Copyright (C) 2003-2004  BMP development team.
+ *
+ *  Based on XMMS:
+ *  Copyright (C) 1998-2003  XMMS development team.
+ *
+ *  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; under version 3 of the License.
+ *
+ *  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, see <http://www.gnu.org/licenses>.
+ *
+ *  The Audacious team does not consider modular code linking to
+ *  Audacious or using our public API to be a derived work.
+ */
+
+#ifndef AUDACIOUS_UI_EQUALIZER_H
+#define AUDACIOUS_UI_EQUALIZER_H
+
+#include <glib.h>
+#include <gtk/gtk.h>
+#include "skins_cfg.h"
+
+#define EQUALIZER_SCALED     (config.scaled && config.eq_scaled_linked)
+#define EQUALIZER_SCALE_FACTOR (EQUALIZER_SCALED ? config.scale_factor : 1)
+
+#define EQUALIZER_HEIGHT         ((config.equalizer_shaded ? 14 : 116) * (EQUALIZER_SCALE_FACTOR))
+#define EQUALIZER_WIDTH          (275 * EQUALIZER_SCALE_FACTOR)
+
+#define EQUALIZER_DEFAULT_POS_X  20
+#define EQUALIZER_DEFAULT_POS_Y  136
+
+#define EQUALIZER_DEFAULT_DIR_PRESET "dir_default.preset"
+#define EQUALIZER_DEFAULT_PRESET_EXT "preset"
+
+void equalizerwin_set_scaled(gboolean ds);
+void equalizerwin_set_shade_menu_cb(gboolean shaded);
+void draw_equalizer_window(gboolean force);
+void equalizerwin_create(void);
+void equalizerwin_show(gboolean show);
+void equalizerwin_real_show(void);
+void equalizerwin_real_hide(void);
+void equalizerwin_load_auto_preset(const gchar * filename);
+void equalizerwin_set_volume_slider(gint percent);
+void equalizerwin_set_balance_slider(gint percent);
+void equalizerwin_eq_changed(void);
+void equalizerwin_set_preamp(gfloat preamp);
+void equalizerwin_set_band(gint band, gfloat value);
+gfloat equalizerwin_get_preamp(void);
+gfloat equalizerwin_get_band(gint band);
+
+gboolean equalizerwin_has_focus(void);
+
+extern GtkWidget *equalizerwin;
+extern GtkWidget *equalizerwin_graph;
+extern gboolean equalizerwin_focus;
+
+void equalizer_activate(gboolean active);
+
+#endif /* AUDACIOUS_UI_EQUALIZER_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_hints.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,59 @@
+/*  Audacious - Cross-platform multimedia player
+ *  Copyright (C) 2005-2007  Audacious development team
+ *
+ *  Based on BMP:
+ *  Copyright (C) 2003-2004  BMP development team.
+ *
+ *  Based on XMMS:
+ *  Copyright (C) 1998-2003  XMMS development team.
+ *
+ *  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; under version 3 of the License.
+ *
+ *  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, see <http://www.gnu.org/licenses>.
+ *
+ *  The Audacious team does not consider modular code linking to
+ *  Audacious or using our public API to be a derived work.
+ */
+
+#include "ui_hints.h"
+
+#include <glib.h>
+#include <gtk/gtk.h>
+
+#include "ui_equalizer.h"
+#include "ui_main.h"
+#include "ui_playlist.h"
+
+#include "platform/smartinclude.h"
+
+void
+hint_set_always(gboolean always)
+{
+    gtk_window_set_keep_above(GTK_WINDOW(mainwin), always);
+    gtk_window_set_keep_above(GTK_WINDOW(equalizerwin), always);
+    gtk_window_set_keep_above(GTK_WINDOW(playlistwin), always);
+}
+
+void
+hint_set_sticky(gboolean sticky)
+{
+    if (sticky) {
+        gtk_window_stick(GTK_WINDOW(mainwin));
+        gtk_window_stick(GTK_WINDOW(equalizerwin));
+        gtk_window_stick(GTK_WINDOW(playlistwin));
+    }
+    else {
+        gtk_window_unstick(GTK_WINDOW(mainwin));
+        gtk_window_unstick(GTK_WINDOW(equalizerwin));
+        gtk_window_unstick(GTK_WINDOW(playlistwin));
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_hints.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,35 @@
+/*  Audacious - Cross-platform multimedia player
+ *  Copyright (C) 2005-2007  Audacious development team
+ *
+ *  Based on BMP:
+ *  Copyright (C) 2003-2004  BMP development team.
+ *
+ *  Based on XMMS:
+ *  Copyright (C) 1998-2003  XMMS development team.
+ *
+ *  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; under version 3 of the License.
+ *
+ *  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, see <http://www.gnu.org/licenses>.
+ *
+ *  The Audacious team does not consider modular code linking to
+ *  Audacious or using our public API to be a derived work.
+ */
+
+#ifndef AUDACIOUS_UI_HINTS_H
+#define AUDACIOUS_UI_HINTS_H
+
+#include <glib.h>
+#include <gtk/gtk.h>
+
+void hint_set_always(gboolean always);
+void hint_set_sticky(gboolean sticky);
+
+#endif /* AUDACIOUS_UI_HINTS_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_main.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,2880 @@
+/*  Audacious - Cross-platform multimedia player
+ *  Copyright (C) 2005-2006  Audacious development team.
+ *
+ *  BMP - Cross-platform multimedia player
+ *  Copyright (C) 2003-2004  BMP development team.
+ *
+ *  Based on XMMS:
+ *  Copyright (C) 1998-2003  XMMS development team.
+ *
+ *  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; under version 3 of the License.
+ *
+ *  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, see <http://www.gnu.org/licenses>.
+ *
+ *  The Audacious team does not consider modular code linking to
+ *  Audacious or using our public API to be a derived work.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <glib/gprintf.h>
+#include <gtk/gtk.h>
+#include <gtk/gtkmessagedialog.h>
+#include <math.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+
+/* GDK including */
+#include "platform/smartinclude.h"
+
+#if defined(USE_REGEX_ONIGURUMA)
+#include <onigposix.h>
+#elif defined(USE_REGEX_PCRE)
+#include <pcreposix.h>
+#else
+#include <regex.h>
+#endif
+
+#include "ui_main.h"
+#include "ui_dock.h"
+#include "icons-stock.h"
+#include "actions-mainwin.h"
+#include "ui_manager.h"
+#include "ui_equalizer.h"
+#include "ui_playlist.h"
+#include "ui_hints.h"
+#include "dnd.h"
+#if 0
+#include "configdb.h"
+#include "input.h"
+#include "main.h"
+#include "playback.h"
+#include "playlist.h"
+#include "pluginenum.h"
+#include "strings.h"
+#include "ui_dock.h"
+#include "ui_main_evlisteners.h"
+#include "ui_skinselector.h"
+#include "ui_urlopener.h"
+#include "util.h"
+#include "visualization.h"
+#endif
+#include "ui_skinned_window.h"
+#include "ui_skinned_button.h"
+#include "ui_skinned_textbox.h"
+#include "ui_skinned_number.h"
+#include "ui_skinned_horizontal_slider.h"
+#include "ui_skinned_menurow.h"
+#include "ui_skinned_playstatus.h"
+#include "ui_skinned_monostereo.h"
+#include "ui_skinned_playlist.h"
+#include <audacious/plugin.h>
+#include "skins_cfg.h"
+
+static GTimeVal cb_time; 
+static const int TRISTATE_THRESHOLD = 200;
+
+enum {
+    MAINWIN_SEEK_REV = -1,
+    MAINWIN_SEEK_NIL,
+    MAINWIN_SEEK_FWD
+};
+
+GtkWidget *mainwin = NULL;
+
+static gint balance;
+
+static GtkWidget *mainwin_jtt = NULL;
+
+static gint seek_state = MAINWIN_SEEK_NIL;
+static gint seek_initial_pos = 0;
+
+static GtkWidget *mainwin_menubtn;
+static GtkWidget *mainwin_minimize, *mainwin_shade, *mainwin_close;
+
+static GtkWidget *mainwin_rew, *mainwin_fwd;
+static GtkWidget *mainwin_eject;
+static GtkWidget *mainwin_play, *mainwin_pause, *mainwin_stop;
+
+static GtkWidget *mainwin_shuffle, *mainwin_repeat;
+GtkWidget *mainwin_eq, *mainwin_pl;
+
+GtkWidget *mainwin_info;
+GtkWidget *mainwin_stime_min, *mainwin_stime_sec;
+
+static GtkWidget *mainwin_rate_text, *mainwin_freq_text, *mainwin_othertext;
+
+GtkWidget *mainwin_playstatus;
+
+GtkWidget *mainwin_minus_num, *mainwin_10min_num, *mainwin_min_num;
+GtkWidget *mainwin_10sec_num, *mainwin_sec_num;
+
+GtkWidget *mainwin_vis;
+GtkWidget *mainwin_svis;
+
+GtkWidget *mainwin_sposition = NULL;
+
+static GtkWidget *mainwin_menurow;
+static GtkWidget *mainwin_volume, *mainwin_balance;
+GtkWidget *mainwin_position;
+
+static GtkWidget *mainwin_monostereo;
+static GtkWidget *mainwin_srew, *mainwin_splay, *mainwin_spause;
+static GtkWidget *mainwin_sstop, *mainwin_sfwd, *mainwin_seject, *mainwin_about;
+
+static gint mainwin_timeout_id;
+
+static gboolean mainwin_info_text_locked = FALSE;
+static guint mainwin_volume_release_timeout = 0;
+
+static int ab_position_a = -1;
+static int ab_position_b = -1;
+
+static void mainwin_refresh_visible(void);
+static gint mainwin_idle_func(gpointer data);
+
+static void set_timer_mode_menu_cb(TimerMode mode);
+static void set_timer_mode(TimerMode mode);
+static void change_timer_mode(void);
+
+static void mainwin_position_motion_cb(GtkWidget *widget, gint pos);
+static void mainwin_position_release_cb(GtkWidget *widget, gint pos);
+
+static void set_scaled(gboolean scaled);
+static void mainwin_eq_pushed(gboolean toggled);
+static void mainwin_pl_pushed(gboolean toggled);
+
+static void
+mainwin_set_title_scroll(gboolean scroll)
+{
+    config.autoscroll = scroll;
+    ui_skinned_textbox_set_scroll(mainwin_info, config.autoscroll);
+}
+
+
+void
+mainwin_set_always_on_top(gboolean always)
+{
+    GtkAction *action = gtk_action_group_get_action(toggleaction_group_others,
+                                                    "view always on top");
+    gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(action) , always );
+}
+
+static void
+mainwin_set_shade(gboolean shaded)
+{
+    GtkAction *action = gtk_action_group_get_action(toggleaction_group_others,
+                                                    "roll up player");
+    gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(action) , shaded );
+}
+
+static void
+mainwin_set_shade_menu_cb(gboolean shaded)
+{
+    config.player_shaded = shaded;
+
+    if (shaded) {
+        dock_shade(get_dock_window_list(), GTK_WINDOW(mainwin),
+                   MAINWIN_SHADED_HEIGHT * MAINWIN_SCALE_FACTOR);
+    } else {
+        gint height = !aud_active_skin->properties.mainwin_height ? MAINWIN_HEIGHT :
+            aud_active_skin->properties.mainwin_height;
+
+        dock_shade(get_dock_window_list(), GTK_WINDOW(mainwin), height * MAINWIN_SCALE_FACTOR);
+    }
+
+    mainwin_refresh_hints();
+    ui_skinned_set_push_button_data(mainwin_shade, 0, config.player_shaded ? 27 : 18, 9, config.player_shaded ? 27 : 18);
+    gtk_widget_shape_combine_mask(mainwin, skin_get_mask(aud_active_skin, SKIN_MASK_MAIN + config.player_shaded), 0, 0);
+}
+
+static void
+mainwin_vis_set_refresh(RefreshRate rate)
+{
+    config.vis_refresh = rate;
+}
+
+static void
+mainwin_vis_set_afalloff(FalloffSpeed speed)
+{
+    config.analyzer_falloff = speed;
+}
+
+static void
+mainwin_vis_set_pfalloff(FalloffSpeed speed)
+{
+    config.peaks_falloff = speed;
+}
+
+static void
+mainwin_vis_set_analyzer_mode(AnalyzerMode mode)
+{
+    config.analyzer_mode = mode;
+}
+
+static void
+mainwin_vis_set_analyzer_type(AnalyzerType mode)
+{
+    config.analyzer_type = mode;
+}
+
+void
+mainwin_vis_set_type(VisType mode)
+{
+    GtkAction *action;
+
+    switch ( mode )
+    {
+        case VIS_ANALYZER:
+            action = gtk_action_group_get_action(radioaction_group_vismode,
+                                                 "vismode analyzer");
+            break;
+        case VIS_SCOPE:
+            action = gtk_action_group_get_action(radioaction_group_vismode,
+                                                 "vismode scope");
+            break;
+        case VIS_VOICEPRINT:
+            action = gtk_action_group_get_action(radioaction_group_vismode,
+                                                 "vismode voiceprint");
+            break;
+        case VIS_OFF:
+        default:
+            action = gtk_action_group_get_action(radioaction_group_vismode,
+                                                 "vismode off");
+            break;
+    }
+
+    gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(action) , TRUE );
+}
+
+static void
+mainwin_vis_set_type_menu_cb(VisType mode)
+{
+    config.vis_type = mode;
+
+    if (mode == VIS_OFF) {
+        if (config.player_shaded) {
+            ui_svis_set_visible(mainwin_svis, FALSE);
+            ui_vis_set_visible(mainwin_vis, TRUE);
+        } else {
+            ui_svis_set_visible(mainwin_svis, TRUE);
+            ui_vis_set_visible(mainwin_vis, FALSE);
+        }
+    }
+    if (mode == VIS_ANALYZER || mode == VIS_SCOPE || mode == VIS_VOICEPRINT) {
+        if (config.player_shaded) {
+            ui_svis_clear_data(mainwin_svis);
+            ui_svis_set_visible(mainwin_svis, TRUE);
+            ui_vis_clear_data(mainwin_vis);
+            ui_vis_set_visible(mainwin_vis, FALSE);
+        } else {
+            ui_svis_clear_data(mainwin_svis);
+            ui_svis_set_visible(mainwin_svis, FALSE);
+            ui_vis_clear_data(mainwin_vis);
+            ui_vis_set_visible(mainwin_vis, TRUE);
+        }
+    }
+}
+
+static void
+mainwin_menubtn_cb(void)
+{
+    gint x, y;
+    gtk_window_get_position(GTK_WINDOW(mainwin), &x, &y);
+    ui_manager_popup_menu_show(GTK_MENU(mainwin_general_menu),
+                               x + 6 * MAINWIN_SCALE_FACTOR ,
+                               y + MAINWIN_SHADED_HEIGHT * MAINWIN_SCALE_FACTOR,
+                               1, GDK_CURRENT_TIME);
+}
+
+void
+mainwin_minimize_cb(void)
+{
+    if (!mainwin)
+        return;
+
+    gtk_window_iconify(GTK_WINDOW(mainwin));
+}
+
+static void
+mainwin_shade_toggle(void)
+{
+    mainwin_set_shade(!config.player_shaded);
+}
+
+void
+mainwin_quit_cb(void)
+{
+    if (mainwin_timeout_id)
+        g_source_remove(mainwin_timeout_id);
+
+    audacious_drct_quit();
+}
+
+gboolean
+mainwin_vis_cb(GtkWidget *widget, GdkEventButton *event)
+{
+    if (event->button == 1) {
+        config.vis_type++;
+
+        if (config.vis_type > VIS_OFF)
+            config.vis_type = VIS_ANALYZER;
+
+        mainwin_vis_set_type(config.vis_type);
+    } else if (event->button == 3) {
+       ui_manager_popup_menu_show(GTK_MENU(mainwin_visualization_menu),
+                                   event->x_root, event->y_root, 3,
+                                   event->time);
+    }
+    return TRUE;
+}
+
+static void
+mainwin_destroy(GtkWidget * widget, gpointer data)
+{
+/* we should detect whether plugin got unloaded and when user indeed
+   wants to close audacious */
+#if 0
+    mainwin_quit_cb();
+#endif
+}
+
+static gchar *mainwin_tb_old_text = NULL;
+
+void
+mainwin_lock_info_text(const gchar * text)
+{
+    if (mainwin_info_text_locked != TRUE)
+        mainwin_tb_old_text = g_strdup(aud_active_skin->properties.mainwin_othertext_is_status ?
+                                       UI_SKINNED_TEXTBOX(mainwin_othertext)->text : UI_SKINNED_TEXTBOX(mainwin_info)->text);
+
+    mainwin_info_text_locked = TRUE;
+    if (aud_active_skin->properties.mainwin_othertext_is_status)
+        ui_skinned_textbox_set_text(mainwin_othertext, text);
+    else
+        ui_skinned_textbox_set_text(mainwin_info, text);
+}
+
+void
+mainwin_release_info_text(void)
+{
+    mainwin_info_text_locked = FALSE;
+
+    if (mainwin_tb_old_text != NULL)
+    {
+        if (aud_active_skin->properties.mainwin_othertext_is_status)
+            ui_skinned_textbox_set_text(mainwin_othertext, mainwin_tb_old_text);
+        else
+            ui_skinned_textbox_set_text(mainwin_info, mainwin_tb_old_text);
+        g_free(mainwin_tb_old_text);
+        mainwin_tb_old_text = NULL;
+    }
+}
+
+
+static gchar *
+make_mainwin_title(const gchar * title)
+{
+    if (title)
+        return g_strdup_printf(_("%s - Audacious"), title);
+    else
+        return g_strdup(_("Audacious"));
+}
+
+void
+mainwin_set_song_title(const gchar * title)
+{
+    gchar *mainwin_title_text = make_mainwin_title(title);
+    gtk_window_set_title(GTK_WINDOW(mainwin), mainwin_title_text);
+    g_free(mainwin_title_text);
+}
+
+static void
+mainwin_refresh_visible(void)
+{
+    if (!aud_active_skin || !config.player_visible)
+        return;
+
+    gtk_widget_show_all(mainwin);
+
+    if (!aud_active_skin->properties.mainwin_text_visible)
+        gtk_widget_hide(mainwin_info);
+
+    if (!aud_active_skin->properties.mainwin_vis_visible)
+        gtk_widget_hide(mainwin_vis);
+
+    if (!aud_active_skin->properties.mainwin_menurow_visible)
+        gtk_widget_hide(mainwin_menurow);
+
+    if (aud_active_skin->properties.mainwin_othertext) {
+        gtk_widget_hide(mainwin_rate_text);
+        gtk_widget_hide(mainwin_freq_text);
+        gtk_widget_hide(mainwin_monostereo);
+
+        if (!aud_active_skin->properties.mainwin_othertext_visible)
+            gtk_widget_hide(mainwin_othertext);
+    } else {
+        gtk_widget_hide(mainwin_othertext);
+    }
+
+    if (!aud_active_skin->properties.mainwin_vis_visible)
+        gtk_widget_hide(mainwin_vis);
+
+    if (!audacious_drct_get_playing()) {
+        gtk_widget_hide(mainwin_minus_num);
+        gtk_widget_hide(mainwin_10min_num);
+        gtk_widget_hide(mainwin_min_num);
+        gtk_widget_hide(mainwin_10sec_num);
+        gtk_widget_hide(mainwin_sec_num);
+
+        gtk_widget_hide(mainwin_stime_min);
+        gtk_widget_hide(mainwin_stime_sec);
+
+        gtk_widget_hide(mainwin_position);
+        gtk_widget_hide(mainwin_sposition);
+    }
+
+    if (config.player_shaded) {
+        ui_svis_clear_data(mainwin_svis);
+        if (config.vis_type != VIS_OFF)
+            ui_svis_set_visible(mainwin_svis, TRUE);
+        else
+            ui_svis_set_visible(mainwin_svis, FALSE);
+
+        ui_skinned_textbox_set_scroll(mainwin_info, FALSE);
+        if (!audacious_drct_get_playing()) {
+            gtk_widget_hide(mainwin_sposition);
+            gtk_widget_hide(mainwin_stime_min);
+            gtk_widget_hide(mainwin_stime_sec);
+        }
+    } else {
+        gtk_widget_hide(mainwin_srew);
+        gtk_widget_hide(mainwin_splay);
+        gtk_widget_hide(mainwin_spause);
+        gtk_widget_hide(mainwin_sstop);
+        gtk_widget_hide(mainwin_sfwd);
+        gtk_widget_hide(mainwin_seject);
+        gtk_widget_hide(mainwin_stime_min);
+        gtk_widget_hide(mainwin_stime_sec);
+        gtk_widget_hide(mainwin_svis);
+        gtk_widget_hide(mainwin_sposition);
+        ui_vis_clear_data(mainwin_vis);
+        if (config.vis_type != VIS_OFF)
+            ui_vis_set_visible(mainwin_vis, TRUE);
+        else
+            ui_vis_set_visible(mainwin_vis, FALSE);
+
+        ui_skinned_textbox_set_scroll(mainwin_info, config.autoscroll);
+    }
+}
+
+void
+mainwin_refresh_hints(void)
+{
+    /* positioning and size attributes */
+    if (aud_active_skin->properties.mainwin_vis_x && aud_active_skin->properties.mainwin_vis_y)
+        gtk_fixed_move(GTK_FIXED(SKINNED_WINDOW(mainwin)->fixed), GTK_WIDGET(mainwin_vis), aud_active_skin->properties.mainwin_vis_x,
+                       aud_active_skin->properties.mainwin_vis_y);
+
+    if (aud_active_skin->properties.mainwin_vis_width)
+        gtk_widget_set_size_request(mainwin_vis, aud_active_skin->properties.mainwin_vis_width * MAINWIN_SCALE_FACTOR,
+                                    UI_VIS(mainwin_vis)->height* MAINWIN_SCALE_FACTOR);
+
+    if (aud_active_skin->properties.mainwin_text_x && aud_active_skin->properties.mainwin_text_y)
+        gtk_fixed_move(GTK_FIXED(SKINNED_WINDOW(mainwin)->fixed), GTK_WIDGET(mainwin_info), aud_active_skin->properties.mainwin_text_x,
+                       aud_active_skin->properties.mainwin_text_y);
+
+    if (aud_active_skin->properties.mainwin_text_width) {
+        UI_SKINNED_TEXTBOX(mainwin_info)->width = aud_active_skin->properties.mainwin_text_width;
+        gtk_widget_set_size_request(mainwin_info, aud_active_skin->properties.mainwin_text_width * MAINWIN_SCALE_FACTOR,
+                                    UI_SKINNED_TEXTBOX(mainwin_info)->height * MAINWIN_SCALE_FACTOR );
+    }
+
+    if (aud_active_skin->properties.mainwin_infobar_x && aud_active_skin->properties.mainwin_infobar_y)
+        gtk_fixed_move(GTK_FIXED(SKINNED_WINDOW(mainwin)->fixed), GTK_WIDGET(mainwin_othertext), aud_active_skin->properties.mainwin_infobar_x,
+                       aud_active_skin->properties.mainwin_infobar_y);
+
+    if (aud_active_skin->properties.mainwin_number_0_x && aud_active_skin->properties.mainwin_number_0_y)
+        gtk_fixed_move(GTK_FIXED(SKINNED_WINDOW(mainwin)->fixed), GTK_WIDGET(mainwin_minus_num), aud_active_skin->properties.mainwin_number_0_x,
+                       aud_active_skin->properties.mainwin_number_0_y);
+
+    if (aud_active_skin->properties.mainwin_number_1_x && aud_active_skin->properties.mainwin_number_1_y)
+        gtk_fixed_move(GTK_FIXED(SKINNED_WINDOW(mainwin)->fixed), GTK_WIDGET(mainwin_10min_num), aud_active_skin->properties.mainwin_number_1_x,
+                       aud_active_skin->properties.mainwin_number_1_y);
+
+    if (aud_active_skin->properties.mainwin_number_2_x && aud_active_skin->properties.mainwin_number_2_y)
+        gtk_fixed_move(GTK_FIXED(SKINNED_WINDOW(mainwin)->fixed), GTK_WIDGET(mainwin_min_num), aud_active_skin->properties.mainwin_number_2_x,
+                       aud_active_skin->properties.mainwin_number_2_y);
+
+    if (aud_active_skin->properties.mainwin_number_3_x && aud_active_skin->properties.mainwin_number_3_y)
+        gtk_fixed_move(GTK_FIXED(SKINNED_WINDOW(mainwin)->fixed), GTK_WIDGET(mainwin_10sec_num), aud_active_skin->properties.mainwin_number_3_x,
+                       aud_active_skin->properties.mainwin_number_3_y);
+
+    if (aud_active_skin->properties.mainwin_number_4_x && aud_active_skin->properties.mainwin_number_4_y)
+        gtk_fixed_move(GTK_FIXED(SKINNED_WINDOW(mainwin)->fixed), GTK_WIDGET(mainwin_sec_num), aud_active_skin->properties.mainwin_number_4_x,
+                       aud_active_skin->properties.mainwin_number_4_y);
+
+    if (aud_active_skin->properties.mainwin_playstatus_x && aud_active_skin->properties.mainwin_playstatus_y)
+        gtk_fixed_move(GTK_FIXED(SKINNED_WINDOW(mainwin)->fixed), mainwin_playstatus, aud_active_skin->properties.mainwin_playstatus_x,
+                       aud_active_skin->properties.mainwin_playstatus_y);
+
+    if (aud_active_skin->properties.mainwin_volume_x && aud_active_skin->properties.mainwin_volume_y)
+        gtk_fixed_move(GTK_FIXED(SKINNED_WINDOW(mainwin)->fixed), GTK_WIDGET(mainwin_volume), aud_active_skin->properties.mainwin_volume_x,
+                       aud_active_skin->properties.mainwin_volume_y);
+
+    if (aud_active_skin->properties.mainwin_balance_x && aud_active_skin->properties.mainwin_balance_y)
+        gtk_fixed_move(GTK_FIXED(SKINNED_WINDOW(mainwin)->fixed), GTK_WIDGET(mainwin_balance), aud_active_skin->properties.mainwin_balance_x,
+                       aud_active_skin->properties.mainwin_balance_y);
+
+    if (aud_active_skin->properties.mainwin_position_x && aud_active_skin->properties.mainwin_position_y)
+        gtk_fixed_move(GTK_FIXED(SKINNED_WINDOW(mainwin)->fixed), GTK_WIDGET(mainwin_position), aud_active_skin->properties.mainwin_position_x,
+                       aud_active_skin->properties.mainwin_position_y);
+
+    if (aud_active_skin->properties.mainwin_previous_x && aud_active_skin->properties.mainwin_previous_y)
+        gtk_fixed_move(GTK_FIXED(SKINNED_WINDOW(mainwin)->fixed), mainwin_rew, aud_active_skin->properties.mainwin_previous_x,
+                       aud_active_skin->properties.mainwin_previous_y);
+
+    if (aud_active_skin->properties.mainwin_play_x && aud_active_skin->properties.mainwin_play_y)
+        gtk_fixed_move(GTK_FIXED(SKINNED_WINDOW(mainwin)->fixed), GTK_WIDGET(mainwin_play), aud_active_skin->properties.mainwin_play_x,
+                       aud_active_skin->properties.mainwin_play_y);
+
+    if (aud_active_skin->properties.mainwin_pause_x && aud_active_skin->properties.mainwin_pause_y)
+        gtk_fixed_move(GTK_FIXED(SKINNED_WINDOW(mainwin)->fixed), GTK_WIDGET(mainwin_pause), aud_active_skin->properties.mainwin_pause_x,
+                       aud_active_skin->properties.mainwin_pause_y);
+
+    if (aud_active_skin->properties.mainwin_stop_x && aud_active_skin->properties.mainwin_stop_y)
+        gtk_fixed_move(GTK_FIXED(SKINNED_WINDOW(mainwin)->fixed), GTK_WIDGET(mainwin_stop), aud_active_skin->properties.mainwin_stop_x,
+                       aud_active_skin->properties.mainwin_stop_y);
+
+    if (aud_active_skin->properties.mainwin_next_x && aud_active_skin->properties.mainwin_next_y)
+        gtk_fixed_move(GTK_FIXED(SKINNED_WINDOW(mainwin)->fixed), GTK_WIDGET(mainwin_fwd), aud_active_skin->properties.mainwin_next_x,
+                       aud_active_skin->properties.mainwin_next_y);
+
+    if (aud_active_skin->properties.mainwin_eject_x && aud_active_skin->properties.mainwin_eject_y)
+        gtk_fixed_move(GTK_FIXED(SKINNED_WINDOW(mainwin)->fixed), GTK_WIDGET(mainwin_eject), aud_active_skin->properties.mainwin_eject_x,
+                       aud_active_skin->properties.mainwin_eject_y);
+
+    if (aud_active_skin->properties.mainwin_eqbutton_x && aud_active_skin->properties.mainwin_eqbutton_y)
+        gtk_fixed_move(GTK_FIXED(SKINNED_WINDOW(mainwin)->fixed), GTK_WIDGET(mainwin_eq), aud_active_skin->properties.mainwin_eqbutton_x,
+                       aud_active_skin->properties.mainwin_eqbutton_y);
+
+    if (aud_active_skin->properties.mainwin_plbutton_x && aud_active_skin->properties.mainwin_plbutton_y)
+        gtk_fixed_move(GTK_FIXED(SKINNED_WINDOW(mainwin)->fixed), GTK_WIDGET(mainwin_pl), aud_active_skin->properties.mainwin_plbutton_x,
+                       aud_active_skin->properties.mainwin_plbutton_y);
+
+    if (aud_active_skin->properties.mainwin_shuffle_x && aud_active_skin->properties.mainwin_shuffle_y)
+        gtk_fixed_move(GTK_FIXED(SKINNED_WINDOW(mainwin)->fixed), GTK_WIDGET(mainwin_shuffle), aud_active_skin->properties.mainwin_shuffle_x,
+                       aud_active_skin->properties.mainwin_shuffle_y);
+
+    if (aud_active_skin->properties.mainwin_repeat_x && aud_active_skin->properties.mainwin_repeat_y)
+        gtk_fixed_move(GTK_FIXED(SKINNED_WINDOW(mainwin)->fixed), GTK_WIDGET(mainwin_repeat), aud_active_skin->properties.mainwin_repeat_x,
+                       aud_active_skin->properties.mainwin_repeat_y);
+
+    if (aud_active_skin->properties.mainwin_about_x && aud_active_skin->properties.mainwin_about_y)
+        gtk_fixed_move(GTK_FIXED(SKINNED_WINDOW(mainwin)->fixed), GTK_WIDGET(mainwin_about), aud_active_skin->properties.mainwin_about_x,
+                       aud_active_skin->properties.mainwin_about_y);
+
+    if (aud_active_skin->properties.mainwin_minimize_x && aud_active_skin->properties.mainwin_minimize_y)
+        gtk_fixed_move(GTK_FIXED(SKINNED_WINDOW(mainwin)->fixed), GTK_WIDGET(mainwin_minimize), config.player_shaded ? 244 : aud_active_skin->properties.mainwin_minimize_x,
+                       config.player_shaded ? 3 : aud_active_skin->properties.mainwin_minimize_y);
+
+    if (aud_active_skin->properties.mainwin_shade_x && aud_active_skin->properties.mainwin_shade_y)
+        gtk_fixed_move(GTK_FIXED(SKINNED_WINDOW(mainwin)->fixed), GTK_WIDGET(mainwin_shade), config.player_shaded ? 254 : aud_active_skin->properties.mainwin_shade_x,
+                       config.player_shaded ? 3 : aud_active_skin->properties.mainwin_shade_y);
+
+    if (aud_active_skin->properties.mainwin_close_x && aud_active_skin->properties.mainwin_close_y)
+        gtk_fixed_move(GTK_FIXED(SKINNED_WINDOW(mainwin)->fixed), GTK_WIDGET(mainwin_close), config.player_shaded ? 264 : aud_active_skin->properties.mainwin_close_x,
+                       config.player_shaded ? 3 : aud_active_skin->properties.mainwin_close_y);
+
+    mainwin_refresh_visible();
+
+    /* window size, mainwinWidth && mainwinHeight properties */
+    if (aud_active_skin->properties.mainwin_height && aud_active_skin->properties.mainwin_width)
+    {
+        dock_window_resize(GTK_WINDOW(mainwin), config.player_shaded ? MAINWIN_SHADED_WIDTH * MAINWIN_SCALE_FACTOR : aud_active_skin->properties.mainwin_width * MAINWIN_SCALE_FACTOR,
+                           config.player_shaded ? MAINWIN_SHADED_HEIGHT * MAINWIN_SCALE_FACTOR : aud_active_skin->properties.mainwin_height * MAINWIN_SCALE_FACTOR,
+                           aud_active_skin->properties.mainwin_width * MAINWIN_SCALE_FACTOR,
+                           aud_active_skin->properties.mainwin_height * MAINWIN_SCALE_FACTOR);
+
+        gdk_flush();
+    }
+}
+
+void
+mainwin_set_song_info(gint bitrate,
+                      gint frequency,
+                      gint n_channels)
+{
+    gchar *text;
+    gchar *title;
+    Playlist *playlist = aud_playlist_get_active();
+
+    GDK_THREADS_ENTER();
+    if (bitrate != -1) {
+        bitrate /= 1000;
+
+        if (bitrate < 1000) {
+            /* Show bitrate in 1000s */
+            text = g_strdup_printf("%3d", bitrate);
+        }
+        else {
+            /* Show bitrate in 100,000s */
+            text = g_strdup_printf("%2dH", bitrate / 100);
+        }
+        ui_skinned_textbox_set_text(mainwin_rate_text, text);
+        g_free(text);
+    }
+    else
+        ui_skinned_textbox_set_text(mainwin_rate_text, _("VBR"));
+
+    /* Show sampling frequency in kHz */
+    text = g_strdup_printf("%2d", frequency / 1000);
+    ui_skinned_textbox_set_text(mainwin_freq_text, text);
+    g_free(text);
+
+    ui_skinned_monostereo_set_num_channels(mainwin_monostereo, n_channels);
+
+    if (!audacious_drct_get_paused() && mainwin_playstatus != NULL)
+        ui_skinned_playstatus_set_status(mainwin_playstatus, STATUS_PLAY);
+
+    if (aud_active_skin && aud_active_skin->properties.mainwin_othertext)
+    {
+        if (bitrate != -1)
+            text = g_strdup_printf("%d kbps, %0.1f kHz, %s",
+                                   bitrate,
+                                   (gfloat) frequency / 1000,
+                                   (n_channels > 1) ? _("stereo") : _("mono"));
+        else
+            text = g_strdup_printf("VBR, %0.1f kHz, %s",
+                                   (gfloat) frequency / 1000,
+                                   (n_channels > 1) ? _("stereo") : _("mono"));
+
+        ui_skinned_textbox_set_text(mainwin_othertext, text);
+        g_free(text);
+    }
+
+    title = aud_playlist_get_info_text(playlist);
+    mainwin_set_song_title(title);
+    g_free(title);
+    GDK_THREADS_LEAVE();
+}
+
+void
+mainwin_clear_song_info(void)
+{
+    if (!mainwin)
+        return;
+
+    /* clear title */
+    mainwin_set_song_title(NULL);
+
+#if 0
+    /* clear sampling parameters */
+    playback_set_sample_params(0, 0, 0);
+#endif
+    UI_SKINNED_HORIZONTAL_SLIDER(mainwin_position)->pressed = FALSE;
+    UI_SKINNED_HORIZONTAL_SLIDER(mainwin_sposition)->pressed = FALSE;
+
+    /* clear sampling parameter displays */
+    ui_skinned_textbox_set_text(mainwin_rate_text, "   ");
+    ui_skinned_textbox_set_text(mainwin_freq_text, "  ");
+    ui_skinned_monostereo_set_num_channels(mainwin_monostereo, 0);
+
+    if (mainwin_playstatus != NULL)
+        ui_skinned_playstatus_set_status(mainwin_playstatus, STATUS_STOP);
+
+    mainwin_refresh_visible();
+
+    playlistwin_hide_timer();
+
+    ui_vis_clear_data(mainwin_vis);
+    ui_svis_clear_data(mainwin_svis);
+}
+
+void
+mainwin_disable_seekbar(void)
+{
+    if (!mainwin)
+        return;
+
+    gtk_widget_hide(mainwin_position);
+    gtk_widget_hide(mainwin_sposition);
+}
+
+static gboolean
+mainwin_mouse_button_release(GtkWidget * widget,
+                             GdkEventButton * event,
+                             gpointer callback_data)
+{
+    if (dock_is_moving(GTK_WINDOW(mainwin))) {
+        dock_move_release(GTK_WINDOW(mainwin));
+    }
+
+    return FALSE;
+}
+
+void
+mainwin_scrolled(GtkWidget *widget, GdkEventScroll *event,
+                 gpointer callback_data)
+{
+    Playlist *playlist = aud_playlist_get_active();
+
+    switch (event->direction) {
+        case GDK_SCROLL_UP:
+            mainwin_set_volume_diff(config.mouse_change);
+            break;
+        case GDK_SCROLL_DOWN:
+            mainwin_set_volume_diff(-config.mouse_change);
+            break;
+        case GDK_SCROLL_LEFT:
+            if (aud_playlist_get_current_length(playlist) != -1)
+                audacious_drct_seek(CLAMP(audacious_drct_get_time() - 1000,
+                                    0, aud_playlist_get_current_length(playlist)) / 1000);
+            break;
+        case GDK_SCROLL_RIGHT:
+            if (aud_playlist_get_current_length(playlist) != -1)
+                audacious_drct_seek(CLAMP(audacious_drct_get_time() + 1000,
+                                    0, aud_playlist_get_current_length(playlist)) / 1000);
+            break;
+    }
+}
+
+static gboolean
+mainwin_widget_contained(GdkEventButton *event, int x, int y, int w, int h)
+{
+    if ((event->x > x && event->y > y) &&
+        (event->x < x+w && event->y < y+h))
+        return TRUE;
+
+    return FALSE;
+}
+
+static gboolean
+mainwin_mouse_button_press(GtkWidget * widget,
+                           GdkEventButton * event,
+                           gpointer callback_data)
+{
+    if (config.scaled) {
+        /*
+         * A hack to make scaling transparent to callbacks.
+         * We should make a copy of this data instead of
+         * tampering with the data we get from gtk+
+         */
+        event->x /= config.scale_factor;
+        event->y /= config.scale_factor;
+    }
+
+    if (event->button == 1 && event->type == GDK_2BUTTON_PRESS && event->y < 14) {
+        mainwin_set_shade(!config.player_shaded);
+        if (dock_is_moving(GTK_WINDOW(mainwin)))
+            dock_move_release(GTK_WINDOW(mainwin));
+        return TRUE;
+    }
+
+    if (event->button == 3) {
+        /* Pop up playback menu if right clicked over playback-control widgets,
+         * otherwise popup general menu
+         */
+        if (mainwin_widget_contained(event, aud_active_skin->properties.mainwin_position_x,
+                                     aud_active_skin->properties.mainwin_position_y, 248, 10) ||
+            mainwin_widget_contained(event, aud_active_skin->properties.mainwin_previous_x,
+                                     aud_active_skin->properties.mainwin_previous_y, 23, 18) ||
+            mainwin_widget_contained(event, aud_active_skin->properties.mainwin_play_x,
+                                     aud_active_skin->properties.mainwin_play_y, 23, 18) ||
+            mainwin_widget_contained(event, aud_active_skin->properties.mainwin_pause_x,
+                                     aud_active_skin->properties.mainwin_pause_y, 23, 18) ||
+            mainwin_widget_contained(event, aud_active_skin->properties.mainwin_stop_x,
+                                     aud_active_skin->properties.mainwin_stop_y, 23, 18) ||
+            mainwin_widget_contained(event, aud_active_skin->properties.mainwin_next_x,
+                                     aud_active_skin->properties.mainwin_next_y, 23, 18))
+        {
+
+            ui_manager_popup_menu_show(GTK_MENU(mainwin_playback_menu),
+                                       event->x_root,
+                                       event->y_root, 3, event->time);
+
+        } else {
+            /*
+             * Pop up the main menu a few pixels down.
+             * This will avoid that anything is selected
+             * if one right-clicks to focus the window
+             * without raising it.
+             *
+             ***MD I think the above is stupid, people don't expect this
+             *
+             */
+
+            ui_manager_popup_menu_show(GTK_MENU(mainwin_general_menu),
+                                       event->x_root,
+                                       event->y_root, 3, event->time);
+
+        }
+        return TRUE;
+    }
+
+    return FALSE;
+}
+
+static gboolean
+mainwin_keypress(GtkWidget * grab_widget,
+                 GdkEventKey * event,
+                 gpointer data)
+{
+    Playlist *playlist = aud_playlist_get_active();
+
+    switch (event->keyval) {
+
+        case GDK_Up:
+        case GDK_KP_Up:
+        case GDK_KP_8:
+            mainwin_set_volume_diff(2);
+            break;
+        case GDK_Down:
+        case GDK_KP_Down:
+        case GDK_KP_2:
+            mainwin_set_volume_diff(-2);
+            break;
+        case GDK_Left:
+        case GDK_KP_Left:
+        case GDK_KP_7:
+            if (aud_playlist_get_current_length(playlist) != -1)
+                audacious_drct_seek(CLAMP
+                              (audacious_drct_get_time() - 5000, 0,
+                               aud_playlist_get_current_length(playlist)) / 1000);
+            break;
+        case GDK_Right:
+        case GDK_KP_Right:
+        case GDK_KP_9:
+            if (aud_playlist_get_current_length(playlist) != -1)
+                audacious_drct_seek(CLAMP
+                              (audacious_drct_get_time() + 5000, 0,
+                               aud_playlist_get_current_length(playlist)) / 1000);
+            break;
+        case GDK_KP_4:
+            aud_playlist_prev(playlist);
+            break;
+        case GDK_KP_6:
+            aud_playlist_next(playlist);
+            break;
+        case GDK_KP_Insert:
+            audacious_drct_jtf_show();
+            break;
+        case GDK_Return:
+        case GDK_KP_Enter:
+        case GDK_KP_5:
+            mainwin_play_pushed();
+            break;
+        case GDK_space:
+            audacious_drct_pause();
+            break;
+        case GDK_Escape:
+            mainwin_minimize_cb();
+            break;
+        case GDK_Tab:
+            if (event->state & GDK_CONTROL_MASK) {
+                if (config.equalizer_visible)
+                    gtk_window_present(GTK_WINDOW(equalizerwin));
+                else if (config.playlist_visible)
+                    gtk_window_present(GTK_WINDOW(playlistwin));
+            }
+            break;
+        case GDK_c:
+            if (event->state & GDK_CONTROL_MASK) {
+                Playlist *playlist = aud_playlist_get_active();
+                gint pos = aud_playlist_get_position(playlist);
+                gchar *title = aud_playlist_get_songtitle(playlist, pos);
+
+                if (title != NULL) {
+                    GtkClipboard *clip = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD);
+                    gtk_clipboard_set_text(clip, title, -1);
+                    gtk_clipboard_store(clip);
+                }
+
+                return TRUE;
+            }
+            return FALSE;
+        default:
+            return FALSE;
+    }
+
+    return TRUE;
+}
+
+static void
+mainwin_jump_to_time_cb(GtkWidget * widget,
+                        GtkWidget * entry)
+{
+    guint min = 0, sec = 0, params;
+    gint time;
+    Playlist *playlist = aud_playlist_get_active();
+
+    params = sscanf(gtk_entry_get_text(GTK_ENTRY(entry)), "%u:%u",
+                    &min, &sec);
+    if (params == 2)
+        time = (min * 60) + sec;
+    else if (params == 1)
+        time = min;
+    else
+        return;
+
+    if (aud_playlist_get_current_length(playlist) > -1 &&
+        time <= (aud_playlist_get_current_length(playlist) / 1000))
+    {
+        audacious_drct_seek(time);
+        gtk_widget_destroy(mainwin_jtt);
+    }
+}
+
+
+void
+mainwin_jump_to_time(void)
+{
+    GtkWidget *vbox, *hbox_new, *hbox_total;
+    GtkWidget *time_entry, *label, *bbox, *jump, *cancel;
+    GtkWidget *dialog;
+    guint tindex;
+    gchar time_str[10];
+
+    if (!audacious_drct_get_playing()) {
+        dialog =
+            gtk_message_dialog_new (GTK_WINDOW (mainwin),
+                                    GTK_DIALOG_DESTROY_WITH_PARENT,
+                                    GTK_MESSAGE_ERROR,
+                                    GTK_BUTTONS_CLOSE,
+                                    _("Can't jump to time when no track is being played.\n"));
+        gtk_dialog_run (GTK_DIALOG (dialog));
+        gtk_widget_destroy (dialog);
+        return;
+    }
+
+    if (mainwin_jtt) {
+        gtk_window_present(GTK_WINDOW(mainwin_jtt));
+        return;
+    }
+
+    mainwin_jtt = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+    gtk_window_set_type_hint(GTK_WINDOW(mainwin_jtt),
+                             GDK_WINDOW_TYPE_HINT_DIALOG);
+
+    gtk_window_set_title(GTK_WINDOW(mainwin_jtt), _("Jump to Time"));
+    gtk_window_set_position(GTK_WINDOW(mainwin_jtt), GTK_WIN_POS_CENTER);
+    gtk_window_set_transient_for(GTK_WINDOW(mainwin_jtt),
+                                 GTK_WINDOW(mainwin));
+
+    g_signal_connect(mainwin_jtt, "destroy",
+                     G_CALLBACK(gtk_widget_destroyed), &mainwin_jtt);
+    gtk_container_border_width(GTK_CONTAINER(mainwin_jtt), 10);
+
+    vbox = gtk_vbox_new(FALSE, 5);
+    gtk_container_add(GTK_CONTAINER(mainwin_jtt), vbox);
+
+    hbox_new = gtk_hbox_new(FALSE, 0);
+    gtk_box_pack_start(GTK_BOX(vbox), hbox_new, TRUE, TRUE, 5);
+
+    time_entry = gtk_entry_new();
+    gtk_box_pack_start(GTK_BOX(hbox_new), time_entry, FALSE, FALSE, 5);
+    g_signal_connect(time_entry, "activate",
+                     G_CALLBACK(mainwin_jump_to_time_cb), time_entry);
+
+    gtk_widget_set_size_request(time_entry, 70, -1);
+    label = gtk_label_new(_("minutes:seconds"));
+    gtk_box_pack_start(GTK_BOX(hbox_new), label, FALSE, FALSE, 5);
+
+    hbox_total = gtk_hbox_new(FALSE, 0);
+    gtk_box_pack_start(GTK_BOX(vbox), hbox_total, TRUE, TRUE, 5);
+    gtk_widget_show(hbox_total);
+
+    /* FIXME: Disable display of current track length. It's not
+       updated when track changes */
+
+    label = gtk_label_new(_("Track length:"));
+    gtk_box_pack_start(GTK_BOX(hbox_total), label, FALSE, FALSE, 5);
+
+    gint len = aud_playlist_get_current_length(aud_playlist_get_active()) / 1000;
+    g_snprintf(time_str, sizeof(time_str), "%u:%2.2u", len / 60, len % 60);
+    label = gtk_label_new(time_str);
+
+    gtk_box_pack_start(GTK_BOX(hbox_total), label, FALSE, FALSE, 10);
+
+    bbox = gtk_hbutton_box_new();
+    gtk_box_pack_start(GTK_BOX(vbox), bbox, TRUE, TRUE, 0);
+    gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END);
+    gtk_button_box_set_spacing(GTK_BUTTON_BOX(bbox), 5);
+
+    cancel = gtk_button_new_from_stock(GTK_STOCK_CANCEL);
+    GTK_WIDGET_SET_FLAGS(cancel, GTK_CAN_DEFAULT);
+    gtk_container_add(GTK_CONTAINER(bbox), cancel);
+    g_signal_connect_swapped(cancel, "clicked",
+                             G_CALLBACK(gtk_widget_destroy), mainwin_jtt);
+
+    jump = gtk_button_new_from_stock(GTK_STOCK_JUMP_TO);
+    GTK_WIDGET_SET_FLAGS(jump, GTK_CAN_DEFAULT);
+    gtk_container_add(GTK_CONTAINER(bbox), jump);
+    g_signal_connect(jump, "clicked",
+                     G_CALLBACK(mainwin_jump_to_time_cb), time_entry);
+
+    tindex = audacious_drct_get_time() / 1000;
+    g_snprintf(time_str, sizeof(time_str), "%u:%2.2u", tindex / 60,
+               tindex % 60);
+    gtk_entry_set_text(GTK_ENTRY(time_entry), time_str);
+
+    gtk_entry_select_region(GTK_ENTRY(time_entry), 0, strlen(time_str));
+
+    gtk_widget_show_all(mainwin_jtt);
+
+    gtk_widget_grab_focus(time_entry);
+    gtk_widget_grab_default(jump);
+}
+
+/*
+ * Rewritten 09/13/06:
+ *
+ * Remove all of this flaky iter/sourcelist/strsplit stuff.
+ * All we care about is the filepath.
+ *
+ * We can figure this out and easily pass it to g_filename_from_uri().
+ *   - nenolod
+ */
+void
+mainwin_drag_data_received(GtkWidget * widget,
+                           GdkDragContext * context,
+                           gint x,
+                           gint y,
+                           GtkSelectionData * selection_data,
+                           guint info,
+                           guint time,
+                           gpointer user_data)
+{
+    Playlist *playlist = aud_playlist_get_active();
+
+    g_return_if_fail(selection_data != NULL);
+    g_return_if_fail(selection_data->data != NULL);
+
+    if (aud_str_has_prefix_nocase((gchar *) selection_data->data, "fonts:///"))
+    {
+        gchar *path = (gchar *) selection_data->data;
+        gchar *decoded = g_filename_from_uri(path, NULL, NULL);
+
+        if (decoded == NULL)
+            return;
+
+        config.playlist_font = g_strconcat(decoded, strrchr(config.playlist_font, ' '), NULL);
+        ui_skinned_playlist_set_font(config.playlist_font);
+        playlistwin_update_list(playlist);
+
+        g_free(decoded);
+
+        return;
+    }
+
+    /* perhaps make suffix check case-insensitive -- desowin */
+    if (aud_str_has_prefix_nocase((char*)selection_data->data, "file:///")) {
+        if (str_has_suffix_nocase((char*)selection_data->data, ".wsz\r\n") ||
+            str_has_suffix_nocase((char*)selection_data->data, ".zip\r\n")) {
+            on_skin_view_drag_data_received(GTK_WIDGET(user_data), context, x, y, selection_data, info, time, NULL);
+            return;
+        }
+    }
+
+    aud_playlist_clear(playlist);
+    aud_playlist_add_url(playlist, (gchar *) selection_data->data);
+    audacious_drct_initiate();
+}
+
+static void
+on_add_url_add_clicked(GtkWidget * widget,
+                       GtkWidget * entry)
+{
+    const gchar *text = gtk_entry_get_text(GTK_ENTRY(entry));
+    if (text && *text)
+        aud_playlist_add_url(aud_playlist_get_active(), text);
+}
+
+static void
+on_add_url_ok_clicked(GtkWidget * widget,
+                      GtkWidget * entry)
+{
+    Playlist *playlist = aud_playlist_get_active();
+
+    const gchar *text = gtk_entry_get_text(GTK_ENTRY(entry));
+    if (text && *text)
+    {
+        aud_playlist_clear(playlist);
+        aud_playlist_add_url(playlist, text);
+        audacious_drct_initiate();
+    }
+}
+
+static void
+on_visibility_warning_toggle(GtkToggleButton *tbt, gpointer unused)
+{
+    config.warn_about_win_visibility = !gtk_toggle_button_get_active(tbt);
+}
+
+static void
+on_visibility_warning_response(GtkDialog *dlg, gint r_id, gpointer unused)
+{
+    switch (r_id)
+    {
+        case GTK_RESPONSE_OK:
+            mainwin_show(TRUE);
+            break;
+        case GTK_RESPONSE_CANCEL:
+        default:
+            break;
+    }
+    gtk_widget_destroy(GTK_WIDGET(dlg));
+}
+
+void
+mainwin_show_visibility_warning(void)
+{
+    if (config.warn_about_win_visibility)
+    {
+        GtkWidget *label, *checkbt, *vbox;
+        GtkWidget *warning_dlg =
+            gtk_dialog_new_with_buttons( _("Audacious - visibility warning") ,
+                                         GTK_WINDOW(mainwin) ,
+                                         GTK_DIALOG_DESTROY_WITH_PARENT ,
+                                         _("Show main player window") ,
+                                         GTK_RESPONSE_OK , _("Ignore") ,
+                                         GTK_RESPONSE_CANCEL , NULL );
+
+        vbox = gtk_vbox_new( FALSE , 4 );
+        gtk_container_set_border_width( GTK_CONTAINER(vbox) , 4 );
+        gtk_box_pack_start( GTK_BOX(GTK_DIALOG(warning_dlg)->vbox) , vbox , TRUE , TRUE , 0 );
+        label = gtk_label_new( _("Audacious has been started with all of its windows hidden.\n"
+                                 "You may want to show the player window again to control Audacious; "
+                                 "otherwise, you'll have to control it remotely via audtool or "
+                                 "enabled plugins (such as the statusicon plugin).") );
+        gtk_label_set_line_wrap( GTK_LABEL(label) , TRUE );
+        gtk_misc_set_alignment( GTK_MISC(label) , 0.0 , 0.0 );
+        checkbt = gtk_check_button_new_with_label( _("Always ignore, show/hide is controlled remotely") );
+        gtk_box_pack_start( GTK_BOX(vbox) , label , TRUE , TRUE , 0 );
+        gtk_box_pack_start( GTK_BOX(vbox) , checkbt , TRUE , TRUE , 0 );
+        g_signal_connect( G_OBJECT(checkbt) , "toggled" ,
+                          G_CALLBACK(on_visibility_warning_toggle) , NULL );
+        g_signal_connect( G_OBJECT(warning_dlg) , "response" ,
+                          G_CALLBACK(on_visibility_warning_response) , NULL );
+        gtk_widget_show_all(warning_dlg);
+    }
+}
+
+static void
+on_broken_gtk_engine_warning_toggle(GtkToggleButton *tbt, gpointer unused)
+{
+    config.warn_about_broken_gtk_engines = !gtk_toggle_button_get_active(tbt);
+}
+
+void
+ui_main_check_theme_engine(void)
+{
+    GtkSettings *settings;
+    GtkWidget *widget;
+    gchar *theme = NULL;
+
+    widget = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+    gtk_widget_ensure_style(widget);
+
+    settings = gtk_settings_get_default();
+    g_object_get(G_OBJECT(settings), "gtk-theme-name", &theme, NULL);
+    gtk_widget_destroy(widget);
+
+    if (theme == NULL)
+        return;
+
+    if (g_ascii_strcasecmp(theme, "Qt"))
+    {
+        g_free(theme);
+        return;
+    }
+
+    if (config.warn_about_broken_gtk_engines)
+    {
+        gchar *msg;
+        GtkWidget *label, *checkbt, *vbox;
+        GtkWidget *warning_dlg =
+            gtk_dialog_new_with_buttons( _("Audacious - broken GTK engine usage warning") ,
+                                         GTK_WINDOW(mainwin) , GTK_DIALOG_DESTROY_WITH_PARENT ,
+                                         GTK_STOCK_CLOSE, GTK_RESPONSE_OK, NULL );
+        vbox = gtk_vbox_new( FALSE , 4 );
+        gtk_container_set_border_width( GTK_CONTAINER(vbox) , 4 );
+        gtk_box_pack_start( GTK_BOX(GTK_DIALOG(warning_dlg)->vbox) , vbox ,
+                            TRUE , TRUE , 0 );
+
+        msg = g_strdup_printf(_("<big><b>Broken GTK engine in use</b></big>\n\n"
+                                "Audacious has detected that you are using a broken GTK engine.\n\n"
+                                "The theme engine you are using, <i>%s</i>, is incompatible with some of the features "
+                                "used by modern skins. The incompatible features have been disabled for this session.\n\n"
+                                "To use these features, please consider using a different GTK theme engine."), theme);
+        label = gtk_label_new(msg);
+        gtk_label_set_use_markup(GTK_LABEL(label), TRUE);
+        g_free(msg);
+
+        gtk_label_set_line_wrap( GTK_LABEL(label) , TRUE );
+        gtk_misc_set_alignment( GTK_MISC(label) , 0.0 , 0.0 );
+        checkbt = gtk_check_button_new_with_label( _("Do not display this warning again") );
+        gtk_box_pack_start( GTK_BOX(vbox) , label , TRUE , TRUE , 0 );
+        gtk_box_pack_start( GTK_BOX(vbox) , checkbt , TRUE , TRUE , 0 );
+        g_signal_connect( G_OBJECT(checkbt) , "toggled" ,
+                          G_CALLBACK(on_broken_gtk_engine_warning_toggle) , NULL );
+        g_signal_connect( G_OBJECT(warning_dlg) , "response" ,
+                          G_CALLBACK(gtk_widget_destroy) , NULL );        
+        gtk_widget_show_all(warning_dlg);
+        gtk_window_stick(GTK_WINDOW(warning_dlg));
+    }
+
+    config.disable_inline_gtk = TRUE;
+
+    g_free(theme);
+}
+
+void
+mainwin_show_add_url_window(void)
+{
+#if 0
+    static GtkWidget *url_window = NULL;
+
+    if (!url_window) {
+        url_window =
+            util_add_url_dialog_new(_("Enter location to play:"),
+                                    G_CALLBACK(on_add_url_ok_clicked),
+                                    G_CALLBACK(on_add_url_add_clicked));
+        gtk_window_set_transient_for(GTK_WINDOW(url_window),
+                                     GTK_WINDOW(mainwin));
+        g_signal_connect(url_window, "destroy",
+                         G_CALLBACK(gtk_widget_destroyed),
+                         &url_window);
+    }
+
+    gtk_window_present(GTK_WINDOW(url_window));
+#endif
+}
+
+static void
+check_set( GtkActionGroup * action_group ,
+           const gchar * action_name ,
+           gboolean is_on )
+{
+    /* check_set noew uses gtkaction */
+    GtkAction *action = gtk_action_group_get_action( action_group , action_name );
+    if ( action != NULL )
+        gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(action) , is_on );
+    return;
+}
+
+void
+mainwin_eject_pushed(void)
+{
+    action_play_file();
+}
+
+void
+mainwin_rev_pushed(void)
+{
+    g_get_current_time(&cb_time);
+
+    seek_initial_pos = ui_skinned_horizontal_slider_get_position(mainwin_position);
+    seek_state = MAINWIN_SEEK_REV;
+    mainwin_timeout_id = g_timeout_add(MAINWIN_UPDATE_INTERVAL,
+                                       (GSourceFunc) mainwin_idle_func, NULL);
+}
+
+void
+mainwin_rev_release(void)
+{
+    GTimeVal now_time;
+    GTimeVal delta_time;
+    gulong now_dur;
+
+    g_get_current_time(&now_time);
+
+    delta_time.tv_usec = now_time.tv_usec - cb_time.tv_usec;
+    delta_time.tv_sec = now_time.tv_sec - cb_time.tv_sec;
+
+    now_dur = labs((delta_time.tv_sec * 1000) + (glong) (delta_time.tv_usec / 1000));
+
+    if ( now_dur <= TRISTATE_THRESHOLD )
+    {
+        /* interpret as 'skip to previous song' */
+        aud_playlist_prev(aud_playlist_get_active());
+    }
+    else
+    {
+        /* interpret as 'seek' */
+        mainwin_position_release_cb( mainwin_position, ui_skinned_horizontal_slider_get_position(mainwin_position) );
+    }
+
+    seek_state = MAINWIN_SEEK_NIL;
+
+    g_source_remove(mainwin_timeout_id);
+    mainwin_timeout_id = 0;
+}
+
+void
+mainwin_fwd_pushed(void)
+{
+    g_get_current_time(&cb_time);
+
+    seek_initial_pos = ui_skinned_horizontal_slider_get_position(mainwin_position);
+    seek_state = MAINWIN_SEEK_FWD;
+    mainwin_timeout_id = g_timeout_add(MAINWIN_UPDATE_INTERVAL,
+                                       (GSourceFunc) mainwin_idle_func, NULL);
+}
+
+void
+mainwin_fwd_release(void)
+{
+    GTimeVal now_time;
+    GTimeVal delta_time;
+    gulong now_dur;
+
+    g_get_current_time(&now_time);
+
+    delta_time.tv_usec = now_time.tv_usec - cb_time.tv_usec;
+    delta_time.tv_sec = now_time.tv_sec - cb_time.tv_sec;
+
+    now_dur = labs((delta_time.tv_sec * 1000) + (glong) (delta_time.tv_usec / 1000));
+
+    if ( now_dur <= TRISTATE_THRESHOLD )
+    {
+        /* interpret as 'skip to next song' */
+        aud_playlist_next(aud_playlist_get_active());
+    }
+    else
+    {
+        /* interpret as 'seek' */
+        mainwin_position_release_cb( mainwin_position, ui_skinned_horizontal_slider_get_position(mainwin_position) );
+    }
+
+    seek_state = MAINWIN_SEEK_NIL;
+
+    g_source_remove(mainwin_timeout_id);
+    mainwin_timeout_id = 0;
+}
+
+void
+mainwin_play_pushed(void)
+{
+    if (ab_position_a != -1)
+        audacious_drct_seek(ab_position_a / 1000);
+    if (audacious_drct_get_paused()) {
+        audacious_drct_pause();
+        return;
+    }
+
+    if (aud_playlist_get_length(aud_playlist_get_active()))
+        audacious_drct_initiate();
+    else
+        mainwin_eject_pushed();
+}
+
+void
+mainwin_stop_pushed(void)
+{
+    audacious_drct_stop();
+    mainwin_clear_song_info();
+    ab_position_a = ab_position_b = -1;
+}
+
+void
+mainwin_shuffle_pushed(gboolean toggled)
+{
+    check_set( toggleaction_group_others , "playback shuffle" , toggled );
+}
+
+void mainwin_shuffle_pushed_cb(void) {
+    mainwin_shuffle_pushed(UI_SKINNED_BUTTON(mainwin_shuffle)->inside);
+}
+
+void
+mainwin_repeat_pushed(gboolean toggled)
+{
+    check_set( toggleaction_group_others , "playback repeat" , toggled );
+}
+
+void mainwin_repeat_pushed_cb(void) {
+    mainwin_repeat_pushed(UI_SKINNED_BUTTON(mainwin_repeat)->inside);
+}
+
+void mainwin_equalizer_pushed_cb(void) {
+    mainwin_eq_pushed(UI_SKINNED_BUTTON(mainwin_eq)->inside);
+}
+
+void mainwin_playlist_pushed_cb(void) {
+    mainwin_pl_pushed(UI_SKINNED_BUTTON(mainwin_pl)->inside);
+}
+
+void
+mainwin_eq_pushed(gboolean toggled)
+{
+    equalizerwin_show(toggled);
+}
+
+void
+mainwin_pl_pushed(gboolean toggled)
+{
+    if (toggled)
+        playlistwin_show();
+    else
+        playlistwin_hide();
+}
+
+gint
+mainwin_spos_frame_cb(gint pos)
+{
+    if (mainwin_sposition) {
+        gint x = 0;
+        if (pos < 6)
+            x = 17;
+        else if (pos < 9)
+            x = 20;
+        else
+            x = 23;
+
+        UI_SKINNED_HORIZONTAL_SLIDER(mainwin_sposition)->knob_nx = x;
+        UI_SKINNED_HORIZONTAL_SLIDER(mainwin_sposition)->knob_px = x;
+    }
+    return 1;
+}
+
+void
+mainwin_spos_motion_cb(GtkWidget *widget, gint pos)
+{
+    gint time;
+    gchar *time_msg;
+    Playlist *playlist = aud_playlist_get_active();
+
+    pos--;
+
+    time = ((aud_playlist_get_current_length(playlist) / 1000) * pos) / 12;
+
+    if (config.timer_mode == TIMER_REMAINING) {
+        time = (aud_playlist_get_current_length(playlist) / 1000) - time;
+        time_msg = g_strdup_printf("-%2.2d", time / 60);
+        ui_skinned_textbox_set_text(mainwin_stime_min, time_msg);
+        g_free(time_msg);
+    }
+    else {
+        time_msg = g_strdup_printf(" %2.2d", time / 60);
+        ui_skinned_textbox_set_text(mainwin_stime_min, time_msg);
+        g_free(time_msg);
+    }
+
+    time_msg = g_strdup_printf("%2.2d", time % 60);
+    ui_skinned_textbox_set_text(mainwin_stime_sec, time_msg);
+    g_free(time_msg);
+}
+
+void
+mainwin_spos_release_cb(GtkWidget *widget, gint pos)
+{
+    audacious_drct_seek(((aud_playlist_get_current_length(aud_playlist_get_active()) / 1000) *
+                   (pos - 1)) / 12);
+}
+
+void
+mainwin_position_motion_cb(GtkWidget *widget, gint pos)
+{
+    gint length, time;
+    gchar *seek_msg;
+
+    length = aud_playlist_get_current_length(aud_playlist_get_active()) / 1000;
+    time = (length * pos) / 219;
+    seek_msg = g_strdup_printf(_("Seek to: %d:%-2.2d/%d:%-2.2d (%d%%)"),
+                               time / 60, time % 60,
+                               length / 60, length % 60,
+                               (length != 0) ? (time * 100) / length : 0);
+    mainwin_lock_info_text(seek_msg);
+    g_free(seek_msg);
+}
+
+void
+mainwin_position_release_cb(GtkWidget *widget, gint pos)
+{
+    gint length, time;
+
+    length = audacious_drct_get_length();
+    time = (length * pos) / 219;
+    audacious_drct_seek(time);
+    mainwin_release_info_text();
+}
+
+gint
+mainwin_volume_frame_cb(gint pos)
+{
+    return (gint) rint((pos / 52.0) * 28);
+}
+
+void
+mainwin_adjust_volume_motion(gint v)
+{
+    gchar *volume_msg;
+
+    volume_msg = g_strdup_printf(_("Volume: %d%%"), v);
+    mainwin_lock_info_text(volume_msg);
+    g_free(volume_msg);
+
+    if (balance < 0)
+        audacious_drct_set_volume(v, (v * (100 - abs(balance))) / 100);
+    else if (balance > 0)
+        audacious_drct_set_volume((v * (100 - abs(balance))) / 100, v);
+    else
+        audacious_drct_set_volume(v, v);
+}
+
+void
+mainwin_adjust_volume_release(void)
+{
+    mainwin_release_info_text();
+}
+
+void
+mainwin_adjust_balance_motion(gint b)
+{
+    gchar *balance_msg;
+    gint v, pvl, pvr;
+
+    balance = b;
+    aud_input_get_volume(&pvl, &pvr);
+    v = MAX(pvl, pvr);
+    if (b < 0) {
+        balance_msg = g_strdup_printf(_("Balance: %d%% left"), -b);
+        audacious_drct_set_volume(v, (gint) rint(((100 + b) / 100.0) * v));
+    }
+    else if (b == 0) {
+        balance_msg = g_strdup_printf(_("Balance: center"));
+        audacious_drct_set_volume(v, v);
+    }
+    else {                      /* b > 0 */
+        balance_msg = g_strdup_printf(_("Balance: %d%% right"), b);
+        audacious_drct_set_volume((gint) rint(((100 - b) / 100.0) * v), v);
+    }
+    mainwin_lock_info_text(balance_msg);
+    g_free(balance_msg);
+}
+
+void
+mainwin_adjust_balance_release(void)
+{
+    mainwin_release_info_text();
+}
+
+void
+mainwin_set_volume_slider(gint percent)
+{
+    ui_skinned_horizontal_slider_set_position(mainwin_volume, (gint) rint((percent * 51) / 100.0));
+}
+
+void
+mainwin_set_balance_slider(gint percent)
+{
+    ui_skinned_horizontal_slider_set_position(mainwin_balance, (gint) rint(((percent * 12) / 100.0) + 12));
+}
+
+void
+mainwin_volume_motion_cb(GtkWidget *widget, gint pos)
+{
+
+    gint vol = (pos * 100) / 51;
+    mainwin_adjust_volume_motion(vol);
+    equalizerwin_set_volume_slider(vol);
+}
+
+gboolean
+mainwin_volume_release_cb(GtkWidget *widget, gint pos)
+{
+    mainwin_adjust_volume_release();
+    return FALSE;
+}
+
+gint
+mainwin_balance_frame_cb(gint pos)
+{
+    return ((abs(pos - 12) * 28) / 13);
+}
+
+void
+mainwin_balance_motion_cb(GtkWidget *widget, gint pos)
+{
+    gint bal = ((pos - 12) * 100) / 12;
+    mainwin_adjust_balance_motion(bal);
+    equalizerwin_set_balance_slider(bal);
+}
+
+void
+mainwin_balance_release_cb(GtkWidget *widget, gint pos)
+{
+    mainwin_adjust_volume_release();
+}
+
+void
+mainwin_set_volume_diff(gint diff)
+{
+    gint vl, vr, vol;
+
+    aud_input_get_volume(&vl, &vr);
+    vol = MAX(vl, vr);
+    vol = CLAMP(vol + diff, 0, 100);
+
+    mainwin_adjust_volume_motion(vol);
+    mainwin_set_volume_slider(vol);
+    equalizerwin_set_volume_slider(vol);
+
+    if (mainwin_volume_release_timeout)
+        g_source_remove(mainwin_volume_release_timeout);
+    mainwin_volume_release_timeout =
+        g_timeout_add(700, (GSourceFunc)(mainwin_volume_release_cb), NULL);
+}
+
+void
+mainwin_set_balance_diff(gint diff)
+{
+    gint b;
+    b = CLAMP(balance + diff, -100, 100);
+    mainwin_adjust_balance_motion(b);
+    mainwin_set_balance_slider(b);
+    equalizerwin_set_balance_slider(b);
+}
+
+void
+mainwin_show(gboolean show)
+{
+    if (show)
+        mainwin_real_show();
+    else
+        mainwin_real_hide();
+}
+
+void
+mainwin_real_show(void)
+{
+    config.player_visible = TRUE;
+
+    check_set( toggleaction_group_others , "show player" , TRUE );
+
+    if (config.player_shaded)
+        ui_vis_clear_data(mainwin_vis);
+
+    if (config.show_wm_decorations) {
+        if (config.player_x != -1 && config.save_window_position)
+            gtk_window_move(GTK_WINDOW(mainwin), config.player_x, config.player_y);
+
+        gtk_widget_show(mainwin);
+        return;
+    }
+
+    if (config.player_x != -1 && config.save_window_position)
+        gtk_window_move(GTK_WINDOW(mainwin), config.player_x, config.player_y);
+
+    mainwin_refresh_hints();
+    gtk_window_present(GTK_WINDOW(mainwin));
+}
+
+void
+mainwin_real_hide(void)
+{
+
+    check_set( toggleaction_group_others , "show player", FALSE);
+
+    if (config.player_shaded)
+        ui_svis_clear_data(mainwin_svis);
+
+    gtk_widget_hide(mainwin);
+
+    config.player_visible = FALSE;
+}
+
+
+void
+mainwin_set_stopaftersong(gboolean stop)
+{
+    aud_cfg->stopaftersong = stop;
+    check_set(toggleaction_group_others, "stop after current song", aud_cfg->stopaftersong);
+}
+
+void
+mainwin_set_noplaylistadvance(gboolean no_advance)
+{
+    aud_cfg->no_playlist_advance = no_advance;
+    check_set(toggleaction_group_others, "playback no playlist advance", aud_cfg->no_playlist_advance);
+}
+
+static void
+mainwin_set_scaled(gboolean scaled)
+{
+    gint height;
+
+    if (config.player_shaded)
+        height = MAINWIN_SHADED_HEIGHT;
+    else
+        height = aud_active_skin->properties.mainwin_height;
+
+    dock_window_resize(GTK_WINDOW(mainwin), config.player_shaded ? MAINWIN_SHADED_WIDTH : aud_active_skin->properties.mainwin_width,
+                       config.player_shaded ? MAINWIN_SHADED_HEIGHT : aud_active_skin->properties.mainwin_height,
+                       aud_active_skin->properties.mainwin_width * config.scale_factor , aud_active_skin->properties.mainwin_height * config.scale_factor);
+
+    GList *iter;
+    for (iter = GTK_FIXED (SKINNED_WINDOW(mainwin)->fixed)->children; iter; iter = g_list_next (iter)) {
+        GtkFixedChild *child_data = (GtkFixedChild *) iter->data;
+        GtkWidget *child = child_data->widget;
+        g_signal_emit_by_name(child, "toggle-scaled");
+    }
+
+    mainwin_refresh_hints();
+    gtk_widget_shape_combine_mask(mainwin, skin_get_mask(aud_active_skin, SKIN_MASK_MAIN + config.player_shaded), 0, 0);
+}
+
+void
+set_scaled(gboolean scaled)
+{
+    config.scaled = scaled;
+
+    mainwin_set_scaled(scaled);
+
+    if (config.eq_scaled_linked)
+        equalizerwin_set_scaled(scaled);
+}
+
+
+
+void
+mainwin_general_menu_callback(gpointer data,
+                              guint action,
+                              GtkWidget * item)
+{
+    Playlist *playlist = aud_playlist_get_active();
+
+    switch (action) {
+        case MAINWIN_GENERAL_PREFS:
+            action_preferences();
+            break;
+        case MAINWIN_GENERAL_ABOUT:
+            action_about_audacious();
+            break;
+        case MAINWIN_GENERAL_PLAYFILE: {
+            gboolean button = FALSE; /* FALSE = NO_PLAY_BUTTON */
+            aud_hook_call("filebrowser show", &button);
+            break;
+        }
+        case MAINWIN_GENERAL_PLAYLOCATION:
+            mainwin_show_add_url_window();
+            break;
+        case MAINWIN_GENERAL_FILEINFO:
+            aud_playlist_fileinfo_current(playlist);
+            break;
+        case MAINWIN_GENERAL_FOCUSPLWIN:
+            gtk_window_present(GTK_WINDOW(playlistwin));
+            break;
+        case MAINWIN_GENERAL_SHOWMWIN:
+            mainwin_show(GTK_CHECK_MENU_ITEM(item)->active);
+            break;
+        case MAINWIN_GENERAL_SHOWPLWIN:
+            if (GTK_CHECK_MENU_ITEM(item)->active)
+                playlistwin_show();
+            else
+                playlistwin_hide();
+            break;
+        case MAINWIN_GENERAL_SHOWEQWIN:
+            if (GTK_CHECK_MENU_ITEM(item)->active)
+                equalizerwin_real_show();
+            else
+                equalizerwin_real_hide();
+            break;
+        case MAINWIN_GENERAL_PREV:
+            aud_playlist_prev(playlist);
+            break;
+        case MAINWIN_GENERAL_PLAY:
+            mainwin_play_pushed();
+            break;
+        case MAINWIN_GENERAL_PAUSE:
+            audacious_drct_pause();
+            break;
+        case MAINWIN_GENERAL_STOP:
+            mainwin_stop_pushed();
+            break;
+        case MAINWIN_GENERAL_NEXT:
+            aud_playlist_next(playlist);
+            break;
+#if 0
+        case MAINWIN_GENERAL_BACK5SEC:
+            if (audacious_drct_get_playing()
+                && aud_playlist_get_current_length(playlist) != -1)
+                playback_seek_relative(-5);
+            break;
+        case MAINWIN_GENERAL_FWD5SEC:
+            if (audacious_drct_get_playing()
+                && aud_playlist_get_current_length(playlist) != -1)
+                playback_seek_relative(5);
+            break;
+#endif
+        case MAINWIN_GENERAL_START:
+            aud_playlist_set_position(playlist, 0);
+            break;
+        case MAINWIN_GENERAL_JTT:
+            mainwin_jump_to_time();
+            break;
+        case MAINWIN_GENERAL_JTF:
+            audacious_drct_jtf_show();
+            break;
+        case MAINWIN_GENERAL_EXIT:
+            mainwin_quit_cb();
+            break;
+        case MAINWIN_GENERAL_SETAB:
+            if (aud_playlist_get_current_length(playlist) != -1) {
+                if (ab_position_a == -1) {
+                    ab_position_a = audacious_drct_get_time();
+                    ab_position_b = -1;
+                    mainwin_lock_info_text("'Loop-Point A Position' set.");
+                } else if (ab_position_b == -1) {
+                    int time = audacious_drct_get_time();
+                    if (time > ab_position_a)
+                        ab_position_b = time;
+                    mainwin_release_info_text();
+                } else {
+                    ab_position_a = audacious_drct_get_time();
+                    ab_position_b = -1;
+                    mainwin_lock_info_text("'Loop-Point A Position' reset.");
+                }
+            }
+            break;
+        case MAINWIN_GENERAL_CLEARAB:
+            if (aud_playlist_get_current_length(playlist) != -1) {
+                ab_position_a = ab_position_b = -1;
+                mainwin_release_info_text();
+            }
+            break;
+        case MAINWIN_GENERAL_NEW_PL:
+            {
+                Playlist *new_pl = aud_playlist_new();
+                aud_playlist_add_playlist(new_pl);
+                aud_playlist_select_playlist(new_pl);
+            }
+            break;
+        case MAINWIN_GENERAL_PREV_PL:
+            aud_playlist_select_prev();
+            break;
+        case MAINWIN_GENERAL_NEXT_PL:
+            aud_playlist_select_next();
+            break;
+    }
+}
+
+static void
+mainwin_mr_change(GtkWidget *widget, MenuRowItem i)
+{
+    switch (i) {
+        case MENUROW_OPTIONS:
+            mainwin_lock_info_text(_("Options Menu"));
+            break;
+        case MENUROW_ALWAYS:
+            if (UI_SKINNED_MENUROW(mainwin_menurow)->always_selected)
+                mainwin_lock_info_text(_("Disable 'Always On Top'"));
+            else
+                mainwin_lock_info_text(_("Enable 'Always On Top'"));
+            break;
+        case MENUROW_FILEINFOBOX:
+            mainwin_lock_info_text(_("File Info Box"));
+            break;
+        case MENUROW_SCALE:
+            if (UI_SKINNED_MENUROW(mainwin_menurow)->scale_selected)
+                mainwin_lock_info_text(_("Disable 'GUI Scaling'"));
+            else
+                mainwin_lock_info_text(_("Enable 'GUI Scaling'"));
+            break;
+        case MENUROW_VISUALIZATION:
+            mainwin_lock_info_text(_("Visualization Menu"));
+            break;
+        case MENUROW_NONE:
+            break;
+    }
+}
+
+static void
+mainwin_mr_release(GtkWidget *widget, MenuRowItem i, GdkEventButton *event)
+{
+    switch (i) {
+        case MENUROW_OPTIONS:
+            ui_manager_popup_menu_show(GTK_MENU(mainwin_view_menu),
+                                       event->x_root, event->y_root, 1,
+                                       event->time);
+            break;
+        case MENUROW_ALWAYS:
+            gtk_toggle_action_set_active(
+                                         GTK_TOGGLE_ACTION(gtk_action_group_get_action(
+                                                                                       toggleaction_group_others , "view always on top" )) ,
+                                         UI_SKINNED_MENUROW(mainwin_menurow)->always_selected );
+            break;
+        case MENUROW_FILEINFOBOX:
+            aud_playlist_fileinfo_current(aud_playlist_get_active());
+            break;
+        case MENUROW_SCALE:
+            gtk_toggle_action_set_active(
+                                         GTK_TOGGLE_ACTION(gtk_action_group_get_action(
+                                                                                       toggleaction_group_others , "view scaled" )) ,
+                                         UI_SKINNED_MENUROW(mainwin_menurow)->scale_selected );
+            break;
+        case MENUROW_VISUALIZATION:
+            ui_manager_popup_menu_show(GTK_MENU(mainwin_visualization_menu),
+                                       event->x_root, event->y_root, 1,
+                                       event->time);
+            break;
+        case MENUROW_NONE:
+            break;
+    }
+
+    mainwin_release_info_text();
+}
+
+void
+run_no_output_device_dialog(gpointer hook_data, gpointer user_data)
+{
+    const gchar *markup =
+        N_("<b><big>Couldn't open audio.</big></b>\n\n"
+           "Please check that:\n"
+           "1. You have the correct output plugin selected.\n"
+           "2. No other programs is blocking the soundcard.\n"
+           "3. Your soundcard is configured properly.\n");
+
+    GDK_THREADS_ENTER();
+    GtkWidget *dialog =
+        gtk_message_dialog_new_with_markup(GTK_WINDOW(mainwin),
+                                           GTK_DIALOG_DESTROY_WITH_PARENT,
+                                           GTK_MESSAGE_ERROR,
+                                           GTK_BUTTONS_OK,
+                                           _(markup));
+    gtk_dialog_run(GTK_DIALOG(dialog));
+    gtk_widget_destroy(dialog);
+    GDK_THREADS_LEAVE();
+}
+
+void
+ui_main_set_initial_volume(void)
+{
+    gint vl, vr, b, v;
+
+    aud_input_get_volume(&vl, &vr);
+
+    vl = CLAMP(vl, 0, 100);
+    vr = CLAMP(vr, 0, 100);
+    v = MAX(vl, vr);
+    if (vl > vr)
+        b = (gint) rint(((gdouble) vr / vl) * 100) - 100;
+    else if (vl < vr)
+        b = 100 - (gint) rint(((gdouble) vl / vr) * 100);
+    else
+        b = 0;
+
+    mainwin_set_volume_slider(v);
+    equalizerwin_set_volume_slider(v);
+    mainwin_set_balance_slider(b);
+    equalizerwin_set_balance_slider(b);
+}
+
+static void
+set_timer_mode(TimerMode mode)
+{
+    if (mode == TIMER_ELAPSED)
+        check_set(radioaction_group_viewtime, "view time elapsed", TRUE);
+    else
+        check_set(radioaction_group_viewtime, "view time remaining", TRUE);
+}
+
+static void
+set_timer_mode_menu_cb(TimerMode mode)
+{
+    config.timer_mode = mode;
+}
+
+gboolean
+change_timer_mode_cb(GtkWidget *widget, GdkEventButton *event)
+{
+    if (event->button == 1) {
+        change_timer_mode();
+    } else if (event->button == 3)
+        return FALSE;
+
+    return TRUE;
+}
+
+static void change_timer_mode(void) {
+    if (config.timer_mode == TIMER_ELAPSED)
+        set_timer_mode(TIMER_REMAINING);
+    else
+        set_timer_mode(TIMER_ELAPSED);
+    if (audacious_drct_get_playing())
+        mainwin_update_song_info();
+}
+
+static void
+mainwin_aud_playlist_prev(void)
+{
+    aud_playlist_prev(aud_playlist_get_active());
+}
+
+static void
+mainwin_aud_playlist_next(void)
+{
+    aud_playlist_next(aud_playlist_get_active());
+}
+
+void
+mainwin_setup_menus(void)
+{
+    set_timer_mode(config.timer_mode);
+
+    /* View menu */
+
+    check_set(toggleaction_group_others, "view always on top", config.always_on_top);
+    check_set(toggleaction_group_others, "view put on all workspaces", config.sticky);
+    check_set(toggleaction_group_others, "roll up player", config.player_shaded);
+    check_set(toggleaction_group_others, "roll up playlist editor", config.playlist_shaded);
+    check_set(toggleaction_group_others, "roll up equalizer", config.equalizer_shaded);
+    check_set(toggleaction_group_others, "view easy move", config.easy_move);
+    check_set(toggleaction_group_others, "view scaled", config.scaled);
+
+    /* Songname menu */
+
+    check_set(toggleaction_group_others, "autoscroll songname", config.autoscroll);
+    check_set(toggleaction_group_others, "stop after current song", aud_cfg->stopaftersong);
+
+    /* Playback menu */
+
+    check_set(toggleaction_group_others, "playback repeat", aud_cfg->repeat);
+    check_set(toggleaction_group_others, "playback shuffle", aud_cfg->shuffle);
+    check_set(toggleaction_group_others, "playback no playlist advance", aud_cfg->no_playlist_advance);
+
+    /* Visualization menu */
+
+    switch ( config.vis_type )
+    {
+        case VIS_ANALYZER:
+            check_set(radioaction_group_vismode, "vismode analyzer", TRUE);
+            break;
+        case VIS_SCOPE:
+            check_set(radioaction_group_vismode, "vismode scope", TRUE);
+            break;
+        case VIS_VOICEPRINT:
+            check_set(radioaction_group_vismode, "vismode voiceprint", TRUE);
+            break;
+        case VIS_OFF:
+        default:
+            check_set(radioaction_group_vismode, "vismode off", TRUE);
+            break;
+    }
+
+    switch ( config.analyzer_mode )
+    {
+        case ANALYZER_FIRE:
+            check_set(radioaction_group_anamode, "anamode fire", TRUE);
+            break;
+        case ANALYZER_VLINES:
+            check_set(radioaction_group_anamode, "anamode vertical lines", TRUE);
+            break;
+        case ANALYZER_NORMAL:
+        default:
+            check_set(radioaction_group_anamode, "anamode normal", TRUE);
+            break;
+    }
+
+    switch ( config.analyzer_type )
+    {
+        case ANALYZER_BARS:
+            check_set(radioaction_group_anatype, "anatype bars", TRUE);
+            break;
+        case ANALYZER_LINES:
+        default:
+            check_set(radioaction_group_anatype, "anatype lines", TRUE);
+            break;
+    }
+
+    check_set(toggleaction_group_others, "anamode peaks", config.analyzer_peaks );
+
+    switch ( config.scope_mode )
+    {
+        case SCOPE_LINE:
+            check_set(radioaction_group_scomode, "scomode line", TRUE);
+            break;
+        case SCOPE_SOLID:
+            check_set(radioaction_group_scomode, "scomode solid", TRUE);
+            break;
+        case SCOPE_DOT:
+        default:
+            check_set(radioaction_group_scomode, "scomode dot", TRUE);
+            break;
+    }
+
+    switch ( config.voiceprint_mode )
+    {
+        case VOICEPRINT_FIRE:
+            check_set(radioaction_group_vprmode, "vprmode fire", TRUE);
+            break;
+        case VOICEPRINT_ICE:
+            check_set(radioaction_group_vprmode, "vprmode ice", TRUE);
+            break;
+        case VOICEPRINT_NORMAL:
+        default:
+            check_set(radioaction_group_vprmode, "vprmode normal", TRUE);
+            break;
+    }
+
+    switch ( config.vu_mode )
+    {
+        case VU_SMOOTH:
+            check_set(radioaction_group_wshmode, "wshmode smooth", TRUE);
+            break;
+        case VU_NORMAL:
+        default:
+            check_set(radioaction_group_wshmode, "wshmode normal", TRUE);
+            break;
+    }
+
+    switch ( config.vis_refresh )
+    {
+        case REFRESH_HALF:
+            check_set(radioaction_group_refrate, "refrate half", TRUE);
+            break;
+        case REFRESH_QUARTER:
+            check_set(radioaction_group_refrate, "refrate quarter", TRUE);
+            break;
+        case REFRESH_EIGTH:
+            check_set(radioaction_group_refrate, "refrate eighth", TRUE);
+            break;
+        case REFRESH_FULL:
+        default:
+            check_set(radioaction_group_refrate, "refrate full", TRUE);
+            break;
+    }
+
+    switch ( config.analyzer_falloff )
+    {
+        case FALLOFF_SLOW:
+            check_set(radioaction_group_anafoff, "anafoff slow", TRUE);
+            break;
+        case FALLOFF_MEDIUM:
+            check_set(radioaction_group_anafoff, "anafoff medium", TRUE);
+            break;
+        case FALLOFF_FAST:
+            check_set(radioaction_group_anafoff, "anafoff fast", TRUE);
+            break;
+        case FALLOFF_FASTEST:
+            check_set(radioaction_group_anafoff, "anafoff fastest", TRUE);
+            break;
+        case FALLOFF_SLOWEST:
+        default:
+            check_set(radioaction_group_anafoff, "anafoff slowest", TRUE);
+            break;
+    }
+
+    switch ( config.peaks_falloff )
+    {
+        case FALLOFF_SLOW:
+            check_set(radioaction_group_peafoff, "peafoff slow", TRUE);
+            break;
+        case FALLOFF_MEDIUM:
+            check_set(radioaction_group_peafoff, "peafoff medium", TRUE);
+            break;
+        case FALLOFF_FAST:
+            check_set(radioaction_group_peafoff, "peafoff fast", TRUE);
+            break;
+        case FALLOFF_FASTEST:
+            check_set(radioaction_group_peafoff, "peafoff fastest", TRUE);
+            break;
+        case FALLOFF_SLOWEST:
+        default:
+            check_set(radioaction_group_peafoff, "peafoff slowest", TRUE);
+            break;
+    }
+}
+
+static void mainwin_info_double_clicked_cb(void) {
+    aud_playlist_fileinfo_current(aud_playlist_get_active());
+}
+
+static void
+mainwin_info_right_clicked_cb(GtkWidget *widget, GdkEventButton *event)
+{
+    ui_manager_popup_menu_show(GTK_MENU(mainwin_songname_menu),
+                               event->x_root, event->y_root, 3, event->time);
+}
+
+static void
+mainwin_create_widgets(void)
+{
+    mainwin_menubtn = ui_skinned_button_new();
+    ui_skinned_push_button_setup(mainwin_menubtn, SKINNED_WINDOW(mainwin)->fixed,
+                                 6, 3, 9, 9, 0, 0, 0, 9, SKIN_TITLEBAR);
+    g_signal_connect(mainwin_menubtn, "clicked", mainwin_menubtn_cb, NULL );
+
+    mainwin_minimize = ui_skinned_button_new();
+    ui_skinned_push_button_setup(mainwin_minimize, SKINNED_WINDOW(mainwin)->fixed,
+                                 244, 3, 9, 9, 9, 0, 9, 9, SKIN_TITLEBAR);
+    g_signal_connect(mainwin_minimize, "clicked", mainwin_minimize_cb, NULL );
+
+    mainwin_shade = ui_skinned_button_new();
+    ui_skinned_push_button_setup(mainwin_shade, SKINNED_WINDOW(mainwin)->fixed,
+                                 254, 3, 9, 9, 0,
+                                 config.player_shaded ? 27 : 18, 9, config.player_shaded ? 27 : 18, SKIN_TITLEBAR);
+    g_signal_connect(mainwin_shade, "clicked", mainwin_shade_toggle, NULL );
+
+    mainwin_close = ui_skinned_button_new();
+    ui_skinned_push_button_setup(mainwin_close, SKINNED_WINDOW(mainwin)->fixed,
+                                 264, 3, 9, 9, 18, 0, 18, 9, SKIN_TITLEBAR);
+    g_signal_connect(mainwin_close, "clicked", mainwin_quit_cb, NULL );
+
+    mainwin_rew = ui_skinned_button_new();
+    ui_skinned_push_button_setup(mainwin_rew, SKINNED_WINDOW(mainwin)->fixed,
+                                 16, 88, 23, 18, 0, 0, 0, 18, SKIN_CBUTTONS);
+    g_signal_connect(mainwin_rew, "pressed", mainwin_rev_pushed, NULL);
+    g_signal_connect(mainwin_rew, "released", mainwin_rev_release, NULL);
+
+    mainwin_fwd = ui_skinned_button_new();
+    ui_skinned_push_button_setup(mainwin_fwd, SKINNED_WINDOW(mainwin)->fixed,
+                                 108, 88, 22, 18, 92, 0, 92, 18, SKIN_CBUTTONS);
+    g_signal_connect(mainwin_fwd, "pressed", mainwin_fwd_pushed, NULL);
+    g_signal_connect(mainwin_fwd, "released", mainwin_fwd_release, NULL);
+
+    mainwin_play = ui_skinned_button_new();
+    ui_skinned_push_button_setup(mainwin_play, SKINNED_WINDOW(mainwin)->fixed,
+                                 39, 88, 23, 18, 23, 0, 23, 18, SKIN_CBUTTONS);
+    g_signal_connect(mainwin_play, "clicked", mainwin_play_pushed, NULL );
+
+    mainwin_pause = ui_skinned_button_new();
+    ui_skinned_push_button_setup(mainwin_pause, SKINNED_WINDOW(mainwin)->fixed,
+                                 62, 88, 23, 18, 46, 0, 46, 18, SKIN_CBUTTONS);
+    g_signal_connect(mainwin_pause, "clicked", audacious_drct_pause, NULL );
+
+    mainwin_stop = ui_skinned_button_new();
+    ui_skinned_push_button_setup(mainwin_stop, SKINNED_WINDOW(mainwin)->fixed,
+                                 85, 88, 23, 18, 69, 0, 69, 18, SKIN_CBUTTONS);
+    g_signal_connect(mainwin_stop, "clicked", mainwin_stop_pushed, NULL );
+
+    mainwin_eject = ui_skinned_button_new();
+    ui_skinned_push_button_setup(mainwin_eject, SKINNED_WINDOW(mainwin)->fixed,
+                                 136, 89, 22, 16, 114, 0, 114, 16, SKIN_CBUTTONS);
+    g_signal_connect(mainwin_eject, "clicked", mainwin_eject_pushed, NULL);
+
+    mainwin_srew = ui_skinned_button_new();
+    ui_skinned_small_button_setup(mainwin_srew, SKINNED_WINDOW(mainwin)->fixed, 169, 4, 8, 7);
+    g_signal_connect(mainwin_srew, "clicked", mainwin_aud_playlist_prev, NULL);
+
+    mainwin_splay = ui_skinned_button_new();
+    ui_skinned_small_button_setup(mainwin_splay, SKINNED_WINDOW(mainwin)->fixed, 177, 4, 10, 7);
+    g_signal_connect(mainwin_splay, "clicked", mainwin_play_pushed, NULL);
+
+    mainwin_spause = ui_skinned_button_new();
+    ui_skinned_small_button_setup(mainwin_spause, SKINNED_WINDOW(mainwin)->fixed, 187, 4, 10, 7);
+    g_signal_connect(mainwin_spause, "clicked", audacious_drct_pause, NULL);
+
+    mainwin_sstop = ui_skinned_button_new();
+    ui_skinned_small_button_setup(mainwin_sstop, SKINNED_WINDOW(mainwin)->fixed, 197, 4, 9, 7);
+    g_signal_connect(mainwin_sstop, "clicked", mainwin_stop_pushed, NULL);
+
+    mainwin_sfwd = ui_skinned_button_new();
+    ui_skinned_small_button_setup(mainwin_sfwd, SKINNED_WINDOW(mainwin)->fixed, 206, 4, 8, 7);
+    g_signal_connect(mainwin_sfwd, "clicked", mainwin_aud_playlist_next, NULL);
+
+    mainwin_seject = ui_skinned_button_new();
+    ui_skinned_small_button_setup(mainwin_seject, SKINNED_WINDOW(mainwin)->fixed, 216, 4, 9, 7);
+    g_signal_connect(mainwin_seject, "clicked", mainwin_eject_pushed, NULL);
+
+    mainwin_shuffle = ui_skinned_button_new();
+    ui_skinned_toggle_button_setup(mainwin_shuffle, SKINNED_WINDOW(mainwin)->fixed,
+                                   164, 89, 46, 15, 28, 0, 28, 15, 28, 30, 28, 45, SKIN_SHUFREP);
+    g_signal_connect(mainwin_shuffle, "clicked", mainwin_shuffle_pushed_cb, NULL);
+
+    mainwin_repeat = ui_skinned_button_new();
+    ui_skinned_toggle_button_setup(mainwin_repeat, SKINNED_WINDOW(mainwin)->fixed,
+                                   210, 89, 28, 15, 0, 0, 0, 15, 0, 30, 0, 45, SKIN_SHUFREP);
+    g_signal_connect(mainwin_repeat, "clicked", mainwin_repeat_pushed_cb, NULL);
+
+    mainwin_eq = ui_skinned_button_new();
+    ui_skinned_toggle_button_setup(mainwin_eq, SKINNED_WINDOW(mainwin)->fixed,
+                                   219, 58, 23, 12, 0, 61, 46, 61, 0, 73, 46, 73, SKIN_SHUFREP);
+    g_signal_connect(mainwin_eq, "clicked", mainwin_equalizer_pushed_cb, NULL);
+    ui_skinned_button_set_inside(mainwin_eq, config.equalizer_visible);
+
+    mainwin_pl = ui_skinned_button_new();
+    ui_skinned_toggle_button_setup(mainwin_pl, SKINNED_WINDOW(mainwin)->fixed,
+                                   242, 58, 23, 12, 23, 61, 69, 61, 23, 73, 69, 73, SKIN_SHUFREP);
+    g_signal_connect(mainwin_pl, "clicked", mainwin_playlist_pushed_cb, NULL);
+    ui_skinned_button_set_inside(mainwin_pl, config.playlist_visible);
+
+    mainwin_info = ui_skinned_textbox_new(SKINNED_WINDOW(mainwin)->fixed, 112, 27, 153, 1, SKIN_TEXT);
+    ui_skinned_textbox_set_scroll(mainwin_info, config.autoscroll);
+    ui_skinned_textbox_set_xfont(mainwin_info, !config.mainwin_use_bitmapfont, config.mainwin_font);
+    g_signal_connect(mainwin_info, "double-clicked", mainwin_info_double_clicked_cb, NULL);
+    g_signal_connect(mainwin_info, "right-clicked", G_CALLBACK(mainwin_info_right_clicked_cb), NULL);
+
+    mainwin_othertext = ui_skinned_textbox_new(SKINNED_WINDOW(mainwin)->fixed, 112, 43, 153, 1, SKIN_TEXT);
+
+    mainwin_rate_text = ui_skinned_textbox_new(SKINNED_WINDOW(mainwin)->fixed, 111, 43, 15, 0, SKIN_TEXT);
+
+    mainwin_freq_text = ui_skinned_textbox_new(SKINNED_WINDOW(mainwin)->fixed, 156, 43, 10, 0, SKIN_TEXT);
+
+    mainwin_menurow = ui_skinned_menurow_new(SKINNED_WINDOW(mainwin)->fixed, 10, 22, 304, 0, 304, 44,  SKIN_TITLEBAR);
+    g_signal_connect(mainwin_menurow, "change", G_CALLBACK(mainwin_mr_change), NULL);
+    g_signal_connect(mainwin_menurow, "release", G_CALLBACK(mainwin_mr_release), NULL);
+
+    mainwin_volume = ui_skinned_horizontal_slider_new(SKINNED_WINDOW(mainwin)->fixed, 107, 57, 68,
+                                                      13, 15, 422, 0, 422, 14, 11, 15, 0, 0, 51,
+                                                      mainwin_volume_frame_cb, SKIN_VOLUME);
+    g_signal_connect(mainwin_volume, "motion", G_CALLBACK(mainwin_volume_motion_cb), NULL);
+    g_signal_connect(mainwin_volume, "release", G_CALLBACK(mainwin_volume_release_cb), NULL);
+
+    mainwin_balance = ui_skinned_horizontal_slider_new(SKINNED_WINDOW(mainwin)->fixed, 177, 57, 38,
+                                                       13, 15, 422, 0, 422, 14, 11, 15, 9, 0, 24,
+                                                       mainwin_balance_frame_cb, SKIN_BALANCE);
+    g_signal_connect(mainwin_balance, "motion", G_CALLBACK(mainwin_balance_motion_cb), NULL);
+    g_signal_connect(mainwin_balance, "release", G_CALLBACK(mainwin_balance_release_cb), NULL);
+
+    mainwin_monostereo = ui_skinned_monostereo_new(SKINNED_WINDOW(mainwin)->fixed, 212, 41, SKIN_MONOSTEREO);
+
+    mainwin_playstatus = ui_skinned_playstatus_new(SKINNED_WINDOW(mainwin)->fixed, 24, 28);
+
+    mainwin_minus_num = ui_skinned_number_new(SKINNED_WINDOW(mainwin)->fixed, 36, 26, SKIN_NUMBERS);
+    g_signal_connect(mainwin_minus_num, "button-press-event", G_CALLBACK(change_timer_mode_cb), NULL);
+
+    mainwin_10min_num = ui_skinned_number_new(SKINNED_WINDOW(mainwin)->fixed, 48, 26, SKIN_NUMBERS);
+    g_signal_connect(mainwin_10min_num, "button-press-event", G_CALLBACK(change_timer_mode_cb), NULL);
+
+    mainwin_min_num = ui_skinned_number_new(SKINNED_WINDOW(mainwin)->fixed, 60, 26, SKIN_NUMBERS);
+    g_signal_connect(mainwin_min_num, "button-press-event", G_CALLBACK(change_timer_mode_cb), NULL);
+
+    mainwin_10sec_num = ui_skinned_number_new(SKINNED_WINDOW(mainwin)->fixed, 78, 26, SKIN_NUMBERS);
+    g_signal_connect(mainwin_10sec_num, "button-press-event", G_CALLBACK(change_timer_mode_cb), NULL);
+
+    mainwin_sec_num = ui_skinned_number_new(SKINNED_WINDOW(mainwin)->fixed, 90, 26, SKIN_NUMBERS);
+    g_signal_connect(mainwin_sec_num, "button-press-event", G_CALLBACK(change_timer_mode_cb), NULL);
+
+    mainwin_about = ui_skinned_button_new();
+    ui_skinned_small_button_setup(mainwin_about, SKINNED_WINDOW(mainwin)->fixed, 247, 83, 20, 25);
+    g_signal_connect(mainwin_about, "clicked", G_CALLBACK(action_about_audacious), NULL);
+
+    mainwin_vis = ui_vis_new(SKINNED_WINDOW(mainwin)->fixed, 24, 43, 76);
+    g_signal_connect(mainwin_vis, "button-press-event", G_CALLBACK(mainwin_vis_cb), NULL);
+    mainwin_svis = ui_svis_new(SKINNED_WINDOW(mainwin)->fixed, 79, 5);
+    g_signal_connect(mainwin_svis, "button-press-event", G_CALLBACK(mainwin_vis_cb), NULL);
+
+    mainwin_position = ui_skinned_horizontal_slider_new(SKINNED_WINDOW(mainwin)->fixed, 16, 72, 248,
+                                                        10, 248, 0, 278, 0, 29, 10, 10, 0, 0, 219,
+                                                        NULL, SKIN_POSBAR);
+    g_signal_connect(mainwin_position, "motion", G_CALLBACK(mainwin_position_motion_cb), NULL);
+    g_signal_connect(mainwin_position, "release", G_CALLBACK(mainwin_position_release_cb), NULL);
+
+    mainwin_sposition = ui_skinned_horizontal_slider_new(SKINNED_WINDOW(mainwin)->fixed, 226, 4, 17,
+                                                         7, 17, 36, 17, 36, 3, 7, 36, 0, 1, 13,
+                                                         mainwin_spos_frame_cb, SKIN_TITLEBAR);
+    g_signal_connect(mainwin_sposition, "motion", G_CALLBACK(mainwin_spos_motion_cb), NULL);
+    g_signal_connect(mainwin_sposition, "release", G_CALLBACK(mainwin_spos_release_cb), NULL);
+
+    mainwin_stime_min = ui_skinned_textbox_new(SKINNED_WINDOW(mainwin)->fixed, 130, 4, 15, FALSE, SKIN_TEXT);
+    g_signal_connect(mainwin_stime_min, "button-press-event", G_CALLBACK(change_timer_mode_cb), NULL);
+
+    mainwin_stime_sec = ui_skinned_textbox_new(SKINNED_WINDOW(mainwin)->fixed, 147, 4, 10, FALSE, SKIN_TEXT);
+    g_signal_connect(mainwin_stime_sec, "button-press-event", G_CALLBACK(change_timer_mode_cb), NULL);
+}
+
+static void
+mainwin_create_window(void)
+{
+    gint width, height;
+
+    mainwin = ui_skinned_window_new("player");
+    gtk_window_set_title(GTK_WINDOW(mainwin), _("Audacious"));
+    gtk_window_set_role(GTK_WINDOW(mainwin), "player");
+    gtk_window_set_resizable(GTK_WINDOW(mainwin), FALSE);
+
+    width = config.player_shaded ? MAINWIN_SHADED_WIDTH : aud_active_skin->properties.mainwin_width;
+    height = config.player_shaded ? MAINWIN_SHADED_HEIGHT : aud_active_skin->properties.mainwin_height;
+
+    if (config.scaled) {
+        width *= config.scale_factor;
+        height *= config.scale_factor;
+    }
+
+    gtk_widget_set_size_request(mainwin, width, height);
+
+    if (config.player_x != -1 && config.save_window_position)
+        gtk_window_move(GTK_WINDOW(mainwin), config.player_x, config.player_y);
+
+    g_signal_connect(mainwin, "destroy", G_CALLBACK(mainwin_destroy), NULL);
+    g_signal_connect(mainwin, "button_press_event",
+                     G_CALLBACK(mainwin_mouse_button_press), NULL);
+    g_signal_connect(mainwin, "scroll_event",
+                     G_CALLBACK(mainwin_scrolled), NULL);
+    g_signal_connect(mainwin, "button_release_event",
+                     G_CALLBACK(mainwin_mouse_button_release), NULL);
+
+    aud_drag_dest_set(mainwin);
+
+    g_signal_connect(mainwin, "key_press_event",
+                     G_CALLBACK(mainwin_keypress), NULL);
+
+    ui_main_evlistener_init();
+}
+
+void
+mainwin_create(void)
+{
+    mainwin_create_window();
+
+    gtk_window_add_accel_group( GTK_WINDOW(mainwin) , ui_manager_get_accel_group() );
+
+    mainwin_create_widgets();
+}
+
+gboolean
+mainwin_update_song_info(void)
+{
+    if (!audacious_drct_get_playing())
+        return FALSE;
+
+    gint time = audacious_drct_get_time();
+    gint length = audacious_drct_get_length();
+    gint t;
+    gchar stime_prefix;
+
+    if (ab_position_a != -1 && ab_position_b != -1 && time > ab_position_b)
+        audacious_drct_seek(ab_position_a/1000);
+
+    if (length == -1 && config.timer_mode == TIMER_REMAINING)
+        config.timer_mode = TIMER_ELAPSED;
+
+    playlistwin_set_time(time, length, config.timer_mode);
+
+    if (config.timer_mode == TIMER_REMAINING) {
+        if (length != -1) {
+            ui_skinned_number_set_number(mainwin_minus_num, 11);
+            t = length - time;
+            stime_prefix = '-';
+        }
+        else {
+            ui_skinned_number_set_number(mainwin_minus_num, 10);
+            t = time;
+            stime_prefix = ' ';
+        }
+    }
+    else {
+        ui_skinned_number_set_number(mainwin_minus_num, 10);
+        t = time;
+        stime_prefix = ' ';
+    }
+    t /= 1000;
+
+    /* Show the time in the format HH:MM when we have more than 100
+     * minutes. */
+    if (t >= 100 * 60)
+        t /= 60;
+    ui_skinned_number_set_number(mainwin_10min_num, t / 600);
+    ui_skinned_number_set_number(mainwin_min_num, (t / 60) % 10);
+    ui_skinned_number_set_number(mainwin_10sec_num, (t / 10) % 6);
+    ui_skinned_number_set_number(mainwin_sec_num, t % 10);
+
+    if (!UI_SKINNED_HORIZONTAL_SLIDER(mainwin_sposition)->pressed) {
+        gchar *time_str;
+
+        time_str = g_strdup_printf("%c%2.2d", stime_prefix, t / 60);
+        ui_skinned_textbox_set_text(mainwin_stime_min, time_str);
+        g_free(time_str);
+
+        time_str = g_strdup_printf("%2.2d", t % 60);
+        ui_skinned_textbox_set_text(mainwin_stime_sec, time_str);
+        g_free(time_str);
+    }
+
+    time /= 1000;
+    length /= 1000;
+    if (length > 0) {
+        if (time > length) {
+            ui_skinned_horizontal_slider_set_position(mainwin_position, 219);
+            ui_skinned_horizontal_slider_set_position(mainwin_sposition, 13);
+        }
+        /* update the slider position ONLY if there is not a seek in progress */
+        else if (seek_state == MAINWIN_SEEK_NIL)  {
+            ui_skinned_horizontal_slider_set_position(mainwin_position, (time * 219) / length);
+            ui_skinned_horizontal_slider_set_position(mainwin_sposition,
+                                                      ((time * 12) / length) + 1);
+        }
+    }
+    else {
+        ui_skinned_horizontal_slider_set_position(mainwin_position, 0);
+        ui_skinned_horizontal_slider_set_position(mainwin_sposition, 1);
+    }
+
+    return TRUE;
+}
+
+static gboolean
+mainwin_idle_func(gpointer data)
+{
+    GDK_THREADS_ENTER();
+
+    /* tristate buttons seek */
+    if ( seek_state != MAINWIN_SEEK_NIL )
+    {
+        GTimeVal now_time;
+        GTimeVal delta_time;
+        gulong now_dur;
+        g_get_current_time(&now_time);
+
+        delta_time.tv_usec = now_time.tv_usec - cb_time.tv_usec;
+        delta_time.tv_sec = now_time.tv_sec - cb_time.tv_sec;
+
+        now_dur = labs((delta_time.tv_sec * 1000) + (glong) (delta_time.tv_usec / 1000));
+
+        if ( now_dur > TRISTATE_THRESHOLD )
+        {
+            gint np;
+            if (seek_state == MAINWIN_SEEK_REV)
+                np = seek_initial_pos - labs((gulong)(now_dur/100)); /* seek back */
+            else
+                np = seek_initial_pos + labs((gulong)(now_dur/100)); /* seek forward */
+
+            /* boundaries check */
+            if (np < 0 )
+                np = 0;
+            else if ( np > 219 )
+                np = 219;
+
+            ui_skinned_horizontal_slider_set_position( mainwin_position , np );
+            mainwin_position_motion_cb( mainwin_position, np );
+        }
+    }
+
+    GDK_THREADS_LEAVE();
+    return TRUE;
+}
+
+
+/* toggleactionentries actions */
+
+void
+action_anamode_peaks( GtkToggleAction * action )
+{
+    config.analyzer_peaks = gtk_toggle_action_get_active( action );
+}
+
+void
+action_autoscroll_songname( GtkToggleAction * action )
+{
+    mainwin_set_title_scroll(gtk_toggle_action_get_active(action));
+    playlistwin_set_sinfo_scroll(config.autoscroll); /* propagate scroll setting to playlistwin_sinfo */
+}
+
+void
+action_playback_noplaylistadvance( GtkToggleAction * action )
+{
+    aud_cfg->no_playlist_advance = gtk_toggle_action_get_active( action );
+}
+
+void
+action_playback_repeat( GtkToggleAction * action )
+{
+    aud_cfg->repeat = gtk_toggle_action_get_active( action );
+    ui_skinned_button_set_inside(mainwin_repeat, aud_cfg->repeat);
+}
+
+void
+action_playback_shuffle( GtkToggleAction * action )
+{
+    aud_cfg->shuffle = gtk_toggle_action_get_active( action );
+    aud_playlist_set_shuffle(aud_cfg->shuffle);
+    ui_skinned_button_set_inside(mainwin_shuffle, aud_cfg->shuffle);
+}
+
+void
+action_stop_after_current_song( GtkToggleAction * action )
+{
+    aud_cfg->stopaftersong = gtk_toggle_action_get_active( action );
+}
+
+void
+action_view_always_on_top( GtkToggleAction * action )
+{
+    UI_SKINNED_MENUROW(mainwin_menurow)->always_selected = gtk_toggle_action_get_active( action );
+    config.always_on_top = UI_SKINNED_MENUROW(mainwin_menurow)->always_selected;
+    gtk_widget_queue_draw(mainwin_menurow);
+    hint_set_always(config.always_on_top);
+}
+
+void
+action_view_scaled( GtkToggleAction * action )
+{
+    UI_SKINNED_MENUROW(mainwin_menurow)->scale_selected = gtk_toggle_action_get_active( action );
+    gtk_widget_queue_draw(mainwin_menurow);
+    set_scaled(UI_SKINNED_MENUROW(mainwin_menurow)->scale_selected);
+    gdk_flush();
+}
+
+void
+action_view_easymove( GtkToggleAction * action )
+{
+    config.easy_move = gtk_toggle_action_get_active( action );
+}
+
+void
+action_view_on_all_workspaces( GtkToggleAction * action )
+{
+    config.sticky = gtk_toggle_action_get_active( action );
+    hint_set_sticky(config.sticky);
+}
+
+void
+action_roll_up_equalizer( GtkToggleAction * action )
+{
+    equalizerwin_set_shade_menu_cb(gtk_toggle_action_get_active(action));
+}
+
+void
+action_roll_up_player( GtkToggleAction * action )
+{
+    mainwin_set_shade_menu_cb(gtk_toggle_action_get_active(action));
+}
+
+void
+action_roll_up_playlist_editor( GtkToggleAction * action )
+{
+    playlistwin_set_shade(gtk_toggle_action_get_active(action));
+}
+
+void
+action_show_equalizer( GtkToggleAction * action )
+{
+    if (gtk_toggle_action_get_active(action))
+        equalizerwin_real_show();
+    else
+        equalizerwin_real_hide();
+}
+
+void
+action_show_playlist_editor( GtkToggleAction * action )
+{
+    if (gtk_toggle_action_get_active(action))
+        playlistwin_show();
+    else
+        playlistwin_hide();
+}
+
+void
+action_show_player( GtkToggleAction * action )
+{
+    mainwin_show(gtk_toggle_action_get_active(action));
+}
+
+
+/* radioactionentries actions (one callback for each radio group) */
+
+void
+action_anafoff( GtkAction *action, GtkRadioAction *current )
+{
+    mainwin_vis_set_afalloff(gtk_radio_action_get_current_value(current));
+}
+
+void
+action_anamode( GtkAction *action, GtkRadioAction *current )
+{
+    mainwin_vis_set_analyzer_mode(gtk_radio_action_get_current_value(current));
+}
+
+void
+action_anatype( GtkAction *action, GtkRadioAction *current )
+{
+    mainwin_vis_set_analyzer_type(gtk_radio_action_get_current_value(current));
+}
+
+void
+action_peafoff( GtkAction *action, GtkRadioAction *current )
+{
+    mainwin_vis_set_pfalloff(gtk_radio_action_get_current_value(current));
+}
+
+void
+action_refrate( GtkAction *action, GtkRadioAction *current )
+{
+    mainwin_vis_set_refresh(gtk_radio_action_get_current_value(current));
+}
+
+void
+action_scomode( GtkAction *action, GtkRadioAction *current )
+{
+    config.scope_mode = gtk_radio_action_get_current_value(current);
+}
+
+void
+action_vismode( GtkAction *action, GtkRadioAction *current )
+{
+    mainwin_vis_set_type_menu_cb(gtk_radio_action_get_current_value(current));
+}
+
+void
+action_vprmode( GtkAction *action, GtkRadioAction *current )
+{
+    config.voiceprint_mode = gtk_radio_action_get_current_value(current);
+}
+
+void
+action_wshmode( GtkAction *action, GtkRadioAction *current )
+{
+    config.vu_mode = gtk_radio_action_get_current_value(current);
+}
+
+void
+action_viewtime( GtkAction *action, GtkRadioAction *current )
+{
+    set_timer_mode_menu_cb(gtk_radio_action_get_current_value(current));
+}
+
+
+/* actionentries actions */
+
+void
+action_about_audacious( void )
+{
+    gboolean show = TRUE;
+    aud_hook_call("aboutwin show", &show);
+}
+
+void
+action_play_file( void )
+{
+    gboolean button = TRUE; /* TRUE = PLAY_BUTTON */
+    aud_hook_call("filebrowser show", &button);
+}
+
+void
+action_play_location( void )
+{
+    mainwin_show_add_url_window();
+}
+
+void
+action_ab_set( void )
+{
+    Playlist *playlist = aud_playlist_get_active();
+    if (aud_playlist_get_current_length(playlist) != -1)
+    {
+        if (ab_position_a == -1)
+        {
+            ab_position_a = audacious_drct_get_time();
+            ab_position_b = -1;
+            mainwin_lock_info_text("LOOP-POINT A POSITION SET.");
+        }
+        else if (ab_position_b == -1)
+        {
+            int time = audacious_drct_get_time();
+            if (time > ab_position_a)
+                ab_position_b = time;
+            mainwin_release_info_text();
+        }
+        else
+        {
+            ab_position_a = audacious_drct_get_time();
+            ab_position_b = -1;
+            mainwin_lock_info_text("LOOP-POINT A POSITION RESET.");
+        }
+    }
+}
+
+void
+action_ab_clear( void )
+{
+    Playlist *playlist = aud_playlist_get_active();
+    if (aud_playlist_get_current_length(playlist) != -1)
+    {
+        ab_position_a = ab_position_b = -1;
+        mainwin_release_info_text();
+    }
+}
+
+void
+action_current_track_info( void )
+{
+    aud_playlist_fileinfo_current(aud_playlist_get_active());
+}
+
+void
+action_jump_to_file( void )
+{
+    audacious_drct_jtf_show();
+}
+
+void
+action_jump_to_playlist_start( void )
+{
+    Playlist *playlist = aud_playlist_get_active();
+    aud_playlist_set_position(playlist, 0);
+}
+
+void
+action_jump_to_time( void )
+{
+    mainwin_jump_to_time();
+}
+
+void
+action_playback_next( void )
+{
+    Playlist *playlist = aud_playlist_get_active();
+    aud_playlist_next(playlist);
+}
+
+void
+action_playback_previous( void )
+{
+    Playlist *playlist = aud_playlist_get_active();
+    aud_playlist_prev(playlist);
+}
+
+void
+action_playback_play( void )
+{
+    mainwin_play_pushed();
+}
+
+void
+action_playback_pause( void )
+{
+    audacious_drct_pause();
+}
+
+void
+action_playback_stop( void )
+{
+    mainwin_stop_pushed();
+}
+
+void
+action_preferences( void )
+{
+    gboolean show = TRUE;
+    aud_hook_call("prefswin show", &show);
+}
+
+void
+action_quit( void )
+{
+    mainwin_quit_cb();
+}
+
+void
+util_menu_main_show( gint x , gint y , guint button , guint time )
+{
+    /* convenience function that shows the main popup menu wherever requested */
+    ui_manager_popup_menu_show( GTK_MENU(mainwin_general_menu),
+                                x , y , button , time );
+    return;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_main.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,194 @@
+/*  BMP - Cross-platform multimedia player
+ *  Copyright (C) 2003-2004  BMP development team.
+ *
+ *  Based on XMMS:
+ *  Copyright (C) 1998-2003  XMMS development team.
+ *
+ *  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; under version 3 of the License.
+ *
+ *  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, see <http://www.gnu.org/licenses>.
+ *
+ *  The Audacious team does not consider modular code linking to
+ *  Audacious or using our public API to be a derived work.
+ */
+
+#ifndef AUDACIOUS_UI_MAIN_H
+#define AUDACIOUS_UI_MAIN_H
+
+#include <gtk/gtk.h>
+
+#include "ui_vis.h"
+#include "ui_svis.h"
+
+/* yes, main window size is fixed */
+#define MAINWIN_WIDTH            (gint)275
+#define MAINWIN_HEIGHT           (gint)116
+#define MAINWIN_TITLEBAR_HEIGHT  (gint)14
+#define MAINWIN_SHADED_WIDTH     MAINWIN_WIDTH
+#define MAINWIN_SHADED_HEIGHT    MAINWIN_TITLEBAR_HEIGHT
+#define MAINWIN_SCALE_FACTOR     (config.scaled ? config.scale_factor : 1)
+
+#define MAINWIN_UPDATE_INTERVAL  100
+
+#define MAINWIN_DEFAULT_POS_X    20
+#define MAINWIN_DEFAULT_POS_Y    20
+
+#define MAINWIN_DEFAULT_FONT     "Sans Bold 9"
+
+
+typedef enum {
+    TIMER_ELAPSED,
+    TIMER_REMAINING
+} TimerMode;
+
+enum {
+    MAINWIN_GENERAL_ABOUT,
+    
+    MAINWIN_GENERAL_PLAYFILE,
+    MAINWIN_GENERAL_PLAYLOCATION,
+
+    MAINWIN_GENERAL_FILEINFO,
+    MAINWIN_GENERAL_PREFS,
+
+    MAINWIN_GENERAL_SHOWMWIN,
+    MAINWIN_GENERAL_SHOWPLWIN,
+
+    MAINWIN_GENERAL_FOCUSMWIN,
+    MAINWIN_GENERAL_FOCUSPLWIN,
+
+    MAINWIN_GENERAL_SHOWEQWIN,
+    MAINWIN_GENERAL_EXIT,
+
+    MAINWIN_GENERAL_PREV,
+    MAINWIN_GENERAL_PLAY,
+    MAINWIN_GENERAL_PAUSE,
+    MAINWIN_GENERAL_STOP,
+    MAINWIN_GENERAL_NEXT,
+    MAINWIN_GENERAL_STOPFADE,
+    MAINWIN_GENERAL_BACK5SEC,
+    MAINWIN_GENERAL_FWD5SEC,
+    MAINWIN_GENERAL_START,
+    MAINWIN_GENERAL_BACK10,
+    MAINWIN_GENERAL_FWD10,
+    MAINWIN_GENERAL_JTT,
+    MAINWIN_GENERAL_JTF,
+    MAINWIN_GENERAL_QUEUE,
+    MAINWIN_GENERAL_CQUEUE,
+    MAINWIN_GENERAL_VOLUP,
+    MAINWIN_GENERAL_VOLDOWN,
+    MAINWIN_GENERAL_SETAB,
+    MAINWIN_GENERAL_CLEARAB,
+
+    MAINWIN_GENERAL_NEXT_PL,
+    MAINWIN_GENERAL_PREV_PL,
+    MAINWIN_GENERAL_NEW_PL
+};
+
+extern GtkWidget *mainwin;
+extern GtkWidget *err;
+
+extern gboolean mainwin_moving;
+extern gboolean mainwin_focus;
+
+extern GtkWidget *mainwin_eq, *mainwin_pl;
+extern GtkWidget *mainwin_info;
+
+extern GtkWidget *mainwin_stime_min, *mainwin_stime_sec;
+
+extern GtkWidget *mainwin_vis;
+extern GtkWidget *mainwin_svis;
+
+extern GtkWidget *mainwin_playstatus;
+
+extern GtkWidget *mainwin_minus_num, *mainwin_10min_num, *mainwin_min_num;
+extern GtkWidget *mainwin_10sec_num, *mainwin_sec_num;
+
+extern GtkWidget *mainwin_position, *mainwin_sposition;
+
+void mainwin_create(void);
+void ui_main_set_initial_volume(void);
+
+void mainwin_lock_info_text(const gchar * text);
+void mainwin_release_info_text(void);
+void mainwin_play_pushed(void);
+void mainwin_stop_pushed(void);
+void mainwin_eject_pushed(void);
+
+void mainwin_rev_pushed(void);
+void mainwin_rev_release(void);
+void mainwin_fwd_pushed(void);
+void mainwin_fwd_release(void);
+
+void mainwin_adjust_volume_motion(gint v);
+void mainwin_adjust_volume_release(void);
+void mainwin_adjust_balance_motion(gint b);
+void mainwin_adjust_balance_release(void);
+void mainwin_set_volume_slider(gint percent);
+void mainwin_set_balance_slider(gint percent);
+
+void mainwin_vis_set_type(VisType mode);
+
+void mainwin_refresh_hints(void);
+void mainwin_set_info_text(void);
+void mainwin_set_song_info(gint rate, gint freq, gint nch);
+void mainwin_clear_song_info(void);
+void mainwin_set_stopaftersong(gboolean stop);
+void mainwin_set_noplaylistadvance(gboolean no_advance);
+
+void mainwin_set_always_on_top(gboolean always);
+void mainwin_set_volume_diff(gint diff);
+void mainwin_set_balance_diff(gint diff);
+
+void mainwin_show(gboolean);
+void mainwin_real_show(void);
+void mainwin_real_hide(void);
+void mainwin_move(gint x, gint y);
+void mainwin_shuffle_pushed(gboolean toggled);
+void mainwin_repeat_pushed(gboolean toggled);
+void mainwin_disable_seekbar(void);
+void mainwin_set_title(const gchar * text);
+void mainwin_show_add_url_window(void);
+void mainwin_minimize_cb(void);
+void mainwin_general_menu_callback(gpointer cb_data,
+                                   guint action,
+                                   GtkWidget * widget);
+
+gboolean mainwin_update_song_info(void);
+void mainwin_drag_data_received(GtkWidget * widget,
+                                GdkDragContext * context,
+                                gint x,
+                                gint y,
+                                GtkSelectionData * selection_data,
+                                guint info,
+                                guint time,
+                                gpointer user_data);
+
+void run_no_output_device_dialog(gpointer hook_data, gpointer user_data);
+void mainwin_setup_menus(void);
+gboolean change_timer_mode_cb(GtkWidget *widget, GdkEventButton *event);
+
+void mainwin_jump_to_file(void);
+void mainwin_jump_to_time(void);
+
+void mainwin_ewmh_activate(void);
+
+void mainwin_show_visibility_warning(void);
+
+/* FIXME: placed here for now */
+void playback_get_sample_params(gint * bitrate,
+                                gint * frequency,
+                                gint * numchannels);
+
+void ui_main_check_theme_engine(void);
+
+void util_menu_main_show( gint x , gint y , guint button , guint time );
+
+#endif /* AUDACIOUS_UI_MAIN_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_main_evlisteners.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,453 @@
+/*
+ * Audacious
+ * Copyright (c) 2006-2007 Audacious development team.
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+#if 0
+#include "ui_playlist_evlisteners.h"
+#endif
+#include <glib.h>
+#include <math.h>
+#if 0
+#include "hook.h"
+#include "playback.h"
+#include "playlist.h"
+#include "playlist_evmessages.h"
+#include "visualization.h"
+#endif
+#include <audacious/plugin.h>
+#include <audacious/input.h>
+#if 0
+#include "ui_credits.h"
+#endif
+#include "ui_equalizer.h"
+#include "ui_main.h"
+#include "ui_playlist.h"
+#if 0
+#include "ui_preferences.h"
+#endif
+#include "ui_skinned_playstatus.h"
+#include "ui_skinned_textbox.h"
+#include "ui_skinned_window.h"
+#include "skins_cfg.h"
+
+static gint song_info_timeout_source = 0;
+static gint update_vis_timeout_source = 0;
+
+typedef struct {
+    gint bitrate;
+    gint samplerate;
+    gint channels;
+} PlaylistEventInfoChange;
+
+/* XXX: there has to be a better way than polling here! */
+/* also: where should this function go? should it stay here? --mf0102 */
+static gboolean
+update_vis_func(gpointer unused)
+{
+    if (!audacious_drct_get_playing())
+        return FALSE;
+#if 0
+    input_update_vis(audacious_drct_get_time());
+#endif
+    return TRUE;
+}
+
+static void
+ui_main_evlistener_title_change(gpointer hook_data, gpointer user_data)
+{
+    gchar *text = (gchar *) hook_data;
+
+    ui_skinned_textbox_set_text(mainwin_info, text);
+    playlistwin_update_list(aud_playlist_get_active());
+}
+
+static void
+ui_main_evlistener_hide_seekbar(gpointer hook_data, gpointer user_data)
+{
+    mainwin_disable_seekbar();
+}
+
+static void
+ui_main_evlistener_volume_change(gpointer hook_data, gpointer user_data)
+{
+    gint *h_vol = (gint *) hook_data;
+    gint vl, vr, b, v;
+
+    vl = CLAMP(h_vol[0], 0, 100);
+    vr = CLAMP(h_vol[1], 0, 100);
+    v = MAX(vl, vr);
+    if (vl > vr)
+        b = (gint) rint(((gdouble) vr / vl) * 100) - 100;
+    else if (vl < vr)
+        b = 100 - (gint) rint(((gdouble) vl / vr) * 100);
+    else
+        b = 0;
+
+    mainwin_set_volume_slider(v);
+    equalizerwin_set_volume_slider(v);
+    mainwin_set_balance_slider(b);
+    equalizerwin_set_balance_slider(b);
+}
+
+static void
+ui_main_evlistener_playback_begin(gpointer hook_data, gpointer user_data)
+{
+    PlaylistEntry *entry = (PlaylistEntry*)hook_data;
+    g_return_if_fail(entry != NULL);
+
+    ui_vis_clear_data(mainwin_vis);
+    ui_svis_clear_data(mainwin_svis);
+    mainwin_disable_seekbar();
+    mainwin_update_song_info();
+
+    if (config.player_shaded) {
+        gtk_widget_show(mainwin_stime_min);
+        gtk_widget_show(mainwin_stime_sec);
+        gtk_widget_show(mainwin_sposition);
+    } else {
+        gtk_widget_show(mainwin_minus_num);
+        gtk_widget_show(mainwin_10min_num);
+        gtk_widget_show(mainwin_min_num);
+        gtk_widget_show(mainwin_10sec_num);
+        gtk_widget_show(mainwin_sec_num);
+        gtk_widget_show(mainwin_position);
+    }
+
+    song_info_timeout_source = 
+        g_timeout_add_seconds(1, (GSourceFunc) mainwin_update_song_info, NULL);
+
+    update_vis_timeout_source =
+        g_timeout_add(10, (GSourceFunc) update_vis_func, NULL);
+#if 0
+    vis_playback_start();
+#endif
+    ui_skinned_playstatus_set_status(mainwin_playstatus, STATUS_PLAY);
+}
+
+static void
+ui_main_evlistener_playback_stop(gpointer hook_data, gpointer user_data)
+{
+    if (song_info_timeout_source)
+        g_source_remove(song_info_timeout_source);
+#if 0
+    vis_playback_stop();
+    free_vis_data();
+#endif
+    ui_skinned_playstatus_set_buffering(mainwin_playstatus, FALSE);
+}
+
+static void
+ui_main_evlistener_playback_pause(gpointer hook_data, gpointer user_data)
+{
+    ui_skinned_playstatus_set_status(mainwin_playstatus, STATUS_PAUSE);
+}
+
+static void
+ui_main_evlistener_playback_unpause(gpointer hook_data, gpointer user_data)
+{
+    ui_skinned_playstatus_set_status(mainwin_playstatus, STATUS_PLAY);
+}
+
+static void
+ui_main_evlistener_playback_seek(gpointer hook_data, gpointer user_data)
+{
+#if 0
+    free_vis_data();
+#endif
+}
+
+static void
+ui_main_evlistener_playback_play_file(gpointer hook_data, gpointer user_data)
+{
+    if (config.random_skin_on_play)
+        skin_set_random_skin();
+}
+
+static void
+ui_main_evlistener_playlist_end_reached(gpointer hook_data, gpointer user_data)
+{
+    mainwin_clear_song_info();
+
+    if (aud_cfg->stopaftersong)
+        mainwin_set_stopaftersong(FALSE);
+}
+
+static void
+ui_main_evlistener_playlist_info_change(gpointer hook_data, gpointer user_data)
+{
+    PlaylistEventInfoChange *msg = (PlaylistEventInfoChange *) hook_data;
+
+    mainwin_set_song_info(msg->bitrate, msg->samplerate, msg->channels);
+}
+
+static void
+ui_main_evlistener_mainwin_set_always_on_top(gpointer hook_data, gpointer user_data)
+{
+    gboolean *ontop = (gboolean*)hook_data;
+    mainwin_set_always_on_top(*ontop);
+}
+
+static void
+ui_main_evlistener_mainwin_show(gpointer hook_data, gpointer user_data)
+{
+    gboolean *show = (gboolean*)hook_data;
+    mainwin_show(*show);
+}
+
+static void
+ui_main_evlistener_equalizerwin_show(gpointer hook_data, gpointer user_data)
+{
+    gboolean *show = (gboolean*)hook_data;
+    equalizerwin_show(*show);
+}
+
+static void
+ui_main_evlistener_visualization_timeout(gpointer hook_data, gpointer user_data)
+{
+    if (hook_data == NULL) {
+        if (config.player_shaded && config.player_visible)
+            ui_svis_timeout_func(mainwin_svis, NULL);
+        else
+            ui_vis_timeout_func(mainwin_vis, NULL);
+        return;
+    }
+
+    VisNode *vis = (VisNode*) hook_data;
+
+    guint8 intern_vis_data[512];
+    gint16 mono_freq[2][256];
+    gboolean mono_freq_calced = FALSE;
+    gint16 mono_pcm[2][512], stereo_pcm[2][512];
+    gboolean mono_pcm_calced = FALSE, stereo_pcm_calced = FALSE;
+    gint i;
+
+    if (config.vis_type == VIS_OFF)
+        return;
+
+    if (config.vis_type == VIS_ANALYZER) {
+            /* Spectrum analyzer */
+            /* 76 values */
+            const gint long_xscale[] =
+                { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
+                17, 18,
+                19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
+                34,
+                35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
+                50, 51,
+                52, 53, 54, 55, 56, 57, 58, 61, 66, 71, 76, 81, 87, 93,
+                100, 107,
+                114, 122, 131, 140, 150, 161, 172, 184, 255
+            };
+            /* 20 values */
+            const int short_xscale[] =
+                { 0, 1, 2, 3, 4, 5, 6, 7, 8, 11, 15, 20, 27,
+                36, 47, 62, 82, 107, 141, 184, 255
+            };
+            const double y_scale = 3.60673760222;   /* 20.0 / log(256) */
+            const int *xscale;
+            gint j, y, max;
+
+            if (!mono_freq_calced)
+                aud_calc_mono_freq(mono_freq, vis->data, vis->nch);
+
+            memset(intern_vis_data, 0, 75);
+
+            if (config.analyzer_type == ANALYZER_BARS) {
+                if (config.player_shaded) {
+                    max = 13;
+                }
+                else {
+                    max = 19;
+                }
+                xscale = short_xscale;
+            }
+            else {
+                if (config.player_shaded) {
+                    max = 37;
+                }
+                else {
+                    max = 75;
+                }
+                xscale = long_xscale;
+            }
+
+            for (i = 0; i < max; i++) {
+                for (j = xscale[i], y = 0; j < xscale[i + 1]; j++) {
+                    if (mono_freq[0][j] > y)
+                        y = mono_freq[0][j];
+                }
+                y >>= 7;
+                if (y != 0) {
+                    intern_vis_data[i] = log(y) * y_scale;
+                    if (intern_vis_data[i] > 15)
+                        intern_vis_data[i] = 15;
+                }
+                else
+                    intern_vis_data[i] = 0;
+            }
+    }
+    else if(config.vis_type == VIS_VOICEPRINT){
+        if (config.player_shaded && config.player_visible) {
+            /* VU */
+            gint vu, val;
+
+            if (!stereo_pcm_calced)
+                aud_calc_stereo_pcm(stereo_pcm, vis->data, vis->nch);
+            vu = 0;
+            for (i = 0; i < 512; i++) {
+                val = abs(stereo_pcm[0][i]);
+                if (val > vu)
+                    vu = val;
+            }
+            intern_vis_data[0] = (vu * 37) >> 15;
+            if (intern_vis_data[0] > 37)
+                intern_vis_data[0] = 37;
+            if (vis->nch == 2) {
+                vu = 0;
+                for (i = 0; i < 512; i++) {
+                    val = abs(stereo_pcm[1][i]);
+                    if (val > vu)
+                        vu = val;
+                }
+                intern_vis_data[1] = (vu * 37) >> 15;
+                if (intern_vis_data[1] > 37)
+                    intern_vis_data[1] = 37;
+            }
+            else
+                intern_vis_data[1] = intern_vis_data[0];
+        }
+        else { /*Voiceprint*/
+            if (!mono_freq_calced)
+                aud_calc_mono_freq(mono_freq, vis->data, vis->nch);
+            memset(intern_vis_data, 0, 256);
+
+            /* For the values [0-16] we use the frequency that's 3/2 as much.
+               If we assume the 512 values calculated by calc_mono_freq to
+               cover 0-22kHz linearly we get a range of
+               [0-16] * 3/2 * 22000/512 = [0-1,031] Hz.
+               Most stuff above that is harmonics and we want to utilize the
+               16 samples we have to the max[tm]
+               */
+            for (i = 0; i < 50 ; i+=3){
+                intern_vis_data[i/3] += (mono_freq[0][i/2] >> 5);
+
+                /*Boost frequencies above 257Hz a little*/
+                //if(i > 4 * 3)
+                //  intern_vis_data[i/3] += 8;
+            }
+        }
+    }
+    else { /* (config.vis_type == VIS_SCOPE) */
+
+        /* Oscilloscope */
+        gint pos, step;
+
+        if (!mono_pcm_calced)
+            aud_calc_mono_pcm(mono_pcm, vis->data, vis->nch);
+
+        step = (vis->length << 8) / 74;
+        for (i = 0, pos = 0; i < 75; i++, pos += step) {
+            intern_vis_data[i] = ((mono_pcm[0][pos >> 8]) >> 12) + 7;
+            if (intern_vis_data[i] == 255)
+                intern_vis_data[i] = 0;
+            else if (intern_vis_data[i] > 12)
+                intern_vis_data[i] = 12;
+            /* Do not see the point of that? (comparison always false) -larne.
+               if (intern_vis_data[i] < 0)
+               intern_vis_data[i] = 0; */
+        }
+    }
+
+    if (config.player_shaded && config.player_visible)
+        ui_svis_timeout_func(mainwin_svis, intern_vis_data);
+    else
+        ui_vis_timeout_func(mainwin_vis, intern_vis_data);
+}
+
+static void
+ui_main_evlistener_config_save(gpointer hook_data, gpointer user_data)
+{
+    ConfigDb *db = (ConfigDb *) hook_data;
+
+    if (SKINNED_WINDOW(mainwin)->x != -1 &&
+        SKINNED_WINDOW(mainwin)->y != -1 )
+    {
+        aud_cfg_db_set_int(db, "skins", "player_x", SKINNED_WINDOW(mainwin)->x);
+        aud_cfg_db_set_int(db, "skins", "player_y", SKINNED_WINDOW(mainwin)->y);
+    }
+
+    aud_cfg_db_set_bool(db, "skins", "mainwin_use_bitmapfont",
+                    config.mainwin_use_bitmapfont);
+}
+
+void
+ui_main_evlistener_init(void)
+{
+    aud_hook_associate("title change", ui_main_evlistener_title_change, NULL);
+    aud_hook_associate("hide seekbar", ui_main_evlistener_hide_seekbar, NULL);
+    aud_hook_associate("volume set", ui_main_evlistener_volume_change, NULL);
+    aud_hook_associate("playback begin", ui_main_evlistener_playback_begin, NULL);
+    aud_hook_associate("playback stop", ui_main_evlistener_playback_stop, NULL);
+    aud_hook_associate("playback pause", ui_main_evlistener_playback_pause, NULL);
+    aud_hook_associate("playback unpause", ui_main_evlistener_playback_unpause, NULL);
+    aud_hook_associate("playback seek", ui_main_evlistener_playback_seek, NULL);
+    aud_hook_associate("playback play file", ui_main_evlistener_playback_play_file, NULL);
+    aud_hook_associate("playlist end reached", ui_main_evlistener_playlist_end_reached, NULL);
+    aud_hook_associate("playlist info change", ui_main_evlistener_playlist_info_change, NULL);
+    aud_hook_associate("mainwin set always on top", ui_main_evlistener_mainwin_set_always_on_top, NULL);
+    aud_hook_associate("mainwin show", ui_main_evlistener_mainwin_show, NULL);
+    aud_hook_associate("equalizerwin show", ui_main_evlistener_equalizerwin_show, NULL);
+    aud_hook_associate("visualization timeout", ui_main_evlistener_visualization_timeout, NULL);
+    aud_hook_associate("config save", ui_main_evlistener_config_save, NULL);
+
+    aud_hook_associate("playback audio error", (void *) mainwin_stop_pushed, NULL);
+    aud_hook_associate("playback audio error", (void *) run_no_output_device_dialog, NULL);
+
+    aud_hook_associate("playback seek", (HookFunction) mainwin_update_song_info, NULL);
+}
+
+void
+ui_main_evlistener_dissociate(void)
+{
+    aud_hook_dissociate("title change", ui_main_evlistener_title_change);
+    aud_hook_dissociate("hide seekbar", ui_main_evlistener_hide_seekbar);
+    aud_hook_dissociate("volume set", ui_main_evlistener_volume_change);
+    aud_hook_dissociate("playback begin", ui_main_evlistener_playback_begin);
+    aud_hook_dissociate("playback stop", ui_main_evlistener_playback_stop);
+    aud_hook_dissociate("playback pause", ui_main_evlistener_playback_pause);
+    aud_hook_dissociate("playback unpause", ui_main_evlistener_playback_unpause);
+    aud_hook_dissociate("playback seek", ui_main_evlistener_playback_seek);
+    aud_hook_dissociate("playback play file", ui_main_evlistener_playback_play_file);
+    aud_hook_dissociate("playlist end reached", ui_main_evlistener_playlist_end_reached);
+    aud_hook_dissociate("playlist info change", ui_main_evlistener_playlist_info_change);
+    aud_hook_dissociate("mainwin set always on top", ui_main_evlistener_mainwin_set_always_on_top);
+    aud_hook_dissociate("mainwin show", ui_main_evlistener_mainwin_show);
+    aud_hook_dissociate("equalizerwin show", ui_main_evlistener_equalizerwin_show);
+#if 0
+    aud_hook_dissociate("prefswin show", ui_main_evlistener_prefswin_show);
+    aud_hook_dissociate("aboutwin show", ui_main_evlistener_aboutwin_show);
+    aud_hook_dissociate("ui jump to track show", ui_main_evlistener_ui_jump_to_track_show);
+#endif
+    aud_hook_dissociate("visualization timeout", ui_main_evlistener_visualization_timeout);
+    aud_hook_dissociate("config save", ui_main_evlistener_config_save);
+
+    aud_hook_dissociate("playback audio error", (void *) mainwin_stop_pushed);
+    aud_hook_dissociate("playback audio error", (void *) run_no_output_device_dialog);
+
+    aud_hook_dissociate("playback seek", (HookFunction) mainwin_update_song_info);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_main_evlisteners.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,29 @@
+/*
+ * Audacious
+ * Copyright (c) 2006-2007 Audacious development team.
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+#include <glib.h>
+
+#ifndef AUDACIOUS_UI_MAIN_EVLISTENERS_H
+#define AUDACIOUS_UI_MAIN_EVLISTENERS_H
+
+void ui_main_evlistener_init(void);
+void ui_main_evlistener_dissociate(void);
+
+#endif /* AUDACIOUS_UI_MAIN_EVLISTENERS_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_manager.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,905 @@
+/*  Audacious - Cross-platform multimedia player
+ *  Copyright (C) 2005-2007  Audacious development team.
+ *
+ *  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; under version 3 of the License.
+ *
+ *  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, see <http://www.gnu.org/licenses>.
+ *
+ *  The Audacious team does not consider modular code linking to
+ *  Audacious or using our public API to be a derived work.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "ui_manager.h"
+#include "actions-mainwin.h"
+#include "actions-playlist.h"
+#include "actions-equalizer.h"
+
+#if 0
+/* this header contains prototypes for plugin-available menu functions */
+#include "ui_plugin_menu.h"
+#endif
+
+/* TODO ui_main.h is only included because ui_manager.c needs the values of
+   TimerMode enum; move that enum elsewhere so we can get rid of this include */
+#include "ui_main.h"
+
+#include "icons-stock.h"
+#if 0
+#include "sync-menu.h"
+#endif
+#include "plugin.h"
+#include <audacious/ui_plugin_menu.h>
+
+static GtkUIManager *ui_manager = NULL;
+static gboolean menu_created = FALSE;
+
+
+/* toggle action entries */
+
+static GtkToggleActionEntry toggleaction_entries_others[] = {
+
+	{ "autoscroll songname", NULL , N_("Autoscroll Songname"), NULL,
+	  N_("Autoscroll Songname"), G_CALLBACK(action_autoscroll_songname) , FALSE },
+
+	{ "stop after current song", NULL , N_("Stop after Current Song"), "<Ctrl>M",
+	  N_("Stop after Current Song"), G_CALLBACK(action_stop_after_current_song) , FALSE },
+
+	{ "anamode peaks", NULL , N_("Peaks"), NULL,
+	  N_("Peaks"), G_CALLBACK(action_anamode_peaks) , FALSE },
+
+	{ "playback repeat", NULL , N_("Repeat"), "R",
+	  N_("Repeat"), G_CALLBACK(action_playback_repeat) , FALSE },
+
+	{ "playback shuffle", NULL , N_("Shuffle"), "S",
+	  N_("Shuffle"), G_CALLBACK(action_playback_shuffle) , FALSE },
+
+	{ "playback no playlist advance", NULL , N_("No Playlist Advance"), "<Ctrl>N",
+	  N_("No Playlist Advance"), G_CALLBACK(action_playback_noplaylistadvance) , FALSE },
+
+	{ "show player", NULL , N_("Show Player"), "<Alt>M",
+	  N_("Show Player"), G_CALLBACK(action_show_player) , FALSE },
+
+	{ "show playlist editor", NULL , N_("Show Playlist Editor"), "<Alt>E",
+	  N_("Show Playlist Editor"), G_CALLBACK(action_show_playlist_editor) , FALSE },
+
+	{ "show equalizer", NULL , N_("Show Equalizer"), "<Alt>G",
+	  N_("Show Equalizer"), G_CALLBACK(action_show_equalizer) , FALSE },
+
+	{ "view always on top", NULL , N_("Always on Top"), "<Ctrl>O",
+	  N_("Always on Top"), G_CALLBACK(action_view_always_on_top) , FALSE },
+
+	{ "view put on all workspaces", NULL , N_("Put on All Workspaces"), "<Ctrl>S",
+	  N_("Put on All Workspaces"), G_CALLBACK(action_view_on_all_workspaces) , FALSE },
+
+	{ "roll up player", NULL , N_("Roll up Player"), "<Ctrl>W",
+	  N_("Roll up Player"), G_CALLBACK(action_roll_up_player) , FALSE },
+
+	{ "roll up playlist editor", NULL , N_("Roll up Playlist Editor"), "<Shift><Ctrl>W",
+	  N_("Roll up Playlist Editor"), G_CALLBACK(action_roll_up_playlist_editor) , FALSE },
+
+	{ "roll up equalizer", NULL , N_("Roll up Equalizer"), "<Ctrl><Alt>W",
+	  N_("Roll up Equalizer"), G_CALLBACK(action_roll_up_equalizer) , FALSE },
+
+	{ "view scaled", NULL , N_("Scale"), "<Ctrl>D",
+	  N_("DoubleSize"), G_CALLBACK(action_view_scaled) , FALSE },
+
+	{ "view easy move", NULL , N_("Easy Move"), "<Ctrl>E",
+	  N_("Easy Move"), G_CALLBACK(action_view_easymove) , FALSE }
+};
+
+
+
+/* radio action entries */
+
+static GtkRadioActionEntry radioaction_entries_vismode[] = {
+	{ "vismode analyzer", NULL , N_("Analyzer"), NULL, N_("Analyzer"), VIS_ANALYZER },
+	{ "vismode scope", NULL , N_("Scope"), NULL, N_("Scope"), VIS_SCOPE },
+	{ "vismode voiceprint", NULL , N_("Voiceprint"), NULL, N_("Voiceprint"), VIS_VOICEPRINT },
+	{ "vismode off", NULL , N_("Off"), NULL, N_("Off"), VIS_OFF }
+};
+
+static GtkRadioActionEntry radioaction_entries_anamode[] = {
+	{ "anamode normal", NULL , N_("Normal"), NULL, N_("Normal"), ANALYZER_NORMAL },
+	{ "anamode fire", NULL , N_("Fire"), NULL, N_("Fire"), ANALYZER_FIRE },
+	{ "anamode vertical lines", NULL , N_("Vertical Lines"), NULL, N_("Vertical Lines"), ANALYZER_VLINES }
+};
+
+static GtkRadioActionEntry radioaction_entries_anatype[] = {
+	{ "anatype lines", NULL , N_("Lines"), NULL, N_("Lines"), ANALYZER_LINES },
+	{ "anatype bars", NULL , N_("Bars"), NULL, N_("Bars"), ANALYZER_BARS }
+};
+
+static GtkRadioActionEntry radioaction_entries_scomode[] = {
+	{ "scomode dot", NULL , N_("Dot Scope"), NULL, N_("Dot Scope"), SCOPE_DOT },
+	{ "scomode line", NULL , N_("Line Scope"), NULL, N_("Line Scope"), SCOPE_LINE },
+	{ "scomode solid", NULL , N_("Solid Scope"), NULL, N_("Solid Scope"), SCOPE_SOLID }
+};
+
+static GtkRadioActionEntry radioaction_entries_vprmode[] = {
+	{ "vprmode normal", NULL , N_("Normal"), NULL, N_("Normal"), VOICEPRINT_NORMAL },
+	{ "vprmode fire", NULL , N_("Fire"), NULL, N_("Fire"), VOICEPRINT_FIRE },
+	{ "vprmode ice", NULL , N_("Ice"), NULL, N_("Ice"), VOICEPRINT_ICE }
+};
+
+static GtkRadioActionEntry radioaction_entries_wshmode[] = {
+	{ "wshmode normal", NULL , N_("Normal"), NULL, N_("Normal"), VU_NORMAL },
+	{ "wshmode smooth", NULL , N_("Smooth"), NULL, N_("Smooth"), VU_SMOOTH }
+};
+
+static GtkRadioActionEntry radioaction_entries_refrate[] = {
+	{ "refrate full", NULL , N_("Full (~50 fps)"), NULL, N_("Full (~50 fps)"), REFRESH_FULL },
+	{ "refrate half", NULL , N_("Half (~25 fps)"), NULL, N_("Half (~25 fps)"), REFRESH_HALF },
+	{ "refrate quarter", NULL , N_("Quarter (~13 fps)"), NULL, N_("Quarter (~13 fps)"), REFRESH_QUARTER },
+	{ "refrate eighth", NULL , N_("Eighth (~6 fps)"), NULL, N_("Eighth (~6 fps)"), REFRESH_EIGTH }
+};
+
+static GtkRadioActionEntry radioaction_entries_anafoff[] = {
+	{ "anafoff slowest", NULL , N_("Slowest"), NULL, N_("Slowest"), FALLOFF_SLOWEST },
+	{ "anafoff slow", NULL , N_("Slow"), NULL, N_("Slow"), FALLOFF_SLOW },
+	{ "anafoff medium", NULL , N_("Medium"), NULL, N_("Medium"), FALLOFF_MEDIUM },
+	{ "anafoff fast", NULL , N_("Fast"), NULL, N_("Fast"), FALLOFF_FAST },
+	{ "anafoff fastest", NULL , N_("Fastest"), NULL, N_("Fastest"), FALLOFF_FASTEST }
+};
+
+static GtkRadioActionEntry radioaction_entries_peafoff[] = {
+	{ "peafoff slowest", NULL , N_("Slowest"), NULL, N_("Slowest"), FALLOFF_SLOWEST },
+	{ "peafoff slow", NULL , N_("Slow"), NULL, N_("Slow"), FALLOFF_SLOW },
+	{ "peafoff medium", NULL , N_("Medium"), NULL, N_("Medium"), FALLOFF_MEDIUM },
+	{ "peafoff fast", NULL , N_("Fast"), NULL, N_("Fast"), FALLOFF_FAST },
+	{ "peafoff fastest", NULL , N_("Fastest"), NULL, N_("Fastest"), FALLOFF_FASTEST }
+};
+
+static GtkRadioActionEntry radioaction_entries_viewtime[] = {
+	{ "view time elapsed", NULL , N_("Time Elapsed"), "<Ctrl>E", N_("Time Elapsed"), TIMER_ELAPSED },
+	{ "view time remaining", NULL , N_("Time Remaining"), "<Ctrl>R", N_("Time Remaining"), TIMER_REMAINING }
+};
+
+
+
+/* normal actions */
+
+static GtkActionEntry action_entries_playback[] = {
+
+	{ "playback", NULL, N_("Playback") },
+	
+	{ "playback play", GTK_STOCK_MEDIA_PLAY , N_("Play"), "X",
+	  N_("Play"), G_CALLBACK(action_playback_play) },
+
+	{ "playback pause", GTK_STOCK_MEDIA_PAUSE , N_("Pause"), "C",
+	  N_("Pause"), G_CALLBACK(action_playback_pause) },
+
+	{ "playback stop", GTK_STOCK_MEDIA_STOP , N_("Stop"), "V",
+	  N_("Stop"), G_CALLBACK(action_playback_stop) },
+
+	{ "playback previous", GTK_STOCK_MEDIA_PREVIOUS , N_("Previous"), "Z",
+	  N_("Previous"), G_CALLBACK(action_playback_previous) },
+
+	{ "playback next", GTK_STOCK_MEDIA_NEXT , N_("Next"), "B",
+	  N_("Next"), G_CALLBACK(action_playback_next) }
+};
+
+
+static GtkActionEntry action_entries_visualization[] = {
+	{ "visualization", NULL, N_("Visualization") },
+	{ "vismode", NULL, N_("Visualization Mode") },
+	{ "anamode", NULL, N_("Analyzer Mode") },
+	{ "scomode", NULL, N_("Scope Mode") },
+	{ "vprmode", NULL, N_("Voiceprint Mode") },
+	{ "wshmode", NULL, N_("WindowShade VU Mode") },
+	{ "refrate", NULL, N_("Refresh Rate") },
+	{ "anafoff", NULL, N_("Analyzer Falloff") },
+	{ "peafoff", NULL, N_("Peaks Falloff") }
+};
+
+static GtkActionEntry action_entries_playlist[] = {
+
+	{ "playlist", NULL, N_("Playlist") },
+
+	{ "playlist new", GTK_STOCK_NEW , N_("New Playlist"), "<Shift>N",
+	  N_("New Playlist"), G_CALLBACK(action_playlist_new) },
+
+	{ "playlist select next", GTK_STOCK_MEDIA_NEXT, N_("Select Next Playlist"), "<Shift>P",
+	  N_("Select Next Playlist"), G_CALLBACK(action_playlist_next) },
+
+	{ "playlist select previous", GTK_STOCK_MEDIA_PREVIOUS, N_("Select Previous Playlist"), "<Shift><Ctrl>P",
+	  N_("Select Previous Playlist"), G_CALLBACK(action_playlist_prev) },
+
+	{ "playlist delete", GTK_STOCK_DELETE , N_("Delete Playlist"), "<Shift>D",
+	  N_("Delete Playlist"), G_CALLBACK(action_playlist_delete) },
+
+        { "playlist load", GTK_STOCK_OPEN, N_("Load List"), "O",
+          N_("Loads a playlist file into the selected playlist."), G_CALLBACK(action_playlist_load_list) },
+
+        { "playlist save", GTK_STOCK_SAVE, N_("Save List"), "<Shift>S",
+          N_("Saves the selected playlist."), G_CALLBACK(action_playlist_save_list) },
+
+        { "playlist save default", GTK_STOCK_SAVE, N_("Save Default List"), "<Alt>S",
+          N_("Saves the selected playlist to the default location."),
+          G_CALLBACK(action_playlist_save_default_list) },
+
+        { "playlist refresh", GTK_STOCK_REFRESH, N_("Refresh List"), "F5",
+          N_("Refreshes metadata associated with a playlist entry."),
+          G_CALLBACK(action_playlist_refresh_list) },
+
+        { "playlist manager", AUD_STOCK_PLAYLIST , N_("List Manager"), "P",
+          N_("Opens the playlist manager."),
+          G_CALLBACK(action_open_list_manager) }
+};
+
+static GtkActionEntry action_entries_view[] = {
+
+	{ "view", NULL, N_("View") }
+};
+
+static GtkActionEntry action_entries_playlist_add[] = {
+        { "playlist add url", GTK_STOCK_NETWORK, N_("Add Internet Address..."), "<Ctrl>H",
+          N_("Adds a remote track to the playlist."),
+          G_CALLBACK(action_playlist_add_url) },
+
+        { "playlist add files", GTK_STOCK_ADD, N_("Add Files..."), "F",
+          N_("Adds files to the playlist."),
+          G_CALLBACK(action_playlist_add_files) },
+};
+
+static GtkActionEntry action_entries_playlist_select[] = {
+        { "playlist search and select", GTK_STOCK_FIND, N_("Search and Select"), "<Ctrl>F",
+          N_("Searches the playlist and selects playlist entries based on specific criteria."),
+          G_CALLBACK(action_playlist_search_and_select) },
+
+        { "playlist invert selection", NULL , N_("Invert Selection"), NULL,
+          N_("Inverts the selected and unselected entries."),
+          G_CALLBACK(action_playlist_invert_selection) },
+
+        { "playlist select all", NULL , N_("Select All"), "<Ctrl>A",
+          N_("Selects all of the playlist entries."),
+          G_CALLBACK(action_playlist_select_all) },
+
+        { "playlist select none", NULL , N_("Select None"), "<Shift><Ctrl>A",
+          N_("Deselects all of the playlist entries."),
+          G_CALLBACK(action_playlist_select_none) },
+};
+
+static GtkActionEntry action_entries_playlist_delete[] = {
+	{ "playlist remove all", GTK_STOCK_CLEAR, N_("Remove All"), NULL, 
+	  N_("Removes all entries from the playlist."),
+	  G_CALLBACK(action_playlist_remove_all) },
+
+	{ "playlist clear queue", GTK_STOCK_CLEAR, N_("Clear Queue"), "<Shift>Q",
+	  N_("Clears the queue associated with this playlist."),
+	  G_CALLBACK(action_playlist_clear_queue) },
+
+	{ "playlist remove unavailable", GTK_STOCK_DIALOG_ERROR , N_("Remove Unavailable Files"), NULL,
+	  N_("Removes unavailable files from the playlist."),
+	  G_CALLBACK(action_playlist_remove_unavailable) },
+
+	{ "playlist remove dups menu", NULL , N_("Remove Duplicates") },
+
+	{ "playlist remove dups by title", NULL , N_("By Title"), NULL,
+	  N_("Removes duplicate entries from the playlist by title."),
+	  G_CALLBACK(action_playlist_remove_dupes_by_title) },
+
+	{ "playlist remove dups by filename", NULL , N_("By Filename"), NULL, 
+	  N_("Removes duplicate entries from the playlist by filename."),
+	  G_CALLBACK(action_playlist_remove_dupes_by_filename) },
+
+	{ "playlist remove dups by full path", NULL , N_("By Path + Filename"), NULL, 
+	  N_("Removes duplicate entries from the playlist by their full path."),
+	  G_CALLBACK(action_playlist_remove_dupes_by_full_path) },
+
+	{ "playlist remove unselected", GTK_STOCK_REMOVE, N_("Remove Unselected"), NULL,
+	  N_("Remove unselected entries from the playlist."),
+	  G_CALLBACK(action_playlist_remove_unselected) },
+
+	{ "playlist remove selected", GTK_STOCK_REMOVE, N_("Remove Selected"), "Delete", 
+	  N_("Remove selected entries from the playlist."),
+	  G_CALLBACK(action_playlist_remove_selected) },
+};
+
+static GtkActionEntry action_entries_playlist_sort[] = {
+	{ "playlist randomize list", AUD_STOCK_RANDOMIZEPL , N_("Randomize List"), "<Ctrl><Shift>R",
+	  N_("Randomizes the playlist."),
+	  G_CALLBACK(action_playlist_randomize_list) },
+
+	{ "playlist reverse list", GTK_STOCK_GO_UP , N_("Reverse List"), NULL,
+	  N_("Reverses the playlist."),
+	  G_CALLBACK(action_playlist_reverse_list) },
+
+	{ "playlist sort menu", GTK_STOCK_GO_DOWN , N_("Sort List") },
+
+	{ "playlist sort by title", NULL , N_("By Title"), NULL,
+	  N_("Sorts the list by title."),
+	  G_CALLBACK(action_playlist_sort_by_title) },
+
+	{ "playlist sort by artist", NULL , N_("By Artist"), NULL,
+	  N_("Sorts the list by artist."),
+	  G_CALLBACK(action_playlist_sort_by_artist) },
+
+	{ "playlist sort by filename", NULL , N_("By Filename"), NULL,
+	  N_("Sorts the list by filename."),
+	  G_CALLBACK(action_playlist_sort_by_filename) },
+
+	{ "playlist sort by full path", NULL , N_("By Path + Filename"), NULL,
+	  N_("Sorts the list by full pathname."),
+	  G_CALLBACK(action_playlist_sort_by_full_path) },
+
+	{ "playlist sort by date", NULL , N_("By Date"), NULL,
+	  N_("Sorts the list by modification time."),
+	  G_CALLBACK(action_playlist_sort_by_date) },
+
+	{ "playlist sort by track number", NULL , N_("By Track Number"), NULL,
+	  N_("Sorts the list by track number."),
+	  G_CALLBACK(action_playlist_sort_by_track_number) },
+
+	{ "playlist sort by playlist entry", NULL , N_("By Playlist Entry"), NULL,
+	  N_("Sorts the list by playlist entry."),
+	  G_CALLBACK(action_playlist_sort_by_playlist_entry) },
+
+	{ "playlist sort selected menu", GTK_STOCK_GO_DOWN , N_("Sort Selected") },
+
+	{ "playlist sort selected by title", NULL , N_("By Title"), NULL,
+	  N_("Sorts the list by title."),
+	  G_CALLBACK(action_playlist_sort_selected_by_title) },
+
+	{ "playlist sort selected by artist", NULL, N_("By Artist"), NULL,
+	  N_("Sorts the list by artist."),
+	  G_CALLBACK(action_playlist_sort_selected_by_artist) },
+
+	{ "playlist sort selected by filename", NULL , N_("By Filename"), NULL,
+	  N_("Sorts the list by filename."),
+	  G_CALLBACK(action_playlist_sort_selected_by_filename) },
+
+	{ "playlist sort selected by full path", NULL , N_("By Path + Filename"), NULL,
+	  N_("Sorts the list by full pathname."),
+	  G_CALLBACK(action_playlist_sort_selected_by_full_path) },
+
+	{ "playlist sort selected by date", NULL , N_("By Date"), NULL,
+	  N_("Sorts the list by modification time."),
+	  G_CALLBACK(action_playlist_sort_selected_by_date) },
+
+	{ "playlist sort selected by track number", NULL , N_("By Track Number"), NULL,
+	  N_("Sorts the list by track number."),
+	  G_CALLBACK(action_playlist_sort_selected_by_track_number) },
+
+	{ "playlist sort selected by playlist entry", NULL, N_("By Playlist Entry"), NULL,
+	  N_("Sorts the list by playlist entry."),
+	  G_CALLBACK(action_playlist_sort_selected_by_playlist_entry) },
+};
+
+static GtkActionEntry action_entries_others[] = {
+
+	{ "dummy", NULL, "dummy" },
+
+        /* XXX Carbon support */
+        { "file", NULL, N_("File") },
+        { "help", NULL, N_("Help") },
+
+	{ "plugins-menu", AUD_STOCK_PLUGIN, N_("Plugin Services") },
+
+	{ "current track info", GTK_STOCK_INFO , N_("View Track Details"), "I",
+	  N_("View track details"), G_CALLBACK(action_current_track_info) },
+
+	{ "playlist track info", GTK_STOCK_INFO , N_("View Track Details"), "<Alt>I",
+	  N_("View track details"), G_CALLBACK(action_playlist_track_info) },
+
+	{ "about audacious", GTK_STOCK_DIALOG_INFO , N_("About Audacious"), NULL,
+	  N_("About Audacious"), G_CALLBACK(action_about_audacious) },
+
+	{ "play file", GTK_STOCK_OPEN , N_("Play File"), "L",
+	  N_("Load and play a file"), G_CALLBACK(action_play_file) },
+
+	{ "play location", GTK_STOCK_NETWORK , N_("Play Location"), "<Ctrl>L",
+	  N_("Play media from the selected location"), G_CALLBACK(action_play_location) },
+
+    { "plugins", NULL , N_("Plugin services") },
+
+	{ "preferences", GTK_STOCK_PREFERENCES , N_("Preferences"), "<Ctrl>P",
+	  N_("Open preferences window"), G_CALLBACK(action_preferences) },
+
+	{ "quit", GTK_STOCK_QUIT , N_("_Quit"), NULL,
+	  N_("Quit Audacious"), G_CALLBACK(action_quit) },
+
+	{ "ab set", NULL , N_("Set A-B"), "A",
+	  N_("Set A-B"), G_CALLBACK(action_ab_set) },
+
+	{ "ab clear", NULL , N_("Clear A-B"), "<Shift>A",
+	  N_("Clear A-B"), G_CALLBACK(action_ab_clear) },
+
+	{ "jump to playlist start", GTK_STOCK_GOTO_TOP , N_("Jump to Playlist Start"), "<Ctrl>Z",
+	  N_("Jump to Playlist Start"), G_CALLBACK(action_jump_to_playlist_start) },
+
+	{ "jump to file", GTK_STOCK_JUMP_TO , N_("Jump to File"), "J",
+	  N_("Jump to File"), G_CALLBACK(action_jump_to_file) },
+
+	{ "jump to time", GTK_STOCK_JUMP_TO , N_("Jump to Time"), "<Ctrl>J",
+	  N_("Jump to Time"), G_CALLBACK(action_jump_to_time) },
+
+	{ "queue toggle", AUD_STOCK_QUEUETOGGLE , N_("Queue Toggle"), "Q", 
+	  N_("Enables/disables the entry in the playlist's queue."),
+	  G_CALLBACK(action_queue_toggle) },
+};
+
+
+static GtkActionEntry action_entries_equalizer[] = {
+
+    { "equ preset load menu", NULL, N_("Load") },
+    { "equ preset import menu", NULL, N_("Import") },
+    { "equ preset save menu", NULL, N_("Save") },
+    { "equ preset delete menu", NULL, N_("Delete") },
+
+    { "equ load preset", NULL, N_("Preset"), NULL,
+      N_("Load preset"), G_CALLBACK(action_equ_load_preset) },
+
+    { "equ load auto preset", NULL, N_("Auto-load preset"), NULL,
+      N_("Load auto-load preset"), G_CALLBACK(action_equ_load_auto_preset) },
+
+    { "equ load default preset", NULL, N_("Default"), NULL,
+      N_("Load default preset into equalizer"), G_CALLBACK(action_equ_load_default_preset) },
+
+    { "equ zero preset", NULL, N_("Zero"), NULL,
+      N_("Set equalizer preset levels to zero"), G_CALLBACK(action_equ_zero_preset) },
+
+    { "equ load preset file", NULL, N_("From file"), NULL,
+      N_("Load preset from file"), G_CALLBACK(action_equ_load_preset_file) },
+
+    { "equ load preset eqf", NULL, N_("From WinAMP EQF file"), NULL,
+      N_("Load preset from WinAMP EQF file"), G_CALLBACK(action_equ_load_preset_eqf) },
+
+    { "equ import winamp presets", NULL, N_("WinAMP Presets"), NULL,
+      N_("Import WinAMP presets"), G_CALLBACK(action_equ_import_winamp_presets) },
+
+    { "equ save preset", NULL, N_("Preset"), NULL,
+      N_("Save preset"), G_CALLBACK(action_equ_save_preset) },
+
+    { "equ save auto preset", NULL, N_("Auto-load preset"), NULL,
+      N_("Save auto-load preset"), G_CALLBACK(action_equ_save_auto_preset) },
+
+    { "equ save default preset", NULL, N_("Default"), NULL,
+      N_("Save default preset"), G_CALLBACK(action_equ_save_default_preset) },
+
+    { "equ save preset file", NULL, N_("To file"), NULL,
+      N_("Save preset to file"), G_CALLBACK(action_equ_save_preset_file) },
+
+    { "equ save preset eqf", NULL, N_("To WinAMP EQF file"), NULL,
+      N_("Save preset to WinAMP EQF file"), G_CALLBACK(action_equ_save_preset_eqf) },
+
+    { "equ delete preset", NULL, N_("Preset"), NULL,
+      N_("Delete preset"), G_CALLBACK(action_equ_delete_preset) },
+
+    { "equ delete auto preset", NULL, N_("Auto-load preset"), NULL,
+      N_("Delete auto-load preset"), G_CALLBACK(action_equ_delete_auto_preset) }
+};
+
+
+
+/* ***************************** */
+
+
+static GtkActionGroup *
+ui_manager_new_action_group( const gchar * group_name )
+{
+  GtkActionGroup *group = gtk_action_group_new( group_name );
+  gtk_action_group_set_translation_domain( group , PACKAGE_NAME );
+  return group;
+}
+
+void
+ui_manager_init ( void )
+{
+  /* toggle actions */
+  toggleaction_group_others = ui_manager_new_action_group("toggleaction_others");
+  gtk_action_group_add_toggle_actions(
+    toggleaction_group_others , toggleaction_entries_others ,
+    G_N_ELEMENTS(toggleaction_entries_others) , NULL );
+
+  /* radio actions */
+  radioaction_group_anamode = ui_manager_new_action_group("radioaction_anamode");
+  gtk_action_group_add_radio_actions(
+    radioaction_group_anamode , radioaction_entries_anamode ,
+    G_N_ELEMENTS(radioaction_entries_anamode) , 0 , G_CALLBACK(action_anamode) , NULL );
+
+  radioaction_group_anatype = ui_manager_new_action_group("radioaction_anatype");
+  gtk_action_group_add_radio_actions(
+    radioaction_group_anatype , radioaction_entries_anatype ,
+    G_N_ELEMENTS(radioaction_entries_anatype) , 0 , G_CALLBACK(action_anatype) , NULL );
+
+  radioaction_group_scomode = ui_manager_new_action_group("radioaction_scomode");
+  gtk_action_group_add_radio_actions(
+    radioaction_group_scomode , radioaction_entries_scomode ,
+    G_N_ELEMENTS(radioaction_entries_scomode) , 0 , G_CALLBACK(action_scomode) , NULL );
+
+  radioaction_group_vprmode = ui_manager_new_action_group("radioaction_vprmode");
+  gtk_action_group_add_radio_actions(
+    radioaction_group_vprmode , radioaction_entries_vprmode ,
+    G_N_ELEMENTS(radioaction_entries_vprmode) , 0 , G_CALLBACK(action_vprmode) , NULL );
+
+  radioaction_group_wshmode = ui_manager_new_action_group("radioaction_wshmode");
+  gtk_action_group_add_radio_actions(
+    radioaction_group_wshmode , radioaction_entries_wshmode ,
+    G_N_ELEMENTS(radioaction_entries_wshmode) , 0 , G_CALLBACK(action_wshmode) , NULL );
+
+  radioaction_group_refrate = ui_manager_new_action_group("radioaction_refrate");
+  gtk_action_group_add_radio_actions(
+    radioaction_group_refrate , radioaction_entries_refrate ,
+    G_N_ELEMENTS(radioaction_entries_refrate) , 0 , G_CALLBACK(action_refrate) , NULL );
+
+  radioaction_group_anafoff = ui_manager_new_action_group("radioaction_anafoff");
+  gtk_action_group_add_radio_actions(
+    radioaction_group_anafoff , radioaction_entries_anafoff ,
+    G_N_ELEMENTS(radioaction_entries_anafoff) , 0 , G_CALLBACK(action_anafoff) , NULL );
+
+  radioaction_group_peafoff = ui_manager_new_action_group("radioaction_peafoff");
+  gtk_action_group_add_radio_actions(
+    radioaction_group_peafoff , radioaction_entries_peafoff ,
+    G_N_ELEMENTS(radioaction_entries_peafoff) , 0 , G_CALLBACK(action_peafoff) , NULL );
+
+  radioaction_group_vismode = ui_manager_new_action_group("radioaction_vismode");
+  gtk_action_group_add_radio_actions(
+    radioaction_group_vismode , radioaction_entries_vismode ,
+    G_N_ELEMENTS(radioaction_entries_vismode) , 0 , G_CALLBACK(action_vismode) , NULL );
+
+  radioaction_group_viewtime = ui_manager_new_action_group("radioaction_viewtime");
+  gtk_action_group_add_radio_actions(
+    radioaction_group_viewtime , radioaction_entries_viewtime ,
+    G_N_ELEMENTS(radioaction_entries_viewtime) , 0 , G_CALLBACK(action_viewtime) , NULL );
+
+  /* normal actions */
+  action_group_playback = ui_manager_new_action_group("action_playback");
+    gtk_action_group_add_actions(
+    action_group_playback , action_entries_playback ,
+    G_N_ELEMENTS(action_entries_playback) , NULL );
+
+  action_group_playlist = ui_manager_new_action_group("action_playlist");
+    gtk_action_group_add_actions(
+    action_group_playlist , action_entries_playlist ,
+    G_N_ELEMENTS(action_entries_playlist) , NULL );
+
+  action_group_visualization = ui_manager_new_action_group("action_visualization");
+    gtk_action_group_add_actions(
+    action_group_visualization , action_entries_visualization ,
+    G_N_ELEMENTS(action_entries_visualization) , NULL );
+
+  action_group_view = ui_manager_new_action_group("action_view");
+    gtk_action_group_add_actions(
+    action_group_view , action_entries_view ,
+    G_N_ELEMENTS(action_entries_view) , NULL );
+
+  action_group_others = ui_manager_new_action_group("action_others");
+    gtk_action_group_add_actions(
+    action_group_others , action_entries_others ,
+    G_N_ELEMENTS(action_entries_others) , NULL );
+
+  action_group_playlist_add = ui_manager_new_action_group("action_playlist_add");
+  gtk_action_group_add_actions(
+    action_group_playlist_add, action_entries_playlist_add,
+    G_N_ELEMENTS(action_entries_playlist_add), NULL );
+
+  action_group_playlist_select = ui_manager_new_action_group("action_playlist_select");
+  gtk_action_group_add_actions(
+    action_group_playlist_select, action_entries_playlist_select,
+    G_N_ELEMENTS(action_entries_playlist_select), NULL );
+
+  action_group_playlist_delete = ui_manager_new_action_group("action_playlist_delete");
+  gtk_action_group_add_actions(
+    action_group_playlist_delete, action_entries_playlist_delete,
+    G_N_ELEMENTS(action_entries_playlist_delete), NULL );
+
+  action_group_playlist_sort = ui_manager_new_action_group("action_playlist_sort");
+  gtk_action_group_add_actions(
+    action_group_playlist_sort, action_entries_playlist_sort,
+    G_N_ELEMENTS(action_entries_playlist_sort), NULL );
+
+  action_group_equalizer = ui_manager_new_action_group("action_equalizer");
+  gtk_action_group_add_actions(
+    action_group_equalizer, action_entries_equalizer,
+    G_N_ELEMENTS(action_entries_equalizer), NULL);
+
+  /* ui */
+  ui_manager = gtk_ui_manager_new();
+  gtk_ui_manager_insert_action_group( ui_manager , toggleaction_group_others , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , radioaction_group_anamode , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , radioaction_group_anatype , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , radioaction_group_scomode , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , radioaction_group_vprmode , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , radioaction_group_wshmode , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , radioaction_group_refrate , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , radioaction_group_anafoff , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , radioaction_group_peafoff , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , radioaction_group_vismode , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , radioaction_group_viewtime , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , action_group_playback , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , action_group_playlist , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , action_group_visualization , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , action_group_view , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , action_group_others , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , action_group_playlist_add , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , action_group_playlist_select , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , action_group_playlist_delete , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , action_group_playlist_sort , 0 );
+  gtk_ui_manager_insert_action_group( ui_manager , action_group_equalizer , 0 );
+
+  return;
+}
+
+#ifdef GDK_WINDOWING_QUARTZ
+static GtkWidget *carbon_menubar;
+#endif
+
+static void
+ui_manager_create_menus_init_pmenu( gchar * path )
+{
+  GtkWidget *plugins_menu_item = gtk_ui_manager_get_widget( ui_manager , path );
+  if ( plugins_menu_item )
+  {
+    /* initially set count of items under plugins_menu_item to 0 */
+    g_object_set_data( G_OBJECT(plugins_menu_item) , "ic" , GINT_TO_POINTER(0) );
+    /* and since it's 0, hide the plugins_menu_item */
+    gtk_widget_hide( plugins_menu_item );
+  }
+  return;
+}
+
+
+void
+ui_manager_create_menus ( void )
+{
+  GError *gerr = NULL;
+
+  /* attach xml menu definitions */
+  gtk_ui_manager_add_ui_from_file( ui_manager , DATA_DIR "/ui/mainwin.ui" , &gerr );
+
+  if ( gerr != NULL )
+  {
+    g_critical( "Error creating UI<ui/mainwin.ui>: %s" , gerr->message );
+    g_error_free( gerr );
+    return;
+  }
+
+  /* create GtkMenu widgets using path from xml definitions */
+  mainwin_songname_menu = ui_manager_get_popup_menu( ui_manager , "/mainwin-menus/songname-menu" );
+  mainwin_visualization_menu = ui_manager_get_popup_menu( ui_manager , "/mainwin-menus/main-menu/visualization" );
+  mainwin_playback_menu = ui_manager_get_popup_menu( ui_manager , "/mainwin-menus/main-menu/playback" );
+  mainwin_playlist_menu = ui_manager_get_popup_menu( ui_manager , "/mainwin-menus/main-menu/playlist" );
+  mainwin_view_menu = ui_manager_get_popup_menu( ui_manager , "/mainwin-menus/main-menu/view" );
+  mainwin_general_menu = ui_manager_get_popup_menu( ui_manager , "/mainwin-menus/main-menu" );
+
+  /* initialize plugins-menu for mainwin-menus */
+  ui_manager_create_menus_init_pmenu( "/mainwin-menus/main-menu/plugins-menu" );
+
+#ifdef GDK_WINDOWING_QUARTZ
+  gtk_ui_manager_add_ui_from_file( ui_manager , DATA_DIR "/ui/carbon-menubar.ui" , &gerr );
+
+  if ( gerr != NULL )
+  {
+    g_critical( "Error creating UI<ui/carbon-menubar.ui>: %s" , gerr->message );
+    g_error_free( gerr );
+    return;
+  }
+
+  carbon_menubar = ui_manager_get_popup_menu( ui_manager , "/carbon-menubar/main-menu" );
+  sync_menu_takeover_menu(GTK_MENU_SHELL(carbon_menubar));
+#endif
+
+  gtk_ui_manager_add_ui_from_file( ui_manager , DATA_DIR "/ui/playlist.ui" , &gerr );
+
+  if ( gerr != NULL )
+  {
+    g_critical( "Error creating UI<ui/playlist.ui>: %s" , gerr->message );
+    g_error_free( gerr );
+    return;
+  }
+
+  playlistwin_popup_menu = ui_manager_get_popup_menu(ui_manager, "/playlist-menus/playlist-rightclick-menu");
+
+  playlistwin_pladd_menu  = ui_manager_get_popup_menu(ui_manager, "/playlist-menus/add-menu");
+  playlistwin_pldel_menu  = ui_manager_get_popup_menu(ui_manager, "/playlist-menus/del-menu");
+  playlistwin_plsel_menu  = ui_manager_get_popup_menu(ui_manager, "/playlist-menus/select-menu");
+  playlistwin_plsort_menu = ui_manager_get_popup_menu(ui_manager, "/playlist-menus/misc-menu");
+  playlistwin_pllist_menu = ui_manager_get_popup_menu(ui_manager, "/playlist-menus/playlist-menu");
+
+  /* initialize plugins-menu for playlist-menus */
+  ui_manager_create_menus_init_pmenu( "/playlist-menus/playlist-menu/plugins-menu" );
+  ui_manager_create_menus_init_pmenu( "/playlist-menus/add-menu/plugins-menu" );
+  ui_manager_create_menus_init_pmenu( "/playlist-menus/del-menu/plugins-menu" );
+  ui_manager_create_menus_init_pmenu( "/playlist-menus/select-menu/plugins-menu" );
+  ui_manager_create_menus_init_pmenu( "/playlist-menus/misc-menu/plugins-menu" );
+  ui_manager_create_menus_init_pmenu( "/playlist-menus/playlist-rightclick-menu/plugins-menu" );
+
+  gtk_ui_manager_add_ui_from_file( ui_manager , DATA_DIR "/ui/equalizer.ui" , &gerr );
+
+  if ( gerr != NULL )
+  {
+    g_critical( "Error creating UI<ui/equalizer.ui>: %s" , gerr->message );
+    g_error_free( gerr );
+    return;
+  }
+
+  equalizerwin_presets_menu = ui_manager_get_popup_menu(ui_manager, "/equalizer-menus/preset-menu");
+
+  menu_created = TRUE;
+
+  return;
+}
+
+
+GtkAccelGroup *
+ui_manager_get_accel_group ( void )
+{
+  return gtk_ui_manager_get_accel_group( ui_manager );
+}
+
+
+GtkWidget *
+ui_manager_get_popup_menu ( GtkUIManager * self , const gchar * path )
+{
+  GtkWidget *menu_item = gtk_ui_manager_get_widget( self , path );
+
+  if (GTK_IS_MENU_ITEM(menu_item))
+    return gtk_menu_item_get_submenu(GTK_MENU_ITEM(menu_item));
+  else
+    return NULL;
+}
+
+
+static void
+menu_popup_pos_func (GtkMenu * menu , gint * x , gint * y , gboolean * push_in , gint * point )
+{
+  GtkRequisition requisition;
+  gint screen_width;
+  gint screen_height;
+
+  gtk_widget_size_request(GTK_WIDGET(menu), &requisition);
+
+  screen_width = gdk_screen_width();
+  screen_height = gdk_screen_height();
+
+  *x = CLAMP(point[0] - 2, 0, MAX(0, screen_width - requisition.width));
+  *y = CLAMP(point[1] - 2, 0, MAX(0, screen_height - requisition.height));
+
+  *push_in = FALSE;
+}
+
+
+void
+ui_manager_popup_menu_show ( GtkMenu * menu , gint x , gint y , guint button , guint time )
+{
+  gint pos[2];
+  pos[0] = x;
+  pos[1] = y;
+
+  gtk_menu_popup( menu , NULL , NULL ,
+    (GtkMenuPositionFunc) menu_popup_pos_func , pos , button , time );
+}
+
+
+
+/******************************/
+/* plugin-available functions */
+
+#define _MP_GWID(y) gtk_ui_manager_get_widget( ui_manager , y )
+
+static GtkWidget*
+audacious_menu_plugin_menuwid( menu_id )
+{
+  switch (menu_id)
+  {
+    case AUDACIOUS_MENU_MAIN:
+      return _MP_GWID("/mainwin-menus/main-menu/plugins-menu");
+    case AUDACIOUS_MENU_PLAYLIST:
+      return _MP_GWID("/playlist-menus/playlist-menu/plugins-menu");
+    case AUDACIOUS_MENU_PLAYLIST_RCLICK:
+      return _MP_GWID("/playlist-menus/playlist-rightclick-menu/plugins-menu");
+    case AUDACIOUS_MENU_PLAYLIST_ADD:
+      return _MP_GWID("/playlist-menus/add-menu/plugins-menu");
+    case AUDACIOUS_MENU_PLAYLIST_REMOVE:
+      return _MP_GWID("/playlist-menus/del-menu/plugins-menu");
+    case AUDACIOUS_MENU_PLAYLIST_SELECT:
+      return _MP_GWID("/playlist-menus/select-menu/plugins-menu");
+    case AUDACIOUS_MENU_PLAYLIST_MISC:
+      return _MP_GWID("/playlist-menus/misc-menu/plugins-menu");
+    default:
+      return NULL;
+  }
+}
+
+
+gint
+menu_plugin_item_add( gint menu_id , GtkWidget * item )
+{
+  if ( menu_created )
+  {
+    GtkWidget *plugins_menu = NULL;
+    GtkWidget *plugins_menu_item = audacious_menu_plugin_menuwid( menu_id );
+    if ( plugins_menu_item )
+    {
+      gint ic = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(plugins_menu_item),"ic"));
+      if ( ic == 0 ) /* no items under plugins_menu_item, create the submenu */
+      {
+        plugins_menu = gtk_menu_new();
+        gtk_menu_item_set_submenu( GTK_MENU_ITEM(plugins_menu_item), plugins_menu );
+      }
+      else /* items available under plugins_menu_item, pick the existing submenu */
+      {
+        plugins_menu = gtk_menu_item_get_submenu( GTK_MENU_ITEM(plugins_menu_item) );
+        if ( !plugins_menu ) return -1;
+      }
+      gtk_menu_shell_append( GTK_MENU_SHELL(plugins_menu) , item );
+      gtk_widget_show( plugins_menu_item );
+      g_object_set_data( G_OBJECT(plugins_menu_item) , "ic" , GINT_TO_POINTER(++ic) );
+      return 0; /* success */
+    }
+  }
+  return -1; /* failure */
+}
+
+
+gint
+menu_plugin_item_remove( gint menu_id , GtkWidget * item )
+{
+  if ( menu_created )
+  {
+    GtkWidget *plugins_menu = NULL;
+    GtkWidget *plugins_menu_item = audacious_menu_plugin_menuwid( menu_id );
+    if ( plugins_menu_item )
+    {
+      gint ic = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(plugins_menu_item),"ic"));
+      if ( ic > 0 )
+      {
+        plugins_menu = gtk_menu_item_get_submenu( GTK_MENU_ITEM(plugins_menu_item) );
+        if ( plugins_menu )
+        {
+          /* remove the plugin-added entry */
+          gtk_container_remove( GTK_CONTAINER(plugins_menu) , item );
+          g_object_set_data( G_OBJECT(plugins_menu_item) , "ic" , GINT_TO_POINTER(--ic) );
+          if ( ic == 0 ) /* if the menu is empty now, destroy it */
+          {
+            gtk_menu_item_remove_submenu( GTK_MENU_ITEM(plugins_menu_item) );
+            gtk_widget_destroy( plugins_menu );
+            gtk_widget_hide( plugins_menu_item );
+          }
+          return 0; /* success */
+        }
+      }
+    }
+  }
+  return -1; /* failure */
+}
+
+void
+ui_manager_destroy( void )
+{
+    g_object_unref((GObject*)toggleaction_group_others);
+    g_object_unref((GObject*)radioaction_group_anamode);
+    g_object_unref((GObject*)radioaction_group_anatype);
+    g_object_unref((GObject*)radioaction_group_scomode);
+    g_object_unref((GObject*)radioaction_group_vprmode);
+    g_object_unref((GObject*)radioaction_group_wshmode);
+    g_object_unref((GObject*)radioaction_group_refrate);
+    g_object_unref((GObject*)radioaction_group_anafoff);
+    g_object_unref((GObject*)radioaction_group_peafoff);
+    g_object_unref((GObject*)radioaction_group_vismode);
+    g_object_unref((GObject*)radioaction_group_viewtime);
+    g_object_unref((GObject*)action_group_playback);
+    g_object_unref((GObject*)action_group_playlist);
+    g_object_unref((GObject*)action_group_visualization);
+    g_object_unref((GObject*)action_group_view);
+    g_object_unref((GObject*)action_group_others);
+    g_object_unref((GObject*)action_group_playlist_add);
+    g_object_unref((GObject*)action_group_playlist_select);
+    g_object_unref((GObject*)action_group_playlist_delete);
+    g_object_unref((GObject*)action_group_playlist_sort);
+    g_object_unref((GObject*)action_group_equalizer);
+    g_object_unref((GObject*)ui_manager);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_manager.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,78 @@
+/*  Audacious - Cross-platform multimedia player
+ *  Copyright (C) 2005-2007  Audacious development team.
+ *
+ *  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; under version 3 of the License.
+ *
+ *  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, see <http://www.gnu.org/licenses>.
+ *
+ *  The Audacious team does not consider modular code linking to
+ *  Audacious or using our public API to be a derived work.
+ */
+
+#ifndef AUDACIOUS_UI_MANAGER_H
+#define AUDACIOUS_UI_MANAGER_H
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+GtkWidget *mainwin_songname_menu;
+GtkWidget *mainwin_general_menu;
+GtkWidget *mainwin_visualization_menu;
+GtkWidget *mainwin_playback_menu;
+GtkWidget *mainwin_playlist_menu;
+GtkWidget *mainwin_view_menu;
+
+GtkWidget *playlistwin_pladd_menu;
+GtkWidget *playlistwin_pldel_menu;
+GtkWidget *playlistwin_plsel_menu;
+GtkWidget *playlistwin_plsort_menu;
+GtkWidget *playlistwin_pllist_menu;
+GtkWidget *playlistwin_popup_menu;
+
+GtkWidget *equalizerwin_presets_menu;
+
+GtkActionGroup *toggleaction_group_others;
+GtkActionGroup *radioaction_group_anamode; /* Analyzer mode */
+GtkActionGroup *radioaction_group_anatype; /* Analyzer type */
+GtkActionGroup *radioaction_group_scomode; /* Scope mode */
+GtkActionGroup *radioaction_group_vprmode; /* Voiceprint mode */
+GtkActionGroup *radioaction_group_wshmode; /* WindowShade VU mode */
+GtkActionGroup *radioaction_group_refrate; /* Refresh rate */
+GtkActionGroup *radioaction_group_anafoff; /* Analyzer Falloff */
+GtkActionGroup *radioaction_group_peafoff; /* Peak Falloff */
+GtkActionGroup *radioaction_group_vismode; /* Visualization mode */
+GtkActionGroup *radioaction_group_viewtime; /* View time (remaining/elapsed) */
+GtkActionGroup *action_group_playback;
+GtkActionGroup *action_group_visualization;
+GtkActionGroup *action_group_view;
+GtkActionGroup *action_group_others;
+GtkActionGroup *action_group_playlist;
+GtkActionGroup *action_group_playlist_add;
+GtkActionGroup *action_group_playlist_select;
+GtkActionGroup *action_group_playlist_delete;
+GtkActionGroup *action_group_playlist_sort;
+GtkActionGroup *action_group_equalizer;
+
+
+void ui_manager_init ( void );
+void ui_manager_create_menus ( void );
+GtkAccelGroup * ui_manager_get_accel_group ( void );
+GtkWidget * ui_manager_get_popup_menu ( GtkUIManager * , const gchar * );
+void ui_manager_popup_menu_show( GtkMenu * , gint , gint , guint , guint );
+#define popup_menu_show(x1,x2,x3,x4,x5) ui_manager_popup_menu_show(x1,x2,x3,x4,x5)
+void ui_manager_destroy( void );
+
+G_END_DECLS
+
+#endif /* AUDACIOUS_UI_MANAGER_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_playlist.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,1928 @@
+/*  Audacious - Cross-platform multimedia player
+ *  Copyright (C) 2005-2006  Audacious development team.
+ *
+ *  BMP - Cross-platform multimedia player
+ *  Copyright (C) 2003-2004  BMP development team.
+ *
+ *  Based on XMMS:
+ *  Copyright (C) 1998-2003  XMMS development team.
+ *
+ *  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; under version 3 of the License.
+ *
+ *  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, see <http://www.gnu.org/licenses>.
+ *
+ *  The Audacious team does not consider modular code linking to
+ *  Audacious or using our public API to be a derived work.
+ */
+
+/* #define AUD_DEBUG 1 */
+
+#include "ui_playlist.h"
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <gdk/gdk.h>
+#include <gdk/gdkkeysyms.h>
+#include <gtk/gtk.h>
+#include <string.h>
+
+#include "platform/smartinclude.h"
+
+#include <unistd.h>
+#include <errno.h>
+
+#include "actions-playlist.h"
+#include "dnd.h"
+#if 0
+#include "input.h"
+#include "main.h"
+#include "playback.h"
+#include "playlist.h"
+#include "playlist_container.h"
+#include "strings.h"
+#endif
+#include "ui_dock.h"
+#include "ui_equalizer.h"
+#include "ui_main.h"
+#include "ui_manager.h"
+#include "ui_playlist_evlisteners.h"
+#if 0
+#include "ui_playlist_manager.h"
+#endif
+#include "util.h"
+
+#include "ui_skinned_window.h"
+#include "ui_skinned_button.h"
+#include "ui_skinned_textbox.h"
+#include "ui_skinned_playlist_slider.h"
+#include "ui_skinned_playlist.h"
+
+#include "icons-stock.h"
+#include "images/audacious_playlist.xpm"
+
+GtkWidget *playlistwin;
+
+static GMutex *resize_mutex = NULL;
+
+static GtkWidget *playlistwin_list = NULL;
+static GtkWidget *playlistwin_shade, *playlistwin_close;
+
+static gboolean playlistwin_hint_flag = FALSE;
+
+static GtkWidget *playlistwin_slider;
+static GtkWidget *playlistwin_time_min, *playlistwin_time_sec;
+static GtkWidget *playlistwin_info, *playlistwin_sinfo;
+static GtkWidget *playlistwin_srew, *playlistwin_splay;
+static GtkWidget *playlistwin_spause, *playlistwin_sstop;
+static GtkWidget *playlistwin_sfwd, *playlistwin_seject;
+static GtkWidget *playlistwin_sscroll_up, *playlistwin_sscroll_down;
+
+static void playlistwin_select_search_cbt_cb(GtkWidget *called_cbt,
+                                             gpointer other_cbt);
+static gboolean playlistwin_select_search_kp_cb(GtkWidget *entry,
+                                                GdkEventKey *event,
+                                                gpointer searchdlg_win);
+
+static gboolean playlistwin_resizing = FALSE;
+static gint playlistwin_resize_x, playlistwin_resize_y;
+
+gboolean
+playlistwin_is_shaded(void)
+{
+    return config.playlist_shaded;
+}
+
+gint
+playlistwin_get_width(void)
+{
+    config.playlist_width /= PLAYLISTWIN_WIDTH_SNAP;
+    config.playlist_width *= PLAYLISTWIN_WIDTH_SNAP;
+    return config.playlist_width;
+}
+
+gint
+playlistwin_get_height_unshaded(void)
+{
+    config.playlist_height /= PLAYLISTWIN_HEIGHT_SNAP;
+    config.playlist_height *= PLAYLISTWIN_HEIGHT_SNAP;
+    return config.playlist_height;
+}
+
+gint
+playlistwin_get_height_shaded(void)
+{
+    return PLAYLISTWIN_SHADED_HEIGHT;
+}
+
+gint
+playlistwin_get_height(void)
+{
+    if (playlistwin_is_shaded())
+        return playlistwin_get_height_shaded();
+    else
+        return playlistwin_get_height_unshaded();
+}
+
+static void
+playlistwin_update_info(Playlist *playlist)
+{
+    g_return_if_fail(playlist != NULL);
+
+    gchar *text, *sel_text, *tot_text;
+    gulong selection, total;
+    gboolean selection_more, total_more;
+
+    aud_playlist_get_total_time(playlist, &total, &selection, &total_more, &selection_more);
+
+    if (selection > 0 || (selection == 0 && !selection_more)) {
+        if (selection > 3600)
+            sel_text =
+                g_strdup_printf("%lu:%-2.2lu:%-2.2lu%s", selection / 3600,
+                                (selection / 60) % 60, selection % 60,
+                                (selection_more ? "+" : ""));
+        else
+            sel_text =
+                g_strdup_printf("%lu:%-2.2lu%s", selection / 60,
+                                selection % 60, (selection_more ? "+" : ""));
+    }
+    else
+        sel_text = g_strdup("?");
+    if (total > 0 || (total == 0 && !total_more)) {
+        if (total > 3600)
+            tot_text =
+                g_strdup_printf("%lu:%-2.2lu:%-2.2lu%s", total / 3600,
+                                (total / 60) % 60, total % 60,
+                                total_more ? "+" : "");
+        else
+            tot_text =
+                g_strdup_printf("%lu:%-2.2lu%s", total / 60, total % 60,
+                                total_more ? "+" : "");
+    }
+    else
+        tot_text = g_strdup("?");
+    text = g_strconcat(sel_text, "/", tot_text, NULL);
+    ui_skinned_textbox_set_text(playlistwin_info, text ? text : "");
+    g_free(text);
+    g_free(tot_text);
+    g_free(sel_text);
+}
+
+static void
+playlistwin_update_sinfo(Playlist *playlist)
+{
+    g_return_if_fail(playlist != NULL);
+
+    gchar *posstr, *timestr, *title, *info;
+    gint pos, time;
+
+    pos = aud_playlist_get_position(playlist);
+    title = aud_playlist_get_songtitle(playlist, pos);
+
+    if (!title) {
+        ui_skinned_textbox_set_text(playlistwin_sinfo, "");
+        return;
+    }
+
+    aud_convert_title_text(title);
+
+    time = aud_playlist_get_songtime(playlist, pos);
+
+    if (config.show_numbers_in_pl)
+        posstr = g_strdup_printf("%d. ", pos + 1);
+    else
+        posstr = g_strdup("");
+
+    if (time != -1) {
+        timestr = g_strdup_printf(" (%d:%-2.2d)", time / 60000,
+                                      (time / 1000) % 60);
+    }
+    else
+        timestr = g_strdup("");
+
+    info = g_strdup_printf("%s%s%s", posstr, title, timestr);
+
+    g_free(posstr);
+    g_free(title);
+    g_free(timestr);
+
+    ui_skinned_textbox_set_text(playlistwin_sinfo, info ? info : "");
+    g_free(info);
+}
+
+gboolean
+playlistwin_item_visible(gint index)
+{
+    g_return_val_if_fail(UI_SKINNED_IS_PLAYLIST(playlistwin_list), FALSE);
+
+    if (index >= UI_SKINNED_PLAYLIST(playlistwin_list)->first &&
+        index < (UI_SKINNED_PLAYLIST(playlistwin_list)->first + UI_SKINNED_PLAYLIST(playlistwin_list)->num_visible) ) {
+        return TRUE;
+    }
+    return FALSE;
+}
+
+gint
+playlistwin_list_get_visible_count(void)
+{
+    g_return_val_if_fail(UI_SKINNED_IS_PLAYLIST(playlistwin_list), -1);
+
+    return UI_SKINNED_PLAYLIST(playlistwin_list)->num_visible;
+}
+
+gint
+playlistwin_list_get_first(void)
+{
+    g_return_val_if_fail(UI_SKINNED_IS_PLAYLIST(playlistwin_list), -1);
+
+    return UI_SKINNED_PLAYLIST(playlistwin_list)->first;
+}
+
+gint
+playlistwin_get_toprow(void)
+{
+    g_return_val_if_fail(UI_SKINNED_IS_PLAYLIST(playlistwin_list), -1);
+
+    return (UI_SKINNED_PLAYLIST(playlistwin_list)->first);
+}
+
+void
+playlistwin_set_toprow(gint toprow)
+{
+    if (UI_SKINNED_IS_PLAYLIST(playlistwin_list))
+        UI_SKINNED_PLAYLIST(playlistwin_list)->first = toprow;
+#if 0
+    g_cond_signal(cond_scan);
+#endif
+    playlistwin_update_list(aud_playlist_get_active());
+}
+
+void
+playlistwin_update_list(Playlist *playlist)
+{
+    /* this can happen early on. just bail gracefully. */
+    g_return_if_fail(playlistwin_list);
+
+    playlistwin_update_info(playlist);
+    playlistwin_update_sinfo(playlist);
+    gtk_widget_queue_draw(playlistwin_list);
+    gtk_widget_queue_draw(playlistwin_slider);
+}
+
+static void
+playlistwin_set_geometry_hints(gboolean shaded)
+{
+    GdkGeometry geometry;
+    GdkWindowHints mask;
+
+    geometry.min_width = PLAYLISTWIN_MIN_WIDTH;
+    geometry.max_width = G_MAXUINT16;
+
+    geometry.width_inc = PLAYLISTWIN_WIDTH_SNAP;
+    geometry.height_inc = PLAYLISTWIN_HEIGHT_SNAP;
+
+    if (shaded) {
+        geometry.min_height = PLAYLISTWIN_SHADED_HEIGHT;
+        geometry.max_height = PLAYLISTWIN_SHADED_HEIGHT;
+        geometry.base_height = PLAYLISTWIN_SHADED_HEIGHT;
+    }
+    else {
+        geometry.min_height = PLAYLISTWIN_MIN_HEIGHT;
+        geometry.max_height = G_MAXUINT16;
+    }
+
+    mask = GDK_HINT_MIN_SIZE | GDK_HINT_MAX_SIZE | GDK_HINT_RESIZE_INC;
+
+    gtk_window_set_geometry_hints(GTK_WINDOW(playlistwin),
+                                  playlistwin, &geometry, mask);
+}
+
+void
+playlistwin_set_sinfo_font(gchar *font)
+{
+    gchar *tmp = NULL, *tmp2 = NULL;
+
+    g_return_if_fail(font);
+    AUDDBG("Attempt to set font \"%s\"\n", font);
+
+    tmp = g_strdup(font);
+    g_return_if_fail(tmp);
+
+    *strrchr(tmp, ' ') = '\0';
+    tmp2 = g_strdup_printf("%s 8", tmp);
+    g_return_if_fail(tmp2);
+
+    ui_skinned_textbox_set_xfont(playlistwin_sinfo, !config.mainwin_use_bitmapfont, tmp2);
+
+    g_free(tmp);
+    g_free(tmp2);
+}
+
+void
+playlistwin_set_sinfo_scroll(gboolean scroll)
+{
+    if(playlistwin_is_shaded())
+        ui_skinned_textbox_set_scroll(playlistwin_sinfo, config.autoscroll);
+    else
+        ui_skinned_textbox_set_scroll(playlistwin_sinfo, FALSE);
+}
+
+void
+playlistwin_set_shade(gboolean shaded)
+{
+    config.playlist_shaded = shaded;
+
+    if (shaded) {
+        playlistwin_set_sinfo_font(config.playlist_font);
+        playlistwin_set_sinfo_scroll(config.autoscroll);
+        gtk_widget_show(playlistwin_sinfo);
+        ui_skinned_set_push_button_data(playlistwin_shade, 128, 45, 150, 42);
+        ui_skinned_set_push_button_data(playlistwin_close, 138, 45, -1, -1);
+    }
+    else {
+        gtk_widget_hide(playlistwin_sinfo);
+        playlistwin_set_sinfo_scroll(FALSE);
+        ui_skinned_set_push_button_data(playlistwin_shade, 157, 3, 62, 42);
+        ui_skinned_set_push_button_data(playlistwin_close, 167, 3, -1, -1);
+    }
+
+    dock_shade(get_dock_window_list(), GTK_WINDOW(playlistwin),
+               playlistwin_get_height());
+
+    playlistwin_set_geometry_hints(config.playlist_shaded);
+
+    gtk_window_resize(GTK_WINDOW(playlistwin),
+                      playlistwin_get_width(),
+                      playlistwin_get_height());
+}
+
+static void
+playlistwin_set_shade_menu(gboolean shaded)
+{
+    GtkAction *action = gtk_action_group_get_action(
+      toggleaction_group_others , "roll up playlist editor" );
+    gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(action) , shaded );
+
+    playlistwin_set_shade(shaded);
+    playlistwin_update_list(aud_playlist_get_active());
+}
+
+void
+playlistwin_shade_toggle(void)
+{
+    playlistwin_set_shade_menu(!config.playlist_shaded);
+}
+
+static gboolean
+playlistwin_release(GtkWidget * widget,
+                    GdkEventButton * event,
+                    gpointer callback_data)
+{
+    playlistwin_resizing = FALSE;
+    return FALSE;
+}
+
+void
+playlistwin_scroll(gint num)
+{
+    if (UI_SKINNED_IS_PLAYLIST(playlistwin_list))
+        UI_SKINNED_PLAYLIST(playlistwin_list)->first += num;
+    playlistwin_update_list(aud_playlist_get_active());
+}
+
+void
+playlistwin_scroll_up_pushed(void)
+{
+    playlistwin_scroll(-3);
+}
+
+void
+playlistwin_scroll_down_pushed(void)
+{
+    playlistwin_scroll(3);
+}
+
+static void
+playlistwin_select_all(void)
+{
+    Playlist *playlist = aud_playlist_get_active();
+
+    aud_playlist_select_all(playlist, TRUE);
+    if (UI_SKINNED_IS_PLAYLIST(playlistwin_list)) {
+        UI_SKINNED_PLAYLIST(playlistwin_list)->prev_selected = 0;
+        UI_SKINNED_PLAYLIST(playlistwin_list)->prev_min = 0;
+        UI_SKINNED_PLAYLIST(playlistwin_list)->prev_max = aud_playlist_get_length(playlist) - 1;
+    }
+    playlistwin_update_list(playlist);
+}
+
+static void
+playlistwin_select_none(void)
+{
+    aud_playlist_select_all(aud_playlist_get_active(), FALSE);
+    if (UI_SKINNED_IS_PLAYLIST(playlistwin_list)) {
+        UI_SKINNED_PLAYLIST(playlistwin_list)->prev_selected = -1;
+        UI_SKINNED_PLAYLIST(playlistwin_list)->prev_min = -1;
+    }
+    playlistwin_update_list(aud_playlist_get_active());
+}
+
+static void
+playlistwin_select_search(void)
+{
+    Playlist *playlist = aud_playlist_get_active();
+    GtkWidget *searchdlg_win, *searchdlg_table;
+    GtkWidget *searchdlg_hbox, *searchdlg_logo, *searchdlg_helptext;
+    GtkWidget *searchdlg_entry_title, *searchdlg_label_title;
+    GtkWidget *searchdlg_entry_album, *searchdlg_label_album;
+    GtkWidget *searchdlg_entry_file_name, *searchdlg_label_file_name;
+    GtkWidget *searchdlg_entry_performer, *searchdlg_label_performer;
+    GtkWidget *searchdlg_checkbt_clearprevsel;
+    GtkWidget *searchdlg_checkbt_newplaylist;
+    GtkWidget *searchdlg_checkbt_autoenqueue;
+    gint result;
+
+    /* create dialog */
+    searchdlg_win = gtk_dialog_new_with_buttons(
+      _("Search entries in active playlist") , GTK_WINDOW(mainwin) ,
+      GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT ,
+      GTK_STOCK_CANCEL , GTK_RESPONSE_REJECT , GTK_STOCK_OK , GTK_RESPONSE_ACCEPT , NULL );
+    gtk_window_set_position(GTK_WINDOW(searchdlg_win), GTK_WIN_POS_CENTER);
+
+    /* help text and logo */
+    searchdlg_hbox = gtk_hbox_new( FALSE , 4 );
+    searchdlg_logo = gtk_image_new_from_stock( GTK_STOCK_FIND , GTK_ICON_SIZE_DIALOG );
+    searchdlg_helptext = gtk_label_new( _("Select entries in playlist by filling one or more "
+      "fields. Fields use regular expressions syntax, case-insensitive. If you don't know how "
+      "regular expressions work, simply insert a literal portion of what you're searching for.") );
+    gtk_label_set_line_wrap( GTK_LABEL(searchdlg_helptext) , TRUE );
+    gtk_box_pack_start( GTK_BOX(searchdlg_hbox) , searchdlg_logo , FALSE , FALSE , 0 );
+    gtk_box_pack_start( GTK_BOX(searchdlg_hbox) , searchdlg_helptext , FALSE , FALSE , 0 );
+
+    /* title */
+    searchdlg_label_title = gtk_label_new( _("Title: ") );
+    searchdlg_entry_title = gtk_entry_new();
+    gtk_misc_set_alignment( GTK_MISC(searchdlg_label_title) , 0 , 0.5 );
+    g_signal_connect( G_OBJECT(searchdlg_entry_title) , "key-press-event" ,
+      G_CALLBACK(playlistwin_select_search_kp_cb) , searchdlg_win );
+
+    /* album */
+    searchdlg_label_album= gtk_label_new( _("Album: ") );
+    searchdlg_entry_album= gtk_entry_new();
+    gtk_misc_set_alignment( GTK_MISC(searchdlg_label_album) , 0 , 0.5 );
+    g_signal_connect( G_OBJECT(searchdlg_entry_album) , "key-press-event" ,
+      G_CALLBACK(playlistwin_select_search_kp_cb) , searchdlg_win );
+
+    /* artist */
+    searchdlg_label_performer = gtk_label_new( _("Artist: ") );
+    searchdlg_entry_performer = gtk_entry_new();
+    gtk_misc_set_alignment( GTK_MISC(searchdlg_label_performer) , 0 , 0.5 );
+    g_signal_connect( G_OBJECT(searchdlg_entry_performer) , "key-press-event" ,
+      G_CALLBACK(playlistwin_select_search_kp_cb) , searchdlg_win );
+
+    /* file name */
+    searchdlg_label_file_name = gtk_label_new( _("Filename: ") );
+    searchdlg_entry_file_name = gtk_entry_new();
+    gtk_misc_set_alignment( GTK_MISC(searchdlg_label_file_name) , 0 , 0.5 );
+    g_signal_connect( G_OBJECT(searchdlg_entry_file_name) , "key-press-event" ,
+      G_CALLBACK(playlistwin_select_search_kp_cb) , searchdlg_win );
+
+    /* some options that control behaviour */
+    searchdlg_checkbt_clearprevsel = gtk_check_button_new_with_label(
+      _("Clear previous selection before searching") );
+    gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(searchdlg_checkbt_clearprevsel) , TRUE );
+    searchdlg_checkbt_autoenqueue = gtk_check_button_new_with_label(
+      _("Automatically toggle queue for matching entries") );
+    gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(searchdlg_checkbt_autoenqueue) , FALSE );
+    searchdlg_checkbt_newplaylist = gtk_check_button_new_with_label(
+      _("Create a new playlist with matching entries") );
+    gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(searchdlg_checkbt_newplaylist) , FALSE );
+    g_signal_connect( G_OBJECT(searchdlg_checkbt_autoenqueue) , "clicked" ,
+      G_CALLBACK(playlistwin_select_search_cbt_cb) , searchdlg_checkbt_newplaylist );
+    g_signal_connect( G_OBJECT(searchdlg_checkbt_newplaylist) , "clicked" ,
+      G_CALLBACK(playlistwin_select_search_cbt_cb) , searchdlg_checkbt_autoenqueue );
+
+    /* place fields in searchdlg_table */
+    searchdlg_table = gtk_table_new( 8 , 2 , FALSE );
+    gtk_table_set_row_spacing( GTK_TABLE(searchdlg_table) , 0 , 8 );
+    gtk_table_set_row_spacing( GTK_TABLE(searchdlg_table) , 4 , 8 );
+    gtk_table_attach( GTK_TABLE(searchdlg_table) , searchdlg_hbox ,
+      0 , 2 , 0 , 1 , GTK_FILL | GTK_EXPAND , GTK_FILL | GTK_EXPAND , 0 , 2 );
+    gtk_table_attach( GTK_TABLE(searchdlg_table) , searchdlg_label_title ,
+      0 , 1 , 1 , 2 , GTK_FILL , GTK_FILL | GTK_EXPAND , 0 , 2 );
+    gtk_table_attach( GTK_TABLE(searchdlg_table) , searchdlg_entry_title ,
+      1 , 2 , 1 , 2 , GTK_FILL | GTK_EXPAND , GTK_FILL | GTK_EXPAND , 0 , 2 );
+    gtk_table_attach( GTK_TABLE(searchdlg_table) , searchdlg_label_album,
+      0 , 1 , 2 , 3 , GTK_FILL , GTK_FILL | GTK_EXPAND , 0 , 2 );
+    gtk_table_attach( GTK_TABLE(searchdlg_table) , searchdlg_entry_album,
+      1 , 2 , 2 , 3 , GTK_FILL | GTK_EXPAND , GTK_FILL | GTK_EXPAND , 0 , 2 );
+    gtk_table_attach( GTK_TABLE(searchdlg_table) , searchdlg_label_performer ,
+      0 , 1 , 3 , 4 , GTK_FILL , GTK_FILL | GTK_EXPAND , 0 , 2 );
+    gtk_table_attach( GTK_TABLE(searchdlg_table) , searchdlg_entry_performer ,
+      1 , 2 , 3 , 4 , GTK_FILL | GTK_EXPAND , GTK_FILL | GTK_EXPAND , 0 , 2 );
+    gtk_table_attach( GTK_TABLE(searchdlg_table) , searchdlg_label_file_name ,
+      0 , 1 , 4 , 5 , GTK_FILL , GTK_FILL | GTK_EXPAND , 0 , 2 );
+    gtk_table_attach( GTK_TABLE(searchdlg_table) , searchdlg_entry_file_name ,
+      1 , 2 , 4 , 5 , GTK_FILL | GTK_EXPAND , GTK_FILL | GTK_EXPAND , 0 , 2 );
+    gtk_table_attach( GTK_TABLE(searchdlg_table) , searchdlg_checkbt_clearprevsel ,
+      0 , 2 , 5 , 6 , GTK_FILL | GTK_EXPAND , GTK_FILL | GTK_EXPAND , 0 , 1 );
+    gtk_table_attach( GTK_TABLE(searchdlg_table) , searchdlg_checkbt_autoenqueue ,
+      0 , 2 , 6 , 7 , GTK_FILL | GTK_EXPAND , GTK_FILL | GTK_EXPAND , 0 , 1 );
+    gtk_table_attach( GTK_TABLE(searchdlg_table) , searchdlg_checkbt_newplaylist ,
+      0 , 2 , 7 , 8 , GTK_FILL | GTK_EXPAND , GTK_FILL | GTK_EXPAND , 0 , 1 );
+
+    gtk_container_set_border_width( GTK_CONTAINER(searchdlg_table) , 5 );
+    gtk_container_add( GTK_CONTAINER(GTK_DIALOG(searchdlg_win)->vbox) , searchdlg_table );
+    gtk_widget_show_all( searchdlg_win );
+    result = gtk_dialog_run( GTK_DIALOG(searchdlg_win) );
+    switch(result)
+    {
+      case GTK_RESPONSE_ACCEPT:
+      {
+         gint matched_entries_num = 0;
+         /* create a TitleInput tuple with user search data */
+         Tuple *tuple = aud_tuple_new();
+         gchar *searchdata = NULL;
+
+         searchdata = (gchar*)gtk_entry_get_text( GTK_ENTRY(searchdlg_entry_title) );
+         AUDDBG("title=\"%s\"\n", searchdata);
+         aud_tuple_associate_string(tuple, FIELD_TITLE, NULL, searchdata);
+
+         searchdata = (gchar*)gtk_entry_get_text( GTK_ENTRY(searchdlg_entry_album) );
+         AUDDBG("album=\"%s\"\n", searchdata);
+         aud_tuple_associate_string(tuple, FIELD_ALBUM, NULL, searchdata);
+
+         searchdata = (gchar*)gtk_entry_get_text( GTK_ENTRY(searchdlg_entry_performer) );
+         AUDDBG("performer=\"%s\"\n", searchdata);
+         aud_tuple_associate_string(tuple, FIELD_ARTIST, NULL, searchdata);
+
+         searchdata = (gchar*)gtk_entry_get_text( GTK_ENTRY(searchdlg_entry_file_name) );
+         AUDDBG("filename=\"%s\"\n", searchdata);
+         aud_tuple_associate_string(tuple, FIELD_FILE_NAME, NULL, searchdata);
+
+         /* check if previous selection should be cleared before searching */
+         if ( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(searchdlg_checkbt_clearprevsel)) == TRUE )
+             playlistwin_select_none();
+         /* now send this tuple to the real search function */
+         matched_entries_num = aud_playlist_select_search( playlist , tuple , 0 );
+         /* we do not need the tuple and its data anymore */
+         mowgli_object_unref(tuple);
+         playlistwin_update_list(aud_playlist_get_active());
+         /* check if a new playlist should be created after searching */
+         if ( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(searchdlg_checkbt_newplaylist)) == TRUE )
+             aud_playlist_new_from_selected();
+         /* check if matched entries should be queued */
+         else if ( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(searchdlg_checkbt_autoenqueue)) == TRUE )
+             aud_playlist_queue(aud_playlist_get_active());
+         break;
+      }
+      default:
+         break;
+    }
+    /* done here :) */
+    gtk_widget_destroy( searchdlg_win );
+}
+
+static void
+playlistwin_inverse_selection(void)
+{
+    aud_playlist_select_invert_all(aud_playlist_get_active());
+    if (UI_SKINNED_IS_PLAYLIST(playlistwin_list)) {
+        UI_SKINNED_PLAYLIST(playlistwin_list)->prev_selected = -1;
+        UI_SKINNED_PLAYLIST(playlistwin_list)->prev_min = -1;
+    }
+    playlistwin_update_list(aud_playlist_get_active());
+}
+
+static void
+playlistwin_resize(gint width, gint height)
+{
+    gint tx, ty;
+    gint dx, dy;
+
+    g_return_if_fail(width > 0 && height > 0);
+
+    tx = (width - PLAYLISTWIN_MIN_WIDTH) / PLAYLISTWIN_WIDTH_SNAP;
+    tx = (tx * PLAYLISTWIN_WIDTH_SNAP) + PLAYLISTWIN_MIN_WIDTH;
+    if (tx < PLAYLISTWIN_MIN_WIDTH)
+        tx = PLAYLISTWIN_MIN_WIDTH;
+
+    if (!config.playlist_shaded)
+    {
+        ty = (height - PLAYLISTWIN_MIN_HEIGHT) / PLAYLISTWIN_HEIGHT_SNAP;
+        ty = (ty * PLAYLISTWIN_HEIGHT_SNAP) + PLAYLISTWIN_MIN_HEIGHT;
+        if (ty < PLAYLISTWIN_MIN_HEIGHT)
+            ty = PLAYLISTWIN_MIN_HEIGHT;
+    }
+    else
+        ty = config.playlist_height;
+
+    if (tx == config.playlist_width && ty == config.playlist_height)
+        return;
+
+    /* difference between previous size and new size */
+    dx = tx - config.playlist_width;
+    dy = ty - config.playlist_height;
+
+    config.playlist_width = width = tx;
+    config.playlist_height = height = ty;
+
+    g_mutex_lock(resize_mutex);
+    ui_skinned_playlist_resize_relative(playlistwin_list, dx, dy);
+
+    ui_skinned_playlist_slider_move_relative(playlistwin_slider, dx);
+    ui_skinned_playlist_slider_resize_relative(playlistwin_slider, dy);
+
+    playlistwin_update_sinfo(aud_playlist_get_active());
+
+    ui_skinned_button_move_relative(playlistwin_shade, dx, 0);
+    ui_skinned_button_move_relative(playlistwin_close, dx, 0);
+    ui_skinned_textbox_move_relative(playlistwin_time_min, dx, dy);
+    ui_skinned_textbox_move_relative(playlistwin_time_sec, dx, dy);
+    ui_skinned_textbox_move_relative(playlistwin_info, dx, dy);
+    ui_skinned_button_move_relative(playlistwin_srew, dx, dy);
+    ui_skinned_button_move_relative(playlistwin_splay, dx, dy);
+    ui_skinned_button_move_relative(playlistwin_spause, dx, dy);
+    ui_skinned_button_move_relative(playlistwin_sstop, dx, dy);
+    ui_skinned_button_move_relative(playlistwin_sfwd, dx, dy);
+    ui_skinned_button_move_relative(playlistwin_seject, dx, dy);
+    ui_skinned_button_move_relative(playlistwin_sscroll_up, dx, dy);
+    ui_skinned_button_move_relative(playlistwin_sscroll_down, dx, dy);
+
+    gtk_widget_set_size_request(playlistwin_sinfo, playlistwin_get_width() - 35,
+                                aud_active_skin->properties.textbox_bitmap_font_height);
+    g_mutex_unlock(resize_mutex);
+}
+
+static void
+playlistwin_motion(GtkWidget * widget,
+                   GdkEventMotion * event,
+                   gpointer callback_data)
+{
+    /*
+     * GDK2's resize is broken and doesn't really play nice, so we have
+     * to do all of this stuff by hand.
+     */
+    if (playlistwin_resizing == TRUE)
+    {
+        if (event->x + playlistwin_resize_x != playlistwin_get_width() ||
+            event->y + playlistwin_resize_y != playlistwin_get_height())
+        {
+            playlistwin_resize(event->x + playlistwin_resize_x,
+                               event->y + playlistwin_resize_y);
+            gdk_window_resize(playlistwin->window,
+                              config.playlist_width, playlistwin_get_height());
+            gdk_flush();
+        }
+    }
+    else if (dock_is_moving(GTK_WINDOW(playlistwin)))
+        dock_move_motion(GTK_WINDOW(playlistwin), event);
+}
+
+static void
+playlistwin_show_filebrowser(void)
+{
+    action_playlist_add_files();
+}
+
+static void
+playlistwin_fileinfo(void)
+{
+    Playlist *playlist = aud_playlist_get_active();
+
+    /* Show the first selected file, or the current file if nothing is
+     * selected */
+    GList *list = aud_playlist_get_selected(playlist);
+    if (list) {
+        aud_playlist_fileinfo(playlist, GPOINTER_TO_INT(list->data));
+        g_list_free(list);
+    }
+    else
+        aud_playlist_fileinfo_current(playlist);
+}
+
+static void
+show_playlist_save_error(GtkWindow *parent,
+                         const gchar *filename)
+{
+    GtkWidget *dialog;
+
+    g_return_if_fail(GTK_IS_WINDOW(parent));
+    g_return_if_fail(filename);
+
+    dialog = gtk_message_dialog_new(GTK_WINDOW(parent),
+                                    GTK_DIALOG_DESTROY_WITH_PARENT,
+                                    GTK_MESSAGE_ERROR,
+                                    GTK_BUTTONS_OK,
+                                    _("Error writing playlist \"%s\": %s"),
+                                    filename, strerror(errno));
+
+    gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); /* centering */
+    gtk_dialog_run(GTK_DIALOG(dialog));
+    gtk_widget_destroy(dialog);
+}
+
+static gboolean
+show_playlist_overwrite_prompt(GtkWindow * parent,
+                               const gchar * filename)
+{
+    GtkWidget *dialog;
+    gint result;
+
+    g_return_val_if_fail(GTK_IS_WINDOW(parent), FALSE);
+    g_return_val_if_fail(filename != NULL, FALSE);
+
+    dialog = gtk_message_dialog_new(GTK_WINDOW(parent),
+                                    GTK_DIALOG_DESTROY_WITH_PARENT,
+                                    GTK_MESSAGE_QUESTION,
+                                    GTK_BUTTONS_YES_NO,
+                                    _("%s already exist. Continue?"),
+                                    filename);
+
+    gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); /* centering */
+    result = gtk_dialog_run(GTK_DIALOG(dialog));
+    gtk_widget_destroy(dialog);
+
+    return (result == GTK_RESPONSE_YES);
+}
+
+static void
+show_playlist_save_format_error(GtkWindow * parent,
+                                const gchar * filename)
+{
+    const gchar *markup =
+        N_("<b><big>Unable to save playlist.</big></b>\n\n"
+           "Unknown file type for '%s'.\n");
+
+    GtkWidget *dialog;
+
+    g_return_if_fail(GTK_IS_WINDOW(parent));
+    g_return_if_fail(filename != NULL);
+
+    dialog =
+        gtk_message_dialog_new_with_markup(GTK_WINDOW(parent),
+                                           GTK_DIALOG_DESTROY_WITH_PARENT,
+                                           GTK_MESSAGE_ERROR,
+                                           GTK_BUTTONS_OK,
+                                           _(markup),
+                                           filename);
+
+    gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); /* centering */
+    gtk_dialog_run(GTK_DIALOG(dialog));
+    gtk_widget_destroy(dialog);
+}
+
+static void
+playlistwin_save_playlist(const gchar * filename)
+{
+    PlaylistContainer *plc;
+    gchar *ext = strrchr(filename, '.') + 1;
+
+    plc = aud_playlist_container_find(ext);
+    if (plc == NULL) {
+        show_playlist_save_format_error(GTK_WINDOW(playlistwin), filename);
+        return;
+    }
+
+    aud_str_replace_in(&aud_cfg->playlist_path, g_path_get_dirname(filename));
+
+    if (g_file_test(filename, G_FILE_TEST_IS_REGULAR))
+        if (!show_playlist_overwrite_prompt(GTK_WINDOW(playlistwin), filename))
+            return;
+
+    if (!aud_playlist_save(aud_playlist_get_active(), filename))
+        show_playlist_save_error(GTK_WINDOW(playlistwin), filename);
+}
+
+static void
+playlistwin_load_playlist(const gchar * filename)
+{
+    const gchar *title;
+    Playlist *playlist = aud_playlist_get_active();
+
+    g_return_if_fail(filename != NULL);
+
+    aud_str_replace_in(&aud_cfg->playlist_path, g_path_get_dirname(filename));
+
+    aud_playlist_clear(playlist);
+    mainwin_clear_song_info();
+
+    aud_playlist_load(playlist, filename);
+    title = aud_playlist_get_current_name(playlist);
+    if(!title || !title[0])
+        aud_playlist_set_current_name(playlist, filename);
+}
+
+static gchar *
+playlist_file_selection_load(const gchar * title,
+                        const gchar * default_filename)
+{
+    GtkWidget *dialog;
+    gchar *filename;
+
+    g_return_val_if_fail(title != NULL, NULL);
+
+    dialog = make_filebrowser(title, FALSE);
+    gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), aud_cfg->playlist_path);
+    if (default_filename)
+        gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), default_filename);
+    gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); /* centering */
+
+    if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
+        filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
+    else
+        filename = NULL;
+
+    gtk_widget_destroy(dialog);
+    return filename;
+}
+
+static void
+on_static_toggle(GtkToggleButton *button, gpointer data)
+{
+    Playlist *playlist = aud_playlist_get_active();
+
+    playlist->attribute =
+        gtk_toggle_button_get_active(button) ?
+        playlist->attribute | PLAYLIST_STATIC :
+        playlist->attribute & ~PLAYLIST_STATIC;
+}
+
+static void
+on_relative_toggle(GtkToggleButton *button, gpointer data)
+{
+    Playlist *playlist = aud_playlist_get_active();
+
+    playlist->attribute =
+        gtk_toggle_button_get_active(button) ?
+        playlist->attribute | PLAYLIST_USE_RELATIVE :
+        playlist->attribute & ~PLAYLIST_USE_RELATIVE;
+}
+
+static gchar *
+playlist_file_selection_save(const gchar * title,
+                        const gchar * default_filename)
+{
+    GtkWidget *dialog;
+    gchar *filename;
+    GtkWidget *hbox;
+    GtkWidget *toggle, *toggle2;
+
+    g_return_val_if_fail(title != NULL, NULL);
+
+    dialog = make_filebrowser(title, TRUE);
+    gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog), aud_cfg->playlist_path);
+    gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog), default_filename);
+
+    hbox = gtk_hbox_new(FALSE, 5);
+
+    /* static playlist */
+    toggle = gtk_check_button_new_with_label(_("Save as Static Playlist"));
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle),
+                                 (aud_playlist_get_active()->attribute & PLAYLIST_STATIC) ? TRUE : FALSE);
+    g_signal_connect(G_OBJECT(toggle), "toggled", G_CALLBACK(on_static_toggle), dialog);
+    gtk_box_pack_start(GTK_BOX(hbox), toggle, FALSE, FALSE, 0);
+
+    /* use relative path */
+    toggle2 = gtk_check_button_new_with_label(_("Use Relative Path"));
+    gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle2),
+                                 (aud_playlist_get_active()->attribute & PLAYLIST_USE_RELATIVE) ? TRUE : FALSE);
+    g_signal_connect(G_OBJECT(toggle2), "toggled", G_CALLBACK(on_relative_toggle), dialog);
+    gtk_box_pack_start(GTK_BOX(hbox), toggle2, FALSE, FALSE, 0);
+
+    gtk_widget_show_all(hbox);
+    gtk_file_chooser_set_extra_widget(GTK_FILE_CHOOSER(dialog), hbox);
+
+    if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT)
+        filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
+    else
+        filename = NULL;
+
+    gtk_widget_destroy(dialog);
+    return filename;
+}
+
+void
+playlistwin_select_playlist_to_load(const gchar * default_filename)
+{
+    gchar *filename =
+        playlist_file_selection_load(_("Load Playlist"), default_filename);
+
+    if (filename) {
+        playlistwin_load_playlist(filename);
+        g_free(filename);
+    }
+}
+
+static void
+playlistwin_select_playlist_to_save(const gchar * default_filename)
+{
+    gchar *dot = NULL, *basename = NULL;
+    gchar *filename =
+        playlist_file_selection_save(_("Save Playlist"), default_filename);
+
+    if (filename) {
+        /* Default extension */
+        basename = g_path_get_basename(filename);
+        dot = strrchr(basename, '.');
+        if( dot == NULL || dot == basename) {
+            gchar *oldname = filename;
+#ifdef HAVE_XSPF_PLAYLIST
+            filename = g_strconcat(oldname, ".xspf", NULL);
+#else
+            filename = g_strconcat(oldname, ".m3u", NULL);
+#endif
+            g_free(oldname);
+        }
+        g_free(basename);
+
+        playlistwin_save_playlist(filename);
+        g_free(filename);
+    }
+}
+
+#define REGION_L(x1,x2,y1,y2)                   \
+    (event->x >= (x1) && event->x < (x2) &&     \
+     event->y >= config.playlist_height - (y1) &&  \
+     event->y < config.playlist_height - (y2))
+
+#define REGION_R(x1,x2,y1,y2)                      \
+    (event->x >= playlistwin_get_width() - (x1) && \
+     event->x < playlistwin_get_width() - (x2) &&  \
+     event->y >= config.playlist_height - (y1) &&     \
+     event->y < config.playlist_height - (y2))
+
+static void
+playlistwin_scrolled(GtkWidget * widget,
+                     GdkEventScroll * event,
+                     gpointer callback_data)
+{
+    if (event->direction == GDK_SCROLL_DOWN)
+        playlistwin_scroll(config.scroll_pl_by);
+
+    if (event->direction == GDK_SCROLL_UP)
+        playlistwin_scroll(-config.scroll_pl_by);
+#if 0
+    g_cond_signal(cond_scan);
+#endif
+}
+
+static gboolean
+playlistwin_press(GtkWidget * widget,
+                  GdkEventButton * event,
+                  gpointer callback_data)
+{
+    gint xpos, ypos;
+    GtkRequisition req;
+
+    gtk_window_get_position(GTK_WINDOW(playlistwin), &xpos, &ypos);
+
+    if (event->button == 1 && !config.show_wm_decorations &&
+        ((!config.playlist_shaded &&
+          event->x > playlistwin_get_width() - 20 &&
+          event->y > config.playlist_height - 20) ||
+         (config.playlist_shaded &&
+          event->x >= playlistwin_get_width() - 31 &&
+          event->x < playlistwin_get_width() - 22))) {
+
+        if (event->type != GDK_2BUTTON_PRESS &&
+            event->type != GDK_3BUTTON_PRESS) {
+            playlistwin_resizing = TRUE;
+            playlistwin_resize_x = config.playlist_width - event->x;
+            playlistwin_resize_y = config.playlist_height - event->y;
+        }
+    }
+    else if (event->button == 1 && REGION_L(12, 37, 29, 11)) {
+        /* ADD button menu */
+        gtk_widget_size_request(playlistwin_pladd_menu, &req);
+        ui_manager_popup_menu_show(GTK_MENU(playlistwin_pladd_menu),
+                   xpos + 12,
+                   (ypos + playlistwin_get_height()) - 8 - req.height,
+                   event->button,
+                   event->time);
+    }
+    else if (event->button == 1 && REGION_L(41, 66, 29, 11)) {
+        /* SUB button menu */
+        gtk_widget_size_request(playlistwin_pldel_menu, &req);
+        ui_manager_popup_menu_show(GTK_MENU(playlistwin_pldel_menu),
+                   xpos + 40,
+                   (ypos + playlistwin_get_height()) - 8 - req.height,
+                   event->button,
+                   event->time);
+    }
+    else if (event->button == 1 && REGION_L(70, 95, 29, 11)) {
+        /* SEL button menu */
+        gtk_widget_size_request(playlistwin_plsel_menu, &req);
+        ui_manager_popup_menu_show(GTK_MENU(playlistwin_plsel_menu),
+                   xpos + 68,
+                   (ypos + playlistwin_get_height()) - 8 - req.height,
+                   event->button,
+                   event->time);
+    }
+    else if (event->button == 1 && REGION_L(99, 124, 29, 11)) {
+        /* MISC button menu */
+        gtk_widget_size_request(playlistwin_plsort_menu, &req);
+        ui_manager_popup_menu_show(GTK_MENU(playlistwin_plsort_menu),
+                   xpos + 100,
+                   (ypos + playlistwin_get_height()) - 8 - req.height,
+                   event->button,
+                   event->time);
+    }
+    else if (event->button == 1 && REGION_R(46, 23, 29, 11)) {
+        /* LIST button menu */
+        gtk_widget_size_request(playlistwin_pllist_menu, &req);
+        ui_manager_popup_menu_show(GTK_MENU(playlistwin_pllist_menu),
+                   xpos + playlistwin_get_width() - req.width - 12,
+                   (ypos + playlistwin_get_height()) - 8 - req.height,
+                   event->button,
+                   event->time);
+    }
+    else if (event->button == 1 && event->type == GDK_BUTTON_PRESS &&
+             (config.easy_move || event->y < 14))
+    {
+        return FALSE;
+    }
+    else if (event->button == 1 && event->type == GDK_2BUTTON_PRESS
+             && event->y < 14) {
+        /* double click on title bar */
+        playlistwin_shade_toggle();
+        if (dock_is_moving(GTK_WINDOW(playlistwin)))
+            dock_move_release(GTK_WINDOW(playlistwin));
+        return TRUE;
+    }
+    else if (event->button == 3) {
+        /*
+         * Pop up the main menu a few pixels down to avoid
+         * anything to be selected initially.
+         */
+        ui_manager_popup_menu_show(GTK_MENU(mainwin_general_menu), event->x_root,
+                                event->y_root + 2, 3, event->time);
+    }
+
+    return TRUE;
+}
+
+static gboolean
+playlistwin_delete(GtkWidget * w, gpointer data)
+{
+    playlistwin_hide();
+    return TRUE;
+}
+
+static gboolean
+playlistwin_keypress_up_down_handler(UiSkinnedPlaylist * pl,
+                                     gboolean up, guint state)
+{
+    Playlist *playlist = aud_playlist_get_active();
+    if ((!(pl->prev_selected || pl->first) && up) ||
+       ((pl->prev_selected >= aud_playlist_get_length(playlist) - 1) && !up))
+         return FALSE;
+
+    if ((state & GDK_MOD1_MASK) && (state & GDK_SHIFT_MASK))
+        return FALSE;
+    if (!(state & GDK_MOD1_MASK))
+        aud_playlist_select_all(playlist, FALSE);
+
+    if (pl->prev_selected == -1 ||
+        (!playlistwin_item_visible(pl->prev_selected) &&
+         !(state & GDK_SHIFT_MASK && pl->prev_min != -1))) {
+        pl->prev_selected = pl->first;
+    }
+    else if (state & GDK_SHIFT_MASK) {
+        if (pl->prev_min == -1) {
+            pl->prev_max = pl->prev_selected;
+            pl->prev_min = pl->prev_selected;
+        }
+        pl->prev_max += (up ? -1 : 1);
+        pl->prev_max =
+            CLAMP(pl->prev_max, 0, aud_playlist_get_length(playlist) - 1);
+
+        pl->first = MIN(pl->first, pl->prev_max);
+        pl->first = MAX(pl->first, pl->prev_max -
+                           pl->num_visible + 1);
+        aud_playlist_select_range(playlist, pl->prev_min, pl->prev_max, TRUE);
+        return TRUE;
+    }
+    else if (state & GDK_MOD1_MASK) {
+        if (up)
+            ui_skinned_playlist_move_up(pl);
+        else
+            ui_skinned_playlist_move_down(pl);
+        if (pl->prev_min < pl->first)
+            pl->first = pl->prev_min;
+        else if (pl->prev_max >= (pl->first + pl->num_visible))
+            pl->first = pl->prev_max - pl->num_visible + 1;
+        return TRUE;
+    }
+    else if (up)
+        pl->prev_selected--;
+    else
+        pl->prev_selected++;
+
+    pl->prev_selected =
+        CLAMP(pl->prev_selected, 0, aud_playlist_get_length(playlist) - 1);
+
+    if (pl->prev_selected < pl->first)
+        pl->first--;
+    else if (pl->prev_selected >= (pl->first + pl->num_visible))
+        pl->first++;
+
+    aud_playlist_select_range(playlist, pl->prev_selected, pl->prev_selected, TRUE);
+    pl->prev_min = -1;
+
+    return TRUE;
+}
+
+/* FIXME: Handle the keys through menu */
+
+static gboolean
+playlistwin_keypress(GtkWidget * w, GdkEventKey * event, gpointer data)
+{
+    g_return_val_if_fail(UI_SKINNED_IS_PLAYLIST(playlistwin_list), FALSE);
+    Playlist *playlist = aud_playlist_get_active();
+
+    guint keyval;
+    gboolean refresh = FALSE;
+    guint cur_pos;
+
+    if (config.playlist_shaded)
+        return FALSE;
+
+    switch (keyval = event->keyval) {
+    case GDK_KP_Up:
+    case GDK_KP_Down:
+    case GDK_Up:
+    case GDK_Down:
+        refresh = playlistwin_keypress_up_down_handler(UI_SKINNED_PLAYLIST(playlistwin_list),
+                                                       keyval == GDK_Up
+                                                       || keyval == GDK_KP_Up,
+                                                       event->state);
+        break;
+    case GDK_Page_Up:
+        playlistwin_scroll(-UI_SKINNED_PLAYLIST(playlistwin_list)->num_visible);
+        refresh = TRUE;
+        break;
+    case GDK_Page_Down:
+        playlistwin_scroll(UI_SKINNED_PLAYLIST(playlistwin_list)->num_visible);
+        refresh = TRUE;
+        break;
+    case GDK_Home:
+        UI_SKINNED_PLAYLIST(playlistwin_list)->first = 0;
+        refresh = TRUE;
+        break;
+    case GDK_End:
+        UI_SKINNED_PLAYLIST(playlistwin_list)->first =
+            aud_playlist_get_length(playlist) - UI_SKINNED_PLAYLIST(playlistwin_list)->num_visible;
+        refresh = TRUE;
+        break;
+    case GDK_Return:
+        if (UI_SKINNED_PLAYLIST(playlistwin_list)->prev_selected > -1
+            && playlistwin_item_visible(UI_SKINNED_PLAYLIST(playlistwin_list)->prev_selected)) {
+            aud_playlist_set_position(playlist, UI_SKINNED_PLAYLIST(playlistwin_list)->prev_selected);
+            if (!audacious_drct_get_playing())
+                audacious_drct_initiate();
+        }
+        refresh = TRUE;
+        break;
+    case GDK_3:
+        if (event->state & GDK_CONTROL_MASK)
+            playlistwin_fileinfo();
+        break;
+    case GDK_Delete:
+        if (event->state & GDK_CONTROL_MASK)
+            aud_playlist_delete(playlist, TRUE);
+        else
+            aud_playlist_delete(playlist, FALSE);
+        break;
+    case GDK_Insert:
+        if (event->state & GDK_MOD1_MASK)
+            mainwin_show_add_url_window();
+        else
+            playlistwin_show_filebrowser();
+        break;
+    case GDK_Left:
+    case GDK_KP_Left:
+    case GDK_KP_7:
+        if (aud_playlist_get_current_length(playlist) != -1)
+            audacious_drct_seek(CLAMP
+                              (audacious_drct_get_time() - 5000, 0,
+                              aud_playlist_get_current_length(playlist)));
+        break;
+    case GDK_Right:
+    case GDK_KP_Right:
+    case GDK_KP_9:
+        if (aud_playlist_get_current_length(playlist) != -1)
+            audacious_drct_seek(CLAMP
+                              (audacious_drct_get_time() + 5000, 0,
+                              aud_playlist_get_current_length(playlist)));
+        break;
+    case GDK_KP_4:
+        aud_playlist_prev(playlist);
+        break;
+    case GDK_KP_6:
+        aud_playlist_next(playlist);
+        break;
+
+    case GDK_Escape:
+        mainwin_minimize_cb();
+        break;
+    case GDK_Tab:
+        if (event->state & GDK_CONTROL_MASK) {
+            if (config.player_visible)
+                gtk_window_present(GTK_WINDOW(mainwin));
+            else if (config.equalizer_visible)
+                gtk_window_present(GTK_WINDOW(equalizerwin));
+        }
+        break;
+    case GDK_space:
+        cur_pos=aud_playlist_get_position(playlist);
+        UI_SKINNED_PLAYLIST(playlistwin_list)->first =
+            cur_pos - (UI_SKINNED_PLAYLIST(playlistwin_list)->num_visible >> 1);
+        refresh = TRUE;
+        break;
+    default:
+        return FALSE;
+    }
+#if 0
+    if (refresh) {
+        g_cond_signal(cond_scan);
+        playlistwin_update_list(aud_playlist_get_active());
+    }
+#endif
+    return TRUE;
+}
+
+void
+playlistwin_hide_timer(void)
+{
+    ui_skinned_textbox_set_text(playlistwin_time_min, "   ");
+    ui_skinned_textbox_set_text(playlistwin_time_sec, "  ");
+}
+
+void
+playlistwin_set_time(gint time, gint length, TimerMode mode)
+{
+    gchar *text, sign;
+
+    if (mode == TIMER_REMAINING && length != -1) {
+        time = length - time;
+        sign = '-';
+    }
+    else
+        sign = ' ';
+
+    time /= 1000;
+
+    if (time < 0)
+        time = 0;
+    if (time > 99 * 60)
+        time /= 60;
+
+    text = g_strdup_printf("%c%-2.2d", sign, time / 60);
+    ui_skinned_textbox_set_text(playlistwin_time_min, text);
+    g_free(text);
+
+    text = g_strdup_printf("%-2.2d", time % 60);
+    ui_skinned_textbox_set_text(playlistwin_time_sec, text);
+    g_free(text);
+}
+
+static void
+playlistwin_drag_motion(GtkWidget * widget,
+                        GdkDragContext * context,
+                        gint x, gint y,
+                        GtkSelectionData * selection_data,
+                        guint info, guint time, gpointer user_data)
+{
+    if (UI_SKINNED_IS_PLAYLIST(playlistwin_list)) {
+        UI_SKINNED_PLAYLIST(playlistwin_list)->drag_motion = TRUE;
+        UI_SKINNED_PLAYLIST(playlistwin_list)->drag_motion_x = x;
+        UI_SKINNED_PLAYLIST(playlistwin_list)->drag_motion_y = y;
+    }
+    playlistwin_update_list(aud_playlist_get_active());
+    playlistwin_hint_flag = TRUE;
+}
+
+static void
+playlistwin_drag_end(GtkWidget * widget,
+                     GdkDragContext * context, gpointer user_data)
+{
+    if (UI_SKINNED_IS_PLAYLIST(playlistwin_list))
+        UI_SKINNED_PLAYLIST(playlistwin_list)->drag_motion = FALSE;
+    playlistwin_hint_flag = FALSE;
+    playlistwin_update_list(aud_playlist_get_active());
+}
+
+static void
+playlistwin_drag_data_received(GtkWidget * widget,
+                               GdkDragContext * context,
+                               gint x, gint y,
+                               GtkSelectionData *
+                               selection_data, guint info,
+                               guint time, gpointer user_data)
+{
+    gint pos;
+    Playlist *playlist = aud_playlist_get_active();
+
+    g_return_if_fail(selection_data);
+
+    if (!selection_data->data) {
+        g_message("Received no DND data!");
+        return;
+    }
+    if (UI_SKINNED_IS_PLAYLIST(playlistwin_list) &&
+        (x < playlistwin_get_width() - 20 || y < config.playlist_height - 38)) {
+        pos = y / UI_SKINNED_PLAYLIST(playlistwin_list)->fheight + UI_SKINNED_PLAYLIST(playlistwin_list)->first;
+
+        pos = MIN(pos, aud_playlist_get_length(playlist));
+        aud_playlist_ins_url(playlist, (gchar *) selection_data->data, pos);
+    }
+    else
+        aud_playlist_add_url(playlist, (gchar *) selection_data->data);
+}
+
+static void
+local_playlist_prev(void)
+{
+    aud_playlist_prev(aud_playlist_get_active());
+}
+
+static void
+local_playlist_next(void)
+{
+    aud_playlist_next(aud_playlist_get_active());
+}
+
+static void
+playlistwin_create_widgets(void)
+{
+    /* This function creates the custom widgets used by the playlist editor */
+
+    /* text box for displaying song title in shaded mode */
+    playlistwin_sinfo = ui_skinned_textbox_new(SKINNED_WINDOW(playlistwin)->fixed,
+                                               4, 4, playlistwin_get_width() - 35, TRUE, SKIN_TEXT);
+
+    playlistwin_set_sinfo_font(config.playlist_font);
+
+    playlistwin_shade = ui_skinned_button_new();
+    /* shade/unshade window push button */
+    if (config.playlist_shaded)
+        ui_skinned_push_button_setup(playlistwin_shade, SKINNED_WINDOW(playlistwin)->fixed,
+                                     playlistwin_get_width() - 21, 3,
+                                     9, 9, 128, 45, 150, 42, SKIN_PLEDIT);
+    else
+        ui_skinned_push_button_setup(playlistwin_shade, SKINNED_WINDOW(playlistwin)->fixed,
+                                     playlistwin_get_width() - 21, 3,
+                                     9, 9, 157, 3, 62, 42, SKIN_PLEDIT);
+
+    g_signal_connect(playlistwin_shade, "clicked", playlistwin_shade_toggle, NULL );
+
+    /* close window push button */
+    playlistwin_close = ui_skinned_button_new();
+    ui_skinned_push_button_setup(playlistwin_close, SKINNED_WINDOW(playlistwin)->fixed,
+                                 playlistwin_get_width() - 11, 3, 9, 9,
+                                 config.playlist_shaded ? 138 : 167,
+                                 config.playlist_shaded ? 45 : 3, 52, 42, SKIN_PLEDIT);
+
+    g_signal_connect(playlistwin_close, "clicked", playlistwin_hide, NULL );
+
+    /* playlist list box */
+    playlistwin_list = ui_skinned_playlist_new(SKINNED_WINDOW(playlistwin)->fixed, 12, 20,
+                             playlistwin_get_width() - 31,
+                             config.playlist_height - 58);
+    ui_skinned_playlist_set_font(config.playlist_font);
+
+    /* playlist list box slider */
+    playlistwin_slider = ui_skinned_playlist_slider_new(SKINNED_WINDOW(playlistwin)->fixed, playlistwin_get_width() - 15,
+                              20, config.playlist_height - 58);
+
+    /* track time (minute) */
+    playlistwin_time_min = ui_skinned_textbox_new(SKINNED_WINDOW(playlistwin)->fixed,
+                       playlistwin_get_width() - 82,
+                       config.playlist_height - 15, 15, FALSE, SKIN_TEXT);
+    g_signal_connect(playlistwin_time_min, "button-press-event", G_CALLBACK(change_timer_mode_cb), NULL);
+
+    /* track time (second) */
+    playlistwin_time_sec = ui_skinned_textbox_new(SKINNED_WINDOW(playlistwin)->fixed,
+                       playlistwin_get_width() - 64,
+                       config.playlist_height - 15, 10, FALSE, SKIN_TEXT);
+    g_signal_connect(playlistwin_time_sec, "button-press-event", G_CALLBACK(change_timer_mode_cb), NULL);
+
+    /* playlist information (current track length / total track length) */
+    playlistwin_info = ui_skinned_textbox_new(SKINNED_WINDOW(playlistwin)->fixed,
+                       playlistwin_get_width() - 143,
+                       config.playlist_height - 28, 90, FALSE, SKIN_TEXT);
+
+    /* mini play control buttons at right bottom corner */
+
+    /* rewind button */
+    playlistwin_srew = ui_skinned_button_new();
+    ui_skinned_small_button_setup(playlistwin_srew, SKINNED_WINDOW(playlistwin)->fixed,
+                                  playlistwin_get_width() - 144,
+                                  config.playlist_height - 16, 8, 7);
+    g_signal_connect(playlistwin_srew, "clicked", local_playlist_prev, NULL);
+
+    /* play button */
+    playlistwin_splay = ui_skinned_button_new();
+    ui_skinned_small_button_setup(playlistwin_splay, SKINNED_WINDOW(playlistwin)->fixed,
+                                  playlistwin_get_width() - 138,
+                                  config.playlist_height - 16, 10, 7);
+    g_signal_connect(playlistwin_splay, "clicked", mainwin_play_pushed, NULL);
+
+    /* pause button */
+    playlistwin_spause = ui_skinned_button_new();
+    ui_skinned_small_button_setup(playlistwin_spause, SKINNED_WINDOW(playlistwin)->fixed,
+                                  playlistwin_get_width() - 128,
+                                  config.playlist_height - 16, 10, 7);
+    g_signal_connect(playlistwin_spause, "clicked", audacious_drct_pause, NULL);
+
+    /* stop button */
+    playlistwin_sstop = ui_skinned_button_new();
+    ui_skinned_small_button_setup(playlistwin_sstop, SKINNED_WINDOW(playlistwin)->fixed,
+                                  playlistwin_get_width() - 118,
+                                  config.playlist_height - 16, 9, 7);
+    g_signal_connect(playlistwin_sstop, "clicked", mainwin_stop_pushed, NULL);
+
+    /* forward button */
+    playlistwin_sfwd = ui_skinned_button_new();
+    ui_skinned_small_button_setup(playlistwin_sfwd, SKINNED_WINDOW(playlistwin)->fixed,
+                                  playlistwin_get_width() - 109,
+                                  config.playlist_height - 16, 8, 7);
+    g_signal_connect(playlistwin_sfwd, "clicked", local_playlist_next, NULL);
+
+    /* eject button */
+    playlistwin_seject = ui_skinned_button_new();
+    ui_skinned_small_button_setup(playlistwin_seject, SKINNED_WINDOW(playlistwin)->fixed,
+                                  playlistwin_get_width() - 100,
+                                  config.playlist_height - 16, 9, 7);
+    g_signal_connect(playlistwin_seject, "clicked", mainwin_eject_pushed, NULL);
+
+    playlistwin_sscroll_up = ui_skinned_button_new();
+    ui_skinned_small_button_setup(playlistwin_sscroll_up, SKINNED_WINDOW(playlistwin)->fixed,
+                                  playlistwin_get_width() - 14,
+                                  config.playlist_height - 35, 8, 5);
+    g_signal_connect(playlistwin_sscroll_up, "clicked", playlistwin_scroll_up_pushed, NULL);
+
+    playlistwin_sscroll_down = ui_skinned_button_new();
+    ui_skinned_small_button_setup(playlistwin_sscroll_down, SKINNED_WINDOW(playlistwin)->fixed,
+                                  playlistwin_get_width() - 14,
+                                  config.playlist_height - 30, 8, 5);
+    g_signal_connect(playlistwin_sscroll_down, "clicked", playlistwin_scroll_down_pushed, NULL);
+
+    ui_playlist_evlistener_init();
+}
+
+static void
+selection_received(GtkWidget * widget,
+                   GtkSelectionData * selection_data, gpointer data)
+{
+    if (selection_data->type == GDK_SELECTION_TYPE_STRING &&
+        selection_data->length > 0)
+        aud_playlist_add_url(aud_playlist_get_active(), (gchar *) selection_data->data);
+}
+
+static void
+playlistwin_create_window(void)
+{
+    GdkPixbuf *icon;
+
+    playlistwin = ui_skinned_window_new("playlist");
+    gtk_window_set_title(GTK_WINDOW(playlistwin), _("Audacious Playlist Editor"));
+    gtk_window_set_role(GTK_WINDOW(playlistwin), "playlist");
+    gtk_window_set_default_size(GTK_WINDOW(playlistwin),
+                                playlistwin_get_width(),
+                                playlistwin_get_height());
+    gtk_window_set_resizable(GTK_WINDOW(playlistwin), TRUE);
+    playlistwin_set_geometry_hints(config.playlist_shaded);
+
+    gtk_window_set_transient_for(GTK_WINDOW(playlistwin),
+                                 GTK_WINDOW(mainwin));
+    gtk_window_set_skip_taskbar_hint(GTK_WINDOW(playlistwin), TRUE);
+
+    icon = gdk_pixbuf_new_from_xpm_data((const gchar **) audacious_playlist_icon);
+    gtk_window_set_icon(GTK_WINDOW(playlistwin), icon);
+    g_object_unref(icon);
+
+    if (config.playlist_x != -1 && config.save_window_position)
+        gtk_window_move(GTK_WINDOW(playlistwin),
+                        config.playlist_x, config.playlist_y);
+
+    gtk_widget_add_events(playlistwin, GDK_POINTER_MOTION_MASK |
+                          GDK_FOCUS_CHANGE_MASK | GDK_BUTTON_MOTION_MASK |
+                          GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
+                          GDK_SCROLL_MASK | GDK_VISIBILITY_NOTIFY_MASK);
+    gtk_widget_realize(playlistwin);
+
+    g_signal_connect(playlistwin, "delete_event",
+                     G_CALLBACK(playlistwin_delete), NULL);
+    g_signal_connect(playlistwin, "button_press_event",
+                     G_CALLBACK(playlistwin_press), NULL);
+    g_signal_connect(playlistwin, "button_release_event",
+                     G_CALLBACK(playlistwin_release), NULL);
+    g_signal_connect(playlistwin, "scroll_event",
+                     G_CALLBACK(playlistwin_scrolled), NULL);
+    g_signal_connect(playlistwin, "motion_notify_event",
+                     G_CALLBACK(playlistwin_motion), NULL);
+
+    aud_drag_dest_set(playlistwin);
+
+    /* DnD stuff */
+    g_signal_connect(playlistwin, "drag-leave",
+                     G_CALLBACK(playlistwin_drag_end), NULL);
+    g_signal_connect(playlistwin, "drag-data-delete",
+                     G_CALLBACK(playlistwin_drag_end), NULL);
+    g_signal_connect(playlistwin, "drag-end",
+                     G_CALLBACK(playlistwin_drag_end), NULL);
+    g_signal_connect(playlistwin, "drag-drop",
+                     G_CALLBACK(playlistwin_drag_end), NULL);
+    g_signal_connect(playlistwin, "drag-data-received",
+                     G_CALLBACK(playlistwin_drag_data_received), NULL);
+    g_signal_connect(playlistwin, "drag-motion",
+                     G_CALLBACK(playlistwin_drag_motion), NULL);
+
+    g_signal_connect(playlistwin, "key_press_event",
+                     G_CALLBACK(playlistwin_keypress), NULL);
+    g_signal_connect(playlistwin, "selection_received",
+                     G_CALLBACK(selection_received), NULL);
+}
+
+void
+playlistwin_create(void)
+{
+    resize_mutex = g_mutex_new();
+    playlistwin_create_window();
+
+    playlistwin_create_widgets();
+    playlistwin_update_info(aud_playlist_get_active());
+
+    gtk_window_add_accel_group(GTK_WINDOW(playlistwin), ui_manager_get_accel_group());
+}
+
+
+void
+playlistwin_show(void)
+{
+    gtk_window_move(GTK_WINDOW(playlistwin), config.playlist_x, config.playlist_y);
+    GtkAction *action = gtk_action_group_get_action(
+      toggleaction_group_others , "show playlist editor" );
+    gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(action) , TRUE );
+
+    config.playlist_visible = TRUE;
+    ui_skinned_button_set_inside(mainwin_pl, TRUE);
+
+    playlistwin_set_toprow(0);
+    aud_playlist_check_pos_current(aud_playlist_get_active());
+
+    gtk_widget_show_all(playlistwin);
+    if (!config.playlist_shaded)
+        gtk_widget_hide(playlistwin_sinfo);
+    gtk_window_present(GTK_WINDOW(playlistwin));
+}
+
+void
+playlistwin_hide(void)
+{
+    GtkAction *action = gtk_action_group_get_action(
+      toggleaction_group_others , "show playlist editor" );
+    gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(action) , FALSE );
+
+    gtk_widget_hide(playlistwin);
+    config.playlist_visible = FALSE;
+    ui_skinned_button_set_inside(mainwin_pl, FALSE);
+
+    if ( config.player_visible )
+    {
+      gtk_window_present(GTK_WINDOW(mainwin));
+      gtk_widget_grab_focus(mainwin);
+    }
+}
+
+void action_playlist_track_info(void)
+{
+    playlistwin_fileinfo();
+}
+
+void action_queue_toggle(void)
+{
+    aud_playlist_queue(aud_playlist_get_active());
+}
+
+void action_playlist_sort_by_playlist_entry(void)
+{
+    Playlist *playlist = aud_playlist_get_active();
+
+    aud_playlist_sort(playlist, PLAYLIST_SORT_PLAYLIST);
+    playlistwin_update_list(playlist);
+}
+
+void action_playlist_sort_by_track_number(void)
+{
+    Playlist *playlist = aud_playlist_get_active();
+
+    aud_playlist_sort(playlist, PLAYLIST_SORT_TRACK);
+    playlistwin_update_list(playlist);
+}
+
+void action_playlist_sort_by_title(void)
+{
+    Playlist *playlist = aud_playlist_get_active();
+
+    aud_playlist_sort(playlist, PLAYLIST_SORT_TITLE);
+    playlistwin_update_list(playlist);
+}
+
+void action_playlist_sort_by_artist(void)
+{
+    Playlist *playlist = aud_playlist_get_active();
+
+    aud_playlist_sort(playlist, PLAYLIST_SORT_ARTIST);
+    playlistwin_update_list(playlist);
+}
+
+void action_playlist_sort_by_full_path(void)
+{
+    Playlist *playlist = aud_playlist_get_active();
+
+    aud_playlist_sort(playlist, PLAYLIST_SORT_PATH);
+    playlistwin_update_list(playlist);
+}
+
+void action_playlist_sort_by_date(void)
+{
+    Playlist *playlist = aud_playlist_get_active();
+
+    aud_playlist_sort(playlist, PLAYLIST_SORT_DATE);
+    playlistwin_update_list(playlist);
+}
+
+void action_playlist_sort_by_filename(void)
+{
+    Playlist *playlist = aud_playlist_get_active();
+
+    aud_playlist_sort(playlist, PLAYLIST_SORT_FILENAME);
+    playlistwin_update_list(playlist);
+}
+
+void action_playlist_sort_selected_by_playlist_entry(void)
+{
+    Playlist *playlist = aud_playlist_get_active();
+
+    aud_playlist_sort_selected(playlist, PLAYLIST_SORT_PLAYLIST);
+    playlistwin_update_list(playlist);
+}
+
+void action_playlist_sort_selected_by_track_number(void)
+{
+    Playlist *playlist = aud_playlist_get_active();
+
+    aud_playlist_sort_selected(playlist, PLAYLIST_SORT_TRACK);
+    playlistwin_update_list(playlist);
+}
+
+void action_playlist_sort_selected_by_title(void)
+{
+    Playlist *playlist = aud_playlist_get_active();
+
+    aud_playlist_sort_selected(playlist, PLAYLIST_SORT_TITLE);
+    playlistwin_update_list(playlist);
+}
+
+void action_playlist_sort_selected_by_artist(void)
+{
+    Playlist *playlist = aud_playlist_get_active();
+
+    aud_playlist_sort_selected(playlist, PLAYLIST_SORT_ARTIST);
+    playlistwin_update_list(playlist);
+}
+
+void action_playlist_sort_selected_by_full_path(void)
+{
+    Playlist *playlist = aud_playlist_get_active();
+
+    aud_playlist_sort_selected(playlist, PLAYLIST_SORT_PATH);
+    playlistwin_update_list(playlist);
+}
+
+void action_playlist_sort_selected_by_date(void)
+{
+    Playlist *playlist = aud_playlist_get_active();
+
+    aud_playlist_sort_selected(playlist, PLAYLIST_SORT_DATE);
+    playlistwin_update_list(playlist);
+}
+
+void action_playlist_sort_selected_by_filename(void)
+{
+    Playlist *playlist = aud_playlist_get_active();
+
+    aud_playlist_sort_selected(playlist, PLAYLIST_SORT_FILENAME);
+    playlistwin_update_list(playlist);
+}
+
+void action_playlist_randomize_list(void)
+{
+    Playlist *playlist = aud_playlist_get_active();
+
+    aud_playlist_random(playlist);
+    playlistwin_update_list(playlist);
+}
+
+void action_playlist_reverse_list(void)
+{
+    Playlist *playlist = aud_playlist_get_active();
+
+    aud_playlist_reverse(playlist);
+    playlistwin_update_list(playlist);
+}
+
+void
+action_playlist_clear_queue(void)
+{
+    aud_playlist_clear_queue(aud_playlist_get_active());
+}
+
+void
+action_playlist_remove_unavailable(void)
+{
+    aud_playlist_remove_dead_files(aud_playlist_get_active());
+}
+
+void
+action_playlist_remove_dupes_by_title(void)
+{
+    aud_playlist_remove_duplicates(aud_playlist_get_active(), PLAYLIST_DUPS_TITLE);
+}
+
+void
+action_playlist_remove_dupes_by_filename(void)
+{
+    aud_playlist_remove_duplicates(aud_playlist_get_active(), PLAYLIST_DUPS_FILENAME);
+}
+
+void
+action_playlist_remove_dupes_by_full_path(void)
+{
+    aud_playlist_remove_duplicates(aud_playlist_get_active(), PLAYLIST_DUPS_PATH);
+}
+
+void
+action_playlist_remove_all(void)
+{
+    aud_playlist_clear(aud_playlist_get_active());
+
+    /* XXX -- should this really be coupled here? -nenolod */
+    mainwin_clear_song_info();
+}
+
+void
+action_playlist_remove_selected(void)
+{
+    aud_playlist_delete(aud_playlist_get_active(), FALSE);
+}
+
+void
+action_playlist_remove_unselected(void)
+{
+    aud_playlist_delete(aud_playlist_get_active(), TRUE);
+}
+
+void
+action_playlist_add_files(void)
+{
+    gboolean button = FALSE; /* FALSE = NO_PLAY_BUTTON */
+    aud_hook_call("filebrowser show", &button);
+}
+
+void
+action_playlist_add_url(void)
+{
+    mainwin_show_add_url_window();
+}
+
+void
+action_playlist_new( void )
+{
+  Playlist *new_pl = aud_playlist_new();
+  aud_playlist_add_playlist(new_pl);
+  aud_playlist_select_playlist(new_pl);
+}
+
+void
+action_playlist_prev( void )
+{
+    aud_playlist_select_prev();
+}
+
+void
+action_playlist_next( void )
+{
+    aud_playlist_select_next();
+}
+
+void
+action_playlist_delete( void )
+{
+    aud_playlist_remove_playlist( aud_playlist_get_active() );
+}
+
+void
+action_playlist_save_list(void)
+{
+    Playlist *playlist = aud_playlist_get_active();
+
+    playlistwin_select_playlist_to_save(aud_playlist_get_current_name(playlist));
+}
+
+void
+action_playlist_save_default_list(void)
+{
+#if 0
+    Playlist *playlist = aud_playlist_get_active();
+
+    aud_playlist_save(playlist, aud_paths[BMP_PATH_PLAYLIST_FILE]);
+#endif
+}
+
+void
+action_playlist_load_list(void)
+{
+    Playlist *playlist = aud_playlist_get_active();
+
+    playlistwin_select_playlist_to_load(aud_playlist_get_current_name(playlist));
+}
+
+void
+action_playlist_refresh_list(void)
+{
+    Playlist *playlist = aud_playlist_get_active();
+
+    aud_playlist_read_info_selection(playlist);
+    playlistwin_update_list(playlist);
+}
+
+void
+action_open_list_manager(void)
+{
+#if 0
+    playlist_manager_ui_show();
+#endif
+}
+
+void
+action_playlist_search_and_select(void)
+{
+    playlistwin_select_search();
+}
+
+void
+action_playlist_invert_selection(void)
+{
+    playlistwin_inverse_selection();
+}
+
+void
+action_playlist_select_none(void)
+{
+    playlistwin_select_none();
+}
+
+void
+action_playlist_select_all(void)
+{
+    playlistwin_select_all();
+}
+
+
+static void
+playlistwin_select_search_cbt_cb(GtkWidget *called_cbt, gpointer other_cbt)
+{
+    if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(called_cbt)) == TRUE)
+        gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(other_cbt), FALSE);
+    return;
+}
+
+static gboolean
+playlistwin_select_search_kp_cb(GtkWidget *entry, GdkEventKey *event,
+                                gpointer searchdlg_win)
+{
+    switch (event->keyval)
+    {
+        case GDK_Return:
+            if (gtk_im_context_filter_keypress (GTK_ENTRY (entry)->im_context, event)) {
+                GTK_ENTRY (entry)->need_im_reset = TRUE;
+                return TRUE;
+            } else {
+                gtk_dialog_response(GTK_DIALOG(searchdlg_win), GTK_RESPONSE_ACCEPT);
+                return TRUE;
+            }
+        default:
+            return FALSE;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_playlist.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,81 @@
+/*  BMP - Cross-platform multimedia player
+ *  Copyright (C) 2003-2004  BMP development team.
+ *
+ *  Based on XMMS:
+ *  Copyright (C) 1998-2003  XMMS development team.
+ *
+ *  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; under version 3 of the License.
+ *
+ *  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, see <http://www.gnu.org/licenses>.
+ *
+ *  The Audacious team does not consider modular code linking to
+ *  Audacious or using our public API to be a derived work.
+ */
+
+#ifndef AUDACIOUS_UI_PLAYLIST_H
+#define AUDACIOUS_UI_PLAYLIST_H
+
+#include <glib.h>
+
+#include "ui_main.h"
+#include <audacious/plugin.h>
+#include "skins_cfg.h"
+
+#define PLAYLISTWIN_FRAME_TOP_HEIGHT    20
+#define PLAYLISTWIN_FRAME_BOTTOM_HEIGHT 38
+#define PLAYLISTWIN_FRAME_LEFT_WIDTH    12
+#define PLAYLISTWIN_FRAME_RIGHT_WIDTH   19
+
+#define PLAYLISTWIN_MIN_WIDTH           MAINWIN_WIDTH
+#define PLAYLISTWIN_MIN_HEIGHT          MAINWIN_HEIGHT
+#define PLAYLISTWIN_WIDTH_SNAP          25
+#define PLAYLISTWIN_HEIGHT_SNAP         29
+#define PLAYLISTWIN_SHADED_HEIGHT       MAINWIN_SHADED_HEIGHT
+#define PLAYLISTWIN_WIDTH               config.playlist_width
+#define PLAYLISTWIN_HEIGHT \
+    (config.playlist_shaded ? PLAYLISTWIN_SHADED_HEIGHT : config.playlist_height)
+
+#define PLAYLISTWIN_DEFAULT_WIDTH       275
+#define PLAYLISTWIN_DEFAULT_HEIGHT      232
+#define PLAYLISTWIN_DEFAULT_POS_X       295
+#define PLAYLISTWIN_DEFAULT_POS_Y       20
+
+#define PLAYLISTWIN_DEFAULT_FONT        "Sans Bold 8"
+
+gboolean playlistwin_is_shaded(void);
+gint playlistwin_get_width(void);
+gint playlistwin_get_height(void);
+void playlistwin_update_list(Playlist *playlist);
+gboolean playlistwin_item_visible(gint index);
+gint playlistwin_get_toprow(void);
+void playlistwin_set_toprow(gint top);
+void playlistwin_set_shade_menu_cb(gboolean shaded);
+void playlistwin_set_shade(gboolean shaded);
+void playlistwin_shade_toggle(void);
+void playlistwin_create(void);
+void playlistwin_hide_timer(void);
+void playlistwin_set_time(gint time, gint length, TimerMode mode);
+void playlistwin_show(void);
+void playlistwin_hide(void);
+void playlistwin_scroll(gint num);
+void playlistwin_scroll_up_pushed(void);
+void playlistwin_scroll_down_pushed(void);
+void playlistwin_select_playlist_to_load(const gchar * default_filename);
+void playlistwin_set_sinfo_font(gchar *font);
+void playlistwin_set_sinfo_scroll(gboolean scroll);
+gint playlistwin_list_get_visible_count(void);
+gint playlistwin_list_get_first(void);
+
+extern GtkWidget *playlistwin;
+
+extern gboolean playlistwin_focus;
+
+#endif /* AUDACIOUS_UI_PLAYLIST_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_playlist_evlisteners.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,64 @@
+/*
+ * Audacious
+ * Copyright (c) 2006-2007 Audacious development team.
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+#include "ui_playlist_evlisteners.h"
+
+#include <glib.h>
+#if 0
+#include "hook.h"
+#include "playlist.h"
+#endif
+#include "ui_playlist.h"
+#if 0
+#include "ui_playlist_manager.h"
+#endif
+static void
+ui_playlist_evlistener_playlist_update(gpointer hook_data, gpointer user_data)
+{
+    Playlist *playlist = (Playlist *) hook_data;
+    if (playlist != NULL)
+        playlistwin_update_list(playlist);
+#if 0
+    playlist_manager_update();
+#endif
+}
+
+static void
+ui_playlist_evlistener_playlistwin_show(gpointer hook_data, gpointer user_data)
+{
+    gboolean *show = (gboolean*)hook_data;
+    if (*show == TRUE)
+        playlistwin_show();
+    else
+        playlistwin_hide();
+}
+
+void ui_playlist_evlistener_init(void)
+{
+    aud_hook_associate("playlist update", ui_playlist_evlistener_playlist_update, NULL);
+    aud_hook_associate("playlistwin show", ui_playlist_evlistener_playlistwin_show, NULL);
+}
+
+void ui_playlist_evlistener_dissociate(void)
+{
+    aud_hook_dissociate("playlist update", ui_playlist_evlistener_playlist_update);
+    aud_hook_dissociate("playlistwin show", ui_playlist_evlistener_playlistwin_show);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_playlist_evlisteners.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,27 @@
+/*
+ * Audacious
+ * Copyright (c) 2006-2007 Audacious development team.
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+#ifndef AUDACIOUS_UI_PLAYLIST_EVLISTENERS_H
+#define AUDACIOUS_UI_PLAYLIST_EVLISTENERS_H
+
+void ui_playlist_evlistener_init(void);
+void ui_playlist_evlistener_dissociate(void);
+
+#endif /* AUDACIOUS_UI_PLAYLIST_EVLISTENERS_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_skin.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,2054 @@
+/*  Audacious
+ *  Copyright (C) 2005-2007  Audacious development team.
+ *
+ *  BMP - Cross-platform multimedia player
+ *  Copyright (C) 2003-2004  BMP development team.
+ *
+ *  Based on XMMS:
+ *  Copyright (C) 1998-2003  XMMS development team.
+ *
+ *  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; under version 3 of the License.
+ *
+ *  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, see <http://www.gnu.org/licenses>.
+ *
+ *  The Audacious team does not consider modular code linking to
+ *  Audacious or using our public API to be a derived work.
+ */
+
+/*#define AUD_DEBUG*/
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+/* TODO: enforce default sizes! */
+
+#include <glib.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include "plugin.h"
+
+#include <audacious/plugin.h>
+#include "ui_skin.h"
+#include "util.h"
+#include "ui_main.h"
+#include "ui_equalizer.h"
+#include "ui_playlist.h"
+#include "ui_skinselector.h"
+#include "debug.h"
+
+#include "platform/smartinclude.h"
+
+#include "ui_skinned_window.h"
+#include "ui_skinned_button.h"
+#include "ui_skinned_number.h"
+#include "ui_skinned_horizontal_slider.h"
+#include "ui_skinned_playstatus.h"
+
+#define EXTENSION_TARGETS 7
+
+static gchar *ext_targets[EXTENSION_TARGETS] =
+{ "bmp", "xpm", "png", "svg", "gif", "jpg", "jpeg" };
+
+struct _SkinPixmapIdMapping {
+    SkinPixmapId id;
+    const gchar *name;
+    const gchar *alt_name;
+    gint width, height;
+};
+
+struct _SkinMaskInfo {
+    gint width, height;
+    gchar *inistr;
+};
+/* I know, it's not nice to copy'n'paste stuff, but I wanted it to
+   be atleast parially working, before dealing with such things */
+
+typedef struct {
+    const gchar *to_match;
+    gchar *match;
+    gboolean found;
+} FindFileContext;
+
+typedef struct _SkinPixmapIdMapping SkinPixmapIdMapping;
+typedef struct _SkinMaskInfo SkinMaskInfo;
+
+
+Skin *aud_active_skin = NULL;
+
+static gint skin_current_num;
+
+static SkinMaskInfo skin_mask_info[] = {
+    {275, 116, "Normal"},
+    {275, 16,  "WindowShade"},
+    {275, 116, "Equalizer"},
+    {275, 16,  "EqualizerWS"}
+};
+
+static SkinPixmapIdMapping skin_pixmap_id_map[] = {
+    {SKIN_MAIN, "main", NULL, 0, 0},
+    {SKIN_CBUTTONS, "cbuttons", NULL, 0, 0},
+    {SKIN_SHUFREP, "shufrep", NULL, 0, 0},
+    {SKIN_TEXT, "text", NULL, 0, 0},
+    {SKIN_TITLEBAR, "titlebar", NULL, 0, 0},
+    {SKIN_VOLUME, "volume", NULL, 0, 0},
+    {SKIN_BALANCE, "balance", "volume", 0, 0},
+    {SKIN_MONOSTEREO, "monoster", NULL, 0, 0},
+    {SKIN_PLAYPAUSE, "playpaus", NULL, 0, 0},
+    {SKIN_NUMBERS, "nums_ex", "numbers", 0, 0},
+    {SKIN_POSBAR, "posbar", NULL, 0, 0},
+    {SKIN_EQMAIN, "eqmain", NULL, 0, 0},
+    {SKIN_PLEDIT, "pledit", NULL, 0, 0},
+    {SKIN_EQ_EX, "eq_ex", NULL, 0, 0}
+};
+
+static guint skin_pixmap_id_map_size = G_N_ELEMENTS(skin_pixmap_id_map);
+
+static const guchar skin_default_viscolor[24][3] = {
+    {9, 34, 53},
+    {10, 18, 26},
+    {0, 54, 108},
+    {0, 58, 116},
+    {0, 62, 124},
+    {0, 66, 132},
+    {0, 70, 140},
+    {0, 74, 148},
+    {0, 78, 156},
+    {0, 82, 164},
+    {0, 86, 172},
+    {0, 92, 184},
+    {0, 98, 196},
+    {0, 104, 208},
+    {0, 110, 220},
+    {0, 116, 232},
+    {0, 122, 244},
+    {0, 128, 255},
+    {0, 128, 255},
+    {0, 104, 208},
+    {0, 80, 160},
+    {0, 56, 112},
+    {0, 32, 64},
+    {200, 200, 200}
+};
+
+static gchar *original_gtk_theme = NULL;
+
+static GdkBitmap *skin_create_transparent_mask(const gchar *,
+                                               const gchar *,
+                                               const gchar *,
+                                               GdkWindow *,
+                                               gint, gint, gboolean);
+
+static void skin_set_default_vis_color(Skin * skin);
+
+void
+skin_lock(Skin * skin)
+{
+    g_mutex_lock(skin->lock);
+}
+
+void
+skin_unlock(Skin * skin)
+{
+    g_mutex_unlock(skin->lock);
+}
+
+gboolean
+aud_active_skin_reload(void) 
+{
+    AUDDBG("\n");
+    return aud_active_skin_load(aud_active_skin->path); 
+}
+
+gboolean
+aud_active_skin_load(const gchar * path)
+{
+    AUDDBG("%s\n", path);
+    g_return_val_if_fail(aud_active_skin != NULL, FALSE);
+
+    if (!skin_load(aud_active_skin, path)) {
+        AUDDBG("loading failed\n");
+        return FALSE;
+    }
+
+    ui_skinned_window_draw_all(mainwin);
+    ui_skinned_window_draw_all(equalizerwin);
+    ui_skinned_window_draw_all(playlistwin);
+
+    playlistwin_update_list(aud_playlist_get_active());
+
+    SkinPixmap *pixmap;
+    pixmap = &aud_active_skin->pixmaps[SKIN_POSBAR];
+    /* last 59 pixels of SKIN_POSBAR are knobs (normal and selected) */
+    gtk_widget_set_size_request(mainwin_position, pixmap->width - 59, pixmap->height);
+
+    return TRUE;
+}
+
+void
+skin_pixmap_free(SkinPixmap * p)
+{
+    g_return_if_fail(p != NULL);
+    g_return_if_fail(p->pixbuf != NULL);
+
+    g_object_unref(p->pixbuf);
+    p->pixbuf = NULL;
+}
+
+Skin *
+skin_new(void)
+{
+    Skin *skin;
+    skin = g_new0(Skin, 1);
+    skin->lock = g_mutex_new();
+    return skin;
+}
+
+/**
+ * Frees the data associated for skin.
+ *
+ * Does not free skin itself or lock variable so that the skin can immediately
+ * populated with new skin data if needed.
+ */
+void
+skin_free(Skin * skin)
+{
+    gint i;
+
+    g_return_if_fail(skin != NULL);
+
+    for (i = 0; i < SKIN_PIXMAP_COUNT; i++)
+        skin_pixmap_free(&skin->pixmaps[i]);
+
+    for (i = 0; i < SKIN_MASK_COUNT; i++) {
+        if (skin->masks[i])
+            g_object_unref(skin->masks[i]);
+        if (skin->scaled_masks[i])
+            g_object_unref(skin->scaled_masks[i]);
+
+        skin->masks[i] = NULL;
+        skin->scaled_masks[i] = NULL;
+    }
+
+    for (i = 0; i < SKIN_COLOR_COUNT; i++) {
+        if (skin->colors[i])
+            g_free(skin->colors[i]);
+
+        skin->colors[i] = NULL;
+    }
+
+    g_free(skin->path);
+    skin->path = NULL;
+
+    skin_set_default_vis_color(skin);
+}
+
+void
+skin_destroy(Skin * skin)
+{
+    g_return_if_fail(skin != NULL);
+    skin_free(skin);
+    g_mutex_free(skin->lock);
+    g_free(skin);
+}
+
+const SkinPixmapIdMapping *
+skin_pixmap_id_lookup(guint id)
+{
+    guint i;
+
+    for (i = 0; i < skin_pixmap_id_map_size; i++) {
+        if (id == skin_pixmap_id_map[i].id) {
+            return &skin_pixmap_id_map[i];
+        }
+    }
+
+    return NULL;
+}
+
+const gchar *
+skin_pixmap_id_to_name(SkinPixmapId id)
+{
+    guint i;
+
+    for (i = 0; i < skin_pixmap_id_map_size; i++) {
+        if (id == skin_pixmap_id_map[i].id)
+            return skin_pixmap_id_map[i].name;
+    }
+    return NULL;
+}
+
+static void
+skin_set_default_vis_color(Skin * skin)
+{
+    memcpy(skin->vis_color, skin_default_viscolor,
+           sizeof(skin_default_viscolor));
+}
+
+/*
+ * I have rewritten this to take an array of possible targets,
+ * once we find a matching target we now return, instead of loop
+ * recursively. This allows for us to support many possible format
+ * targets for our skinning engine than just the original winamp 
+ * formats.
+ *
+ *    -- nenolod, 16 January 2006
+ */
+gchar *
+skin_pixmap_locate(const gchar * dirname, gchar ** basenames)
+{
+    gchar *filename;
+    gint i;
+
+    for (i = 0; basenames[i]; i++)
+    if (!(filename = find_path_recursively(dirname, basenames[i]))) 
+        g_free(filename);
+    else
+        return filename;
+
+    /* can't find any targets -- sorry */
+    return NULL;
+}
+
+/**
+ * Creates possible file names for a pixmap.
+ *
+ * Basically this makes list of all possible file names that pixmap data
+ * can be found from by using the static ext_targets variable to get all
+ * possible extensions that pixmap file might have.
+ */
+static gchar **
+skin_pixmap_create_basenames(const SkinPixmapIdMapping * pixmap_id_mapping)
+{
+    gchar **basenames = g_malloc0(sizeof(gchar*) * (EXTENSION_TARGETS * 2 + 1));
+    gint i, y;
+
+    // Create list of all possible image formats that can be loaded
+    for (i = 0, y = 0; i < EXTENSION_TARGETS; i++, y++)
+    {
+        basenames[y] =
+            g_strdup_printf("%s.%s", pixmap_id_mapping->name, ext_targets[i]);
+
+        if (pixmap_id_mapping->alt_name)
+            basenames[++y] =
+                g_strdup_printf("%s.%s", pixmap_id_mapping->alt_name,
+                                ext_targets[i]);
+    }
+
+    return basenames;
+}
+
+/**
+ * Frees the data allocated by skin_pixmap_create_basenames
+ */
+static void
+skin_pixmap_free_basenames(gchar ** basenames)
+{
+    int i;
+    for (i = 0; basenames[i] != NULL; i++)
+    {
+        g_free(basenames[i]);
+        basenames[i] = NULL;
+    }
+    g_free(basenames);
+}
+
+/**
+ * Locates a pixmap file for skin.
+ */
+static gchar *
+skin_pixmap_locate_basenames(const Skin * skin,
+                             const SkinPixmapIdMapping * pixmap_id_mapping,
+                             const gchar * path_p)
+{
+    gchar *filename = NULL;
+    const gchar *path = path_p ? path_p : skin->path;
+    gchar **basenames = skin_pixmap_create_basenames(pixmap_id_mapping);
+
+    filename = skin_pixmap_locate(path, basenames);
+
+    skin_pixmap_free_basenames(basenames);
+
+    return filename;
+}
+
+
+static gboolean
+skin_load_pixmap_id(Skin * skin, SkinPixmapId id, const gchar * path_p)
+{
+    const SkinPixmapIdMapping *pixmap_id_mapping;
+    gchar *filename;
+    SkinPixmap *pm = NULL;
+
+    g_return_val_if_fail(skin != NULL, FALSE);
+    g_return_val_if_fail(id < SKIN_PIXMAP_COUNT, FALSE);
+
+    pixmap_id_mapping = skin_pixmap_id_lookup(id);
+    g_return_val_if_fail(pixmap_id_mapping != NULL, FALSE);
+
+    filename = skin_pixmap_locate_basenames(skin, pixmap_id_mapping, path_p);
+
+    if (filename == NULL)
+        return FALSE;
+
+    AUDDBG("loaded %s\n", filename);
+
+    pm = &skin->pixmaps[id];
+    GdkPixbuf *pix = gdk_pixbuf_new_from_file(filename, NULL);
+    pm->pixbuf = audacious_create_colorized_pixbuf(pix, config.colorize_r, config.colorize_g, config.colorize_b);
+    g_object_unref(pix);
+    pm->width = gdk_pixbuf_get_width(pm->pixbuf);
+    pm->height = gdk_pixbuf_get_height(pm->pixbuf);
+    pm->current_width = pm->width;
+    pm->current_height = pm->height;
+
+    g_free(filename);
+
+    return TRUE;
+}
+
+void
+skin_mask_create(Skin * skin,
+                 const gchar * path,
+                 gint id,
+                 GdkWindow * window)
+{
+    skin->masks[id] =
+        skin_create_transparent_mask(path, "region.txt",
+                                     skin_mask_info[id].inistr, window,
+                                     skin_mask_info[id].width,
+                                     skin_mask_info[id].height, FALSE);
+
+    skin->scaled_masks[id] =
+        skin_create_transparent_mask(path, "region.txt",
+                                     skin_mask_info[id].inistr, window,
+                                     skin_mask_info[id].width * 2,
+                                     skin_mask_info[id].height * 2, TRUE);
+}
+
+static GdkBitmap *
+create_default_mask(GdkWindow * parent, gint w, gint h)
+{
+    GdkBitmap *ret;
+    GdkGC *gc;
+    GdkColor pattern;
+
+    ret = gdk_pixmap_new(parent, w, h, 1);
+    gc = gdk_gc_new(ret);
+    pattern.pixel = 1;
+    gdk_gc_set_foreground(gc, &pattern);
+    gdk_draw_rectangle(ret, gc, TRUE, 0, 0, w, h);
+    g_object_unref(gc);
+
+    return ret;
+}
+
+static void
+skin_query_color(GdkColormap * cm, GdkColor * c)
+{
+#ifdef GDK_WINDOWING_X11
+    XColor xc = { 0,0,0,0,0,0 };
+
+    xc.pixel = c->pixel;
+    XQueryColor(GDK_COLORMAP_XDISPLAY(cm), GDK_COLORMAP_XCOLORMAP(cm), &xc);
+    c->red = xc.red;
+    c->green = xc.green;
+    c->blue = xc.blue;
+#else
+    /* do nothing. see what breaks? */
+#endif
+}
+
+static glong
+skin_calc_luminance(GdkColor * c)
+{
+    return (0.212671 * c->red + 0.715160 * c->green + 0.072169 * c->blue);
+}
+
+static void
+skin_get_textcolors(GdkPixbuf * pix, GdkColor * bgc, GdkColor * fgc)
+{
+    /*
+     * Try to extract reasonable background and foreground colors
+     * from the font pixmap
+     */
+
+    GdkImage *gi;
+    GdkColormap *cm;
+    gint i;
+
+    g_return_if_fail(pix != NULL);
+
+    GdkPixmap *text = gdk_pixmap_new(NULL, gdk_pixbuf_get_width(pix), gdk_pixbuf_get_height(pix), gdk_rgb_get_visual()->depth);
+    gdk_draw_pixbuf(text, NULL, pix, 0, 0, 0, 0, gdk_pixbuf_get_width(pix), gdk_pixbuf_get_height(pix),
+                    GDK_RGB_DITHER_NONE, 0, 0);
+    /* Get the first line of text */
+    gi = gdk_drawable_get_image(text, 0, 0, 152, 6);
+    cm = gdk_colormap_get_system();
+
+    for (i = 0; i < 6; i++) {
+        GdkColor c;
+        gint x;
+        glong d, max_d;
+
+        /* Get a pixel from the middle of the space character */
+        bgc[i].pixel = gdk_image_get_pixel(gi, 151, i);
+        skin_query_color(cm, &bgc[i]);
+
+        max_d = 0;
+        for (x = 1; x < 150; x++) {
+            c.pixel = gdk_image_get_pixel(gi, x, i);
+            skin_query_color(cm, &c);
+
+            d = labs(skin_calc_luminance(&c) - skin_calc_luminance(&bgc[i]));
+            if (d > max_d) {
+                memcpy(&fgc[i], &c, sizeof(GdkColor));
+                max_d = d;
+            }
+        }
+    }
+    g_object_unref(gi);
+    g_object_unref(text);
+}
+
+gboolean
+init_skins(const gchar * path)
+{
+    aud_active_skin = skin_new();
+
+    skin_parse_hints(aud_active_skin, NULL);
+
+    /* create the windows if they haven't been created yet, needed for bootstrapping */
+    if (mainwin == NULL)
+    {
+        mainwin_create();
+        equalizerwin_create();
+        playlistwin_create();
+    }
+
+    if (!aud_active_skin_load(path)) {
+        if (path != NULL)
+            AUDDBG("Unable to load skin (%s), trying default...\n", path);
+        else
+            AUDDBG("Skin not defined: trying default...\n");
+
+        /* can't load configured skin, retry with default */
+        if (!aud_active_skin_load(BMP_DEFAULT_SKIN_PATH)) {
+            AUDDBG("Unable to load default skin (%s)! Giving up.\n",
+                      BMP_DEFAULT_SKIN_PATH);
+            return FALSE;
+        }
+    }
+
+    if (config.random_skin_on_play)
+        skinlist_update();
+
+    return TRUE;
+}
+
+void cleanup_skins()
+{
+    skin_destroy(aud_active_skin);
+    aud_active_skin = NULL;
+}
+
+
+/*
+ * Opens and parses a skin's hints file.
+ * Hints files are somewhat like "scripts" in Winamp3/5.
+ * We'll probably add scripts to it next.
+ */
+void
+skin_parse_hints(Skin * skin, gchar *path_p)
+{
+    gchar *filename, *tmp;
+    INIFile *inifile;
+
+    path_p = path_p ? path_p : skin->path;
+
+    skin->properties.mainwin_othertext = FALSE;
+    skin->properties.mainwin_vis_x = 24;
+    skin->properties.mainwin_vis_y = 43;
+    skin->properties.mainwin_vis_width = 76;
+    skin->properties.mainwin_text_x = 112;
+    skin->properties.mainwin_text_y = 27;
+    skin->properties.mainwin_text_width = 153;
+    skin->properties.mainwin_infobar_x = 112;
+    skin->properties.mainwin_infobar_y = 43;
+    skin->properties.mainwin_number_0_x = 36;
+    skin->properties.mainwin_number_0_y = 26;
+    skin->properties.mainwin_number_1_x = 48;
+    skin->properties.mainwin_number_1_y = 26;
+    skin->properties.mainwin_number_2_x = 60;
+    skin->properties.mainwin_number_2_y = 26;
+    skin->properties.mainwin_number_3_x = 78;
+    skin->properties.mainwin_number_3_y = 26;
+    skin->properties.mainwin_number_4_x = 90;
+    skin->properties.mainwin_number_4_y = 26;
+    skin->properties.mainwin_playstatus_x = 24;
+    skin->properties.mainwin_playstatus_y = 28;
+    skin->properties.mainwin_menurow_visible = TRUE;
+    skin->properties.mainwin_volume_x = 107;
+    skin->properties.mainwin_volume_y = 57;
+    skin->properties.mainwin_balance_x = 177;
+    skin->properties.mainwin_balance_y = 57;
+    skin->properties.mainwin_position_x = 16;
+    skin->properties.mainwin_position_y = 72;
+    skin->properties.mainwin_othertext_is_status = FALSE;
+    skin->properties.mainwin_othertext_visible = skin->properties.mainwin_othertext;
+    skin->properties.mainwin_text_visible = TRUE;
+    skin->properties.mainwin_vis_visible = TRUE;
+    skin->properties.mainwin_previous_x = 16;
+    skin->properties.mainwin_previous_y = 88;
+    skin->properties.mainwin_play_x = 39;
+    skin->properties.mainwin_play_y = 88;
+    skin->properties.mainwin_pause_x = 62;
+    skin->properties.mainwin_pause_y = 88;
+    skin->properties.mainwin_stop_x = 85;
+    skin->properties.mainwin_stop_y = 88;
+    skin->properties.mainwin_next_x = 108;
+    skin->properties.mainwin_next_y = 88;
+    skin->properties.mainwin_eject_x = 136;
+    skin->properties.mainwin_eject_y = 89;
+    skin->properties.mainwin_width = 275;
+    skin_mask_info[0].width = skin->properties.mainwin_width;
+    skin->properties.mainwin_height = 116;
+    skin_mask_info[0].height = skin->properties.mainwin_height;
+    skin->properties.mainwin_about_x = 247;
+    skin->properties.mainwin_about_y = 83;
+    skin->properties.mainwin_shuffle_x = 164;
+    skin->properties.mainwin_shuffle_y = 89;
+    skin->properties.mainwin_repeat_x = 210;
+    skin->properties.mainwin_repeat_y = 89;
+    skin->properties.mainwin_eqbutton_x = 219;
+    skin->properties.mainwin_eqbutton_y = 58;
+    skin->properties.mainwin_plbutton_x = 242;
+    skin->properties.mainwin_plbutton_y = 58;
+    skin->properties.textbox_bitmap_font_width = 5;
+    skin->properties.textbox_bitmap_font_height = 6;
+    skin->properties.mainwin_minimize_x = 244;
+    skin->properties.mainwin_minimize_y = 3;
+    skin->properties.mainwin_shade_x = 254;
+    skin->properties.mainwin_shade_y = 3;
+    skin->properties.mainwin_close_x = 264;
+    skin->properties.mainwin_close_y = 3;
+
+    if (path_p == NULL)
+        return;
+
+    filename = find_file_recursively(path_p, "skin.hints");
+
+    if (filename == NULL)
+        return;
+
+    inifile = aud_open_ini_file(filename);
+    if (!inifile)
+        return;
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinOthertext");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_othertext = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinVisX");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_vis_x = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinVisY");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_vis_y = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinVisWidth");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_vis_width = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinTextX");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_text_x = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinTextY");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_text_y = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinTextWidth");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_text_width = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinInfoBarX");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_infobar_x = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinInfoBarY");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_infobar_y = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinNumber0X");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_number_0_x = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinNumber0Y");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_number_0_y = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinNumber1X");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_number_1_x = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinNumber1Y");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_number_1_y = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinNumber2X");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_number_2_x = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinNumber2Y");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_number_2_y = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinNumber3X");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_number_3_x = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinNumber3Y");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_number_3_y = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinNumber4X");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_number_4_x = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinNumber4Y");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_number_4_y = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinPlayStatusX");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_playstatus_x = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinPlayStatusY");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_playstatus_y = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinMenurowVisible");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_menurow_visible = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinVolumeX");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_volume_x = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinVolumeY");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_volume_y = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinBalanceX");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_balance_x = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinBalanceY");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_balance_y = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinPositionX");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_position_x = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinPositionY");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_position_y = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinOthertextIsStatus");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_othertext_is_status = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinOthertextVisible");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_othertext_visible = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinTextVisible");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_text_visible = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinVisVisible");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_vis_visible = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinPreviousX");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_previous_x = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinPreviousY");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_previous_y = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinPlayX");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_play_x = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinPlayY");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_play_y = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinPauseX");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_pause_x = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinPauseY");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_pause_y = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinStopX");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_stop_x = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinStopY");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_stop_y = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinNextX");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_next_x = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinNextY");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_next_y = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinEjectX");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_eject_x = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinEjectY");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_eject_y = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinWidth");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_width = atoi(tmp);
+        g_free(tmp);
+    }
+
+    skin_mask_info[0].width = skin->properties.mainwin_width;
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinHeight");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_height = atoi(tmp);
+        g_free(tmp);
+    }
+
+    skin_mask_info[0].height = skin->properties.mainwin_height;
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinAboutX");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_about_x = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinAboutY");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_about_y = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinShuffleX");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_shuffle_x = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinShuffleY");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_shuffle_y = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinRepeatX");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_repeat_x = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinRepeatY");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_repeat_y = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinEQButtonX");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_eqbutton_x = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinEQButtonY");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_eqbutton_y = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinPLButtonX");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_plbutton_x = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinPLButtonY");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_plbutton_y = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "textboxBitmapFontWidth");
+
+    if (tmp != NULL)
+    {
+        skin->properties.textbox_bitmap_font_width = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "textboxBitmapFontHeight");
+
+    if (tmp != NULL)
+    {
+        skin->properties.textbox_bitmap_font_height = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinMinimizeX");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_minimize_x = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinMinimizeY");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_minimize_y = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinShadeX");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_shade_x = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinShadeY");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_shade_y = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinCloseX");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_close_x = atoi(tmp);
+        g_free(tmp);
+    }
+
+    tmp = aud_read_ini_string(inifile, "skin", "mainwinCloseY");
+
+    if (tmp != NULL)
+    {
+        skin->properties.mainwin_close_y = atoi(tmp);
+        g_free(tmp);
+    }
+
+    if (filename != NULL)
+        g_free(filename);
+
+    aud_close_ini_file(inifile);
+}
+
+static guint
+hex_chars_to_int(gchar hi, gchar lo)
+{
+    /*
+     * Converts a value in the range 0x00-0xFF
+     * to a integer in the range 0-65535
+     */
+    gchar str[3];
+
+    str[0] = hi;
+    str[1] = lo;
+    str[2] = 0;
+
+    return (CLAMP(strtol(str, NULL, 16), 0, 0xFF) << 8);
+}
+
+static GdkColor *
+skin_load_color(INIFile *inifile,
+                const gchar * section, const gchar * key,
+                gchar * default_hex)
+{
+    gchar *value;
+    GdkColor *color = NULL;
+
+    if (inifile || default_hex) {
+        if (inifile) {
+            value = aud_read_ini_string(inifile, section, key);
+            if (value == NULL) {
+                value = g_strdup(default_hex);
+            }
+        } else {
+            value = g_strdup(default_hex);
+        }
+        if (value) {
+            gchar *ptr = value;
+            gint len;
+
+            color = g_new0(GdkColor, 1);
+            g_strstrip(value);
+
+            if (value[0] == '#')
+                ptr++;
+            len = strlen(ptr);
+            /*
+             * The handling of incomplete values is done this way
+             * to maximize winamp compatibility
+             */
+            if (len >= 6) {
+                color->red = hex_chars_to_int(*ptr, *(ptr + 1));
+                ptr += 2;
+            }
+            if (len >= 4) {
+                color->green = hex_chars_to_int(*ptr, *(ptr + 1));
+                ptr += 2;
+            }
+            if (len >= 2)
+                color->blue = hex_chars_to_int(*ptr, *(ptr + 1));
+
+            g_free(value);
+        }
+    }
+    return color;
+}
+
+
+
+GdkBitmap *
+skin_create_transparent_mask(const gchar * path,
+                             const gchar * file,
+                             const gchar * section,
+                             GdkWindow * window,
+                             gint width,
+                             gint height, gboolean scale)
+{
+    GdkBitmap *mask = NULL;
+    GdkGC *gc = NULL;
+    GdkColor pattern;
+    GdkPoint *gpoints;
+
+    gchar *filename = NULL;
+    INIFile *inifile = NULL;
+    gboolean created_mask = FALSE;
+    GArray *num, *point;
+    guint i, j;
+    gint k;
+
+    if (path)
+        filename = find_file_recursively(path, file);
+
+    /* filename will be null if path wasn't set */
+    if (!filename)
+        return create_default_mask(window, width, height);
+
+    inifile = aud_open_ini_file(filename);
+
+    if ((num = aud_read_ini_array(inifile, section, "NumPoints")) == NULL) {
+        g_free(filename);
+        aud_close_ini_file(inifile);
+        return NULL;
+    }
+
+    if ((point = aud_read_ini_array(inifile, section, "PointList")) == NULL) {
+        g_array_free(num, TRUE);
+        g_free(filename);
+        aud_close_ini_file(inifile);
+        return NULL;
+    }
+
+    aud_close_ini_file(inifile);
+
+    mask = gdk_pixmap_new(window, width, height, 1);
+    gc = gdk_gc_new(mask);
+
+    pattern.pixel = 0;
+    gdk_gc_set_foreground(gc, &pattern);
+    gdk_draw_rectangle(mask, gc, TRUE, 0, 0, width, height);
+    pattern.pixel = 1;
+    gdk_gc_set_foreground(gc, &pattern);
+
+    j = 0;
+    for (i = 0; i < num->len; i++) {
+        if ((int)(point->len - j) >= (g_array_index(num, gint, i) * 2)) {
+            created_mask = TRUE;
+            gpoints = g_new(GdkPoint, g_array_index(num, gint, i));
+            for (k = 0; k < g_array_index(num, gint, i); k++) {
+                gpoints[k].x =
+                    g_array_index(point, gint, j + k * 2) * (scale ? config.scale_factor : 1 );
+                gpoints[k].y =
+                    g_array_index(point, gint,
+                                  j + k * 2 + 1) * (scale ? config.scale_factor : 1);
+            }
+            j += k * 2;
+            gdk_draw_polygon(mask, gc, TRUE, gpoints,
+                             g_array_index(num, gint, i));
+            g_free(gpoints);
+        }
+    }
+    g_array_free(num, TRUE);
+    g_array_free(point, TRUE);
+    g_free(filename);
+
+    if (!created_mask)
+        gdk_draw_rectangle(mask, gc, TRUE, 0, 0, width, height);
+
+    g_object_unref(gc);
+
+    return mask;
+}
+
+void
+skin_load_viscolor(Skin * skin, const gchar * path, const gchar * basename)
+{
+    VFSFile *file;
+    gint i, c;
+    gchar line[256], *filename;
+    GArray *a;
+
+    g_return_if_fail(skin != NULL);
+    g_return_if_fail(path != NULL);
+    g_return_if_fail(basename != NULL);
+
+    skin_set_default_vis_color(skin);
+
+    filename = find_file_recursively(path, basename);
+    if (!filename)
+        return;
+
+    if (!(file = aud_vfs_fopen(filename, "r"))) {
+        g_free(filename);
+        return;
+    }
+
+    g_free(filename);
+
+    for (i = 0; i < 24; i++) {
+        if (aud_vfs_fgets(line, 255, file)) {
+            a = string_to_garray(line);
+            if (a->len > 2) {
+                for (c = 0; c < 3; c++)
+                    skin->vis_color[i][c] = g_array_index(a, gint, c);
+            }
+            g_array_free(a, TRUE);
+        }
+        else
+            break;
+    }
+
+    aud_vfs_fclose(file);
+}
+
+static void
+skin_numbers_generate_dash(Skin * skin)
+{
+    GdkPixbuf *pixbuf;
+    SkinPixmap *numbers;
+
+    g_return_if_fail(skin != NULL);
+
+    numbers = &skin->pixmaps[SKIN_NUMBERS];
+    if (!numbers->pixbuf || numbers->current_width < 99)
+        return;
+
+    pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8,
+                            108, numbers->current_height);
+
+    skin_draw_pixbuf(NULL, skin, pixbuf, SKIN_NUMBERS, 0, 0, 0, 0, 99, numbers->current_height);
+    skin_draw_pixbuf(NULL, skin, pixbuf, SKIN_NUMBERS, 90, 0, 99, 0, 9, numbers->current_height);
+    skin_draw_pixbuf(NULL, skin, pixbuf, SKIN_NUMBERS, 20, 6, 101, 6, 5, 1);
+
+    g_object_unref(numbers->pixbuf);
+
+    numbers->pixbuf = pixbuf;
+    numbers->current_width = 108;
+    numbers->width = 108;
+}
+
+static gboolean
+skin_load_pixmaps(Skin * skin, const gchar * path)
+{
+    GdkPixbuf *text_pb;
+    guint i;
+    gchar *filename;
+    INIFile *inifile;
+    
+    if(!skin) return FALSE;
+    if(!path) return FALSE;
+
+    AUDDBG("Loading pixmaps in %s\n", path);
+
+    for (i = 0; i < SKIN_PIXMAP_COUNT; i++)
+        if (!skin_load_pixmap_id(skin, i, path) && !config.allow_broken_skins)
+            return FALSE;
+
+    text_pb = skin->pixmaps[SKIN_TEXT].pixbuf;
+
+    if (text_pb)
+        skin_get_textcolors(text_pb, skin->textbg, skin->textfg);
+
+    if (skin->pixmaps[SKIN_NUMBERS].pixbuf &&
+        skin->pixmaps[SKIN_NUMBERS].width < 108 )
+        skin_numbers_generate_dash(skin);
+
+    filename = find_file_recursively(path, "pledit.txt");
+    inifile = aud_open_ini_file(filename);
+
+    skin->colors[SKIN_PLEDIT_NORMAL] =
+        skin_load_color(inifile, "Text", "Normal", "#2499ff");
+    skin->colors[SKIN_PLEDIT_CURRENT] =
+        skin_load_color(inifile, "Text", "Current", "#ffeeff");
+    skin->colors[SKIN_PLEDIT_NORMALBG] =
+        skin_load_color(inifile, "Text", "NormalBG", "#0a120a");
+    skin->colors[SKIN_PLEDIT_SELECTEDBG] =
+        skin_load_color(inifile, "Text", "SelectedBG", "#0a124a");
+
+    if (inifile)
+        aud_close_ini_file(inifile);
+
+    if (filename)
+        g_free(filename);
+
+    skin_mask_create(skin, path, SKIN_MASK_MAIN, mainwin->window);
+    skin_mask_create(skin, path, SKIN_MASK_MAIN_SHADE, mainwin->window);
+
+    skin_mask_create(skin, path, SKIN_MASK_EQ, equalizerwin->window);
+    skin_mask_create(skin, path, SKIN_MASK_EQ_SHADE, equalizerwin->window);
+
+    skin_load_viscolor(skin, path, "viscolor.txt");
+
+    return TRUE;
+}
+
+static void
+skin_set_gtk_theme(GtkSettings * settings, Skin * skin)
+{
+    if (original_gtk_theme == NULL)
+         g_object_get(settings, "gtk-theme-name", &original_gtk_theme, NULL);
+
+    /* the way GTK does things can be very broken. --nenolod */
+
+    gchar *tmp = g_strdup_printf("%s/.themes/aud-%s", g_get_home_dir(),
+                                 basename(skin->path));
+
+    gchar *troot = g_strdup_printf("%s/.themes", g_get_home_dir());
+    g_mkdir_with_parents(troot, 0755);
+    g_free(troot);
+
+    symlink(skin->path, tmp);
+    gtk_settings_set_string_property(settings, "gtk-theme-name",
+                                     basename(tmp), "audacious");
+    g_free(tmp);
+}
+
+/**
+ * Checks if all pixmap files exist that skin needs.
+ */
+static gboolean
+skin_check_pixmaps(const Skin * skin, const gchar * skin_path)
+{
+    guint i;
+    for (i = 0; i < SKIN_PIXMAP_COUNT; i++)
+    {
+        gchar *filename = skin_pixmap_locate_basenames(skin,
+                                                       skin_pixmap_id_lookup(i),
+                                                       skin_path);
+        if (!filename)
+            return FALSE;
+        g_free(filename);
+    }
+    return TRUE;
+}
+
+static gboolean
+skin_load_nolock(Skin * skin, const gchar * path, gboolean force)
+{
+    GtkSettings *settings;
+    gchar *gtkrcpath;
+    gchar *newpath, *skin_path;
+    int archive = 0;
+
+    AUDDBG("Attempt to load skin \"%s\"\n", path);
+
+    g_return_val_if_fail(skin != NULL, FALSE);
+    g_return_val_if_fail(path != NULL, FALSE);
+    REQUIRE_LOCK(skin->lock);
+
+    if (!g_file_test(path, G_FILE_TEST_IS_REGULAR | G_FILE_TEST_IS_DIR))
+        return FALSE;
+
+    if(force) AUDDBG("reloading forced!\n");
+    if (!force && skin->path && !strcmp(skin->path, path)) {
+        AUDDBG("skin %s already loaded\n", path);
+        return FALSE;
+    }
+
+    if (file_is_archive(path)) {
+        AUDDBG("Attempt to load archive\n");
+        if (!(skin_path = archive_decompress(path))) {
+            AUDDBG("Unable to extract skin archive (%s)\n", path);
+            return FALSE;
+        }
+        archive = 1;
+    } else {
+        skin_path = g_strdup(path);
+    }
+
+    // Check if skin path has all necessary files.
+    if (!config.allow_broken_skins && !skin_check_pixmaps(skin, skin_path)) {
+        if(archive) del_directory(skin_path);
+        g_free(skin_path);
+        AUDDBG("Skin path (%s) doesn't have all wanted pixmaps\n", skin_path);
+        return FALSE;
+    }
+
+    // skin_free() frees skin->path and variable path can actually be skin->path
+    // and we want to get the path before possibly freeing it.
+    newpath = g_strdup(path);
+    skin_free(skin);
+    skin->path = newpath;
+
+    memset(&(skin->properties), 0, sizeof(SkinProperties)); /* do it only if all tests above passed! --asphyx */
+
+    skin_current_num++;
+
+    /* Parse the hints for this skin. */
+    skin_parse_hints(skin, skin_path);
+
+    if (!skin_load_pixmaps(skin, skin_path)) {
+        if(archive) del_directory(skin_path);
+        g_free(skin_path);
+        AUDDBG("Skin loading failed\n");
+        return FALSE;
+    }
+
+    /* restore gtk theme if changed by previous skin */
+    settings = gtk_settings_get_default();
+
+    if (original_gtk_theme != NULL) {
+        gtk_settings_set_string_property(settings, "gtk-theme-name",
+                                              original_gtk_theme, "audacious");
+        g_free(original_gtk_theme);
+        original_gtk_theme = NULL;
+    }
+
+#ifndef _WIN32
+    if (!config.disable_inline_gtk && !archive) {
+        gtkrcpath = find_path_recursively(skin->path, "gtkrc");
+        if (gtkrcpath != NULL)
+            skin_set_gtk_theme(settings, skin);
+        g_free(gtkrcpath);
+    }
+#endif
+
+    if(archive) del_directory(skin_path);
+    g_free(skin_path);
+
+    gtk_widget_shape_combine_mask(mainwin, skin_get_mask(aud_active_skin, SKIN_MASK_MAIN + config.player_shaded), 0, 0);
+    gtk_widget_shape_combine_mask(equalizerwin, skin_get_mask(aud_active_skin, SKIN_MASK_EQ + config.equalizer_shaded), 0, 0);
+
+    return TRUE;
+}
+
+void
+skin_install_skin(const gchar * path)
+{
+    gchar *command;
+
+    g_return_if_fail(path != NULL);
+
+    command = g_strdup_printf("cp %s %s",
+                              path, skins_paths[SKINS_PATH_USER_SKIN_DIR]);
+    if (system(command)) {
+        AUDDBG("Unable to install skin (%s) into user directory (%s)\n",
+                  path, skins_paths[SKINS_PATH_USER_SKIN_DIR]);
+    }
+    g_free(command);
+}
+
+static SkinPixmap *
+skin_get_pixmap(Skin * skin, SkinPixmapId map_id)
+{
+    g_return_val_if_fail(skin != NULL, NULL);
+    g_return_val_if_fail(map_id < SKIN_PIXMAP_COUNT, NULL);
+
+    return &skin->pixmaps[map_id];
+}
+
+gboolean
+skin_load(Skin * skin, const gchar * path)
+{
+    gboolean ret;
+
+    g_return_val_if_fail(skin != NULL, FALSE);
+
+    if (!path)
+        return FALSE;
+
+    skin_lock(skin);
+    ret = skin_load_nolock(skin, path, FALSE);
+    skin_unlock(skin);
+
+    if(!ret) {
+        AUDDBG("loading failed\n");
+        return FALSE; /* don't try to update anything if loading failed --asphyx */
+    }
+
+    SkinPixmap *pixmap = NULL;
+    pixmap = skin_get_pixmap(skin, SKIN_NUMBERS);
+    if (pixmap) {
+        ui_skinned_number_set_size(mainwin_minus_num, 9, pixmap->height);
+        ui_skinned_number_set_size(mainwin_10min_num, 9, pixmap->height);
+        ui_skinned_number_set_size(mainwin_min_num, 9, pixmap->height);
+        ui_skinned_number_set_size(mainwin_10sec_num, 9, pixmap->height);
+        ui_skinned_number_set_size(mainwin_sec_num, 9, pixmap->height);
+    }
+
+    pixmap = skin_get_pixmap(skin, SKIN_MAIN);
+    if (pixmap && skin->properties.mainwin_height > pixmap->height)
+        skin->properties.mainwin_height = pixmap->height;
+
+    pixmap = skin_get_pixmap(skin, SKIN_PLAYPAUSE);
+    if (pixmap)
+        ui_skinned_playstatus_set_size(mainwin_playstatus, 11, pixmap->height);
+
+    pixmap = skin_get_pixmap(skin, SKIN_EQMAIN);
+    if (pixmap->height >= 313)
+        gtk_widget_show(equalizerwin_graph);
+
+    return TRUE;
+}
+
+gboolean
+skin_reload_forced(void) 
+{
+   gboolean error;
+   AUDDBG("\n");
+
+   skin_lock(aud_active_skin);
+   error = skin_load_nolock(aud_active_skin, aud_active_skin->path, TRUE);
+   skin_unlock(aud_active_skin);
+
+   return error;
+}
+
+void
+skin_reload(Skin * skin)
+{
+    AUDDBG("\n");
+    g_return_if_fail(skin != NULL);
+    skin_load_nolock(skin, skin->path, TRUE);
+}
+
+GdkBitmap *
+skin_get_mask(Skin * skin, SkinMaskId mi)
+{
+    GdkBitmap **masks;
+
+    g_return_val_if_fail(skin != NULL, NULL);
+    g_return_val_if_fail(mi < SKIN_PIXMAP_COUNT, NULL);
+
+    masks = config.scaled ? skin->scaled_masks : skin->masks;
+    return masks[mi];
+}
+
+GdkColor *
+skin_get_color(Skin * skin, SkinColorId color_id)
+{
+    GdkColor *ret = NULL;
+
+    g_return_val_if_fail(skin != NULL, NULL);
+
+    switch (color_id) {
+    case SKIN_TEXTBG:
+        if (skin->pixmaps[SKIN_TEXT].pixbuf)
+            ret = skin->textbg;
+        else
+            ret = skin->def_textbg;
+        break;
+    case SKIN_TEXTFG:
+        if (skin->pixmaps[SKIN_TEXT].pixbuf)
+            ret = skin->textfg;
+        else
+            ret = skin->def_textfg;
+        break;
+    default:
+        if (color_id < SKIN_COLOR_COUNT)
+            ret = skin->colors[color_id];
+        break;
+    }
+    return ret;
+}
+
+void
+skin_get_viscolor(Skin * skin, guchar vis_color[24][3])
+{
+    gint i;
+
+    g_return_if_fail(skin != NULL);
+
+    for (i = 0; i < 24; i++) {
+        vis_color[i][0] = skin->vis_color[i][0];
+        vis_color[i][1] = skin->vis_color[i][1];
+        vis_color[i][2] = skin->vis_color[i][2];
+    }
+}
+
+gint
+skin_get_id(void)
+{
+    return skin_current_num;
+}
+
+void
+skin_draw_pixbuf(GtkWidget *widget, Skin * skin, GdkPixbuf * pix,
+                 SkinPixmapId pixmap_id,
+                 gint xsrc, gint ysrc, gint xdest, gint ydest,
+                 gint width, gint height)
+{
+    SkinPixmap *pixmap;
+
+    g_return_if_fail(skin != NULL);
+
+    pixmap = skin_get_pixmap(skin, pixmap_id);
+    g_return_if_fail(pixmap != NULL);
+    g_return_if_fail(pixmap->pixbuf != NULL);
+
+    /* perhaps we should use transparency or resize widget? */
+    if (xsrc+width > pixmap->width || ysrc+height > pixmap->height) {
+        if (widget) {
+            /* it's better to hide widget using SKIN_PLAYPAUSE/SKIN_POSBAR than display mess */
+            if ((pixmap_id == SKIN_PLAYPAUSE && pixmap->width != 42) || pixmap_id == SKIN_POSBAR) {
+                gtk_widget_hide(widget);
+                return;
+            }
+            gint x, y;
+            x = -1;
+            y = -1;
+
+            if (gtk_widget_get_parent(widget) == SKINNED_WINDOW(mainwin)->fixed) {
+                GList *iter;
+                for (iter = GTK_FIXED (SKINNED_WINDOW(mainwin)->fixed)->children; iter; iter = g_list_next (iter)) {
+                     GtkFixedChild *child_data = (GtkFixedChild *) iter->data;
+                     if (child_data->widget == widget) {
+                         x = child_data->x;
+                         y = child_data->y;
+                         break;
+                     }
+                }
+
+                if (x != -1 && y != -1) {
+                    /* Some skins include SKIN_VOLUME and/or SKIN_BALANCE
+                       without knobs */
+                    if (pixmap_id == SKIN_VOLUME || pixmap_id == SKIN_BALANCE) {
+                        if (ysrc+height > 421 && xsrc+width <= pixmap->width)
+                            return;
+                    }
+                    /* let's copy what's under widget */
+                    gdk_pixbuf_copy_area(skin_get_pixmap(aud_active_skin, SKIN_MAIN)->pixbuf,
+                                         x, y, width, height, pix, xdest, ydest);
+
+                    /* XMMS skins seems to have SKIN_MONOSTEREO with size 58x20 instead of 58x24 */
+                    if (pixmap_id == SKIN_MONOSTEREO)
+                        height = pixmap->height/2;
+                }
+            } else if (gtk_widget_get_parent(widget) == SKINNED_WINDOW(equalizerwin)->fixed) {
+                   if (!(pixmap_id == SKIN_EQMAIN && ysrc == 314)) /* equalizer preamp on equalizer graph */
+                         gtk_widget_hide(widget);
+            } else if (gtk_widget_get_parent(widget) == SKINNED_WINDOW(playlistwin)->fixed) {
+                   /* I haven't seen any skin with substandard playlist */
+                   gtk_widget_hide(widget);
+            }
+        } else
+            return;
+    }
+
+    width = MIN(width, pixmap->width - xsrc);
+    height = MIN(height, pixmap->height - ysrc);
+    gdk_pixbuf_copy_area(pixmap->pixbuf, xsrc, ysrc, width, height,
+                         pix, xdest, ydest);
+}
+
+void
+skin_get_eq_spline_colors(Skin * skin, guint32 colors[19])
+{
+    gint i;
+    GdkPixbuf *pixbuf;
+    SkinPixmap *eqmainpm;
+    guchar* pixels,*p;
+    guint rowstride, n_channels;
+    g_return_if_fail(skin != NULL);
+
+    eqmainpm = &skin->pixmaps[SKIN_EQMAIN];
+    if (eqmainpm->pixbuf &&
+            eqmainpm->current_width >= 116 && eqmainpm->current_height >= 313)
+        pixbuf = eqmainpm->pixbuf;
+    else
+        return;
+
+    if (!GDK_IS_PIXBUF(pixbuf))
+        return;
+
+    pixels = gdk_pixbuf_get_pixels (pixbuf);
+    rowstride = gdk_pixbuf_get_rowstride (pixbuf);
+    n_channels = gdk_pixbuf_get_n_channels (pixbuf);
+    for (i = 0; i < 19; i++)
+    {
+        p = pixels + rowstride * (i + 294) + 115 * n_channels;
+        colors[i] = (p[0] << 16) | (p[1] << 8) | p[2]; 
+        /* should we really treat the Alpha channel? */
+        /*if (n_channels == 4)
+            colors[i] = (colors[i] << 8) | p[3];*/
+    }
+}
+
+
+static void
+skin_draw_playlistwin_frame_top(Skin * skin, GdkPixbuf * pix,
+                                gint width, gint height, gboolean focus)
+{
+    /* The title bar skin consists of 2 sets of 4 images, 1 set
+     * for focused state and the other for unfocused. The 4 images
+     * are: 
+     *
+     * a. right corner (25,20)
+     * b. left corner  (25,20)
+     * c. tiler        (25,20)
+     * d. title        (100,20)
+     * 
+     * min allowed width = 100+25+25 = 150
+     */
+
+    gint i, y, c;
+
+    /* get y offset of the pixmap set to use */
+    if (focus)
+        y = 0;
+    else
+        y = 21;
+
+    /* left corner */
+    skin_draw_pixbuf(NULL, skin, pix, SKIN_PLEDIT, 0, y, 0, 0, 25, 20);
+
+    /* titlebar title */
+    skin_draw_pixbuf(NULL, skin, pix, SKIN_PLEDIT, 26, y,
+                     (width - 100) / 2, 0, 100, 20);
+
+    /* titlebar right corner  */
+    skin_draw_pixbuf(NULL, skin, pix, SKIN_PLEDIT, 153, y,
+                     width - 25, 0, 25, 20);
+
+    /* tile draw the remaining frame */
+
+    /* compute tile count */
+    c = (width - (100 + 25 + 25)) / 25;
+
+    for (i = 0; i < c / 2; i++) {
+        /* left of title */
+        skin_draw_pixbuf(NULL, skin, pix, SKIN_PLEDIT, 127, y,
+                         25 + i * 25, 0, 25, 20);
+
+        /* right of title */
+        skin_draw_pixbuf(NULL, skin, pix, SKIN_PLEDIT, 127, y,
+                         (width + 100) / 2 + i * 25, 0, 25, 20);
+    }
+
+    if (c & 1) {
+        /* Odd tile count, so one remaining to draw. Here we split
+         * it into two and draw half on either side of the title */
+        skin_draw_pixbuf(NULL, skin, pix, SKIN_PLEDIT, 127, y,
+                         ((c / 2) * 25) + 25, 0, 12, 20);
+        skin_draw_pixbuf(NULL, skin, pix, SKIN_PLEDIT, 127, y,
+                         (width / 2) + ((c / 2) * 25) + 50, 0, 13, 20);
+    }
+}
+
+static void
+skin_draw_playlistwin_frame_bottom(Skin * skin, GdkPixbuf * pix,
+                                   gint width, gint height, gboolean focus)
+{
+    /* The bottom frame skin consists of 1 set of 4 images. The 4
+     * images are:
+     *
+     * a. left corner with menu buttons (125,38)
+     * b. visualization window (75,38)
+     * c. right corner with play buttons (150,38)
+     * d. frame tile (25,38)
+     * 
+     * (min allowed width = 125+150+25=300
+     */
+
+    gint i, c;
+
+    /* bottom left corner (menu buttons) */
+    skin_draw_pixbuf(NULL, skin, pix, SKIN_PLEDIT, 0, 72,
+                     0, height - 38, 125, 38);
+
+    c = (width - 275) / 25;
+
+    /* draw visualization window, if width allows */
+    if (c >= 3) {
+        c -= 3;
+        skin_draw_pixbuf(NULL, skin, pix, SKIN_PLEDIT, 205, 0,
+                         width - (150 + 75), height - 38, 75, 38);
+    }
+
+    /* Bottom right corner (playbuttons etc) */
+    skin_draw_pixbuf(NULL, skin, pix, SKIN_PLEDIT,
+                     126, 72, width - 150, height - 38, 150, 38);
+
+    /* Tile draw the remaining undrawn portions */
+    for (i = 0; i < c; i++)
+        skin_draw_pixbuf(NULL, skin, pix, SKIN_PLEDIT, 179, 0,
+                         125 + i * 25, height - 38, 25, 38);
+}
+
+static void
+skin_draw_playlistwin_frame_sides(Skin * skin, GdkPixbuf * pix,
+                                  gint width, gint height, gboolean focus)
+{
+    /* The side frames consist of 2 tile images. 1 for the left, 1 for
+     * the right. 
+     * a. left  (12,29)
+     * b. right (19,29)
+     */
+
+    gint i;
+
+    /* frame sides */
+    for (i = 0; i < (height - (20 + 38)) / 29; i++) {
+        /* left */
+        skin_draw_pixbuf(NULL, skin, pix, SKIN_PLEDIT, 0, 42,
+                         0, 20 + i * 29, 12, 29);
+
+        /* right */
+        skin_draw_pixbuf(NULL, skin, pix, SKIN_PLEDIT, 32, 42,
+                         width - 19, 20 + i * 29, 19, 29);
+    }
+}
+
+
+void
+skin_draw_playlistwin_frame(Skin * skin, GdkPixbuf * pix,
+                            gint width, gint height, gboolean focus)
+{
+    skin_draw_playlistwin_frame_top(skin, pix, width, height, focus);
+    skin_draw_playlistwin_frame_bottom(skin, pix, width, height, focus);
+    skin_draw_playlistwin_frame_sides(skin, pix, width, height, focus);
+}
+
+
+void
+skin_draw_playlistwin_shaded(Skin * skin, GdkPixbuf * pix,
+                             gint width, gboolean focus)
+{
+    /* The shade mode titlebar skin consists of 4 images:
+     * a) left corner               offset (72,42) size (25,14)
+     * b) right corner, focused     offset (99,57) size (50,14)
+     * c) right corner, unfocused   offset (99,42) size (50,14)
+     * d) bar tile                  offset (72,57) size (25,14)
+     */
+
+    gint i;
+
+    /* left corner */
+    skin_draw_pixbuf(NULL, skin, pix, SKIN_PLEDIT, 72, 42, 0, 0, 25, 14);
+
+    /* bar tile */
+    for (i = 0; i < (width - 75) / 25; i++)
+        skin_draw_pixbuf(NULL, skin, pix, SKIN_PLEDIT, 72, 57,
+                         (i * 25) + 25, 0, 25, 14);
+
+    /* right corner */
+    skin_draw_pixbuf(NULL, skin, pix, SKIN_PLEDIT, 99, focus ? 42 : 57,
+                     width - 50, 0, 50, 14);
+}
+
+
+void
+skin_draw_mainwin_titlebar(Skin * skin, GdkPixbuf * pix,
+                           gboolean shaded, gboolean focus)
+{
+    /* The titlebar skin consists of 2 sets of 2 images, one for for
+     * shaded and the other for unshaded mode, giving a total of 4.
+     * The images are exactly 275x14 pixels, aligned and arranged
+     * vertically on each other in the pixmap in the following order:
+     * 
+     * a) unshaded, focused      offset (27, 0)
+     * b) unshaded, unfocused    offset (27, 15)
+     * c) shaded, focused        offset (27, 29)
+     * d) shaded, unfocused      offset (27, 42)
+     */
+
+    gint y_offset;
+
+    if (shaded) {
+        if (focus)
+            y_offset = 29;
+        else
+            y_offset = 42;
+    }
+    else {
+        if (focus)
+            y_offset = 0;
+        else
+            y_offset = 15;
+    }
+
+    skin_draw_pixbuf(NULL, skin, pix, SKIN_TITLEBAR, 27, y_offset,
+                     0, 0, aud_active_skin->properties.mainwin_width, MAINWIN_TITLEBAR_HEIGHT);
+}
+
+
+void
+skin_set_random_skin(void)
+{
+    SkinNode *node;
+    guint32 randval;
+
+    /* Get a random value to select the skin to use */
+    randval = g_random_int_range(0, g_list_length(skinlist));
+    node = g_list_nth(skinlist, randval)->data;
+    aud_active_skin_load(node->path);
+}
+
+
+void ui_skinned_widget_draw(GtkWidget *widget, GdkPixbuf *obj, gint width, gint height, gboolean scale) {
+    g_return_if_fail(widget != NULL);
+    g_return_if_fail(obj != NULL);
+
+    if (scale) {
+        GdkPixbuf *image = gdk_pixbuf_scale_simple(obj, width * config.scale_factor, height* config.scale_factor, GDK_INTERP_NEAREST);
+        gdk_draw_pixbuf(widget->window, NULL, image, 0, 0, 0, 0, width * config.scale_factor , height * config.scale_factor, GDK_RGB_DITHER_NONE, 0, 0);
+        g_object_unref(image);
+    } else {
+        gdk_draw_pixbuf(widget->window, NULL, obj, 0, 0, 0, 0, width, height, GDK_RGB_DITHER_NONE, 0, 0);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_skin.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,245 @@
+/*  Audacious
+ *  Copyright (C) 2005-2007  Audacious development team.
+ *
+ *  BMP - Cross-platform multimedia player
+ *  Copyright (C) 2003-2004  BMP development team.
+ *
+ *  Based on XMMS:
+ *  Copyright (C) 1998-2003  XMMS development team.
+ *
+ *  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; under version 3 of the License.
+ *
+ *  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, see <http://www.gnu.org/licenses>.
+ *
+ *  The Audacious team does not consider modular code linking to
+ *  Audacious or using our public API to be a derived work.
+ */
+
+#ifndef SKIN_H
+#define SKIN_H
+
+#include <glib.h>
+#include <gdk/gdk.h>
+#include <gtk/gtk.h>
+
+#define BMP_DEFAULT_SKIN_PATH \
+  DATA_DIR G_DIR_SEPARATOR_S "Skins" G_DIR_SEPARATOR_S "Default"
+
+typedef enum {
+    SKIN_MAIN = 0,
+    SKIN_CBUTTONS,
+    SKIN_TITLEBAR,
+    SKIN_SHUFREP,
+    SKIN_TEXT,
+    SKIN_VOLUME,
+    SKIN_BALANCE,
+    SKIN_MONOSTEREO,
+    SKIN_PLAYPAUSE,
+    SKIN_NUMBERS,
+    SKIN_POSBAR,
+    SKIN_PLEDIT,
+    SKIN_EQMAIN,
+    SKIN_EQ_EX,
+    SKIN_PIXMAP_COUNT
+} SkinPixmapId;
+
+typedef enum {
+    SKIN_MASK_MAIN = 0,
+    SKIN_MASK_MAIN_SHADE,
+    SKIN_MASK_EQ,
+    SKIN_MASK_EQ_SHADE,
+    SKIN_MASK_COUNT
+} SkinMaskId;
+
+typedef enum {
+    SKIN_PLEDIT_NORMAL = 0,
+    SKIN_PLEDIT_CURRENT,
+    SKIN_PLEDIT_NORMALBG,
+    SKIN_PLEDIT_SELECTEDBG,
+    SKIN_TEXTBG,
+    SKIN_TEXTFG,
+    SKIN_COLOR_COUNT
+} SkinColorId;
+
+typedef struct _SkinProperties {
+	/* this enables the othertext engine, not it's visibility -nenolod */
+	gboolean mainwin_othertext;
+
+	/* Vis properties */
+	gint mainwin_vis_x;
+	gint mainwin_vis_y;
+	gint mainwin_vis_width;
+	gboolean mainwin_vis_visible;
+
+	/* Text properties */
+	gint mainwin_text_x;
+	gint mainwin_text_y;
+	gint mainwin_text_width;
+	gboolean mainwin_text_visible;
+
+	/* Infobar properties */
+	gint mainwin_infobar_x;
+	gint mainwin_infobar_y;
+	gboolean mainwin_othertext_visible;
+
+	gint mainwin_number_0_x;
+	gint mainwin_number_0_y;
+
+	gint mainwin_number_1_x;
+	gint mainwin_number_1_y;
+
+	gint mainwin_number_2_x;
+	gint mainwin_number_2_y;
+
+	gint mainwin_number_3_x;
+	gint mainwin_number_3_y;
+
+	gint mainwin_number_4_x;
+	gint mainwin_number_4_y;
+
+	gint mainwin_playstatus_x;
+	gint mainwin_playstatus_y;
+
+	gint mainwin_volume_x;
+	gint mainwin_volume_y;	
+
+	gint mainwin_balance_x;
+	gint mainwin_balance_y;	
+
+	gint mainwin_position_x;
+	gint mainwin_position_y;
+
+	gint mainwin_previous_x;
+	gint mainwin_previous_y;
+
+	gint mainwin_play_x;
+	gint mainwin_play_y;
+
+	gint mainwin_pause_x;
+	gint mainwin_pause_y;
+
+	gint mainwin_stop_x;
+	gint mainwin_stop_y;
+
+	gint mainwin_next_x;
+	gint mainwin_next_y;
+
+	gint mainwin_eject_x;
+	gint mainwin_eject_y;
+
+	gint mainwin_eqbutton_x;
+	gint mainwin_eqbutton_y;
+
+	gint mainwin_plbutton_x;
+	gint mainwin_plbutton_y;
+
+	gint mainwin_shuffle_x;
+	gint mainwin_shuffle_y;
+
+	gint mainwin_repeat_x;
+	gint mainwin_repeat_y;
+
+	gint mainwin_about_x;
+	gint mainwin_about_y;
+
+	gint mainwin_minimize_x;
+	gint mainwin_minimize_y;
+
+	gint mainwin_shade_x;
+	gint mainwin_shade_y;
+
+	gint mainwin_close_x;
+	gint mainwin_close_y;
+
+	gint mainwin_width;
+	gint mainwin_height;
+
+	gboolean mainwin_menurow_visible;
+	gboolean mainwin_othertext_is_status;
+
+	gint textbox_bitmap_font_width;
+	gint textbox_bitmap_font_height;
+} SkinProperties;
+
+#define SKIN_PIXMAP(x)  ((SkinPixmap *)(x))
+typedef struct _SkinPixmap {
+    GdkPixbuf *pixbuf;
+
+    /* The real size of the pixmap */
+    gint width, height;
+
+    /* The size of the pixmap from the current skin,
+       which might be smaller */
+    gint current_width, current_height;
+} SkinPixmap;
+
+
+#define SKIN(x)  ((Skin *)(x))
+typedef struct _Skin {
+    GMutex *lock;
+    gchar *path;
+    gchar *def_path;
+    SkinPixmap pixmaps[SKIN_PIXMAP_COUNT];
+    GdkColor textbg[6], def_textbg[6];
+    GdkColor textfg[6], def_textfg[6];
+    GdkColor *colors[SKIN_COLOR_COUNT];
+    guchar vis_color[24][3];
+    GdkBitmap *masks[SKIN_MASK_COUNT];
+    GdkBitmap *scaled_masks[SKIN_MASK_COUNT];
+    SkinProperties properties;
+} Skin;
+
+extern Skin *aud_active_skin;
+
+gboolean init_skins(const gchar * path);
+void cleanup_skins(void);
+
+gboolean aud_active_skin_load(const gchar * path);
+gboolean aud_active_skin_reload(void);
+
+Skin *skin_new(void);
+gboolean skin_load(Skin * skin, const gchar * path);
+gboolean skin_reload_forced(void);
+void skin_reload(Skin * skin);
+void skin_free(Skin * skin);
+void skin_destroy(Skin * skin);
+
+GdkBitmap *skin_get_mask(Skin * skin, SkinMaskId mi);
+GdkColor *skin_get_color(Skin * skin, SkinColorId color_id);
+
+void skin_get_viscolor(Skin * skin, guchar vis_color[24][3]);
+gint skin_get_id(void);
+void skin_draw_pixbuf(GtkWidget *widget, Skin * skin, GdkPixbuf * pix,
+                 SkinPixmapId pixmap_id,
+                 gint xsrc, gint ysrc, gint xdest, gint ydest,
+                 gint width, gint height);
+
+void skin_get_eq_spline_colors(Skin * skin, guint32 colors[19]);
+void skin_install_skin(const gchar * path);
+
+void skin_draw_playlistwin_shaded(Skin * skin, GdkPixbuf * pix,
+                                  gint width, gboolean focus);
+void skin_draw_playlistwin_frame(Skin * skin, GdkPixbuf * pix,
+                                 gint width, gint height, gboolean focus);
+
+void skin_draw_mainwin_titlebar(Skin * skin, GdkPixbuf * pix,
+                                gboolean shaded, gboolean focus);
+
+
+void skin_parse_hints(Skin * skin, gchar *path_p);
+
+
+void skin_set_random_skin(void);
+
+
+void ui_skinned_widget_draw(GtkWidget *widget, GdkPixbuf *obj, gint width, gint height, gboolean scale);
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_skinned_button.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,529 @@
+/*
+ * Audacious - a cross-platform multimedia player
+ * Copyright (c) 2007 Tomasz Moń
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+#include "ui_skinned_button.h"
+#include "skins_cfg.h"
+#include <math.h>
+
+#define UI_SKINNED_BUTTON_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ui_skinned_button_get_type(), UiSkinnedButtonPrivate))
+typedef struct _UiSkinnedButtonPrivate UiSkinnedButtonPrivate;
+
+enum {
+    PRESSED,
+    RELEASED,
+    CLICKED,
+    DOUBLED,
+    LAST_SIGNAL
+};
+
+struct _UiSkinnedButtonPrivate {
+    //Skinned part
+    GdkGC            *gc;
+    gint             w;
+    gint             h;
+    SkinPixmapId     skin_index1;
+    SkinPixmapId     skin_index2;
+    gboolean         scaled;
+    gint             move_x, move_y;
+
+    gint             nx, ny, px, py;
+    //Toogle button needs also those
+    gint             pnx, pny, ppx, ppy;
+};
+
+
+static GtkWidgetClass *parent_class = NULL;
+static void ui_skinned_button_class_init(UiSkinnedButtonClass *klass);
+static void ui_skinned_button_init(UiSkinnedButton *button);
+static void ui_skinned_button_destroy(GtkObject *object);
+static void ui_skinned_button_realize(GtkWidget *widget);
+static void ui_skinned_button_unrealize(GtkWidget *widget);
+static void ui_skinned_button_map(GtkWidget *widget);
+static void ui_skinned_button_unmap(GtkWidget *widget);
+static void ui_skinned_button_size_request(GtkWidget *widget, GtkRequisition *requisition);
+static gint ui_skinned_button_expose(GtkWidget *widget,GdkEventExpose *event);
+
+static void ui_skinned_button_size_allocate(GtkWidget *widget, GtkAllocation *allocation);
+static void ui_skinned_button_update_state(UiSkinnedButton *button);
+
+static guint button_signals[LAST_SIGNAL] = { 0 };
+static gint ui_skinned_button_button_press(GtkWidget *widget, GdkEventButton *event);
+static gint ui_skinned_button_button_release(GtkWidget *widget, GdkEventButton *event);
+static void button_pressed(UiSkinnedButton *button);
+static void button_released(UiSkinnedButton *button);
+static void ui_skinned_button_pressed(UiSkinnedButton *button);
+static void ui_skinned_button_released(UiSkinnedButton *button);
+static void ui_skinned_button_clicked(UiSkinnedButton *button);
+static void ui_skinned_button_set_pressed (UiSkinnedButton *button, gboolean pressed);
+
+static void ui_skinned_button_toggle_scaled(UiSkinnedButton *button);
+
+static gint ui_skinned_button_enter_notify(GtkWidget *widget, GdkEventCrossing *event);
+static gint ui_skinned_button_leave_notify(GtkWidget *widget, GdkEventCrossing *event);
+
+GType ui_skinned_button_get_type() {
+    static GType button_type = 0;
+    if (!button_type) {
+        static const GTypeInfo button_info = {
+            sizeof (UiSkinnedButtonClass),
+            NULL,
+            NULL,
+            (GClassInitFunc) ui_skinned_button_class_init,
+            NULL,
+            NULL,
+            sizeof (UiSkinnedButton),
+            0,
+            (GInstanceInitFunc) ui_skinned_button_init,
+        };
+        button_type = g_type_register_static (GTK_TYPE_WIDGET, "UiSkinnedButton", &button_info, 0);
+    }
+
+    return button_type;
+}
+
+static void ui_skinned_button_class_init (UiSkinnedButtonClass *klass) {
+    GObjectClass *gobject_class;
+    GtkObjectClass *object_class;
+    GtkWidgetClass *widget_class;
+
+    gobject_class = G_OBJECT_CLASS(klass);
+    object_class = (GtkObjectClass*) klass;
+    widget_class = (GtkWidgetClass*) klass;
+    parent_class = gtk_type_class (gtk_widget_get_type ());
+
+    object_class->destroy = ui_skinned_button_destroy;
+
+    widget_class->realize = ui_skinned_button_realize;
+    widget_class->unrealize = ui_skinned_button_unrealize;
+    widget_class->map = ui_skinned_button_map;
+    widget_class->unmap = ui_skinned_button_unmap;
+    widget_class->expose_event = ui_skinned_button_expose;
+    widget_class->size_request = ui_skinned_button_size_request;
+    widget_class->size_allocate = ui_skinned_button_size_allocate;
+    widget_class->button_press_event = ui_skinned_button_button_press;
+    widget_class->button_release_event = ui_skinned_button_button_release;
+    widget_class->enter_notify_event = ui_skinned_button_enter_notify;
+    widget_class->leave_notify_event = ui_skinned_button_leave_notify;
+
+    klass->pressed = button_pressed;
+    klass->released = button_released;
+    klass->clicked = NULL;
+    klass->scaled = ui_skinned_button_toggle_scaled;
+
+    button_signals[PRESSED] = 
+        g_signal_new ("pressed", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST,
+                      G_STRUCT_OFFSET (UiSkinnedButtonClass, pressed), NULL, NULL,
+                      gtk_marshal_VOID__VOID, G_TYPE_NONE, 0);
+
+    button_signals[RELEASED] = 
+        g_signal_new ("released", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST,
+                      G_STRUCT_OFFSET (UiSkinnedButtonClass, released), NULL, NULL,
+                      gtk_marshal_VOID__VOID, G_TYPE_NONE, 0);
+
+    button_signals[CLICKED] = 
+        g_signal_new ("clicked", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
+                      G_STRUCT_OFFSET (UiSkinnedButtonClass, clicked), NULL, NULL,
+                      gtk_marshal_VOID__VOID, G_TYPE_NONE, 0);
+
+    button_signals[DOUBLED] = 
+        g_signal_new ("toggle-scaled", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
+                      G_STRUCT_OFFSET (UiSkinnedButtonClass, scaled), NULL, NULL,
+                      gtk_marshal_VOID__VOID, G_TYPE_NONE, 0);
+
+    g_type_class_add_private (gobject_class, sizeof (UiSkinnedButtonPrivate));
+}
+
+static void ui_skinned_button_init (UiSkinnedButton *button) {
+    UiSkinnedButtonPrivate *priv = UI_SKINNED_BUTTON_GET_PRIVATE (button);
+    button->inside = FALSE;
+    button->type = TYPE_NOT_SET;
+    priv->move_x = 0;
+    priv->move_y = 0;
+    button->event_window = NULL;
+}
+
+static void ui_skinned_button_destroy (GtkObject *object) {
+    UiSkinnedButton *button;
+
+    g_return_if_fail (object != NULL);
+    g_return_if_fail (UI_SKINNED_IS_BUTTON (object));
+
+    button = UI_SKINNED_BUTTON(object);
+
+    if (GTK_OBJECT_CLASS (parent_class)->destroy)
+        (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
+}
+
+static void ui_skinned_button_realize (GtkWidget *widget) {
+    g_return_if_fail (widget != NULL);
+    g_return_if_fail (UI_SKINNED_IS_BUTTON(widget));
+    UiSkinnedButton *button = UI_SKINNED_BUTTON (widget);
+    GdkWindowAttr attributes;
+    gint attributes_mask;
+
+    GTK_WIDGET_SET_FLAGS(widget, GTK_REALIZED);
+
+    attributes.x = widget->allocation.x;
+    attributes.y = widget->allocation.y;
+    attributes.width = widget->allocation.width;
+    attributes.height = widget->allocation.height;
+    attributes.window_type = GDK_WINDOW_CHILD;
+    attributes.event_mask = gtk_widget_get_events(widget);
+    attributes.event_mask |= GDK_ENTER_NOTIFY_MASK | GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK;
+
+    if (button->type == TYPE_SMALL || button->type == TYPE_NOT_SET) {
+        widget->window = gtk_widget_get_parent_window (widget);
+        g_object_ref (widget->window);
+        attributes.wclass = GDK_INPUT_ONLY;
+        attributes_mask = GDK_WA_X | GDK_WA_Y;
+        button->event_window = gdk_window_new (widget->window, &attributes, attributes_mask);
+        GTK_WIDGET_SET_FLAGS (widget, GTK_NO_WINDOW);
+        gdk_window_set_user_data(button->event_window, widget);
+    } else {
+        attributes.visual = gtk_widget_get_visual(widget);
+        attributes.colormap = gtk_widget_get_colormap(widget);
+        attributes.wclass = GDK_INPUT_OUTPUT;
+        attributes.event_mask |= GDK_EXPOSURE_MASK;
+        attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
+        widget->window = gdk_window_new(widget->parent->window, &attributes, attributes_mask);
+        GTK_WIDGET_UNSET_FLAGS (widget, GTK_NO_WINDOW);
+        gdk_window_set_user_data(widget->window, widget);
+    }
+
+    widget->style = gtk_style_attach(widget->style, widget->window);
+}
+
+static void ui_skinned_button_unrealize (GtkWidget *widget) {
+    UiSkinnedButton *button = UI_SKINNED_BUTTON (widget);
+
+    if ( button->event_window != NULL )
+    {
+      gdk_window_set_user_data( button->event_window , NULL );
+      gdk_window_destroy( button->event_window );
+      button->event_window = NULL;
+    }
+
+    if (GTK_WIDGET_CLASS (parent_class)->unrealize)
+        (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);
+}
+
+static void ui_skinned_button_map (GtkWidget *widget)
+{
+    UiSkinnedButton *button = UI_SKINNED_BUTTON (widget);
+
+    if (button->event_window != NULL)
+      gdk_window_show (button->event_window);
+
+    if (GTK_WIDGET_CLASS (parent_class)->map)
+      (* GTK_WIDGET_CLASS (parent_class)->map) (widget);
+}
+
+static void ui_skinned_button_unmap (GtkWidget *widget)
+{
+    UiSkinnedButton *button = UI_SKINNED_BUTTON (widget);
+
+    if (button->event_window != NULL)
+      gdk_window_hide (button->event_window);
+
+    if (GTK_WIDGET_CLASS (parent_class)->unmap)
+      (* GTK_WIDGET_CLASS (parent_class)->unmap) (widget);
+}
+
+static void ui_skinned_button_size_request(GtkWidget *widget, GtkRequisition *requisition) {
+    UiSkinnedButtonPrivate *priv = UI_SKINNED_BUTTON_GET_PRIVATE(widget);
+    requisition->width = priv->w*(priv->scaled ? config.scale_factor : 1);
+    requisition->height = priv->h*(priv->scaled ? config.scale_factor : 1);
+}
+
+static void ui_skinned_button_size_allocate(GtkWidget *widget, GtkAllocation *allocation) {
+    UiSkinnedButton *button = UI_SKINNED_BUTTON (widget);
+    UiSkinnedButtonPrivate *priv = UI_SKINNED_BUTTON_GET_PRIVATE (button);
+    widget->allocation = *allocation;
+    widget->allocation.x = ceil(widget->allocation.x*(priv->scaled ? config.scale_factor : 1));
+    widget->allocation.y = ceil(widget->allocation.y*(priv->scaled ? config.scale_factor : 1));
+
+    if (GTK_WIDGET_REALIZED (widget))
+    {
+        if ( button->event_window != NULL )
+            gdk_window_move_resize(button->event_window, ceil(allocation->x*(priv->scaled ? config.scale_factor : 1)), ceil(allocation->y*(priv->scaled ? config.scale_factor : 1)), allocation->width, allocation->height);
+        else
+            gdk_window_move_resize(widget->window, ceil(allocation->x*(priv->scaled ? config.scale_factor : 1)), ceil(allocation->y*(priv->scaled ? config.scale_factor : 1)), allocation->width, allocation->height);
+    }
+
+    if (button->x + priv->move_x == ceil(widget->allocation.x/(priv->scaled ? config.scale_factor : 1)))
+        priv->move_x = 0;
+    if (button->y + priv->move_y == ceil(widget->allocation.y/(priv->scaled ? config.scale_factor : 1)))
+        priv->move_y = 0;
+
+    button->x = ceil(widget->allocation.x/(priv->scaled ? config.scale_factor : 1));
+    button->y = ceil(widget->allocation.y/(priv->scaled ? config.scale_factor : 1));
+}
+
+static gboolean ui_skinned_button_expose(GtkWidget *widget, GdkEventExpose *event) {
+    g_return_val_if_fail (widget != NULL, FALSE);
+    g_return_val_if_fail (UI_SKINNED_IS_BUTTON (widget), FALSE);
+    g_return_val_if_fail (event != NULL, FALSE);
+
+    UiSkinnedButton *button = UI_SKINNED_BUTTON (widget);
+    UiSkinnedButtonPrivate *priv = UI_SKINNED_BUTTON_GET_PRIVATE (button);
+    g_return_val_if_fail (priv->w > 0 && priv->h > 0, FALSE);
+
+    //TYPE_SMALL doesn't have its own face
+    if (button->type == TYPE_SMALL || button->type == TYPE_NOT_SET)
+        return FALSE;
+
+    /* paranoia */
+    if (button->event_window != NULL)
+        return FALSE;
+
+    GdkPixbuf *obj;
+    obj = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, priv->w, priv->h);
+
+    switch (button->type) {
+        case TYPE_PUSH:
+            skin_draw_pixbuf(widget, aud_active_skin, obj,
+                             button->pressed ? priv->skin_index2 : priv->skin_index1,
+                             button->pressed ? priv->px : priv->nx,
+                             button->pressed ? priv->py : priv->ny,
+                             0, 0, priv->w, priv->h);
+            break;
+        case TYPE_TOGGLE:
+            if (button->inside)
+                skin_draw_pixbuf(widget, aud_active_skin, obj,
+                                 button->pressed ? priv->skin_index2 : priv->skin_index1,
+                                 button->pressed ? priv->ppx : priv->pnx,
+                                 button->pressed ? priv->ppy : priv->pny,
+                                 0, 0, priv->w, priv->h);
+            else
+                skin_draw_pixbuf(widget, aud_active_skin, obj,
+                                 button->pressed ? priv->skin_index2 : priv->skin_index1,
+                                 button->pressed ? priv->px : priv->nx,
+                                 button->pressed ? priv->py : priv->ny,
+                                 0, 0, priv->w, priv->h);
+            break;
+        default:
+            break;
+    }
+
+    ui_skinned_widget_draw(widget, obj, priv->w, priv->h, priv->scaled);
+    g_object_unref(obj);
+
+    return FALSE;
+}
+
+GtkWidget* ui_skinned_button_new () {
+    UiSkinnedButton *button = g_object_new (ui_skinned_button_get_type (), NULL);
+
+    return GTK_WIDGET(button);
+}
+
+void ui_skinned_push_button_setup(GtkWidget *button, GtkWidget *fixed, gint x, gint y, gint w, gint h, gint nx, gint ny, gint px, gint py, SkinPixmapId si) {
+
+    UiSkinnedButton *sbutton = UI_SKINNED_BUTTON(button);
+    UiSkinnedButtonPrivate *priv = UI_SKINNED_BUTTON_GET_PRIVATE(sbutton);
+    priv->w = w;
+    priv->h = h;
+    sbutton->x = x;
+    sbutton->y = y;
+    priv->nx = nx;
+    priv->ny = ny;
+    priv->px = px;
+    priv->py = py;
+    sbutton->type = TYPE_PUSH;
+    priv->skin_index1 = si;
+    priv->skin_index2 = si;
+    priv->scaled = FALSE;
+
+    gtk_fixed_put(GTK_FIXED(fixed), GTK_WIDGET(button), sbutton->x, sbutton->y);
+}
+
+void ui_skinned_toggle_button_setup(GtkWidget *button, GtkWidget *fixed, gint x, gint y, gint w, gint h, gint nx, gint ny, gint px, gint py, gint pnx, gint pny, gint ppx, gint ppy, SkinPixmapId si) {
+
+    UiSkinnedButton *sbutton = UI_SKINNED_BUTTON(button);
+    UiSkinnedButtonPrivate *priv = UI_SKINNED_BUTTON_GET_PRIVATE(sbutton);
+    priv->w = w;
+    priv->h = h;
+    sbutton->x = x;
+    sbutton->y = y;
+    priv->nx = nx;
+    priv->ny = ny;
+    priv->px = px;
+    priv->py = py;
+    priv->pnx = pnx;
+    priv->pny = pny;
+    priv->ppx = ppx;
+    priv->ppy = ppy;
+    sbutton->type = TYPE_TOGGLE;
+    priv->skin_index1 = si;
+    priv->skin_index2 = si;
+    priv->scaled = FALSE;
+
+    gtk_fixed_put(GTK_FIXED(fixed), GTK_WIDGET(button), sbutton->x, sbutton->y);
+}
+
+void ui_skinned_small_button_setup(GtkWidget *button, GtkWidget *fixed, gint x, gint y, gint w, gint h) {
+
+    UiSkinnedButton *sbutton = UI_SKINNED_BUTTON(button);
+    UiSkinnedButtonPrivate *priv = UI_SKINNED_BUTTON_GET_PRIVATE(sbutton);
+    priv->w = w;
+    priv->h = h;
+    sbutton->x = x;
+    sbutton->y = y;
+    sbutton->type = TYPE_SMALL;
+    priv->scaled = FALSE;
+
+    gtk_fixed_put(GTK_FIXED(fixed), GTK_WIDGET(button), sbutton->x, sbutton->y);
+}
+
+static void button_pressed(UiSkinnedButton *button) {
+    button->button_down = TRUE;
+    ui_skinned_button_update_state(button);
+}
+
+static void button_released(UiSkinnedButton *button) {
+    button->button_down = FALSE;
+    if(button->hover) ui_skinned_button_clicked(button);
+    ui_skinned_button_update_state(button);
+}
+
+static void ui_skinned_button_update_state(UiSkinnedButton *button) {
+    ui_skinned_button_set_pressed(button, button->button_down); 
+}
+
+static void ui_skinned_button_set_pressed (UiSkinnedButton *button, gboolean pressed) {
+    if (pressed != button->pressed) {
+        button->pressed = pressed;
+        gtk_widget_queue_draw(GTK_WIDGET(button));
+    }
+}
+
+static gboolean ui_skinned_button_button_press(GtkWidget *widget, GdkEventButton *event) {
+    UiSkinnedButton *button;
+
+    if (event->type == GDK_BUTTON_PRESS) {
+        button = UI_SKINNED_BUTTON(widget);
+
+        if (event->button == 1)
+            ui_skinned_button_pressed (button);
+        else if (event->button == 3) {
+            event->x = event->x + button->x;
+            event->y = event->y + button->y;
+            return FALSE;
+        }
+    }
+
+    return TRUE;
+}
+
+static gboolean ui_skinned_button_button_release(GtkWidget *widget, GdkEventButton *event) {
+    UiSkinnedButton *button;
+    if (event->button == 1) {
+            button = UI_SKINNED_BUTTON(widget);
+            ui_skinned_button_released(button);
+    }
+    return TRUE;
+}
+
+static void ui_skinned_button_pressed(UiSkinnedButton *button) {
+    g_return_if_fail(UI_SKINNED_IS_BUTTON(button));
+    g_signal_emit(button, button_signals[PRESSED], 0);
+}
+
+static void ui_skinned_button_released(UiSkinnedButton *button) {
+    g_return_if_fail(UI_SKINNED_IS_BUTTON(button));
+    g_signal_emit(button, button_signals[RELEASED], 0);
+}
+
+static void ui_skinned_button_clicked(UiSkinnedButton *button) {
+    g_return_if_fail(UI_SKINNED_IS_BUTTON(button));
+    button->inside = !button->inside;
+    g_signal_emit(button, button_signals[CLICKED], 0);
+}
+
+static gboolean ui_skinned_button_enter_notify(GtkWidget *widget, GdkEventCrossing *event) {
+    UiSkinnedButton *button;
+
+    button = UI_SKINNED_BUTTON(widget);
+    button->hover = TRUE;
+    if(button->button_down) ui_skinned_button_set_pressed(button, TRUE);
+
+    return FALSE;
+}
+
+static gboolean ui_skinned_button_leave_notify(GtkWidget *widget, GdkEventCrossing *event) {
+    UiSkinnedButton *button;
+
+    button = UI_SKINNED_BUTTON (widget);
+    button->hover = FALSE;
+    if(button->button_down) ui_skinned_button_set_pressed(button, FALSE);
+
+    return FALSE;
+}
+
+static void ui_skinned_button_toggle_scaled(UiSkinnedButton *button) {
+    GtkWidget *widget = GTK_WIDGET (button);
+    UiSkinnedButtonPrivate *priv = UI_SKINNED_BUTTON_GET_PRIVATE (button);
+    priv->scaled = !priv->scaled;
+
+    gtk_widget_set_size_request(widget, priv->w*(priv->scaled ? config.scale_factor : 1), priv->h*(priv->scaled ? config.scale_factor : 1));
+
+    gtk_widget_queue_draw(widget);
+}
+
+void ui_skinned_set_push_button_data(GtkWidget *button, gint nx, gint ny, gint px, gint py) {
+    UiSkinnedButtonPrivate *priv = UI_SKINNED_BUTTON_GET_PRIVATE(button);
+    if (nx > -1) priv->nx = nx;
+    if (ny > -1) priv->ny = ny;
+    if (px > -1) priv->px = px;
+    if (py > -1) priv->py = py;
+    gtk_widget_queue_draw(button);
+}
+
+void ui_skinned_button_set_skin_index(GtkWidget *button, SkinPixmapId si) {
+    UiSkinnedButtonPrivate *priv = UI_SKINNED_BUTTON_GET_PRIVATE (button);
+    priv->skin_index1 = priv->skin_index2 = si;
+}
+
+void ui_skinned_button_set_skin_index1(GtkWidget *button, SkinPixmapId si) {
+    UiSkinnedButtonPrivate *priv = UI_SKINNED_BUTTON_GET_PRIVATE (button);
+    priv->skin_index1 = si;
+}
+
+void ui_skinned_button_set_skin_index2(GtkWidget *button, SkinPixmapId si) {
+    UiSkinnedButtonPrivate *priv = UI_SKINNED_BUTTON_GET_PRIVATE (button);
+    priv->skin_index2 = si;
+}
+
+void ui_skinned_button_move_relative(GtkWidget *widget, gint x, gint y) {
+    UiSkinnedButton *button = UI_SKINNED_BUTTON(widget);
+    UiSkinnedButtonPrivate *priv = UI_SKINNED_BUTTON_GET_PRIVATE(widget);
+    priv->move_x += x;
+    priv->move_y += y;
+    gtk_fixed_move(GTK_FIXED(gtk_widget_get_parent(widget)), widget,
+                   button->x+priv->move_x, button->y+priv->move_y);
+}
+
+void ui_skinned_button_set_inside(GtkWidget *widget, gboolean inside) {
+    g_return_if_fail(UI_SKINNED_IS_BUTTON(widget));
+
+    UiSkinnedButton *button = UI_SKINNED_BUTTON(widget);
+    button->inside = inside;
+    gtk_widget_queue_draw(widget);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_skinned_button.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,74 @@
+/*
+ * Audacious - a cross-platform multimedia player
+ * Copyright (c) 2007 Tomasz Moń
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+#ifndef AUDACIOUS_UI_SKINNED_BUTTON_H
+#define AUDACIOUS_UI_SKINNED_BUTTON_H
+
+#include <gtk/gtk.h>
+#include "ui_skin.h"
+
+#define UI_SKINNED_BUTTON(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), ui_skinned_button_get_type(), UiSkinnedButton))
+#define UI_SKINNED_BUTTON_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  ui_skinned_button_get_type(), UiSkinnedButtonClass))
+#define UI_SKINNED_IS_BUTTON(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), ui_skinned_button_get_type()))
+
+typedef struct _UiSkinnedButton		UiSkinnedButton;
+typedef struct _UiSkinnedButtonClass	UiSkinnedButtonClass;
+
+enum {
+    TYPE_NOT_SET,
+    TYPE_PUSH,
+    TYPE_TOGGLE,
+    TYPE_SMALL
+};
+
+struct _UiSkinnedButton {
+    GtkWidget widget;
+
+    GdkWindow *event_window;
+    gboolean button_down;
+    gboolean pressed;
+    gboolean hover;
+    gboolean inside;
+    gint type;
+    gint x, y;
+};
+
+struct _UiSkinnedButtonClass {
+    GtkWidgetClass          parent_class;
+    void (* pressed)       (UiSkinnedButton *button);
+    void (* released)      (UiSkinnedButton *button);
+    void (* clicked)       (UiSkinnedButton *button);
+    void (* right_clicked) (UiSkinnedButton *button);
+    void (* scaled)        (UiSkinnedButton *button);
+};
+
+GType ui_skinned_button_get_type(void) G_GNUC_CONST;
+GtkWidget* ui_skinned_button_new();
+void ui_skinned_push_button_setup(GtkWidget *button, GtkWidget *fixed, gint x, gint y, gint w, gint h, gint nx, gint ny, gint px, gint py, SkinPixmapId si);
+void ui_skinned_set_push_button_data(GtkWidget *button, gint nx, gint ny, gint px, gint py);
+void ui_skinned_toggle_button_setup(GtkWidget *button, GtkWidget *fixed, gint x, gint y, gint w, gint h, gint nx, gint ny, gint px, gint py, gint pnx, gint pny, gint ppx, gint ppy, SkinPixmapId si);
+void ui_skinned_small_button_setup(GtkWidget *button, GtkWidget *fixed, gint x, gint y, gint w, gint h);
+void ui_skinned_button_set_skin_index(GtkWidget *button, SkinPixmapId si);
+void ui_skinned_button_set_skin_index1(GtkWidget *button, SkinPixmapId si);
+void ui_skinned_button_set_skin_index2(GtkWidget *button, SkinPixmapId si);
+void ui_skinned_button_move_relative(GtkWidget *button, gint x, gint y);
+void ui_skinned_button_set_inside(GtkWidget *widget, gboolean inside);
+
+#endif /* AUDACIOUS_UI_SKINNED_BUTTON_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_skinned_equalizer_graph.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,307 @@
+/*
+ * Audacious - a cross-platform multimedia player
+ * Copyright (c) 2007 Tomasz Moń
+ *
+ * Based on:
+ * BMP - Cross-platform multimedia player
+ * Copyright (C) 2003-2004  BMP development team.
+ * XMMS:
+ * Copyright (C) 1998-2003  XMMS development team.
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ */
+
+#include "ui_skin.h"
+#include "ui_skinned_equalizer_graph.h"
+#include "skins_cfg.h"
+#include <audacious/plugin.h>
+
+#define UI_TYPE_SKINNED_EQUALIZER_GRAPH           (ui_skinned_equalizer_graph_get_type())
+
+enum {
+    DOUBLED,
+    LAST_SIGNAL
+};
+
+static void ui_skinned_equalizer_graph_class_init         (UiSkinnedEqualizerGraphClass *klass);
+static void ui_skinned_equalizer_graph_init               (UiSkinnedEqualizerGraph *equalizer_graph);
+static void ui_skinned_equalizer_graph_destroy            (GtkObject *object);
+static void ui_skinned_equalizer_graph_realize            (GtkWidget *widget);
+static void ui_skinned_equalizer_graph_size_request       (GtkWidget *widget, GtkRequisition *requisition);
+static void ui_skinned_equalizer_graph_size_allocate      (GtkWidget *widget, GtkAllocation *allocation);
+static gboolean ui_skinned_equalizer_graph_expose         (GtkWidget *widget, GdkEventExpose *event);
+static void ui_skinned_equalizer_graph_toggle_scaled  (UiSkinnedEqualizerGraph *equalizer_graph);
+
+static GtkWidgetClass *parent_class = NULL;
+static guint equalizer_graph_signals[LAST_SIGNAL] = { 0 };
+
+GType ui_skinned_equalizer_graph_get_type() {
+    static GType equalizer_graph_type = 0;
+    if (!equalizer_graph_type) {
+        static const GTypeInfo equalizer_graph_info = {
+            sizeof (UiSkinnedEqualizerGraphClass),
+            NULL,
+            NULL,
+            (GClassInitFunc) ui_skinned_equalizer_graph_class_init,
+            NULL,
+            NULL,
+            sizeof (UiSkinnedEqualizerGraph),
+            0,
+            (GInstanceInitFunc) ui_skinned_equalizer_graph_init,
+        };
+        equalizer_graph_type = g_type_register_static (GTK_TYPE_WIDGET, "UiSkinnedEqualizerGraph", &equalizer_graph_info, 0);
+    }
+
+    return equalizer_graph_type;
+}
+
+static void ui_skinned_equalizer_graph_class_init(UiSkinnedEqualizerGraphClass *klass) {
+    GObjectClass *gobject_class;
+    GtkObjectClass *object_class;
+    GtkWidgetClass *widget_class;
+
+    gobject_class = G_OBJECT_CLASS(klass);
+    object_class = (GtkObjectClass*) klass;
+    widget_class = (GtkWidgetClass*) klass;
+    parent_class = gtk_type_class (gtk_widget_get_type ());
+
+    object_class->destroy = ui_skinned_equalizer_graph_destroy;
+
+    widget_class->realize = ui_skinned_equalizer_graph_realize;
+    widget_class->expose_event = ui_skinned_equalizer_graph_expose;
+    widget_class->size_request = ui_skinned_equalizer_graph_size_request;
+    widget_class->size_allocate = ui_skinned_equalizer_graph_size_allocate;
+
+    klass->scaled = ui_skinned_equalizer_graph_toggle_scaled;
+
+    equalizer_graph_signals[DOUBLED] = 
+        g_signal_new ("toggle-scaled", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
+                      G_STRUCT_OFFSET (UiSkinnedEqualizerGraphClass, scaled), NULL, NULL,
+                      gtk_marshal_VOID__VOID, G_TYPE_NONE, 0);
+}
+
+static void ui_skinned_equalizer_graph_init(UiSkinnedEqualizerGraph *equalizer_graph) {
+    equalizer_graph->width = 113;
+    equalizer_graph->height = 19;
+}
+
+GtkWidget* ui_skinned_equalizer_graph_new(GtkWidget *fixed, gint x, gint y) {
+    UiSkinnedEqualizerGraph *equalizer_graph = g_object_new (ui_skinned_equalizer_graph_get_type (), NULL);
+
+    equalizer_graph->x = x;
+    equalizer_graph->y = y;
+    equalizer_graph->skin_index = SKIN_EQMAIN;
+    equalizer_graph->scaled = FALSE;
+
+    gtk_fixed_put(GTK_FIXED(fixed), GTK_WIDGET(equalizer_graph), equalizer_graph->x, equalizer_graph->y);
+
+    return GTK_WIDGET(equalizer_graph);
+}
+
+static void ui_skinned_equalizer_graph_destroy(GtkObject *object) {
+    UiSkinnedEqualizerGraph *equalizer_graph;
+
+    g_return_if_fail (object != NULL);
+    g_return_if_fail (UI_SKINNED_IS_EQUALIZER_GRAPH (object));
+
+    equalizer_graph = UI_SKINNED_EQUALIZER_GRAPH (object);
+
+    if (GTK_OBJECT_CLASS (parent_class)->destroy)
+        (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
+}
+
+static void ui_skinned_equalizer_graph_realize(GtkWidget *widget) {
+    UiSkinnedEqualizerGraph *equalizer_graph;
+    GdkWindowAttr attributes;
+    gint attributes_mask;
+
+    g_return_if_fail (widget != NULL);
+    g_return_if_fail (UI_SKINNED_IS_EQUALIZER_GRAPH(widget));
+
+    GTK_WIDGET_SET_FLAGS(widget, GTK_REALIZED);
+    equalizer_graph = UI_SKINNED_EQUALIZER_GRAPH(widget);
+
+    attributes.x = widget->allocation.x;
+    attributes.y = widget->allocation.y;
+    attributes.width = widget->allocation.width;
+    attributes.height = widget->allocation.height;
+    attributes.wclass = GDK_INPUT_OUTPUT;
+    attributes.window_type = GDK_WINDOW_CHILD;
+    attributes.event_mask = gtk_widget_get_events(widget);
+    attributes.event_mask |= GDK_EXPOSURE_MASK;
+    attributes.visual = gtk_widget_get_visual(widget);
+    attributes.colormap = gtk_widget_get_colormap(widget);
+
+    attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
+    widget->window = gdk_window_new(widget->parent->window, &attributes, attributes_mask);
+
+    widget->style = gtk_style_attach(widget->style, widget->window);
+
+    gdk_window_set_user_data(widget->window, widget);
+}
+
+static void ui_skinned_equalizer_graph_size_request(GtkWidget *widget, GtkRequisition *requisition) {
+    UiSkinnedEqualizerGraph *equalizer_graph = UI_SKINNED_EQUALIZER_GRAPH(widget);
+
+    requisition->width = equalizer_graph->width*(equalizer_graph->scaled ? config.scale_factor : 1);
+    requisition->height = equalizer_graph->height*(equalizer_graph->scaled ? config.scale_factor : 1);
+}
+
+static void ui_skinned_equalizer_graph_size_allocate(GtkWidget *widget, GtkAllocation *allocation) {
+    UiSkinnedEqualizerGraph *equalizer_graph = UI_SKINNED_EQUALIZER_GRAPH (widget);
+
+    widget->allocation = *allocation;
+    widget->allocation.x *= (equalizer_graph->scaled ? config.scale_factor : 1);
+    widget->allocation.y *= (equalizer_graph->scaled ? config.scale_factor : 1);
+    if (GTK_WIDGET_REALIZED (widget))
+        gdk_window_move_resize(widget->window, widget->allocation.x, widget->allocation.y, allocation->width, allocation->height);
+
+    equalizer_graph->x = widget->allocation.x/(equalizer_graph->scaled ? config.scale_factor : 1);
+    equalizer_graph->y = widget->allocation.y/(equalizer_graph->scaled ? config.scale_factor : 1);
+}
+
+void
+init_spline(gfloat * x, gfloat * y, gint n, gfloat * y2)
+{
+    gint i, k;
+    gfloat p, qn, sig, un, *u;
+
+    u = (gfloat *) g_malloc(n * sizeof(gfloat));
+
+    y2[0] = u[0] = 0.0;
+
+    for (i = 1; i < n - 1; i++) {
+        sig = ((gfloat) x[i] - x[i - 1]) / ((gfloat) x[i + 1] - x[i - 1]);
+        p = sig * y2[i - 1] + 2.0;
+        y2[i] = (sig - 1.0) / p;
+        u[i] =
+            (((gfloat) y[i + 1] - y[i]) / (x[i + 1] - x[i])) -
+            (((gfloat) y[i] - y[i - 1]) / (x[i] - x[i - 1]));
+        u[i] = (6.0 * u[i] / (x[i + 1] - x[i - 1]) - sig * u[i - 1]) / p;
+    }
+    qn = un = 0.0;
+
+    y2[n - 1] = (un - qn * u[n - 2]) / (qn * y2[n - 2] + 1.0);
+    for (k = n - 2; k >= 0; k--)
+        y2[k] = y2[k] * y2[k + 1] + u[k];
+    g_free(u);
+}
+
+gfloat
+eval_spline(gfloat xa[], gfloat ya[], gfloat y2a[], gint n, gfloat x)
+{
+    gint klo, khi, k;
+    gfloat h, b, a;
+
+    klo = 0;
+    khi = n - 1;
+    while (khi - klo > 1) {
+        k = (khi + klo) >> 1;
+        if (xa[k] > x)
+            khi = k;
+        else
+            klo = k;
+    }
+    h = xa[khi] - xa[klo];
+    a = (xa[khi] - x) / h;
+    b = (x - xa[klo]) / h;
+    return (a * ya[klo] + b * ya[khi] +
+            ((a * a * a - a) * y2a[klo] +
+             (b * b * b - b) * y2a[khi]) * (h * h) / 6.0);
+}
+
+static gboolean ui_skinned_equalizer_graph_expose(GtkWidget *widget, GdkEventExpose *event) {
+    g_return_val_if_fail (widget != NULL, FALSE);
+    g_return_val_if_fail (UI_SKINNED_IS_EQUALIZER_GRAPH (widget), FALSE);
+    g_return_val_if_fail (event != NULL, FALSE);
+
+    UiSkinnedEqualizerGraph *equalizer_graph = UI_SKINNED_EQUALIZER_GRAPH (widget);
+    g_return_val_if_fail (equalizer_graph->width > 0 && equalizer_graph->height > 0, FALSE);
+
+    GdkPixbuf *obj = NULL;
+
+    obj = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, equalizer_graph->width, equalizer_graph->height);
+
+    guint32 cols[19], rowstride;
+    gint i, y, ymin, ymax, py = 0;
+    gfloat x[] = { 0, 11, 23, 35, 47, 59, 71, 83, 97, 109 }, yf[10];
+    guchar* pixels, *p;
+    gint n_channels;
+    /*
+     * This avoids the init_spline() function to be inlined.
+     * Inlining the function caused troubles when compiling with
+     * `-O' (at least on FreeBSD).
+     */
+    void (*__init_spline) (gfloat *, gfloat *, gint, gfloat *) = init_spline;
+
+    skin_draw_pixbuf(widget, aud_active_skin, obj, equalizer_graph->skin_index, 0, 294, 0, 0,
+                     equalizer_graph->width, equalizer_graph->height);
+    skin_draw_pixbuf(widget, aud_active_skin, obj, equalizer_graph->skin_index, 0, 314,
+                     0, 9 + ((aud_cfg->equalizer_preamp * 9) / 20),
+                     equalizer_graph->width, 1);
+
+    skin_get_eq_spline_colors(aud_active_skin, cols);
+
+    __init_spline(x, aud_cfg->equalizer_bands, 10, yf);
+    for (i = 0; i < 109; i++) {
+        y = 9 -
+            (gint) ((eval_spline(x, aud_cfg->equalizer_bands, yf, 10, i) *
+                     9.0) / EQUALIZER_MAX_GAIN);
+        if (y < 0)
+            y = 0;
+        if (y > 18)
+            y = 18;
+        if (!i)
+            py = y;
+        if (y < py) {
+            ymin = y;
+            ymax = py;
+        }
+        else {
+            ymin = py;
+            ymax = y;
+        }
+        py = y;
+
+        pixels = gdk_pixbuf_get_pixels(obj);
+        rowstride = gdk_pixbuf_get_rowstride(obj);
+        n_channels = gdk_pixbuf_get_n_channels(obj); 
+
+        for (y = ymin; y <= ymax; y++) 
+        {
+            p = pixels + (y * rowstride) + (( i + 2) * n_channels); 
+            p[0] = (cols[y] & 0xff0000) >> 16;
+            p[1] = (cols[y] & 0x00ff00) >> 8;
+            p[2] = (cols[y] & 0x0000ff);
+            /* do we really need to treat the alpha channel? */
+            /*if (n_channels == 4)
+                  p[3] = cols[y] >> 24;*/
+        }
+    }
+
+    ui_skinned_widget_draw(widget, obj, equalizer_graph->width, equalizer_graph->height, equalizer_graph->scaled);
+
+    g_object_unref(obj);
+
+    return FALSE;
+}
+
+static void ui_skinned_equalizer_graph_toggle_scaled(UiSkinnedEqualizerGraph *equalizer_graph) {
+    GtkWidget *widget = GTK_WIDGET (equalizer_graph);
+
+    equalizer_graph->scaled = !equalizer_graph->scaled;
+    gtk_widget_set_size_request(widget, equalizer_graph->width*(equalizer_graph->scaled ? config.scale_factor : 1),
+                                        equalizer_graph->height*(equalizer_graph->scaled ? config.scale_factor : 1));
+
+    gtk_widget_queue_draw(GTK_WIDGET(equalizer_graph));
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_skinned_equalizer_graph.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,65 @@
+/*
+ * Audacious - a cross-platform multimedia player
+ * Copyright (c) 2007 Tomasz Moń
+ *
+ * Based on:
+ * BMP - Cross-platform multimedia player
+ * Copyright (C) 2003-2004  BMP development team.
+ * XMMS:
+ * Copyright (C) 1998-2003  XMMS development team.
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+#ifndef AUDACIOUS_UI_SKINNED_EQUALIZER_GRAPH_H
+#define AUDACIOUS_UI_SKINNED_EQUALIZER_GRAPH_H
+
+#include <gtk/gtk.h>
+#include "ui_skin.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define EQUALIZER_MAX_GAIN 12.0
+
+#define UI_SKINNED_EQUALIZER_GRAPH(obj)          GTK_CHECK_CAST (obj, ui_skinned_equalizer_graph_get_type (), UiSkinnedEqualizerGraph)
+#define UI_SKINNED_EQUALIZER_GRAPH_CLASS(klass)  GTK_CHECK_CLASS_CAST (klass, ui_skinned_equalizer_graph_get_type (), UiSkinnedEqualizerGraphClass)
+#define UI_SKINNED_IS_EQUALIZER_GRAPH(obj)       GTK_CHECK_TYPE (obj, ui_skinned_equalizer_graph_get_type ())
+
+typedef struct _UiSkinnedEqualizerGraph        UiSkinnedEqualizerGraph;
+typedef struct _UiSkinnedEqualizerGraphClass   UiSkinnedEqualizerGraphClass;
+
+struct _UiSkinnedEqualizerGraph {
+    GtkWidget        widget;
+
+    gint             x, y, width, height;
+    SkinPixmapId     skin_index;
+    gboolean         scaled;
+};
+
+struct _UiSkinnedEqualizerGraphClass {
+    GtkWidgetClass          parent_class;
+    void (* scaled)        (UiSkinnedEqualizerGraph *eq_graph);
+};
+
+GtkWidget* ui_skinned_equalizer_graph_new(GtkWidget *fixed, gint x, gint y);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* AUDACIOUS_UI_SKINNED_EQUALIZER_GRAPH_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_skinned_equalizer_slider.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,392 @@
+/*
+ * Audacious - a cross-platform multimedia player
+ * Copyright (c) 2007 Tomasz Moń
+ *
+ * Based on:
+ * BMP - Cross-platform multimedia player
+ * Copyright (C) 2003-2004  BMP development team.
+ * XMMS:
+ * Copyright (C) 1998-2003  XMMS development team.
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ */
+
+#include "ui_skin.h"
+#include "ui_equalizer.h"
+#include "ui_main.h"
+#include "skins_cfg.h"
+#include "ui_skinned_equalizer_slider.h"
+#include <glib/gi18n.h>
+
+#define UI_TYPE_SKINNED_EQUALIZER_SLIDER           (ui_skinned_equalizer_slider_get_type())
+#define UI_SKINNED_EQUALIZER_SLIDER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), UI_TYPE_SKINNED_EQUALIZER_SLIDER, UiSkinnedEqualizerSliderPrivate))
+typedef struct _UiSkinnedEqualizerSliderPrivate UiSkinnedEqualizerSliderPrivate;
+
+enum {
+    DOUBLED,
+    LAST_SIGNAL
+};
+
+struct _UiSkinnedEqualizerSliderPrivate {
+    SkinPixmapId     skin_index;
+    gboolean         scaled;
+    gint             position;
+    gint             width, height;
+    gboolean         pressed;
+    gint             drag_y;
+    gfloat           value; /* store gain as is to prevent truncation --asphyx */
+};
+
+static void ui_skinned_equalizer_slider_class_init         (UiSkinnedEqualizerSliderClass *klass);
+static void ui_skinned_equalizer_slider_init               (UiSkinnedEqualizerSlider *equalizer_slider);
+static void ui_skinned_equalizer_slider_destroy            (GtkObject *object);
+static void ui_skinned_equalizer_slider_realize            (GtkWidget *widget);
+static void ui_skinned_equalizer_slider_size_request       (GtkWidget *widget, GtkRequisition *requisition);
+static void ui_skinned_equalizer_slider_size_allocate      (GtkWidget *widget, GtkAllocation *allocation);
+static gboolean ui_skinned_equalizer_slider_expose         (GtkWidget *widget, GdkEventExpose *event);
+static gboolean ui_skinned_equalizer_slider_button_press   (GtkWidget *widget, GdkEventButton *event);
+static gboolean ui_skinned_equalizer_slider_button_release (GtkWidget *widget, GdkEventButton *event);
+static gboolean ui_skinned_equalizer_slider_motion_notify  (GtkWidget *widget, GdkEventMotion *event);
+static gboolean ui_skinned_equalizer_slider_scroll         (GtkWidget *widget, GdkEventScroll *event);
+static void ui_skinned_equalizer_slider_toggle_scaled      (UiSkinnedEqualizerSlider *equalizer_slider);
+void ui_skinned_equalizer_slider_set_mainwin_text          (UiSkinnedEqualizerSlider * es);
+
+static GtkWidgetClass *parent_class = NULL;
+static guint equalizer_slider_signals[LAST_SIGNAL] = { 0 };
+
+GType ui_skinned_equalizer_slider_get_type() {
+    static GType equalizer_slider_type = 0;
+    if (!equalizer_slider_type) {
+        static const GTypeInfo equalizer_slider_info = {
+            sizeof (UiSkinnedEqualizerSliderClass),
+            NULL,
+            NULL,
+            (GClassInitFunc) ui_skinned_equalizer_slider_class_init,
+            NULL,
+            NULL,
+            sizeof (UiSkinnedEqualizerSlider),
+            0,
+            (GInstanceInitFunc) ui_skinned_equalizer_slider_init,
+        };
+        equalizer_slider_type = g_type_register_static (GTK_TYPE_WIDGET, "UiSkinnedEqualizerSlider", &equalizer_slider_info, 0);
+    }
+
+    return equalizer_slider_type;
+}
+
+static void ui_skinned_equalizer_slider_class_init(UiSkinnedEqualizerSliderClass *klass) {
+    GObjectClass *gobject_class;
+    GtkObjectClass *object_class;
+    GtkWidgetClass *widget_class;
+
+    gobject_class = G_OBJECT_CLASS(klass);
+    object_class = (GtkObjectClass*) klass;
+    widget_class = (GtkWidgetClass*) klass;
+    parent_class = gtk_type_class (gtk_widget_get_type ());
+
+    object_class->destroy = ui_skinned_equalizer_slider_destroy;
+
+    widget_class->realize = ui_skinned_equalizer_slider_realize;
+    widget_class->expose_event = ui_skinned_equalizer_slider_expose;
+    widget_class->size_request = ui_skinned_equalizer_slider_size_request;
+    widget_class->size_allocate = ui_skinned_equalizer_slider_size_allocate;
+    widget_class->button_press_event = ui_skinned_equalizer_slider_button_press;
+    widget_class->button_release_event = ui_skinned_equalizer_slider_button_release;
+    widget_class->motion_notify_event = ui_skinned_equalizer_slider_motion_notify;
+    widget_class->scroll_event = ui_skinned_equalizer_slider_scroll;
+
+    klass->scaled = ui_skinned_equalizer_slider_toggle_scaled;
+
+    equalizer_slider_signals[DOUBLED] = 
+        g_signal_new ("toggle-scaled", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
+                      G_STRUCT_OFFSET (UiSkinnedEqualizerSliderClass, scaled), NULL, NULL,
+                      gtk_marshal_VOID__VOID, G_TYPE_NONE, 0);
+
+    g_type_class_add_private (gobject_class, sizeof (UiSkinnedEqualizerSliderPrivate));
+}
+
+static void ui_skinned_equalizer_slider_init(UiSkinnedEqualizerSlider *equalizer_slider) {
+    UiSkinnedEqualizerSliderPrivate *priv = UI_SKINNED_EQUALIZER_SLIDER_GET_PRIVATE(equalizer_slider);
+    priv->pressed = FALSE;
+}
+
+GtkWidget* ui_skinned_equalizer_slider_new(GtkWidget *fixed, gint x, gint y) {
+    UiSkinnedEqualizerSlider *es = g_object_new (ui_skinned_equalizer_slider_get_type (), NULL);
+    UiSkinnedEqualizerSliderPrivate *priv = UI_SKINNED_EQUALIZER_SLIDER_GET_PRIVATE(es);
+
+    es->x = x;
+    es->y = y;
+    priv->width = 14;
+    priv->height = 63;
+    priv->skin_index = SKIN_EQMAIN;
+
+    gtk_fixed_put(GTK_FIXED(fixed), GTK_WIDGET(es), es->x, es->y);
+
+    return GTK_WIDGET(es);
+}
+
+static void ui_skinned_equalizer_slider_destroy(GtkObject *object) {
+    UiSkinnedEqualizerSlider *equalizer_slider;
+
+    g_return_if_fail (object != NULL);
+    g_return_if_fail (UI_SKINNED_IS_EQUALIZER_SLIDER (object));
+
+    equalizer_slider = UI_SKINNED_EQUALIZER_SLIDER (object);
+
+    if (GTK_OBJECT_CLASS (parent_class)->destroy)
+        (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
+}
+
+static void ui_skinned_equalizer_slider_realize(GtkWidget *widget) {
+    UiSkinnedEqualizerSlider *equalizer_slider;
+    GdkWindowAttr attributes;
+    gint attributes_mask;
+
+    g_return_if_fail (widget != NULL);
+    g_return_if_fail (UI_SKINNED_IS_EQUALIZER_SLIDER(widget));
+
+    GTK_WIDGET_SET_FLAGS(widget, GTK_REALIZED);
+    equalizer_slider = UI_SKINNED_EQUALIZER_SLIDER(widget);
+
+    attributes.x = widget->allocation.x;
+    attributes.y = widget->allocation.y;
+    attributes.width = widget->allocation.width;
+    attributes.height = widget->allocation.height;
+    attributes.wclass = GDK_INPUT_OUTPUT;
+    attributes.window_type = GDK_WINDOW_CHILD;
+    attributes.event_mask = gtk_widget_get_events(widget);
+    attributes.event_mask |= GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
+                             GDK_POINTER_MOTION_MASK | GDK_SCROLL_MASK;
+    attributes.visual = gtk_widget_get_visual(widget);
+    attributes.colormap = gtk_widget_get_colormap(widget);
+
+    attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
+    widget->window = gdk_window_new(widget->parent->window, &attributes, attributes_mask);
+
+    widget->style = gtk_style_attach(widget->style, widget->window);
+    gdk_window_set_user_data(widget->window, widget);
+}
+
+static void ui_skinned_equalizer_slider_size_request(GtkWidget *widget, GtkRequisition *requisition) {
+    UiSkinnedEqualizerSliderPrivate *priv = UI_SKINNED_EQUALIZER_SLIDER_GET_PRIVATE(widget);
+
+    requisition->width = priv->width*(priv->scaled ? config.scale_factor : 1);
+    requisition->height = priv->height*(priv->scaled ? config.scale_factor : 1);
+}
+
+static void ui_skinned_equalizer_slider_size_allocate(GtkWidget *widget, GtkAllocation *allocation) {
+    UiSkinnedEqualizerSlider *equalizer_slider = UI_SKINNED_EQUALIZER_SLIDER (widget);
+    UiSkinnedEqualizerSliderPrivate *priv = UI_SKINNED_EQUALIZER_SLIDER_GET_PRIVATE(equalizer_slider);
+
+    widget->allocation = *allocation;
+    widget->allocation.x *= (priv->scaled ? config.scale_factor : 1);
+    widget->allocation.y *= (priv->scaled ? config.scale_factor : 1);
+    if (GTK_WIDGET_REALIZED (widget))
+        gdk_window_move_resize(widget->window, widget->allocation.x, widget->allocation.y, allocation->width, allocation->height);
+
+    equalizer_slider->x = widget->allocation.x/(priv->scaled ? config.scale_factor : 1);
+    equalizer_slider->y = widget->allocation.y/(priv->scaled ? config.scale_factor : 1);
+}
+
+static gboolean ui_skinned_equalizer_slider_expose(GtkWidget *widget, GdkEventExpose *event) {
+    g_return_val_if_fail (widget != NULL, FALSE);
+    g_return_val_if_fail (UI_SKINNED_IS_EQUALIZER_SLIDER (widget), FALSE);
+    g_return_val_if_fail (event != NULL, FALSE);
+
+    UiSkinnedEqualizerSlider *es = UI_SKINNED_EQUALIZER_SLIDER (widget);
+    UiSkinnedEqualizerSliderPrivate *priv = UI_SKINNED_EQUALIZER_SLIDER_GET_PRIVATE(es);
+    g_return_val_if_fail (priv->width > 0 && priv->height > 0, FALSE);
+
+    GdkPixbuf *obj = NULL;
+    obj = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, priv->width, priv->height);
+
+    gint frame;
+    frame = 27 - ((priv->position * 27) / 50);
+    if (frame < 14)
+        skin_draw_pixbuf(widget, aud_active_skin, obj, priv->skin_index, (frame * 15) + 13, 164, 0, 0, priv->width, priv->height);
+    else
+        skin_draw_pixbuf(widget, aud_active_skin, obj, priv->skin_index, ((frame - 14) * 15) + 13, 229, 0, 0, priv->width, priv->height);
+
+    if (priv->pressed)
+        skin_draw_pixbuf(widget, aud_active_skin, obj, priv->skin_index, 0, 176, 1, priv->position, 11, 11);
+    else
+        skin_draw_pixbuf(widget, aud_active_skin, obj, priv->skin_index, 0, 164, 1, priv->position, 11, 11);
+
+    ui_skinned_widget_draw(widget, obj, priv->width, priv->height, priv->scaled);
+
+    g_object_unref(obj);
+
+    return FALSE;
+}
+
+static gboolean ui_skinned_equalizer_slider_button_press(GtkWidget *widget, GdkEventButton *event) {
+    g_return_val_if_fail (widget != NULL, FALSE);
+    g_return_val_if_fail (UI_SKINNED_IS_EQUALIZER_SLIDER (widget), FALSE);
+    g_return_val_if_fail (event != NULL, FALSE);
+
+    UiSkinnedEqualizerSlider *es = UI_SKINNED_EQUALIZER_SLIDER (widget);
+    UiSkinnedEqualizerSliderPrivate *priv = UI_SKINNED_EQUALIZER_SLIDER_GET_PRIVATE(es);
+
+    gint y;
+
+    if (event->type == GDK_BUTTON_PRESS) {
+        if (event->button == 1) {
+            priv->pressed = TRUE;
+            y = event->y/(priv->scaled ? config.scale_factor : 1);
+
+            if (y >= priv->position && y < priv->position + 11)
+                priv->drag_y = y - priv->position;
+            else {
+                priv->position = y - 5;
+                priv->drag_y = 5;
+                if (priv->position < 0)
+                    priv->position = 0;
+                if (priv->position > 50)
+                    priv->position = 50;
+                if (priv->position >= 24 && priv->position <= 26)
+                    priv->position = 25;
+
+                priv->value = ((gfloat) (25 - priv->position) * EQUALIZER_MAX_GAIN / 25.0 );
+                equalizerwin_eq_changed();
+            }
+
+            ui_skinned_equalizer_slider_set_mainwin_text(es);
+            gtk_widget_queue_draw(widget);
+        }
+    }
+
+    return TRUE;
+}
+
+static gboolean ui_skinned_equalizer_slider_button_release(GtkWidget *widget, GdkEventButton *event) {
+    UiSkinnedEqualizerSliderPrivate *priv = UI_SKINNED_EQUALIZER_SLIDER_GET_PRIVATE(widget);
+
+    if (event->button == 1) {
+        priv->pressed = FALSE;
+        mainwin_release_info_text();
+        gtk_widget_queue_draw(widget);
+    }
+    return TRUE;
+}
+
+static gboolean ui_skinned_equalizer_slider_motion_notify(GtkWidget *widget, GdkEventMotion *event) {
+    g_return_val_if_fail (widget != NULL, FALSE);
+    g_return_val_if_fail (UI_SKINNED_IS_EQUALIZER_SLIDER (widget), FALSE);
+    g_return_val_if_fail (event != NULL, FALSE);
+    UiSkinnedEqualizerSlider *es = UI_SKINNED_EQUALIZER_SLIDER(widget);
+    UiSkinnedEqualizerSliderPrivate *priv = UI_SKINNED_EQUALIZER_SLIDER_GET_PRIVATE(widget);
+
+    if (priv->pressed) {
+        gint y;
+
+        y = event->y/(priv->scaled ? config.scale_factor : 1);
+        priv->position = y - priv->drag_y;
+
+        if (priv->position < 0)
+            priv->position = 0;
+        if (priv->position > 50)
+            priv->position = 50;
+        if (priv->position >= 24 && priv->position <= 26)
+            priv->position = 25;
+
+        priv->value = ((gfloat) (25 - priv->position) * EQUALIZER_MAX_GAIN / 25.0 );
+        ui_skinned_equalizer_slider_set_mainwin_text(es);
+        equalizerwin_eq_changed();
+        gtk_widget_queue_draw(widget);
+    }
+
+    return TRUE;
+}
+
+static gboolean ui_skinned_equalizer_slider_scroll(GtkWidget *widget, GdkEventScroll *event) {
+    g_return_val_if_fail (UI_SKINNED_IS_EQUALIZER_SLIDER (widget), FALSE);
+    g_return_val_if_fail (event != NULL, FALSE);
+    UiSkinnedEqualizerSliderPrivate *priv = UI_SKINNED_EQUALIZER_SLIDER_GET_PRIVATE(widget);
+
+    if (event->direction == GDK_SCROLL_UP) {
+        priv->position -= 2;
+
+        if (priv->position < 0)
+            priv->position = 0;
+    }
+    else {
+        priv->position += 2;
+
+        if (priv->position > 50)
+            priv->position = 50;
+    }
+
+    priv->value = ((gfloat) (25 - priv->position) * EQUALIZER_MAX_GAIN / 25.0 );
+    equalizerwin_eq_changed();
+    gtk_widget_queue_draw(widget);
+    return TRUE;
+}
+
+static void ui_skinned_equalizer_slider_toggle_scaled(UiSkinnedEqualizerSlider *equalizer_slider) {
+    GtkWidget *widget = GTK_WIDGET (equalizer_slider);
+    UiSkinnedEqualizerSliderPrivate *priv = UI_SKINNED_EQUALIZER_SLIDER_GET_PRIVATE(equalizer_slider);
+
+    priv->scaled = !priv->scaled;
+
+    gtk_widget_set_size_request(widget, priv->width*(priv->scaled ? config.scale_factor : 1),
+    priv->height*(priv->scaled ? config.scale_factor : 1));
+
+    gtk_widget_queue_draw(GTK_WIDGET(equalizer_slider));
+}
+
+void ui_skinned_equalizer_slider_set_position(GtkWidget *widget, gfloat pos) {
+    g_return_if_fail (UI_SKINNED_IS_EQUALIZER_SLIDER (widget));
+    UiSkinnedEqualizerSliderPrivate *priv = UI_SKINNED_EQUALIZER_SLIDER_GET_PRIVATE(widget);
+
+    if (priv->pressed)
+        return;
+
+    priv->value = (pos > EQUALIZER_MAX_GAIN) ? EQUALIZER_MAX_GAIN : ((pos < -EQUALIZER_MAX_GAIN) ? -EQUALIZER_MAX_GAIN : pos);
+    priv->position = 25 - (gint) ((pos * 25.0) / EQUALIZER_MAX_GAIN);
+
+    if (priv->position < 0)
+        priv->position = 0;
+
+    if (priv->position > 50)
+        priv->position = 50;
+
+    if (priv->position >= 24 && priv->position <= 26)
+        priv->position = 25;
+
+    gtk_widget_queue_draw(widget);
+}
+
+gfloat ui_skinned_equalizer_slider_get_position(GtkWidget *widget) {
+    g_return_val_if_fail (UI_SKINNED_IS_EQUALIZER_SLIDER (widget), -1);
+    UiSkinnedEqualizerSliderPrivate *priv = UI_SKINNED_EQUALIZER_SLIDER_GET_PRIVATE(widget);
+    return priv->value;
+}
+
+void ui_skinned_equalizer_slider_set_mainwin_text(UiSkinnedEqualizerSlider * es) {
+    gint band = 0;
+    const gchar *bandname[11] = { N_("PREAMP"), N_("60HZ"), N_("170HZ"),
+        N_("310HZ"), N_("600HZ"), N_("1KHZ"),
+        N_("3KHZ"), N_("6KHZ"), N_("12KHZ"),
+        N_("14KHZ"), N_("16KHZ")
+    };
+    gchar *tmp;
+
+    if (es->x > 21)
+        band = ((es->x - 78) / 18) + 1;
+
+    tmp =
+        g_strdup_printf("EQ: %s: %+.1f DB", _(bandname[band]),
+                        ui_skinned_equalizer_slider_get_position(GTK_WIDGET(es)));
+    mainwin_lock_info_text(tmp);
+    g_free(tmp);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_skinned_equalizer_slider.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,62 @@
+/*
+ * Audacious - a cross-platform multimedia player
+ * Copyright (c) 2007 Tomasz Moń
+ *
+ * Based on:
+ * BMP - Cross-platform multimedia player
+ * Copyright (C) 2003-2004  BMP development team.
+ * XMMS:
+ * Copyright (C) 1998-2003  XMMS development team.
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ */
+
+#ifndef AUDACIOUS_UI_SKINNED_EQUALIZER_SLIDER_H
+#define AUDACIOUS_UI_SKINNED_EQUALIZER_SLIDER_H
+
+#include <gtk/gtk.h>
+#include "ui_skin.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define EQUALIZER_MAX_GAIN 12.0
+
+#define UI_SKINNED_EQUALIZER_SLIDER(obj)          GTK_CHECK_CAST (obj, ui_skinned_equalizer_slider_get_type (), UiSkinnedEqualizerSlider)
+#define UI_SKINNED_EQUALIZER_SLIDER_CLASS(klass)  GTK_CHECK_CLASS_CAST (klass, ui_skinned_equalizer_slider_get_type (),  UiSkinnedEqualizerSliderClass)
+#define UI_SKINNED_IS_EQUALIZER_SLIDER(obj)       GTK_CHECK_TYPE (obj, ui_skinned_equalizer_slider_get_type ())
+
+typedef struct _UiSkinnedEqualizerSlider        UiSkinnedEqualizerSlider;
+typedef struct _UiSkinnedEqualizerSliderClass   UiSkinnedEqualizerSliderClass;
+
+struct _UiSkinnedEqualizerSlider {
+    GtkWidget   widget;
+    gint        x, y;
+};
+
+struct _UiSkinnedEqualizerSliderClass {
+    GtkWidgetClass    parent_class;
+    void (* scaled)  (UiSkinnedEqualizerSlider *equalizer_slider);
+};
+
+GtkWidget* ui_skinned_equalizer_slider_new(GtkWidget *fixed, gint x, gint y);
+GtkType ui_skinned_equalizer_slider_get_type(void);
+void ui_skinned_equalizer_slider_set_position(GtkWidget *widget, gfloat pos);
+gfloat ui_skinned_equalizer_slider_get_position(GtkWidget *widget);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* AUDACIOUS_UI_SKINNED_EQUALIZER_SLIDER_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_skinned_horizontal_slider.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,386 @@
+/*
+ * Audacious - a cross-platform multimedia player
+ * Copyright (c) 2007 Tomasz Moń
+ *
+ * Based on:
+ * BMP - Cross-platform multimedia player
+ * Copyright (C) 2003-2004  BMP development team.
+ * XMMS:
+ * Copyright (C) 1998-2003  XMMS development team.
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+#include "ui_skinned_horizontal_slider.h"
+#include "skins_cfg.h"
+#include <math.h>
+
+#define UI_SKINNED_HORIZONTAL_SLIDER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ui_skinned_horizontal_slider_get_type(), UiSkinnedHorizontalSliderPrivate))
+typedef struct _UiSkinnedHorizontalSliderPrivate UiSkinnedHorizontalSliderPrivate;
+
+enum {
+    MOTION,
+    RELEASE,
+    DOUBLED,
+    LAST_SIGNAL
+};
+
+struct _UiSkinnedHorizontalSliderPrivate {
+    SkinPixmapId     skin_index;
+    gboolean         scaled;
+    gint             frame, frame_offset, frame_height, min, max;
+    gint             knob_width, knob_height;
+    gint             position;
+    gint             width, height;
+    gint             (*frame_cb) (gint);
+};
+
+static void ui_skinned_horizontal_slider_class_init         (UiSkinnedHorizontalSliderClass *klass);
+static void ui_skinned_horizontal_slider_init               (UiSkinnedHorizontalSlider *horizontal_slider);
+static void ui_skinned_horizontal_slider_destroy            (GtkObject *object);
+static void ui_skinned_horizontal_slider_realize            (GtkWidget *widget);
+static void ui_skinned_horizontal_slider_size_request       (GtkWidget *widget, GtkRequisition *requisition);
+static void ui_skinned_horizontal_slider_size_allocate      (GtkWidget *widget, GtkAllocation *allocation);
+static gboolean ui_skinned_horizontal_slider_expose         (GtkWidget *widget, GdkEventExpose *event);
+static gboolean ui_skinned_horizontal_slider_button_press   (GtkWidget *widget, GdkEventButton *event);
+static gboolean ui_skinned_horizontal_slider_button_release (GtkWidget *widget, GdkEventButton *event);
+static gboolean ui_skinned_horizontal_slider_motion_notify  (GtkWidget *widget, GdkEventMotion *event);
+static void ui_skinned_horizontal_slider_toggle_scaled  (UiSkinnedHorizontalSlider *horizontal_slider);
+
+static GtkWidgetClass *parent_class = NULL;
+static guint horizontal_slider_signals[LAST_SIGNAL] = { 0 };
+
+GType ui_skinned_horizontal_slider_get_type() {
+    static GType horizontal_slider_type = 0;
+    if (!horizontal_slider_type) {
+        static const GTypeInfo horizontal_slider_info = {
+            sizeof (UiSkinnedHorizontalSliderClass),
+            NULL,
+            NULL,
+            (GClassInitFunc) ui_skinned_horizontal_slider_class_init,
+            NULL,
+            NULL,
+            sizeof (UiSkinnedHorizontalSlider),
+            0,
+            (GInstanceInitFunc) ui_skinned_horizontal_slider_init,
+        };
+        horizontal_slider_type = g_type_register_static (GTK_TYPE_WIDGET, "UiSkinnedHorizontalSlider", &horizontal_slider_info, 0);
+    }
+
+    return horizontal_slider_type;
+}
+
+static void ui_skinned_horizontal_slider_class_init(UiSkinnedHorizontalSliderClass *klass) {
+    GObjectClass *gobject_class;
+    GtkObjectClass *object_class;
+    GtkWidgetClass *widget_class;
+
+    gobject_class = G_OBJECT_CLASS(klass);
+    object_class = (GtkObjectClass*) klass;
+    widget_class = (GtkWidgetClass*) klass;
+    parent_class = gtk_type_class (gtk_widget_get_type ());
+
+    object_class->destroy = ui_skinned_horizontal_slider_destroy;
+
+    widget_class->realize = ui_skinned_horizontal_slider_realize;
+    widget_class->expose_event = ui_skinned_horizontal_slider_expose;
+    widget_class->size_request = ui_skinned_horizontal_slider_size_request;
+    widget_class->size_allocate = ui_skinned_horizontal_slider_size_allocate;
+    widget_class->button_press_event = ui_skinned_horizontal_slider_button_press;
+    widget_class->button_release_event = ui_skinned_horizontal_slider_button_release;
+    widget_class->motion_notify_event = ui_skinned_horizontal_slider_motion_notify;
+
+    klass->motion = NULL;
+    klass->release = NULL;
+    klass->scaled = ui_skinned_horizontal_slider_toggle_scaled;
+
+    horizontal_slider_signals[MOTION] = 
+        g_signal_new ("motion", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
+                      G_STRUCT_OFFSET (UiSkinnedHorizontalSliderClass, motion), NULL, NULL,
+                      gtk_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
+
+    horizontal_slider_signals[RELEASE] = 
+        g_signal_new ("release", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
+                      G_STRUCT_OFFSET (UiSkinnedHorizontalSliderClass, release), NULL, NULL,
+                      gtk_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
+
+    horizontal_slider_signals[DOUBLED] = 
+        g_signal_new ("toggle-scaled", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
+                      G_STRUCT_OFFSET (UiSkinnedHorizontalSliderClass, scaled), NULL, NULL,
+                      gtk_marshal_VOID__VOID, G_TYPE_NONE, 0);
+
+    g_type_class_add_private (gobject_class, sizeof (UiSkinnedHorizontalSliderPrivate));
+}
+
+static void ui_skinned_horizontal_slider_init(UiSkinnedHorizontalSlider *horizontal_slider) {
+    horizontal_slider->pressed = FALSE;
+}
+
+GtkWidget* ui_skinned_horizontal_slider_new(GtkWidget *fixed, gint x, gint y, gint w, gint h, gint knx, gint kny,
+                                            gint kpx, gint kpy, gint kw, gint kh, gint fh,
+                                            gint fo, gint min, gint max, gint(*fcb) (gint), SkinPixmapId si) {
+
+    UiSkinnedHorizontalSlider *hs = g_object_new (ui_skinned_horizontal_slider_get_type (), NULL);
+    UiSkinnedHorizontalSliderPrivate *priv = UI_SKINNED_HORIZONTAL_SLIDER_GET_PRIVATE(hs);
+
+    hs->x = x;
+    hs->y = y;
+    priv->width = w;
+    priv->height = h;
+    hs->knob_nx = knx;
+    hs->knob_ny = kny;
+    hs->knob_px = kpx;
+    hs->knob_py = kpy;
+    priv->knob_width = kw;
+    priv->knob_height = kh;
+    priv->frame_height = fh;
+    priv->frame_offset = fo;
+    priv->min = min;
+    priv->position = min;
+    priv->max = max;
+    priv->frame_cb = fcb;
+    if (priv->frame_cb)
+        priv->frame = priv->frame_cb(0);
+    priv->skin_index = si;
+
+    gtk_fixed_put(GTK_FIXED(fixed), GTK_WIDGET(hs), hs->x, hs->y);
+
+    return GTK_WIDGET(hs);
+}
+
+static void ui_skinned_horizontal_slider_destroy(GtkObject *object) {
+    UiSkinnedHorizontalSlider *horizontal_slider;
+
+    g_return_if_fail (object != NULL);
+    g_return_if_fail (UI_SKINNED_IS_HORIZONTAL_SLIDER (object));
+
+    horizontal_slider = UI_SKINNED_HORIZONTAL_SLIDER (object);
+
+    if (GTK_OBJECT_CLASS (parent_class)->destroy)
+        (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
+}
+
+static void ui_skinned_horizontal_slider_realize(GtkWidget *widget) {
+    UiSkinnedHorizontalSlider *horizontal_slider;
+    GdkWindowAttr attributes;
+    gint attributes_mask;
+
+    g_return_if_fail (widget != NULL);
+    g_return_if_fail (UI_SKINNED_IS_HORIZONTAL_SLIDER(widget));
+
+    GTK_WIDGET_SET_FLAGS(widget, GTK_REALIZED);
+    horizontal_slider = UI_SKINNED_HORIZONTAL_SLIDER(widget);
+
+    attributes.x = widget->allocation.x;
+    attributes.y = widget->allocation.y;
+    attributes.width = widget->allocation.width;
+    attributes.height = widget->allocation.height;
+    attributes.wclass = GDK_INPUT_OUTPUT;
+    attributes.window_type = GDK_WINDOW_CHILD;
+    attributes.event_mask = gtk_widget_get_events(widget);
+    attributes.event_mask |= GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | 
+                             GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK;
+    attributes.visual = gtk_widget_get_visual(widget);
+    attributes.colormap = gtk_widget_get_colormap(widget);
+
+    attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
+    widget->window = gdk_window_new(widget->parent->window, &attributes, attributes_mask);
+
+    widget->style = gtk_style_attach(widget->style, widget->window);
+    gdk_window_set_user_data(widget->window, widget);
+}
+
+static void ui_skinned_horizontal_slider_size_request(GtkWidget *widget, GtkRequisition *requisition) {
+    UiSkinnedHorizontalSliderPrivate *priv = UI_SKINNED_HORIZONTAL_SLIDER_GET_PRIVATE(widget);
+
+    requisition->width = priv->width*(priv->scaled ? config.scale_factor : 1);
+    requisition->height = priv->height*(priv->scaled ? config.scale_factor : 1);
+}
+
+static void ui_skinned_horizontal_slider_size_allocate(GtkWidget *widget, GtkAllocation *allocation) {
+    UiSkinnedHorizontalSlider *horizontal_slider = UI_SKINNED_HORIZONTAL_SLIDER (widget);
+    UiSkinnedHorizontalSliderPrivate *priv = UI_SKINNED_HORIZONTAL_SLIDER_GET_PRIVATE(horizontal_slider);
+
+    widget->allocation = *allocation;
+    widget->allocation.x = ceil(widget->allocation.x*(priv->scaled ? config.scale_factor : 1));
+    widget->allocation.y = ceil(widget->allocation.y*(priv->scaled ? config.scale_factor : 1));
+
+    if (priv->knob_height == priv->height)
+        priv->knob_height = ceil(allocation->height/(priv->scaled ? config.scale_factor : 1));
+    priv->width = ceil(allocation->width/(priv->scaled ? config.scale_factor : 1));
+    priv->height = ceil(allocation->height/(priv->scaled ? config.scale_factor : 1));
+
+    if (GTK_WIDGET_REALIZED (widget))
+        gdk_window_move_resize(widget->window, widget->allocation.x, widget->allocation.y, allocation->width, allocation->height);
+
+    horizontal_slider->x = ceil(widget->allocation.x/(priv->scaled ? config.scale_factor : 1));
+    horizontal_slider->y = ceil(widget->allocation.y/(priv->scaled ? config.scale_factor : 1));
+}
+
+static gboolean ui_skinned_horizontal_slider_expose(GtkWidget *widget, GdkEventExpose *event) {
+    g_return_val_if_fail (widget != NULL, FALSE);
+    g_return_val_if_fail (UI_SKINNED_IS_HORIZONTAL_SLIDER (widget), FALSE);
+    g_return_val_if_fail (event != NULL, FALSE);
+
+    UiSkinnedHorizontalSlider *hs = UI_SKINNED_HORIZONTAL_SLIDER (widget);
+    UiSkinnedHorizontalSliderPrivate *priv = UI_SKINNED_HORIZONTAL_SLIDER_GET_PRIVATE(hs);
+    g_return_val_if_fail (priv->width > 0 && priv->height > 0, FALSE);
+
+    GdkPixbuf *obj = NULL;
+
+    if (priv->position > priv->max) priv->position = priv->max;
+    else if (priv->position < priv->min) priv->position = priv->min;
+
+    obj = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, priv->width, priv->height);
+
+    skin_draw_pixbuf(widget, aud_active_skin, obj,
+                     priv->skin_index, priv->frame_offset,
+                     priv->frame * priv->frame_height,
+                     0, 0, priv->width, priv->height);
+    if (hs->pressed)
+        skin_draw_pixbuf(widget, aud_active_skin, obj,
+                         priv->skin_index, hs->knob_px,
+                         hs->knob_py, priv->position,
+                         ((priv->height - priv->knob_height) / 2),
+                         priv->knob_width, priv->knob_height);
+    else
+        skin_draw_pixbuf(widget, aud_active_skin, obj,
+                         priv->skin_index, hs->knob_nx,
+                         hs->knob_ny, priv->position,
+                         ((priv->height - priv->knob_height) / 2),
+                         priv->knob_width, priv->knob_height);
+
+    ui_skinned_widget_draw(widget, obj, priv->width, priv->height, priv->scaled);
+
+    g_object_unref(obj);
+
+    return FALSE;
+}
+
+static gboolean ui_skinned_horizontal_slider_button_press(GtkWidget *widget, GdkEventButton *event) {
+    g_return_val_if_fail (widget != NULL, FALSE);
+    g_return_val_if_fail (UI_SKINNED_IS_HORIZONTAL_SLIDER (widget), FALSE);
+    g_return_val_if_fail (event != NULL, FALSE);
+
+    UiSkinnedHorizontalSlider *hs = UI_SKINNED_HORIZONTAL_SLIDER (widget);
+    UiSkinnedHorizontalSliderPrivate *priv = UI_SKINNED_HORIZONTAL_SLIDER_GET_PRIVATE(hs);
+
+    if (event->type == GDK_BUTTON_PRESS) {
+        if (event->button == 1) {
+            gint x;
+
+            x = event->x - (priv->knob_width / (priv->scaled ? 1 : config.scale_factor));
+            hs->pressed = TRUE;
+
+            priv->position = x/(priv->scaled ? config.scale_factor : 1);
+            if (priv->position < priv->min)
+                priv->position = priv->min;
+            if (priv->position > priv->max)
+                priv->position = priv->max;
+            if (priv->frame_cb)
+                priv->frame = priv->frame_cb(priv->position);
+
+            g_signal_emit_by_name(widget, "motion", priv->position);
+            gtk_widget_queue_draw(widget);
+        } else if (event->button == 3) {
+            if (hs->pressed) {
+                hs->pressed = FALSE;
+                g_signal_emit_by_name(widget, "release", priv->position);
+                gtk_widget_queue_draw(widget);
+            }
+            event->x = event->x + hs->x;
+            event->y = event->y + hs->y;
+            return FALSE;
+        }
+    }
+    return TRUE;
+}
+
+static gboolean ui_skinned_horizontal_slider_button_release(GtkWidget *widget, GdkEventButton *event) {
+    UiSkinnedHorizontalSlider *hs = UI_SKINNED_HORIZONTAL_SLIDER(widget);
+    UiSkinnedHorizontalSliderPrivate *priv = UI_SKINNED_HORIZONTAL_SLIDER_GET_PRIVATE(widget);
+
+    if (hs->pressed) {
+        hs->pressed = FALSE;
+        g_signal_emit_by_name(widget, "release", priv->position);
+        gtk_widget_queue_draw(widget);
+    }
+    return TRUE;
+}
+
+static gboolean ui_skinned_horizontal_slider_motion_notify(GtkWidget *widget, GdkEventMotion *event) {
+    g_return_val_if_fail (widget != NULL, FALSE);
+    g_return_val_if_fail (UI_SKINNED_IS_HORIZONTAL_SLIDER (widget), FALSE);
+    g_return_val_if_fail (event != NULL, FALSE);
+    UiSkinnedHorizontalSlider *hs = UI_SKINNED_HORIZONTAL_SLIDER(widget);
+    UiSkinnedHorizontalSliderPrivate *priv = UI_SKINNED_HORIZONTAL_SLIDER_GET_PRIVATE(widget);
+
+    if (hs->pressed) {
+        gint x;
+
+        x = event->x - (priv->knob_width / (priv->scaled ? 1 : config.scale_factor));
+        priv->position = x/(priv->scaled ? config.scale_factor : 1);
+
+        if (priv->position < priv->min)
+            priv->position = priv->min;
+
+        if (priv->position > priv->max)
+            priv->position = priv->max;
+
+        if (priv->frame_cb)
+            priv->frame = priv->frame_cb(priv->position);
+
+        g_signal_emit_by_name(widget, "motion", priv->position);
+        gtk_widget_queue_draw(widget);
+    }
+
+    return TRUE;
+}
+
+static void ui_skinned_horizontal_slider_toggle_scaled(UiSkinnedHorizontalSlider *horizontal_slider) {
+    GtkWidget *widget = GTK_WIDGET (horizontal_slider);
+    UiSkinnedHorizontalSliderPrivate *priv = UI_SKINNED_HORIZONTAL_SLIDER_GET_PRIVATE(horizontal_slider);
+
+    priv->scaled = !priv->scaled;
+
+    gtk_widget_set_size_request(widget,
+        priv->width*(priv->scaled ? config.scale_factor : 1),
+        priv->height*(priv->scaled ? config.scale_factor : 1));
+
+    gtk_widget_queue_draw(GTK_WIDGET(horizontal_slider));
+}
+
+void ui_skinned_horizontal_slider_set_position(GtkWidget *widget, gint pos) {
+    g_return_if_fail (UI_SKINNED_IS_HORIZONTAL_SLIDER (widget));
+    UiSkinnedHorizontalSlider *hs = UI_SKINNED_HORIZONTAL_SLIDER(widget);
+    UiSkinnedHorizontalSliderPrivate *priv = UI_SKINNED_HORIZONTAL_SLIDER_GET_PRIVATE(widget);
+
+    if (pos == priv->position || hs->pressed)
+        return;
+
+    priv->position = pos;
+
+    if (priv->frame_cb)
+        priv->frame = priv->frame_cb(priv->position);
+
+    gtk_widget_queue_draw(widget);
+}
+
+gint ui_skinned_horizontal_slider_get_position(GtkWidget *widget) {
+    g_return_val_if_fail (UI_SKINNED_IS_HORIZONTAL_SLIDER (widget), -1);
+    UiSkinnedHorizontalSliderPrivate *priv = UI_SKINNED_HORIZONTAL_SLIDER_GET_PRIVATE(widget);
+    return priv->position;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_skinned_horizontal_slider.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,68 @@
+/*
+ * Audacious - a cross-platform multimedia player
+ * Copyright (c) 2007 Tomasz Moń
+ *
+ * Based on:
+ * BMP - Cross-platform multimedia player
+ * Copyright (C) 2003-2004  BMP development team.
+ * XMMS:
+ * Copyright (C) 1998-2003  XMMS development team.
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+#ifndef AUDACIOUS_UI_SKINNED_HORIZONTAL_SLIDER_H
+#define AUDACIOUS_UI_SKINNED_HORIZONTAL_SLIDER_H
+
+#include <gtk/gtk.h>
+#include "ui_skin.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define UI_SKINNED_HORIZONTAL_SLIDER(obj)          GTK_CHECK_CAST (obj, ui_skinned_horizontal_slider_get_type (), UiSkinnedHorizontalSlider)
+#define UI_SKINNED_HORIZONTAL_SLIDER_CLASS(klass)  GTK_CHECK_CLASS_CAST (klass, ui_skinned_horizontal_slider_get_type (), UiSkinnedHorizontalSliderClass)
+#define UI_SKINNED_IS_HORIZONTAL_SLIDER(obj)       GTK_CHECK_TYPE (obj, ui_skinned_horizontal_slider_get_type ())
+
+typedef struct _UiSkinnedHorizontalSlider        UiSkinnedHorizontalSlider;
+typedef struct _UiSkinnedHorizontalSliderClass   UiSkinnedHorizontalSliderClass;
+
+struct _UiSkinnedHorizontalSlider {
+    GtkWidget   widget;
+    gboolean    pressed;
+    gint        x, y;
+    gint        knob_nx, knob_ny, knob_px, knob_py;
+};
+
+struct _UiSkinnedHorizontalSliderClass {
+    GtkWidgetClass    parent_class;
+    void (* motion)   (UiSkinnedHorizontalSlider *horizontal_slider);
+    void (* release)  (UiSkinnedHorizontalSlider *horizontal_slider);
+    void (* scaled)  (UiSkinnedHorizontalSlider *horizontal_slider);
+};
+GtkWidget* ui_skinned_horizontal_slider_new(GtkWidget *fixed, gint x, gint y, gint w, gint h, gint knx, gint kny,
+                                            gint kpx, gint kpy, gint kw, gint kh, gint fh,
+                                            gint fo, gint min, gint max, gint(*fcb) (gint), SkinPixmapId si);
+GtkType ui_skinned_horizontal_slider_get_type(void);
+void ui_skinned_horizontal_slider_set_position(GtkWidget *widget, gint pos);
+gint ui_skinned_horizontal_slider_get_position(GtkWidget *widget);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* AUDACIOUS_UI_SKINNED_HORIZONTAL_SLIDER_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_skinned_menurow.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,332 @@
+/*
+ * Audacious - a cross-platform multimedia player
+ * Copyright (c) 2007 Tomasz Moń
+ *
+ * Based on:
+ * BMP - Cross-platform multimedia player
+ * Copyright (C) 2003-2004  BMP development team.
+ * XMMS:
+ * Copyright (C) 1998-2003  XMMS development team.
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+#include <audacious/plugin.h>
+#include "plugin.h"
+#include "ui_skinned_menurow.h"
+
+enum {
+    DOUBLED,
+    CHANGE,
+    RELEASE,
+    LAST_SIGNAL
+};
+
+static void ui_skinned_menurow_class_init         (UiSkinnedMenurowClass *klass);
+static void ui_skinned_menurow_init               (UiSkinnedMenurow *menurow);
+static void ui_skinned_menurow_destroy            (GtkObject *object);
+static void ui_skinned_menurow_realize            (GtkWidget *widget);
+static void ui_skinned_menurow_size_request       (GtkWidget *widget, GtkRequisition *requisition);
+static void ui_skinned_menurow_size_allocate      (GtkWidget *widget, GtkAllocation *allocation);
+static gboolean ui_skinned_menurow_expose         (GtkWidget *widget, GdkEventExpose *event);
+static MenuRowItem menurow_find_selected          (UiSkinnedMenurow * mr, gint x, gint y);
+static gboolean ui_skinned_menurow_button_press   (GtkWidget *widget, GdkEventButton *event);
+static gboolean ui_skinned_menurow_button_release (GtkWidget *widget, GdkEventButton *event);
+static gboolean ui_skinned_menurow_motion_notify  (GtkWidget *widget, GdkEventMotion *event);
+static void ui_skinned_menurow_toggle_scaled  (UiSkinnedMenurow *menurow);
+
+static GtkWidgetClass *parent_class = NULL;
+static guint menurow_signals[LAST_SIGNAL] = { 0 };
+
+GType ui_skinned_menurow_get_type() {
+    static GType menurow_type = 0;
+    if (!menurow_type) {
+        static const GTypeInfo menurow_info = {
+            sizeof (UiSkinnedMenurowClass),
+            NULL,
+            NULL,
+            (GClassInitFunc) ui_skinned_menurow_class_init,
+            NULL,
+            NULL,
+            sizeof (UiSkinnedMenurow),
+            0,
+            (GInstanceInitFunc) ui_skinned_menurow_init,
+        };
+        menurow_type = g_type_register_static (GTK_TYPE_WIDGET, "UiSkinnedMenurow", &menurow_info, 0);
+    }
+
+    return menurow_type;
+}
+
+static void ui_skinned_menurow_class_init(UiSkinnedMenurowClass *klass) {
+    GObjectClass *gobject_class;
+    GtkObjectClass *object_class;
+    GtkWidgetClass *widget_class;
+
+    gobject_class = G_OBJECT_CLASS(klass);
+    object_class = (GtkObjectClass*) klass;
+    widget_class = (GtkWidgetClass*) klass;
+    parent_class = gtk_type_class (gtk_widget_get_type ());
+
+    object_class->destroy = ui_skinned_menurow_destroy;
+
+    widget_class->realize = ui_skinned_menurow_realize;
+    widget_class->expose_event = ui_skinned_menurow_expose;
+    widget_class->size_request = ui_skinned_menurow_size_request;
+    widget_class->size_allocate = ui_skinned_menurow_size_allocate;
+    widget_class->button_press_event = ui_skinned_menurow_button_press;
+    widget_class->button_release_event = ui_skinned_menurow_button_release;
+    widget_class->motion_notify_event = ui_skinned_menurow_motion_notify;
+
+    klass->scaled = ui_skinned_menurow_toggle_scaled;
+    klass->change = NULL;
+    klass->release = NULL;
+
+    menurow_signals[DOUBLED] = 
+        g_signal_new ("toggle-scaled", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
+                      G_STRUCT_OFFSET (UiSkinnedMenurowClass, scaled), NULL, NULL,
+                      gtk_marshal_VOID__VOID, G_TYPE_NONE, 0);
+
+
+    menurow_signals[CHANGE] = 
+        g_signal_new ("change", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
+                      G_STRUCT_OFFSET (UiSkinnedMenurowClass, change), NULL, NULL,
+                      gtk_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
+
+    menurow_signals[RELEASE] = 
+        g_signal_new ("release", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
+                      G_STRUCT_OFFSET (UiSkinnedMenurowClass, release), NULL, NULL,
+                      g_cclosure_marshal_VOID__UINT_POINTER, G_TYPE_NONE, 2, G_TYPE_UINT, G_TYPE_POINTER);
+
+}
+
+static void ui_skinned_menurow_init(UiSkinnedMenurow *menurow) {
+    menurow->scale_selected = config.scaled;
+    menurow->always_selected = config.always_on_top;
+}
+
+GtkWidget* ui_skinned_menurow_new(GtkWidget *fixed, gint x, gint y, gint nx, gint ny, gint sx, gint sy, SkinPixmapId si) {
+    UiSkinnedMenurow *menurow = g_object_new (ui_skinned_menurow_get_type (), NULL);
+
+    menurow->x = x;
+    menurow->y = y;
+    menurow->width = 8;
+    menurow->height = 43;
+    menurow->nx = nx;
+    menurow->ny = ny;
+    menurow->sx = sx;
+    menurow->sy = sy;
+    menurow->selected = MENUROW_NONE;
+
+    menurow->skin_index = si;
+
+    menurow->scaled = FALSE;
+
+    gtk_fixed_put(GTK_FIXED(fixed), GTK_WIDGET(menurow), menurow->x, menurow->y);
+
+    return GTK_WIDGET(menurow);
+}
+
+static void ui_skinned_menurow_destroy(GtkObject *object) {
+    UiSkinnedMenurow *menurow;
+
+    g_return_if_fail (object != NULL);
+    g_return_if_fail (UI_SKINNED_IS_MENUROW (object));
+
+    menurow = UI_SKINNED_MENUROW (object);
+
+    if (GTK_OBJECT_CLASS (parent_class)->destroy)
+        (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
+}
+
+static void ui_skinned_menurow_realize(GtkWidget *widget) {
+    UiSkinnedMenurow *menurow;
+    GdkWindowAttr attributes;
+    gint attributes_mask;
+
+    g_return_if_fail (widget != NULL);
+    g_return_if_fail (UI_SKINNED_IS_MENUROW(widget));
+
+    GTK_WIDGET_SET_FLAGS(widget, GTK_REALIZED);
+    menurow = UI_SKINNED_MENUROW(widget);
+
+    attributes.x = widget->allocation.x;
+    attributes.y = widget->allocation.y;
+    attributes.width = widget->allocation.width;
+    attributes.height = widget->allocation.height;
+    attributes.wclass = GDK_INPUT_OUTPUT;
+    attributes.window_type = GDK_WINDOW_CHILD;
+    attributes.event_mask = gtk_widget_get_events(widget);
+    attributes.event_mask |= GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | 
+                             GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK;
+    attributes.visual = gtk_widget_get_visual(widget);
+    attributes.colormap = gtk_widget_get_colormap(widget);
+
+    attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
+    widget->window = gdk_window_new(widget->parent->window, &attributes, attributes_mask);
+
+    widget->style = gtk_style_attach(widget->style, widget->window);
+
+    gdk_window_set_user_data(widget->window, widget);
+}
+
+static void ui_skinned_menurow_size_request(GtkWidget *widget, GtkRequisition *requisition) {
+    UiSkinnedMenurow *menurow = UI_SKINNED_MENUROW(widget);
+
+    requisition->width = menurow->width*(menurow->scaled ? config.scale_factor : 1);
+    requisition->height = menurow->height*(menurow->scaled ? config.scale_factor : 1);
+}
+
+static void ui_skinned_menurow_size_allocate(GtkWidget *widget, GtkAllocation *allocation) {
+    UiSkinnedMenurow *menurow = UI_SKINNED_MENUROW (widget);
+
+    widget->allocation = *allocation;
+    widget->allocation.x *= (menurow->scaled ? config.scale_factor : 1);
+    widget->allocation.y *= (menurow->scaled ? config.scale_factor : 1);
+    if (GTK_WIDGET_REALIZED (widget))
+        gdk_window_move_resize(widget->window, widget->allocation.x, widget->allocation.y, allocation->width, allocation->height);
+
+    menurow->x = widget->allocation.x/(menurow->scaled ? config.scale_factor : 1);
+    menurow->y = widget->allocation.y/(menurow->scaled ? config.scale_factor : 1);
+}
+
+static gboolean ui_skinned_menurow_expose(GtkWidget *widget, GdkEventExpose *event) {
+    g_return_val_if_fail (widget != NULL, FALSE);
+    g_return_val_if_fail (UI_SKINNED_IS_MENUROW (widget), FALSE);
+    g_return_val_if_fail (event != NULL, FALSE);
+
+    UiSkinnedMenurow *menurow = UI_SKINNED_MENUROW (widget);
+    g_return_val_if_fail (menurow->width > 0 && menurow->height > 0, FALSE);
+
+    GdkPixbuf *obj = NULL;
+    obj = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, menurow->width, menurow->height);
+
+    if (menurow->selected == MENUROW_NONE) {
+        if (config.always_show_cb || menurow->pushed)
+            skin_draw_pixbuf(widget, aud_active_skin, obj, menurow->skin_index,
+                             menurow->nx, menurow->ny, 0, 0, 8, 43);
+        else
+            skin_draw_pixbuf(widget, aud_active_skin, obj, menurow->skin_index,
+                             menurow->nx + 8, menurow->ny, 0, 0, 8, 43);
+    }
+    else {
+        skin_draw_pixbuf(widget, aud_active_skin, obj, menurow->skin_index,
+                         menurow->sx + ((menurow->selected - 1) * 8),
+                         menurow->sy, 0, 0, 8, 43);
+    }
+    if (config.always_show_cb || menurow->pushed) {
+        if (menurow->always_selected)
+            skin_draw_pixbuf(widget, aud_active_skin, obj, menurow->skin_index,
+                             menurow->sx + 8, menurow->sy + 10, 0, 10, 8, 8);
+        if (menurow->scale_selected)
+            skin_draw_pixbuf(widget, aud_active_skin, obj, menurow->skin_index,
+                             menurow->sx + 24, menurow->sy + 26, 0, 26, 8, 8);
+    }
+
+    ui_skinned_widget_draw(widget, obj, menurow->width, menurow->height, menurow->scaled);
+
+    g_object_unref(obj);
+
+    return FALSE;
+}
+
+static MenuRowItem menurow_find_selected(UiSkinnedMenurow * mr, gint x, gint y) {
+    MenuRowItem ret = MENUROW_NONE;
+
+    x = x/(mr->scaled ? config.scale_factor : 1);
+    y = y/(mr->scaled ? config.scale_factor : 1);
+    if (x > 0 && x < 8) {
+        if (y >= 0 && y <= 10)
+            ret = MENUROW_OPTIONS;
+        if (y >= 10 && y <= 17)
+            ret = MENUROW_ALWAYS;
+        if (y >= 18 && y <= 25)
+            ret = MENUROW_FILEINFOBOX;
+        if (y >= 26 && y <= 33)
+            ret = MENUROW_SCALE;
+        if (y >= 34 && y <= 42)
+            ret = MENUROW_VISUALIZATION;
+    }
+    return ret;
+}
+
+static gboolean ui_skinned_menurow_button_press(GtkWidget *widget, GdkEventButton *event) {
+    g_return_val_if_fail (widget != NULL, FALSE);
+    g_return_val_if_fail (UI_SKINNED_IS_MENUROW (widget), FALSE);
+    g_return_val_if_fail (event != NULL, FALSE);
+
+    UiSkinnedMenurow *menurow = UI_SKINNED_MENUROW (widget);
+
+    if (event->type == GDK_BUTTON_PRESS) {
+        if (event->button == 1) {
+
+        menurow->pushed = TRUE;
+        menurow->selected = menurow_find_selected(menurow, event->x, event->y);
+
+        gtk_widget_queue_draw(widget);
+        g_signal_emit_by_name(widget, "change", menurow->selected);
+        }
+    }
+
+    return TRUE;
+}
+
+static gboolean ui_skinned_menurow_button_release(GtkWidget *widget, GdkEventButton *event) {
+    UiSkinnedMenurow *menurow = UI_SKINNED_MENUROW(widget);
+    if (menurow->pushed) {
+        menurow->pushed = FALSE;
+
+        if (menurow->selected == MENUROW_ALWAYS)
+            menurow->always_selected = !menurow->always_selected;
+
+        if (menurow->selected == MENUROW_SCALE)
+            menurow->scale_selected = !menurow->scale_selected;
+
+        if ((int)(menurow->selected) != -1)
+            g_signal_emit_by_name(widget, "release", menurow->selected, event);
+
+        menurow->selected = MENUROW_NONE;
+        gtk_widget_queue_draw(widget);
+    }
+
+    return TRUE;
+}
+
+static gboolean ui_skinned_menurow_motion_notify(GtkWidget *widget, GdkEventMotion *event) {
+    g_return_val_if_fail (widget != NULL, FALSE);
+    g_return_val_if_fail (UI_SKINNED_IS_MENUROW (widget), FALSE);
+    g_return_val_if_fail (event != NULL, FALSE);
+    UiSkinnedMenurow *menurow = UI_SKINNED_MENUROW(widget);
+
+    if (menurow->pushed) {
+        menurow->selected = menurow_find_selected(menurow, event->x, event->y);
+
+        gtk_widget_queue_draw(widget);
+        g_signal_emit_by_name(widget, "change", menurow->selected);
+    }
+
+    return TRUE;
+}
+
+static void ui_skinned_menurow_toggle_scaled(UiSkinnedMenurow *menurow) {
+    GtkWidget *widget = GTK_WIDGET (menurow);
+
+    menurow->scaled = !menurow->scaled;
+    gtk_widget_set_size_request(widget, menurow->width* (menurow->scaled ? config.scale_factor : 1),
+    menurow->height * (menurow->scaled ? config.scale_factor : 1));
+
+    gtk_widget_queue_draw(GTK_WIDGET(menurow));
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_skinned_menurow.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,77 @@
+/*
+ * Audacious - a cross-platform multimedia player
+ * Copyright (c) 2007 Tomasz Moń
+ *
+ * Based on:
+ * BMP - Cross-platform multimedia player
+ * Copyright (C) 2003-2004  BMP development team.
+ * XMMS:
+ * Copyright (C) 1998-2003  XMMS development team.
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+#ifndef AUDACIOUS_UI_SKINNED_MENUROW_H
+#define AUDACIOUS_UI_SKINNED_MENUROW_H
+
+#include <gtk/gtk.h>
+#include "ui_skin.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define UI_SKINNED_MENUROW(obj)          GTK_CHECK_CAST (obj, ui_skinned_menurow_get_type (), UiSkinnedMenurow)
+#define UI_SKINNED_MENUROW_CLASS(klass)  GTK_CHECK_CLASS_CAST (klass, ui_skinned_menurow_get_type (), UiSkinnedMenurowClass)
+#define UI_SKINNED_IS_MENUROW(obj)       GTK_CHECK_TYPE (obj, ui_skinned_menurow_get_type ())
+
+typedef struct _UiSkinnedMenurow        UiSkinnedMenurow;
+typedef struct _UiSkinnedMenurowClass   UiSkinnedMenurowClass;
+
+typedef enum {
+    MENUROW_NONE, MENUROW_OPTIONS, MENUROW_ALWAYS, MENUROW_FILEINFOBOX,
+    MENUROW_SCALE, MENUROW_VISUALIZATION
+} MenuRowItem;
+
+struct _UiSkinnedMenurow {
+    GtkWidget        widget;
+
+    gint             x, y, width, height;
+    gboolean         scaled;
+    gint             nx, ny;
+    gint             sx, sy;
+    MenuRowItem      selected;
+    gboolean         always_selected;
+    gboolean         scale_selected;
+    gboolean         pushed;
+    SkinPixmapId     skin_index;
+};
+
+struct _UiSkinnedMenurowClass {
+    GtkWidgetClass          parent_class;
+    void (* scaled)         (UiSkinnedMenurow *menurow);
+    void (* change)         (UiSkinnedMenurow *menurow);
+    void (* release)        (UiSkinnedMenurow *menurow);
+};
+
+GtkWidget* ui_skinned_menurow_new (GtkWidget *fixed, gint x, gint y, gint nx, gint ny, gint sx, gint sy, SkinPixmapId si);
+GtkType ui_skinned_menurow_get_type(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* AUDACIOUS_UI_SKINNED_MENUROW_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_skinned_monostereo.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,222 @@
+/*
+ * Audacious - a cross-platform multimedia player
+ * Copyright (c) 2007 Tomasz Moń
+ *
+ * Based on:
+ * BMP - Cross-platform multimedia player
+ * Copyright (C) 2003-2004  BMP development team.
+ * XMMS:
+ * Copyright (C) 1998-2003  XMMS development team.
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+#include "ui_skin.h"
+#include "ui_skinned_monostereo.h"
+#include "skins_cfg.h"
+
+enum {
+    DOUBLED,
+    LAST_SIGNAL
+};
+
+static void ui_skinned_monostereo_class_init         (UiSkinnedMonoStereoClass *klass);
+static void ui_skinned_monostereo_init               (UiSkinnedMonoStereo *monostereo);
+static void ui_skinned_monostereo_destroy            (GtkObject *object);
+static void ui_skinned_monostereo_realize            (GtkWidget *widget);
+static void ui_skinned_monostereo_size_request       (GtkWidget *widget, GtkRequisition *requisition);
+static void ui_skinned_monostereo_size_allocate      (GtkWidget *widget, GtkAllocation *allocation);
+static gboolean ui_skinned_monostereo_expose         (GtkWidget *widget, GdkEventExpose *event);
+static void ui_skinned_monostereo_toggle_scaled      (UiSkinnedMonoStereo *monostereo);
+
+static GtkWidgetClass *parent_class = NULL;
+static guint monostereo_signals[LAST_SIGNAL] = { 0 };
+
+GType ui_skinned_monostereo_get_type() {
+    static GType monostereo_type = 0;
+    if (!monostereo_type) {
+        static const GTypeInfo monostereo_info = {
+            sizeof (UiSkinnedMonoStereoClass),
+            NULL,
+            NULL,
+            (GClassInitFunc) ui_skinned_monostereo_class_init,
+            NULL,
+            NULL,
+            sizeof (UiSkinnedMonoStereo),
+            0,
+            (GInstanceInitFunc) ui_skinned_monostereo_init,
+        };
+        monostereo_type = g_type_register_static (GTK_TYPE_WIDGET, "UiSkinnedMonoStereo", &monostereo_info, 0);
+    }
+
+    return monostereo_type;
+}
+
+static void ui_skinned_monostereo_class_init(UiSkinnedMonoStereoClass *klass) {
+    GObjectClass *gobject_class;
+    GtkObjectClass *object_class;
+    GtkWidgetClass *widget_class;
+
+    gobject_class = G_OBJECT_CLASS(klass);
+    object_class = (GtkObjectClass*) klass;
+    widget_class = (GtkWidgetClass*) klass;
+    parent_class = gtk_type_class (gtk_widget_get_type ());
+
+    object_class->destroy = ui_skinned_monostereo_destroy;
+
+    widget_class->realize = ui_skinned_monostereo_realize;
+    widget_class->expose_event = ui_skinned_monostereo_expose;
+    widget_class->size_request = ui_skinned_monostereo_size_request;
+    widget_class->size_allocate = ui_skinned_monostereo_size_allocate;
+
+    klass->scaled = ui_skinned_monostereo_toggle_scaled;
+
+    monostereo_signals[DOUBLED] = 
+        g_signal_new ("toggle-scaled", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
+                      G_STRUCT_OFFSET (UiSkinnedMonoStereoClass, scaled), NULL, NULL,
+                      gtk_marshal_VOID__VOID, G_TYPE_NONE, 0);
+}
+
+static void ui_skinned_monostereo_init(UiSkinnedMonoStereo *monostereo) {
+    monostereo->width = 56;
+    monostereo->height = 12;
+}
+
+GtkWidget* ui_skinned_monostereo_new(GtkWidget *fixed, gint x, gint y, SkinPixmapId si) {
+    UiSkinnedMonoStereo *monostereo = g_object_new (ui_skinned_monostereo_get_type (), NULL);
+
+    monostereo->x = x;
+    monostereo->y = y;
+    monostereo->skin_index = si;
+    monostereo->scaled = FALSE;
+
+    gtk_fixed_put(GTK_FIXED(fixed), GTK_WIDGET(monostereo), monostereo->x, monostereo->y);
+
+    return GTK_WIDGET(monostereo);
+}
+
+static void ui_skinned_monostereo_destroy(GtkObject *object) {
+    UiSkinnedMonoStereo *monostereo;
+
+    g_return_if_fail (object != NULL);
+    g_return_if_fail (UI_SKINNED_IS_MONOSTEREO (object));
+
+    monostereo = UI_SKINNED_MONOSTEREO (object);
+
+    if (GTK_OBJECT_CLASS (parent_class)->destroy)
+        (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
+}
+
+static void ui_skinned_monostereo_realize(GtkWidget *widget) {
+    UiSkinnedMonoStereo *monostereo;
+    GdkWindowAttr attributes;
+    gint attributes_mask;
+
+    g_return_if_fail (widget != NULL);
+    g_return_if_fail (UI_SKINNED_IS_MONOSTEREO(widget));
+
+    GTK_WIDGET_SET_FLAGS(widget, GTK_REALIZED);
+    monostereo = UI_SKINNED_MONOSTEREO(widget);
+
+    attributes.x = widget->allocation.x;
+    attributes.y = widget->allocation.y;
+    attributes.width = widget->allocation.width;
+    attributes.height = widget->allocation.height;
+    attributes.wclass = GDK_INPUT_OUTPUT;
+    attributes.window_type = GDK_WINDOW_CHILD;
+    attributes.event_mask = gtk_widget_get_events(widget);
+    attributes.event_mask |= GDK_EXPOSURE_MASK;
+    attributes.visual = gtk_widget_get_visual(widget);
+    attributes.colormap = gtk_widget_get_colormap(widget);
+
+    attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
+    widget->window = gdk_window_new(widget->parent->window, &attributes, attributes_mask);
+
+    widget->style = gtk_style_attach(widget->style, widget->window);
+
+    gdk_window_set_user_data(widget->window, widget);
+}
+
+static void ui_skinned_monostereo_size_request(GtkWidget *widget, GtkRequisition *requisition) {
+    UiSkinnedMonoStereo *monostereo = UI_SKINNED_MONOSTEREO(widget);
+
+    requisition->width = monostereo->width*(monostereo->scaled ? config.scale_factor : 1);
+    requisition->height = monostereo->height*(monostereo->scaled ? config.scale_factor : 1);
+}
+
+static void ui_skinned_monostereo_size_allocate(GtkWidget *widget, GtkAllocation *allocation) {
+    UiSkinnedMonoStereo *monostereo = UI_SKINNED_MONOSTEREO (widget);
+
+    widget->allocation = *allocation;
+    widget->allocation.x *= (monostereo->scaled ? config.scale_factor : 1);
+    widget->allocation.y *= (monostereo->scaled ? config.scale_factor : 1);
+    if (GTK_WIDGET_REALIZED (widget))
+        gdk_window_move_resize(widget->window, widget->allocation.x, widget->allocation.y, allocation->width, allocation->height);
+
+    monostereo->x = widget->allocation.x/(monostereo->scaled ? config.scale_factor : 1);
+    monostereo->y = widget->allocation.y/(monostereo->scaled ? config.scale_factor : 1);
+}
+
+static gboolean ui_skinned_monostereo_expose(GtkWidget *widget, GdkEventExpose *event) {
+    g_return_val_if_fail (widget != NULL, FALSE);
+    g_return_val_if_fail (UI_SKINNED_IS_MONOSTEREO (widget), FALSE);
+    g_return_val_if_fail (event != NULL, FALSE);
+
+    UiSkinnedMonoStereo *monostereo = UI_SKINNED_MONOSTEREO (widget);
+    g_return_val_if_fail (monostereo->width > 0 && monostereo->height > 0, FALSE);
+
+    GdkPixbuf *obj = NULL;
+    obj = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, monostereo->width, monostereo->height);
+
+    switch (monostereo->num_channels) {
+    case 1:
+        skin_draw_pixbuf(widget, aud_active_skin, obj, monostereo->skin_index, 29, 0, 0, 0, 27, 12);
+        skin_draw_pixbuf(widget, aud_active_skin, obj, monostereo->skin_index, 0, 12, 27, 0, 29, 12);
+        break;
+    case 2:
+        skin_draw_pixbuf(widget, aud_active_skin, obj, monostereo->skin_index, 29, 12, 0, 0, 27, 12);
+        skin_draw_pixbuf(widget, aud_active_skin, obj, monostereo->skin_index, 0, 0, 27, 0, 29, 12);
+        break;
+    default:
+    case 0:
+        skin_draw_pixbuf(widget, aud_active_skin, obj, monostereo->skin_index, 29, 12, 0, 0, 27, 12);
+        skin_draw_pixbuf(widget, aud_active_skin, obj, monostereo->skin_index, 0, 12, 27, 0, 29, 12);
+        break;
+    }
+
+    ui_skinned_widget_draw(widget, obj, monostereo->width, monostereo->height, monostereo->scaled);
+
+    g_object_unref(obj);
+
+    return FALSE;
+}
+
+static void ui_skinned_monostereo_toggle_scaled(UiSkinnedMonoStereo *monostereo) {
+    GtkWidget *widget = GTK_WIDGET (monostereo);
+
+    monostereo->scaled = !monostereo->scaled;
+    gtk_widget_set_size_request(widget, monostereo->width*(monostereo->scaled ? config.scale_factor : 1), monostereo->height*(monostereo->scaled ? config.scale_factor : 1));
+
+    gtk_widget_queue_draw(GTK_WIDGET(monostereo));
+}
+
+void ui_skinned_monostereo_set_num_channels(GtkWidget *widget, gint nch) {
+    g_return_if_fail (UI_SKINNED_IS_MONOSTEREO (widget));
+    UiSkinnedMonoStereo *monostereo = UI_SKINNED_MONOSTEREO (widget);
+
+    monostereo->num_channels = nch;
+    gtk_widget_queue_draw(widget);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_skinned_monostereo.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,66 @@
+/*
+ * Audacious - a cross-platform multimedia player
+ * Copyright (c) 2007 Tomasz Moń
+ *
+ * Based on:
+ * BMP - Cross-platform multimedia player
+ * Copyright (C) 2003-2004  BMP development team.
+ * XMMS:
+ * Copyright (C) 1998-2003  XMMS development team.
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+#ifndef AUDACIOUS_UI_SKINNED_MONOSTEREO_H
+#define AUDACIOUS_UI_SKINNED_MONOSTEREO_H
+
+#include <gtk/gtk.h>
+#include "ui_skin.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define UI_SKINNED_MONOSTEREO(obj)          GTK_CHECK_CAST (obj, ui_skinned_monostereo_get_type (), UiSkinnedMonoStereo)
+#define UI_SKINNED_MONOSTEREO_CLASS(klass)  GTK_CHECK_CLASS_CAST (klass, ui_skinned_monostereo_get_type (), UiSkinnedMonoStereoClass)
+#define UI_SKINNED_IS_MONOSTEREO(obj)       GTK_CHECK_TYPE (obj, ui_skinned_monostereo_get_type ())
+
+typedef struct _UiSkinnedMonoStereo        UiSkinnedMonoStereo;
+typedef struct _UiSkinnedMonoStereoClass   UiSkinnedMonoStereoClass;
+
+struct _UiSkinnedMonoStereo {
+    GtkWidget        widget;
+
+    gint             x, y, width, height;
+    gint             num_channels;
+    SkinPixmapId     skin_index;
+    gboolean         scaled;
+};
+
+struct _UiSkinnedMonoStereoClass {
+    GtkWidgetClass          parent_class;
+    void (* scaled)        (UiSkinnedMonoStereo *menurow);
+};
+
+GtkWidget* ui_skinned_monostereo_new (GtkWidget *fixed, gint x, gint y, SkinPixmapId si);
+GtkType ui_skinned_monostereo_get_type(void);
+void ui_skinned_monostereo_set_num_channels(GtkWidget *widget, gint nch);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* AUDACIOUS_UI_SKINNED_MONOSTEREO_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_skinned_number.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,234 @@
+/*
+ * Audacious - a cross-platform multimedia player
+ * Copyright (c) 2007 Tomasz Moń
+ *
+ * Based on:
+ * BMP - Cross-platform multimedia player
+ * Copyright (C) 2003-2004  BMP development team.
+ * XMMS:
+ * Copyright (C) 1998-2003  XMMS development team.
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+#include "ui_skinned_number.h"
+#include "skins_cfg.h"
+#include "strings.h"
+#include <string.h>
+#include <ctype.h>
+#include <gtk/gtkmain.h>
+#include <gtk/gtkmarshal.h>
+
+#define UI_TYPE_SKINNED_NUMBER           (ui_skinned_number_get_type())
+
+enum {
+    DOUBLED,
+    LAST_SIGNAL
+};
+
+static void ui_skinned_number_class_init         (UiSkinnedNumberClass *klass);
+static void ui_skinned_number_init               (UiSkinnedNumber *number);
+static void ui_skinned_number_destroy            (GtkObject *object);
+static void ui_skinned_number_realize            (GtkWidget *widget);
+static void ui_skinned_number_size_request       (GtkWidget *widget, GtkRequisition *requisition);
+static void ui_skinned_number_size_allocate      (GtkWidget *widget, GtkAllocation *allocation);
+static gboolean ui_skinned_number_expose         (GtkWidget *widget, GdkEventExpose *event);
+static void ui_skinned_number_toggle_scaled  (UiSkinnedNumber *number);
+
+static GtkWidgetClass *parent_class = NULL;
+static guint number_signals[LAST_SIGNAL] = { 0 };
+
+GType ui_skinned_number_get_type() {
+    static GType number_type = 0;
+    if (!number_type) {
+        static const GTypeInfo number_info = {
+            sizeof (UiSkinnedNumberClass),
+            NULL,
+            NULL,
+            (GClassInitFunc) ui_skinned_number_class_init,
+            NULL,
+            NULL,
+            sizeof (UiSkinnedNumber),
+            0,
+            (GInstanceInitFunc) ui_skinned_number_init,
+        };
+        number_type = g_type_register_static (GTK_TYPE_WIDGET, "UiSkinnedNumber", &number_info, 0);
+    }
+
+    return number_type;
+}
+
+static void ui_skinned_number_class_init(UiSkinnedNumberClass *klass) {
+    GtkObjectClass *object_class;
+    GtkWidgetClass *widget_class;
+
+    object_class = (GtkObjectClass*) klass;
+    widget_class = (GtkWidgetClass*) klass;
+    parent_class = gtk_type_class (gtk_widget_get_type ());
+
+    object_class->destroy = ui_skinned_number_destroy;
+
+    widget_class->realize = ui_skinned_number_realize;
+    widget_class->expose_event = ui_skinned_number_expose;
+    widget_class->size_request = ui_skinned_number_size_request;
+    widget_class->size_allocate = ui_skinned_number_size_allocate;
+
+    klass->scaled = ui_skinned_number_toggle_scaled;
+
+    number_signals[DOUBLED] = 
+        g_signal_new ("toggle-scaled", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
+                      G_STRUCT_OFFSET (UiSkinnedNumberClass, scaled), NULL, NULL,
+                      gtk_marshal_VOID__VOID, G_TYPE_NONE, 0);
+}
+
+static void ui_skinned_number_init(UiSkinnedNumber *number) {
+    number->width = 9;
+    number->height = 13;
+}
+
+GtkWidget* ui_skinned_number_new(GtkWidget *fixed, gint x, gint y, SkinPixmapId si) {
+    UiSkinnedNumber *number = g_object_new (ui_skinned_number_get_type (), NULL);
+
+    number->x = x;
+    number->y = y;
+    number->num = 0;
+    number->skin_index = si;
+
+    number->scaled = FALSE;
+
+    gtk_fixed_put(GTK_FIXED(fixed), GTK_WIDGET(number), number->x, number->y);
+
+    return GTK_WIDGET(number);
+}
+
+static void ui_skinned_number_destroy(GtkObject *object) {
+    UiSkinnedNumber *number;
+
+    g_return_if_fail (object != NULL);
+    g_return_if_fail (UI_SKINNED_IS_NUMBER (object));
+
+    number = UI_SKINNED_NUMBER (object);
+
+    if (GTK_OBJECT_CLASS (parent_class)->destroy)
+        (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
+}
+
+static void ui_skinned_number_realize(GtkWidget *widget) {
+    UiSkinnedNumber *number;
+    GdkWindowAttr attributes;
+    gint attributes_mask;
+
+    g_return_if_fail (widget != NULL);
+    g_return_if_fail (UI_SKINNED_IS_NUMBER(widget));
+
+    GTK_WIDGET_SET_FLAGS(widget, GTK_REALIZED);
+    number = UI_SKINNED_NUMBER(widget);
+
+    attributes.x = widget->allocation.x;
+    attributes.y = widget->allocation.y;
+    attributes.width = widget->allocation.width;
+    attributes.height = widget->allocation.height;
+    attributes.wclass = GDK_INPUT_OUTPUT;
+    attributes.window_type = GDK_WINDOW_CHILD;
+    attributes.event_mask = gtk_widget_get_events(widget);
+    attributes.event_mask |= GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK;
+    attributes.visual = gtk_widget_get_visual(widget);
+    attributes.colormap = gtk_widget_get_colormap(widget);
+
+    attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
+    widget->window = gdk_window_new(widget->parent->window, &attributes, attributes_mask);
+
+    widget->style = gtk_style_attach(widget->style, widget->window);
+
+    gdk_window_set_user_data(widget->window, widget);
+}
+
+static void ui_skinned_number_size_request(GtkWidget *widget, GtkRequisition *requisition) {
+    UiSkinnedNumber *number = UI_SKINNED_NUMBER(widget);
+
+    requisition->width = number->width * ( number->scaled ? config.scale_factor : 1 );
+    requisition->height = number->height*( number->scaled ? config.scale_factor : 1);
+}
+
+static void ui_skinned_number_size_allocate(GtkWidget *widget, GtkAllocation *allocation) {
+    UiSkinnedNumber *number = UI_SKINNED_NUMBER (widget);
+
+    widget->allocation = *allocation;
+    widget->allocation.x *= (number->scaled ? config.scale_factor: 1 );
+    widget->allocation.y *= (number->scaled ? config.scale_factor: 1 );
+    if (GTK_WIDGET_REALIZED (widget))
+        gdk_window_move_resize(widget->window, widget->allocation.x, widget->allocation.y, allocation->width, allocation->height);
+
+    number->x = widget->allocation.x/(number->scaled ? config.scale_factor : 1);
+    number->y = widget->allocation.y/(number->scaled ? config.scale_factor : 1);
+}
+
+static gboolean ui_skinned_number_expose(GtkWidget *widget, GdkEventExpose *event) {
+    g_return_val_if_fail (widget != NULL, FALSE);
+    g_return_val_if_fail (UI_SKINNED_IS_NUMBER (widget), FALSE);
+    g_return_val_if_fail (event != NULL, FALSE);
+
+    UiSkinnedNumber *number = UI_SKINNED_NUMBER (widget);
+    g_return_val_if_fail (number->width > 0 && number->height > 0, FALSE);
+
+    GdkPixbuf *obj;
+    obj = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, number->width, number->height);
+
+    if (number->num > 11 || number->num < 0)
+        number->num = 10;
+
+    skin_draw_pixbuf(widget, aud_active_skin, obj,
+                     number->skin_index, number->num * 9, 0,
+                     0, 0, number->width, number->height);
+
+    ui_skinned_widget_draw(widget, obj, number->width, number->height, number->scaled);
+
+    g_object_unref(obj);
+
+    return FALSE;
+}
+
+static void ui_skinned_number_toggle_scaled(UiSkinnedNumber *number) {
+    GtkWidget *widget = GTK_WIDGET (number);
+    number->scaled = !number->scaled;
+
+    gtk_widget_set_size_request(widget, number->width * ( number->scaled ? config.scale_factor : 1),
+        number->height * ( number->scaled ? config.scale_factor : 1) );
+
+    gtk_widget_queue_draw(GTK_WIDGET(number));
+}
+
+void ui_skinned_number_set_number(GtkWidget *widget, gint num) {
+    g_return_if_fail(UI_SKINNED_IS_NUMBER(widget));
+    UiSkinnedNumber *number = UI_SKINNED_NUMBER (widget);
+
+    if (number->num == num)
+         return;
+
+    number->num = num;
+    gtk_widget_queue_draw(GTK_WIDGET(number));
+}
+
+void ui_skinned_number_set_size(GtkWidget *widget, gint width, gint height) {
+    g_return_if_fail(UI_SKINNED_IS_NUMBER(widget));
+    UiSkinnedNumber *number = UI_SKINNED_NUMBER (widget);
+
+    number->width = width;
+    number->height = height;
+
+    gtk_widget_set_size_request(widget, width*(number->scaled ? config.scale_factor : 1 ),
+    height*(number->scaled ? config.scale_factor : 1 ));
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_skinned_number.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,61 @@
+/*
+ * Audacious - a cross-platform multimedia player
+ * Copyright (c) 2007 Tomasz Moń
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+#ifndef AUDACIOUS_UI_SKINNED_NUMBER_H
+#define AUDACIOUS_UI_SKINNED_NUMBER_H
+
+#include <gtk/gtk.h>
+#include "ui_skin.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define UI_SKINNED_NUMBER(obj)          GTK_CHECK_CAST (obj, ui_skinned_number_get_type (), UiSkinnedNumber)
+#define UI_SKINNED_NUMBER_CLASS(klass)  GTK_CHECK_CLASS_CAST (klass, ui_skinned_number_get_type (), UiSkinnedNumberClass)
+#define UI_SKINNED_IS_NUMBER(obj)       GTK_CHECK_TYPE (obj, ui_skinned_number_get_type ())
+
+typedef struct _UiSkinnedNumber        UiSkinnedNumber;
+typedef struct _UiSkinnedNumberClass   UiSkinnedNumberClass;
+
+struct _UiSkinnedNumber {
+    GtkWidget        widget;
+
+    gint             x, y, width, height;
+    gint             num;
+    gboolean         scaled;
+    SkinPixmapId     skin_index;
+};
+
+struct _UiSkinnedNumberClass {
+    GtkWidgetClass          parent_class;
+    void (* scaled)        (UiSkinnedNumber *textbox);
+};
+
+GtkWidget* ui_skinned_number_new (GtkWidget *fixed, gint x, gint y, SkinPixmapId si);
+GtkType ui_skinned_number_get_type(void);
+void ui_skinned_number_set_number(GtkWidget *widget, gint num);
+void ui_skinned_number_set_size(GtkWidget *widget, gint width, gint height);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* AUDACIOUS_UI_SKINNED_NUMBER_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_skinned_playlist.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,1079 @@
+/*
+ * Audacious - a cross-platform multimedia player
+ * Copyright (c) 2007 Tomasz Moń
+ * Copyright (c) 2008 William Pitcock
+ *
+ * Based on:
+ * BMP - Cross-platform multimedia player
+ * Copyright (C) 2003-2004  BMP development team.
+ *
+ * XMMS:
+ * Copyright (C) 1998-2003  XMMS development team.
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+/*
+ *  A note about Pango and some funky spacey fonts: Weirdly baselined
+ *  fonts, or fonts with weird ascents or descents _will_ display a
+ *  little bit weird in the playlist widget, but the display engine
+ *  won't make it look too bad, just a little deranged.  I honestly
+ *  don't think it's worth fixing (around...), it doesn't have to be
+ *  perfectly fitting, just the general look has to be ok, which it
+ *  IMHO is.
+ *
+ *  A second note: The numbers aren't perfectly aligned, but in the
+ *  end it looks better when using a single Pango layout for each
+ *  number.
+ */
+
+#include "ui_skinned_playlist.h"
+
+#include "debug.h"
+#include "ui_playlist.h"
+#include "ui_manager.h"
+#include "ui_skin.h"
+#include "util.h"
+#include "skins_cfg.h"
+#include <audacious/plugin.h>
+
+static PangoFontDescription *playlist_list_font = NULL;
+static gint ascent, descent, width_delta_digit_one;
+static gboolean has_slant;
+static guint padding;
+
+/* FIXME: the following globals should not be needed. */
+static gint width_approx_letters;
+static gint width_colon, width_colon_third;
+static gint width_approx_digits, width_approx_digits_half;
+
+#define UI_SKINNED_PLAYLIST_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ui_skinned_playlist_get_type(), UiSkinnedPlaylistPrivate))
+typedef struct _UiSkinnedPlaylistPrivate UiSkinnedPlaylistPrivate;
+
+struct _UiSkinnedPlaylistPrivate {
+    SkinPixmapId     skin_index;
+    gint             width, height;
+    gint             resize_width, resize_height;
+    gint             drag_pos;
+    gboolean         dragging, auto_drag_down, auto_drag_up;
+    gint             auto_drag_up_tag, auto_drag_down_tag;
+};
+
+static void ui_skinned_playlist_class_init         (UiSkinnedPlaylistClass *klass);
+static void ui_skinned_playlist_init               (UiSkinnedPlaylist *playlist);
+static void ui_skinned_playlist_destroy            (GtkObject *object);
+static void ui_skinned_playlist_realize            (GtkWidget *widget);
+static void ui_skinned_playlist_size_request       (GtkWidget *widget, GtkRequisition *requisition);
+static void ui_skinned_playlist_size_allocate      (GtkWidget *widget, GtkAllocation *allocation);
+static gboolean ui_skinned_playlist_expose         (GtkWidget *widget, GdkEventExpose *event);
+static gboolean ui_skinned_playlist_button_press   (GtkWidget *widget, GdkEventButton *event);
+static gboolean ui_skinned_playlist_button_release (GtkWidget *widget, GdkEventButton *event);
+static gboolean ui_skinned_playlist_motion_notify  (GtkWidget *widget, GdkEventMotion *event);
+static gboolean ui_skinned_playlist_leave_notify   (GtkWidget *widget, GdkEventCrossing *event);
+static gboolean ui_skinned_playlist_popup_show     (gpointer data);
+static void ui_skinned_playlist_popup_hide         (GtkWidget *widget);
+static void ui_skinned_playlist_popup_timer_start  (GtkWidget *widget);
+static void ui_skinned_playlist_popup_timer_stop   (GtkWidget *widget);
+
+static GtkWidgetClass *parent_class = NULL;
+
+GType ui_skinned_playlist_get_type() {
+    static GType playlist_type = 0;
+    if (!playlist_type) {
+        static const GTypeInfo playlist_info = {
+            sizeof (UiSkinnedPlaylistClass),
+            NULL,
+            NULL,
+            (GClassInitFunc) ui_skinned_playlist_class_init,
+            NULL,
+            NULL,
+            sizeof (UiSkinnedPlaylist),
+            0,
+            (GInstanceInitFunc) ui_skinned_playlist_init,
+        };
+        playlist_type = g_type_register_static (GTK_TYPE_WIDGET, "UiSkinnedPlaylist", &playlist_info, 0);
+    }
+
+    return playlist_type;
+}
+
+static void ui_skinned_playlist_class_init(UiSkinnedPlaylistClass *klass) {
+    GObjectClass *gobject_class;
+    GtkObjectClass *object_class;
+    GtkWidgetClass *widget_class;
+
+    gobject_class = G_OBJECT_CLASS(klass);
+    object_class = (GtkObjectClass*) klass;
+    widget_class = (GtkWidgetClass*) klass;
+    parent_class = gtk_type_class (gtk_widget_get_type ());
+
+    object_class->destroy = ui_skinned_playlist_destroy;
+
+    widget_class->realize = ui_skinned_playlist_realize;
+    widget_class->expose_event = ui_skinned_playlist_expose;
+    widget_class->size_request = ui_skinned_playlist_size_request;
+    widget_class->size_allocate = ui_skinned_playlist_size_allocate;
+    widget_class->button_press_event = ui_skinned_playlist_button_press;
+    widget_class->button_release_event = ui_skinned_playlist_button_release;
+    widget_class->motion_notify_event = ui_skinned_playlist_motion_notify;
+    widget_class->leave_notify_event = ui_skinned_playlist_leave_notify;
+
+    g_type_class_add_private (gobject_class, sizeof (UiSkinnedPlaylistPrivate));
+}
+
+static void ui_skinned_playlist_init(UiSkinnedPlaylist *playlist) {
+    UiSkinnedPlaylistPrivate *priv = UI_SKINNED_PLAYLIST_GET_PRIVATE(playlist);
+    playlist->pressed = FALSE;
+    priv->resize_width = 0;
+    priv->resize_height = 0;
+    playlist->prev_selected = -1;
+    playlist->prev_min = -1;
+    playlist->prev_max = -1;
+
+    g_object_set_data(G_OBJECT(playlist), "timer_id", GINT_TO_POINTER(0));
+    g_object_set_data(G_OBJECT(playlist), "timer_active", GINT_TO_POINTER(0));
+
+    GtkWidget *popup = audacious_fileinfopopup_create();
+    g_object_set_data(G_OBJECT(playlist), "popup", popup);
+    g_object_set_data(G_OBJECT(playlist), "popup_active", GINT_TO_POINTER(0));
+    g_object_set_data(G_OBJECT(playlist), "popup_position", GINT_TO_POINTER(-1));
+}
+
+GtkWidget* ui_skinned_playlist_new(GtkWidget *fixed, gint x, gint y, gint w, gint h) {
+
+    UiSkinnedPlaylist *hs = g_object_new (ui_skinned_playlist_get_type (), NULL);
+    UiSkinnedPlaylistPrivate *priv = UI_SKINNED_PLAYLIST_GET_PRIVATE(hs);
+
+    hs->x = x;
+    hs->y = y;
+    priv->width = w;
+    priv->height = h;
+    priv->skin_index = SKIN_PLEDIT;
+
+    gtk_fixed_put(GTK_FIXED(fixed), GTK_WIDGET(hs), hs->x, hs->y);
+    gtk_widget_set_double_buffered(GTK_WIDGET(hs), TRUE);
+
+    return GTK_WIDGET(hs);
+}
+
+static void ui_skinned_playlist_destroy(GtkObject *object) {
+    UiSkinnedPlaylist *playlist;
+
+    g_return_if_fail (object != NULL);
+    g_return_if_fail (UI_SKINNED_IS_PLAYLIST (object));
+
+    playlist = UI_SKINNED_PLAYLIST (object);
+
+    if (GTK_OBJECT_CLASS (parent_class)->destroy)
+        (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
+}
+
+static void ui_skinned_playlist_realize(GtkWidget *widget) {
+    UiSkinnedPlaylist *playlist;
+    GdkWindowAttr attributes;
+    gint attributes_mask;
+
+    g_return_if_fail (widget != NULL);
+    g_return_if_fail (UI_SKINNED_IS_PLAYLIST(widget));
+
+    GTK_WIDGET_SET_FLAGS(widget, GTK_REALIZED);
+    playlist = UI_SKINNED_PLAYLIST(widget);
+
+    attributes.x = widget->allocation.x;
+    attributes.y = widget->allocation.y;
+    attributes.width = widget->allocation.width;
+    attributes.height = widget->allocation.height;
+    attributes.wclass = GDK_INPUT_OUTPUT;
+    attributes.window_type = GDK_WINDOW_CHILD;
+    attributes.event_mask = gtk_widget_get_events(widget);
+    attributes.event_mask |= GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | 
+                             GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK;
+    attributes.visual = gtk_widget_get_visual(widget);
+    attributes.colormap = gtk_widget_get_colormap(widget);
+
+    attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
+    widget->window = gdk_window_new(widget->parent->window, &attributes, attributes_mask);
+
+    widget->style = gtk_style_attach(widget->style, widget->window);
+    gdk_window_set_user_data(widget->window, widget);
+}
+
+static void ui_skinned_playlist_size_request(GtkWidget *widget, GtkRequisition *requisition) {
+    UiSkinnedPlaylistPrivate *priv = UI_SKINNED_PLAYLIST_GET_PRIVATE(widget);
+
+    requisition->width = priv->width;
+    requisition->height = priv->height;
+}
+
+static void ui_skinned_playlist_size_allocate(GtkWidget *widget, GtkAllocation *allocation) {
+    UiSkinnedPlaylist *playlist = UI_SKINNED_PLAYLIST (widget);
+    UiSkinnedPlaylistPrivate *priv = UI_SKINNED_PLAYLIST_GET_PRIVATE(playlist);
+
+    widget->allocation = *allocation;
+    if (GTK_WIDGET_REALIZED (widget))
+        gdk_window_move_resize(widget->window, widget->allocation.x, widget->allocation.y, allocation->width, allocation->height);
+
+    playlist->x = widget->allocation.x;
+    playlist->y = widget->allocation.y;
+
+    if (priv->height != widget->allocation.height || priv->width != widget->allocation.width) {
+        priv->width = priv->width + priv->resize_width;
+        priv->height = priv->height + priv->resize_height;
+        priv->resize_width = 0;
+        priv->resize_height = 0;
+        gtk_widget_queue_draw(widget);
+    }
+}
+
+static gboolean ui_skinned_playlist_auto_drag_down_func(gpointer data) {
+    UiSkinnedPlaylist *pl = UI_SKINNED_PLAYLIST(data);
+    UiSkinnedPlaylistPrivate *priv = UI_SKINNED_PLAYLIST_GET_PRIVATE(data);
+
+    if (priv->auto_drag_down) {
+        ui_skinned_playlist_move_down(pl);
+        pl->first++;
+        playlistwin_update_list(aud_playlist_get_active());
+        return TRUE;
+    }
+    return FALSE;
+}
+
+static gboolean ui_skinned_playlist_auto_drag_up_func(gpointer data) {
+    UiSkinnedPlaylist *pl = UI_SKINNED_PLAYLIST(data);
+    UiSkinnedPlaylistPrivate *priv = UI_SKINNED_PLAYLIST_GET_PRIVATE(data);
+
+    if (priv->auto_drag_up) {
+        ui_skinned_playlist_move_up(pl);
+        pl->first--;
+        playlistwin_update_list(aud_playlist_get_active());
+        return TRUE;
+
+    }
+    return FALSE;
+}
+
+void ui_skinned_playlist_move_up(UiSkinnedPlaylist * pl) {
+    GList *list;
+    Playlist *playlist = aud_playlist_get_active();
+
+    if (!playlist)
+        return;
+
+    PLAYLIST_LOCK(playlist);
+    if ((list = playlist->entries) == NULL) {
+        PLAYLIST_UNLOCK(playlist);
+        return;
+    }
+    if (PLAYLIST_ENTRY(list->data)->selected) {
+        /* We are at the top */
+        PLAYLIST_UNLOCK(playlist);
+        return;
+    }
+    while (list) {
+        if (PLAYLIST_ENTRY(list->data)->selected)
+            glist_moveup(list);
+        list = g_list_next(list);
+    }
+    PLAYLIST_INCR_SERIAL(playlist);
+    PLAYLIST_UNLOCK(playlist);
+    if (pl->prev_selected != -1)
+        pl->prev_selected--;
+    if (pl->prev_min != -1)
+        pl->prev_min--;
+    if (pl->prev_max != -1)
+        pl->prev_max--;
+}
+
+void ui_skinned_playlist_move_down(UiSkinnedPlaylist * pl) {
+    GList *list;
+    Playlist *playlist = aud_playlist_get_active();
+
+    if (!playlist)
+        return;
+
+    PLAYLIST_LOCK(playlist);
+
+    if (!(list = g_list_last(playlist->entries))) {
+        PLAYLIST_UNLOCK(playlist);
+        return;
+    }
+
+    if (PLAYLIST_ENTRY(list->data)->selected) {
+        /* We are at the bottom */
+        PLAYLIST_UNLOCK(playlist);
+        return;
+    }
+
+    while (list) {
+        if (PLAYLIST_ENTRY(list->data)->selected)
+            glist_movedown(list);
+        list = g_list_previous(list);
+    }
+
+    PLAYLIST_INCR_SERIAL(playlist);
+    PLAYLIST_UNLOCK(playlist);
+
+    if (pl->prev_selected != -1)
+        pl->prev_selected++;
+    if (pl->prev_min != -1)
+        pl->prev_min++;
+    if (pl->prev_max != -1)
+        pl->prev_max++;
+}
+
+static void
+playlist_list_draw_string(cairo_t *cr, UiSkinnedPlaylist *pl,
+                          PangoFontDescription * font,
+                          gint line,
+                          gint width,
+                          const gchar * text,
+                          guint ppos)
+{
+    guint plist_length_int;
+    Playlist *playlist = aud_playlist_get_active();
+    PangoLayout *layout;
+
+    REQUIRE_LOCK(playlist->mutex);
+
+    cairo_new_path(cr);
+
+    if (config.show_numbers_in_pl) {
+        gchar *pos_string = g_strdup_printf(config.show_separator_in_pl == TRUE ? "%d" : "%d.", ppos);
+        plist_length_int =
+            gint_count_digits(aud_playlist_get_length(playlist)) + !config.show_separator_in_pl + 1; /* cf.show_separator_in_pl will be 0 if false */
+
+        padding = plist_length_int;
+        padding = ((padding + 1) * width_approx_digits);
+
+        layout = gtk_widget_create_pango_layout(playlistwin, pos_string);
+        pango_layout_set_font_description(layout, playlist_list_font);
+        pango_layout_set_width(layout, plist_length_int * 100);
+
+        pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT);
+
+        cairo_move_to(cr, (width_approx_digits *
+                         (-1 + plist_length_int - strlen(pos_string))) +
+                        (width_approx_digits / 4), (line - 1) * pl->fheight +
+                        ascent + abs(descent));
+        pango_cairo_show_layout(cr, layout);
+
+        g_free(pos_string);
+        g_object_unref(layout);
+
+        if (!config.show_separator_in_pl)
+            padding -= (width_approx_digits * 1.5);
+    } else {
+        padding = 3;
+    }
+
+    width -= padding;
+
+    layout = gtk_widget_create_pango_layout(playlistwin, text);
+
+    pango_layout_set_font_description(layout, playlist_list_font);
+    pango_layout_set_width(layout, width * PANGO_SCALE);
+    pango_layout_set_single_paragraph_mode(layout, TRUE);
+    pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_END);
+
+    cairo_move_to(cr, padding + (width_approx_letters / 4),
+                    (line - 1) * pl->fheight +
+                    ascent + abs(descent));
+    pango_cairo_show_layout(cr, layout);
+
+    g_object_unref(layout);
+}
+
+static gboolean ui_skinned_playlist_expose(GtkWidget *widget, GdkEventExpose *event) {
+    UiSkinnedPlaylist *pl = UI_SKINNED_PLAYLIST (widget);
+    UiSkinnedPlaylistPrivate *priv = UI_SKINNED_PLAYLIST_GET_PRIVATE(pl);
+    g_return_val_if_fail (priv->width > 0 && priv->height > 0, FALSE);
+
+    Playlist *playlist = aud_playlist_get_active();
+    PlaylistEntry *entry;
+    GList *list;
+    PangoLayout *layout;
+    gchar *title;
+    gint width, height;
+    gint i, max_first;
+    guint padding, padding_dwidth, padding_plength;
+    guint max_time_len = 0;
+    gfloat queue_tailpadding = 0;
+    gint tpadding; 
+    gsize tpadding_dwidth = 0;
+    gint x, y;
+    guint tail_width;
+    guint tail_len;
+    gboolean in_selection = FALSE;
+
+    gchar tail[100];
+    gchar queuepos[255];
+    gchar length[40];
+
+    gchar **frags;
+    gchar *frag0;
+
+    gint plw_w, plw_h;
+
+    cairo_t *cr;
+    gint yc;
+    gint pos;
+    gdouble rounding_offset;
+
+    g_return_val_if_fail (widget != NULL, FALSE);
+    g_return_val_if_fail (UI_SKINNED_IS_PLAYLIST (widget), FALSE);
+    g_return_val_if_fail (event != NULL, FALSE);
+
+    cr = gdk_cairo_create(widget->window);
+
+    width = priv->width;
+    height = priv->height;
+
+    plw_w = playlistwin_get_width();
+    plw_h = playlistwin_get_height();
+
+    gdk_cairo_set_source_color(cr, skin_get_color(aud_active_skin, SKIN_PLEDIT_NORMALBG));
+
+    cairo_rectangle(cr, 0, 0, width, height);
+    cairo_paint(cr);
+
+    if (!playlist_list_font) {
+        g_critical("Couldn't open playlist font");
+        return FALSE;
+    }
+
+    pl->fheight = (ascent + abs(descent));
+    pl->num_visible = height / pl->fheight;
+
+    rounding_offset = pl->fheight / 3;
+
+    max_first = aud_playlist_get_length(playlist) - pl->num_visible;
+    max_first = MAX(max_first, 0);
+
+    pl->first = CLAMP(pl->first, 0, max_first);
+
+    PLAYLIST_LOCK(playlist);
+    list = playlist->entries;
+    list = g_list_nth(list, pl->first);
+
+    /* It sucks having to run the iteration twice but this is the only
+       way you can reliably get the maximum width so we can get our
+       playlist nice and aligned... -- plasmaroo */
+
+    for (i = pl->first;
+         list && i < pl->first + pl->num_visible;
+         list = g_list_next(list), i++) {
+        entry = list->data;
+
+        if (entry->length != -1)
+        {
+            g_snprintf(length, sizeof(length), "%d:%-2.2d",
+                       entry->length / 60000, (entry->length / 1000) % 60);
+            tpadding_dwidth = MAX(tpadding_dwidth, strlen(length));
+        }
+    }
+
+    /* Reset */
+    list = playlist->entries;
+    list = g_list_nth(list, pl->first);
+
+    for (i = pl->first;
+         list && i < pl->first + pl->num_visible;
+         list = g_list_next(list), i++) {
+        entry = list->data;
+
+        if (entry->selected && !in_selection) {
+            yc = ((i - pl->first) * pl->fheight);
+
+            cairo_new_path(cr);
+
+            cairo_move_to(cr, 0, yc + (rounding_offset * 2));
+            cairo_curve_to(cr, 0, yc + rounding_offset, 0, yc + 0.5, 0 + rounding_offset, yc + 0.5);
+
+            cairo_line_to(cr, 0 + width - (rounding_offset * 2), yc + 0.5);
+            cairo_curve_to(cr, 0 + width - rounding_offset, yc + 0.5,
+                        0 + width, yc + 0.5, 0 + width, yc + rounding_offset);
+
+            in_selection = TRUE;
+        }
+
+        if ((!entry->selected ||
+            (i == pl->first + pl->num_visible - 1) || !g_list_next(list))
+            && in_selection) {
+
+            if (!entry->selected)
+                yc = (((i - 1) - pl->first) * pl->fheight);
+            else /* last visible item */
+                yc = ((i - pl->first) * pl->fheight);
+
+            cairo_line_to(cr, 0 + width, yc + pl->fheight - (rounding_offset * 2));
+            cairo_curve_to (cr, 0 + width, yc + pl->fheight - rounding_offset,
+                        0 + width, yc + pl->fheight - 0.5,
+                        0 + width-rounding_offset, yc + pl->fheight - 0.5);
+
+            cairo_line_to (cr, 0 + (rounding_offset * 2), yc + pl->fheight - 0.5);
+            cairo_curve_to (cr, 0 + rounding_offset, yc + pl->fheight - 0.5,
+                        0, yc + pl->fheight - 0.5,
+                        0, yc + pl->fheight - rounding_offset);
+
+            cairo_close_path (cr);
+
+            gdk_cairo_set_source_color(cr, skin_get_color(aud_active_skin, SKIN_PLEDIT_SELECTEDBG));
+
+            cairo_fill(cr);
+
+            in_selection = FALSE;
+        }
+    }
+
+    list = playlist->entries;
+    list = g_list_nth(list, pl->first);
+
+    /* now draw the text */
+    for (i = pl->first;
+         list && i < pl->first + pl->num_visible;
+         list = g_list_next(list), i++) {
+        entry = list->data;
+
+        /* FIXME: entry->title should NEVER be NULL, and there should
+           NEVER be a need to do a UTF-8 conversion. Playlist title
+           strings should be kept properly. */
+
+        if (!entry->title) {
+            gchar *realfn = g_filename_from_uri(entry->filename, NULL, NULL);
+            gchar *basename = g_path_get_basename(realfn ? realfn : entry->filename);
+            title = aud_filename_to_utf8(basename);
+            g_free(basename); g_free(realfn);
+        }
+        else
+            title = aud_str_to_utf8(entry->title);
+
+        title = aud_convert_title_text(title);
+
+        pos = aud_playlist_get_queue_position(playlist, entry);
+
+        tail[0] = 0;
+        queuepos[0] = 0;
+        length[0] = 0;
+
+        if (pos != -1)
+            g_snprintf(queuepos, sizeof(queuepos), "%d", pos + 1);
+
+        if (entry->length != -1)
+        {
+            g_snprintf(length, sizeof(length), "%d:%-2.2d",
+                       entry->length / 60000, (entry->length / 1000) % 60);
+        }
+
+        strncat(tail, length, sizeof(tail) - 1);
+        tail_len = strlen(tail);
+
+        max_time_len = MAX(max_time_len, tail_len);
+
+        if (pos != -1 && tpadding_dwidth <= 0)
+            tail_width = width - (width_approx_digits * (strlen(queuepos) + 2.25));
+        else if (pos != -1)
+            tail_width = width - (width_approx_digits * (tpadding_dwidth + strlen(queuepos) + 4));
+        else if (tpadding_dwidth > 0)
+            tail_width = width - (width_approx_digits * (tpadding_dwidth + 2.5));
+        else
+            tail_width = width;
+
+        if (i == aud_playlist_get_position_nolock(playlist))
+            gdk_cairo_set_source_color(cr, skin_get_color(aud_active_skin, SKIN_PLEDIT_CURRENT));
+        else
+            gdk_cairo_set_source_color(cr, skin_get_color(aud_active_skin, SKIN_PLEDIT_NORMAL));
+
+        playlist_list_draw_string(cr, pl, playlist_list_font,
+                                  i - pl->first, tail_width, title,
+                                  i + 1);
+
+        x = width - width_approx_digits * 2;
+        y = ((i - pl->first) - 1) * pl->fheight + ascent;
+
+        frags = NULL;
+        frag0 = NULL;
+
+        if ((strlen(tail) > 0) && (tail != NULL)) {
+            frags = g_strsplit(tail, ":", 0);
+            frag0 = g_strconcat(frags[0], ":", NULL);
+
+            layout = gtk_widget_create_pango_layout(playlistwin, frags[1]);
+            pango_layout_set_font_description(layout, playlist_list_font);
+            pango_layout_set_width(layout, tail_len * 100);
+            pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT);
+
+            cairo_new_path(cr);
+            cairo_move_to(cr, x - (0.5 * width_approx_digits), y + abs(descent));
+            pango_cairo_show_layout(cr, layout);
+            g_object_unref(layout);
+
+            layout = gtk_widget_create_pango_layout(playlistwin, frag0);
+            pango_layout_set_font_description(layout, playlist_list_font);
+            pango_layout_set_width(layout, tail_len * 100);
+            pango_layout_set_alignment(layout, PANGO_ALIGN_RIGHT);
+
+            cairo_move_to(cr, x - (0.75 * width_approx_digits), y + abs(descent));
+            pango_cairo_show_layout(cr, layout);
+            g_object_unref(layout);
+
+            g_free(frag0);
+            g_strfreev(frags);
+        }
+
+        if (pos != -1) {
+            if (tpadding_dwidth > 0)
+                queue_tailpadding = tpadding_dwidth + 1;
+            else
+                queue_tailpadding = -0.75;
+
+            cairo_rectangle(cr,
+                            x -
+                            (((queue_tailpadding +
+                               strlen(queuepos)) *
+                              width_approx_digits) +
+                             (width_approx_digits / 4)),
+                            y + abs(descent),
+                            (strlen(queuepos)) *
+                            width_approx_digits +
+                            (width_approx_digits / 2),
+                            pl->fheight - 2);
+
+            layout =
+                gtk_widget_create_pango_layout(playlistwin, queuepos);
+            pango_layout_set_font_description(layout, playlist_list_font);
+            pango_layout_set_alignment(layout, PANGO_ALIGN_CENTER);
+
+            cairo_move_to(cr,
+                            x -
+                            ((queue_tailpadding +
+                              strlen(queuepos)) * width_approx_digits) +
+                            (width_approx_digits / 4),
+                            y + abs(descent));
+            pango_cairo_show_layout(cr, layout);
+
+            g_object_unref(layout);
+        }
+
+        cairo_stroke(cr);
+
+        g_free(title);
+    }
+
+
+    /*
+     * Drop target hovering over the playlist, so draw some hint where the
+     * drop will occur.
+     *
+     * This is (currently? unfixably?) broken when dragging files from Qt/KDE apps,
+     * probably due to DnD signaling problems (actually i have no clue).
+     *
+     */
+
+    if (pl->drag_motion) {
+        guint pos, plength, lpadding;
+
+        if (config.show_numbers_in_pl) {
+            lpadding = gint_count_digits(aud_playlist_get_length(playlist)) + 1;
+            lpadding = ((lpadding + 1) * width_approx_digits);
+        }
+        else {
+            lpadding = 3;
+        };
+
+        /* We already hold the mutex and have the playlist locked, so call
+           the non-locking function. */
+        plength = aud_playlist_get_length(playlist);
+
+        x = pl->drag_motion_x;
+        y = pl->drag_motion_y;
+
+        if ((x > pl->x) && !(x > priv->width)) {
+
+            if ((y > pl->y)
+                && !(y > (priv->height + pl->y))) {
+
+                pos = (y / pl->fheight) +
+                    pl->first;
+
+                if (pos > (plength)) {
+                    pos = plength;
+                }
+
+                gdk_cairo_set_source_color(cr, skin_get_color(aud_active_skin, SKIN_PLEDIT_CURRENT));
+
+                cairo_new_path(cr);
+
+                cairo_move_to(cr, 0, ((pos - pl->first) * pl->fheight));
+                cairo_rel_line_to(cr, priv->width - 1, 0);
+
+                cairo_set_line_width(cr, 1);
+                cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE);
+                cairo_stroke(cr);
+            }
+
+        }
+
+        /* When dropping on the borders of the playlist, outside the text area,
+         * files get appended at the end of the list. Show that too.
+         */
+
+        if ((y < pl->y) || (y > priv->height + pl->y)) {
+            if ((y >= 0) || (y <= (priv->height + pl->y))) {
+                pos = plength;
+
+                gdk_cairo_set_source_color(cr, skin_get_color(aud_active_skin, SKIN_PLEDIT_CURRENT));
+
+                cairo_new_path(cr);
+
+                cairo_move_to(cr, 0, ((pos - pl->first) * pl->fheight));
+                cairo_rel_line_to(cr, priv->width - 1, 0);
+
+                cairo_set_line_width(cr, 1);
+                cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE);
+                cairo_stroke(cr);
+            }
+        }
+    }
+
+    gdk_cairo_set_source_color(cr, skin_get_color(aud_active_skin, SKIN_PLEDIT_NORMAL));
+    cairo_set_line_width(cr, 1);
+    cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE);
+
+    if (config.show_numbers_in_pl)
+    {
+        padding_plength = aud_playlist_get_length(playlist);
+
+        if (padding_plength == 0) {
+            padding_dwidth = 0;
+        }
+        else {
+            padding_dwidth = gint_count_digits(aud_playlist_get_length(playlist));
+        }
+
+        padding =
+            (padding_dwidth *
+             width_approx_digits) + width_approx_digits;
+
+
+        /* For italic or oblique fonts we add another half of the
+         * approximate width */
+        if (has_slant)
+            padding += width_approx_digits_half;
+
+        if (config.show_separator_in_pl) {
+            cairo_new_path(cr);
+
+            cairo_move_to(cr, padding, 0);
+            cairo_rel_line_to(cr, 0, priv->height - 1);
+
+            cairo_stroke(cr);
+        }
+    }
+
+    if (tpadding_dwidth != 0)
+    {
+        tpadding = (tpadding_dwidth * width_approx_digits) + (width_approx_digits * 1.5);
+
+        if (has_slant)
+            tpadding += width_approx_digits_half;
+
+        if (config.show_separator_in_pl) {
+            cairo_new_path(cr);
+
+            cairo_move_to(cr, priv->width - tpadding, 0);
+            cairo_rel_line_to(cr, 0, priv->height - 1);
+
+            cairo_stroke(cr);
+        }
+    }
+
+    PLAYLIST_UNLOCK(playlist);
+
+    cairo_destroy(cr);
+
+    return FALSE;
+}
+
+gint ui_skinned_playlist_get_position(GtkWidget *widget, gint x, gint y) {
+    gint iy, length;
+    gint ret;
+    Playlist *playlist = aud_playlist_get_active();
+    UiSkinnedPlaylist *pl = UI_SKINNED_PLAYLIST (widget);
+
+    if (!pl->fheight)
+        return -1;
+
+    if ((length = aud_playlist_get_length(playlist)) == 0)
+        return -1;
+    iy = y;
+
+    ret = (iy / pl->fheight) + pl->first;
+
+    if (ret > length - 1)
+        ret = -1;
+
+    return ret;
+}
+
+static gboolean ui_skinned_playlist_button_press(GtkWidget *widget, GdkEventButton *event) {
+    UiSkinnedPlaylist *pl = UI_SKINNED_PLAYLIST (widget);
+    UiSkinnedPlaylistPrivate *priv = UI_SKINNED_PLAYLIST_GET_PRIVATE(widget);
+
+    gint nr;
+    Playlist *playlist = aud_playlist_get_active();
+
+    nr = ui_skinned_playlist_get_position(widget, event->x, event->y);
+    if (nr == -1)
+        return TRUE;
+
+    if (event->button == 3) {
+        ui_manager_popup_menu_show(GTK_MENU(playlistwin_popup_menu),
+                                   event->x_root, event->y_root + 5,
+                                   event->button, event->time);
+        GList* selection = aud_playlist_get_selected(playlist);
+        if (g_list_find(selection, GINT_TO_POINTER(nr)) == NULL) {
+            aud_playlist_select_all(playlist, FALSE);
+            aud_playlist_select_range(playlist, nr, nr, TRUE);
+        }
+    } else if (event->button == 1) {
+        if (!(event->state & GDK_CONTROL_MASK))
+            aud_playlist_select_all(playlist, FALSE);
+
+        if ((event->state & GDK_MOD1_MASK))
+            aud_playlist_queue_position(playlist, nr);
+
+        if (event->state & GDK_SHIFT_MASK && pl->prev_selected != -1) {
+            aud_playlist_select_range(playlist, pl->prev_selected, nr, TRUE);
+            pl->prev_min = pl->prev_selected;
+            pl->prev_max = nr;
+            priv->drag_pos = nr - pl->first;
+        }
+        else {
+            if (aud_playlist_select_invert(playlist, nr)) {
+                if (event->state & GDK_CONTROL_MASK) {
+                    if (pl->prev_min == -1) {
+                        pl->prev_min = pl->prev_selected;
+                        pl->prev_max = pl->prev_selected;
+                    }
+                    if (nr < pl->prev_min)
+                        pl->prev_min = nr;
+                    else if (nr > pl->prev_max)
+                        pl->prev_max = nr;
+                }
+                else
+                    pl->prev_min = -1;
+                pl->prev_selected = nr;
+                priv->drag_pos = nr - pl->first;
+            }
+        }
+        if (event->type == GDK_2BUTTON_PRESS) {
+            /*
+             * Ungrab the pointer to prevent us from
+             * hanging on to it during the sometimes slow
+             * audacious_drct_initiate().
+             */
+            gdk_pointer_ungrab(GDK_CURRENT_TIME);
+            aud_playlist_set_position(playlist, nr);
+            if (!audacious_drct_get_playing())
+                audacious_drct_initiate();
+        }
+
+        priv->dragging = TRUE;
+    }
+    playlistwin_update_list(playlist);
+    ui_skinned_playlist_popup_hide(widget);
+    ui_skinned_playlist_popup_timer_stop(widget);
+
+    return TRUE;
+}
+
+static gboolean ui_skinned_playlist_button_release(GtkWidget *widget, GdkEventButton *event) {
+    UiSkinnedPlaylistPrivate *priv = UI_SKINNED_PLAYLIST_GET_PRIVATE(widget);
+
+    priv->dragging = FALSE;
+    priv->auto_drag_down = FALSE;
+    priv->auto_drag_up = FALSE;
+    gtk_widget_queue_draw(widget);
+
+    ui_skinned_playlist_popup_hide(widget);
+    ui_skinned_playlist_popup_timer_stop(widget);
+    return TRUE;
+}
+
+static gboolean ui_skinned_playlist_motion_notify(GtkWidget *widget, GdkEventMotion *event) {
+    UiSkinnedPlaylist *pl = UI_SKINNED_PLAYLIST(widget);
+    UiSkinnedPlaylistPrivate *priv = UI_SKINNED_PLAYLIST_GET_PRIVATE(widget);
+
+    gint nr, y, off, i;
+    if (priv->dragging) {
+        y = event->y;
+        nr = (y / pl->fheight);
+        if (nr < 0) {
+            nr = 0;
+            if (!priv->auto_drag_up) {
+                priv->auto_drag_up = TRUE;
+                priv->auto_drag_up_tag =
+                    g_timeout_add(100, ui_skinned_playlist_auto_drag_up_func, pl);
+            }
+        }
+        else if (priv->auto_drag_up)
+            priv->auto_drag_up = FALSE;
+
+        if (nr >= pl->num_visible) {
+            nr = pl->num_visible - 1;
+            if (!priv->auto_drag_down) {
+                priv->auto_drag_down = TRUE;
+                priv->auto_drag_down_tag =
+                    g_timeout_add(100, ui_skinned_playlist_auto_drag_down_func, pl);
+            }
+        }
+        else if (priv->auto_drag_down)
+            priv->auto_drag_down = FALSE;
+
+        off = nr - priv->drag_pos;
+        if (off) {
+            for (i = 0; i < abs(off); i++) {
+                if (off < 0)
+                    ui_skinned_playlist_move_up(pl);
+                else
+                    ui_skinned_playlist_move_down(pl);
+
+            }
+            playlistwin_update_list(aud_playlist_get_active());
+        }
+        priv->drag_pos = nr;
+    } else if (config.show_filepopup_for_tuple) {
+        gint pos = ui_skinned_playlist_get_position(widget, event->x, event->y);
+        gint cur_pos = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "popup_position"));
+        if (pos != cur_pos) {
+            g_object_set_data(G_OBJECT(widget), "popup_position", GINT_TO_POINTER(pos));
+            ui_skinned_playlist_popup_hide(widget);
+            ui_skinned_playlist_popup_timer_stop(widget);
+            if (pos != -1)
+                ui_skinned_playlist_popup_timer_start(widget);
+        }
+    }
+
+    return TRUE;
+}
+
+static gboolean ui_skinned_playlist_leave_notify(GtkWidget *widget, GdkEventCrossing *event) {
+    ui_skinned_playlist_popup_hide(widget);
+    ui_skinned_playlist_popup_timer_stop(widget);
+
+    return FALSE;
+}
+
+void ui_skinned_playlist_set_font(const gchar * font) {
+    /* Welcome to bad hack central 2k3 */
+    gchar *font_lower;
+    gint width_temp;
+    gint width_temp_0;
+
+    playlist_list_font = pango_font_description_from_string(font);
+
+    text_get_extents(font,
+                     "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz ",
+                     &width_approx_letters, NULL, &ascent, &descent);
+
+    width_approx_letters = (width_approx_letters / 53);
+
+    /* Experimental: We don't weigh the 1 into total because it's width is almost always
+     * very different from the rest
+     */
+    text_get_extents(font, "023456789", &width_approx_digits, NULL, NULL,
+                     NULL);
+    width_approx_digits = (width_approx_digits / 9);
+
+    /* Precache some often used calculations */
+    width_approx_digits_half = width_approx_digits / 2;
+
+    /* FIXME: We assume that any other number is broader than the "1" */
+    text_get_extents(font, "1", &width_temp, NULL, NULL, NULL);
+    text_get_extents(font, "2", &width_temp_0, NULL, NULL, NULL);
+
+    if (abs(width_temp_0 - width_temp) < 2) {
+        width_delta_digit_one = 0;
+    }
+    else {
+        width_delta_digit_one = ((width_temp_0 - width_temp) / 2) + 2;
+    }
+
+    text_get_extents(font, ":", &width_colon, NULL, NULL, NULL);
+    width_colon_third = width_colon / 4;
+
+    font_lower = g_utf8_strdown(font, strlen(font));
+    /* This doesn't take any i18n into account, but i think there is none with TTF fonts
+     * FIXME: This can probably be retrieved trough Pango too
+     */
+    has_slant = g_strstr_len(font_lower, strlen(font_lower), "oblique")
+        || g_strstr_len(font_lower, strlen(font_lower), "italic");
+
+    g_free(font_lower);
+}
+
+void ui_skinned_playlist_resize_relative(GtkWidget *widget, gint w, gint h) {
+    UiSkinnedPlaylistPrivate *priv = UI_SKINNED_PLAYLIST_GET_PRIVATE(widget);
+    priv->resize_width += w;
+    priv->resize_height += h;
+    gtk_widget_set_size_request(widget, priv->width+priv->resize_width, priv->height+priv->resize_height);
+}
+
+static gboolean ui_skinned_playlist_popup_show(gpointer data) {
+    GtkWidget *widget = data;
+    gint pos = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "popup_position"));
+
+    if (GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "timer_active")) == 1 && pos != -1) {
+        Tuple *tuple;
+        Playlist *pl_active = aud_playlist_get_active();
+        GtkWidget *popup = g_object_get_data(G_OBJECT(widget), "popup");
+
+        tuple = aud_playlist_get_tuple(pl_active, pos);
+        if ((tuple == NULL) || (aud_tuple_get_int(tuple, FIELD_LENGTH, NULL) < 1)) {
+           gchar *title = aud_playlist_get_songtitle(pl_active, pos);
+           audacious_fileinfopopup_show_from_title(popup, title);
+           g_free(title);
+        } else {
+           audacious_fileinfopopup_show_from_tuple(popup , tuple);
+        }
+        g_object_set_data(G_OBJECT(widget), "popup_active" , GINT_TO_POINTER(1));
+    }
+
+    ui_skinned_playlist_popup_timer_stop(widget);
+    return FALSE;
+}
+
+static void ui_skinned_playlist_popup_hide(GtkWidget *widget) {
+    if (GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "popup_active")) == 1) {
+        GtkWidget *popup = g_object_get_data(G_OBJECT(widget), "popup");
+        g_object_set_data(G_OBJECT(widget), "popup_active", GINT_TO_POINTER(0));
+        audacious_fileinfopopup_hide(popup, NULL);
+    }
+}
+
+static void ui_skinned_playlist_popup_timer_start(GtkWidget *widget) {
+    gint timer_id = g_timeout_add(config.filepopup_delay*100, ui_skinned_playlist_popup_show, widget);
+    g_object_set_data(G_OBJECT(widget), "timer_id", GINT_TO_POINTER(timer_id));
+    g_object_set_data(G_OBJECT(widget), "timer_active", GINT_TO_POINTER(1));
+}
+
+static void ui_skinned_playlist_popup_timer_stop(GtkWidget *widget) {
+    if (GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "timer_active")) == 1)
+        g_source_remove(GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget), "timer_id")));
+
+    g_object_set_data(G_OBJECT(widget), "timer_id", GINT_TO_POINTER(0));
+    g_object_set_data(G_OBJECT(widget), "timer_active", GINT_TO_POINTER(0));
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_skinned_playlist.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,76 @@
+/*
+ * Audacious - a cross-platform multimedia player
+ * Copyright (c) 2007 Tomasz Moń
+ *
+ * Based on:
+ * BMP - Cross-platform multimedia player
+ * Copyright (C) 2003-2004  BMP development team.
+ * XMMS:
+ * Copyright (C) 1998-2003  XMMS development team.
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+#ifndef AUDACIOUS_UI_SKINNED_PLAYLIST_H
+#define AUDACIOUS_UI_SKINNED_PLAYLIST_H
+
+#include <gtk/gtk.h>
+
+#include <cairo.h>
+#include <pango/pangocairo.h>
+
+#include "ui_skin.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define UI_SKINNED_PLAYLIST(obj)          GTK_CHECK_CAST (obj, ui_skinned_playlist_get_type (), UiSkinnedPlaylist)
+#define UI_SKINNED_PLAYLIST_CLASS(klass)  GTK_CHECK_CLASS_CAST (klass, ui_skinned_playlist_get_type (), UiSkinnedPlaylistClass)
+#define UI_SKINNED_IS_PLAYLIST(obj)       GTK_CHECK_TYPE (obj, ui_skinned_playlist_get_type ())
+
+typedef struct _UiSkinnedPlaylist        UiSkinnedPlaylist;
+typedef struct _UiSkinnedPlaylistClass   UiSkinnedPlaylistClass;
+
+struct _UiSkinnedPlaylist {
+    GtkWidget   widget;
+    gboolean    pressed;
+    gint        x, y;
+    gint        first;
+    gint        num_visible;
+    gint        prev_selected, prev_min, prev_max;
+    gboolean    drag_motion;
+    gint        drag_motion_x, drag_motion_y;
+    gint        fheight;
+};
+
+struct _UiSkinnedPlaylistClass {
+    GtkWidgetClass    parent_class;
+};
+
+GtkWidget* ui_skinned_playlist_new(GtkWidget *fixed, gint x, gint y, gint w, gint h);
+GtkType ui_skinned_playlist_get_type(void);
+void ui_skinned_playlist_resize_relative(GtkWidget *widget, gint w, gint h);
+void ui_skinned_playlist_set_font(const gchar * font);
+void ui_skinned_playlist_move_up(UiSkinnedPlaylist *pl);
+void ui_skinned_playlist_move_down(UiSkinnedPlaylist *pl);
+gint ui_skinned_playlist_get_position(GtkWidget *widget, gint x, gint y);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* AUDACIOUS_UI_SKINNED_PLAYLIST_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_skinned_playlist_slider.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,316 @@
+/*
+ * Audacious - a cross-platform multimedia player
+ * Copyright (c) 2007 Tomasz Moń
+ *
+ * Based on:
+ * BMP - Cross-platform multimedia player
+ * Copyright (C) 2003-2004  BMP development team.
+ * XMMS:
+ * Copyright (C) 1998-2003  XMMS development team.
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+#include "ui_skin.h"
+#include "ui_skinned_playlist_slider.h"
+#include "ui_playlist.h"
+
+#define UI_SKINNED_PLAYLIST_SLIDER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ui_skinned_playlist_slider_get_type(), UiSkinnedPlaylistSliderPrivate))
+typedef struct _UiSkinnedPlaylistSliderPrivate UiSkinnedPlaylistSliderPrivate;
+
+struct _UiSkinnedPlaylistSliderPrivate {
+    SkinPixmapId     skin_index;
+    gint             width, height;
+
+    gint             resize_height;
+    gint             move_x;
+    gint             prev_y;
+    gint             drag_y;
+};
+
+static void ui_skinned_playlist_slider_class_init         (UiSkinnedPlaylistSliderClass *klass);
+static void ui_skinned_playlist_slider_init               (UiSkinnedPlaylistSlider *playlist_slider);
+static void ui_skinned_playlist_slider_destroy            (GtkObject *object);
+static void ui_skinned_playlist_slider_realize            (GtkWidget *widget);
+static void ui_skinned_playlist_slider_size_request       (GtkWidget *widget, GtkRequisition *requisition);
+static void ui_skinned_playlist_slider_size_allocate      (GtkWidget *widget, GtkAllocation *allocation);
+static gboolean ui_skinned_playlist_slider_expose         (GtkWidget *widget, GdkEventExpose *event);
+static void ui_skinned_playlist_slider_set_position       (GtkWidget *widget, gint y);
+static gboolean ui_skinned_playlist_slider_button_press   (GtkWidget *widget, GdkEventButton *event);
+static gboolean ui_skinned_playlist_slider_button_release (GtkWidget *widget, GdkEventButton *event);
+static gboolean ui_skinned_playlist_slider_motion_notify  (GtkWidget *widget, GdkEventMotion *event);
+
+static GtkWidgetClass *parent_class = NULL;
+
+GType ui_skinned_playlist_slider_get_type() {
+    static GType playlist_slider_type = 0;
+    if (!playlist_slider_type) {
+        static const GTypeInfo playlist_slider_info = {
+            sizeof (UiSkinnedPlaylistSliderClass),
+            NULL,
+            NULL,
+            (GClassInitFunc) ui_skinned_playlist_slider_class_init,
+            NULL,
+            NULL,
+            sizeof (UiSkinnedPlaylistSlider),
+            0,
+            (GInstanceInitFunc) ui_skinned_playlist_slider_init,
+        };
+        playlist_slider_type = g_type_register_static (GTK_TYPE_WIDGET, "UiSkinnedPlaylistSlider", &playlist_slider_info, 0);
+    }
+
+    return playlist_slider_type;
+}
+
+static void ui_skinned_playlist_slider_class_init(UiSkinnedPlaylistSliderClass *klass) {
+    GObjectClass *gobject_class;
+    GtkObjectClass *object_class;
+    GtkWidgetClass *widget_class;
+
+    gobject_class = G_OBJECT_CLASS(klass);
+    object_class = (GtkObjectClass*) klass;
+    widget_class = (GtkWidgetClass*) klass;
+    parent_class = gtk_type_class (gtk_widget_get_type ());
+
+    object_class->destroy = ui_skinned_playlist_slider_destroy;
+
+    widget_class->realize = ui_skinned_playlist_slider_realize;
+    widget_class->expose_event = ui_skinned_playlist_slider_expose;
+    widget_class->size_request = ui_skinned_playlist_slider_size_request;
+    widget_class->size_allocate = ui_skinned_playlist_slider_size_allocate;
+    widget_class->button_press_event = ui_skinned_playlist_slider_button_press;
+    widget_class->button_release_event = ui_skinned_playlist_slider_button_release;
+    widget_class->motion_notify_event = ui_skinned_playlist_slider_motion_notify;
+
+    g_type_class_add_private (gobject_class, sizeof (UiSkinnedPlaylistSliderPrivate));
+}
+
+static void ui_skinned_playlist_slider_init(UiSkinnedPlaylistSlider *playlist_slider) {
+    UiSkinnedPlaylistSliderPrivate *priv = UI_SKINNED_PLAYLIST_SLIDER_GET_PRIVATE(playlist_slider);
+    playlist_slider->pressed = FALSE;
+    priv->resize_height = 0;
+    priv->move_x = 0;
+    priv->drag_y = 0;
+    priv->prev_y = 0;
+}
+
+GtkWidget* ui_skinned_playlist_slider_new(GtkWidget *fixed, gint x, gint y, gint h) {
+
+    UiSkinnedPlaylistSlider *hs = g_object_new (ui_skinned_playlist_slider_get_type (), NULL);
+    UiSkinnedPlaylistSliderPrivate *priv = UI_SKINNED_PLAYLIST_SLIDER_GET_PRIVATE(hs);
+
+    hs->x = x;
+    hs->y = y;
+    priv->width = 8;
+    priv->height = h;
+    priv->skin_index = SKIN_PLEDIT;
+
+    gtk_fixed_put(GTK_FIXED(fixed), GTK_WIDGET(hs), hs->x, hs->y);
+
+    return GTK_WIDGET(hs);
+}
+
+static void ui_skinned_playlist_slider_destroy(GtkObject *object) {
+    UiSkinnedPlaylistSlider *playlist_slider;
+
+    g_return_if_fail (object != NULL);
+    g_return_if_fail (UI_SKINNED_IS_PLAYLIST_SLIDER (object));
+
+    playlist_slider = UI_SKINNED_PLAYLIST_SLIDER (object);
+
+    if (GTK_OBJECT_CLASS (parent_class)->destroy)
+        (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
+}
+
+static void ui_skinned_playlist_slider_realize(GtkWidget *widget) {
+    UiSkinnedPlaylistSlider *playlist_slider;
+    GdkWindowAttr attributes;
+    gint attributes_mask;
+
+    g_return_if_fail (widget != NULL);
+    g_return_if_fail (UI_SKINNED_IS_PLAYLIST_SLIDER(widget));
+
+    GTK_WIDGET_SET_FLAGS(widget, GTK_REALIZED);
+    playlist_slider = UI_SKINNED_PLAYLIST_SLIDER(widget);
+
+    attributes.x = widget->allocation.x;
+    attributes.y = widget->allocation.y;
+    attributes.width = widget->allocation.width;
+    attributes.height = widget->allocation.height;
+    attributes.wclass = GDK_INPUT_OUTPUT;
+    attributes.window_type = GDK_WINDOW_CHILD;
+    attributes.event_mask = gtk_widget_get_events(widget);
+    attributes.event_mask |= GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | 
+                             GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK;
+    attributes.visual = gtk_widget_get_visual(widget);
+    attributes.colormap = gtk_widget_get_colormap(widget);
+
+    attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
+    widget->window = gdk_window_new(widget->parent->window, &attributes, attributes_mask);
+
+    widget->style = gtk_style_attach(widget->style, widget->window);
+    gdk_window_set_user_data(widget->window, widget);
+}
+
+static void ui_skinned_playlist_slider_size_request(GtkWidget *widget, GtkRequisition *requisition) {
+    UiSkinnedPlaylistSliderPrivate *priv = UI_SKINNED_PLAYLIST_SLIDER_GET_PRIVATE(widget);
+
+    requisition->width = priv->width;
+    requisition->height = priv->height;
+}
+
+static void ui_skinned_playlist_slider_size_allocate(GtkWidget *widget, GtkAllocation *allocation) {
+    UiSkinnedPlaylistSlider *playlist_slider = UI_SKINNED_PLAYLIST_SLIDER (widget);
+    UiSkinnedPlaylistSliderPrivate *priv = UI_SKINNED_PLAYLIST_SLIDER_GET_PRIVATE(playlist_slider);
+
+    widget->allocation = *allocation;
+    if (GTK_WIDGET_REALIZED (widget))
+        gdk_window_move_resize(widget->window, widget->allocation.x, widget->allocation.y, allocation->width, allocation->height);
+
+    if (playlist_slider->x + priv->move_x == widget->allocation.x)
+        priv->move_x = 0;
+    playlist_slider->x = widget->allocation.x;
+    playlist_slider->y = widget->allocation.y;
+
+    if (priv->height != widget->allocation.height) {
+        priv->height = priv->height + priv->resize_height;
+        priv->resize_height = 0;
+        gtk_widget_queue_draw(widget);
+    }
+}
+
+static gboolean ui_skinned_playlist_slider_expose(GtkWidget *widget, GdkEventExpose *event) {
+    g_return_val_if_fail (widget != NULL, FALSE);
+    g_return_val_if_fail (UI_SKINNED_IS_PLAYLIST_SLIDER (widget), FALSE);
+    g_return_val_if_fail (event != NULL, FALSE);
+
+    UiSkinnedPlaylistSlider *ps = UI_SKINNED_PLAYLIST_SLIDER (widget);
+    UiSkinnedPlaylistSliderPrivate *priv = UI_SKINNED_PLAYLIST_SLIDER_GET_PRIVATE(ps);
+    g_return_val_if_fail (priv->width > 0 && priv->height > 0, FALSE);
+
+    GdkPixbuf *obj = NULL;
+    obj = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, priv->width, priv->height);
+
+    gint num_visible;
+    num_visible = playlistwin_list_get_visible_count();
+
+
+    Playlist *playlist = aud_playlist_get_active();
+
+    gint y;
+    if (aud_playlist_get_length(playlist) > num_visible)
+        y = (playlistwin_list_get_first() * (priv->height - 19)) /
+            (aud_playlist_get_length(playlist) - num_visible);
+    else
+        y = 0;
+
+    if (y < 0) y=0;
+    if (y > priv->height - 19) y = priv->height - 19;
+
+    priv->prev_y = y;
+
+    /* FIXME: uses aud_active_skin->pixmaps directly and may need calibration */
+    /* drawing background */
+    gint c;
+    for (c = 0; c < priv->height / 29; c++) {
+         gdk_pixbuf_copy_area(aud_active_skin->pixmaps[SKIN_PLEDIT].pixbuf,
+                              36, 42, priv->width, 29, obj, 0, c*29);
+    }
+
+    /* drawing knob */
+    skin_draw_pixbuf(widget, aud_active_skin, obj, priv->skin_index, ps->pressed ? 61 : 52, 53, 0, y, priv->width, 18);
+
+    ui_skinned_widget_draw(widget, obj, priv->width, priv->height, FALSE);
+
+    g_object_unref(obj);
+
+    return FALSE;
+}
+
+static void ui_skinned_playlist_slider_set_position(GtkWidget *widget, gint y) {
+    gint pos;
+    Playlist *playlist = aud_playlist_get_active();
+    UiSkinnedPlaylistSliderPrivate *priv = UI_SKINNED_PLAYLIST_SLIDER_GET_PRIVATE(widget);
+
+    y = CLAMP(y, 0, priv->height - 19);
+
+    pos = (y * (aud_playlist_get_length(playlist) - playlistwin_list_get_visible_count())) / (priv->height - 19);
+    playlistwin_set_toprow(pos);
+
+    gtk_widget_queue_draw(widget);
+}
+
+static gboolean ui_skinned_playlist_slider_button_press(GtkWidget *widget, GdkEventButton *event) {
+    UiSkinnedPlaylistSlider *ps = UI_SKINNED_PLAYLIST_SLIDER (widget);
+    UiSkinnedPlaylistSliderPrivate *priv = UI_SKINNED_PLAYLIST_SLIDER_GET_PRIVATE(widget);
+
+    if (event->button != 1 && event->button != 2)
+        return TRUE;
+
+    gint y = event->y;
+    if (event->type == GDK_BUTTON_PRESS) {
+        ps->pressed = TRUE;
+        if ((y >= priv->prev_y && y < priv->prev_y + 18)) {
+            priv->drag_y = y - priv->prev_y;
+        } else if (event->button == 2) {
+            ui_skinned_playlist_slider_set_position(widget, y);
+            priv->drag_y = 0;
+        } else {
+            gint n = playlistwin_list_get_visible_count() / 2;
+            if (y < priv->prev_y)
+                n *= -1;
+            playlistwin_scroll(n);
+        }
+        gtk_widget_queue_draw(widget);
+    }
+    return TRUE;
+}
+
+static gboolean ui_skinned_playlist_slider_button_release(GtkWidget *widget, GdkEventButton *event) {
+    UiSkinnedPlaylistSlider *ps = UI_SKINNED_PLAYLIST_SLIDER(widget);
+
+    if (event->button == 1 || event->button == 2) {
+        ps->pressed = FALSE;
+        gtk_widget_queue_draw(widget);
+    }
+    return TRUE;
+}
+
+static gboolean ui_skinned_playlist_slider_motion_notify(GtkWidget *widget, GdkEventMotion *event) {
+    UiSkinnedPlaylistSlider *ps = UI_SKINNED_PLAYLIST_SLIDER(widget);
+    UiSkinnedPlaylistSliderPrivate *priv = UI_SKINNED_PLAYLIST_SLIDER_GET_PRIVATE(widget);
+
+    if (ps->pressed) {
+        gint y = event->y - priv->drag_y;
+        ui_skinned_playlist_slider_set_position(widget, y);
+    }
+    return TRUE;
+}
+
+void ui_skinned_playlist_slider_move_relative(GtkWidget *widget, gint x) {
+    UiSkinnedPlaylistSlider *playlist_slider = UI_SKINNED_PLAYLIST_SLIDER(widget);
+    UiSkinnedPlaylistSliderPrivate *priv = UI_SKINNED_PLAYLIST_SLIDER_GET_PRIVATE(widget);
+    priv->move_x += x;
+    gtk_fixed_move(GTK_FIXED(gtk_widget_get_parent(widget)), widget,
+                   playlist_slider->x+priv->move_x, playlist_slider->y);
+}
+
+void ui_skinned_playlist_slider_resize_relative(GtkWidget *widget, gint h) {
+    UiSkinnedPlaylistSlider *playlist_slider = UI_SKINNED_PLAYLIST_SLIDER(widget);
+    UiSkinnedPlaylistSliderPrivate *priv = UI_SKINNED_PLAYLIST_SLIDER_GET_PRIVATE(widget);
+    priv->resize_height += h;
+    gtk_widget_set_size_request(GTK_WIDGET(playlist_slider), priv->width, priv->height+priv->resize_height);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_skinned_playlist_slider.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,62 @@
+/*
+ * Audacious - a cross-platform multimedia player
+ * Copyright (c) 2007 Tomasz Moń
+ *
+ * Based on:
+ * BMP - Cross-platform multimedia player
+ * Copyright (C) 2003-2004  BMP development team.
+ * XMMS:
+ * Copyright (C) 1998-2003  XMMS development team.
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+#ifndef AUDACIOUS_UI_SKINNED_PLAYLIST_SLIDER_H
+#define AUDACIOUS_UI_SKINNED_PLAYLIST_SLIDER_H
+
+#include <gtk/gtk.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define UI_SKINNED_PLAYLIST_SLIDER(obj)          GTK_CHECK_CAST (obj, ui_skinned_playlist_slider_get_type (), UiSkinnedPlaylistSlider)
+#define UI_SKINNED_PLAYLIST_SLIDER_CLASS(klass)  GTK_CHECK_CLASS_CAST (klass, ui_skinned_playlist_slider_get_type (), UiSkinnedPlaylistSliderClass)
+#define UI_SKINNED_IS_PLAYLIST_SLIDER(obj)       GTK_CHECK_TYPE (obj, ui_skinned_playlist_slider_get_type ())
+
+typedef struct _UiSkinnedPlaylistSlider        UiSkinnedPlaylistSlider;
+typedef struct _UiSkinnedPlaylistSliderClass   UiSkinnedPlaylistSliderClass;
+
+struct _UiSkinnedPlaylistSlider {
+    GtkWidget   widget;
+    gboolean    pressed;
+    gint        x, y;
+};
+
+struct _UiSkinnedPlaylistSliderClass {
+    GtkWidgetClass    parent_class;
+};
+
+GtkWidget* ui_skinned_playlist_slider_new(GtkWidget *fixed, gint x, gint y, gint h);
+GtkType ui_skinned_playlist_slider_get_type(void);
+void ui_skinned_playlist_slider_move_relative(GtkWidget *widget, gint x);
+void ui_skinned_playlist_slider_resize_relative(GtkWidget *widget, gint h);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* AUDACIOUS_UI_SKINNED_PLAYLIST_SLIDER_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_skinned_playstatus.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,246 @@
+/*
+ * Audacious - a cross-platform multimedia player
+ * Copyright (c) 2007 Tomasz Moń
+ *
+ * Based on:
+ * BMP - Cross-platform multimedia player
+ * Copyright (C) 2003-2004  BMP development team.
+ * XMMS:
+ * Copyright (C) 1998-2003  XMMS development team.
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+#include "ui_skin.h"
+#include "ui_skinned_playstatus.h"
+#include "skins_cfg.h"
+
+#define UI_TYPE_SKINNED_PLAYSTATUS           (ui_skinned_playstatus_get_type())
+
+enum {
+    DOUBLED,
+    LAST_SIGNAL
+};
+
+static void ui_skinned_playstatus_class_init         (UiSkinnedPlaystatusClass *klass);
+static void ui_skinned_playstatus_init               (UiSkinnedPlaystatus *playstatus);
+static void ui_skinned_playstatus_destroy            (GtkObject *object);
+static void ui_skinned_playstatus_realize            (GtkWidget *widget);
+static void ui_skinned_playstatus_size_request       (GtkWidget *widget, GtkRequisition *requisition);
+static void ui_skinned_playstatus_size_allocate      (GtkWidget *widget, GtkAllocation *allocation);
+static gboolean ui_skinned_playstatus_expose         (GtkWidget *widget, GdkEventExpose *event);
+static void ui_skinned_playstatus_toggle_scaled      (UiSkinnedPlaystatus *playstatus);
+
+static GtkWidgetClass *parent_class = NULL;
+static guint playstatus_signals[LAST_SIGNAL] = { 0 };
+
+GType ui_skinned_playstatus_get_type() {
+    static GType playstatus_type = 0;
+    if (!playstatus_type) {
+        static const GTypeInfo playstatus_info = {
+            sizeof (UiSkinnedPlaystatusClass),
+            NULL,
+            NULL,
+            (GClassInitFunc) ui_skinned_playstatus_class_init,
+            NULL,
+            NULL,
+            sizeof (UiSkinnedPlaystatus),
+            0,
+            (GInstanceInitFunc) ui_skinned_playstatus_init,
+        };
+        playstatus_type = g_type_register_static (GTK_TYPE_WIDGET, "UiSkinnedPlaystatus", &playstatus_info, 0);
+    }
+
+    return playstatus_type;
+}
+
+static void ui_skinned_playstatus_class_init(UiSkinnedPlaystatusClass *klass) {
+    GObjectClass *gobject_class;
+    GtkObjectClass *object_class;
+    GtkWidgetClass *widget_class;
+
+    gobject_class = G_OBJECT_CLASS(klass);
+    object_class = (GtkObjectClass*) klass;
+    widget_class = (GtkWidgetClass*) klass;
+    parent_class = gtk_type_class (gtk_widget_get_type ());
+
+    object_class->destroy = ui_skinned_playstatus_destroy;
+
+    widget_class->realize = ui_skinned_playstatus_realize;
+    widget_class->expose_event = ui_skinned_playstatus_expose;
+    widget_class->size_request = ui_skinned_playstatus_size_request;
+    widget_class->size_allocate = ui_skinned_playstatus_size_allocate;
+
+    klass->scaled = ui_skinned_playstatus_toggle_scaled;
+
+    playstatus_signals[DOUBLED] = 
+        g_signal_new ("toggle-scaled", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
+                      G_STRUCT_OFFSET (UiSkinnedPlaystatusClass, scaled), NULL, NULL,
+                      gtk_marshal_VOID__VOID, G_TYPE_NONE, 0);
+}
+
+static void ui_skinned_playstatus_init(UiSkinnedPlaystatus *playstatus) {
+    playstatus->width = 11;
+    playstatus->height = 9;
+}
+
+GtkWidget* ui_skinned_playstatus_new(GtkWidget *fixed, gint x, gint y) {
+    UiSkinnedPlaystatus *playstatus = g_object_new (ui_skinned_playstatus_get_type (), NULL);
+
+    playstatus->x = x;
+    playstatus->y = y;
+
+    playstatus->scaled = FALSE;
+
+    gtk_fixed_put(GTK_FIXED(fixed), GTK_WIDGET(playstatus), playstatus->x, playstatus->y);
+
+    return GTK_WIDGET(playstatus);
+}
+
+static void ui_skinned_playstatus_destroy(GtkObject *object) {
+    UiSkinnedPlaystatus *playstatus;
+
+    g_return_if_fail (object != NULL);
+    g_return_if_fail (UI_SKINNED_IS_PLAYSTATUS (object));
+
+    playstatus = UI_SKINNED_PLAYSTATUS (object);
+
+    if (GTK_OBJECT_CLASS (parent_class)->destroy)
+        (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
+}
+
+static void ui_skinned_playstatus_realize(GtkWidget *widget) {
+    UiSkinnedPlaystatus *playstatus;
+    GdkWindowAttr attributes;
+    gint attributes_mask;
+
+    g_return_if_fail (widget != NULL);
+    g_return_if_fail (UI_SKINNED_IS_PLAYSTATUS(widget));
+
+    GTK_WIDGET_SET_FLAGS(widget, GTK_REALIZED);
+    playstatus = UI_SKINNED_PLAYSTATUS(widget);
+
+    attributes.x = widget->allocation.x;
+    attributes.y = widget->allocation.y;
+    attributes.width = widget->allocation.width;
+    attributes.height = widget->allocation.height;
+    attributes.wclass = GDK_INPUT_OUTPUT;
+    attributes.window_type = GDK_WINDOW_CHILD;
+    attributes.event_mask = gtk_widget_get_events(widget);
+    attributes.event_mask |= GDK_EXPOSURE_MASK;
+    attributes.visual = gtk_widget_get_visual(widget);
+    attributes.colormap = gtk_widget_get_colormap(widget);
+
+    attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
+    widget->window = gdk_window_new(widget->parent->window, &attributes, attributes_mask);
+
+    widget->style = gtk_style_attach(widget->style, widget->window);
+
+    gdk_window_set_user_data(widget->window, widget);
+}
+
+static void ui_skinned_playstatus_size_request(GtkWidget *widget, GtkRequisition *requisition) {
+    UiSkinnedPlaystatus *playstatus = UI_SKINNED_PLAYSTATUS(widget);
+
+    requisition->width = playstatus->width*(playstatus->scaled ? config.scale_factor : 1);
+    requisition->height = playstatus->height*(playstatus->scaled ? config.scale_factor : 1);
+}
+
+static void ui_skinned_playstatus_size_allocate(GtkWidget *widget, GtkAllocation *allocation) {
+    UiSkinnedPlaystatus *playstatus = UI_SKINNED_PLAYSTATUS (widget);
+
+    widget->allocation = *allocation;
+    widget->allocation.x *= (playstatus->scaled ? config.scale_factor : 1);
+    widget->allocation.y *= (playstatus->scaled ? config.scale_factor : 1);
+    if (GTK_WIDGET_REALIZED (widget))
+        gdk_window_move_resize(widget->window, widget->allocation.x, widget->allocation.y, allocation->width, allocation->height);
+
+    playstatus->x = widget->allocation.x/(playstatus->scaled ? config.scale_factor : 1);
+    playstatus->y = widget->allocation.y/(playstatus->scaled ? config.scale_factor : 1);
+}
+
+static gboolean ui_skinned_playstatus_expose(GtkWidget *widget, GdkEventExpose *event) {
+    g_return_val_if_fail (widget != NULL, FALSE);
+    g_return_val_if_fail (UI_SKINNED_IS_PLAYSTATUS (widget), FALSE);
+    g_return_val_if_fail (event != NULL, FALSE);
+
+    UiSkinnedPlaystatus *playstatus = UI_SKINNED_PLAYSTATUS (widget);
+    g_return_val_if_fail (playstatus->width > 0 && playstatus->height > 0, FALSE);
+
+    GdkPixbuf *obj = NULL;
+    obj = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, playstatus->width, playstatus->height);
+
+    if (playstatus->status == STATUS_STOP && playstatus->buffering == TRUE)
+        playstatus->buffering = FALSE;
+    if (playstatus->status == STATUS_PLAY && playstatus->buffering == TRUE)
+        skin_draw_pixbuf(widget, aud_active_skin, obj, SKIN_PLAYPAUSE, 39, 0, 0, 0, 3, playstatus->height);
+    else if (playstatus->status == STATUS_PLAY)
+        skin_draw_pixbuf(widget, aud_active_skin, obj, SKIN_PLAYPAUSE, 36, 0, 0, 0, 3, playstatus->height);
+    else
+        skin_draw_pixbuf(widget, aud_active_skin, obj, SKIN_PLAYPAUSE, 27, 0, 0, 0, 2, playstatus->height);
+    switch (playstatus->status) {
+    case STATUS_STOP:
+        skin_draw_pixbuf(widget, aud_active_skin, obj, SKIN_PLAYPAUSE, 18, 0, 2, 0, 9, playstatus->height);
+        break;
+    case STATUS_PAUSE:
+        skin_draw_pixbuf(widget, aud_active_skin, obj, SKIN_PLAYPAUSE, 9, 0, 2, 0, 9, playstatus->height);
+        break;
+    case STATUS_PLAY:
+        skin_draw_pixbuf(widget, aud_active_skin, obj, SKIN_PLAYPAUSE, 1, 0, 3, 0, 8, playstatus->height);
+        break;
+    }
+
+    ui_skinned_widget_draw(widget, obj, playstatus->width, playstatus->height, playstatus->scaled);
+
+    g_object_unref(obj);
+
+    return FALSE;
+}
+
+static void ui_skinned_playstatus_toggle_scaled(UiSkinnedPlaystatus *playstatus) {
+    GtkWidget *widget = GTK_WIDGET (playstatus);
+
+    playstatus->scaled = !playstatus->scaled;
+    gtk_widget_set_size_request(widget, playstatus->width*(playstatus->scaled ? config.scale_factor : 1), playstatus->height*(playstatus->scaled ? config.scale_factor : 1));
+
+    gtk_widget_queue_draw(GTK_WIDGET(playstatus));
+}
+
+void ui_skinned_playstatus_set_status(GtkWidget *widget, PStatus status) {
+    g_return_if_fail (UI_SKINNED_IS_PLAYSTATUS (widget));
+    UiSkinnedPlaystatus *playstatus = UI_SKINNED_PLAYSTATUS (widget);
+
+    playstatus->status = status;
+    gtk_widget_queue_draw(widget);
+}
+
+void ui_skinned_playstatus_set_buffering(GtkWidget *widget, gboolean status) {
+    g_return_if_fail (UI_SKINNED_IS_PLAYSTATUS (widget));
+    UiSkinnedPlaystatus *playstatus = UI_SKINNED_PLAYSTATUS (widget);
+
+    playstatus->buffering = status;
+    gtk_widget_queue_draw(widget);
+}
+
+void ui_skinned_playstatus_set_size(GtkWidget *widget, gint width, gint height) {
+    g_return_if_fail (UI_SKINNED_IS_PLAYSTATUS (widget));
+    UiSkinnedPlaystatus *playstatus = UI_SKINNED_PLAYSTATUS (widget);
+
+    playstatus->width = width;
+    playstatus->height = height;
+
+    gtk_widget_set_size_request(widget, width*(playstatus->scaled ? config.scale_factor : 1), height*(playstatus->scaled ? config.scale_factor : 1));
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_skinned_playstatus.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,71 @@
+/*
+ * Audacious - a cross-platform multimedia player
+ * Copyright (c) 2007 Tomasz Moń
+ *
+ * Based on:
+ * BMP - Cross-platform multimedia player
+ * Copyright (C) 2003-2004  BMP development team.
+ * XMMS:
+ * Copyright (C) 1998-2003  XMMS development team.
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+#ifndef AUDACIOUS_UI_SKINNED_PLAYSTATUS_H
+#define AUDACIOUS_UI_SKINNED_PLAYSTATUS_H
+
+#include <gtk/gtk.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define UI_SKINNED_PLAYSTATUS(obj)          GTK_CHECK_CAST (obj, ui_skinned_playstatus_get_type (), UiSkinnedPlaystatus)
+#define UI_SKINNED_PLAYSTATUS_CLASS(klass)  GTK_CHECK_CLASS_CAST (klass, ui_skinned_playstatus_get_type (), UiSkinnedPlaystatusClass)
+#define UI_SKINNED_IS_PLAYSTATUS(obj)       GTK_CHECK_TYPE (obj, ui_skinned_playstatus_get_type ())
+
+typedef struct _UiSkinnedPlaystatus        UiSkinnedPlaystatus;
+typedef struct _UiSkinnedPlaystatusClass   UiSkinnedPlaystatusClass;
+
+typedef enum {
+    STATUS_STOP, STATUS_PAUSE, STATUS_PLAY
+} PStatus;
+
+struct _UiSkinnedPlaystatus {
+    GtkWidget        widget;
+
+    gint             x, y, width, height;
+    gboolean         scaled;
+    PStatus          status;
+    gboolean         buffering;
+};
+
+struct _UiSkinnedPlaystatusClass {
+    GtkWidgetClass          parent_class;
+    void (* scaled)        (UiSkinnedPlaystatus *menurow);
+};
+
+GtkWidget* ui_skinned_playstatus_new (GtkWidget *fixed, gint x, gint y);
+GtkType ui_skinned_playstatus_get_type(void);
+void ui_skinned_playstatus_set_status(GtkWidget *widget, PStatus status);
+void ui_skinned_playstatus_set_buffering(GtkWidget *widget, gboolean status);
+void ui_skinned_playstatus_set_size(GtkWidget *widget, gint width, gint height);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* AUDACIOUS_UI_SKINNED_PLAYSTATUS_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_skinned_textbox.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,857 @@
+/*
+ * Audacious - a cross-platform multimedia player
+ * Copyright (c) 2007 Tomasz Moń
+ *
+ * Based on:
+ * BMP - Cross-platform multimedia player
+ * Copyright (C) 2003-2004  BMP development team.
+ * XMMS:
+ * Copyright (C) 1998-2003  XMMS development team.
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+#include "ui_skinned_textbox.h"
+#include "skins_cfg.h"
+#include "plugin.h"
+#include <string.h>
+
+#include "util.h"
+
+#define UI_SKINNED_TEXTBOX_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), ui_skinned_textbox_get_type(), UiSkinnedTextboxPrivate))
+typedef struct _UiSkinnedTextboxPrivate UiSkinnedTextboxPrivate;
+
+#define TEXTBOX_SCROLL_SMOOTH_TIMEOUT  30
+#define TEXTBOX_SCROLL_WAIT            80
+
+enum {
+    CLICKED,
+    DOUBLE_CLICKED,
+    RIGHT_CLICKED,
+    DOUBLED,
+    LAST_SIGNAL
+};
+
+struct _UiSkinnedTextboxPrivate {
+    SkinPixmapId     skin_index;
+    gboolean         scaled;
+    gboolean         scroll_back;
+    gint             nominal_y, nominal_height;
+    gint             scroll_timeout;
+    gint             font_ascent, font_descent;
+    PangoFontDescription *font;
+    gchar            *fontname;
+    gchar            *pixbuf_text;
+    gint             skin_id;
+    gint             drag_x, drag_off, offset;
+    gboolean         is_scrollable, is_dragging;
+    gint             pixbuf_width;
+    GdkPixbuf        *pixbuf;
+    gboolean         scroll_allowed, scroll_enabled;
+    gint             scroll_dummy;
+    gint             move_x, move_y;
+};
+
+static void ui_skinned_textbox_class_init         (UiSkinnedTextboxClass *klass);
+static void ui_skinned_textbox_init               (UiSkinnedTextbox *textbox);
+static void ui_skinned_textbox_destroy            (GtkObject *object);
+static void ui_skinned_textbox_realize            (GtkWidget *widget);
+static void ui_skinned_textbox_size_request       (GtkWidget *widget, GtkRequisition *requisition);
+static void ui_skinned_textbox_size_allocate      (GtkWidget *widget, GtkAllocation *allocation);
+static gboolean ui_skinned_textbox_expose         (GtkWidget *widget, GdkEventExpose *event);
+static gboolean ui_skinned_textbox_button_press   (GtkWidget *widget, GdkEventButton *event);
+static gboolean ui_skinned_textbox_button_release (GtkWidget *widget, GdkEventButton *event);
+static gboolean ui_skinned_textbox_motion_notify  (GtkWidget *widget, GdkEventMotion *event);
+static void ui_skinned_textbox_toggle_scaled      (UiSkinnedTextbox *textbox);
+static gboolean ui_skinned_textbox_should_scroll  (UiSkinnedTextbox *textbox);
+static void textbox_generate_xfont_pixmap         (UiSkinnedTextbox *textbox, const gchar *pixmaptext);
+static gboolean textbox_scroll                    (gpointer data);
+static void textbox_generate_pixmap               (UiSkinnedTextbox *textbox);
+static void textbox_handle_special_char           (gchar *c, gint * x, gint * y);
+
+static GtkWidgetClass *parent_class = NULL;
+static guint textbox_signals[LAST_SIGNAL] = { 0 };
+
+GType ui_skinned_textbox_get_type() {
+    static GType textbox_type = 0;
+    if (!textbox_type) {
+        static const GTypeInfo textbox_info = {
+            sizeof (UiSkinnedTextboxClass),
+            NULL,
+            NULL,
+            (GClassInitFunc) ui_skinned_textbox_class_init,
+            NULL,
+            NULL,
+            sizeof (UiSkinnedTextbox),
+            0,
+            (GInstanceInitFunc) ui_skinned_textbox_init,
+        };
+        textbox_type = g_type_register_static (GTK_TYPE_WIDGET, "UiSkinnedTextbox", &textbox_info, 0);
+    }
+
+    return textbox_type;
+}
+
+static void ui_skinned_textbox_class_init(UiSkinnedTextboxClass *klass) {
+    GObjectClass *gobject_class;
+    GtkObjectClass *object_class;
+    GtkWidgetClass *widget_class;
+
+    gobject_class = G_OBJECT_CLASS(klass);
+    object_class = (GtkObjectClass*) klass;
+    widget_class = (GtkWidgetClass*) klass;
+    parent_class = gtk_type_class (gtk_widget_get_type ());
+
+    object_class->destroy = ui_skinned_textbox_destroy;
+
+    widget_class->realize = ui_skinned_textbox_realize;
+    widget_class->expose_event = ui_skinned_textbox_expose;
+    widget_class->size_request = ui_skinned_textbox_size_request;
+    widget_class->size_allocate = ui_skinned_textbox_size_allocate;
+    widget_class->button_press_event = ui_skinned_textbox_button_press;
+    widget_class->button_release_event = ui_skinned_textbox_button_release;
+    widget_class->motion_notify_event = ui_skinned_textbox_motion_notify;
+
+    klass->clicked = NULL;
+    klass->double_clicked = NULL;
+    klass->right_clicked = NULL;
+    klass->scaled = ui_skinned_textbox_toggle_scaled;
+
+    textbox_signals[CLICKED] = 
+        g_signal_new ("clicked", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
+                      G_STRUCT_OFFSET (UiSkinnedTextboxClass, clicked), NULL, NULL,
+                      gtk_marshal_VOID__VOID, G_TYPE_NONE, 0);
+
+    textbox_signals[DOUBLE_CLICKED] = 
+        g_signal_new ("double-clicked", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
+                      G_STRUCT_OFFSET (UiSkinnedTextboxClass, double_clicked), NULL, NULL,
+                      gtk_marshal_VOID__VOID, G_TYPE_NONE, 0);
+
+    textbox_signals[RIGHT_CLICKED] = 
+        g_signal_new ("right-clicked", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
+                      G_STRUCT_OFFSET (UiSkinnedTextboxClass, right_clicked), NULL, NULL,
+                      gtk_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER);
+
+    textbox_signals[DOUBLED] = 
+        g_signal_new ("toggle-scaled", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
+                      G_STRUCT_OFFSET (UiSkinnedTextboxClass, scaled), NULL, NULL,
+                      gtk_marshal_VOID__VOID, G_TYPE_NONE, 0);
+
+    g_type_class_add_private (gobject_class, sizeof (UiSkinnedTextboxPrivate));
+}
+
+static void ui_skinned_textbox_init(UiSkinnedTextbox *textbox) {
+    UiSkinnedTextboxPrivate *priv = UI_SKINNED_TEXTBOX_GET_PRIVATE(textbox);
+    priv->move_x = 0;
+    priv->move_y = 0;
+}
+
+GtkWidget* ui_skinned_textbox_new(GtkWidget *fixed, gint x, gint y, gint w, gboolean allow_scroll, SkinPixmapId si) {
+    UiSkinnedTextbox *textbox = g_object_new (ui_skinned_textbox_get_type (), NULL);
+    UiSkinnedTextboxPrivate *priv = UI_SKINNED_TEXTBOX_GET_PRIVATE(textbox);
+
+    textbox->height = aud_active_skin->properties.textbox_bitmap_font_height;
+    textbox->x = x;
+    textbox->y = y;
+    textbox->text = g_strdup("");
+    textbox->width = w;
+    priv->scroll_allowed = allow_scroll;
+    priv->scroll_enabled = TRUE;
+    priv->skin_index = si;
+    priv->nominal_y = y;
+    priv->nominal_height = textbox->height;
+    priv->scroll_timeout = 0;
+    priv->scroll_dummy = 0;
+
+    priv->scaled = FALSE;
+
+    gtk_fixed_put(GTK_FIXED(fixed), GTK_WIDGET(textbox), textbox->x, textbox->y);
+
+    return GTK_WIDGET(textbox);
+}
+
+static void ui_skinned_textbox_destroy(GtkObject *object) {
+    UiSkinnedTextbox *textbox;
+
+    g_return_if_fail (object != NULL);
+    g_return_if_fail (UI_SKINNED_IS_TEXTBOX (object));
+
+    textbox = UI_SKINNED_TEXTBOX (object);
+
+    if (GTK_OBJECT_CLASS (parent_class)->destroy)
+        (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
+}
+
+static void ui_skinned_textbox_realize(GtkWidget *widget) {
+    UiSkinnedTextbox *textbox;
+    GdkWindowAttr attributes;
+    gint attributes_mask;
+
+    g_return_if_fail (widget != NULL);
+    g_return_if_fail (UI_SKINNED_IS_TEXTBOX(widget));
+
+    GTK_WIDGET_SET_FLAGS(widget, GTK_REALIZED);
+    textbox = UI_SKINNED_TEXTBOX(widget);
+
+    attributes.x = widget->allocation.x;
+    attributes.y = widget->allocation.y;
+    attributes.width = widget->allocation.width;
+    attributes.height = widget->allocation.height;
+    attributes.wclass = GDK_INPUT_OUTPUT;
+    attributes.window_type = GDK_WINDOW_CHILD;
+    attributes.event_mask = gtk_widget_get_events(widget);
+    attributes.event_mask |= GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | 
+                             GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK |
+                             GDK_POINTER_MOTION_HINT_MASK;
+    attributes.visual = gtk_widget_get_visual(widget);
+    attributes.colormap = gtk_widget_get_colormap(widget);
+
+    attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
+    widget->window = gdk_window_new(widget->parent->window, &attributes, attributes_mask);
+
+    widget->style = gtk_style_attach(widget->style, widget->window);
+
+    gdk_window_set_user_data(widget->window, widget);
+}
+
+static void ui_skinned_textbox_size_request(GtkWidget *widget, GtkRequisition *requisition) {
+    UiSkinnedTextbox *textbox = UI_SKINNED_TEXTBOX(widget);
+    UiSkinnedTextboxPrivate *priv = UI_SKINNED_TEXTBOX_GET_PRIVATE(textbox);
+
+    requisition->width = textbox->width*(priv->scaled ? config.scale_factor : 1);
+    requisition->height = textbox->height*(priv->scaled ?  config.scale_factor : 1 );
+}
+
+static void ui_skinned_textbox_size_allocate(GtkWidget *widget, GtkAllocation *allocation) {
+    UiSkinnedTextbox *textbox = UI_SKINNED_TEXTBOX (widget);
+    UiSkinnedTextboxPrivate *priv = UI_SKINNED_TEXTBOX_GET_PRIVATE(textbox);
+
+    widget->allocation = *allocation;
+    widget->allocation.x *= (priv->scaled ? config.scale_factor : 1);
+    widget->allocation.y *= (priv->scaled ? config.scale_factor : 1);
+    if (GTK_WIDGET_REALIZED (widget))
+        gdk_window_move_resize(widget->window, widget->allocation.x, widget->allocation.y, allocation->width, allocation->height);
+
+    if (textbox->x + priv->move_x - widget->allocation.x/(priv->scaled ? config.scale_factor : 1) <3);
+        priv->move_x = 0;
+    if (textbox->y + priv->move_y - widget->allocation.y/(priv->scaled ? config.scale_factor : 1) <3);
+        priv->move_y = 0;
+    textbox->x = widget->allocation.x/(priv->scaled ? config.scale_factor : 1);
+    textbox->y = widget->allocation.y/(priv->scaled ? config.scale_factor : 1);
+
+    if (textbox->width - (guint) (widget->allocation.width / (priv->scaled ? config.scale_factor : 1)) > 2) {
+            textbox->width = (guint) (widget->allocation.width / (priv->scaled ? config.scale_factor : 1));
+            if (priv->pixbuf_text) g_free(priv->pixbuf_text);
+            priv->pixbuf_text = NULL;
+            priv->offset = 0;
+            gtk_widget_set_size_request(widget, textbox->width, textbox->height);
+            gtk_widget_queue_draw(GTK_WIDGET(textbox));
+    }
+}
+
+static gboolean ui_skinned_textbox_expose(GtkWidget *widget, GdkEventExpose *event) {
+    g_return_val_if_fail (widget != NULL, FALSE);
+    g_return_val_if_fail (UI_SKINNED_IS_TEXTBOX (widget), FALSE);
+    g_return_val_if_fail (event != NULL, FALSE);
+
+    UiSkinnedTextbox *textbox = UI_SKINNED_TEXTBOX (widget);
+    UiSkinnedTextboxPrivate *priv = UI_SKINNED_TEXTBOX_GET_PRIVATE(textbox);
+    g_return_val_if_fail (textbox->width > 0 && textbox->height > 0, FALSE);
+
+    GdkPixbuf *obj = NULL;
+    gint cw;
+
+    if (textbox->text && (!priv->pixbuf_text || strcmp(textbox->text, priv->pixbuf_text)))
+        textbox_generate_pixmap(textbox);
+
+    if (priv->pixbuf) {
+        if (skin_get_id() != priv->skin_id) {
+            priv->skin_id = skin_get_id();
+            textbox_generate_pixmap(textbox);
+        }
+        obj = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, textbox->width, textbox->height);
+
+        if (config.twoway_scroll) { // twoway scroll
+            cw = priv->pixbuf_width - priv->offset;
+            if (cw > textbox->width)
+                cw = textbox->width;
+            gdk_pixbuf_copy_area(priv->pixbuf, priv->offset, 0, cw, textbox->height, obj, 0, 0);
+            if (cw < textbox->width)
+                gdk_pixbuf_copy_area(priv->pixbuf, 0, 0, textbox->width - cw, textbox->height,
+                                     obj, textbox->width - cw, textbox->height);
+        } else { // oneway scroll
+            int cw1, cw2;
+
+            if (priv->offset >= priv->pixbuf_width)
+                priv->offset = 0;
+
+            if (priv->pixbuf_width - priv->offset > textbox->width) { // case1
+                cw1 = textbox->width;
+                gdk_pixbuf_copy_area(priv->pixbuf, priv->offset, 0, cw1, textbox->height,
+                                     obj, 0, 0);
+            } else { // case 2
+                cw1 = priv->pixbuf_width - priv->offset;
+                gdk_pixbuf_copy_area(priv->pixbuf, priv->offset, 0, cw1, textbox->height, obj, 0, 0);
+                cw2 = textbox->width - cw1;
+                gdk_pixbuf_copy_area(priv->pixbuf, 0, 0, cw2, textbox->height, obj, cw1, 0);
+            }
+        }
+
+        ui_skinned_widget_draw(widget, obj, textbox->width, textbox->height, priv->scaled);
+
+        g_object_unref(obj);
+    }
+
+    return FALSE;
+}
+
+static gboolean ui_skinned_textbox_button_press(GtkWidget *widget, GdkEventButton *event) {
+    g_return_val_if_fail (widget != NULL, FALSE);
+    g_return_val_if_fail (UI_SKINNED_IS_TEXTBOX (widget), FALSE);
+    g_return_val_if_fail (event != NULL, FALSE);
+
+    UiSkinnedTextbox *textbox = UI_SKINNED_TEXTBOX (widget);
+    UiSkinnedTextboxPrivate *priv = UI_SKINNED_TEXTBOX_GET_PRIVATE(textbox);
+
+    if (event->type == GDK_BUTTON_PRESS) {
+        textbox = UI_SKINNED_TEXTBOX(widget);
+        if (event->button == 3 && !g_signal_has_handler_pending(widget, textbox_signals[RIGHT_CLICKED], 0, TRUE))
+            return FALSE;
+        else if (event->button == 1) {
+            if (priv->scroll_allowed) {
+                if ((priv->pixbuf_width > textbox->width) && priv->is_scrollable) {
+                    priv->is_dragging = TRUE;
+                    priv->drag_off = priv->offset;
+                    priv->drag_x = event->x;
+                }
+            } else
+                g_signal_emit(widget, textbox_signals[CLICKED], 0);
+
+        } else if (event->button == 3) {
+            g_signal_emit(widget, textbox_signals[RIGHT_CLICKED], 0, event);
+        } else
+            priv->is_dragging = FALSE;
+    } else if (event->type == GDK_2BUTTON_PRESS) {
+        if (event->button == 1) {
+           if (g_signal_has_handler_pending(widget, textbox_signals[DOUBLE_CLICKED], 0, TRUE))
+               g_signal_emit(widget, textbox_signals[DOUBLE_CLICKED], 0);
+           else
+               return FALSE;
+        }
+    }
+
+    return TRUE;
+}
+
+static gboolean ui_skinned_textbox_button_release(GtkWidget *widget, GdkEventButton *event) {
+    UiSkinnedTextboxPrivate *priv = UI_SKINNED_TEXTBOX_GET_PRIVATE(widget);
+
+    if (event->button == 1) {
+        priv->is_dragging = FALSE;
+    }
+
+    return TRUE;
+}
+
+static gboolean ui_skinned_textbox_motion_notify(GtkWidget *widget, GdkEventMotion *event) {
+    g_return_val_if_fail (widget != NULL, FALSE);
+    g_return_val_if_fail (UI_SKINNED_IS_TEXTBOX (widget), FALSE);
+    g_return_val_if_fail (event != NULL, FALSE);
+    UiSkinnedTextbox *textbox = UI_SKINNED_TEXTBOX(widget);
+    UiSkinnedTextboxPrivate *priv = UI_SKINNED_TEXTBOX_GET_PRIVATE(widget);
+
+    if (priv->is_dragging) {
+        if (priv->scroll_allowed &&
+            priv->pixbuf_width > textbox->width) {
+            priv->offset = priv->drag_off - (event->x - priv->drag_x);
+
+            while (priv->offset < 0)
+                priv->offset = 0;
+
+            while (priv->offset > (priv->pixbuf_width - textbox->width))
+                priv->offset = (priv->pixbuf_width - textbox->width);
+
+            gtk_widget_queue_draw(widget);
+        }
+    }
+
+  return TRUE;
+}
+
+static void ui_skinned_textbox_toggle_scaled(UiSkinnedTextbox *textbox) {
+    GtkWidget *widget = GTK_WIDGET (textbox);
+    UiSkinnedTextboxPrivate *priv = UI_SKINNED_TEXTBOX_GET_PRIVATE(textbox);
+
+    priv->scaled = !priv->scaled;
+
+    gtk_widget_set_size_request(widget, textbox->width*(priv->scaled ? config.scale_factor : 1 ), 
+    textbox->height*(priv->scaled ? config.scale_factor : 1 ));
+
+    gtk_widget_queue_draw(GTK_WIDGET(textbox));
+}
+
+static gboolean ui_skinned_textbox_should_scroll(UiSkinnedTextbox *textbox) {
+    UiSkinnedTextboxPrivate *priv = UI_SKINNED_TEXTBOX_GET_PRIVATE(textbox);
+
+    if (!priv->scroll_allowed)
+        return FALSE;
+
+    if (priv->font) {
+        gint width;
+        text_get_extents(priv->fontname, textbox->text, &width, NULL, NULL, NULL);
+
+        if (width <= textbox->width)
+            return FALSE;
+        else
+            return TRUE;
+    }
+
+    if (g_utf8_strlen(textbox->text, -1) * aud_active_skin->properties.textbox_bitmap_font_width > textbox->width)
+        return TRUE;
+
+    return FALSE;
+}
+
+void ui_skinned_textbox_set_xfont(GtkWidget *widget, gboolean use_xfont, const gchar * fontname) {
+    UiSkinnedTextbox *textbox = UI_SKINNED_TEXTBOX (widget);
+    UiSkinnedTextboxPrivate *priv = UI_SKINNED_TEXTBOX_GET_PRIVATE(textbox);
+
+    gint ascent, descent;
+
+    g_return_if_fail(textbox != NULL);
+
+    if (priv->font) {
+        pango_font_description_free(priv->font);
+        priv->font = NULL;
+    }
+
+    textbox->y = priv->nominal_y;
+    textbox->height = priv->nominal_height;
+
+    /* Make sure the pixmap is regenerated */
+    if (priv->pixbuf_text) {
+        g_free(priv->pixbuf_text);
+        priv->pixbuf_text = NULL;
+    }
+
+    if (!use_xfont || strlen(fontname) == 0)
+        return;
+
+    priv->font = pango_font_description_from_string(fontname);
+    priv->fontname = g_strdup(fontname);
+
+    text_get_extents(fontname,
+                     "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz ",
+                     NULL, NULL, &ascent, &descent);
+    priv->font_ascent = ascent;
+    priv->font_descent = descent;
+
+
+    if (priv->font == NULL)
+        return;
+
+    textbox->height = priv->font_ascent;
+    if (textbox->height > priv->nominal_height)
+        textbox->y -= (textbox->height - priv->nominal_height) / 2;
+    else
+        textbox->height = priv->nominal_height;
+}
+
+void ui_skinned_textbox_set_text(GtkWidget *widget, const gchar *text) {
+    g_return_if_fail(text != NULL);
+    UiSkinnedTextbox *textbox = UI_SKINNED_TEXTBOX (widget);
+    UiSkinnedTextboxPrivate *priv = UI_SKINNED_TEXTBOX_GET_PRIVATE(textbox);
+
+    if (!strcmp(textbox->text, text))
+         return;
+    if (textbox->text)
+        g_free(textbox->text);
+
+    textbox->text = aud_str_to_utf8(text);
+    priv->scroll_back = FALSE;
+    gtk_widget_queue_draw(GTK_WIDGET(textbox));
+}
+
+static void textbox_generate_xfont_pixmap(UiSkinnedTextbox *textbox, const gchar *pixmaptext) {
+    /* FIXME: should operate directly on priv->pixbuf, it shouldn't use pixmap */
+    gint length, i;
+    GdkGC *gc, *maskgc;
+    GdkColor *c, pattern;
+    GdkBitmap *mask;
+    PangoLayout *layout;
+    gint width;
+    GdkPixmap *pixmap;
+
+    g_return_if_fail(textbox != NULL);
+    g_return_if_fail(pixmaptext != NULL);
+    g_return_if_fail(textbox->height > 0);
+
+    UiSkinnedTextboxPrivate *priv = UI_SKINNED_TEXTBOX_GET_PRIVATE(textbox);
+
+    length = g_utf8_strlen(pixmaptext, -1);
+
+    text_get_extents(priv->fontname, pixmaptext, &width, NULL, NULL, NULL);
+
+    priv->pixbuf_width = MAX(width, textbox->width);
+    pixmap = gdk_pixmap_new(mainwin->window, priv->pixbuf_width,
+                                   textbox->height,
+                                   gdk_rgb_get_visual()->depth);
+    gc = gdk_gc_new(pixmap);
+    c = skin_get_color(aud_active_skin, SKIN_TEXTBG);
+    for (i = 0; i < textbox->height; i++) {
+        gdk_gc_set_foreground(gc, &c[6 * i / textbox->height]);
+        gdk_draw_line(pixmap, gc, 0, i, priv->pixbuf_width, i);
+    }
+
+    mask = gdk_pixmap_new(mainwin->window, priv->pixbuf_width, textbox->height, 1);
+    maskgc = gdk_gc_new(mask);
+    pattern.pixel = 0;
+    gdk_gc_set_foreground(maskgc, &pattern);
+
+    gdk_draw_rectangle(mask, maskgc, TRUE, 0, 0, priv->pixbuf_width, textbox->height);
+    pattern.pixel = 1;
+    gdk_gc_set_foreground(maskgc, &pattern);
+
+    gdk_gc_set_foreground(gc, skin_get_color(aud_active_skin, SKIN_TEXTFG));
+
+    layout = gtk_widget_create_pango_layout(mainwin, pixmaptext);
+    pango_layout_set_font_description(layout, priv->font);
+
+    gdk_draw_layout(pixmap, gc, 0, (priv->font_descent / 2), layout);
+    g_object_unref(layout);
+
+    g_object_unref(maskgc);
+
+    gdk_gc_set_clip_mask(gc, mask);
+    c = skin_get_color(aud_active_skin, SKIN_TEXTFG);
+    for (i = 0; i < textbox->height; i++) {
+        gdk_gc_set_foreground(gc, &c[6 * i / textbox->height]);
+        gdk_draw_line(pixmap, gc, 0, i, priv->pixbuf_width, i);
+    }
+    priv->pixbuf = gdk_pixbuf_get_from_drawable(NULL, pixmap, gdk_colormap_get_system(), 0, 0, 0, 0, priv->pixbuf_width, textbox->height);
+    g_object_unref(mask);
+    g_object_unref(gc);
+}
+
+static gboolean textbox_scroll(gpointer data) {
+    UiSkinnedTextbox *textbox = UI_SKINNED_TEXTBOX(data);
+    UiSkinnedTextboxPrivate *priv = UI_SKINNED_TEXTBOX_GET_PRIVATE(textbox);
+
+    if (!priv->is_dragging) {
+        if (priv->scroll_dummy < TEXTBOX_SCROLL_WAIT)
+            priv->scroll_dummy++;
+        else {
+            if(config.twoway_scroll) {
+                if (priv->scroll_back)
+                    priv->offset -= 1;
+                else
+                    priv->offset += 1;
+
+                if (priv->offset >= (priv->pixbuf_width - textbox->width)) {
+                    priv->scroll_back = TRUE;
+                    priv->scroll_dummy = 0;
+                    priv->offset = priv->pixbuf_width - textbox->width;
+                }
+                if (priv->offset <= 0) {
+                    priv->scroll_back = FALSE;
+                    priv->scroll_dummy = 0;
+                    priv->offset = 0;
+                }
+            }
+            else { // oneway scroll
+                priv->scroll_back = FALSE;
+                priv->offset += 1;
+            }
+            gtk_widget_queue_draw(GTK_WIDGET(textbox));
+        }
+    }
+    return TRUE;
+}
+
+static void textbox_generate_pixmap(UiSkinnedTextbox *textbox) {
+    gint length, i, x, y, wl;
+    gchar *pixmaptext;
+    gchar *tmp, *stxt;
+
+    g_return_if_fail(textbox != NULL);
+    UiSkinnedTextboxPrivate *priv = UI_SKINNED_TEXTBOX_GET_PRIVATE(textbox);
+
+    if (priv->pixbuf) {
+        g_object_unref(priv->pixbuf);
+        priv->pixbuf = NULL;
+    }
+
+    /*
+     * Don't reset the offset if only text after the last '(' has
+     * changed.  This is a hack to avoid visual noice on vbr files
+     * where we guess the length.
+     */
+    if (!(priv->pixbuf_text && strrchr(textbox->text, '(') &&
+          !strncmp(priv->pixbuf_text, textbox->text,
+                   strrchr(textbox->text, '(') - textbox->text)))
+        priv->offset = 0;
+
+    g_free(priv->pixbuf_text);
+    priv->pixbuf_text = g_strdup(textbox->text);
+
+    /*
+     * wl is the number of (partial) letters visible. Only makes
+     * sense when using skinned font.
+     */
+    wl = textbox->width / 5;
+    if (wl * 5 != textbox->width)
+        wl++;
+
+    length = g_utf8_strlen(textbox->text, -1);
+
+    priv->is_scrollable = FALSE;
+
+    priv->is_scrollable = ui_skinned_textbox_should_scroll(textbox);
+
+    if (priv->is_scrollable) {
+        if(!config.twoway_scroll) {
+            pixmaptext = g_strdup_printf("%s *** ", priv->pixbuf_text);
+            length += 5;
+        } else
+            pixmaptext = g_strdup(priv->pixbuf_text);
+    } else
+    if (!priv->font && length <= wl) {
+        gint pad = wl - length;
+        gchar *padchars = g_strnfill(pad, ' ');
+
+        pixmaptext = g_strconcat(priv->pixbuf_text, padchars, NULL);
+        g_free(padchars);
+        length += pad;
+    } else
+        pixmaptext = g_strdup(priv->pixbuf_text);
+
+    if (priv->is_scrollable) {
+        if (priv->scroll_enabled && !priv->scroll_timeout) {
+            gint tag;
+            tag = TEXTBOX_SCROLL_SMOOTH_TIMEOUT;
+            priv->scroll_timeout = g_timeout_add(tag, textbox_scroll, textbox);
+        }
+    } else {
+        if (priv->scroll_timeout) {
+            g_source_remove(priv->scroll_timeout);
+            priv->scroll_timeout = 0;
+        }
+        priv->offset = 0;
+    }
+
+    if (priv->font) {
+        textbox_generate_xfont_pixmap(textbox, pixmaptext);
+        g_free(pixmaptext);
+        return;
+    }
+
+    priv->pixbuf_width = length * aud_active_skin->properties.textbox_bitmap_font_width;
+    priv->pixbuf = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8,
+                                  priv->pixbuf_width, aud_active_skin->properties.textbox_bitmap_font_height);
+
+    for (tmp = stxt = g_utf8_strup(pixmaptext, -1), i = 0;
+         tmp != NULL && i < length; i++, tmp = g_utf8_next_char(tmp)) {
+        gchar c = *tmp;
+        x = y = -1;
+        if (c >= 'A' && c <= 'Z') {
+            x = aud_active_skin->properties.textbox_bitmap_font_width * (c - 'A');
+            y = 0;
+        }
+        else if (c >= '0' && c <= '9') {
+            x = aud_active_skin->properties.textbox_bitmap_font_width * (c - '0');
+            y = aud_active_skin->properties.textbox_bitmap_font_height;
+        }
+        else
+            textbox_handle_special_char(tmp, &x, &y);
+
+        skin_draw_pixbuf(GTK_WIDGET(textbox), aud_active_skin,
+                         priv->pixbuf, priv->skin_index,
+                         x, y, i * aud_active_skin->properties.textbox_bitmap_font_width, 0,
+                         aud_active_skin->properties.textbox_bitmap_font_width, 
+                         aud_active_skin->properties.textbox_bitmap_font_height);
+    }
+    g_free(stxt);
+    g_free(pixmaptext);
+}
+
+void ui_skinned_textbox_set_scroll(GtkWidget *widget, gboolean scroll) {
+    g_return_if_fail(widget != NULL);
+    g_return_if_fail(UI_SKINNED_IS_TEXTBOX(widget));
+
+    UiSkinnedTextbox *textbox = UI_SKINNED_TEXTBOX(widget);
+    UiSkinnedTextboxPrivate *priv = UI_SKINNED_TEXTBOX_GET_PRIVATE(textbox);
+
+    priv->scroll_enabled = scroll;
+    if (priv->scroll_enabled && priv->is_scrollable && priv->scroll_allowed) {
+        gint tag;
+        tag = TEXTBOX_SCROLL_SMOOTH_TIMEOUT;
+        if (priv->scroll_timeout) {
+            g_source_remove(priv->scroll_timeout);
+            priv->scroll_timeout = 0;
+        }
+        priv->scroll_timeout = g_timeout_add(tag, textbox_scroll, textbox);
+
+    } else {
+
+        if (priv->scroll_timeout) {
+            g_source_remove(priv->scroll_timeout);
+            priv->scroll_timeout = 0;
+        }
+
+        priv->offset = 0;
+        gtk_widget_queue_draw(GTK_WIDGET(textbox));
+    }
+}
+
+static void textbox_handle_special_char(gchar *c, gint * x, gint * y) {
+    gint tx, ty;
+
+    switch (*c) {
+    case '"':
+        tx = 26;
+        ty = 0;
+        break;
+    case '\r':
+        tx = 10;
+        ty = 1;
+        break;
+    case ':':
+    case ';':
+        tx = 12;
+        ty = 1;
+        break;
+    case '(':
+        tx = 13;
+        ty = 1;
+        break;
+    case ')':
+        tx = 14;
+        ty = 1;
+        break;
+    case '-':
+        tx = 15;
+        ty = 1;
+        break;
+    case '`':
+    case '\'':
+        tx = 16;
+        ty = 1;
+        break;
+    case '!':
+        tx = 17;
+        ty = 1;
+        break;
+    case '_':
+        tx = 18;
+        ty = 1;
+        break;
+    case '+':
+        tx = 19;
+        ty = 1;
+        break;
+    case '\\':
+        tx = 20;
+        ty = 1;
+        break;
+    case '/':
+        tx = 21;
+        ty = 1;
+        break;
+    case '[':
+        tx = 22;
+        ty = 1;
+        break;
+    case ']':
+        tx = 23;
+        ty = 1;
+        break;
+    case '^':
+        tx = 24;
+        ty = 1;
+        break;
+    case '&':
+        tx = 25;
+        ty = 1;
+        break;
+    case '%':
+        tx = 26;
+        ty = 1;
+        break;
+    case '.':
+    case ',':
+        tx = 27;
+        ty = 1;
+        break;
+    case '=':
+        tx = 28;
+        ty = 1;
+        break;
+    case '$':
+        tx = 29;
+        ty = 1;
+        break;
+    case '#':
+        tx = 30;
+        ty = 1;
+        break;
+    case '?':
+        tx = 3;
+        ty = 2;
+        break;
+    case '*':
+        tx = 4;
+        ty = 2;
+        break;
+    default:
+        tx = 29;
+        ty = 0;
+        break;
+    }
+
+    const gchar *change[] = {"Ä„", "A", "Ę", "E", "Ć", "C", "Å", "L", "Ó", "O", "Åš", "S", "Å»", "Z", "Ź", "Z",
+                             "Ń", "N", "Ü", "U", NULL};
+    int i;
+    for (i = 0; change[i]; i+=2) {
+         if (!strncmp(c, change[i], strlen(change[i]))) {
+             tx = (*change[i+1] - 'A');
+             break;
+         }
+    }
+
+    /* those are commonly included into skins */
+    if (!strncmp(c, "Ã…", strlen("Ã…"))) {
+        tx = 0;
+        ty = 2;
+    } else if (!strncmp(c, "Ö", strlen("Ö"))) {
+        tx = 1;
+        ty = 2;
+    } else if (!strncmp(c, "Ä", strlen("Ä"))) {
+        tx = 2;
+        ty = 2;
+    }
+
+    *x = tx * aud_active_skin->properties.textbox_bitmap_font_width;
+    *y = ty * aud_active_skin->properties.textbox_bitmap_font_height;
+}
+
+void ui_skinned_textbox_move_relative(GtkWidget *widget, gint x, gint y) {
+    UiSkinnedTextbox *textbox = UI_SKINNED_TEXTBOX(widget);
+    UiSkinnedTextboxPrivate *priv = UI_SKINNED_TEXTBOX_GET_PRIVATE(widget);
+    priv->move_x += x;
+    priv->move_y += y;
+    gtk_fixed_move(GTK_FIXED(gtk_widget_get_parent(widget)), widget,
+                   textbox->x+priv->move_x, textbox->y+priv->move_y);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_skinned_textbox.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,70 @@
+/*
+ * Audacious - a cross-platform multimedia player
+ * Copyright (c) 2007 Tomasz Moń
+ *
+ * Based on:
+ * BMP - Cross-platform multimedia player
+ * Copyright (C) 2003-2004  BMP development team.
+ * XMMS:
+ * Copyright (C) 1998-2003  XMMS development team.
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+#ifndef AUDACIOUS_UI_SKINNED_TEXTBOX_H
+#define AUDACIOUS_UI_SKINNED_TEXTBOX_H
+
+#include <gtk/gtk.h>
+#include "ui_skin.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define UI_SKINNED_TEXTBOX(obj)          GTK_CHECK_CAST (obj, ui_skinned_textbox_get_type (), UiSkinnedTextbox)
+#define UI_SKINNED_TEXTBOX_CLASS(klass)  GTK_CHECK_CLASS_CAST (klass, ui_skinned_textbox_get_type (), UiSkinnedTextboxClass)
+#define UI_SKINNED_IS_TEXTBOX(obj)       GTK_CHECK_TYPE (obj, ui_skinned_textbox_get_type ())
+
+typedef struct _UiSkinnedTextbox        UiSkinnedTextbox;
+typedef struct _UiSkinnedTextboxClass   UiSkinnedTextboxClass;
+
+struct _UiSkinnedTextbox {
+    GtkWidget        widget;
+
+    gint             x, y, width, height;
+    gchar            *text;
+};
+
+struct _UiSkinnedTextboxClass {
+    GtkWidgetClass          parent_class;
+    void (* clicked)        (UiSkinnedTextbox *textbox);
+    void (* double_clicked) (UiSkinnedTextbox *textbox);
+    void (* right_clicked)  (UiSkinnedTextbox *textbox);
+    void (* scaled)         (UiSkinnedTextbox *textbox);
+};
+
+GtkWidget* ui_skinned_textbox_new (GtkWidget *fixed, gint x, gint y, gint w, gboolean allow_scroll, SkinPixmapId si);
+GtkType ui_skinned_textbox_get_type(void);
+void ui_skinned_textbox_set_xfont(GtkWidget *widget, gboolean use_xfont, const gchar * fontname);
+void ui_skinned_textbox_set_text(GtkWidget *widget, const gchar *text);
+void ui_skinned_textbox_set_scroll(GtkWidget *widget, gboolean scroll);
+void ui_skinned_textbox_move_relative(GtkWidget *widget, gint x, gint y);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* AUDACIOUS_UI_SKINNED_TEXTBOX_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_skinned_window.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,286 @@
+/*
+ * Audacious: A cross-platform multimedia player
+ * Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+#include <gtk/gtkmain.h>
+#include <glib-object.h>
+#include <glib/gmacros.h>
+#include <gtk/gtkmarshal.h>
+#include <gtk/gtkwindow.h>
+#include <string.h>
+#include <audacious/plugin.h>
+#include "platform/smartinclude.h"
+#include "ui_skin.h"
+#include "skins_cfg.h"
+#include "ui_dock.h"
+#include "ui_skinned_window.h"
+#include "ui_main.h"
+#include "ui_playlist.h"
+
+static void ui_skinned_window_class_init(SkinnedWindowClass *klass);
+static void ui_skinned_window_init(GtkWidget *widget);
+static GtkWindowClass *parent = NULL;
+
+GType
+ui_skinned_window_get_type(void)
+{
+  static GType window_type = 0;
+
+  if (!window_type)
+    {
+      static const GTypeInfo window_info =
+      {
+        sizeof (SkinnedWindowClass),
+        NULL,           /* base_init */
+        NULL,           /* base_finalize */
+        (GClassInitFunc) ui_skinned_window_class_init,
+        NULL,           /* class_finalize */
+        NULL,           /* class_data */
+        sizeof (SkinnedWindow),
+        0,              /* n_preallocs */
+        (GInstanceInitFunc) ui_skinned_window_init
+      };
+
+      window_type =
+        g_type_register_static (GTK_TYPE_WINDOW, "SkinnedWindow",
+                                &window_info, 0);
+    }
+
+  return window_type;
+}
+
+static void
+ui_skinned_window_map(GtkWidget *widget)
+{
+    (* GTK_WIDGET_CLASS (parent)->map) (widget);
+
+    SkinnedWindow *window = SKINNED_WINDOW(widget);
+    if (window->type == WINDOW_MAIN)
+        gtk_widget_shape_combine_mask(widget, skin_get_mask(aud_active_skin, SKIN_MASK_MAIN + config.player_shaded), 0, 0);
+    else if (window->type == WINDOW_EQ)
+        gtk_widget_shape_combine_mask(widget, skin_get_mask(aud_active_skin, SKIN_MASK_EQ + config.equalizer_shaded), 0, 0);
+
+    gtk_window_set_keep_above(GTK_WINDOW(widget), config.always_on_top);
+}
+
+static gboolean
+ui_skinned_window_motion_notify_event(GtkWidget *widget,
+                                      GdkEventMotion *event)
+{
+    if (dock_is_moving(GTK_WINDOW(widget)))
+        dock_move_motion(GTK_WINDOW(widget), event);
+
+    return FALSE;
+}
+
+static gboolean ui_skinned_window_focus_in(GtkWidget *widget, GdkEventFocus *focus) {
+    gboolean val = GTK_WIDGET_CLASS (parent)->focus_in_event (widget, focus);
+    gtk_widget_queue_draw(widget);
+    return val;
+}
+
+static gboolean ui_skinned_window_focus_out(GtkWidget *widget, GdkEventFocus *focus) {
+    gboolean val = GTK_WIDGET_CLASS (parent)->focus_out_event (widget, focus);
+    gtk_widget_queue_draw(widget);
+    return val;
+}
+
+static gboolean ui_skinned_window_button_press(GtkWidget *widget, GdkEventButton *event) {
+    if (event->button == 1 && event->type == GDK_BUTTON_PRESS &&
+        (config.easy_move || config.equalizer_shaded || (event->y / config.scale_factor) < 14)) {
+         dock_move_press(get_dock_window_list(), GTK_WINDOW(widget),
+                         event, SKINNED_WINDOW(widget)->type == WINDOW_MAIN ? TRUE : FALSE);
+    }
+
+    return TRUE;
+}
+
+static gboolean ui_skinned_window_button_release(GtkWidget *widget, GdkEventButton *event) {
+    if (dock_is_moving(GTK_WINDOW(widget)))
+       dock_move_release(GTK_WINDOW(widget));
+
+    return TRUE;
+}
+
+static gboolean ui_skinned_window_expose(GtkWidget *widget, GdkEventExpose *event) {
+    SkinnedWindow *window = SKINNED_WINDOW(widget);
+
+    GdkPixbuf *obj = NULL;
+
+    gint width = 0, height = 0;
+    switch (window->type) {
+        case WINDOW_MAIN:
+            width = aud_active_skin->properties.mainwin_width;
+            height = aud_active_skin->properties.mainwin_height;
+            break;
+        case WINDOW_EQ:
+            width = 275 * (config.scaled ? config.scale_factor : 1);
+            height = 116 * (config.scaled ? config.scale_factor : 1) ;
+            break;
+        case WINDOW_PLAYLIST:
+            width = playlistwin_get_width();
+            height = config.playlist_height;
+            break;
+        default:
+            return FALSE;
+    }
+    obj = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, width, height);
+
+    gboolean focus = gtk_window_has_toplevel_focus(GTK_WINDOW(widget));
+
+    switch (window->type) {
+        case WINDOW_MAIN:
+            skin_draw_pixbuf(widget, aud_active_skin, obj,SKIN_MAIN, 0, 0, 0, 0, width, height);
+            skin_draw_mainwin_titlebar(aud_active_skin, obj, config.player_shaded, focus || !config.dim_titlebar);
+            break;
+        case WINDOW_EQ:
+            skin_draw_pixbuf(widget, aud_active_skin, obj, SKIN_EQMAIN, 0, 0, 0, 0, width, height);
+            if (focus || !config.dim_titlebar) {
+                if (!config.equalizer_shaded)
+                    skin_draw_pixbuf(widget, aud_active_skin, obj, SKIN_EQMAIN, 0, 134, 0, 0, width, 14);
+                else
+                    skin_draw_pixbuf(widget, aud_active_skin, obj, SKIN_EQ_EX, 0, 0, 0, 0, width, 14);
+            } else {
+                if (!config.equalizer_shaded)
+                    skin_draw_pixbuf(widget, aud_active_skin, obj, SKIN_EQMAIN, 0, 149, 0, 0, width, 14);
+                else
+                    skin_draw_pixbuf(widget, aud_active_skin, obj, SKIN_EQ_EX, 0, 15, 0, 0, width, 14);
+            }
+            break;
+        case WINDOW_PLAYLIST:
+            focus |= !config.dim_titlebar;
+            if (config.playlist_shaded) {
+                skin_draw_playlistwin_shaded(aud_active_skin, obj, width, focus);
+            } else {
+                skin_draw_playlistwin_frame(aud_active_skin, obj, width, config.playlist_height, focus);
+            }
+            break;
+    }
+
+    ui_skinned_widget_draw(GTK_WIDGET(window), obj, width, height,
+                           window->type != WINDOW_PLAYLIST && config.scaled);
+
+    g_object_unref(obj);
+
+    return FALSE;
+}
+
+static void
+ui_skinned_window_class_init(SkinnedWindowClass *klass)
+{
+    GtkWidgetClass *widget_class;
+
+    widget_class = (GtkWidgetClass*) klass;
+
+    parent = gtk_type_class(gtk_window_get_type());
+
+    widget_class->motion_notify_event = ui_skinned_window_motion_notify_event;
+    widget_class->expose_event = ui_skinned_window_expose;
+    widget_class->focus_in_event = ui_skinned_window_focus_in;
+    widget_class->focus_out_event = ui_skinned_window_focus_out;
+    widget_class->button_press_event = ui_skinned_window_button_press;
+    widget_class->button_release_event = ui_skinned_window_button_release;
+    widget_class->map = ui_skinned_window_map;
+}
+
+void
+ui_skinned_window_hide(SkinnedWindow *window)
+{
+    g_return_if_fail(SKINNED_CHECK_WINDOW(window));
+
+    gtk_window_get_position(GTK_WINDOW(window), &window->x, &window->y);
+    gtk_widget_hide(GTK_WIDGET(window));
+}
+
+void
+ui_skinned_window_show(SkinnedWindow *window)
+{
+    g_return_if_fail(SKINNED_CHECK_WINDOW(window));
+
+    gtk_window_move(GTK_WINDOW(window), window->x, window->y);
+    gtk_widget_show_all(GTK_WIDGET(window));
+}
+
+static void
+ui_skinned_window_init(GtkWidget *widget)
+{
+    SkinnedWindow *window;
+    window = SKINNED_WINDOW(widget);
+    window->x = -1;
+    window->y = -1;
+}
+
+GtkWidget *
+ui_skinned_window_new(const gchar *wmclass_name)
+{
+    GtkWidget *widget = g_object_new(ui_skinned_window_get_type(), NULL);
+    GtkWindow *window = GTK_WINDOW(widget);
+
+    window->type = SKINNED_WINDOW_TYPE;
+
+    if (wmclass_name)
+        gtk_window_set_wmclass(GTK_WINDOW(widget), wmclass_name, "Audacious");
+
+    gtk_widget_add_events(GTK_WIDGET(widget),
+                          GDK_FOCUS_CHANGE_MASK | GDK_BUTTON_MOTION_MASK |
+                          GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
+                          GDK_SCROLL_MASK | GDK_KEY_PRESS_MASK |
+                          GDK_VISIBILITY_NOTIFY_MASK | GDK_EXPOSURE_MASK);
+    gtk_widget_realize(GTK_WIDGET(widget));
+
+    set_dock_window_list(dock_window_set_decorated(get_dock_window_list(),
+                                                   GTK_WINDOW(widget),
+                                                   config.show_wm_decorations));
+    gtk_widget_set_app_paintable(GTK_WIDGET(widget), TRUE);
+    gdk_window_set_back_pixmap(widget->window, NULL, FALSE);
+    gtk_widget_shape_combine_mask(widget, NULL, 0, 0);
+
+    if (!strcmp(wmclass_name, "player"))
+        SKINNED_WINDOW(widget)->type = WINDOW_MAIN;
+    if (!strcmp(wmclass_name, "equalizer"))
+        SKINNED_WINDOW(widget)->type = WINDOW_EQ;
+    if (!strcmp(wmclass_name, "playlist"))
+        SKINNED_WINDOW(widget)->type = WINDOW_PLAYLIST;
+
+    /* GtkFixed hasn't got its GdkWindow, this means that it can be used to
+       display widgets while the logo below will be displayed anyway;
+       however fixed positions are not that great, cause the button sizes may (will)
+       vary depending on the gtk style used, so it's not possible to center
+       them unless a fixed width and heigth is forced (and this may bring to cutted
+       text if someone, i.e., uses a big font for gtk widgets);
+       other types of container most likely have their GdkWindow, this simply
+       means that the logo must be drawn on the container widget, instead of the
+       window; otherwise, it won't be displayed correctly */
+    SKINNED_WINDOW(widget)->fixed = gtk_fixed_new();
+    gtk_container_add(GTK_CONTAINER(widget), GTK_WIDGET(SKINNED_WINDOW(widget)->fixed));
+    return widget;
+}
+
+void ui_skinned_window_draw_all(GtkWidget *widget) {
+    if (SKINNED_WINDOW(widget)->type == WINDOW_MAIN)
+        mainwin_refresh_hints();
+
+    gtk_widget_queue_draw(widget);
+    GList *iter;
+    for (iter = GTK_FIXED (SKINNED_WINDOW(widget)->fixed)->children; iter; iter = g_list_next (iter)) {
+         GtkFixedChild *child_data = (GtkFixedChild *) iter->data;
+         GtkWidget *child = child_data->widget;
+         gtk_widget_queue_draw(child);
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_skinned_window.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,64 @@
+/*
+ * Audacious: A cross-platform multimedia player
+ * Copyright (c) 2007 William Pitcock <nenolod -at- sacredspiral.co.uk>
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+#ifndef UI_SKINNED_WINDOW_H
+#define UI_SKINNED_WINDOW_H
+
+#define SKINNED_WINDOW(obj)          GTK_CHECK_CAST (obj, ui_skinned_window_get_type (), SkinnedWindow)
+#define SKINNED_WINDOW_CLASS(klass)  GTK_CHECK_CLASS_CAST (klass, ui_skinned_window_get_type (), SkinnedWindowClass)
+#define SKINNED_CHECK_WINDOW(obj)    GTK_CHECK_TYPE (obj, ui_skinned_window_get_type ())
+#define SKINNED_TYPE_WINDOW          (ui_skinned_window_get_type())
+
+#ifdef GDK_WINDOWING_QUARTZ
+# define SKINNED_WINDOW_TYPE		GTK_WINDOW_POPUP
+#else
+# define SKINNED_WINDOW_TYPE		GTK_WINDOW_TOPLEVEL
+#endif
+
+enum {
+    WINDOW_MAIN,
+    WINDOW_EQ,
+    WINDOW_PLAYLIST
+};
+
+typedef struct _SkinnedWindow SkinnedWindow;
+typedef struct _SkinnedWindowClass SkinnedWindowClass;
+
+struct _SkinnedWindow
+{
+  GtkWindow window;
+
+  GtkWidget *canvas;
+  gint x,y;
+
+  gint type;
+  GtkWidget *fixed;
+};
+
+struct _SkinnedWindowClass
+{
+  GtkWindowClass        parent_class;
+};
+
+extern GType ui_skinned_window_get_type(void);
+extern GtkWidget *ui_skinned_window_new(const gchar *wmclass_name);
+extern void ui_skinned_window_draw_all(GtkWidget *widget);
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_skinselector.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,404 @@
+/*  BMP - Cross-platform multimedia player
+ *  Copyright (C) 2003-2004  BMP development team.
+ *
+ *  Based on XMMS:
+ *  Copyright (C) 1998-2003  XMMS development team.
+ *
+ *  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; under version 3 of the License.
+ *
+ *  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, see <http://www.gnu.org/licenses>.
+ *
+ *  The Audacious team does not consider modular code linking to
+ *  Audacious or using our public API to be a derived work.
+ */
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "ui_skinselector.h"
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+
+#include "platform/smartinclude.h"
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "plugin.h"
+#include "ui_skin.h"
+#include "util.h"
+
+#define EXTENSION_TARGETS 7
+
+static gchar *ext_targets[EXTENSION_TARGETS] = { "bmp", "xpm", "png", "svg",
+        "gif", "jpg", "jpeg" };
+
+#define THUMBNAIL_WIDTH  90
+#define THUMBNAIL_HEIGHT 40
+
+
+enum SkinViewCols {
+    SKIN_VIEW_COL_PREVIEW,
+    SKIN_VIEW_COL_FORMATTEDNAME,
+    SKIN_VIEW_COL_NAME,
+    SKIN_VIEW_N_COLS
+};
+
+
+GList *skinlist = NULL;
+
+
+
+static gchar *
+get_thumbnail_filename(const gchar * path)
+{
+    gchar *basename, *pngname, *thumbname;
+
+    g_return_val_if_fail(path != NULL, NULL);
+
+    basename = g_path_get_basename(path);
+    pngname = g_strconcat(basename, ".png", NULL);
+
+    thumbname = g_build_filename(skins_paths[SKINS_PATH_SKIN_THUMB_DIR],
+                                 pngname, NULL);
+
+    g_free(basename);
+    g_free(pngname);
+
+    return thumbname;
+}
+
+
+static GdkPixbuf *
+skin_get_preview(const gchar * path)
+{
+    GdkPixbuf *preview = NULL;
+    gchar *dec_path, *preview_path;
+    gboolean is_archive = FALSE;
+    gint i = 0;
+    gchar buf[60];			/* gives us lots of room */
+
+    if (file_is_archive(path))
+    {
+        if (!(dec_path = archive_decompress(path)))
+            return NULL;
+
+        is_archive = TRUE;
+    }
+    else
+    {
+        dec_path = g_strdup(path);
+    }
+
+    for (i = 0; i < EXTENSION_TARGETS; i++)
+    {
+        sprintf(buf, "main.%s", ext_targets[i]);
+
+        if ((preview_path = find_path_recursively(dec_path, buf)) != NULL)
+            break;
+    }
+
+    if (preview_path)
+    {
+        preview = gdk_pixbuf_new_from_file(preview_path, NULL);
+        g_free(preview_path);
+    }
+
+    if (is_archive)
+        del_directory(dec_path);
+
+    g_free(dec_path);
+
+    return preview;
+}
+
+
+static GdkPixbuf *
+skin_get_thumbnail(const gchar * path)
+{
+    GdkPixbuf *scaled = NULL;
+    GdkPixbuf *preview;
+    gchar *thumbname;
+
+    g_return_val_if_fail(path != NULL, NULL);
+
+    if (g_str_has_suffix(path, "thumbs"))
+        return NULL;
+
+    thumbname = get_thumbnail_filename(path);
+
+    if (g_file_test(thumbname, G_FILE_TEST_EXISTS)) {
+        scaled = gdk_pixbuf_new_from_file(thumbname, NULL);
+        g_free(thumbname);
+        return scaled;
+    }
+
+    if (!(preview = skin_get_preview(path))) {
+        g_free(thumbname);
+        return NULL;
+    }
+
+    scaled = gdk_pixbuf_scale_simple(preview,
+                                     THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT,
+                                     GDK_INTERP_BILINEAR);
+    g_object_unref(preview);
+
+    gdk_pixbuf_save(scaled, thumbname, "png", NULL, NULL);
+    g_free(thumbname);
+
+    return scaled;
+}
+
+static void
+skinlist_add(const gchar * filename)
+{
+    SkinNode *node;
+    gchar *basename;
+
+    g_return_if_fail(filename != NULL);
+
+    node = g_slice_new0(SkinNode);
+    node->path = g_strdup(filename);
+
+    basename = g_path_get_basename(filename);
+
+    if (file_is_archive(filename)) {
+        node->name = archive_basename(basename);
+	node->desc = _("Archived Winamp 2.x skin");
+        g_free(basename);
+    }
+    else {
+        node->name = basename;
+	node->desc = _("Unarchived Winamp 2.x skin");
+    }
+
+    skinlist = g_list_prepend(skinlist, node);
+}
+
+static gboolean
+scan_skindir_func(const gchar * path, const gchar * basename, gpointer data)
+{
+    if (g_file_test(path, G_FILE_TEST_IS_REGULAR)) {
+        if (file_is_archive(path)) {
+            skinlist_add(path);
+        }
+    }
+    else if (g_file_test(path, G_FILE_TEST_IS_DIR)) {
+        skinlist_add(path);
+    }
+
+    return FALSE;
+}
+
+static void
+scan_skindir(const gchar * path)
+{
+    GError *error = NULL;
+
+    g_return_if_fail(path != NULL);
+
+    if (path[0] == '.')
+        return;
+
+    if (!dir_foreach(path, scan_skindir_func, NULL, &error)) {
+        g_warning("Failed to open directory (%s): %s", path, error->message);
+        g_error_free(error);
+        return;
+    }
+}
+
+static gint
+skinlist_compare_func(gconstpointer a, gconstpointer b)
+{
+    g_return_val_if_fail(a != NULL && SKIN_NODE(a)->name != NULL, 1);
+    g_return_val_if_fail(b != NULL && SKIN_NODE(b)->name != NULL, 1);
+    return strcasecmp(SKIN_NODE(a)->name, SKIN_NODE(b)->name);
+}
+
+static void
+skin_free_func(gpointer data)
+{
+    g_return_if_fail(data != NULL);
+    g_free(SKIN_NODE(data)->name);
+    g_free(SKIN_NODE(data)->path);
+    g_slice_free(SkinNode, data);
+}
+
+
+static void
+skinlist_clear(void)
+{
+    if (!skinlist)
+        return;
+
+    g_list_foreach(skinlist, (GFunc) skin_free_func, NULL);
+    g_list_free(skinlist);
+    skinlist = NULL;
+}
+
+void
+skinlist_update(void)
+{
+    gchar *skinsdir;
+
+    skinlist_clear();
+
+    scan_skindir(skins_paths[SKINS_PATH_USER_SKIN_DIR]);
+    scan_skindir(DATA_DIR G_DIR_SEPARATOR_S "Skins");
+
+    skinsdir = getenv("SKINSDIR");
+    if (skinsdir) {
+        gchar **dir_list = g_strsplit(skinsdir, ":", 0);
+        gchar **dir;
+
+        for (dir = dir_list; *dir; dir++)
+            scan_skindir(*dir);
+        g_strfreev(dir_list);
+    }
+
+    skinlist = g_list_sort(skinlist, skinlist_compare_func);
+
+    g_assert(skinlist != NULL);
+}
+
+void
+skin_view_update(GtkTreeView * treeview, GtkWidget * refresh_button)
+{
+    GtkTreeSelection *selection = NULL;
+    GtkListStore *store;
+    GtkTreeIter iter, iter_current_skin;
+    gboolean have_current_skin = FALSE;
+    GtkTreePath *path;
+
+    GdkPixbuf *thumbnail;
+    gchar *formattedname;
+    gchar *name;
+    GList *entry;
+
+    gtk_widget_set_sensitive(GTK_WIDGET(treeview), FALSE);
+    gtk_widget_set_sensitive(GTK_WIDGET(refresh_button), FALSE);
+
+    store = GTK_LIST_STORE(gtk_tree_view_get_model(treeview));
+
+    gtk_list_store_clear(store);
+
+    skinlist_update();
+
+    for (entry = skinlist; entry; entry = g_list_next(entry)) {
+        thumbnail = skin_get_thumbnail(SKIN_NODE(entry->data)->path);
+
+        formattedname = g_strdup_printf("<big><b>%s</b></big>\n<i>%s</i>",
+		SKIN_NODE(entry->data)->name, SKIN_NODE(entry->data)->desc);
+        name = SKIN_NODE(entry->data)->name;
+
+        gtk_list_store_append(store, &iter);
+        gtk_list_store_set(store, &iter,
+                           SKIN_VIEW_COL_PREVIEW, thumbnail,
+                           SKIN_VIEW_COL_FORMATTEDNAME, formattedname,
+                           SKIN_VIEW_COL_NAME, name, -1);
+        if (thumbnail)
+            g_object_unref(thumbnail);
+        g_free(formattedname);
+
+        if (g_strstr_len(aud_active_skin->path,
+                         strlen(aud_active_skin->path), name) ) {
+            iter_current_skin = iter;
+            have_current_skin = TRUE;
+        }
+    }
+
+    if (have_current_skin) {
+        selection = gtk_tree_view_get_selection(treeview);
+        gtk_tree_selection_select_iter(selection, &iter_current_skin);
+
+        path = gtk_tree_model_get_path(GTK_TREE_MODEL(store),
+		                               &iter_current_skin);
+        gtk_tree_view_scroll_to_cell(treeview, path, NULL, TRUE, 0.5, 0.5);
+        gtk_tree_path_free(path);
+    }
+
+    gtk_widget_set_sensitive(GTK_WIDGET(treeview), TRUE);
+    gtk_widget_set_sensitive(GTK_WIDGET(refresh_button), TRUE);
+}
+
+
+static void
+skin_view_on_cursor_changed(GtkTreeView * treeview,
+                            gpointer data)
+{
+    GtkTreeModel *model;
+    GtkTreeSelection *selection;
+    GtkTreeIter iter;
+
+    GList *node;
+    gchar *name;
+    gchar *comp = NULL;
+
+    selection = gtk_tree_view_get_selection(treeview);
+    if (!gtk_tree_selection_get_selected(selection, &model, &iter))
+        return;
+
+    gtk_tree_model_get(model, &iter, SKIN_VIEW_COL_NAME, &name, -1);
+
+    for (node = skinlist; node; node = g_list_next(node)) {
+        comp = SKIN_NODE(node->data)->path;
+        if (g_strrstr(comp, name))
+            break;
+    }
+
+    g_free(name);
+
+    aud_active_skin_load(comp);
+}
+
+
+void
+skin_view_realize(GtkTreeView * treeview)
+{
+    GtkListStore *store;
+    GtkTreeViewColumn *column;
+    GtkCellRenderer *renderer;
+    GtkTreeSelection *selection;
+
+    gtk_widget_show_all(GTK_WIDGET(treeview));
+    
+    gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(treeview), TRUE);
+    gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE);
+
+    store = gtk_list_store_new(SKIN_VIEW_N_COLS, GDK_TYPE_PIXBUF,
+                               G_TYPE_STRING , G_TYPE_STRING);
+    gtk_tree_view_set_model(treeview, GTK_TREE_MODEL(store));
+
+    column = gtk_tree_view_column_new();
+    gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
+    gtk_tree_view_column_set_spacing(column, 16);
+    gtk_tree_view_append_column(GTK_TREE_VIEW(treeview),
+                                GTK_TREE_VIEW_COLUMN(column));
+
+    renderer = gtk_cell_renderer_pixbuf_new();
+    gtk_tree_view_column_pack_start(column, renderer, FALSE);
+    gtk_tree_view_column_set_attributes(column, renderer, "pixbuf",
+                                        SKIN_VIEW_COL_PREVIEW, NULL);
+
+    renderer = gtk_cell_renderer_text_new();
+    gtk_tree_view_column_pack_start(column, renderer, TRUE);
+    gtk_tree_view_column_set_attributes(column, renderer, "markup",
+                                        SKIN_VIEW_COL_FORMATTEDNAME, NULL);
+
+    selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
+    gtk_tree_selection_set_mode(selection, GTK_SELECTION_BROWSE);
+
+    g_signal_connect(treeview, "cursor-changed",
+                     G_CALLBACK(skin_view_on_cursor_changed), NULL);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_skinselector.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,45 @@
+/*  BMP - Cross-platform multimedia player
+ *  Copyright (C) 2003-2004  BMP development team.
+ *
+ *  Based on XMMS:
+ *  Copyright (C) 1998-2003  XMMS development team.
+ *
+ *  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; under version 3 of the License.
+ *
+ *  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, see <http://www.gnu.org/licenses>.
+ *
+ *  The Audacious team does not consider modular code linking to
+ *  Audacious or using our public API to be a derived work.
+ */
+
+#ifndef AUDACIOUS_UI_SKINSELECTOR_H
+#define AUDACIOUS_UI_SKINSELECTOR_H
+
+#include <glib.h>
+#include <gtk/gtk.h>
+
+#define SKIN_NODE(x)  ((SkinNode *)(x))
+struct _SkinNode {
+    gchar *name;
+    gchar *desc;
+    gchar *path;
+    GTime *time;
+};
+
+typedef struct _SkinNode SkinNode;
+
+extern GList *skinlist;
+
+void skinlist_update();
+void skin_view_realize(GtkTreeView * treeview);
+void skin_view_update(GtkTreeView * treeview, GtkWidget * refresh_button);
+
+#endif /* AUDACIOUS_UI_SKINSELECTOR_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_svis.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,549 @@
+/*
+ * Audacious - a cross-platform multimedia player
+ * Copyright (c) 2007  Audacious development team.
+ *
+ * Based on:
+ * BMP - Cross-platform multimedia player
+ * Copyright (C) 2003-2004  BMP development team.
+ * XMMS:
+ * Copyright (C) 1998-2003  XMMS development team.
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+#include "ui_skin.h"
+#include "ui_svis.h"
+#include "ui_vis.h"
+#include "util.h"
+#include "skins_cfg.h"
+#include <audacious/plugin.h>
+#include <string.h>
+#include <ctype.h>
+#include <gtk/gtkmain.h>
+#include <gtk/gtkmarshal.h>
+#include <gtk/gtkimage.h>
+
+#define UI_TYPE_SVIS           (ui_svis_get_type())
+
+static gint svis_redraw_delays[] = { 1, 2, 4, 8 };
+
+/* FIXME: Are the svis_scope_colors correct? */
+static guint8 svis_scope_colors[] = { 20, 19, 18, 19, 20 };
+static guint8 svis_vu_normal_colors[] = { 17, 17, 17, 12, 12, 12, 2, 2 };
+
+#define DRAW_DS_PIXEL(ptr,value) \
+	*(ptr) = (value); \
+	*((ptr) + 1) = (value); \
+	*((ptr) + 76) = (value); \
+	*((ptr) + 77) = (value);
+
+#define SVIS_HEIGHT 5
+#define SVIS_WIDTH 38
+
+enum {
+    DOUBLED,
+    LAST_SIGNAL
+};
+
+static void ui_svis_class_init         (UiSVisClass *klass);
+static void ui_svis_init               (UiSVis *svis);
+static void ui_svis_destroy            (GtkObject *object);
+static void ui_svis_realize            (GtkWidget *widget);
+static void ui_svis_unrealize          (GtkWidget *widget);
+static void ui_svis_map                (GtkWidget *widget);
+static void ui_svis_unmap              (GtkWidget *widget);
+static void ui_svis_size_request       (GtkWidget *widget, GtkRequisition *requisition);
+static void ui_svis_size_allocate      (GtkWidget *widget, GtkAllocation *allocation);
+static gboolean ui_svis_expose         (GtkWidget *widget, GdkEventExpose *event);
+static void ui_svis_toggle_scaled      (UiSVis *svis);
+
+static GtkWidgetClass *parent_class = NULL;
+static guint vis_signals[LAST_SIGNAL] = { 0 };
+
+GType ui_svis_get_type() {
+    static GType vis_type = 0;
+    if (!vis_type) {
+        static const GTypeInfo vis_info = {
+            sizeof (UiSVisClass),
+            NULL,
+            NULL,
+            (GClassInitFunc) ui_svis_class_init,
+            NULL,
+            NULL,
+            sizeof (UiSVis),
+            0,
+            (GInstanceInitFunc) ui_svis_init,
+        };
+        vis_type = g_type_register_static (GTK_TYPE_WIDGET, "UiSVis", &vis_info, 0);
+    }
+
+    return vis_type;
+}
+
+static void ui_svis_class_init(UiSVisClass *klass) {
+    GtkObjectClass *object_class;
+    GtkWidgetClass *widget_class;
+
+    object_class = (GtkObjectClass*) klass;
+    widget_class = (GtkWidgetClass*) klass;
+    parent_class = gtk_type_class (gtk_widget_get_type ());
+
+    object_class->destroy = ui_svis_destroy;
+
+    widget_class->realize = ui_svis_realize;
+    widget_class->unrealize = ui_svis_unrealize;
+    widget_class->map = ui_svis_map;
+    widget_class->unmap = ui_svis_unmap;
+    widget_class->expose_event = ui_svis_expose;
+    widget_class->size_request = ui_svis_size_request;
+    widget_class->size_allocate = ui_svis_size_allocate;
+
+    klass->scaled = ui_svis_toggle_scaled;
+
+    vis_signals[DOUBLED] = 
+        g_signal_new ("toggle-scaled", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
+                      G_STRUCT_OFFSET (UiSVisClass, scaled), NULL, NULL,
+                      gtk_marshal_VOID__VOID, G_TYPE_NONE, 0);
+}
+
+static void ui_svis_init(UiSVis *svis) {
+
+}
+
+GtkWidget* ui_svis_new(GtkWidget *fixed, gint x, gint y) {
+    UiSVis *svis = g_object_new (ui_svis_get_type (), NULL);
+
+    svis->x = x;
+    svis->y = y;
+
+    svis->width = SVIS_WIDTH;
+    svis->height = SVIS_HEIGHT;
+
+    svis->fixed = fixed;
+    svis->scaled = FALSE;
+
+    svis->visible_window = TRUE;
+    svis->event_window = NULL;
+
+    gtk_fixed_put(GTK_FIXED(svis->fixed), GTK_WIDGET(svis), svis->x, svis->y);
+
+    return GTK_WIDGET(svis);
+}
+
+static void ui_svis_destroy(GtkObject *object) {
+    UiSVis *svis;
+
+    g_return_if_fail (object != NULL);
+    g_return_if_fail (UI_IS_SVIS (object));
+
+    svis = UI_SVIS (object);
+
+    if (GTK_OBJECT_CLASS (parent_class)->destroy)
+        (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
+}
+
+static void ui_svis_realize(GtkWidget *widget) {
+    UiSVis *svis;
+    GdkWindowAttr attributes;
+    gint attributes_mask;
+
+    g_return_if_fail (widget != NULL);
+    g_return_if_fail (UI_IS_SVIS(widget));
+
+    GTK_WIDGET_SET_FLAGS(widget, GTK_REALIZED);
+    svis = UI_SVIS(widget);
+
+    attributes.x = widget->allocation.x;
+    attributes.y = widget->allocation.y;
+    attributes.width = widget->allocation.width;
+    attributes.height = widget->allocation.height;
+    attributes.window_type = GDK_WINDOW_CHILD;
+    attributes.event_mask = gtk_widget_get_events(widget);
+    attributes.event_mask |= GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK;
+
+    if (svis->visible_window)
+    {
+      attributes.visual = gtk_widget_get_visual(widget);
+      attributes.colormap = gtk_widget_get_colormap(widget);
+      attributes.wclass = GDK_INPUT_OUTPUT;
+      attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
+      widget->window = gdk_window_new(widget->parent->window, &attributes, attributes_mask);
+      GTK_WIDGET_UNSET_FLAGS(widget, GTK_NO_WINDOW);
+      gdk_window_set_user_data(widget->window, widget);
+    }
+    else
+    {
+      widget->window = gtk_widget_get_parent_window (widget);
+      g_object_ref (widget->window);
+
+      attributes.wclass = GDK_INPUT_ONLY;
+      attributes_mask = GDK_WA_X | GDK_WA_Y;
+      svis->event_window = gdk_window_new (widget->window, &attributes, attributes_mask);
+      GTK_WIDGET_SET_FLAGS (widget, GTK_NO_WINDOW);
+      gdk_window_set_user_data(svis->event_window, widget);
+    }
+
+    widget->style = gtk_style_attach(widget->style, widget->window);
+}
+
+static void ui_svis_unrealize(GtkWidget *widget) {
+    UiSVis *svis;
+    svis = UI_SVIS(widget);
+
+    if ( svis->event_window != NULL )
+    {
+      gdk_window_set_user_data( svis->event_window , NULL );
+      gdk_window_destroy( svis->event_window );
+      svis->event_window = NULL;
+    }
+
+    if (GTK_WIDGET_CLASS (parent_class)->unrealize)
+        (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);
+}
+
+static void ui_svis_map(GtkWidget *widget)
+{
+    UiSVis *svis;
+    svis = UI_SVIS(widget);
+
+    if (svis->event_window != NULL)
+      gdk_window_show (svis->event_window);
+
+    if (GTK_WIDGET_CLASS (parent_class)->map)
+      (* GTK_WIDGET_CLASS (parent_class)->map) (widget);
+}
+
+static void ui_svis_unmap (GtkWidget *widget)
+{
+    UiSVis *svis;
+    svis = UI_SVIS(widget);
+
+    if (svis->event_window != NULL)
+      gdk_window_hide (svis->event_window);
+
+    if (GTK_WIDGET_CLASS (parent_class)->unmap)
+      (* GTK_WIDGET_CLASS (parent_class)->unmap) (widget);
+}
+
+static void ui_svis_size_request(GtkWidget *widget, GtkRequisition *requisition) {
+    UiSVis *svis = UI_SVIS(widget);
+
+    requisition->width = svis->width * (svis->scaled ? config.scale_factor : 1);
+    requisition->height = svis->height*(svis->scaled ? config.scale_factor : 1);
+}
+
+static void ui_svis_size_allocate(GtkWidget *widget, GtkAllocation *allocation) {
+    UiSVis *svis = UI_SVIS (widget);
+
+    widget->allocation = *allocation;
+    widget->allocation.x *= (svis->scaled ? config.scale_factor : 1 );
+    widget->allocation.y *= (svis->scaled ? config.scale_factor : 1);
+    if (GTK_WIDGET_REALIZED (widget))
+    {
+        if (svis->event_window != NULL)
+            gdk_window_move_resize(svis->event_window, widget->allocation.x, widget->allocation.y, allocation->width, allocation->height);
+        else
+            gdk_window_move_resize(widget->window, widget->allocation.x, widget->allocation.y, allocation->width, allocation->height);
+    }
+
+    svis->x = widget->allocation.x/(svis->scaled ? config.scale_factor : 1);
+    svis->y = widget->allocation.y/(svis->scaled ? config.scale_factor : 1);
+}
+
+static gboolean ui_svis_expose(GtkWidget *widget, GdkEventExpose *event) {
+    g_return_val_if_fail (widget != NULL, FALSE);
+    g_return_val_if_fail (UI_IS_SVIS (widget), FALSE);
+    g_return_val_if_fail (event != NULL, FALSE);
+
+    UiSVis *svis = UI_SVIS (widget);
+
+    gint x, y, h;
+    guchar svis_color[24][3];
+    guchar rgb_data[SVIS_WIDTH * 2 * SVIS_HEIGHT * 2], *ptr, c;
+    guint32 colors[24];
+    GdkRgbCmap *cmap;
+
+    if (!GTK_WIDGET_VISIBLE(widget))
+        return FALSE;
+
+    if (!svis->visible_window)
+        return FALSE;
+
+    skin_get_viscolor(aud_active_skin, svis_color);
+    for (y = 0; y < 24; y++) {
+        colors[y] =
+            svis_color[y][0] << 16 | svis_color[y][1] << 8 | svis_color[y][2];
+    }
+    cmap = gdk_rgb_cmap_new(colors, 24);
+
+    if (!config.scaled) {
+      memset(rgb_data, 0, SVIS_WIDTH * SVIS_HEIGHT);
+      if (config.vis_type == VIS_ANALYZER  && !audacious_drct_get_paused() && audacious_drct_get_playing()){
+	for(y=0; y < SVIS_HEIGHT; y++){
+	  if (config.analyzer_type == ANALYZER_BARS){
+	    for(x=0;x< SVIS_WIDTH; x++){
+	      if(svis->data[x] > y << 1)
+		{
+		  rgb_data[x*3+ (SVIS_HEIGHT - y) * SVIS_WIDTH] = 23;
+		  rgb_data[x*3+1 + (SVIS_HEIGHT - y) * SVIS_WIDTH] = 23;
+		  
+		}
+	    }
+	  }
+	  else{
+	    for(x=0;x< SVIS_WIDTH; x++){
+	      if(svis->data[x] > y << 1)
+		{
+		  rgb_data[x + (SVIS_HEIGHT - y) * SVIS_WIDTH] = 23;
+		}
+	    }
+	  }
+	}
+      }
+	else if (config.vis_type == VIS_VOICEPRINT){
+	  switch (config.vu_mode) {
+	  case VU_NORMAL:
+	    for (y = 0; y < 2; y++) {
+	      ptr = rgb_data + ((y * 3) * 38);
+	      h = (svis->data[y] * 7) / 37;
+	      for (x = 0; x < h; x++, ptr += 5) {
+		c = svis_vu_normal_colors[x];
+		*(ptr) = c;
+		*(ptr + 1) = c;
+		*(ptr + 2) = c;
+		*(ptr + 38) = c;
+		*(ptr + 39) = c;
+		*(ptr + 40) = c;
+	      }
+	    }
+	    break;
+	  case VU_SMOOTH:
+	    for (y = 0; y < 2; y++) {
+	      ptr = rgb_data + ((y * 3) * SVIS_WIDTH);
+	      for (x = 0; x < svis->data[y]; x++, ptr++) {
+		c = 17 - ((x * 15) / 37);
+		*(ptr) = c;
+		*(ptr + 38) = c;
+	      }
+	    }
+	    break;
+	  }	  
+	}
+        else if (config.vis_type == VIS_SCOPE) {
+            for (x = 0; x < 38; x++) {
+                h = svis->data[x << 1] / 3;
+                ptr = rgb_data + ((4 - h) * 38) + x;
+                *ptr = svis_scope_colors[h];
+            }
+        }
+
+    }
+    else {            /*svis scaling, this needs some work, since a lot of stuff is hardcoded --majeru*/
+
+      memset(rgb_data, 0, SVIS_WIDTH * config.scale_factor * SVIS_HEIGHT * config.scale_factor);
+      if (config.vis_type == VIS_ANALYZER && !audacious_drct_get_paused() && audacious_drct_get_playing()){
+	  for(y=0; y < SVIS_HEIGHT; y++){
+            if (config.analyzer_type == ANALYZER_BARS){
+              for(x=0;x< SVIS_WIDTH; x++){
+                if(svis->data[x] > y << 1)
+                {
+                  ptr = rgb_data + x * 6 + (SVIS_HEIGHT * 2 - y * 2) * SVIS_WIDTH *2;
+                  DRAW_DS_PIXEL(ptr, 23);
+                  DRAW_DS_PIXEL(ptr + 2, 23);
+                }
+              }
+            }
+            else{
+              for(x=0;x< SVIS_WIDTH; x++){
+                if(svis->data[x] > y << 1)
+                {
+                  ptr = rgb_data + x * 2 + (SVIS_HEIGHT * 2 - y * 2) * SVIS_WIDTH * 2;
+                  DRAW_DS_PIXEL(ptr, 23);
+                }
+              }
+            }
+	  }
+        }
+	else if (config.vis_type == VIS_VOICEPRINT){
+	  switch (config.vu_mode) {
+	  case VU_NORMAL:
+	    for (y = 0; y < 2; y++) {
+	      ptr = rgb_data + ((y * 3) * 152);
+	      h = (svis->data[y] * 8) / 37;
+	      for (x = 0; x < h; x++, ptr += 10) {
+		c = svis_vu_normal_colors[x];
+		DRAW_DS_PIXEL(ptr, c);
+		DRAW_DS_PIXEL(ptr + 2, c);
+		DRAW_DS_PIXEL(ptr + 4, c);
+		DRAW_DS_PIXEL(ptr + 152, c);
+		DRAW_DS_PIXEL(ptr + 154, c);
+		DRAW_DS_PIXEL(ptr + 156, c);
+	      }
+	    }
+	    break;
+	  case VU_SMOOTH:
+	    for (y = 0; y < 2; y++) {
+	      ptr = rgb_data + ((y * 3) * 152);
+	      for (x = 0; x < svis->data[y]; x++, ptr += 2) {
+		c = 17 - ((x * 15) / 37);
+		DRAW_DS_PIXEL(ptr, c);
+		DRAW_DS_PIXEL(ptr + 152, c);
+	      }
+	    }
+	    break;
+	  }  
+	}
+        else if (config.vis_type == VIS_SCOPE) {
+            for (x = 0; x < 38; x++) {
+                h = svis->data[x << 1] / 3;
+                ptr = rgb_data + ((4 - h) * 152) + (x << 1);
+                *ptr = svis_scope_colors[h];
+                *(ptr + 1) = svis_scope_colors[h];
+                *(ptr + 76) = svis_scope_colors[h];
+                *(ptr + 77) = svis_scope_colors[h];
+            }
+        }
+
+
+    }
+
+    GdkPixmap *obj = NULL;
+    GdkGC *gc;
+    obj = gdk_pixmap_new(NULL, svis->width* ( svis->scaled ? config.scale_factor : 1), 
+        svis->height*(svis->scaled ? config.scale_factor : 1), gdk_rgb_get_visual()->depth);
+    gc = gdk_gc_new(obj);
+
+    if (!svis->scaled) {
+        gdk_draw_indexed_image(obj, gc, 0, 0, svis->width, svis->height,
+                               GDK_RGB_DITHER_NORMAL, (guchar *) rgb_data,
+                               38, cmap);
+    } else {
+        gdk_draw_indexed_image(obj, gc,
+                               0 << 1, 0 << 1,
+                               svis->width << 1, svis->height << 1,
+                               GDK_RGB_DITHER_NONE, (guchar *) rgb_data,
+                               76, cmap);
+    }
+
+    gdk_rgb_cmap_free(cmap);
+    gdk_draw_drawable (widget->window, gc, obj, 0, 0, 0, 0,
+                       svis->width*(svis->scaled ? config.scale_factor : 1), 
+                       svis->height*(svis->scaled ? config.scale_factor : 1));
+    g_object_unref(obj);
+    g_object_unref(gc);
+
+    return FALSE;
+}
+
+static void ui_svis_toggle_scaled(UiSVis *svis) {
+    GtkWidget *widget = GTK_WIDGET (svis);
+    svis->scaled = !svis->scaled;
+
+    gtk_widget_set_size_request(widget, svis->width* config.scale_factor, svis->height * config.scale_factor);
+
+    gtk_widget_queue_draw(widget);
+}
+
+void ui_svis_set_visible(GtkWidget *widget, gboolean window_is_visible)
+{
+    UiSVis *svis;
+    gboolean widget_is_visible;
+
+    g_return_if_fail(UI_IS_SVIS(widget));
+
+    svis = UI_SVIS (widget);
+    widget_is_visible = GTK_WIDGET_VISIBLE(widget);
+
+    svis->visible_window = window_is_visible;
+
+    if (GTK_WIDGET_REALIZED (widget))
+    {
+        if ( widget_is_visible )
+            gtk_widget_hide(widget);
+
+        gtk_widget_unrealize(widget);
+        gtk_widget_realize(widget);
+
+        if ( widget_is_visible )
+            gtk_widget_show(widget);
+    }
+
+    if (widget_is_visible)
+        gtk_widget_queue_resize(widget);
+}
+
+void ui_svis_clear_data(GtkWidget *widget) {
+    g_return_if_fail(UI_IS_SVIS(widget));
+
+    gint i;
+    UiSVis *svis = UI_SVIS (widget);
+
+    for (i = 0; i < 75; i++) {
+        svis->data[i] = (config.vis_type == VIS_SCOPE) ? 6 : 0;
+    }
+}
+
+void ui_svis_timeout_func(GtkWidget *widget, guchar * data) {
+    g_return_if_fail(UI_IS_SVIS(widget));
+
+    UiSVis *svis = UI_SVIS (widget);
+    static GTimer *timer = NULL;
+    gulong micros = 9999999;
+    gboolean falloff = FALSE;
+    gint i;
+
+    if (!timer) {
+        timer = g_timer_new();
+        g_timer_start(timer);
+    }
+    else {
+        g_timer_elapsed(timer, &micros);
+        if (micros > 14000)
+            g_timer_reset(timer);
+
+    }
+
+    if (config.vis_type == VIS_VOICEPRINT) {
+        if (micros > 14000)
+            falloff = TRUE;
+
+        for (i = 0; i < 2; i++) {
+            if (falloff || data) {
+                if (data && data[i] > svis->data[i])
+                    svis->data[i] = data[i];
+                else if (falloff) {
+                    if (svis->data[i] >= 2)
+                        svis->data[i] -= 2;
+                    else
+                        svis->data[i] = 0;
+                }
+            }
+
+        }
+    }
+    else if (data) {
+        for (i = 0; i < 75; i++)
+            svis->data[i] = data[i];
+    }
+
+    if (micros > 14000) {
+        if (!svis->refresh_delay) {
+            gtk_widget_queue_draw(widget);
+            svis->refresh_delay = svis_redraw_delays[config.vis_refresh];
+        }
+        svis->refresh_delay--;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_svis.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,64 @@
+/*
+ * Audacious - a cross-platform multimedia player
+ * Copyright (c) 2007  Audacious development team.
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+#ifndef UISVIS_H
+#define UISVIS_H
+
+#include <gtk/gtk.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define UI_SVIS(obj)          GTK_CHECK_CAST (obj, ui_svis_get_type (), UiSVis)
+#define UI_SVIS_CLASS(klass)  GTK_CHECK_CLASS_CAST (klass, ui_svis_get_type (), UiSVisClass)
+#define UI_IS_SVIS(obj)       GTK_CHECK_TYPE (obj, ui_svis_get_type ())
+
+typedef struct _UiSVis        UiSVis;
+typedef struct _UiSVisClass   UiSVisClass;
+
+struct _UiSVis {
+    GtkWidget        widget;
+
+    gint             x, y, width, height;
+    gint             data[75];
+    gint             refresh_delay;
+    gboolean         scaled;
+    GtkWidget        *fixed;
+    gboolean         visible_window;
+    GdkWindow        *event_window;
+};
+
+struct _UiSVisClass {
+    GtkWidgetClass          parent_class;
+    void (* scaled)        (UiSVis *vis);
+};
+
+GtkWidget* ui_svis_new (GtkWidget *fixed, gint x, gint y);
+GtkType ui_svis_get_type(void);
+void ui_svis_clear_data(GtkWidget *widget);
+void ui_svis_timeout_func(GtkWidget *widget, guchar * data);
+void ui_svis_set_visible(GtkWidget *widget, gboolean window_is_visible);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_vis.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,724 @@
+/*
+ * Audacious - a cross-platform multimedia player
+ * Copyright (c) 2007  Audacious development team.
+ *
+ * Based on:
+ * BMP - Cross-platform multimedia player
+ * Copyright (C) 2003-2004  BMP development team.
+ * XMMS:
+ * Copyright (C) 1998-2003  XMMS development team.
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+#include "ui_skin.h"
+#include "ui_vis.h"
+#include "util.h"
+#include "skins_cfg.h"
+#include <audacious/plugin.h>
+
+static const gfloat vis_afalloff_speeds[] = { 0.34, 0.5, 1.0, 1.3, 1.6 };
+static const gfloat vis_pfalloff_speeds[] = { 1.2, 1.3, 1.4, 1.5, 1.6 };
+static const gint vis_redraw_delays[] = { 1, 2, 4, 8 };
+static const guint8 vis_scope_colors[] =
+    { 21, 21, 20, 20, 19, 19, 18, 19, 19, 20, 20, 21, 21 };
+static guchar voiceprint_data[76*16];
+
+enum {
+    DOUBLED,
+    LAST_SIGNAL
+};
+
+static void ui_vis_class_init         (UiVisClass *klass);
+static void ui_vis_init               (UiVis *vis);
+static void ui_vis_destroy            (GtkObject *object);
+static void ui_vis_realize            (GtkWidget *widget);
+static void ui_vis_unrealize          (GtkWidget *widget);
+static void ui_vis_map                (GtkWidget *widget);
+static void ui_vis_unmap              (GtkWidget *widget);
+static void ui_vis_size_request       (GtkWidget *widget, GtkRequisition *requisition);
+static void ui_vis_size_allocate      (GtkWidget *widget, GtkAllocation *allocation);
+static gboolean ui_vis_expose         (GtkWidget *widget, GdkEventExpose *event);
+static void ui_vis_toggle_scaled      (UiVis *vis);
+
+static GtkWidgetClass *parent_class = NULL;
+static guint vis_signals[LAST_SIGNAL] = { 0 };
+
+GType ui_vis_get_type() {
+    static GType vis_type = 0;
+    if (!vis_type) {
+        static const GTypeInfo vis_info = {
+            sizeof (UiVisClass),
+            NULL,
+            NULL,
+            (GClassInitFunc) ui_vis_class_init,
+            NULL,
+            NULL,
+            sizeof (UiVis),
+            0,
+            (GInstanceInitFunc) ui_vis_init,
+        };
+        vis_type = g_type_register_static (GTK_TYPE_WIDGET, "UiVis", &vis_info, 0);
+    }
+
+    return vis_type;
+}
+
+static void ui_vis_class_init(UiVisClass *klass) {
+    GtkObjectClass *object_class;
+    GtkWidgetClass *widget_class;
+
+    object_class = (GtkObjectClass*) klass;
+    widget_class = (GtkWidgetClass*) klass;
+    parent_class = gtk_type_class (gtk_widget_get_type ());
+
+    object_class->destroy = ui_vis_destroy;
+
+    widget_class->realize = ui_vis_realize;
+    widget_class->unrealize = ui_vis_unrealize;
+    widget_class->map = ui_vis_map;
+    widget_class->unmap = ui_vis_unmap;
+    widget_class->expose_event = ui_vis_expose;
+    widget_class->size_request = ui_vis_size_request;
+    widget_class->size_allocate = ui_vis_size_allocate;
+
+    klass->doubled = ui_vis_toggle_scaled;
+
+    vis_signals[DOUBLED] = 
+        g_signal_new ("toggle-scaled", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
+                      G_STRUCT_OFFSET (UiVisClass, doubled), NULL, NULL,
+                      gtk_marshal_VOID__VOID, G_TYPE_NONE, 0);
+}
+
+static void ui_vis_init(UiVis *vis) {
+    memset(voiceprint_data, 0, 16*76);
+}
+
+GtkWidget* ui_vis_new(GtkWidget *fixed, gint x, gint y, gint width) {
+    UiVis *vis = g_object_new (ui_vis_get_type (), NULL);
+
+    vis->x = x;
+    vis->y = y;
+
+    vis->width = width;
+    vis->height = 16;
+
+    vis->fixed = fixed;
+    vis->scaled = FALSE;
+
+    vis->visible_window = TRUE;
+    vis->event_window = NULL;
+
+    gtk_fixed_put(GTK_FIXED(vis->fixed), GTK_WIDGET(vis), vis->x, vis->y);
+
+    return GTK_WIDGET(vis);
+}
+
+static void ui_vis_destroy(GtkObject *object) {
+    UiVis *vis;
+
+    g_return_if_fail (object != NULL);
+    g_return_if_fail (UI_IS_VIS (object));
+
+    vis = UI_VIS (object);
+
+    if (GTK_OBJECT_CLASS (parent_class)->destroy)
+        (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
+}
+
+static void ui_vis_realize(GtkWidget *widget) {
+    UiVis *vis;
+    GdkWindowAttr attributes;
+    gint attributes_mask;
+
+    g_return_if_fail (widget != NULL);
+    g_return_if_fail (UI_IS_VIS(widget));
+
+    GTK_WIDGET_SET_FLAGS(widget, GTK_REALIZED);
+    vis = UI_VIS(widget);
+
+    attributes.x = widget->allocation.x;
+    attributes.y = widget->allocation.y;
+    attributes.width = widget->allocation.width;
+    attributes.height = widget->allocation.height;
+    attributes.window_type = GDK_WINDOW_CHILD;
+    attributes.event_mask = gtk_widget_get_events(widget);
+    attributes.event_mask |= GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK;
+
+    if (vis->visible_window)
+    {
+      attributes.visual = gtk_widget_get_visual(widget);
+      attributes.colormap = gtk_widget_get_colormap(widget);
+      attributes.wclass = GDK_INPUT_OUTPUT;
+      attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
+      widget->window = gdk_window_new(widget->parent->window, &attributes, attributes_mask);
+      GTK_WIDGET_UNSET_FLAGS(widget, GTK_NO_WINDOW);
+      gdk_window_set_user_data(widget->window, widget);
+    }
+    else
+    {
+      widget->window = gtk_widget_get_parent_window (widget);
+      g_object_ref (widget->window);
+
+      attributes.wclass = GDK_INPUT_ONLY;
+      attributes_mask = GDK_WA_X | GDK_WA_Y;
+      vis->event_window = gdk_window_new (widget->window, &attributes, attributes_mask);
+      GTK_WIDGET_SET_FLAGS (widget, GTK_NO_WINDOW);
+      gdk_window_set_user_data(vis->event_window, widget);
+    }
+
+    widget->style = gtk_style_attach(widget->style, widget->window);
+}
+
+static void ui_vis_unrealize(GtkWidget *widget) {
+    UiVis *vis;
+    vis = UI_VIS(widget);
+
+    if ( vis->event_window != NULL )
+    {
+      gdk_window_set_user_data( vis->event_window , NULL );
+      gdk_window_destroy( vis->event_window );
+      vis->event_window = NULL;
+    }
+
+    if (GTK_WIDGET_CLASS (parent_class)->unrealize)
+        (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);
+}
+
+static void ui_vis_map(GtkWidget *widget)
+{
+    UiVis *vis;
+    vis = UI_VIS(widget);
+
+    if (vis->event_window != NULL)
+      gdk_window_show (vis->event_window);
+
+    if (GTK_WIDGET_CLASS (parent_class)->map)
+      (* GTK_WIDGET_CLASS (parent_class)->map) (widget);
+}
+
+static void ui_vis_unmap (GtkWidget *widget)
+{
+    UiVis *vis;
+    vis = UI_VIS(widget);
+
+    if (vis->event_window != NULL)
+      gdk_window_hide (vis->event_window);
+
+    if (GTK_WIDGET_CLASS (parent_class)->unmap)
+      (* GTK_WIDGET_CLASS (parent_class)->unmap) (widget);
+}
+
+static void ui_vis_size_request(GtkWidget *widget, GtkRequisition *requisition) {
+    UiVis *vis = UI_VIS(widget);
+
+    requisition->width = vis->width*(vis->scaled ? config.scale_factor : 1);
+    requisition->height = vis->height*(vis->scaled ? config.scale_factor : 1);
+}
+
+static void ui_vis_size_allocate(GtkWidget *widget, GtkAllocation *allocation) {
+    UiVis *vis = UI_VIS (widget);
+
+    widget->allocation = *allocation;
+    widget->allocation.x *= (vis->scaled ? config.scale_factor : 1);
+    widget->allocation.y *= (vis->scaled ? config.scale_factor : 1);
+    if (GTK_WIDGET_REALIZED (widget))
+    {
+        if (vis->event_window != NULL)
+            gdk_window_move_resize(vis->event_window, widget->allocation.x, widget->allocation.y, allocation->width, allocation->height);
+        else
+            gdk_window_move_resize(widget->window, widget->allocation.x, widget->allocation.y, allocation->width, allocation->height);
+    }
+
+    vis->x = widget->allocation.x/(vis->scaled ? config.scale_factor : 1);
+    vis->y = widget->allocation.y/(vis->scaled ? config.scale_factor : 1);
+}
+
+static gboolean ui_vis_expose(GtkWidget *widget, GdkEventExpose *event) {
+    g_return_val_if_fail (widget != NULL, FALSE);
+    g_return_val_if_fail (UI_IS_VIS (widget), FALSE);
+    g_return_val_if_fail (event != NULL, FALSE);
+
+    UiVis *vis = UI_VIS (widget);
+
+    gint x, y, n, h = 0, h2;
+    gfloat delta;
+    guchar skin_col[2][3];
+    guchar vis_color[24][3];
+    guchar vis_voice_color[256][3], voice_c[3];
+    guchar rgb_data[76 * 16 * 3 * 2 * 2], *ptr, c;
+    guint32 colors[24];
+    GdkColor *fgc, *bgc;
+    GdkRgbCmap *cmap;
+
+    if (!GTK_WIDGET_VISIBLE(widget))
+        return FALSE;
+
+    if (!vis->visible_window)
+        return FALSE;
+
+    skin_get_viscolor(aud_active_skin, vis_color);
+    for (y = 0; y < 24; y++) {
+        colors[y] =
+            vis_color[y][0] << 16 | vis_color[y][1] << 8 | vis_color[y][2];
+    }
+    cmap = gdk_rgb_cmap_new(colors, 24);
+
+    if (!vis->scaled) {
+      if(config.vis_type == VIS_VOICEPRINT /*&& config.voiceprint_mode != VOICEPRINT_NORMAL*/){
+	memset(rgb_data, 0, 76 * 16 * 3);
+      }
+      else{
+	memset(rgb_data, 0, 76 * 16);
+	for (y = 1; y < 16; y += 2) {
+	  ptr = rgb_data + (y * 76);
+	  for (x = 0; x < 76; x += 2, ptr += 2)
+	    *ptr = 1;
+      }
+      }
+    }
+    else{
+      if(config.vis_type == VIS_VOICEPRINT /*&& config.voiceprint_mode != VOICEPRINT_NORMAL*/){
+	memset(rgb_data, 0, 3 * 4 * 16 * 76);
+      }
+      else{
+	memset(rgb_data, 0, (guint)(76 * config.scale_factor) * 32);
+	for (y = 1; y < 16; y += 2) {
+	  ptr = rgb_data + (y * (guint)(76 * 4 * config.scale_factor));
+	  for (x = 0; x < 76; x += 2, ptr += 4) {
+	    *ptr = 1;
+	    *(ptr + 1) = 1;
+	    *(ptr + (guint)(76 * config.scale_factor)) = 1;
+	    *(ptr + (guint)(76 * config.scale_factor)+1) = 1;
+	}
+      }
+      }
+    }
+    if (config.vis_type == VIS_ANALYZER) {
+      for (x = 0; x < 75; x++) {
+	if (config.analyzer_type == ANALYZER_BARS && (x % 4) == 0)
+	  h = vis->data[x >> 2];
+	else if (config.analyzer_type == ANALYZER_LINES)
+	  h = vis->data[x];
+	if (h && (config.analyzer_type == ANALYZER_LINES ||
+		  (x % 4) != 3)) {
+	  if (!vis->scaled) {
+	    ptr = rgb_data + ((16 - h) * 76) + x;
+	    switch (config.analyzer_mode) {
+	    case ANALYZER_NORMAL:
+	      for (y = 0; y < h; y++, ptr += 76)
+		*ptr = 18 - h + y;
+	      break;
+	    case ANALYZER_FIRE:
+	      for (y = 0; y < h; y++, ptr += 76)
+		*ptr = y + 2;
+	      break;
+	    case ANALYZER_VLINES:
+	      for (y = 0; y < h; y++, ptr += 76)
+		*ptr = 18 - h;
+	      break;
+	    }
+	  }
+	  else{
+	    ptr = rgb_data + ((16 - h) * (guint)(76 * 4 * config.scale_factor)) + (guint)(x * config.scale_factor);
+	    switch (config.analyzer_mode) {
+	    case ANALYZER_NORMAL:
+	      for (y = 0; y < h; y++, ptr += (guint)(76 * 4 * config.scale_factor)) {
+		*ptr = 18 - h + y;
+		*(ptr + 1) = 18 - h + y;
+		*(ptr + (guint)(76 * config.scale_factor)) = 18 - h + y;
+		*(ptr + (guint)(76 * config.scale_factor)+1) = 18 - h + y;
+	      }
+	      break;
+	    case ANALYZER_FIRE:
+	      for (y = 0; y < h; y++, ptr += (guint)(76 * 4 * config.scale_factor)) {
+		*ptr = y + 2;
+		*(ptr + 1) = y + 2;
+		*(ptr + (guint)(76 * config.scale_factor)) = y + 2;
+		*(ptr + (guint)(76 * config.scale_factor)+1) = y + 2;
+	      }
+	      break;
+	    case ANALYZER_VLINES:
+	      for (y = 0; y < h; y++, ptr += (guint)(76 * 4 * config.scale_factor)) {
+		*ptr = 18 - h;
+		*(ptr + 1) = 18 - h;
+		*(ptr + (guint)(76 * config.scale_factor)) = 18 - h;
+		*(ptr + (guint)(76 * config.scale_factor)+1) = 18 - h;
+	      }
+	      
+	      break;
+	    }
+	  }
+	}
+      }
+      if (config.analyzer_peaks) {
+	for (x = 0; x < 75; x++) {
+	  if (config.analyzer_type == ANALYZER_BARS && (x % 4) == 0)
+	    h = vis->peak[x >> 2];
+	  else if (config.analyzer_type == ANALYZER_LINES)
+	    h = vis->peak[x];
+	  if (h && (config.analyzer_type == ANALYZER_LINES || (x % 4) != 3)){
+	    
+	    if (!vis->scaled) {
+	      rgb_data[(16 - h) * 76 + x] = 23;
+	    }
+	    else{
+	      ptr = rgb_data + (16 - h) * (guint)(76 * 4 * config.scale_factor) + (guint)(x * config.scale_factor);
+	      *ptr = 23;
+	      *(ptr + 1) = 23;
+	      *(ptr + (guint)(76 * config.scale_factor)) = 23;
+	      *(ptr + (guint)(76 * config.scale_factor)+1) = 23;
+	    }
+	  }
+	}
+      }
+    }
+    else if (config.vis_type == VIS_VOICEPRINT) {
+      if(!audacious_drct_get_paused() && audacious_drct_get_playing()){/*Don't scroll when it's paused or stopped*/
+	for (y = 0; y < 16; y ++)
+	  for (x = 75; x > 0; x--)
+	    voiceprint_data[x + y * 76] = voiceprint_data[x-1+y*76];
+	  for(y=0;y<16;y++)
+	    voiceprint_data[y * 76] = vis->data[y];
+      }
+      if(audacious_drct_get_playing()){ /*Only draw the data if we're playing*/
+	if(config.voiceprint_mode == VOICEPRINT_NORMAL){ 
+	  /* Create color gradient from the skin's background- and foreground color*/
+	  fgc = skin_get_color(aud_active_skin, SKIN_TEXTFG);
+	  bgc = skin_get_color(aud_active_skin, SKIN_TEXTBG);
+	  skin_col[0][0] = fgc->red   >> 8;
+	  skin_col[0][1] = fgc->green >> 8;
+	  skin_col[0][2] = fgc->blue  >> 8;
+	  skin_col[1][0] = bgc->red   >> 8;
+	  skin_col[1][1] = bgc->green >> 8;
+	  skin_col[1][2] = bgc->blue  >> 8;
+	  for(n=0;n<3;n++){
+	    for(x=0;x<256;x++){
+	      if(skin_col[0][n] > skin_col[1][n]){
+		delta = (gfloat)(skin_col[0][n] - skin_col[1][n]) / 256.0;
+		vis_voice_color[x][n] = skin_col[1][n] + (gfloat)(delta * x);
+	      }
+	      else if(skin_col[0][n] == skin_col[1][n]){
+		vis_voice_color[x][n] = skin_col[0][n];
+	      }
+	      else{
+		delta = (gfloat)(skin_col[1][n] - skin_col[0][n]) / 256.0;
+		vis_voice_color[x][n] = skin_col[1][n] - (gfloat)(delta * x);
+	      }
+	    }
+	  }
+	}
+	for (y = 0; y < 16; y ++){
+	  for (x = 0; x < 76; x++){
+	    guint8 d = voiceprint_data[x + y*76];
+	    
+	    if(config.voiceprint_mode == VOICEPRINT_NORMAL){
+	      voice_c[0] = vis_voice_color[d][0];
+	      voice_c[1] = vis_voice_color[d][1];
+	      voice_c[2] = vis_voice_color[d][2];
+	    }
+	    else if(config.voiceprint_mode == VOICEPRINT_FIRE){
+	      voice_c[0] = d < 64 ? (d * 2) : 255;
+	      voice_c[1] = d < 64 ? 0 : (d < 128 ? (d-64) * 2 : 255);
+	      voice_c[2] = d < 128 ? 0 : (d-128) * 2;
+	      /* Test for black->blue->green->red. Isn't pretty, though...
+		 voice_c[0] = d > 192 ? (d - 192) << 2 : 0;
+		 voice_c[1] = d > 64 ? (d < 128 ? (d - 64) << 2 : (d < 192 ? (192 - d) << 2 : 0)) : 0;
+		 voice_c[2] = d < 64 ? d << 2 : (d < 128 ? (128 - d) << 2 : 0);
+	      */
+	    }
+	    else if(config.voiceprint_mode == VOICEPRINT_ICE){	    
+	      voice_c[0] = d;
+	      voice_c[1] = d < 128 ? d * 2 : 255;
+	      voice_c[2] = d < 64 ? d * 4 : 255; 
+	    }
+	    if(!vis->scaled){
+	      for(n=0;n<3;n++)
+		rgb_data[x * 3 + y * 76*3+n] = voice_c[n];
+	    }
+	    else{
+	      ptr = rgb_data + (guint)(x * 3 * config.scale_factor) + (guint) (y * 76 * 3 * config.scale_factor);
+	      for(n=0;n<3;n++)
+		{
+		  *(ptr + n) = voice_c[n];
+		  *(ptr + n + 3) = voice_c[n];
+		  *(ptr + (guint)(n + 76 * config.scale_factor * 3)) = voice_c[n];
+		  *(ptr + (guint)(n + 3 + 76 * config.scale_factor * 3)) = voice_c[n];
+		}
+	    }
+	  }
+	}
+      }
+    }
+    if (config.vis_type == VIS_SCOPE) {
+      for (x = 0; x < 75; x++) {
+	switch (config.scope_mode) {
+	case SCOPE_DOT:
+	  h = vis->data[x];
+	  if (!vis->scaled) {
+	  ptr = rgb_data + ((14 - h) * 76) + x;
+	    *ptr = vis_scope_colors[h + 1];
+	  }else{
+	    ptr = rgb_data + ((14 - h) * (guint)(76 * 4 * config.scale_factor)) + (guint)(x * config.scale_factor);
+	    *ptr = vis_scope_colors[h + 1];
+	    *(ptr + 1) = vis_scope_colors[h + 1];
+	    *(ptr + (guint)(76 * config.scale_factor)) = vis_scope_colors[h + 1];
+	    *(ptr + (guint)(76 * config.scale_factor)+1) = vis_scope_colors[h + 1];
+	  }
+	  break;
+	case SCOPE_LINE:
+	  if (x != 74) {
+	    h = 14 - vis->data[x];
+	    h2 = 14 - vis->data[x + 1];
+	    if (h > h2) {
+	      y = h;
+	      h = h2;
+	      h2 = y;
+	    }
+	    if (!vis->scaled) {
+	    ptr = rgb_data + (h * 76) + x;
+	    for (y = h; y <= h2; y++, ptr += 76)
+	      *ptr = vis_scope_colors[y - 2];
+	    }
+	    else{
+	      ptr = rgb_data + (h * (guint)(76 * 4 * config.scale_factor)) + (guint)(x * config.scale_factor);
+	      for (y = h; y <= h2; y++, ptr += (guint)(76 * 4 * config.scale_factor)) {
+		*ptr = vis_scope_colors[y - 2];
+		*(ptr + 1) = vis_scope_colors[y - 2];
+		*(ptr + (guint)(76 * config.scale_factor)) = vis_scope_colors[y - 2];
+		*(ptr + (guint)(76 * config.scale_factor)+1) = vis_scope_colors[y - 2];
+	      }
+	    }
+	  }
+	  else {
+	    h = 14 - vis->data[x];
+	    if (!vis->scaled) {
+	      ptr = rgb_data + (h * 76) + x;
+	      *ptr = vis_scope_colors[h + 1];
+	    }else{
+	      ptr = rgb_data + (h * (guint)(76 * 4 * config.scale_factor)) + (guint)(x * config.scale_factor);
+	      *ptr = vis_scope_colors[h + 1];
+	      *(ptr + 1) = vis_scope_colors[h + 1];
+	      *(ptr + (guint)(76 * config.scale_factor)) = vis_scope_colors[h + 1];
+	      *(ptr + (guint)(76 * config.scale_factor)+1) = vis_scope_colors[h + 1];
+	    }
+	  }
+	  break;
+	case SCOPE_SOLID:
+	  h = 14 - vis->data[x];
+	  h2 = 8;
+	  c = vis_scope_colors[(gint) vis->data[x]];
+	  if (h > h2) {
+	    y = h;
+	    h = h2;
+	    h2 = y;
+	  }
+	  if (!vis->scaled) {
+	    ptr = rgb_data + (h * 76) + x;
+	    for (y = h; y <= h2; y++, ptr += 76)
+	      *ptr = c;
+	  }else{
+	    ptr = rgb_data + (h * (guint)(76 * 4 * config.scale_factor)) + (guint)(x * config.scale_factor);
+	    for (y = h; y <= h2; y++, ptr += (guint)(76 * 4 * config.scale_factor)) {
+	      *ptr = c;
+	      *(ptr + 1) = c;
+	      *(ptr + (guint)(76 * config.scale_factor)) = c;
+	      *(ptr + (guint)(76 * config.scale_factor)+1) = c;
+	    }
+	  }
+	  break;
+	}
+      }
+    }
+
+    GdkPixmap *obj = NULL;
+    GdkGC *gc;
+    obj = gdk_pixmap_new(NULL, vis->width*(vis->scaled ? config.scale_factor : 1), vis->height*(vis->scaled ? config.scale_factor : 1), gdk_rgb_get_visual()->depth);
+    gc = gdk_gc_new(obj);
+
+    if (!vis->scaled) {
+        if (config.vis_type == VIS_VOICEPRINT) {
+            gdk_draw_rgb_image(obj, gc, 0, 0, vis->width, vis->height,
+                               GDK_RGB_DITHER_NORMAL, (guchar *) rgb_data,
+                               76 * 3);
+        } else {
+            gdk_draw_indexed_image(obj, gc, 0, 0, vis->width, vis->height,
+                                   GDK_RGB_DITHER_NORMAL, (guchar *) rgb_data,
+                                   76 , cmap);
+        }
+    } else {
+        if (config.vis_type == VIS_VOICEPRINT) {
+            gdk_draw_rgb_image(obj, gc, 0 << 1, 0 << 1,
+                               vis->width << 1, vis->height << 1,
+                               GDK_RGB_DITHER_NONE, (guchar *) rgb_data,
+                               76 * 2 * 3);
+        } else {
+            gdk_draw_indexed_image(obj, gc, 0 << 1, 0 << 1,
+                                   vis->width << 1, vis->height << 1,
+                                   GDK_RGB_DITHER_NONE, (guchar *) rgb_data,
+                                   76 * 2 , cmap);
+        }
+    }
+
+    gdk_draw_drawable (widget->window, gc, obj, 0, 0, 0, 0,
+                       vis->width*(vis->scaled ? config.scale_factor : 1), vis->height*(vis->scaled ? config.scale_factor : 1));
+    g_object_unref(obj);
+    g_object_unref(gc);
+    gdk_rgb_cmap_free(cmap);
+    return FALSE;
+}
+
+static void ui_vis_toggle_scaled(UiVis *vis) {
+    GtkWidget *widget = GTK_WIDGET (vis);
+    vis->scaled = !vis->scaled;
+
+    gtk_widget_set_size_request(widget, vis->width*(vis->scaled ? config.scale_factor : 1), vis->height*(vis->scaled ? config.scale_factor : 1));
+
+    gtk_widget_queue_draw(GTK_WIDGET(vis));
+}
+
+void ui_vis_draw_pixel(GtkWidget *widget, guchar* texture, gint x, gint y, guint8 colour) {
+    UiVis *vis = UI_VIS (widget);
+    if (vis->scaled){
+        texture[y * 76 + x] = colour;
+        texture[y * 76 + x + 1] = colour;
+        texture[y * 76 * 4 + x] = colour;
+        texture[y * 76 * 4 + x + 1] = colour;
+    } else {
+        texture[y * 76 + x] = colour;
+    }
+}
+
+void ui_vis_set_visible(GtkWidget *widget, gboolean window_is_visible)
+{
+    UiVis *vis;
+    gboolean widget_is_visible;
+
+    g_return_if_fail(UI_IS_VIS(widget));
+
+    vis = UI_VIS (widget);
+    widget_is_visible = GTK_WIDGET_VISIBLE(widget);
+
+    vis->visible_window = window_is_visible;
+
+    if (GTK_WIDGET_REALIZED (widget))
+    {
+        if ( widget_is_visible )
+            gtk_widget_hide(widget);
+
+        gtk_widget_unrealize(widget);
+        gtk_widget_realize(widget);
+
+        if ( widget_is_visible )
+            gtk_widget_show(widget);
+    }
+
+    if (widget_is_visible)
+        gtk_widget_queue_resize(widget);
+}
+
+void ui_vis_clear_data(GtkWidget *widget) {
+    g_return_if_fail(UI_IS_VIS(widget));
+
+    gint i;
+    UiVis *vis = UI_VIS (widget);
+
+    memset(voiceprint_data, 0, 16*76);
+    for (i = 0; i < 75; i++) {
+        vis->data[i] = (config.vis_type == VIS_SCOPE) ? 6 : 0;
+        vis->peak[i] = 0;
+    }
+}
+
+void ui_vis_timeout_func(GtkWidget *widget, guchar * data) {
+    g_return_if_fail(UI_IS_VIS(widget));
+
+    UiVis *vis = UI_VIS (widget);
+    static GTimer *timer = NULL;
+    gulong micros = 9999999;
+    gboolean falloff = FALSE;
+    gint i;
+
+    if (!timer) {
+        timer = g_timer_new();
+        g_timer_start(timer);
+    }
+    else {
+      g_timer_elapsed(timer, &micros);
+      if (micros > 14000)
+	g_timer_reset(timer);
+    }
+    if (config.vis_type == VIS_ANALYZER) {
+        if (micros > 14000)
+            falloff = TRUE;
+        if (data || falloff) {
+            for (i = 0; i < 75; i++) {
+                if (data && data[i] > vis->data[i]) {
+                    vis->data[i] = data[i];
+                    if (vis->data[i] > vis->peak[i]) {
+                        vis->peak[i] = vis->data[i];
+                        vis->peak_speed[i] = 0.01;
+
+                    }
+                    else if (vis->peak[i] > 0.0) {
+                        vis->peak[i] -= vis->peak_speed[i];
+                        vis->peak_speed[i] *=
+                            vis_pfalloff_speeds[config.peaks_falloff];
+                        if (vis->peak[i] < vis->data[i])
+                            vis->peak[i] = vis->data[i];
+                        if (vis->peak[i] < 0.0)
+                            vis->peak[i] = 0.0;
+                    }
+                }
+                else if (falloff) {
+                    if (vis->data[i] > 0.0) {
+                        vis->data[i] -=
+                            vis_afalloff_speeds[config.analyzer_falloff];
+                        if (vis->data[i] < 0.0)
+                            vis->data[i] = 0.0;
+                    }
+                    if (vis->peak[i] > 0.0) {
+                        vis->peak[i] -= vis->peak_speed[i];
+                        vis->peak_speed[i] *=
+                            vis_pfalloff_speeds[config.peaks_falloff];
+                        if (vis->peak[i] < vis->data[i])
+                            vis->peak[i] = vis->data[i];
+                        if (vis->peak[i] < 0.0)
+                            vis->peak[i] = 0.0;
+                    }
+                }
+            }
+        }
+    }
+    else if (config.vis_type == VIS_VOICEPRINT && data){
+      for(i = 0; i < 16; i++)
+	{
+	  vis->data[i] = data[15 - i];
+	}
+    }
+    else if (data) {
+        for (i = 0; i < 75; i++)
+            vis->data[i] = data[i];
+    }
+
+    if (micros > 14000) {
+        if (!vis->refresh_delay) {
+            gtk_widget_queue_draw(widget);
+            vis->refresh_delay = vis_redraw_delays[config.vis_refresh];
+        }
+        vis->refresh_delay--;
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/ui_vis.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,98 @@
+/*
+ * Audacious - a cross-platform multimedia player
+ * Copyright (c) 2007  Audacious development team.
+ *
+ * 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; under version 3 of the License.
+ *
+ * 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, see <http://www.gnu.org/licenses>.
+ *
+ * The Audacious team does not consider modular code linking to
+ * Audacious or using our public API to be a derived work.
+ */
+
+#ifndef UIVIS_H
+#define UIVIS_H
+
+#include <gtk/gtk.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define UI_VIS(obj)          GTK_CHECK_CAST (obj, ui_vis_get_type (), UiVis)
+#define UI_VIS_CLASS(klass)  GTK_CHECK_CLASS_CAST (klass, ui_vis_get_type (), UiVisClass)
+#define UI_IS_VIS(obj)       GTK_CHECK_TYPE (obj, ui_vis_get_type ())
+
+typedef enum {
+    VIS_ANALYZER, VIS_SCOPE, VIS_VOICEPRINT, VIS_OFF
+} VisType;
+
+typedef enum {
+    ANALYZER_NORMAL, ANALYZER_FIRE, ANALYZER_VLINES
+} AnalyzerMode;
+
+typedef enum {
+    ANALYZER_LINES, ANALYZER_BARS
+} AnalyzerType;
+
+typedef enum {
+    SCOPE_DOT, SCOPE_LINE, SCOPE_SOLID
+} ScopeMode;
+typedef enum {
+  VOICEPRINT_NORMAL, VOICEPRINT_FIRE, VOICEPRINT_ICE
+} VoiceprintMode;
+
+
+typedef enum {
+    VU_NORMAL, VU_SMOOTH
+} VUMode;
+
+typedef enum {
+    REFRESH_FULL, REFRESH_HALF, REFRESH_QUARTER, REFRESH_EIGTH
+} RefreshRate;
+
+typedef enum {
+    FALLOFF_SLOWEST, FALLOFF_SLOW, FALLOFF_MEDIUM, FALLOFF_FAST,
+    FALLOFF_FASTEST
+} FalloffSpeed;
+
+typedef struct _UiVis        UiVis;
+typedef struct _UiVisClass   UiVisClass;
+
+struct _UiVis {
+    GtkWidget        widget;
+
+    gint             x, y, width, height;
+    gfloat           data[75], peak[75], peak_speed[75];
+    gint             refresh_delay;
+    gboolean         scaled;
+    GtkWidget        *fixed;
+    gboolean         visible_window;
+    GdkWindow        *event_window;
+};
+
+struct _UiVisClass {
+    GtkWidgetClass          parent_class;
+    void (* doubled)        (UiVis *vis);
+};
+
+GtkWidget* ui_vis_new (GtkWidget *fixed, gint x, gint y, gint width);
+GtkType ui_vis_get_type(void);
+void ui_vis_set_vis(GtkWidget *widget, gint num);
+void ui_vis_clear_data(GtkWidget *widget);
+void ui_vis_timeout_func(GtkWidget *widget, guchar * data);
+void ui_vis_set_visible(GtkWidget *widget, gboolean window_is_visible);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/util.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,1134 @@
+/*  Audacious - Cross-platform multimedia player
+ *  Copyright (C) 2005-2008  Audacious development team
+ *
+ *  Based on BMP:
+ *  Copyright (C) 2003-2004  BMP development team.
+ *
+ *  Based on XMMS:
+ *  Copyright (C) 1998-2003  XMMS development team.
+ *
+ *  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; under version 3 of the License.
+ *
+ *  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, see <http://www.gnu.org/licenses>.
+ *
+ *  The Audacious team does not consider modular code linking to
+ *  Audacious or using our public API to be a derived work.
+ */
+
+/*#define AUD_DEBUG*/
+
+#ifdef HAVE_CONFIG_H
+#  include "config.h"
+#endif
+
+#include "util.h"
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <gtk/gtk.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <math.h>
+
+#include "platform/smartinclude.h"
+#include <errno.h>
+
+#ifdef HAVE_FTS_H
+#  include <sys/types.h>
+#  include <sys/stat.h>
+#  include <fts.h>
+#endif
+
+#include <audacious/input.h>
+#include <audacious/playback.h>
+
+#ifdef USE_CHARDET
+#  include "../libguess/libguess.h"
+#  ifdef HAVE_UDET
+#    include <libudet_c.h>
+#  endif
+#endif
+
+#include "plugin.h"
+
+/*
+ * find <file> in directory <dirname> or subdirectories.  return
+ * pointer to complete filename which has to be freed by calling
+ * "g_free()" after use. Returns NULL if file could not be found.
+ */
+
+/* somebody tell me how to make use of those funcs from string.h that are in core... */
+gboolean
+str_has_suffix_nocase(const gchar * str, const gchar * suffix)
+{
+    return (strcasecmp(str + strlen(str) - strlen(suffix), suffix) == 0);
+}
+
+static gchar *
+str_replace_char(gchar * str, gchar old, gchar new)
+{
+    gchar *match;
+
+    g_return_val_if_fail(str != NULL, NULL);
+
+    match = str;
+    while ((match = strchr(match, old)))
+        *match = new;
+
+    return str;
+}
+
+static gchar *
+str_replace_drive_letter(gchar * str)
+{
+    gchar *match, *match_end;
+
+    g_return_val_if_fail(str != NULL, NULL);
+
+    while ((match = strstr(str, ":\\"))) {
+        match--;
+        match_end = match + 3;
+        *match++ = '/';
+        while (*match_end)
+            *match++ = *match_end++;
+        *match = 0; /* the end of line */
+    }
+
+    return str;
+}
+
+gchar *
+convert_dos_path(gchar * path)
+{
+    g_return_val_if_fail(path != NULL, NULL);
+
+    /* replace drive letter with '/' */
+    str_replace_drive_letter(path);
+
+    /* replace '\' with '/' */
+    str_replace_char(path, '\\', '/');
+
+    return path;
+}
+
+gchar *
+escape_shell_chars(const gchar * string)
+{
+    const gchar *special = "$`\"\\";    /* Characters to escape */
+    const gchar *in = string;
+    gchar *out, *escaped;
+    gint num = 0;
+
+    while (*in != '\0')
+        if (strchr(special, *in++))
+            num++;
+
+    escaped = g_malloc(strlen(string) + num + 1);
+
+    in = string;
+    out = escaped;
+
+    while (*in != '\0') {
+        if (strchr(special, *in))
+            *out++ = '\\';
+        *out++ = *in++;
+    }
+    *out = '\0';
+
+    return escaped;
+}
+
+
+typedef struct {
+    const gchar *to_match;
+    gchar *match;
+    gboolean found;
+} FindFileContext;
+
+static const struct {
+    AFormat afmt;
+    SAD_sample_format sadfmt;
+} format_table[] = {
+    {FMT_U8, SAD_SAMPLE_U8},
+    {FMT_S8, SAD_SAMPLE_S8},
+
+    {FMT_S16_LE, SAD_SAMPLE_S16_LE},
+    {FMT_S16_BE, SAD_SAMPLE_S16_BE},
+    {FMT_S16_NE, SAD_SAMPLE_S16},
+
+    {FMT_U16_LE, SAD_SAMPLE_U16_LE},
+    {FMT_U16_BE, SAD_SAMPLE_U16_BE},
+    {FMT_U16_NE, SAD_SAMPLE_U16},
+
+    {FMT_S24_LE, SAD_SAMPLE_S24_LE},
+    {FMT_S24_BE, SAD_SAMPLE_S24_BE},
+    {FMT_S24_NE, SAD_SAMPLE_S24},
+    
+    {FMT_U24_LE, SAD_SAMPLE_U24_LE},
+    {FMT_U24_BE, SAD_SAMPLE_U24_BE},
+    {FMT_U24_NE, SAD_SAMPLE_U24},
+
+    {FMT_S32_LE, SAD_SAMPLE_S32_LE},
+    {FMT_S32_BE, SAD_SAMPLE_S32_BE},
+    {FMT_S32_NE, SAD_SAMPLE_S32},
+    
+    {FMT_U32_LE, SAD_SAMPLE_U32_LE},
+    {FMT_U32_BE, SAD_SAMPLE_U32_BE},
+    {FMT_U32_NE, SAD_SAMPLE_U32},
+    
+    {FMT_FLOAT, SAD_SAMPLE_FLOAT},
+    {FMT_FIXED32, SAD_SAMPLE_FIXED32},
+};
+
+SAD_sample_format
+sadfmt_from_afmt(AFormat fmt)
+{
+    int i;
+    for (i = 0; i < sizeof(format_table) / sizeof(format_table[0]); i++) {
+        if (format_table[i].afmt == fmt) return format_table[i].sadfmt;
+    }
+
+    return -1;
+}
+
+
+static gboolean
+find_file_func(const gchar * path, const gchar * basename, gpointer data)
+{
+    FindFileContext *context = data;
+
+    if (strlen(path) > FILENAME_MAX) {
+        AUDDBG("Ignoring path: name too long (%s)\n", path);
+        return TRUE;
+    }
+
+    if (aud_vfs_file_test(path, G_FILE_TEST_IS_REGULAR)) {
+        if (!strcasecmp(basename, context->to_match)) {
+            context->match = g_strdup(path);
+            context->found = TRUE;
+            return TRUE;
+        }
+    }
+    else if (aud_vfs_file_test(path, G_FILE_TEST_IS_DIR)) {
+        dir_foreach(path, find_file_func, context, NULL);
+        if (context->found)
+            return TRUE;
+    }
+
+    return FALSE;
+}
+
+gchar *
+find_file_recursively(const gchar * path, const gchar * filename)
+{
+    FindFileContext context;
+    gchar *out = NULL;
+
+    context.to_match = filename;
+    context.match = NULL;
+    context.found = FALSE;
+
+    dir_foreach(path, find_file_func, &context, NULL);
+
+    if (context.match)
+    {
+        out = g_filename_to_uri(context.match, NULL, NULL);
+        g_free(context.match);
+    }
+
+    return out;
+}
+
+gchar *
+find_path_recursively(const gchar * path, const gchar * filename)
+{
+    FindFileContext context;
+
+    context.to_match = filename;
+    context.match = NULL;
+    context.found = FALSE;
+
+    dir_foreach(path, find_file_func, &context, NULL);
+
+    return context.match;
+}
+
+
+typedef enum {
+    ARCHIVE_UNKNOWN = 0,
+    ARCHIVE_DIR,
+    ARCHIVE_TAR,
+    ARCHIVE_TGZ,
+    ARCHIVE_ZIP,
+    ARCHIVE_TBZ2
+} ArchiveType;
+
+typedef gchar *(*ArchiveExtractFunc) (const gchar *, const gchar *);
+
+typedef struct {
+    ArchiveType type;
+    const gchar *ext;
+} ArchiveExtensionType;
+
+static ArchiveExtensionType archive_extensions[] = {
+    {ARCHIVE_TAR, ".tar"},
+    {ARCHIVE_ZIP, ".wsz"},
+    {ARCHIVE_ZIP, ".zip"},
+    {ARCHIVE_TGZ, ".tar.gz"},
+    {ARCHIVE_TGZ, ".tgz"},
+    {ARCHIVE_TBZ2, ".tar.bz2"},
+    {ARCHIVE_TBZ2, ".bz2"},
+    {ARCHIVE_UNKNOWN, NULL}
+};
+
+static gchar *archive_extract_tar(const gchar * archive, const gchar * dest);
+static gchar *archive_extract_zip(const gchar * archive, const gchar * dest);
+static gchar *archive_extract_tgz(const gchar * archive, const gchar * dest);
+static gchar *archive_extract_tbz2(const gchar * archive, const gchar * dest);
+
+static ArchiveExtractFunc archive_extract_funcs[] = {
+    NULL,
+    NULL,
+    archive_extract_tar,
+    archive_extract_tgz,
+    archive_extract_zip,
+    archive_extract_tbz2
+};
+
+
+/* FIXME: these functions can be generalised into a function using a
+ * command lookup table */
+
+static const gchar *
+get_tar_command(void)
+{
+    static const gchar *command = NULL;
+
+    if (!command) {
+        if (!(command = getenv("TARCMD")))
+            command = "tar";
+    }
+
+    return command;
+}
+
+static const gchar *
+get_unzip_command(void)
+{
+    static const gchar *command = NULL;
+
+    if (!command) {
+        if (!(command = getenv("UNZIPCMD")))
+            command = "unzip";
+    }
+
+    return command;
+}
+
+
+static gchar *
+archive_extract_tar(const gchar * archive, const gchar * dest)
+{
+    return g_strdup_printf("%s >/dev/null xf \"%s\" -C %s",
+                           get_tar_command(), archive, dest);
+}
+
+static gchar *
+archive_extract_zip(const gchar * archive, const gchar * dest)
+{
+    return g_strdup_printf("%s >/dev/null -o -j \"%s\" -d %s",
+                           get_unzip_command(), archive, dest);
+}
+
+static gchar *
+archive_extract_tgz(const gchar * archive, const gchar * dest)
+{
+    return g_strdup_printf("%s >/dev/null xzf \"%s\" -C %s",
+                           get_tar_command(), archive, dest);
+}
+
+static gchar *
+archive_extract_tbz2(const gchar * archive, const gchar * dest)
+{
+    return g_strdup_printf("bzip2 -dc \"%s\" | %s >/dev/null xf - -C %s",
+                           archive, get_tar_command(), dest);
+}
+
+
+ArchiveType
+archive_get_type(const gchar * filename)
+{
+    gint i = 0;
+
+    if (g_file_test(filename, G_FILE_TEST_IS_DIR))
+        return ARCHIVE_DIR;
+
+    while (archive_extensions[i].ext) {
+        if (g_str_has_suffix(filename, archive_extensions[i].ext)) {
+            return archive_extensions[i].type;
+        }
+        i++;
+    }
+
+    return ARCHIVE_UNKNOWN;
+}
+
+gboolean
+file_is_archive(const gchar * filename)
+{
+    return (archive_get_type(filename) > ARCHIVE_DIR);
+}
+
+gchar *
+archive_basename(const gchar * str)
+{
+    gint i = 0;
+
+    while (archive_extensions[i].ext) {
+        if (str_has_suffix_nocase(str, archive_extensions[i].ext)) {
+            const gchar *end = g_strrstr(str, archive_extensions[i].ext);
+            if (end) {
+                return g_strndup(str, end - str);
+            }
+            break;
+        }
+        i++;
+    }
+
+    return NULL;
+}
+
+/*
+   decompress_archive
+
+   Decompresses the archive "filename" to a temporary directory,
+   returns the path to the temp dir, or NULL if failed,
+   watch out tho, doesn't actually check if the system command succeeds :-|
+*/
+
+gchar *
+archive_decompress(const gchar * filename)
+{
+    gchar *tmpdir, *cmd, *escaped_filename;
+    ArchiveType type;
+#ifndef HAVE_MKDTEMP
+    mode_t mode755 = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH;
+#endif
+
+    if ((type = archive_get_type(filename)) <= ARCHIVE_DIR)
+        return NULL;
+
+#ifdef HAVE_MKDTEMP
+    tmpdir = g_build_filename(g_get_tmp_dir(), "audacious.XXXXXXXX", NULL);
+    if (!mkdtemp(tmpdir)) {
+        g_free(tmpdir);
+        AUDDBG("Unable to load skin: Failed to create temporary "
+                  "directory: %s\n", g_strerror(errno));
+        return NULL;
+    }
+#else
+    tmpdir = g_strdup_printf("%s/audacious.%ld", g_get_tmp_dir(), (long) rand());
+    make_directory(tmpdir, mode755);
+#endif
+
+    escaped_filename = escape_shell_chars(filename);
+    cmd = archive_extract_funcs[type] (escaped_filename, tmpdir);
+    g_free(escaped_filename);
+
+    if (!cmd) {
+        AUDDBG("extraction function is NULL!\n");
+        g_free(tmpdir);
+        return NULL;
+    }
+
+    AUDDBG("Attempt to execute \"%s\"\n", cmd);
+
+    if(system(cmd) != 0)
+    {
+        AUDDBG("could not execute cmd %s\n",cmd);
+        g_free(cmd);
+        return NULL;
+    }
+    g_free(cmd);
+
+    return tmpdir;
+}
+
+
+#ifdef HAVE_FTS_H
+
+void
+del_directory(const gchar * dirname)
+{
+    gchar *const argv[2] = { (gchar *) dirname, NULL };
+    FTS *fts;
+    FTSENT *p;
+
+    fts = fts_open(argv, FTS_PHYSICAL, (gint(*)())NULL);
+    while ((p = fts_read(fts))) {
+        switch (p->fts_info) {
+        case FTS_D:
+            break;
+        case FTS_DNR:
+        case FTS_ERR:
+            break;
+        case FTS_DP:
+            rmdir(p->fts_accpath);
+            break;
+        default:
+            unlink(p->fts_accpath);
+            break;
+        }
+    }
+    fts_close(fts);
+}
+
+#else                           /* !HAVE_FTS */
+
+gboolean
+del_directory_func(const gchar * path, const gchar * basename,
+                   gpointer params)
+{
+    if (!strcmp(basename, ".") || !strcmp(path, ".."))
+        return FALSE;
+
+    if (g_file_test(path, G_FILE_TEST_IS_DIR)) {
+        dir_foreach(path, del_directory_func, NULL, NULL);
+        rmdir(path);
+        return FALSE;
+    }
+
+    unlink(path);
+
+    return FALSE;
+}
+
+void
+del_directory(const gchar * path)
+{
+    dir_foreach(path, del_directory_func, NULL, NULL);
+    rmdir(path);
+}
+
+#endif                          /* ifdef HAVE_FTS */
+
+static void
+strip_string(GString *string)
+{
+    while (string->len > 0 && string->str[0] == ' ')
+        g_string_erase(string, 0, 1);
+
+    while (string->len > 0 && string->str[string->len - 1] == ' ')
+        g_string_erase(string, string->len - 1, 1);
+}
+
+static void
+strip_lower_string(GString *string)
+{
+    gchar *lower;
+    strip_string(string);
+
+    lower = g_ascii_strdown(string->str, -1);
+    g_free(string->str);
+    string->str = lower;
+}
+
+static void
+close_ini_file_free_value(gpointer value)
+{
+    g_free((gchar*)value);
+}
+
+static void
+close_ini_file_free_section(gpointer section)
+{
+    g_hash_table_destroy((GHashTable*)section);
+}
+
+INIFile *
+open_ini_file(const gchar *filename)
+{
+    GHashTable *ini_file = NULL;
+    GHashTable *section = NULL;
+    GString *section_name, *key_name, *value;
+    gpointer section_hash, key_hash;
+    gchar *buffer = NULL;
+    gsize off = 0;
+    gsize filesize = 0;
+
+    unsigned char x[] = { 0xff, 0xfe, 0x00 };
+
+    g_return_val_if_fail(filename, NULL);
+    aud_vfs_file_get_contents(filename, &buffer, &filesize);
+    if (buffer == NULL)
+        return NULL;
+
+    /*
+     * Convert UTF-16 into something useful. Original implementation
+     * by incomp@#audacious. Cleanups \nenolod
+     * FIXME: can't we use a GLib function for that? -- 01mf02
+     */
+    if (filesize > 2 && !memcmp(&buffer[0],&x,2))
+    {
+        gchar *outbuf = g_malloc (filesize);   /* it's safe to waste memory. */
+        guint counter;
+
+        for (counter = 2; counter < filesize; counter += 2)
+        {
+            if (!memcmp(&buffer[counter+1], &x[2], 1)) {
+                outbuf[(counter-2)/2] = buffer[counter];
+            } else {
+                g_free(buffer);
+                g_free(outbuf);
+                return NULL;
+            }
+        }
+
+        outbuf[(counter-2)/2] = '\0';
+
+        if ((filesize - 2) / 2 == (counter - 2) / 2)
+        {
+            g_free(buffer);
+            buffer = outbuf;
+        }
+        else
+        {
+            g_free(buffer);
+            g_free(outbuf);
+            return NULL;    /* XXX wrong encoding */
+        }
+    }
+
+    section_name = g_string_new("");
+    key_name = g_string_new(NULL);
+    value = g_string_new(NULL);
+
+    ini_file = g_hash_table_new_full(NULL, NULL, NULL,
+                                     close_ini_file_free_section);
+    section = g_hash_table_new_full(NULL, NULL, NULL,
+                                    close_ini_file_free_value);
+    /* make a nameless section which should store all entries that are not
+     * embedded in a section */
+    section_hash = GINT_TO_POINTER(g_string_hash(section_name));
+    g_hash_table_insert(ini_file, section_hash, section);
+
+    while (off < filesize)
+    {
+        /* ignore the following characters */
+        if (buffer[off] == '\r' || buffer[off] == '\n' ||
+            buffer[off] == ' '  || buffer[off] == '\t')
+        {
+            if (buffer[off] == '\n')
+            {
+                g_string_free(key_name, TRUE);
+                g_string_free(value, TRUE);
+                key_name = g_string_new(NULL);
+                value = g_string_new(NULL);
+            }
+
+            off++;
+            continue;
+        }
+
+        /* if we encounter a possible section statement */
+        if (buffer[off] == '[')
+        {
+            g_string_free(section_name, TRUE);
+            section_name = g_string_new(NULL);
+            off++;
+
+            if (off >= filesize)
+                goto return_sequence;
+
+            while (buffer[off] != ']')
+            {
+                /* if the section statement has not been closed before a
+                 * linebreak */
+                if (buffer[off] == '\n')
+                    break;
+
+                g_string_append_c(section_name, buffer[off]);
+                off++;
+                if (off >= filesize)
+                    goto return_sequence;
+            }
+            if (buffer[off] == '\n')
+                continue;
+            if (buffer[off] == ']')
+            {
+                off++;
+                if (off >= filesize)
+                    goto return_sequence;
+
+                strip_lower_string(section_name);
+                section_hash = GINT_TO_POINTER(g_string_hash(section_name));
+
+                /* if this section already exists, we don't make a new one,
+                 * but reuse the old one */
+                if (g_hash_table_lookup(ini_file, section_hash) != NULL)
+                    section = g_hash_table_lookup(ini_file, section_hash);
+                else
+                {
+                    section = g_hash_table_new_full(NULL, NULL, NULL,
+                                                    close_ini_file_free_value);
+                    g_hash_table_insert(ini_file, section_hash, section);
+                }
+
+                continue;
+            }
+        }
+
+        if (buffer[off] == '=')
+        {
+            off++;
+            if (off >= filesize)
+                goto return_sequence;
+
+            while (buffer[off] != '\n' && buffer[off] != '\r')
+            {
+                g_string_append_c(value, buffer[off]);
+                off++;
+                if (off >= filesize)
+                    break;
+            }
+
+            strip_lower_string(key_name);
+            key_hash = GINT_TO_POINTER(g_string_hash(key_name));
+            strip_string(value);
+
+            if (key_name->len > 0 && value->len > 0)
+                g_hash_table_insert(section, key_hash, g_strdup(value->str));
+        }
+        else
+        {
+            g_string_append_c(key_name, buffer[off]);
+            off++;
+            if (off >= filesize)
+                goto return_sequence;
+        }
+    }
+
+return_sequence:
+    g_string_free(section_name, TRUE);
+    g_string_free(key_name, TRUE);
+    g_string_free(value, TRUE);
+    g_free(buffer);
+    return ini_file;
+}
+
+/**
+ * Frees the memory allocated for inifile.
+ */
+void
+close_ini_file(INIFile *inifile)
+{
+    g_return_if_fail(inifile);
+    g_hash_table_destroy(inifile);
+}
+
+/**
+ * Returns a string that corresponds to correct section and key in inifile.
+ *
+ * Returns NULL if value was not found in inifile. Otherwise returns a copy
+ * of string pointed by "section" and "key". Returned string should be freed
+ * after use.
+ */
+gchar *
+read_ini_string(INIFile *inifile, const gchar *section, const gchar *key)
+{
+    GString *section_string;
+    GString *key_string;
+    gchar *value = NULL;
+    gpointer section_hash, key_hash;
+    GHashTable *section_table;
+    
+    g_return_val_if_fail(inifile, NULL);
+
+    section_string = g_string_new(section);
+    key_string = g_string_new(key);
+    value = NULL;
+
+    strip_lower_string(section_string);
+    strip_lower_string(key_string);
+    section_hash = GINT_TO_POINTER(g_string_hash(section_string));
+    key_hash = GINT_TO_POINTER(g_string_hash(key_string));
+    section_table = g_hash_table_lookup(inifile, section_hash);
+
+    if (section_table) {
+        value = g_strdup(g_hash_table_lookup(section_table,
+                                             GINT_TO_POINTER(key_hash)));
+    }
+
+    g_string_free(section_string, TRUE);
+    g_string_free(key_string, TRUE);
+
+    g_return_val_if_fail(value, NULL);
+    return value;
+}
+
+GArray *
+read_ini_array(INIFile *inifile, const gchar *section, const gchar *key)
+{
+    gchar *temp;
+    GArray *a;
+
+    g_return_val_if_fail((temp = read_ini_string(inifile, section, key)), NULL);
+
+    a = string_to_garray(temp);
+    g_free(temp);
+    return a;
+}
+
+GArray *
+string_to_garray(const gchar * str)
+{
+    GArray *array;
+    gint temp;
+    const gchar *ptr = str;
+    gchar *endptr;
+
+    array = g_array_new(FALSE, TRUE, sizeof(gint));
+    for (;;) {
+        temp = strtol(ptr, &endptr, 10);
+        if (ptr == endptr)
+            break;
+        g_array_append_val(array, temp);
+        ptr = endptr;
+        while (!isdigit((int) *ptr) && (*ptr) != '\0')
+            ptr++;
+        if (*ptr == '\0')
+            break;
+    }
+    return (array);
+}
+
+void
+glist_movedown(GList * list)
+{
+    gpointer temp;
+
+    if (g_list_next(list)) {
+        temp = list->data;
+        list->data = list->next->data;
+        list->next->data = temp;
+    }
+}
+
+void
+glist_moveup(GList * list)
+{
+    gpointer temp;
+
+    if (g_list_previous(list)) {
+        temp = list->data;
+        list->data = list->prev->data;
+        list->prev->data = temp;
+    }
+}
+
+GdkFont *
+util_font_load(const gchar * name)
+{
+    GdkFont *font;
+    PangoFontDescription *desc;
+
+    desc = pango_font_description_from_string(name);
+    font = gdk_font_from_description(desc);
+
+    return font;
+}
+
+/* text_get_extents() taken from The GIMP (C) Spencer Kimball, Peter
+ * Mattis et al */
+gboolean
+text_get_extents(const gchar * fontname,
+                 const gchar * text,
+                 gint * width, gint * height, gint * ascent, gint * descent)
+{
+    PangoFontDescription *font_desc;
+    PangoLayout *layout;
+    PangoRectangle rect;
+
+    g_return_val_if_fail(fontname != NULL, FALSE);
+    g_return_val_if_fail(text != NULL, FALSE);
+
+    /* FIXME: resolution */
+    layout = gtk_widget_create_pango_layout(GTK_WIDGET(mainwin), text);
+
+    font_desc = pango_font_description_from_string(fontname);
+    pango_layout_set_font_description(layout, font_desc);
+    pango_font_description_free(font_desc);
+    pango_layout_get_pixel_extents(layout, NULL, &rect);
+
+    if (width)
+        *width = rect.width;
+    if (height)
+        *height = rect.height;
+
+    if (ascent || descent) {
+        PangoLayoutIter *iter;
+        PangoLayoutLine *line;
+
+        iter = pango_layout_get_iter(layout);
+        line = pango_layout_iter_get_line(iter);
+        pango_layout_iter_free(iter);
+
+        pango_layout_line_get_pixel_extents(line, NULL, &rect);
+
+        if (ascent)
+            *ascent = PANGO_ASCENT(rect);
+        if (descent)
+            *descent = -PANGO_DESCENT(rect);
+    }
+
+    g_object_unref(layout);
+
+    return TRUE;
+}
+
+/* counts number of digits in a gint */
+guint
+gint_count_digits(gint n)
+{
+    guint count = 0;
+
+    n = ABS(n);
+    do {
+        count++;
+        n /= 10;
+    } while (n > 0);
+
+    return count;
+}
+
+gboolean
+dir_foreach(const gchar * path, DirForeachFunc function,
+            gpointer user_data, GError ** error)
+{
+    GError *error_out = NULL;
+    GDir *dir;
+    const gchar *entry;
+    gchar *entry_fullpath;
+
+    if (!(dir = g_dir_open(path, 0, &error_out))) {
+        g_propagate_error(error, error_out);
+        return FALSE;
+    }
+
+    while ((entry = g_dir_read_name(dir))) {
+        entry_fullpath = g_build_filename(path, entry, NULL);
+
+        if ((*function) (entry_fullpath, entry, user_data)) {
+            g_free(entry_fullpath);
+            break;
+        }
+
+        g_free(entry_fullpath);
+    }
+
+    g_dir_close(dir);
+
+    return TRUE;
+}
+
+GtkWidget *
+make_filebrowser(const gchar *title, gboolean save)
+{
+    GtkWidget *dialog;
+    GtkWidget *button;
+
+    g_return_val_if_fail(title != NULL, NULL);
+
+    dialog = gtk_file_chooser_dialog_new(title, GTK_WINDOW(mainwin),
+                                         save ?
+                                         GTK_FILE_CHOOSER_ACTION_SAVE :
+                                         GTK_FILE_CHOOSER_ACTION_OPEN,
+                                         NULL, NULL);
+
+    button = gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CANCEL,
+                                   GTK_RESPONSE_REJECT);
+
+    gtk_button_set_use_stock(GTK_BUTTON(button), TRUE);
+    GTK_WIDGET_SET_FLAGS(button, GTK_CAN_DEFAULT);
+
+    button = gtk_dialog_add_button(GTK_DIALOG(dialog), save ?
+                                   GTK_STOCK_SAVE : GTK_STOCK_OPEN,
+                                   GTK_RESPONSE_ACCEPT);
+
+    gtk_button_set_use_stock(GTK_BUTTON(button), TRUE);
+    gtk_dialog_set_default_response(GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT);
+    gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); /* centering */
+
+    return dialog;
+}
+
+/**
+ * util_info_dialog:
+ * @title: The title of the message to show.
+ * @text: The text of the message to show.
+ * @button_text: The text of the button which will close the messagebox.
+ * @modal: Whether or not the messagebox should be modal.
+ * @button_action: Code to execute on when the messagebox is closed, or %NULL.
+ * @action_data: Optional opaque data to pass to @button_action.
+ *
+ * Displays a message box.
+ *
+ * Return value: A GTK widget handle for the message box.
+ **/
+GtkWidget *
+util_info_dialog(const gchar * title, const gchar * text,
+                 const gchar * button_text, gboolean modal,
+                 GCallback button_action, gpointer action_data)
+{
+  GtkWidget *dialog;
+  GtkWidget *dialog_vbox, *dialog_hbox, *dialog_bbox;
+  GtkWidget *dialog_bbox_b1;
+  GtkWidget *dialog_textlabel;
+  GtkWidget *dialog_icon;
+
+  dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+  gtk_window_set_type_hint( GTK_WINDOW(dialog) , GDK_WINDOW_TYPE_HINT_DIALOG );
+  gtk_window_set_modal( GTK_WINDOW(dialog) , modal );
+  gtk_window_set_title( GTK_WINDOW(dialog) , title );
+  gtk_container_set_border_width( GTK_CONTAINER(dialog) , 10 );
+
+  dialog_vbox = gtk_vbox_new( FALSE , 0 );
+  dialog_hbox = gtk_hbox_new( FALSE , 0 );
+
+  /* icon */
+  dialog_icon = gtk_image_new_from_stock( GTK_STOCK_DIALOG_INFO , GTK_ICON_SIZE_DIALOG );
+  gtk_box_pack_start( GTK_BOX(dialog_hbox) , dialog_icon , FALSE , FALSE , 2 );
+
+  /* label */
+  dialog_textlabel = gtk_label_new( text );
+  /* gtk_label_set_selectable( GTK_LABEL(dialog_textlabel) , TRUE ); */
+  gtk_box_pack_start( GTK_BOX(dialog_hbox) , dialog_textlabel , TRUE , TRUE , 2 );
+
+  gtk_box_pack_start( GTK_BOX(dialog_vbox) , dialog_hbox , FALSE , FALSE , 2 );
+  gtk_box_pack_start( GTK_BOX(dialog_vbox) , gtk_hseparator_new() , FALSE , FALSE , 4 );
+
+  dialog_bbox = gtk_hbutton_box_new();
+  gtk_button_box_set_layout( GTK_BUTTON_BOX(dialog_bbox) , GTK_BUTTONBOX_END );
+  dialog_bbox_b1 = gtk_button_new_with_label( button_text );
+  g_signal_connect_swapped( G_OBJECT(dialog_bbox_b1) , "clicked" ,
+                            G_CALLBACK(gtk_widget_destroy) , dialog );
+  if ( button_action )
+    g_signal_connect( G_OBJECT(dialog_bbox_b1) , "clicked" ,
+                      button_action , action_data );
+
+  gtk_container_add( GTK_CONTAINER(dialog_bbox) , dialog_bbox_b1 );
+  gtk_box_pack_start( GTK_BOX(dialog_vbox) , dialog_bbox , FALSE , FALSE , 0 );
+
+  gtk_container_add( GTK_CONTAINER(dialog) , dialog_vbox );
+
+  GTK_WIDGET_SET_FLAGS( dialog_bbox_b1 , GTK_CAN_DEFAULT);
+  gtk_widget_grab_default( dialog_bbox_b1 );
+
+  gtk_widget_show_all(dialog);
+
+  return dialog;
+}
+
+
+/**
+ * util_get_localdir:
+ *
+ * Returns a string with the full path of Audacious local datadir (where config files are placed).
+ * It's useful in order to put in the right place custom config files for audacious plugins.
+ *
+ * Return value: a string with full path of Audacious local datadir (should be freed after use)
+ **/
+gchar*
+util_get_localdir(void)
+{
+  gchar *datadir;
+  gchar *tmp;
+
+  if ( (tmp = getenv("XDG_CONFIG_HOME")) == NULL )
+    datadir = g_build_filename( g_get_home_dir() , ".config" , "audacious" ,  NULL );
+  else
+    datadir = g_build_filename( tmp , "audacious" , NULL );
+
+  return datadir;
+}
+
+
+gchar *
+construct_uri(gchar *string, const gchar *playlist_name) // uri, path and anything else
+{
+    gchar *filename = g_strdup(string);
+    gchar *tmp, *path;
+    gchar *uri = NULL;
+
+    /* try to translate dos path */
+    convert_dos_path(filename); /* in place replacement */
+
+    // make full path uri here
+    // case 1: filename is raw full path or uri
+    if (filename[0] == '/' || strstr(filename, "://")) {
+        uri = g_filename_to_uri(filename, NULL, NULL);
+        if(!uri) {
+            uri = g_strdup(filename);
+        }
+        g_free(filename);
+    }
+    // case 2: filename is not raw full path nor uri, playlist path is full path
+    // make full path by replacing last part of playlist path with filename. (using g_build_filename)
+    else if (playlist_name[0] == '/' || strstr(playlist_name, "://")) {
+        path = g_filename_from_uri(playlist_name, NULL, NULL);
+        if (!path) {
+            path = g_strdup(playlist_name);
+        }
+        tmp = strrchr(path, '/'); *tmp = '\0';
+        tmp = g_build_filename(path, filename, NULL);
+        g_free(path); g_free(filename);
+        uri = g_filename_to_uri(tmp, NULL, NULL);
+        g_free(tmp);
+    }
+    // case 3: filename is not raw full path nor uri, playlist path is not full path
+    // just abort.
+    else {
+        g_free(filename);
+        return NULL;
+    }
+
+    AUDDBG("uri=%s\n", uri);
+    return uri;
+}
+
+/* 
+ * minimize number of realloc's:
+ *  - set N to nearest power of 2 not less then N
+ *  - double it
+ *
+ *  -- asphyx
+ *
+ * XXX: what's so smart about this?? seems wasteful and silly. --nenolod
+ */
+gpointer
+smart_realloc(gpointer ptr, gsize *size)
+{
+    *size = (size_t)pow(2, ceil(log(*size) / log(2)) + 1);
+    if (ptr != NULL) free(ptr);
+    ptr = malloc(*size);
+    return ptr;
+}
+
+void
+make_directory(const gchar * path, mode_t mode)
+{
+    if (g_mkdir_with_parents(path, mode) == 0)
+        return;
+
+    g_printerr(_("Could not create directory (%s): %s\n"), path,
+               g_strerror(errno));
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/skins/util.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,103 @@
+/*  Audacious - Cross-platform multimedia player
+ *  Copyright (C) 2005-2008  Audacious development team
+ *
+ *  Based on BMP:
+ *  Copyright (C) 2003-2004  BMP development team
+ *
+ *  Based on XMMS:
+ *  Copyright (C) 1998-2003  XMMS development team
+ *
+ *  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; under version 3 of the License.
+ *
+ *  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, see <http://www.gnu.org/licenses>.
+ *
+ *  The Audacious team does not consider modular code linking to
+ *  Audacious or using our public API to be a derived work.
+ */
+
+#ifndef UTIL_H
+#define UTIL_H
+
+#ifdef _AUDACIOUS_CORE
+# ifdef HAVE_CONFIG_H
+#  include "config.h"
+# endif
+#endif
+
+#include <glib.h>
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#include "audacious/plugin.h"
+#include "libSAD/libSAD.h"
+
+#define SWAP(a, b)      { a^=b; b^=a; a^=b; }
+
+typedef gboolean(*DirForeachFunc) (const gchar * path,
+                                   const gchar * basename,
+                                   gpointer user_data);
+
+
+gchar *find_file_recursively(const gchar * dirname, const gchar * file);
+gchar *find_path_recursively(const gchar * dirname, const gchar * file);
+void del_directory(const gchar * dirname);
+gboolean dir_foreach(const gchar * path, DirForeachFunc function,
+                     gpointer user_data, GError ** error);
+
+
+INIFile *open_ini_file(const gchar *filename);
+void close_ini_file(INIFile *key_file);
+gchar *read_ini_string(INIFile *key_file, const gchar *section,
+					   const gchar *key);
+GArray *read_ini_array(INIFile *key_file, const gchar *section,
+                       const gchar *key);
+
+GArray *string_to_garray(const gchar * str);
+
+void glist_movedown(GList * list);
+void glist_moveup(GList * list);
+
+GdkFont *util_font_load(const gchar * name);
+void util_set_cursor(GtkWidget * window);
+gboolean text_get_extents(const gchar * fontname, const gchar * text,
+                          gint * width, gint * height, gint * ascent,
+                          gint * descent);
+
+gboolean file_is_archive(const gchar * filename);
+gchar *archive_decompress(const gchar * path);
+gchar *archive_basename(const gchar * path);
+
+guint gint_count_digits(gint n);
+
+
+GtkWidget *make_filebrowser(const gchar *title, gboolean save);
+
+GtkWidget *util_info_dialog(const gchar * title, const gchar * text,
+    const gchar * button_text, gboolean modal, GCallback button_action,
+    gpointer action_data); 
+
+GdkPixbuf *audacious_create_colorized_pixbuf(GdkPixbuf *src, gint red, gint green, gint blue);
+
+gchar *util_get_localdir(void);
+
+gchar *construct_uri(gchar *string, const gchar *playlist_name);
+
+SAD_sample_format sadfmt_from_afmt(AFormat fmt);
+
+/* minimizes number of realloc's */
+gpointer smart_realloc(gpointer ptr, gsize *size);
+
+void make_directory(const gchar * path, mode_t mode);
+
+G_END_DECLS
+
+#endif
--- a/src/smb/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/smb/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -8,5 +8,5 @@
 plugindir := ${plugindir}/${TRANSPORT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${DBUS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${ARCH_DEFINES} ${XML_CPPFLAGS} -I../../intl -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${XML_LIBS} -lsmbclient
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS}  ${GTK_CFLAGS} ${GLIB_CFLAGS}  ${ARCH_DEFINES} ${XML_CPPFLAGS} -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS}  ${XML_LIBS} -lsmbclient
--- a/src/sndfile/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sndfile/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -9,5 +9,5 @@
 plugindir := ${plugindir}/${INPUT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${DBUS_CFLAGS} -I../../intl -I../.. 
-LIBS += ${MOWGLI_LIBS} ${SNDFILE_LIBS} ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS}   -I../.. 
+LIBS += ${MOWGLI_LIBS} ${SNDFILE_LIBS} ${GTK_LIBS} ${GLIB_LIBS} 
--- a/src/sndfile/plugin.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sndfile/plugin.c	Fri Jun 13 05:57:25 2008 +0300
@@ -35,9 +35,7 @@
 #include <math.h>
 
 #include <audacious/plugin.h>
-#include <audacious/util.h>
 #include <audacious/i18n.h>
-#include <audacious/main.h>
 #include <audacious/output.h>
 #include "plugin.h"
 
@@ -46,8 +44,8 @@
 static SNDFILE *sndfile = NULL;
 static SF_INFO sfinfo;
 
-static int song_length;
-static int bit_rate = 0;
+static gint song_length;
+static gint bit_rate = 0;
 static glong seek_time = -1;
 
 static GThread *decode_thread;
@@ -55,28 +53,36 @@
 static GCond *decode_cond;
 
 
-
-
-static sf_count_t sf_get_filelen (void *user_data)
+static sf_count_t
+sf_get_filelen (void *user_data)
 {
     return aud_vfs_fsize (user_data);
 }
-static sf_count_t sf_vseek (sf_count_t offset, int whence, void *user_data)
+
+static sf_count_t
+sf_vseek (sf_count_t offset, int whence, void *user_data)
 {
     return aud_vfs_fseek(user_data, offset, whence);
 }
-static sf_count_t sf_vread (void *ptr, sf_count_t count, void *user_data)
+
+static sf_count_t
+sf_vread (void *ptr, sf_count_t count, void *user_data)
 {
     return aud_vfs_fread(ptr, 1, count, user_data);
 }
-static sf_count_t sf_vwrite (const void *ptr, sf_count_t count, void *user_data)
+
+static sf_count_t
+sf_vwrite (const void *ptr, sf_count_t count, void *user_data)
 {
     return aud_vfs_fwrite(ptr, 1, count, user_data);
 }
-static sf_count_t sf_tell (void *user_data)
+
+static sf_count_t
+sf_tell (void *user_data)
 {
     return aud_vfs_ftell(user_data);
 }
+
 static SF_VIRTUAL_IO sf_virtual_io =
 {
     sf_get_filelen,
@@ -86,18 +92,19 @@
     sf_tell
 };
 
+
 static SNDFILE *
-open_sndfile_from_uri(gchar *filename, VFSFile *vfsfile, SF_INFO *tmp_sfinfo)
+open_sndfile_from_uri(gchar *filename, VFSFile **vfsfile, SF_INFO *tmp_sfinfo)
 {
     SNDFILE *snd_file = NULL;
-    vfsfile = aud_vfs_fopen(filename, "rb");
+    *vfsfile = aud_vfs_fopen(filename, "rb");
 
-    if (vfsfile == NULL)
+    if (*vfsfile == NULL)
         return NULL;
 
-    snd_file = sf_open_virtual (&sf_virtual_io, SFM_READ, tmp_sfinfo, vfsfile);
+    snd_file = sf_open_virtual (&sf_virtual_io, SFM_READ, tmp_sfinfo, *vfsfile);
     if (snd_file == NULL)
-        aud_vfs_fclose(vfsfile);
+        aud_vfs_fclose(*vfsfile);
 
     return snd_file;
 }
@@ -110,7 +117,6 @@
 }
 
 
-
 static void
 plugin_init (void)
 {
@@ -128,16 +134,15 @@
 }
 
 static void
-fill_song_tuple (char *filename, Tuple *ti)
+fill_song_tuple (gchar *filename, Tuple *ti)
 {
     VFSFile *vfsfile = NULL;
     SNDFILE *tmp_sndfile;
     SF_INFO tmp_sfinfo;
-    unsigned int lossy = 0;
-    gchar *codec = NULL, *format, *subformat = NULL;
-    GString *codec_gs = NULL;
+    gboolean lossy = FALSE;
+    gchar *codec, *format, *subformat;
 
-    tmp_sndfile = open_sndfile_from_uri(filename, vfsfile, &tmp_sfinfo);
+    tmp_sndfile = open_sndfile_from_uri(filename, &vfsfile, &tmp_sfinfo);
     if ( sf_get_string(tmp_sndfile, SF_STR_TITLE) == NULL)
         aud_tuple_associate_string(ti, FIELD_TITLE, NULL, g_path_get_basename(filename));
     else
@@ -152,10 +157,9 @@
         return;
 
     close_sndfile (tmp_sndfile, vfsfile);
-    tmp_sndfile = NULL;
 
     if (tmp_sfinfo.samplerate > 0)
-        aud_tuple_associate_int(ti, FIELD_LENGTH, NULL, (int) ceil (1000.0 * tmp_sfinfo.frames / tmp_sfinfo.samplerate));
+        aud_tuple_associate_int(ti, FIELD_LENGTH, NULL, (gint) ceil (1000.0 * tmp_sfinfo.frames / tmp_sfinfo.samplerate));
 
     switch (tmp_sfinfo.format & SF_FORMAT_TYPEMASK)
     {
@@ -221,8 +225,9 @@
             format = "Core Audio File";
             break;
         default:
-            format = "unknown sndfile";
+            format = "Unknown sndfile";
     }
+    
     switch (tmp_sfinfo.format & SF_FORMAT_SUBMASK)
     {
         case SF_FORMAT_PCM_S8:
@@ -248,79 +253,78 @@
             break;
         case SF_FORMAT_ULAW:
             subformat = "U-Law";
-            lossy = 1;
+            lossy = TRUE;
             break;
         case SF_FORMAT_ALAW:
             subformat = "A-Law";
-            lossy = 1;
+            lossy = TRUE;
             break;
         case SF_FORMAT_IMA_ADPCM:
             subformat = "IMA ADPCM";
-            lossy = 1;
+            lossy = TRUE;
             break;
         case SF_FORMAT_MS_ADPCM:
             subformat = "MS ADPCM";
-            lossy = 1;
+            lossy = TRUE;
             break;
         case SF_FORMAT_GSM610:
             subformat = "GSM 6.10";
-            lossy = 1;
+            lossy = TRUE;
             break;
         case SF_FORMAT_VOX_ADPCM:
             subformat = "Oki Dialogic ADPCM";
-            lossy = 1;
+            lossy = TRUE;
             break;
         case SF_FORMAT_G721_32:
             subformat = "32kbs G721 ADPCM";
-            lossy = 1;
+            lossy = TRUE;
             break;
         case SF_FORMAT_G723_24:
             subformat = "24kbs G723 ADPCM";
-            lossy = 1;
+            lossy = TRUE;
             break;
         case SF_FORMAT_G723_40:
             subformat = "40kbs G723 ADPCM";
-            lossy = 1;
+            lossy = TRUE;
             break;
         case SF_FORMAT_DWVW_12:
             subformat = "12 bit Delta Width Variable Word";
-            lossy = 1;
+            lossy = TRUE;
             break;
         case SF_FORMAT_DWVW_16:
             subformat = "16 bit Delta Width Variable Word";
-            lossy = 1;
+            lossy = TRUE;
             break;
         case SF_FORMAT_DWVW_24:
             subformat = "24 bit Delta Width Variable Word";
-            lossy = 1;
+            lossy = TRUE;
             break;
         case SF_FORMAT_DWVW_N:
             subformat = "N bit Delta Width Variable Word";
-            lossy = 1;
+            lossy = TRUE;
             break;
         case SF_FORMAT_DPCM_8:
             subformat = "8 bit differential PCM";
             break;
         case SF_FORMAT_DPCM_16:
             subformat = "16 bit differential PCM";
+            break;
+        default:
+            subformat = NULL;
     }
 
-    codec_gs = g_string_new("");
     if (subformat != NULL)
-        g_string_append_printf(codec_gs, "%s (%s)", format, subformat);
+        codec = g_strdup_printf("%s (%s)", format, subformat);
     else
-        g_string_append_printf(codec_gs, "%s", format);
-    codec = g_strdup(codec_gs->str);
-    g_string_free(codec_gs, TRUE);
+        codec = g_strdup_printf("%s", format);
     aud_tuple_associate_string(ti, FIELD_CODEC, NULL, codec);
-
-    if (lossy != 0)
-        aud_tuple_associate_string(ti, FIELD_QUALITY, NULL, "lossy");
-    else
-        aud_tuple_associate_string(ti, FIELD_QUALITY, NULL, "lossless");
+    g_free(codec);
+    
+    aud_tuple_associate_string(ti, FIELD_QUALITY, NULL, lossy ? "lossy" : "lossless");
 }
 
-static gchar *get_title(char *filename)
+static gchar *
+get_title(gchar *filename)
 {
     Tuple *tuple;
     gchar *title;
@@ -338,19 +342,18 @@
     return title;
 }
 
-static int
-is_our_file (char *filename)
+static gint
+is_our_file (gchar *filename)
 {
     VFSFile *vfsfile = NULL;
     SNDFILE *tmp_sndfile;
     SF_INFO tmp_sfinfo;
 
     /* Have to open the file to see if libsndfile can handle it. */
-    tmp_sndfile = open_sndfile_from_uri(filename, vfsfile, &tmp_sfinfo);
+    tmp_sndfile = open_sndfile_from_uri(filename, &vfsfile, &tmp_sfinfo);
 
-    if (!tmp_sndfile) {
+    if (!tmp_sndfile)
         return FALSE;
-    }
 
     /* It can so close file and return TRUE. */
     close_sndfile (tmp_sndfile, vfsfile);
@@ -362,8 +365,8 @@
 static gpointer
 play_loop (gpointer arg)
 {
-    static short buffer [BUFFER_SIZE];
-    int samples;
+    gshort buffer[BUFFER_SIZE];
+    gint samples;
     InputPlayback *playback = arg;
 
     for (;;)
@@ -387,7 +390,7 @@
             }
 
             playback->pass_audio(playback, FMT_S16_NE, sfinfo.channels, 
-                                 samples * sizeof (short), buffer, &playback->playing);
+                                 samples * sizeof(buffer[0]), buffer, &playback->playing);
         }
         else {
             while(playback->output->buffer_playing()) {
@@ -433,7 +436,7 @@
 play_start (InputPlayback *playback)
 {
     VFSFile *vfsfile = NULL;
-    int pcmbitwidth;
+    gint pcmbitwidth;
     gchar *song_title;
 
     if (sndfile) /* already opened */
@@ -442,7 +445,7 @@
     pcmbitwidth = 32;
     song_title = get_title(playback->filename);
 
-    sndfile = open_sndfile_from_uri(playback->filename, vfsfile, &sfinfo);
+    sndfile = open_sndfile_from_uri(playback->filename, &vfsfile, &sfinfo);
 
     if (!sndfile)
         return;
@@ -450,7 +453,7 @@
     bit_rate = sfinfo.samplerate * pcmbitwidth;
 
     if (sfinfo.samplerate > 0)
-        song_length = (int) ceil (1000.0 * sfinfo.frames / sfinfo.samplerate);
+        song_length = (gint) ceil (1000.0 * sfinfo.frames / sfinfo.samplerate);
     else
         song_length = 0;
 
@@ -498,7 +501,7 @@
 static void
 file_mseek (InputPlayback *playback, gulong millisecond)
 {
-    if (! sfinfo.seekable)
+    if (!sfinfo.seekable)
         return;
 
     seek_time = (glong)millisecond;
@@ -522,7 +525,8 @@
     return ti;
 }
 
-static int is_our_file_from_vfs(char *filename, VFSFile *fin)
+static gint
+is_our_file_from_vfs(gchar *filename, VFSFile *fin)
 {
     SNDFILE *tmp_sndfile;
     SF_INFO tmp_sfinfo;
@@ -540,34 +544,37 @@
     return TRUE;
 }
 
+static GtkWidget *sndfile_about_box = NULL;
+
 static void plugin_about(void)
 {
-    static GtkWidget *box;
-    if (!box)
+    if (!sndfile_about_box)
     {
-        box = audacious_info_dialog(_("About sndfile plugin"),
-                                    _("Adapted for Audacious usage by Tony Vroon <chainsaw@gentoo.org>\n"
-                                      "from the xmms_sndfile plugin which is:\n"
-                                      "Copyright (C) 2000, 2002 Erik de Castro Lopo\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.  \n"
-                                      "See the GNU General Public License for more details. \n\n"
-                                      "You should have received a copy of the GNU General Public \n"
-                                      "License along with this program ; if not, write to \n"
-                                      "the Free Software Foundation, Inc., \n"
-                                      "51 Franklin Street, Fifth Floor, \n"
-                                      "Boston, MA  02110-1301  USA"),
-                                    _("Ok"), FALSE, NULL, NULL);
-        g_signal_connect(G_OBJECT(box), "destroy",
-                         (GCallback)gtk_widget_destroyed, &box);
+        sndfile_about_box = audacious_info_dialog(
+        _("About sndfile plugin"),
+        _("Adapted for Audacious usage by Tony Vroon <chainsaw@gentoo.org>\n"
+        "from the xmms_sndfile plugin which is:\n"
+        "Copyright (C) 2000, 2002 Erik de Castro Lopo\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.  \n"
+        "See the GNU General Public License for more details. \n\n"
+        "You should have received a copy of the GNU General Public \n"
+        "License along with this program ; if not, write to \n"
+        "the Free Software Foundation, Inc., \n"
+        "51 Franklin Street, Fifth Floor, \n"
+        "Boston, MA  02110-1301  USA"),
+        _("Ok"), FALSE, NULL, NULL);
+        g_signal_connect(G_OBJECT(sndfile_about_box), "destroy",
+                         (GCallback)gtk_widget_destroyed, &sndfile_about_box);
     }
 }
 
+
 static gchar *fmts[] = { "aiff", "au", "raw", "wav", NULL };
 
 InputPlugin sndfile_ip = {
--- a/src/sndstretch/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sndstretch/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -9,5 +9,5 @@
 plugindir := ${plugindir}/${EFFECT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${MOWGLI_CFLAGS} ${PANGO_CFLAGS} -I../../intl -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${MONWGLI_LIBS} ${PANGO_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${MOWGLI_CFLAGS}  -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${MOWGLI_LIBS} 
--- a/src/sndstretch/sndstretch_xmms.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sndstretch/sndstretch_xmms.c	Fri Jun 13 05:57:25 2008 +0300
@@ -25,7 +25,6 @@
 #include "FB_logo.xpm"
 
 #include "config.h"
-#include <audacious/configdb.h>
 #include <audacious/plugin.h>
 #include <audacious/i18n.h>
 #include <gtk/gtk.h>
@@ -257,7 +256,7 @@
 
 static gint sndstretch_config_destroy_cb(GtkWidget * w, GdkEventAny * e, gpointer data)
 {
-	ConfigDb *db = aud_cfg_db_open();
+	mcs_handle_t *db = aud_cfg_db_open();
 
 	aud_cfg_db_set_double(db, "sndstretch", "pitch", SS.pitch);
 	aud_cfg_db_set_double(db, "sndstretch", "speed", SS.speed);
@@ -403,7 +402,7 @@
 
 void sndstretch_init(void)
 {
-	ConfigDb *db;
+	mcs_handle_t *db;
 
 	db = aud_cfg_db_open();
 
--- a/src/song_change/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/song_change/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -1,6 +1,6 @@
 PLUGIN = song_change${PLUGIN_SUFFIX}
 
-SRCS = song_change.c
+SRCS = formatter.c song_change.c
 
 include ../../buildsys.mk
 include ../../extra.mk
@@ -8,5 +8,5 @@
 plugindir := ${plugindir}/${GENERAL_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${BEEP_DEFINES} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} -I../../intl -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${BEEP_DEFINES} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS}  -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS} 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/song_change/formatter.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,105 @@
+/*  Audacious
+ *  Copyright (C) 2005-2007  Audacious team
+ *
+ *  XMMS - Cross-platform multimedia player
+ *  Copyright (C) 1998-2003  Peter Alm, Mikael Alm, Olle Hallnas,
+ *                           Thomas Nilsson and 4Front Technologies
+ *  Copyright (C) 1999-2003  Haavard Kvaalen
+ *
+ *  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; under version 3 of the License.
+ *
+ *  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, see <http://www.gnu.org/licenses>.
+ *
+ *  The Audacious team does not consider modular code linking to
+ *  Audacious or using our public API to be a derived work.
+ */
+
+#include "config.h"
+
+#include <glib.h>
+#include <string.h>
+#include "formatter.h"
+
+Formatter *
+formatter_new(void)
+{
+    Formatter *formatter = g_slice_new0(Formatter);
+
+    formatter_associate(formatter, '%', "%");
+    return formatter;
+}
+
+void
+formatter_destroy(Formatter * formatter)
+{
+    int i;
+
+    for (i = 0; i < 256; i++)
+        if (formatter->values[i])
+            g_free(formatter->values[i]);
+
+    g_slice_free(Formatter, formatter);
+}
+
+void
+formatter_associate(Formatter * formatter, const guchar id, const gchar *value)
+{
+    formatter_dissociate(formatter, id);
+    formatter->values[id] = g_strdup(value);
+}
+
+void
+formatter_dissociate(Formatter * formatter, const guchar id)
+{
+    if (formatter->values[id])
+        g_free(formatter->values[id]);
+    formatter->values[id] = 0;
+}
+
+gchar *
+formatter_format(Formatter * formatter, gchar *format)
+{
+    gchar *p, *q, *buffer;
+    gint len;
+
+    for (p = format, len = 0; *p; p++)
+        if (*p == '%') {
+            if (formatter->values[(int) *++p])
+                len += strlen(formatter->values[(int) *p]);
+            else if (!*p) {
+                len += 1;
+                p--;
+            }
+            else
+                len += 2;
+        }
+        else
+            len++;
+    buffer = g_malloc(len + 1);
+    for (p = format, q = buffer; *p; p++)
+        if (*p == '%') {
+            if (formatter->values[(int) *++p]) {
+                g_strlcpy(q, formatter->values[(int) *p], len - 1);
+                q += strlen(q);
+            }
+            else {
+                *q++ = '%';
+                if (*p != '\0')
+                    *q++ = *p;
+                else
+                    p--;
+            }
+        }
+        else
+            *q++ = *p;
+    *q = 0;
+    return buffer;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/song_change/formatter.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,16 @@
+#ifndef FORMATTER_H
+#define FORMATTER_H
+
+#include <glib.h>
+
+typedef struct {
+    gchar *values[256];
+} Formatter;
+
+Formatter *formatter_new(void);
+void formatter_destroy(Formatter * formatter);
+void formatter_associate(Formatter * formatter, const guchar id, const gchar * value);
+void formatter_dissociate(Formatter * formatter, const guchar id);
+gchar *formatter_format(Formatter * formatter, gchar * format);
+
+#endif
--- a/src/song_change/song_change.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/song_change/song_change.c	Fri Jun 13 05:57:25 2008 +0300
@@ -17,12 +17,10 @@
 
 #include <audacious/plugin.h>
 #include <audacious/ui_preferences.h>
-#include <audacious/configdb.h>
 #include <audacious/auddrct.h>
-#include <audacious/formatter.h>
+#include "formatter.h"
 #include <audacious/i18n.h>
 #include <audacious/hook.h>
-#include <audacious/playlist.h>
 
 static void init(void);
 static void cleanup(void);
@@ -99,58 +97,58 @@
 do_command(char *cmd, const char *current_file, int pos)
 {
 	int length, rate, freq, nch;
-	char *str, *shstring = NULL, *temp, numbuf[16];
+	char *str, *shstring = NULL, *temp, numbuf[32];
 	gboolean playing;
 	Formatter *formatter;
 
 	if (cmd && strlen(cmd) > 0)
 	{
-		formatter = aud_formatter_new();
+		formatter = formatter_new();
 		str = audacious_drct_pl_get_title(pos);
 		if (str)
 		{
 			temp = aud_escape_shell_chars(str);
-			aud_formatter_associate(formatter, 's', temp);
-			aud_formatter_associate(formatter, 'n', temp);
+			formatter_associate(formatter, 's', temp);
+			formatter_associate(formatter, 'n', temp);
 			g_free(str);
 			g_free(temp);
 		}
 		else
 		{
-			aud_formatter_associate(formatter, 's', "");
-			aud_formatter_associate(formatter, 'n', "");
+			formatter_associate(formatter, 's', "");
+			formatter_associate(formatter, 'n', "");
 		}
 
 		if (current_file)
 		{
 			temp = aud_escape_shell_chars(current_file);
-			aud_formatter_associate(formatter, 'f', temp);
+			formatter_associate(formatter, 'f', temp);
 			g_free(temp);
 		}
 		else
-			aud_formatter_associate(formatter, 'f', "");
-		sprintf(numbuf, "%02d", pos + 1);
-		aud_formatter_associate(formatter, 't', numbuf);
+			formatter_associate(formatter, 'f', "");
+		g_snprintf(numbuf, sizeof(numbuf), "%02d", pos + 1);
+		formatter_associate(formatter, 't', numbuf);
 		length = audacious_drct_pl_get_time(pos);
 		if (length != -1)
 		{
-			sprintf(numbuf, "%d", length);
-			aud_formatter_associate(formatter, 'l', numbuf);
+			g_snprintf(numbuf, sizeof(numbuf), "%d", length);
+			formatter_associate(formatter, 'l', numbuf);
 		}
 		else
-			aud_formatter_associate(formatter, 'l', "0");
+			formatter_associate(formatter, 'l', "0");
 		audacious_drct_get_info(&rate, &freq, &nch);
-		sprintf(numbuf, "%d", rate);
-		aud_formatter_associate(formatter, 'r', numbuf);
-		sprintf(numbuf, "%d", freq);
-		aud_formatter_associate(formatter, 'F', numbuf);
-		sprintf(numbuf, "%d", nch);
-		aud_formatter_associate(formatter, 'c', numbuf);
+		g_snprintf(numbuf, sizeof(numbuf), "%d", rate);
+		formatter_associate(formatter, 'r', numbuf);
+		g_snprintf(numbuf, sizeof(numbuf), "%d", freq);
+		formatter_associate(formatter, 'F', numbuf);
+		g_snprintf(numbuf, sizeof(numbuf), "%d", nch);
+		formatter_associate(formatter, 'c', numbuf);
 		playing = audacious_drct_get_playing();
-		sprintf(numbuf, "%d", playing);
-		aud_formatter_associate(formatter, 'p', numbuf);
-		shstring = aud_formatter_format(formatter, cmd);
-		aud_formatter_destroy(formatter);
+		g_snprintf(numbuf, sizeof(numbuf), "%d", playing);
+		formatter_associate(formatter, 'p', numbuf);
+		shstring = formatter_format(formatter, cmd);
+		formatter_destroy(formatter);
 
 		if (shstring)
 		{
@@ -163,7 +161,7 @@
 
 static void read_config(void)
 {
-	ConfigDb *db;
+	mcs_handle_t *db;
 
 	db = aud_cfg_db_open();
 	if ( !aud_cfg_db_get_string(db, "song_change", "cmd_line", &cmd_line) )
@@ -207,7 +205,7 @@
 
 static void save_and_close(GtkWidget *w, gpointer data)
 {
-	ConfigDb *db;
+	mcs_handle_t *db;
 	char *cmd, *cmd_after, *cmd_end, *cmd_ttc;
 
 	cmd = g_strdup(gtk_entry_get_text(GTK_ENTRY(cmd_entry)));
@@ -538,8 +536,8 @@
 static void
 songchange_playlist_eof(gpointer unused, gpointer unused2)
 {
-	int pos;
-	char *current_file;
+	gint pos;
+	gchar *current_file;
 
 	pos = audacious_drct_pl_get_pos();
 	current_file = audacious_drct_pl_get_file(pos);
--- a/src/spectrum/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/spectrum/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -8,5 +8,5 @@
 plugindir := ${plugindir}/${VISUALIZATION_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} -I../../intl -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS}  -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS} 
--- a/src/spectrum/spectrum.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/spectrum/spectrum.c	Fri Jun 13 05:57:25 2008 +0300
@@ -24,7 +24,6 @@
 #include <gtk/gtk.h>
 #include <math.h>
 #include <audacious/plugin.h>
-#include <audacious/util.h>
 #include <audacious/i18n.h>
 
 #include "logo.xpm"
--- a/src/statusicon/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/statusicon/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -11,5 +11,5 @@
 plugindir := ${plugindir}/${GENERAL_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${BEEP_DEFINES} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} -I../../intl -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${BEEP_DEFINES} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS}  -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS} 
--- a/src/statusicon/si.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/statusicon/si.c	Fri Jun 13 05:57:25 2008 +0300
@@ -24,7 +24,6 @@
 #include "si_cfg.h"
 #include "si_common.h"
 #include <audacious/auddrct.h>
-#include <audacious/playlist.h>
 
 
 GeneralPlugin *statusicon_gplist[] = { &si_gp, NULL };
--- a/src/statusicon/si_cfg.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/statusicon/si_cfg.c	Fri Jun 13 05:57:25 2008 +0300
@@ -21,7 +21,6 @@
 #include "si_cfg.h"
 #include "si_common.h"
 #include <audacious/plugin.h>
-#include <audacious/configdb.h>
 
 si_cfg_t si_cfg;
 
@@ -29,7 +28,7 @@
 void
 si_cfg_load ( void )
 {
-  ConfigDb *cfgfile = aud_cfg_db_open();
+  mcs_handle_t *cfgfile = aud_cfg_db_open();
 
   if ( !aud_cfg_db_get_int( cfgfile , "statusicon" ,
        "rclick_menu" , &(si_cfg.rclick_menu) ) )
@@ -60,7 +59,7 @@
 void
 si_cfg_save ( void )
 {
-  ConfigDb *cfgfile = aud_cfg_db_open();
+  mcs_handle_t *cfgfile = aud_cfg_db_open();
 
   aud_cfg_db_set_int( cfgfile , "statusicon" ,
     "rclick_menu" , si_cfg.rclick_menu );
--- a/src/statusicon/si_ui.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/statusicon/si_ui.c	Fri Jun 13 05:57:25 2008 +0300
@@ -23,10 +23,8 @@
 #include "si_cfg.h"
 #include "si_common.h"
 #include "gtktrayicon.h"
-#include <audacious/playlist.h>
-#include <audacious/main.h>
 #include <audacious/ui_fileinfopopup.h>
-#include <audacious/util.h>
+#include <audacious/plugin.h>
 #include <audacious/i18n.h>
 #include <glib.h>
 #include <gdk/gdk.h>
--- a/src/stdio/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/stdio/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -8,5 +8,5 @@
 plugindir := ${plugindir}/${TRANSPORT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${DBUS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${ARCH_DEFINES} ${XML_CPPFLAGS} -I../../intl -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${XML_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS}  ${GTK_CFLAGS} ${GLIB_CFLAGS}  ${ARCH_DEFINES} ${XML_CPPFLAGS} -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS}  ${XML_LIBS}
--- a/src/stdio/stdio.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/stdio/stdio.c	Fri Jun 13 05:57:25 2008 +0300
@@ -18,7 +18,6 @@
 
 #include "config.h"
 #include <audacious/plugin.h>
-#include <audacious/strings.h>
 #include <stdio.h>
 
 #include <unistd.h>
--- a/src/stereo_plugin/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/stereo_plugin/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -8,5 +8,5 @@
 plugindir := ${plugindir}/${EFFECT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} -I../../intl -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS}  -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS} 
--- a/src/stereo_plugin/stereo.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/stereo_plugin/stereo.c	Fri Jun 13 05:57:25 2008 +0300
@@ -1,16 +1,14 @@
+#include "config.h"
 #include <gtk/gtk.h>
 #include <audacious/i18n.h>
-#include <audacious/util.h>
+#include <audacious/plugin.h>
 
-#include <audacious/plugin.h>
-#include <audacious/configdb.h>
-
-#include "../../config.h"
 
 static void init(void);
 static void about(void);
 static void configure(void);
 static int mod_samples(gpointer *d, gint length, AFormat afmt, gint srate, gint nch);
+static void query_format(AFormat * fmt, gint * rate, gint * nch);
 
 
 
@@ -20,7 +18,8 @@
 	.init = init,
 	.about = about,
 	.configure = configure,
-	.mod_samples = mod_samples
+	.mod_samples = mod_samples,
+	.query_format = query_format
 };
 
 static const char *about_text = N_("Extra Stereo Plugin\n\n"
@@ -35,7 +34,7 @@
 
 static void init(void)
 {
-	ConfigDb *db;
+	mcs_handle_t *db;
 	db = aud_cfg_db_open();
 	if (!aud_cfg_db_get_double(db, "extra_stereo", "intensity", &value))
 		value = 2.5;
@@ -59,7 +58,7 @@
 
 static void conf_ok_cb(GtkButton * button, gpointer data)
 {
-	ConfigDb *db;
+	mcs_handle_t *db;
 
 	value = *(gdouble *) data;
 	
@@ -142,6 +141,17 @@
 	gtk_widget_show(conf_dialog);
 }
 
+static void query_format(AFormat * fmt, gint * rate, gint * nch)
+{
+	if (!(*fmt == FMT_S16_NE ||
+	      (*fmt == FMT_S16_LE && G_BYTE_ORDER == G_LITTLE_ENDIAN) ||
+	      (*fmt == FMT_S16_BE && G_BYTE_ORDER == G_BIG_ENDIAN)))
+		*fmt = FMT_S16_NE;
+
+	if (*nch != 2)
+		*nch = 2;
+}
+
 static int mod_samples(gpointer *d, gint length, AFormat afmt, gint srate, gint nch)
 {
 	gint i;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/streambrowser/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,14 @@
+PLUGIN = streambrowser${PLUGIN_SUFFIX}
+
+SRCS = streambrowser.c	\
+       streamdir.c \
+       shoutcast.c
+
+include ../../buildsys.mk
+include ../../extra.mk
+
+plugindir := ${plugindir}/${INPUT_PLUGIN_DIR}
+
+CFLAGS += ${PLUGIN_CFLAGS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${XML_CPPFLAGS} ${ARCH_DEFINES} -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${MOWGLI_LIBS} ${XML_LIBS}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/streambrowser/shoutcast.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,101 @@
+
+#include <string.h>
+#include <glib.h>
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+
+#include "streambrowser.h"
+#include "shoutcast.h"
+
+
+static streaminfo_t*		shoutcast_streaminfo_fetch(gchar *station_name, gchar *station_id);
+static category_t*		shoutcast_category_fetch(gchar *category_name);
+
+
+static streaminfo_t *shoutcast_streaminfo_fetch(gchar *station_name, gchar *station_id)
+{
+	gchar url[DEF_STRING_LEN];
+	g_snprintf(url, DEF_STRING_LEN, SHOUTCAST_STREAMINFO_URL, station_id);
+
+	streaminfo_t *streaminfo = streaminfo_new(station_name, url);
+
+	// todo: read the .pls file fetched from the above url
+	
+	return streaminfo;
+}
+
+static category_t *shoutcast_category_fetch(gchar *category_name)
+{
+	category_t *category = category_new(category_name);
+
+	gchar url[DEF_STRING_LEN];
+	g_snprintf(url, DEF_STRING_LEN, SHOUTCAST_CATEGORY_URL, category_name);
+
+	xmlDoc *doc = xmlReadFile(url, NULL, 0);
+	if (doc == NULL) {
+		error("    shoutcast: failed to read \"%s\" category file\n", category_name);
+		return NULL;
+	}
+	
+	debug("    shoutcast: category file fetched\n");
+
+	xmlNode *root_node = xmlDocGetRootElement(doc);
+	xmlNode *node;
+	
+	root_node = root_node->children;
+
+	for (node = root_node; node != NULL; node = node->next) {
+		if (node->type == XML_ELEMENT_NODE && !strcmp((char *) node->name, "station")) {
+			gchar *station_name = (gchar*) xmlGetProp(node, (xmlChar *) "name");
+			gchar *station_id = (gchar*) xmlGetProp(node, (xmlChar *) "id");
+
+			debug("        shoutcast: fetching stream info for name = \"%s\" and id = %s\n", station_name, station_id);
+
+			streaminfo_t *streaminfo = shoutcast_streaminfo_fetch(station_name, station_id);
+			streaminfo_add(category, streaminfo);
+	
+			// todo: debug - print info about streaminfon urls		
+			debug("        shoutcast: stream info added for name = \"%s\" and id = %s\n", station_name, station_id);
+		}
+	}
+	
+	return category;
+}
+
+
+streamdir_t* shoutcast_streamdir_fetch()
+{
+	streamdir_t *streamdir = streamdir_new("Shoutcast");
+	
+	debug("shoutcast: fetching streaming directory file\n");
+
+	// todo: replace dummy filename with SHOUTCAST_DIRECTORY_URL
+	xmlDoc *doc = xmlReadFile("shoutcast.xml", NULL, 0);
+	if (doc == NULL) {
+		error("shoutcast: failed to read stream directory file\n");
+		return NULL;
+	}
+	
+	debug("shoutcast: streaming directory file fetched\n");
+
+	xmlNode *root_node = xmlDocGetRootElement(doc);
+	xmlNode *node;
+	
+	root_node = root_node->children;
+
+	for (node = root_node; node != NULL; node = node->next) {
+		if (node->type == XML_ELEMENT_NODE) {
+			gchar *category_name = (gchar*) xmlGetProp(node, (xmlChar *) "name");
+			
+			debug("    shoutcast: fetching category \"%s\"\n", category_name);
+
+			category_t *category = shoutcast_category_fetch(category_name);
+			category_add(streamdir, category);
+			
+			debug("    shoutcast: added category \"%s\"\n", category_name);
+		}
+	}
+	
+	exit(0);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/streambrowser/shoutcast.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,17 @@
+
+#ifndef SHOUTCAST_H
+#define SHOUTCAST_H
+
+#include "streambrowser.h"
+#include "streamdir.h"
+
+#define SHOUTCAST_STREAMDIR_URL		"http://www.shoutcast.com/sbin/newxml.phtml"
+#define SHOUTCAST_CATEGORY_URL		"http://www.shoutcast.com/sbin/newxml.phtml?genre=%s"
+#define SHOUTCAST_STREAMINFO_URL	"http://www.shoutcast.com/sbin/shoutcast-playlist.pls?rn=%s&file=filename.pls"
+
+
+streamdir_t*			shoutcast_streamdir_fetch();
+
+
+#endif	// SHOUTCAST_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/streambrowser/shoutcast.xml	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding='UTF-8' standalone="yes"?>
+<genrelist>
+<genre name="24h"></genre>
+<genre name="Acid"></genre>
+<genre name="Adult"></genre>
+<genre name="Adulto"></genre>
+<genre name="African"></genre>
+<genre name="Afrikaans"></genre>
+<genre name="Afro"></genre>
+<genre name="Zouk"></genre>
+</genrelist>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/streambrowser/streambrowser.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,100 @@
+
+#include <stdlib.h>
+#include <gtk/gtk.h>
+#include <audacious/plugin.h>
+#include <audacious/ui_plugin_menu.h>
+
+#include "streambrowser.h"
+#include "streamdir.h"
+#include "shoutcast.h"
+
+
+static void			sb_init();
+static void 			sb_about();
+static void 			sb_configure();
+static void 			sb_cleanup();
+
+static void 			menu_click();
+static void 			add_plugin_services_menu_item();
+
+
+static GeneralPlugin sb_plugin = 
+{
+	.description = "Stream Browser",
+	.init = sb_init,
+	.about = sb_about,
+	.configure = sb_configure,
+	.cleanup = sb_cleanup
+};
+
+GeneralPlugin *sb_gplist[] = 
+{
+	&sb_plugin,
+	NULL
+};
+
+SIMPLE_GENERAL_PLUGIN(streambrowser, sb_gplist);
+
+
+void debug(const char *fmt, ...)
+{
+	// todo: replace with config->debug
+	if (TRUE) {
+		va_list ap;
+		fprintf(stderr, "* streambrowser: ");
+		va_start(ap, fmt);
+		vfprintf(stderr, fmt, ap);
+		va_end(ap);
+	}
+}
+
+void error(const char *fmt, ...)
+{
+	va_list ap;
+	fprintf(stderr, "! streambrowser: ");
+	va_start(ap, fmt);
+	vfprintf(stderr, fmt, ap);
+	va_end(ap);
+}
+
+
+static void sb_init()
+{
+	debug("sb_init()\n");
+
+	//shoutcast_streamdir_fetch();	
+}
+
+static void sb_about()
+{
+	debug("sb_about()\n");
+}
+
+static void sb_configure()
+{
+	debug("sb_configure()\n");
+}
+
+static void sb_cleanup()
+{
+	debug("sb_cleanup()\n");
+}
+
+static void menu_click()
+{
+	debug("menu_click()\n");
+}
+
+static void add_plugin_services_menu_item()
+{
+	/*
+	GtkWidget *menu_item;
+
+	menu_item = gtk_image_menu_item_new_with_label("SB Test");
+	gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item), gtk_image_new_from_stock(GTK_STOCK_CDROM, GTK_ICON_SIZE_MENU));
+	gtk_widget_show(menu_item);
+	audacious_menu_plugin_item_add(AUDACIOUS_MENU_PLAYLIST_RCLICK, menu_item);
+	g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(menu_click), NULL);
+	*/
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/streambrowser/streambrowser.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,13 @@
+
+#ifndef STREAMBROWSER_H
+#define STREAMBROWSER_H
+
+#define DEF_STRING_LEN			256
+
+
+void				debug(const char *fmt, ...);
+void				error(const char *fmt, ...);
+
+
+#endif	// STREAMBROWSER_H
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/streambrowser/streamdir.c	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,138 @@
+
+#include <string.h>
+#include <glib.h>
+
+#include "streambrowser.h"
+#include "streamdir.h"
+
+
+streamdir_t* streamdir_new(gchar *name)
+{
+	streamdir_t *streamdir = (streamdir_t*) g_malloc(sizeof(streamdir_t));
+	strncpy(streamdir->name, name, DEF_STRING_LEN);
+	streamdir->category_list = NULL;
+	
+	return streamdir;
+}
+
+void streamdir_delete(streamdir_t *streamdir)
+{
+	GList *iterator;
+	category_t *category;
+
+	for (iterator = g_list_first(streamdir->category_list); iterator != NULL; iterator = g_list_next(streamdir->category_list)) {
+		category = iterator->data;		
+		category_delete(category);
+	}
+
+	g_list_free(streamdir->category_list);
+	g_free(streamdir);
+}
+
+
+category_t* category_new(gchar *name)
+{
+	category_t *category = (category_t*) g_malloc(sizeof(category_t));
+	strncpy(category->name, name, DEF_STRING_LEN);
+	category->streaminfo_list = NULL;
+	
+	return category;
+}
+
+void category_delete(category_t *category)
+{
+	GList *iterator;
+	streaminfo_t *streaminfo;
+	
+	for (iterator = g_list_first(category->streaminfo_list); iterator != NULL; iterator = g_list_next(category->streaminfo_list)) {
+		streaminfo = iterator->data;
+		streaminfo_delete(streaminfo);
+	}
+
+	g_list_free(category->streaminfo_list);
+	g_free(category);
+}
+
+void category_add(streamdir_t *streamdir, category_t *category)
+{
+	streamdir->category_list = g_list_append(streamdir->category_list, category);
+}
+
+void category_remove(streamdir_t *streamdir, category_t *category)
+{
+	streamdir->category_list = g_list_remove(streamdir->category_list, category);
+}
+
+category_t* category_get_by_index(streamdir_t *streamdir, gint index)
+{
+	return (category_t*) g_list_nth_data(streamdir->category_list, index);
+}
+
+category_t* category_get_by_name(streamdir_t *streamdir, gchar *name)
+{
+	GList *iterator;
+	category_t *category;
+	
+	for (iterator = g_list_first(streamdir->category_list); iterator != NULL; iterator = g_list_next(streamdir->category_list)) {
+		category = iterator->data;
+		if (!strncasecmp(category->name, name, DEF_STRING_LEN))
+			return category;
+	}
+	
+	return NULL;
+}
+
+gint category_get_count(streamdir_t *streamdir)
+{
+	return g_list_length(streamdir->category_list);
+}
+
+
+streaminfo_t* streaminfo_new(gchar *name, gchar *url)
+{
+	streaminfo_t *streaminfo = (streaminfo_t*) g_malloc(sizeof(streaminfo_t));
+	strncpy(streaminfo->name, name, DEF_STRING_LEN);
+	strncpy(streaminfo->url, url, DEF_STRING_LEN);
+	
+	return streaminfo;
+}
+
+void streaminfo_delete(streaminfo_t *streaminfo)
+{
+	g_free(streaminfo);
+}
+
+void streaminfo_add(category_t *category, streaminfo_t *streaminfo)
+{
+	category->streaminfo_list = g_list_append(category->streaminfo_list, streaminfo);
+}
+
+void streaminfo_remove(category_t *category, streaminfo_t *streaminfo)
+{
+	category->streaminfo_list = g_list_remove(category->streaminfo_list, streaminfo);
+}
+
+streaminfo_t* streaminfo_get_by_index(category_t *category, gint index)
+{
+	return (streaminfo_t*) g_list_nth_data(category->streaminfo_list, index);
+}
+
+streaminfo_t* streaminfo_get_by_name(category_t *category, gchar *name)
+{
+	GList *iterator;
+	streaminfo_t *streaminfo;
+	
+	for (iterator = g_list_first(category->streaminfo_list); iterator != NULL; iterator = g_list_next(category->streaminfo_list)) {
+		streaminfo = iterator->data;
+		if (!strncasecmp(streaminfo->name, name, DEF_STRING_LEN))
+			return streaminfo;
+	}
+	
+	return NULL;
+}
+
+gint streaminfo_get_count(category_t *category)
+{
+	return g_list_length(category->streaminfo_list);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/streambrowser/streamdir.h	Fri Jun 13 05:57:25 2008 +0300
@@ -0,0 +1,55 @@
+
+#ifndef STREAMDIR_H
+#define STREAMDIR_H
+
+
+#include <glib.h>
+
+#include "streambrowser.h"
+
+
+typedef struct {
+
+	gchar			name[DEF_STRING_LEN];
+	gchar			url[DEF_STRING_LEN];
+
+} streaminfo_t;
+
+typedef struct {
+
+	gchar			name[DEF_STRING_LEN];
+	GList*			streaminfo_list;
+
+} category_t;
+
+typedef struct {
+
+	gchar			name[DEF_STRING_LEN];
+	GList*			category_list;
+
+} streamdir_t;
+
+
+streamdir_t*			streamdir_new(gchar *name);
+void				streamdir_delete(streamdir_t *streamdir);
+
+category_t*			category_new(gchar *name);
+void				category_delete(category_t *category);
+void				category_add(streamdir_t *streamdir, category_t *category);
+void				category_remove(streamdir_t *streamdir, category_t *category);
+category_t*			category_get_by_index(streamdir_t *streamdir, gint index);
+category_t*			category_get_by_name(streamdir_t *streamdir, gchar *name);
+gint				category_get_count(streamdir_t *streamdir);
+
+streaminfo_t*			streaminfo_new(gchar *name, gchar *url);
+void				streaminfo_delete(streaminfo_t *streaminfo);
+void				streaminfo_free(streaminfo_t *streaminfo);
+void				streaminfo_add(category_t *category, streaminfo_t *streaminfo);
+void				streaminfo_remove(category_t *category, streaminfo_t *streaminfo);
+streaminfo_t*			streaminfo_get_by_index(category_t *category, gint index);
+streaminfo_t*			streaminfo_get_by_name(category_t *category, gchar *name);
+gint				streaminfo_get_count(category_t *category);
+
+
+#endif	// STREAMDIR_H
+
--- a/src/sun/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sun/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -13,5 +13,5 @@
 plugindir := ${plugindir}/${OUTPUT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${DBUS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} -I../../intl -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS}  ${GTK_CFLAGS} ${GLIB_CFLAGS}  -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS} 
--- a/src/sun/about.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sun/about.c	Fri Jun 13 05:57:25 2008 +0300
@@ -20,7 +20,6 @@
 #include <glib.h>
 
 #include "sun.h"
-#include <audacious/util.h>
 #include <audacious/i18n.h>
 
 void sun_about(void)
--- a/src/sun/audio.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sun/audio.c	Fri Jun 13 05:57:25 2008 +0300
@@ -20,7 +20,6 @@
 /* FIXME: g_error() is used several places, it will exit xmms */
 
 #include <errno.h>
-#include <audacious/util.h>
 #include "sun.h"
 #include "resample.h"
 
--- a/src/sun/configure.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sun/configure.c	Fri Jun 13 05:57:25 2008 +0300
@@ -22,8 +22,6 @@
 #include <errno.h>
 
 #include "sun.h"
-#include <audacious/util.h>
-#include <audacious/configdb.h>
 #include <audacious/i18n.h>
 
 #include "mixer.h"
@@ -40,7 +38,7 @@
 
 static void configure_win_ok_cb(GtkWidget *w, gpointer data)
 {
-	ConfigDb *cfgfile;
+	mcs_handle_t *cfgfile;
 
 	strcpy(audio.devaudio, gtk_entry_get_text(GTK_ENTRY(adevice_entry)));
 	strcpy(audio.devmixer, gtk_entry_get_text(GTK_ENTRY(mdevice_entry)));
--- a/src/sun/sun.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sun/sun.c	Fri Jun 13 05:57:25 2008 +0300
@@ -20,7 +20,6 @@
 #include <glib.h>
 
 #include "sun.h"
-#include <audacious/configdb.h>
 #include <audacious/i18n.h>
 
 #include <errno.h>
@@ -53,7 +52,7 @@
 
 void sun_init(void)
 {
-	ConfigDb *cfgfile;
+	mcs_handle_t *cfgfile;
 	char *s;
 
 	memset(&audio, 0, sizeof(struct sun_audio));
--- a/src/sun/sun.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/sun/sun.h	Fri Jun 13 05:57:25 2008 +0300
@@ -36,7 +36,6 @@
 #include "audioio.h"
 
 #include <audacious/plugin.h>
-#include <audacious/configdb.h>
 
 /* Default path to audio device. */
 #ifndef SUN_DEV_AUDIO
--- a/src/timidity/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/timidity/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -20,6 +20,6 @@
 
 plugindir := ${plugindir}/${INPUT_PLUGIN_DIR}
 
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${DBUS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} -I../.. -I./libtimidity
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS}  ${GTK_CFLAGS} ${GLIB_CFLAGS}  -I../.. -I./libtimidity
 CFLAGS += ${PLUGIN_CFLAGS}
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${MOWGLI_LIBS}
+LIBS += ${GTK_LIBS} ${GLIB_LIBS}  ${MOWGLI_LIBS}
--- a/src/timidity/xmms-timidity.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/timidity/xmms-timidity.c	Fri Jun 13 05:57:25 2008 +0300
@@ -19,9 +19,6 @@
 
 #include "config.h"
 
-#include <audacious/util.h>
-#include <audacious/configdb.h>
-#include <audacious/main.h>
 #include <glib.h>
 #include <gtk/gtk.h>
 #include <string.h>
@@ -85,7 +82,7 @@
 	*xmmstimid_conf_channels_2;
 
 void xmmstimid_init(void) {
-	ConfigDb *db;
+	mcs_handle_t *db;
 
 	xmmstimid_cfg.config_file = NULL;
 	xmmstimid_cfg.rate = 44100;
@@ -189,7 +186,7 @@
 }
 
 void xmmstimid_conf_ok(GtkButton *button, gpointer user_data) {
-	ConfigDb *db;
+	mcs_handle_t *db;
 
 	if (gtk_toggle_button_get_active(xmmstimid_conf_rate_11000))
 		xmmstimid_cfg.rate = 11000;
--- a/src/tonegen/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/tonegen/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -8,5 +8,5 @@
 plugindir := ${plugindir}/${INPUT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS}  -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS} 
--- a/src/tonegen/tonegen.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/tonegen/tonegen.c	Fri Jun 13 05:57:25 2008 +0300
@@ -20,7 +20,6 @@
 #include "config.h"
 #include <audacious/plugin.h>
 #include <audacious/output.h>
-#include <audacious/util.h>
 #include <audacious/i18n.h>
 #include <glib.h>
 #include <stdlib.h>
--- a/src/tta/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/tta/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -9,6 +9,6 @@
 plugindir := ${plugindir}/${INPUT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${DBUS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} -I../../intl -I../..
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS}  ${GTK_CFLAGS} ${GLIB_CFLAGS}  -I../..
 LDFLAGS += ${AUDLDFLAGS}
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${MOWGLI_LIBS} -laudid3tag
+LIBS += ${GTK_LIBS} ${GLIB_LIBS}  ${MOWGLI_LIBS} -laudid3tag
--- a/src/tta/libtta.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/tta/libtta.c	Fri Jun 13 05:57:25 2008 +0300
@@ -42,10 +42,7 @@
 #include <string.h>
 
 #include <audacious/plugin.h>
-#include <audacious/util.h>
-#include <audacious/main.h>
 #include <audacious/output.h>
-#include <audacious/strings.h>
 #include <audacious/i18n.h>
 #include <audacious/id3tag.h>
 
--- a/src/voice_removal/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/voice_removal/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -8,5 +8,5 @@
 plugindir := ${plugindir}/${EFFECT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} -I../../intl -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS}  -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS} 
--- a/src/voice_removal/voice_removal.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/voice_removal/voice_removal.c	Fri Jun 13 05:57:25 2008 +0300
@@ -28,16 +28,29 @@
 
 static int apply_effect (gpointer *d, gint length, AFormat afmt,
 			gint srate, gint nch);
+static void query_format (AFormat *fmt, gint *rate, gint *nch);
 
 static EffectPlugin xmms_plugin = {
 	.description = "Voice Removal Plugin",
 	.mod_samples = apply_effect,
+	.query_format = query_format
 };
 
 EffectPlugin *voice_eplist[] = { &xmms_plugin, NULL };
 
 DECLARE_PLUGIN(voice_removal, NULL, NULL, NULL, NULL, voice_eplist, NULL, NULL, NULL);
 
+static void query_format (AFormat *fmt, gint *rate, gint *nch)
+{
+	if (!((*fmt == FMT_S16_NE) ||
+		(*fmt == FMT_S16_LE && G_BYTE_ORDER == G_LITTLE_ENDIAN) ||
+		(*fmt == FMT_S16_BE && G_BYTE_ORDER == G_BIG_ENDIAN)))
+		*fmt = FMT_S16_NE;
+
+	if (*nch != 2)
+		*nch = 2;
+}
+
 static int apply_effect (gpointer *d, gint length, AFormat afmt,
 			gint srate, gint nch) {
 	int x;
--- a/src/vorbis/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/vorbis/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -11,5 +11,5 @@
 plugindir := ${plugindir}/${INPUT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${DBUS_CFLAGS} ${OGG_VORBIS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} -I../../intl -I../..
-LIBS += ${OGG_VORBIS_LIBS} ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${MOWGLI_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS}  ${OGG_VORBIS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS}  -I../..
+LIBS += ${OGG_VORBIS_LIBS} ${GTK_LIBS} ${GLIB_LIBS}  ${MOWGLI_LIBS}
--- a/src/vorbis/configure.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/vorbis/configure.c	Fri Jun 13 05:57:25 2008 +0300
@@ -8,8 +8,6 @@
 #include <string.h>
 
 #include <audacious/plugin.h>
-#include <audacious/configdb.h>
-#include <audacious/util.h>
 #include <audacious/i18n.h>
 
 extern GMutex *vf_mutex;
@@ -25,7 +23,7 @@
 static void
 vorbis_configurewin_ok(GtkWidget * widget, gpointer data)
 {
-    ConfigDb *db;
+    mcs_handle_t *db;
     GtkToggleButton *tb;
 
 	if (vorbis_cfg.tag_format != NULL)
--- a/src/vorbis/vcupdate.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/vorbis/vcupdate.c	Fri Jun 13 05:57:25 2008 +0300
@@ -33,8 +33,6 @@
 #include <unistd.h>
 
 #include <audacious/plugin.h>
-#include <audacious/strings.h>
-#include <audacious/util.h>
 #include <audacious/i18n.h>
 
 #include <mowgli.h>
--- a/src/vorbis/vorbis.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/vorbis/vorbis.c	Fri Jun 13 05:57:25 2008 +0300
@@ -54,11 +54,7 @@
 
 #include <audacious/plugin.h>
 #include <audacious/output.h>
-#include <audacious/util.h>
-#include <audacious/configdb.h>
-#include <audacious/main.h>
 #include <audacious/i18n.h>
-#include <audacious/strings.h>
 
 #include "vorbis.h"
 
@@ -707,7 +703,7 @@
 static void
 vorbis_init(void)
 {
-    ConfigDb *db;
+    mcs_handle_t *db;
     gchar *tmp = NULL;
 
     memset(&vorbis_cfg, 0, sizeof(vorbis_config_t));
--- a/src/vtx/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/vtx/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -14,5 +14,5 @@
 plugindir := ${plugindir}/${INPUT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${ARCH_DEFINES} -I../../intl -I../.. -I.
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${MOWGLI_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS}  ${ARCH_DEFINES} -I../.. -I.
+LIBS += ${GTK_LIBS} ${GLIB_LIBS}  ${MOWGLI_LIBS}
--- a/src/vtx/about.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/vtx/about.c	Fri Jun 13 05:57:25 2008 +0300
@@ -1,11 +1,5 @@
 #include <audacious/plugin.h>
-#include <audacious/util.h>
-#include <audacious/plugin.h>
-
 #include <audacious/output.h>
-#include <audacious/util.h>
-#include <audacious/vfs.h>
-#include <audacious/strings.h>
 #include <audacious/i18n.h>
 
 #include <gtk/gtk.h>
--- a/src/vtx/ayemu_vtxfile.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/vtx/ayemu_vtxfile.h	Fri Jun 13 05:57:25 2008 +0300
@@ -3,7 +3,7 @@
 
 #include <glib.h>
 #include <inttypes.h>
-#include <audacious/vfs.h>
+#include <audacious/plugin.h>
 #include "ayemu_8912.h"
 
 /* The following constants and data structure comes from
--- a/src/vtx/info.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/vtx/info.c	Fri Jun 13 05:57:25 2008 +0300
@@ -1,12 +1,7 @@
-#include <audacious/plugin.h>
-#include <audacious/util.h>
-#include <audacious/output.h>
-#include <audacious/vfs.h>
-#include <audacious/strings.h>
-#include <audacious/i18n.h>
-
 #include "ayemu.h"
 #include "vtx.h"
+#include <audacious/output.h>
+#include <audacious/i18n.h>
 
 void vtx_file_info(gchar *filename)
 {
--- a/src/vtx/vtx.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/vtx/vtx.c	Fri Jun 13 05:57:25 2008 +0300
@@ -18,17 +18,11 @@
  */
 
 #include <audacious/plugin.h>
-
 #include <audacious/output.h>
-#include <audacious/util.h>
-#include <audacious/configdb.h>
-#include <audacious/vfs.h>
-#include <audacious/main.h>
-#include <audacious/strings.h>
 #include <audacious/i18n.h>
 
 #include "vtx.h"
-#include <ayemu.h>
+#include "ayemu.h"
 
 extern InputPlugin vtx_ip;
 
@@ -60,7 +54,7 @@
 void
 vtx_init(void)
 {
-        ConfigDb *db;
+        mcs_handle_t *db;
         db = aud_cfg_db_open();
 
         aud_cfg_db_get_int(db, NULL, "src_rate", &freq);
--- a/src/vtx/vtx.h	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/vtx/vtx.h	Fri Jun 13 05:57:25 2008 +0300
@@ -3,8 +3,6 @@
 
 #include <config.h>
 
-#include <pthread.h>
-
 #include <stdlib.h>
 #include <string.h>
 #include <stdio.h>
--- a/src/wavpack/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/wavpack/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -9,7 +9,7 @@
 
 plugindir := ${plugindir}/${INPUT_PLUGIN_DIR}
 
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${DBUS_CFLAGS} ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${WAVPACK_CFLAGS} -I../../intl -I../..
+CPPFLAGS += ${PLUGIN_CPPFLAGS}  ${MOWGLI_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS}  ${WAVPACK_CFLAGS} -I../..
 CXXFLAGS += ${PLUGIN_CFLAGS}
 LDFLAGS += -lstdc++
-LIBS += ${WAVPACK_LIBS} ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${MOWGLI_LIBS}
+LIBS += ${WAVPACK_LIBS} ${GTK_LIBS} ${GLIB_LIBS}  ${MOWGLI_LIBS}
--- a/src/wavpack/libwavpack.cxx	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/wavpack/libwavpack.cxx	Fri Jun 13 05:57:25 2008 +0300
@@ -11,10 +11,6 @@
 #include <wavpack/wavpack.h>
 #include <audacious/plugin.h>
 #include <audacious/output.h>
-#include <audacious/configdb.h>
-#include <audacious/main.h>
-#include <audacious/util.h>
-#include <audacious/vfs.h>
 }
 #include <glib.h>
 #include <gtk/gtk.h>
@@ -86,8 +82,6 @@
     wv_file_info_box,           //info box
     NULL,                       //output
     wv_get_song_tuple,
-    NULL,
-    NULL,
     wv_is_our_fd,
     (gchar **)wv_fmts,
     NULL,			// high precision seeking
@@ -551,7 +545,7 @@
 static void
 wv_load_config()
 {
-    ConfigDb *cfg;
+    mcs_handle_t *cfg;
 
     cfg = aud_cfg_db_open();
 
--- a/src/wavpack/tags.cxx	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/wavpack/tags.cxx	Fri Jun 13 05:57:25 2008 +0300
@@ -4,8 +4,6 @@
 #include <unistd.h>
 #include <fcntl.h>
 #include <wchar.h>
-#include <audacious/util.h>
-#include <audacious/vfs.h>
 #include <audacious/plugin.h>
 #include "tags.h"
 
--- a/src/wavpack/ui.cxx	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/wavpack/ui.cxx	Fri Jun 13 05:57:25 2008 +0300
@@ -9,8 +9,6 @@
 extern "C" {
 #include <wavpack/wavpack.h>
 #include <audacious/plugin.h>
-#include <audacious/configdb.h>
-#include <audacious/util.h>
 #include <audacious/i18n.h>
 }
 #include <glib.h>
@@ -418,7 +416,7 @@
 static void
 wv_configurewin_ok(GtkWidget * widget, gpointer data)
 {
-    ConfigDb *cfg;
+    mcs_handle_t *cfg;
     GtkToggleButton *tb;
 
     tb = GTK_TOGGLE_BUTTON(rg_switch);
--- a/src/wma/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/wma/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -27,5 +27,5 @@
 plugindir := ${plugindir}/${INPUT_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${DBUS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${SIMD_CFLAGS} -I../.. -I./libffwma -std=c99 ${GCC42_CFLAGS} -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_GNU_SOURCE
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS}  ${GTK_CFLAGS} ${GLIB_CFLAGS}  ${SIMD_CFLAGS} -I../.. -I./libffwma -std=c99 ${GCC42_CFLAGS} -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_GNU_SOURCE
+LIBS += ${GTK_LIBS} ${GLIB_LIBS} 
--- a/src/wma/wma.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/wma/wma.c	Fri Jun 13 05:57:25 2008 +0300
@@ -37,10 +37,7 @@
 
 #include <audacious/plugin.h>
 #include <audacious/output.h>
-#include <audacious/util.h>
-#include <audacious/strings.h>
 #include <audacious/i18n.h>
-#include <audacious/main.h>
 
 #include "avcodec.h"
 #include "avformat.h"
--- a/src/xspf/Makefile	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/xspf/Makefile	Fri Jun 13 05:57:25 2008 +0300
@@ -8,5 +8,5 @@
 plugindir := ${plugindir}/${CONTAINER_PLUGIN_DIR}
 
 CFLAGS += ${PLUGIN_CFLAGS}
-CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS} ${DBUS_CFLAGS} ${GTK_CFLAGS} ${GLIB_CFLAGS} ${PANGO_CFLAGS} ${ARCH_DEFINES} ${XML_CPPFLAGS} -I../../intl -I../..
-LIBS += ${GTK_LIBS} ${GLIB_LIBS} ${PANGO_LIBS} ${XML_LIBS}
+CPPFLAGS += ${PLUGIN_CPPFLAGS} ${MOWGLI_CFLAGS}  ${GTK_CFLAGS} ${GLIB_CFLAGS}  ${ARCH_DEFINES} ${XML_CPPFLAGS} -I../..
+LIBS += ${GTK_LIBS} ${GLIB_LIBS}  ${XML_LIBS}
--- a/src/xspf/xspf.c	Fri Jun 13 04:58:39 2008 +0300
+++ b/src/xspf/xspf.c	Fri Jun 13 05:57:25 2008 +0300
@@ -34,11 +34,6 @@
 #include <sys/errno.h>
 
 #include <audacious/plugin.h>
-#include <audacious/main.h>
-#include <audacious/util.h>
-#include <audacious/strings.h>
-#include <audacious/playlist.h>
-#include <audacious/playlist_container.h>
 
 #include <libxml/tree.h>
 #include <libxml/parser.h>
@@ -139,8 +134,10 @@
             if (!xmlStrcmp(nptr->name, (xmlChar *)"location")) {
                 /* Location is a special case */
                 gchar *str = (gchar *)xmlNodeGetContent(nptr);
-
-                location = g_strdup_printf("%s%s", base ? base : "", str);
+                if (!strstr(str, "://") && base)
+                    location = g_strdup_printf("%s/%s", base, str);
+                else
+                    location = g_strdup(str);
                 xmlFree(str);
             } else {
                 /* Rest of the nodes are handled here */
@@ -265,7 +262,7 @@
             
             base = (gchar *)xmlNodeGetBase(doc, nptr);
 
-            AUDDBG("base = %s\n", base);
+            AUDDBG("base #1 = %s\n", base);
             
             // if filename is specified as a base, ignore it.
             tmp = xmlURIUnescapeString(base, -1, NULL);
@@ -277,7 +274,12 @@
                 g_free(tmp);
             }
             
-            AUDDBG("base = %s\n", base);
+            AUDDBG("base #2 = %s\n", base);
+            
+            if (!base)
+                base = g_path_get_dirname(filename);
+            
+            AUDDBG("base #3 = %s\n", base);
             
             for (nptr2 = nptr->children; nptr2 != NULL; nptr2 = nptr2->next) {