[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