[pulseaudio] 01/12: Imported Upstream version 7.99.1

Felipe Sateler fsateler at moszumanska.debian.org
Mon Jan 4 12:32:47 UTC 2016


This is an automated email from the git hooks/post-receive script.

fsateler pushed a commit to branch master
in repository pulseaudio.

commit 26224c1e329384cae77c964d773fe5cecee5226e
Author: Felipe Sateler <fsateler at debian.org>
Date:   Mon Dec 28 11:23:40 2015 -0300

    Imported Upstream version 7.99.1
---
 .gitignore                                         |    2 +
 .tarball-version                                   |    2 +-
 .version                                           |    2 +-
 Makefile.am                                        |    4 +
 Makefile.in                                        |    5 +-
 NEWS                                               |   18 -
 bootstrap.sh                                       |    4 +-
 config.h.in                                        |   12 +-
 configure                                          |   74 +-
 configure.ac                                       |   25 +-
 doxygen/Makefile.in                                |    1 -
 git-version-gen                                    |    5 +-
 man/Makefile.in                                    |    1 -
 man/default.pa.5                                   |    6 +-
 man/default.pa.5.xml.in                            |   19 +-
 man/pulse-client.conf.5                            |    6 +-
 man/pulse-client.conf.5.xml.in                     |   19 +-
 man/pulse-daemon.conf.5                            |    8 +-
 man/pulse-daemon.conf.5.xml.in                     |   25 +-
 po/uk.po                                           |  341 +-
 po/zh_CN.po                                        | 3660 +++++++++++---------
 scripts/benchmark_memory_usage.sh                  |  133 +
 scripts/benchmarks/.gitignore                      |   10 +
 scripts/benchmarks/README                          |    4 +
 scripts/plot_memory_usage.gp                       |   63 +
 src/Makefile.am                                    |   42 +-
 src/Makefile.in                                    |  129 +-
 src/daemon/cmdline.c                               |    2 +-
 src/daemon/daemon-conf.c                           |    4 +-
 src/daemon/main.c                                  |    6 +-
 src/map-file                                       |    3 +
 src/modules/alsa/alsa-mixer.c                      |   25 +-
 src/modules/alsa/alsa-mixer.h                      |    3 +
 src/modules/alsa/alsa-sink.c                       |   17 +-
 src/modules/alsa/alsa-source.c                     |    3 +-
 .../alsa/mixer/paths/analog-input-headset-mic.conf |    3 +
 .../mixer/profile-sets/sb-omni-surround-5.1.conf   |   21 +-
 src/modules/alsa/module-alsa-card.c                |   33 +-
 src/modules/bluetooth/module-bluez4-device.c       |   11 +-
 src/modules/bluetooth/module-bluez5-device.c       |    2 +-
 src/modules/dbus/iface-card-profile.c              |   19 +
 src/modules/dbus/iface-card.c                      |   51 +-
 src/modules/dbus/iface-core.c                      |    4 +-
 src/modules/dbus/iface-device-port.c               |   65 +-
 src/modules/echo-cancel/module-echo-cancel.c       |   18 +-
 src/modules/macosx/module-coreaudio-device.c       |    4 +-
 src/modules/module-always-sink.c                   |    9 +-
 src/modules/module-augment-properties.c            |    2 +-
 src/modules/module-card-restore.c                  |   58 +-
 src/modules/module-loopback.c                      |    5 +
 src/modules/module-rygel-media-server.c            |    2 +-
 src/modules/module-switch-on-port-available.c      |  179 +-
 src/modules/module-udev-detect.c                   |    2 +-
 src/modules/module-zeroconf-publish.c              |    2 +-
 src/modules/rtp/headerlist.c                       |    2 +-
 src/modules/rtp/rtsp_client.c                      |    6 +-
 src/modules/rtp/sdp.c                              |    7 +-
 src/modules/x11/module-x11-publish.c               |    2 +-
 src/pulse/channelmap.c                             |   13 +
 src/pulse/channelmap.h                             |    5 +
 src/pulse/client-conf.c                            |    2 +-
 src/pulse/context.c                                |    6 +-
 src/pulse/proplist.c                               |   14 +-
 src/pulse/pulseaudio.h                             |    9 +
 src/pulse/thread-mainloop.c                        |   16 +-
 src/pulse/version.h                                |    4 +-
 src/pulse/volume.c                                 |  149 +-
 src/pulse/volume.h                                 |   18 +
 src/pulsecore/card.c                               |   46 +-
 src/pulsecore/card.h                               |   15 +-
 src/pulsecore/cli-text.c                           |   18 +-
 src/pulsecore/cli.c                                |    2 +-
 src/pulsecore/client.c                             |    6 +-
 src/pulsecore/client.h                             |    3 +-
 src/pulsecore/conf-parser.c                        |   42 +-
 src/pulsecore/conf-parser.h                        |    8 +-
 src/pulsecore/core-rtclock.h                       |    2 +
 src/pulsecore/core-util.c                          |   52 +-
 src/pulsecore/core.c                               |    2 +-
 src/pulsecore/core.h                               |    3 +-
 src/pulsecore/device-port.c                        |   11 +
 src/pulsecore/device-port.h                        |    5 +-
 src/pulsecore/log.c                                |    9 +
 src/pulsecore/ltdl-helper.c                        |    2 +-
 src/pulsecore/modargs.c                            |    8 +-
 src/pulsecore/module.c                             |    7 +-
 src/pulsecore/module.h                             |    2 +-
 src/pulsecore/packet.c                             |    4 +-
 src/pulsecore/protocol-dbus.c                      |    4 +-
 src/pulsecore/protocol-http.c                      |    2 +-
 src/pulsecore/resampler.c                          |    7 +-
 src/pulsecore/resampler/soxr.c                     |   15 +-
 src/pulsecore/sample-util.h                        |    8 +
 src/pulsecore/sink-input.h                         |    3 +-
 src/pulsecore/sink.c                               |   38 +-
 src/pulsecore/sink.h                               |    4 +-
 src/pulsecore/source-output.h                      |    3 +-
 src/pulsecore/source.c                             |   18 +-
 src/pulsecore/source.h                             |    3 +-
 src/pulsecore/strbuf.c                             |    8 +-
 src/pulsecore/strbuf.h                             |    4 +-
 src/pulsecore/strlist.c                            |    4 +-
 src/pulsecore/strlist.h                            |    2 +-
 src/pulsecore/{strbuf.h => typedefs.h}             |   33 +-
 src/tests/extended-test.c                          |    2 +
 src/tests/memblockq-test.c                         |    4 +-
 src/tests/strlist-test.c                           |    6 +-
 src/tests/sync-playback.c                          |    3 +-
 src/utils/pacmd.c                                  |    2 +-
 109 files changed, 3462 insertions(+), 2384 deletions(-)

diff --git a/.gitignore b/.gitignore
index f41ee72..a0f0995 100644
--- a/.gitignore
+++ b/.gitignore
@@ -34,3 +34,5 @@ missing
 mkinstalldirs
 stamp-*
 .dirstamp
+*.orig
+*.rej
diff --git a/.tarball-version b/.tarball-version
index 0f0fefa..c15ecbd 100644
--- a/.tarball-version
+++ b/.tarball-version
@@ -1 +1 @@
-7.1
+7.99.1
diff --git a/.version b/.version
index 0f0fefa..c15ecbd 100644
--- a/.version
+++ b/.version
@@ -1 +1 @@
-7.1
+7.99.1
diff --git a/Makefile.am b/Makefile.am
index 899ad7b..13bc469 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -27,12 +27,16 @@ EXTRA_DIST = \
 	doxygen/doxygen.conf.in \
 	PROTOCOL \
 	README \
+	scripts/benchmark_memory_usage.sh \
+	scripts/plot_memory_usage.gp \
+	scripts/benchmarks/README \
 	todo \
 	.gitignore \
 	doxygen/.gitignore \
 	m4/.gitignore \
 	man/.gitignore \
 	po/.gitignore \
+	scripts/benchmarks/.gitignore \
 	src/.gitignore \
 	src/daemon/.gitignore \
 	src/pulse/.gitignore
diff --git a/Makefile.in b/Makefile.in
index 09a3705..4319899 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -470,7 +470,6 @@ PREOPEN_MODS = @PREOPEN_MODS@
 PTHREAD_CC = @PTHREAD_CC@
 PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
 PTHREAD_LIBS = @PTHREAD_LIBS@
-PULSE_LOCALEDIR = @PULSE_LOCALEDIR@
 RANLIB = @RANLIB@
 SBC_CFLAGS = @SBC_CFLAGS@
 SBC_LIBS = @SBC_LIBS@
@@ -578,12 +577,16 @@ EXTRA_DIST = \
 	doxygen/doxygen.conf.in \
 	PROTOCOL \
 	README \
+	scripts/benchmark_memory_usage.sh \
+	scripts/plot_memory_usage.gp \
+	scripts/benchmarks/README \
 	todo \
 	.gitignore \
 	doxygen/.gitignore \
 	m4/.gitignore \
 	man/.gitignore \
 	po/.gitignore \
+	scripts/benchmarks/.gitignore \
 	src/.gitignore \
 	src/daemon/.gitignore \
 	src/pulse/.gitignore
diff --git a/NEWS b/NEWS
index d9180a6..c1f2755 100644
--- a/NEWS
+++ b/NEWS
@@ -1,21 +1,3 @@
-PulseAudio 7.1
-
-Changes at a glance:
-
-  * Fix a crasher when using srbchannel
-  * Fix a build system typo that caused symlinks to turn up in /
-  * Make Xonar cards work better
-  * Other minor  bug fixes and improvements
-
-Contributors:
-
-  David Henningsson (4):
-  Felipe Sateler (2):
-  Georg Chini (1):
-  Takashi Iwai (1):
-  Tanu Kaskinen (3):
-
-
 PulseAudio 7.0
 
 Changes at a glance:
diff --git a/bootstrap.sh b/bootstrap.sh
index c9a083c..187abaa 100755
--- a/bootstrap.sh
+++ b/bootstrap.sh
@@ -50,6 +50,6 @@ autopoint --force
 AUTOPOINT='intltoolize --automake --copy' autoreconf --force --install --verbose
 
 if test "x$NOCONFIGURE" = "x"; then
-    CFLAGS="$CFLAGS -g -O0" ./configure --sysconfdir=/etc --localstatedir=/var --enable-force-preopen "$@"
-    make clean
+    CFLAGS="$CFLAGS -g -O0" ./configure --sysconfdir=/etc --localstatedir=/var --enable-force-preopen "$@" && \
+        make clean
 fi
diff --git a/config.h.in b/config.h.in
index 2b48f46..5c9d430 100644
--- a/config.h.in
+++ b/config.h.in
@@ -219,6 +219,9 @@
 /* Define to 1 if you have the <linux/sockios.h> header file. */
 #undef HAVE_LINUX_SOCKIOS_H
 
+/* Define to 1 if you have the <locale.h> header file. */
+#undef HAVE_LOCALE_H
+
 /* Define to 1 if you have the `lrintf' function. */
 #undef HAVE_LRINTF
 
@@ -273,6 +276,9 @@
 /* Have OSS wrapper (padsp)? */
 #undef HAVE_OSS_WRAPPER
 
+/* Define to 1 if you have the `paccept' function. */
+#undef HAVE_PACCEPT
+
 /* Define to 1 if you have the <pcreposix.h> header file. */
 #undef HAVE_PCREPOSIX_H
 
@@ -531,6 +537,9 @@
 /* Have X11? */
 #undef HAVE_X11
 
+/* Define to 1 if you have the <xlocale.h> header file. */
+#undef HAVE_XLOCALE_H
+
 /* Define to 1 if you have the
    </System/Library/Frameworks/CoreServices.framework/Headers/CoreServices.h>
    header file. */
@@ -625,9 +634,6 @@
    your system. */
 #undef PTHREAD_CREATE_JOINABLE
 
-/* Gettext locale dir */
-#undef PULSE_LOCALEDIR
-
 /* If using the C implementation of alloca, define if you know the
    direction of stack growth for your system; otherwise it will be
    automatically deduced at runtime.
diff --git a/configure b/configure
index ff9bb7a..9b0cf9a 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for pulseaudio 7.1.
+# Generated by GNU Autoconf 2.69 for pulseaudio 7.99.1.
 #
 # Report bugs to <pulseaudio-discuss (at) lists (dot) freedesktop (dot) org>.
 #
@@ -590,8 +590,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='pulseaudio'
 PACKAGE_TARNAME='pulseaudio'
-PACKAGE_VERSION='7.1'
-PACKAGE_STRING='pulseaudio 7.1'
+PACKAGE_VERSION='7.99.1'
+PACKAGE_STRING='pulseaudio 7.99.1'
 PACKAGE_BUGREPORT='pulseaudio-discuss (at) lists (dot) freedesktop (dot) org'
 PACKAGE_URL='http://pulseaudio.org/'
 
@@ -890,7 +890,6 @@ OS_IS_WIN32_FALSE
 OS_IS_WIN32_TRUE
 OS_IS_DARWIN_FALSE
 OS_IS_DARWIN_TRUE
-PULSE_LOCALEDIR
 GETTEXT_PACKAGE
 POSUB
 LTLIBINTL
@@ -1741,7 +1740,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures pulseaudio 7.1 to adapt to many kinds of systems.
+\`configure' configures pulseaudio 7.99.1 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1811,7 +1810,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of pulseaudio 7.1:";;
+     short | recursive ) echo "Configuration of pulseaudio 7.99.1:";;
    esac
   cat <<\_ACEOF
 
@@ -2113,7 +2112,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-pulseaudio configure 7.1
+pulseaudio configure 7.99.1
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2703,7 +2702,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by pulseaudio $as_me 7.1, which was
+It was created by pulseaudio $as_me 7.99.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -3017,6 +3016,8 @@ as_fn_append ac_header_list " execinfo.h"
 as_fn_append ac_header_list " langinfo.h"
 as_fn_append ac_header_list " regex.h"
 as_fn_append ac_header_list " pcreposix.h"
+as_fn_append ac_header_list " locale.h"
+as_fn_append ac_header_list " xlocale.h"
 as_fn_append ac_func_list " lrintf"
 as_fn_append ac_func_list " strtof"
 as_fn_append ac_func_list " chmod"
@@ -3054,6 +3055,7 @@ as_fn_append ac_func_list " ctime_r"
 as_fn_append ac_func_list " usleep"
 as_fn_append ac_func_list " strerror_r"
 as_fn_append ac_func_list " lstat"
+as_fn_append ac_func_list " paccept"
 as_fn_append ac_func_list " setresuid"
 as_fn_append ac_func_list " setresgid"
 as_fn_append ac_func_list " setreuid"
@@ -3655,7 +3657,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='pulseaudio'
- VERSION='7.1'
+ VERSION='7.99.1'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -3888,7 +3890,7 @@ PA_PROTOCOL_VERSION=30
 
 # The stable ABI for client applications, for the version info x:y:z
 # always will hold y=z
-LIBPULSE_VERSION_INFO=18:2:18
+LIBPULSE_VERSION_INFO=19:0:19
 
 
 # A simplified, synchronous, ABI-stable interface for client
@@ -8932,25 +8934,6 @@ cat >>confdefs.h <<_ACEOF
 #define GETTEXT_PACKAGE "$GETTEXT_PACKAGE"
 _ACEOF
 
-
-pulselocaledir='${prefix}/${DATADIRNAME}/locale'
-
-  prefix_NONE=
-  exec_prefix_NONE=
-  test "x$prefix" = xNONE && prefix_NONE=yes && prefix=$ac_default_prefix
-  test "x$exec_prefix" = xNONE && exec_prefix_NONE=yes && exec_prefix=$prefix
-  eval ax_define_dir="\"$pulselocaledir\""
-  eval ax_define_dir="\"$ax_define_dir\""
-  PULSE_LOCALEDIR="$ax_define_dir"
-
-
-cat >>confdefs.h <<_ACEOF
-#define PULSE_LOCALEDIR "$ax_define_dir"
-_ACEOF
-
-  test "$prefix_NONE" && prefix=NONE
-  test "$exec_prefix_NONE" && exec_prefix=NONE
-
 else
 # workaround till an intltool m4 bug is fixed upstream
 # (https://bugs.launchpad.net/intltool/+bug/904647)
@@ -8983,6 +8966,10 @@ $as_echo "linux" >&6; }
 $as_echo "freebsd" >&6; }
         host_has_caps=1
     ;;
+    netbsd*)
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: netbsd" >&5
+$as_echo "netbsd" >&6; }
+    ;;
     darwin*)
         { $as_echo "$as_me:${as_lineno-$LINENO}: result: darwin" >&5
 $as_echo "darwin" >&6; }
@@ -9261,7 +9248,7 @@ done
 # so we request the nodelete flag to be enabled.
 # On other systems, we don't really know how to do that, but it's welcome if somebody can tell.
 for flag in -Wl,-z,nodelete; do
-  as_CACHEVAR=`$as_echo "ax_cv_check_ldflags__$flag" | $as_tr_sh`
+  as_CACHEVAR=`$as_echo "ax_cv_check_ldflags_-shared_$flag" | $as_tr_sh`
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the linker accepts $flag" >&5
 $as_echo_n "checking whether the linker accepts $flag... " >&6; }
 if eval \${$as_CACHEVAR+:} false; then :
@@ -9269,7 +9256,7 @@ if eval \${$as_CACHEVAR+:} false; then :
 else
 
   ax_check_save_flags=$LDFLAGS
-  LDFLAGS="$LDFLAGS  $flag"
+  LDFLAGS="$LDFLAGS -shared $flag"
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -9438,6 +9425,11 @@ else
     { $as_echo "$as_me:${as_lineno-$LINENO}: checking architecture for native atomic operations" >&5
 $as_echo_n "checking architecture for native atomic operations... " >&6; }
     case $host in
+        *-netbsd*)
+            { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+            need_libatomic_ops=no
+        ;;
         arm*)
             { $as_echo "$as_me:${as_lineno-$LINENO}: result: arm" >&5
 $as_echo "arm" >&6; }
@@ -9505,11 +9497,6 @@ $as_echo "#define ATOMIC_ARM_INLINE_ASM 1" >>confdefs.h
 fi
             fi
         ;;
-        *-netbsdelf5*)
-            { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-            need_libatomic_ops=no
-        ;;
         *-freebsd*)
             { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
 $as_echo "yes" >&6; }
@@ -20608,6 +20595,11 @@ fi
 
 
 
+
+
+
+
+
  if test "x$ac_cv_header_sys_eventfd_h" = "xyes"; then
   HAVE_SYS_EVENTFD_H_TRUE=
   HAVE_SYS_EVENTFD_H_FALSE='#'
@@ -21234,7 +21226,7 @@ _ACEOF
 
 fi
 
-if test "$ac_cv_tls" == "__thread"; then :
+if test "$ac_cv_tls" = "__thread"; then :
 
 $as_echo "#define SUPPORT_TLS___THREAD 1" >>confdefs.h
 
@@ -21655,7 +21647,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 fi
 
-if test "x$ax_pthread_ok" == "xyes"; then :
+if test "x$ax_pthread_ok" = "xyes"; then :
 
 $as_echo "#define _POSIX_PTHREAD_SEMANTICS 1" >>confdefs.h
 
@@ -22958,6 +22950,8 @@ fi
 
 
 
+
+
 # Non-standard
 
 
@@ -28790,7 +28784,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by pulseaudio $as_me 7.1, which was
+This file was extended by pulseaudio $as_me 7.99.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -28857,7 +28851,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-pulseaudio config.status 7.1
+pulseaudio config.status 7.99.1
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
diff --git a/configure.ac b/configure.ac
index f777223..2dbf7f2 100644
--- a/configure.ac
+++ b/configure.ac
@@ -44,7 +44,7 @@ AC_SUBST(PA_PROTOCOL_VERSION, 30)
 
 # The stable ABI for client applications, for the version info x:y:z
 # always will hold y=z
-AC_SUBST(LIBPULSE_VERSION_INFO, [18:2:18])
+AC_SUBST(LIBPULSE_VERSION_INFO, [19:0:19])
 
 # A simplified, synchronous, ABI-stable interface for client
 # applications, for the version info x:y:z always will hold y=z
@@ -108,9 +108,6 @@ AM_GNU_GETTEXT([external])
 GETTEXT_PACKAGE=pulseaudio
 AC_SUBST([GETTEXT_PACKAGE])
 AC_DEFINE_UNQUOTED([GETTEXT_PACKAGE],["$GETTEXT_PACKAGE"],[Gettext package])
-
-pulselocaledir='${prefix}/${DATADIRNAME}/locale'
-AX_DEFINE_DIR(PULSE_LOCALEDIR, pulselocaledir, [Gettext locale dir])
 else
 # workaround till an intltool m4 bug is fixed upstream
 # (https://bugs.launchpad.net/intltool/+bug/904647)
@@ -140,6 +137,9 @@ case "$host_os" in
         AC_MSG_RESULT([freebsd])
         host_has_caps=1
     ;;
+    netbsd*)
+        AC_MSG_RESULT([netbsd])
+    ;;
     darwin*)
         AC_MSG_RESULT([darwin])
         os_is_darwin=1
@@ -212,7 +212,7 @@ AC_SUBST([IMMEDIATE_LDFLAGS])
 # On ELF systems we don't want the libraries to be unloaded since we don't clean them up properly,
 # so we request the nodelete flag to be enabled.
 # On other systems, we don't really know how to do that, but it's welcome if somebody can tell.
-AX_APPEND_LINK_FLAGS([-Wl,-z,nodelete], [NODELETE_LDFLAGS])
+AX_APPEND_LINK_FLAGS([-Wl,-z,nodelete], [NODELETE_LDFLAGS], [-shared])
 AC_SUBST([NODELETE_LDFLAGS])
 
 # Check for the proper way to build libraries that have no undefined symbols
@@ -260,6 +260,10 @@ else
     # HW specific atomic ops stuff
     AC_MSG_CHECKING([architecture for native atomic operations])
     case $host in
+        *-netbsd*)
+            AC_MSG_RESULT([yes])
+            need_libatomic_ops=no
+        ;;
         arm*)
             AC_MSG_RESULT([arm])
             AC_MSG_CHECKING([whether we can use Linux kernel helpers])
@@ -295,10 +299,6 @@ else
                 ])
             fi
         ;;
-        *-netbsdelf5*)
-            AC_MSG_RESULT([yes])
-            need_libatomic_ops=no
-        ;;
         *-freebsd*)
             AC_MSG_RESULT([yes])
             need_libatomic_ops=no
@@ -447,6 +447,7 @@ AC_CHECK_HEADERS_ONCE([sys/eventfd.h])
 AC_CHECK_HEADERS_ONCE([execinfo.h])
 AC_CHECK_HEADERS_ONCE([langinfo.h])
 AC_CHECK_HEADERS_ONCE([regex.h pcreposix.h])
+AC_CHECK_HEADERS_ONCE([locale.h xlocale.h])
 
 AM_CONDITIONAL(HAVE_SYS_EVENTFD_H, test "x$ac_cv_header_sys_eventfd_h" = "xyes")
 
@@ -488,14 +489,14 @@ AS_IF([test "$pulseaudio_cv__Bool" = "yes"], AC_DEFINE([HAVE_STD_BOOL], 1, [Have
 #### Thread support ####
 
 AX_TLS
-AS_IF([test "$ac_cv_tls" == "__thread"],
+AS_IF([test "$ac_cv_tls" = "__thread"],
     AC_DEFINE([SUPPORT_TLS___THREAD], 1, [Define this if the compiler supports __thread for Thread-Local Storage]))
 
 # Win32 build breaks with win32 pthread installed
 AS_IF([test "x$os_is_win32" != "x1"],
   [AX_PTHREAD])
 
-AS_IF([test "x$ax_pthread_ok" == "xyes"],
+AS_IF([test "x$ax_pthread_ok" = "xyes"],
     AC_DEFINE([_POSIX_PTHREAD_SEMANTICS], 1, [Needed on Solaris]))
 
 
@@ -569,7 +570,7 @@ AC_CHECK_FUNCS_ONCE([ctime_r usleep])
 AC_CHECK_FUNCS_ONCE([strerror_r])
 
 # BSD
-AC_CHECK_FUNCS_ONCE([lstat])
+AC_CHECK_FUNCS_ONCE([lstat paccept])
 
 # Non-standard
 AC_CHECK_FUNCS_ONCE([setresuid setresgid setreuid setregid seteuid setegid ppoll strsignal sig2str strtod_l pipe2 accept4])
diff --git a/doxygen/Makefile.in b/doxygen/Makefile.in
index 01d6eb8..63db5e4 100644
--- a/doxygen/Makefile.in
+++ b/doxygen/Makefile.in
@@ -334,7 +334,6 @@ PREOPEN_MODS = @PREOPEN_MODS@
 PTHREAD_CC = @PTHREAD_CC@
 PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
 PTHREAD_LIBS = @PTHREAD_LIBS@
-PULSE_LOCALEDIR = @PULSE_LOCALEDIR@
 RANLIB = @RANLIB@
 SBC_CFLAGS = @SBC_CFLAGS@
 SBC_LIBS = @SBC_LIBS@
diff --git a/git-version-gen b/git-version-gen
index 7546884..079b93e 100755
--- a/git-version-gen
+++ b/git-version-gen
@@ -84,7 +84,10 @@ then
     v=`cat $tarball_version_file` || exit 1
     case $v in
 	*$nl*) v= ;; # reject multi-line output
-	[0-9]*) ;;
+	[0-9]*)
+		echo "$v" | tr -d '\012'
+		exit 0
+		;;
 	*) v= ;;
     esac
     test -z "$v" \
diff --git a/man/Makefile.in b/man/Makefile.in
index a54d153..c210d08 100644
--- a/man/Makefile.in
+++ b/man/Makefile.in
@@ -381,7 +381,6 @@ PREOPEN_MODS = @PREOPEN_MODS@
 PTHREAD_CC = @PTHREAD_CC@
 PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
 PTHREAD_LIBS = @PTHREAD_LIBS@
-PULSE_LOCALEDIR = @PULSE_LOCALEDIR@
 RANLIB = @RANLIB@
 SBC_CFLAGS = @SBC_CFLAGS@
 SBC_LIBS = @SBC_LIBS@
diff --git a/man/default.pa.5 b/man/default.pa.5
index 76ba8d6..37e3250 100644
--- a/man/default.pa.5
+++ b/man/default.pa.5
@@ -5,11 +5,13 @@ default.pa \- PulseAudio Sound Server Startup Script
 \fB\fI~/.config/pulse/default.pa\fB
 
 \fI/etc/pulse/default.pa\fB
+
+\fI/etc/pulse/system.pa\fB
 \f1
 .SH DESCRIPTION
-The PulseAudio sound server interprets the file \fI~/.config/pulse/default.pa\f1 on startup, and when that file doesn't exist \fI/etc/pulse/default.pa\f1. It should contain directives in the PulseAudio CLI language, as documented in \fBpulse-cli-syntax(5)\f1.
+The PulseAudio sound server interprets a configuration script on startup, which is mainly used to define the set of modules to load. When PulseAudio runs in the per-user mode and \fI~/.config/pulse/default.pa\f1 exists, that file is used. When PulseAudio runs in the per-user mode and that file doesn't exist, \fI/etc/pulse/default.pa\f1 is used. When PulseAudio runs as a system service, \fI/etc/pulse/system.pa\f1 is used.
 
-The same commands can also be entered during runtime in the \fBpacmd(1)\f1 tool, allowing flexible runtime reconfiguration.
+The script should contain directives in the PulseAudio CLI language, as documented in \fBpulse-cli-syntax(5)\f1.
 .SH AUTHORS
 The PulseAudio Developers <pulseaudio-discuss (at) lists (dot) freedesktop (dot) org>; PulseAudio is available from \fBhttp://pulseaudio.org/\f1
 .SH SEE ALSO
diff --git a/man/default.pa.5.xml.in b/man/default.pa.5.xml.in
index 306e976..38bb725 100644
--- a/man/default.pa.5.xml.in
+++ b/man/default.pa.5.xml.in
@@ -23,19 +23,22 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
 
   <synopsis>
     <p><file>~/.config/pulse/default.pa</file></p>
-
     <p><file>@PA_DEFAULT_CONFIG_DIR@/default.pa</file></p>
+    <p><file>@PA_DEFAULT_CONFIG_DIR@/system.pa</file></p>
   </synopsis>
 
   <description>
-    <p>The PulseAudio sound server interprets the file
-    <file>~/.config/pulse/default.pa</file> on startup, and when that file
-    doesn't exist <file>@PA_DEFAULT_CONFIG_DIR@/default.pa</file>. It
-    should contain directives in the PulseAudio CLI language, as
+    <p>The PulseAudio sound server interprets a configuration script on
+    startup, which is mainly used to define the set of modules to load. When
+    PulseAudio runs in the per-user mode and
+    <file>~/.config/pulse/default.pa</file> exists, that file is used. When
+    PulseAudio runs in the per-user mode and that file doesn't exist,
+    <file>@PA_DEFAULT_CONFIG_DIR@/default.pa</file> is used. When PulseAudio
+    runs as a system service, <file>@PA_DEFAULT_CONFIG_DIR@/system.pa</file> is
+    used.</p>
+
+    <p>The script should contain directives in the PulseAudio CLI language, as
     documented in <manref name="pulse-cli-syntax" section="5"/>.</p>
-
-    <p>The same commands can also be entered during runtime in the <manref name="pacmd"
-      section="1"/> tool, allowing flexible runtime reconfiguration.</p>
   </description>
 
   <section name="Authors">
diff --git a/man/pulse-client.conf.5 b/man/pulse-client.conf.5
index 0d88270..8b8a959 100644
--- a/man/pulse-client.conf.5
+++ b/man/pulse-client.conf.5
@@ -4,10 +4,14 @@ pulse-client.conf \- PulseAudio client configuration file
 .SH SYNOPSIS
 \fB\fI~/.config/pulse/client.conf\fB
 
+\fI~/.config/pulse/client.conf.d/*.conf\fB
+
 \fI/etc/pulse/client.conf\fB
+
+\fI/etc/pulse/client.conf.d/*.conf\fB
 \f1
 .SH DESCRIPTION
-The PulseAudio client library reads configuration directives from a file \fI~/.config/pulse/client.conf\f1 on startup and when that file doesn't exist from \fI/etc/pulse/client.conf\f1.
+The PulseAudio client library reads configuration directives from a configuration file on startup. If the per-user file \fI~/.config/pulse/client.conf\f1 exists, it is used, otherwise the system configuration file \fI/etc/pulse/client.conf\f1 is used. In addition to those main files, configuration directives can also be put in files under directories \fI~/.config/pulse/client.conf.d/\f1 and \fI/etc/pulse/client.conf.d/\f1. Those files have to have the .conf file name extension, but other [...]
 
 The configuration file is a simple collection of variable declarations. If the configuration file parser encounters either ; or # it ignores the rest of the line until its end.
 
diff --git a/man/pulse-client.conf.5.xml.in b/man/pulse-client.conf.5.xml.in
index 1002dbe..cca2219 100644
--- a/man/pulse-client.conf.5.xml.in
+++ b/man/pulse-client.conf.5.xml.in
@@ -23,15 +23,26 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
 
   <synopsis>
     <p><file>~/.config/pulse/client.conf</file></p>
-
+    <p><file>~/.config/pulse/client.conf.d/*.conf</file></p>
     <p><file>@PA_DEFAULT_CONFIG_DIR@/client.conf</file></p>
+    <p><file>@PA_DEFAULT_CONFIG_DIR@/client.conf.d/*.conf</file></p>
   </synopsis>
 
   <description>
     <p>The PulseAudio client library reads configuration directives from
-    a file <file>~/.config/pulse/client.conf</file> on startup and when that
-    file doesn't exist from
-    <file>@PA_DEFAULT_CONFIG_DIR@/client.conf</file>.</p>
+    a configuration file on startup. If the per-user file
+    <file>~/.config/pulse/client.conf</file> exists, it is used, otherwise the
+    system configuration file <file>@PA_DEFAULT_CONFIG_DIR@/client.conf</file>
+    is used. In addition to those main files, configuration directives can also
+    be put in files under directories
+    <file>~/.config/pulse/client.conf.d/</file> and
+    <file>@PA_DEFAULT_CONFIG_DIR@/client.conf.d/</file>. Those files have to
+    have the .conf file name extension, but otherwise the file names can be
+    chosen freely. The files under client.conf.d are processed in alphabetical
+    order. In case the same option is set in multiple files, the last file to
+    set an option overrides earlier files. The main client.conf file is
+    processed first, so options set in files under client.conf.d override the
+    main file.</p>
 
     <p>The configuration file is a simple collection of variable
     declarations. If the configuration file parser encounters either ;
diff --git a/man/pulse-daemon.conf.5 b/man/pulse-daemon.conf.5
index dee1789..1bac86d 100644
--- a/man/pulse-daemon.conf.5
+++ b/man/pulse-daemon.conf.5
@@ -4,10 +4,16 @@ pulse-daemon.conf \- PulseAudio daemon configuration file
 .SH SYNOPSIS
 \fB\fI~/.config/pulse/daemon.conf\fB
 
+\fI~/.config/pulse/daemon.conf.d/*.conf\fB
+
 \fI/etc/pulse/daemon.conf\fB
+
+\fI/etc/pulse/daemon.conf.d/*.conf\fB
 \f1
 .SH DESCRIPTION
-The PulseAudio sound server reads configuration directives from a file \fI~/.config/pulse/daemon.conf\f1 on startup and when that file doesn't exist from \fI/etc/pulse/daemon.conf\f1. Please note that the server also reads a configuration script on startup \fIdefault.pa\f1 which also contains runtime configuration directives.
+The PulseAudio sound server reads configuration directives from a configuration file on startup. If the per-user file \fI~/.config/pulse/daemon.conf\f1 exists, it is used, otherwise the system configuration file \fI/etc/pulse/daemon.conf\f1 is used. In addition to those main files, configuration directives can also be put in files under directories \fI~/.config/pulse/daemon.conf.d/\f1 and \fI/etc/pulse/daemon.conf.d/\f1. Those files have to have the .conf file name extension, but otherwi [...]
+
+Please note that the server also reads a configuration script on startup. See \fBdefault.pa(5)\f1.
 
 The configuration file is a simple collection of variable declarations. If the configuration file parser encounters either ; or # it ignores the rest of the line until its end.
 
diff --git a/man/pulse-daemon.conf.5.xml.in b/man/pulse-daemon.conf.5.xml.in
index d221585..0367b1f 100644
--- a/man/pulse-daemon.conf.5.xml.in
+++ b/man/pulse-daemon.conf.5.xml.in
@@ -23,18 +23,29 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
 
   <synopsis>
     <p><file>~/.config/pulse/daemon.conf</file></p>
-
+    <p><file>~/.config/pulse/daemon.conf.d/*.conf</file></p>
     <p><file>@PA_DEFAULT_CONFIG_DIR@/daemon.conf</file></p>
+    <p><file>@PA_DEFAULT_CONFIG_DIR@/daemon.conf.d/*.conf</file></p>
   </synopsis>
 
   <description>
     <p>The PulseAudio sound server reads configuration directives from
-    a file <file>~/.config/pulse/daemon.conf</file> on startup and when that
-    file doesn't exist from
-    <file>@PA_DEFAULT_CONFIG_DIR@/daemon.conf</file>. Please note that the
-    server also reads a configuration script on startup
-    <file>default.pa</file> which also contains runtime configuration
-    directives.</p>
+    a configuration file on startup. If the per-user file
+    <file>~/.config/pulse/daemon.conf</file> exists, it is used, otherwise the
+    system configuration file <file>@PA_DEFAULT_CONFIG_DIR@/daemon.conf</file>
+    is used. In addition to those main files, configuration directives can also
+    be put in files under directories
+    <file>~/.config/pulse/daemon.conf.d/</file> and
+    <file>@PA_DEFAULT_CONFIG_DIR@/daemon.conf.d/</file>. Those files have to
+    have the .conf file name extension, but otherwise the file names can be
+    chosen freely. The files under daemon.conf.d are processed in alphabetical
+    order. In case the same option is set in multiple files, the last file to
+    set an option overrides earlier files. The main daemon.conf file is
+    processed first, so options set in files under daemon.conf.d override the
+    main file.</p>
+
+    <p>Please note that the server also reads a configuration script on
+    startup. See <manref name="default.pa" section="5"/>.</p>
 
     <p>The configuration file is a simple collection of variable
     declarations. If the configuration file parser encounters either ;
diff --git a/po/uk.po b/po/uk.po
index 16b026b..fed7685 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -7,8 +7,8 @@ msgstr ""
 "Project-Id-Version: pulseaudio.master-tx\n"
 "Report-Msgid-Bugs-To: https://bugs.freedesktop.org/enter_bug.cgi?"
 "product=PulseAudio&keywords=I18N+L10N&component=misc\n"
-"POT-Creation-Date: 2015-04-10 23:07+0000\n"
-"PO-Revision-Date: 2015-04-20 15:53+0300\n"
+"POT-Creation-Date: 2015-09-12 15:47+0000\n"
+"PO-Revision-Date: 2015-12-20 13:34+0200\n"
 "Last-Translator: Yuri Chornoivan <yurchor at ukr.net>\n"
 "Language-Team: Ukrainian <translation at linux.org.ua>\n"
 "Language: uk\n"
@@ -489,25 +489,29 @@ msgstr ""
 "Виконуємо докладнішу діагностику."
 
 #: ../src/daemon/main.c:712
-msgid "Running in system mode, but --disallow-exit not set!"
+#| msgid "Running in system mode, but --disallow-exit not set!"
+msgid "Running in system mode, but --disallow-exit not set."
 msgstr ""
-"Запуск у загальносистемному режимі, але не встановлено --disallow-exit!"
+"Запуск у загальносистемному режимі, але не встановлено --disallow-exit."
 
 #: ../src/daemon/main.c:715
-msgid "Running in system mode, but --disallow-module-loading not set!"
+#| msgid "Running in system mode, but --disallow-module-loading not set!"
+msgid "Running in system mode, but --disallow-module-loading not set."
 msgstr ""
 "Запуск у загальносистемному режимі, але не встановлено --disallow-module-"
-"loading!"
+"loading."
 
 #: ../src/daemon/main.c:718
-msgid "Running in system mode, forcibly disabling SHM mode!"
-msgstr "Запуск у загальносистемному режимі, примусове вимикання режиму SHM!"
+#| msgid "Running in system mode, forcibly disabling SHM mode!"
+msgid "Running in system mode, forcibly disabling SHM mode."
+msgstr "Запуск у загальносистемному режимі, примусове вимикання режиму SHM."
 
 #: ../src/daemon/main.c:723
-msgid "Running in system mode, forcibly disabling exit idle time!"
+#| msgid "Running in system mode, forcibly disabling exit idle time!"
+msgid "Running in system mode, forcibly disabling exit idle time."
 msgstr ""
 "Запуск у загальносистемному режимі, примусове вимикання режиму параметрів "
-"часу виходу за відсутності активності!"
+"часу виходу, якщо немає активності."
 
 #: ../src/daemon/main.c:756
 msgid "Failed to acquire stdio."
@@ -585,277 +589,302 @@ msgstr "Звукова система PulseAudio"
 msgid "Start the PulseAudio Sound System"
 msgstr "Запустити звукову систему PulseAudio"
 
-#: ../src/modules/alsa/alsa-mixer.c:2291
+#: ../src/modules/alsa/alsa-mixer.c:2394
 msgid "Input"
 msgstr "Вхід"
 
-#: ../src/modules/alsa/alsa-mixer.c:2292
+#: ../src/modules/alsa/alsa-mixer.c:2395
 msgid "Docking Station Input"
 msgstr "Вхідний канал док-станції"
 
-#: ../src/modules/alsa/alsa-mixer.c:2293
+#: ../src/modules/alsa/alsa-mixer.c:2396
 msgid "Docking Station Microphone"
 msgstr "Мікрофон док-станції"
 
-#: ../src/modules/alsa/alsa-mixer.c:2294
+#: ../src/modules/alsa/alsa-mixer.c:2397
 msgid "Docking Station Line In"
 msgstr "Лінійний вхід док-станції"
 
-#: ../src/modules/alsa/alsa-mixer.c:2295 ../src/modules/alsa/alsa-mixer.c:2380
+#: ../src/modules/alsa/alsa-mixer.c:2398 ../src/modules/alsa/alsa-mixer.c:2483
 msgid "Line In"
 msgstr "Лінійний вхід"
 
-#: ../src/modules/alsa/alsa-mixer.c:2296 ../src/modules/alsa/alsa-mixer.c:2374
+#: ../src/modules/alsa/alsa-mixer.c:2399 ../src/modules/alsa/alsa-mixer.c:2477
 #: ../src/modules/bluetooth/module-bluez4-device.c:2102
 #: ../src/modules/bluetooth/module-bluez5-device.c:1710
 msgid "Microphone"
 msgstr "Мікрофон"
 
-#: ../src/modules/alsa/alsa-mixer.c:2297 ../src/modules/alsa/alsa-mixer.c:2375
+#: ../src/modules/alsa/alsa-mixer.c:2400 ../src/modules/alsa/alsa-mixer.c:2478
 msgid "Front Microphone"
 msgstr "Передній мікрофон"
 
-#: ../src/modules/alsa/alsa-mixer.c:2298 ../src/modules/alsa/alsa-mixer.c:2376
+#: ../src/modules/alsa/alsa-mixer.c:2401 ../src/modules/alsa/alsa-mixer.c:2479
 msgid "Rear Microphone"
 msgstr "Задній мікрофон"
 
-#: ../src/modules/alsa/alsa-mixer.c:2299
+#: ../src/modules/alsa/alsa-mixer.c:2402
 msgid "External Microphone"
 msgstr "Зовнішній мікрофон"
 
-#: ../src/modules/alsa/alsa-mixer.c:2300 ../src/modules/alsa/alsa-mixer.c:2378
+#: ../src/modules/alsa/alsa-mixer.c:2403 ../src/modules/alsa/alsa-mixer.c:2481
 msgid "Internal Microphone"
 msgstr "Вбудований мікрофон"
 
-#: ../src/modules/alsa/alsa-mixer.c:2301 ../src/modules/alsa/alsa-mixer.c:2381
+#: ../src/modules/alsa/alsa-mixer.c:2404 ../src/modules/alsa/alsa-mixer.c:2484
 msgid "Radio"
 msgstr "Радіо"
 
-#: ../src/modules/alsa/alsa-mixer.c:2302 ../src/modules/alsa/alsa-mixer.c:2382
+#: ../src/modules/alsa/alsa-mixer.c:2405 ../src/modules/alsa/alsa-mixer.c:2485
 msgid "Video"
 msgstr "Відео"
 
-#: ../src/modules/alsa/alsa-mixer.c:2303
+#: ../src/modules/alsa/alsa-mixer.c:2406
 msgid "Automatic Gain Control"
 msgstr "Автоматичне керування підсиленням"
 
-#: ../src/modules/alsa/alsa-mixer.c:2304
+#: ../src/modules/alsa/alsa-mixer.c:2407
 msgid "No Automatic Gain Control"
 msgstr "Без автоматичного керування підсиленням"
 
-#: ../src/modules/alsa/alsa-mixer.c:2305
+#: ../src/modules/alsa/alsa-mixer.c:2408
 msgid "Boost"
 msgstr "Підсилення"
 
-#: ../src/modules/alsa/alsa-mixer.c:2306
+#: ../src/modules/alsa/alsa-mixer.c:2409
 msgid "No Boost"
 msgstr "Без пісилення"
 
-#: ../src/modules/alsa/alsa-mixer.c:2307
+#: ../src/modules/alsa/alsa-mixer.c:2410
 msgid "Amplifier"
 msgstr "Підсилювач"
 
-#: ../src/modules/alsa/alsa-mixer.c:2308
+#: ../src/modules/alsa/alsa-mixer.c:2411
 msgid "No Amplifier"
 msgstr "Без підсилювача"
 
-#: ../src/modules/alsa/alsa-mixer.c:2309
+#: ../src/modules/alsa/alsa-mixer.c:2412
 msgid "Bass Boost"
 msgstr "Підсилення басів"
 
-#: ../src/modules/alsa/alsa-mixer.c:2310
+#: ../src/modules/alsa/alsa-mixer.c:2413
 msgid "No Bass Boost"
 msgstr "Без підсилення"
 
-#: ../src/modules/alsa/alsa-mixer.c:2311
+#: ../src/modules/alsa/alsa-mixer.c:2414
 #: ../src/modules/bluetooth/module-bluez4-device.c:2107
 #: ../src/modules/bluetooth/module-bluez5-device.c:1717
 msgid "Speaker"
 msgstr "Гучномовець"
 
-#: ../src/modules/alsa/alsa-mixer.c:2312 ../src/modules/alsa/alsa-mixer.c:2384
+#: ../src/modules/alsa/alsa-mixer.c:2415 ../src/modules/alsa/alsa-mixer.c:2487
 msgid "Headphones"
 msgstr "Аналогові навушники"
 
-#: ../src/modules/alsa/alsa-mixer.c:2373
+#: ../src/modules/alsa/alsa-mixer.c:2476
 msgid "Analog Input"
 msgstr "Аналогових вхід"
 
-#: ../src/modules/alsa/alsa-mixer.c:2377
+#: ../src/modules/alsa/alsa-mixer.c:2480
 msgid "Dock Microphone"
 msgstr "Мікрофон стикувальної станції"
 
-#: ../src/modules/alsa/alsa-mixer.c:2379
+#: ../src/modules/alsa/alsa-mixer.c:2482
 msgid "Headset Microphone"
 msgstr "Мікрофон гарнітури"
 
-#: ../src/modules/alsa/alsa-mixer.c:2383
+#: ../src/modules/alsa/alsa-mixer.c:2486
 msgid "Analog Output"
 msgstr "Аналогове відтворення"
 
-#: ../src/modules/alsa/alsa-mixer.c:2385
+#: ../src/modules/alsa/alsa-mixer.c:2488
 msgid "LFE on Separate Mono Output"
 msgstr "Аналоговий вихід (сабвуфер)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2386
+#: ../src/modules/alsa/alsa-mixer.c:2489
 msgid "Line Out"
 msgstr "Лінійний вихід"
 
-#: ../src/modules/alsa/alsa-mixer.c:2387
+#: ../src/modules/alsa/alsa-mixer.c:2490
 msgid "Analog Mono Output"
 msgstr "Аналоговий моно-вихід"
 
-#: ../src/modules/alsa/alsa-mixer.c:2388
+#: ../src/modules/alsa/alsa-mixer.c:2491
 msgid "Speakers"
 msgstr "Гучномовці"
 
-#: ../src/modules/alsa/alsa-mixer.c:2389
+#: ../src/modules/alsa/alsa-mixer.c:2492
 msgid "HDMI / DisplayPort"
 msgstr "HDMI / DisplayPort"
 
-#: ../src/modules/alsa/alsa-mixer.c:2390
+#: ../src/modules/alsa/alsa-mixer.c:2493
 msgid "Digital Output (S/PDIF)"
 msgstr "Цифровий вихід (S/PDIF)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2391
+#: ../src/modules/alsa/alsa-mixer.c:2494
 msgid "Digital Input (S/PDIF)"
 msgstr "Цифровий вхід (S/PDIF)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2392
+#: ../src/modules/alsa/alsa-mixer.c:2495
 msgid "Digital Passthrough (S/PDIF)"
 msgstr "Цифрове передавання (S/PDIF)"
 
-#: ../src/modules/alsa/alsa-mixer.c:2393
-#| msgid "Multichannel"
+#: ../src/modules/alsa/alsa-mixer.c:2496
 msgid "Multichannel Input"
 msgstr "Багатоканальний вхід"
 
-#: ../src/modules/alsa/alsa-mixer.c:2394
-#| msgid "Multichannel"
+#: ../src/modules/alsa/alsa-mixer.c:2497
 msgid "Multichannel Output"
 msgstr "Багатоканальний вихід"
 
-#: ../src/modules/alsa/alsa-mixer.c:3900
+#: ../src/modules/alsa/alsa-mixer.c:4003
 msgid "Analog Mono"
 msgstr "Аналогове моно"
 
-#: ../src/modules/alsa/alsa-mixer.c:3901
+#. Note: Not translated to "Analog Stereo Input", because the source
+#. * name gets "Input" appended to it automatically, so adding "Input"
+#. * here would lead to the source name to become "Analog Stereo Input
+#. * Input". The same logic applies to analog-stereo-output,
+#. * multichannel-input and multichannel-output.
+#: ../src/modules/alsa/alsa-mixer.c:4004 ../src/modules/alsa/alsa-mixer.c:4010
+#: ../src/modules/alsa/alsa-mixer.c:4011
 msgid "Analog Stereo"
 msgstr "Аналогове стерео"
 
-#. Note: Not translated to "Multichannel Input" - then the source name would be "Multichannel Input Input".
-#. Same for multichannel-output.
-#: ../src/modules/alsa/alsa-mixer.c:3904 ../src/modules/alsa/alsa-mixer.c:3905
+#: ../src/modules/alsa/alsa-mixer.c:4012 ../src/modules/alsa/alsa-mixer.c:4013
 msgid "Multichannel"
 msgstr "Багатоканальний"
 
-#: ../src/modules/alsa/alsa-mixer.c:3906
+#: ../src/modules/alsa/alsa-mixer.c:4014
 msgid "Analog Surround 2.1"
 msgstr "Аналоговий об'ємний 2.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:3907
+#: ../src/modules/alsa/alsa-mixer.c:4015
 msgid "Analog Surround 3.0"
 msgstr "Аналоговий об'ємний 3.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:3908
+#: ../src/modules/alsa/alsa-mixer.c:4016
 msgid "Analog Surround 3.1"
 msgstr "Аналоговий об'ємний 3.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:3909
+#: ../src/modules/alsa/alsa-mixer.c:4017
 msgid "Analog Surround 4.0"
 msgstr "Аналоговий об'ємний 4.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:3910
+#: ../src/modules/alsa/alsa-mixer.c:4018
 msgid "Analog Surround 4.1"
 msgstr "Аналоговий об'ємний 4.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:3911
+#: ../src/modules/alsa/alsa-mixer.c:4019
 msgid "Analog Surround 5.0"
 msgstr "Аналоговий об'ємний 5.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:3912
+#: ../src/modules/alsa/alsa-mixer.c:4020
 msgid "Analog Surround 5.1"
 msgstr "Аналоговий об'ємний 5.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:3913
+#: ../src/modules/alsa/alsa-mixer.c:4021
 msgid "Analog Surround 6.0"
 msgstr "Аналоговий об'ємний 6.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:3914
+#: ../src/modules/alsa/alsa-mixer.c:4022
 msgid "Analog Surround 6.1"
 msgstr "Аналоговий об'ємний 6.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:3915
+#: ../src/modules/alsa/alsa-mixer.c:4023
 msgid "Analog Surround 7.0"
 msgstr "Аналоговий об'ємний 7.0"
 
-#: ../src/modules/alsa/alsa-mixer.c:3916
+#: ../src/modules/alsa/alsa-mixer.c:4024
 msgid "Analog Surround 7.1"
 msgstr "Аналоговий об'ємний 7.1"
 
-#: ../src/modules/alsa/alsa-mixer.c:3917
+#: ../src/modules/alsa/alsa-mixer.c:4025
 msgid "Digital Stereo (IEC958)"
 msgstr "Цифрове стерео (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:3918
+#: ../src/modules/alsa/alsa-mixer.c:4026
 msgid "Digital Passthrough  (IEC958)"
 msgstr "Цифрове передавання (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:3919
+#: ../src/modules/alsa/alsa-mixer.c:4027
 msgid "Digital Surround 4.0 (IEC958/AC3)"
 msgstr "Цифровий об’ємний 4.0 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:3920
+#: ../src/modules/alsa/alsa-mixer.c:4028
 msgid "Digital Surround 5.1 (IEC958/AC3)"
 msgstr "Цифровий об’ємний 5.1 (IEC958/AC3)"
 
-#: ../src/modules/alsa/alsa-mixer.c:3921
+#: ../src/modules/alsa/alsa-mixer.c:4029
 msgid "Digital Surround 5.1 (IEC958/DTS)"
 msgstr "Цифровий об’ємний 5.1 (IEC958/DTS)"
 
-#: ../src/modules/alsa/alsa-mixer.c:3922
+#: ../src/modules/alsa/alsa-mixer.c:4030
 msgid "Digital Stereo (HDMI)"
 msgstr "Цифровий стерео (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:3923
+#: ../src/modules/alsa/alsa-mixer.c:4031
 msgid "Digital Surround 5.1 (HDMI)"
 msgstr "Цифровий об’ємний 5.1 (HDMI)"
 
-#: ../src/modules/alsa/alsa-mixer.c:4054
+#: ../src/modules/alsa/alsa-mixer.c:4162
 msgid "Analog Mono Duplex"
 msgstr "Аналогове двобічне моно"
 
-#: ../src/modules/alsa/alsa-mixer.c:4055
+#: ../src/modules/alsa/alsa-mixer.c:4163
 msgid "Analog Stereo Duplex"
 msgstr "Аналогове двобічне стерео"
 
-#: ../src/modules/alsa/alsa-mixer.c:4056
+#: ../src/modules/alsa/alsa-mixer.c:4164
 msgid "Digital Stereo Duplex (IEC958)"
 msgstr "Цифрове двобічне стерео (IEC958)"
 
-#: ../src/modules/alsa/alsa-mixer.c:4057
-#| msgid "Multichannel"
+#: ../src/modules/alsa/alsa-mixer.c:4165
 msgid "Multichannel Duplex"
 msgstr "Багатоканальний двобічний"
 
-#: ../src/modules/alsa/alsa-mixer.c:4058
+#: ../src/modules/alsa/alsa-mixer.c:4166
 #: ../src/modules/alsa/module-alsa-card.c:184
 #: ../src/modules/bluetooth/module-bluez4-device.c:2298
 #: ../src/modules/bluetooth/module-bluez5-device.c:1941
 msgid "Off"
 msgstr "Вимкнено"
 
-#: ../src/modules/alsa/alsa-mixer.c:4157
+#: ../src/modules/alsa/alsa-mixer.c:4265
 #, c-format
 msgid "%s Output"
 msgstr "вихід %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:4165
+#: ../src/modules/alsa/alsa-mixer.c:4273
 #, c-format
 msgid "%s Input"
 msgstr "вхід %s"
 
-#: ../src/modules/alsa/alsa-sink.c:570 ../src/modules/alsa/alsa-sink.c:747
+#: ../src/modules/alsa/alsa-sink.c:570
+#, c-format
+#| msgid ""
+#| "ALSA woke us up to write new data to the device, but there was actually "
+#| "nothing to write!\n"
+#| "Most likely this is a bug in the ALSA driver '%s'. Please report this "
+#| "issue to the ALSA developers.\n"
+#| "We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() "
+#| "returned 0 or another value < min_avail."
+msgid ""
+"ALSA woke us up to write new data to the device, but there was actually "
+"nothing to write.\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers.\n"
+"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() "
+"returned 0 or another value < min_avail."
+msgstr ""
+"ALSA викликала службу запису нових даних на пристрій, але насправді ніяких "
+"даних для запису не виявлено!\n"
+"Ймовірно, це пов’язано з вадою у драйвері ALSA «%s». Будь ласка, повідомте "
+"про цю ваду розробникам ALSA.\n"
+"Службу було викликано зі встановленим POLLOUT, але наступний виклик "
+"snd_pcm_avail() повернув 0 або інше значення < min_avail."
+
+#: ../src/modules/alsa/alsa-sink.c:747
 #, c-format
 msgid ""
 "ALSA woke us up to write new data to the device, but there was actually "
@@ -872,7 +901,31 @@ msgstr ""
 "Службу було викликано зі встановленим POLLOUT, але наступний виклик "
 "snd_pcm_avail() повернув 0 або інше значення < min_avail."
 
-#: ../src/modules/alsa/alsa-source.c:529 ../src/modules/alsa/alsa-source.c:680
+#: ../src/modules/alsa/alsa-source.c:529
+#, c-format
+#| msgid ""
+#| "ALSA woke us up to read new data from the device, but there was actually "
+#| "nothing to read!\n"
+#| "Most likely this is a bug in the ALSA driver '%s'. Please report this "
+#| "issue to the ALSA developers.\n"
+#| "We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() "
+#| "returned 0 or another value < min_avail."
+msgid ""
+"ALSA woke us up to read new data from the device, but there was actually "
+"nothing to read.\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers.\n"
+"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() "
+"returned 0 or another value < min_avail."
+msgstr ""
+"ALSA викликала службу читання нових даних з пристрою, але насправді ніяких "
+"даних для читання не виявлено!\n"
+"Ймовірно, це пов’язано з вадою у драйвері ALSA «%s». Будь ласка, повідомте "
+"про цю ваду розробникам ALSA.\n"
+"Службу було викликано зі встановленим POLLIN, але наступний виклик "
+"snd_pcm_avail() повернув 0 або інше значення < min_avail."
+
+#: ../src/modules/alsa/alsa-source.c:680
 #, c-format
 msgid ""
 "ALSA woke us up to read new data from the device, but there was actually "
@@ -1057,7 +1110,7 @@ msgstr ""
 "Завжди підтримувати принаймні один завантажений приймач, навіть якщо він "
 "буде нульовим"
 
-#: ../src/modules/module-always-sink.c:80
+#: ../src/modules/module-always-sink.c:83
 msgid "Dummy Output"
 msgstr "Тестове відтворення"
 
@@ -1444,7 +1497,7 @@ msgstr "двобічний"
 msgid "invalid"
 msgstr "некоректний"
 
-#: ../src/pulsecore/core-util.c:1822
+#: ../src/pulsecore/core-util.c:1833
 #, c-format
 msgid ""
 "XDG_RUNTIME_DIR (%s) is not owned by us (uid %d), but by uid %d! (This could "
@@ -1457,11 +1510,11 @@ msgstr ""
 "root, від імені користувача root за допомогою вбудованого протоколу. Не "
 "робіть так.)"
 
-#: ../src/pulsecore/core-util.h:93
+#: ../src/pulsecore/core-util.h:97
 msgid "yes"
 msgstr "так"
 
-#: ../src/pulsecore/core-util.h:93
+#: ../src/pulsecore/core-util.h:97
 msgid "no"
 msgstr "ні"
 
@@ -1486,11 +1539,11 @@ msgstr ""
 msgid "Invalid log target."
 msgstr "Некоректна адреса файла журналу."
 
-#: ../src/pulsecore/sink.c:3429
+#: ../src/pulsecore/sink.c:3436
 msgid "Built-in Audio"
 msgstr "Вбудоване аудіо"
 
-#: ../src/pulsecore/sink.c:3434
+#: ../src/pulsecore/sink.c:3441
 msgid "Modem"
 msgstr "Модем"
 
@@ -1686,7 +1739,7 @@ msgstr ""
 "Перелік можливих значень способів зміни частоти можна отримати за допомогою "
 "параметра --dump-resample-methods.\n"
 
-#: ../src/tests/resampler-test.c:355
+#: ../src/tests/resampler-test.c:353
 #, c-format
 msgid "%s %s\n"
 msgstr "%s %s\n"
@@ -1806,10 +1859,11 @@ msgid "Cork request stack is empty: uncorking stream"
 msgstr "Стос запитів щодо блокування порожній: розблоковуємо потік"
 
 #: ../src/utils/pacat.c:441
-msgid "Warning: Received more uncork requests than cork requests!"
+#| msgid "Warning: Received more uncork requests than cork requests!"
+msgid "Warning: Received more uncork requests than cork requests."
 msgstr ""
 "Попередження: отримано більше запитів щодо розблокування, ніж запитів щодо "
-"блокування!"
+"блокування."
 
 #: ../src/utils/pacat.c:466
 #, c-format
@@ -1871,70 +1925,6 @@ msgstr "Помилка pa_stream_update_timing_info(): %s"
 
 #: ../src/utils/pacat.c:671
 #, c-format
-#| msgid ""
-#| "%s [options]\n"
-#| "\n"
-#| "  -h, --help                            Show this help\n"
-#| "      --version                         Show version\n"
-#| "\n"
-#| "  -r, --record                          Create a connection for "
-#| "recording\n"
-#| "  -p, --playback                        Create a connection for playback\n"
-#| "\n"
-#| "  -v, --verbose                         Enable verbose operations\n"
-#| "\n"
-#| "  -s, --server=SERVER                   The name of the server to connect "
-#| "to\n"
-#| "  -d, --device=DEVICE                   The name of the sink/source to "
-#| "connect to\n"
-#| "  -n, --client-name=NAME                How to call this client on the "
-#| "server\n"
-#| "      --stream-name=NAME                How to call this stream on the "
-#| "server\n"
-#| "      --volume=VOLUME                   Specify the initial (linear) "
-#| "volume in range 0...65536\n"
-#| "      --rate=SAMPLERATE                 The sample rate in Hz (defaults "
-#| "to 44100)\n"
-#| "      --format=SAMPLEFORMAT             The sample type, one of s16le, "
-#| "s16be, u8, float32le,\n"
-#| "                                        float32be, ulaw, alaw, s32le, "
-#| "s32be, s24le, s24be,\n"
-#| "                                        s24-32le, s24-32be (defaults to "
-#| "s16ne)\n"
-#| "      --channels=CHANNELS               The number of channels, 1 for "
-#| "mono, 2 for stereo\n"
-#| "                                        (defaults to 2)\n"
-#| "      --channel-map=CHANNELMAP          Channel map to use instead of the "
-#| "default\n"
-#| "      --fix-format                      Take the sample format from the "
-#| "sink/source the stream is\n"
-#| "                                        being connected to.\n"
-#| "      --fix-rate                        Take the sampling rate from the "
-#| "sink/source the stream is\n"
-#| "                                        being connected to.\n"
-#| "      --fix-channels                    Take the number of channels and "
-#| "the channel map\n"
-#| "                                        from the sink/source the stream "
-#| "is being connected to.\n"
-#| "      --no-remix                        Don't upmix or downmix channels.\n"
-#| "      --no-remap                        Map channels by index instead of "
-#| "name.\n"
-#| "      --latency=BYTES                   Request the specified latency in "
-#| "bytes.\n"
-#| "      --process-time=BYTES              Request the specified process "
-#| "time per request in bytes.\n"
-#| "      --latency-msec=MSEC               Request the specified latency in "
-#| "msec.\n"
-#| "      --process-time-msec=MSEC          Request the specified process "
-#| "time per request in msec.\n"
-#| "      --property=PROPERTY=VALUE         Set the specified property to the "
-#| "specified value.\n"
-#| "      --raw                             Record/play raw PCM data.\n"
-#| "      --passthrough                     Passthrough data.\n"
-#| "      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
-#| "      --list-file-formats               List available file formats.\n"
-#| "      --monitor-stream=INDEX            Record from the sink input with "
-#| "index INDEX.\n"
 msgid ""
 "%s [options]\n"
 "%s\n"
@@ -2081,8 +2071,8 @@ msgid ""
 "Capture audio data from a PulseAudio sound server and write it to STDOUT or "
 "the specified file."
 msgstr ""
-"Захопити звукові дані зі звукового сервера PulseAudio і записати їх до STDOUT "
-"або вказаного файла."
+"Захопити звукові дані зі звукового сервера PulseAudio і записати їх до "
+"STDOUT або вказаного файла."
 
 #: ../src/utils/pacat.c:800
 msgid ""
@@ -2318,7 +2308,8 @@ msgid "TARGET"
 msgstr "ПРИЗНАЧЕННЯ"
 
 #: ../src/utils/pacmd.c:76
-msgid "NUMERIC LEVEL"
+#| msgid "NUMERIC LEVEL"
+msgid "NUMERIC-LEVEL"
 msgstr "ЧИСЛОВИЙ РІВЕНЬ"
 
 #: ../src/utils/pacmd.c:79
@@ -2635,6 +2626,11 @@ msgstr ""
 msgid "\tProfiles:\n"
 msgstr "\tПрофілі:\n"
 
+#: ../src/utils/pactl.c:581
+#, c-format
+msgid "\t\t%s: %s (sinks: %u, sources: %u, priority: %u, available: %s)\n"
+msgstr "\t\t%s: %s (приймачів: %u, джерел: %u, пріоритет: %u, доступно: %s)\n"
+
 #: ../src/utils/pactl.c:586
 #, c-format
 msgid "\tActive Profile: %s\n"
@@ -3080,9 +3076,12 @@ msgid "Invalid source output index"
 msgstr "Некоректний номер джерела відтворення"
 
 #: ../src/utils/pactl.c:1956
-msgid "You have to specify a sink name/index and a mute boolean"
+#| msgid "You have to specify a sink name/index and a mute boolean"
+msgid ""
+"You have to specify a sink name/index and a mute action (0, 1, or 'toggle')"
 msgstr ""
-"Вам слід вказати назву/номер приймача і булеве значення вимикання звуку"
+"Вам слід вказати назву/номер приймача і значення вимикання звуку (0, 1 або "
+"«toggle»)"
 
 #: ../src/utils/pactl.c:1961 ../src/utils/pactl.c:1976
 #: ../src/utils/pactl.c:1996 ../src/utils/pactl.c:2014
@@ -3090,23 +3089,33 @@ msgid "Invalid mute specification"
 msgstr "Некоректна специфікація вимикання звуку"
 
 #: ../src/utils/pactl.c:1971
-msgid "You have to specify a source name/index and a mute boolean"
-msgstr "Вам слід вказати назву/номер джерела і булеве значення вимикання звуку"
+#| msgid "You have to specify a source name/index and a mute boolean"
+msgid ""
+"You have to specify a source name/index and a mute action (0, 1, or 'toggle')"
+msgstr ""
+"Вам слід вказати назву/номер джерела і значення вимикання звуку (0, 1 або "
+"«toggle»)"
 
 #: ../src/utils/pactl.c:1986
-msgid "You have to specify a sink input index and a mute boolean"
+#| msgid "You have to specify a sink input index and a mute boolean"
+msgid ""
+"You have to specify a sink input index and a mute action (0, 1, or 'toggle')"
 msgstr ""
-"Вам слід вказати номер вхідного каналу приймача даних і булеве значення "
-"вимикання звуку"
+"Вам слід вказати індекс входу приймача і значення вимикання звуку (0, 1 або "
+"«toggle»)"
 
 #: ../src/utils/pactl.c:1991
 msgid "Invalid sink input index specification"
 msgstr "Некоректна специфікація номера вхідного каналу приймача даних"
 
 #: ../src/utils/pactl.c:2004
-msgid "You have to specify a source output index and a mute boolean"
+#| msgid "You have to specify a source output index and a mute boolean"
+msgid ""
+"You have to specify a source output index and a mute action (0, 1, or "
+"'toggle')"
 msgstr ""
-"Вам слід вказати номер джерела відтворення і булеве значення вимикання звуку"
+"Вам слід вказати індекс виходу джерела і значення вимикання звуку (0, 1 або "
+"«toggle»)"
 
 #: ../src/utils/pactl.c:2009
 msgid "Invalid source output index specification"
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 0ad658e..2753c0b 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -1,449 +1,29 @@
-# translation of pulseaudio.master-tx.po to Simplified Chinese
-# 简体中文翻译
-# Copyright (C) 2008 THE 'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the  package.
-# 闫丰刚 (sainry)<sainry at gmail.com> 2008
-#
-#
-# 闫丰刚 <sainry at gmail.com>, 2009.
+# Simplified Chinese translation for PulseAudio.
+# Copyright (C) 2008 PULSEAUDIO COPYRIGHT HOLDER
+# This file is distributed under the same license as the pulseaudio package.
+# 闫丰刚 <sainry at gmail.com>, 2008, 2009.
 # Leah Liu <lliu at redhat.com>, 2009, 2012.
+# Cheng-Chia Tseng <pswo10680 at gmail.com>, 2010, 2012.
+# Frank Hill <hxf.prc at gmail.com>, 2015.
+# Mingye Wang (Arthur2e5) <arthur200126 at gmail.com>, 2015.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio.master-tx\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-01-30 10:10+0000\n"
-"PO-Revision-Date: 2012-01-30 09:56+0000\n"
-"Last-Translator: Leah Liu <lliu at redhat.com>\n"
-"Language-Team: Simplified Chinese <zh at li.org>\n"
-"Language: \n"
+"Report-Msgid-Bugs-To: https://bugs.freedesktop.org/enter_bug.cgi?"
+"product=PulseAudio&keywords=I18N+L10N&component=misc\n"
+"POT-Creation-Date: 2015-11-17 14:10+0000\n"
+"PO-Revision-Date: 2015-11-10 13:13-0500\n"
+"Last-Translator: Mingye Wang (Arthur2e5) <arthur200126 at gmail.com>\n"
+"Language-Team: Chinese (Simplified, GNOME) <i18n-zh at googlegroups.com>\n"
+"Language: zh_CN\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: KBabel 1.11.4\n"
-
-#: ../src/modules/alsa/alsa-util.c:1136 ../src/modules/alsa/alsa-util.c:1204
-#, c-format
-msgid ""
-"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
-"ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers."
-msgstr ""
-"snd_pcm_avail() 返回的值非常大:%lu 字节(%lu ms)。\n"
-"很可能是 ALSA 驱动程序 '%s' 中的 bug。请向 ALSA 开发者举报这个问题。"
-
-#: ../src/modules/alsa/alsa-util.c:1179
-#, c-format
-msgid ""
-"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s"
-"%lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers."
-msgstr ""
-"snd_pcm_delay() 返回的值非常大:%li 字节(%s%lu ms)。\n"
-"很可能是 ALSA 驱动程序 '%s' 中的 bug。请向 ALSA 开发者举报这个问题。"
-
-#: ../src/modules/alsa/alsa-util.c:1220
-#, fuzzy, c-format
-msgid ""
-"snd_pcm_avail_delay() returned strange values: delay %lu is less than avail "
-"%lu.\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers."
-msgstr ""
-"snd_pcm_avail() 返回的值非常大:%lu 字节(%lu ms)。\n"
-"很可能是 ALSA 驱动程序 '%s' 中的 bug。请向 ALSA 开发者举报这个问题。"
-
-#: ../src/modules/alsa/alsa-util.c:1263
-#, c-format
-msgid ""
-"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
-"(%lu ms).\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers."
-msgstr ""
-"snd_pcm_mmap_begin() 返回的值非常大:%lu 字节(%lu ms)。\n"
-"很可能是 ALSA 驱动程序 '%s' 中的 bug。请向 ALSA 开发者举报这个问题。"
-
-#: ../src/modules/module-always-sink.c:38
-msgid "Always keeps at least one sink loaded even if it's a null one"
-msgstr "总是保持至少载入一个漏,即使它是空的"
-
-#: ../src/modules/module-always-sink.c:82
-msgid "Dummy Output"
-msgstr "假输出"
-
-#: ../src/modules/module-ladspa-sink.c:48
-msgid "Virtual LADSPA sink"
-msgstr "虚拟 LDASPA 漏"
-
-#: ../src/modules/module-ladspa-sink.c:52
-#, fuzzy
-msgid ""
-"sink_name=<name for the sink> sink_properties=<properties for the sink> "
-"master=<name of sink to filter> format=<sample format> rate=<sample rate> "
-"channels=<number of channels> channel_map=<input channel map> plugin=<ladspa "
-"plugin name> label=<ladspa plugin label> control=<comma separated list of "
-"input control values> input_ladspaport_map=<comma separated list of input "
-"LADSPA port names> output_ladspaport_map=<comma separated list of output "
-"LADSPA port names> "
-msgstr ""
-"sink_name=<name for the sink> sink_properties=<properties for the sink> "
-"master=<name of sink to filter> format=<sample format> rate=<sample rate> "
-"channels=<number of channels> channel_map=<channel map> plugin=<ladspa "
-"plugin name> label=<ladspa plugin label> control=<comma separated list of "
-"input control values>"
-
-#: ../src/modules/module-null-sink.c:49
-msgid "Clocked NULL sink"
-msgstr "定时的空漏"
-
-#: ../src/modules/module-null-sink.c:284
-msgid "Null Output"
-msgstr "空输出"
-
-#: ../src/pulsecore/sink.c:3349
-msgid "Built-in Audio"
-msgstr "内部音频"
-
-#: ../src/pulsecore/sink.c:3354
-msgid "Modem"
-msgstr "调制解调器"
-
-#: ../src/daemon/ltdl-bind-now.c:127
-msgid "Failed to find original lt_dlopen loader."
-msgstr "查找原始 lt_dlopen 加载器失败。"
-
-#: ../src/daemon/ltdl-bind-now.c:132
-msgid "Failed to allocate new dl loader."
-msgstr "分配新的 dl 加载器失败。"
-
-#: ../src/daemon/ltdl-bind-now.c:145
-msgid "Failed to add bind-now-loader."
-msgstr "添加 bind-now-loader 失败。"
-
-#: ../src/daemon/main.c:139
-#, c-format
-msgid "Got signal %s."
-msgstr "获得信号%s"
-
-#: ../src/daemon/main.c:166
-msgid "Exiting."
-msgstr "退出"
-
-#: ../src/daemon/main.c:184
-#, c-format
-msgid "Failed to find user '%s'."
-msgstr "找不到用户 `%s' "
-
-#: ../src/daemon/main.c:189
-#, c-format
-msgid "Failed to find group '%s'."
-msgstr "找不到用户组 `%s'"
-
-#: ../src/daemon/main.c:193
-#, c-format
-msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
-msgstr "发现用户'%s' (UID %lu)和组'%s' (GID %lu)."
-
-#: ../src/daemon/main.c:198
-#, c-format
-msgid "GID of user '%s' and of group '%s' don't match."
-msgstr "用户'%s'与组'%s'的GID不匹配."
-
-#: ../src/daemon/main.c:203
-#, c-format
-msgid "Home directory of user '%s' is not '%s', ignoring."
-msgstr "用户'%s'的主文件夹不是'%s',忽略。"
-
-#: ../src/daemon/main.c:206 ../src/daemon/main.c:211
-#, c-format
-msgid "Failed to create '%s': %s"
-msgstr "创建'%s'失败: %s"
-
-#: ../src/daemon/main.c:218
-#, c-format
-msgid "Failed to change group list: %s"
-msgstr "更改组列表失败:%s"
-
-#: ../src/daemon/main.c:234
-#, c-format
-msgid "Failed to change GID: %s"
-msgstr "更改GID失败:%s"
-
-#: ../src/daemon/main.c:250
-#, c-format
-msgid "Failed to change UID: %s"
-msgstr "更改UID失败:%s"
-
-#: ../src/daemon/main.c:269
-msgid "Successfully dropped root privileges."
-msgstr "成功放弃root权限。"
-
-#: ../src/daemon/main.c:277
-msgid "System wide mode unsupported on this platform."
-msgstr "此平台不支持system-wide模式。"
-
-#: ../src/daemon/main.c:295
-#, c-format
-msgid "setrlimit(%s, (%u, %u)) failed: %s"
-msgstr "setrlimit(%s, (%u, %u)) 失败:%s"
-
-#: ../src/daemon/main.c:496
-msgid "Failed to parse command line."
-msgstr "分析命令行失败。"
+"X-Generator: Poedit 1.8.6\n"
 
-#: ../src/daemon/main.c:529
-msgid ""
-"System mode refused for non-root user. Only starting the D-Bus server lookup "
-"service."
-msgstr ""
-
-#: ../src/daemon/main.c:611
-msgid "Daemon not running"
-msgstr "后台程序没有运行"
-
-#: ../src/daemon/main.c:613
-#, c-format
-msgid "Daemon running as PID %u"
-msgstr "后台程序正在运行,PID %u"
-
-#: ../src/daemon/main.c:628
-#, c-format
-msgid "Failed to kill daemon: %s"
-msgstr "杀死后台程序失败:%s"
-
-#: ../src/daemon/main.c:657
-msgid ""
-"This program is not intended to be run as root (unless --system is "
-"specified)."
-msgstr "不应以root身份运行本程序(除非指定 --system)。"
-
-#: ../src/daemon/main.c:660
-msgid "Root privileges required."
-msgstr "需要 root 权限。"
-
-#: ../src/daemon/main.c:667
-msgid "--start not supported for system instances."
-msgstr "系统实例不支持 --start。"
-
-#: ../src/daemon/main.c:707
-#, c-format
-msgid "User-configured server at %s, refusing to start/autospawn."
-msgstr ""
-
-#: ../src/daemon/main.c:713
-#, c-format
-msgid ""
-"User-configured server at %s, which appears to be local. Probing deeper."
-msgstr ""
-
-#: ../src/daemon/main.c:718
-msgid "Running in system mode, but --disallow-exit not set!"
-msgstr "正在以系统模式运行,但是 --disallow-exit 未设定!"
-
-#: ../src/daemon/main.c:721
-msgid "Running in system mode, but --disallow-module-loading not set!"
-msgstr "正在以系统模式运行,但是 --disallow-module-loading 未设定!"
-
-#: ../src/daemon/main.c:724
-msgid "Running in system mode, forcibly disabling SHM mode!"
-msgstr "正在以系统模式运行,强制禁用SHM模式!"
-
-#: ../src/daemon/main.c:729
-msgid "Running in system mode, forcibly disabling exit idle time!"
-msgstr "正在以系统模式运行,强制禁用退出空闲时间!"
-
-#: ../src/daemon/main.c:757
-msgid "Failed to acquire stdio."
-msgstr "获取stdio失败。"
-
-#: ../src/daemon/main.c:763 ../src/daemon/main.c:828
-#, fuzzy, c-format
-msgid "pipe() failed: %s"
-msgstr "管道失败:%s"
-
-#: ../src/daemon/main.c:768 ../src/daemon/main.c:833
-#, c-format
-msgid "fork() failed: %s"
-msgstr "fork()失败:%s"
-
-#: ../src/daemon/main.c:783 ../src/daemon/main.c:848 ../src/utils/pacat.c:550
-#, c-format
-msgid "read() failed: %s"
-msgstr "read()失败:%s"
-
-#: ../src/daemon/main.c:789
-msgid "Daemon startup failed."
-msgstr "后台程序启动失败。"
-
-#: ../src/daemon/main.c:791
-msgid "Daemon startup successful."
-msgstr "后台程序启动成功。"
-
-#: ../src/daemon/main.c:816
-#, fuzzy, c-format
-msgid "setsid() failed: %s"
-msgstr "read()失败:%s"
-
-#: ../src/daemon/main.c:901
-#, c-format
-msgid "This is PulseAudio %s"
-msgstr "这是 PulseAudio %s"
-
-#: ../src/daemon/main.c:902
-#, c-format
-msgid "Compilation host: %s"
-msgstr "编译主机:%s"
-
-#: ../src/daemon/main.c:903 ../src/tests/resampler-test.c:418
-#, c-format
-msgid "Compilation CFLAGS: %s"
-msgstr "编译CFLAGS:%s"
-
-#: ../src/daemon/main.c:906
-#, c-format
-msgid "Running on host: %s"
-msgstr "正在主机上运行:%s"
-
-#: ../src/daemon/main.c:909
+#: ../src/daemon/cmdline.c:111
 #, c-format
-msgid "Found %u CPUs."
-msgstr "找到 %u CPU。"
-
-#: ../src/daemon/main.c:911
-#, c-format
-msgid "Page size is %lu bytes"
-msgstr "页面大小为%lu字节"
-
-#: ../src/daemon/main.c:914
-msgid "Compiled with Valgrind support: yes"
-msgstr "编译启用Valgrind支持:是"
-
-#: ../src/daemon/main.c:916
-msgid "Compiled with Valgrind support: no"
-msgstr "编译启用Valgrind支持:否"
-
-#: ../src/daemon/main.c:919
-#, c-format
-msgid "Running in valgrind mode: %s"
-msgstr "正在以valgrind模式运行:%s"
-
-#: ../src/daemon/main.c:921
-#, fuzzy, c-format
-msgid "Running in VM: %s"
-msgstr "正在主机上运行:%s"
-
-#: ../src/daemon/main.c:924
-msgid "Optimized build: yes"
-msgstr "优化生成:是"
-
-#: ../src/daemon/main.c:926
-msgid "Optimized build: no"
-msgstr "优化生成:否"
-
-#: ../src/daemon/main.c:930
-msgid "NDEBUG defined, all asserts disabled."
-msgstr "拒绝 NDEBUG,禁用所有 assert"
-
-#: ../src/daemon/main.c:932
-msgid "FASTPATH defined, only fast path asserts disabled."
-msgstr "拒绝 FASTPATH,只禁用快速路径 assert。"
-
-#: ../src/daemon/main.c:934
-msgid "All asserts enabled."
-msgstr "启用所有 assert。"
-
-#: ../src/daemon/main.c:938
-msgid "Failed to get machine ID"
-msgstr "获取machine ID失败"
-
-#: ../src/daemon/main.c:941
-#, c-format
-msgid "Machine ID is %s."
-msgstr "machine ID是%s。"
-
-#: ../src/daemon/main.c:945
-#, c-format
-msgid "Session ID is %s."
-msgstr "会话 ID %s。"
-
-#: ../src/daemon/main.c:951
-#, c-format
-msgid "Using runtime directory %s."
-msgstr "正在使用运行时文件夹%s。"
-
-#: ../src/daemon/main.c:956
-#, c-format
-msgid "Using state directory %s."
-msgstr "正在使用状态文件夹%s。"
-
-#: ../src/daemon/main.c:959
-#, c-format
-msgid "Using modules directory %s."
-msgstr "正在使用模块目录 %s。"
-
-#: ../src/daemon/main.c:961
-#, c-format
-msgid "Running in system mode: %s"
-msgstr "正在以系统模式运行:%s"
-
-#: ../src/daemon/main.c:964
-msgid ""
-"OK, so you are running PA in system mode. Please note that you most likely "
-"shouldn't be doing that.\n"
-"If you do it nonetheless then it's your own fault if things don't work as "
-"expected.\n"
-"Please read http://www.freedesktop.org/wiki/Software/PulseAudio/"
-"Documentation/User/WhatIsWrongWithSystemWide/ for an explanation why system "
-"mode is usually a bad idea."
-msgstr ""
-"确定,那么您正在系统模式中运行 PA。请注意:您很可能不应该这样做。\n"
-"如果您无论如何都这样做了,那么出现意外情况就是您的问题。\n"
-"在文章 http://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/"
-"User/WhatIsWrongWithSystemWide/ 中解释了为什么系统模式通常不是个好主意。"
-
-#: ../src/daemon/main.c:981
-msgid "pa_pid_file_create() failed."
-msgstr "pa_pid_file_create()失败。"
-
-#: ../src/daemon/main.c:991
-msgid "Fresh high-resolution timers available! Bon appetit!"
-msgstr "新鲜的高分辨率计时器开锅了!吃个饱!"
-
-#: ../src/daemon/main.c:993
-msgid ""
-"Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
-"resolution timers enabled!"
-msgstr "老兄,您的内核真臭!现在流行的是启用了高分辩率计分器的Linux!"
-
-#: ../src/daemon/main.c:1011
-msgid "pa_core_new() failed."
-msgstr "pa_core_new()失败。"
-
-#: ../src/daemon/main.c:1087
-msgid "Failed to initialize daemon."
-msgstr "后台程序初始化失败。"
-
-#: ../src/daemon/main.c:1092
-msgid "Daemon startup without any loaded modules, refusing to work."
-msgstr "后台程序启动未加载任何模块,拒绝工作。"
-
-#: ../src/daemon/main.c:1130
-msgid "Daemon startup complete."
-msgstr "后台程序启动完成。"
-
-#: ../src/daemon/main.c:1136
-msgid "Daemon shutdown initiated."
-msgstr "开始关闭后台程序。"
-
-#: ../src/daemon/main.c:1167
-msgid "Daemon terminated."
-msgstr "后台程序已终止。"
-
-#: ../src/daemon/cmdline.c:113
-#, fuzzy, c-format
 msgid ""
 "%s [options]\n"
 "\n"
@@ -484,8 +64,8 @@ msgid ""
 "and\n"
 "                                        this time passed\n"
 "      --log-level[=LEVEL]               Increase or set verbosity level\n"
-"  -v                                    Increase the verbosity level\n"
-"      --log-target={auto,syslog,stderr,file:PATH}\n"
+"  -v  --verbose                         Increase the verbosity level\n"
+"      --log-target={auto,syslog,stderr,file:PATH,newfile:PATH}\n"
 "                                        Specify the log target\n"
 "      --log-meta[=BOOL]                 Include code location in log "
 "messages\n"
@@ -513,9 +93,9 @@ msgid ""
 "\n"
 "  -n                                    Don't load default script file\n"
 msgstr ""
-"%s [options]\n"
+"%s [选项]\n"
 "\n"
-"COMMANDS:\n"
+"命令:\n"
 "  -h, --help                            显示此帮助\n"
 "      --version                         显示版本号\n"
 "      --dump-conf                       转储默认设置\n"
@@ -524,58 +104,58 @@ msgstr ""
 "      --cleanup-shm                     清理滞留的共享内存段\n"
 "      --start                           如果后台程序没有运行则启动后台程序\n"
 "  -k  --kill                            杀死运行中的后台程序\n"
-"      --check                           检查运行中的后台程序\n"
+"      --check                           寻找运行中的后台程序(只返回退出"
+"码)\n"
 "\n"
-"OPTIONS:\n"
-"      --system[=BOOL]                   作为系统范围事件运行\n"
+"选项:\n"
+"      --system[=BOOL]                   作为系统范围实例运行\n"
 "  -D, --daemonize[=BOOL]                启动后转为后台运行\n"
 "      --fail[=BOOL]                     启动失败则退出\n"
-"      --high-priority[=BOOL]            尝试设定高nice level\n"
-"                                        (仅以root运行时,处于SUID或者\n"
-"                                        在RLIMIT_NICE提升时可用)\n"
+"      --high-priority[=BOOL]            尝试设定高静态优先级\n"
+"                                        (仅以 root 运行时,处于 SUID 或者\n"
+"                                        在 RLIMIT_NICE 提升时可用)\n"
 "      --realtime[=BOOL]                 尝试启用实时调度\n"
-"                                        (仅以root运行时,处于SUID或者\n"
-"                                        在RLIMIT_PTPRIO提升时可用)\n"
-"      --disallow-module-loading[=BOOL]  启动后不批准模块用户的\n"
+"                                        (仅以 root 运行时,处于 SUID 或者\n"
+"                                        在 RLIMIT_PTPRIO 提升时可用)\n"
+"      --disallow-module-loading[=BOOL]  启动后拒绝模块用户的\n"
 "                                        加载/卸载请求\n"
-"      --disallow-exit[=BOOL]            不批准用户的退出请求\n"
+"      --disallow-exit[=BOOL]            拒绝用户的退出请求\n"
 "      --exit-idle-time=SECS             空闲指定时长后终止后台程序\n"
-"      --module-idle-time=SECS           空闲指定时长后卸载\n"
-"                                        自动加载的模块\n"
-"      --scache-idle-time=SECS           空闲指定时长后卸载\n"
-"                                        自动加载的样品\n"
-"      --log-level[=LEVEL]               提高或者设定verbosity level\n"
-"  -v                                    提高verbosity level\n"
-"      --log-target={auto,syslog,stderr} 提定日志目标\n"
+"      --module-idle-time=SECS           空闲指定时长后卸载自动加载的模块\n"
+"      --scache-idle-time=SECS           空闲指定时长后卸载自动加载的采样\n"
+"      --log-level[=LEVEL]               提高或者设定详细度\n"
+"  -v  --verbose                          提高详细度\n"
+"      --log-target={auto,syslog,stderr,file:路径,newfile:路径}\n"
+"                                        指定日志目标\n"
+"      --log-meta[=BOOL]                 将代码位置加入日志\n"
+"      --log-time[=BOOL]                 将时间戳加入日志\n"
+"      --log-backtrace=FRAMES            将回溯跟踪加入日志\n"
 "  -p, --dl-search-path=PATH             为动态共享对象(插件)设定\n"
 "                                        搜索路径\n"
 "      --resample-method=METHOD          使用指定的重采样方法\n"
 "                                        (使用 --dump-resample-methods 查看\n"
 "                                        可能的值)\n"
 "      --use-pid-file[=BOOL]             创建一个PID文件\n"
-"      --no-cpu-limit[=BOOL]             不在支持它的平台中安装 CPU 载入限制程"
-"序。\n"
-"                                              --disable-shm"
-"[=BOOL]              禁用共享内存支持\n"
+"      --no-cpu-limit[=BOOL]             不在支持的平台上载入 CPU 负载显示"
+"器。\n"
+"       --disable-shm[=BOOL]             禁用共享内存支持\n"
 "\n"
-"STARTUP SCRIPT:\n"
-"  -L, --load=\"MODULE ARGUMENTS\"         用指令参数加载\n"
-"                                        指定插件模块\n"
-"  -F, --file=FILENAME                   运行指定脚本\n"
-"  -C                                    启动后在运行的虚拟终端上\n"
-"                                        打开命令行\n"
+"启动脚本:\n"
+"  -L, --load=\"模块 参数...\"            用指定的参数加载指定的插件模块\n"
+"  -F, --file=文件名                      运行指定的脚本\n"
+"  -C                                    启动后在运行的 tty 上打开命令行\n"
 "\n"
 "  -n                                    不加载默认的脚本文件\n"
 
-#: ../src/daemon/cmdline.c:244
+#: ../src/daemon/cmdline.c:243
 msgid "--daemonize expects boolean argument"
-msgstr "--daemonize 期待布尔参数"
+msgstr "--daemonize 需要布尔值参数"
 
 #: ../src/daemon/cmdline.c:251
 msgid "--fail expects boolean argument"
-msgstr "--fail 期待布尔参数"
+msgstr "--fail 需要布尔值参数"
 
-#: ../src/daemon/cmdline.c:261
+#: ../src/daemon/cmdline.c:262
 msgid ""
 "--log-level expects log level argument (either numeric in range 0..4 or one "
 "of debug, info, notice, warn, error)."
@@ -583,781 +163,1659 @@ msgstr ""
 "--log-level 期待日志级别参数(可以是数字0~4或者debug,info,notice,warn,"
 "error中的一个)"
 
-#: ../src/daemon/cmdline.c:273
+#: ../src/daemon/cmdline.c:274
 msgid "--high-priority expects boolean argument"
-msgstr "--high-priority 期待布尔参数"
+msgstr "--high-priority 需要布尔值参数"
 
-#: ../src/daemon/cmdline.c:280
+#: ../src/daemon/cmdline.c:282
 msgid "--realtime expects boolean argument"
-msgstr "--realtime 期待布尔参数"
+msgstr "--realtime 需要布尔值参数"
 
-#: ../src/daemon/cmdline.c:287
+#: ../src/daemon/cmdline.c:290
 msgid "--disallow-module-loading expects boolean argument"
-msgstr "--disallow-module-loading 期待布尔参数"
+msgstr "--disallow-module-loading 需要布尔值参数"
 
-#: ../src/daemon/cmdline.c:294
+#: ../src/daemon/cmdline.c:298
 msgid "--disallow-exit expects boolean argument"
 msgstr "--disallow-exit 需要布尔值参数"
 
-#: ../src/daemon/cmdline.c:301
+#: ../src/daemon/cmdline.c:306
 msgid "--use-pid-file expects boolean argument"
-msgstr "--use-pid-file 期待布尔参数"
+msgstr "--use-pid-file 需要布尔值参数"
 
-#: ../src/daemon/cmdline.c:318
-#, fuzzy
+#: ../src/daemon/cmdline.c:325
 msgid ""
-"Invalid log target: use either 'syslog', 'stderr' or 'auto' or a valid file "
-"name 'file:<path>'."
-msgstr "无效的日志目标:从syslog,stderr和auto中选取一个"
+"Invalid log target: use either 'syslog', 'journal','stderr' or 'auto' or a "
+"valid file name 'file:<path>', 'newfile:<path>'."
+msgstr ""
+"无效的日志目标:要么使用 syslog、journal、stderr 或 auto,要么给定正确的文件"
+"名:file:<路径>、newfile:<路径>。"
 
-#: ../src/daemon/cmdline.c:325
+#: ../src/daemon/cmdline.c:327
+msgid ""
+"Invalid log target: use either 'syslog', 'stderr' or 'auto' or a valid file "
+"name 'file:<path>', 'newfile:<path>'."
+msgstr ""
+"无效的日志目标:要么使用 syslog、stderr 或 auto,要么给定正确的文件名:file:<"
+"路径>、newfile:<路径>。"
+
+#: ../src/daemon/cmdline.c:335
 msgid "--log-time expects boolean argument"
 msgstr "--log-time 需要布尔值参数"
 
-#: ../src/daemon/cmdline.c:332
+#: ../src/daemon/cmdline.c:343
 msgid "--log-meta expects boolean argument"
 msgstr "--log-meta 需要布尔值参数"
 
-#: ../src/daemon/cmdline.c:351
+#: ../src/daemon/cmdline.c:363
 #, c-format
 msgid "Invalid resample method '%s'."
 msgstr "无效的重采样方法'%s'。"
 
-#: ../src/daemon/cmdline.c:358
+#: ../src/daemon/cmdline.c:370
 msgid "--system expects boolean argument"
-msgstr "--system 期待布尔参数"
+msgstr "--system 需要布尔值参数"
 
-#: ../src/daemon/cmdline.c:365
+#: ../src/daemon/cmdline.c:378
 msgid "--no-cpu-limit expects boolean argument"
-msgstr "--no-cpu-limit 期待布尔参数"
+msgstr "--no-cpu-limit 需要布尔值参数"
 
-#: ../src/daemon/cmdline.c:372
+#: ../src/daemon/cmdline.c:386
 msgid "--disable-shm expects boolean argument"
-msgstr "--disable-shm 期待布尔参数"
+msgstr "--disable-shm 需要布尔值参数"
+
+#: ../src/daemon/daemon-conf.c:259
+#, c-format
+msgid "[%s:%u] Invalid log target '%s'."
+msgstr "[%s:%u] 无效的日志目标'%s'。"
+
+#: ../src/daemon/daemon-conf.c:274
+#, c-format
+msgid "[%s:%u] Invalid log level '%s'."
+msgstr "[%s:%u] 无效的日志级别'%s'。"
+
+#: ../src/daemon/daemon-conf.c:289
+#, c-format
+msgid "[%s:%u] Invalid resample method '%s'."
+msgstr "[%s:%u] 无效的重采样方法'%s'。"
+
+#: ../src/daemon/daemon-conf.c:311
+#, c-format
+msgid "[%s:%u] Invalid rlimit '%s'."
+msgstr "[%s:%u] 无效的 rlimit '%s'。"
+
+#: ../src/daemon/daemon-conf.c:331
+#, c-format
+msgid "[%s:%u] Invalid sample format '%s'."
+msgstr "[%s:%u] 无效的采样格式'%s'。"
+
+#: ../src/daemon/daemon-conf.c:348 ../src/daemon/daemon-conf.c:365
+#, c-format
+msgid "[%s:%u] Invalid sample rate '%s'."
+msgstr "[%s:%u] 无效的采样率'%s'。"
+
+#: ../src/daemon/daemon-conf.c:388
+#, c-format
+msgid "[%s:%u] Invalid sample channels '%s'."
+msgstr "[%s:%u] 无效的采样声道 '%s'。"
+
+#: ../src/daemon/daemon-conf.c:405
+#, c-format
+msgid "[%s:%u] Invalid channel map '%s'."
+msgstr "[%s:%u] 无效声道映射 '%s'。"
 
-#: ../src/daemon/dumpmodules.c:59
+#: ../src/daemon/daemon-conf.c:422
+#, c-format
+msgid "[%s:%u] Invalid number of fragments '%s'."
+msgstr "[%s:%u] 无效的分段数'%s'。"
+
+#: ../src/daemon/daemon-conf.c:439
+#, c-format
+msgid "[%s:%u] Invalid fragment size '%s'."
+msgstr "[%s:%u] 无效的分段大小'%s'。"
+
+#: ../src/daemon/daemon-conf.c:456
+#, c-format
+msgid "[%s:%u] Invalid nice level '%s'."
+msgstr "[%s:%u] 无效的静态优先级 '%s'。"
+
+#: ../src/daemon/daemon-conf.c:499
+#, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] 无效的服务器类型 '%s'。"
+
+#: ../src/daemon/daemon-conf.c:613
+#, c-format
+msgid "Failed to open configuration file: %s"
+msgstr "打开配置文件失败:%s"
+
+#: ../src/daemon/daemon-conf.c:629
+msgid ""
+"The specified default channel map has a different number of channels than "
+"the specified default number of channels."
+msgstr "指定的默认声道映射的声道数与指定的默认声道数不同。"
+
+#: ../src/daemon/daemon-conf.c:716
+#, c-format
+msgid "### Read from configuration file: %s ###\n"
+msgstr "### 从配置文件读取:%s ###\n"
+
+#: ../src/daemon/dumpmodules.c:57
 #, c-format
 msgid "Name: %s\n"
 msgstr "名称:%s\n"
 
-#: ../src/daemon/dumpmodules.c:62
+#: ../src/daemon/dumpmodules.c:60
 #, c-format
 msgid "No module information available\n"
 msgstr "没有可用的模块信息\n"
 
-#: ../src/daemon/dumpmodules.c:65
+#: ../src/daemon/dumpmodules.c:63
 #, c-format
 msgid "Version: %s\n"
 msgstr "版本号:%s\n"
 
-#: ../src/daemon/dumpmodules.c:67
+#: ../src/daemon/dumpmodules.c:65
 #, c-format
 msgid "Description: %s\n"
 msgstr "描述:%s\n"
 
-#: ../src/daemon/dumpmodules.c:69
+#: ../src/daemon/dumpmodules.c:67
 #, c-format
 msgid "Author: %s\n"
 msgstr "作者:%s\n"
 
-#: ../src/daemon/dumpmodules.c:71
+#: ../src/daemon/dumpmodules.c:69
 #, c-format
 msgid "Usage: %s\n"
 msgstr "用法:%s\n"
 
-#: ../src/daemon/dumpmodules.c:72
+#: ../src/daemon/dumpmodules.c:70
 #, c-format
 msgid "Load Once: %s\n"
 msgstr "加载一次:%s\n"
 
-#: ../src/daemon/dumpmodules.c:74
+#: ../src/daemon/dumpmodules.c:72
 #, c-format
 msgid "DEPRECATION WARNING: %s\n"
-msgstr "反对警告:%s\n"
+msgstr "过时警告:%s\n"
 
-#: ../src/daemon/dumpmodules.c:78
+#: ../src/daemon/dumpmodules.c:76
 #, c-format
 msgid "Path: %s\n"
 msgstr "路径:%s\n"
 
-#: ../src/daemon/daemon-conf.c:275
+#: ../src/daemon/ltdl-bind-now.c:75
 #, c-format
-msgid "[%s:%u] Invalid log target '%s'."
-msgstr "[%s:%u] 无效的日志目标'%s'。"
+msgid "Failed to open module %s: %s"
+msgstr "打开模块 %s 失败:%s"
+
+#: ../src/daemon/ltdl-bind-now.c:126
+msgid "Failed to find original lt_dlopen loader."
+msgstr "查找原始 lt_dlopen 加载器失败。"
+
+#: ../src/daemon/ltdl-bind-now.c:131
+msgid "Failed to allocate new dl loader."
+msgstr "分配新的 dl 加载器失败。"
+
+#: ../src/daemon/ltdl-bind-now.c:144
+msgid "Failed to add bind-now-loader."
+msgstr "添加 bind-now-loader 失败。"
 
-#: ../src/daemon/daemon-conf.c:291
+#: ../src/daemon/main.c:160
 #, c-format
-msgid "[%s:%u] Invalid log level '%s'."
-msgstr "[%s:%u] 无效的日志级别'%s'。"
+msgid "Failed to find user '%s'."
+msgstr "找不到用户 `%s' "
 
-#: ../src/daemon/daemon-conf.c:307
+#: ../src/daemon/main.c:165
 #, c-format
-msgid "[%s:%u] Invalid resample method '%s'."
-msgstr "[%s:%u] 无效的重采样方法'%s'。"
+msgid "Failed to find group '%s'."
+msgstr "找不到用户组 `%s'"
 
-#: ../src/daemon/daemon-conf.c:330
+#: ../src/daemon/main.c:174
 #, c-format
-msgid "[%s:%u] Invalid rlimit '%s'."
-msgstr "[%s:%u] 无效的rlimit '%s'。"
+msgid "GID of user '%s' and of group '%s' don't match."
+msgstr "用户'%s'与组'%s'的GID不匹配."
+
+#: ../src/daemon/main.c:179
+#, c-format
+msgid "Home directory of user '%s' is not '%s', ignoring."
+msgstr "用户'%s'的主文件夹不是'%s',忽略。"
+
+#: ../src/daemon/main.c:182 ../src/daemon/main.c:187
+#, c-format
+msgid "Failed to create '%s': %s"
+msgstr "创建'%s'失败: %s"
+
+#: ../src/daemon/main.c:194
+#, c-format
+msgid "Failed to change group list: %s"
+msgstr "更改组列表失败:%s"
+
+#: ../src/daemon/main.c:210
+#, c-format
+msgid "Failed to change GID: %s"
+msgstr "更改GID失败:%s"
+
+#: ../src/daemon/main.c:226
+#, c-format
+msgid "Failed to change UID: %s"
+msgstr "更改UID失败:%s"
+
+#: ../src/daemon/main.c:255
+msgid "System wide mode unsupported on this platform."
+msgstr "此平台不支持system-wide模式。"
+
+#: ../src/daemon/main.c:484
+msgid "Failed to parse command line."
+msgstr "分析命令行失败。"
+
+#: ../src/daemon/main.c:523
+msgid ""
+"System mode refused for non-root user. Only starting the D-Bus server lookup "
+"service."
+msgstr "已拒绝非超级用户使用系统模式,仅启动 D-Bus 服务器查找服务。"
+
+#: ../src/daemon/main.c:622
+#, c-format
+msgid "Failed to kill daemon: %s"
+msgstr "杀死后台程序失败:%s"
+
+#: ../src/daemon/main.c:651
+msgid ""
+"This program is not intended to be run as root (unless --system is "
+"specified)."
+msgstr "不应以root身份运行本程序(除非指定 --system)。"
+
+#: ../src/daemon/main.c:654
+msgid "Root privileges required."
+msgstr "需要 root 权限。"
+
+#: ../src/daemon/main.c:661
+msgid "--start not supported for system instances."
+msgstr "系统实例不支持 --start。"
+
+#: ../src/daemon/main.c:701
+#, c-format
+msgid "User-configured server at %s, refusing to start/autospawn."
+msgstr "用户配置的服务器 %s,拒绝启动/自动派生。"
+
+#: ../src/daemon/main.c:707
+#, c-format
+msgid ""
+"User-configured server at %s, which appears to be local. Probing deeper."
+msgstr "用户配置的服务器 %s,看起来是本地服务器。正在进一步探测。"
+
+#: ../src/daemon/main.c:712
+msgid "Running in system mode, but --disallow-exit not set."
+msgstr "正在以系统模式运行,但未设定 --disallow-exit。"
+
+#: ../src/daemon/main.c:715
+msgid "Running in system mode, but --disallow-module-loading not set."
+msgstr "正在以系统模式运行,但未设定 --disallow-module-loading。"
+
+#: ../src/daemon/main.c:718
+msgid "Running in system mode, forcibly disabling SHM mode."
+msgstr "正在以系统模式运行,强制禁用 SHM 模式!"
+
+#: ../src/daemon/main.c:723
+msgid "Running in system mode, forcibly disabling exit idle time."
+msgstr "正在以系统模式运行,强制禁用退出空闲时间!"
+
+#: ../src/daemon/main.c:756
+msgid "Failed to acquire stdio."
+msgstr "获取stdio失败。"
+
+#: ../src/daemon/main.c:762 ../src/daemon/main.c:833
+#, c-format
+msgid "pipe() failed: %s"
+msgstr "pipe() 失败:%s"
+
+#: ../src/daemon/main.c:767 ../src/daemon/main.c:838
+#, c-format
+msgid "fork() failed: %s"
+msgstr "fork() 失败:%s"
+
+#: ../src/daemon/main.c:782 ../src/daemon/main.c:853 ../src/utils/pacat.c:568
+#, c-format
+msgid "read() failed: %s"
+msgstr "read() 失败:%s"
+
+#: ../src/daemon/main.c:788
+msgid "Daemon startup failed."
+msgstr "后台程序启动失败。"
+
+#: ../src/daemon/main.c:821
+#, c-format
+msgid "setsid() failed: %s"
+msgstr "setsid() 失败:%s"
+
+#: ../src/daemon/main.c:948
+msgid "Failed to get machine ID"
+msgstr "获取machine ID失败"
+
+#: ../src/daemon/main.c:974
+msgid ""
+"OK, so you are running PA in system mode. Please note that you most likely "
+"shouldn't be doing that.\n"
+"If you do it nonetheless then it's your own fault if things don't work as "
+"expected.\n"
+"Please read http://www.freedesktop.org/wiki/Software/PulseAudio/"
+"Documentation/User/WhatIsWrongWithSystemWide/ for an explanation why system "
+"mode is usually a bad idea."
+msgstr ""
+"好的,那么您现在是在系统模式中运行 PA。请注意:您很可能不应该这样做。\n"
+"如果您无论如何都这样做了,那么出现意外情况就是您的问题。\n"
+"请阅读 http://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/"
+"User/WhatIsWrongWithSystemWide/ 以了解为什么系统模式通常不是个好主意。"
+
+#: ../src/daemon/main.c:991
+msgid "pa_pid_file_create() failed."
+msgstr "pa_pid_file_create() 失败。"
+
+#: ../src/daemon/main.c:1021
+msgid "pa_core_new() failed."
+msgstr "pa_core_new() 失败。"
+
+#: ../src/daemon/main.c:1089
+msgid "Failed to initialize daemon."
+msgstr "后台程序初始化失败。"
+
+#: ../src/daemon/main.c:1094
+msgid "Daemon startup without any loaded modules, refusing to work."
+msgstr "后台程序启动未加载任何模块,拒绝工作。"
+
+#: ../src/daemon/pulseaudio.desktop.in.h:1
+msgid "PulseAudio Sound System"
+msgstr "PulseAudio 声音系统"
+
+#: ../src/daemon/pulseaudio.desktop.in.h:2
+msgid "Start the PulseAudio Sound System"
+msgstr "启动 PulseAudio 声音系统"
+
+#: ../src/modules/alsa/alsa-mixer.c:2402
+msgid "Input"
+msgstr "输入"
+
+#: ../src/modules/alsa/alsa-mixer.c:2403
+msgid "Docking Station Input"
+msgstr "扩展坞输入"
+
+#: ../src/modules/alsa/alsa-mixer.c:2404
+msgid "Docking Station Microphone"
+msgstr "扩展坞麦克风"
+
+#: ../src/modules/alsa/alsa-mixer.c:2405
+msgid "Docking Station Line In"
+msgstr "扩展坞线输入"
+
+#: ../src/modules/alsa/alsa-mixer.c:2406 ../src/modules/alsa/alsa-mixer.c:2491
+msgid "Line In"
+msgstr "Line In"
+
+#: ../src/modules/alsa/alsa-mixer.c:2407 ../src/modules/alsa/alsa-mixer.c:2485
+#: ../src/modules/bluetooth/module-bluez4-device.c:2099
+#: ../src/modules/bluetooth/module-bluez5-device.c:1710
+msgid "Microphone"
+msgstr "麦克风"
+
+#: ../src/modules/alsa/alsa-mixer.c:2408 ../src/modules/alsa/alsa-mixer.c:2486
+msgid "Front Microphone"
+msgstr "前麦克风"
+
+#: ../src/modules/alsa/alsa-mixer.c:2409 ../src/modules/alsa/alsa-mixer.c:2487
+msgid "Rear Microphone"
+msgstr "后麦克风"
+
+#: ../src/modules/alsa/alsa-mixer.c:2410
+msgid "External Microphone"
+msgstr "外部麦克风"
+
+#: ../src/modules/alsa/alsa-mixer.c:2411 ../src/modules/alsa/alsa-mixer.c:2489
+msgid "Internal Microphone"
+msgstr "内部麦克风"
+
+#: ../src/modules/alsa/alsa-mixer.c:2412 ../src/modules/alsa/alsa-mixer.c:2492
+msgid "Radio"
+msgstr "无线电"
+
+#: ../src/modules/alsa/alsa-mixer.c:2413 ../src/modules/alsa/alsa-mixer.c:2493
+msgid "Video"
+msgstr "视频"
+
+#: ../src/modules/alsa/alsa-mixer.c:2414
+msgid "Automatic Gain Control"
+msgstr "自动增益控制"
+
+#: ../src/modules/alsa/alsa-mixer.c:2415
+msgid "No Automatic Gain Control"
+msgstr "无自动增益控制"
+
+#: ../src/modules/alsa/alsa-mixer.c:2416
+msgid "Boost"
+msgstr "加速器"
+
+#: ../src/modules/alsa/alsa-mixer.c:2417
+msgid "No Boost"
+msgstr "无加速器"
+
+#: ../src/modules/alsa/alsa-mixer.c:2418
+msgid "Amplifier"
+msgstr "均衡器"
+
+#: ../src/modules/alsa/alsa-mixer.c:2419
+msgid "No Amplifier"
+msgstr "无均衡器"
+
+#: ../src/modules/alsa/alsa-mixer.c:2420
+msgid "Bass Boost"
+msgstr "重低音增强"
+
+#: ../src/modules/alsa/alsa-mixer.c:2421
+msgid "No Bass Boost"
+msgstr "无重低音增强"
+
+#: ../src/modules/alsa/alsa-mixer.c:2422
+#: ../src/modules/bluetooth/module-bluez4-device.c:2104
+#: ../src/modules/bluetooth/module-bluez5-device.c:1717
+msgid "Speaker"
+msgstr "扬声器"
+
+#: ../src/modules/alsa/alsa-mixer.c:2423 ../src/modules/alsa/alsa-mixer.c:2495
+msgid "Headphones"
+msgstr "模拟耳机"
+
+#: ../src/modules/alsa/alsa-mixer.c:2484
+msgid "Analog Input"
+msgstr "模拟输入"
+
+#: ../src/modules/alsa/alsa-mixer.c:2488
+msgid "Dock Microphone"
+msgstr "扩展坞麦克风"
+
+#: ../src/modules/alsa/alsa-mixer.c:2490
+msgid "Headset Microphone"
+msgstr "头挂麦克风"
+
+#: ../src/modules/alsa/alsa-mixer.c:2494
+msgid "Analog Output"
+msgstr "模拟输出 "
+
+#: ../src/modules/alsa/alsa-mixer.c:2496
+msgid "LFE on Separate Mono Output"
+msgstr "模拟输出(LFE)"
+
+#: ../src/modules/alsa/alsa-mixer.c:2497
+msgid "Line Out"
+msgstr "线缆输出"
+
+#: ../src/modules/alsa/alsa-mixer.c:2498
+msgid "Analog Mono Output"
+msgstr "模拟单声道输出"
+
+#: ../src/modules/alsa/alsa-mixer.c:2499
+msgid "Speakers"
+msgstr "扬声器"
+
+#: ../src/modules/alsa/alsa-mixer.c:2500
+msgid "HDMI / DisplayPort"
+msgstr "HDMI / DisplayPort"
+
+#: ../src/modules/alsa/alsa-mixer.c:2501
+msgid "Digital Output (S/PDIF)"
+msgstr "数字输出 (S/PDIF)"
+
+#: ../src/modules/alsa/alsa-mixer.c:2502
+msgid "Digital Input (S/PDIF)"
+msgstr "数字输入 (S/PDIF)"
+
+#: ../src/modules/alsa/alsa-mixer.c:2503
+msgid "Digital Passthrough (S/PDIF)"
+msgstr "数字直通 (S/PDIF)"
+
+#: ../src/modules/alsa/alsa-mixer.c:2504
+msgid "Multichannel Input"
+msgstr "多声道输入"
+
+#: ../src/modules/alsa/alsa-mixer.c:2505
+msgid "Multichannel Output"
+msgstr "多声道输出"
+
+#: ../src/modules/alsa/alsa-mixer.c:4011
+msgid "Analog Mono"
+msgstr "模拟单声道"
+
+#. Note: Not translated to "Analog Stereo Input", because the source
+#. * name gets "Input" appended to it automatically, so adding "Input"
+#. * here would lead to the source name to become "Analog Stereo Input
+#. * Input". The same logic applies to analog-stereo-output,
+#. * multichannel-input and multichannel-output.
+#: ../src/modules/alsa/alsa-mixer.c:4012 ../src/modules/alsa/alsa-mixer.c:4018
+#: ../src/modules/alsa/alsa-mixer.c:4019
+msgid "Analog Stereo"
+msgstr "模拟立体声"
+
+#: ../src/modules/alsa/alsa-mixer.c:4020 ../src/modules/alsa/alsa-mixer.c:4021
+msgid "Multichannel"
+msgstr "多声道"
+
+#: ../src/modules/alsa/alsa-mixer.c:4022
+msgid "Analog Surround 2.1"
+msgstr "模拟环绕 2.1"
+
+#: ../src/modules/alsa/alsa-mixer.c:4023
+msgid "Analog Surround 3.0"
+msgstr "模拟环绕 3.0"
+
+#: ../src/modules/alsa/alsa-mixer.c:4024
+msgid "Analog Surround 3.1"
+msgstr "模拟环绕 3.1"
+
+#: ../src/modules/alsa/alsa-mixer.c:4025
+msgid "Analog Surround 4.0"
+msgstr "模拟环绕 4.0"
+
+#: ../src/modules/alsa/alsa-mixer.c:4026
+msgid "Analog Surround 4.1"
+msgstr "模拟环绕 4.1"
+
+#: ../src/modules/alsa/alsa-mixer.c:4027
+msgid "Analog Surround 5.0"
+msgstr "模拟环绕 5.0"
+
+#: ../src/modules/alsa/alsa-mixer.c:4028
+msgid "Analog Surround 5.1"
+msgstr "模拟环绕 5.1"
+
+#: ../src/modules/alsa/alsa-mixer.c:4029
+msgid "Analog Surround 6.0"
+msgstr "模拟环绕 6.0"
+
+#: ../src/modules/alsa/alsa-mixer.c:4030
+msgid "Analog Surround 6.1"
+msgstr "模拟环绕 6.1"
+
+#: ../src/modules/alsa/alsa-mixer.c:4031
+msgid "Analog Surround 7.0"
+msgstr "模拟环绕 7.0"
+
+#: ../src/modules/alsa/alsa-mixer.c:4032
+msgid "Analog Surround 7.1"
+msgstr "模拟环绕 7.1"
+
+#: ../src/modules/alsa/alsa-mixer.c:4033
+msgid "Digital Stereo (IEC958)"
+msgstr "数字立体声(IEC958)"
+
+#: ../src/modules/alsa/alsa-mixer.c:4034
+msgid "Digital Passthrough  (IEC958)"
+msgstr "数字直通(IEC958)"
+
+#: ../src/modules/alsa/alsa-mixer.c:4035
+msgid "Digital Surround 4.0 (IEC958/AC3)"
+msgstr "数字环绕 4.0(IEC958/AC3)"
+
+#: ../src/modules/alsa/alsa-mixer.c:4036
+msgid "Digital Surround 5.1 (IEC958/AC3)"
+msgstr "数字环绕 5.1(IEC958/AC3)"
+
+#: ../src/modules/alsa/alsa-mixer.c:4037
+msgid "Digital Surround 5.1 (IEC958/DTS)"
+msgstr "数字环绕 5.1(IEC958/DTS)"
+
+#: ../src/modules/alsa/alsa-mixer.c:4038
+msgid "Digital Stereo (HDMI)"
+msgstr "数字立体声(HDMI)"
+
+#: ../src/modules/alsa/alsa-mixer.c:4039
+msgid "Digital Surround 5.1 (HDMI)"
+msgstr "数字环绕 5.1(HDMI)"
+
+#: ../src/modules/alsa/alsa-mixer.c:4170
+msgid "Analog Mono Duplex"
+msgstr "模拟单声道双工"
+
+#: ../src/modules/alsa/alsa-mixer.c:4171
+msgid "Analog Stereo Duplex"
+msgstr "模拟立体声双工"
+
+#: ../src/modules/alsa/alsa-mixer.c:4172
+msgid "Digital Stereo Duplex (IEC958)"
+msgstr "数字立体声双工(IEC958)"
+
+#: ../src/modules/alsa/alsa-mixer.c:4173
+msgid "Multichannel Duplex"
+msgstr "多声道双工"
+
+#: ../src/modules/alsa/alsa-mixer.c:4174
+#: ../src/modules/alsa/module-alsa-card.c:184
+#: ../src/modules/bluetooth/module-bluez4-device.c:2295
+#: ../src/modules/bluetooth/module-bluez5-device.c:1941
+msgid "Off"
+msgstr "关"
+
+#: ../src/modules/alsa/alsa-mixer.c:4273
+#, c-format
+msgid "%s Output"
+msgstr "%s 输出"
+
+#: ../src/modules/alsa/alsa-mixer.c:4281
+#, c-format
+msgid "%s Input"
+msgstr "%s 输入"
+
+#: ../src/modules/alsa/alsa-sink.c:570
+#, c-format
+msgid ""
+"ALSA woke us up to write new data to the device, but there was actually "
+"nothing to write.\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers.\n"
+"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() "
+"returned 0 or another value < min_avail."
+msgstr ""
+"ALSA 提醒我们在该设备中写入新数据,但实际上没有什么可以写入的!\n"
+"这很可能是 ALSA 驱动程序 '%s' 中的一个 bug。请向 ALSA 开发人员报告这个问"
+"题。\n"
+"我们因 POLLOUT 被设置而唤醒 -- 但结果是 snd_pcm_avail() 返回 0 或者另一个小于"
+"最小可用值的数值。"
+
+#: ../src/modules/alsa/alsa-sink.c:747
+#, c-format
+msgid ""
+"ALSA woke us up to write new data to the device, but there was actually "
+"nothing to write!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers.\n"
+"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() "
+"returned 0 or another value < min_avail."
+msgstr ""
+"ALSA 提醒我们在该设备中写入新数据,但实际上没有什么可以写入的!\n"
+"这很可能是 ALSA 驱动程序 '%s' 中的一个 bug。请向 ALSA 开发人员报告这个问"
+"题。\n"
+"提醒我们设置 POLLOUT -- 但结果是 snd_pcm_avail() 返回 0 或者另一个小于最小可"
+"用值的数值。"
+
+#: ../src/modules/alsa/alsa-source.c:529
+#, c-format
+msgid ""
+"ALSA woke us up to read new data from the device, but there was actually "
+"nothing to read.\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers.\n"
+"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() "
+"returned 0 or another value < min_avail."
+msgstr ""
+"ALSA 提醒我们从该设备中读取新数据,但实际上没有什么可以读取的!\n"
+"这很可能是 ALSA 驱动程序 '%s' 中的一个 bug。请向 ALSA 开发人员报告这个问"
+"题。\n"
+"我们因 POLLOUT 被设置而唤醒 -- 但结果是 snd_pcm_avail() 返回 0 或者另一个小于"
+"最小可用值的数值。"
+
+#: ../src/modules/alsa/alsa-source.c:680
+#, c-format
+msgid ""
+"ALSA woke us up to read new data from the device, but there was actually "
+"nothing to read!\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers.\n"
+"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() "
+"returned 0 or another value < min_avail."
+msgstr ""
+"ALSA 提醒我们从该设备中读取新数据,但实际上没有什么可以读取的!\n"
+"这很可能是 ALSA 驱动程序 '%s' 中的一个 bug。请向 ALSA 开发人员报告这个问"
+"题。\n"
+"提醒我们设置 POLLOUT -- 但结果是 snd_pcm_avail() 返回 0 或者另一个小于最小可"
+"用值的数值。"
+
+#: ../src/modules/alsa/alsa-util.c:1149 ../src/modules/alsa/alsa-util.c:1224
+#, c-format
+msgid ""
+"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
+"ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
+msgstr ""
+"snd_pcm_avail() 返回的值非常大:%lu 字节(%lu ms)。\n"
+"很可能是 ALSA 驱动程序 '%s' 中的 bug。请向 ALSA 开发者举报这个问题。"
+
+#: ../src/modules/alsa/alsa-util.c:1199
+#, c-format
+msgid ""
+"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s"
+"%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
+msgstr ""
+"snd_pcm_delay() 返回的值非常大:%li 字节(%s%lu ms)。\n"
+"很可能是 ALSA 驱动程序 '%s' 中的 bug。请向 ALSA 开发者举报这个问题。"
+
+#: ../src/modules/alsa/alsa-util.c:1240
+#, c-format
+msgid ""
+"snd_pcm_avail_delay() returned strange values: delay %lu is less than avail "
+"%lu.\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
+msgstr ""
+"snd_pcm_avail_delay() 返回的值非常很奇怪:延迟 %lu 小于可用 (avail) %lu。\n"
+"很可能是 ALSA 驱动程序 '%s' 中的 bug。请向 ALSA 开发者举报这个问题。"
+
+#: ../src/modules/alsa/alsa-util.c:1283
+#, c-format
+msgid ""
+"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
+"(%lu ms).\n"
+"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
+"to the ALSA developers."
+msgstr ""
+"snd_pcm_mmap_begin() 返回的值非常大:%lu 字节(%lu ms)。\n"
+"很可能是 ALSA 驱动程序 '%s' 中的 bug。请向 ALSA 开发者举报这个问题。"
+
+#: ../src/modules/bluetooth/module-bluez4-device.c:2089
+#: ../src/modules/bluetooth/module-bluez5-device.c:1700
+msgid "Headset"
+msgstr "耳机"
+
+#: ../src/modules/bluetooth/module-bluez4-device.c:2094
+#: ../src/modules/bluetooth/module-bluez5-device.c:1705
+msgid "Handsfree"
+msgstr "免手操作"
+
+#: ../src/modules/bluetooth/module-bluez4-device.c:2109
+#: ../src/modules/bluetooth/module-bluez5-device.c:1723
+msgid "Headphone"
+msgstr "头戴耳机"
+
+#: ../src/modules/bluetooth/module-bluez4-device.c:2114
+#: ../src/modules/bluetooth/module-bluez5-device.c:1728
+msgid "Portable"
+msgstr "便携式"
+
+#: ../src/modules/bluetooth/module-bluez4-device.c:2119
+#: ../src/modules/bluetooth/module-bluez5-device.c:1733
+msgid "Car"
+msgstr "车内"
+
+#: ../src/modules/bluetooth/module-bluez4-device.c:2124
+#: ../src/modules/bluetooth/module-bluez5-device.c:1738
+msgid "HiFi"
+msgstr "高保真"
+
+#: ../src/modules/bluetooth/module-bluez4-device.c:2129
+#: ../src/modules/bluetooth/module-bluez5-device.c:1743
+msgid "Phone"
+msgstr "电话"
+
+#: ../src/modules/bluetooth/module-bluez4-device.c:2137
+#: ../src/modules/bluetooth/module-bluez5-device.c:1695
+#: ../src/modules/bluetooth/module-bluez5-device.c:1711
+#: ../src/modules/bluetooth/module-bluez5-device.c:1749
+msgid "Bluetooth Output"
+msgstr "蓝牙输出 "
+
+#: ../src/modules/bluetooth/module-bluez4-device.c:2140
+#: ../src/modules/bluetooth/module-bluez5-device.c:1694
+#: ../src/modules/bluetooth/module-bluez5-device.c:1716
+#: ../src/modules/bluetooth/module-bluez5-device.c:1722
+#: ../src/modules/bluetooth/module-bluez5-device.c:1748
+msgid "Bluetooth Input"
+msgstr "蓝牙输入"
+
+#: ../src/modules/bluetooth/module-bluez4-device.c:2176
+msgid "High Fidelity Playback (A2DP)"
+msgstr "高保真回放(A2DP)"
+
+#: ../src/modules/bluetooth/module-bluez4-device.c:2187
+msgid "High Fidelity Capture (A2DP)"
+msgstr "高保真采集(A2DP)"
+
+#: ../src/modules/bluetooth/module-bluez4-device.c:2198
+msgid "Telephony Duplex (HSP/HFP)"
+msgstr "双工电话(HSP/HFP)"
+
+#: ../src/modules/bluetooth/module-bluez4-device.c:2210
+msgid "Handsfree Gateway"
+msgstr "免持闸道"
+
+#: ../src/modules/bluetooth/module-bluez5-device.c:1786
+msgid "High Fidelity Playback (A2DP Sink)"
+msgstr "高保真播放 (A2DP 接收器)"
+
+#: ../src/modules/bluetooth/module-bluez5-device.c:1797
+msgid "High Fidelity Capture (A2DP Source)"
+msgstr "高保真采集(A2DP 数据信源)"
+
+#: ../src/modules/bluetooth/module-bluez5-device.c:1808
+msgid "Headset Head Unit (HSP/HFP)"
+msgstr ""
+
+#: ../src/modules/bluetooth/module-bluez5-device.c:1820
+msgid "Headset Audio Gateway (HSP/HFP)"
+msgstr ""
+
+#: ../src/modules/echo-cancel/module-echo-cancel.c:61
+msgid ""
+"source_name=<name for the source> source_properties=<properties for the "
+"source> source_master=<name of source to filter> sink_name=<name for the "
+"sink> sink_properties=<properties for the sink> sink_master=<name of sink to "
+"filter> adjust_time=<how often to readjust rates in s> adjust_threshold=<how "
+"much drift to readjust after in ms> format=<sample format> rate=<sample "
+"rate> channels=<number of channels> channel_map=<channel map> "
+"aec_method=<implementation to use> aec_args=<parameters for the AEC engine> "
+"save_aec=<save AEC data in /tmp> autoloaded=<set if this module is being "
+"loaded automatically> use_volume_sharing=<yes or no> "
+msgstr ""
+"source_name=<信源名称> source_properties=<信源属性> source_master=<要过滤的信"
+"源名称> sink_name=<采集器的名称> sink_properties=<采集器属性> sink_master=<要"
+"过滤的采集器名称> adjust_time=<多少秒重新调整一次频率> adjust_threshold=<重新"
+"调整时的偏移量阈值(微秒)> format=<采样格式> rate=<采样率> channels=<声道数"
+"> channel_map=<声道映射> aec_method=<要使用的实现> aec_args=<AEC 引擎的参数> "
+"save_aec=<在 /tmp 内保存 AEC 数据> autoloaded=<若为自动加载则会设置> "
+"use_volume_sharing=<yes 或 no> "
+
+#. add on profile
+#: ../src/modules/macosx/module-coreaudio-device.c:755
+msgid "On"
+msgstr "启用"
+
+#: ../src/modules/module-always-sink.c:36
+msgid "Always keeps at least one sink loaded even if it's a null one"
+msgstr "总是保持至少载入一个采集器,即使它是空的"
+
+#: ../src/modules/module-always-sink.c:83
+msgid "Dummy Output"
+msgstr "假输出"
+
+#: ../src/modules/module-equalizer-sink.c:70
+msgid "General Purpose Equalizer"
+msgstr "通用均衡器"
+
+#: ../src/modules/module-equalizer-sink.c:74
+msgid ""
+"sink_name=<name of the sink> sink_properties=<properties for the sink> "
+"sink_master=<sink to connect to> format=<sample format> rate=<sample rate> "
+"channels=<number of channels> channel_map=<channel map> autoloaded=<set if "
+"this module is being loaded automatically> use_volume_sharing=<yes or no> "
+msgstr ""
+"sink_name=<采集器名称> sink_properties=<采集器属性> sink_master=<要连接的采集"
+"器> format=<采样格式> rate=<采样率> channels=<声道数> channel_map=<声道映射> "
+"autoloaded=<若为自动加载则会设置> use_volume_sharing=<yes 或 no> "
+
+#: ../src/modules/module-filter-apply.c:46
+msgid "autoclean=<automatically unload unused filters?>"
+msgstr "autoclean=<是否自动取消未使用过滤器的加载?>"
+
+#: ../src/modules/module-ladspa-sink.c:51
+msgid "Virtual LADSPA sink"
+msgstr "虚拟 LDASPA 采集器"
+
+#: ../src/modules/module-ladspa-sink.c:55
+msgid ""
+"sink_name=<name for the sink> sink_properties=<properties for the sink> "
+"master=<name of sink to filter> format=<sample format> rate=<sample rate> "
+"channels=<number of channels> channel_map=<input channel map> plugin=<ladspa "
+"plugin name> label=<ladspa plugin label> control=<comma separated list of "
+"input control values> input_ladspaport_map=<comma separated list of input "
+"LADSPA port names> output_ladspaport_map=<comma separated list of output "
+"LADSPA port names> "
+msgstr ""
+"sink_name=<采集器的名称> sink_properties=<采集器的属性> master=<要过滤的采集"
+"器名称> format=<样本格式> rate=<采样率> channels=<声道数> channel_map=<输入声"
+"道映射> plugin=<ladspa 插件名称> label=<ladspa 插件标签> control=<以半角逗号"
+"分隔的输入控制值列表> input_ladspaport_map=<以半角逗号分隔的输入 LADSPA 连接"
+"端口名称列表> output_ladspaport_map=<以半角逗号分隔的输出 LADSPA 连接端口名称"
+"列表> "
 
-#: ../src/daemon/daemon-conf.c:351
-#, c-format
-msgid "[%s:%u] Invalid sample format '%s'."
-msgstr "[%s:%u] 无效的样品格式'%s'。"
+#: ../src/modules/module-null-sink.c:47
+msgid "Clocked NULL sink"
+msgstr "定时的空采集器"
 
-#: ../src/daemon/daemon-conf.c:370 ../src/daemon/daemon-conf.c:389
-#, c-format
-msgid "[%s:%u] Invalid sample rate '%s'."
-msgstr "[%s:%u] 无效的样品率'%s'。"
+#: ../src/modules/module-null-sink.c:280
+msgid "Null Output"
+msgstr "空输出"
 
-#: ../src/daemon/daemon-conf.c:413
-#, c-format
-msgid "[%s:%u] Invalid sample channels '%s'."
-msgstr "[%s:%u] 无效的样品通道'%s'。"
+#: ../src/modules/module-rygel-media-server.c:508
+#: ../src/modules/module-rygel-media-server.c:546
+#: ../src/modules/module-rygel-media-server.c:905
+msgid "Output Devices"
+msgstr "输出设备"
 
-#: ../src/daemon/daemon-conf.c:431
-#, c-format
-msgid "[%s:%u] Invalid channel map '%s'."
-msgstr "[%s:%u] 无效频道地图 '%s'。"
+#: ../src/modules/module-rygel-media-server.c:509
+#: ../src/modules/module-rygel-media-server.c:547
+#: ../src/modules/module-rygel-media-server.c:906
+msgid "Input Devices"
+msgstr "输入设备"
 
-#: ../src/daemon/daemon-conf.c:449
-#, c-format
-msgid "[%s:%u] Invalid number of fragments '%s'."
-msgstr "[%s:%u] 无效的分段数'%s'。"
+#: ../src/modules/module-rygel-media-server.c:1063
+msgid "Audio on @HOSTNAME@"
+msgstr "@HOSTNAME@ 中的音频"
 
-#: ../src/daemon/daemon-conf.c:467
+#. TODO: old tunnel put here the remote sink_name into stream name e.g. 'Null Output for lynxis at lazus'
+#. TODO: old tunnel put here the remote source_name into stream name e.g. 'Null Output for lynxis at lazus'
+#: ../src/modules/module-tunnel-sink-new.c:307
+#: ../src/modules/module-tunnel-source-new.c:305
 #, c-format
-msgid "[%s:%u] Invalid fragment size '%s'."
-msgstr "[%s:%u] 无效的分段大小'%s'。"
+msgid "Tunnel for %s@%s"
+msgstr ""
 
-#: ../src/daemon/daemon-conf.c:485
+#: ../src/modules/module-tunnel-sink-new.c:517
+#: ../src/modules/module-tunnel-source-new.c:516
 #, c-format
-msgid "[%s:%u] Invalid nice level '%s'."
-msgstr "[%s:%u] 无效的nice level '%s'。"
-
-#: ../src/daemon/daemon-conf.c:528
-#, fuzzy, c-format
-msgid "[%s:%u] Invalid server type '%s'."
-msgstr "[%s:%u] 无效的样品率'%s'。"
+msgid "Tunnel to %s/%s"
+msgstr ""
 
-#: ../src/daemon/daemon-conf.c:641
-#, c-format
-msgid "Failed to open configuration file: %s"
-msgstr "打开配置文件失败:%s"
+#: ../src/modules/module-virtual-surround-sink.c:47
+msgid "Virtual surround sink"
+msgstr "虚拟环绕声采集器"
 
-#: ../src/daemon/daemon-conf.c:657
+#: ../src/modules/module-virtual-surround-sink.c:51
 msgid ""
-"The specified default channel map has a different number of channels than "
-"the specified default number of channels."
-msgstr "指定的默认频道地图的频道数与指定的默认频道数不同。"
-
-#: ../src/daemon/daemon-conf.c:743
-#, c-format
-msgid "### Read from configuration file: %s ###\n"
-msgstr "### 从配置文件读取:%s ###\n"
-
-#: ../src/daemon/caps.c:58
-msgid "Cleaning up privileges."
-msgstr "取消特权。"
-
-#: ../src/daemon/pulseaudio.desktop.in.h:1
-msgid "PulseAudio Sound System"
-msgstr "PulseAudio 声音系统"
-
-#: ../src/daemon/pulseaudio.desktop.in.h:2
-msgid "Start the PulseAudio Sound System"
-msgstr "启动 PulseAudio 声音系统"
-
-#: ../src/daemon/pulseaudio-kde.desktop.in.h:1
-#, fuzzy
-msgid "PulseAudio Sound System KDE Routing Policy"
-msgstr "PulseAudio 声音系统"
+"sink_name=<name for the sink> sink_properties=<properties for the sink> "
+"master=<name of sink to filter> format=<sample format> rate=<sample rate> "
+"channels=<number of channels> channel_map=<channel map> "
+"use_volume_sharing=<yes or no> force_flat_volume=<yes or no> hrir=/path/to/"
+"left_hrir.wav "
+msgstr ""
+"sink_name=<采样器名称> sink_properties=<采集器属性> sink_master=<要连接的采集"
+"器> format=<采样格式> rate=<采样率> channels=<声道数> channel_map=<声道映射> "
+"use_volume_sharing=<yes 或 no> force_flat_volume=<yes 或 no> hrir=/path/to/"
+"left_hrir.wav "
 
-#: ../src/daemon/pulseaudio-kde.desktop.in.h:2
-#, fuzzy
-msgid "Start the PulseAudio Sound System with KDE Routing Policy"
-msgstr "启动 PulseAudio 声音系统"
+#: ../src/modules/reserve-wrap.c:149
+msgid "PulseAudio Sound Server"
+msgstr "PulseAudio 声音服务器"
 
-#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757
+#: ../src/pulse/channelmap.c:103 ../src/pulse/channelmap.c:771
 msgid "Mono"
 msgstr "单声道"
 
-#: ../src/pulse/channelmap.c:107
+#: ../src/pulse/channelmap.c:105
 msgid "Front Center"
 msgstr "中前"
 
-#: ../src/pulse/channelmap.c:108
+#: ../src/pulse/channelmap.c:106
 msgid "Front Left"
 msgstr "左前"
 
-#: ../src/pulse/channelmap.c:109
+#: ../src/pulse/channelmap.c:107
 msgid "Front Right"
 msgstr "右前"
 
-#: ../src/pulse/channelmap.c:111
+#: ../src/pulse/channelmap.c:109
 msgid "Rear Center"
 msgstr "中后"
 
-#: ../src/pulse/channelmap.c:112
+#: ../src/pulse/channelmap.c:110
 msgid "Rear Left"
 msgstr "左后"
 
-#: ../src/pulse/channelmap.c:113
+#: ../src/pulse/channelmap.c:111
 msgid "Rear Right"
 msgstr "右后"
 
-#: ../src/pulse/channelmap.c:115
+#: ../src/pulse/channelmap.c:113
 msgid "Subwoofer"
-msgstr ""
+msgstr "低音音箱"
 
-#: ../src/pulse/channelmap.c:117
+#: ../src/pulse/channelmap.c:115
 msgid "Front Left-of-center"
 msgstr "前左中央"
 
-#: ../src/pulse/channelmap.c:118
+#: ../src/pulse/channelmap.c:116
 msgid "Front Right-of-center"
 msgstr "前右中央"
 
-#: ../src/pulse/channelmap.c:120
+#: ../src/pulse/channelmap.c:118
 msgid "Side Left"
 msgstr "左侧"
 
-#: ../src/pulse/channelmap.c:121
+#: ../src/pulse/channelmap.c:119
 msgid "Side Right"
 msgstr "右侧"
 
-#: ../src/pulse/channelmap.c:123
+#: ../src/pulse/channelmap.c:121
 msgid "Auxiliary 0"
 msgstr "辅助 0"
 
-#: ../src/pulse/channelmap.c:124
+#: ../src/pulse/channelmap.c:122
 msgid "Auxiliary 1"
 msgstr "辅助 1"
 
-#: ../src/pulse/channelmap.c:125
+#: ../src/pulse/channelmap.c:123
 msgid "Auxiliary 2"
 msgstr "辅助 2"
 
-#: ../src/pulse/channelmap.c:126
+#: ../src/pulse/channelmap.c:124
 msgid "Auxiliary 3"
 msgstr "辅助 3"
 
-#: ../src/pulse/channelmap.c:127
+#: ../src/pulse/channelmap.c:125
 msgid "Auxiliary 4"
 msgstr "辅助 4"
 
-#: ../src/pulse/channelmap.c:128
+#: ../src/pulse/channelmap.c:126
 msgid "Auxiliary 5"
 msgstr "辅助 5"
 
-#: ../src/pulse/channelmap.c:129
+#: ../src/pulse/channelmap.c:127
 msgid "Auxiliary 6"
 msgstr "辅助 6"
 
-#: ../src/pulse/channelmap.c:130
+#: ../src/pulse/channelmap.c:128
 msgid "Auxiliary 7"
 msgstr "辅助 7"
 
-#: ../src/pulse/channelmap.c:131
+#: ../src/pulse/channelmap.c:129
 msgid "Auxiliary 8"
 msgstr "辅助 7"
 
-#: ../src/pulse/channelmap.c:132
+#: ../src/pulse/channelmap.c:130
 msgid "Auxiliary 9"
 msgstr "辅助 9"
 
-#: ../src/pulse/channelmap.c:133
+#: ../src/pulse/channelmap.c:131
 msgid "Auxiliary 10"
 msgstr "辅助 10"
 
-#: ../src/pulse/channelmap.c:134
+#: ../src/pulse/channelmap.c:132
 msgid "Auxiliary 11"
 msgstr "辅助 11"
 
-#: ../src/pulse/channelmap.c:135
+#: ../src/pulse/channelmap.c:133
 msgid "Auxiliary 12"
 msgstr "辅助 12"
 
-#: ../src/pulse/channelmap.c:136
+#: ../src/pulse/channelmap.c:134
 msgid "Auxiliary 13"
 msgstr "辅助 13"
 
-#: ../src/pulse/channelmap.c:137
+#: ../src/pulse/channelmap.c:135
 msgid "Auxiliary 14"
 msgstr "辅助 14"
 
-#: ../src/pulse/channelmap.c:138
+#: ../src/pulse/channelmap.c:136
 msgid "Auxiliary 15"
 msgstr "辅助 15"
 
-#: ../src/pulse/channelmap.c:139
+#: ../src/pulse/channelmap.c:137
 msgid "Auxiliary 16"
 msgstr "辅助 16"
 
-#: ../src/pulse/channelmap.c:140
+#: ../src/pulse/channelmap.c:138
 msgid "Auxiliary 17"
 msgstr "辅助 17"
 
-#: ../src/pulse/channelmap.c:141
+#: ../src/pulse/channelmap.c:139
 msgid "Auxiliary 18"
 msgstr "辅助 18"
 
-#: ../src/pulse/channelmap.c:142
+#: ../src/pulse/channelmap.c:140
 msgid "Auxiliary 19"
 msgstr "辅助 19"
 
-#: ../src/pulse/channelmap.c:143
+#: ../src/pulse/channelmap.c:141
 msgid "Auxiliary 20"
 msgstr "辅助 20"
 
-#: ../src/pulse/channelmap.c:144
+#: ../src/pulse/channelmap.c:142
 msgid "Auxiliary 21"
 msgstr "辅助 21"
 
-#: ../src/pulse/channelmap.c:145
+#: ../src/pulse/channelmap.c:143
 msgid "Auxiliary 22"
 msgstr "辅助 22"
 
-#: ../src/pulse/channelmap.c:146
+#: ../src/pulse/channelmap.c:144
 msgid "Auxiliary 23"
 msgstr "辅助 23"
 
-#: ../src/pulse/channelmap.c:147
+#: ../src/pulse/channelmap.c:145
 msgid "Auxiliary 24"
 msgstr "辅助 24"
 
-#: ../src/pulse/channelmap.c:148
+#: ../src/pulse/channelmap.c:146
 msgid "Auxiliary 25"
 msgstr "辅助 25"
 
-#: ../src/pulse/channelmap.c:149
+#: ../src/pulse/channelmap.c:147
 msgid "Auxiliary 26"
 msgstr "辅助 26"
 
-#: ../src/pulse/channelmap.c:150
+#: ../src/pulse/channelmap.c:148
 msgid "Auxiliary 27"
 msgstr "辅助 27"
 
-#: ../src/pulse/channelmap.c:151
+#: ../src/pulse/channelmap.c:149
 msgid "Auxiliary 28"
 msgstr "辅助 28"
 
-#: ../src/pulse/channelmap.c:152
+#: ../src/pulse/channelmap.c:150
 msgid "Auxiliary 29"
 msgstr "辅助 29"
 
-#: ../src/pulse/channelmap.c:153
+#: ../src/pulse/channelmap.c:151
 msgid "Auxiliary 30"
 msgstr "辅助 30"
 
-#: ../src/pulse/channelmap.c:154
+#: ../src/pulse/channelmap.c:152
 msgid "Auxiliary 31"
 msgstr "辅助 31"
 
-#: ../src/pulse/channelmap.c:156
+#: ../src/pulse/channelmap.c:154
 msgid "Top Center"
 msgstr "上中"
 
-#: ../src/pulse/channelmap.c:158
+#: ../src/pulse/channelmap.c:156
 msgid "Top Front Center"
 msgstr "上中前"
 
-#: ../src/pulse/channelmap.c:159
+#: ../src/pulse/channelmap.c:157
 msgid "Top Front Left"
 msgstr "上左前"
 
-#: ../src/pulse/channelmap.c:160
+#: ../src/pulse/channelmap.c:158
 msgid "Top Front Right"
 msgstr "上右前"
 
-#: ../src/pulse/channelmap.c:162
+#: ../src/pulse/channelmap.c:160
 msgid "Top Rear Center"
 msgstr "上中后"
 
-#: ../src/pulse/channelmap.c:163
+#: ../src/pulse/channelmap.c:161
 msgid "Top Rear Left"
 msgstr "上左后"
 
-#: ../src/pulse/channelmap.c:164
+#: ../src/pulse/channelmap.c:162
 msgid "Top Rear Right"
 msgstr "上右后"
 
-#: ../src/pulse/channelmap.c:484 ../src/pulse/sample.c:169
-#: ../src/pulse/volume.c:297 ../src/pulse/volume.c:323
-#: ../src/pulse/volume.c:343 ../src/pulse/volume.c:373
-#: ../src/pulse/format.c:125
+#: ../src/pulse/channelmap.c:479 ../src/pulse/format.c:121
+#: ../src/pulse/sample.c:175 ../src/pulse/volume.c:294
+#: ../src/pulse/volume.c:320 ../src/pulse/volume.c:340
+#: ../src/pulse/volume.c:372 ../src/pulse/volume.c:412
+#: ../src/pulse/volume.c:431
 msgid "(invalid)"
 msgstr "(无效)"
 
-#: ../src/pulse/channelmap.c:761
+#: ../src/pulse/channelmap.c:775
 msgid "Stereo"
 msgstr "立体声"
 
-#: ../src/pulse/channelmap.c:766
+#: ../src/pulse/channelmap.c:780
 msgid "Surround 4.0"
 msgstr "环绕 4.0 "
 
-#: ../src/pulse/channelmap.c:772
+#: ../src/pulse/channelmap.c:786
 msgid "Surround 4.1"
 msgstr "环绕 4.1"
 
-#: ../src/pulse/channelmap.c:778
+#: ../src/pulse/channelmap.c:792
 msgid "Surround 5.0"
 msgstr "环绕 5.0"
 
-#: ../src/pulse/channelmap.c:784
+#: ../src/pulse/channelmap.c:798
 msgid "Surround 5.1"
 msgstr "环绕 5.1"
 
-#: ../src/pulse/channelmap.c:791
+#: ../src/pulse/channelmap.c:805
 msgid "Surround 7.1"
 msgstr "环绕 7.1"
 
-#: ../src/pulse/error.c:40
+#: ../src/pulse/client-conf-x11.c:53 ../src/utils/pax11publish.c:97
+msgid "xcb_connect() failed"
+msgstr "xcb_connect() 失败"
+
+#: ../src/pulse/client-conf-x11.c:58 ../src/utils/pax11publish.c:102
+msgid "xcb_connection_has_error() returned true"
+msgstr "xcb_connection_has_error() 返回真"
+
+#: ../src/pulse/client-conf-x11.c:94
+msgid "Failed to parse cookie data"
+msgstr "cookie数据分析失败"
+
+#: ../src/pulse/context.c:656
+#, c-format
+msgid "fork(): %s"
+msgstr "fork():%s"
+
+#: ../src/pulse/context.c:711
+#, c-format
+msgid "waitpid(): %s"
+msgstr "waitpid():%s"
+
+#: ../src/pulse/context.c:1417
+#, c-format
+msgid "Received message for unknown extension '%s'"
+msgstr "收到未知扩展'%s'的信息"
+
+#: ../src/pulse/direction.c:37
+msgid "input"
+msgstr "输入"
+
+#: ../src/pulse/direction.c:39
+msgid "output"
+msgstr "输出"
+
+#: ../src/pulse/direction.c:41
+msgid "bidirectional"
+msgstr "双向"
+
+#: ../src/pulse/direction.c:43
+msgid "invalid"
+msgstr "无效"
+
+#: ../src/pulsecore/core-util.c:1833
+#, c-format
+msgid ""
+"XDG_RUNTIME_DIR (%s) is not owned by us (uid %d), but by uid %d! (This could "
+"e g happen if you try to connect to a non-root PulseAudio as a root user, "
+"over the native protocol. Don't do that.)"
+msgstr ""
+
+#: ../src/pulsecore/core-util.h:97
+msgid "yes"
+msgstr "是"
+
+#: ../src/pulsecore/core-util.h:97
+msgid "no"
+msgstr "否"
+
+#: ../src/pulsecore/lock-autospawn.c:141 ../src/pulsecore/lock-autospawn.c:227
+msgid "Cannot access autospawn lock."
+msgstr "不能访问 autospawn 锁。"
+
+#: ../src/pulsecore/log.c:154
+#, c-format
+msgid "Failed to open target file '%s'."
+msgstr "打开目标文件 %s 失败。"
+
+#: ../src/pulsecore/log.c:177
+#, c-format
+msgid ""
+"Tried to open target file '%s', '%s.1', '%s.2' ... '%s.%d', but all failed."
+msgstr "尝试打开目标文件 '%s','%s.1','%s.2'…'%s.%d',但均失败。"
+
+#: ../src/pulsecore/log.c:640
+msgid "Invalid log target."
+msgstr "无效的日志目标。"
+
+#: ../src/pulsecore/sink.c:3460
+msgid "Built-in Audio"
+msgstr "内部音频"
+
+#: ../src/pulsecore/sink.c:3465
+msgid "Modem"
+msgstr "调制解调器"
+
+#: ../src/pulse/error.c:38
 msgid "OK"
 msgstr "确定"
 
-#: ../src/pulse/error.c:41
+#: ../src/pulse/error.c:39
 msgid "Access denied"
 msgstr "拒绝访问"
 
-#: ../src/pulse/error.c:42
+#: ../src/pulse/error.c:40
 msgid "Unknown command"
 msgstr "未知命令"
 
-#: ../src/pulse/error.c:43
+#: ../src/pulse/error.c:41
 msgid "Invalid argument"
 msgstr "无效参数"
 
-#: ../src/pulse/error.c:44
+#: ../src/pulse/error.c:42
 msgid "Entity exists"
 msgstr "实体存在"
 
-#: ../src/pulse/error.c:45
+#: ../src/pulse/error.c:43
 msgid "No such entity"
 msgstr "没有该实体"
 
-#: ../src/pulse/error.c:46
+#: ../src/pulse/error.c:44
 msgid "Connection refused"
 msgstr "拒绝连接"
 
-#: ../src/pulse/error.c:47
+#: ../src/pulse/error.c:45
 msgid "Protocol error"
 msgstr "协议错误"
 
-#: ../src/pulse/error.c:48
+#: ../src/pulse/error.c:46
 msgid "Timeout"
 msgstr "超时"
 
-#: ../src/pulse/error.c:49
-msgid "No authorization key"
+#: ../src/pulse/error.c:47
+msgid "No authentication key"
 msgstr "没有授权密钥"
 
-#: ../src/pulse/error.c:50
+#: ../src/pulse/error.c:48
 msgid "Internal error"
 msgstr "内部错误"
 
-#: ../src/pulse/error.c:51
+#: ../src/pulse/error.c:49
 msgid "Connection terminated"
 msgstr "连接终止"
 
-#: ../src/pulse/error.c:52
+#: ../src/pulse/error.c:50
 msgid "Entity killed"
 msgstr "实体已杀死"
 
-#: ../src/pulse/error.c:53
+#: ../src/pulse/error.c:51
 msgid "Invalid server"
 msgstr "无效服务器"
 
-#: ../src/pulse/error.c:54
+#: ../src/pulse/error.c:52
 msgid "Module initialization failed"
 msgstr "模块初始化失败"
 
-#: ../src/pulse/error.c:55
+#: ../src/pulse/error.c:53
 msgid "Bad state"
 msgstr "坏状态"
 
-#: ../src/pulse/error.c:56
+#: ../src/pulse/error.c:54
 msgid "No data"
 msgstr "没有数据"
 
-#: ../src/pulse/error.c:57
+#: ../src/pulse/error.c:55
 msgid "Incompatible protocol version"
 msgstr "不兼容的协议版本"
 
-#: ../src/pulse/error.c:58
+#: ../src/pulse/error.c:56
 msgid "Too large"
 msgstr "太大"
 
-#: ../src/pulse/error.c:59
+#: ../src/pulse/error.c:57
 msgid "Not supported"
 msgstr "不支持"
 
-#: ../src/pulse/error.c:60
+#: ../src/pulse/error.c:58
 msgid "Unknown error code"
 msgstr "未知错误码"
 
-#: ../src/pulse/error.c:61
+#: ../src/pulse/error.c:59
 msgid "No such extension"
 msgstr "没有该扩展"
 
-#: ../src/pulse/error.c:62
+#: ../src/pulse/error.c:60
 msgid "Obsolete functionality"
 msgstr "废弃的功能性"
 
-#: ../src/pulse/error.c:63
+#: ../src/pulse/error.c:61
 msgid "Missing implementation"
 msgstr "缺少部署"
 
-#: ../src/pulse/error.c:64
+#: ../src/pulse/error.c:62
 msgid "Client forked"
 msgstr "客户端分支"
 
-#: ../src/pulse/error.c:65
+#: ../src/pulse/error.c:63
 msgid "Input/Output error"
 msgstr "输入/输出错误"
 
-#: ../src/pulse/error.c:66
+#: ../src/pulse/error.c:64
 msgid "Device or resource busy"
 msgstr "设备或者资源忙"
 
-#: ../src/pulse/sample.c:171
+#: ../src/pulse/sample.c:177
 #, c-format
 msgid "%s %uch %uHz"
 msgstr "%s %uch %uHz"
 
-#: ../src/pulse/sample.c:183
+#: ../src/pulse/sample.c:189
 #, c-format
 msgid "%0.1f GiB"
 msgstr "%0.1f GiB"
 
-#: ../src/pulse/sample.c:185
+#: ../src/pulse/sample.c:191
 #, c-format
 msgid "%0.1f MiB"
 msgstr "%0.1f MiB"
 
-#: ../src/pulse/sample.c:187
-#, c-format
-msgid "%0.1f KiB"
-msgstr "%0.1f KiB"
-
-#: ../src/pulse/sample.c:189
-#, c-format
-msgid "%u B"
-msgstr "%u B"
-
-#: ../src/pulse/client-conf-x11.c:54 ../src/utils/pax11publish.c:100
-#, fuzzy
-msgid "xcb_connect() failed"
-msgstr "pa_context_connect()失败:%s"
-
-#: ../src/pulse/client-conf-x11.c:59 ../src/utils/pax11publish.c:105
-msgid "xcb_connection_has_error() returned true"
-msgstr ""
-
-#: ../src/pulse/client-conf-x11.c:97
-msgid "Failed to parse cookie data"
-msgstr "cookie数据分析失败"
-
-#: ../src/pulse/client-conf.c:117
+#: ../src/pulse/sample.c:193
 #, c-format
-msgid "Failed to open configuration file '%s': %s"
-msgstr "打开配置文件'%s'失败:%s"
-
-#: ../src/pulse/context.c:528
-msgid "No cookie loaded. Attempting to connect without."
-msgstr "没有加载cookie。尝试不加载cookie进行连接。"
+msgid "%0.1f KiB"
+msgstr "%0.1f KiB"
 
-#: ../src/pulse/context.c:675
+#: ../src/pulse/sample.c:195
 #, c-format
-msgid "fork(): %s"
-msgstr "fork():%s"
+msgid "%u B"
+msgstr "%u B"
 
-#: ../src/pulse/context.c:730
+#: ../src/tests/resampler-test.c:255
 #, c-format
-msgid "waitpid(): %s"
-msgstr "waitpid():%s"
+msgid ""
+"%s [options]\n"
+"\n"
+"-h, --help                            Show this help\n"
+"-v, --verbose                         Print debug messages\n"
+"      --from-rate=SAMPLERATE          From sample rate in Hz (defaults to "
+"44100)\n"
+"      --from-format=SAMPLEFORMAT      From sample type (defaults to s16le)\n"
+"      --from-channels=CHANNELS        From number of channels (defaults to "
+"1)\n"
+"      --to-rate=SAMPLERATE            To sample rate in Hz (defaults to "
+"44100)\n"
+"      --to-format=SAMPLEFORMAT        To sample type (defaults to s16le)\n"
+"      --to-channels=CHANNELS          To number of channels (defaults to 1)\n"
+"      --resample-method=METHOD        Resample method (defaults to auto)\n"
+"      --seconds=SECONDS               From stream duration (defaults to 60)\n"
+"\n"
+"If the formats are not specified, the test performs all formats "
+"combinations,\n"
+"back and forth.\n"
+"\n"
+"Sample type must be one of s16le, s16be, u8, float32le, float32be, ulaw, "
+"alaw,\n"
+"s24le, s24be, s24-32le, s24-32be, s32le, s32be (defaults to s16ne)\n"
+"\n"
+"See --dump-resample-methods for possible values of resample methods.\n"
+msgstr ""
+"%s [选项]\n"
+"\n"
+"-h, --help                            显示帮助\n"
+"-v, --verbose                         输出调试信息\n"
+"      --from-rate=SAMPLERATE          音源频率(默认为 44100)赫兹\n"
+"      --from-format=SAMPLEFORMAT      音源格式(默认为 s16le)\n"
+"      --from-channels=CHANNELS        音源声道(默认为 1)\n"
+"      --to-rate=SAMPLERATE           转换为频率(默认 44100)赫兹\n"
+"      --to-format=SAMPLEFORMAT        转换为格式(默认为 s16le)\n"
+"      --to-channels=CHANNELS          转换到声道(默认为 1)\n"
+"      --resample-method=METHOD        重采样方法(默认为自动)\n"
+"      --seconds=SECONDS               音源流长度(默认为 60 秒)\n"
+"\n"
+"如果格式未指定,将会测试进行所有格式组合来回测试。\n"
+"\n"
+"采样类型有这几种:s16le,s16be,u8,float32le,float32be,ulaw,alaw,\n"
+"s24le,s24be,s24-32le,s24-32be,s32le,s32be。\n"
+"\n"
+"使用 --dump-resample-methods 参数可列出可能的采样方法。\n"
 
-#: ../src/pulse/context.c:1431
+#: ../src/tests/resampler-test.c:353
 #, c-format
-msgid "Received message for unknown extension '%s'"
-msgstr "收到未知扩展'%s'的信息"
+msgid "%s %s\n"
+msgstr "%s %s\n"
 
-#: ../src/utils/pacat.c:112
+#: ../src/utils/pacat.c:117
 #, c-format
 msgid "Failed to drain stream: %s"
-msgstr "排出流失败:%s"
+msgstr "排空流失败:%s"
 
-#: ../src/utils/pacat.c:117
+#: ../src/utils/pacat.c:122
 msgid "Playback stream drained."
 msgstr "回放流枯竭。"
 
-#: ../src/utils/pacat.c:128
+#: ../src/utils/pacat.c:133
 msgid "Draining connection to server."
 msgstr "到服务器的 Draining 连接。"
 
-#: ../src/utils/pacat.c:141
+#: ../src/utils/pacat.c:146
 #, c-format
 msgid "pa_stream_drain(): %s"
 msgstr "pa_stream_drain(): %s"
 
-#: ../src/utils/pacat.c:164
+#: ../src/utils/pacat.c:169
 #, c-format
 msgid "pa_stream_write() failed: %s"
-msgstr "pa_stream_write() failed: %s"
+msgstr "pa_stream_write() 失败: %s"
 
-#: ../src/utils/pacat.c:205
+#: ../src/utils/pacat.c:210
 #, c-format
 msgid "pa_stream_begin_write() failed: %s"
-msgstr "pa_stream_begin_write() failed: %s"
+msgstr "pa_stream_begin_write() 失败: %s"
 
-#: ../src/utils/pacat.c:255 ../src/utils/pacat.c:285
+#: ../src/utils/pacat.c:260 ../src/utils/pacat.c:290
 #, c-format
 msgid "pa_stream_peek() failed: %s"
-msgstr "pa_stream_peek() failed: %s"
+msgstr "pa_stream_peek() 失败: %s"
 
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
 msgid "Stream successfully created."
 msgstr "流创建成功。"
 
-#: ../src/utils/pacat.c:328
+#: ../src/utils/pacat.c:343
 #, c-format
 msgid "pa_stream_get_buffer_attr() failed: %s"
-msgstr "pa_stream_get_buffer_attr() failed: %s"
+msgstr "pa_stream_get_buffer_attr() 失败: %s"
 
-#: ../src/utils/pacat.c:332
+#: ../src/utils/pacat.c:347
 #, c-format
 msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
-msgstr "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
+msgstr "缓冲矩阵:maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
 
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
 #, c-format
 msgid "Buffer metrics: maxlength=%u, fragsize=%u"
-msgstr "Buffer metrics: maxlength=%u, fragsize=%u"
+msgstr "缓冲矩阵:maxlength=%u, fragsize=%u"
 
-#: ../src/utils/pacat.c:339
+#: ../src/utils/pacat.c:354
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'."
-msgstr "正在使用样品规格 '%s',通道映射 '%s'。"
+msgstr "正在使用采样规格 '%s',通道映射 '%s'。"
 
-#: ../src/utils/pacat.c:343
+#: ../src/utils/pacat.c:358
 #, c-format
-msgid "Connected to device %s (%u, %ssuspended)."
-msgstr "已连接至设备 %s (%u,%s 挂起)。"
+msgid "Connected to device %s (index: %u, suspended: %s)."
+msgstr "已连接至设备 %s (索引: %u,已挂起: %s)。"
 
-#: ../src/utils/pacat.c:353
+#: ../src/utils/pacat.c:368
 #, c-format
 msgid "Stream error: %s"
 msgstr "流错误:%s"
 
-#: ../src/utils/pacat.c:363
+#: ../src/utils/pacat.c:378
 #, c-format
 msgid "Stream device suspended.%s"
 msgstr "流设备挂起。%s"
 
-#: ../src/utils/pacat.c:365
+#: ../src/utils/pacat.c:380
 #, c-format
 msgid "Stream device resumed.%s"
 msgstr "流设备恢复。%s"
 
-#: ../src/utils/pacat.c:373
+#: ../src/utils/pacat.c:388
 #, c-format
 msgid "Stream underrun.%s"
 msgstr "流欠载运行。%s"
 
-#: ../src/utils/pacat.c:380
+#: ../src/utils/pacat.c:395
 #, c-format
 msgid "Stream overrun.%s"
 msgstr "流超限运行。%s"
 
-#: ../src/utils/pacat.c:387
+#: ../src/utils/pacat.c:402
 #, c-format
 msgid "Stream started.%s"
 msgstr "流已启动。%s"
 
-#: ../src/utils/pacat.c:394
+#: ../src/utils/pacat.c:409
 #, c-format
 msgid "Stream moved to device %s (%u, %ssuspended).%s"
 msgstr "流移至设备 %s (%u,%s 挂起)。%s"
 
-#: ../src/utils/pacat.c:394
+#: ../src/utils/pacat.c:409
 msgid "not "
 msgstr "not "
 
-#: ../src/utils/pacat.c:401
+#: ../src/utils/pacat.c:416
 #, c-format
 msgid "Stream buffer attributes changed.%s"
 msgstr "更改流缓冲属性。%s"
 
-#: ../src/utils/pacat.c:416
+#: ../src/utils/pacat.c:431
 msgid "Cork request stack is empty: corking stream"
-msgstr ""
+msgstr "抑制请求列表为空:正在抑制音频流"
 
-#: ../src/utils/pacat.c:422
+#: ../src/utils/pacat.c:437
 msgid "Cork request stack is empty: uncorking stream"
-msgstr ""
+msgstr "抑制请求列表为空:正在反抑制音频流"
 
-#: ../src/utils/pacat.c:426
-msgid "Warning: Received more uncork requests than cork requests!"
-msgstr ""
+#: ../src/utils/pacat.c:441
+msgid "Warning: Received more uncork requests than cork requests."
+msgstr "警告:收到比抑制请求更多的反抑制请求!"
 
-#: ../src/utils/pacat.c:451
+#: ../src/utils/pacat.c:466
 #, c-format
 msgid "Connection established.%s"
 msgstr "连接已建立。%s "
 
-#: ../src/utils/pacat.c:454
+#: ../src/utils/pacat.c:469
 #, c-format
 msgid "pa_stream_new() failed: %s"
-msgstr "pa_stream_new() failed: %s"
+msgstr "pa_stream_new() 失败: %s"
 
-#: ../src/utils/pacat.c:492
+#: ../src/utils/pacat.c:507
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s"
-msgstr "pa_stream_connect_playback() failed: %s"
+msgstr "pa_stream_connect_playback() 失败: %s"
 
-#: ../src/utils/pacat.c:498
+#: ../src/utils/pacat.c:513
+#, c-format
+msgid "Failed to set monitor stream: %s"
+msgstr "设置监视器流失败: %s"
+
+#: ../src/utils/pacat.c:517
 #, c-format
 msgid "pa_stream_connect_record() failed: %s"
-msgstr "pa_stream_connect_record() failed: %s"
+msgstr "pa_stream_connect_record() 失败: %s"
 
-#: ../src/utils/pacat.c:512 ../src/utils/pactl.c:1252
+#: ../src/utils/pacat.c:530 ../src/utils/pactl.c:1446
 #, c-format
 msgid "Connection failure: %s"
 msgstr "连接失败:%s"
 
-#: ../src/utils/pacat.c:545
+#: ../src/utils/pacat.c:563
 msgid "Got EOF."
 msgstr "获得 EOF。"
 
-#: ../src/utils/pacat.c:582
+#: ../src/utils/pacat.c:600
 #, c-format
 msgid "write() failed: %s"
 msgstr "写入()失败:%s"
 
-#: ../src/utils/pacat.c:603
+#: ../src/utils/pacat.c:621
 msgid "Got signal, exiting."
 msgstr "收到信号,正在退出。"
 
-#: ../src/utils/pacat.c:617
+#: ../src/utils/pacat.c:635
 #, c-format
 msgid "Failed to get latency: %s"
 msgstr "获取传输延迟失败:%s"
 
-#: ../src/utils/pacat.c:622
+#: ../src/utils/pacat.c:640
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec."
 msgstr "时间:%0.3f 秒;延迟:%0.0f 微秒。"
 
-#: ../src/utils/pacat.c:643
+#: ../src/utils/pacat.c:661
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s"
-msgstr "pa_stream_update_timing_info() failed: %s"
+msgstr "pa_stream_update_timing_info() 失败: %s"
 
-#: ../src/utils/pacat.c:653
-#, fuzzy, c-format
+#: ../src/utils/pacat.c:671
+#, c-format
 msgid ""
 "%s [options]\n"
+"%s\n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
@@ -1390,16 +1848,16 @@ msgid ""
 "                                        (defaults to 2)\n"
 "      --channel-map=CHANNELMAP          Channel map to use instead of the "
 "default\n"
-"      --fix-format                      Take the sample format from the sink "
-"the stream is\n"
+"      --fix-format                      Take the sample format from the sink/"
+"source the stream is\n"
 "                                        being connected to.\n"
-"      --fix-rate                        Take the sampling rate from the sink "
-"the stream is\n"
+"      --fix-rate                        Take the sampling rate from the sink/"
+"source the stream is\n"
 "                                        being connected to.\n"
 "      --fix-channels                    Take the number of channels and the "
 "channel map\n"
-"                                        from the sink the stream is being "
-"connected to.\n"
+"                                        from the sink/source the stream is "
+"being connected to.\n"
 "      --no-remix                        Don't upmix or downmix channels.\n"
 "      --no-remap                        Map channels by index instead of "
 "name.\n"
@@ -1414,45 +1872,67 @@ msgid ""
 "      --property=PROPERTY=VALUE         Set the specified property to the "
 "specified value.\n"
 "      --raw                             Record/play raw PCM data.\n"
-"      --passthrough                     passthrough data \n"
+"      --passthrough                     Passthrough data.\n"
 "      --file-format[=FFORMAT]           Record/play formatted PCM data.\n"
 "      --list-file-formats               List available file formats.\n"
+"      --monitor-stream=INDEX            Record from the sink input with "
+"index INDEX.\n"
 msgstr ""
-"%s [options]\n"
+"%s [选项]\n"
+"%s\n"
+"  -h, --help                        显示此帮助\n"
+"      --version                     显示版本\n"
 "\n"
-"  -h, --help                            显示此帮助\n"
-"      --version                         显示版本\n"
+"  -r, --record                      为录制创建连接\n"
+"  -p, --playback                    为回放创建连接\n"
 "\n"
-"  -r, --record                          为录制创建连接\n"
-"  -p, --playback                        为回放创建连接\n"
+"  -v, --verbose                     启用详述操作\n"
 "\n"
-"  -v, --verbose                         启用详述操作\n"
-"\n"
-"  -s, --server=SERVER                   要连接的服务器名\n"
-"  -d, --device=DEVICE                   要连接的漏/源名称\n"
-"  -n, --client-name=NAME                如何在服务器中调用此客户端\n"
-"      --stream-name=NAME                如何在服务器中调用这个流\n"
-"      --volume=VOLUME                   指定初始(线性)音量,取值在0...65536"
-"之间\n"
-"      --rate=SAMPLERATE                 采样频率(单位 Hz,默认为44100)\n"
-"      --format=SAMPLEFORMAT             采样类型,s16le、s16be、u8、"
-"float32le 之一\n"
-"                                        float32be、ulaw、alaw、s32le、s32be "
-"中取(默认为 s16ne)\n"
-"      --channels=CHANNELS               通道数,1为单声道,2为立体声(默认为"
-"2)\n"
-"      --channel-map=CHANNELMAP          取代默认值的通道映射表\n"
-"      --fix-format                      从流连接的漏中提取采样格式。\n"
-"      --fix-rate                        从流连接的漏中提取采样率。\n"
-"      --fix-channels                    从流连接的漏中提取通道数和通道映射"
+"  -s, --server=服务器               要连接的服务器名\n"
+"  -d, --device=设备名               要连接的采集器/信源名称\n"
+"  -n, --client-name=名称            如何在服务器中调用此客户端\n"
+"      --stream-name=名称            如何在服务器中调用这个流\n"
+"      --volume=音量                 指定初始(线性)音量,取值在0...65536之"
+"间\n"
+"      --rate=SAMPLERATE             采样频率(单位 Hz,默认为44100)\n"
+"      --format=SAMPLEFORMAT         采样类型,s16le、s16be、u8、float32le 之"
+"一\n"
+"                                    float32be、ulaw、alaw、s32le、s32be 中取"
+"(默认为 s16ne)\n"
+"      --channels=CHANNELS           通道数,1为单声道,2为立体声(默认为2)\n"
+"      --channel-map=CHANNELMAP      取代默认值的通道映射表\n"
+"      --fix-format                  从流连接的采集器中提取采样格式。\n"
+"      --fix-rate                    从流连接的采集器中提取采样率。\n"
+"      --fix-channels                从流连接的采集器中提取通道数和通道映射"
 "表。\n"
-"      --no-remix                        不要对通道进行 upmix 或者 downmix 操"
+"      --no-remix                    不要对通道进行 upmix 或者 downmix 操"
 "作。\n"
-"      --no-remap                        根据下标而非名称来映射通道。\n"
-"      --latency=BYTES                   请求指定字节数的延迟。\n"
-"      --process-time=BYTES              每次请求指定字节数的处理时间。\n"
+"      --no-remap                    根据下标而非名称来映射通道。\n"
+"      --latency=BYTES               请求指定字节数的延迟。\n"
+"      --process-time=BYTES          每次请求指定字节数的处理时间。\n"
+
+#: ../src/utils/pacat.c:788
+msgid "Play back encoded audio files on a PulseAudio sound server."
+msgstr ""
+
+#: ../src/utils/pacat.c:792
+msgid ""
+"Capture audio data from a PulseAudio sound server and write it to a file."
+msgstr ""
 
-#: ../src/utils/pacat.c:786
+#: ../src/utils/pacat.c:796
+msgid ""
+"Capture audio data from a PulseAudio sound server and write it to STDOUT or "
+"the specified file."
+msgstr ""
+
+#: ../src/utils/pacat.c:800
+msgid ""
+"Play back audio data from STDIN or the specified file on a PulseAudio sound "
+"server."
+msgstr ""
+
+#: ../src/utils/pacat.c:814
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1460,246 +1940,315 @@ msgid ""
 "Linked with libpulse %s\n"
 msgstr ""
 "pacat %s\n"
-"Compiled with libpulse %s\n"
-"Linked with libpulse %s\n"
+"编译到 libpulse %s\n"
+"链接到 libpulse %s\n"
 
-#: ../src/utils/pacat.c:819 ../src/utils/pactl.c:1400
+#: ../src/utils/pacat.c:847 ../src/utils/pactl.c:1648
 #, c-format
 msgid "Invalid client name '%s'"
 msgstr "无效客户端名称 '%s'"
 
-#: ../src/utils/pacat.c:834
+#: ../src/utils/pacat.c:862
 #, c-format
 msgid "Invalid stream name '%s'"
 msgstr "无效流名称 '%s'"
 
-#: ../src/utils/pacat.c:871
+#: ../src/utils/pacat.c:899
 #, c-format
 msgid "Invalid channel map '%s'"
 msgstr "无效通道映射 '%s'"
 
-#: ../src/utils/pacat.c:900 ../src/utils/pacat.c:914
+#: ../src/utils/pacat.c:928 ../src/utils/pacat.c:942
 #, c-format
 msgid "Invalid latency specification '%s'"
 msgstr "无效延迟说明 %s'"
 
-#: ../src/utils/pacat.c:907 ../src/utils/pacat.c:921
+#: ../src/utils/pacat.c:935 ../src/utils/pacat.c:949
 #, c-format
 msgid "Invalid process time specification '%s'"
 msgstr "无效处理时间说明 '%s'"
 
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:961
 #, c-format
 msgid "Invalid property '%s'"
-msgstr "无效性能 '%s'"
+msgstr "无效属性 '%s'"
 
-#: ../src/utils/pacat.c:952
+#: ../src/utils/pacat.c:980
 #, c-format
 msgid "Unknown file format %s."
 msgstr "未知文件格式 %s。"
 
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:995
+msgid "Failed to parse the argument for --monitor-stream"
+msgstr "--monitor-stream 的参数解析失败"
+
+#: ../src/utils/pacat.c:1006
 msgid "Invalid sample specification"
 msgstr "无效采样说明"
 
-#: ../src/utils/pacat.c:981
+#: ../src/utils/pacat.c:1016
 #, c-format
 msgid "open(): %s"
 msgstr "open(): %s"
 
-#: ../src/utils/pacat.c:986
+#: ../src/utils/pacat.c:1021
 #, c-format
 msgid "dup2(): %s"
 msgstr "dup2(): %s"
 
-#: ../src/utils/pacat.c:993
+#: ../src/utils/pacat.c:1028
 msgid "Too many arguments."
 msgstr "参数过多。"
 
-#: ../src/utils/pacat.c:1004
+#: ../src/utils/pacat.c:1039
 msgid "Failed to generate sample specification for file."
 msgstr "为文件获取采样说明失败。"
 
-#: ../src/utils/pacat.c:1030
+#: ../src/utils/pacat.c:1065
 msgid "Failed to open audio file."
 msgstr "打开声音文件失败。"
 
-#: ../src/utils/pacat.c:1036
+#: ../src/utils/pacat.c:1071
 msgid ""
 "Warning: specified sample specification will be overwritten with "
 "specification from file."
 msgstr "警告:指定的采样说明将覆盖文件中的说明。"
 
-#: ../src/utils/pacat.c:1039 ../src/utils/pactl.c:1467
+#: ../src/utils/pacat.c:1074 ../src/utils/pactl.c:1712
 msgid "Failed to determine sample specification from file."
 msgstr "从文件中确定采样说明失败。"
 
-#: ../src/utils/pacat.c:1048
+#: ../src/utils/pacat.c:1083
 msgid "Warning: Failed to determine channel map from file."
 msgstr "警告:从文件中确定通道映射失败。"
 
-#: ../src/utils/pacat.c:1059
+#: ../src/utils/pacat.c:1094
 msgid "Channel map doesn't match sample specification"
 msgstr "通道映射与采样说明不匹配"
 
-#: ../src/utils/pacat.c:1070
+#: ../src/utils/pacat.c:1105
 msgid "Warning: failed to write channel map to file."
 msgstr "警告:在文件中写入通道映射失败。"
 
-#: ../src/utils/pacat.c:1085
+#: ../src/utils/pacat.c:1120
 #, c-format
 msgid ""
 "Opening a %s stream with sample specification '%s' and channel map '%s'."
 msgstr "使用采样说明 '%s' 和通道映射 '%s' 打开 %s 流。"
 
-#: ../src/utils/pacat.c:1086
+#: ../src/utils/pacat.c:1121
 msgid "recording"
 msgstr "正在录制"
 
-#: ../src/utils/pacat.c:1086
+#: ../src/utils/pacat.c:1121
 msgid "playback"
 msgstr "回放"
 
-#: ../src/utils/pacat.c:1110
-#, fuzzy
+#: ../src/utils/pacat.c:1145
 msgid "Failed to set media name."
-msgstr "分析命令行失败。"
+msgstr "设置媒体名失败。"
 
-#: ../src/utils/pacat.c:1117 ../src/utils/pactl.c:1777
+#: ../src/utils/pacat.c:1152 ../src/utils/pactl.c:2062
 msgid "pa_mainloop_new() failed."
-msgstr "pa_mainloop_new() failed."
+msgstr "pa_mainloop_new() 失败。"
 
-#: ../src/utils/pacat.c:1136
+#: ../src/utils/pacat.c:1175
 msgid "io_new() failed."
-msgstr "io_new() failed."
+msgstr "io_new() 失败。"
 
-#: ../src/utils/pacat.c:1143 ../src/utils/pactl.c:1789
+#: ../src/utils/pacat.c:1182 ../src/utils/pactl.c:2074
 msgid "pa_context_new() failed."
-msgstr "pa_context_new() failed."
+msgstr "pa_context_new() 失败。"
 
-#: ../src/utils/pacat.c:1151 ../src/utils/pactl.c:1795
+#: ../src/utils/pacat.c:1190 ../src/utils/pactl.c:2080
 #, c-format
 msgid "pa_context_connect() failed: %s"
-msgstr "pa_context_connect()失败:%s"
+msgstr "pa_context_connect() 失败:%s"
 
-#: ../src/utils/pacat.c:1157
+#: ../src/utils/pacat.c:1196
 msgid "pa_context_rttime_new() failed."
-msgstr "pa_context_rttime_new() failed."
+msgstr "pa_context_rttime_new() 失败。"
 
-#: ../src/utils/pacat.c:1164 ../src/utils/pactl.c:1800
+#: ../src/utils/pacat.c:1203 ../src/utils/pactl.c:2085
 msgid "pa_mainloop_run() failed."
-msgstr "pa_mainloop_run() failed."
+msgstr "pa_mainloop_run() 失败。"
 
-#: ../src/utils/pasuspender.c:79
-#, c-format
-msgid "fork(): %s\n"
-msgstr "fork():%s\n"
+#: ../src/utils/pacmd.c:51 ../src/utils/pactl.c:1570
+msgid "NAME [ARGS ...]"
+msgstr "名称 [参数 ...]"
 
-#: ../src/utils/pasuspender.c:90
-#, c-format
-msgid "execvp(): %s\n"
-msgstr "execvp():%s\n"
+#: ../src/utils/pacmd.c:52 ../src/utils/pacmd.c:60 ../src/utils/pactl.c:1571
+msgid "NAME|#N"
+msgstr "名称|#N"
 
-#: ../src/utils/pasuspender.c:107
-#, c-format
-msgid "Failure to suspend: %s\n"
-msgstr "挂起失败:%s\n"
+#: ../src/utils/pacmd.c:53 ../src/utils/pacmd.c:63 ../src/utils/pactl.c:1569
+#: ../src/utils/pactl.c:1575
+msgid "NAME"
+msgstr "名称"
 
-#: ../src/utils/pasuspender.c:122
-#, c-format
-msgid "Failure to resume: %s\n"
-msgstr "恢复失败:%s\n"
+#: ../src/utils/pacmd.c:54
+msgid "NAME|#N VOLUME"
+msgstr "名称|#N 音量"
 
-#: ../src/utils/pasuspender.c:145
-#, c-format
-msgid "WARNING: Sound server is not local, not suspending.\n"
-msgstr "警告:非本地声音服务器,不会挂起。\n"
+#: ../src/utils/pacmd.c:55
+msgid "#N VOLUME"
+msgstr "#N 音量"
 
-#: ../src/utils/pasuspender.c:157
-#, c-format
-msgid "Connection failure: %s\n"
-msgstr "连接失败:%s\n"
+#: ../src/utils/pacmd.c:56 ../src/utils/pacmd.c:70 ../src/utils/pactl.c:1573
+msgid "NAME|#N 1|0"
+msgstr "名称|#N 1|0"
 
-#: ../src/utils/pasuspender.c:174
-#, c-format
-msgid "Got SIGINT, exiting.\n"
-msgstr "收到SIGINT,正在退出。\n"
+#: ../src/utils/pacmd.c:57
+msgid "#N 1|0"
+msgstr "#N 1|0"
 
-#: ../src/utils/pasuspender.c:192
-#, c-format
-msgid "WARNING: Child process terminated by signal %u\n"
-msgstr "警告:子进程被信号%u终止\n"
+#: ../src/utils/pacmd.c:58
+msgid "NAME|#N KEY=VALUE"
+msgstr "名称|#N 键=值"
+
+#: ../src/utils/pacmd.c:59
+msgid "#N KEY=VALUE"
+msgstr "#N 键=值"
+
+#: ../src/utils/pacmd.c:61
+msgid "#N"
+msgstr "#N"
+
+#: ../src/utils/pacmd.c:62
+msgid "NAME SINK|#N"
+msgstr "名称 采集器|#N"
+
+#: ../src/utils/pacmd.c:64 ../src/utils/pacmd.c:65
+msgid "NAME FILENAME"
+msgstr "名称 文件名"
+
+#: ../src/utils/pacmd.c:66
+msgid "PATHNAME"
+msgstr "路径名"
+
+#: ../src/utils/pacmd.c:67
+msgid "FILENAME SINK|#N"
+msgstr "文件名 采集器|#N"
+
+#: ../src/utils/pacmd.c:69 ../src/utils/pactl.c:1572
+msgid "#N SINK|SOURCE"
+msgstr "#N 采集器|信号源"
+
+#: ../src/utils/pacmd.c:71 ../src/utils/pacmd.c:77 ../src/utils/pacmd.c:78
+msgid "1|0"
+msgstr "1|0"
+
+#: ../src/utils/pacmd.c:72 ../src/utils/pactl.c:1574
+msgid "CARD PROFILE"
+msgstr "声卡配置文件"
+
+#: ../src/utils/pacmd.c:73 ../src/utils/pactl.c:1576
+msgid "NAME|#N PORT"
+msgstr "名称|#N 端口"
+
+#: ../src/utils/pacmd.c:74 ../src/utils/pactl.c:1582
+msgid "CARD-NAME|CARD-#N PORT OFFSET"
+msgstr "声卡名|卡号-#N 端口 偏移量"
+
+#: ../src/utils/pacmd.c:75
+msgid "TARGET"
+msgstr "目标"
+
+#: ../src/utils/pacmd.c:76
+msgid "NUMERIC-LEVEL"
+msgstr ""
+
+#: ../src/utils/pacmd.c:79
+msgid "FRAMES"
+msgstr ""
 
-#: ../src/utils/pasuspender.c:210
+#: ../src/utils/pacmd.c:81
 #, c-format
 msgid ""
-"%s [options] ... \n"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
-"  -s, --server=SERVER                   The name of the server to connect "
-"to\n"
-"\n"
+"When no command is given pacmd starts in the interactive mode.\n"
 msgstr ""
-"%s [options] ... \n"
 "\n"
 "  -h, --help                            显示此帮助\n"
-"      --version                         显示版本\n"
-"  -s, --server=SERVER                   要连接的服务器名\n"
-"\n"
+"     --version                     显示版本\n"
+"不给定命令的话 pacmd 会启动入交互模式。\n"
 
-#: ../src/utils/pasuspender.c:248
+#: ../src/utils/pacmd.c:128
 #, c-format
 msgid ""
-"pasuspender %s\n"
+"pacmd %s\n"
 "Compiled with libpulse %s\n"
 "Linked with libpulse %s\n"
 msgstr ""
-"pasuspender %s\n"
-"Compiled with libpulse %s\n"
-"Linked with libpulse %s\n"
+"pacmd %s\n"
+"编译到 libpulse %s\n"
+"链接到 libpulse %s\n"
+
+#: ../src/utils/pacmd.c:142
+msgid "No PulseAudio daemon running, or not running as session daemon."
+msgstr "没有 PulseAudio 守护进程在运行,或者没有作为会话守护进程运行。"
 
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pacmd.c:147
 #, c-format
-msgid "pa_mainloop_new() failed.\n"
-msgstr "pa_mainloop_new()失败。\n"
+msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
+msgstr "socket(PF_UNIX, SOCK_STREAM, 0):%s"
 
-#: ../src/utils/pasuspender.c:290
+#: ../src/utils/pacmd.c:164
 #, c-format
-msgid "pa_context_new() failed.\n"
-msgstr "pa_context_new()失败。\n"
+msgid "connect(): %s"
+msgstr "connect():%s"
+
+#: ../src/utils/pacmd.c:172
+msgid "Failed to kill PulseAudio daemon."
+msgstr "杀死PulseAudio后台程序失败。"
+
+#: ../src/utils/pacmd.c:180
+msgid "Daemon not responding."
+msgstr "后台程序未响应。"
 
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pacmd.c:212 ../src/utils/pacmd.c:321 ../src/utils/pacmd.c:339
 #, c-format
-msgid "pa_mainloop_run() failed.\n"
-msgstr "pa_mainloop_run()失败。\n"
+msgid "write(): %s"
+msgstr "write():%s"
+
+#: ../src/utils/pacmd.c:268
+#, c-format
+msgid "poll(): %s"
+msgstr "poll(): %s"
 
-#: ../src/utils/pactl.c:150
+#: ../src/utils/pacmd.c:279 ../src/utils/pacmd.c:299
+#, c-format
+msgid "read(): %s"
+msgstr "read():%s"
+
+#: ../src/utils/pactl.c:164
 #, c-format
 msgid "Failed to get statistics: %s"
 msgstr "获取统计数据失败:%s"
 
-#: ../src/utils/pactl.c:156
+#: ../src/utils/pactl.c:170
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr "当前使用:%u块,总共%s字节。\n"
 
-#: ../src/utils/pactl.c:159
+#: ../src/utils/pactl.c:173
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr "整个生命周期所得分配:%u块,总共%s字节。\n"
 
-#: ../src/utils/pactl.c:162
+#: ../src/utils/pactl.c:176
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr "采样缓存大小:%s\n"
 
-#: ../src/utils/pactl.c:171
+#: ../src/utils/pactl.c:185
 #, c-format
 msgid "Failed to get server information: %s"
 msgstr "获取服务器信息失败:%s"
 
-#: ../src/utils/pactl.c:176
+#: ../src/utils/pactl.c:190
 #, c-format
 msgid ""
 "Server String: %s\n"
@@ -1709,9 +2258,15 @@ msgid ""
 "Client Index: %u\n"
 "Tile Size: %zu\n"
 msgstr ""
+"服务器字串:%s\n"
+"程序库协议版本:%u\n"
+"服务器协议版本:%u\n"
+"是否本地服务器:%s\n"
+"客户端索引:%u\n"
+"区块大小: %zu\n"
 
-#: ../src/utils/pactl.c:192
-#, fuzzy, c-format
+#: ../src/utils/pactl.c:206
+#, c-format
 msgid ""
 "User Name: %s\n"
 "Host Name: %s\n"
@@ -1728,18 +2283,18 @@ msgstr ""
 "服务器名:%s\n"
 "服务器版本:%s\n"
 "默认采样规格:%s\n"
-"默认频道地图:%s\n"
+"默认声道映射:%s\n"
 "默认音频入口:%s\n"
-"默认源: %s\n"
-"Cookie:%08x\n"
+"默认信源: %s\n"
+"Cookie:%04x:%04x\n"
 
-#: ../src/utils/pactl.c:244 ../src/utils/pactl.c:830
+#: ../src/utils/pactl.c:255 ../src/utils/pactl.c:900 ../src/utils/pactl.c:978
 #, c-format
 msgid "Failed to get sink information: %s"
 msgstr "获取音频出口信息失败:%s"
 
-#: ../src/utils/pactl.c:270
-#, fuzzy, c-format
+#: ../src/utils/pactl.c:281
+#, c-format
 msgid ""
 "Sink #%u\n"
 "\tState: %s\n"
@@ -1750,54 +2305,54 @@ msgid ""
 "\tChannel Map: %s\n"
 "\tOwner Module: %u\n"
 "\tMute: %s\n"
-"\tVolume: %s%s%s\n"
+"\tVolume: %s\n"
 "\t        balance %0.2f\n"
-"\tBase Volume: %s%s%s\n"
+"\tBase Volume: %s\n"
 "\tMonitor Source: %s\n"
 "\tLatency: %0.0f usec, configured %0.0f usec\n"
 "\tFlags: %s%s%s%s%s%s%s\n"
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
-"Sink #%u\n"
-"\tState: %s\n"
-"\tName: %s\n"
-"\tDescription: %s\n"
-"\tDriver: %s\n"
-"\tSample Specification: %s\n"
-"\tChannel Map: %s\n"
-"\tOwner Module: %u\n"
-"\tMute: %s\n"
-"\tVolume: %s%s%s\n"
-"\t        balance %0.2f\n"
-"\tBase Volume: %s%s%s\n"
-"\tMonitor Source: %s\n"
-"\tLatency: %0.0f usec, configured %0.0f usec\n"
-"\tFlags: %s%s%s%s%s%s\n"
-"\tProperties:\n"
+"采集器 #%u\n"
+"\t状态:%s\n"
+"\t名称:%s\n"
+"\t描述:%s\n"
+"\t驱动程序:%s\n"
+"\t采样规格:%s\n"
+"\t声道映射:%s\n"
+"\t所有者模块:%u\n"
+"\t静音:%s\n"
+"\t音量:%s\n"
+"\t        平衡 %0.2f\n"
+"\t基础音量:%s\n"
+"\t监视器信源:%s\n"
+"\t延迟:%0.0f 微秒,设置为 %0.0f 微秒\n"
+"\t旗标:%s%s%s%s%s%s%s\n"
+"\t属性:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:318 ../src/utils/pactl.c:430
+#: ../src/utils/pactl.c:325 ../src/utils/pactl.c:431 ../src/utils/pactl.c:592
 #, c-format
 msgid "\tPorts:\n"
-msgstr "\tPorts:\n"
+msgstr "\t连接端口:\n"
 
-#: ../src/utils/pactl.c:325 ../src/utils/pactl.c:437
+#: ../src/utils/pactl.c:332 ../src/utils/pactl.c:438
 #, c-format
 msgid "\tActive Port: %s\n"
-msgstr "\tActive Port: %s\n"
+msgstr "\t使用中连接端口:%s\n"
 
-#: ../src/utils/pactl.c:331 ../src/utils/pactl.c:443
-#, fuzzy, c-format
+#: ../src/utils/pactl.c:338 ../src/utils/pactl.c:444
+#, c-format
 msgid "\tFormats:\n"
-msgstr "\tPorts:\n"
+msgstr "\t格式:\n"
 
-#: ../src/utils/pactl.c:357 ../src/utils/pactl.c:849
+#: ../src/utils/pactl.c:362 ../src/utils/pactl.c:920 ../src/utils/pactl.c:993
 #, c-format
 msgid "Failed to get source information: %s"
 msgstr "获取音频入口信息失败:%s"
 
-#: ../src/utils/pactl.c:383
+#: ../src/utils/pactl.c:388
 #, c-format
 msgid ""
 "Source #%u\n"
@@ -1809,47 +2364,47 @@ msgid ""
 "\tChannel Map: %s\n"
 "\tOwner Module: %u\n"
 "\tMute: %s\n"
-"\tVolume: %s%s%s\n"
+"\tVolume: %s\n"
 "\t        balance %0.2f\n"
-"\tBase Volume: %s%s%s\n"
+"\tBase Volume: %s\n"
 "\tMonitor of Sink: %s\n"
 "\tLatency: %0.0f usec, configured %0.0f usec\n"
 "\tFlags: %s%s%s%s%s%s\n"
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
-"Source #%u\n"
-"\tState: %s\n"
-"\tName: %s\n"
-"\tDescription: %s\n"
-"\tDriver: %s\n"
-"\tSample Specification: %s\n"
-"\tChannel Map: %s\n"
-"\tOwner Module: %u\n"
-"\tMute: %s\n"
-"\tVolume: %s%s%s\n"
-"\t        balance %0.2f\n"
-"\tBase Volume: %s%s%s\n"
-"\tMonitor of Sink: %s\n"
-"\tLatency: %0.0f usec, configured %0.0f usec\n"
-"\tFlags: %s%s%s%s%s%s\n"
-"\tProperties:\n"
+"信源 #%u\n"
+"\t状态:%s\n"
+"\t名称:%s\n"
+"\t描述:%s\n"
+"\t驱动程序:%s\n"
+"\t采样规格:%s\n"
+"\t声道映射:%s\n"
+"\t所有者模块:%u\n"
+"\t静音:%s\n"
+"\t音量:%s\n"
+"\t        平衡 %0.2f\n"
+"\t基础音量:%s\n"
+"\t采集器的监视器:%s\n"
+"\t延迟:%0.0f 微秒,已设置 %0.0f 微秒\n"
+"\t旗标:%s%s%s%s%s%s\n"
+"\t属性:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:415 ../src/utils/pactl.c:485 ../src/utils/pactl.c:528
-#: ../src/utils/pactl.c:570 ../src/utils/pactl.c:640 ../src/utils/pactl.c:641
-#: ../src/utils/pactl.c:652 ../src/utils/pactl.c:711 ../src/utils/pactl.c:712
-#: ../src/utils/pactl.c:723 ../src/utils/pactl.c:775 ../src/utils/pactl.c:776
-#: ../src/utils/pactl.c:783
+#: ../src/utils/pactl.c:416 ../src/utils/pactl.c:486 ../src/utils/pactl.c:529
+#: ../src/utils/pactl.c:571 ../src/utils/pactl.c:669 ../src/utils/pactl.c:670
+#: ../src/utils/pactl.c:681 ../src/utils/pactl.c:739 ../src/utils/pactl.c:740
+#: ../src/utils/pactl.c:751 ../src/utils/pactl.c:802 ../src/utils/pactl.c:803
+#: ../src/utils/pactl.c:809
 msgid "n/a"
 msgstr "n/a"
 
-#: ../src/utils/pactl.c:454
+#: ../src/utils/pactl.c:455 ../src/utils/pactl.c:859
 #, c-format
 msgid "Failed to get module information: %s"
 msgstr "获取模块信息失败:%s"
 
-#: ../src/utils/pactl.c:477
+#: ../src/utils/pactl.c:478
 #, c-format
 msgid ""
 "Module #%u\n"
@@ -1860,18 +2415,18 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 "Module #%u\n"
-"\tName: %s\n"
-"\tArgument: %s\n"
-"\tUsage counter: %s\n"
-"\tProperties:\n"
+"\t名称:%s\n"
+"\t参数:%s\n"
+"\t用量计数器:%s\n"
+"\t属性:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:496
+#: ../src/utils/pactl.c:497
 #, c-format
 msgid "Failed to get client information: %s"
 msgstr "获取客户端信息失败:%s"
 
-#: ../src/utils/pactl.c:522
+#: ../src/utils/pactl.c:523
 #, c-format
 msgid ""
 "Client #%u\n"
@@ -1881,17 +2436,17 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 "Client #%u\n"
-"\tDriver: %s\n"
-"\tOwner Module: %s\n"
-"\tProperties:\n"
+"\t驱动程序:%s\n"
+"\t用户模块:%s\n"
+"\t属性:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:539
+#: ../src/utils/pactl.c:540
 #, c-format
 msgid "Failed to get card information: %s"
 msgstr "获取声卡信息失败:%s"
 
-#: ../src/utils/pactl.c:562
+#: ../src/utils/pactl.c:563
 #, c-format
 msgid ""
 "Card #%u\n"
@@ -1902,29 +2457,48 @@ msgid ""
 "\t\t%s\n"
 msgstr ""
 "Card #%u\n"
-"\tName: %s\n"
-"\tDriver: %s\n"
-"\tOwner Module: %s\n"
-"\tProperties:\n"
+"\t名称:%s\n"
+"\t驱动程序:%s\n"
+"\t用户模块:%s\n"
+"\t属性:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:576
+#: ../src/utils/pactl.c:579
 #, c-format
 msgid "\tProfiles:\n"
-msgstr "\tProfiles:\n"
+msgstr "\t个人设置档:\n"
+
+#: ../src/utils/pactl.c:581
+#, c-format
+msgid "\t\t%s: %s (sinks: %u, sources: %u, priority: %u, available: %s)\n"
+msgstr ""
 
-#: ../src/utils/pactl.c:582
+#: ../src/utils/pactl.c:586
 #, c-format
 msgid "\tActive Profile: %s\n"
-msgstr "\tActive Profile: %s\n"
+msgstr "\t启用的个人设置档:%s\n"
+
+#: ../src/utils/pactl.c:600
+#, c-format
+msgid ""
+"\t\t\tProperties:\n"
+"\t\t\t\t%s\n"
+msgstr ""
+"\t\t\t属性:\n"
+"\t\t\t\t%s\n"
+
+#: ../src/utils/pactl.c:605
+#, c-format
+msgid "\t\t\tPart of profile(s): %s"
+msgstr ""
 
-#: ../src/utils/pactl.c:593 ../src/utils/pactl.c:868
+#: ../src/utils/pactl.c:622 ../src/utils/pactl.c:940 ../src/utils/pactl.c:1008
 #, c-format
 msgid "Failed to get sink input information: %s"
 msgstr "获取音频出口输入信息失败:%s"
 
-#: ../src/utils/pactl.c:622
-#, fuzzy, c-format
+#: ../src/utils/pactl.c:651
+#, c-format
 msgid ""
 "Sink Input #%u\n"
 "\tDriver: %s\n"
@@ -1934,9 +2508,9 @@ msgid ""
 "\tSample Specification: %s\n"
 "\tChannel Map: %s\n"
 "\tFormat: %s\n"
+"\tCorked: %s\n"
 "\tMute: %s\n"
 "\tVolume: %s\n"
-"\t        %s\n"
 "\t        balance %0.2f\n"
 "\tBuffer Latency: %0.0f usec\n"
 "\tSink Latency: %0.0f usec\n"
@@ -1944,72 +2518,74 @@ msgid ""
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
-"Sink Input #%u\n"
-"\tDriver: %s\n"
-"\tOwner Module: %s\n"
-"\tClient: %s\n"
-"\tSink: %u\n"
-"\tSample Specification: %s\n"
-"\tChannel Map: %s\n"
-"\tMute: %s\n"
-"\tVolume: %s\n"
+"信源输入 #%u\n"
+"\t驱动程序:%s\n"
+"\t所有者模块:%s\n"
+"\t客户端:%s\n"
+"\tSink:%u\n"
+"\t采样规格:%s\n"
+"\t声道映射:%s\n"
+"\t格式:%s\n"
+"\t静音:%s\n"
+"\t音量:%s\n"
 "\t        %s\n"
-"\t        balance %0.2f\n"
-"\tBuffer Latency: %0.0f usec\n"
-"\tSink Latency: %0.0f usec\n"
-"\tResample method: %s\n"
-"\tProperties:\n"
+"\t        平衡 %0.2f\n"
+"\t缓冲延迟:%0.0f usec\n"
+"\tSink 延迟:%0.0f usec\n"
+"\t重新采样方法:%s\n"
+"\t属性:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:663 ../src/utils/pactl.c:887
+#: ../src/utils/pactl.c:692 ../src/utils/pactl.c:960 ../src/utils/pactl.c:1023
 #, c-format
 msgid "Failed to get source output information: %s"
 msgstr "获取音频入口输出信息失败:%s"
 
-#: ../src/utils/pactl.c:693
-#, fuzzy, c-format
+#: ../src/utils/pactl.c:721
+#, c-format
 msgid ""
 "Source Output #%u\n"
 "\tDriver: %s\n"
 "\tOwner Module: %s\n"
 "\tClient: %s\n"
-"\tSource: %u\n"
-"\tSample Specification: %s\n"
-"\tChannel Map: %s\n"
-"\tFormat: %s\n"
-"\tMute: %s\n"
-"\tVolume: %s\n"
-"\t        %s\n"
-"\t        balance %0.2f\n"
-"\tBuffer Latency: %0.0f usec\n"
-"\tSource Latency: %0.0f usec\n"
-"\tResample method: %s\n"
-"\tProperties:\n"
-"\t\t%s\n"
-msgstr ""
-"Sink Input #%u\n"
-"\tDriver: %s\n"
-"\tOwner Module: %s\n"
-"\tClient: %s\n"
-"\tSink: %u\n"
+"\tSource: %u\n"
 "\tSample Specification: %s\n"
 "\tChannel Map: %s\n"
+"\tFormat: %s\n"
+"\tCorked: %s\n"
 "\tMute: %s\n"
 "\tVolume: %s\n"
-"\t        %s\n"
 "\t        balance %0.2f\n"
 "\tBuffer Latency: %0.0f usec\n"
-"\tSink Latency: %0.0f usec\n"
+"\tSource Latency: %0.0f usec\n"
 "\tResample method: %s\n"
 "\tProperties:\n"
 "\t\t%s\n"
+msgstr ""
+"信源输出 #%u\n"
+"\t驱动程序:%s\n"
+"\t所有者模块:%s\n"
+"\t客户端:%s\n"
+"\t信源:%u\n"
+"\t采样规格:%s\n"
+"\t声道映射:%s\n"
+"\t格式:%s\n"
+"\t静音:%s\n"
+"\t音量:%s\n"
+"\t        %s\n"
+"\t        平衡 %0.2f\n"
+"\t缓冲延迟:%0.0f usec\n"
+"\tSink 延迟:%0.0f usec\n"
+"\t重新采样方法:%s\n"
+"\t属性:\n"
+"\t\t%s\n"
 
-#: ../src/utils/pactl.c:734
+#: ../src/utils/pactl.c:762
 #, c-format
 msgid "Failed to get sample information: %s"
 msgstr "获取采样信息失败:%s"
 
-#: ../src/utils/pactl.c:761
+#: ../src/utils/pactl.c:789
 #, c-format
 msgid ""
 "Sample #%u\n"
@@ -2017,7 +2593,6 @@ msgid ""
 "\tSample Specification: %s\n"
 "\tChannel Map: %s\n"
 "\tVolume: %s\n"
-"\t        %s\n"
 "\t        balance %0.2f\n"
 "\tDuration: %0.1fs\n"
 "\tSize: %s\n"
@@ -2026,176 +2601,186 @@ msgid ""
 "\tProperties:\n"
 "\t\t%s\n"
 msgstr ""
-"Sample #%u\n"
-"\tName: %s\n"
-"\tSample Specification: %s\n"
-"\tChannel Map: %s\n"
-"\tVolume: %s\n"
-"\t        %s\n"
-"\t        balance %0.2f\n"
-"\tDuration: %0.1fs\n"
-"\tSize: %s\n"
-"\tLazy: %s\n"
-"\tFilename: %s\n"
-"\tProperties:\n"
+"样本 #%u\n"
+"\t名称:%s\n"
+"\t采样规格:%s\n"
+"\t声道映射:%s\n"
+"\t音量:%s\n"
+"\t        平衡 %0.2f\n"
+"\t时长:%0.1fs\n"
+"\t大小:%s\n"
+"\tLazy:%s\n"
+"\t文件名称:%s\n"
+"\t属性:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:791 ../src/utils/pactl.c:801
+#: ../src/utils/pactl.c:817 ../src/utils/pactl.c:827
 #, c-format
 msgid "Failure: %s"
 msgstr "失败:%s"
 
-#: ../src/utils/pactl.c:915
-#, fuzzy, c-format
+#: ../src/utils/pactl.c:866
+#, c-format
+msgid "Failed to unload module: Module %s not loaded"
+msgstr "未能卸载模块:模块 %s 未加载"
+
+#: ../src/utils/pactl.c:884
+#, c-format
+msgid ""
+"Failed to set volume: You tried to set volumes for %d channels, whereas "
+"channel/s supported = %d\n"
+msgstr "设置音量失败:您尝试设置 %d 个声道的音量,而支持的声道数为 %d。\n"
+
+#: ../src/utils/pactl.c:1050
+#, c-format
 msgid "Failed to set format: invalid format string %s"
-msgstr "获取音频入口信息失败:%s"
+msgstr "未能设置格式:无效的格式字串 %s"
 
-#: ../src/utils/pactl.c:954
+#: ../src/utils/pactl.c:1093
 #, c-format
 msgid "Failed to upload sample: %s"
 msgstr "上传采样失败:%s"
 
-#: ../src/utils/pactl.c:971
+#: ../src/utils/pactl.c:1110
 msgid "Premature end of file"
 msgstr "文件过早结束"
 
-#: ../src/utils/pactl.c:991
+#: ../src/utils/pactl.c:1130
 msgid "new"
-msgstr ""
+msgstr "新"
 
-#: ../src/utils/pactl.c:994
+#: ../src/utils/pactl.c:1133
 msgid "change"
-msgstr ""
+msgstr "变更"
 
-#: ../src/utils/pactl.c:997
+#: ../src/utils/pactl.c:1136
 msgid "remove"
-msgstr ""
+msgstr "移除"
 
-#: ../src/utils/pactl.c:1000 ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1139 ../src/utils/pactl.c:1174
 msgid "unknown"
-msgstr ""
+msgstr "未知"
 
-#: ../src/utils/pactl.c:1008
+#: ../src/utils/pactl.c:1147
 msgid "sink"
-msgstr ""
+msgstr "sink"
 
-#: ../src/utils/pactl.c:1011
+#: ../src/utils/pactl.c:1150
 msgid "source"
-msgstr ""
+msgstr "source"
 
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1153
 msgid "sink-input"
-msgstr ""
+msgstr "sink-input"
 
-#: ../src/utils/pactl.c:1017
+#: ../src/utils/pactl.c:1156
 msgid "source-output"
-msgstr ""
+msgstr "source-output"
 
-#: ../src/utils/pactl.c:1020
+#: ../src/utils/pactl.c:1159
 msgid "module"
-msgstr ""
+msgstr "module"
 
-#: ../src/utils/pactl.c:1023
+#: ../src/utils/pactl.c:1162
 msgid "client"
-msgstr ""
+msgstr "client"
 
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1165
 msgid "sample-cache"
-msgstr ""
+msgstr "sample-cache"
 
-#: ../src/utils/pactl.c:1029 ../src/utils/pactl.c:1032
-#, fuzzy
+#: ../src/utils/pactl.c:1168
 msgid "server"
-msgstr "无效服务器"
+msgstr "服务器"
+
+#: ../src/utils/pactl.c:1171
+msgid "card"
+msgstr "声卡"
 
-#: ../src/utils/pactl.c:1041
+#: ../src/utils/pactl.c:1180
 #, c-format
 msgid "Event '%s' on %s #%u\n"
-msgstr ""
+msgstr "事件“%s”于 %s #%u\n"
 
-#: ../src/utils/pactl.c:1258
+#: ../src/utils/pactl.c:1452
 msgid "Got SIGINT, exiting."
 msgstr "收到 SIGINT,正在退出。"
 
-#: ../src/utils/pactl.c:1285
+#: ../src/utils/pactl.c:1485
 msgid "Invalid volume specification"
 msgstr "无效采样说明"
 
-#: ../src/utils/pactl.c:1308
+#: ../src/utils/pactl.c:1508
 msgid "Volume outside permissible range.\n"
-msgstr ""
-
-#: ../src/utils/pactl.c:1319 ../src/utils/pactl.c:1320
-#: ../src/utils/pactl.c:1321 ../src/utils/pactl.c:1322
-#: ../src/utils/pactl.c:1323 ../src/utils/pactl.c:1324
-#: ../src/utils/pactl.c:1325 ../src/utils/pactl.c:1326
-#: ../src/utils/pactl.c:1327 ../src/utils/pactl.c:1328
-#: ../src/utils/pactl.c:1329 ../src/utils/pactl.c:1330
-#: ../src/utils/pactl.c:1331 ../src/utils/pactl.c:1332
-#: ../src/utils/pactl.c:1333 ../src/utils/pactl.c:1334
-#: ../src/utils/pactl.c:1335 ../src/utils/pactl.c:1336
-#: ../src/utils/pactl.c:1337
+msgstr "音量超出允许范围。\n"
+
+#: ../src/utils/pactl.c:1521
+msgid "Invalid number of volume specifications.\n"
+msgstr "无效音量规格数。\n"
+
+#: ../src/utils/pactl.c:1533
+msgid "Inconsistent volume specification.\n"
+msgstr "无效音量规格。\n"
+
+#: ../src/utils/pactl.c:1563 ../src/utils/pactl.c:1564
+#: ../src/utils/pactl.c:1565 ../src/utils/pactl.c:1566
+#: ../src/utils/pactl.c:1567 ../src/utils/pactl.c:1568
+#: ../src/utils/pactl.c:1569 ../src/utils/pactl.c:1570
+#: ../src/utils/pactl.c:1571 ../src/utils/pactl.c:1572
+#: ../src/utils/pactl.c:1573 ../src/utils/pactl.c:1574
+#: ../src/utils/pactl.c:1575 ../src/utils/pactl.c:1576
+#: ../src/utils/pactl.c:1577 ../src/utils/pactl.c:1578
+#: ../src/utils/pactl.c:1579 ../src/utils/pactl.c:1580
+#: ../src/utils/pactl.c:1581 ../src/utils/pactl.c:1582
+#: ../src/utils/pactl.c:1583
 msgid "[options]"
-msgstr ""
+msgstr "[选项]"
 
-#: ../src/utils/pactl.c:1321
+#: ../src/utils/pactl.c:1565
 msgid "[TYPE]"
-msgstr ""
+msgstr "[类型]"
 
-#: ../src/utils/pactl.c:1323
+#: ../src/utils/pactl.c:1567
 msgid "FILENAME [NAME]"
-msgstr ""
+msgstr "文件名 [名称]"
 
-#: ../src/utils/pactl.c:1324
+#: ../src/utils/pactl.c:1568
 msgid "NAME [SINK]"
-msgstr ""
-
-#: ../src/utils/pactl.c:1325
-msgid "NAME"
-msgstr ""
-
-#: ../src/utils/pactl.c:1326
-msgid "NAME [ARGS ...]"
-msgstr ""
-
-#: ../src/utils/pactl.c:1327
-msgid "#N"
-msgstr ""
-
-#: ../src/utils/pactl.c:1328
-msgid "#N SINK|SOURCE"
-msgstr ""
-
-#: ../src/utils/pactl.c:1329 ../src/utils/pactl.c:1334
-msgid "NAME|#N 1|0"
-msgstr ""
+msgstr "名称 [采集器]"
 
-#: ../src/utils/pactl.c:1330
-msgid "CARD PROFILE"
-msgstr ""
-
-#: ../src/utils/pactl.c:1331
-msgid "NAME|#N PORT"
-msgstr ""
+#: ../src/utils/pactl.c:1577
+msgid "NAME|#N VOLUME [VOLUME ...]"
+msgstr "名称|#N 音量 [音量 ...]"
 
-#: ../src/utils/pactl.c:1332
-msgid "NAME|#N VOLUME"
-msgstr ""
+#: ../src/utils/pactl.c:1578
+msgid "#N VOLUME [VOLUME ...]"
+msgstr "#N 音量 [音量 ...]"
 
-#: ../src/utils/pactl.c:1333
-msgid "#N VOLUME"
-msgstr ""
+#: ../src/utils/pactl.c:1579
+msgid "NAME|#N 1|0|toggle"
+msgstr "名称|#N 1|0|toggle"
 
-#: ../src/utils/pactl.c:1335
-msgid "#N 1|0"
-msgstr ""
+#: ../src/utils/pactl.c:1580
+msgid "#N 1|0|toggle"
+msgstr "#N 1|0|toggle"
 
-#: ../src/utils/pactl.c:1336
+#: ../src/utils/pactl.c:1581
 msgid "#N FORMATS"
+msgstr "#N 格式列表"
+
+#: ../src/utils/pactl.c:1584
+#, c-format
+msgid ""
+"\n"
+"The special names @DEFAULT_SINK@, @DEFAULT_SOURCE@ and @DEFAULT_MONITOR@\n"
+"can be used to specify the default sink, source and monitor.\n"
 msgstr ""
+"\n"
+"指定名称 @DEFAULT_SINK@,@DEFAULT_SOURCE@ 和 @DEFAULT_MONITOR@\n"
+"可用于指定默认的采集器、信源和监视器。\n"
 
-#: ../src/utils/pactl.c:1339
-#, fuzzy, c-format
+#: ../src/utils/pactl.c:1587
+#, c-format
 msgid ""
 "\n"
 "  -h, --help                            Show this help\n"
@@ -2206,14 +2791,13 @@ msgid ""
 "  -n, --client-name=NAME                How to call this client on the "
 "server\n"
 msgstr ""
-"%s [options] ... \n"
 "\n"
 "  -h, --help                            显示此帮助\n"
 "      --version                         显示版本\n"
-"  -s, --server=SERVER                   要连接的服务器名\n"
-"\n"
+"  -s, --server=服务器                   要连接的服务器名\n"
+"  -n, --client-name=名称                向服务器提供的客户端自称\n"
 
-#: ../src/utils/pactl.c:1380
+#: ../src/utils/pactl.c:1628
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -2221,654 +2805,462 @@ msgid ""
 "Linked with libpulse %s\n"
 msgstr ""
 "pactl %s\n"
-"Compiled with libpulse %s\n"
-"Linked with libpulse %s\n"
+"编译到 libpulse %s\n"
+"链接到 libpulse %s\n"
 
-#: ../src/utils/pactl.c:1439
+#: ../src/utils/pactl.c:1684
 #, c-format
 msgid "Specify nothing, or one of: %s"
-msgstr ""
+msgstr "不需指定,或指定成下列之一:%s"
 
-#: ../src/utils/pactl.c:1449
+#: ../src/utils/pactl.c:1694
 msgid "Please specify a sample file to load"
 msgstr "请指定要加载的采样文件"
 
-#: ../src/utils/pactl.c:1462
+#: ../src/utils/pactl.c:1707
 msgid "Failed to open sound file."
 msgstr "打开声音文件失败。"
 
-#: ../src/utils/pactl.c:1474
+#: ../src/utils/pactl.c:1719
 msgid "Warning: Failed to determine sample specification from file."
 msgstr "警告:从文件中确定采样说明失败。"
 
-#: ../src/utils/pactl.c:1484
+#: ../src/utils/pactl.c:1729
 msgid "You have to specify a sample name to play"
 msgstr "您必须指定要播放的采样名"
 
-#: ../src/utils/pactl.c:1496
+#: ../src/utils/pactl.c:1741
 msgid "You have to specify a sample name to remove"
 msgstr "您必须指定要删除的采样名"
 
-#: ../src/utils/pactl.c:1505
+#: ../src/utils/pactl.c:1750
 msgid "You have to specify a sink input index and a sink"
-msgstr "您必须指定漏输入索引和漏"
+msgstr "您必须指定采集器输入索引和采集器"
 
-#: ../src/utils/pactl.c:1515
+#: ../src/utils/pactl.c:1760
 msgid "You have to specify a source output index and a source"
-msgstr "您必须指定源输出索引和源"
+msgstr "您必须指定信源输出索引和信源"
 
-#: ../src/utils/pactl.c:1530
+#: ../src/utils/pactl.c:1775
 msgid "You have to specify a module name and arguments."
 msgstr "必须指定模块名和参数。"
 
-#: ../src/utils/pactl.c:1550
-msgid "You have to specify a module index"
-msgstr "必须指定模块索引"
+#: ../src/utils/pactl.c:1795
+msgid "You have to specify a module index or name"
+msgstr "必须指定模块索引或名称"
 
-#: ../src/utils/pactl.c:1560
+#: ../src/utils/pactl.c:1808
 msgid ""
 "You may not specify more than one sink. You have to specify a boolean value."
-msgstr "不可指定多个漏。必须指定一个布尔值。"
+msgstr "不可指定多个采集器。必须指定一个布尔值。"
+
+#: ../src/utils/pactl.c:1813 ../src/utils/pactl.c:1833
+msgid "Invalid suspend specification."
+msgstr "无效挂起规范。"
 
-#: ../src/utils/pactl.c:1573
+#: ../src/utils/pactl.c:1828
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value."
-msgstr "不可指定多个源。必须指定一个布尔值。"
+msgstr "不可指定多个信源。必须指定一个布尔值。"
 
-#: ../src/utils/pactl.c:1585
+#: ../src/utils/pactl.c:1845
 msgid "You have to specify a card name/index and a profile name"
 msgstr "您必须指定声卡名称/索引和侧写名称"
 
-#: ../src/utils/pactl.c:1596
+#: ../src/utils/pactl.c:1856
 msgid "You have to specify a sink name/index and a port name"
-msgstr "您必须指定漏名称/索引和端口名称"
+msgstr "您必须指定采集器名称/索引和端口名称"
 
-#: ../src/utils/pactl.c:1607
+#: ../src/utils/pactl.c:1867
+msgid "You have to specify a sink name"
+msgstr "必须指定接收器名"
+
+#: ../src/utils/pactl.c:1877
 msgid "You have to specify a source name/index and a port name"
-msgstr "您必须指定源名称/索引和端口名称"
+msgstr "您必须指定信源名称/索引和端口名称"
+
+#: ../src/utils/pactl.c:1888
+msgid "You have to specify a source name"
+msgstr "必须指定信号源索引"
 
-#: ../src/utils/pactl.c:1618
+#: ../src/utils/pactl.c:1898
 msgid "You have to specify a sink name/index and a volume"
-msgstr "您必须指定漏名称/索引和卷"
+msgstr "您必须指定采集器名称/索引和音量"
 
-#: ../src/utils/pactl.c:1631
+#: ../src/utils/pactl.c:1911
 msgid "You have to specify a source name/index and a volume"
-msgstr "您必须指定源名称/索引和卷"
+msgstr "您必须指定信源名称/索引和音量"
 
-#: ../src/utils/pactl.c:1644
+#: ../src/utils/pactl.c:1924
 msgid "You have to specify a sink input index and a volume"
-msgstr "您必须指定漏输入索引和卷"
+msgstr "您必须指定采集器输入索引和音量"
 
-#: ../src/utils/pactl.c:1649
+#: ../src/utils/pactl.c:1929
 msgid "Invalid sink input index"
-msgstr "无效露输入索引"
+msgstr "无效采集器输入索引"
 
-#: ../src/utils/pactl.c:1660
-#, fuzzy
+#: ../src/utils/pactl.c:1940
 msgid "You have to specify a source output index and a volume"
-msgstr "您必须指定源输出索引和源"
+msgstr "您必须指定信源输出索引 (index) 和音量"
 
-#: ../src/utils/pactl.c:1665
-#, fuzzy
+#: ../src/utils/pactl.c:1945
 msgid "Invalid source output index"
-msgstr "无效露输入索引"
+msgstr "无效信源输出索引"
 
-#: ../src/utils/pactl.c:1677
-msgid "You have to specify a sink name/index and a mute boolean"
-msgstr "您必须指定漏名称/索引和静音布尔值"
+#: ../src/utils/pactl.c:1956
+msgid ""
+"You have to specify a sink name/index and a mute action (0, 1, or 'toggle')"
+msgstr "您必须指定采集器名称/索引和静音动作 (0, 1, 或 'toggle' 切换)"
 
-#: ../src/utils/pactl.c:1682 ../src/utils/pactl.c:1699
-#: ../src/utils/pactl.c:1721 ../src/utils/pactl.c:1742
-#, fuzzy
+#: ../src/utils/pactl.c:1961 ../src/utils/pactl.c:1976
+#: ../src/utils/pactl.c:1996 ../src/utils/pactl.c:2014
 msgid "Invalid mute specification"
-msgstr "无效采样说明"
+msgstr "无效静音说明"
 
-#: ../src/utils/pactl.c:1694
-msgid "You have to specify a source name/index and a mute boolean"
-msgstr "您必须指定源名称/索引和静音布尔值"
+#: ../src/utils/pactl.c:1971
+msgid ""
+"You have to specify a source name/index and a mute action (0, 1, or 'toggle')"
+msgstr "您必须指定信源名称/索引和静音动作 (0, 1, 或 'toggle' 切换)"
 
-#: ../src/utils/pactl.c:1711
-msgid "You have to specify a sink input index and a mute boolean"
-msgstr "您必须指定露输入索引和静音布尔值"
+#: ../src/utils/pactl.c:1986
+msgid ""
+"You have to specify a sink input index and a mute action (0, 1, or 'toggle')"
+msgstr "您必须指定采集器输入索引和静音动作 (0, 1, 或 'toggle' 切换)"
 
-#: ../src/utils/pactl.c:1716
+#: ../src/utils/pactl.c:1991
 msgid "Invalid sink input index specification"
-msgstr "无效漏输入索引说明"
+msgstr "无效采集器输入索引说明"
 
-#: ../src/utils/pactl.c:1732
-#, fuzzy
-msgid "You have to specify a source output index and a mute boolean"
-msgstr "您必须指定源名称/索引和静音布尔值"
+#: ../src/utils/pactl.c:2004
+msgid ""
+"You have to specify a source output index and a mute action (0, 1, or "
+"'toggle')"
+msgstr "您必须指定信源输出索引和静音动作 (0, 1, 或 'toggle' 切换)"
 
-#: ../src/utils/pactl.c:1737
-#, fuzzy
+#: ../src/utils/pactl.c:2009
 msgid "Invalid source output index specification"
-msgstr "无效漏输入索引说明"
+msgstr "无效信源输出索引说明"
 
-#: ../src/utils/pactl.c:1756
-#, fuzzy
+#: ../src/utils/pactl.c:2026
 msgid ""
 "You have to specify a sink index and a semicolon-separated list of supported "
 "formats"
-msgstr "您必须指定漏名称/索引和静音布尔值"
-
-#: ../src/utils/pactl.c:1772
-msgid "No valid command specified."
-msgstr "未指定有效的命令。"
-
-#: ../src/utils/pax11publish.c:61
-#, c-format
-msgid ""
-"%s [-D display] [-S server] [-O sink] [-I source] [-c file]  [-d|-e|-i|-r]\n"
-"\n"
-" -d    Show current PulseAudio data attached to X11 display (default)\n"
-" -e    Export local PulseAudio data to X11 display\n"
-" -i    Import PulseAudio data from X11 display to local environment "
-"variables and cookie file.\n"
-" -r    Remove PulseAudio data from X11 display\n"
-msgstr ""
-"%s [-D display] [-S server] [-O sink] [-I source] [-c file]  [-d|-e|-i|-r]\n"
-"\n"
-" -d    显示与X11显示器关联的当前PulseAudio数据(默认)\n"
-" -e    将本地PulseAudio数据导出至X11显示器\n"
-" -i    将PulseAudio数据由X11显示器导入至本地环境变量和cookie文件。\n"
-" -r    从X11显示器清除PulseAudio数据\n"
-
-#: ../src/utils/pax11publish.c:94
-#, c-format
-msgid "Failed to parse command line.\n"
-msgstr "分析命令行失败。\n"
-
-#: ../src/utils/pax11publish.c:113
-#, c-format
-msgid "Server: %s\n"
-msgstr "服务器:%s\n"
-
-#: ../src/utils/pax11publish.c:115
-#, c-format
-msgid "Source: %s\n"
-msgstr "音频入口:%s\n"
-
-#: ../src/utils/pax11publish.c:117
-#, c-format
-msgid "Sink: %s\n"
-msgstr "音频出口:%s\n"
-
-#: ../src/utils/pax11publish.c:119
-#, c-format
-msgid "Cookie: %s\n"
-msgstr "Cookie:%s\n"
-
-#: ../src/utils/pax11publish.c:137
-#, c-format
-msgid "Failed to parse cookie data\n"
-msgstr "分析cookie数据失败\n"
+msgstr "您必须指定采集器名称及以英文分号分隔的其所支持格式的列表"
 
-#: ../src/utils/pax11publish.c:142
-#, c-format
-msgid "Failed to save cookie data\n"
-msgstr "保存cookie数据失败\n"
+#: ../src/utils/pactl.c:2038
+msgid "You have to specify a card name/index, a port name and a latency offset"
+msgstr "您必须指定声卡名称/索引、端口名称和延迟偏移"
 
-#: ../src/utils/pax11publish.c:157
-#, c-format
-msgid "Failed to load client configuration file.\n"
-msgstr "加载客户端配置文件失败。\n"
+#: ../src/utils/pactl.c:2045
+msgid "Could not parse latency offset"
+msgstr "无法解析延迟偏移"
 
-#: ../src/utils/pax11publish.c:162
-#, c-format
-msgid "Failed to read environment configuration data.\n"
-msgstr "读取环境配置数据失败。\n"
+#: ../src/utils/pactl.c:2057
+msgid "No valid command specified."
+msgstr "未指定有效的命令。"
 
-#: ../src/utils/pax11publish.c:179
+#: ../src/utils/pasuspender.c:79
 #, c-format
-msgid "Failed to get FQDN.\n"
-msgstr "获取FQDN失败。\n"
+msgid "fork(): %s\n"
+msgstr "fork():%s\n"
 
-#: ../src/utils/pax11publish.c:199
+#: ../src/utils/pasuspender.c:92
 #, c-format
-msgid "Failed to load cookie data\n"
-msgstr "加载cookie数据失败\n"
+msgid "execvp(): %s\n"
+msgstr "execvp():%s\n"
 
-#: ../src/utils/pax11publish.c:217
+#: ../src/utils/pasuspender.c:111
 #, c-format
-msgid "Not yet implemented.\n"
-msgstr "尚未实现。\n"
-
-#: ../src/utils/pacmd.c:66
-msgid "No PulseAudio daemon running, or not running as session daemon."
-msgstr "没有 PulseAudio 守护进程在运行,或者没有作为会话守护进程运行。"
+msgid "Failure to resume: %s\n"
+msgstr "恢复失败:%s\n"
 
-#: ../src/utils/pacmd.c:71
+#: ../src/utils/pasuspender.c:145
 #, c-format
-msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
-msgstr "socket(PF_UNIX, SOCK_STREAM, 0):%s"
+msgid "Failure to suspend: %s\n"
+msgstr "挂起失败:%s\n"
 
-#: ../src/utils/pacmd.c:88
+#: ../src/utils/pasuspender.c:170
 #, c-format
-msgid "connect(): %s"
-msgstr "connect():%s"
-
-#: ../src/utils/pacmd.c:96
-msgid "Failed to kill PulseAudio daemon."
-msgstr "杀死PulseAudio后台程序失败。"
-
-#: ../src/utils/pacmd.c:104
-msgid "Daemon not responding."
-msgstr "后台程序未响应。"
+msgid "WARNING: Sound server is not local, not suspending.\n"
+msgstr "警告:非本地声音服务器,不会挂起。\n"
 
-#: ../src/utils/pacmd.c:184
+#: ../src/utils/pasuspender.c:183
 #, c-format
-msgid "poll(): %s"
-msgstr "poll(): %s"
+msgid "Connection failure: %s\n"
+msgstr "连接失败:%s\n"
 
-#: ../src/utils/pacmd.c:195 ../src/utils/pacmd.c:215
+#: ../src/utils/pasuspender.c:201
 #, c-format
-msgid "read(): %s"
-msgstr "read():%s"
+msgid "Got SIGINT, exiting.\n"
+msgstr "收到SIGINT,正在退出。\n"
 
-#: ../src/utils/pacmd.c:237 ../src/utils/pacmd.c:255
+#: ../src/utils/pasuspender.c:219
 #, c-format
-msgid "write(): %s"
-msgstr "write():%s"
-
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:222
-msgid "Cannot access autospawn lock."
-msgstr "不能访问autospawn锁。"
+msgid "WARNING: Child process terminated by signal %u\n"
+msgstr "警告:子进程被信号 %u 终止\n"
 
-#: ../src/modules/alsa/alsa-sink.c:560 ../src/modules/alsa/alsa-sink.c:726
+#: ../src/utils/pasuspender.c:228
 #, c-format
 msgid ""
-"ALSA woke us up to write new data to the device, but there was actually "
-"nothing to write!\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers.\n"
-"We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail() "
-"returned 0 or another value < min_avail."
+"%s [options] ... \n"
+"\n"
+"  -h, --help                            Show this help\n"
+"      --version                         Show version\n"
+"  -s, --server=SERVER                   The name of the server to connect "
+"to\n"
+"\n"
 msgstr ""
-"ALSA 提醒我们在该设备中写入新数据,但实际上没有什么可以写入的!\n"
-"这很可能是 ALSA 驱动程序 '%s' 中的一个 bug。请向 ALSA 开发人员报告这个问"
-"题。\n"
-"提醒我们设置 POLLOUT -- 但结果是 snd_pcm_avail() 返回 0 或者另一个小于最小可"
-"用值的数值。"
+"%s [选项] ... \n"
+"\n"
+"  -h, --help                            显示此帮助\n"
+"      --version                         显示版本\n"
+"  -s, --server=服务器                   要连接的服务器名\n"
+"\n"
 
-#: ../src/modules/alsa/alsa-source.c:519 ../src/modules/alsa/alsa-source.c:672
+#: ../src/utils/pasuspender.c:266
 #, c-format
 msgid ""
-"ALSA woke us up to read new data from the device, but there was actually "
-"nothing to read!\n"
-"Most likely this is a bug in the ALSA driver '%s'. Please report this issue "
-"to the ALSA developers.\n"
-"We were woken up with POLLIN set -- however a subsequent snd_pcm_avail() "
-"returned 0 or another value < min_avail."
-msgstr ""
-"ALSA 提醒我们从该设备中读取新数据,但实际上没有什么可以读取的!\n"
-"这很可能是 ALSA 驱动程序 '%s' 中的一个 bug。请向 ALSA 开发人员报告这个问"
-"题。\n"
-"提醒我们设置 POLLOUT -- 但结果是 snd_pcm_avail() 返回 0 或者另一个小于最小可"
-"用值的数值。"
-
-#: ../src/modules/alsa/module-alsa-card.c:167
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2796
-#: ../src/modules/alsa/alsa-mixer.c:3898
-msgid "Off"
-msgstr "关闭"
-
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2738
-msgid "High Fidelity Playback (A2DP)"
-msgstr "高保真回放(A2DP)"
-
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2752
-msgid "High Fidelity Capture (A2DP)"
-msgstr "高保真采集(A2DP)"
-
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2767
-msgid "Telephony Duplex (HSP/HFP)"
-msgstr "双工电话(HSP/HFP)"
-
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2781
-msgid "Handsfree Gateway"
-msgstr ""
-
-#: ../src/modules/reserve-wrap.c:151
-msgid "PulseAudio Sound Server"
-msgstr "PulseAudio 声音服务器"
-
-#: ../src/modules/module-rygel-media-server.c:510
-#: ../src/modules/module-rygel-media-server.c:548
-#: ../src/modules/module-rygel-media-server.c:903
-msgid "Output Devices"
-msgstr "输出设备"
-
-#: ../src/modules/module-rygel-media-server.c:511
-#: ../src/modules/module-rygel-media-server.c:549
-#: ../src/modules/module-rygel-media-server.c:904
-msgid "Input Devices"
-msgstr "输入设备"
-
-#: ../src/modules/module-rygel-media-server.c:1056
-msgid "Audio on @HOSTNAME@"
-msgstr "@HOSTNAME@ 中的音频"
+"pasuspender %s\n"
+"Compiled with libpulse %s\n"
+"Linked with libpulse %s\n"
+msgstr ""
+"pasuspender %s\n"
+"编译到 libpulse %s\n"
+"链接到 libpulse %s\n"
 
-#: ../src/modules/alsa/alsa-mixer.c:2219
-msgid "Input"
-msgstr "输入"
+#: ../src/utils/pasuspender.c:295
+#, c-format
+msgid "pa_mainloop_new() failed.\n"
+msgstr "pa_mainloop_new() 失败。\n"
 
-#: ../src/modules/alsa/alsa-mixer.c:2220
-msgid "Docking Station Input"
-msgstr "扩展坞输入"
+#: ../src/utils/pasuspender.c:308
+#, c-format
+msgid "pa_context_new() failed.\n"
+msgstr "pa_context_new() 失败。\n"
 
-#: ../src/modules/alsa/alsa-mixer.c:2221
-#, fuzzy
-msgid "Docking Station Microphone"
-msgstr "扩展坞麦克风"
+#: ../src/utils/pasuspender.c:320
+#, c-format
+msgid "pa_mainloop_run() failed.\n"
+msgstr "pa_mainloop_run() 失败。\n"
 
-#: ../src/modules/alsa/alsa-mixer.c:2222
-#, fuzzy
-msgid "Docking Station Line In"
-msgstr "扩展坞输入"
+#: ../src/utils/pax11publish.c:58
+#, c-format
+msgid ""
+"%s [-D display] [-S server] [-O sink] [-I source] [-c file]  [-d|-e|-i|-r]\n"
+"\n"
+" -d    Show current PulseAudio data attached to X11 display (default)\n"
+" -e    Export local PulseAudio data to X11 display\n"
+" -i    Import PulseAudio data from X11 display to local environment "
+"variables and cookie file.\n"
+" -r    Remove PulseAudio data from X11 display\n"
+msgstr ""
+"%s [-D 显示器] [-S 服务器] [-O 接收器] [-I 信号源] [-c 文件]  [-d|-e|-i|-r]\n"
+"\n"
+" -d    显示与 X11 显示器关联的当前 PulseAudio 数据(默认)\n"
+" -e    将本地 PulseAudio 数据导出至 X11 显示器\n"
+" -i    将 PulseAudio 数据由 X11 显示器导入至本地环境变量和 cookie 文件。\n"
+" -r    从 X11 显示器清除 PulseAudio 数据\n"
 
-#: ../src/modules/alsa/alsa-mixer.c:2223 ../src/modules/alsa/alsa-mixer.c:2307
-msgid "Line In"
-msgstr "Line In"
+#: ../src/utils/pax11publish.c:91
+#, c-format
+msgid "Failed to parse command line.\n"
+msgstr "分析命令行失败。\n"
 
-#: ../src/modules/alsa/alsa-mixer.c:2224 ../src/modules/alsa/alsa-mixer.c:2302
-msgid "Microphone"
-msgstr "麦克风"
+#: ../src/utils/pax11publish.c:110
+#, c-format
+msgid "Server: %s\n"
+msgstr "服务器:%s\n"
 
-#: ../src/modules/alsa/alsa-mixer.c:2225 ../src/modules/alsa/alsa-mixer.c:2303
-#, fuzzy
-msgid "Front Microphone"
-msgstr "扩展坞麦克风"
+#: ../src/utils/pax11publish.c:112
+#, c-format
+msgid "Source: %s\n"
+msgstr "音频入口:%s\n"
 
-#: ../src/modules/alsa/alsa-mixer.c:2226 ../src/modules/alsa/alsa-mixer.c:2304
-#, fuzzy
-msgid "Rear Microphone"
-msgstr "麦克风"
+#: ../src/utils/pax11publish.c:114
+#, c-format
+msgid "Sink: %s\n"
+msgstr "音频出口:%s\n"
 
-#: ../src/modules/alsa/alsa-mixer.c:2227
-msgid "External Microphone"
-msgstr "外部麦克风"
+#: ../src/utils/pax11publish.c:116
+#, c-format
+msgid "Cookie: %s\n"
+msgstr "Cookie:%s\n"
 
-#: ../src/modules/alsa/alsa-mixer.c:2228 ../src/modules/alsa/alsa-mixer.c:2306
-msgid "Internal Microphone"
-msgstr "内部麦克风"
+#: ../src/utils/pax11publish.c:134
+#, c-format
+msgid "Failed to parse cookie data\n"
+msgstr "分析cookie数据失败\n"
 
-#: ../src/modules/alsa/alsa-mixer.c:2229 ../src/modules/alsa/alsa-mixer.c:2308
-msgid "Radio"
-msgstr "无线电"
+#: ../src/utils/pax11publish.c:139
+#, c-format
+msgid "Failed to save cookie data\n"
+msgstr "保存cookie数据失败\n"
 
-#: ../src/modules/alsa/alsa-mixer.c:2230 ../src/modules/alsa/alsa-mixer.c:2309
-msgid "Video"
-msgstr "视频"
+#: ../src/utils/pax11publish.c:168
+#, c-format
+msgid "Failed to get FQDN.\n"
+msgstr "获取FQDN失败。\n"
 
-#: ../src/modules/alsa/alsa-mixer.c:2231
-msgid "Automatic Gain Control"
-msgstr "自动增益控制"
+#: ../src/utils/pax11publish.c:188
+#, c-format
+msgid "Failed to load cookie data\n"
+msgstr "加载cookie数据失败\n"
 
-#: ../src/modules/alsa/alsa-mixer.c:2232
-msgid "No Automatic Gain Control"
-msgstr "无自动增益控制"
+#: ../src/utils/pax11publish.c:206
+#, c-format
+msgid "Not yet implemented.\n"
+msgstr "尚未实现。\n"
 
-#: ../src/modules/alsa/alsa-mixer.c:2233
-msgid "Boost"
-msgstr "加速器"
+#~ msgid "Got signal %s."
+#~ msgstr "获得信号%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2234
-msgid "No Boost"
-msgstr "无加速器"
+#~ msgid "Exiting."
+#~ msgstr "退出"
 
-#: ../src/modules/alsa/alsa-mixer.c:2235
-msgid "Amplifier"
-msgstr "均衡器"
+#~ msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
+#~ msgstr "发现用户'%s' (UID %lu)和组'%s' (GID %lu)."
 
-#: ../src/modules/alsa/alsa-mixer.c:2236
-msgid "No Amplifier"
-msgstr "无均衡器"
+#~ msgid "Successfully dropped root privileges."
+#~ msgstr "成功放弃root权限。"
 
-#: ../src/modules/alsa/alsa-mixer.c:2237
-#, fuzzy
-msgid "Bass Boost"
-msgstr "加速器"
+#~ msgid "setrlimit(%s, (%u, %u)) failed: %s"
+#~ msgstr "setrlimit(%s, (%u, %u)) 失败:%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2238
-#, fuzzy
-msgid "No Bass Boost"
-msgstr "无加速器"
+#~ msgid "Daemon not running"
+#~ msgstr "后台程序没有运行"
 
-#: ../src/modules/alsa/alsa-mixer.c:2239
-msgid "Speaker"
-msgstr ""
+#~ msgid "Daemon running as PID %u"
+#~ msgstr "后台程序正在运行,PID %u"
 
-#: ../src/modules/alsa/alsa-mixer.c:2240 ../src/modules/alsa/alsa-mixer.c:2311
-msgid "Headphones"
-msgstr "模拟耳机"
+#~ msgid "Daemon startup successful."
+#~ msgstr "后台程序启动成功。"
 
-#: ../src/modules/alsa/alsa-mixer.c:2301
-msgid "Analog Input"
-msgstr "模拟输入"
+#~ msgid "This is PulseAudio %s"
+#~ msgstr "这是 PulseAudio %s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2305
-msgid "Dock Microphone"
-msgstr "扩展坞麦克风"
+#~ msgid "Compilation host: %s"
+#~ msgstr "编译主机:%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2310
-msgid "Analog Output"
-msgstr "模拟输出 "
+#~ msgid "Compilation CFLAGS: %s"
+#~ msgstr "编译CFLAGS:%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2312
-msgid "LFE on Separate Mono Output"
-msgstr "模拟输出(LFE)"
+#~ msgid "Running on host: %s"
+#~ msgstr "正在主机上运行:%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2313
-#, fuzzy
-msgid "Line Out"
-msgstr "Line In"
+#~ msgid "Found %u CPUs."
+#~ msgstr "找到 %u CPU。"
 
-#: ../src/modules/alsa/alsa-mixer.c:2314
-msgid "Analog Mono Output"
-msgstr "模拟单声道输出"
+#~ msgid "Page size is %lu bytes"
+#~ msgstr "页面大小为%lu字节"
 
-#: ../src/modules/alsa/alsa-mixer.c:2315
-#, fuzzy
-msgid "Speakers"
-msgstr "模拟立体声"
+#~ msgid "Compiled with Valgrind support: yes"
+#~ msgstr "编译启用Valgrind支持:是"
 
-#: ../src/modules/alsa/alsa-mixer.c:2316
-msgid "HDMI / DisplayPort"
-msgstr ""
+#~ msgid "Compiled with Valgrind support: no"
+#~ msgstr "编译启用Valgrind支持:否"
 
-#: ../src/modules/alsa/alsa-mixer.c:2317
-#, fuzzy
-msgid "Digital Output (S/PDIF)"
-msgstr "数字立体声(HDMI)"
+#~ msgid "Running in valgrind mode: %s"
+#~ msgstr "正在以valgrind模式运行:%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:2318
 #, fuzzy
-msgid "Digital Passthrough (S/PDIF)"
-msgstr "数字立体声(HDMI)"
-
-#: ../src/modules/alsa/alsa-mixer.c:3756
-msgid "Analog Mono"
-msgstr "模拟单声道"
+#~ msgid "Running in VM: %s"
+#~ msgstr "正在主机上运行:%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:3757
-msgid "Analog Stereo"
-msgstr "模拟立体声"
+#~ msgid "Optimized build: yes"
+#~ msgstr "优化生成:是"
 
-#: ../src/modules/alsa/alsa-mixer.c:3758
-msgid "Analog Surround 2.1"
-msgstr "模拟环绕 2.1"
+#~ msgid "Optimized build: no"
+#~ msgstr "优化生成:否"
 
-#: ../src/modules/alsa/alsa-mixer.c:3759
-msgid "Analog Surround 3.0"
-msgstr "模拟环绕 3.0"
+#~ msgid "NDEBUG defined, all asserts disabled."
+#~ msgstr "拒绝 NDEBUG,禁用所有 assert"
 
-#: ../src/modules/alsa/alsa-mixer.c:3760
-msgid "Analog Surround 3.1"
-msgstr "模拟环绕 3.1"
+#~ msgid "FASTPATH defined, only fast path asserts disabled."
+#~ msgstr "拒绝 FASTPATH,只禁用快速路径 assert。"
 
-#: ../src/modules/alsa/alsa-mixer.c:3761
-msgid "Analog Surround 4.0"
-msgstr "模拟环绕 4.0"
+#~ msgid "All asserts enabled."
+#~ msgstr "启用所有 assert。"
 
-#: ../src/modules/alsa/alsa-mixer.c:3762
-msgid "Analog Surround 4.1"
-msgstr "模拟环绕 4.1"
+#~ msgid "Machine ID is %s."
+#~ msgstr "machine ID是%s。"
 
-#: ../src/modules/alsa/alsa-mixer.c:3763
-msgid "Analog Surround 5.0"
-msgstr "模拟环绕 5.0"
+#~ msgid "Session ID is %s."
+#~ msgstr "会话 ID %s。"
 
-#: ../src/modules/alsa/alsa-mixer.c:3764
-msgid "Analog Surround 5.1"
-msgstr "模拟环绕 5.1"
+#~ msgid "Using runtime directory %s."
+#~ msgstr "正在使用运行时文件夹%s。"
 
-#: ../src/modules/alsa/alsa-mixer.c:3765
-msgid "Analog Surround 6.0"
-msgstr "模拟环绕 6.0"
+#~ msgid "Using state directory %s."
+#~ msgstr "正在使用状态文件夹%s。"
 
-#: ../src/modules/alsa/alsa-mixer.c:3766
-msgid "Analog Surround 6.1"
-msgstr "模拟环绕 6.1"
+#~ msgid "Using modules directory %s."
+#~ msgstr "正在使用模块目录 %s。"
 
-#: ../src/modules/alsa/alsa-mixer.c:3767
-msgid "Analog Surround 7.0"
-msgstr "模拟环绕 7.0"
+#~ msgid "Running in system mode: %s"
+#~ msgstr "正在以系统模式运行:%s"
 
-#: ../src/modules/alsa/alsa-mixer.c:3768
-msgid "Analog Surround 7.1"
-msgstr "模拟环绕 7.1"
+#~ msgid "Fresh high-resolution timers available! Bon appetit!"
+#~ msgstr "新鲜的高分辨率计时器开锅了!吃个饱!"
 
-#: ../src/modules/alsa/alsa-mixer.c:3769
-msgid "Digital Stereo (IEC958)"
-msgstr "数字立体声(IEC958)"
+#~ msgid ""
+#~ "Dude, your kernel stinks! The chef's recommendation today is Linux with "
+#~ "high-resolution timers enabled!"
+#~ msgstr "老兄,您的内核真臭!现在流行的是启用了高分辩率计分器的Linux!"
 
-#: ../src/modules/alsa/alsa-mixer.c:3770
-#, fuzzy
-msgid "Digital Passthrough  (IEC958)"
-msgstr "数字立体声(IEC958)"
+#~ msgid "Daemon startup complete."
+#~ msgstr "后台程序启动完成。"
 
-#: ../src/modules/alsa/alsa-mixer.c:3771
-msgid "Digital Surround 4.0 (IEC958/AC3)"
-msgstr "数字环绕 4.0(IEC958/AC3)"
+#~ msgid "Daemon shutdown initiated."
+#~ msgstr "开始关闭后台程序。"
 
-#: ../src/modules/alsa/alsa-mixer.c:3772
-msgid "Digital Surround 5.1 (IEC958/AC3)"
-msgstr "数字环绕 5.1(IEC958/AC3)"
+#~ msgid "Daemon terminated."
+#~ msgstr "后台程序已终止。"
 
-#: ../src/modules/alsa/alsa-mixer.c:3773
-msgid "Digital Stereo (HDMI)"
-msgstr "数字立体声(HDMI)"
+#~ msgid "Cleaning up privileges."
+#~ msgstr "取消特权。"
 
-#: ../src/modules/alsa/alsa-mixer.c:3774
 #, fuzzy
-msgid "Digital Surround 5.1 (HDMI)"
-msgstr "数字环绕 5.1(IEC958/AC3)"
+#~ msgid "PulseAudio Sound System KDE Routing Policy"
+#~ msgstr "PulseAudio 声音系统"
 
-#: ../src/modules/alsa/alsa-mixer.c:3895
-msgid "Analog Mono Duplex"
-msgstr "模拟单声道双工"
-
-#: ../src/modules/alsa/alsa-mixer.c:3896
-msgid "Analog Stereo Duplex"
-msgstr "模拟立体声双工"
+#, fuzzy
+#~ msgid "Start the PulseAudio Sound System with KDE Routing Policy"
+#~ msgstr "启动 PulseAudio 声音系统"
 
-#: ../src/modules/alsa/alsa-mixer.c:3897
-msgid "Digital Stereo Duplex (IEC958)"
-msgstr "数字立体声双工(IEC958)"
+#~ msgid "No cookie loaded. Attempting to connect without."
+#~ msgstr "没有加载cookie。尝试不加载cookie进行连接。"
 
-#: ../src/modules/alsa/alsa-mixer.c:3997
-#, fuzzy, c-format
-msgid "%s Output"
-msgstr "空输出"
+#~ msgid "Failed to load client configuration file.\n"
+#~ msgstr "加载客户端配置文件失败。\n"
 
-#: ../src/modules/alsa/alsa-mixer.c:4005
-#, fuzzy, c-format
-msgid "%s Input"
-msgstr "输入"
+#~ msgid "Failed to read environment configuration data.\n"
+#~ msgstr "读取环境配置数据失败。\n"
 
-#: ../src/modules/echo-cancel/module-echo-cancel.c:63
-msgid ""
-"source_name=<name for the source> source_properties=<properties for the "
-"source> source_master=<name of source to filter> sink_name=<name for the "
-"sink> sink_properties=<properties for the sink> sink_master=<name of sink to "
-"filter> adjust_time=<how often to readjust rates in s> adjust_threshold=<how "
-"much drift to readjust after in ms> format=<sample format> rate=<sample "
-"rate> channels=<number of channels> channel_map=<channel map> "
-"aec_method=<implementation to use> aec_args=<parameters for the AEC engine> "
-"save_aec=<save AEC data in /tmp> autoloaded=<set if this module is being "
-"loaded automatically> use_volume_sharing=<yes or no> "
-msgstr ""
+#~ msgid "=== %d seconds: %d Hz %d ch (%s) -> %d Hz %d ch (%s)"
+#~ msgstr "=== %d 秒:%d Hz %d ch (%s) -> %d Hz %d ch (%s)"
 
-#: ../src/modules/module-equalizer-sink.c:72
-msgid "General Purpose Equalizer"
-msgstr ""
+#~ msgid "XOpenDisplay() failed"
+#~ msgstr "XOpenDisplay()失败"
 
-#: ../src/modules/module-equalizer-sink.c:76
-#, fuzzy
-msgid ""
-"sink_name=<name of the sink> sink_properties=<properties for the sink> "
-"sink_master=<sink to connect to> format=<sample format> rate=<sample rate> "
-"channels=<number of channels> channel_map=<channel map> autoloaded=<set if "
-"this module is being loaded automatically> use_volume_sharing=<yes or no> "
-msgstr ""
-"sink_name=<name for the sink> sink_properties=<properties for the sink> "
-"master=<name of sink to filter> format=<sample format> rate=<sample rate> "
-"channels=<number of channels> channel_map=<channel map> plugin=<ladspa "
-"plugin name> label=<ladspa plugin label> control=<comma separated list of "
-"input control values>"
+#~ msgid "%s+%s"
+#~ msgstr "%s+%s"
 
-#: ../src/modules/module-filter-apply.c:48
-msgid "autoclean=<automatically unload unused filters?>"
-msgstr ""
+#~ msgid "%s / %s"
+#~ msgstr "%s / %s"
 
-#: ../src/tests/resampler-test.c:257
-#, c-format
-msgid ""
-"%s [options]\n"
-"\n"
-"-h, --help                            Show this help\n"
-"-v, --verbose                         Print debug messages\n"
-"      --from-rate=SAMPLERATE          From sample rate in Hz (defaults to "
-"44100)\n"
-"      --from-format=SAMPLEFORMAT      From sample type (defaults to s16le)\n"
-"      --from-channels=CHANNELS        From number of channels (defaults to "
-"1)\n"
-"      --to-rate=SAMPLERATE            To sample rate in Hz (defaults to "
-"44100)\n"
-"      --to-format=SAMPLEFORMAT        To sample type (defaults to s16le)\n"
-"      --to-channels=CHANNELS          To number of channels (defaults to 1)\n"
-"      --resample-method=METHOD        Resample method (defaults to auto)\n"
-"      --seconds=SECONDS               From stream duration (defaults to 60)\n"
-"\n"
-"If the formats are not specified, the test performs all formats "
-"combinations,\n"
-"back and forth.\n"
-"\n"
-"Sample type must be one of s16le, s16be, u8, float32le, float32be, ulaw, "
-"alaw,\n"
-"32le, s32be (defaults to s16ne)\n"
-"\n"
-"See --dump-resample-methods for possible values of resample methods.\n"
-msgstr ""
+#~ msgid "Digital Surround 4.0 (IEC958)"
+#~ msgstr "数字环绕 4.0(IEC958)"
 
-#: ../src/tests/resampler-test.c:356
-#, fuzzy, c-format
-msgid "%s %s\n"
-msgstr "%s %s"
+#~ msgid "Low Frequency Emmiter"
+#~ msgstr "低频脉冲"
 
-#: ../src/tests/resampler-test.c:419
-#, c-format
-msgid "=== %d seconds: %d Hz %d ch (%s) -> %d Hz %d ch (%s)"
-msgstr ""
+#~ msgid "Successfully changed user to \""
+#~ msgstr "成功变更用户为 \""
 
 #~ msgid "[%s:%u] rlimit not supported on this platform."
 #~ msgstr "[%s:%u] 此平台不支持rlimit。"
 
-#~ msgid "XOpenDisplay() failed"
-#~ msgstr "XOpenDisplay()失败"
-
 #~ msgid ""
 #~ "Source Output #%u\n"
 #~ "\tDriver: %s\n"
@@ -2958,15 +3350,3 @@ msgstr ""
 #~ "to\n"
 #~ "  -n, --client-name=NAME                How to call this client on the "
 #~ "server\n"
-
-#~ msgid "%s+%s"
-#~ msgstr "%s+%s"
-
-#~ msgid "%s / %s"
-#~ msgstr "%s / %s"
-
-#~ msgid "Digital Surround 4.0 (IEC958)"
-#~ msgstr "数字环绕 4.0(IEC958)"
-
-#~ msgid "Low Frequency Emmiter"
-#~ msgstr "低频脉冲"
diff --git a/scripts/benchmark_memory_usage.sh b/scripts/benchmark_memory_usage.sh
new file mode 100755
index 0000000..f053d7e
--- /dev/null
+++ b/scripts/benchmark_memory_usage.sh
@@ -0,0 +1,133 @@
+#!/bin/bash
+
+# This file is part of PulseAudio.
+#
+# Copyright 2015 Ahmed S. Darwish <darwish.07 at gmail.com>
+#
+# PulseAudio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# PulseAudio 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 Lesser General Public License
+# along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
+
+#
+# Measure PulseAudio memory usage (VmSize, Private+Shared_Dirty)
+# while increasing the number of connected clients over time.
+#
+# To avoid premature client exits, please ensure giving a long
+# wave file as the script's first parameter.
+#
+
+_bold="\x1B[1m"
+_error="\x1B[1;31m"
+_reset="\x1B[0m"
+
+BASENAME=$(basename $0)
+PROMPT="${_bold}[$BASENAME]${_reset}"
+error() {
+    echo -e "$PROMPT: ** Error: ${_error}$1${_reset}" >&2; exit -1
+}
+msg() {
+    echo -e "$PROMPT: $1"
+}
+
+_absolute_dirname="$(dirname `readlink -f $0`)"
+PA_HOME="${_absolute_dirname%/scripts}"
+[ -d "$PA_HOME/src" -a -d "$PA_HOME/scripts" ] ||
+    error "This script can only be executed from PulseAudio source tree"
+
+PA=${PA_HOME}/src/pulseaudio
+PA_CAT=${PA_HOME}/src/pacat
+PA_PLAY=${PA_HOME}/src/paplay
+PA_FLAGS="-n -F ${PA_HOME}/src/default.pa -p ${PA_HOME}/src/"
+
+[ -L "$PA_PLAY" ] || ln -sf .libs/lt-pacat $PA_PLAY
+PA_PLAY_PROCESS_NAME="paplay"
+
+SCRIPTS_DIR=${PA_HOME}/scripts
+BENCHMARKS_DIR=${SCRIPTS_DIR}/benchmarks
+GNUPLOT_SCRIPT=${SCRIPTS_DIR}/plot_memory_usage.gp
+OUTPUT_FILE=${BENCHMARKS_DIR}/memory-usage-`date -Iseconds`.txt
+SYMLINK_LATEST_OUTPUT_FILE=${BENCHMARKS_DIR}/memory-usage-LATEST.txt
+
+MAX_CLIENTS=30
+
+[ -e "$PA" ] || error "$PA does not exist. Compile PulseAudio tree first."
+[ -x "$PA" ] || error "$PA cannot be executed"
+[ -x "$PA_CAT" ] || error "$PA_CAT cannot be executed"
+
+AUDIO_FILE="$1"
+[ -n "$AUDIO_FILE" ] || error "Usage: $BASENAME AUDIO_FILE"
+[ -e "$AUDIO_FILE" ] || error "$AUDIO_FILE does not exist"
+[ -f "$AUDIO_FILE" ] || error "$AUDIO_FILE is not a regular file"
+
+$PA --check >/dev/null 2>&1
+[ "$?" -ne "0" ] || {
+    msg "A PulseAudio daemon is already running on your system"
+    msg "To use this script, please do the following first:"
+    msg " 1. Add autospawn=no to $HOME/.pulse/client.conf"
+    msg " 2. Kill current daemon instance using 'pulseaudio --kill'"
+    error "Failed to start PulseAudio daemon"
+}
+
+msg "Hello. Benchmarking PulseAudio daemon memory usage over time"
+
+# Check Linux Kernel's Documentation/sysctl/vm.txt for details.
+msg "Ensuring consistent results by dropping all VM caches!"
+sudo bash -c "sync && echo 3 >/proc/sys/vm/drop_caches"
+
+msg "Starting PulseAudio daemon"
+PULSE_LOG=0 PULSE_LOG_COLORS= PULSE_LOG_META= $PA $PA_FLAGS &
+_pid=$!
+
+# Give PA daemon time to initialize everything and vacuum. We want
+# to make the _starting_ dirty RSS memory usage (0 clients) as
+# equivalent as possible for multiple trials.
+sleep 12
+
+$PA --check >/dev/null 2>&1
+[ "$?" -eq "0" ] || error "Failed to start PulseAudio daemon"
+
+echo "# ClientCount    VmSize (KiB)     DirtyRSS (KiB)" >$OUTPUT_FILE
+
+msg "Starting PulseAudio clients"
+_i=1;
+while true; do
+    [ "$_i" -le "$MAX_CLIENTS" ] || break
+
+    _vmsize=`ps -o vsize= $_pid`
+    _drss=`awk '/(Shared|Private)_Dirty:/{ sum += $2 } END { print sum }' /proc/$_pid/smaps`
+    [ "$?" -eq "0" ] || error "Error sampling PulseAudio RSS memory usage"
+
+    echo "  $_i              $_vmsize           $_drss" >>$OUTPUT_FILE
+
+    $PA_PLAY $AUDIO_FILE 2>/dev/null &
+    _i=$((_i + 1))
+
+    sleep 1
+done
+msg "Finished starting ${MAX_CLIENTS} PulseAudio clients over time"
+
+_n_clients_still_alive=$(ps -C $PA_PLAY_PROCESS_NAME --no-headers | wc -l)
+[ "$_n_clients_still_alive" -ge "$MAX_CLIENTS" ] || {
+    msg "You did not provide a long-enough wave file for clients to play"
+    msg "Only $_n_clients_still_alive clients are now active; expected $MAX_CLIENTS"
+    error "Please provide a large wave file (~ $((MAX_CLIENTS*2))s) then redo the benchmarks"
+}
+
+msg "Killing PulseAudio daemon"
+$PA --kill >/dev/null 2>&1
+
+rm -f $SYMLINK_LATEST_OUTPUT_FILE
+ln -s $OUTPUT_FILE $SYMLINK_LATEST_OUTPUT_FILE
+
+msg "Sampling daemon memory usage done!"
+msg "Check the results at $SYMLINK_LATEST_OUTPUT_FILE"
+msg "Plot these results using 'gnuplot $GNUPLOT_SCRIPT'"
diff --git a/scripts/benchmarks/.gitignore b/scripts/benchmarks/.gitignore
new file mode 100644
index 0000000..612f79e
--- /dev/null
+++ b/scripts/benchmarks/.gitignore
@@ -0,0 +1,10 @@
+#
+# Benchmarks directory .gitignore
+#
+
+# Ignore everything here ..
+*
+
+# Except these files
+!README
+!.gitignore
diff --git a/scripts/benchmarks/README b/scripts/benchmarks/README
new file mode 100644
index 0000000..d935b0d
--- /dev/null
+++ b/scripts/benchmarks/README
@@ -0,0 +1,4 @@
+This is an empty directory for collecting users PulseAudio daemon
+performance benchmarks, as created by the tools under `scripts/' .
+
+Please do not commit any file here except this README and .gitignore.
diff --git a/scripts/plot_memory_usage.gp b/scripts/plot_memory_usage.gp
new file mode 100644
index 0000000..33cc4e1
--- /dev/null
+++ b/scripts/plot_memory_usage.gp
@@ -0,0 +1,63 @@
+
+# This file is part of PulseAudio.
+#
+# Copyright 2015 Ahmed S. Darwish <darwish.07 at gmail.com>
+#
+# PulseAudio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# PulseAudio 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 Lesser General Public License
+# along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
+
+#
+# PulseAudio memory usage plotting script
+#
+# Before invocation, generate necessary data by running the
+# 'benchmark_memory_usage.sh' bash script. Afterwards, you can plot
+# such data by running:
+#
+#       gnuplot plot_memory_usage.gp
+#
+# Note! To avoid scaling issues, memory is plotted in a "double y axis"
+# form, with VM usage on the left, and dirty RSS memory usage on the
+# right. The scales are different.
+#
+
+# Print our user messages to the stdout
+set print "-"
+
+benchDir = system('dirname ' .ARG0) .'/benchmarks/'
+inputFile = benchDir ."memory-usage-LATEST.txt"
+outputFile = benchDir ."pulse-memory-usage.png"
+
+set title "PulseAudio Memory Usage Over Time"
+set xlabel "Number of councurrent 'paplay' clients"
+
+set ylabel "Virtual memory consumption (GiB)"
+set y2label "Dirty RSS consumption (MiB)"
+set ytics nomirror
+set y2tics
+
+# Finer granulrity for x-axis ticks ...
+set xtics 1,1
+set grid
+
+# Use Cairo's PNG backend. This produce images which are way
+# better-rendered than the barebone classical png backend
+set terminal pngcairo enhanced size 1000,768 font 'Verdana,10'
+set output outputFile
+
+print "Plotting data from input file: ", inputFile
+print "..."
+
+plot inputFile using 1:($2/1024/1024) title "VmSize" axes x1y1 with linespoints, \
+     inputFile using 1:($3/1024) title "Dirty RSS" axes x1y2 with linespoints
+
+print "Done! Check our performance at: ", outputFile
diff --git a/src/Makefile.am b/src/Makefile.am
index 9df5ddd..3c035aa 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -46,7 +46,8 @@ AM_CPPFLAGS = \
 	-DPA_ALSA_PATHS_DIR=\"$(alsapathsdir)\" \
 	-DPA_ALSA_PROFILE_SETS_DIR=\"$(alsaprofilesetsdir)\" \
 	-DPA_SRCDIR=\"$(abs_srcdir)\" \
-	-DPA_BUILDDIR=\"$(abs_builddir)\"
+	-DPA_BUILDDIR=\"$(abs_builddir)\" \
+	-DPULSE_LOCALEDIR=\"$(localedir)\"
 AM_CFLAGS = \
 	$(PTHREAD_CFLAGS)
 AM_CXXFLAGS = $(AM_CFLAGS)
@@ -54,7 +55,9 @@ SERVER_CFLAGS = -D__INCLUDED_FROM_PULSE_AUDIO
 
 AM_LIBADD = $(PTHREAD_LIBS) $(INTLLIBS)
 AM_LDADD = $(PTHREAD_LIBS) $(INTLLIBS)
-AM_LDFLAGS = $(NODELETE_LDFLAGS)
+AM_LDFLAGS =
+# Should only be applied to libraries.
+AM_LIBLDFLAGS = $(NODELETE_LDFLAGS)
 
 if HAVE_GCOV
 AM_CFLAGS+=$(GCOV_CFLAGS)
@@ -77,7 +80,7 @@ endif
 
 FOREIGN_CFLAGS = -w
 
-MODULE_LDFLAGS = $(AM_LDFLAGS) -module -disable-static -avoid-version $(NOUNDEFINED_LDFLAGS)
+MODULE_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -module -disable-static -avoid-version $(NOUNDEFINED_LDFLAGS)
 MODULE_LIBADD = $(AM_LIBADD) libpulsecore- at PA_MAJORMINOR@.la libpulsecommon- at PA_MAJORMINOR@.la libpulse.la
 
 ###################################
@@ -720,7 +723,7 @@ libpulsecommon_ at PA_MAJORMINOR@_la_SOURCES += pulsecore/poll-posix.c pulsecore/po
 endif
 
 libpulsecommon_ at PA_MAJORMINOR@_la_CFLAGS = $(AM_CFLAGS) $(LIBJSON_CFLAGS) $(LIBSNDFILE_CFLAGS)
-libpulsecommon_ at PA_MAJORMINOR@_la_LDFLAGS = $(AM_LDFLAGS) -avoid-version
+libpulsecommon_ at PA_MAJORMINOR@_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version
 libpulsecommon_ at PA_MAJORMINOR@_la_LIBADD = $(AM_LIBADD) $(LIBJSON_LIBS)  $(LIBWRAP_LIBS) $(WINSOCK_LIBS) $(LTLIBICONV) $(LIBSNDFILE_LIBS)
 
 if HAVE_X11
@@ -870,7 +873,7 @@ libpulse_la_SOURCES = \
 
 libpulse_la_CFLAGS = $(AM_CFLAGS) $(LIBJSON_CFLAGS)
 libpulse_la_LIBADD = $(AM_LIBADD) $(WINSOCK_LIBS) $(LTLIBICONV) $(LIBJSON_LIBS) libpulsecommon- at PA_MAJORMINOR@.la
-libpulse_la_LDFLAGS = $(AM_LDFLAGS) $(VERSIONING_LDFLAGS) -version-info $(LIBPULSE_VERSION_INFO)
+libpulse_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) $(VERSIONING_LDFLAGS) -version-info $(LIBPULSE_VERSION_INFO)
 
 if HAVE_DBUS
 libpulse_la_CFLAGS += $(DBUS_CFLAGS)
@@ -880,12 +883,12 @@ endif
 libpulse_simple_la_SOURCES = pulse/simple.c pulse/simple.h
 libpulse_simple_la_CFLAGS = $(AM_CFLAGS)
 libpulse_simple_la_LIBADD = $(AM_LIBADD) libpulse.la libpulsecommon- at PA_MAJORMINOR@.la
-libpulse_simple_la_LDFLAGS = $(AM_LDFLAGS) $(VERSIONING_LDFLAGS) -version-info $(LIBPULSE_SIMPLE_VERSION_INFO)
+libpulse_simple_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) $(VERSIONING_LDFLAGS) -version-info $(LIBPULSE_SIMPLE_VERSION_INFO)
 
 libpulse_mainloop_glib_la_SOURCES = pulse/glib-mainloop.h pulse/glib-mainloop.c
 libpulse_mainloop_glib_la_CFLAGS = $(AM_CFLAGS) $(GLIB20_CFLAGS)
 libpulse_mainloop_glib_la_LIBADD = $(AM_LIBADD) libpulse.la libpulsecommon- at PA_MAJORMINOR@.la $(GLIB20_LIBS)
-libpulse_mainloop_glib_la_LDFLAGS = $(AM_LDFLAGS) $(VERSIONING_LDFLAGS) -version-info $(LIBPULSE_MAINLOOP_GLIB_VERSION_INFO)
+libpulse_mainloop_glib_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) $(VERSIONING_LDFLAGS) -version-info $(LIBPULSE_MAINLOOP_GLIB_VERSION_INFO)
 
 ###################################
 #         OSS emulation           #
@@ -909,13 +912,13 @@ endif
 libpulsedsp_la_SOURCES = utils/padsp.c
 libpulsedsp_la_CFLAGS = $(AM_CFLAGS)
 libpulsedsp_la_LIBADD = $(AM_LIBADD) libpulse.la libpulsecommon- at PA_MAJORMINOR@.la
-libpulsedsp_la_LDFLAGS = $(AM_LDFLAGS) -avoid-version -disable-static
+libpulsedsp_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version -disable-static
 
 ###################################
 #      Daemon core library        #
 ###################################
 
-lib_LTLIBRARIES += libpulsecore- at PA_MAJORMINOR@.la
+pkglib_LTLIBRARIES += libpulsecore- at PA_MAJORMINOR@.la
 
 # Pure core stuff
 libpulsecore_ at PA_MAJORMINOR@_la_SOURCES = \
@@ -928,6 +931,7 @@ libpulsecore_ at PA_MAJORMINOR@_la_SOURCES = \
 		pulsecore/cli-command.c pulsecore/cli-command.h \
 		pulsecore/cli-text.c pulsecore/cli-text.h \
 		pulsecore/client.c pulsecore/client.h \
+		pulsecore/typedefs.h \
 		pulsecore/card.c pulsecore/card.h \
 		pulsecore/core-scache.c pulsecore/core-scache.h \
 		pulsecore/core-subscribe.c pulsecore/core-subscribe.h \
@@ -972,7 +976,7 @@ libpulsecore_ at PA_MAJORMINOR@_la_SOURCES = \
 		pulsecore/database.h
 
 libpulsecore_ at PA_MAJORMINOR@_la_CFLAGS = $(AM_CFLAGS) $(SERVER_CFLAGS) $(LIBSNDFILE_CFLAGS) $(WINSOCK_CFLAGS)
-libpulsecore_ at PA_MAJORMINOR@_la_LDFLAGS = $(AM_LDFLAGS) -avoid-version
+libpulsecore_ at PA_MAJORMINOR@_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version
 libpulsecore_ at PA_MAJORMINOR@_la_LIBADD = $(AM_LIBADD) $(LIBLTDL) $(LIBSNDFILE_LIBS) $(WINSOCK_LIBS) $(LTLIBICONV) libpulsecommon- at PA_MAJORMINOR@.la libpulse.la libpulsecore-foreign.la
 
 if HAVE_NEON
@@ -1087,24 +1091,24 @@ modlibexec_LTLIBRARIES += \
 endif
 
 libprotocol_simple_la_SOURCES = pulsecore/protocol-simple.c pulsecore/protocol-simple.h
-libprotocol_simple_la_LDFLAGS = $(AM_LDFLAGS) -avoid-version
+libprotocol_simple_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version
 libprotocol_simple_la_LIBADD = $(AM_LIBADD) libpulsecore- at PA_MAJORMINOR@.la libpulsecommon- at PA_MAJORMINOR@.la libpulse.la
 
 libcli_la_SOURCES = pulsecore/cli.c pulsecore/cli.h
-libcli_la_LDFLAGS = $(AM_LDFLAGS) -avoid-version
+libcli_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version
 libcli_la_LIBADD = $(AM_LIBADD) libpulsecore- at PA_MAJORMINOR@.la libpulsecommon- at PA_MAJORMINOR@.la libpulse.la
 
 libprotocol_cli_la_SOURCES = pulsecore/protocol-cli.c pulsecore/protocol-cli.h
-libprotocol_cli_la_LDFLAGS = $(AM_LDFLAGS) -avoid-version
+libprotocol_cli_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version
 libprotocol_cli_la_LIBADD = $(AM_LIBADD) libpulsecore- at PA_MAJORMINOR@.la libpulsecommon- at PA_MAJORMINOR@.la libpulse.la libcli.la
 
 libprotocol_http_la_SOURCES = pulsecore/protocol-http.c pulsecore/protocol-http.h pulsecore/mime-type.c pulsecore/mime-type.h
-libprotocol_http_la_LDFLAGS = $(AM_LDFLAGS) -avoid-version
+libprotocol_http_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version
 libprotocol_http_la_LIBADD = $(AM_LIBADD) libpulsecore- at PA_MAJORMINOR@.la libpulsecommon- at PA_MAJORMINOR@.la libpulse.la
 
 libprotocol_native_la_SOURCES = pulsecore/protocol-native.c pulsecore/protocol-native.h pulsecore/native-common.h
 libprotocol_native_la_CFLAGS = $(AM_CFLAGS) $(SERVER_CFLAGS)
-libprotocol_native_la_LDFLAGS = $(AM_LDFLAGS) -avoid-version
+libprotocol_native_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version
 libprotocol_native_la_LIBADD = $(AM_LIBADD) libpulsecore- at PA_MAJORMINOR@.la libpulsecommon- at PA_MAJORMINOR@.la libpulse.la
 if HAVE_DBUS
 libprotocol_native_la_CFLAGS += $(DBUS_CFLAGS)
@@ -1113,7 +1117,7 @@ endif
 
 if HAVE_ESOUND
 libprotocol_esound_la_SOURCES = pulsecore/protocol-esound.c pulsecore/protocol-esound.h pulsecore/esound.h
-libprotocol_esound_la_LDFLAGS = $(AM_LDFLAGS) -avoid-version
+libprotocol_esound_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version
 libprotocol_esound_la_LIBADD = $(AM_LIBADD) libpulsecore- at PA_MAJORMINOR@.la libpulsecommon- at PA_MAJORMINOR@.la libpulse.la
 endif
 
@@ -1123,19 +1127,19 @@ librtp_la_SOURCES = \
 		modules/rtp/sap.c modules/rtp/sap.h \
 		modules/rtp/rtsp_client.c modules/rtp/rtsp_client.h \
 		modules/rtp/headerlist.c modules/rtp/headerlist.h
-librtp_la_LDFLAGS = $(AM_LDFLAGS) -avoid-version
+librtp_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version
 librtp_la_LIBADD = $(AM_LIBADD) libpulsecore- at PA_MAJORMINOR@.la libpulsecommon- at PA_MAJORMINOR@.la libpulse.la
 
 libraop_la_SOURCES = \
         modules/raop/raop_client.c modules/raop/raop_client.h \
         modules/raop/base64.c modules/raop/base64.h
 libraop_la_CFLAGS = $(AM_CFLAGS) $(OPENSSL_CFLAGS) -I$(top_srcdir)/src/modules/rtp
-libraop_la_LDFLAGS = $(AM_LDFLAGS) -avoid-version
+libraop_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version
 libraop_la_LIBADD = $(AM_LIBADD) $(OPENSSL_LIBS) libpulsecore- at PA_MAJORMINOR@.la librtp.la libpulsecommon- at PA_MAJORMINOR@.la libpulse.la
 
 # Avahi
 libavahi_wrap_la_SOURCES = pulsecore/avahi-wrap.c pulsecore/avahi-wrap.h
-libavahi_wrap_la_LDFLAGS = $(AM_LDFLAGS) -avoid-version
+libavahi_wrap_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version
 libavahi_wrap_la_CFLAGS = $(AM_CFLAGS) $(AVAHI_CFLAGS)
 libavahi_wrap_la_LIBADD = $(AM_LIBADD) $(AVAHI_CFLAGS) libpulsecore- at PA_MAJORMINOR@.la libpulsecommon- at PA_MAJORMINOR@.la libpulse.la
 
diff --git a/src/Makefile.in b/src/Makefile.in
index ad86004..81715fb 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -914,23 +914,23 @@ am__libpulsecore_ at PA_MAJORMINOR@_la_SOURCES_DIST =  \
 	pulsecore/auth-cookie.h pulsecore/cli-command.c \
 	pulsecore/cli-command.h pulsecore/cli-text.c \
 	pulsecore/cli-text.h pulsecore/client.c pulsecore/client.h \
-	pulsecore/card.c pulsecore/card.h pulsecore/core-scache.c \
-	pulsecore/core-scache.h pulsecore/core-subscribe.c \
-	pulsecore/core-subscribe.h pulsecore/core.c pulsecore/core.h \
-	pulsecore/hook-list.c pulsecore/hook-list.h \
-	pulsecore/ltdl-helper.c pulsecore/ltdl-helper.h \
-	pulsecore/modargs.c pulsecore/modargs.h pulsecore/modinfo.c \
-	pulsecore/modinfo.h pulsecore/module.c pulsecore/module.h \
-	pulsecore/msgobject.c pulsecore/msgobject.h \
-	pulsecore/namereg.c pulsecore/namereg.h pulsecore/object.c \
-	pulsecore/object.h pulsecore/play-memblockq.c \
-	pulsecore/play-memblockq.h pulsecore/play-memchunk.c \
-	pulsecore/play-memchunk.h pulsecore/remap.c pulsecore/remap.h \
-	pulsecore/remap_mmx.c pulsecore/remap_sse.c \
-	pulsecore/resampler.c pulsecore/resampler.h \
-	pulsecore/resampler/ffmpeg.c pulsecore/resampler/peaks.c \
-	pulsecore/resampler/trivial.c pulsecore/rtpoll.c \
-	pulsecore/rtpoll.h pulsecore/stream-util.c \
+	pulsecore/typedefs.h pulsecore/card.c pulsecore/card.h \
+	pulsecore/core-scache.c pulsecore/core-scache.h \
+	pulsecore/core-subscribe.c pulsecore/core-subscribe.h \
+	pulsecore/core.c pulsecore/core.h pulsecore/hook-list.c \
+	pulsecore/hook-list.h pulsecore/ltdl-helper.c \
+	pulsecore/ltdl-helper.h pulsecore/modargs.c \
+	pulsecore/modargs.h pulsecore/modinfo.c pulsecore/modinfo.h \
+	pulsecore/module.c pulsecore/module.h pulsecore/msgobject.c \
+	pulsecore/msgobject.h pulsecore/namereg.c pulsecore/namereg.h \
+	pulsecore/object.c pulsecore/object.h \
+	pulsecore/play-memblockq.c pulsecore/play-memblockq.h \
+	pulsecore/play-memchunk.c pulsecore/play-memchunk.h \
+	pulsecore/remap.c pulsecore/remap.h pulsecore/remap_mmx.c \
+	pulsecore/remap_sse.c pulsecore/resampler.c \
+	pulsecore/resampler.h pulsecore/resampler/ffmpeg.c \
+	pulsecore/resampler/peaks.c pulsecore/resampler/trivial.c \
+	pulsecore/rtpoll.c pulsecore/rtpoll.h pulsecore/stream-util.c \
 	pulsecore/stream-util.h pulsecore/mix.c pulsecore/mix.h \
 	pulsecore/cpu.c pulsecore/cpu.h pulsecore/cpu-arm.c \
 	pulsecore/cpu-arm.h pulsecore/cpu-x86.c pulsecore/cpu-x86.h \
@@ -3403,7 +3403,6 @@ PREOPEN_MODS = @PREOPEN_MODS@
 PTHREAD_CC = @PTHREAD_CC@
 PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
 PTHREAD_LIBS = @PTHREAD_LIBS@
-PULSE_LOCALEDIR = @PULSE_LOCALEDIR@
 RANLIB = @RANLIB@
 SBC_CFLAGS = @SBC_CFLAGS@
 SBC_LIBS = @SBC_LIBS@
@@ -3516,19 +3515,21 @@ AM_CPPFLAGS = \
 	-DPA_ALSA_PATHS_DIR=\"$(alsapathsdir)\" \
 	-DPA_ALSA_PROFILE_SETS_DIR=\"$(alsaprofilesetsdir)\" \
 	-DPA_SRCDIR=\"$(abs_srcdir)\" \
-	-DPA_BUILDDIR=\"$(abs_builddir)\"
+	-DPA_BUILDDIR=\"$(abs_builddir)\" \
+	-DPULSE_LOCALEDIR=\"$(localedir)\"
 
 AM_CFLAGS = $(PTHREAD_CFLAGS) $(am__append_1)
 AM_CXXFLAGS = $(AM_CFLAGS) $(am__append_2)
 SERVER_CFLAGS = -D__INCLUDED_FROM_PULSE_AUDIO
 AM_LIBADD = $(PTHREAD_LIBS) $(INTLLIBS)
 AM_LDADD = $(PTHREAD_LIBS) $(INTLLIBS)
-AM_LDFLAGS = $(NODELETE_LDFLAGS) $(am__append_3) $(am__append_4) \
-	$(am__append_5)
+AM_LDFLAGS = $(am__append_3) $(am__append_4) $(am__append_5)
+# Should only be applied to libraries.
+AM_LIBLDFLAGS = $(NODELETE_LDFLAGS)
 @STATIC_BINS_TRUE at BINLDFLAGS = -static
 @OS_IS_WIN32_TRUE at WINSOCK_LIBS = -lwsock32 -lws2_32 -lwininet
 FOREIGN_CFLAGS = -w
-MODULE_LDFLAGS = $(AM_LDFLAGS) -module -disable-static -avoid-version $(NOUNDEFINED_LDFLAGS)
+MODULE_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -module -disable-static -avoid-version $(NOUNDEFINED_LDFLAGS)
 MODULE_LIBADD = $(AM_LIBADD) libpulsecore- at PA_MAJORMINOR@.la libpulsecommon- at PA_MAJORMINOR@.la libpulse.la
 
 ###################################
@@ -3881,9 +3882,12 @@ lo_latency_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBCHECK_LIBS)
 ###################################
 #         Common library          #
 ###################################
-pkglib_LTLIBRARIES = \
-		libpulsecommon- at PA_MAJORMINOR@.la
 
+###################################
+#      Daemon core library        #
+###################################
+pkglib_LTLIBRARIES = libpulsecommon- at PA_MAJORMINOR@.la \
+	libpulsecore- at PA_MAJORMINOR@.la
 
 # We duplicate files from pulse/ in this to allow as-needed linking. If we did
 # not do this, in situations where code in libpulsecommon uses code in
@@ -3955,8 +3959,8 @@ libpulsecommon_ at PA_MAJORMINOR@_la_CFLAGS = $(AM_CFLAGS) \
 	$(GTK30_CFLAGS) $(am__append_36) $(am__append_38) \
 	$(am__append_42)
 libpulsecommon_ at PA_MAJORMINOR@_la_LDFLAGS = $(AM_LDFLAGS) \
-	-avoid-version $(am__append_29) $(am__append_31) \
-	$(am__append_33)
+	$(AM_LIBLDFLAGS) -avoid-version $(am__append_29) \
+	$(am__append_31) $(am__append_33)
 libpulsecommon_ at PA_MAJORMINOR@_la_LIBADD = $(AM_LIBADD) \
 	$(LIBJSON_LIBS) $(LIBWRAP_LIBS) $(WINSOCK_LIBS) $(LTLIBICONV) \
 	$(LIBSNDFILE_LIBS) $(am__append_39) $(am__append_43)
@@ -3975,12 +3979,7 @@ pulseinclude_HEADERS = pulse/cdecl.h pulse/channelmap.h \
 	pulse/subscribe.h pulse/thread-mainloop.h pulse/timeval.h \
 	pulse/utf8.h pulse/util.h pulse/version.h pulse/volume.h \
 	pulse/xmalloc.h $(am__append_44)
-
-###################################
-#      Daemon core library        #
-###################################
-lib_LTLIBRARIES = libpulse.la libpulse-simple.la $(am__append_45) \
-	libpulsecore- at PA_MAJORMINOR@.la
+lib_LTLIBRARIES = libpulse.la libpulse-simple.la $(am__append_45)
 
 # Public interface
 libpulse_la_SOURCES = \
@@ -4019,15 +4018,15 @@ libpulse_la_CFLAGS = $(AM_CFLAGS) $(LIBJSON_CFLAGS) $(am__append_46)
 libpulse_la_LIBADD = $(AM_LIBADD) $(WINSOCK_LIBS) $(LTLIBICONV) \
 	$(LIBJSON_LIBS) libpulsecommon- at PA_MAJORMINOR@.la \
 	$(am__append_47)
-libpulse_la_LDFLAGS = $(AM_LDFLAGS) $(VERSIONING_LDFLAGS) -version-info $(LIBPULSE_VERSION_INFO)
+libpulse_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) $(VERSIONING_LDFLAGS) -version-info $(LIBPULSE_VERSION_INFO)
 libpulse_simple_la_SOURCES = pulse/simple.c pulse/simple.h
 libpulse_simple_la_CFLAGS = $(AM_CFLAGS)
 libpulse_simple_la_LIBADD = $(AM_LIBADD) libpulse.la libpulsecommon- at PA_MAJORMINOR@.la
-libpulse_simple_la_LDFLAGS = $(AM_LDFLAGS) $(VERSIONING_LDFLAGS) -version-info $(LIBPULSE_SIMPLE_VERSION_INFO)
+libpulse_simple_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) $(VERSIONING_LDFLAGS) -version-info $(LIBPULSE_SIMPLE_VERSION_INFO)
 libpulse_mainloop_glib_la_SOURCES = pulse/glib-mainloop.h pulse/glib-mainloop.c
 libpulse_mainloop_glib_la_CFLAGS = $(AM_CFLAGS) $(GLIB20_CFLAGS)
 libpulse_mainloop_glib_la_LIBADD = $(AM_LIBADD) libpulse.la libpulsecommon- at PA_MAJORMINOR@.la $(GLIB20_LIBS)
-libpulse_mainloop_glib_la_LDFLAGS = $(AM_LDFLAGS) $(VERSIONING_LDFLAGS) -version-info $(LIBPULSE_MAINLOOP_GLIB_VERSION_INFO)
+libpulse_mainloop_glib_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) $(VERSIONING_LDFLAGS) -version-info $(LIBPULSE_MAINLOOP_GLIB_VERSION_INFO)
 
 ###################################
 #         OSS emulation           #
@@ -4040,7 +4039,7 @@ libpulse_mainloop_glib_la_LDFLAGS = $(AM_LDFLAGS) $(VERSIONING_LDFLAGS) -version
 libpulsedsp_la_SOURCES = utils/padsp.c
 libpulsedsp_la_CFLAGS = $(AM_CFLAGS)
 libpulsedsp_la_LIBADD = $(AM_LIBADD) libpulse.la libpulsecommon- at PA_MAJORMINOR@.la
-libpulsedsp_la_LDFLAGS = $(AM_LDFLAGS) -avoid-version -disable-static
+libpulsedsp_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version -disable-static
 
 # Pure core stuff
 libpulsecore_ at PA_MAJORMINOR@_la_SOURCES =  \
@@ -4052,23 +4051,23 @@ libpulsecore_ at PA_MAJORMINOR@_la_SOURCES =  \
 	pulsecore/auth-cookie.h pulsecore/cli-command.c \
 	pulsecore/cli-command.h pulsecore/cli-text.c \
 	pulsecore/cli-text.h pulsecore/client.c pulsecore/client.h \
-	pulsecore/card.c pulsecore/card.h pulsecore/core-scache.c \
-	pulsecore/core-scache.h pulsecore/core-subscribe.c \
-	pulsecore/core-subscribe.h pulsecore/core.c pulsecore/core.h \
-	pulsecore/hook-list.c pulsecore/hook-list.h \
-	pulsecore/ltdl-helper.c pulsecore/ltdl-helper.h \
-	pulsecore/modargs.c pulsecore/modargs.h pulsecore/modinfo.c \
-	pulsecore/modinfo.h pulsecore/module.c pulsecore/module.h \
-	pulsecore/msgobject.c pulsecore/msgobject.h \
-	pulsecore/namereg.c pulsecore/namereg.h pulsecore/object.c \
-	pulsecore/object.h pulsecore/play-memblockq.c \
-	pulsecore/play-memblockq.h pulsecore/play-memchunk.c \
-	pulsecore/play-memchunk.h pulsecore/remap.c pulsecore/remap.h \
-	pulsecore/remap_mmx.c pulsecore/remap_sse.c \
-	pulsecore/resampler.c pulsecore/resampler.h \
-	pulsecore/resampler/ffmpeg.c pulsecore/resampler/peaks.c \
-	pulsecore/resampler/trivial.c pulsecore/rtpoll.c \
-	pulsecore/rtpoll.h pulsecore/stream-util.c \
+	pulsecore/typedefs.h pulsecore/card.c pulsecore/card.h \
+	pulsecore/core-scache.c pulsecore/core-scache.h \
+	pulsecore/core-subscribe.c pulsecore/core-subscribe.h \
+	pulsecore/core.c pulsecore/core.h pulsecore/hook-list.c \
+	pulsecore/hook-list.h pulsecore/ltdl-helper.c \
+	pulsecore/ltdl-helper.h pulsecore/modargs.c \
+	pulsecore/modargs.h pulsecore/modinfo.c pulsecore/modinfo.h \
+	pulsecore/module.c pulsecore/module.h pulsecore/msgobject.c \
+	pulsecore/msgobject.h pulsecore/namereg.c pulsecore/namereg.h \
+	pulsecore/object.c pulsecore/object.h \
+	pulsecore/play-memblockq.c pulsecore/play-memblockq.h \
+	pulsecore/play-memchunk.c pulsecore/play-memchunk.h \
+	pulsecore/remap.c pulsecore/remap.h pulsecore/remap_mmx.c \
+	pulsecore/remap_sse.c pulsecore/resampler.c \
+	pulsecore/resampler.h pulsecore/resampler/ffmpeg.c \
+	pulsecore/resampler/peaks.c pulsecore/resampler/trivial.c \
+	pulsecore/rtpoll.c pulsecore/rtpoll.h pulsecore/stream-util.c \
 	pulsecore/stream-util.h pulsecore/mix.c pulsecore/mix.h \
 	pulsecore/cpu.c pulsecore/cpu.h pulsecore/cpu-arm.c \
 	pulsecore/cpu-arm.h pulsecore/cpu-x86.c pulsecore/cpu-x86.h \
@@ -4094,8 +4093,8 @@ libpulsecore_ at PA_MAJORMINOR@_la_CFLAGS = $(AM_CFLAGS) $(SERVER_CFLAGS) \
 	$(am__append_56) $(am__append_59) $(am__append_62) \
 	$(am__append_65) $(am__append_69) $(am__append_72) \
 	$(am__append_75)
-libpulsecore_ at PA_MAJORMINOR@_la_LDFLAGS = $(AM_LDFLAGS) -avoid-version \
-	$(am__append_57)
+libpulsecore_ at PA_MAJORMINOR@_la_LDFLAGS = $(AM_LDFLAGS) \
+	$(AM_LIBLDFLAGS) -avoid-version $(am__append_57)
 libpulsecore_ at PA_MAJORMINOR@_la_LIBADD = $(AM_LIBADD) $(LIBLTDL) \
 	$(LIBSNDFILE_LIBS) $(WINSOCK_LIBS) $(LTLIBICONV) \
 	libpulsecommon- at PA_MAJORMINOR@.la libpulse.la \
@@ -4158,26 +4157,26 @@ modlibexec_LTLIBRARIES = libcli.la libprotocol-cli.la \
 	$(am__append_111) $(am__append_112) $(am__append_113) \
 	$(am__append_114) $(am__append_115)
 libprotocol_simple_la_SOURCES = pulsecore/protocol-simple.c pulsecore/protocol-simple.h
-libprotocol_simple_la_LDFLAGS = $(AM_LDFLAGS) -avoid-version
+libprotocol_simple_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version
 libprotocol_simple_la_LIBADD = $(AM_LIBADD) libpulsecore- at PA_MAJORMINOR@.la libpulsecommon- at PA_MAJORMINOR@.la libpulse.la
 libcli_la_SOURCES = pulsecore/cli.c pulsecore/cli.h
-libcli_la_LDFLAGS = $(AM_LDFLAGS) -avoid-version
+libcli_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version
 libcli_la_LIBADD = $(AM_LIBADD) libpulsecore- at PA_MAJORMINOR@.la libpulsecommon- at PA_MAJORMINOR@.la libpulse.la
 libprotocol_cli_la_SOURCES = pulsecore/protocol-cli.c pulsecore/protocol-cli.h
-libprotocol_cli_la_LDFLAGS = $(AM_LDFLAGS) -avoid-version
+libprotocol_cli_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version
 libprotocol_cli_la_LIBADD = $(AM_LIBADD) libpulsecore- at PA_MAJORMINOR@.la libpulsecommon- at PA_MAJORMINOR@.la libpulse.la libcli.la
 libprotocol_http_la_SOURCES = pulsecore/protocol-http.c pulsecore/protocol-http.h pulsecore/mime-type.c pulsecore/mime-type.h
-libprotocol_http_la_LDFLAGS = $(AM_LDFLAGS) -avoid-version
+libprotocol_http_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version
 libprotocol_http_la_LIBADD = $(AM_LIBADD) libpulsecore- at PA_MAJORMINOR@.la libpulsecommon- at PA_MAJORMINOR@.la libpulse.la
 libprotocol_native_la_SOURCES = pulsecore/protocol-native.c pulsecore/protocol-native.h pulsecore/native-common.h
 libprotocol_native_la_CFLAGS = $(AM_CFLAGS) $(SERVER_CFLAGS) \
 	$(am__append_81)
-libprotocol_native_la_LDFLAGS = $(AM_LDFLAGS) -avoid-version
+libprotocol_native_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version
 libprotocol_native_la_LIBADD = $(AM_LIBADD) \
 	libpulsecore- at PA_MAJORMINOR@.la \
 	libpulsecommon- at PA_MAJORMINOR@.la libpulse.la $(am__append_82)
 @HAVE_ESOUND_TRUE at libprotocol_esound_la_SOURCES = pulsecore/protocol-esound.c pulsecore/protocol-esound.h pulsecore/esound.h
- at HAVE_ESOUND_TRUE@libprotocol_esound_la_LDFLAGS = $(AM_LDFLAGS) -avoid-version
+ at HAVE_ESOUND_TRUE@libprotocol_esound_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version
 @HAVE_ESOUND_TRUE at libprotocol_esound_la_LIBADD = $(AM_LIBADD) libpulsecore- at PA_MAJORMINOR@.la libpulsecommon- at PA_MAJORMINOR@.la libpulse.la
 librtp_la_SOURCES = \
 		modules/rtp/rtp.c modules/rtp/rtp.h \
@@ -4186,19 +4185,19 @@ librtp_la_SOURCES = \
 		modules/rtp/rtsp_client.c modules/rtp/rtsp_client.h \
 		modules/rtp/headerlist.c modules/rtp/headerlist.h
 
-librtp_la_LDFLAGS = $(AM_LDFLAGS) -avoid-version
+librtp_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version
 librtp_la_LIBADD = $(AM_LIBADD) libpulsecore- at PA_MAJORMINOR@.la libpulsecommon- at PA_MAJORMINOR@.la libpulse.la
 libraop_la_SOURCES = \
         modules/raop/raop_client.c modules/raop/raop_client.h \
         modules/raop/base64.c modules/raop/base64.h
 
 libraop_la_CFLAGS = $(AM_CFLAGS) $(OPENSSL_CFLAGS) -I$(top_srcdir)/src/modules/rtp
-libraop_la_LDFLAGS = $(AM_LDFLAGS) -avoid-version
+libraop_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version
 libraop_la_LIBADD = $(AM_LIBADD) $(OPENSSL_LIBS) libpulsecore- at PA_MAJORMINOR@.la librtp.la libpulsecommon- at PA_MAJORMINOR@.la libpulse.la
 
 # Avahi
 libavahi_wrap_la_SOURCES = pulsecore/avahi-wrap.c pulsecore/avahi-wrap.h
-libavahi_wrap_la_LDFLAGS = $(AM_LDFLAGS) -avoid-version
+libavahi_wrap_la_LDFLAGS = $(AM_LDFLAGS) $(AM_LIBLDFLAGS) -avoid-version
 libavahi_wrap_la_CFLAGS = $(AM_CFLAGS) $(AVAHI_CFLAGS)
 libavahi_wrap_la_LIBADD = $(AM_LIBADD) $(AVAHI_CFLAGS) libpulsecore- at PA_MAJORMINOR@.la libpulsecommon- at PA_MAJORMINOR@.la libpulse.la
 @HAVE_ALSA_TRUE at dist_alsaprofilesets_DATA = \
@@ -5551,7 +5550,7 @@ pulsecore/libpulsecore_ at PA_MAJORMINOR@_la-svolume-orc-gen.lo:  \
 	pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp)
 
 libpulsecore- at PA_MAJORMINOR@.la: $(libpulsecore_ at PA_MAJORMINOR@_la_OBJECTS) $(libpulsecore_ at PA_MAJORMINOR@_la_DEPENDENCIES) $(EXTRA_libpulsecore_ at PA_MAJORMINOR@_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(libpulsecore_ at PA_MAJORMINOR@_la_LINK) -rpath $(libdir) $(libpulsecore_ at PA_MAJORMINOR@_la_OBJECTS) $(libpulsecore_ at PA_MAJORMINOR@_la_LIBADD) $(LIBS)
+	$(AM_V_CCLD)$(libpulsecore_ at PA_MAJORMINOR@_la_LINK) -rpath $(pkglibdir) $(libpulsecore_ at PA_MAJORMINOR@_la_OBJECTS) $(libpulsecore_ at PA_MAJORMINOR@_la_LIBADD) $(LIBS)
 pulsecore/ffmpeg/$(am__dirstamp):
 	@$(MKDIR_P) pulsecore/ffmpeg
 	@: > pulsecore/ffmpeg/$(am__dirstamp)
diff --git a/src/daemon/cmdline.c b/src/daemon/cmdline.c
index 68a02e3..117147d 100644
--- a/src/daemon/cmdline.c
+++ b/src/daemon/cmdline.c
@@ -395,7 +395,7 @@ int pa_cmdline_parse(pa_daemon_conf *conf, int argc, char *const argv [], int *d
     }
 
     pa_xfree(conf->script_commands);
-    conf->script_commands = pa_strbuf_tostring_free(buf);
+    conf->script_commands = pa_strbuf_to_string_free(buf);
 
     *d = optind;
 
diff --git a/src/daemon/daemon-conf.c b/src/daemon/daemon-conf.c
index 21a8edb..288aed2 100644
--- a/src/daemon/daemon-conf.c
+++ b/src/daemon/daemon-conf.c
@@ -617,7 +617,7 @@ int pa_daemon_conf_load(pa_daemon_conf *c, const char *filename) {
     ci.default_channel_map_set = ci.default_sample_spec_set = false;
     ci.conf = c;
 
-    r = f ? pa_config_parse(c->config_file, f, table, NULL, NULL) : 0;
+    r = f ? pa_config_parse(c->config_file, f, table, NULL, true, NULL) : 0;
 
     if (r >= 0) {
 
@@ -804,5 +804,5 @@ char *pa_daemon_conf_dump(pa_daemon_conf *c) {
 
     pa_xfree(log_target);
 
-    return pa_strbuf_tostring_free(s);
+    return pa_strbuf_to_string_free(s);
 }
diff --git a/src/daemon/main.c b/src/daemon/main.c
index 7734f52..c2f47b6 100644
--- a/src/daemon/main.c
+++ b/src/daemon/main.c
@@ -998,9 +998,9 @@ int main(int argc, char *argv[]) {
     pa_disable_sigpipe();
 
     if (pa_rtclock_hrtimer())
-        pa_log_info("Fresh high-resolution timers available! Bon appetit.");
+        pa_log_info("System supports high resolution timers");
     else
-        pa_log_info("Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled.");
+        pa_log_info("System appears to not support high resolution timers");
 
     if (conf->lock_memory) {
 #if defined(HAVE_SYS_MMAN_H) && !defined(__ANDROID__)
@@ -1082,7 +1082,7 @@ int main(int argc, char *argv[]) {
         if (r >= 0)
             r = pa_cli_command_execute(c, conf->script_commands, buf, &conf->fail);
 
-        pa_log_error("%s", s = pa_strbuf_tostring_free(buf));
+        pa_log_error("%s", s = pa_strbuf_to_string_free(buf));
         pa_xfree(s);
 
         if (r < 0 && conf->fail) {
diff --git a/src/map-file b/src/map-file
index 5159829..93a62b8 100644
--- a/src/map-file
+++ b/src/map-file
@@ -7,6 +7,7 @@ pa_bytes_snprint;
 pa_bytes_to_usec;
 pa_channel_map_can_balance;
 pa_channel_map_can_fade;
+pa_channel_map_can_lfe_balance;
 pa_channel_map_compatible;
 pa_channel_map_equal;
 pa_channel_map_has_position;
@@ -127,6 +128,7 @@ pa_cvolume_dec;
 pa_cvolume_equal;
 pa_cvolume_get_balance;
 pa_cvolume_get_fade;
+pa_cvolume_get_lfe_balance;
 pa_cvolume_get_position;
 pa_cvolume_inc;
 pa_cvolume_inc_clamp;
@@ -142,6 +144,7 @@ pa_cvolume_scale_mask;
 pa_cvolume_set;
 pa_cvolume_set_balance;
 pa_cvolume_set_fade;
+pa_cvolume_set_lfe_balance;
 pa_cvolume_set_position;
 pa_cvolume_snprint;
 pa_cvolume_snprint_verbose;
diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c
index 7580e8a..1fe2a02 100644
--- a/src/modules/alsa/alsa-mixer.c
+++ b/src/modules/alsa/alsa-mixer.c
@@ -329,6 +329,10 @@ static void defer_cb(pa_mainloop_api *a, pa_defer_event *e, void *userdata) {
         pa_log("snd_mixer_poll_descriptors_count() failed: %s", pa_alsa_strerror(n));
         return;
     }
+    else if (n == 0) {
+        pa_log_warn("Mixer has no poll descriptors. Please control mixer from PulseAudio only.");
+        return;
+    }
     num_fds = (unsigned) n;
 
     if (num_fds != fdl->num_fds) {
@@ -522,6 +526,10 @@ int pa_alsa_set_mixer_rtpoll(struct pa_alsa_mixer_pdata *pd, snd_mixer_t *mixer,
         pa_log("snd_mixer_poll_descriptors_count() failed: %s", pa_alsa_strerror(n));
         return -1;
     }
+    else if (n == 0) {
+        pa_log_warn("Mixer has no poll descriptors. Please control mixer from PulseAudio only.");
+        return 0;
+    }
 
     i = pa_rtpoll_item_new(rtp, PA_RTPOLL_LATE, (unsigned) n);
 
@@ -2586,7 +2594,7 @@ pa_alsa_path* pa_alsa_path_new(const char *paths_dir, const char *fname, pa_alsa
 
     fn = pa_maybe_prefix_path(fname, paths_dir);
 
-    r = pa_config_parse(fn, NULL, items, p->proplist, p);
+    r = pa_config_parse(fn, NULL, items, p->proplist, false, p);
     pa_xfree(fn);
 
     if (r < 0)
@@ -2613,6 +2621,7 @@ pa_alsa_path *pa_alsa_path_synthesize(const char *element, pa_alsa_direction_t d
     p = pa_xnew0(pa_alsa_path, 1);
     p->name = pa_xstrdup(element);
     p->direction = direction;
+    p->proplist = pa_proplist_new();
 
     e = pa_xnew0(pa_alsa_element, 1);
     e->path = p;
@@ -3465,6 +3474,8 @@ static void profile_free(pa_alsa_profile *p) {
 
     pa_xfree(p->name);
     pa_xfree(p->description);
+    pa_xfree(p->input_name);
+    pa_xfree(p->output_name);
 
     pa_xstrfreev(p->input_mapping_names);
     pa_xstrfreev(p->output_mapping_names);
@@ -4115,6 +4126,7 @@ static void profile_set_add_auto_pair(
     p->name = name;
 
     if (m) {
+        p->output_name = pa_xstrdup(m->name);
         p->output_mappings = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
         pa_idxset_put(p->output_mappings, m, NULL);
         p->priority += m->priority * 100;
@@ -4122,6 +4134,7 @@ static void profile_set_add_auto_pair(
     }
 
     if (n) {
+        p->input_name = pa_xstrdup(n->name);
         p->input_mappings = pa_idxset_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
         pa_idxset_put(p->input_mappings, n, NULL);
         p->priority += n->priority;
@@ -4273,7 +4286,7 @@ static int profile_verify(pa_alsa_profile *p) {
                 pa_strbuf_printf(sb, _("%s Input"), m->description);
             }
 
-        p->description = pa_strbuf_tostring_free(sb);
+        p->description = pa_strbuf_to_string_free(sb);
     }
 
     return 0;
@@ -4284,9 +4297,11 @@ void pa_alsa_profile_dump(pa_alsa_profile *p) {
     pa_alsa_mapping *m;
     pa_assert(p);
 
-    pa_log_debug("Profile %s (%s), priority=%u, supported=%s n_input_mappings=%u, n_output_mappings=%u",
+    pa_log_debug("Profile %s (%s), input=%s, output=%s priority=%u, supported=%s n_input_mappings=%u, n_output_mappings=%u",
                  p->name,
                  pa_strnull(p->description),
+                 pa_strnull(p->input_name),
+                 pa_strnull(p->output_name),
                  p->priority,
                  pa_yes_no(p->supported),
                  p->input_mappings ? pa_idxset_size(p->input_mappings) : 0,
@@ -4333,7 +4348,7 @@ void pa_alsa_decibel_fix_dump(pa_alsa_decibel_fix *db_fix) {
         for (i = 0; i < nsteps; ++i)
             pa_strbuf_printf(buf, "[%li]:%0.2f ", i + db_fix->min_step, db_fix->db_values[i] / 100.0);
 
-        db_values = pa_strbuf_tostring_free(buf);
+        db_values = pa_strbuf_to_string_free(buf);
     }
 
     pa_log_debug("Decibel fix %s, min_step=%li, max_step=%li, db_values=%s",
@@ -4396,7 +4411,7 @@ pa_alsa_profile_set* pa_alsa_profile_set_new(const char *fname, const pa_channel
                               pa_run_from_build_tree() ? PA_SRCDIR "/modules/alsa/mixer/profile-sets/" :
                               PA_ALSA_PROFILE_SETS_DIR);
 
-    r = pa_config_parse(fn, NULL, items, NULL, ps);
+    r = pa_config_parse(fn, NULL, items, NULL, false, ps);
     pa_xfree(fn);
 
     if (r < 0)
diff --git a/src/modules/alsa/alsa-mixer.h b/src/modules/alsa/alsa-mixer.h
index 621a71b..4ebf192 100644
--- a/src/modules/alsa/alsa-mixer.h
+++ b/src/modules/alsa/alsa-mixer.h
@@ -293,6 +293,9 @@ struct pa_alsa_profile {
     char *description;
     unsigned priority;
 
+    char *input_name;
+    char *output_name;
+
     bool supported:1;
     bool fallback_input:1;
     bool fallback_output:1;
diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c
index b6c7d09..2fdebe0 100644
--- a/src/modules/alsa/alsa-sink.c
+++ b/src/modules/alsa/alsa-sink.c
@@ -1020,8 +1020,7 @@ static int update_sw_params(struct userdata *u) {
 /* Called from IO Context on unsuspend or from main thread when creating sink */
 static void reset_watermark(struct userdata *u, size_t tsched_watermark, pa_sample_spec *ss,
                             bool in_thread) {
-    u->tsched_watermark = pa_usec_to_bytes_round_up(pa_bytes_to_usec_round_up(tsched_watermark, ss),
-                                                    &u->sink->sample_spec);
+    u->tsched_watermark = pa_convert_size(tsched_watermark, ss, &u->sink->sample_spec);
 
     u->watermark_inc_step = pa_usec_to_bytes(TSCHED_WATERMARK_INC_STEP_USEC, &u->sink->sample_spec);
     u->watermark_dec_step = pa_usec_to_bytes(TSCHED_WATERMARK_DEC_STEP_USEC, &u->sink->sample_spec);
@@ -1628,8 +1627,10 @@ static int process_rewind(struct userdata *u) {
     pa_log_debug("Requested to rewind %lu bytes.", (unsigned long) rewind_nbytes);
 
     if (PA_UNLIKELY((unused = pa_alsa_safe_avail(u->pcm_handle, u->hwbuf_size, &u->sink->sample_spec)) < 0)) {
-        pa_log("snd_pcm_avail() failed: %s", pa_alsa_strerror((int) unused));
-        return -1;
+        if (try_recover(u, "snd_pcm_avail", (int) unused) < 0) {
+            pa_log_warn("Trying to recover from underrun failed during rewind");
+            return -1;
+        }
     }
 
     unused_nbytes = (size_t) unused * u->frame_size;
@@ -2225,7 +2226,13 @@ pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_ca
             pa_log_info("Disabling latency range changes on underrun");
     }
 
-    if (is_iec958(u) || is_hdmi(u))
+    /* All passthrough formats supported by PulseAudio require
+     * IEC61937 framing with two fake channels. So, passthrough
+     * clients will always send two channels. Multichannel sinks
+     * cannot accept that, because nobody implemented sink channel count
+     * switching so far. So just don't show known non-working settings
+     * to the user. */
+    if ((is_iec958(u) || is_hdmi(u)) && ss.channels == 2)
         set_formats = true;
 
     u->rates = pa_alsa_get_supported_rates(u->pcm_handle, ss.rate);
diff --git a/src/modules/alsa/alsa-source.c b/src/modules/alsa/alsa-source.c
index d7d3eb5..4683dfe 100644
--- a/src/modules/alsa/alsa-source.c
+++ b/src/modules/alsa/alsa-source.c
@@ -913,8 +913,7 @@ static int update_sw_params(struct userdata *u) {
 /* Called from IO Context on unsuspend or from main thread when creating source */
 static void reset_watermark(struct userdata *u, size_t tsched_watermark, pa_sample_spec *ss,
                             bool in_thread) {
-    u->tsched_watermark = pa_usec_to_bytes_round_up(pa_bytes_to_usec_round_up(tsched_watermark, ss),
-                                                    &u->source->sample_spec);
+    u->tsched_watermark = pa_convert_size(tsched_watermark, ss, &u->source->sample_spec);
 
     u->watermark_inc_step = pa_usec_to_bytes(TSCHED_WATERMARK_INC_STEP_USEC, &u->source->sample_spec);
     u->watermark_dec_step = pa_usec_to_bytes(TSCHED_WATERMARK_DEC_STEP_USEC, &u->source->sample_spec);
diff --git a/src/modules/alsa/mixer/paths/analog-input-headset-mic.conf b/src/modules/alsa/mixer/paths/analog-input-headset-mic.conf
index a67e1db..b669bc4 100644
--- a/src/modules/alsa/mixer/paths/analog-input-headset-mic.conf
+++ b/src/modules/alsa/mixer/paths/analog-input-headset-mic.conf
@@ -32,6 +32,9 @@ required-any = any
 [Jack Headphone]
 state.plugged = unknown
 
+[Jack Front Headphone]
+state.plugged = unknown
+
 [Jack Headphone Mic]
 state.plugged = unknown
 
diff --git a/src/modules/alsa/mixer/profile-sets/sb-omni-surround-5.1.conf b/src/modules/alsa/mixer/profile-sets/sb-omni-surround-5.1.conf
index 5795067..e534def 100644
--- a/src/modules/alsa/mixer/profile-sets/sb-omni-surround-5.1.conf
+++ b/src/modules/alsa/mixer/profile-sets/sb-omni-surround-5.1.conf
@@ -15,8 +15,12 @@
 
 ; Creative Sound Blaster Omni Surround 5.1
 ;
-; This sound card have Mic/Line in at hw:%f,1,0 - this is the main
-; difference from default.conf, also unsupported sections removed.
+; This sound card have Mic/Line in at hw:%f,1,0 on Linux prior to 4.3-rc1,
+; but starting from Linux 4.3-rc1 Mic/Line is at hw:%f,0,0
+; This config supports both cases.
+; Also by default there are some non-existing (physically) inputs
+; and outputs that are not present here.
+; And finally in 2.1 mode LFE is not working, so it is removed also.
 ;
 ; See default.conf for an explanation on the directives used here.
 
@@ -24,25 +28,20 @@
 auto-profiles = yes
 
 [Mapping analog-stereo-output]
-device-strings = front:%f hw:%f
+device-strings = front:%f
 channel-map = left,right
 paths-output = analog-output
 priority = 10
 direction = output
 
+; Linux 4.2.x- have microphone input as device 1
+; While Linux 4.3-rc1+ have microphone input as device 0
 [Mapping analog-stereo-input]
-device-strings = hw:%f,1,0
+device-strings = hw:%f hw:%f,1,0
 paths-input = analog-input-mic analog-input-linein
 channel-map = left,right
 direction = input
 
-[Mapping analog-surround-21]
-device-strings = surround21:%f
-channel-map = front-left,front-right,lfe
-paths-output = analog-output
-priority = 5
-direction = output
-
 [Mapping analog-surround-41]
 device-strings = surround41:%f
 channel-map = front-left,front-right,rear-left,rear-right,lfe
diff --git a/src/modules/alsa/module-alsa-card.c b/src/modules/alsa/module-alsa-card.c
index df4f848..286cfc9 100644
--- a/src/modules/alsa/module-alsa-card.c
+++ b/src/modules/alsa/module-alsa-card.c
@@ -143,6 +143,8 @@ static void add_profiles(struct userdata *u, pa_hashmap *h, pa_hashmap *ports) {
 
         cp = pa_card_profile_new(ap->name, ap->description, sizeof(struct profile_data));
         cp->priority = ap->priority;
+        cp->input_name = pa_xstrdup(ap->input_name);
+        cp->output_name = pa_xstrdup(ap->output_name);
 
         if (ap->output_mappings) {
             cp->n_sinks = pa_idxset_size(ap->output_mappings);
@@ -304,7 +306,7 @@ static void init_profile(struct userdata *u) {
             am->source = pa_alsa_source_new(u->module, u->modargs, __FILE__, u->card, am);
 }
 
-static void report_port_state(pa_device_port *p, struct userdata *u) {
+static pa_available_t calc_port_state(pa_device_port *p, struct userdata *u) {
     void *state;
     pa_alsa_jack *jack;
     pa_available_t pa = PA_AVAILABLE_UNKNOWN;
@@ -348,10 +350,14 @@ static void report_port_state(pa_device_port *p, struct userdata *u) {
           pa = cpa;
         }
     }
-
-    pa_device_port_set_available(p, pa);
+    return pa;
 }
 
+struct temp_port_avail {
+    pa_device_port *port;
+    pa_available_t avail;
+};
+
 static int report_jack_state(snd_mixer_elem_t *melem, unsigned int mask) {
     struct userdata *u = snd_mixer_elem_get_callback_private(melem);
     snd_hctl_elem_t *elem = snd_mixer_elem_get_private(melem);
@@ -359,7 +365,7 @@ static int report_jack_state(snd_mixer_elem_t *melem, unsigned int mask) {
     bool plugged_in;
     void *state;
     pa_alsa_jack *jack;
-    pa_device_port *port;
+    struct temp_port_avail *tp, *tports;
 
     pa_assert(u);
 
@@ -376,6 +382,8 @@ static int report_jack_state(snd_mixer_elem_t *melem, unsigned int mask) {
 
     pa_log_debug("Jack '%s' is now %s", pa_strnull(snd_hctl_elem_get_name(elem)), plugged_in ? "plugged in" : "unplugged");
 
+    tports = tp = pa_xnew0(struct temp_port_avail, pa_hashmap_size(u->jacks)+1);
+
     PA_HASHMAP_FOREACH(jack, u->jacks, state)
         if (jack->melem == melem) {
             pa_alsa_jack_set_plugged_in(jack, plugged_in);
@@ -388,9 +396,22 @@ static int report_jack_state(snd_mixer_elem_t *melem, unsigned int mask) {
 
             /* When not using UCM, we have to do the jack state -> port
              * availability mapping ourselves. */
-            pa_assert_se(port = jack->path->port);
-            report_port_state(port, u);
+            pa_assert_se(tp->port = jack->path->port);
+            tp->avail = calc_port_state(tp->port, u);
+            tp++;
         }
+
+    /* Report available ports before unavailable ones: in case port 1 becomes available when port 2 becomes unavailable,
+       this prevents an unnecessary switch port 1 -> port 3 -> port 2 */
+
+    for (tp = tports; tp->port; tp++)
+        if (tp->avail != PA_AVAILABLE_NO)
+           pa_device_port_set_available(tp->port, tp->avail);
+    for (tp = tports; tp->port; tp++)
+        if (tp->avail == PA_AVAILABLE_NO)
+           pa_device_port_set_available(tp->port, tp->avail);
+
+    pa_xfree(tports);
     return 0;
 }
 
diff --git a/src/modules/bluetooth/module-bluez4-device.c b/src/modules/bluetooth/module-bluez4-device.c
index db69d34..9a921a5 100644
--- a/src/modules/bluetooth/module-bluez4-device.c
+++ b/src/modules/bluetooth/module-bluez4-device.c
@@ -75,7 +75,6 @@ PA_MODULE_USAGE(
         "rate=<sample rate> "
         "channels=<number of channels> "
         "path=<device object path> "
-        "auto_connect=<automatically connect?> "
         "sco_sink=<SCO over PCM sink name> "
         "sco_source=<SCO over PCM source name>");
 
@@ -94,7 +93,6 @@ static const char* const valid_modargs[] = {
     "rate",
     "channels",
     "path",
-    "auto_connect",
     "sco_sink",
     "sco_source",
     NULL
@@ -148,7 +146,6 @@ struct userdata {
     pa_hook_slot *transport_speaker_changed_slot;
 
     pa_bluez4_discovery *discovery;
-    bool auto_connect;
 
     char *output_port_name;
     char *input_port_name;
@@ -2417,7 +2414,7 @@ static pa_hook_result_t discovery_hook_cb(pa_bluez4_discovery *y, const pa_bluez
     else
         return PA_HOOK_OK;
 
-    pa_module_unload(u->core, u->module, true);
+    pa_module_unload(u->module, true);
 
     return PA_HOOK_OK;
 }
@@ -2460,12 +2457,6 @@ int pa__init(pa_module *m) {
         goto fail;
     }
 
-    u->auto_connect = true;
-    if (pa_modargs_get_value_boolean(ma, "auto_connect", &u->auto_connect)) {
-        pa_log("Failed to parse auto_connect= argument");
-        goto fail;
-    }
-
     channels = u->sample_spec.channels;
     if (pa_modargs_get_value_u32(ma, "channels", &channels) < 0 ||
         !pa_channels_valid(channels)) {
diff --git a/src/modules/bluetooth/module-bluez5-device.c b/src/modules/bluetooth/module-bluez5-device.c
index 6ebcda2..84e6d55 100644
--- a/src/modules/bluetooth/module-bluez5-device.c
+++ b/src/modules/bluetooth/module-bluez5-device.c
@@ -2035,7 +2035,7 @@ static pa_hook_result_t device_connection_changed_cb(pa_bluetooth_discovery *y,
         return PA_HOOK_OK;
 
     pa_log_debug("Unloading module for device %s", d->path);
-    pa_module_unload(u->core, u->module, true);
+    pa_module_unload(u->module, true);
 
     return PA_HOOK_OK;
 }
diff --git a/src/modules/dbus/iface-card-profile.c b/src/modules/dbus/iface-card-profile.c
index e39c24d..bb8b642 100644
--- a/src/modules/dbus/iface-card-profile.c
+++ b/src/modules/dbus/iface-card-profile.c
@@ -36,6 +36,7 @@ static void handle_get_description(DBusConnection *conn, DBusMessage *msg, void
 static void handle_get_sinks(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_sources(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_priority(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_available(DBusConnection *conn, DBusMessage *msg, void *userdata);
 
 static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata);
 
@@ -53,6 +54,7 @@ enum property_handler_index {
     PROPERTY_HANDLER_SINKS,
     PROPERTY_HANDLER_SOURCES,
     PROPERTY_HANDLER_PRIORITY,
+    PROPERTY_HANDLER_AVAILABLE,
     PROPERTY_HANDLER_MAX
 };
 
@@ -63,6 +65,7 @@ static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX] = {
     [PROPERTY_HANDLER_SINKS]       = { .property_name = "Sinks",       .type = "u", .get_cb = handle_get_sinks,       .set_cb = NULL },
     [PROPERTY_HANDLER_SOURCES]     = { .property_name = "Sources",     .type = "u", .get_cb = handle_get_sources,     .set_cb = NULL },
     [PROPERTY_HANDLER_PRIORITY]    = { .property_name = "Priority",    .type = "u", .get_cb = handle_get_priority,    .set_cb = NULL },
+    [PROPERTY_HANDLER_AVAILABLE]   = { .property_name = "Available",   .type = "b", .get_cb = handle_get_available,   .set_cb = NULL },
 };
 
 static pa_dbus_interface_info profile_interface_info = {
@@ -145,6 +148,19 @@ static void handle_get_priority(DBusConnection *conn, DBusMessage *msg, void *us
     pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &priority);
 }
 
+static void handle_get_available(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_card_profile *p = userdata;
+    dbus_bool_t available;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(p);
+
+    available = p->profile->available != PA_AVAILABLE_NO;
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_BOOLEAN, &available);
+}
+
 static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata) {
     pa_dbusiface_card_profile *p = userdata;
     DBusMessage *reply = NULL;
@@ -153,6 +169,7 @@ static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdat
     dbus_uint32_t sinks = 0;
     dbus_uint32_t sources = 0;
     dbus_uint32_t priority = 0;
+    dbus_bool_t available;
 
     pa_assert(conn);
     pa_assert(msg);
@@ -161,6 +178,7 @@ static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdat
     sinks = p->profile->n_sinks;
     sources = p->profile->n_sources;
     priority = p->profile->priority;
+    available = p->profile->available != PA_AVAILABLE_NO;
 
     pa_assert_se((reply = dbus_message_new_method_return(msg)));
 
@@ -173,6 +191,7 @@ static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdat
     pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SINKS].property_name, DBUS_TYPE_UINT32, &sinks);
     pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_SOURCES].property_name, DBUS_TYPE_UINT32, &sources);
     pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_PRIORITY].property_name, DBUS_TYPE_UINT32, &priority);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_AVAILABLE].property_name, DBUS_TYPE_BOOLEAN, &available);
 
     pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter));
 
diff --git a/src/modules/dbus/iface-card.c b/src/modules/dbus/iface-card.c
index d0f13c9..1b705ba 100644
--- a/src/modules/dbus/iface-card.c
+++ b/src/modules/dbus/iface-card.c
@@ -60,6 +60,7 @@ struct pa_dbusiface_card {
 
     pa_hook_slot *card_profile_added_slot;
     pa_hook_slot *card_profile_changed_slot;
+    pa_hook_slot *card_profile_available_slot;
 
     pa_dbus_protocol *dbus_protocol;
 };
@@ -107,18 +108,22 @@ static pa_dbus_method_handler method_handlers[METHOD_HANDLER_MAX] = {
 enum signal_index {
     SIGNAL_ACTIVE_PROFILE_UPDATED,
     SIGNAL_NEW_PROFILE,
+    SIGNAL_PROFILE_AVAILABLE_CHANGED,
     SIGNAL_PROPERTY_LIST_UPDATED,
     SIGNAL_MAX
 };
 
-static pa_dbus_arg_info active_profile_updated_args[] = { { "profile",       "o",      NULL } };
-static pa_dbus_arg_info new_profile_args[] =            { { "profile",       "o",      NULL } };
-static pa_dbus_arg_info property_list_updated_args[] =  { { "property_list", "a{say}", NULL } };
+static pa_dbus_arg_info active_profile_updated_args[]    = { { "profile",       "o",      NULL } };
+static pa_dbus_arg_info new_profile_args[]               = { { "profile",       "o",      NULL } };
+static pa_dbus_arg_info profile_available_changed_args[] = { { "profile",       "o",      NULL },
+                                                             { "available",     "b",      NULL } };
+static pa_dbus_arg_info property_list_updated_args[]     = { { "property_list", "a{say}", NULL } };
 
 static pa_dbus_signal_info signals[SIGNAL_MAX] = {
-    [SIGNAL_ACTIVE_PROFILE_UPDATED] = { .name = "ActiveProfileUpdated", .arguments = active_profile_updated_args, .n_arguments = 1 },
-    [SIGNAL_NEW_PROFILE]            = { .name = "NewProfile",           .arguments = new_profile_args,            .n_arguments = 1 },
-    [SIGNAL_PROPERTY_LIST_UPDATED]  = { .name = "PropertyListUpdated",  .arguments = property_list_updated_args,  .n_arguments = 1 }
+    [SIGNAL_ACTIVE_PROFILE_UPDATED]     = { .name = "ActiveProfileUpdated",     .arguments = active_profile_updated_args,    .n_arguments = 1 },
+    [SIGNAL_NEW_PROFILE]                = { .name = "NewProfile",               .arguments = new_profile_args,               .n_arguments = 1 },
+    [SIGNAL_PROFILE_AVAILABLE_CHANGED]  = { .name = "ProfileAvailableChanged",  .arguments = profile_available_changed_args, .n_arguments = 2 },
+    [SIGNAL_PROPERTY_LIST_UPDATED]      = { .name = "PropertyListUpdated",      .arguments = property_list_updated_args,     .n_arguments = 1 }
 };
 
 static pa_dbus_interface_info card_interface_info = {
@@ -507,6 +512,37 @@ static pa_hook_result_t card_profile_added_cb(void *hook_data, void *call_data,
     return PA_HOOK_OK;
 }
 
+static pa_hook_result_t card_profile_available_changed_cb(void *hook_data, void *call_data, void *slot_data) {
+    pa_dbusiface_card *c = slot_data;
+    pa_card_profile *profile = call_data;
+    pa_dbusiface_card_profile *p;
+    const char *object_path;
+    dbus_bool_t available;
+    DBusMessage *signal_msg;
+
+    if (profile->card != c->card)
+        return PA_HOOK_OK;
+
+    pa_assert_se((p = pa_hashmap_get(c->profiles, profile->name)));
+
+    object_path = pa_dbusiface_card_profile_get_path(p);
+    available = profile->available != PA_AVAILABLE_NO;
+
+    pa_assert_se(signal_msg = dbus_message_new_signal(c->path,
+                                                      PA_DBUSIFACE_CARD_INTERFACE,
+                                                      signals[SIGNAL_PROFILE_AVAILABLE_CHANGED].name));
+    pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_OBJECT_PATH, &object_path,
+                                                      DBUS_TYPE_BOOLEAN, &available,
+                                                      DBUS_TYPE_INVALID));
+
+    pa_dbus_protocol_send_signal(c->dbus_protocol, signal_msg);
+    dbus_message_unref(signal_msg);
+
+    check_card_proplist(c);
+
+    return PA_HOOK_OK;
+}
+
 pa_dbusiface_card *pa_dbusiface_card_new(pa_dbusiface_core *core, pa_card *card) {
     pa_dbusiface_card *c = NULL;
     pa_card_profile *profile;
@@ -537,6 +573,8 @@ pa_dbusiface_card *pa_dbusiface_card_new(pa_dbusiface_core *core, pa_card *card)
                                                    card_profile_changed_cb, c);
     c->card_profile_added_slot = pa_hook_connect(&card->core->hooks[PA_CORE_HOOK_CARD_PROFILE_ADDED], PA_HOOK_NORMAL,
                                                  card_profile_added_cb, c);
+    c->card_profile_available_slot = pa_hook_connect(&card->core->hooks[PA_CORE_HOOK_CARD_PROFILE_AVAILABLE_CHANGED], PA_HOOK_NORMAL,
+                                                     card_profile_available_changed_cb, c);
 
     return c;
 }
@@ -548,6 +586,7 @@ void pa_dbusiface_card_free(pa_dbusiface_card *c) {
 
     pa_hook_slot_free(c->card_profile_added_slot);
     pa_hook_slot_free(c->card_profile_changed_slot);
+    pa_hook_slot_free(c->card_profile_available_slot);
 
     pa_hashmap_free(c->profiles);
     pa_proplist_free(c->proplist);
diff --git a/src/modules/dbus/iface-core.c b/src/modules/dbus/iface-core.c
index d29c70a..88e9030 100644
--- a/src/modules/dbus/iface-core.c
+++ b/src/modules/dbus/iface-core.c
@@ -1442,7 +1442,7 @@ static bool contains_space(const char *string) {
     pa_assert(string);
 
     for (p = string; *p; ++p) {
-        if (isspace(*p))
+        if (isspace((unsigned char)*p))
             return true;
     }
 
@@ -1504,7 +1504,7 @@ static void handle_load_module(DBusConnection *conn, DBusMessage *msg, void *use
         dbus_message_iter_next(&dict_iter);
     }
 
-    arg_string = pa_strbuf_tostring(arg_buffer);
+    arg_string = pa_strbuf_to_string(arg_buffer);
 
     if (!(module = pa_module_load(c->core, name, arg_string))) {
         pa_dbus_send_error(conn, msg, DBUS_ERROR_FAILED, "Failed to load module.");
diff --git a/src/modules/dbus/iface-device-port.c b/src/modules/dbus/iface-device-port.c
index 1b26756..4892443 100644
--- a/src/modules/dbus/iface-device-port.c
+++ b/src/modules/dbus/iface-device-port.c
@@ -34,6 +34,7 @@ static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userd
 static void handle_get_name(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_description(DBusConnection *conn, DBusMessage *msg, void *userdata);
 static void handle_get_priority(DBusConnection *conn, DBusMessage *msg, void *userdata);
+static void handle_get_available(DBusConnection *conn, DBusMessage *msg, void *userdata);
 
 static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata);
 
@@ -41,6 +42,9 @@ struct pa_dbusiface_device_port {
     uint32_t index;
     pa_device_port *port;
     char *path;
+
+    pa_hook_slot *available_changed_slot;
+
     pa_dbus_protocol *dbus_protocol;
 };
 
@@ -49,6 +53,7 @@ enum property_handler_index {
     PROPERTY_HANDLER_NAME,
     PROPERTY_HANDLER_DESCRIPTION,
     PROPERTY_HANDLER_PRIORITY,
+    PROPERTY_HANDLER_AVAILABLE,
     PROPERTY_HANDLER_MAX
 };
 
@@ -57,6 +62,18 @@ static pa_dbus_property_handler property_handlers[PROPERTY_HANDLER_MAX] = {
     [PROPERTY_HANDLER_NAME]        = { .property_name = "Name",        .type = "s", .get_cb = handle_get_name,        .set_cb = NULL },
     [PROPERTY_HANDLER_DESCRIPTION] = { .property_name = "Description", .type = "s", .get_cb = handle_get_description, .set_cb = NULL },
     [PROPERTY_HANDLER_PRIORITY]    = { .property_name = "Priority",    .type = "u", .get_cb = handle_get_priority,    .set_cb = NULL },
+    [PROPERTY_HANDLER_AVAILABLE]   = { .property_name = "Available",   .type = "u", .get_cb = handle_get_available,   .set_cb = NULL }
+};
+
+enum signal_index {
+    SIGNAL_AVAILABLE_CHANGED,
+    SIGNAL_MAX
+};
+
+static pa_dbus_arg_info available_changed_args[] = { { "available", "u", NULL } };
+
+static pa_dbus_signal_info signals[SIGNAL_MAX] = {
+    [SIGNAL_AVAILABLE_CHANGED] = { .name = "AvailableChanged", .arguments = available_changed_args, .n_arguments = 1 }
 };
 
 static pa_dbus_interface_info port_interface_info = {
@@ -66,8 +83,8 @@ static pa_dbus_interface_info port_interface_info = {
     .property_handlers = property_handlers,
     .n_property_handlers = PROPERTY_HANDLER_MAX,
     .get_all_properties_cb = handle_get_all,
-    .signals = NULL,
-    .n_signals = 0
+    .signals = signals,
+    .n_signals = SIGNAL_MAX
 };
 
 static void handle_get_index(DBusConnection *conn, DBusMessage *msg, void *userdata) {
@@ -113,6 +130,20 @@ static void handle_get_priority(DBusConnection *conn, DBusMessage *msg, void *us
     pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &priority);
 }
 
+static void handle_get_available(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_dbusiface_device_port *p = userdata;
+    dbus_uint32_t available = 0;
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(p);
+
+    available = p->port->available;
+
+    pa_dbus_send_basic_variant_reply(conn, msg, DBUS_TYPE_UINT32, &available);
+}
+
+
 static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdata) {
     pa_dbusiface_device_port *p = userdata;
     DBusMessage *reply = NULL;
@@ -135,6 +166,7 @@ static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdat
     pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_NAME].property_name, DBUS_TYPE_STRING, &p->port->name);
     pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_DESCRIPTION].property_name, DBUS_TYPE_STRING, &p->port->description);
     pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_PRIORITY].property_name, DBUS_TYPE_UINT32, &priority);
+    pa_dbus_append_basic_variant_dict_entry(&dict_iter, property_handlers[PROPERTY_HANDLER_AVAILABLE].property_name, DBUS_TYPE_UINT32, &p->port->available);
 
     pa_assert_se(dbus_message_iter_close_container(&msg_iter, &dict_iter));
 
@@ -142,6 +174,32 @@ static void handle_get_all(DBusConnection *conn, DBusMessage *msg, void *userdat
     dbus_message_unref(reply);
 }
 
+static pa_hook_result_t available_changed_cb(void *hook_data, void *call_data, void *slot_data) {
+    pa_dbusiface_device_port *p = slot_data;
+    pa_device_port *port = call_data;
+    DBusMessage *signal_msg;
+    uint32_t available;
+
+    pa_assert(p);
+    pa_assert(port);
+
+    if(p->port != port)
+        return PA_HOOK_OK;
+
+    available = port->available;
+
+    pa_assert_se(signal_msg = dbus_message_new_signal(p->path,
+                                                      PA_DBUSIFACE_DEVICE_PORT_INTERFACE,
+                                                      signals[SIGNAL_AVAILABLE_CHANGED].name));
+    pa_assert_se(dbus_message_append_args(signal_msg, DBUS_TYPE_UINT32, &available, DBUS_TYPE_INVALID));
+
+    pa_dbus_protocol_send_signal(p->dbus_protocol, signal_msg);
+    dbus_message_unref(signal_msg);
+
+    return PA_HOOK_OK;
+}
+
+
 pa_dbusiface_device_port *pa_dbusiface_device_port_new(
         pa_dbusiface_device *device,
         pa_core *core,
@@ -158,6 +216,8 @@ pa_dbusiface_device_port *pa_dbusiface_device_port_new(
     p->port = port;
     p->path = pa_sprintf_malloc("%s/%s%u", pa_dbusiface_device_get_path(device), OBJECT_NAME, idx);
     p->dbus_protocol = pa_dbus_protocol_get(core);
+    p->available_changed_slot = pa_hook_connect(&port->core->hooks[PA_CORE_HOOK_PORT_AVAILABLE_CHANGED],
+                                                PA_HOOK_NORMAL, available_changed_cb, p);
 
     pa_assert_se(pa_dbus_protocol_add_interface(p->dbus_protocol, p->path, &port_interface_info, p) >= 0);
 
@@ -169,6 +229,7 @@ void pa_dbusiface_device_port_free(pa_dbusiface_device_port *p) {
 
     pa_assert_se(pa_dbus_protocol_remove_interface(p->dbus_protocol, p->path, port_interface_info.name) >= 0);
 
+    pa_hook_slot_free(p->available_changed_slot);
     pa_dbus_protocol_unref(p->dbus_protocol);
 
     pa_xfree(p->path);
diff --git a/src/modules/echo-cancel/module-echo-cancel.c b/src/modules/echo-cancel/module-echo-cancel.c
index b0b98db..18fe5dc 100644
--- a/src/modules/echo-cancel/module-echo-cancel.c
+++ b/src/modules/echo-cancel/module-echo-cancel.c
@@ -791,7 +791,7 @@ static void do_push_drift_comp(struct userdata *u) {
 
 /* This one's simpler than the drift compensation case -- we just iterate over
  * the capture buffer, and pass the canceller blocksize bytes of playback and
- * capture data.
+ * capture data. If playback is currently inactive, we just push silence.
  *
  * Called from source I/O thread context. */
 static void do_push(struct userdata *u) {
@@ -877,12 +877,6 @@ static void source_output_push_cb(pa_source_output *o, const pa_memchunk *chunk)
         return;
     }
 
-    if (PA_UNLIKELY(u->source->thread_info.state != PA_SOURCE_RUNNING ||
-                    u->sink->thread_info.state != PA_SINK_RUNNING)) {
-        pa_source_post(u->source, chunk);
-        return;
-    }
-
     /* handle queued messages, do any message sending of our own */
     while (pa_asyncmsgq_process_one(u->asyncmsgq) > 0)
         ;
@@ -939,8 +933,8 @@ static void source_output_push_cb(pa_source_output *o, const pa_memchunk *chunk)
         u->sink_skip -= to_skip;
     }
 
-    /* process and push out samples */
-    if (u->ec->params.drift_compensation)
+    /* process and push out samples, do drift compensation only if the sink is actually running */
+    if (u->ec->params.drift_compensation && u->sink->thread_info.state == PA_SINK_RUNNING)
         do_push_drift_comp(u);
     else
         do_push(u);
@@ -1558,17 +1552,23 @@ static int canceller_process_msg_cb(pa_msgobject *o, int code, void *userdata, i
 
 /* Called by the canceller, so source I/O thread context. */
 void pa_echo_canceller_get_capture_volume(pa_echo_canceller *ec, pa_cvolume *v) {
+#ifndef ECHO_CANCEL_TEST
     *v = ec->msg->userdata->thread_info.current_volume;
+#else
+    pa_cvolume_set(v, 1, PA_VOLUME_NORM);
+#endif
 }
 
 /* Called by the canceller, so source I/O thread context. */
 void pa_echo_canceller_set_capture_volume(pa_echo_canceller *ec, pa_cvolume *v) {
+#ifndef ECHO_CANCEL_TEST
     if (!pa_cvolume_equal(&ec->msg->userdata->thread_info.current_volume, v)) {
         pa_cvolume *vol = pa_xnewdup(pa_cvolume, v, 1);
 
         pa_asyncmsgq_post(pa_thread_mq_get()->outq, PA_MSGOBJECT(ec->msg), ECHO_CANCELLER_MESSAGE_SET_VOLUME, vol, 0, NULL,
                 pa_xfree);
     }
+#endif
 }
 
 uint32_t pa_echo_canceller_blocksize_power2(unsigned rate, unsigned ms) {
diff --git a/src/modules/macosx/module-coreaudio-device.c b/src/modules/macosx/module-coreaudio-device.c
index cb62661..cbf1f27 100644
--- a/src/modules/macosx/module-coreaudio-device.c
+++ b/src/modules/macosx/module-coreaudio-device.c
@@ -411,7 +411,7 @@ static int ca_device_create_sink(pa_module *m, AudioBuffer *buf, int channel_idx
         pa_strbuf_puts(strbuf, tmp);
     }
 
-    ca_sink->name = pa_strbuf_tostring_free(strbuf);
+    ca_sink->name = pa_strbuf_to_string_free(strbuf);
 
     pa_log_debug("Stream name is >%s<", ca_sink->name);
 
@@ -529,7 +529,7 @@ static int ca_device_create_source(pa_module *m, AudioBuffer *buf, int channel_i
         pa_strbuf_puts(strbuf, tmp);
     }
 
-    ca_source->name = pa_strbuf_tostring_free(strbuf);
+    ca_source->name = pa_strbuf_to_string_free(strbuf);
 
     pa_log_debug("Stream name is >%s<", ca_source->name);
 
diff --git a/src/modules/module-always-sink.c b/src/modules/module-always-sink.c
index b5721bf..12f63f7 100644
--- a/src/modules/module-always-sink.c
+++ b/src/modules/module-always-sink.c
@@ -47,7 +47,6 @@ static const char* const valid_modargs[] = {
 };
 
 struct userdata {
-    pa_hook_slot *put_slot, *unlink_slot;
     uint32_t null_module;
     bool ignore;
     char *sink_name;
@@ -162,8 +161,8 @@ int pa__init(pa_module*m) {
 
     m->userdata = u = pa_xnew(struct userdata, 1);
     u->sink_name = pa_xstrdup(pa_modargs_get_value(ma, "sink_name", DEFAULT_SINK_NAME));
-    u->put_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_PUT], PA_HOOK_LATE, (pa_hook_cb_t) put_hook_callback, u);
-    u->unlink_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_UNLINK], PA_HOOK_EARLY, (pa_hook_cb_t) unlink_hook_callback, u);
+    pa_module_hook_connect(m, &m->core->hooks[PA_CORE_HOOK_SINK_PUT], PA_HOOK_LATE, (pa_hook_cb_t) put_hook_callback, u);
+    pa_module_hook_connect(m, &m->core->hooks[PA_CORE_HOOK_SINK_UNLINK], PA_HOOK_EARLY, (pa_hook_cb_t) unlink_hook_callback, u);
     u->null_module = PA_INVALID_INDEX;
     u->ignore = false;
 
@@ -182,10 +181,6 @@ void pa__done(pa_module*m) {
     if (!(u = m->userdata))
         return;
 
-    if (u->put_slot)
-        pa_hook_slot_free(u->put_slot);
-    if (u->unlink_slot)
-        pa_hook_slot_free(u->unlink_slot);
     if (u->null_module != PA_INVALID_INDEX && m->core->state != PA_CORE_SHUTDOWN)
         pa_module_unload_request_by_index(m->core, u->null_module, true);
 
diff --git a/src/modules/module-augment-properties.c b/src/modules/module-augment-properties.c
index 42b6fd9..541f0e7 100644
--- a/src/modules/module-augment-properties.c
+++ b/src/modules/module-augment-properties.c
@@ -204,7 +204,7 @@ static void update_rule(struct rule *r) {
     table[0].data = &r->application_name;
     table[1].data = &r->icon_name;
 
-    if (pa_config_parse(fn, NULL, table, NULL, r) < 0)
+    if (pa_config_parse(fn, NULL, table, NULL, false, r) < 0)
         pa_log_warn("Failed to parse .desktop file %s.", fn);
 
     pa_xfree(fn);
diff --git a/src/modules/module-card-restore.c b/src/modules/module-card-restore.c
index 3725d30..f906843 100644
--- a/src/modules/module-card-restore.c
+++ b/src/modules/module-card-restore.c
@@ -64,15 +64,15 @@ struct userdata {
     pa_database *database;
 };
 
-#define ENTRY_VERSION 2
+#define ENTRY_VERSION 3
 
 struct port_info {
     char *name;
     int64_t offset;
+    char *profile;
 };
 
 struct entry {
-    uint8_t version;
     char *profile;
     pa_hashmap *ports; /* Port name -> struct port_info */
 };
@@ -102,13 +102,13 @@ static void trigger_save(struct userdata *u) {
 static void port_info_free(struct port_info *p_info) {
     pa_assert(p_info);
 
+    pa_xfree(p_info->profile);
     pa_xfree(p_info->name);
     pa_xfree(p_info);
 }
 
 static struct entry* entry_new(void) {
     struct entry *r = pa_xnew0(struct entry, 1);
-    r->version = ENTRY_VERSION;
     r->ports = pa_hashmap_new_full(pa_idxset_string_hash_func, pa_idxset_string_compare_func, NULL, (pa_free_cb_t) port_info_free);
     return r;
 }
@@ -117,9 +117,11 @@ static struct port_info *port_info_new(pa_device_port *port) {
     struct port_info *p_info;
 
     if (port) {
-        p_info = pa_xnew(struct port_info, 1);
+        p_info = pa_xnew0(struct port_info, 1);
         p_info->name = pa_xstrdup(port->name);
         p_info->offset = port->latency_offset;
+        if (port->preferred_profile)
+            p_info->profile = pa_xstrdup(port->preferred_profile);
     } else
         p_info = pa_xnew0(struct port_info, 1);
 
@@ -189,13 +191,14 @@ static bool entry_write(struct userdata *u, const char *name, const struct entry
     pa_assert(e);
 
     t = pa_tagstruct_new();
-    pa_tagstruct_putu8(t, e->version);
+    pa_tagstruct_putu8(t, ENTRY_VERSION);
     pa_tagstruct_puts(t, e->profile);
     pa_tagstruct_putu32(t, pa_hashmap_size(e->ports));
 
     PA_HASHMAP_FOREACH(p_info, e->ports, state) {
         pa_tagstruct_puts(t, p_info->name);
         pa_tagstruct_puts64(t, p_info->offset);
+        pa_tagstruct_puts(t, p_info->profile);
     }
 
     key.data = (char *) name;
@@ -252,6 +255,7 @@ static struct entry* entry_read(struct userdata *u, const char *name) {
     struct entry *e = NULL;
     pa_tagstruct *t = NULL;
     const char* profile;
+    uint8_t version;
 
     pa_assert(u);
     pa_assert(name);
@@ -269,8 +273,8 @@ static struct entry* entry_read(struct userdata *u, const char *name) {
     t = pa_tagstruct_new_fixed(data.data, data.size);
     e = entry_new();
 
-    if (pa_tagstruct_getu8(t, &e->version) < 0 ||
-        e->version > ENTRY_VERSION ||
+    if (pa_tagstruct_getu8(t, &version) < 0 ||
+        version > ENTRY_VERSION ||
         pa_tagstruct_gets(t, &profile) < 0) {
 
         goto fail;
@@ -281,9 +285,9 @@ static struct entry* entry_read(struct userdata *u, const char *name) {
 
     e->profile = pa_xstrdup(profile);
 
-    if (e->version >= 2) {
+    if (version >= 2) {
         uint32_t port_count = 0;
-        const char *port_name = NULL;
+        const char *port_name = NULL, *profile_name = NULL;
         int64_t port_offset = 0;
         struct port_info *p_info;
         unsigned i;
@@ -297,10 +301,14 @@ static struct entry* entry_read(struct userdata *u, const char *name) {
                 pa_hashmap_get(e->ports, port_name) ||
                 pa_tagstruct_gets64(t, &port_offset) < 0)
                 goto fail;
+            if (version >= 3 && pa_tagstruct_gets(t, &profile_name) < 0)
+                goto fail;
 
             p_info = port_info_new(NULL);
             p_info->name = pa_xstrdup(port_name);
             p_info->offset = port_offset;
+            if (profile_name)
+                p_info->profile = pa_xstrdup(profile_name);
 
             pa_assert_se(pa_hashmap_put(e->ports, p_info->name, p_info) >= 0);
         }
@@ -375,8 +383,29 @@ finish:
     return PA_HOOK_OK;
 }
 
+static void update_profile_for_port(struct entry *entry, pa_card *card, pa_device_port *p) {
+    struct port_info *p_info;
+
+    if (p == NULL)
+        return;
+
+    if (!(p_info = pa_hashmap_get(entry->ports, p->name))) {
+        p_info = port_info_new(p);
+        pa_assert_se(pa_hashmap_put(entry->ports, p_info->name, p_info) >= 0);
+    }
+
+    if (!pa_safe_streq(p_info->profile, p->preferred_profile)) {
+        pa_xfree(p_info->profile);
+        p_info->profile = pa_xstrdup(p->preferred_profile);
+        pa_log_info("Storing profile %s for port %s on card %s.", p_info->profile, p->name, card->name);
+    }
+}
+
 static pa_hook_result_t card_profile_changed_callback(pa_core *c, pa_card *card, struct userdata *u) {
     struct entry *entry;
+    pa_sink *sink;
+    pa_source *source;
+    uint32_t state;
 
     pa_assert(card);
 
@@ -392,6 +421,11 @@ static pa_hook_result_t card_profile_changed_callback(pa_core *c, pa_card *card,
         show_full_info(card);
     }
 
+    PA_IDXSET_FOREACH(sink, card->sinks, state)
+        update_profile_for_port(entry, card, sink->active_port);
+    PA_IDXSET_FOREACH(source, card->sources, state)
+        update_profile_for_port(entry, card, source->active_port);
+
     if (entry_write(u, card->name, entry))
         trigger_save(u);
 
@@ -508,9 +542,11 @@ static pa_hook_result_t card_new_hook_callback(pa_core *c, pa_card_new_data *new
     pa_log_info("Restoring port latency offsets for card %s.", new_data->name);
 
     PA_HASHMAP_FOREACH(p_info, e->ports, state)
-        if ((p = pa_hashmap_get(new_data->ports, p_info->name)))
+        if ((p = pa_hashmap_get(new_data->ports, p_info->name))) {
             p->latency_offset = p_info->offset;
-
+            if (!p->preferred_profile && p_info->profile)
+                pa_device_port_set_preferred_profile(p, p_info->profile);
+        }
     entry_free(e);
 
     return PA_HOOK_OK;
diff --git a/src/modules/module-loopback.c b/src/modules/module-loopback.c
index 0af3937..37bf7b1 100644
--- a/src/modules/module-loopback.c
+++ b/src/modules/module-loopback.c
@@ -799,6 +799,11 @@ int pa__init(pa_module *m) {
         goto fail;
     }
 
+    if (ss.rate < 4000 || ss.rate > PA_RATE_MAX) {
+        pa_log("Invalid rate specification, valid range is 4000 Hz to %i Hz", PA_RATE_MAX);
+        goto fail;
+    }
+
     if (pa_modargs_get_value(ma, "format", NULL))
         format_set = true;
 
diff --git a/src/modules/module-rygel-media-server.c b/src/modules/module-rygel-media-server.c
index 0baf3c8..e2c2e6f 100644
--- a/src/modules/module-rygel-media-server.c
+++ b/src/modules/module-rygel-media-server.c
@@ -937,7 +937,7 @@ static DBusHandlerResult sinks_and_sources_handler(DBusConnection *c, DBusMessag
             }
 
             pa_strbuf_puts(sb, CONTAINER_INTROSPECT_XML_POSTFIX);
-            xml = pa_strbuf_tostring_free(sb);
+            xml = pa_strbuf_to_string_free(sb);
 
             pa_assert_se(r = dbus_message_new_method_return(m));
             pa_assert_se(dbus_message_append_args(r, DBUS_TYPE_STRING, &xml, DBUS_TYPE_INVALID));
diff --git a/src/modules/module-switch-on-port-available.c b/src/modules/module-switch-on-port-available.c
index eb8f2d7..5dd9786 100644
--- a/src/modules/module-switch-on-port-available.c
+++ b/src/modules/module-switch-on-port-available.c
@@ -23,6 +23,7 @@
 #endif
 
 #include <pulsecore/core.h>
+#include <pulsecore/core-util.h>
 #include <pulsecore/device-port.h>
 #include <pulsecore/hashmap.h>
 
@@ -34,6 +35,9 @@ static bool profile_good_for_output(pa_card_profile *profile) {
 
     pa_assert(profile);
 
+    if (!pa_safe_streq(profile->card->active_profile->input_name, profile->input_name))
+        return false;
+
     if (profile->card->active_profile->n_sources != profile->n_sources)
         return false;
 
@@ -55,6 +59,9 @@ static bool profile_good_for_output(pa_card_profile *profile) {
 static bool profile_good_for_input(pa_card_profile *profile) {
     pa_assert(profile);
 
+    if (!pa_safe_streq(profile->card->active_profile->output_name, profile->output_name))
+        return false;
+
     if (profile->card->active_profile->n_sinks != profile->n_sinks)
         return false;
 
@@ -67,22 +74,25 @@ static bool profile_good_for_input(pa_card_profile *profile) {
 static int try_to_switch_profile(pa_device_port *port) {
     pa_card_profile *best_profile = NULL, *profile;
     void *state;
+    unsigned best_prio = 0;
 
-    pa_log_debug("Finding best profile");
+    pa_log_debug("Finding best profile for port %s, preferred = %s",
+                 port->name, pa_strnull(port->preferred_profile));
 
     PA_HASHMAP_FOREACH(profile, port->profiles, state) {
         bool good = false;
-
-        if (best_profile && best_profile->priority >= profile->priority)
-            continue;
+        const char *name;
+        unsigned prio = profile->priority;
 
         /* We make a best effort to keep other direction unchanged */
         switch (port->direction) {
             case PA_DIRECTION_OUTPUT:
+                name = profile->output_name;
                 good = profile_good_for_output(profile);
                 break;
 
             case PA_DIRECTION_INPUT:
+                name = profile->input_name;
                 good = profile_good_for_input(profile);
                 break;
         }
@@ -90,7 +100,15 @@ static int try_to_switch_profile(pa_device_port *port) {
         if (!good)
             continue;
 
+        /* Give a high bonus in case this is the preferred profile */
+        if (port->preferred_profile && pa_streq(name ? name : profile->name, port->preferred_profile))
+            prio += 1000000;
+
+        if (best_profile && best_prio >= prio)
+            continue;
+
         best_profile = profile;
+        best_prio = prio;
     }
 
     if (!best_profile) {
@@ -106,98 +124,125 @@ static int try_to_switch_profile(pa_device_port *port) {
     return 0;
 }
 
-static void find_sink_and_source(pa_card *card, pa_device_port *port, pa_sink **si, pa_source **so) {
-    pa_sink *sink = NULL;
-    pa_source *source = NULL;
+struct port_pointers {
+    pa_device_port *port;
+    pa_sink *sink;
+    pa_source *source;
+    bool is_possible_profile_active;
+    bool is_preferred_profile_active;
+    bool is_port_active;
+};
+
+static const char* profile_name_for_dir(pa_card_profile *cp, pa_direction_t dir) {
+    if (dir == PA_DIRECTION_OUTPUT && cp->output_name)
+        return cp->output_name;
+    if (dir == PA_DIRECTION_INPUT && cp->input_name)
+        return cp->input_name;
+    return cp->name;
+}
+
+static struct port_pointers find_port_pointers(pa_device_port *port) {
+    struct port_pointers pp = { .port = port };
     uint32_t state;
+    pa_card *card;
+
+    pa_assert(port);
+    pa_assert_se(card = port->card);
 
     switch (port->direction) {
         case PA_DIRECTION_OUTPUT:
-            PA_IDXSET_FOREACH(sink, card->sinks, state)
-                if (port == pa_hashmap_get(sink->ports, port->name))
+            PA_IDXSET_FOREACH(pp.sink, card->sinks, state)
+                if (port == pa_hashmap_get(pp.sink->ports, port->name))
                     break;
             break;
 
         case PA_DIRECTION_INPUT:
-            PA_IDXSET_FOREACH(source, card->sources, state)
-                if (port == pa_hashmap_get(source->ports, port->name))
+            PA_IDXSET_FOREACH(pp.source, card->sources, state)
+                if (port == pa_hashmap_get(pp.source->ports, port->name))
                     break;
             break;
     }
 
-    *si = sink;
-    *so = source;
-}
+    pp.is_possible_profile_active =
+        card->active_profile == pa_hashmap_get(port->profiles, card->active_profile->name);
+    pp.is_preferred_profile_active = pp.is_possible_profile_active && (!port->preferred_profile ||
+        pa_safe_streq(port->preferred_profile, profile_name_for_dir(card->active_profile, port->direction)));
+    pp.is_port_active = (pp.sink && pp.sink->active_port == port) || (pp.source && pp.source->active_port == port);
 
-static pa_hook_result_t port_available_hook_callback(pa_core *c, pa_device_port *port, void* userdata) {
-    pa_card* card;
-    pa_sink *sink;
-    pa_source *source;
-    bool is_active_profile, is_active_port;
+    return pp;
+}
 
-    if (port->available == PA_AVAILABLE_UNKNOWN)
-        return PA_HOOK_OK;
+/* Switches to a port, switching profiles if necessary or preferred */
+static bool switch_to_port(pa_device_port *port) {
+    struct port_pointers pp = find_port_pointers(port);
 
-    card = port->card;
+    if (pp.is_port_active)
+        return true; /* Already selected */
 
-    if (!card) {
-        pa_log_warn("Port %s does not have a card", port->name);
-        return PA_HOOK_OK;
+    pa_log_debug("Trying to switch to port %s", port->name);
+    if (!pp.is_preferred_profile_active) {
+        if (try_to_switch_profile(port) < 0) {
+            if (pp.is_possible_profile_active)
+                return false;
+        }
+        else
+            /* Now that profile has changed, our sink and source pointers must be updated */
+            pp = find_port_pointers(port);
     }
 
-    if (pa_idxset_size(card->sinks) == 0 && pa_idxset_size(card->sources) == 0)
-        /* This card is not initialized yet. We'll handle it in
-           sink_new / source_new callbacks later. */
-        return PA_HOOK_OK;
-
-    find_sink_and_source(card, port, &sink, &source);
+    if (pp.source)
+        pa_source_set_port(pp.source, port->name, false);
+    if (pp.sink)
+        pa_sink_set_port(pp.sink, port->name, false);
+    return true;
+}
 
-    is_active_profile = card->active_profile == pa_hashmap_get(port->profiles, card->active_profile->name);
-    is_active_port = (sink && sink->active_port == port) || (source && source->active_port == port);
+/* Switches away from a port, switching profiles if necessary or preferred */
+static bool switch_from_port(pa_device_port *port) {
+    struct port_pointers pp = find_port_pointers(port);
+    pa_device_port *p, *best_port = NULL;
+    void *state;
 
-    if (port->available == PA_AVAILABLE_NO && !is_active_port)
-        return PA_HOOK_OK;
+    if (!pp.is_port_active)
+        return true; /* Already deselected */
 
-    if (port->available == PA_AVAILABLE_YES) {
-        if (is_active_port)
-            return PA_HOOK_OK;
+    /* Try to find a good enough port to switch to */
+    PA_HASHMAP_FOREACH(p, port->card->ports, state)
+        if (p->direction == port->direction && p != port && p->available != PA_AVAILABLE_NO &&
+           (!best_port || best_port->priority < p->priority))
+           best_port = p;
 
-        if (!is_active_profile) {
-            if (try_to_switch_profile(port) < 0)
-                return PA_HOOK_OK;
+    pa_log_debug("Trying to switch away from port %s, found %s", port->name, best_port ? best_port->name : "no better option");
 
-            pa_assert(card->active_profile == pa_hashmap_get(port->profiles, card->active_profile->name));
+    if (best_port)
+        return switch_to_port(best_port);
 
-            /* Now that profile has changed, our sink and source pointers must be updated */
-            find_sink_and_source(card, port, &sink, &source);
-        }
+    return false;
+}
 
-        if (source)
-            pa_source_set_port(source, port->name, false);
-        if (sink)
-            pa_sink_set_port(sink, port->name, false);
-    }
 
-    if (port->available == PA_AVAILABLE_NO) {
-        if (sink) {
-            pa_device_port *p2 = pa_device_port_find_best(sink->ports);
+static pa_hook_result_t port_available_hook_callback(pa_core *c, pa_device_port *port, void* userdata) {
+    pa_assert(port);
 
-            if (p2 && p2->available != PA_AVAILABLE_NO)
-                pa_sink_set_port(sink, p2->name, false);
-            else {
-                /* Maybe try to switch to another profile? */
-            }
-        }
+    if (!port->card) {
+        pa_log_warn("Port %s does not have a card", port->name);
+        return PA_HOOK_OK;
+    }
 
-        if (source) {
-            pa_device_port *p2 = pa_device_port_find_best(source->ports);
+    if (pa_idxset_size(port->card->sinks) == 0 && pa_idxset_size(port->card->sources) == 0)
+        /* This card is not initialized yet. We'll handle it in
+           sink_new / source_new callbacks later. */
+        return PA_HOOK_OK;
 
-            if (p2 && p2->available != PA_AVAILABLE_NO)
-                pa_source_set_port(source, p2->name, false);
-            else {
-                /* Maybe try to switch to another profile? */
-            }
-        }
+    switch (port->available) {
+    case PA_AVAILABLE_YES:
+        switch_to_port(port);
+        break;
+    case PA_AVAILABLE_NO:
+        switch_from_port(port);
+        break;
+    default:
+        break;
     }
 
     return PA_HOOK_OK;
diff --git a/src/modules/module-udev-detect.c b/src/modules/module-udev-detect.c
index df0d187..bb41a96 100644
--- a/src/modules/module-udev-detect.c
+++ b/src/modules/module-udev-detect.c
@@ -421,7 +421,7 @@ static void card_changed(struct userdata *u, struct udev_device *dev) {
     if (u->tsched_buffer_size_valid)
         pa_strbuf_printf(args_buf, " tsched_buffer_size=%" PRIu32, u->tsched_buffer_size);
 
-    d->args = pa_strbuf_tostring_free(args_buf);
+    d->args = pa_strbuf_to_string_free(args_buf);
 
     pa_hashmap_put(u->devices, d->path, d);
 
diff --git a/src/modules/module-zeroconf-publish.c b/src/modules/module-zeroconf-publish.c
index ac139e9..ceedfe0 100644
--- a/src/modules/module-zeroconf-publish.c
+++ b/src/modules/module-zeroconf-publish.c
@@ -643,7 +643,7 @@ static int avahi_process_msg(pa_msgobject *o, int code, void *data, int64_t offs
             break;
 
         case AVAHI_MESSAGE_SHUTDOWN_START:
-            pa_module_unload(u->core, u->module, true);
+            pa_module_unload(u->module, true);
             break;
 
         default:
diff --git a/src/modules/rtp/headerlist.c b/src/modules/rtp/headerlist.c
index 2ea7226..1fb0b41 100644
--- a/src/modules/rtp/headerlist.c
+++ b/src/modules/rtp/headerlist.c
@@ -159,7 +159,7 @@ char *pa_headerlist_to_string(pa_headerlist *p) {
             pa_strbuf_printf(buf, "%s: %s\r\n", key, v);
     }
 
-    return pa_strbuf_tostring_free(buf);
+    return pa_strbuf_to_string_free(buf);
 }
 
 int pa_headerlist_contains(pa_headerlist *p, const char *key) {
diff --git a/src/modules/rtp/rtsp_client.c b/src/modules/rtp/rtsp_client.c
index a279aee..bdfd24f 100644
--- a/src/modules/rtp/rtsp_client.c
+++ b/src/modules/rtp/rtsp_client.c
@@ -205,7 +205,7 @@ static void line_callback(pa_ioline *line, const char *s, void *userdata) {
         /* End of headers */
         /* We will have a header left from our looping iteration, so add it in :) */
         if (c->last_header) {
-            char *tmp = pa_strbuf_tostring_free(c->header_buffer);
+            char *tmp = pa_strbuf_to_string_free(c->header_buffer);
             /* This is not a continuation header so let's dump it into our proplist */
             pa_headerlist_puts(c->response_headers, c->last_header, tmp);
             pa_xfree(tmp);
@@ -233,7 +233,7 @@ static void line_callback(pa_ioline *line, const char *s, void *userdata) {
     }
 
     if (c->last_header) {
-        char *tmp = pa_strbuf_tostring_free(c->header_buffer);
+        char *tmp = pa_strbuf_to_string_free(c->header_buffer);
         /* This is not a continuation header so let's dump the full
           header/value into our proplist */
         pa_headerlist_puts(c->response_headers, c->last_header, tmp);
@@ -432,7 +432,7 @@ static int rtsp_exec(pa_rtsp_client* c, const char* cmd,
     }
 
     /* Our packet is created... now we can send it :) */
-    hdrs = pa_strbuf_tostring_free(buf);
+    hdrs = pa_strbuf_to_string_free(buf);
     /*pa_log_debug("Submitting request:");
     pa_log_debug(hdrs);*/
     pa_ioline_puts(c->ioline, hdrs);
diff --git a/src/modules/rtp/sdp.c b/src/modules/rtp/sdp.c
index f35d689..14953cf 100644
--- a/src/modules/rtp/sdp.c
+++ b/src/modules/rtp/sdp.c
@@ -213,15 +213,16 @@ pa_sdp_info *pa_sdp_parse(const char *t, pa_sdp_info *i, int is_goodbye) {
             if (i->payload <= 127) {
                 char c[64];
                 int _payload;
+                int len;
 
-                if (sscanf(t+9, "%i %64c", &_payload, c) == 2) {
-
+                if (sscanf(t + 9, "%i %n", &_payload, &len) == 1) {
                     if (_payload < 0 || _payload > 127) {
                         pa_log("Failed to parse SDP data: invalid payload %i.", _payload);
                         goto fail;
                     }
                     if (_payload == i->payload) {
-
+                        strncpy(c, t + 9 + len, 63);
+                        c[63] = 0;
                         c[strcspn(c, "\n")] = 0;
 
                         if (parse_sdp_sample_spec(&i->sample_spec, c))
diff --git a/src/modules/x11/module-x11-publish.c b/src/modules/x11/module-x11-publish.c
index 418c6c9..553b341 100644
--- a/src/modules/x11/module-x11-publish.c
+++ b/src/modules/x11/module-x11-publish.c
@@ -83,7 +83,7 @@ static void publish_servers(struct userdata *u, pa_strlist *l) {
         char *s;
 
         l = pa_strlist_reverse(l);
-        s = pa_strlist_tostring(l);
+        s = pa_strlist_to_string(l);
         pa_strlist_reverse(l);
 
         pa_x11_set_prop(pa_x11_wrapper_get_xcb_connection(u->x11_wrapper), screen, "PULSE_SERVER", s);
diff --git a/src/pulse/channelmap.c b/src/pulse/channelmap.c
index c342ef6..c44dca4 100644
--- a/src/pulse/channelmap.c
+++ b/src/pulse/channelmap.c
@@ -684,6 +684,19 @@ int pa_channel_map_can_fade(const pa_channel_map *map) {
         (PA_CHANNEL_POSITION_MASK_REAR & m);
 }
 
+int pa_channel_map_can_lfe_balance(const pa_channel_map *map) {
+    pa_channel_position_mask_t m;
+
+    pa_assert(map);
+    pa_return_val_if_fail(pa_channel_map_valid(map), 0);
+
+    m = pa_channel_map_mask(map);
+
+    return
+        (PA_CHANNEL_POSITION_MASK_LFE & m) &&
+        (PA_CHANNEL_POSITION_MASK_HFE & m);
+}
+
 const char* pa_channel_map_to_name(const pa_channel_map *map) {
     pa_bitset_t in_map[PA_BITSET_ELEMENTS(PA_CHANNEL_POSITION_MAX)];
     unsigned c;
diff --git a/src/pulse/channelmap.h b/src/pulse/channelmap.h
index 30904ef..6eabe20 100644
--- a/src/pulse/channelmap.h
+++ b/src/pulse/channelmap.h
@@ -338,6 +338,11 @@ int pa_channel_map_can_balance(const pa_channel_map *map) PA_GCC_PURE;
  * there are front/rear channels available. \since 0.9.15 */
 int pa_channel_map_can_fade(const pa_channel_map *map) PA_GCC_PURE;
 
+/** Returns non-zero if it makes sense to apply a volume 'lfe balance'
+ * (i.e.\ 'balance' between LFE and non-LFE channels) with this mapping,
+ *  i.e.\ if there are LFE and non-LFE channels available. \since 8.0 */
+int pa_channel_map_can_lfe_balance(const pa_channel_map *map) PA_GCC_PURE;
+
 /** Tries to find a well-known channel mapping name for this channel
  * mapping, i.e.\ "stereo", "surround-71" and so on. If the channel
  * mapping is unknown NULL will be returned. This name can be parsed
diff --git a/src/pulse/client-conf.c b/src/pulse/client-conf.c
index 47fe183..c23aa6b 100644
--- a/src/pulse/client-conf.c
+++ b/src/pulse/client-conf.c
@@ -149,7 +149,7 @@ void pa_client_conf_load(pa_client_conf *c, bool load_from_x11, bool load_from_e
 
     f = pa_open_config_file(DEFAULT_CLIENT_CONFIG_FILE, DEFAULT_CLIENT_CONFIG_FILE_USER, ENV_CLIENT_CONFIG_FILE, &fn);
     if (f) {
-        pa_config_parse(fn, f, table, NULL, NULL);
+        pa_config_parse(fn, f, table, NULL, true, NULL);
         pa_xfree(fn);
         fclose(f);
     }
diff --git a/src/pulse/context.c b/src/pulse/context.c
index 738ea84..4f084e8 100644
--- a/src/pulse/context.c
+++ b/src/pulse/context.c
@@ -364,7 +364,11 @@ static void handle_srbchannel_memblock(pa_context *c, pa_memblock *memblock) {
     pa_memblock_ref(memblock);
     sr = pa_srbchannel_new_from_template(c->mainloop, &c->srb_template);
     if (!sr) {
-        pa_context_fail(c, PA_ERR_PROTOCOL);
+        pa_log_warn("Failed to create srbchannel from template");
+        c->srb_template.readfd = -1;
+        c->srb_template.writefd = -1;
+        pa_memblock_unref(c->srb_template.memblock);
+        c->srb_template.memblock = NULL;
         return;
     }
 
diff --git a/src/pulse/proplist.c b/src/pulse/proplist.c
index 6111661..d8c6404 100644
--- a/src/pulse/proplist.c
+++ b/src/pulse/proplist.c
@@ -435,7 +435,7 @@ char *pa_proplist_to_string_sep(pa_proplist *p, const char *sep) {
         }
     }
 
-    return pa_strbuf_tostring_free(buf);
+    return pa_strbuf_to_string_free(buf);
 }
 
 char *pa_proplist_to_string(pa_proplist *p) {
@@ -480,7 +480,7 @@ pa_proplist *pa_proplist_from_string(const char *s) {
                     goto success;
                 else if (*p == '=')
                     goto fail;
-                else if (!isspace(*p)) {
+                else if (!isspace((unsigned char)*p)) {
                     key = p;
                     state = KEY;
                     key_len = 1;
@@ -492,7 +492,7 @@ pa_proplist *pa_proplist_from_string(const char *s) {
                     goto fail;
                 else if (*p == '=')
                     state = VALUE_START;
-                else if (isspace(*p))
+                else if (isspace((unsigned char)*p))
                     state = AFTER_KEY;
                 else
                     key_len++;
@@ -503,7 +503,7 @@ pa_proplist *pa_proplist_from_string(const char *s) {
                     goto fail;
                 else if (*p == '=')
                     state = VALUE_START;
-                else if (!isspace(*p))
+                else if (!isspace((unsigned char)*p))
                     goto fail;
                 break;
 
@@ -523,7 +523,7 @@ pa_proplist *pa_proplist_from_string(const char *s) {
                     state = VALUE_DOUBLE_QUOTES;
                     value = p+1;
                     value_len = 0;
-                } else if (!isspace(*p)) {
+                } else if (!isspace((unsigned char)*p)) {
                     state = VALUE_SIMPLE;
                     value = p;
                     value_len = 1;
@@ -531,7 +531,7 @@ pa_proplist *pa_proplist_from_string(const char *s) {
                 break;
 
             case VALUE_SIMPLE:
-                if (*p == 0 || isspace(*p)) {
+                if (*p == 0 || isspace((unsigned char)*p)) {
                     if (proplist_setn(pl, key, key_len, value, value_len) < 0)
                         goto fail;
 
@@ -610,7 +610,7 @@ pa_proplist *pa_proplist_from_string(const char *s) {
                     (*p >= 'A' && *p <= 'F') ||
                     (*p >= 'a' && *p <= 'f')) {
                     value_len++;
-                } else if (*p == 0 || isspace(*p)) {
+                } else if (*p == 0 || isspace((unsigned char)*p)) {
 
                     if (proplist_sethex(pl, key, key_len, value, value_len) < 0)
                         goto fail;
diff --git a/src/pulse/pulseaudio.h b/src/pulse/pulseaudio.h
index f5c5b0d..063d5e2 100644
--- a/src/pulse/pulseaudio.h
+++ b/src/pulse/pulseaudio.h
@@ -140,6 +140,15 @@
  *  - `PULSE_LOG_SYSLOG`: If defined, force all client libraries to log
  *     their output using the syslog(3) mechanism. Default behavior is to
  *     log all output to stderr.
+ *  - `PULSE_LOG_JOURNAL`: If defined, force all client libraries to log
+ *     their output using the systemd journal. If both `PULSE_LOG_JOURNAL`
+ *     and `PULSE_LOG_SYSLOG` are defined, logging to the systemd journal
+ *     takes a higher precedence. Each message originating library file name
+ *     and function are included by default through the journal fields
+ *     `CODE_FILE`, `CODE_FUNC`, and `CODE_LINE`. Any backtrace attached to
+ *     the logging message is sent through the PulseAudio-specific journal
+ *     field `PULSE_BACKTRACE`. This environment variable has no effect if
+ *     PulseAudio was compiled without systemd journal support.
  *  - `PULSE_LOG_COLORS`: If defined, enables colored logging output.
  *  - `PULSE_LOG_TIME`: If defined, include timestamps with each message.
  *  - `PULSE_LOG_FILE`: If defined, include each message originating file
diff --git a/src/pulse/thread-mainloop.c b/src/pulse/thread-mainloop.c
index afd0581..cbfc474 100644
--- a/src/pulse/thread-mainloop.c
+++ b/src/pulse/thread-mainloop.c
@@ -77,10 +77,22 @@ static void thread(void *userdata) {
 
 #ifndef OS_IS_WIN32
     sigset_t mask;
+    sigset_t prev_mask;
+    struct sigaction sa;
 
-    /* Make sure that signals are delivered to the main thread */
     sigfillset(&mask);
-    pthread_sigmask(SIG_BLOCK, &mask, NULL);
+
+    /* If SIGSYS is currently unblocked and trapped then keep it unblocked. */
+    if (!pthread_sigmask(SIG_SETMASK, NULL, &prev_mask) &&
+        !sigismember(&prev_mask, SIGSYS) &&
+        !sigaction(SIGSYS, NULL, &sa)
+        && sa.sa_handler != SIG_DFL) {
+        sigdelset(&mask, SIGSYS);
+    }
+
+    /* Make sure that signals are delivered to the main thread.
+     * Use SIG_SETMASK because SIG_BLOCK does an union with current set.*/
+    pthread_sigmask(SIG_SETMASK, &mask, NULL);
 #endif
 
     pa_mutex_lock(m->mutex);
diff --git a/src/pulse/version.h b/src/pulse/version.h
index c815bd0..df83e6e 100644
--- a/src/pulse/version.h
+++ b/src/pulse/version.h
@@ -33,7 +33,7 @@ PA_C_DECL_BEGIN
 /** Return the version of the header files. Keep in mind that this is
 a macro and not a function, so it is impossible to get the pointer of
 it. */
-#define pa_get_headers_version() ("7.1.0")
+#define pa_get_headers_version() ("7.99.0")
 
 /** Return the version of the library the current application is
  * linked to. */
@@ -53,7 +53,7 @@ const char* pa_get_library_version(void);
 #define PA_MAJOR 7
 
 /** The minor version of PA. \since 0.9.15 */
-#define PA_MINOR 1
+#define PA_MINOR 99
 
 /** The micro version of PA (will always be 0 from v1.0 onwards). \since 0.9.15 */
 #define PA_MICRO 0
diff --git a/src/pulse/volume.c b/src/pulse/volume.c
index 69bef4f..1667b94 100644
--- a/src/pulse/volume.c
+++ b/src/pulse/volume.c
@@ -552,8 +552,12 @@ static bool on_center(pa_channel_position_t p) {
     return !!(PA_CHANNEL_POSITION_MASK(p) & PA_CHANNEL_POSITION_MASK_CENTER);
 }
 
+static bool on_hfe(pa_channel_position_t p) {
+    return !!(PA_CHANNEL_POSITION_MASK(p) & PA_CHANNEL_POSITION_MASK_HFE);
+}
+
 static bool on_lfe(pa_channel_position_t p) {
-    return p == PA_CHANNEL_POSITION_LFE;
+    return !!(PA_CHANNEL_POSITION_MASK(p) & PA_CHANNEL_POSITION_MASK_LFE);
 }
 
 static bool on_front(pa_channel_position_t p) {
@@ -635,7 +639,12 @@ int pa_cvolume_compatible_with_channel_map(const pa_cvolume *v, const pa_channel
     return v->channels == cm->channels;
 }
 
-static void get_avg_lr(const pa_channel_map *map, const pa_cvolume *v, pa_volume_t *l, pa_volume_t *r) {
+/*
+ * Returns the average volume of l and r, where l and r are two disjoint sets of channels
+ * (e g left and right, or front and rear).
+ */
+static void get_avg(const pa_channel_map *map, const pa_cvolume *v, pa_volume_t *l, pa_volume_t *r,
+                    bool (*on_l)(pa_channel_position_t), bool (*on_r)(pa_channel_position_t)) {
     int c;
     pa_volume_t left = 0, right = 0;
     unsigned n_left = 0, n_right = 0;
@@ -647,10 +656,10 @@ static void get_avg_lr(const pa_channel_map *map, const pa_cvolume *v, pa_volume
     pa_assert(r);
 
     for (c = 0; c < map->channels; c++) {
-        if (on_left(map->map[c])) {
+        if (on_l(map->map[c])) {
             left += v->values[c];
             n_left++;
-        } else if (on_right(map->map[c])) {
+        } else if (on_r(map->map[c])) {
             right += v->values[c];
             n_right++;
         }
@@ -678,7 +687,7 @@ float pa_cvolume_get_balance(const pa_cvolume *v, const pa_channel_map *map) {
     if (!pa_channel_map_can_balance(map))
         return 0.0f;
 
-    get_avg_lr(map, v, &left, &right);
+    get_avg(map, v, &left, &right, on_left, on_right);
 
     if (left == right)
         return 0.0f;
@@ -698,21 +707,13 @@ float pa_cvolume_get_balance(const pa_cvolume *v, const pa_channel_map *map) {
         return 1.0f - ((float) left / (float) right);
 }
 
-pa_cvolume* pa_cvolume_set_balance(pa_cvolume *v, const pa_channel_map *map, float new_balance) {
+static pa_cvolume* set_balance(pa_cvolume *v, const pa_channel_map *map, float new_balance,
+                               bool (*on_l)(pa_channel_position_t), bool (*on_r)(pa_channel_position_t)) {
+
     pa_volume_t left, nleft, right, nright, m;
     unsigned c;
 
-    pa_assert(map);
-    pa_assert(v);
-
-    pa_return_val_if_fail(pa_cvolume_compatible_with_channel_map(v, map), NULL);
-    pa_return_val_if_fail(new_balance >= -1.0f, NULL);
-    pa_return_val_if_fail(new_balance <= 1.0f, NULL);
-
-    if (!pa_channel_map_can_balance(map))
-        return v;
-
-    get_avg_lr(map, v, &left, &right);
+    get_avg(map, v, &left, &right, on_l, on_r);
 
     m = PA_MAX(left, right);
 
@@ -725,12 +726,12 @@ pa_cvolume* pa_cvolume_set_balance(pa_cvolume *v, const pa_channel_map *map, flo
     }
 
     for (c = 0; c < map->channels; c++) {
-        if (on_left(map->map[c])) {
+        if (on_l(map->map[c])) {
             if (left == 0)
                 v->values[c] = nleft;
             else
                 v->values[c] = (pa_volume_t) PA_CLAMP_VOLUME(((uint64_t) v->values[c] * (uint64_t) nleft) / (uint64_t) left);
-        } else if (on_right(map->map[c])) {
+        } else if (on_r(map->map[c])) {
             if (right == 0)
                 v->values[c] = nright;
             else
@@ -741,6 +742,21 @@ pa_cvolume* pa_cvolume_set_balance(pa_cvolume *v, const pa_channel_map *map, flo
     return v;
 }
 
+
+pa_cvolume* pa_cvolume_set_balance(pa_cvolume *v, const pa_channel_map *map, float new_balance) {
+    pa_assert(map);
+    pa_assert(v);
+
+    pa_return_val_if_fail(pa_cvolume_compatible_with_channel_map(v, map), NULL);
+    pa_return_val_if_fail(new_balance >= -1.0f, NULL);
+    pa_return_val_if_fail(new_balance <= 1.0f, NULL);
+
+    if (!pa_channel_map_can_balance(map))
+        return v;
+
+    return set_balance(v, map, new_balance, on_left, on_right);
+}
+
 pa_cvolume* pa_cvolume_scale(pa_cvolume *v, pa_volume_t max) {
     unsigned c;
     pa_volume_t t = 0;
@@ -785,40 +801,8 @@ pa_cvolume* pa_cvolume_scale_mask(pa_cvolume *v, pa_volume_t max, pa_channel_map
     return v;
 }
 
-static void get_avg_fr(const pa_channel_map *map, const pa_cvolume *v, pa_volume_t *f, pa_volume_t *r) {
-    int c;
-    pa_volume_t front = 0, rear = 0;
-    unsigned n_front = 0, n_rear = 0;
-
-    pa_assert(v);
-    pa_assert(map);
-    pa_assert(map->channels == v->channels);
-    pa_assert(f);
-    pa_assert(r);
-
-    for (c = 0; c < map->channels; c++) {
-        if (on_front(map->map[c])) {
-            front += v->values[c];
-            n_front++;
-        } else if (on_rear(map->map[c])) {
-            rear += v->values[c];
-            n_rear++;
-        }
-    }
-
-    if (n_front <= 0)
-        *f = PA_VOLUME_NORM;
-    else
-        *f = front / n_front;
-
-    if (n_rear <= 0)
-        *r = PA_VOLUME_NORM;
-    else
-        *r = rear / n_rear;
-}
-
 float pa_cvolume_get_fade(const pa_cvolume *v, const pa_channel_map *map) {
-    pa_volume_t front, rear;
+    pa_volume_t rear, front;
 
     pa_assert(v);
     pa_assert(map);
@@ -828,7 +812,7 @@ float pa_cvolume_get_fade(const pa_cvolume *v, const pa_channel_map *map) {
     if (!pa_channel_map_can_fade(map))
         return 0.0f;
 
-    get_avg_fr(map, v, &front, &rear);
+    get_avg(map, v, &rear, &front, on_rear, on_front);
 
     if (front == rear)
         return 0.0f;
@@ -840,9 +824,6 @@ float pa_cvolume_get_fade(const pa_cvolume *v, const pa_channel_map *map) {
 }
 
 pa_cvolume* pa_cvolume_set_fade(pa_cvolume *v, const pa_channel_map *map, float new_fade) {
-    pa_volume_t front, nfront, rear, nrear, m;
-    unsigned c;
-
     pa_assert(map);
     pa_assert(v);
 
@@ -853,33 +834,43 @@ pa_cvolume* pa_cvolume_set_fade(pa_cvolume *v, const pa_channel_map *map, float
     if (!pa_channel_map_can_fade(map))
         return v;
 
-    get_avg_fr(map, v, &front, &rear);
+    return set_balance(v, map, new_fade, on_rear, on_front);
+}
 
-    m = PA_MAX(front, rear);
+float pa_cvolume_get_lfe_balance(const pa_cvolume *v, const pa_channel_map *map) {
+    pa_volume_t hfe, lfe;
 
-    if (new_fade <= 0) {
-        nfront = (new_fade + 1.0f) * m;
-        nrear = m;
-    } else {
-        nrear = (1.0f - new_fade) * m;
-        nfront = m;
-    }
+    pa_assert(v);
+    pa_assert(map);
 
-    for (c = 0; c < map->channels; c++) {
-        if (on_front(map->map[c])) {
-            if (front == 0)
-                v->values[c] = nfront;
-            else
-                v->values[c] = (pa_volume_t) PA_CLAMP_VOLUME(((uint64_t) v->values[c] * (uint64_t) nfront) / (uint64_t) front);
-        } else if (on_rear(map->map[c])) {
-            if (rear == 0)
-                v->values[c] = nrear;
-            else
-                v->values[c] = (pa_volume_t) PA_CLAMP_VOLUME(((uint64_t) v->values[c] * (uint64_t) nrear) / (uint64_t) rear);
-        }
-    }
+    pa_return_val_if_fail(pa_cvolume_compatible_with_channel_map(v, map), 0.0f);
 
-    return v;
+    if (!pa_channel_map_can_lfe_balance(map))
+        return 0.0f;
+
+    get_avg(map, v, &hfe, &lfe, on_hfe, on_lfe);
+
+    if (hfe == lfe)
+        return 0.0f;
+
+    if (hfe > lfe)
+        return -1.0f + ((float) lfe / (float) hfe);
+    else
+        return 1.0f - ((float) hfe / (float) lfe);
+}
+
+pa_cvolume* pa_cvolume_set_lfe_balance(pa_cvolume *v, const pa_channel_map *map, float new_balance) {
+    pa_assert(map);
+    pa_assert(v);
+
+    pa_return_val_if_fail(pa_cvolume_compatible_with_channel_map(v, map), NULL);
+    pa_return_val_if_fail(new_balance >= -1.0f, NULL);
+    pa_return_val_if_fail(new_balance <= 1.0f, NULL);
+
+    if (!pa_channel_map_can_lfe_balance(map))
+        return v;
+
+    return set_balance(v, map, new_balance, on_hfe, on_lfe);
 }
 
 pa_cvolume* pa_cvolume_set_position(
diff --git a/src/pulse/volume.h b/src/pulse/volume.h
index ec777b2..8cf4fa4 100644
--- a/src/pulse/volume.h
+++ b/src/pulse/volume.h
@@ -372,6 +372,24 @@ float pa_cvolume_get_fade(const pa_cvolume *v, const pa_channel_map *map) PA_GCC
  * pa_channel_map_can_fade(). \since 0.9.15 */
 pa_cvolume* pa_cvolume_set_fade(pa_cvolume *v, const pa_channel_map *map, float new_fade);
 
+/** Calculate a 'lfe balance' value for the specified volume with
+ * the specified channel map. The return value will range from
+ * -1.0f (no lfe) to +1.0f (only lfe), where 0.0f is balanced.
+ * If no value is applicable to this channel map the return value
+ * will always be 0.0f. See pa_channel_map_can_lfe_balance(). \since 8.0 */
+float pa_cvolume_get_lfe_balance(const pa_cvolume *v, const pa_channel_map *map) PA_GCC_PURE;
+
+/** Adjust the 'lfe balance' value for the specified volume with
+ * the specified channel map. v will be modified in place and returned.
+ * The balance is a value between -1.0f (no lfe) and +1.0f (only lfe).
+ * This operation might not be reversible! Also, after this call
+ * pa_cvolume_get_lfe_balance() is not guaranteed to actually
+ * return the requested value (e.g. when the input volume was
+ * zero anyway for all channels). If no lfe balance value is applicable to
+ * this channel map the volume will not be modified. See
+ * pa_channel_map_can_lfe_balance(). \since 8.0 */
+pa_cvolume* pa_cvolume_set_lfe_balance(pa_cvolume *v, const pa_channel_map *map, float new_balance);
+
 /** Scale the passed pa_cvolume structure so that the maximum volume
  * of all channels equals max. The proportions between the channel
  * volumes are kept. \since 0.9.15 */
diff --git a/src/pulsecore/card.c b/src/pulsecore/card.c
index 6f9391e..b6cbbf7 100644
--- a/src/pulsecore/card.c
+++ b/src/pulsecore/card.c
@@ -41,14 +41,9 @@ pa_card_profile *pa_card_profile_new(const char *name, const char *description,
 
     pa_assert(name);
 
-    c = pa_xmalloc(PA_ALIGN(sizeof(pa_card_profile)) + extra);
-    c->card = NULL;
+    c = pa_xmalloc0(PA_ALIGN(sizeof(pa_card_profile)) + extra);
     c->name = pa_xstrdup(name);
     c->description = pa_xstrdup(description);
-
-    c->priority = 0;
-    c->n_sinks = c->n_sources = 0;
-    c->max_sink_channels = c->max_source_channels = 0;
     c->available = PA_AVAILABLE_UNKNOWN;
 
     return c;
@@ -57,6 +52,8 @@ pa_card_profile *pa_card_profile_new(const char *name, const char *description,
 void pa_card_profile_free(pa_card_profile *c) {
     pa_assert(c);
 
+    pa_xfree(c->input_name);
+    pa_xfree(c->output_name);
     pa_xfree(c->name);
     pa_xfree(c->description);
     pa_xfree(c);
@@ -135,7 +132,7 @@ pa_card *pa_card_new(pa_core *core, pa_card_new_data *data) {
     pa_assert(data->profiles);
     pa_assert(!pa_hashmap_isempty(data->profiles));
 
-    c = pa_xnew(pa_card, 1);
+    c = pa_xnew0(pa_card, 1);
 
     if (!(name = pa_namereg_register(core, data->name, PA_NAMEREG_CARD, c, data->namereg_fail))) {
         pa_xfree(c);
@@ -172,9 +169,6 @@ pa_card *pa_card_new(pa_core *core, pa_card_new_data *data) {
     PA_HASHMAP_FOREACH(port, c->ports, state)
         port->card = c;
 
-    c->active_profile = NULL;
-    c->save_profile = false;
-
     if (data->active_profile)
         if ((c->active_profile = pa_hashmap_get(c->profiles, data->active_profile)))
             c->save_profile = data->save_profile;
@@ -196,9 +190,6 @@ pa_card *pa_card_new(pa_core *core, pa_card_new_data *data) {
         pa_assert(c->active_profile);
     }
 
-    c->userdata = NULL;
-    c->set_profile = NULL;
-
     pa_device_init_description(c->proplist, c);
     pa_device_init_icon(c->proplist, true);
     pa_device_init_intended_roles(c->proplist);
@@ -259,6 +250,27 @@ void pa_card_add_profile(pa_card *c, pa_card_profile *profile) {
     pa_hook_fire(&c->core->hooks[PA_CORE_HOOK_CARD_PROFILE_ADDED], profile);
 }
 
+static const char* profile_name_for_dir(pa_card_profile *cp, pa_direction_t dir) {
+    if (dir == PA_DIRECTION_OUTPUT && cp->output_name)
+        return cp->output_name;
+    if (dir == PA_DIRECTION_INPUT && cp->input_name)
+        return cp->input_name;
+    return cp->name;
+}
+
+static void update_port_preferred_profile(pa_card *c) {
+    pa_sink *sink;
+    pa_source *source;
+    uint32_t state;
+
+    PA_IDXSET_FOREACH(sink, c->sinks, state)
+        if (sink->active_port)
+            pa_device_port_set_preferred_profile(sink->active_port, profile_name_for_dir(c->active_profile, PA_DIRECTION_OUTPUT));
+    PA_IDXSET_FOREACH(source, c->sources, state)
+        if (source->active_port)
+            pa_device_port_set_preferred_profile(source->active_port, profile_name_for_dir(c->active_profile, PA_DIRECTION_INPUT));
+}
+
 int pa_card_set_profile(pa_card *c, pa_card_profile *profile, bool save) {
     int r;
 
@@ -272,7 +284,10 @@ int pa_card_set_profile(pa_card *c, pa_card_profile *profile, bool save) {
     }
 
     if (c->active_profile == profile) {
-        c->save_profile = c->save_profile || save;
+        if (save && !c->save_profile) {
+            update_port_preferred_profile(c);
+            c->save_profile = true;
+        }
         return 0;
     }
 
@@ -286,6 +301,9 @@ int pa_card_set_profile(pa_card *c, pa_card_profile *profile, bool save) {
     c->active_profile = profile;
     c->save_profile = save;
 
+    if (save)
+        update_port_preferred_profile(c);
+
     pa_hook_fire(&c->core->hooks[PA_CORE_HOOK_CARD_PROFILE_CHANGED], c);
 
     return 0;
diff --git a/src/pulsecore/card.h b/src/pulsecore/card.h
index 3e2c004..30bfc0e 100644
--- a/src/pulsecore/card.h
+++ b/src/pulsecore/card.h
@@ -20,8 +20,7 @@
   along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
 ***/
 
-typedef struct pa_card pa_card;
-
+#include <pulsecore/typedefs.h>
 #include <pulse/proplist.h>
 #include <pulsecore/core.h>
 #include <pulsecore/module.h>
@@ -35,11 +34,19 @@ typedef enum pa_available {
     PA_AVAILABLE_YES = 2,
 } pa_available_t;
 
-typedef struct pa_card_profile {
+struct pa_card_profile {
     pa_card *card;
     char *name;
     char *description;
 
+    /* Identifiers for the profile's input and output parts, i e, if two different profiles
+       have the same input_name string, they have the same source(s).
+       Same for output_name and sink(s).
+       Can be NULL (and in case of an input- or output- only profile, the other direction
+       will be NULL). */
+    char *input_name;
+    char *output_name;
+
     unsigned priority;
     pa_available_t available; /* PA_AVAILABLE_UNKNOWN, PA_AVAILABLE_NO or PA_AVAILABLE_YES */
 
@@ -51,7 +58,7 @@ typedef struct pa_card_profile {
     unsigned max_source_channels;
 
     /* .. followed by some implementation specific data */
-} pa_card_profile;
+};
 
 #define PA_CARD_PROFILE_DATA(d) ((void*) ((uint8_t*) d + PA_ALIGN(sizeof(pa_card_profile))))
 
diff --git a/src/pulsecore/cli-text.c b/src/pulsecore/cli-text.c
index d296692..af79a1e 100644
--- a/src/pulsecore/cli-text.c
+++ b/src/pulsecore/cli-text.c
@@ -68,7 +68,7 @@ char *pa_module_list_to_string(pa_core *c) {
         pa_xfree(t);
     }
 
-    return pa_strbuf_tostring_free(s);
+    return pa_strbuf_to_string_free(s);
 }
 
 char *pa_client_list_to_string(pa_core *c) {
@@ -98,7 +98,7 @@ char *pa_client_list_to_string(pa_core *c) {
         pa_xfree(t);
     }
 
-    return pa_strbuf_tostring_free(s);
+    return pa_strbuf_to_string_free(s);
 }
 
 static const char *available_to_string(pa_available_t a) {
@@ -193,7 +193,7 @@ char *pa_card_list_to_string(pa_core *c) {
         append_port_list(s, card->ports);
     }
 
-    return pa_strbuf_tostring_free(s);
+    return pa_strbuf_to_string_free(s);
 }
 
 static const char *sink_state_to_string(pa_sink_state_t state) {
@@ -345,7 +345,7 @@ char *pa_sink_list_to_string(pa_core *c) {
                     sink->active_port->name);
     }
 
-    return pa_strbuf_tostring_free(s);
+    return pa_strbuf_to_string_free(s);
 }
 
 char *pa_source_list_to_string(pa_core *c) {
@@ -460,7 +460,7 @@ char *pa_source_list_to_string(pa_core *c) {
                     source->active_port->name);
     }
 
-    return pa_strbuf_tostring_free(s);
+    return pa_strbuf_to_string_free(s);
 }
 
 char *pa_source_output_list_to_string(pa_core *c) {
@@ -557,7 +557,7 @@ char *pa_source_output_list_to_string(pa_core *c) {
         pa_xfree(t);
     }
 
-    return pa_strbuf_tostring_free(s);
+    return pa_strbuf_to_string_free(s);
 }
 
 char *pa_sink_input_list_to_string(pa_core *c) {
@@ -653,7 +653,7 @@ char *pa_sink_input_list_to_string(pa_core *c) {
         pa_xfree(t);
     }
 
-    return pa_strbuf_tostring_free(s);
+    return pa_strbuf_to_string_free(s);
 }
 
 char *pa_scache_list_to_string(pa_core *c) {
@@ -712,7 +712,7 @@ char *pa_scache_list_to_string(pa_core *c) {
         }
     }
 
-    return pa_strbuf_tostring_free(s);
+    return pa_strbuf_to_string_free(s);
 }
 
 char *pa_full_status_string(pa_core *c) {
@@ -755,5 +755,5 @@ char *pa_full_status_string(pa_core *c) {
         pa_xfree(t);
     }
 
-    return pa_strbuf_tostring_free(s);
+    return pa_strbuf_to_string_free(s);
 }
diff --git a/src/pulsecore/cli.c b/src/pulsecore/cli.c
index d72642f..f942629 100644
--- a/src/pulsecore/cli.c
+++ b/src/pulsecore/cli.c
@@ -152,7 +152,7 @@ static void line_callback(pa_ioline *line, const char *s, void *userdata) {
     else
         pa_cli_command_execute_line(c->core, s, buf, &c->fail);
     c->defer_kill--;
-    pa_ioline_puts(line, p = pa_strbuf_tostring_free(buf));
+    pa_ioline_puts(line, p = pa_strbuf_to_string_free(buf));
     pa_xfree(p);
 
     if (c->kill_requested) {
diff --git a/src/pulsecore/client.c b/src/pulsecore/client.c
index 003bcf8..2e6af47 100644
--- a/src/pulsecore/client.c
+++ b/src/pulsecore/client.c
@@ -60,7 +60,7 @@ pa_client *pa_client_new(pa_core *core, pa_client_new_data *data) {
     if (pa_hook_fire(&core->hooks[PA_CORE_HOOK_CLIENT_NEW], data) < 0)
         return NULL;
 
-    c = pa_xnew(pa_client, 1);
+    c = pa_xnew0(pa_client, 1);
     c->core = core;
     c->proplist = pa_proplist_copy(data->proplist);
     c->driver = pa_xstrdup(pa_path_get_filename(data->driver));
@@ -69,10 +69,6 @@ pa_client *pa_client_new(pa_core *core, pa_client_new_data *data) {
     c->sink_inputs = pa_idxset_new(NULL, NULL);
     c->source_outputs = pa_idxset_new(NULL, NULL);
 
-    c->userdata = NULL;
-    c->kill = NULL;
-    c->send_event = NULL;
-
     pa_assert_se(pa_idxset_put(core->clients, c, &c->index) >= 0);
 
     pa_log_info("Created %u \"%s\"", c->index, pa_strnull(pa_proplist_gets(c->proplist, PA_PROP_APPLICATION_NAME)));
diff --git a/src/pulsecore/client.h b/src/pulsecore/client.h
index cd55348..eb8173d 100644
--- a/src/pulsecore/client.h
+++ b/src/pulsecore/client.h
@@ -22,8 +22,7 @@
 
 #include <inttypes.h>
 
-typedef struct pa_client pa_client;
-
+#include <pulsecore/typedefs.h>
 #include <pulse/proplist.h>
 #include <pulsecore/core.h>
 #include <pulsecore/module.h>
diff --git a/src/pulsecore/conf-parser.c b/src/pulsecore/conf-parser.c
index 2dcd45a..60345ad 100644
--- a/src/pulsecore/conf-parser.c
+++ b/src/pulsecore/conf-parser.c
@@ -21,6 +21,7 @@
 #include <config.h>
 #endif
 
+#include <dirent.h>
 #include <string.h>
 #include <stdio.h>
 #include <errno.h>
@@ -103,7 +104,7 @@ static int parse_line(pa_config_parser_state *state) {
             }
         }
 
-        r = pa_config_parse(fn, NULL, state->item_table, state->proplist, state->userdata);
+        r = pa_config_parse(fn, NULL, state->item_table, state->proplist, false, state->userdata);
         pa_xfree(path);
         return r;
     }
@@ -152,8 +153,13 @@ static int parse_line(pa_config_parser_state *state) {
         return normal_assignment(state);
 }
 
+static int conf_filter(const struct dirent *entry) {
+    return pa_endswith(entry->d_name, ".conf");
+}
+
 /* Go through the file and parse each line */
-int pa_config_parse(const char *filename, FILE *f, const pa_config_item *t, pa_proplist *proplist, void *userdata) {
+int pa_config_parse(const char *filename, FILE *f, const pa_config_item *t, pa_proplist *proplist, bool use_dot_d,
+                    void *userdata) {
     int r = -1;
     bool do_close = !f;
     pa_config_parser_state state;
@@ -211,6 +217,38 @@ finish:
     if (do_close && f)
         fclose(f);
 
+    if (use_dot_d) {
+        char *dir_name;
+        int n;
+        struct dirent **entries = NULL;
+
+        dir_name = pa_sprintf_malloc("%s.d", filename);
+
+        n = scandir(dir_name, &entries, conf_filter, alphasort);
+        if (n >= 0) {
+            int i;
+
+            for (i = 0; i < n; i++) {
+                char *filename2;
+
+                filename2 = pa_sprintf_malloc("%s" PA_PATH_SEP "%s", dir_name, entries[i]->d_name);
+                pa_config_parse(filename2, NULL, t, proplist, false, userdata);
+                pa_xfree(filename2);
+
+                free(entries[i]);
+            }
+
+            free(entries);
+        } else {
+            if (errno == ENOENT)
+                pa_log_debug("%s does not exist, ignoring.", dir_name);
+            else
+                pa_log_warn("scandir(\"%s\") failed: %s", dir_name, pa_cstrerror(errno));
+        }
+
+        pa_xfree(dir_name);
+    }
+
     return r;
 }
 
diff --git a/src/pulsecore/conf-parser.h b/src/pulsecore/conf-parser.h
index dbb6f5c..7dc0ff9 100644
--- a/src/pulsecore/conf-parser.h
+++ b/src/pulsecore/conf-parser.h
@@ -59,6 +59,11 @@ struct pa_config_parser_state {
  * pa_config_items in *t that is terminated by an item where lvalue is
  * NULL.
  *
+ * If use_dot_d is true, then after parsing the file named by the filename
+ * argument, the function will parse all files ending with ".conf" in
+ * alphabetical order from a directory whose name is filename + ".d", if such
+ * directory exists.
+ *
  * Some configuration files may contain a Properties section, which
  * is a bit special. Normally all accepted lvalues must be predefined
  * in the pa_config_item table, but in the Properties section the
@@ -68,7 +73,8 @@ struct pa_config_parser_state {
  * properties, and those properties will be merged into the given
  * proplist. If proplist is NULL, then sections named "Properties"
  * are not allowed at all in the configuration file. */
-int pa_config_parse(const char *filename, FILE *f, const pa_config_item *t, pa_proplist *proplist, void *userdata);
+int pa_config_parse(const char *filename, FILE *f, const pa_config_item *t, pa_proplist *proplist, bool use_dot_d,
+                    void *userdata);
 
 /* Generic parsers for integers, size_t, booleans and strings */
 int pa_config_parse_int(pa_config_parser_state *state);
diff --git a/src/pulsecore/core-rtclock.h b/src/pulsecore/core-rtclock.h
index 11bfcc9..89ad237 100644
--- a/src/pulsecore/core-rtclock.h
+++ b/src/pulsecore/core-rtclock.h
@@ -42,6 +42,8 @@ void pa_rtclock_hrtimer_enable(void);
 struct timeval* pa_rtclock_from_wallclock(struct timeval *tv);
 
 #ifdef HAVE_CLOCK_GETTIME
+struct timespec;
+
 pa_usec_t pa_timespec_load(const struct timespec *ts);
 struct timespec* pa_timespec_store(struct timespec *ts, pa_usec_t v);
 #endif
diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c
index ba31221..19c89a9 100644
--- a/src/pulsecore/core-util.c
+++ b/src/pulsecore/core-util.c
@@ -53,9 +53,13 @@
 #endif
 
 #ifdef HAVE_STRTOD_L
+#ifdef HAVE_LOCALE_H
 #include <locale.h>
+#endif
+#ifdef HAVE_XLOCALE_H
 #include <xlocale.h>
 #endif
+#endif
 
 #ifdef HAVE_SCHED_H
 #include <sched.h>
@@ -106,7 +110,6 @@
 #endif
 
 #ifdef __APPLE__
-#include <xlocale.h>
 #include <mach/mach_init.h>
 #include <mach/thread_act.h>
 #include <mach/thread_policy.h>
@@ -343,7 +346,7 @@ again:
 #endif
 
 #ifdef HAVE_FCHMOD
-    if (fchmod(fd, m) < 0) {
+    if ((st.st_mode & 07777) != m && fchmod(fd, m) < 0) {
         pa_assert_se(pa_close(fd) >= 0);
         goto fail;
     };
@@ -2329,7 +2332,7 @@ int pa_atou(const char *s, uint32_t *ret_u) {
     pa_assert(ret_u);
 
     /* strtoul() ignores leading spaces. We don't. */
-    if (isspace(*s)) {
+    if (isspace((unsigned char)*s)) {
         errno = EINVAL;
         return -1;
     }
@@ -2373,7 +2376,7 @@ int pa_atol(const char *s, long *ret_l) {
     pa_assert(ret_l);
 
     /* strtol() ignores leading spaces. We don't. */
-    if (isspace(*s)) {
+    if (isspace((unsigned char)*s)) {
         errno = EINVAL;
         return -1;
     }
@@ -2418,7 +2421,7 @@ int pa_atod(const char *s, double *ret_d) {
     pa_assert(ret_d);
 
     /* strtod() ignores leading spaces. We don't. */
-    if (isspace(*s)) {
+    if (isspace((unsigned char)*s)) {
         errno = EINVAL;
         return -1;
     }
@@ -3058,14 +3061,28 @@ char *pa_machine_id(void) {
     char *h;
 
     /* The returned value is supposed be some kind of ascii identifier
-     * that is unique and stable across reboots. */
-
-    /* First we try the /etc/machine-id, which is the best option we
-     * have, since it fits perfectly our needs and is not as volatile
-     * as the hostname which might be set from dhcp. */
-
+     * that is unique and stable across reboots. First we try if the machine-id
+     * file is available. If it's available, that's great, since it provides an
+     * identifier that suits our needs perfectly. If it's not, we fall back to
+     * the hostname, which is not as good, since it can change over time. */
+
+    /* We search for the machine-id file from four locations. The first two are
+     * relative to the configured installation prefix, but if we're installed
+     * under /usr/local, for example, it's likely that the machine-id won't be
+     * found there, so we also try the hardcoded paths.
+     *
+     * PA_MACHINE_ID or PA_MACHINE_ID_FALLBACK might exist on a Windows system,
+     * but the last two hardcoded paths certainly don't, hence we don't try
+     * them on Windows. */
     if ((f = pa_fopen_cloexec(PA_MACHINE_ID, "r")) ||
-        (f = pa_fopen_cloexec(PA_MACHINE_ID_FALLBACK, "r"))) {
+        (f = pa_fopen_cloexec(PA_MACHINE_ID_FALLBACK, "r")) ||
+#if !defined(OS_IS_WIN32)
+        (f = pa_fopen_cloexec("/etc/machine-id", "r")) ||
+        (f = pa_fopen_cloexec("/var/lib/dbus/machine-id", "r"))
+#else
+        false
+#endif
+        ) {
         char ln[34] = "", *r;
 
         r = fgets(ln, sizeof(ln)-1, f);
@@ -3193,7 +3210,7 @@ char *pa_replace(const char*s, const char*a, const char *b) {
 
     pa_strbuf_puts(sb, s);
 
-    return pa_strbuf_tostring_free(sb);
+    return pa_strbuf_to_string_free(sb);
 }
 
 char *pa_escape(const char *p, const char *chars) {
@@ -3215,7 +3232,7 @@ char *pa_escape(const char *p, const char *chars) {
         pa_strbuf_putc(buf, *s);
     }
 
-    return pa_strbuf_tostring_free(buf);
+    return pa_strbuf_to_string_free(buf);
 }
 
 char *pa_unescape(char *p) {
@@ -3492,6 +3509,8 @@ finish:
 int pa_accept_cloexec(int sockfd, struct sockaddr *addr, socklen_t *addrlen) {
     int fd;
 
+    errno = 0;
+
 #ifdef HAVE_ACCEPT4
     if ((fd = accept4(sockfd, addr, addrlen, SOCK_CLOEXEC)) >= 0)
         goto finish;
@@ -3501,6 +3520,11 @@ int pa_accept_cloexec(int sockfd, struct sockaddr *addr, socklen_t *addrlen) {
 
 #endif
 
+#ifdef HAVE_PACCEPT
+    if ((fd = paccept(sockfd, addr, addrlen, NULL, SOCK_CLOEXEC)) >= 0)
+        goto finish;
+#endif
+
     if ((fd = accept(sockfd, addr, addrlen)) >= 0)
         goto finish;
 
diff --git a/src/pulsecore/core.c b/src/pulsecore/core.c
index 0e63bac..43fd30e 100644
--- a/src/pulsecore/core.c
+++ b/src/pulsecore/core.c
@@ -51,7 +51,7 @@ static int core_process_msg(pa_msgobject *o, int code, void *userdata, int64_t o
     switch (code) {
 
         case PA_CORE_MESSAGE_UNLOAD_MODULE:
-            pa_module_unload(c, userdata, true);
+            pa_module_unload(userdata, true);
             return 0;
 
         default:
diff --git a/src/pulsecore/core.h b/src/pulsecore/core.h
index 6a8affc..aefc1eb 100644
--- a/src/pulsecore/core.h
+++ b/src/pulsecore/core.h
@@ -20,12 +20,11 @@
   along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
 ***/
 
+#include <pulsecore/typedefs.h>
 #include <pulse/mainloop-api.h>
 #include <pulse/sample.h>
 #include <pulsecore/cpu.h>
 
-typedef struct pa_core pa_core;
-
 /* This is a bitmask that encodes the cause why a sink/source is
  * suspended. */
 typedef enum pa_suspend_cause {
diff --git a/src/pulsecore/device-port.c b/src/pulsecore/device-port.c
index 906ab1f..5807d3e 100644
--- a/src/pulsecore/device-port.c
+++ b/src/pulsecore/device-port.c
@@ -21,6 +21,7 @@
 
 #include "device-port.h"
 #include <pulsecore/card.h>
+#include <pulsecore/core-util.h>
 
 PA_DEFINE_PUBLIC_CLASS(pa_device_port, pa_object);
 
@@ -65,6 +66,15 @@ void pa_device_port_new_data_done(pa_device_port_new_data *data) {
     pa_xfree(data->description);
 }
 
+void pa_device_port_set_preferred_profile(pa_device_port *p, const char *new_pp) {
+    pa_assert(p);
+
+    if (!pa_safe_streq(p->preferred_profile, new_pp)) {
+        pa_xfree(p->preferred_profile);
+        p->preferred_profile = pa_xstrdup(new_pp);
+    }
+}
+
 void pa_device_port_set_available(pa_device_port *p, pa_available_t status) {
     pa_assert(p);
 
@@ -100,6 +110,7 @@ static void device_port_free(pa_object *o) {
     if (p->profiles)
         pa_hashmap_free(p->profiles);
 
+    pa_xfree(p->preferred_profile);
     pa_xfree(p->name);
     pa_xfree(p->description);
     pa_xfree(p);
diff --git a/src/pulsecore/device-port.h b/src/pulsecore/device-port.h
index f35d07c..85c41fa 100644
--- a/src/pulsecore/device-port.h
+++ b/src/pulsecore/device-port.h
@@ -22,14 +22,13 @@
   along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
 ***/
 
-typedef struct pa_device_port pa_device_port;
-
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
 
 #include <inttypes.h>
 
+#include <pulsecore/typedefs.h>
 #include <pulse/def.h>
 #include <pulsecore/object.h>
 #include <pulsecore/hashmap.h>
@@ -43,6 +42,7 @@ struct pa_device_port {
 
     char *name;
     char *description;
+    char *preferred_profile;
 
     unsigned priority;
     pa_available_t available;         /* PA_AVAILABLE_UNKNOWN, PA_AVAILABLE_NO or PA_AVAILABLE_YES */
@@ -80,6 +80,7 @@ pa_device_port *pa_device_port_new(pa_core *c, pa_device_port_new_data *data, si
 void pa_device_port_set_available(pa_device_port *p, pa_available_t available);
 
 void pa_device_port_set_latency_offset(pa_device_port *p, int64_t offset);
+void pa_device_port_set_preferred_profile(pa_device_port *p, const char *new_pp);
 
 pa_device_port *pa_device_port_find_best(pa_hashmap *ports);
 
diff --git a/src/pulsecore/log.c b/src/pulsecore/log.c
index 552d416..3c876f6 100644
--- a/src/pulsecore/log.c
+++ b/src/pulsecore/log.c
@@ -60,6 +60,7 @@
 #include "log.h"
 
 #define ENV_LOG_SYSLOG "PULSE_LOG_SYSLOG"
+#define ENV_LOG_JOURNAL "PULSE_LOG_JOURNAL"
 #define ENV_LOG_LEVEL "PULSE_LOG"
 #define ENV_LOG_COLORS "PULSE_LOG_COLORS"
 #define ENV_LOG_PRINT_TIME "PULSE_LOG_TIME"
@@ -293,6 +294,13 @@ static void init_defaults(void) {
             target_override_set = true;
         }
 
+#ifdef HAVE_SYSTEMD_JOURNAL
+        if (getenv(ENV_LOG_JOURNAL)) {
+            target_override = PA_LOG_JOURNAL;
+            target_override_set = true;
+        }
+#endif
+
         if ((e = getenv(ENV_LOG_LEVEL))) {
             maximum_level_override = (pa_log_level_t) atoi(e);
 
@@ -493,6 +501,7 @@ void pa_log_levelv_meta(
                                 "CODE_FILE=%s", file,
                                 "CODE_FUNC=%s", func,
                                 "CODE_LINE=%d", line,
+                                "PULSE_BACKTRACE=%s", pa_strempty(bt),
                                 NULL) < 0) {
 #ifdef HAVE_SYSLOG_H
                     pa_log_target new_target = { .type = PA_LOG_SYSLOG, .file = NULL };
diff --git a/src/pulsecore/ltdl-helper.c b/src/pulsecore/ltdl-helper.c
index 4e003c9..cfdde26 100644
--- a/src/pulsecore/ltdl-helper.c
+++ b/src/pulsecore/ltdl-helper.c
@@ -53,7 +53,7 @@ pa_void_func_t pa_load_sym(lt_dlhandle handle, const char *module, const char *s
     sn = pa_sprintf_malloc("%s_LTX_%s", module, symbol);
 
     for (c = sn; *c; c++)
-        if (!isalnum(*c))
+        if (!isalnum((unsigned char)*c))
             *c = '_';
 
     f = (pa_void_func_t) lt_dlsym(handle, sn);
diff --git a/src/pulsecore/modargs.c b/src/pulsecore/modargs.c
index 7b68346..b3c0313 100644
--- a/src/pulsecore/modargs.c
+++ b/src/pulsecore/modargs.c
@@ -131,7 +131,7 @@ pa_modargs *pa_modargs_new(const char *args, const char* const* valid_keys) {
             case WHITESPACE:
                 if (*p == '=')
                     goto fail;
-                else if (!isspace(*p)) {
+                else if (!isspace((unsigned char)*p)) {
                     key = p;
                     state = KEY;
                     key_len = 1;
@@ -141,7 +141,7 @@ pa_modargs *pa_modargs_new(const char *args, const char* const* valid_keys) {
             case KEY:
                 if (*p == '=')
                     state = VALUE_START;
-                else if (isspace(*p))
+                else if (isspace((unsigned char)*p))
                     goto fail;
                 else
                     key_len++;
@@ -156,7 +156,7 @@ pa_modargs *pa_modargs_new(const char *args, const char* const* valid_keys) {
                     state = VALUE_DOUBLE_QUOTES;
                     value = p+1;
                     value_len = 0;
-                } else if (isspace(*p)) {
+                } else if (isspace((unsigned char)*p)) {
                     if (add_key_value(ma,
                                       pa_xstrndup(key, key_len),
                                       pa_xstrdup(""),
@@ -175,7 +175,7 @@ pa_modargs *pa_modargs_new(const char *args, const char* const* valid_keys) {
                 break;
 
             case VALUE_SIMPLE:
-                if (isspace(*p)) {
+                if (isspace((unsigned char)*p)) {
                     if (add_key_value(ma,
                                       pa_xstrndup(key, key_len),
                                       pa_xstrndup(value, value_len),
diff --git a/src/pulsecore/module.c b/src/pulsecore/module.c
index 2dd64b5..7cba3a7 100644
--- a/src/pulsecore/module.c
+++ b/src/pulsecore/module.c
@@ -259,14 +259,13 @@ static void pa_module_free(pa_module *m) {
     pa_xfree(m);
 }
 
-void pa_module_unload(pa_core *c, pa_module *m, bool force) {
-    pa_assert(c);
+void pa_module_unload(pa_module *m, bool force) {
     pa_assert(m);
 
     if (m->core->disallow_module_loading && !force)
         return;
 
-    if (!(m = pa_idxset_remove_by_data(c->modules, m, NULL)))
+    if (!(m = pa_idxset_remove_by_data(m->core->modules, m, NULL)))
         return;
 
     pa_module_free(m);
@@ -334,7 +333,7 @@ static void defer_cb(pa_mainloop_api*api, pa_defer_event *e, void *userdata) {
     api->defer_enable(e, 0);
 
     while ((m = pa_hashmap_first(c->modules_pending_unload)))
-        pa_module_unload(c, m, true);
+        pa_module_unload(m, true);
 }
 
 void pa_module_unload_request(pa_module *m, bool force) {
diff --git a/src/pulsecore/module.h b/src/pulsecore/module.h
index 3889156..41e2189 100644
--- a/src/pulsecore/module.h
+++ b/src/pulsecore/module.h
@@ -54,7 +54,7 @@ bool pa_module_exists(const char *name);
 
 pa_module* pa_module_load(pa_core *c, const char *name, const char *argument);
 
-void pa_module_unload(pa_core *c, pa_module *m, bool force);
+void pa_module_unload(pa_module *m, bool force);
 void pa_module_unload_by_index(pa_core *c, uint32_t idx, bool force);
 
 void pa_module_unload_request(pa_module *m, bool force);
diff --git a/src/pulsecore/packet.c b/src/pulsecore/packet.c
index e275d23..2a61d58 100644
--- a/src/pulsecore/packet.c
+++ b/src/pulsecore/packet.c
@@ -32,7 +32,7 @@
 
 #define MAX_APPENDED_SIZE 128
 
-typedef struct pa_packet {
+struct pa_packet {
     PA_REFCNT_DECLARE;
     enum { PA_PACKET_APPENDED, PA_PACKET_DYNAMIC } type;
     size_t length;
@@ -40,7 +40,7 @@ typedef struct pa_packet {
     union {
         uint8_t appended[MAX_APPENDED_SIZE];
     } per_type;
-} pa_packet;
+};
 
 PA_STATIC_FLIST_DECLARE(packets, 0, pa_xfree);
 
diff --git a/src/pulsecore/protocol-dbus.c b/src/pulsecore/protocol-dbus.c
index d07d067..59afc1a 100644
--- a/src/pulsecore/protocol-dbus.c
+++ b/src/pulsecore/protocol-dbus.c
@@ -257,7 +257,7 @@ static void update_introspection(struct object_entry *oe) {
     pa_strbuf_puts(buf, "</node>\n");
 
     pa_xfree(oe->introspection);
-    oe->introspection = pa_strbuf_tostring_free(buf);
+    oe->introspection = pa_strbuf_to_string_free(buf);
 }
 
 /* Return value of find_handler() and its subfunctions. */
@@ -689,7 +689,7 @@ static pa_hashmap *extract_method_signatures(pa_hashmap *method_handlers) {
                 pa_strbuf_puts(sig_buf, handler->arguments[i].type);
         }
 
-        pa_hashmap_put(signatures, (char *) handler->method_name, pa_strbuf_tostring_free(sig_buf));
+        pa_hashmap_put(signatures, (char *) handler->method_name, pa_strbuf_to_string_free(sig_buf));
     }
 
     return signatures;
diff --git a/src/pulsecore/protocol-http.c b/src/pulsecore/protocol-http.c
index da8e220..25a2cd0 100644
--- a/src/pulsecore/protocol-http.c
+++ b/src/pulsecore/protocol-http.c
@@ -294,7 +294,7 @@ static char *escape_html(const char *t) {
     if (p > e)
         pa_strbuf_putsn(sb, e, p-e);
 
-    return pa_strbuf_tostring_free(sb);
+    return pa_strbuf_to_string_free(sb);
 }
 
 static void http_response(
diff --git a/src/pulsecore/resampler.c b/src/pulsecore/resampler.c
index 5478e6d..b683b05 100644
--- a/src/pulsecore/resampler.c
+++ b/src/pulsecore/resampler.c
@@ -685,6 +685,11 @@ int pa_resample_method_supported(pa_resample_method_t m) {
         return 0;
 #endif
 
+#ifndef HAVE_SOXR
+    if (m >= PA_RESAMPLER_SOXR_MQ && m <= PA_RESAMPLER_SOXR_VHQ)
+        return 0;
+#endif
+
     return 1;
 }
 
@@ -1149,7 +1154,7 @@ static void setup_remap(const pa_resampler *r, pa_remap_t *m, bool *lfe_remixed)
         pa_strbuf_puts(s, "\n");
     }
 
-    pa_log_debug("Channel matrix:\n%s", t = pa_strbuf_tostring_free(s));
+    pa_log_debug("Channel matrix:\n%s", t = pa_strbuf_to_string_free(s));
     pa_xfree(t);
 
     /* initialize the remapping function */
diff --git a/src/pulsecore/resampler/soxr.c b/src/pulsecore/resampler/soxr.c
index b5f0007..b1b2e19 100644
--- a/src/pulsecore/resampler/soxr.c
+++ b/src/pulsecore/resampler/soxr.c
@@ -64,17 +64,17 @@ static void resampler_soxr_free(pa_resampler *r) {
 }
 
 static void resampler_soxr_reset(pa_resampler *r) {
+#if SOXR_THIS_VERSION >= SOXR_VERSION(0, 1, 2)
+    pa_assert(r);
+
+    soxr_clear(r->impl.data);
+#else
+    /* With libsoxr prior to 0.1.2 soxr_clear() makes soxr_process() crash afterwards,
+     * so don't use this function and re-create the context instead. */
     soxr_t old_state;
 
     pa_assert(r);
 
-    /*
-     * soxr_clear() makes soxr_process() crash afterwards,
-     * so don't use this function until libsoxr is fixed.
-     *
-     * soxr_clear(r->impl.data);
-     */
-
     old_state = r->impl.data;
     r->impl.data = NULL;
 
@@ -85,6 +85,7 @@ static void resampler_soxr_reset(pa_resampler *r) {
         r->impl.data = old_state;
         pa_log_error("Failed to reset libsoxr context");
     }
+#endif
 }
 
 static void resampler_soxr_update_rates(pa_resampler *r) {
diff --git a/src/pulsecore/sample-util.h b/src/pulsecore/sample-util.h
index 95671f1..c817bc9 100644
--- a/src/pulsecore/sample-util.h
+++ b/src/pulsecore/sample-util.h
@@ -126,6 +126,14 @@ size_t pa_convert_size(size_t size, const pa_sample_spec *from, const pa_sample_
      | PA_CHANNEL_POSITION_MASK(PA_CHANNEL_POSITION_TOP_REAR_RIGHT)     \
      | PA_CHANNEL_POSITION_MASK(PA_CHANNEL_POSITION_TOP_REAR_CENTER))
 
+#define PA_CHANNEL_POSITION_MASK_LFE                                    \
+    PA_CHANNEL_POSITION_MASK(PA_CHANNEL_POSITION_LFE)
+
+#define PA_CHANNEL_POSITION_MASK_HFE                                    \
+    (PA_CHANNEL_POSITION_MASK_REAR | PA_CHANNEL_POSITION_MASK_FRONT     \
+     | PA_CHANNEL_POSITION_MASK_LEFT | PA_CHANNEL_POSITION_MASK_RIGHT   \
+     | PA_CHANNEL_POSITION_MASK_CENTER)
+
 #define PA_CHANNEL_POSITION_MASK_SIDE_OR_TOP_CENTER                     \
     (PA_CHANNEL_POSITION_MASK(PA_CHANNEL_POSITION_SIDE_LEFT)            \
      | PA_CHANNEL_POSITION_MASK(PA_CHANNEL_POSITION_SIDE_RIGHT)         \
diff --git a/src/pulsecore/sink-input.h b/src/pulsecore/sink-input.h
index 457f018..86deab2 100644
--- a/src/pulsecore/sink-input.h
+++ b/src/pulsecore/sink-input.h
@@ -23,8 +23,7 @@
 
 #include <inttypes.h>
 
-typedef struct pa_sink_input pa_sink_input;
-
+#include <pulsecore/typedefs.h>
 #include <pulse/sample.h>
 #include <pulse/format.h>
 #include <pulsecore/memblockq.h>
diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c
index 9ddb527..0b44fc7 100644
--- a/src/pulsecore/sink.c
+++ b/src/pulsecore/sink.c
@@ -950,18 +950,42 @@ size_t pa_sink_process_input_underruns(pa_sink *s, size_t left_to_play) {
 
     PA_HASHMAP_FOREACH(i, s->thread_info.inputs, state) {
         size_t uf = i->thread_info.underrun_for_sink;
-        if (uf == 0)
-            continue;
-        if (uf >= left_to_play) {
-            if (pa_sink_input_process_underrun(i))
-                continue;
+
+        /* Propagate down the filter tree */
+        if (i->origin_sink) {
+            size_t filter_result, left_to_play_origin;
+
+            /* The recursive call works in the origin sink domain ... */
+            left_to_play_origin = pa_convert_size(left_to_play, &i->sink->sample_spec, &i->origin_sink->sample_spec);
+
+            /* .. and returns the time to sleep before waking up. We need the
+             * underrun duration for comparisons, so we undo the subtraction on
+             * the return value... */
+            filter_result = left_to_play_origin - pa_sink_process_input_underruns(i->origin_sink, left_to_play_origin);
+
+            /* ... and convert it back to the master sink domain */
+            filter_result = pa_convert_size(filter_result, &i->origin_sink->sample_spec, &i->sink->sample_spec);
+
+            /* Remember the longest underrun so far */
+            if (filter_result > result)
+                result = filter_result;
         }
-        else if (uf > result)
+
+        if (uf == 0) {
+            /* No underrun here, move on */
+            continue;
+        } else if (uf >= left_to_play) {
+            /* The sink has possibly consumed all the data the sink input provided */
+            pa_sink_input_process_underrun(i);
+        } else if (uf > result) {
+            /* Remember the longest underrun so far */
             result = uf;
+        }
     }
 
     if (result > 0)
-        pa_log_debug("Found underrun %ld bytes ago (%ld bytes ahead in playback buffer)", (long) result, (long) left_to_play - result);
+        pa_log_debug("%s: Found underrun %ld bytes ago (%ld bytes ahead in playback buffer)", s->name,
+                (long) result, (long) left_to_play - result);
     return left_to_play - result;
 }
 
diff --git a/src/pulsecore/sink.h b/src/pulsecore/sink.h
index 3ae8240..5df109e 100644
--- a/src/pulsecore/sink.h
+++ b/src/pulsecore/sink.h
@@ -21,11 +21,9 @@
   along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
 ***/
 
-typedef struct pa_sink pa_sink;
-typedef struct pa_sink_volume_change pa_sink_volume_change;
-
 #include <inttypes.h>
 
+#include <pulsecore/typedefs.h>
 #include <pulse/def.h>
 #include <pulse/format.h>
 #include <pulse/sample.h>
diff --git a/src/pulsecore/source-output.h b/src/pulsecore/source-output.h
index 24555e4..26be484 100644
--- a/src/pulsecore/source-output.h
+++ b/src/pulsecore/source-output.h
@@ -22,8 +22,7 @@
 
 #include <inttypes.h>
 
-typedef struct pa_source_output pa_source_output;
-
+#include <pulsecore/typedefs.h>
 #include <pulse/sample.h>
 #include <pulse/format.h>
 #include <pulsecore/memblockq.h>
diff --git a/src/pulsecore/source.c b/src/pulsecore/source.c
index b553a2d..f4b96ab 100644
--- a/src/pulsecore/source.c
+++ b/src/pulsecore/source.c
@@ -1573,7 +1573,7 @@ void pa_source_set_volume(
         bool send_msg,
         bool save) {
 
-    pa_cvolume new_reference_volume;
+    pa_cvolume new_reference_volume, root_real_volume;
     pa_source *root_source;
 
     pa_source_assert_ref(s);
@@ -1630,11 +1630,21 @@ void pa_source_set_volume(
         /* Ok, let's determine the new real volume */
         compute_real_volume(root_source);
 
-        /* Let's 'push' the reference volume if necessary */
-        pa_cvolume_merge(&new_reference_volume, &s->reference_volume, &root_source->real_volume);
-        /* If the source and its root don't have the same number of channels, we need to remap */
+        /* To propagate the reference volume from the filter to the root source,
+         * we first take the real volume from the root source and remap it to
+         * match the filter. Then, we merge in the reference volume from the
+         * filter on top of this, and remap it back to the root source channel
+         * count and map */
+        root_real_volume = root_source->real_volume;
+        /* First we remap root's real volume to filter channel count and map if needed */
+        if (s != root_source && !pa_channel_map_equal(&s->channel_map, &root_source->channel_map))
+            pa_cvolume_remap(&root_real_volume, &root_source->channel_map, &s->channel_map);
+        /* Then let's 'push' the reference volume if necessary */
+        pa_cvolume_merge(&new_reference_volume, &s->reference_volume, &root_real_volume);
+        /* If the source and its root don't have the same number of channels, we need to remap back */
         if (s != root_source && !pa_channel_map_equal(&s->channel_map, &root_source->channel_map))
             pa_cvolume_remap(&new_reference_volume, &s->channel_map, &root_source->channel_map);
+
         update_reference_volume(root_source, &new_reference_volume, &root_source->channel_map, save);
 
         /* Now that the reference volume is updated, we can update the streams'
diff --git a/src/pulsecore/source.h b/src/pulsecore/source.h
index 9ee0783..19fb41b 100644
--- a/src/pulsecore/source.h
+++ b/src/pulsecore/source.h
@@ -21,11 +21,10 @@
   along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
 ***/
 
-typedef struct pa_source pa_source;
-typedef struct pa_source_volume_change pa_source_volume_change;
 
 #include <inttypes.h>
 
+#include <pulsecore/typedefs.h>
 #include <pulse/def.h>
 #include <pulse/format.h>
 #include <pulse/sample.h>
diff --git a/src/pulsecore/strbuf.c b/src/pulsecore/strbuf.c
index adcd3eb..11f131b 100644
--- a/src/pulsecore/strbuf.c
+++ b/src/pulsecore/strbuf.c
@@ -69,7 +69,7 @@ void pa_strbuf_free(pa_strbuf *sb) {
 
 /* Make a C string from the string buffer. The caller has to free
  * string with pa_xfree(). */
-char *pa_strbuf_tostring(pa_strbuf *sb) {
+char *pa_strbuf_to_string(pa_strbuf *sb) {
     char *t, *e;
     struct chunk *c;
 
@@ -91,12 +91,12 @@ char *pa_strbuf_tostring(pa_strbuf *sb) {
     return t;
 }
 
-/* Combination of pa_strbuf_free() and pa_strbuf_tostring() */
-char *pa_strbuf_tostring_free(pa_strbuf *sb) {
+/* Combination of pa_strbuf_free() and pa_strbuf_to_string() */
+char *pa_strbuf_to_string_free(pa_strbuf *sb) {
     char *t;
 
     pa_assert(sb);
-    t = pa_strbuf_tostring(sb);
+    t = pa_strbuf_to_string(sb);
     pa_strbuf_free(sb);
 
     return t;
diff --git a/src/pulsecore/strbuf.h b/src/pulsecore/strbuf.h
index 562fe38..469f6f7 100644
--- a/src/pulsecore/strbuf.h
+++ b/src/pulsecore/strbuf.h
@@ -27,8 +27,8 @@ typedef struct pa_strbuf pa_strbuf;
 
 pa_strbuf *pa_strbuf_new(void);
 void pa_strbuf_free(pa_strbuf *sb);
-char *pa_strbuf_tostring(pa_strbuf *sb);
-char *pa_strbuf_tostring_free(pa_strbuf *sb);
+char *pa_strbuf_to_string(pa_strbuf *sb);
+char *pa_strbuf_to_string_free(pa_strbuf *sb);
 
 size_t pa_strbuf_printf(pa_strbuf *sb, const char *format, ...)  PA_GCC_PRINTF_ATTR(2,3);
 void pa_strbuf_puts(pa_strbuf *sb, const char *t);
diff --git a/src/pulsecore/strlist.c b/src/pulsecore/strlist.c
index 37e4847..7e5b070 100644
--- a/src/pulsecore/strlist.c
+++ b/src/pulsecore/strlist.c
@@ -50,7 +50,7 @@ pa_strlist* pa_strlist_prepend(pa_strlist *l, const char *s) {
     return n;
 }
 
-char *pa_strlist_tostring(pa_strlist *l) {
+char *pa_strlist_to_string(pa_strlist *l) {
     int first = 1;
     pa_strbuf *b;
 
@@ -62,7 +62,7 @@ char *pa_strlist_tostring(pa_strlist *l) {
         pa_strbuf_puts(b, ITEM_TO_TEXT(l));
     }
 
-    return pa_strbuf_tostring_free(b);
+    return pa_strbuf_to_string_free(b);
 }
 
 pa_strlist* pa_strlist_remove(pa_strlist *l, const char *s) {
diff --git a/src/pulsecore/strlist.h b/src/pulsecore/strlist.h
index 84a5777..3cc71e8 100644
--- a/src/pulsecore/strlist.h
+++ b/src/pulsecore/strlist.h
@@ -29,7 +29,7 @@ pa_strlist* pa_strlist_prepend(pa_strlist *l, const char *s);
 pa_strlist* pa_strlist_remove(pa_strlist *l, const char *s);
 
 /* Make a whitespace separated string of all server strings. Returned memory has to be freed with pa_xfree() */
-char *pa_strlist_tostring(pa_strlist *l);
+char *pa_strlist_to_string(pa_strlist *l);
 
 /* Free the entire list */
 void pa_strlist_free(pa_strlist *l);
diff --git a/src/pulsecore/strbuf.h b/src/pulsecore/typedefs.h
similarity index 52%
copy from src/pulsecore/strbuf.h
copy to src/pulsecore/typedefs.h
index 562fe38..3652f8f 100644
--- a/src/pulsecore/strbuf.h
+++ b/src/pulsecore/typedefs.h
@@ -1,10 +1,11 @@
-#ifndef foostrbufhfoo
-#define foostrbufhfoo
+#ifndef footypedefshfoo
+#define footypedefshfoo
 
 /***
   This file is part of PulseAudio.
 
-  Copyright 2004-2006 Lennart Poettering
+  Copyright 2015 Canonical Ltd.
+  Written by David Henningsson <david.henningsson at canonical.com>
 
   PulseAudio is free software; you can redistribute it and/or modify
   it under the terms of the GNU Lesser General Public License as published
@@ -20,21 +21,17 @@
   along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
 ***/
 
-#include <pulse/gccmacro.h>
-#include <pulsecore/macro.h>
+typedef struct pa_card pa_card;
+typedef struct pa_card_profile pa_card_profile;
+typedef struct pa_client pa_client;
+typedef struct pa_core pa_core;
+typedef struct pa_device_port pa_device_port;
+typedef struct pa_sink pa_sink;
+typedef struct pa_sink_volume_change pa_sink_volume_change;
+typedef struct pa_sink_input pa_sink_input;
+typedef struct pa_source pa_source;
+typedef struct pa_source_volume_change pa_source_volume_change;
+typedef struct pa_source_output pa_source_output;
 
-typedef struct pa_strbuf pa_strbuf;
-
-pa_strbuf *pa_strbuf_new(void);
-void pa_strbuf_free(pa_strbuf *sb);
-char *pa_strbuf_tostring(pa_strbuf *sb);
-char *pa_strbuf_tostring_free(pa_strbuf *sb);
-
-size_t pa_strbuf_printf(pa_strbuf *sb, const char *format, ...)  PA_GCC_PRINTF_ATTR(2,3);
-void pa_strbuf_puts(pa_strbuf *sb, const char *t);
-void pa_strbuf_putsn(pa_strbuf *sb, const char *t, size_t m);
-void pa_strbuf_putc(pa_strbuf *sb, char c);
-
-bool pa_strbuf_isempty(pa_strbuf *sb);
 
 #endif
diff --git a/src/tests/extended-test.c b/src/tests/extended-test.c
index 6c7f991..ee766b8 100644
--- a/src/tests/extended-test.c
+++ b/src/tests/extended-test.c
@@ -209,6 +209,8 @@ int main(int argc, char *argv[]) {
     s = suite_create("Extended");
     tc = tcase_create("extended");
     tcase_add_test(tc, extended_test);
+    /* 4s of audio, 0.5s grace time */
+    tcase_set_timeout(tc, 4.5);
     suite_add_tcase(s, tc);
 
     sr = srunner_create(s);
diff --git a/src/tests/memblockq-test.c b/src/tests/memblockq-test.c
index a65b097..eea6cfa 100644
--- a/src/tests/memblockq-test.c
+++ b/src/tests/memblockq-test.c
@@ -70,7 +70,7 @@ static void dump(pa_memblockq *bq, int n) {
     buf = pa_strbuf_new();
     dump_chunk(&out, buf);
     pa_memblock_unref(out.memblock);
-    str = pa_strbuf_tostring_free(buf);
+    str = pa_strbuf_to_string_free(buf);
     fail_unless(pa_streq(str, fixed[n]));
     pa_xfree(str);
     fprintf(stderr, "<\n");
@@ -87,7 +87,7 @@ static void dump(pa_memblockq *bq, int n) {
         pa_memblock_unref(out.memblock);
         pa_memblockq_drop(bq, out.length);
     }
-    str = pa_strbuf_tostring_free(buf);
+    str = pa_strbuf_to_string_free(buf);
     fail_unless(pa_streq(str, manual[n]));
     pa_xfree(str);
     fprintf(stderr, "<\n");
diff --git a/src/tests/strlist-test.c b/src/tests/strlist-test.c
index 6a4f4bb..f4ec1c3 100644
--- a/src/tests/strlist-test.c
+++ b/src/tests/strlist-test.c
@@ -20,7 +20,7 @@ START_TEST (strlist_test) {
     l = pa_strlist_prepend(l, "b");
     l = pa_strlist_prepend(l, "a");
 
-    t = pa_strlist_tostring(l);
+    t = pa_strlist_to_string(l);
     pa_strlist_free(l);
 
     fprintf(stderr, "1: %s\n", t);
@@ -29,7 +29,7 @@ START_TEST (strlist_test) {
     l = pa_strlist_parse(t);
     pa_xfree(t);
 
-    t = pa_strlist_tostring(l);
+    t = pa_strlist_to_string(l);
     fprintf(stderr, "2: %s\n", t);
     fail_unless(pa_streq(t, "a b c d e"));
     pa_xfree(t);
@@ -41,7 +41,7 @@ START_TEST (strlist_test) {
 
     l = pa_strlist_remove(l, "c");
 
-    t = pa_strlist_tostring(l);
+    t = pa_strlist_to_string(l);
     fprintf(stderr, "4: %s\n", t);
     fail_unless(pa_streq(t, "b d e"));
     pa_xfree(t);
diff --git a/src/tests/sync-playback.c b/src/tests/sync-playback.c
index 205383d..f06b459 100644
--- a/src/tests/sync-playback.c
+++ b/src/tests/sync-playback.c
@@ -206,7 +206,8 @@ int main(int argc, char *argv[]) {
     s = suite_create("Sync Playback");
     tc = tcase_create("syncplayback");
     tcase_add_test(tc, sync_playback_test);
-    tcase_set_timeout(tc, 5 * 60);
+    /* 4s of audio, 0.5s grace time */
+    tcase_set_timeout(tc, 4.5);
     suite_add_tcase(s, tc);
 
     sr = srunner_create(s);
diff --git a/src/utils/pacmd.c b/src/utils/pacmd.c
index 547ebe1..616573c 100644
--- a/src/utils/pacmd.c
+++ b/src/utils/pacmd.c
@@ -57,7 +57,7 @@ static void help(const char *argv0) {
     printf("%s %s %s\n", argv0, "set-(sink-input|source-output)-mute", _("#N 1|0"));
     printf("%s %s %s\n", argv0, "update-(sink|source)-proplist", _("NAME|#N KEY=VALUE"));
     printf("%s %s %s\n", argv0, "update-(sink-input|source-output)-proplist", _("#N KEY=VALUE"));
-    printf("%s %s %s\n", argv0, "set-default(sink|source)", _("NAME|#N"));
+    printf("%s %s %s\n", argv0, "set-default-(sink|source)", _("NAME|#N"));
     printf("%s %s %s\n", argv0, "kill-(client|sink-input|source-output)", _("#N"));
     printf("%s %s %s\n", argv0, "play-sample", _("NAME SINK|#N"));
     printf("%s %s %s\n", argv0, "remove-sample", _("NAME"));

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-pulseaudio/pulseaudio.git



More information about the pkg-pulseaudio-devel mailing list