[pulseaudio] 01/01: Imported Upstream version 8.99.1
Felipe Sateler
fsateler at moszumanska.debian.org
Sat May 14 18:19:23 UTC 2016
This is an automated email from the git hooks/post-receive script.
fsateler pushed a commit to branch upstream
in repository pulseaudio.
commit e8f565a24d9a69ae696f0600f2ea992ddbd9f7c6
Author: Felipe Sateler <fsateler at debian.org>
Date: Fri May 13 20:52:16 2016 -0300
Imported Upstream version 8.99.1
---
.tarball-version | 2 +-
.version | 2 +-
Makefile.in | 4 +
PROTOCOL | 37 +
aclocal.m4 | 2 +
config.h.in | 23 +-
configure | 1658 +++++++--
configure.ac | 58 +-
doxygen/Makefile.in | 4 +
m4/ax_cxx_compile_stdcxx.m4 | 558 +++
m4/ax_cxx_compile_stdcxx_11.m4 | 39 +
man/Makefile.in | 4 +
man/pulse-client.conf.5 | 4 +-
man/pulse-client.conf.5.xml.in | 8 +
man/pulse-daemon.conf.5 | 4 +-
man/pulse-daemon.conf.5.xml.in | 7 +-
man/pulseaudio.1 | 5 +-
man/pulseaudio.1.xml.in | 15 +-
po/hu.po | 3610 +++++++++++---------
po/it.po | 662 ++--
po/tr.po | 766 +++--
po/zh_CN.po | 1001 +++---
shell-completion/bash/pulseaudio | 4 +-
shell-completion/zsh/_pulseaudio | 1 +
src/Makefile.am | 22 +-
src/Makefile.in | 574 ++--
src/daemon/cmdline.c | 13 +-
src/daemon/daemon-conf.c | 2 +
src/daemon/daemon-conf.h | 1 +
src/daemon/default.pa.in | 31 -
src/daemon/main.c | 4 +-
src/modules/alsa/alsa-mixer.c | 436 ++-
.../alsa/mixer/paths/analog-input-linein.conf | 4 +
src/modules/alsa/mixer/paths/analog-input-mic.conf | 4 +
.../mixer/profile-sets/sb-omni-surround-5.1.conf | 17 +-
src/modules/alsa/module-alsa-card.c | 32 +
src/modules/echo-cancel/adrian.c | 18 +-
src/modules/echo-cancel/echo-cancel.h | 14 +-
src/modules/echo-cancel/module-echo-cancel.c | 95 +-
src/modules/echo-cancel/null.c | 4 +-
src/modules/echo-cancel/speex.c | 58 +-
src/modules/echo-cancel/webrtc.cc | 437 ++-
src/modules/macosx/module-coreaudio-device.c | 68 +-
src/modules/module-card-restore.c | 72 +-
src/modules/module-detect.c | 3 +
src/modules/module-device-manager.c | 32 +-
src/modules/module-filter-apply.c | 86 +-
src/modules/module-loopback.c | 28 +-
src/modules/module-rescue-streams.c | 2 +-
src/modules/module-role-cork.c | 256 +-
src/modules/module-role-ducking.c | 267 +-
src/modules/module-solaris.c | 12 +-
src/modules/module-stream-restore.c | 6 +-
src/modules/module-switch-on-port-available.c | 240 +-
src/modules/module-tunnel.c | 2 +-
src/modules/rtp/module-rtp-recv.c | 18 +-
src/modules/stream-interaction.c | 550 +++
src/modules/stream-interaction.h | 21 +
src/pulse/client-conf.c | 1 +
src/pulse/client-conf.h | 2 +-
src/pulse/context.c | 103 +-
src/pulse/glib-mainloop.c | 2 +-
src/pulse/internal.h | 3 +
src/pulse/sample.h | 2 +-
src/pulse/stream.h | 4 +-
src/pulse/version.h | 6 +-
src/pulsecore/card.c | 60 +
src/pulsecore/card.h | 14 +
src/pulsecore/core-util.c | 4 +-
src/pulsecore/core.c | 24 +-
src/pulsecore/core.h | 15 +-
src/pulsecore/creds.h | 5 +
src/pulsecore/filter/lfe-filter.c | 5 +-
src/pulsecore/iochannel.c | 1 +
src/pulsecore/log.c | 11 +
src/pulsecore/macro.h | 6 +-
src/pulsecore/mem.h | 60 +
src/pulsecore/memblock.c | 277 +-
src/pulsecore/memblock.h | 22 +-
src/pulsecore/memblockq.c | 5 +-
src/pulsecore/memchunk.c | 5 +-
src/pulsecore/memfd-wrappers.h | 68 +
src/pulsecore/native-common.c | 78 +
src/pulsecore/native-common.h | 11 +
src/pulsecore/pdispatch.c | 30 +-
src/pulsecore/pdispatch.h | 5 +-
src/pulsecore/protocol-native.c | 118 +-
src/pulsecore/pstream-util.c | 102 +-
src/pulsecore/pstream-util.h | 4 +-
src/pulsecore/pstream.c | 200 +-
src/pulsecore/pstream.h | 8 +-
src/pulsecore/shm.c | 293 +-
src/pulsecore/shm.h | 23 +-
src/pulsecore/sink-input.c | 145 +-
src/pulsecore/sink-input.h | 4 +-
src/pulsecore/sink.c | 7 +-
src/pulsecore/sink.h | 6 +
src/pulsecore/source-output.c | 168 +-
src/pulsecore/source-output.h | 4 +-
src/pulsecore/source.c | 5 +
src/pulsecore/source.h | 6 +
src/tests/connect-stress.c | 15 +-
src/tests/cpu-mix-test.c | 6 +-
src/tests/cpu-remap-test.c | 4 +-
src/tests/cpu-sconv-test.c | 4 +-
src/tests/cpu-volume-test.c | 2 +-
src/tests/cpulimit-test.c | 4 +-
src/tests/extended-test.c | 4 +-
src/tests/get-binary-name-test.c | 2 +-
src/tests/interpol-test.c | 2 +-
src/tests/lfe-filter-test.c | 4 +-
src/tests/mcalign-test.c | 4 +-
src/tests/memblock-test.c | 21 +-
src/tests/memblockq-test.c | 4 +-
src/tests/mix-test.c | 4 +-
src/tests/mult-s16-test.c | 2 +-
src/tests/remix-test.c | 4 +-
src/tests/resampler-test.c | 46 +-
src/tests/srbchannel-test.c | 6 +-
src/tests/sync-playback.c | 4 +-
src/utils/padsp.c | 6 +
vala/libpulse.vapi | 15 +
122 files changed, 9041 insertions(+), 4951 deletions(-)
diff --git a/.tarball-version b/.tarball-version
index cc40bca..6de7393 100644
--- a/.tarball-version
+++ b/.tarball-version
@@ -1 +1 @@
-8.0
+8.99.1
diff --git a/.version b/.version
index cc40bca..6de7393 100644
--- a/.version
+++ b/.version
@@ -1 +1 @@
-8.0
+8.99.1
diff --git a/Makefile.in b/Makefile.in
index fd1e33c..60489c2 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -111,6 +111,8 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/acx_libwrap.m4 \
$(top_srcdir)/m4/ax_check_define.m4 \
$(top_srcdir)/m4/ax_check_flag.m4 \
+ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \
$(top_srcdir)/m4/ax_define_dir.m4 \
$(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/ax_tls.m4 \
$(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \
@@ -349,8 +351,10 @@ HAVE_BLUEZ_5 = @HAVE_BLUEZ_5@
HAVE_BLUEZ_5_NATIVE_HEADSET = @HAVE_BLUEZ_5_NATIVE_HEADSET@
HAVE_BLUEZ_5_OFONO_HEADSET = @HAVE_BLUEZ_5_OFONO_HEADSET@
HAVE_COREAUDIO = @HAVE_COREAUDIO@
+HAVE_CXX11 = @HAVE_CXX11@
HAVE_DBUS = @HAVE_DBUS@
HAVE_GLIB20 = @HAVE_GLIB20@
+HAVE_MEMFD = @HAVE_MEMFD@
HAVE_MKFIFO = @HAVE_MKFIFO@
HAVE_NEON = @HAVE_NEON@
HAVE_OSS_OUTPUT = @HAVE_OSS_OUTPUT@
diff --git a/PROTOCOL b/PROTOCOL
index 3c08fea..5191397 100644
--- a/PROTOCOL
+++ b/PROTOCOL
@@ -371,6 +371,43 @@ PA_COMMAND_DISABLE_SRBCHANNEL
Tells the client to stop listening on the additional SHM ringbuffer channel.
Acked by client by sending PA_COMMAND_DISABLE_SRBCHANNEL back.
+## v31, implemented by >= 9.0
+
+Memfd shared-memory support is now added to PulseAudio as an opt-in feature.
+Add 'enable-memfd=yes' to daemon's configuration to use memfds, instead of
+POSIX shm, by default.
+
+Memfd is a simple memory sharing mechanism, added by the systemd/kdbus
+developers, to share pages between processes in an anonymous, no global
+registry needed, no mount-point required, relatively secure, manner.
+
+PulseAudio memfd support builds the necessary (but not yet sufficient)
+groundwork for a better integration with per-app containers (e.g. xdg-app)
+
+For further details on memfds in general, please check:
+
+ https://dvdhrm.wordpress.com/2014/06/10/memfd_create2/
+ Archived at: http://www.webcitation.org/6gnHTy9Kr
+
+Moreover, for both client and server, the second most-significant bit of
+the version tag is now used to flag memfd SHM support. On the way forward,
+the two most-significant _bytes_ of the version tag are now also reserved
+for flags.
+
+PA_COMMAND_REGISTER_MEMFD_SHMID
+New command that can be sent both ways, from client to server and vice versa.
+This is needed to transfer a memfd pool's blocks without passing its fd every
+time, thus minimizing overhead and avoiding fd leaks.
+
+The registration command above sends a packet with the pool's memfd fd as
+ancillary data. Such packet has an ID that uniquely identifies the pool's
+memfd memory area. Upon arrival, the other end (client or server) creates a
+permanent ID<->memfd mapping.
+
+By doing so, there's need to reference the pool's memfd file descriptor any
+further -- just its ID. Thus both endpoints can then quickly and safely
+close their memfd file descriptors.
+
#### If you just changed the protocol, read this
## module-tunnel depends on the sink/source/sink-input/source-input protocol
## internals, so if you changed these, you might have broken module-tunnel.
diff --git a/aclocal.m4 b/aclocal.m4
index 3e602cb..def2c5d 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -1400,6 +1400,8 @@ AC_SUBST([am__untar])
m4_include([m4/acx_libwrap.m4])
m4_include([m4/ax_check_define.m4])
m4_include([m4/ax_check_flag.m4])
+m4_include([m4/ax_cxx_compile_stdcxx.m4])
+m4_include([m4/ax_cxx_compile_stdcxx_11.m4])
m4_include([m4/ax_define_dir.m4])
m4_include([m4/ax_pthread.m4])
m4_include([m4/ax_tls.m4])
diff --git a/config.h.in b/config.h.in
index aa99e72..6a5ed73 100644
--- a/config.h.in
+++ b/config.h.in
@@ -103,6 +103,9 @@
/* Define to 1 if you have the `ctime_r' function. */
#undef HAVE_CTIME_R
+/* define if the compiler supports basic C++11 syntax */
+#undef HAVE_CXX11
+
/* Have D-Bus. */
#undef HAVE_DBUS
@@ -117,6 +120,18 @@
don't. */
#undef HAVE_DECL_ENVIRON
+/* Define to 1 if you have the declaration of `SOUND_PCM_READ_BITS', and to 0
+ if you don't. */
+#undef HAVE_DECL_SOUND_PCM_READ_BITS
+
+/* Define to 1 if you have the declaration of `SOUND_PCM_READ_CHANNELS', and
+ to 0 if you don't. */
+#undef HAVE_DECL_SOUND_PCM_READ_CHANNELS
+
+/* Define to 1 if you have the declaration of `SOUND_PCM_READ_RATE', and to 0
+ if you don't. */
+#undef HAVE_DECL_SOUND_PCM_READ_RATE
+
/* Have dladdr? */
#undef HAVE_DLADDR
@@ -234,6 +249,9 @@
/* Define to 1 if you have the `lstat' function. */
#undef HAVE_LSTAT
+/* Have memfd shared memory. */
+#undef HAVE_MEMFD
+
/* Define to 1 if you have the <memory.h> header file. */
#undef HAVE_MEMORY_H
@@ -546,11 +564,6 @@
/* 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. */
-#undef HAVE__SYSTEM_LIBRARY_FRAMEWORKS_CORESERVICES_FRAMEWORK_HEADERS_CORESERVICES_H
-
/* Define as const if the declaration of iconv() needs const. */
#undef ICONV_CONST
diff --git a/configure b/configure
index ed492d9..ef1b5d6 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 8.0.
+# Generated by GNU Autoconf 2.69 for pulseaudio 8.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='8.0'
-PACKAGE_STRING='pulseaudio 8.0'
+PACKAGE_VERSION='8.99.1'
+PACKAGE_STRING='pulseaudio 8.99.1'
PACKAGE_BUGREPORT='pulseaudio-discuss (at) lists (dot) freedesktop (dot) org'
PACKAGE_URL='http://pulseaudio.org/'
@@ -835,6 +835,9 @@ HAVE_X11_TRUE
HAVE_X11
X11_LIBS
X11_CFLAGS
+HAVE_MEMFD_FALSE
+HAVE_MEMFD_TRUE
+HAVE_MEMFD
HAVE_REGEX_FALSE
HAVE_REGEX_TRUE
ALLOCA
@@ -946,6 +949,7 @@ M4
EGREP
GREP
CPP
+HAVE_CXX11
am__fastdepCXX_FALSE
am__fastdepCXX_TRUE
CXXDEPMODE
@@ -1072,6 +1076,7 @@ enable_fast_install
with_sysroot
enable_libtool_lock
enable_largefile
+enable_memfd
enable_x11
with_caps
enable_tests
@@ -1741,7 +1746,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 8.0 to adapt to many kinds of systems.
+\`configure' configures pulseaudio 8.99.1 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1811,7 +1816,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of pulseaudio 8.0:";;
+ short | recursive ) echo "Configuration of pulseaudio 8.99.1:";;
esac
cat <<\_ACEOF
@@ -1839,6 +1844,7 @@ Optional Features:
optimize for fast installation [default=yes]
--disable-libtool-lock avoid locking (might break parallel builds)
--disable-largefile omit support for large files
+ --disable-memfd Disable Linux memfd shared memory
--disable-x11 Disable optional X11 support
--disable-tests Disable unit tests
--enable-samplerate Enable optional libsamplerate support (DEPRECATED)
@@ -2113,7 +2119,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-pulseaudio configure 8.0
+pulseaudio configure 8.99.1
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2886,7 +2892,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 8.0, which was
+It was created by pulseaudio $as_me 8.99.1, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -3841,7 +3847,7 @@ fi
# Define the identity of the package.
PACKAGE='pulseaudio'
- VERSION='8.0'
+ VERSION='8.99.1'
cat >>confdefs.h <<_ACEOF
@@ -4069,12 +4075,12 @@ PA_MAJORMINOR=`echo $VERSION | cut -d. -f1 | cut -d- -f1`.`echo $VERSION | cut -
PA_API_VERSION=12
-PA_PROTOCOL_VERSION=30
+PA_PROTOCOL_VERSION=31
# The stable ABI for client applications, for the version info x:y:z
# always will hold y=z
-LIBPULSE_VERSION_INFO=19:0:19
+LIBPULSE_VERSION_INFO=20:0:20
# A simplified, synchronous, ABI-stable interface for client
@@ -5313,183 +5319,6 @@ else
fi
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5
-$as_echo_n "checking for $CC option to accept ISO C99... " >&6; }
-if ${ac_cv_prog_cc_c99+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- ac_cv_prog_cc_c99=no
-ac_save_CC=$CC
-cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-#include <stdarg.h>
-#include <stdbool.h>
-#include <stdlib.h>
-#include <wchar.h>
-#include <stdio.h>
-
-// Check varargs macros. These examples are taken from C99 6.10.3.5.
-#define debug(...) fprintf (stderr, __VA_ARGS__)
-#define showlist(...) puts (#__VA_ARGS__)
-#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
-static void
-test_varargs_macros (void)
-{
- int x = 1234;
- int y = 5678;
- debug ("Flag");
- debug ("X = %d\n", x);
- showlist (The first, second, and third items.);
- report (x>y, "x is %d but y is %d", x, y);
-}
-
-// Check long long types.
-#define BIG64 18446744073709551615ull
-#define BIG32 4294967295ul
-#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
-#if !BIG_OK
- your preprocessor is broken;
-#endif
-#if BIG_OK
-#else
- your preprocessor is broken;
-#endif
-static long long int bignum = -9223372036854775807LL;
-static unsigned long long int ubignum = BIG64;
-
-struct incomplete_array
-{
- int datasize;
- double data[];
-};
-
-struct named_init {
- int number;
- const wchar_t *name;
- double average;
-};
-
-typedef const char *ccp;
-
-static inline int
-test_restrict (ccp restrict text)
-{
- // See if C++-style comments work.
- // Iterate through items via the restricted pointer.
- // Also check for declarations in for loops.
- for (unsigned int i = 0; *(text+i) != '\0'; ++i)
- continue;
- return 0;
-}
-
-// Check varargs and va_copy.
-static void
-test_varargs (const char *format, ...)
-{
- va_list args;
- va_start (args, format);
- va_list args_copy;
- va_copy (args_copy, args);
-
- const char *str;
- int number;
- float fnumber;
-
- while (*format)
- {
- switch (*format++)
- {
- case 's': // string
- str = va_arg (args_copy, const char *);
- break;
- case 'd': // int
- number = va_arg (args_copy, int);
- break;
- case 'f': // float
- fnumber = va_arg (args_copy, double);
- break;
- default:
- break;
- }
- }
- va_end (args_copy);
- va_end (args);
-}
-
-int
-main ()
-{
-
- // Check bool.
- _Bool success = false;
-
- // Check restrict.
- if (test_restrict ("String literal") == 0)
- success = true;
- char *restrict newvar = "Another string";
-
- // Check varargs.
- test_varargs ("s, d' f .", "string", 65, 34.234);
- test_varargs_macros ();
-
- // Check flexible array members.
- struct incomplete_array *ia =
- malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
- ia->datasize = 10;
- for (int i = 0; i < ia->datasize; ++i)
- ia->data[i] = i * 1.234;
-
- // Check named initializers.
- struct named_init ni = {
- .number = 34,
- .name = L"Test wide string",
- .average = 543.34343,
- };
-
- ni.number = 58;
-
- int dynamic_array[ni.number];
- dynamic_array[ni.number - 1] = 543;
-
- // work around unused variable warnings
- return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x'
- || dynamic_array[ni.number - 1] != 543);
-
- ;
- return 0;
-}
-_ACEOF
-for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99
-do
- CC="$ac_save_CC $ac_arg"
- if ac_fn_c_try_compile "$LINENO"; then :
- ac_cv_prog_cc_c99=$ac_arg
-fi
-rm -f core conftest.err conftest.$ac_objext
- test "x$ac_cv_prog_cc_c99" != "xno" && break
-done
-rm -f conftest.$ac_ext
-CC=$ac_save_CC
-
-fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c99" in
- x)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
-$as_echo "none needed" >&6; } ;;
- xno)
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
-$as_echo "unsupported" >&6; } ;;
- *)
- CC="$CC $ac_cv_prog_cc_c99"
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
-$as_echo "$ac_cv_prog_cc_c99" >&6; } ;;
-esac
-if test "x$ac_cv_prog_cc_c99" != xno; then :
-
-fi
-
-
# Only required if you want the WebRTC canceller -- no runtime dep on
# libstdc++ otherwise
@@ -5709,174 +5538,1149 @@ else
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
-int
-main ()
-{
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ac_cv_prog_cxx_g=yes
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+$as_echo "$ac_cv_prog_cxx_g" >&6; }
+if test "$ac_test_CXXFLAGS" = set; then
+ CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+ if test "$GXX" = yes; then
+ CXXFLAGS="-g -O2"
+ else
+ CXXFLAGS="-g"
+ fi
+else
+ if test "$GXX" = yes; then
+ CXXFLAGS="-O2"
+ else
+ CXXFLAGS=
+ fi
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+depcc="$CXX" am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CXX_dependencies_compiler_type+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named 'D' -- because '-MD' means "put the output
+ # in D".
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_CXX_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+ fi
+ am__universal=false
+ case " $depcc " in #(
+ *\ -arch\ *\ -arch\ *) am__universal=true ;;
+ esac
+
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
+ # Solaris 10 /bin/sh.
+ echo '/* dummy */' > sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ # We check with '-c' and '-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle '-M -o', and we need to detect this. Also, some Intel
+ # versions had trouble with output in subdirs.
+ am__obj=sub/conftest.${OBJEXT-o}
+ am__minus_obj="-o $am__obj"
+ case $depmode in
+ gcc)
+ # This depmode causes a compiler race in universal mode.
+ test "$am__universal" = false || continue
+ ;;
+ nosideeffect)
+ # After this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested.
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+ # This compiler won't grok '-c -o', but also, the minuso test has
+ # not run yet. These depmodes are late enough in the game, and
+ # so weak that their functioning should not be impacted.
+ am__obj=conftest.${OBJEXT-o}
+ am__minus_obj=
+ ;;
+ none) break ;;
+ esac
+ if depmode=$depmode \
+ source=sub/conftest.c object=$am__obj \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_CXX_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+ if
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+ am__fastdepCXX_TRUE=
+ am__fastdepCXX_FALSE='#'
+else
+ am__fastdepCXX_TRUE='#'
+ am__fastdepCXX_FALSE=
+fi
+
+
+
+ ax_cxx_compile_cxx11_required=true
+ ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+ ac_success=no
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features by default" >&5
+$as_echo_n "checking whether $CXX supports C++11 features by default... " >&6; }
+if ${ax_cv_cxx_compile_cxx11+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+// If the compiler admits that it is not ready for C++11, why torture it?
+// Hopefully, this will speed up the test.
+
+#ifndef __cplusplus
+
+#error "This is not a C++ compiler"
+
+#elif __cplusplus < 201103L
+
+#error "This is not a C++11 compiler"
+
+#else
+
+namespace cxx11
+{
+
+ namespace test_static_assert
+ {
+
+ template <typename T>
+ struct check
+ {
+ static_assert(sizeof(int) <= sizeof(T), "not big enough");
+ };
+
+ }
+
+ namespace test_final_override
+ {
+
+ struct Base
+ {
+ virtual void f() {}
+ };
+
+ struct Derived : public Base
+ {
+ virtual void f() override {}
+ };
+
+ }
+
+ namespace test_double_right_angle_brackets
+ {
+
+ template < typename T >
+ struct check {};
+
+ typedef check<void> single_type;
+ typedef check<check<void>> double_type;
+ typedef check<check<check<void>>> triple_type;
+ typedef check<check<check<check<void>>>> quadruple_type;
+
+ }
+
+ namespace test_decltype
+ {
+
+ int
+ f()
+ {
+ int a = 1;
+ decltype(a) b = 2;
+ return a + b;
+ }
+
+ }
+
+ namespace test_type_deduction
+ {
+
+ template < typename T1, typename T2 >
+ struct is_same
+ {
+ static const bool value = false;
+ };
+
+ template < typename T >
+ struct is_same<T, T>
+ {
+ static const bool value = true;
+ };
+
+ template < typename T1, typename T2 >
+ auto
+ add(T1 a1, T2 a2) -> decltype(a1 + a2)
+ {
+ return a1 + a2;
+ }
+
+ int
+ test(const int c, volatile int v)
+ {
+ static_assert(is_same<int, decltype(0)>::value == true, "");
+ static_assert(is_same<int, decltype(c)>::value == false, "");
+ static_assert(is_same<int, decltype(v)>::value == false, "");
+ auto ac = c;
+ auto av = v;
+ auto sumi = ac + av + 'x';
+ auto sumf = ac + av + 1.0;
+ static_assert(is_same<int, decltype(ac)>::value == true, "");
+ static_assert(is_same<int, decltype(av)>::value == true, "");
+ static_assert(is_same<int, decltype(sumi)>::value == true, "");
+ static_assert(is_same<int, decltype(sumf)>::value == false, "");
+ static_assert(is_same<int, decltype(add(c, v))>::value == true, "");
+ return (sumf > 0.0) ? sumi : add(c, v);
+ }
+
+ }
+
+ namespace test_noexcept
+ {
+
+ int f() { return 0; }
+ int g() noexcept { return 0; }
+
+ static_assert(noexcept(f()) == false, "");
+ static_assert(noexcept(g()) == true, "");
+
+ }
+
+ namespace test_constexpr
+ {
+
+ template < typename CharT >
+ unsigned long constexpr
+ strlen_c_r(const CharT *const s, const unsigned long acc) noexcept
+ {
+ return *s ? strlen_c_r(s + 1, acc + 1) : acc;
+ }
+
+ template < typename CharT >
+ unsigned long constexpr
+ strlen_c(const CharT *const s) noexcept
+ {
+ return strlen_c_r(s, 0UL);
+ }
+
+ static_assert(strlen_c("") == 0UL, "");
+ static_assert(strlen_c("1") == 1UL, "");
+ static_assert(strlen_c("example") == 7UL, "");
+ static_assert(strlen_c("another\0example") == 7UL, "");
+
+ }
+
+ namespace test_rvalue_references
+ {
+
+ template < int N >
+ struct answer
+ {
+ static constexpr int value = N;
+ };
+
+ answer<1> f(int&) { return answer<1>(); }
+ answer<2> f(const int&) { return answer<2>(); }
+ answer<3> f(int&&) { return answer<3>(); }
+
+ void
+ test()
+ {
+ int i = 0;
+ const int c = 0;
+ static_assert(decltype(f(i))::value == 1, "");
+ static_assert(decltype(f(c))::value == 2, "");
+ static_assert(decltype(f(0))::value == 3, "");
+ }
+
+ }
+
+ namespace test_uniform_initialization
+ {
+
+ struct test
+ {
+ static const int zero {};
+ static const int one {1};
+ };
+
+ static_assert(test::zero == 0, "");
+ static_assert(test::one == 1, "");
+
+ }
+
+ namespace test_lambdas
+ {
+
+ void
+ test1()
+ {
+ auto lambda1 = [](){};
+ auto lambda2 = lambda1;
+ lambda1();
+ lambda2();
+ }
+
+ int
+ test2()
+ {
+ auto a = [](int i, int j){ return i + j; }(1, 2);
+ auto b = []() -> int { return '0'; }();
+ auto c = [=](){ return a + b; }();
+ auto d = [&](){ return c; }();
+ auto e = [a, &b](int x) mutable {
+ const auto identity = [](int y){ return y; };
+ for (auto i = 0; i < a; ++i)
+ a += b--;
+ return x + identity(a + b);
+ }(0);
+ return a + b + c + d + e;
+ }
+
+ int
+ test3()
+ {
+ const auto nullary = [](){ return 0; };
+ const auto unary = [](int x){ return x; };
+ using nullary_t = decltype(nullary);
+ using unary_t = decltype(unary);
+ const auto higher1st = [](nullary_t f){ return f(); };
+ const auto higher2nd = [unary](nullary_t f1){
+ return [unary, f1](unary_t f2){ return f2(unary(f1())); };
+ };
+ return higher1st(nullary) + higher2nd(nullary)(unary);
+ }
+
+ }
+
+ namespace test_variadic_templates
+ {
+
+ template <int...>
+ struct sum;
+
+ template <int N0, int... N1toN>
+ struct sum<N0, N1toN...>
+ {
+ static constexpr auto value = N0 + sum<N1toN...>::value;
+ };
+
+ template <>
+ struct sum<>
+ {
+ static constexpr auto value = 0;
+ };
+
+ static_assert(sum<>::value == 0, "");
+ static_assert(sum<1>::value == 1, "");
+ static_assert(sum<23>::value == 23, "");
+ static_assert(sum<1, 2>::value == 3, "");
+ static_assert(sum<5, 5, 11>::value == 21, "");
+ static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, "");
+
+ }
+
+ // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
+ // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function
+ // because of this.
+ namespace test_template_alias_sfinae
+ {
+
+ struct foo {};
+
+ template<typename T>
+ using member = typename T::member_type;
+
+ template<typename T>
+ void func(...) {}
+
+ template<typename T>
+ void func(member<T>*) {}
+
+ void test();
+
+ void test() { func<foo>(0); }
+
+ }
+
+} // namespace cxx11
+
+#endif // __cplusplus >= 201103L
+
+
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ ax_cv_cxx_compile_cxx11=yes
+else
+ ax_cv_cxx_compile_cxx11=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_cxx_compile_cxx11" >&5
+$as_echo "$ax_cv_cxx_compile_cxx11" >&6; }
+ if test x$ax_cv_cxx_compile_cxx11 = xyes; then
+ ac_success=yes
+ fi
+
+ if test x$ac_success = xno; then
+ for switch in -std=gnu++11 -std=gnu++0x; do
+ cachevar=`$as_echo "ax_cv_cxx_compile_cxx11_$switch" | $as_tr_sh`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features with $switch" >&5
+$as_echo_n "checking whether $CXX supports C++11 features with $switch... " >&6; }
+if eval \${$cachevar+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_save_CXXFLAGS="$CXXFLAGS"
+ CXXFLAGS="$CXXFLAGS $switch"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+// If the compiler admits that it is not ready for C++11, why torture it?
+// Hopefully, this will speed up the test.
+
+#ifndef __cplusplus
+
+#error "This is not a C++ compiler"
+
+#elif __cplusplus < 201103L
+
+#error "This is not a C++11 compiler"
+
+#else
+
+namespace cxx11
+{
+
+ namespace test_static_assert
+ {
+
+ template <typename T>
+ struct check
+ {
+ static_assert(sizeof(int) <= sizeof(T), "not big enough");
+ };
+
+ }
+
+ namespace test_final_override
+ {
+
+ struct Base
+ {
+ virtual void f() {}
+ };
+
+ struct Derived : public Base
+ {
+ virtual void f() override {}
+ };
+
+ }
+
+ namespace test_double_right_angle_brackets
+ {
+
+ template < typename T >
+ struct check {};
+
+ typedef check<void> single_type;
+ typedef check<check<void>> double_type;
+ typedef check<check<check<void>>> triple_type;
+ typedef check<check<check<check<void>>>> quadruple_type;
+
+ }
+
+ namespace test_decltype
+ {
+
+ int
+ f()
+ {
+ int a = 1;
+ decltype(a) b = 2;
+ return a + b;
+ }
+
+ }
+
+ namespace test_type_deduction
+ {
+
+ template < typename T1, typename T2 >
+ struct is_same
+ {
+ static const bool value = false;
+ };
+
+ template < typename T >
+ struct is_same<T, T>
+ {
+ static const bool value = true;
+ };
+
+ template < typename T1, typename T2 >
+ auto
+ add(T1 a1, T2 a2) -> decltype(a1 + a2)
+ {
+ return a1 + a2;
+ }
+
+ int
+ test(const int c, volatile int v)
+ {
+ static_assert(is_same<int, decltype(0)>::value == true, "");
+ static_assert(is_same<int, decltype(c)>::value == false, "");
+ static_assert(is_same<int, decltype(v)>::value == false, "");
+ auto ac = c;
+ auto av = v;
+ auto sumi = ac + av + 'x';
+ auto sumf = ac + av + 1.0;
+ static_assert(is_same<int, decltype(ac)>::value == true, "");
+ static_assert(is_same<int, decltype(av)>::value == true, "");
+ static_assert(is_same<int, decltype(sumi)>::value == true, "");
+ static_assert(is_same<int, decltype(sumf)>::value == false, "");
+ static_assert(is_same<int, decltype(add(c, v))>::value == true, "");
+ return (sumf > 0.0) ? sumi : add(c, v);
+ }
+
+ }
+
+ namespace test_noexcept
+ {
+
+ int f() { return 0; }
+ int g() noexcept { return 0; }
+
+ static_assert(noexcept(f()) == false, "");
+ static_assert(noexcept(g()) == true, "");
+
+ }
+
+ namespace test_constexpr
+ {
+
+ template < typename CharT >
+ unsigned long constexpr
+ strlen_c_r(const CharT *const s, const unsigned long acc) noexcept
+ {
+ return *s ? strlen_c_r(s + 1, acc + 1) : acc;
+ }
+
+ template < typename CharT >
+ unsigned long constexpr
+ strlen_c(const CharT *const s) noexcept
+ {
+ return strlen_c_r(s, 0UL);
+ }
+
+ static_assert(strlen_c("") == 0UL, "");
+ static_assert(strlen_c("1") == 1UL, "");
+ static_assert(strlen_c("example") == 7UL, "");
+ static_assert(strlen_c("another\0example") == 7UL, "");
+
+ }
+
+ namespace test_rvalue_references
+ {
+
+ template < int N >
+ struct answer
+ {
+ static constexpr int value = N;
+ };
+
+ answer<1> f(int&) { return answer<1>(); }
+ answer<2> f(const int&) { return answer<2>(); }
+ answer<3> f(int&&) { return answer<3>(); }
+
+ void
+ test()
+ {
+ int i = 0;
+ const int c = 0;
+ static_assert(decltype(f(i))::value == 1, "");
+ static_assert(decltype(f(c))::value == 2, "");
+ static_assert(decltype(f(0))::value == 3, "");
+ }
+
+ }
+
+ namespace test_uniform_initialization
+ {
+
+ struct test
+ {
+ static const int zero {};
+ static const int one {1};
+ };
+
+ static_assert(test::zero == 0, "");
+ static_assert(test::one == 1, "");
+
+ }
+
+ namespace test_lambdas
+ {
+
+ void
+ test1()
+ {
+ auto lambda1 = [](){};
+ auto lambda2 = lambda1;
+ lambda1();
+ lambda2();
+ }
+
+ int
+ test2()
+ {
+ auto a = [](int i, int j){ return i + j; }(1, 2);
+ auto b = []() -> int { return '0'; }();
+ auto c = [=](){ return a + b; }();
+ auto d = [&](){ return c; }();
+ auto e = [a, &b](int x) mutable {
+ const auto identity = [](int y){ return y; };
+ for (auto i = 0; i < a; ++i)
+ a += b--;
+ return x + identity(a + b);
+ }(0);
+ return a + b + c + d + e;
+ }
+
+ int
+ test3()
+ {
+ const auto nullary = [](){ return 0; };
+ const auto unary = [](int x){ return x; };
+ using nullary_t = decltype(nullary);
+ using unary_t = decltype(unary);
+ const auto higher1st = [](nullary_t f){ return f(); };
+ const auto higher2nd = [unary](nullary_t f1){
+ return [unary, f1](unary_t f2){ return f2(unary(f1())); };
+ };
+ return higher1st(nullary) + higher2nd(nullary)(unary);
+ }
+
+ }
+
+ namespace test_variadic_templates
+ {
+
+ template <int...>
+ struct sum;
+
+ template <int N0, int... N1toN>
+ struct sum<N0, N1toN...>
+ {
+ static constexpr auto value = N0 + sum<N1toN...>::value;
+ };
+
+ template <>
+ struct sum<>
+ {
+ static constexpr auto value = 0;
+ };
+
+ static_assert(sum<>::value == 0, "");
+ static_assert(sum<1>::value == 1, "");
+ static_assert(sum<23>::value == 23, "");
+ static_assert(sum<1, 2>::value == 3, "");
+ static_assert(sum<5, 5, 11>::value == 21, "");
+ static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, "");
+
+ }
+
+ // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
+ // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function
+ // because of this.
+ namespace test_template_alias_sfinae
+ {
+
+ struct foo {};
+
+ template<typename T>
+ using member = typename T::member_type;
+
+ template<typename T>
+ void func(...) {}
+
+ template<typename T>
+ void func(member<T>*) {}
+
+ void test();
+
+ void test() { func<foo>(0); }
+
+ }
+
+} // namespace cxx11
+
+#endif // __cplusplus >= 201103L
+
+
+
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+ eval $cachevar=yes
+else
+ eval $cachevar=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CXXFLAGS="$ac_save_CXXFLAGS"
+fi
+eval ac_res=\$$cachevar
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ if eval test x\$$cachevar = xyes; then
+ CXXFLAGS="$CXXFLAGS $switch"
+ ac_success=yes
+ break
+ fi
+ done
+ fi
+
+ if test x$ac_success = xno; then
+ for switch in -std=c++11 -std=c++0x +std=c++11 "-h std=c++11"; do
+ cachevar=`$as_echo "ax_cv_cxx_compile_cxx11_$switch" | $as_tr_sh`
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features with $switch" >&5
+$as_echo_n "checking whether $CXX supports C++11 features with $switch... " >&6; }
+if eval \${$cachevar+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_save_CXXFLAGS="$CXXFLAGS"
+ CXXFLAGS="$CXXFLAGS $switch"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+
+// If the compiler admits that it is not ready for C++11, why torture it?
+// Hopefully, this will speed up the test.
+
+#ifndef __cplusplus
+
+#error "This is not a C++ compiler"
+
+#elif __cplusplus < 201103L
+
+#error "This is not a C++11 compiler"
+
+#else
+
+namespace cxx11
+{
+
+ namespace test_static_assert
+ {
+
+ template <typename T>
+ struct check
+ {
+ static_assert(sizeof(int) <= sizeof(T), "not big enough");
+ };
+
+ }
+
+ namespace test_final_override
+ {
+
+ struct Base
+ {
+ virtual void f() {}
+ };
+
+ struct Derived : public Base
+ {
+ virtual void f() override {}
+ };
+
+ }
+
+ namespace test_double_right_angle_brackets
+ {
+
+ template < typename T >
+ struct check {};
+
+ typedef check<void> single_type;
+ typedef check<check<void>> double_type;
+ typedef check<check<check<void>>> triple_type;
+ typedef check<check<check<check<void>>>> quadruple_type;
+
+ }
+
+ namespace test_decltype
+ {
+
+ int
+ f()
+ {
+ int a = 1;
+ decltype(a) b = 2;
+ return a + b;
+ }
+
+ }
+
+ namespace test_type_deduction
+ {
+
+ template < typename T1, typename T2 >
+ struct is_same
+ {
+ static const bool value = false;
+ };
+
+ template < typename T >
+ struct is_same<T, T>
+ {
+ static const bool value = true;
+ };
+
+ template < typename T1, typename T2 >
+ auto
+ add(T1 a1, T2 a2) -> decltype(a1 + a2)
+ {
+ return a1 + a2;
+ }
+
+ int
+ test(const int c, volatile int v)
+ {
+ static_assert(is_same<int, decltype(0)>::value == true, "");
+ static_assert(is_same<int, decltype(c)>::value == false, "");
+ static_assert(is_same<int, decltype(v)>::value == false, "");
+ auto ac = c;
+ auto av = v;
+ auto sumi = ac + av + 'x';
+ auto sumf = ac + av + 1.0;
+ static_assert(is_same<int, decltype(ac)>::value == true, "");
+ static_assert(is_same<int, decltype(av)>::value == true, "");
+ static_assert(is_same<int, decltype(sumi)>::value == true, "");
+ static_assert(is_same<int, decltype(sumf)>::value == false, "");
+ static_assert(is_same<int, decltype(add(c, v))>::value == true, "");
+ return (sumf > 0.0) ? sumi : add(c, v);
+ }
+
+ }
+
+ namespace test_noexcept
+ {
+
+ int f() { return 0; }
+ int g() noexcept { return 0; }
+
+ static_assert(noexcept(f()) == false, "");
+ static_assert(noexcept(g()) == true, "");
+
+ }
+
+ namespace test_constexpr
+ {
+
+ template < typename CharT >
+ unsigned long constexpr
+ strlen_c_r(const CharT *const s, const unsigned long acc) noexcept
+ {
+ return *s ? strlen_c_r(s + 1, acc + 1) : acc;
+ }
+
+ template < typename CharT >
+ unsigned long constexpr
+ strlen_c(const CharT *const s) noexcept
+ {
+ return strlen_c_r(s, 0UL);
+ }
+
+ static_assert(strlen_c("") == 0UL, "");
+ static_assert(strlen_c("1") == 1UL, "");
+ static_assert(strlen_c("example") == 7UL, "");
+ static_assert(strlen_c("another\0example") == 7UL, "");
+
+ }
+
+ namespace test_rvalue_references
+ {
+
+ template < int N >
+ struct answer
+ {
+ static constexpr int value = N;
+ };
+
+ answer<1> f(int&) { return answer<1>(); }
+ answer<2> f(const int&) { return answer<2>(); }
+ answer<3> f(int&&) { return answer<3>(); }
+
+ void
+ test()
+ {
+ int i = 0;
+ const int c = 0;
+ static_assert(decltype(f(i))::value == 1, "");
+ static_assert(decltype(f(c))::value == 2, "");
+ static_assert(decltype(f(0))::value == 3, "");
+ }
+
+ }
+
+ namespace test_uniform_initialization
+ {
+
+ struct test
+ {
+ static const int zero {};
+ static const int one {1};
+ };
+
+ static_assert(test::zero == 0, "");
+ static_assert(test::one == 1, "");
+
+ }
+
+ namespace test_lambdas
+ {
+
+ void
+ test1()
+ {
+ auto lambda1 = [](){};
+ auto lambda2 = lambda1;
+ lambda1();
+ lambda2();
+ }
+
+ int
+ test2()
+ {
+ auto a = [](int i, int j){ return i + j; }(1, 2);
+ auto b = []() -> int { return '0'; }();
+ auto c = [=](){ return a + b; }();
+ auto d = [&](){ return c; }();
+ auto e = [a, &b](int x) mutable {
+ const auto identity = [](int y){ return y; };
+ for (auto i = 0; i < a; ++i)
+ a += b--;
+ return x + identity(a + b);
+ }(0);
+ return a + b + c + d + e;
+ }
+
+ int
+ test3()
+ {
+ const auto nullary = [](){ return 0; };
+ const auto unary = [](int x){ return x; };
+ using nullary_t = decltype(nullary);
+ using unary_t = decltype(unary);
+ const auto higher1st = [](nullary_t f){ return f(); };
+ const auto higher2nd = [unary](nullary_t f1){
+ return [unary, f1](unary_t f2){ return f2(unary(f1())); };
+ };
+ return higher1st(nullary) + higher2nd(nullary)(unary);
+ }
+
+ }
+
+ namespace test_variadic_templates
+ {
+
+ template <int...>
+ struct sum;
+
+ template <int N0, int... N1toN>
+ struct sum<N0, N1toN...>
+ {
+ static constexpr auto value = N0 + sum<N1toN...>::value;
+ };
+
+ template <>
+ struct sum<>
+ {
+ static constexpr auto value = 0;
+ };
+
+ static_assert(sum<>::value == 0, "");
+ static_assert(sum<1>::value == 1, "");
+ static_assert(sum<23>::value == 23, "");
+ static_assert(sum<1, 2>::value == 3, "");
+ static_assert(sum<5, 5, 11>::value == 21, "");
+ static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, "");
+
+ }
+
+ // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
+ // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function
+ // because of this.
+ namespace test_template_alias_sfinae
+ {
+
+ struct foo {};
+
+ template<typename T>
+ using member = typename T::member_type;
+
+ template<typename T>
+ void func(...) {}
+
+ template<typename T>
+ void func(member<T>*) {}
+
+ void test();
+
+ void test() { func<foo>(0); }
+
+ }
+
+} // namespace cxx11
+
+#endif // __cplusplus >= 201103L
+
+
- ;
- return 0;
-}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
- ac_cv_prog_cxx_g=yes
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ eval $cachevar=yes
+else
+ eval $cachevar=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
- ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+ CXXFLAGS="$ac_save_CXXFLAGS"
fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
-$as_echo "$ac_cv_prog_cxx_g" >&6; }
-if test "$ac_test_CXXFLAGS" = set; then
- CXXFLAGS=$ac_save_CXXFLAGS
-elif test $ac_cv_prog_cxx_g = yes; then
- if test "$GXX" = yes; then
- CXXFLAGS="-g -O2"
- else
- CXXFLAGS="-g"
- fi
-else
- if test "$GXX" = yes; then
- CXXFLAGS="-O2"
- else
- CXXFLAGS=
+eval ac_res=\$$cachevar
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ if eval test x\$$cachevar = xyes; then
+ CXXFLAGS="$CXXFLAGS $switch"
+ ac_success=yes
+ break
+ fi
+ done
fi
-fi
-ac_ext=c
+ ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
-depcc="$CXX" am_compiler_list=
-
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
-$as_echo_n "checking dependency style of $depcc... " >&6; }
-if ${am_cv_CXX_dependencies_compiler_type+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
- # We make a subdir and do the tests there. Otherwise we can end up
- # making bogus files that we don't know about and never remove. For
- # instance it was reported that on HP-UX the gcc test will end up
- # making a dummy file named 'D' -- because '-MD' means "put the output
- # in D".
- rm -rf conftest.dir
- mkdir conftest.dir
- # Copy depcomp to subdir because otherwise we won't find it if we're
- # using a relative directory.
- cp "$am_depcomp" conftest.dir
- cd conftest.dir
- # We will build objects and dependencies in a subdirectory because
- # it helps to detect inapplicable dependency modes. For instance
- # both Tru64's cc and ICC support -MD to output dependencies as a
- # side effect of compilation, but ICC will put the dependencies in
- # the current directory while Tru64 will put them in the object
- # directory.
- mkdir sub
-
- am_cv_CXX_dependencies_compiler_type=none
- if test "$am_compiler_list" = ""; then
- am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
- fi
- am__universal=false
- case " $depcc " in #(
- *\ -arch\ *\ -arch\ *) am__universal=true ;;
- esac
-
- for depmode in $am_compiler_list; do
- # Setup a source with many dependencies, because some compilers
- # like to wrap large dependency lists on column 80 (with \), and
- # we should not choose a depcomp mode which is confused by this.
- #
- # We need to recreate these files for each test, as the compiler may
- # overwrite some of them when testing with obscure command lines.
- # This happens at least with the AIX C compiler.
- : > sub/conftest.c
- for i in 1 2 3 4 5 6; do
- echo '#include "conftst'$i'.h"' >> sub/conftest.c
- # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
- # Solaris 10 /bin/sh.
- echo '/* dummy */' > sub/conftst$i.h
- done
- echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
- # We check with '-c' and '-o' for the sake of the "dashmstdout"
- # mode. It turns out that the SunPro C++ compiler does not properly
- # handle '-M -o', and we need to detect this. Also, some Intel
- # versions had trouble with output in subdirs.
- am__obj=sub/conftest.${OBJEXT-o}
- am__minus_obj="-o $am__obj"
- case $depmode in
- gcc)
- # This depmode causes a compiler race in universal mode.
- test "$am__universal" = false || continue
- ;;
- nosideeffect)
- # After this tag, mechanisms are not by side-effect, so they'll
- # only be used when explicitly requested.
- if test "x$enable_dependency_tracking" = xyes; then
- continue
- else
- break
- fi
- ;;
- msvc7 | msvc7msys | msvisualcpp | msvcmsys)
- # This compiler won't grok '-c -o', but also, the minuso test has
- # not run yet. These depmodes are late enough in the game, and
- # so weak that their functioning should not be impacted.
- am__obj=conftest.${OBJEXT-o}
- am__minus_obj=
- ;;
- none) break ;;
- esac
- if depmode=$depmode \
- source=sub/conftest.c object=$am__obj \
- depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
- $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
- >/dev/null 2>conftest.err &&
- grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
- grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
- grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
- ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
- # icc doesn't choke on unknown options, it will just issue warnings
- # or remarks (even with -Werror). So we grep stderr for any message
- # that says an option was ignored or not supported.
- # When given -MP, icc 7.0 and 7.1 complain thusly:
- # icc: Command line warning: ignoring option '-M'; no argument required
- # The diagnosis changed in icc 8.0:
- # icc: Command line remark: option '-MP' not supported
- if (grep 'ignoring option' conftest.err ||
- grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
- am_cv_CXX_dependencies_compiler_type=$depmode
- break
- fi
+ if test x$ax_cxx_compile_cxx11_required = xtrue; then
+ if test x$ac_success = xno; then
+ as_fn_error $? "*** A compiler with support for C++11 language features is required." "$LINENO" 5
fi
- done
+ else
+ if test x$ac_success = xno; then
+ HAVE_CXX11=0
+ { $as_echo "$as_me:${as_lineno-$LINENO}: No compiler with C++11 support was found" >&5
+$as_echo "$as_me: No compiler with C++11 support was found" >&6;}
+ else
+ HAVE_CXX11=1
- cd ..
- rm -rf conftest.dir
-else
- am_cv_CXX_dependencies_compiler_type=none
-fi
+$as_echo "#define HAVE_CXX11 1" >>confdefs.h
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
-$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
-CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+ fi
- if
- test "x$enable_dependency_tracking" != xno \
- && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
- am__fastdepCXX_TRUE=
- am__fastdepCXX_FALSE='#'
-else
- am__fastdepCXX_TRUE='#'
- am__fastdepCXX_FALSE=
-fi
+ fi
ac_ext=c
@@ -9220,6 +10024,42 @@ esac
#### Compiler flags ####
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -std=gnu11" >&5
+$as_echo_n "checking whether C compiler accepts -std=gnu11... " >&6; }
+if ${ax_cv_check_cflags__pedantic__Werror__std_gnu11+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+
+ ax_check_save_flags=$CFLAGS
+ CFLAGS="$CFLAGS -pedantic -Werror -std=gnu11"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ ax_cv_check_cflags__pedantic__Werror__std_gnu11=yes
+else
+ ax_cv_check_cflags__pedantic__Werror__std_gnu11=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ CFLAGS=$ax_check_save_flags
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__pedantic__Werror__std_gnu11" >&5
+$as_echo "$ax_cv_check_cflags__pedantic__Werror__std_gnu11" >&6; }
+if test "x$ax_cv_check_cflags__pedantic__Werror__std_gnu11" = x"yes"; then :
+ :
+else
+ as_fn_error $? "*** Compiler does not support -std=gnu11" "$LINENO" 5
+fi
+
+
for flag in -Wall -W -Wextra -pipe -Wno-long-long -Wno-overlength-strings -Wunsafe-loop-optimizations -Wundef -Wformat=2 -Wlogical-op -Wsign-compare -Wformat-security -Wmissing-include-dirs -Wformat-nonliteral -Wold-style-definition -Wpointer-arith -Winit-self -Wdeclaration-after-statement -Wfloat-equal -Wmissing-prototypes -Wstrict-prototypes -Wredundant-decls -Wmissing-declarations -Wmissing-noreturn -Wshadow -Wendif-labels -Wcast-align -Wstrict-aliasing -Wwrite-strings -Wno-unused-par [...]
as_CACHEVAR=`$as_echo "ax_cv_check_cflags_-pedantic -Werror_$flag" | $as_tr_sh`
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $flag" >&5
@@ -12904,7 +13744,6 @@ done
-
func_stripname_cnf ()
{
case ${2} in
@@ -22519,29 +23358,14 @@ fi
if test "x$os_is_darwin" = "x1" ; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking looking for Apple CoreService Framework" >&5
$as_echo_n "checking looking for Apple CoreService Framework... " >&6; }
- # How do I check a framework "library" - AC_CHECK_LIB prob. won't work??, just assign LIBS & hope
- ac_fn_c_check_header_mongrel "$LINENO" "/Developer/Headers/FlatCarbon/CoreServices.h" "ac_cv_header__Developer_Headers_FlatCarbon_CoreServices_h" "$ac_includes_default"
-if test "x$ac_cv_header__Developer_Headers_FlatCarbon_CoreServices_h" = xyes; then :
+ ac_fn_c_check_header_mongrel "$LINENO" "CoreServices/CoreServices.h" "ac_cv_header_CoreServices_CoreServices_h" "$ac_includes_default"
+if test "x$ac_cv_header_CoreServices_CoreServices_h" = xyes; then :
LIBS="$LIBS -framework CoreServices"
else
- for ac_header in /System/Library/Frameworks/CoreServices.framework/Headers/CoreServices.h
-do :
- ac_fn_c_check_header_mongrel "$LINENO" "/System/Library/Frameworks/CoreServices.framework/Headers/CoreServices.h" "ac_cv_header__System_Library_Frameworks_CoreServices_framework_Headers_CoreServices_h" "$ac_includes_default"
-if test "x$ac_cv_header__System_Library_Frameworks_CoreServices_framework_Headers_CoreServices_h" = xyes; then :
- cat >>confdefs.h <<_ACEOF
-#define HAVE__SYSTEM_LIBRARY_FRAMEWORKS_CORESERVICES_FRAMEWORK_HEADERS_CORESERVICES_H 1
-_ACEOF
- LIBS="$LIBS -framework CoreServices"
-else
as_fn_error $? "CoreServices.h header file not found" "$LINENO" 5
fi
-done
-
-
-fi
-
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
@@ -23972,6 +24796,47 @@ _ACEOF
fi
+#### Linux memfd_create(2) SHM support ####
+
+# Check whether --enable-memfd was given.
+if test "${enable_memfd+set}" = set; then :
+ enableval=$enable_memfd;
+fi
+
+
+if test "x$enable_memfd" != "xno"; then :
+ ac_fn_c_check_decl "$LINENO" "SYS_memfd_create" "ac_cv_have_decl_SYS_memfd_create" "#include <sys/syscall.h>
+"
+if test "x$ac_cv_have_decl_SYS_memfd_create" = xyes; then :
+ HAVE_MEMFD=1
+else
+ HAVE_MEMFD=0
+fi
+
+else
+ HAVE_MEMFD=0
+fi
+
+if test "x$enable_memfd" = "xyes" && test "x$HAVE_MEMFD" = "x0"; then :
+ as_fn_error $? "*** Your Linux kernel does not support memfd shared memory.
+ *** Use linux v3.17 or higher for such a feature." "$LINENO" 5
+fi
+
+
+ if test "x$HAVE_MEMFD" = x1; then
+ HAVE_MEMFD_TRUE=
+ HAVE_MEMFD_FALSE='#'
+else
+ HAVE_MEMFD_TRUE='#'
+ HAVE_MEMFD_FALSE=
+fi
+
+if test "x$HAVE_MEMFD" = "x1"; then :
+
+$as_echo "#define HAVE_MEMFD 1" >>confdefs.h
+
+fi
+
#### X11 (optional) ####
# Check whether --enable-x11 was given.
@@ -24913,6 +25778,46 @@ $as_echo "#define HAVE_OSS_WRAPPER 1" >>confdefs.h
fi
+# Some platforms like SunOS (Illumos) may ship without SOUND_PCM_* functionality
+if test "x$HAVE_OSS" = "x1"; then
+ ac_fn_c_check_decl "$LINENO" "SOUND_PCM_READ_RATE" "ac_cv_have_decl_SOUND_PCM_READ_RATE" "#include <sys/soundcard.h>
+"
+if test "x$ac_cv_have_decl_SOUND_PCM_READ_RATE" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_SOUND_PCM_READ_RATE $ac_have_decl
+_ACEOF
+
+ ac_fn_c_check_decl "$LINENO" "SOUND_PCM_READ_CHANNELS" "ac_cv_have_decl_SOUND_PCM_READ_CHANNELS" "#include <sys/soundcard.h>
+"
+if test "x$ac_cv_have_decl_SOUND_PCM_READ_CHANNELS" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_SOUND_PCM_READ_CHANNELS $ac_have_decl
+_ACEOF
+
+ ac_fn_c_check_decl "$LINENO" "SOUND_PCM_READ_BITS" "ac_cv_have_decl_SOUND_PCM_READ_BITS" "#include <sys/soundcard.h>
+"
+if test "x$ac_cv_have_decl_SOUND_PCM_READ_BITS" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_SOUND_PCM_READ_BITS $ac_have_decl
+_ACEOF
+
+fi
+
#### CoreAudio support (optional) ####
# Check whether --enable-coreaudio-output was given.
@@ -27910,14 +28815,17 @@ fi
# Check whether --with-mac-sysroot was given.
if test "${with_mac_sysroot+set}" = set; then :
withval=$with_mac_sysroot; mac_sysroot=$withval
-else
- mac_sysroot="/Developer/SDKs/MacOSX10.5.sdk"
fi
if test "x$os_is_darwin" = "x1" ; then
- LDFLAGS="$LDFLAGS -isysroot $mac_sysroot -mmacosx-version-min=$mac_version_min"
- CFLAGS="$CFLAGS -isysroot $mac_sysroot -mmacosx-version-min=$mac_version_min"
+ LDFLAGS="$LDFLAGS -mmacosx-version-min=$mac_version_min"
+ CFLAGS="$CFLAGS -mmacosx-version-min=$mac_version_min"
+
+ if test "x$mac_sysroot" != "x" ; then
+ LDFLAGS="$LDFLAGS -isysroot $mac_sysroot"
+ CFLAGS="$CFLAGS -isysroot $mac_sysroot"
+ fi
if test "x$enable_mac_universal" = "xyes" ; then
mac_arches="-arch i386 -arch x86_64"
@@ -27942,12 +28850,12 @@ if test -n "$WEBRTC_CFLAGS"; then
pkg_cv_WEBRTC_CFLAGS="$WEBRTC_CFLAGS"
elif test -n "$PKG_CONFIG"; then
if test -n "$PKG_CONFIG" && \
- { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \" webrtc-audio-processing \""; } >&5
- ($PKG_CONFIG --exists --print-errors " webrtc-audio-processing ") 2>&5
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \" webrtc-audio-processing >= 0.2 \""; } >&5
+ ($PKG_CONFIG --exists --print-errors " webrtc-audio-processing >= 0.2 ") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
- pkg_cv_WEBRTC_CFLAGS=`$PKG_CONFIG --cflags " webrtc-audio-processing " 2>/dev/null`
+ pkg_cv_WEBRTC_CFLAGS=`$PKG_CONFIG --cflags " webrtc-audio-processing >= 0.2 " 2>/dev/null`
test "x$?" != "x0" && pkg_failed=yes
else
pkg_failed=yes
@@ -27959,12 +28867,12 @@ if test -n "$WEBRTC_LIBS"; then
pkg_cv_WEBRTC_LIBS="$WEBRTC_LIBS"
elif test -n "$PKG_CONFIG"; then
if test -n "$PKG_CONFIG" && \
- { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \" webrtc-audio-processing \""; } >&5
- ($PKG_CONFIG --exists --print-errors " webrtc-audio-processing ") 2>&5
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \" webrtc-audio-processing >= 0.2 \""; } >&5
+ ($PKG_CONFIG --exists --print-errors " webrtc-audio-processing >= 0.2 ") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
- pkg_cv_WEBRTC_LIBS=`$PKG_CONFIG --libs " webrtc-audio-processing " 2>/dev/null`
+ pkg_cv_WEBRTC_LIBS=`$PKG_CONFIG --libs " webrtc-audio-processing >= 0.2 " 2>/dev/null`
test "x$?" != "x0" && pkg_failed=yes
else
pkg_failed=yes
@@ -27985,9 +28893,9 @@ else
_pkg_short_errors_supported=no
fi
if test $_pkg_short_errors_supported = yes; then
- WEBRTC_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs " webrtc-audio-processing " 2>&1`
+ WEBRTC_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs " webrtc-audio-processing >= 0.2 " 2>&1`
else
- WEBRTC_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs " webrtc-audio-processing " 2>&1`
+ WEBRTC_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs " webrtc-audio-processing >= 0.2 " 2>&1`
fi
# Put the nasty error message in config.log where it belongs
echo "$WEBRTC_PKG_ERRORS" >&5
@@ -28447,6 +29355,10 @@ if test -z "${HAVE_REGEX_TRUE}" && test -z "${HAVE_REGEX_FALSE}"; then
as_fn_error $? "conditional \"HAVE_REGEX\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
+if test -z "${HAVE_MEMFD_TRUE}" && test -z "${HAVE_MEMFD_FALSE}"; then
+ as_fn_error $? "conditional \"HAVE_MEMFD\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
if test -z "${HAVE_X11_TRUE}" && test -z "${HAVE_X11_FALSE}"; then
as_fn_error $? "conditional \"HAVE_X11\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -29028,7 +29940,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 8.0, which was
+This file was extended by pulseaudio $as_me 8.99.1, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -29095,7 +30007,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 8.0
+pulseaudio config.status 8.99.1
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
@@ -31313,6 +32225,11 @@ fi
# ==========================================================================
+if test "x$HAVE_MEMFD" = "x1"; then :
+ ENABLE_MEMFD=yes
+else
+ ENABLE_MEMFD=no
+fi
if test "x$HAVE_X11" = "x1"; then :
ENABLE_X11=yes
else
@@ -31546,6 +32463,7 @@ echo "
CPPFLAGS: ${CPPFLAGS}
LIBS: ${LIBS}
+ Enable memfd shared memory: ${ENABLE_MEMFD}
Enable X11: ${ENABLE_X11}
Enable OSS Output: ${ENABLE_OSS_OUTPUT}
Enable OSS Wrapper: ${ENABLE_OSS_WRAPPER}
diff --git a/configure.ac b/configure.ac
index 9250c05..4edc8e0 100644
--- a/configure.ac
+++ b/configure.ac
@@ -40,11 +40,11 @@ AC_SUBST(PA_MINOR, pa_minor)
AC_SUBST(PA_MAJORMINOR, pa_major.pa_minor)
AC_SUBST(PA_API_VERSION, 12)
-AC_SUBST(PA_PROTOCOL_VERSION, 30)
+AC_SUBST(PA_PROTOCOL_VERSION, 31)
# The stable ABI for client applications, for the version info x:y:z
# always will hold y=z
-AC_SUBST(LIBPULSE_VERSION_INFO, [19:0:19])
+AC_SUBST(LIBPULSE_VERSION_INFO, [20:0:20])
# A simplified, synchronous, ABI-stable interface for client
# applications, for the version info x:y:z always will hold y=z
@@ -80,11 +80,11 @@ AC_PROG_LN_S
# CC
AC_PROG_CC
-AC_PROG_CC_C99
AM_PROG_CC_C_O
# Only required if you want the WebRTC canceller -- no runtime dep on
# libstdc++ otherwise
AC_PROG_CXX
+AX_CXX_COMPILE_STDCXX_11
AC_PROG_GCC_TRADITIONAL
AC_USE_SYSTEM_EXTENSIONS
@@ -176,6 +176,11 @@ esac
#### Compiler flags ####
+AX_CHECK_COMPILE_FLAG([-std=gnu11],
+ [],
+ [AC_MSG_ERROR([*** Compiler does not support -std=gnu11])],
+ [-pedantic -Werror])
+
AX_APPEND_COMPILE_FLAGS(
[-Wall -W -Wextra -pipe -Wno-long-long -Wno-overlength-strings -Wunsafe-loop-optimizations -Wundef -Wformat=2 -Wlogical-op -Wsign-compare -Wformat-security -Wmissing-include-dirs -Wformat-nonliteral -Wold-style-definition -Wpointer-arith -Winit-self -Wdeclaration-after-statement -Wfloat-equal -Wmissing-prototypes -Wstrict-prototypes -Wredundant-decls -Wmissing-declarations -Wmissing-noreturn -Wshadow -Wendif-labels -Wcast-align -Wstrict-aliasing -Wwrite-strings -Wno-unused-parameter [...]
[], [-pedantic -Werror])
@@ -533,13 +538,9 @@ AC_SEARCH_LIBS([backtrace], [execinfo ubacktrace])
# Darwin/OS X
if test "x$os_is_darwin" = "x1" ; then
AC_MSG_CHECKING([looking for Apple CoreService Framework])
- # How do I check a framework "library" - AC_CHECK_LIB prob. won't work??, just assign LIBS & hope
- AC_CHECK_HEADER([/Developer/Headers/FlatCarbon/CoreServices.h],
+ AC_CHECK_HEADER([CoreServices/CoreServices.h],
[LIBS="$LIBS -framework CoreServices"],
- [AC_CHECK_HEADERS([/System/Library/Frameworks/CoreServices.framework/Headers/CoreServices.h],
- [LIBS="$LIBS -framework CoreServices"],
- [AC_MSG_ERROR([CoreServices.h header file not found])]
- )]
+ [AC_MSG_ERROR([CoreServices.h header file not found])]
)
AC_MSG_RESULT([ok])
@@ -607,6 +608,23 @@ AC_DEFINE(HAVE_DLADDR, [1], [Have dladdr?])
AM_ICONV
+#### Linux memfd_create(2) SHM support ####
+
+AC_ARG_ENABLE([memfd],
+ AS_HELP_STRING([--disable-memfd], [Disable Linux memfd shared memory]))
+
+AS_IF([test "x$enable_memfd" != "xno"],
+ AC_CHECK_DECL(SYS_memfd_create, [HAVE_MEMFD=1], [HAVE_MEMFD=0], [#include <sys/syscall.h>]),
+ [HAVE_MEMFD=0])
+
+AS_IF([test "x$enable_memfd" = "xyes" && test "x$HAVE_MEMFD" = "x0"],
+ [AC_MSG_ERROR([*** Your Linux kernel does not support memfd shared memory.
+ *** Use linux v3.17 or higher for such a feature.])])
+
+AC_SUBST(HAVE_MEMFD)
+AM_CONDITIONAL([HAVE_MEMFD], [test "x$HAVE_MEMFD" = x1])
+AS_IF([test "x$HAVE_MEMFD" = "x1"], AC_DEFINE([HAVE_MEMFD], 1, [Have memfd shared memory.]))
+
#### X11 (optional) ####
AC_ARG_ENABLE([x11],
@@ -780,6 +798,13 @@ AM_CONDITIONAL([HAVE_OSS_WRAPPER], [test "x$HAVE_OSS_WRAPPER" = "x1"])
AS_IF([test "x$HAVE_OSS_OUTPUT" = "x1"], AC_DEFINE([HAVE_OSS_OUTPUT], 1, [Have OSS output?]))
AS_IF([test "x$HAVE_OSS_WRAPPER" = "x1"], AC_DEFINE([HAVE_OSS_WRAPPER], 1, [Have OSS wrapper (padsp)?]))
+# Some platforms like SunOS (Illumos) may ship without SOUND_PCM_* functionality
+if test "x$HAVE_OSS" = "x1"; then
+ AC_CHECK_DECLS([SOUND_PCM_READ_RATE], [], [], [[#include <sys/soundcard.h>]])
+ AC_CHECK_DECLS([SOUND_PCM_READ_CHANNELS], [], [], [[#include <sys/soundcard.h>]])
+ AC_CHECK_DECLS([SOUND_PCM_READ_BITS], [], [], [[#include <sys/soundcard.h>]])
+fi
+
#### CoreAudio support (optional) ####
AC_ARG_ENABLE([coreaudio-output],
@@ -1368,11 +1393,16 @@ AC_ARG_WITH(mac-version-min,
AC_ARG_WITH(mac-sysroot,
AS_HELP_STRING([--with-mac-sysroot=<path>], [SDK basedir to use as the logical root directory for headers and libraries.]),
- mac_sysroot=$withval, mac_sysroot="/Developer/SDKs/MacOSX10.5.sdk")
+ mac_sysroot=$withval)
if test "x$os_is_darwin" = "x1" ; then
- LDFLAGS="$LDFLAGS -isysroot $mac_sysroot -mmacosx-version-min=$mac_version_min"
- CFLAGS="$CFLAGS -isysroot $mac_sysroot -mmacosx-version-min=$mac_version_min"
+ LDFLAGS="$LDFLAGS -mmacosx-version-min=$mac_version_min"
+ CFLAGS="$CFLAGS -mmacosx-version-min=$mac_version_min"
+
+ if test "x$mac_sysroot" != "x" ; then
+ LDFLAGS="$LDFLAGS -isysroot $mac_sysroot"
+ CFLAGS="$CFLAGS -isysroot $mac_sysroot"
+ fi
if test "x$enable_mac_universal" = "xyes" ; then
mac_arches="-arch i386 -arch x86_64"
@@ -1385,7 +1415,7 @@ AC_ARG_ENABLE([webrtc-aec],
AS_HELP_STRING([--enable-webrtc-aec], [Enable the optional WebRTC-based echo canceller]))
AS_IF([test "x$enable_webrtc_aec" != "xno"],
- [PKG_CHECK_MODULES(WEBRTC, [ webrtc-audio-processing ], [HAVE_WEBRTC=1], [HAVE_WEBRTC=0])],
+ [PKG_CHECK_MODULES(WEBRTC, [ webrtc-audio-processing >= 0.2 ], [HAVE_WEBRTC=1], [HAVE_WEBRTC=0])],
[HAVE_WEBRTC=0])
AS_IF([test "x$enable_webrtc_aec" = "xyes" && test "x$HAVE_WEBRTC" = "x0"],
@@ -1532,6 +1562,7 @@ AC_OUTPUT
# ==========================================================================
+AS_IF([test "x$HAVE_MEMFD" = "x1"], ENABLE_MEMFD=yes, ENABLE_MEMFD=no)
AS_IF([test "x$HAVE_X11" = "x1"], ENABLE_X11=yes, ENABLE_X11=no)
AS_IF([test "x$HAVE_OSS_OUTPUT" = "x1"], ENABLE_OSS_OUTPUT=yes, ENABLE_OSS_OUTPUT=no)
AS_IF([test "x$HAVE_OSS_WRAPPER" = "x1"], ENABLE_OSS_WRAPPER=yes, ENABLE_OSS_WRAPPER=no)
@@ -1593,6 +1624,7 @@ echo "
CPPFLAGS: ${CPPFLAGS}
LIBS: ${LIBS}
+ Enable memfd shared memory: ${ENABLE_MEMFD}
Enable X11: ${ENABLE_X11}
Enable OSS Output: ${ENABLE_OSS_OUTPUT}
Enable OSS Wrapper: ${ENABLE_OSS_WRAPPER}
diff --git a/doxygen/Makefile.in b/doxygen/Makefile.in
index f92ae05..e51d317 100644
--- a/doxygen/Makefile.in
+++ b/doxygen/Makefile.in
@@ -107,6 +107,8 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/acx_libwrap.m4 \
$(top_srcdir)/m4/ax_check_define.m4 \
$(top_srcdir)/m4/ax_check_flag.m4 \
+ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \
$(top_srcdir)/m4/ax_define_dir.m4 \
$(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/ax_tls.m4 \
$(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \
@@ -213,8 +215,10 @@ HAVE_BLUEZ_5 = @HAVE_BLUEZ_5@
HAVE_BLUEZ_5_NATIVE_HEADSET = @HAVE_BLUEZ_5_NATIVE_HEADSET@
HAVE_BLUEZ_5_OFONO_HEADSET = @HAVE_BLUEZ_5_OFONO_HEADSET@
HAVE_COREAUDIO = @HAVE_COREAUDIO@
+HAVE_CXX11 = @HAVE_CXX11@
HAVE_DBUS = @HAVE_DBUS@
HAVE_GLIB20 = @HAVE_GLIB20@
+HAVE_MEMFD = @HAVE_MEMFD@
HAVE_MKFIFO = @HAVE_MKFIFO@
HAVE_NEON = @HAVE_NEON@
HAVE_OSS_OUTPUT = @HAVE_OSS_OUTPUT@
diff --git a/m4/ax_cxx_compile_stdcxx.m4 b/m4/ax_cxx_compile_stdcxx.m4
new file mode 100644
index 0000000..079e17d
--- /dev/null
+++ b/m4/ax_cxx_compile_stdcxx.m4
@@ -0,0 +1,558 @@
+# ===========================================================================
+# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional])
+#
+# DESCRIPTION
+#
+# Check for baseline language coverage in the compiler for the specified
+# version of the C++ standard. If necessary, add switches to CXXFLAGS to
+# enable support. VERSION may be '11' (for the C++11 standard) or '14'
+# (for the C++14 standard).
+#
+# The second argument, if specified, indicates whether you insist on an
+# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
+# -std=c++11). If neither is specified, you get whatever works, with
+# preference for an extended mode.
+#
+# The third argument, if specified 'mandatory' or if left unspecified,
+# indicates that baseline support for the specified C++ standard is
+# required and that the macro should error out if no mode with that
+# support is found. If specified 'optional', then configuration proceeds
+# regardless, after defining HAVE_CXX${VERSION} if and only if a
+# supporting mode is found.
+#
+# LICENSE
+#
+# Copyright (c) 2008 Benjamin Kosnik <bkoz at redhat.com>
+# Copyright (c) 2012 Zack Weinberg <zackw at panix.com>
+# Copyright (c) 2013 Roy Stogner <roystgnr at ices.utexas.edu>
+# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <sokolov at google.com>
+# Copyright (c) 2015 Paul Norman <penorman at mac.com>
+# Copyright (c) 2015 Moritz Klammler <moritz at klammler.eu>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice
+# and this notice are preserved. This file is offered as-is, without any
+# warranty.
+
+#serial 1
+
+dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro
+dnl (serial version number 13).
+
+AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl
+ m4_if([$1], [11], [],
+ [$1], [14], [],
+ [$1], [17], [m4_fatal([support for C++17 not yet implemented in AX_CXX_COMPILE_STDCXX])],
+ [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl
+ m4_if([$2], [], [],
+ [$2], [ext], [],
+ [$2], [noext], [],
+ [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl
+ m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true],
+ [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true],
+ [$3], [optional], [ax_cxx_compile_cxx$1_required=false],
+ [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])])
+ AC_LANG_PUSH([C++])dnl
+ ac_success=no
+ AC_CACHE_CHECK(whether $CXX supports C++$1 features by default,
+ ax_cv_cxx_compile_cxx$1,
+ [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
+ [ax_cv_cxx_compile_cxx$1=yes],
+ [ax_cv_cxx_compile_cxx$1=no])])
+ if test x$ax_cv_cxx_compile_cxx$1 = xyes; then
+ ac_success=yes
+ fi
+
+ m4_if([$2], [noext], [], [dnl
+ if test x$ac_success = xno; then
+ for switch in -std=gnu++$1 -std=gnu++0x; do
+ cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
+ AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
+ $cachevar,
+ [ac_save_CXXFLAGS="$CXXFLAGS"
+ CXXFLAGS="$CXXFLAGS $switch"
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
+ [eval $cachevar=yes],
+ [eval $cachevar=no])
+ CXXFLAGS="$ac_save_CXXFLAGS"])
+ if eval test x\$$cachevar = xyes; then
+ CXXFLAGS="$CXXFLAGS $switch"
+ ac_success=yes
+ break
+ fi
+ done
+ fi])
+
+ m4_if([$2], [ext], [], [dnl
+ if test x$ac_success = xno; then
+ dnl HP's aCC needs +std=c++11 according to:
+ dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf
+ dnl Cray's crayCC needs "-h std=c++11"
+ for switch in -std=c++$1 -std=c++0x +std=c++$1 "-h std=c++$1"; do
+ cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch])
+ AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch,
+ $cachevar,
+ [ac_save_CXXFLAGS="$CXXFLAGS"
+ CXXFLAGS="$CXXFLAGS $switch"
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])],
+ [eval $cachevar=yes],
+ [eval $cachevar=no])
+ CXXFLAGS="$ac_save_CXXFLAGS"])
+ if eval test x\$$cachevar = xyes; then
+ CXXFLAGS="$CXXFLAGS $switch"
+ ac_success=yes
+ break
+ fi
+ done
+ fi])
+ AC_LANG_POP([C++])
+ if test x$ax_cxx_compile_cxx$1_required = xtrue; then
+ if test x$ac_success = xno; then
+ AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.])
+ fi
+ else
+ if test x$ac_success = xno; then
+ HAVE_CXX$1=0
+ AC_MSG_NOTICE([No compiler with C++$1 support was found])
+ else
+ HAVE_CXX$1=1
+ AC_DEFINE(HAVE_CXX$1,1,
+ [define if the compiler supports basic C++$1 syntax])
+ fi
+
+ AC_SUBST(HAVE_CXX$1)
+ fi
+])
+
+
+dnl Test body for checking C++11 support
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11],
+ _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
+)
+
+
+dnl Test body for checking C++14 support
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14],
+ _AX_CXX_COMPILE_STDCXX_testbody_new_in_11
+ _AX_CXX_COMPILE_STDCXX_testbody_new_in_14
+)
+
+
+dnl Tests for new features in C++11
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[
+
+// If the compiler admits that it is not ready for C++11, why torture it?
+// Hopefully, this will speed up the test.
+
+#ifndef __cplusplus
+
+#error "This is not a C++ compiler"
+
+#elif __cplusplus < 201103L
+
+#error "This is not a C++11 compiler"
+
+#else
+
+namespace cxx11
+{
+
+ namespace test_static_assert
+ {
+
+ template <typename T>
+ struct check
+ {
+ static_assert(sizeof(int) <= sizeof(T), "not big enough");
+ };
+
+ }
+
+ namespace test_final_override
+ {
+
+ struct Base
+ {
+ virtual void f() {}
+ };
+
+ struct Derived : public Base
+ {
+ virtual void f() override {}
+ };
+
+ }
+
+ namespace test_double_right_angle_brackets
+ {
+
+ template < typename T >
+ struct check {};
+
+ typedef check<void> single_type;
+ typedef check<check<void>> double_type;
+ typedef check<check<check<void>>> triple_type;
+ typedef check<check<check<check<void>>>> quadruple_type;
+
+ }
+
+ namespace test_decltype
+ {
+
+ int
+ f()
+ {
+ int a = 1;
+ decltype(a) b = 2;
+ return a + b;
+ }
+
+ }
+
+ namespace test_type_deduction
+ {
+
+ template < typename T1, typename T2 >
+ struct is_same
+ {
+ static const bool value = false;
+ };
+
+ template < typename T >
+ struct is_same<T, T>
+ {
+ static const bool value = true;
+ };
+
+ template < typename T1, typename T2 >
+ auto
+ add(T1 a1, T2 a2) -> decltype(a1 + a2)
+ {
+ return a1 + a2;
+ }
+
+ int
+ test(const int c, volatile int v)
+ {
+ static_assert(is_same<int, decltype(0)>::value == true, "");
+ static_assert(is_same<int, decltype(c)>::value == false, "");
+ static_assert(is_same<int, decltype(v)>::value == false, "");
+ auto ac = c;
+ auto av = v;
+ auto sumi = ac + av + 'x';
+ auto sumf = ac + av + 1.0;
+ static_assert(is_same<int, decltype(ac)>::value == true, "");
+ static_assert(is_same<int, decltype(av)>::value == true, "");
+ static_assert(is_same<int, decltype(sumi)>::value == true, "");
+ static_assert(is_same<int, decltype(sumf)>::value == false, "");
+ static_assert(is_same<int, decltype(add(c, v))>::value == true, "");
+ return (sumf > 0.0) ? sumi : add(c, v);
+ }
+
+ }
+
+ namespace test_noexcept
+ {
+
+ int f() { return 0; }
+ int g() noexcept { return 0; }
+
+ static_assert(noexcept(f()) == false, "");
+ static_assert(noexcept(g()) == true, "");
+
+ }
+
+ namespace test_constexpr
+ {
+
+ template < typename CharT >
+ unsigned long constexpr
+ strlen_c_r(const CharT *const s, const unsigned long acc) noexcept
+ {
+ return *s ? strlen_c_r(s + 1, acc + 1) : acc;
+ }
+
+ template < typename CharT >
+ unsigned long constexpr
+ strlen_c(const CharT *const s) noexcept
+ {
+ return strlen_c_r(s, 0UL);
+ }
+
+ static_assert(strlen_c("") == 0UL, "");
+ static_assert(strlen_c("1") == 1UL, "");
+ static_assert(strlen_c("example") == 7UL, "");
+ static_assert(strlen_c("another\0example") == 7UL, "");
+
+ }
+
+ namespace test_rvalue_references
+ {
+
+ template < int N >
+ struct answer
+ {
+ static constexpr int value = N;
+ };
+
+ answer<1> f(int&) { return answer<1>(); }
+ answer<2> f(const int&) { return answer<2>(); }
+ answer<3> f(int&&) { return answer<3>(); }
+
+ void
+ test()
+ {
+ int i = 0;
+ const int c = 0;
+ static_assert(decltype(f(i))::value == 1, "");
+ static_assert(decltype(f(c))::value == 2, "");
+ static_assert(decltype(f(0))::value == 3, "");
+ }
+
+ }
+
+ namespace test_uniform_initialization
+ {
+
+ struct test
+ {
+ static const int zero {};
+ static const int one {1};
+ };
+
+ static_assert(test::zero == 0, "");
+ static_assert(test::one == 1, "");
+
+ }
+
+ namespace test_lambdas
+ {
+
+ void
+ test1()
+ {
+ auto lambda1 = [](){};
+ auto lambda2 = lambda1;
+ lambda1();
+ lambda2();
+ }
+
+ int
+ test2()
+ {
+ auto a = [](int i, int j){ return i + j; }(1, 2);
+ auto b = []() -> int { return '0'; }();
+ auto c = [=](){ return a + b; }();
+ auto d = [&](){ return c; }();
+ auto e = [a, &b](int x) mutable {
+ const auto identity = [](int y){ return y; };
+ for (auto i = 0; i < a; ++i)
+ a += b--;
+ return x + identity(a + b);
+ }(0);
+ return a + b + c + d + e;
+ }
+
+ int
+ test3()
+ {
+ const auto nullary = [](){ return 0; };
+ const auto unary = [](int x){ return x; };
+ using nullary_t = decltype(nullary);
+ using unary_t = decltype(unary);
+ const auto higher1st = [](nullary_t f){ return f(); };
+ const auto higher2nd = [unary](nullary_t f1){
+ return [unary, f1](unary_t f2){ return f2(unary(f1())); };
+ };
+ return higher1st(nullary) + higher2nd(nullary)(unary);
+ }
+
+ }
+
+ namespace test_variadic_templates
+ {
+
+ template <int...>
+ struct sum;
+
+ template <int N0, int... N1toN>
+ struct sum<N0, N1toN...>
+ {
+ static constexpr auto value = N0 + sum<N1toN...>::value;
+ };
+
+ template <>
+ struct sum<>
+ {
+ static constexpr auto value = 0;
+ };
+
+ static_assert(sum<>::value == 0, "");
+ static_assert(sum<1>::value == 1, "");
+ static_assert(sum<23>::value == 23, "");
+ static_assert(sum<1, 2>::value == 3, "");
+ static_assert(sum<5, 5, 11>::value == 21, "");
+ static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, "");
+
+ }
+
+ // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae
+ // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function
+ // because of this.
+ namespace test_template_alias_sfinae
+ {
+
+ struct foo {};
+
+ template<typename T>
+ using member = typename T::member_type;
+
+ template<typename T>
+ void func(...) {}
+
+ template<typename T>
+ void func(member<T>*) {}
+
+ void test();
+
+ void test() { func<foo>(0); }
+
+ }
+
+} // namespace cxx11
+
+#endif // __cplusplus >= 201103L
+
+]])
+
+
+dnl Tests for new features in C++14
+
+m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[
+
+// If the compiler admits that it is not ready for C++14, why torture it?
+// Hopefully, this will speed up the test.
+
+#ifndef __cplusplus
+
+#error "This is not a C++ compiler"
+
+#elif __cplusplus < 201402L
+
+#error "This is not a C++14 compiler"
+
+#else
+
+namespace cxx14
+{
+
+ namespace test_polymorphic_lambdas
+ {
+
+ int
+ test()
+ {
+ const auto lambda = [](auto&&... args){
+ const auto istiny = [](auto x){
+ return (sizeof(x) == 1UL) ? 1 : 0;
+ };
+ const int aretiny[] = { istiny(args)... };
+ return aretiny[0];
+ };
+ return lambda(1, 1L, 1.0f, '1');
+ }
+
+ }
+
+ namespace test_binary_literals
+ {
+
+ constexpr auto ivii = 0b0000000000101010;
+ static_assert(ivii == 42, "wrong value");
+
+ }
+
+ namespace test_generalized_constexpr
+ {
+
+ template < typename CharT >
+ constexpr unsigned long
+ strlen_c(const CharT *const s) noexcept
+ {
+ auto length = 0UL;
+ for (auto p = s; *p; ++p)
+ ++length;
+ return length;
+ }
+
+ static_assert(strlen_c("") == 0UL, "");
+ static_assert(strlen_c("x") == 1UL, "");
+ static_assert(strlen_c("test") == 4UL, "");
+ static_assert(strlen_c("another\0test") == 7UL, "");
+
+ }
+
+ namespace test_lambda_init_capture
+ {
+
+ int
+ test()
+ {
+ auto x = 0;
+ const auto lambda1 = [a = x](int b){ return a + b; };
+ const auto lambda2 = [a = lambda1(x)](){ return a; };
+ return lambda2();
+ }
+
+ }
+
+ namespace test_digit_seperators
+ {
+
+ constexpr auto ten_million = 100'000'000;
+ static_assert(ten_million == 100000000, "");
+
+ }
+
+ namespace test_return_type_deduction
+ {
+
+ auto f(int& x) { return x; }
+ decltype(auto) g(int& x) { return x; }
+
+ template < typename T1, typename T2 >
+ struct is_same
+ {
+ static constexpr auto value = false;
+ };
+
+ template < typename T >
+ struct is_same<T, T>
+ {
+ static constexpr auto value = true;
+ };
+
+ int
+ test()
+ {
+ auto x = 0;
+ static_assert(is_same<int, decltype(f(x))>::value, "");
+ static_assert(is_same<int&, decltype(g(x))>::value, "");
+ return x;
+ }
+
+ }
+
+} // namespace cxx14
+
+#endif // __cplusplus >= 201402L
+
+]])
diff --git a/m4/ax_cxx_compile_stdcxx_11.m4 b/m4/ax_cxx_compile_stdcxx_11.m4
new file mode 100644
index 0000000..09db383
--- /dev/null
+++ b/m4/ax_cxx_compile_stdcxx_11.m4
@@ -0,0 +1,39 @@
+# ============================================================================
+# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html
+# ============================================================================
+#
+# SYNOPSIS
+#
+# AX_CXX_COMPILE_STDCXX_11([ext|noext], [mandatory|optional])
+#
+# DESCRIPTION
+#
+# Check for baseline language coverage in the compiler for the C++11
+# standard; if necessary, add switches to CXXFLAGS to enable support.
+#
+# This macro is a convenience alias for calling the AX_CXX_COMPILE_STDCXX
+# macro with the version set to C++11. The two optional arguments are
+# forwarded literally as the second and third argument respectively.
+# Please see the documentation for the AX_CXX_COMPILE_STDCXX macro for
+# more information. If you want to use this macro, you also need to
+# download the ax_cxx_compile_stdcxx.m4 file.
+#
+# LICENSE
+#
+# Copyright (c) 2008 Benjamin Kosnik <bkoz at redhat.com>
+# Copyright (c) 2012 Zack Weinberg <zackw at panix.com>
+# Copyright (c) 2013 Roy Stogner <roystgnr at ices.utexas.edu>
+# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <sokolov at google.com>
+# Copyright (c) 2015 Paul Norman <penorman at mac.com>
+# Copyright (c) 2015 Moritz Klammler <moritz at klammler.eu>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice
+# and this notice are preserved. This file is offered as-is, without any
+# warranty.
+
+#serial 14
+
+include([ax_cxx_compile_stdcxx.m4])
+
+AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [AX_CXX_COMPILE_STDCXX([11], [$1], [$2])])
diff --git a/man/Makefile.in b/man/Makefile.in
index fbc46a5..648dc7a 100644
--- a/man/Makefile.in
+++ b/man/Makefile.in
@@ -108,6 +108,8 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/acx_libwrap.m4 \
$(top_srcdir)/m4/ax_check_define.m4 \
$(top_srcdir)/m4/ax_check_flag.m4 \
+ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \
$(top_srcdir)/m4/ax_define_dir.m4 \
$(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/ax_tls.m4 \
$(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \
@@ -260,8 +262,10 @@ HAVE_BLUEZ_5 = @HAVE_BLUEZ_5@
HAVE_BLUEZ_5_NATIVE_HEADSET = @HAVE_BLUEZ_5_NATIVE_HEADSET@
HAVE_BLUEZ_5_OFONO_HEADSET = @HAVE_BLUEZ_5_OFONO_HEADSET@
HAVE_COREAUDIO = @HAVE_COREAUDIO@
+HAVE_CXX11 = @HAVE_CXX11@
HAVE_DBUS = @HAVE_DBUS@
HAVE_GLIB20 = @HAVE_GLIB20@
+HAVE_MEMFD = @HAVE_MEMFD@
HAVE_MKFIFO = @HAVE_MKFIFO@
HAVE_NEON = @HAVE_NEON@
HAVE_OSS_OUTPUT = @HAVE_OSS_OUTPUT@
diff --git a/man/pulse-client.conf.5 b/man/pulse-client.conf.5
index 8b8a959..5c4b515 100644
--- a/man/pulse-client.conf.5
+++ b/man/pulse-client.conf.5
@@ -32,7 +32,9 @@ For the settings that take a boolean argument the values \fBtrue\f1, \fByes\f1,
.TP
\fBcookie-file=\f1 Specify the path to the PulseAudio authentication cookie. Defaults to \fI~/.config/pulse/cookie\f1.
.TP
-\fBenable-shm=\f1 Enable data transfer via POSIX shared memory. Takes a boolean argument, defaults to \fByes\f1.
+\fBenable-shm=\f1 Enable data transfer via POSIX or memfd shared memory. Takes a boolean argument, defaults to \fByes\f1. If set to \fBno\f1, communication with the server will be exclusively done through data-copy over sockets.
+.TP
+\fBenable-memfd=\f1. Enable data transfer via memfd shared memory. Takes a boolean argument, defaults to \fByes\f1.
.TP
\fBshm-size-bytes=\f1 Sets the shared memory segment size for clients, in bytes. If left unspecified or is set to 0 it will default to some system-specific default, usually 64 MiB. Please note that usually there is no need to change this value, unless you are running an OS kernel that does not do memory overcommit.
.TP
diff --git a/man/pulse-client.conf.5.xml.in b/man/pulse-client.conf.5.xml.in
index cca2219..b88898c 100644
--- a/man/pulse-client.conf.5.xml.in
+++ b/man/pulse-client.conf.5.xml.in
@@ -102,6 +102,14 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
<option>
<p><opt>enable-shm=</opt> Enable data transfer via POSIX
+ or memfd shared memory. Takes a boolean argument, defaults to
+ <opt>yes</opt>. If set to <opt>no</opt>, communication with
+ the server will be exclusively done through data-copy over
+ sockets.</p>
+ </option>
+
+ <option>
+ <p><opt>enable-memfd=</opt>. Enable data transfer via memfd
shared memory. Takes a boolean argument, defaults to
<opt>yes</opt>.</p>
</option>
diff --git a/man/pulse-daemon.conf.5 b/man/pulse-daemon.conf.5
index 1bac86d..d1b71c6 100644
--- a/man/pulse-daemon.conf.5
+++ b/man/pulse-daemon.conf.5
@@ -44,7 +44,9 @@ For the settings that take a boolean argument the values \fBtrue\f1, \fByes\f1,
.TP
\fBlocal-server-type=\f1 Please don't use this option if you don't have to! This option is currently only useful when you want D-Bus clients to use a remote server. This option may be removed in future versions. If you only want to run PulseAudio in the system mode, use the \fBsystem-instance\f1 option. This option takes one of \fBuser\f1, \fBsystem\f1 or \fBnone\f1 as the argument. This is essentially a duplicate for the \fBsystem-instance\f1 option. The difference is the \fBnone\f1 opt [...]
.TP
-\fBenable-shm=\f1 Enable data transfer via POSIX shared memory. Takes a boolean argument, defaults to \fByes\f1. The \fB--disable-shm\f1 command line argument takes precedence.
+\fBenable-shm=\f1 Enable data transfer via POSIX or memfd shared memory. Takes a boolean argument, defaults to \fByes\f1. The \fB--disable-shm\f1 command line argument takes precedence.
+.TP
+\fBenable-memfd=\f1. Enable memfd shared memory. Takes a boolean argument, defaults to \fBno\f1.
.TP
\fBshm-size-bytes=\f1 Sets the shared memory segment size for the daemon, in bytes. If left unspecified or is set to 0 it will default to some system-specific default, usually 64 MiB. Please note that usually there is no need to change this value, unless you are running an OS kernel that does not do memory overcommit.
.TP
diff --git a/man/pulse-daemon.conf.5.xml.in b/man/pulse-daemon.conf.5.xml.in
index 0367b1f..1abc94f 100644
--- a/man/pulse-daemon.conf.5.xml.in
+++ b/man/pulse-daemon.conf.5.xml.in
@@ -189,12 +189,17 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
<option>
<p><opt>enable-shm=</opt> Enable data transfer via POSIX
- shared memory. Takes a boolean argument, defaults to
+ or memfd shared memory. Takes a boolean argument, defaults to
<opt>yes</opt>. The <opt>--disable-shm</opt> command line
argument takes precedence.</p>
</option>
<option>
+ <p><opt>enable-memfd=</opt>. Enable memfd shared memory. Takes
+ a boolean argument, defaults to <opt>no</opt>.</p>
+ </option>
+
+ <option>
<p><opt>shm-size-bytes=</opt> Sets the shared memory segment
size for the daemon, in bytes. If left unspecified or is set to 0
it will default to some system-specific default, usually 64
diff --git a/man/pulseaudio.1 b/man/pulseaudio.1
index 60eb94e..a66d7be 100644
--- a/man/pulseaudio.1
+++ b/man/pulseaudio.1
@@ -111,7 +111,10 @@ Create a PID file. If this options is disabled it is possible to run multiple so
Do not install CPU load limiter on platforms that support it. By default, PulseAudio will terminate itself when it notices that it takes up too much CPU time. This is useful as a protection against system lockups when real-time scheduling is used (see below). Disabling this mechanism is useful when debugging PulseAudio with tools like \fBvalgrind(1)\f1 which slow down execution.
.TP
\fB--disable-shm\f1\fI[=BOOL]\f1
-PulseAudio clients and the server can exchange audio data via POSIX shared memory segments (on systems that support this). If disabled PulseAudio will communicate exclusively over sockets. Please note that data transfer via shared memory segments is always disabled when PulseAudio is running with \fB--system\f1 enabled (see above).
+PulseAudio clients and the server can exchange audio data via POSIX or memfd shared memory segments (on systems that support this). If disabled PulseAudio will communicate exclusively over sockets. Please note that data transfer via shared memory segments is always disabled when PulseAudio is running with \fB--system\f1 enabled (see above).
+.TP
+\fB--enable-memfd\f1\fI[=BOOL]\f1
+PulseAudio clients and the server can exchange audio data via memfds - the anonymous Linux Kernel shared memory mechanism (on kernels that support this). If disabled PulseAudio will communicate via POSIX shared memory.
.TP
\fB-L | --load\f1\fI="MODULE ARGUMENTS"\f1
Load the specified plugin module with the specified arguments.
diff --git a/man/pulseaudio.1.xml.in b/man/pulseaudio.1.xml.in
index 650b417..3187ef5 100644
--- a/man/pulseaudio.1.xml.in
+++ b/man/pulseaudio.1.xml.in
@@ -292,14 +292,23 @@ License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
<p><opt>--disable-shm</opt><arg>[=BOOL]</arg></p>
<optdesc><p>PulseAudio clients and the server can exchange audio
- data via POSIX shared memory segments (on systems that support
- this). If disabled PulseAudio will communicate exclusively over
- sockets. Please note that data transfer via shared memory
+ data via POSIX or memfd shared memory segments (on systems that
+ support this). If disabled PulseAudio will communicate exclusively
+ over sockets. Please note that data transfer via shared memory
segments is always disabled when PulseAudio is running with
<opt>--system</opt> enabled (see above).</p></optdesc>
</option>
<option>
+ <p><opt>--enable-memfd</opt><arg>[=BOOL]</arg></p>
+
+ <optdesc><p>PulseAudio clients and the server can exchange audio
+ data via memfds - the anonymous Linux Kernel shared memory mechanism
+ (on kernels that support this). If disabled PulseAudio will
+ communicate via POSIX shared memory.</p></optdesc>
+ </option>
+
+ <option>
<p><opt>-L | --load</opt><arg>="MODULE ARGUMENTS"</arg></p>
<optdesc><p>Load the specified plugin module with the specified
diff --git a/po/hu.po b/po/hu.po
index eefb22b..85c33d5 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -1,15 +1,19 @@
+# Hungarian translation of PulseAudio
+# Copyright (C) 2012, 2016. Free Software Foundation, Inc.
+# This file is distributed under the same license as the PulseAudio package.
#
# KAMI <kami911 at gmail.com>, 2012.
-#
+# Gabor Kelemen <kelemeng at ubuntu dot com>, 2016.
msgid ""
msgstr ""
-"Project-Id-Version: \n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-01-30 10:10+0000\n"
-"PO-Revision-Date: 2012-01-30 09:54+0000\n"
-"Last-Translator: KAMI <kami911 at gmail.com>\n"
-"Language-Team: \n"
-"Language: \n"
+"Project-Id-Version: PulseAudio master\n"
+"Report-Msgid-Bugs-To: https://bugs.freedesktop.org/enter_bug.cgi?"
+"product=PulseAudio&keywords=I18N+L10N&component=misc\n"
+"POT-Creation-Date: 2016-03-07 14:26+0000\n"
+"PO-Revision-Date: 2016-03-07 22:25+0100\n"
+"Last-Translator: Gabor Kelemen <kelemeng at ubuntu dot com>\n"
+"Language-Team: Hungarian <openscope at googlegroups dot com>\n"
+"Language: hu\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -17,209 +21,438 @@ msgstr ""
"X-Poedit-Country: HUNGARY\n"
"X-Poedit-SourceCharset: utf-8\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Lokalize 1.5\n"
-#: ../src/modules/alsa/alsa-util.c:1136 ../src/modules/alsa/alsa-util.c:1204
+#: ../src/daemon/cmdline.c:111
#, 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."
+"%s [options]\n"
+"\n"
+"COMMANDS:\n"
+" -h, --help Show this help\n"
+" --version Show version\n"
+" --dump-conf Dump default configuration\n"
+" --dump-modules Dump list of available modules\n"
+" --dump-resample-methods Dump available resample methods\n"
+" --cleanup-shm Cleanup stale shared memory "
+"segments\n"
+" --start Start the daemon if it is not "
+"running\n"
+" -k --kill Kill a running daemon\n"
+" --check Check for a running daemon (only "
+"returns exit code)\n"
+"\n"
+"OPTIONS:\n"
+" --system[=BOOL] Run as system-wide instance\n"
+" -D, --daemonize[=BOOL] Daemonize after startup\n"
+" --fail[=BOOL] Quit when startup fails\n"
+" --high-priority[=BOOL] Try to set high nice level\n"
+" (only available as root, when SUID "
+"or\n"
+" with elevated RLIMIT_NICE)\n"
+" --realtime[=BOOL] Try to enable realtime scheduling\n"
+" (only available as root, when SUID "
+"or\n"
+" with elevated RLIMIT_RTPRIO)\n"
+" --disallow-module-loading[=BOOL] Disallow module user requested "
+"module\n"
+" loading/unloading after startup\n"
+" --disallow-exit[=BOOL] Disallow user requested exit\n"
+" --exit-idle-time=SECS Terminate the daemon when idle and "
+"this\n"
+" time passed\n"
+" --scache-idle-time=SECS Unload autoloaded samples when idle "
+"and\n"
+" this time passed\n"
+" --log-level[=LEVEL] Increase or set verbosity level\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"
+" --log-time[=BOOL] Include timestamps in log messages\n"
+" --log-backtrace=FRAMES Include a backtrace in log messages\n"
+" -p, --dl-search-path=PATH Set the search path for dynamic "
+"shared\n"
+" objects (plugins)\n"
+" --resample-method=METHOD Use the specified resampling method\n"
+" (See --dump-resample-methods for\n"
+" possible values)\n"
+" --use-pid-file[=BOOL] Create a PID file\n"
+" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n"
+" platforms that support it.\n"
+" --disable-shm[=BOOL] Disable shared memory support.\n"
+"\n"
+"STARTUP SCRIPT:\n"
+" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module "
+"with\n"
+" the specified argument\n"
+" -F, --file=FILENAME Run the specified script\n"
+" -C Open a command line on the running "
+"TTY\n"
+" after startup\n"
+"\n"
+" -n Don't load default script file\n"
msgstr ""
-"A „snd_pcm_avail()” függvény visszatérési értéke váratlanul nagy értékű: %lu "
-"bájt (%lu ms).\n"
-"Ez egy hiba lehet az ALSA „%s” eszközmeghajtóban. Kérem jelentse ezt a "
-"problémát az ALSA fejlesztői felé."
+"%s [kapcsolók]\n"
+"\n"
+"PARANCSOK:\n"
+" -h, --help Ezen súgó megjelenítése\n"
+" --version Verzió megjelenítése\n"
+" --dump-conf Alapértelmezett beállítások kiírása\n"
+" --dump-modules Elérhető modulok listájának kiírása\n"
+" --dump-resample-methods Elérhető újramintavételezési módok\n"
+" kiírása\n"
+" --cleanup-shm Árva megosztott memóriaszegmensek\n"
+" tisztítása\n"
+" --start A démon elindítása, ha nem fut\n"
+" -k --kill Futó démon kilövése\n"
+" --check Futó démon keresése (csak "
+"visszatérési\n"
+" kódot ad)\n"
+"\n"
+"KAPCSOLÓK:\n"
+" --system[=LOGIKAI] Futtatás rendszerszintű példányként\n"
+" -D, --daemonize[=LOGIKAI] Indítás után démon módba váltás\n"
+" --fail[=LOGIKAI] Kilépés, ha az indítás sikertelen\n"
+" --high-priority[=LOGIKAI] Kísérlet magas nice szint "
+"beállítására\n"
+" (csak rootként, SUID-ként vagy\n"
+" emelt RLIMIT_NICE esetén)\n"
+" --realtime[=LOGIKAI] Kísérlet valós idejű ütemezés\n"
+" bekapcsolására (csak rootként,\n"
+" SUID-ként vagy emelt RLIMIT_RTPRIO\n"
+" esetén)\n"
+" --disallow-module-loading[=LOGIKAI] Felhasználó által kért "
+"modulbetöltés/\n"
+" -eltávolítás tiltása indítás után\n"
+" --disallow-exit[=LOGIKAI] Felhasználó által kért kilépés "
+"tiltása\n"
+" --exit-idle-time=MP A démon befejeztetése, ha "
+"üresjáratban\n"
+" eltelt ennyi idő\n"
+" --scache-idle-time=MP Automatikusan betöltött minták\n"
+" eltávolítása, ha üresjáratban "
+"eltelt\n"
+" ennyi idő\n"
+" --log-level[=SZINT] Részletességi szint növelése vagy\n"
+" beállítása\n"
+" -v --verbose Részletességi szint növelése \n"
+" --log-target={auto,syslog,stderr,file:ÚTVONAL,newfile:ÚTVONAL}\n"
+" Naplózási cél megadása\n"
+" --log-meta[=LOGIKAI] Kódhely bevétele a naplóüzenetekbe\n"
+" --log-time[=LOGIKAI] Időbélyeg bevétele a "
+"naplóüzenetekbe\n"
+" --log-backtrace=KERETEK Visszakövetés bevétele a "
+"naplóüzenetekbe\n"
+" -p, --dl-search-path=ÚTVONAL Keresési útvonal megadása dinamikus\n"
+" megosztott objektumokhoz "
+"(bővítmények)\n"
+" --resample-method=MÓD A megadott újramintavételezési mód\n"
+" használata (lehetséges értékekért "
+"lásd\n"
+" a --dump-resample-methods "
+"kimenetét)\n"
+" --use-pid-file[=LOGIKAI] PID fájl létrehozása\n"
+" --no-cpu-limit[=LOGIKAI] Ne telepítsen CPU "
+"terheléskorlátozót\n"
+" az azt támogató platformokon\n"
+" --disable-shm[=LOGIKAI] Megosztott memória támogatásának "
+"tiltása\n"
+"\n"
+"INDÍTÓ PARANCSFÁJL:\n"
+" -L, --load=\"MODUL ARGUMENTUMOK\" A megadott bővítménymodul "
+"betöltése\n"
+" a megadott argumentummal\n"
+" -F, --file=FÁJLNÉV A megadott parancsfájl futtatása\n"
+" -C Parancssor megnyitása a futó "
+"terminálon\n"
+" indítás után\n"
+"\n"
+" -n Ne töltse be az alapértelmezett\n"
+" parancsfájlt\n"
-#: ../src/modules/alsa/alsa-util.c:1179
-#, c-format
+#: ../src/daemon/cmdline.c:243
+msgid "--daemonize expects boolean argument"
+msgstr "a --daemonize paraméter logikai értéket vár"
+
+#: ../src/daemon/cmdline.c:251
+msgid "--fail expects boolean argument"
+msgstr "a --fail paraméter logikai értéket vár"
+
+#: ../src/daemon/cmdline.c:262
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."
+"--log-level expects log level argument (either numeric in range 0..4 or one "
+"of debug, info, notice, warn, error)."
msgstr ""
-"A „snd_pcm_delay()” függvény visszatérési értéke váratlanul nagy értékű: %li "
-"bájt (%s%lu ms).\n"
-"Ez egy hiba lehet az ALSA „%s” eszközmeghajtóban. Kérem jelentse ezt a "
-"problémát az ALSA fejlesztői felé."
+"a --log-level paraméter a naplózás szintjének értékét várja (Ez lehet a 0..4 "
+"tartomány, vagy a következők egyike: debug, info, notice, warn, error)."
+
+#: ../src/daemon/cmdline.c:274
+msgid "--high-priority expects boolean argument"
+msgstr "a --high-priority paraméter logikai értéket vár"
+
+#: ../src/daemon/cmdline.c:282
+msgid "--realtime expects boolean argument"
+msgstr "a --realtime paraméter logikai értéket vár"
+
+#: ../src/daemon/cmdline.c:290
+msgid "--disallow-module-loading expects boolean argument"
+msgstr "a --disallow-module-loading paraméter logikai értéket vár"
+
+#: ../src/daemon/cmdline.c:298
+msgid "--disallow-exit expects boolean argument"
+msgstr "a --disallow-exit paraméter logikai értéket vár"
+
+#: ../src/daemon/cmdline.c:306
+msgid "--use-pid-file expects boolean argument"
+msgstr "a --use-pid-file paraméter logikai értéket vár"
-#: ../src/modules/alsa/alsa-util.c:1220
-#, fuzzy, c-format
+#: ../src/daemon/cmdline.c:325
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."
+"Invalid log target: use either 'syslog', 'journal','stderr' or 'auto' or a "
+"valid file name 'file:<path>', 'newfile:<path>'."
msgstr ""
-"A „snd_pcm_avail()” függvény visszatérési értéke váratlanul nagy értékű: %lu "
-"bájt (%lu ms).\n"
-"Ez egy hiba lehet az ALSA „%s” eszközmeghajtóban. Kérem jelentse ezt a "
-"problémát az ALSA fejlesztői felé."
+"Érvénytelen naplózási cél: használja a „syslog”, „journal”, „stderr” vagy az "
+"„auto” egyikét, vagy egy érvényes fájlnevet: „file:<útvonal>”, „newfile:"
+"<útvonal>”."
-#: ../src/modules/alsa/alsa-util.c:1263
-#, c-format
+#: ../src/daemon/cmdline.c:327
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."
+"Invalid log target: use either 'syslog', 'stderr' or 'auto' or a valid file "
+"name 'file:<path>', 'newfile:<path>'."
msgstr ""
-"A „snd_pcm_mmap_begin()” függvény visszatérési értéke váratlanul nagy "
-"értékű: %lu bájt (%lu ms).\n"
-"Ez egy hiba lehet az ALSA „%s” eszközmeghajtóban. Kérem jelentse ezt a "
-"problémát az ALSA fejlesztői felé."
+"Érvénytelen naplózási cél: használja a „syslog”, „stderr” vagy az „auto” "
+"egyikét, vagy egy érvényes fájlnevet: „file:<útvonal>”, „newfile:<útvonal>”."
-#: ../src/modules/module-always-sink.c:38
-msgid "Always keeps at least one sink loaded even if it's a null one"
-msgstr "Mindig maradjon meg legalább egy nyelőt, még ha az csak az üres nyelő."
+#: ../src/daemon/cmdline.c:335
+msgid "--log-time expects boolean argument"
+msgstr "a --log-time paraméter logikai értéket vár"
-#: ../src/modules/module-always-sink.c:82
-msgid "Dummy Output"
-msgstr "Látszólagos kimenet"
+#: ../src/daemon/cmdline.c:343
+msgid "--log-meta expects boolean argument"
+msgstr "a --log-meta paraméter logikai értéket vár"
-#: ../src/modules/module-ladspa-sink.c:48
-msgid "Virtual LADSPA sink"
-msgstr "Látszólagos LADSPA nyelő"
+#: ../src/daemon/cmdline.c:363
+#, c-format
+msgid "Invalid resample method '%s'."
+msgstr "Érvénytelen újramintavételezési eljárás: „%s”."
-#: ../src/modules/module-ladspa-sink.c:52
-#, fuzzy
+#: ../src/daemon/cmdline.c:370
+msgid "--system expects boolean argument"
+msgstr "a --system paraméter logikai értéket vár"
+
+#: ../src/daemon/cmdline.c:378
+msgid "--no-cpu-limit expects boolean argument"
+msgstr "a --no-cpu-limit paraméter logikai értéket vár"
+
+#: ../src/daemon/cmdline.c:386
+msgid "--disable-shm expects boolean argument"
+msgstr "a --disable-shm paraméter logikai értéket vár"
+
+#: ../src/daemon/daemon-conf.c:259
+#, c-format
+msgid "[%s:%u] Invalid log target '%s'."
+msgstr "[%s:%u] Érvénytelen naplózási cél: „%s”."
+
+#: ../src/daemon/daemon-conf.c:274
+#, c-format
+msgid "[%s:%u] Invalid log level '%s'."
+msgstr "[%s:%u] Érvénytelen naplózási szint: „%s”."
+
+#: ../src/daemon/daemon-conf.c:289
+#, c-format
+msgid "[%s:%u] Invalid resample method '%s'."
+msgstr "[%s:%u] Érvénytelen újramintavételezési eljárás: „%s”."
+
+#: ../src/daemon/daemon-conf.c:311
+#, c-format
+msgid "[%s:%u] Invalid rlimit '%s'."
+msgstr "[%s:%u] Érvénytelen rlimit érték: „%s”."
+
+#: ../src/daemon/daemon-conf.c:331
+#, c-format
+msgid "[%s:%u] Invalid sample format '%s'."
+msgstr "[%s:%u] Érvénytelen mintavételi formátum: „%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] Érvénytelen mintavételezési gyakoriság: „%s”."
+
+#: ../src/daemon/daemon-conf.c:388
+#, c-format
+msgid "[%s:%u] Invalid sample channels '%s'."
+msgstr "[%s:%u] Érvénytelen minta csatornák: „%s”."
+
+#: ../src/daemon/daemon-conf.c:405
+#, c-format
+msgid "[%s:%u] Invalid channel map '%s'."
+msgstr "[%s:%u] Érvénytelen csatornaleképzés: „%s”."
+
+#: ../src/daemon/daemon-conf.c:422
+#, c-format
+msgid "[%s:%u] Invalid number of fragments '%s'."
+msgstr "[%s:%u] Érvénytelen a részek száma: „%s”."
+
+#: ../src/daemon/daemon-conf.c:439
+#, c-format
+msgid "[%s:%u] Invalid fragment size '%s'."
+msgstr "[%s:%u] Érvénytelen a részek mérete: „%s”."
+
+#: ../src/daemon/daemon-conf.c:456
+#, c-format
+msgid "[%s:%u] Invalid nice level '%s'."
+msgstr "[%s:%u] Érvénytelen a prioritási érték: „%s”."
+
+#: ../src/daemon/daemon-conf.c:499
+#, c-format
+msgid "[%s:%u] Invalid server type '%s'."
+msgstr "[%s:%u] Érvénytelen kiszolgálótípus: „%s”."
+
+#: ../src/daemon/daemon-conf.c:613
+#, c-format
+msgid "Failed to open configuration file: %s"
+msgstr "Nem sikerült megnyitni a konfigurációs fájlt: %s"
+
+#: ../src/daemon/daemon-conf.c:629
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> "
+"The specified default channel map has a different number of channels than "
+"the specified default number of channels."
msgstr ""
-"sink_name=<nyelő neve> sink_properties=<nyelő tulajdonságai> "
-"master=<szűrendő nyelő neve> format=<sample format> rate=<mintavételezési "
-"ráta> channels=<csatornák száma> channel_map=<csatornaleképzés> "
-"plugin=<ladspa bővítmény neve> label=<ladspa bővítmény címkéje> "
-"control=<bemenetszabályzó értékek vesszővel elválasztott listája>"
+"A megadott alapértelmezett csatornaleképzés csatornáinak száma eltér az "
+"megadott alapértelmezett csatornaszámtól."
-#: ../src/modules/module-null-sink.c:49
-msgid "Clocked NULL sink"
-msgstr "Órajelezett semmis nyelő"
+#: ../src/daemon/daemon-conf.c:716
+#, c-format
+msgid "### Read from configuration file: %s ###\n"
+msgstr "### Olvasás a következő konfigurációs fájlból: %s ###\n"
-#: ../src/modules/module-null-sink.c:284
-msgid "Null Output"
-msgstr "Semmis kimenet"
+#: ../src/daemon/dumpmodules.c:57
+#, c-format
+msgid "Name: %s\n"
+msgstr "Név: %s\n"
-#: ../src/pulsecore/sink.c:3349
-msgid "Built-in Audio"
-msgstr "Belső hangforrás"
+#: ../src/daemon/dumpmodules.c:60
+#, c-format
+msgid "No module information available\n"
+msgstr "Nem áll rendelkezésre modulinformáció\n"
-#: ../src/pulsecore/sink.c:3354
-msgid "Modem"
-msgstr "Modem"
+#: ../src/daemon/dumpmodules.c:63
+#, c-format
+msgid "Version: %s\n"
+msgstr "Verzió: %s\n"
+
+#: ../src/daemon/dumpmodules.c:65
+#, c-format
+msgid "Description: %s\n"
+msgstr "Leírás: %s\n"
+
+#: ../src/daemon/dumpmodules.c:67
+#, c-format
+msgid "Author: %s\n"
+msgstr "Szerző: %s\n"
+
+#: ../src/daemon/dumpmodules.c:69
+#, c-format
+msgid "Usage: %s\n"
+msgstr "Használat: %s\n"
+
+#: ../src/daemon/dumpmodules.c:70
+#, c-format
+msgid "Load Once: %s\n"
+msgstr "Betöltve: %s\n"
+
+#: ../src/daemon/dumpmodules.c:72
+#, c-format
+msgid "DEPRECATION WARNING: %s\n"
+msgstr "ELAVULÁSI FIGYELMEZTETÉS: %s\n"
+
+#: ../src/daemon/dumpmodules.c:76
+#, c-format
+msgid "Path: %s\n"
+msgstr "Útvonal: %s\n"
-#: ../src/daemon/ltdl-bind-now.c:127
+#: ../src/daemon/ltdl-bind-now.c:75
+#, c-format
+msgid "Failed to open module %s: %s"
+msgstr "Nem sikerült megnyitni a(z) „%s” modult: %s"
+
+#: ../src/daemon/ltdl-bind-now.c:126
msgid "Failed to find original lt_dlopen loader."
msgstr "Nem található az eredeti „lt_dlopen” betöltő."
-#: ../src/daemon/ltdl-bind-now.c:132
+#: ../src/daemon/ltdl-bind-now.c:131
msgid "Failed to allocate new dl loader."
msgstr "Nem foglalható le hely az új dl betöltő számára."
-#: ../src/daemon/ltdl-bind-now.c:145
+#: ../src/daemon/ltdl-bind-now.c:144
msgid "Failed to add bind-now-loader."
msgstr "Nem sikerült hozzáadni az azonnali betöltés csatolást."
-#: ../src/daemon/main.c:139
-#, c-format
-msgid "Got signal %s."
-msgstr "Szignál: %s."
-
-#: ../src/daemon/main.c:166
-msgid "Exiting."
-msgstr "Kilépés."
-
-#: ../src/daemon/main.c:184
+#: ../src/daemon/main.c:160
#, c-format
msgid "Failed to find user '%s'."
msgstr "Nem található a(z) „%s” felhasználó."
-#: ../src/daemon/main.c:189
+#: ../src/daemon/main.c:165
#, c-format
msgid "Failed to find group '%s'."
msgstr "Nem található a(z) „%s” csoport."
-#: ../src/daemon/main.c:193
-#, c-format
-msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
-msgstr "Létező felhasználó „%s” (UID: %lu) és csoport „%s” (GID: %lu)."
-
-#: ../src/daemon/main.c:198
+#: ../src/daemon/main.c:174
#, c-format
msgid "GID of user '%s' and of group '%s' don't match."
msgstr ""
"A(z) „%s” felhasználó GID azonosítója és „%s” csoportja nem egyezik meg."
-#: ../src/daemon/main.c:203
+#: ../src/daemon/main.c:179
#, c-format
msgid "Home directory of user '%s' is not '%s', ignoring."
msgstr "A(z) „%s” felhasználó Saját mappája nem „%s”. Kihagyás."
-#: ../src/daemon/main.c:206 ../src/daemon/main.c:211
+#: ../src/daemon/main.c:182 ../src/daemon/main.c:187
#, c-format
msgid "Failed to create '%s': %s"
msgstr "Nem sikerült létrehozni a(z) „%s” fájlt: %s"
-#: ../src/daemon/main.c:218
+#: ../src/daemon/main.c:194
#, c-format
msgid "Failed to change group list: %s"
msgstr "Nem sikerült megváltoztatni a csoportlistát: %s"
-#: ../src/daemon/main.c:234
+#: ../src/daemon/main.c:210
#, c-format
msgid "Failed to change GID: %s"
msgstr "Nem sikerült megváltoztatni az GID azonosítót: %s"
-#: ../src/daemon/main.c:250
+#: ../src/daemon/main.c:226
#, c-format
msgid "Failed to change UID: %s"
msgstr "Nem sikerült megváltoztatni az UID azonosítót: %s"
-#: ../src/daemon/main.c:269
-msgid "Successfully dropped root privileges."
-msgstr "A rendszergazdai jogosultságok sikeresen visszaadva."
-
-#: ../src/daemon/main.c:277
+#: ../src/daemon/main.c:255
msgid "System wide mode unsupported on this platform."
msgstr "A rendszer üzemmód nem támogatott ezen az operációs rendszeren."
-#: ../src/daemon/main.c:295
-#, c-format
-msgid "setrlimit(%s, (%u, %u)) failed: %s"
-msgstr "setrlimit(%s, (%u, %u)) meghiúsult: %s"
-
-#: ../src/daemon/main.c:496
+#: ../src/daemon/main.c:484
msgid "Failed to parse command line."
msgstr "Nem sikerült feldolgozni a parancssort."
-#: ../src/daemon/main.c:529
+#: ../src/daemon/main.c:523
msgid ""
"System mode refused for non-root user. Only starting the D-Bus server lookup "
"service."
msgstr ""
+"Rendszer mód elutasítva a nem root felhasználóhoz. Csak a D-Bus kiszolgáló "
+"kikeresési szolgáltatás indul."
-#: ../src/daemon/main.c:611
-msgid "Daemon not running"
-msgstr "A démon nem fut."
-
-#: ../src/daemon/main.c:613
-#, c-format
-msgid "Daemon running as PID %u"
-msgstr "A démon a következő PID azonosítóval fut: %u"
-
-#: ../src/daemon/main.c:628
+#: ../src/daemon/main.c:622
#, c-format
msgid "Failed to kill daemon: %s"
msgstr "A démon kilövése nem sikerült: %s"
-#: ../src/daemon/main.c:657
+#: ../src/daemon/main.c:651
msgid ""
"This program is not intended to be run as root (unless --system is "
"specified)."
@@ -227,182 +460,85 @@ msgstr ""
"Ez a program nincsen felkészítve arra, hogy rendszergazdai jogosultságokkal "
"fusson (kivéve, ha a --system paraméter megadásra kerül)."
-#: ../src/daemon/main.c:660
+#: ../src/daemon/main.c:654
msgid "Root privileges required."
msgstr "Rendszergazdai jogosultságok szükségesek."
-#: ../src/daemon/main.c:667
+#: ../src/daemon/main.c:661
msgid "--start not supported for system instances."
msgstr "--start nem támogatott rendszer üzemmód használata esetén."
-#: ../src/daemon/main.c:707
+#: ../src/daemon/main.c:701
#, c-format
msgid "User-configured server at %s, refusing to start/autospawn."
msgstr ""
+"Felhasználó által indított kiszolgáló itt: %s, az indítás/automatikus "
+"indítás elutasítva."
-#: ../src/daemon/main.c:713
+#: ../src/daemon/main.c:707
#, c-format
msgid ""
"User-configured server at %s, which appears to be local. Probing deeper."
msgstr ""
+"Felhasználó által indított kiszolgáló itt: %s, helyinek tűnik. Mélyebb "
+"szondázás."
-#: ../src/daemon/main.c:718
-msgid "Running in system mode, but --disallow-exit not set!"
+#: ../src/daemon/main.c:712
+msgid "Running in system mode, but --disallow-exit not set."
msgstr ""
"Futtatás rendszer üzemmódban, de a --disallow-exit paraméter nincs beállítva."
-#: ../src/daemon/main.c:721
-msgid "Running in system mode, but --disallow-module-loading not set!"
+#: ../src/daemon/main.c:715
+msgid "Running in system mode, but --disallow-module-loading not set."
msgstr ""
"Futtatás rendszer üzemmódban, de a --disallow-module-loading paraméter nincs "
"beállítva."
-#: ../src/daemon/main.c:724
-msgid "Running in system mode, forcibly disabling SHM mode!"
-msgstr "Futtatás rendszer üzemmódban, az SHM üzemmód forszírozott letiltása."
+#: ../src/daemon/main.c:718
+msgid "Running in system mode, forcibly disabling SHM mode."
+msgstr ""
+"Futtatás rendszer üzemmódban, az SHM üzemmód kényszerített letiltásával."
-#: ../src/daemon/main.c:729
-msgid "Running in system mode, forcibly disabling exit idle time!"
+#: ../src/daemon/main.c:723
+msgid "Running in system mode, forcibly disabling exit idle time."
msgstr ""
-"Futtatás rendszer üzemmódban, kilépés üresjárati időtúllépés esetén "
-"beállítás forszírozott letiltása."
+"Futtatás rendszer üzemmódban, a kilépési üresjárati idő kényszerített "
+"letiltásával."
-#: ../src/daemon/main.c:757
+#: ../src/daemon/main.c:756
msgid "Failed to acquire stdio."
msgstr ""
"Nem sikerült jogot szerezni az alapértelmezett ki- és bemenetre (stdio)."
-#: ../src/daemon/main.c:763 ../src/daemon/main.c:828
-#, fuzzy, c-format
+#: ../src/daemon/main.c:762 ../src/daemon/main.c:833
+#, c-format
msgid "pipe() failed: %s"
-msgstr "Cső létrehozás meghiúsult: %s"
+msgstr "a pipe() hívás meghiúsult: %s"
-#: ../src/daemon/main.c:768 ../src/daemon/main.c:833
+#: ../src/daemon/main.c:767 ../src/daemon/main.c:838
#, c-format
msgid "fork() failed: %s"
-msgstr "Programindítás meghiúsult: %s"
+msgstr "a fork() hívás meghiúsult: %s"
-#: ../src/daemon/main.c:783 ../src/daemon/main.c:848 ../src/utils/pacat.c:550
+#: ../src/daemon/main.c:782 ../src/daemon/main.c:853 ../src/utils/pacat.c:568
#, c-format
msgid "read() failed: %s"
-msgstr "Olvasás meghiúsult: %s"
+msgstr "a read() hívás meghiúsult: %s"
-#: ../src/daemon/main.c:789
+#: ../src/daemon/main.c:788
msgid "Daemon startup failed."
msgstr "A démon elindítása nem sikerült."
-#: ../src/daemon/main.c:791
-msgid "Daemon startup successful."
-msgstr "A démon sikeresen elindult."
-
-#: ../src/daemon/main.c:816
-#, fuzzy, c-format
-msgid "setsid() failed: %s"
-msgstr "Olvasás meghiúsult: %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 "Összeépítő számítógép: %s"
-
-#: ../src/daemon/main.c:903 ../src/tests/resampler-test.c:418
-#, c-format
-msgid "Compilation CFLAGS: %s"
-msgstr "Összeépítési CFLAGS jelzők: %s"
-
-#: ../src/daemon/main.c:906
-#, c-format
-msgid "Running on host: %s"
-msgstr "Kiszolgáló: %s"
-
-#: ../src/daemon/main.c:909
-#, c-format
-msgid "Found %u CPUs."
-msgstr "%u CPU található a rendszerben."
-
-#: ../src/daemon/main.c:911
-#, c-format
-msgid "Page size is %lu bytes"
-msgstr "Oldalméret: %lu bájt"
-
-#: ../src/daemon/main.c:914
-msgid "Compiled with Valgrind support: yes"
-msgstr "Összeépítés Valgrind támogatással: Igen"
-
-#: ../src/daemon/main.c:916
-msgid "Compiled with Valgrind support: no"
-msgstr "Összeépítés Valgrind támogatással: Nem"
-
-#: ../src/daemon/main.c:919
+#: ../src/daemon/main.c:821
#, c-format
-msgid "Running in valgrind mode: %s"
-msgstr "Futás Valgrind üzemmódban: %s"
-
-#: ../src/daemon/main.c:921
-#, fuzzy, c-format
-msgid "Running in VM: %s"
-msgstr "Kiszolgáló: %s"
-
-#: ../src/daemon/main.c:924
-msgid "Optimized build: yes"
-msgstr "Optimalizált összeépítés: Igen"
-
-#: ../src/daemon/main.c:926
-msgid "Optimized build: no"
-msgstr "Optimalizált összeépítés: Nem"
-
-#: ../src/daemon/main.c:930
-msgid "NDEBUG defined, all asserts disabled."
-msgstr "NDEBUG megadva, minden érvényesítés letiltva."
-
-#: ../src/daemon/main.c:932
-msgid "FASTPATH defined, only fast path asserts disabled."
-msgstr "FASTPATH megadva, így csak a gyors útvonal-érvényesítés lesz letiltva."
-
-#: ../src/daemon/main.c:934
-msgid "All asserts enabled."
-msgstr "Minden érvényesítés engedélyezve."
+msgid "setsid() failed: %s"
+msgstr "a setsid() hívás meghiúsult: %s"
-#: ../src/daemon/main.c:938
+#: ../src/daemon/main.c:948
msgid "Failed to get machine ID"
-msgstr "Nem sikerült lekérdezni a számítógép azonosítóját"
-
-#: ../src/daemon/main.c:941
-#, c-format
-msgid "Machine ID is %s."
-msgstr "Számítógép-azonosító: %s."
-
-#: ../src/daemon/main.c:945
-#, c-format
-msgid "Session ID is %s."
-msgstr "Munkamenet-azonosító: %s."
-
-#: ../src/daemon/main.c:951
-#, c-format
-msgid "Using runtime directory %s."
-msgstr "A futásidőben használt mappa: %s."
-
-#: ../src/daemon/main.c:956
-#, c-format
-msgid "Using state directory %s."
-msgstr "Az állapottároló mappa: %s."
-
-#: ../src/daemon/main.c:959
-#, c-format
-msgid "Using modules directory %s."
-msgstr "A modulok mappája: %s."
-
-#: ../src/daemon/main.c:961
-#, c-format
-msgid "Running in system mode: %s"
-msgstr "Futás rendszer üzemmódban: %s"
+msgstr "Nem sikerült lekérni a számítógép azonosítóját"
-#: ../src/daemon/main.c:964
+#: ../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"
@@ -420,921 +556,1347 @@ msgstr ""
"Documentation/User/WhatIsWrongWithSystemWide/ amelyből megtudhatja miért nem "
"tanácsos a rendszer üzemmód használata."
-#: ../src/daemon/main.c:981
+#: ../src/daemon/main.c:991
msgid "pa_pid_file_create() failed."
msgstr "A „pa_pid_file_create()” függvényhívás meghiúsult."
-#: ../src/daemon/main.c:991
-msgid "Fresh high-resolution timers available! Bon appetit!"
-msgstr "A nagypontosságú időzítők elérhetőek."
-
-#: ../src/daemon/main.c:993
-msgid ""
-"Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
-"resolution timers enabled!"
-msgstr ""
-"A nagypontosságú időzítők nem érhetőek el. Napjaink Linux rendszereiben "
-"érdemes engedélyezni a nagypontosságú időzítőket."
-
-#: ../src/daemon/main.c:1011
+#: ../src/daemon/main.c:1021
msgid "pa_core_new() failed."
msgstr "A „pa_core_new()” függvényhívás meghiúsult: %s"
-#: ../src/daemon/main.c:1087
+#: ../src/daemon/main.c:1089
msgid "Failed to initialize daemon."
msgstr "Nem sikerült előkészíteni a démont."
-#: ../src/daemon/main.c:1092
+#: ../src/daemon/main.c:1094
msgid "Daemon startup without any loaded modules, refusing to work."
msgstr ""
"A démont noha elindult, de nem töltött be modulokat, így a hangrendszer nem "
"üzemképes."
-#: ../src/daemon/main.c:1130
-msgid "Daemon startup complete."
-msgstr "A démon elindítása sikeres."
+#: ../src/daemon/pulseaudio.desktop.in.h:1
+msgid "PulseAudio Sound System"
+msgstr "PulseAudio hangrendszer"
-#: ../src/daemon/main.c:1136
-msgid "Daemon shutdown initiated."
-msgstr "A démon leállítása kezdeményezve."
+#: ../src/daemon/pulseaudio.desktop.in.h:2
+msgid "Start the PulseAudio Sound System"
+msgstr "A PulseAudio hangrendszer elindítása"
-#: ../src/daemon/main.c:1167
-msgid "Daemon terminated."
-msgstr "A démon leállítva."
+#: ../src/modules/alsa/alsa-mixer.c:2402
+msgid "Input"
+msgstr "Bemenet"
-#: ../src/daemon/cmdline.c:113
-#, c-format
-msgid ""
-"%s [options]\n"
-"\n"
-"COMMANDS:\n"
-" -h, --help Show this help\n"
-" --version Show version\n"
-" --dump-conf Dump default configuration\n"
-" --dump-modules Dump list of available modules\n"
-" --dump-resample-methods Dump available resample methods\n"
-" --cleanup-shm Cleanup stale shared memory "
-"segments\n"
-" --start Start the daemon if it is not "
-"running\n"
-" -k --kill Kill a running daemon\n"
-" --check Check for a running daemon (only "
-"returns exit code)\n"
-"\n"
-"OPTIONS:\n"
-" --system[=BOOL] Run as system-wide instance\n"
-" -D, --daemonize[=BOOL] Daemonize after startup\n"
-" --fail[=BOOL] Quit when startup fails\n"
-" --high-priority[=BOOL] Try to set high nice level\n"
-" (only available as root, when SUID "
-"or\n"
-" with elevated RLIMIT_NICE)\n"
-" --realtime[=BOOL] Try to enable realtime scheduling\n"
-" (only available as root, when SUID "
-"or\n"
-" with elevated RLIMIT_RTPRIO)\n"
-" --disallow-module-loading[=BOOL] Disallow module user requested "
-"module\n"
-" loading/unloading after startup\n"
-" --disallow-exit[=BOOL] Disallow user requested exit\n"
-" --exit-idle-time=SECS Terminate the daemon when idle and "
-"this\n"
-" time passed\n"
-" --scache-idle-time=SECS Unload autoloaded samples when idle "
-"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"
-" Specify the log target\n"
-" --log-meta[=BOOL] Include code location in log "
-"messages\n"
-" --log-time[=BOOL] Include timestamps in log messages\n"
-" --log-backtrace=FRAMES Include a backtrace in log messages\n"
-" -p, --dl-search-path=PATH Set the search path for dynamic "
-"shared\n"
-" objects (plugins)\n"
-" --resample-method=METHOD Use the specified resampling method\n"
-" (See --dump-resample-methods for\n"
-" possible values)\n"
-" --use-pid-file[=BOOL] Create a PID file\n"
-" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n"
-" platforms that support it.\n"
-" --disable-shm[=BOOL] Disable shared memory support.\n"
-"\n"
-"STARTUP SCRIPT:\n"
-" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module "
-"with\n"
-" the specified argument\n"
-" -F, --file=FILENAME Run the specified script\n"
-" -C Open a command line on the running "
-"TTY\n"
-" after startup\n"
-"\n"
-" -n Don't load default script file\n"
-msgstr ""
+#: ../src/modules/alsa/alsa-mixer.c:2403
+msgid "Docking Station Input"
+msgstr "Dokkolóállomás bemenet"
-#: ../src/daemon/cmdline.c:244
-msgid "--daemonize expects boolean argument"
-msgstr "--daemonize paraméter logikai értéket vár el"
+#: ../src/modules/alsa/alsa-mixer.c:2404
+msgid "Docking Station Microphone"
+msgstr "Dokkolóállomás mikrofon"
-#: ../src/daemon/cmdline.c:251
-msgid "--fail expects boolean argument"
-msgstr "--fail paraméter logikai értéket vár el"
+#: ../src/modules/alsa/alsa-mixer.c:2405
+msgid "Docking Station Line In"
+msgstr "Dokkolóállomás vonalbemenet"
-#: ../src/daemon/cmdline.c:261
-msgid ""
-"--log-level expects log level argument (either numeric in range 0..4 or one "
-"of debug, info, notice, warn, error)."
-msgstr ""
-"--log-level paraméter a naplózás szintjének értékét várja el (Ez lehet a "
-"0..4 számtartomány, vagy a következők egyike: debug, info, notice, warn, "
-"error)."
+#: ../src/modules/alsa/alsa-mixer.c:2406 ../src/modules/alsa/alsa-mixer.c:2491
+msgid "Line In"
+msgstr "Vonalbemenet"
-#: ../src/daemon/cmdline.c:273
-msgid "--high-priority expects boolean argument"
-msgstr "--high-priority paraméter logikai értéket vár el"
+#: ../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 "Mikrofon"
-#: ../src/daemon/cmdline.c:280
-msgid "--realtime expects boolean argument"
-msgstr "--realtime paraméter logikai értéket vár el"
+#: ../src/modules/alsa/alsa-mixer.c:2408 ../src/modules/alsa/alsa-mixer.c:2486
+msgid "Front Microphone"
+msgstr "Első mikrofon"
-#: ../src/daemon/cmdline.c:287
-msgid "--disallow-module-loading expects boolean argument"
-msgstr "--disallow-module-loading paraméter logikai értéket vár el"
+#: ../src/modules/alsa/alsa-mixer.c:2409 ../src/modules/alsa/alsa-mixer.c:2487
+msgid "Rear Microphone"
+msgstr "Hátsó mikrofon"
-#: ../src/daemon/cmdline.c:294
-msgid "--disallow-exit expects boolean argument"
-msgstr "--disallow-exit paraméter logikai értéket vár el"
+#: ../src/modules/alsa/alsa-mixer.c:2410
+msgid "External Microphone"
+msgstr "Külső mikrofon"
-#: ../src/daemon/cmdline.c:301
-msgid "--use-pid-file expects boolean argument"
-msgstr "--use-pid-file paraméter logikai értéket vár el"
+#: ../src/modules/alsa/alsa-mixer.c:2411 ../src/modules/alsa/alsa-mixer.c:2489
+msgid "Internal Microphone"
+msgstr "Belső mikrofon"
-#: ../src/daemon/cmdline.c:318
-#, fuzzy
-msgid ""
-"Invalid log target: use either 'syslog', 'stderr' or 'auto' or a valid file "
-"name 'file:<path>'."
-msgstr ""
-"Érvénytelen naplózási cél: használja a „syslog”, a „stderr” vagy az „auto” "
-"értéket."
+#: ../src/modules/alsa/alsa-mixer.c:2412 ../src/modules/alsa/alsa-mixer.c:2492
+msgid "Radio"
+msgstr "Rádió"
-#: ../src/daemon/cmdline.c:325
-msgid "--log-time expects boolean argument"
-msgstr "--log-time paraméter logikai értéket vár el"
+#: ../src/modules/alsa/alsa-mixer.c:2413 ../src/modules/alsa/alsa-mixer.c:2493
+msgid "Video"
+msgstr "Videó"
-#: ../src/daemon/cmdline.c:332
-msgid "--log-meta expects boolean argument"
-msgstr "--log-meta paraméter logikai értéket vár el"
+#: ../src/modules/alsa/alsa-mixer.c:2414
+msgid "Automatic Gain Control"
+msgstr "Automatikus erősítésszabályzás"
-#: ../src/daemon/cmdline.c:351
-#, c-format
-msgid "Invalid resample method '%s'."
-msgstr "Érvénytelen újramintavételezési eljárás: „%s”."
+#: ../src/modules/alsa/alsa-mixer.c:2415
+msgid "No Automatic Gain Control"
+msgstr "Nincs automatikus erősítésszabályzás"
-#: ../src/daemon/cmdline.c:358
-msgid "--system expects boolean argument"
-msgstr "--system paraméter logikai értéket vár el"
+#: ../src/modules/alsa/alsa-mixer.c:2416
+msgid "Boost"
+msgstr "Erősítés"
-#: ../src/daemon/cmdline.c:365
-msgid "--no-cpu-limit expects boolean argument"
-msgstr "--no-cpu-limit paraméter logikai értéket vár el"
+#: ../src/modules/alsa/alsa-mixer.c:2417
+msgid "No Boost"
+msgstr "Nincs erősítés"
-#: ../src/daemon/cmdline.c:372
-msgid "--disable-shm expects boolean argument"
-msgstr "--disable-shm paraméter logikai értéket vár el"
+#: ../src/modules/alsa/alsa-mixer.c:2418
+msgid "Amplifier"
+msgstr "Erősítő"
-#: ../src/daemon/dumpmodules.c:59
-#, c-format
-msgid "Name: %s\n"
-msgstr "Név: %s\n"
+#: ../src/modules/alsa/alsa-mixer.c:2419
+msgid "No Amplifier"
+msgstr "Nincs erősítő"
-#: ../src/daemon/dumpmodules.c:62
-#, c-format
-msgid "No module information available\n"
-msgstr "Nem áll rendelkezésre modul információ.\n"
+#: ../src/modules/alsa/alsa-mixer.c:2420
+msgid "Bass Boost"
+msgstr "Basszuskiemelés"
-#: ../src/daemon/dumpmodules.c:65
-#, c-format
-msgid "Version: %s\n"
-msgstr "Verzió: %s\n"
+#: ../src/modules/alsa/alsa-mixer.c:2421
+msgid "No Bass Boost"
+msgstr "Nincs basszuskiemelés"
-#: ../src/daemon/dumpmodules.c:67
-#, c-format
-msgid "Description: %s\n"
-msgstr "Leírás: %s\n"
+#: ../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 "Hangszóró"
-#: ../src/daemon/dumpmodules.c:69
-#, c-format
-msgid "Author: %s\n"
-msgstr "Szerző: %s\n"
+#: ../src/modules/alsa/alsa-mixer.c:2423 ../src/modules/alsa/alsa-mixer.c:2495
+msgid "Headphones"
+msgstr "Analóg fejhallgató"
-#: ../src/daemon/dumpmodules.c:71
-#, c-format
-msgid "Usage: %s\n"
-msgstr "Használat: %s\n"
+#: ../src/modules/alsa/alsa-mixer.c:2484
+msgid "Analog Input"
+msgstr "Analóg bemenet"
-#: ../src/daemon/dumpmodules.c:72
-#, c-format
-msgid "Load Once: %s\n"
-msgstr "Betöltve: %s\n"
+#: ../src/modules/alsa/alsa-mixer.c:2488
+msgid "Dock Microphone"
+msgstr "Dokkolóállomás mikrofon"
-#: ../src/daemon/dumpmodules.c:74
-#, c-format
-msgid "DEPRECATION WARNING: %s\n"
-msgstr "VISSZAVONÁSI FIGYELMEZTETÉS: %s\n"
+#: ../src/modules/alsa/alsa-mixer.c:2490
+msgid "Headset Microphone"
+msgstr "Fejhallgató mikrofon"
-#: ../src/daemon/dumpmodules.c:78
-#, c-format
-msgid "Path: %s\n"
-msgstr "Elérési útvonal: %s\n"
+#: ../src/modules/alsa/alsa-mixer.c:2494
+msgid "Analog Output"
+msgstr "Analóg kimenet"
-#: ../src/daemon/daemon-conf.c:275
-#, c-format
-msgid "[%s:%u] Invalid log target '%s'."
-msgstr "[%s:%u] Érvénytelen naplózási cél: „%s”."
+#: ../src/modules/alsa/alsa-mixer.c:2496
+msgid "LFE on Separate Mono Output"
+msgstr "Analóg kimenet (mély)"
-#: ../src/daemon/daemon-conf.c:291
-#, c-format
-msgid "[%s:%u] Invalid log level '%s'."
-msgstr "[%s:%u] Érvénytelen naplózási szint: „%s”."
+#: ../src/modules/alsa/alsa-mixer.c:2497
+msgid "Line Out"
+msgstr "Vonalkimenet"
-#: ../src/daemon/daemon-conf.c:307
-#, c-format
-msgid "[%s:%u] Invalid resample method '%s'."
-msgstr "[%s:%u] Érvénytelen újramintavételezési eljárás: „%s”."
+#: ../src/modules/alsa/alsa-mixer.c:2498
+msgid "Analog Mono Output"
+msgstr "Analóg mono kimenet"
-#: ../src/daemon/daemon-conf.c:330
-#, c-format
-msgid "[%s:%u] Invalid rlimit '%s'."
-msgstr "[%s:%u] Érvénytelen rlimit érték: „%s”."
+#: ../src/modules/alsa/alsa-mixer.c:2499
+msgid "Speakers"
+msgstr "Hangszórók"
-#: ../src/daemon/daemon-conf.c:351
-#, c-format
-msgid "[%s:%u] Invalid sample format '%s'."
-msgstr "[%s:%u] Érvénytelen mintavételi formátum: „%s”."
+#: ../src/modules/alsa/alsa-mixer.c:2500
+msgid "HDMI / DisplayPort"
+msgstr "HDMI / DisplayPort"
-#: ../src/daemon/daemon-conf.c:370 ../src/daemon/daemon-conf.c:389
-#, c-format
-msgid "[%s:%u] Invalid sample rate '%s'."
-msgstr "[%s:%u] Érvénytelen mintavételi ráta: „%s”."
+#: ../src/modules/alsa/alsa-mixer.c:2501
+msgid "Digital Output (S/PDIF)"
+msgstr "Digitális kimenet (S/PDIF)"
-#: ../src/daemon/daemon-conf.c:413
-#, c-format
-msgid "[%s:%u] Invalid sample channels '%s'."
-msgstr "[%s:%u] Érvénytelen minta csatornák: „%s”."
+#: ../src/modules/alsa/alsa-mixer.c:2502
+msgid "Digital Input (S/PDIF)"
+msgstr "Digitális bemenet (S/PDIF)"
-#: ../src/daemon/daemon-conf.c:431
-#, c-format
-msgid "[%s:%u] Invalid channel map '%s'."
-msgstr "[%s:%u] Érvénytelen csatornaleképzés: „%s”."
+#: ../src/modules/alsa/alsa-mixer.c:2503
+msgid "Digital Passthrough (S/PDIF)"
+msgstr "Digitális Passthrough (S/PDIF)"
-#: ../src/daemon/daemon-conf.c:449
-#, c-format
-msgid "[%s:%u] Invalid number of fragments '%s'."
-msgstr "[%s:%u] Érvénytelen a részek száma: „%s”."
+#: ../src/modules/alsa/alsa-mixer.c:2504
+msgid "Multichannel Input"
+msgstr "Többcsatornás bemenet"
-#: ../src/daemon/daemon-conf.c:467
-#, c-format
-msgid "[%s:%u] Invalid fragment size '%s'."
-msgstr "[%s:%u] Érvénytelen a részek mérete: „%s”."
+#: ../src/modules/alsa/alsa-mixer.c:2505
+msgid "Multichannel Output"
+msgstr "Többcsatornás kimenet"
-#: ../src/daemon/daemon-conf.c:485
-#, c-format
-msgid "[%s:%u] Invalid nice level '%s'."
-msgstr "[%s:%u] Érvénytelen a prioritási érték: „%s”."
+#: ../src/modules/alsa/alsa-mixer.c:4014
+msgid "Analog Mono"
+msgstr "Analóg mono"
-#: ../src/daemon/daemon-conf.c:528
-#, fuzzy, c-format
-msgid "[%s:%u] Invalid server type '%s'."
-msgstr "[%s:%u] Érvénytelen mintavételi ráta: „%s”."
+#. 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:4015 ../src/modules/alsa/alsa-mixer.c:4021
+#: ../src/modules/alsa/alsa-mixer.c:4022
+msgid "Analog Stereo"
+msgstr "Analóg sztereó"
+
+#: ../src/modules/alsa/alsa-mixer.c:4023 ../src/modules/alsa/alsa-mixer.c:4024
+msgid "Multichannel"
+msgstr "Többcsatornás"
+
+#: ../src/modules/alsa/alsa-mixer.c:4025
+msgid "Analog Surround 2.1"
+msgstr "Analóg térhatású 2.1"
+
+#: ../src/modules/alsa/alsa-mixer.c:4026
+msgid "Analog Surround 3.0"
+msgstr "Analóg térhatású 3.0"
+
+#: ../src/modules/alsa/alsa-mixer.c:4027
+msgid "Analog Surround 3.1"
+msgstr "Analóg térhatású 3.1"
+
+#: ../src/modules/alsa/alsa-mixer.c:4028
+msgid "Analog Surround 4.0"
+msgstr "Analóg térhatású 4.0"
+
+#: ../src/modules/alsa/alsa-mixer.c:4029
+msgid "Analog Surround 4.1"
+msgstr "Analóg térhatású 4.1"
+
+#: ../src/modules/alsa/alsa-mixer.c:4030
+msgid "Analog Surround 5.0"
+msgstr "Analóg térhatású 5.0"
+
+#: ../src/modules/alsa/alsa-mixer.c:4031
+msgid "Analog Surround 5.1"
+msgstr "Analóg térhatású 5.1"
+
+#: ../src/modules/alsa/alsa-mixer.c:4032
+msgid "Analog Surround 6.0"
+msgstr "Analóg térhatású 6.0"
+
+#: ../src/modules/alsa/alsa-mixer.c:4033
+msgid "Analog Surround 6.1"
+msgstr "Analóg térhatású 6.1"
+
+#: ../src/modules/alsa/alsa-mixer.c:4034
+msgid "Analog Surround 7.0"
+msgstr "Analóg térhatású 7.0"
+
+#: ../src/modules/alsa/alsa-mixer.c:4035
+msgid "Analog Surround 7.1"
+msgstr "Analóg térhatású 7.1"
+
+#: ../src/modules/alsa/alsa-mixer.c:4036
+msgid "Digital Stereo (IEC958)"
+msgstr "Digitális sztereó (IEC958)"
+
+#: ../src/modules/alsa/alsa-mixer.c:4037
+msgid "Digital Passthrough (IEC958)"
+msgstr "Digitális Passthrough (IEC958)"
+
+#: ../src/modules/alsa/alsa-mixer.c:4038
+msgid "Digital Surround 4.0 (IEC958/AC3)"
+msgstr "Digitális térhatású 4.0 (IEC958/AC3)"
+
+#: ../src/modules/alsa/alsa-mixer.c:4039
+msgid "Digital Surround 5.1 (IEC958/AC3)"
+msgstr "Digitális térhatású 5.1 (IEC958/AC3)"
+
+#: ../src/modules/alsa/alsa-mixer.c:4040
+msgid "Digital Surround 5.1 (IEC958/DTS)"
+msgstr "Digitális térhatású 5.1 (IEC958/DTS)"
+
+#: ../src/modules/alsa/alsa-mixer.c:4041
+msgid "Digital Stereo (HDMI)"
+msgstr "Digitális térhatású (HDMI)"
+
+#: ../src/modules/alsa/alsa-mixer.c:4042
+msgid "Digital Surround 5.1 (HDMI)"
+msgstr "Digitális térhatású 5.1 (HDMI)"
+
+#: ../src/modules/alsa/alsa-mixer.c:4175
+msgid "Analog Mono Duplex"
+msgstr "Analóg mono duplex"
+
+#: ../src/modules/alsa/alsa-mixer.c:4176
+msgid "Analog Stereo Duplex"
+msgstr "Analóg sztereó duplex"
+
+#: ../src/modules/alsa/alsa-mixer.c:4177
+msgid "Digital Stereo Duplex (IEC958)"
+msgstr "Analóg sztereó duplex (IEC958)"
+
+#: ../src/modules/alsa/alsa-mixer.c:4178
+msgid "Multichannel Duplex"
+msgstr "Többcsatornás duplex"
+
+#: ../src/modules/alsa/alsa-mixer.c:4179
+#: ../src/modules/alsa/module-alsa-card.c:186
+#: ../src/modules/bluetooth/module-bluez4-device.c:2295
+#: ../src/modules/bluetooth/module-bluez5-device.c:1941
+msgid "Off"
+msgstr "Kikapcsolva"
-#: ../src/daemon/daemon-conf.c:641
+#: ../src/modules/alsa/alsa-mixer.c:4278
#, c-format
-msgid "Failed to open configuration file: %s"
-msgstr "Nem sikerült megnyitni a konfigurációs fájlt: %s"
+msgid "%s Output"
+msgstr "%s kimenet"
+
+#: ../src/modules/alsa/alsa-mixer.c:4286
+#, c-format
+msgid "%s Input"
+msgstr "%s bemenet"
-#: ../src/daemon/daemon-conf.c:657
+#: ../src/modules/alsa/alsa-sink.c:570
+#, c-format
msgid ""
-"The specified default channel map has a different number of channels than "
-"the specified default number of channels."
+"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 ""
-"Az alapértelmezetten megadott mintavételi leírás csatornáinak száma eltér az "
-"alapértelmezetten megadott csatornaszámtól."
+"Az ALSA modul értesítése nyomán új adatokat kellett volna írni az eszközre, "
+"de semmilyen írandó adat nem volt.\n"
+"Ez valószínűleg egy hiba eredménye az ALSA „%s” illesztőprogramban. Jelentse "
+"ezt a problémát az ALSA fejlesztői felé.\n"
+"Az értesítés érkezésekor a POLLOUT be volt állítva – viszont a későbbi "
+"„snd_pcm_avail()” függvény visszatérési értéke 0 vagy a min_avail-nál kisebb "
+"más érték volt."
-#: ../src/daemon/daemon-conf.c:743
+#: ../src/modules/alsa/alsa-sink.c:747
#, c-format
-msgid "### Read from configuration file: %s ###\n"
-msgstr "### Olvasás a következő konfigurációs fájlból: %s ###\n"
+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 ""
+"Az ALSA modul értesítése nyomán új adatokat kellett volna írni az eszközre, "
+"de semmilyen írandó adat nem volt.\n"
+"Ez valószínűleg egy hiba eredménye az ALSA „%s” illesztőprogramban. Jelentse "
+"ezt a problémát az ALSA fejlesztői felé.\n"
+"Az értesítés érkezésekor a POLLOUT be volt állítva – viszont a későbbi "
+"„snd_pcm_avail()” függvény visszatérési értéke 0 vagy a min_avail-nál kisebb "
+"más érték volt."
-#: ../src/daemon/caps.c:58
-msgid "Cleaning up privileges."
-msgstr "Jogosultságok letisztázása."
+#: ../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 ""
+"Az ALSA modul értesítése nyomán új adatokat kellett volna olvasni az "
+"eszközről, de nem volt olvasandó adat.\n"
+"Ez valószínűleg egy hiba eredménye az ALSA „%s” illesztőprogramban. Jelentse "
+"ezt a problémát az ALSA fejlesztői felé.\n"
+"Az értesítés érkezésekor a POLLIN be volt állítva – viszont a későbbi "
+"„snd_pcm_avail()” függvény visszatérési értéke 0 vagy a min_avail-nál kisebb "
+"más érték volt."
-#: ../src/daemon/pulseaudio.desktop.in.h:1
-msgid "PulseAudio Sound System"
-msgstr "PulseAudio hangrendszer"
+#: ../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 ""
+"Az ALSA modul értesítése nyomán új adatokat kellett volna olvasni az "
+"eszközről, de nem volt olvasandó adat.\n"
+"Ez valószínűleg egy hiba eredménye az ALSA „%s” illesztőprogramban. Jelentse "
+"ezt a problémát az ALSA fejlesztői felé.\n"
+"Az értesítés érkezésekor a POLLIN be volt állítva – viszont a későbbi "
+"„snd_pcm_avail()” függvény visszatérési értéke 0 vagy a min_avail-nál kisebb "
+"más érték volt."
-#: ../src/daemon/pulseaudio.desktop.in.h:2
-msgid "Start the PulseAudio Sound System"
-msgstr "A PulseAudio hangrendszer elindítása"
+#: ../src/modules/alsa/alsa-util.c:1166 ../src/modules/alsa/alsa-util.c:1241
+#, 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 ""
+"A „snd_pcm_avail()” függvény visszatérési értéke váratlanul nagy értékű: %lu "
+"bájt (%lu ms).\n"
+"Ez valószínűleg egy hiba eredménye az ALSA „%s” illesztőprogramban. Jelentse "
+"ezt a problémát az ALSA fejlesztői felé."
-#: ../src/daemon/pulseaudio-kde.desktop.in.h:1
-#, fuzzy
-msgid "PulseAudio Sound System KDE Routing Policy"
-msgstr "PulseAudio hangrendszer"
+#: ../src/modules/alsa/alsa-util.c:1216
+#, 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 ""
+"A „snd_pcm_delay()” függvény visszatérési értéke váratlanul nagy értékű: %li "
+"bájt (%s%lu ms).\n"
+"Ez valószínűleg egy hiba eredménye az ALSA „%s” illesztőprogramban. Jelentse "
+"ezt a problémát az ALSA fejlesztői felé."
-#: ../src/daemon/pulseaudio-kde.desktop.in.h:2
-#, fuzzy
-msgid "Start the PulseAudio Sound System with KDE Routing Policy"
-msgstr "A PulseAudio hangrendszer elindítása"
+#: ../src/modules/alsa/alsa-util.c:1257
+#, 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 ""
+"A „snd_pcm_avail_delay()” függvény furcsa értékeket adott vissza: a "
+"késleltetés (%lu) kisebb, mint az elérhető %lu.\n"
+"Ez valószínűleg egy hiba eredménye az ALSA „%s” illesztőprogramban. Jelentse "
+"ezt a problémát az ALSA fejlesztői felé."
+
+#: ../src/modules/alsa/alsa-util.c:1300
+#, 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 ""
+"A „snd_pcm_mmap_begin()” függvény visszatérési értéke kivételesen nagy: %lu "
+"bájt (%lu ms).\n"
+"Ez valószínűleg egy hiba eredménye az ALSA „%s” illesztőprogramban. Jelentse "
+"ezt a problémát az ALSA fejlesztői felé."
+
+#: ../src/modules/bluetooth/module-bluez4-device.c:2089
+#: ../src/modules/bluetooth/module-bluez5-device.c:1700
+msgid "Headset"
+msgstr "Fejhallgató"
+
+# FIXME: utánanézni
+#: ../src/modules/bluetooth/module-bluez4-device.c:2094
+#: ../src/modules/bluetooth/module-bluez5-device.c:1705
+msgid "Handsfree"
+msgstr "Kihangosító"
+
+#: ../src/modules/bluetooth/module-bluez4-device.c:2109
+#: ../src/modules/bluetooth/module-bluez5-device.c:1723
+msgid "Headphone"
+msgstr "Fülhallgató"
+
+#: ../src/modules/bluetooth/module-bluez4-device.c:2114
+#: ../src/modules/bluetooth/module-bluez5-device.c:1728
+msgid "Portable"
+msgstr "Hordozható"
+
+#: ../src/modules/bluetooth/module-bluez4-device.c:2119
+#: ../src/modules/bluetooth/module-bluez5-device.c:1733
+msgid "Car"
+msgstr "Autó"
+
+#: ../src/modules/bluetooth/module-bluez4-device.c:2124
+#: ../src/modules/bluetooth/module-bluez5-device.c:1738
+msgid "HiFi"
+msgstr "Hi-Fi"
+
+#: ../src/modules/bluetooth/module-bluez4-device.c:2129
+#: ../src/modules/bluetooth/module-bluez5-device.c:1743
+msgid "Phone"
+msgstr "Telefon"
+
+#: ../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 "Bluetooth kimenet"
+
+#: ../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 "Bluetooth bemenet"
+
+#: ../src/modules/bluetooth/module-bluez4-device.c:2176
+msgid "High Fidelity Playback (A2DP)"
+msgstr "Hi-Fi lejátszás (A2DP)"
+
+#: ../src/modules/bluetooth/module-bluez4-device.c:2187
+msgid "High Fidelity Capture (A2DP)"
+msgstr "Hi-Fi felvétel (A2DP)"
+
+#: ../src/modules/bluetooth/module-bluez4-device.c:2198
+msgid "Telephony Duplex (HSP/HFP)"
+msgstr "Telefon duplex (HSP/HFP)"
+
+#: ../src/modules/bluetooth/module-bluez4-device.c:2210
+msgid "Handsfree Gateway"
+msgstr "Kihangosító átjáró"
+
+#: ../src/modules/bluetooth/module-bluez5-device.c:1786
+msgid "High Fidelity Playback (A2DP Sink)"
+msgstr "Hi-Fi lejátszás (A2DP bemenet)"
+
+#: ../src/modules/bluetooth/module-bluez5-device.c:1797
+msgid "High Fidelity Capture (A2DP Source)"
+msgstr "Hi-Fi felvétel (A2DP forrás)"
+
+#: ../src/modules/bluetooth/module-bluez5-device.c:1808
+msgid "Headset Head Unit (HSP/HFP)"
+msgstr "Fejhallgató fejegység (HSP/HFP)"
+
+#: ../src/modules/bluetooth/module-bluez5-device.c:1820
+msgid "Headset Audio Gateway (HSP/HFP)"
+msgstr "Fejhallgató hangátjáró (HSP/HFP)"
+
+#: ../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> "
+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> use_master_format=<yes "
+"or no> "
+msgstr ""
+"source_name=<a forrás neve> source_properties=<a forrás tulajdonságai> "
+"source_master=<a szűrendő forrás neve> sink_name=<a nyelő neve> "
+"sink_properties=<a nyelő tulajdonságai> sink_master=<a szűrendő nyelő neve> "
+"adjust_time=<milyen gyakran módosítsa a gyakoriságokat, mp-ben> "
+"adjust_threshold=<mennyi csúszás után igazítson, mp-ben> "
+"format=<mintaformátum> rate=<mintavételezési gyakoriság> channels=<csatornák "
+"száma> channel_map=<csatornaleképzés> aec_method=<használandó megvalósítás> "
+"aec_args=<az AEC alrendszer paraméterei> save_aec=<AEC adatok mentése a /tmp-"
+"be> autoloaded=<beállítva, ha ez a modul automatikusan betöltődik> "
+"use_volume_sharing=<igen vagy nem> use_master_format=<igen vagy nem> "
+
+#. add on profile
+#: ../src/modules/macosx/module-coreaudio-device.c:811
+msgid "On"
+msgstr "Be"
+
+#: ../src/modules/module-always-sink.c:36
+msgid "Always keeps at least one sink loaded even if it's a null one"
+msgstr ""
+"Mindig maradjon betöltve legalább egy nyelő, még ha az csak az üres nyelő is"
+
+#: ../src/modules/module-always-sink.c:82
+msgid "Dummy Output"
+msgstr "Látszólagos kimenet"
+
+#: ../src/modules/module-equalizer-sink.c:70
+msgid "General Purpose Equalizer"
+msgstr "Általános célú hangszínszabályzó"
+
+#: ../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=<nyelő neve> sink_properties=<nyelő tulajdonságai> "
+"sink_master=<csatlakozás ezen nyelőhöz> format=<mintaformátum> "
+"rate=<mintavételezési gyakoriság> channels=<csatornák száma> "
+"channel_map=<csatornaleképzés> autoloaded=<beállítva, ha ez a modul "
+"automatikusan betöltődik> use_volume_sharing=<igen vagy nem>"
+
+#: ../src/modules/module-filter-apply.c:46
+msgid "autoclean=<automatically unload unused filters?>"
+msgstr "autoclean=<nem használt szűrők automatikus eltávolítása?>"
+
+#: ../src/modules/module-ladspa-sink.c:51
+msgid "Virtual LADSPA sink"
+msgstr "Látszólagos LADSPA nyelő"
+
+#: ../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=<nyelő neve> sink_properties=<nyelő tulajdonságai> "
+"master=<szűrendő nyelő neve> format=<mintaformátum> rate=<mintavételezési "
+"gyakoriság> channels=<csatornák száma> channel_map=<csatornaleképzés> "
+"plugin=<ladspa bővítmény neve> label=<ladspa bővítmény címkéje> "
+"control=<bemenetszabályzó értékek vesszővel elválasztott listája> "
+"input_ladspaport_map=<bemeneti LADSPA portnevek vesszővel elválasztott "
+"listája> output_ladspaport_map=<kimeneti LADSPA portnevek vesszővel "
+"elválasztott listája>"
+
+#: ../src/modules/module-null-sink.c:47
+msgid "Clocked NULL sink"
+msgstr "Órajelezett NULL nyelő"
+
+#: ../src/modules/module-null-sink.c:280
+msgid "Null Output"
+msgstr "NULL kimenet"
+
+#: ../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 "Kimeneti eszközök"
+
+#: ../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 "Bemeneti eszközök"
+
+#: ../src/modules/module-rygel-media-server.c:1063
+msgid "Audio on @HOSTNAME@"
+msgstr "Hangok ezen a számítógépen: @HOSTNAME@"
+
+#. 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 "Tunnel for %s@%s"
+msgstr "Alagút ennek: %s@%s"
+
+#: ../src/modules/module-tunnel-sink-new.c:517
+#: ../src/modules/module-tunnel-source-new.c:516
+#, c-format
+msgid "Tunnel to %s/%s"
+msgstr "Alagút ehhez: %s/%s"
+
+#: ../src/modules/module-virtual-surround-sink.c:47
+msgid "Virtual surround sink"
+msgstr "Virtuális térhatású nyelő"
+
+#: ../src/modules/module-virtual-surround-sink.c:51
+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=<channel map> "
+"use_volume_sharing=<yes or no> force_flat_volume=<yes or no> hrir=/path/to/"
+"left_hrir.wav "
+msgstr ""
+"sink_name=<nyelő neve> sink_properties=<nyelő tulajdonságai> "
+"master=<szűrendő nyelő neve> format=<mintavételi formátum> "
+"rate=<mintavételezési gyakoriság> channels=<csatornák száma> "
+"channel_map=<csatornaleképzés> use_volume_sharing=<igen vag nem> "
+"force_flat_volume=<igen vag nem> hrir=/útvonal/left_hrir.wav "
-#: ../src/pulse/channelmap.c:105 ../src/pulse/channelmap.c:757
+#: ../src/modules/reserve-wrap.c:149
+msgid "PulseAudio Sound Server"
+msgstr "PulseAudio hangkiszolgáló"
+
+#: ../src/pulse/channelmap.c:103 ../src/pulse/channelmap.c:771
msgid "Mono"
msgstr "Mono"
-#: ../src/pulse/channelmap.c:107
+#: ../src/pulse/channelmap.c:105
msgid "Front Center"
msgstr "Első középső"
-#: ../src/pulse/channelmap.c:108
+#: ../src/pulse/channelmap.c:106
msgid "Front Left"
msgstr "Első bal"
-#: ../src/pulse/channelmap.c:109
+#: ../src/pulse/channelmap.c:107
msgid "Front Right"
msgstr "Első jobb"
-#: ../src/pulse/channelmap.c:111
+#: ../src/pulse/channelmap.c:109
msgid "Rear Center"
msgstr "Hátsó középső"
-#: ../src/pulse/channelmap.c:112
+#: ../src/pulse/channelmap.c:110
msgid "Rear Left"
msgstr "Hátsó bal"
-#: ../src/pulse/channelmap.c:113
+#: ../src/pulse/channelmap.c:111
msgid "Rear Right"
msgstr "Hátsó jobb"
-#: ../src/pulse/channelmap.c:115
+#: ../src/pulse/channelmap.c:113
msgid "Subwoofer"
-msgstr ""
+msgstr "Mélysugárzó"
-#: ../src/pulse/channelmap.c:117
+#: ../src/pulse/channelmap.c:115
msgid "Front Left-of-center"
msgstr "Első közép-bal"
-#: ../src/pulse/channelmap.c:118
+#: ../src/pulse/channelmap.c:116
msgid "Front Right-of-center"
msgstr "Első közép-jobb"
-#: ../src/pulse/channelmap.c:120
+#: ../src/pulse/channelmap.c:118
msgid "Side Left"
msgstr "Bal oldalsó"
-#: ../src/pulse/channelmap.c:121
+#: ../src/pulse/channelmap.c:119
msgid "Side Right"
msgstr "Jobb oldalsó"
-#: ../src/pulse/channelmap.c:123
+#: ../src/pulse/channelmap.c:121
msgid "Auxiliary 0"
msgstr "Külső 0"
-#: ../src/pulse/channelmap.c:124
+#: ../src/pulse/channelmap.c:122
msgid "Auxiliary 1"
msgstr "Külső 1"
-#: ../src/pulse/channelmap.c:125
+#: ../src/pulse/channelmap.c:123
msgid "Auxiliary 2"
msgstr "Külső 2"
-#: ../src/pulse/channelmap.c:126
+#: ../src/pulse/channelmap.c:124
msgid "Auxiliary 3"
msgstr "Külső 3"
-#: ../src/pulse/channelmap.c:127
+#: ../src/pulse/channelmap.c:125
msgid "Auxiliary 4"
msgstr "Külső 4"
-#: ../src/pulse/channelmap.c:128
+#: ../src/pulse/channelmap.c:126
msgid "Auxiliary 5"
msgstr "Külső 5"
-#: ../src/pulse/channelmap.c:129
+#: ../src/pulse/channelmap.c:127
msgid "Auxiliary 6"
msgstr "Külső 6"
-#: ../src/pulse/channelmap.c:130
+#: ../src/pulse/channelmap.c:128
msgid "Auxiliary 7"
msgstr "Külső 7"
-#: ../src/pulse/channelmap.c:131
+#: ../src/pulse/channelmap.c:129
msgid "Auxiliary 8"
msgstr "Külső 8"
-#: ../src/pulse/channelmap.c:132
+#: ../src/pulse/channelmap.c:130
msgid "Auxiliary 9"
msgstr "Külső 9"
-#: ../src/pulse/channelmap.c:133
+#: ../src/pulse/channelmap.c:131
msgid "Auxiliary 10"
msgstr "Külső 10"
-#: ../src/pulse/channelmap.c:134
+#: ../src/pulse/channelmap.c:132
msgid "Auxiliary 11"
msgstr "Külső 11"
-#: ../src/pulse/channelmap.c:135
+#: ../src/pulse/channelmap.c:133
msgid "Auxiliary 12"
msgstr "Külső 12"
-#: ../src/pulse/channelmap.c:136
+#: ../src/pulse/channelmap.c:134
msgid "Auxiliary 13"
msgstr "Külső 13"
-#: ../src/pulse/channelmap.c:137
+#: ../src/pulse/channelmap.c:135
msgid "Auxiliary 14"
msgstr "Külső 14"
-#: ../src/pulse/channelmap.c:138
+#: ../src/pulse/channelmap.c:136
msgid "Auxiliary 15"
msgstr "Külső 15"
-#: ../src/pulse/channelmap.c:139
+#: ../src/pulse/channelmap.c:137
msgid "Auxiliary 16"
msgstr "Külső 16"
-#: ../src/pulse/channelmap.c:140
+#: ../src/pulse/channelmap.c:138
msgid "Auxiliary 17"
msgstr "Külső 17"
-#: ../src/pulse/channelmap.c:141
+#: ../src/pulse/channelmap.c:139
msgid "Auxiliary 18"
msgstr "Külső 18"
-#: ../src/pulse/channelmap.c:142
+#: ../src/pulse/channelmap.c:140
msgid "Auxiliary 19"
msgstr "Külső 19"
-#: ../src/pulse/channelmap.c:143
+#: ../src/pulse/channelmap.c:141
msgid "Auxiliary 20"
msgstr "Külső 20"
-#: ../src/pulse/channelmap.c:144
+#: ../src/pulse/channelmap.c:142
msgid "Auxiliary 21"
msgstr "Külső 21"
-#: ../src/pulse/channelmap.c:145
+#: ../src/pulse/channelmap.c:143
msgid "Auxiliary 22"
msgstr "Külső 22"
-#: ../src/pulse/channelmap.c:146
+#: ../src/pulse/channelmap.c:144
msgid "Auxiliary 23"
msgstr "Külső 23"
-#: ../src/pulse/channelmap.c:147
+#: ../src/pulse/channelmap.c:145
msgid "Auxiliary 24"
msgstr "Külső 24"
-#: ../src/pulse/channelmap.c:148
+#: ../src/pulse/channelmap.c:146
msgid "Auxiliary 25"
msgstr "Külső 25"
-#: ../src/pulse/channelmap.c:149
+#: ../src/pulse/channelmap.c:147
msgid "Auxiliary 26"
msgstr "Külső 26"
-#: ../src/pulse/channelmap.c:150
+#: ../src/pulse/channelmap.c:148
msgid "Auxiliary 27"
msgstr "Külső 27"
-#: ../src/pulse/channelmap.c:151
+#: ../src/pulse/channelmap.c:149
msgid "Auxiliary 28"
msgstr "Külső 28"
-#: ../src/pulse/channelmap.c:152
+#: ../src/pulse/channelmap.c:150
msgid "Auxiliary 29"
msgstr "Külső 29"
-#: ../src/pulse/channelmap.c:153
+#: ../src/pulse/channelmap.c:151
msgid "Auxiliary 30"
msgstr "Külső 30"
-#: ../src/pulse/channelmap.c:154
+#: ../src/pulse/channelmap.c:152
msgid "Auxiliary 31"
msgstr "Külső 31"
-#: ../src/pulse/channelmap.c:156
+#: ../src/pulse/channelmap.c:154
msgid "Top Center"
msgstr "Felső középső"
-#: ../src/pulse/channelmap.c:158
+#: ../src/pulse/channelmap.c:156
msgid "Top Front Center"
msgstr "Felső első középső"
-#: ../src/pulse/channelmap.c:159
+#: ../src/pulse/channelmap.c:157
msgid "Top Front Left"
msgstr "Felső első bal"
-#: ../src/pulse/channelmap.c:160
+#: ../src/pulse/channelmap.c:158
msgid "Top Front Right"
msgstr "Felső első jobb"
-#: ../src/pulse/channelmap.c:162
+#: ../src/pulse/channelmap.c:160
msgid "Top Rear Center"
msgstr "Felső hátsó középső"
-#: ../src/pulse/channelmap.c:163
+#: ../src/pulse/channelmap.c:161
msgid "Top Rear Left"
msgstr "Felső hátsó bal"
-#: ../src/pulse/channelmap.c:164
+#: ../src/pulse/channelmap.c:162
msgid "Top Rear Right"
msgstr "Felső hátsó jobb"
-#: ../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:127
+#: ../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 "(Érvénytelen)"
-#: ../src/pulse/channelmap.c:761
+#: ../src/pulse/channelmap.c:775
msgid "Stereo"
msgstr "Sztereó"
-#: ../src/pulse/channelmap.c:766
+#: ../src/pulse/channelmap.c:780
msgid "Surround 4.0"
msgstr "Térhatású 4.0"
-#: ../src/pulse/channelmap.c:772
+#: ../src/pulse/channelmap.c:786
msgid "Surround 4.1"
msgstr "Térhatású 4.1"
-#: ../src/pulse/channelmap.c:778
+#: ../src/pulse/channelmap.c:792
msgid "Surround 5.0"
msgstr "Térhatású 5.0"
-#: ../src/pulse/channelmap.c:784
+#: ../src/pulse/channelmap.c:798
msgid "Surround 5.1"
msgstr "Térhatású 5.1"
-#: ../src/pulse/channelmap.c:791
+#: ../src/pulse/channelmap.c:805
msgid "Surround 7.1"
msgstr "Térhatású 7.1"
-#: ../src/pulse/error.c:40
+#: ../src/pulse/client-conf-x11.c:53 ../src/utils/pax11publish.c:97
+msgid "xcb_connect() failed"
+msgstr "az xcb_connect() függvényhívás meghiúsult"
+
+#: ../src/pulse/client-conf-x11.c:58 ../src/utils/pax11publish.c:102
+msgid "xcb_connection_has_error() returned true"
+msgstr "az xcb_connection_has_error() igaz értéket adott vissza"
+
+#: ../src/pulse/client-conf-x11.c:94
+msgid "Failed to parse cookie data"
+msgstr "Nem sikerült feldolgozni a süti adatait"
+
+#: ../src/pulse/context.c:660
+#, c-format
+msgid "fork(): %s"
+msgstr "Programindítás: %s"
+
+#: ../src/pulse/context.c:715
+#, c-format
+msgid "waitpid(): %s"
+msgstr "waitpid(): %s"
+
+#: ../src/pulse/context.c:1421
+#, c-format
+msgid "Received message for unknown extension '%s'"
+msgstr "Üzenet érkezett az ismeretlen „%s” kiterjesztéstől"
+
+#: ../src/pulse/direction.c:37
+msgid "input"
+msgstr "bemenet"
+
+#: ../src/pulse/direction.c:39
+msgid "output"
+msgstr "kimenet"
+
+#: ../src/pulse/direction.c:41
+msgid "bidirectional"
+msgstr "kétirányú"
+
+#: ../src/pulse/direction.c:43
+msgid "invalid"
+msgstr "érvénytelen"
+
+#: ../src/pulsecore/core-util.c:1836
+#, 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 ""
+"Az XDG_RUNTIME_DIR (%s) tulajdonosa nem a PulseAudio (uid %d), hanem ez az "
+"uid: %d! (Ez például akkor fordulhat elő, ha egy nem rootként futó "
+"PulseAudio-hoz root felhasználóként próbál csatlakozni a natív protokollon. "
+"Ne tegye.)"
+
+#: ../src/pulsecore/core-util.h:97
+msgid "yes"
+msgstr "igen"
+
+#: ../src/pulsecore/core-util.h:97
+msgid "no"
+msgstr "nem"
+
+#: ../src/pulsecore/lock-autospawn.c:141 ../src/pulsecore/lock-autospawn.c:227
+msgid "Cannot access autospawn lock."
+msgstr "Nem érhető zárolás az automatikus indításhoz."
+
+#: ../src/pulsecore/log.c:154
+#, c-format
+msgid "Failed to open target file '%s'."
+msgstr "Nem sikerült megnyitni a cél „%s” fájlt."
+
+#: ../src/pulsecore/log.c:177
+#, c-format
+msgid ""
+"Tried to open target file '%s', '%s.1', '%s.2' ... '%s.%d', but all failed."
+msgstr ""
+"Kísérlet történt a cél fájlok megnyitására: „%s”, „%s.1”, „%s.2” ... „%s."
+"%d”, de mind meghiúsult."
+
+#: ../src/pulsecore/log.c:640
+msgid "Invalid log target."
+msgstr "Érvénytelen naplózási cél."
+
+#: ../src/pulsecore/sink.c:3460
+msgid "Built-in Audio"
+msgstr "Belső hangforrás"
+
+#: ../src/pulsecore/sink.c:3465
+msgid "Modem"
+msgstr "Modem"
+
+#: ../src/pulse/error.c:38
msgid "OK"
msgstr "OK"
-#: ../src/pulse/error.c:41
+#: ../src/pulse/error.c:39
msgid "Access denied"
msgstr "Hozzáférés megtagadva"
-#: ../src/pulse/error.c:42
+#: ../src/pulse/error.c:40
msgid "Unknown command"
msgstr "Ismeretlen parancs"
-#: ../src/pulse/error.c:43
+#: ../src/pulse/error.c:41
msgid "Invalid argument"
msgstr "Érvénytelen paraméter"
-#: ../src/pulse/error.c:44
+#: ../src/pulse/error.c:42
msgid "Entity exists"
msgstr "Az egység létezik"
-#: ../src/pulse/error.c:45
+#: ../src/pulse/error.c:43
msgid "No such entity"
msgstr "Nincs ilyen egység"
-#: ../src/pulse/error.c:46
+#: ../src/pulse/error.c:44
msgid "Connection refused"
msgstr "Kapcsolat elutasítva"
-#: ../src/pulse/error.c:47
+#: ../src/pulse/error.c:45
msgid "Protocol error"
msgstr "Protokollhiba"
-#: ../src/pulse/error.c:48
+#: ../src/pulse/error.c:46
msgid "Timeout"
msgstr "Időtúllépés"
-#: ../src/pulse/error.c:49
-msgid "No authorization key"
-msgstr "Nem érhető el hitelesítőkulcs"
+#: ../src/pulse/error.c:47
+msgid "No authentication key"
+msgstr "Nem érhető el hitelesítési kulcs"
-#: ../src/pulse/error.c:50
+#: ../src/pulse/error.c:48
msgid "Internal error"
msgstr "Belső hiba"
-#: ../src/pulse/error.c:51
+#: ../src/pulse/error.c:49
msgid "Connection terminated"
msgstr "A kapcsolat megszakadt."
-#: ../src/pulse/error.c:52
+#: ../src/pulse/error.c:50
msgid "Entity killed"
msgstr "Egység kilőve"
-#: ../src/pulse/error.c:53
+#: ../src/pulse/error.c:51
msgid "Invalid server"
msgstr "Érvénytelen kiszolgáló"
-#: ../src/pulse/error.c:54
+#: ../src/pulse/error.c:52
msgid "Module initialization failed"
msgstr "A modul előkészítése meghiúsult."
-#: ../src/pulse/error.c:55
+#: ../src/pulse/error.c:53
msgid "Bad state"
msgstr "Hibás állapot"
-#: ../src/pulse/error.c:56
+#: ../src/pulse/error.c:54
msgid "No data"
msgstr "Nincs adat"
-#: ../src/pulse/error.c:57
+#: ../src/pulse/error.c:55
msgid "Incompatible protocol version"
msgstr "Inkompatibilis protokollverzió"
-#: ../src/pulse/error.c:58
+#: ../src/pulse/error.c:56
msgid "Too large"
msgstr "Túl nagy"
-#: ../src/pulse/error.c:59
+#: ../src/pulse/error.c:57
msgid "Not supported"
msgstr "Nem támogatott"
-#: ../src/pulse/error.c:60
+#: ../src/pulse/error.c:58
msgid "Unknown error code"
msgstr "Ismeretlen hibakód"
-#: ../src/pulse/error.c:61
+#: ../src/pulse/error.c:59
msgid "No such extension"
msgstr "Nincs ilyen kiterjesztés"
-#: ../src/pulse/error.c:62
+#: ../src/pulse/error.c:60
msgid "Obsolete functionality"
msgstr "Elavult funkcionalitás"
-#: ../src/pulse/error.c:63
+#: ../src/pulse/error.c:61
msgid "Missing implementation"
msgstr "Nincs megvalósítva"
-#: ../src/pulse/error.c:64
+#: ../src/pulse/error.c:62
msgid "Client forked"
msgstr "Kliens elindítva"
-#: ../src/pulse/error.c:65
+#: ../src/pulse/error.c:63
msgid "Input/Output error"
msgstr "Kimeneti/bemeneti hiba"
-#: ../src/pulse/error.c:66
+#: ../src/pulse/error.c:64
msgid "Device or resource busy"
msgstr "Az eszköz vagy erőforrás foglalt"
-#: ../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
+#: ../src/pulse/sample.c:193
#, c-format
msgid "%0.1f KiB"
msgstr "%0.1f KiB"
-#: ../src/pulse/sample.c:189
+#: ../src/pulse/sample.c:195
#, 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 "A „pa_context_connect()” függvényhívás meghiúsult: %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 "Nem sikerült feldolgozni a süti adatokat."
-
-#: ../src/pulse/client-conf.c:117
+# Ez egy unit teszt program. Senki nem fogja látni. Fordíthatósága inkább bug.
+#: ../src/tests/resampler-test.c:255
#, c-format
-msgid "Failed to open configuration file '%s': %s"
-msgstr "Nem sikerült megnyitni a(z) „%s” konfigurációs fájlt: %s"
-
-#: ../src/pulse/context.c:528
-msgid "No cookie loaded. Attempting to connect without."
+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 ""
-"Nincs betölthető süti. Kísérlet a kapcsolat felvételére sütik használata "
-"nélkül."
-#: ../src/pulse/context.c:675
+#: ../src/tests/resampler-test.c:353
#, c-format
-msgid "fork(): %s"
-msgstr "Programindítás: %s"
-
-#: ../src/pulse/context.c:730
-#, c-format
-msgid "waitpid(): %s"
-msgstr "waitpid(): %s"
-
-#: ../src/pulse/context.c:1431
-#, c-format
-msgid "Received message for unknown extension '%s'"
-msgstr "Üzenet érkezett az ismeretlen „%s” kiterjesztéstől"
+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 "Nem sikerült csatlakozni a következő adatfolyamhoz: %s"
+msgstr "Nem sikerült megcsapolni a következő adatfolyamot: %s"
-#: ../src/utils/pacat.c:117
+#: ../src/utils/pacat.c:122
msgid "Playback stream drained."
-msgstr "A lejátszás adatfolyamához csatlakozva."
+msgstr "A lejátszási adatfolyam megcsapolva."
-#: ../src/utils/pacat.c:128
+#: ../src/utils/pacat.c:133
msgid "Draining connection to server."
-msgstr "Csatlakozás a kiszolgálóhoz kapcsolathoz."
+msgstr "A kiszolgáló kapcsolatának megcsapolása."
-#: ../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 "A „pa_stream_write()” függvényhívás meghiúsult: %s"
-#: ../src/utils/pacat.c:205
+#: ../src/utils/pacat.c:210
#, c-format
msgid "pa_stream_begin_write() failed: %s"
msgstr "A „pa_stream_begin_write()” függvényhívás meghiúsult: %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 "A „pa_stream_peek()” függvényhívás meghiúsult: %s"
-#: ../src/utils/pacat.c:325
+#: ../src/utils/pacat.c:340
msgid "Stream successfully created."
msgstr "Az adatfolyam sikeresen létrejött."
-#: ../src/utils/pacat.c:328
+#: ../src/utils/pacat.c:343
#, c-format
msgid "pa_stream_get_buffer_attr() failed: %s"
msgstr "A „pa_stream_get_buffer_attr()” függvényhívás meghiúsult: %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 ""
-"Pufferméretek: maximális nagyság: %u, hossz: %u, előpufferelés: %u, minimum: "
-"%u"
+"Pufferméretek: maximális hossz: %u, hossz: %u, előpufferelés: %u, minimum: %u"
-#: ../src/utils/pacat.c:335
+#: ../src/utils/pacat.c:350
#, c-format
msgid "Buffer metrics: maxlength=%u, fragsize=%u"
-msgstr "Pufferméretek: maximális nagyság: %u, részek mérete: %u"
+msgstr "Pufferméretek: maximális hossz: %u, részek mérete: %u"
-#: ../src/utils/pacat.c:339
+#: ../src/utils/pacat.c:354
#, c-format
msgid "Using sample spec '%s', channel map '%s'."
-msgstr "Mintavételi leírás: „%s” és csatornaleképzés: „%s” használata."
+msgstr "„%s” mintavételi leírás és „%s” csatornaleképzés használata."
-#: ../src/utils/pacat.c:343
+#: ../src/utils/pacat.c:358
#, c-format
-msgid "Connected to device %s (%u, %ssuspended)."
-msgstr "Csatlakozva a következő eszközhöz: „%s” (%u, %ssuspended)."
+msgid "Connected to device %s (index: %u, suspended: %s)."
+msgstr ""
+"Csatlakozva a következő eszközhöz: „%s” (index: %u, felfüggesztve: %s)."
-#: ../src/utils/pacat.c:353
+#: ../src/utils/pacat.c:368
#, c-format
msgid "Stream error: %s"
-msgstr "Adatfolyam hiba: %s"
+msgstr "Adatfolyamhiba: %s"
-#: ../src/utils/pacat.c:363
+#: ../src/utils/pacat.c:378
#, c-format
msgid "Stream device suspended.%s"
-msgstr "Adatfolyam-eszköz készenléti állapotban: %s"
+msgstr "Adatfolyam-eszköz készenléti állapotban. %s"
-#: ../src/utils/pacat.c:365
+#: ../src/utils/pacat.c:380
#, c-format
msgid "Stream device resumed.%s"
-msgstr "Adatfolyam-eszköz visszatért a készenléti állapotból: %s"
+msgstr "Adatfolyam-eszköz visszatért a készenléti állapotból. %s"
-#: ../src/utils/pacat.c:373
+#: ../src/utils/pacat.c:388
#, c-format
msgid "Stream underrun.%s"
-msgstr "%s adatfolyam alulcsordulás."
+msgstr "Adatfolyam-alulcsordulás. %s"
-#: ../src/utils/pacat.c:380
+#: ../src/utils/pacat.c:395
#, c-format
msgid "Stream overrun.%s"
-msgstr "%s adatfolyam túlcsordulás."
+msgstr "Adatfolyam-túlcsordulás. %s"
-#: ../src/utils/pacat.c:387
+#: ../src/utils/pacat.c:402
#, c-format
msgid "Stream started.%s"
-msgstr "%s adatfolyam elindítva."
+msgstr "Adatfolyam elindítva. %s"
-#: ../src/utils/pacat.c:394
+#: ../src/utils/pacat.c:409
#, c-format
msgid "Stream moved to device %s (%u, %ssuspended).%s"
msgstr ""
-"Az adatfolyam áthelyezve a következő eszközre: „%s” (%u, %ssuspended). %s"
+"Az adatfolyam áthelyezve a következő eszközre: „%s” (%u, %s felfüggesztve). "
+"%s"
-#: ../src/utils/pacat.c:394
+#: ../src/utils/pacat.c:409
msgid "not "
msgstr "nem"
-#: ../src/utils/pacat.c:401
+#: ../src/utils/pacat.c:416
#, c-format
msgid "Stream buffer attributes changed.%s"
-msgstr "Az adatfolyam-puffer beállításai megváltoztak: %s"
+msgstr "Az adatfolyampuffer attribútumai megváltoztak. %s"
-#: ../src/utils/pacat.c:416
+#: ../src/utils/pacat.c:431
msgid "Cork request stack is empty: corking stream"
-msgstr ""
+msgstr "A dugókérés verem üres: adatfolyam eldugaszolása"
-#: ../src/utils/pacat.c:422
+#: ../src/utils/pacat.c:437
msgid "Cork request stack is empty: uncorking stream"
-msgstr ""
+msgstr "A dugókérés verem üres: adatfolyam eldugaszolásának megszüntetése"
-#: ../src/utils/pacat.c:426
-msgid "Warning: Received more uncork requests than cork requests!"
+#: ../src/utils/pacat.c:441
+msgid "Warning: Received more uncork requests than cork requests."
msgstr ""
+"Figyelmeztetés: több eldugaszolás-megszüntetési kérés érkezett, mint "
+"eldugaszolási."
-#: ../src/utils/pacat.c:451
+#: ../src/utils/pacat.c:466
#, c-format
msgid "Connection established.%s"
msgstr "Kapcsolat létrehozva. %s"
-#: ../src/utils/pacat.c:454
+#: ../src/utils/pacat.c:469
#, c-format
msgid "pa_stream_new() failed: %s"
msgstr "A „pa_stream_new()” függvényhívás meghiúsult: %s"
-#: ../src/utils/pacat.c:492
+#: ../src/utils/pacat.c:507
#, c-format
msgid "pa_stream_connect_playback() failed: %s"
msgstr "A „pa_stream_connect_playback()” függvényhívás meghiúsult: %s"
-#: ../src/utils/pacat.c:498
+#: ../src/utils/pacat.c:513
+#, c-format
+msgid "Failed to set monitor stream: %s"
+msgstr "Nem sikerült beállítani az adatfolyam megfigyelését: %s"
+
+#: ../src/utils/pacat.c:517
#, c-format
msgid "pa_stream_connect_record() failed: %s"
msgstr "A „pa_stream_connect_record()” függvényhívás meghiúsult: %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 "Kapcsolódási hiba: %s"
-#: ../src/utils/pacat.c:545
+#: ../src/utils/pacat.c:563
msgid "Got EOF."
msgstr "A fájl vége elérve."
-#: ../src/utils/pacat.c:582
+#: ../src/utils/pacat.c:600
#, c-format
msgid "write() failed: %s"
-msgstr "Az írás sikertelen: %s"
+msgstr "A „write()” függvényhívás sikertelen: %s"
-#: ../src/utils/pacat.c:603
+#: ../src/utils/pacat.c:621
msgid "Got signal, exiting."
-msgstr "Kilépés, szignál hatására…"
+msgstr "Kilépés, szignál hatására."
-#: ../src/utils/pacat.c:617
+#: ../src/utils/pacat.c:635
#, c-format
msgid "Failed to get latency: %s"
msgstr "Nem sikerült lekérdezni a késleltetést: %s"
-#: ../src/utils/pacat.c:622
+#: ../src/utils/pacat.c:640
#, c-format
msgid "Time: %0.3f sec; Latency: %0.0f usec."
msgstr "Idő: %0.3f másodperc, késleltetés: %0.0f ezredmásodperc."
-#: ../src/utils/pacat.c:643
+#: ../src/utils/pacat.c:661
#, c-format
msgid "pa_stream_update_timing_info() failed: %s"
msgstr "A „pa_stream_update_timing_info()” függvényhívás meghiúsult: %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"
@@ -1367,16 +1929,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"
@@ -1391,12 +1953,16 @@ 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 [KAPCSOLÓ]\n"
"\n"
+"%s\n"
+"\n"
" -h, --help Ezen súgó megjelenítése\n"
" --version Az alkalmazás verziószámának "
"megjelenítése\n"
@@ -1404,55 +1970,88 @@ msgstr ""
" -r, --record Kapcsolat létrehozása felvételhez\n"
" -p, --playback Kapcsolat létrehozása lejátszáshoz\n"
"\n"
-" -v, --verbose Történések részletezése\n"
+" -v, --verbose Részletes üzenetek\n"
"\n"
-" -s, --server=KISZOLGÁLÓ Kapcsolódás a megadott "
-"KISZOLGÁLÓ kiszolgálóhoz\n"
+" -s, --server=KISZOLGÁLÓ Kapcsolódás a megadott KISZOLGÁLÓ "
+"kiszolgálóhoz\n"
" -d, --device=ESZKÖZ Kapcsolódás az ESZKÖZ nevű nyelőhöz "
"vagy forráshoz\n"
-" -n, --client-name=NÉV A kliens neve ezen a szerveren\n"
-" --stream-name=NÉV Adatfolyam neve a kiszolgálón\n"
-" --volume=HANGERŐ Kezdeti (lineáris) hangerő megadása "
-"a következő tartományban: 0...65536\n"
-" --rate=MINTAVÉTEL Mintavételezés érzéke Hz-ben "
+" -n, --client-name=NÉV A kliens neve ezen a szerveren\n"
+" --stream-name=NÉV Adatfolyam neve a kiszolgálón\n"
+" --volume=HANGERŐ Kezdeti (lineáris) hangerő megadása "
+"0...65536 között\n"
+" --rate=MINTAVÉTEL Mintavételezés gyakorisága Hz-ben "
"(alapértelmezés: 44100)\n"
-" --format=MINTAFORMÁTUM A mintavétel típusa a "
-"következőkből: s16le, s16be, u8, float32le,\n"
+" --format=MINTAFORMÁTUM Mintavételezés típusa, lehetséges "
+"értékek: s16le, s16be, u8, float32le,\n"
" float32be, ulaw, alaw, s32le, s32be, "
"s24le, s24be,\n"
" s24-32le, s24-32be (alapértelmezés: "
"s16ne)\n"
-" --channels=CSATORNÁK Csatornák száma: 1 - mono, 2 - "
+" --channels=CSATORNÁK Csatornák száma: 1 - mono, 2 - "
"sztereó\n"
-" (defaults to 2)\n"
-" --channel-map=CSATORNALEKÉPZÉS Az alapértelmezés helyett "
+" (alapértelmezés: 2)\n"
+" --channel-map=CSATORNALEKÉPZÉS Az alapértelmezés helyett "
"használandó csatornaleképzés\n"
-" --fix-format Take the sample format from the sink "
-"the stream is\n"
-" being connected to.\n"
-" --fix-rate Take the sampling rate from the sink "
-"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"
-" --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"
-" --property=PROPERTY=VALUE Set the specified property to the "
-"specified value.\n"
+" --fix-format A mintavételi formátum átvétele a "
+"nyelőtől/forrástól,\n"
+" amelyhez az adatfolyam csatlakozik.\n"
+" --fix-rate A mintavételi gyakoriság átvétele a "
+"nyelőtől/forrástól,\n"
+" amelyhez az adatfolyam csatlakozik.\n"
+" --fix-channels A csatornaszám és a csatornaleképzés "
+"átvétele a nyelőtől/forrástól,\n"
+" amelyhez az adatfolyam csatlakozik.\n"
+" --no-remix Ne keverjen fel vagy le "
+"csatornákat.\n"
+" --no-remap Csatornák leképezése index és nem "
+"név szerint.\n"
+" --latency=BÁJT A bájtokban megadott késleltetés "
+"kérése.\n"
+" --process-time=BÁJT A bájtokban megadott kérésenkénti "
+"feldolgozási idő kérése.\n"
+" --latency-msec=MSEC Az ezredmásodpercben megadott "
+"késleltetés kérése.\n"
+" --process-time-msec=MSEC Az ezredmásodpercben kérésenkénti "
+"feldolgozási idő kérése.\n"
+" --property=TULAJDONSÁG=ÉRTÉK A megadott tulajdonság beállítása az "
+"adott értékre.\n"
" --raw Nyers PCM adatok felvétele vagy "
"lejátszása.\n"
-" --file-format=FORMÁTUM FORMÁTUM alakú PCM adatok felvétele "
+" --passthrough Passthrough adatok.\n"
+" --file-format[=FORMÁTUM] Adott FORMÁTUMÚ PCM adatok felvétele "
"vagy lejátszása.\n"
" --list-file-formats Elérhető fájlformátumok listája.\n"
+" --monitor-stream=INDEX Felvétel az INDEX indexű "
+"nyelőbemenetről.\n"
+
+#: ../src/utils/pacat.c:788
+msgid "Play back encoded audio files on a PulseAudio sound server."
+msgstr "Kódolt hangfájlok lejátszása egy PulseAudio hangkiszolgálón."
+
+#: ../src/utils/pacat.c:792
+msgid ""
+"Capture audio data from a PulseAudio sound server and write it to a file."
+msgstr ""
+"Hangadatok rögzítése egy PulseAudio hangkiszolgálóról, és fájlba írásuk."
+
+#: ../src/utils/pacat.c:796
+msgid ""
+"Capture audio data from a PulseAudio sound server and write it to STDOUT or "
+"the specified file."
+msgstr ""
+"Hangadatok rögzítése egy PulseAudio hangkiszolgálóról, és szabványos "
+"kimenetre, vagy a megadott fájlba írásuk."
+
+#: ../src/utils/pacat.c:800
+msgid ""
+"Play back audio data from STDIN or the specified file on a PulseAudio sound "
+"server."
+msgstr ""
+"Hangadatok lejátszása a szabványos bemenetről, vagy a megadott fájlból egy "
+"PulseAudio hangkiszolgálón."
-#: ../src/utils/pacat.c:786
+#: ../src/utils/pacat.c:814
#, c-format
msgid ""
"pacat %s\n"
@@ -1460,256 +2059,321 @@ msgid ""
"Linked with libpulse %s\n"
msgstr ""
"pacat %s\n"
-"Összeépítve a libpulse %s programkönyvtárral\n"
-"Csatolva a libpulse %s programkönyvtárhoz\n"
+"Lefordítva a libpulse %s programkönyvtárral\n"
+"Összeszerkesztve a libpulse %s programkönyvtárhoz\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 "Érvénytelen kliensnév: „%s”"
-#: ../src/utils/pacat.c:834
+#: ../src/utils/pacat.c:862
#, c-format
msgid "Invalid stream name '%s'"
-msgstr "Érvénytelen adatfolyam-név: „%s”"
+msgstr "Érvénytelen adatfolyamnév: „%s”"
-#: ../src/utils/pacat.c:871
+#: ../src/utils/pacat.c:899
#, c-format
msgid "Invalid channel map '%s'"
msgstr "Érvénytelen csatornaleképzés: „%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 "Érvénytelen késleltetés leírás: „%s”"
+msgstr "Érvénytelen késleltetésmeghatározás: „%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 "Érvénytelen műveleti idő leírás: „%s”"
+msgstr "Érvénytelen feldolgozásiidő-meghatározás: „%s”"
-#: ../src/utils/pacat.c:933
+#: ../src/utils/pacat.c:961
#, c-format
msgid "Invalid property '%s'"
msgstr "Érvénytelen tulajdonság: „%s”"
-#: ../src/utils/pacat.c:952
+#: ../src/utils/pacat.c:980
#, c-format
msgid "Unknown file format %s."
-msgstr "Ismeretlen fájlformátum: „%s”"
+msgstr "Ismeretlen fájlformátum: „%s”."
-#: ../src/utils/pacat.c:971
+#: ../src/utils/pacat.c:995
+msgid "Failed to parse the argument for --monitor-stream"
+msgstr "A --monitor-stream argumentumának feldolgozása sikertelen"
+
+#: ../src/utils/pacat.c:1006
msgid "Invalid sample specification"
-msgstr "Érvénytelen mintavételi leírás."
+msgstr "Érvénytelen mintameghatározás"
-#: ../src/utils/pacat.c:981
+#: ../src/utils/pacat.c:1016
#, c-format
msgid "open(): %s"
-msgstr "Megnyitás: %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 "Túl sok paraméter."
+msgstr "Túl sok argumentum."
-#: ../src/utils/pacat.c:1004
+#: ../src/utils/pacat.c:1039
msgid "Failed to generate sample specification for file."
-msgstr "Nem sikerült létrehozni a mintavételi leírást a fájlhoz."
+msgstr "Nem sikerült létrehozni a mintavételi meghatározást a fájlhoz."
-#: ../src/utils/pacat.c:1030
+#: ../src/utils/pacat.c:1065
msgid "Failed to open audio file."
msgstr "Nem sikerült megnyitni a hangfájlt."
-#: ../src/utils/pacat.c:1036
+#: ../src/utils/pacat.c:1071
msgid ""
"Warning: specified sample specification will be overwritten with "
"specification from file."
msgstr ""
-"Figyelmeztetés: a megadott mintavételi leírás felül lesz írva a fájlból "
-"származó mintavételi leírással."
+"Figyelmeztetés: a megadott mintavételi meghatározás felül lesz írva a "
+"fájlból származó meghatározással."
-#: ../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 "Nem sikerült meghatározni a mintavételi leírást a fájlból."
+msgstr "Nem sikerült meghatározni a mintavételi meghatározást a fájlból."
-#: ../src/utils/pacat.c:1048
+#: ../src/utils/pacat.c:1083
msgid "Warning: Failed to determine channel map from file."
msgstr ""
"Figyelmeztetés: Nem sikerült meghatározni a csatornaleképzést a fájlból."
-#: ../src/utils/pacat.c:1059
+#: ../src/utils/pacat.c:1094
msgid "Channel map doesn't match sample specification"
-msgstr "A csatornaleképzés nem feleltethető meg a mintavételi leírásnak."
+msgstr "A csatornaleképzés nem feleltethető meg a mintavételi meghatározásnak"
-#: ../src/utils/pacat.c:1070
+#: ../src/utils/pacat.c:1105
msgid "Warning: failed to write channel map to file."
msgstr "Hiba történt a csatornaleképzés fájlba írása közben."
-#: ../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 ""
-"A(z) „%s” adatfolyam megnyitása a következő mintavételi leírás: „%s” és "
-"csatornaleképzés: „%s” használatával."
+"A(z) „%s” adatfolyam megnyitása a következő mintavételi meghatározás: „%s” "
+"és csatornaleképzés: „%s” használatával."
-#: ../src/utils/pacat.c:1086
+#: ../src/utils/pacat.c:1121
msgid "recording"
-msgstr "Felvétel"
+msgstr "felvétel"
-#: ../src/utils/pacat.c:1086
+#: ../src/utils/pacat.c:1121
msgid "playback"
-msgstr "Lejátszás"
+msgstr "lejátszás"
-#: ../src/utils/pacat.c:1110
-#, fuzzy
+#: ../src/utils/pacat.c:1145
msgid "Failed to set media name."
-msgstr "Nem sikerült feldolgozni a parancssort."
+msgstr "Nem sikerült beállítani a médianevet."
-#: ../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 "A „pa_mainloop_new()” függvényhívás meghiúsult."
-#: ../src/utils/pacat.c:1136
+#: ../src/utils/pacat.c:1175
msgid "io_new() failed."
-msgstr "A „io_new()” függvényhívás meghiúsult."
+msgstr "Az „io_new()” függvényhívás meghiúsult."
-#: ../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 "A „pa_context_new()” függvényhívás meghiúsult."
-#: ../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 "A „pa_context_connect()” függvényhívás meghiúsult: %s"
-#: ../src/utils/pacat.c:1157
+#: ../src/utils/pacat.c:1196
msgid "pa_context_rttime_new() failed."
msgstr "A „pa_context_rttime_new()” függvényhívás meghiúsult."
-#: ../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 "A „pa_mainloop_run()” függvényhívás meghiúsult."
-#: ../src/utils/pasuspender.c:79
-#, c-format
-msgid "fork(): %s\n"
-msgstr "Programindítás: %s\n"
+#: ../src/utils/pacmd.c:51 ../src/utils/pactl.c:1570
+msgid "NAME [ARGS ...]"
+msgstr "NÉV [ARGUMENTUMOK …]"
-#: ../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ÉV|#N"
-#: ../src/utils/pasuspender.c:107
-#, c-format
-msgid "Failure to suspend: %s\n"
-msgstr "Hiba lépett fel a készenléti állapotba térés közben: %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 "NÉV"
-#: ../src/utils/pasuspender.c:122
-#, c-format
-msgid "Failure to resume: %s\n"
-msgstr "Hiba lépett fel a készenléti állapotból visszatérés közben: %s\n"
+#: ../src/utils/pacmd.c:54
+msgid "NAME|#N VOLUME"
+msgstr "NÉV|#N HANGERŐ"
-#: ../src/utils/pasuspender.c:145
-#, c-format
-msgid "WARNING: Sound server is not local, not suspending.\n"
-msgstr ""
-"FIGYELMEZTETÉS: A hangkiszolgáló nem helyi és nincs is felfüggesztve.\n"
+#: ../src/utils/pacmd.c:55
+msgid "#N VOLUME"
+msgstr "#N HANGERŐ"
-#: ../src/utils/pasuspender.c:157
-#, c-format
-msgid "Connection failure: %s\n"
-msgstr "Kapcsolódási hiba: %s\n"
+#: ../src/utils/pacmd.c:56 ../src/utils/pacmd.c:70 ../src/utils/pactl.c:1573
+msgid "NAME|#N 1|0"
+msgstr "NÉV|#N 1|0"
-#: ../src/utils/pasuspender.c:174
-#, c-format
-msgid "Got SIGINT, exiting.\n"
-msgstr "Kilépés, SIGINT szignál hatására…\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 ""
-"FIGYELMEZTETÉS: A gyermek folyamat a következő szignállal fejeződött be: %u\n"
+#: ../src/utils/pacmd.c:58
+msgid "NAME|#N KEY=VALUE"
+msgstr "NÉV|#N KULCS=ÉRTÉK"
+
+#: ../src/utils/pacmd.c:59
+msgid "#N KEY=VALUE"
+msgstr "#N KULCS=ÉRTÉK"
+
+#: ../src/utils/pacmd.c:61
+msgid "#N"
+msgstr "#N"
+
+#: ../src/utils/pacmd.c:62
+msgid "NAME SINK|#N"
+msgstr "NÉV NYELŐ|#N"
+
+#: ../src/utils/pacmd.c:64 ../src/utils/pacmd.c:65
+msgid "NAME FILENAME"
+msgstr "NÉV FÁJLNÉV"
+
+#: ../src/utils/pacmd.c:66
+msgid "PATHNAME"
+msgstr "ÚTVONALNÉV"
+
+#: ../src/utils/pacmd.c:67
+msgid "FILENAME SINK|#N"
+msgstr "FÁJLNÉV NYELŐ|#N"
+
+#: ../src/utils/pacmd.c:69 ../src/utils/pactl.c:1572
+msgid "#N SINK|SOURCE"
+msgstr "#N NYELŐ|FORRÁS"
+
+#: ../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 "KÁRTYAPROFIL"
+
+#: ../src/utils/pacmd.c:73 ../src/utils/pactl.c:1576
+msgid "NAME|#N PORT"
+msgstr "NÉV|#N PORT"
+
+#: ../src/utils/pacmd.c:74 ../src/utils/pactl.c:1582
+msgid "CARD-NAME|CARD-#N PORT OFFSET"
+msgstr "KÁRTYANÉV|KÁRTYA-#N PORTELTOLÁS"
+
+#: ../src/utils/pacmd.c:75
+msgid "TARGET"
+msgstr "CÉL"
+
+#: ../src/utils/pacmd.c:76
+msgid "NUMERIC-LEVEL"
+msgstr "SZÁMOZOTT-SZINT"
-#: ../src/utils/pasuspender.c:210
+#: ../src/utils/pacmd.c:79
+msgid "FRAMES"
+msgstr "KERETEK"
+
+#: ../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 [KAPCSOLÓ] ... \n"
-"\n"
-" -h, --help Megjeleníti ezt a súgót\n"
-" --version Az alkalmazás verziószámának "
-"megjelenítése\n"
"\n"
+" -h, --help Ezen súgó megjelenítése\n"
+" --version Verziószám megjelenítése\n"
+"Ha nincs megadva parancs, a pacmd interaktív módban indul.\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"
-"Összeépítve a libpulse %s programkönyvtárral\n"
-"Csatolva a libpulse %s programkönyvtárhoz\n"
+"pacmd %s\n"
+"Lefordítva a libpulse %s programkönyvtárral\n"
+"Összeszerkesztve a libpulse %s programkönyvtárhoz\n"
+
+#: ../src/utils/pacmd.c:142
+msgid "No PulseAudio daemon running, or not running as session daemon."
+msgstr "Nem fut a PulseAudio démon, vagy nem munkamenet-démonként fut."
-#: ../src/utils/pasuspender.c:277
+#: ../src/utils/pacmd.c:147
#, c-format
-msgid "pa_mainloop_new() failed.\n"
-msgstr "A „pa_mainloop_new()” függvényhívás meghiúsult.\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 "A „pa_context_new()” függvényhívás meghiúsult.\n"
+msgid "connect(): %s"
+msgstr "connect(): %s"
-#: ../src/utils/pasuspender.c:298
+#: ../src/utils/pacmd.c:172
+msgid "Failed to kill PulseAudio daemon."
+msgstr "A PulseAudio démon kilövése nem sikerült."
+
+#: ../src/utils/pacmd.c:180
+msgid "Daemon not responding."
+msgstr "A démon nem válaszol."
+
+#: ../src/utils/pacmd.c:212 ../src/utils/pacmd.c:321 ../src/utils/pacmd.c:339
#, c-format
-msgid "pa_mainloop_run() failed.\n"
-msgstr "A „pa_mainloop_run()” függvényhívás meghiúsult.\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 "Nem sikerült a statisztika lekérdezése: %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 ""
-"Jelenleg lefoglalt blokkok száma: %u, amely összesen %s bájtot jelent.\n"
+msgstr "Jelenleg használt: %u blokk, összesen %s bájt tartalommal.\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 ""
-"A futás során összesen lefoglalt blokkok száma: %u, amely összesen %s bájtot "
-"jelent.\n"
+"A futás során összesen lefoglalva: %u blokk, összesen %s bájt tartalommal.\n"
-#: ../src/utils/pactl.c:162
+#: ../src/utils/pactl.c:176
#, c-format
msgid "Sample cache size: %s\n"
-msgstr "Minta-gyorsítótár mérete: %s\n"
+msgstr "Mintagyorsítótár mérete: %s\n"
-#: ../src/utils/pactl.c:171
+#: ../src/utils/pactl.c:185
#, c-format
msgid "Failed to get server information: %s"
-msgstr "Nem sikerült lekérdezni a kiszolgáló adatait: „%s”"
+msgstr "Nem sikerült lekérni a kiszolgáló adatait: %s"
-#: ../src/utils/pactl.c:176
+#: ../src/utils/pactl.c:190
#, c-format
msgid ""
"Server String: %s\n"
@@ -1719,9 +2383,15 @@ msgid ""
"Client Index: %u\n"
"Tile Size: %zu\n"
msgstr ""
+"Kiszolgáló karakterlánc: %s\n"
+"Programkönyvtár protokollverzió: %u\n"
+"Kiszolgáló protokollverzió: %u\n"
+"Helyi: %s\n"
+"Kliensindex: %u\n"
+"Csempeméret: %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"
@@ -1737,19 +2407,19 @@ msgstr ""
"Számítógépnév: %s\n"
"Kiszolgálónév: %s\n"
"Kiszolgáló verzió: %s\n"
-"Alapértelmezett mintavételi leírás: %s\n"
+"Alapértelmezett mintavételi meghatározás: %s\n"
"Alapértelmezett csatornaleképzés: %s\n"
"Alapértelmezett nyelő: %s\n"
"Alapértelmezett forrás: %s\n"
-"Süti: %08x\n"
+"Süti: %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 "Nem sikerült lekérdezni a nyelő adatait: „%s”"
+msgstr "Nem sikerült lekérni a nyelő adatait: %s"
-#: ../src/utils/pactl.c:270
-#, fuzzy, c-format
+#: ../src/utils/pactl.c:281
+#, c-format
msgid ""
"Sink #%u\n"
"\tState: %s\n"
@@ -1760,54 +2430,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 ""
-"Nyelő #%u\n"
+"%u. nyelő\n"
"\tÁllapot: %s\n"
"\tNév: %s\n"
"\tLeírás: %s\n"
"\tEszközmeghajtó: %s\n"
-"\tMintavételi leírás: %s\n"
+"\tMintavételi meghatározás: %s\n"
"\tCsatornaleképzés: %s\n"
"\tTulajdonos modul: %u\n"
"\tNémítás: %s\n"
-"\tHangerő: %s%s%s\n"
+"\tHangerő: %s\n"
"\t egyensúly %0.2f\n"
-"\tAlap hangerő: %s%s%s\n"
-"\tMonitor forrás: %s\n"
+"\tAlap hangerő: %s\n"
+"\tForrás megfigyelése: %s\n"
"\tKésleltetés: %0.0f ezredmásodperc, beállítva %0.0f ezredmásodperc\n"
-"\tJelzők: %s%s%s%s%s%s\n"
+"\tJelzők: %s%s%s%s%s%s%s\n"
"\tTulajdonságok:\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 "\tPort:\n"
+msgstr "\tPortok:\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 "\tAktív Port: %s\n"
+msgstr "\tAktív port: %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 "\tPort:\n"
+msgstr "\tFormátumok:\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 "Nem sikerült lekérdezni a forrás adatait: „%s”"
+msgstr "Nem sikerült lekérni a forrás adatait: %s"
-#: ../src/utils/pactl.c:383
+#: ../src/utils/pactl.c:388
#, c-format
msgid ""
"Source #%u\n"
@@ -1819,47 +2489,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 ""
-"Forrás #%u\n"
+"%u. forrás\n"
"\tÁllapot: %s\n"
"\tNév: %s\n"
"\tLeírás: %s\n"
-"\tEszközmeghajtó: %s\n"
-"\tMintavételi leírás: %s\n"
+"\tIllesztőprogram: %s\n"
+"\tMintavételi meghatározás: %s\n"
"\tCsatornaleképzés: %s\n"
"\tTulajdonos modul: %u\n"
"\tNémítás: %s\n"
-"\tHangerő: %s%s%s\n"
+"\tHangerő: %s\n"
"\t egyensúly %0.2f\n"
-"\tAlap hangerő: %s%s%s\n"
-"\tNyelő monitora: %s\n"
+"\tAlap hangerő: %s\n"
+"\tNyelő megfigyelője: %s\n"
"\tKésleltetés: %0.0f ezredmásodperc, beállítva %0.0f ezredmásodperc\n"
"\tJelzők: %s%s%s%s%s%s\n"
"\tTulajdonságok:\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 "ismeretlen"
+msgstr "---"
-#: ../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 "Nem sikerült lekérdezni a modul adatait: „%s”"
+msgstr "Nem sikerült lekérni a modul adatait: %s"
-#: ../src/utils/pactl.c:477
+#: ../src/utils/pactl.c:478
#, c-format
msgid ""
"Module #%u\n"
@@ -1869,19 +2539,19 @@ msgid ""
"\tProperties:\n"
"\t\t%s\n"
msgstr ""
-"Modul #%u\n"
+"%u. modul\n"
"\tNév: %s\n"
-"\tParaméter: %s\n"
-"\tHasználva: %s\n"
+"\tArgumentum: %s\n"
+"\tHasználat száma: %s\n"
"\tTulajdonságok:\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 "Nem sikerült lekérdezni a kliens adatait: „%s”"
+msgstr "Nem sikerült lekérni a kliens adatait: %s"
-#: ../src/utils/pactl.c:522
+#: ../src/utils/pactl.c:523
#, c-format
msgid ""
"Client #%u\n"
@@ -1890,18 +2560,18 @@ msgid ""
"\tProperties:\n"
"\t\t%s\n"
msgstr ""
-"Kliens #%u\n"
-"\tEszközmeghajtó: %s\n"
+"%u. kliens\n"
+"\tIllesztőprogram: %s\n"
"\tTulajdonos modul: %s\n"
"\tTulajdonságok:\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 "Nem sikerült lekérdezni a kártya adatait: „%s”"
+msgstr "Nem sikerült lekérni a kártya adatait: %s"
-#: ../src/utils/pactl.c:562
+#: ../src/utils/pactl.c:563
#, c-format
msgid ""
"Card #%u\n"
@@ -1911,30 +2581,49 @@ msgid ""
"\tProperties:\n"
"\t\t%s\n"
msgstr ""
-"Kártya #%u\n"
+"%u. kártya\n"
"\tNév: %s\n"
-"\tEszközmeghajtó: %s\n"
+"\tIllesztőprogram: %s\n"
"\tTulajdonos modul: %s\n"
"\tTulajdonságok:\n"
"\t\t%s\n"
-#: ../src/utils/pactl.c:576
+#: ../src/utils/pactl.c:579
#, c-format
msgid "\tProfiles:\n"
-msgstr "\tProfil:\n"
+msgstr "\tProfilok:\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 (nyelők: %u, források: %u, prioritás: %u, elérhető: %s)\n"
-#: ../src/utils/pactl.c:582
+#: ../src/utils/pactl.c:586
#, c-format
msgid "\tActive Profile: %s\n"
msgstr "\tAktív profil: %s\n"
-#: ../src/utils/pactl.c:593 ../src/utils/pactl.c:868
+#: ../src/utils/pactl.c:600
+#, c-format
+msgid ""
+"\t\t\tProperties:\n"
+"\t\t\t\t%s\n"
+msgstr ""
+"\t\t\tTulajdonságok:\n"
+"\t\t\t\t%s\n"
+
+#: ../src/utils/pactl.c:605
+#, c-format
+msgid "\t\t\tPart of profile(s): %s"
+msgstr "\t\t\tProfilok része: %s"
+
+#: ../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 "Nem sikerült lekérdezni a nyelő bemeneti adatait: „%s”"
+msgstr "Nem sikerült lekérni a nyelő bemeneti adatait: %s"
-#: ../src/utils/pactl.c:622
-#, fuzzy, c-format
+#: ../src/utils/pactl.c:651
+#, c-format
msgid ""
"Sink Input #%u\n"
"\tDriver: %s\n"
@@ -1944,9 +2633,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"
@@ -1954,16 +2643,17 @@ msgid ""
"\tProperties:\n"
"\t\t%s\n"
msgstr ""
-"Nyelő bemenet #%u\n"
-"\tEszközmeghajtó: %s\n"
+"%u. nyelő bemenet\n"
+"\tIllesztőprogram: %s\n"
"\tTulajdonos modul: %s\n"
"\tKliens: %s\n"
"\tNyelő: %u\n"
-"\tMintavételi leírás: %s\n"
+"\tMintavételi meghatározás: %s\n"
"\tCsatornaleképzés: %s\n"
+"\tFormátum: %s\n"
+"\tEldugaszolva: %s\n"
"\tNémítás: %s\n"
"\tHangerő: %s\n"
-"\t %s\n"
"\t egyensúly %0.2f\n"
"\tPuffer késleltetés: %0.0f usec\n"
"\tNyelő késleltetés: %0.0f usec\n"
@@ -1971,13 +2661,13 @@ msgstr ""
"\tTulajdonságok:\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 "Nem sikerült lekérdezni a forrás kimeneti adatait: „%s”"
+msgstr "Nem sikerült lekérni a forrás kimeneti adatait: %s"
-#: ../src/utils/pactl.c:693
-#, fuzzy, c-format
+#: ../src/utils/pactl.c:721
+#, c-format
msgid ""
"Source Output #%u\n"
"\tDriver: %s\n"
@@ -1987,9 +2677,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"
"\tSource Latency: %0.0f usec\n"
@@ -1997,16 +2687,17 @@ msgid ""
"\tProperties:\n"
"\t\t%s\n"
msgstr ""
-"Nyelő bemenet #%u\n"
-"\tEszközmeghajtó: %s\n"
+"%u. nyelő bemenet\n"
+"\tIllesztőprogram: %s\n"
"\tTulajdonos modul: %s\n"
"\tKliens: %s\n"
"\tNyelő: %u\n"
-"\tMintavételi leírás: %s\n"
+"\tMintavételi meghatározás: %s\n"
"\tCsatornaleképzés: %s\n"
+"\tFormátum: %s\n"
+"\tEldugaszolva: %s\n"
"\tNémítás: %s\n"
"\tHangerő: %s\n"
-"\t %s\n"
"\t egyensúly %0.2f\n"
"\tPuffer késleltetés: %0.0f usec\n"
"\tNyelő késleltetés: %0.0f usec\n"
@@ -2014,12 +2705,12 @@ msgstr ""
"\tTulajdonságok:\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 "Nem sikerült lekérdezni a mintavétel adatait: „%s”"
+msgstr "Nem sikerült lekérni a mintavétel adatait: %s"
-#: ../src/utils/pactl.c:761
+#: ../src/utils/pactl.c:789
#, c-format
msgid ""
"Sample #%u\n"
@@ -2027,7 +2718,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"
@@ -2036,176 +2726,188 @@ msgid ""
"\tProperties:\n"
"\t\t%s\n"
msgstr ""
-"Minta #%u\n"
+"%u. minta\n"
"\tNév: %s\n"
-"\tMintavételi leírás: %s\n"
+"\tMintavételi meghatározás: %s\n"
"\tCsatornaleképzés: %s\n"
"\tHangerő: %s\n"
-"\t %s\n"
"\t egyensúly %0.2f\n"
"\tIdőtartam: %0.1fs\n"
"\tMéret: %s\n"
-"\tLassú: %s\n"
+"\tLusta: %s\n"
"\tFájlnév: %s\n"
"\tTulajdonságok:\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 "Hiba: %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 "Nem sikerült eltávolítani a modult: nincs betöltve %s nevű modul"
+
+#: ../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 ""
+"Nem sikerült a hangerő beállítása: kísérlet %d csatorna hangerejének "
+"beállítására, miközben a támogatott csatornák száma %d\n"
+
+#: ../src/utils/pactl.c:1050
+#, c-format
msgid "Failed to set format: invalid format string %s"
-msgstr "Nem sikerült lekérdezni a forrás adatait: „%s”"
+msgstr "Nem sikerült beállítani a formátumot: érvénytelen formátumleírás: %s"
-#: ../src/utils/pactl.c:954
+#: ../src/utils/pactl.c:1093
#, c-format
msgid "Failed to upload sample: %s"
msgstr "Nem sikerült feltölteni a mintát: %s"
-#: ../src/utils/pactl.c:971
+#: ../src/utils/pactl.c:1110
msgid "Premature end of file"
-msgstr "Idő előtti fájlvége"
+msgstr "Túl korai fájlvég"
-#: ../src/utils/pactl.c:991
+#: ../src/utils/pactl.c:1130
msgid "new"
-msgstr ""
+msgstr "új"
-#: ../src/utils/pactl.c:994
+#: ../src/utils/pactl.c:1133
msgid "change"
-msgstr ""
+msgstr "módosítás"
-#: ../src/utils/pactl.c:997
+#: ../src/utils/pactl.c:1136
msgid "remove"
-msgstr ""
+msgstr "eltávolítás"
-#: ../src/utils/pactl.c:1000 ../src/utils/pactl.c:1035
+#: ../src/utils/pactl.c:1139 ../src/utils/pactl.c:1174
msgid "unknown"
-msgstr ""
+msgstr "ismeretlen"
-#: ../src/utils/pactl.c:1008
+#: ../src/utils/pactl.c:1147
msgid "sink"
-msgstr ""
+msgstr "nyelő"
-#: ../src/utils/pactl.c:1011
+#: ../src/utils/pactl.c:1150
msgid "source"
-msgstr ""
+msgstr "forrás"
-#: ../src/utils/pactl.c:1014
+#: ../src/utils/pactl.c:1153
msgid "sink-input"
-msgstr ""
+msgstr "nyelő-bemenet"
-#: ../src/utils/pactl.c:1017
+#: ../src/utils/pactl.c:1156
msgid "source-output"
-msgstr ""
+msgstr "forrás-kimenet"
-#: ../src/utils/pactl.c:1020
+#: ../src/utils/pactl.c:1159
msgid "module"
-msgstr ""
+msgstr "modul"
-#: ../src/utils/pactl.c:1023
+#: ../src/utils/pactl.c:1162
msgid "client"
-msgstr ""
+msgstr "kliens"
-#: ../src/utils/pactl.c:1026
+#: ../src/utils/pactl.c:1165
msgid "sample-cache"
-msgstr ""
+msgstr "mintagyorsítótár"
-#: ../src/utils/pactl.c:1029 ../src/utils/pactl.c:1032
-#, fuzzy
+#: ../src/utils/pactl.c:1168
msgid "server"
-msgstr "Érvénytelen kiszolgáló"
+msgstr "kiszolgáló"
+
+#: ../src/utils/pactl.c:1171
+msgid "card"
+msgstr "kártya"
-#: ../src/utils/pactl.c:1041
+#: ../src/utils/pactl.c:1180
#, c-format
msgid "Event '%s' on %s #%u\n"
-msgstr ""
+msgstr "„%1$s” esemény ezen: %3$u. %2$s\n"
-#: ../src/utils/pactl.c:1258
+#: ../src/utils/pactl.c:1452
msgid "Got SIGINT, exiting."
-msgstr "Kilépés, SIGINT szignál hatására…"
+msgstr "Kilépés, SIGINT szignál hatására."
-#: ../src/utils/pactl.c:1285
+#: ../src/utils/pactl.c:1485
msgid "Invalid volume specification"
-msgstr "A hangerő megadása érvénytelen."
+msgstr "A hangerő megadása érvénytelen"
-#: ../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 "A hangerő a megengedett tartományon kívül esik.\n"
+
+#: ../src/utils/pactl.c:1521
+msgid "Invalid number of volume specifications.\n"
+msgstr "A hangerőmegadások száma érvénytelen.\n"
+
+#: ../src/utils/pactl.c:1533
+msgid "Inconsistent volume specification.\n"
+msgstr "A hangerő megadása inkonzisztens.\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 "[kapcsolók]"
-#: ../src/utils/pactl.c:1321
+#: ../src/utils/pactl.c:1565
msgid "[TYPE]"
-msgstr ""
+msgstr "[TÍPUS]"
-#: ../src/utils/pactl.c:1323
+#: ../src/utils/pactl.c:1567
msgid "FILENAME [NAME]"
-msgstr ""
+msgstr "FÁJLNÉV [NÉV]"
-#: ../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 ""
-
-#: ../src/utils/pactl.c:1330
-msgid "CARD PROFILE"
-msgstr ""
+msgstr "NÉV [NYELŐ]"
-#: ../src/utils/pactl.c:1331
-msgid "NAME|#N PORT"
-msgstr ""
+#: ../src/utils/pactl.c:1577
+msgid "NAME|#N VOLUME [VOLUME ...]"
+msgstr "NÉV|#N HANGERŐ [HANGERŐ …]"
-#: ../src/utils/pactl.c:1332
-msgid "NAME|#N VOLUME"
-msgstr ""
+#: ../src/utils/pactl.c:1578
+msgid "#N VOLUME [VOLUME ...]"
+msgstr "#N HANGERŐ [HANGERŐ …]"
-#: ../src/utils/pactl.c:1333
-msgid "#N VOLUME"
-msgstr ""
+#: ../src/utils/pactl.c:1579
+msgid "NAME|#N 1|0|toggle"
+msgstr "NÉV|#N 1|0|váltás"
-#: ../src/utils/pactl.c:1335
-msgid "#N 1|0"
-msgstr ""
+#: ../src/utils/pactl.c:1580
+msgid "#N 1|0|toggle"
+msgstr "#N 1|0|váltás"
-#: ../src/utils/pactl.c:1336
+#: ../src/utils/pactl.c:1581
msgid "#N FORMATS"
+msgstr "#N FORMÁTUMOK"
+
+#: ../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"
+"A speciális @DEFAULT_SINK@, @DEFAULT_SOURCE@ and @DEFAULT_MONITOR@ nevek\n"
+"használhatók az alapértelmezett nyelő, forrás és megfigyelő megadására.\n"
-#: ../src/utils/pactl.c:1339
-#, fuzzy, c-format
+#: ../src/utils/pactl.c:1587
+#, c-format
msgid ""
"\n"
" -h, --help Show this help\n"
@@ -2216,14 +2918,13 @@ msgid ""
" -n, --client-name=NAME How to call this client on the "
"server\n"
msgstr ""
-"%s [KAPCSOLÓ] ... \n"
-"\n"
-" -h, --help Megjeleníti ezt a súgót\n"
-" --version Az alkalmazás verziószámának "
-"megjelenítése\n"
"\n"
+" -h, --help Ezen súgó megjelenítése\n"
+" --version Verziószám megjelenítése\n"
+" -s, --server=KISZOLGÁLÓ Csatlakozás ehhez a kiszolgálóhoz\n"
+" -n, --client-name=NÉV A kliens neve a kiszolgálón\n"
-#: ../src/utils/pactl.c:1380
+#: ../src/utils/pactl.c:1628
#, c-format
msgid ""
"pactl %s\n"
@@ -2231,153 +2932,261 @@ msgid ""
"Linked with libpulse %s\n"
msgstr ""
"pactl %s\n"
-"Összeépítve a libpulse %s programkönyvtárral\n"
-"Csatolva a libpulse %s programkönyvtárhoz\n"
+"Lefordítva a libpulse %s programkönyvtárral\n"
+"Összeszerkesztve a libpulse %s programkönyvtárhoz\n"
-#: ../src/utils/pactl.c:1439
+#: ../src/utils/pactl.c:1684
#, c-format
msgid "Specify nothing, or one of: %s"
-msgstr ""
+msgstr "Ne adjon meg semmit, vagy a következők egyikét: %s"
-#: ../src/utils/pactl.c:1449
+#: ../src/utils/pactl.c:1694
msgid "Please specify a sample file to load"
msgstr "Adja meg a betöltendő mintafájlt"
-#: ../src/utils/pactl.c:1462
+#: ../src/utils/pactl.c:1707
msgid "Failed to open sound file."
-msgstr "Nem sikerült megnyitni az hangfájlt."
+msgstr "Nem sikerült megnyitni a hangfájlt."
-#: ../src/utils/pactl.c:1474
+#: ../src/utils/pactl.c:1719
msgid "Warning: Failed to determine sample specification from file."
msgstr ""
-"Figyelmeztetés: Nem sikerült meghatározni a mintavételi leírást a fájlból."
+"Figyelmeztetés: Nem sikerült meghatározni a mintavételi meghatározást a "
+"fájlból."
-#: ../src/utils/pactl.c:1484
+#: ../src/utils/pactl.c:1729
msgid "You have to specify a sample name to play"
-msgstr "Meg kell adnia lejátszandó minta nevét."
+msgstr "Meg kell adnia a lejátszandó minta nevét"
-#: ../src/utils/pactl.c:1496
+#: ../src/utils/pactl.c:1741
msgid "You have to specify a sample name to remove"
-msgstr "Meg kell adnia az eltávolítandó minta nevét."
+msgstr "Meg kell adnia az eltávolítandó minta nevét"
-#: ../src/utils/pactl.c:1505
+#: ../src/utils/pactl.c:1750
msgid "You have to specify a sink input index and a sink"
-msgstr "Meg kell adnia a nyelő bemeneti azonosítóját és a nyelőt."
+msgstr "Meg kell adnia egy nyelő bemeneti indexét és egy nyelőt"
-#: ../src/utils/pactl.c:1515
+#: ../src/utils/pactl.c:1760
msgid "You have to specify a source output index and a source"
-msgstr "Meg kell adnia a forrás kimeneti azonosítóját és a forrást."
+msgstr "Meg kell adnia a forrás kimeneti indexét és egy forrást"
-#: ../src/utils/pactl.c:1530
+#: ../src/utils/pactl.c:1775
msgid "You have to specify a module name and arguments."
-msgstr "Meg kell adnia a modul nevét és a paramétereit."
+msgstr "Meg kell adnia a modul nevét és argumentumait."
-#: ../src/utils/pactl.c:1550
-msgid "You have to specify a module index"
-msgstr "Meg kell adnia a modul azonosítóját."
+#: ../src/utils/pactl.c:1795
+msgid "You have to specify a module index or name"
+msgstr "Meg kell adnia a modul indexét vagy nevét"
-#: ../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 "Nem adhat meg egynél több nyelőt. Egy logikai értéket kell megadnia."
-#: ../src/utils/pactl.c:1573
+#: ../src/utils/pactl.c:1813 ../src/utils/pactl.c:1833
+msgid "Invalid suspend specification."
+msgstr "Érvénytelen felfüggesztési meghatározás."
+
+#: ../src/utils/pactl.c:1828
msgid ""
"You may not specify more than one source. You have to specify a boolean "
"value."
msgstr "Nem adhat meg egynél több forrást. Egy logikai értéket kell megadnia."
-#: ../src/utils/pactl.c:1585
+#: ../src/utils/pactl.c:1845
msgid "You have to specify a card name/index and a profile name"
-msgstr "Meg kell adnia a kártya nevét vagy azonosítóját és a profil nevét"
+msgstr "Meg kell adnia a kártya nevét vagy indexét és egy profil nevét"
-#: ../src/utils/pactl.c:1596
+#: ../src/utils/pactl.c:1856
msgid "You have to specify a sink name/index and a port name"
-msgstr "Meg kell adnia a nyelő nevét vagy azonosítóját és a port nevét."
+msgstr "Meg kell adnia a nyelő nevét vagy indexét, és egy port nevét"
+
+#: ../src/utils/pactl.c:1867
+msgid "You have to specify a sink name"
+msgstr "Meg kell adnia egy nyelő nevét"
-#: ../src/utils/pactl.c:1607
+#: ../src/utils/pactl.c:1877
msgid "You have to specify a source name/index and a port name"
-msgstr "Meg kell adnia a forrás nevét vagy azonosítóját és a port nevét"
+msgstr "Meg kell adnia egy forrás nevét vagy indexét, és egy port nevét"
-#: ../src/utils/pactl.c:1618
+#: ../src/utils/pactl.c:1888
+msgid "You have to specify a source name"
+msgstr "Meg kell adnia egy forrás nevét"
+
+#: ../src/utils/pactl.c:1898
msgid "You have to specify a sink name/index and a volume"
-msgstr "Meg kell adnia a nyelő nevét vagy azonosítóját és a hangerejét."
+msgstr "Meg kell adnia egy nyelő nevét vagy indexét és egy hangerőt"
-#: ../src/utils/pactl.c:1631
+#: ../src/utils/pactl.c:1911
msgid "You have to specify a source name/index and a volume"
-msgstr "Meg kell adnia a forrás nevét vagy azonosítóját és a hangerejét"
+msgstr "Meg kell adnia egy forrás nevét vagy indexét és egy hangerőt"
-#: ../src/utils/pactl.c:1644
+#: ../src/utils/pactl.c:1924
msgid "You have to specify a sink input index and a volume"
-msgstr "Meg kell adnia a nyelő bemenet azonosítóját és a hangerejét"
+msgstr "Meg kell adnia egy nyelő bemenet indexét és egy hangerőt"
-#: ../src/utils/pactl.c:1649
+#: ../src/utils/pactl.c:1929
msgid "Invalid sink input index"
-msgstr "A nyelő bemeneti azonosítója érvénytelen."
+msgstr "A nyelőbemenet indexe érvénytelen"
-#: ../src/utils/pactl.c:1660
-#, fuzzy
+#: ../src/utils/pactl.c:1940
msgid "You have to specify a source output index and a volume"
-msgstr "Meg kell adnia a forrás kimeneti azonosítóját és a forrást."
+msgstr "Meg kell adnia egy forráskimenet indexét és egy hangerőt"
-#: ../src/utils/pactl.c:1665
-#, fuzzy
+#: ../src/utils/pactl.c:1945
msgid "Invalid source output index"
-msgstr "A nyelő bemeneti azonosítója érvénytelen."
+msgstr "A nyelőkimenet indexe érvénytelen"
-#: ../src/utils/pactl.c:1677
-msgid "You have to specify a sink name/index and a mute boolean"
+#: ../src/utils/pactl.c:1956
+msgid ""
+"You have to specify a sink name/index and a mute action (0, 1, or 'toggle')"
msgstr ""
-"Meg kell adnia a nyelő nevét vagy azonosítóját és a némítás logikai "
-"változóját."
+"Meg kell adnia egy nyelő nevét vagy indexét, és a némítási műveletet (0, 1 "
+"vagy „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 "Érvénytelen mintavételi leírás."
+msgstr "Érvénytelen némításmeghatározás"
-#: ../src/utils/pactl.c:1694
-msgid "You have to specify a source name/index and a mute boolean"
+#: ../src/utils/pactl.c:1971
+msgid ""
+"You have to specify a source name/index and a mute action (0, 1, or 'toggle')"
msgstr ""
-"Meg kell adnia a forrás nevét vagy azonosítóját és a némítás logikai "
-"változóját"
+"Meg kell adnia egy forrás nevét vagy indexét, és a némítási műveletet (0, 1 "
+"vagy „toggle”)"
-#: ../src/utils/pactl.c:1711
-msgid "You have to specify a sink input index and a mute boolean"
+#: ../src/utils/pactl.c:1986
+msgid ""
+"You have to specify a sink input index and a mute action (0, 1, or 'toggle')"
msgstr ""
-"Meg kell adnia a nyelő bemenet azonosítóját és a némítás logikai változóját"
+"Meg kell adnia egy nyelő bemeneti indexét, és a némítási műveletet (0, 1 "
+"vagy „toggle”)"
-#: ../src/utils/pactl.c:1716
+#: ../src/utils/pactl.c:1991
msgid "Invalid sink input index specification"
-msgstr "A nyelő bemeneti azonosítójának megadása érvénytelen."
+msgstr "A nyelő bemeneti indexének megadása érvénytelen"
-#: ../src/utils/pactl.c:1732
-#, fuzzy
-msgid "You have to specify a source output index and a mute boolean"
+#: ../src/utils/pactl.c:2004
+msgid ""
+"You have to specify a source output index and a mute action (0, 1, or "
+"'toggle')"
msgstr ""
-"Meg kell adnia a forrás nevét vagy azonosítóját és a némítás logikai "
-"változóját"
+"Meg kell adnia egy forráskimenet indexét, és a némítási műveletet (0, 1 vagy "
+"„toggle”)"
-#: ../src/utils/pactl.c:1737
-#, fuzzy
+#: ../src/utils/pactl.c:2009
msgid "Invalid source output index specification"
-msgstr "A nyelő bemeneti azonosítójának megadása érvénytelen."
+msgstr "A forrás bemeneti indexének megadása érvénytelen"
-#: ../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 ""
-"Meg kell adnia a nyelő nevét vagy azonosítóját és a némítás logikai "
-"változóját."
+"Meg kell adnia egy nyelő indexét és a támogatott formátumok pontosvesszővel "
+"elválasztott listáját"
-#: ../src/utils/pactl.c:1772
+#: ../src/utils/pactl.c:2038
+msgid "You have to specify a card name/index, a port name and a latency offset"
+msgstr ""
+"Meg kell adnia egy kártya nevét vagy indexét, egy port nevét és egy "
+"késleltetéseltolást"
+
+#: ../src/utils/pactl.c:2045
+msgid "Could not parse latency offset"
+msgstr "Nem dolgozható fel a késleltetéseltolás"
+
+#: ../src/utils/pactl.c:2057
msgid "No valid command specified."
msgstr "Érvénytelen parancs lett megadva."
-#: ../src/utils/pax11publish.c:61
+#: ../src/utils/pasuspender.c:79
+#, c-format
+msgid "fork(): %s\n"
+msgstr "fork(): %s\n"
+
+#: ../src/utils/pasuspender.c:92
+#, c-format
+msgid "execvp(): %s\n"
+msgstr "execvp(): %s\n"
+
+#: ../src/utils/pasuspender.c:111
+#, c-format
+msgid "Failure to resume: %s\n"
+msgstr "Hiba a folytatáskor: %s\n"
+
+#: ../src/utils/pasuspender.c:145
+#, c-format
+msgid "Failure to suspend: %s\n"
+msgstr "Hiba a felfüggesztéskor: %s\n"
+
+#: ../src/utils/pasuspender.c:170
+#, c-format
+msgid "WARNING: Sound server is not local, not suspending.\n"
+msgstr "FIGYELMEZTETÉS: A hangkiszolgáló nem helyi, nem lesz felfüggesztve.\n"
+
+#: ../src/utils/pasuspender.c:183
+#, c-format
+msgid "Connection failure: %s\n"
+msgstr "Kapcsolódási hiba: %s\n"
+
+#: ../src/utils/pasuspender.c:201
+#, c-format
+msgid "Got SIGINT, exiting.\n"
+msgstr "Kilépés, SIGINT szignál hatására.\n"
+
+#: ../src/utils/pasuspender.c:219
+#, c-format
+msgid "WARNING: Child process terminated by signal %u\n"
+msgstr ""
+"FIGYELMEZTETÉS: A gyermek folyamat a következő szignállal fejeződött be: %u\n"
+
+#: ../src/utils/pasuspender.c:228
+#, 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"
+msgstr ""
+"%s [KAPCSOLÓK] ... \n"
+"\n"
+" -h, --help Ezen súgó megjelenítése\n"
+" --version Verziószám megjelenítése\n"
+" -s, --server=KISZOLGÁLÓ Csatlakozás ehhez a kiszolgálóhoz\n"
+"\n"
+
+#: ../src/utils/pasuspender.c:266
+#, c-format
+msgid ""
+"pasuspender %s\n"
+"Compiled with libpulse %s\n"
+"Linked with libpulse %s\n"
+msgstr ""
+"pasuspender %s\n"
+"Lefordítva a libpulse %s programkönyvtárral\n"
+"Összeszerkesztve a libpulse %s programkönyvtárhoz\n"
+
+#: ../src/utils/pasuspender.c:295
+#, c-format
+msgid "pa_mainloop_new() failed.\n"
+msgstr "A „pa_mainloop_new()” függvényhívás meghiúsult.\n"
+
+#: ../src/utils/pasuspender.c:308
+#, c-format
+msgid "pa_context_new() failed.\n"
+msgstr "A „pa_context_new()” függvényhívás meghiúsult.\n"
+
+#: ../src/utils/pasuspender.c:320
+#, c-format
+msgid "pa_mainloop_run() failed.\n"
+msgstr "A „pa_mainloop_run()” függvényhívás meghiúsult.\n"
+
+#: ../src/utils/pax11publish.c:58
#, c-format
msgid ""
"%s [-D display] [-S server] [-O sink] [-I source] [-c file] [-d|-e|-i|-r]\n"
@@ -2391,504 +3200,193 @@ msgstr ""
"%s [-D megjelenítő] [-S kiszolgáló] [-O nyelő] [-I forrás] [-c fájl] [-d|-"
"e|-i|-r]\n"
"\n"
-" -d Megjeleníti az aktuális X11 megjelenítőhöz csatlakoztatott PulseAudio "
-"adatokat (alapértelmezés)\n"
+" -d Megjeleníti az aktuális X11 megjelenítőhöz csatlakoztatott "
+"PulseAudio\n"
+" adatokat (alapértelmezés)\n"
" -e Helyi PulseAudio adatok exportálása az X11 megjelenítőre\n"
-" -i Helyi PulseAudio adatok importálása az X11 megjelenítőről helyi "
-"környezeti változókba és süti fájlokba\n"
-" -r Eltávolítja a PulseAudio adatokat z X11 megjelenítőről\n"
+" -i Helyi PulseAudio adatok importálása az X11 megjelenítőről helyi\n"
+" környezeti változókba és süti fájlokba\n"
+" -r Eltávolítja a PulseAudio adatokat az X11 megjelenítőről\n"
-#: ../src/utils/pax11publish.c:94
+#: ../src/utils/pax11publish.c:91
#, c-format
msgid "Failed to parse command line.\n"
msgstr "Nem sikerült feldolgozni a parancssort.\n"
-#: ../src/utils/pax11publish.c:113
+#: ../src/utils/pax11publish.c:110
#, c-format
msgid "Server: %s\n"
msgstr "Kiszolgáló: %s\n"
-#: ../src/utils/pax11publish.c:115
+#: ../src/utils/pax11publish.c:112
#, c-format
msgid "Source: %s\n"
msgstr "Forrás: %s\n"
-#: ../src/utils/pax11publish.c:117
+#: ../src/utils/pax11publish.c:114
#, c-format
msgid "Sink: %s\n"
msgstr "Nyelő: %s\n"
-#: ../src/utils/pax11publish.c:119
+#: ../src/utils/pax11publish.c:116
#, c-format
msgid "Cookie: %s\n"
msgstr "Süti: %s\n"
-#: ../src/utils/pax11publish.c:137
+#: ../src/utils/pax11publish.c:134
#, c-format
msgid "Failed to parse cookie data\n"
-msgstr "Nem sikerült feldolgozni a süti adatokat.\n"
+msgstr "Nem sikerült feldolgozni a sütiadatokat\n"
-#: ../src/utils/pax11publish.c:142
+#: ../src/utils/pax11publish.c:139
#, c-format
msgid "Failed to save cookie data\n"
-msgstr "Nem sikerült elmenteni a süti adatokat.\n"
-
-#: ../src/utils/pax11publish.c:157
-#, c-format
-msgid "Failed to load client configuration file.\n"
-msgstr "Nem sikerült betölteni a kliens konfigurációs fájlt.\n"
-
-#: ../src/utils/pax11publish.c:162
-#, c-format
-msgid "Failed to read environment configuration data.\n"
-msgstr "Nem sikerült elolvasni a környezetváltozó konfigurációs adatokat.\n"
+msgstr "Nem sikerült elmenteni a sütiadatokat\n"
-#: ../src/utils/pax11publish.c:179
+#: ../src/utils/pax11publish.c:168
#, c-format
msgid "Failed to get FQDN.\n"
msgstr "Nem sikerült lekérdezni a teljes tartománynevet (FQDN).\n"
-#: ../src/utils/pax11publish.c:199
+#: ../src/utils/pax11publish.c:188
#, c-format
msgid "Failed to load cookie data\n"
-msgstr "Nem sikerült betölteni a süti adatokat.\n"
+msgstr "Nem sikerült betölteni a sütiadatokat\n"
-#: ../src/utils/pax11publish.c:217
+#: ../src/utils/pax11publish.c:206
#, c-format
msgid "Not yet implemented.\n"
msgstr "Még nincs elkészítve.\n"
-#: ../src/utils/pacmd.c:66
-msgid "No PulseAudio daemon running, or not running as session daemon."
-msgstr "Nem fut a PulseAudio démon vagy nem fut munkamenet démonként sem."
+#~ msgid "Got signal %s."
+#~ msgstr "Szignál: %s."
-#: ../src/utils/pacmd.c:71
-#, c-format
-msgid "socket(PF_UNIX, SOCK_STREAM, 0): %s"
-msgstr "socket(PF_UNIX, SOCK_STREAM, 0): %s"
+#~ msgid "Exiting."
+#~ msgstr "Kilépés."
-#: ../src/utils/pacmd.c:88
-#, c-format
-msgid "connect(): %s"
-msgstr "Kapcsolódás: %s"
-
-#: ../src/utils/pacmd.c:96
-msgid "Failed to kill PulseAudio daemon."
-msgstr "A PulseAudio démon kilövése nem sikerült."
-
-#: ../src/utils/pacmd.c:104
-msgid "Daemon not responding."
-msgstr "A démon nem válaszol."
-
-#: ../src/utils/pacmd.c:184
-#, c-format
-msgid "poll(): %s"
-msgstr "Lekérdezés: %s"
-
-#: ../src/utils/pacmd.c:195 ../src/utils/pacmd.c:215
-#, c-format
-msgid "read(): %s"
-msgstr "Olvasás: %s"
-
-#: ../src/utils/pacmd.c:237 ../src/utils/pacmd.c:255
-#, c-format
-msgid "write(): %s"
-msgstr "Írás: %s"
-
-#: ../src/pulsecore/lock-autospawn.c:136 ../src/pulsecore/lock-autospawn.c:222
-msgid "Cannot access autospawn lock."
-msgstr "Nem érhető zárolás az automatikus indításhoz."
-
-#: ../src/modules/alsa/alsa-sink.c:560 ../src/modules/alsa/alsa-sink.c:726
-#, 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 ""
-"Az ALSA modul értesítése nyomán új adatokat kellett volna írni az eszközre, "
-"de jelenleg semmilyen írandó adat nincsen.\n"
-"Ez egy hiba lehet az ALSA „%s” eszközmeghajtóban. Kérem jelentse ezt a "
-"problémát az ALSA fejlesztői felé.\n"
-"Az értesítés a POLLOUT jelzésen keresztül érkezett – viszont a „snd_pcm_avail"
-"()” függvény visszatérési értéke 0 volt vagy a második érték kisebb volt, "
-"mint a minimum."
-
-#: ../src/modules/alsa/alsa-source.c:519 ../src/modules/alsa/alsa-source.c:672
-#, 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 ""
-"Az ALSA modul értesítése nyomán új adatokat kellett volna olvasni az "
-"eszközről, de jelenleg semmilyen olvasandó adat nincsen.\n"
-"Ez egy hiba lehet az ALSA „%s” eszközmeghajtóban. Kérem jelentse ezt a "
-"problémát az ALSA fejlesztői felé.\n"
-"Az értesítés a POLLIN jelzésen keresztül érkezett – viszont a „snd_pcm_avail"
-"()” függvény visszatérési értéke 0 volt vagy a második érték kisebb volt, "
-"mint a minimum."
-
-#: ../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 "Kikapcsolva"
-
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2738
-msgid "High Fidelity Playback (A2DP)"
-msgstr "HiFi lejátszás (A2DP)"
-
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2752
-msgid "High Fidelity Capture (A2DP)"
-msgstr "HiFi felvétel (A2DP)"
-
-#: ../src/modules/bluetooth/module-bluetooth-device.c:2767
-msgid "Telephony Duplex (HSP/HFP)"
-msgstr "Telefon duplex (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 hangkiszolgáló"
-
-#: ../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 "Kimeneti eszközök"
-
-#: ../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 "Bemeneti eszközök"
-
-#: ../src/modules/module-rygel-media-server.c:1056
-msgid "Audio on @HOSTNAME@"
-msgstr "Hangforrások a(z) @HOSTNAME@ számítógépen"
-
-#: ../src/modules/alsa/alsa-mixer.c:2219
-msgid "Input"
-msgstr "Bemenet"
-
-#: ../src/modules/alsa/alsa-mixer.c:2220
-msgid "Docking Station Input"
-msgstr "Dokkolóállomás bemenet"
-
-#: ../src/modules/alsa/alsa-mixer.c:2221
-#, fuzzy
-msgid "Docking Station Microphone"
-msgstr "Dokkolóállomás mikrofon"
-
-#: ../src/modules/alsa/alsa-mixer.c:2222
-#, fuzzy
-msgid "Docking Station Line In"
-msgstr "Dokkolóállomás bemenet"
-
-#: ../src/modules/alsa/alsa-mixer.c:2223 ../src/modules/alsa/alsa-mixer.c:2307
-msgid "Line In"
-msgstr "Vonalbemenet"
-
-#: ../src/modules/alsa/alsa-mixer.c:2224 ../src/modules/alsa/alsa-mixer.c:2302
-msgid "Microphone"
-msgstr "Mikrofon"
+#~ msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
+#~ msgstr "Létező felhasználó „%s” (UID: %lu) és csoport „%s” (GID: %lu)."
-#: ../src/modules/alsa/alsa-mixer.c:2225 ../src/modules/alsa/alsa-mixer.c:2303
-#, fuzzy
-msgid "Front Microphone"
-msgstr "Dokkolóállomás mikrofon"
+#~ msgid "Successfully dropped root privileges."
+#~ msgstr "A rendszergazdai jogosultságok sikeresen visszaadva."
-#: ../src/modules/alsa/alsa-mixer.c:2226 ../src/modules/alsa/alsa-mixer.c:2304
-#, fuzzy
-msgid "Rear Microphone"
-msgstr "Mikrofon"
+#~ msgid "setrlimit(%s, (%u, %u)) failed: %s"
+#~ msgstr "setrlimit(%s, (%u, %u)) meghiúsult: %s"
-#: ../src/modules/alsa/alsa-mixer.c:2227
-msgid "External Microphone"
-msgstr "Külső mikrofon"
+#~ msgid "Daemon not running"
+#~ msgstr "A démon nem fut."
-#: ../src/modules/alsa/alsa-mixer.c:2228 ../src/modules/alsa/alsa-mixer.c:2306
-msgid "Internal Microphone"
-msgstr "Belső mikrofon"
-
-#: ../src/modules/alsa/alsa-mixer.c:2229 ../src/modules/alsa/alsa-mixer.c:2308
-msgid "Radio"
-msgstr "Rádió"
+#~ msgid "Daemon running as PID %u"
+#~ msgstr "A démon a következő PID azonosítóval fut: %u"
-#: ../src/modules/alsa/alsa-mixer.c:2230 ../src/modules/alsa/alsa-mixer.c:2309
-msgid "Video"
-msgstr "Videó"
+#~ msgid "Daemon startup successful."
+#~ msgstr "A démon sikeresen elindult."
-#: ../src/modules/alsa/alsa-mixer.c:2231
-msgid "Automatic Gain Control"
-msgstr "Automatikus erősítésszabályzás"
-
-#: ../src/modules/alsa/alsa-mixer.c:2232
-msgid "No Automatic Gain Control"
-msgstr "Nincs automatikus erősítésszabályzás"
-
-#: ../src/modules/alsa/alsa-mixer.c:2233
-msgid "Boost"
-msgstr "Erősítés"
-
-#: ../src/modules/alsa/alsa-mixer.c:2234
-msgid "No Boost"
-msgstr "Nincs erősítés"
-
-#: ../src/modules/alsa/alsa-mixer.c:2235
-msgid "Amplifier"
-msgstr "Erősítő"
-
-#: ../src/modules/alsa/alsa-mixer.c:2236
-msgid "No Amplifier"
-msgstr "Nincs erősítő"
-
-#: ../src/modules/alsa/alsa-mixer.c:2237
-#, fuzzy
-msgid "Bass Boost"
-msgstr "Erősítés"
-
-#: ../src/modules/alsa/alsa-mixer.c:2238
-#, fuzzy
-msgid "No Bass Boost"
-msgstr "Nincs erősítés"
-
-#: ../src/modules/alsa/alsa-mixer.c:2239
-msgid "Speaker"
-msgstr ""
-
-#: ../src/modules/alsa/alsa-mixer.c:2240 ../src/modules/alsa/alsa-mixer.c:2311
-msgid "Headphones"
-msgstr "Analóg fejhallgató"
-
-#: ../src/modules/alsa/alsa-mixer.c:2301
-msgid "Analog Input"
-msgstr "Analóg bemenet"
+#~ msgid "This is PulseAudio %s"
+#~ msgstr "PulseAudio %s"
-#: ../src/modules/alsa/alsa-mixer.c:2305
-msgid "Dock Microphone"
-msgstr "Dokkolóállomás mikrofon"
+#~ msgid "Compilation host: %s"
+#~ msgstr "Összeépítő számítógép: %s"
-#: ../src/modules/alsa/alsa-mixer.c:2310
-msgid "Analog Output"
-msgstr "Analóg kimenet"
+#~ msgid "Compilation CFLAGS: %s"
+#~ msgstr "Összeépítési CFLAGS jelzők: %s"
-#: ../src/modules/alsa/alsa-mixer.c:2312
-msgid "LFE on Separate Mono Output"
-msgstr "Analóg kimenet (mély)"
+#~ msgid "Running on host: %s"
+#~ msgstr "Kiszolgáló: %s"
-#: ../src/modules/alsa/alsa-mixer.c:2313
-#, fuzzy
-msgid "Line Out"
-msgstr "Vonalbemenet"
+#~ msgid "Found %u CPUs."
+#~ msgstr "%u CPU található a rendszerben."
-#: ../src/modules/alsa/alsa-mixer.c:2314
-msgid "Analog Mono Output"
-msgstr "Analóg mono kimenet"
+#~ msgid "Page size is %lu bytes"
+#~ msgstr "Oldalméret: %lu bájt"
-#: ../src/modules/alsa/alsa-mixer.c:2315
-#, fuzzy
-msgid "Speakers"
-msgstr "Analóg sztereó"
+#~ msgid "Compiled with Valgrind support: yes"
+#~ msgstr "Összeépítés Valgrind támogatással: Igen"
-#: ../src/modules/alsa/alsa-mixer.c:2316
-msgid "HDMI / DisplayPort"
-msgstr ""
+#~ msgid "Compiled with Valgrind support: no"
+#~ msgstr "Összeépítés Valgrind támogatással: Nem"
-#: ../src/modules/alsa/alsa-mixer.c:2317
-#, fuzzy
-msgid "Digital Output (S/PDIF)"
-msgstr "Digitális térhatású (HDMI)"
+#~ msgid "Running in valgrind mode: %s"
+#~ msgstr "Futás Valgrind üzemmódban: %s"
-#: ../src/modules/alsa/alsa-mixer.c:2318
#, fuzzy
-msgid "Digital Passthrough (S/PDIF)"
-msgstr "Digitális térhatású (HDMI)"
+#~ msgid "Running in VM: %s"
+#~ msgstr "Kiszolgáló: %s"
-#: ../src/modules/alsa/alsa-mixer.c:3756
-msgid "Analog Mono"
-msgstr "Analóg mono"
+#~ msgid "Optimized build: yes"
+#~ msgstr "Optimalizált összeépítés: Igen"
-#: ../src/modules/alsa/alsa-mixer.c:3757
-msgid "Analog Stereo"
-msgstr "Analóg sztereó"
+#~ msgid "Optimized build: no"
+#~ msgstr "Optimalizált összeépítés: Nem"
-#: ../src/modules/alsa/alsa-mixer.c:3758
-msgid "Analog Surround 2.1"
-msgstr "Analóg térhatású 2.1"
+#~ msgid "NDEBUG defined, all asserts disabled."
+#~ msgstr "NDEBUG megadva, minden érvényesítés letiltva."
-#: ../src/modules/alsa/alsa-mixer.c:3759
-msgid "Analog Surround 3.0"
-msgstr "Analóg térhatású 3.0"
+#~ msgid "FASTPATH defined, only fast path asserts disabled."
+#~ msgstr ""
+#~ "FASTPATH megadva, így csak a gyors útvonal-érvényesítés lesz letiltva."
-#: ../src/modules/alsa/alsa-mixer.c:3760
-msgid "Analog Surround 3.1"
-msgstr "Analóg térhatású 3.1"
+#~ msgid "All asserts enabled."
+#~ msgstr "Minden érvényesítés engedélyezve."
-#: ../src/modules/alsa/alsa-mixer.c:3761
-msgid "Analog Surround 4.0"
-msgstr "Analóg térhatású 4.0"
+#~ msgid "Machine ID is %s."
+#~ msgstr "Számítógép-azonosító: %s."
-#: ../src/modules/alsa/alsa-mixer.c:3762
-msgid "Analog Surround 4.1"
-msgstr "Analóg térhatású 4.1"
+#~ msgid "Session ID is %s."
+#~ msgstr "Munkamenet-azonosító: %s."
-#: ../src/modules/alsa/alsa-mixer.c:3763
-msgid "Analog Surround 5.0"
-msgstr "Analóg térhatású 5.0"
+#~ msgid "Using runtime directory %s."
+#~ msgstr "A futásidőben használt mappa: %s."
-#: ../src/modules/alsa/alsa-mixer.c:3764
-msgid "Analog Surround 5.1"
-msgstr "Analóg térhatású 5.1"
+#~ msgid "Using state directory %s."
+#~ msgstr "Az állapottároló mappa: %s."
-#: ../src/modules/alsa/alsa-mixer.c:3765
-msgid "Analog Surround 6.0"
-msgstr "Analóg térhatású 6.0"
+#~ msgid "Using modules directory %s."
+#~ msgstr "A modulok mappája: %s."
-#: ../src/modules/alsa/alsa-mixer.c:3766
-msgid "Analog Surround 6.1"
-msgstr "Analóg térhatású 6.1"
-
-#: ../src/modules/alsa/alsa-mixer.c:3767
-msgid "Analog Surround 7.0"
-msgstr "Analóg térhatású 7.0"
+#~ msgid "Running in system mode: %s"
+#~ msgstr "Futás rendszer üzemmódban: %s"
-#: ../src/modules/alsa/alsa-mixer.c:3768
-msgid "Analog Surround 7.1"
-msgstr "Analóg térhatású 7.1"
+#~ msgid "Fresh high-resolution timers available! Bon appetit!"
+#~ msgstr "A nagypontosságú időzítők elérhetőek."
-#: ../src/modules/alsa/alsa-mixer.c:3769
-msgid "Digital Stereo (IEC958)"
-msgstr "Digitális sztereó (IEC958)"
+#~ msgid ""
+#~ "Dude, your kernel stinks! The chef's recommendation today is Linux with "
+#~ "high-resolution timers enabled!"
+#~ msgstr ""
+#~ "A nagypontosságú időzítők nem érhetőek el. Napjaink Linux rendszereiben "
+#~ "érdemes engedélyezni a nagypontosságú időzítőket."
-#: ../src/modules/alsa/alsa-mixer.c:3770
-#, fuzzy
-msgid "Digital Passthrough (IEC958)"
-msgstr "Digitális sztereó (IEC958)"
+#~ msgid "Daemon startup complete."
+#~ msgstr "A démon elindítása sikeres."
-#: ../src/modules/alsa/alsa-mixer.c:3771
-msgid "Digital Surround 4.0 (IEC958/AC3)"
-msgstr "Digitális térhatású 4.0 (IEC958/AC3)"
+#~ msgid "Daemon shutdown initiated."
+#~ msgstr "A démon leállítása kezdeményezve."
-#: ../src/modules/alsa/alsa-mixer.c:3772
-msgid "Digital Surround 5.1 (IEC958/AC3)"
-msgstr "Digitális térhatású 5.1 (IEC958/AC3)"
+#~ msgid "Daemon terminated."
+#~ msgstr "A démon leállítva."
-#: ../src/modules/alsa/alsa-mixer.c:3773
-msgid "Digital Stereo (HDMI)"
-msgstr "Digitális térhatású (HDMI)"
+#~ msgid "Cleaning up privileges."
+#~ msgstr "Jogosultságok letisztázása."
-#: ../src/modules/alsa/alsa-mixer.c:3774
#, fuzzy
-msgid "Digital Surround 5.1 (HDMI)"
-msgstr "Digitális térhatású 5.1 (IEC958/AC3)"
-
-#: ../src/modules/alsa/alsa-mixer.c:3895
-msgid "Analog Mono Duplex"
-msgstr "Analóg mono duplex"
+#~ msgid "PulseAudio Sound System KDE Routing Policy"
+#~ msgstr "PulseAudio hangrendszer"
-#: ../src/modules/alsa/alsa-mixer.c:3896
-msgid "Analog Stereo Duplex"
-msgstr "Analóg sztereó duplex"
-
-#: ../src/modules/alsa/alsa-mixer.c:3897
-msgid "Digital Stereo Duplex (IEC958)"
-msgstr "Analóg sztereó duplex (IEC958)"
-
-#: ../src/modules/alsa/alsa-mixer.c:3997
-#, fuzzy, c-format
-msgid "%s Output"
-msgstr "Semmis kimenet"
-
-#: ../src/modules/alsa/alsa-mixer.c:4005
-#, fuzzy, c-format
-msgid "%s Input"
-msgstr "Bemenet"
-
-#: ../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 ""
-
-#: ../src/modules/module-equalizer-sink.c:72
-msgid "General Purpose Equalizer"
-msgstr ""
-
-#: ../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=<nyelő neve> sink_properties=<nyelő tulajdonságai> "
-"master=<szűrendő nyelő neve> format=<sample format> rate=<mintavételezési "
-"ráta> channels=<csatornák száma> channel_map=<csatornaleképzés> "
-"plugin=<ladspa bővítmény neve> label=<ladspa bővítmény címkéje> "
-"control=<bemenetszabályzó értékek vesszővel elválasztott listája>"
+#~ msgid "Start the PulseAudio Sound System with KDE Routing Policy"
+#~ msgstr "A PulseAudio hangrendszer elindítása"
-#: ../src/modules/module-filter-apply.c:48
-msgid "autoclean=<automatically unload unused filters?>"
-msgstr ""
-
-#: ../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 "No cookie loaded. Attempting to connect without."
+#~ msgstr ""
+#~ "Nincs betölthető süti. Kísérlet a kapcsolat felvételére sütik használata "
+#~ "nélkül."
-#: ../src/tests/resampler-test.c:356
-#, fuzzy, c-format
-msgid "%s %s\n"
-msgstr "%s %s"
+#~ msgid "Failed to load client configuration file.\n"
+#~ msgstr "Nem sikerült betölteni a kliens konfigurációs fájlt.\n"
-#: ../src/tests/resampler-test.c:419
-#, c-format
-msgid "=== %d seconds: %d Hz %d ch (%s) -> %d Hz %d ch (%s)"
-msgstr ""
+#~ msgid "Failed to read environment configuration data.\n"
+#~ msgstr "Nem sikerült elolvasni a környezetváltozó konfigurációs adatokat.\n"
#~ msgid "[%s:%u] rlimit not supported on this platform."
#~ msgstr "[%s:%u] Az rlimit nem támogatott ezen az operációs rendszeren."
diff --git a/po/it.po b/po/it.po
index a8150c6..45f3134 100644
--- a/po/it.po
+++ b/po/it.po
@@ -10,8 +10,8 @@ msgid ""
msgstr ""
"Project-Id-Version: pulseaudio\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-03-26 09:35+0100\n"
-"PO-Revision-Date: 2015-03-26 09:34+0100\n"
+"POT-Creation-Date: 2016-04-06 11:53+0200\n"
+"PO-Revision-Date: 2016-04-06 11:53+0200\n"
"Last-Translator: Milo Casagrande <milo at milo.name>\n"
"Language-Team: Italian <tp at lists.linux.it>\n"
"Language: it\n"
@@ -19,7 +19,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 1.7.5\n"
+"X-Generator: Poedit 1.8.7\n"
# mamma mia che impressione
#: ../src/daemon/cmdline.c:111
@@ -268,73 +268,73 @@ msgstr "--no-cpu-limit richiede un argomento booleano"
msgid "--disable-shm expects boolean argument"
msgstr "--disable-shm richiede un argomento booleano"
-#: ../src/daemon/daemon-conf.c:258
+#: ../src/daemon/daemon-conf.c:259
#, c-format
msgid "[%s:%u] Invalid log target '%s'."
msgstr "[%s:%u] Destinazione di registro \"%s\" non valida."
-#: ../src/daemon/daemon-conf.c:273
+#: ../src/daemon/daemon-conf.c:274
#, c-format
msgid "[%s:%u] Invalid log level '%s'."
msgstr "[%s:%u] Livello di registro \"%s\" non valido."
-#: ../src/daemon/daemon-conf.c:288
+#: ../src/daemon/daemon-conf.c:289
#, c-format
msgid "[%s:%u] Invalid resample method '%s'."
msgstr "[%s:%u] Metodo di ricampionamento \"%s\" non valido."
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:311
#, c-format
msgid "[%s:%u] Invalid rlimit '%s'."
msgstr "[%s:%u] rlimit \"%s\" non valido."
# o campionamento?? ma campionamento non è sampling?
-#: ../src/daemon/daemon-conf.c:330
+#: ../src/daemon/daemon-conf.c:331
#, c-format
msgid "[%s:%u] Invalid sample format '%s'."
msgstr "[%s:%u] Formato di campionamento \"%s\" non valido."
-#: ../src/daemon/daemon-conf.c:347 ../src/daemon/daemon-conf.c:364
+#: ../src/daemon/daemon-conf.c:348 ../src/daemon/daemon-conf.c:365
#, c-format
msgid "[%s:%u] Invalid sample rate '%s'."
msgstr "[%s:%u] Frequenza di campionamento '%s' non valida."
-#: ../src/daemon/daemon-conf.c:387
+#: ../src/daemon/daemon-conf.c:388
#, c-format
msgid "[%s:%u] Invalid sample channels '%s'."
msgstr "[%s:%u] Canali di campionamento \"%s\" non validi."
-#: ../src/daemon/daemon-conf.c:404
+#: ../src/daemon/daemon-conf.c:405
#, c-format
msgid "[%s:%u] Invalid channel map '%s'."
msgstr "[%s:%u] Mappa del canale \"%s\" non valida."
-#: ../src/daemon/daemon-conf.c:421
+#: ../src/daemon/daemon-conf.c:422
#, c-format
msgid "[%s:%u] Invalid number of fragments '%s'."
msgstr "[%s:%u] Numero di frammenti \"%s\" non valido."
-#: ../src/daemon/daemon-conf.c:438
+#: ../src/daemon/daemon-conf.c:439
#, c-format
msgid "[%s:%u] Invalid fragment size '%s'."
msgstr "[%s:%u] Dimensione dei frammenti \"%s\" non valida."
-#: ../src/daemon/daemon-conf.c:455
+#: ../src/daemon/daemon-conf.c:456
#, c-format
msgid "[%s:%u] Invalid nice level '%s'."
msgstr "[%s:%u] Livello di nice \"%s\" non valido."
-#: ../src/daemon/daemon-conf.c:498
+#: ../src/daemon/daemon-conf.c:499
#, c-format
msgid "[%s:%u] Invalid server type '%s'."
msgstr "[%s:%u] Tipo di server \"%s\" non valido."
-#: ../src/daemon/daemon-conf.c:611
+#: ../src/daemon/daemon-conf.c:613
#, c-format
msgid "Failed to open configuration file: %s"
msgstr "Apertura del file di configurazione non riuscita: %s"
-#: ../src/daemon/daemon-conf.c:627
+#: ../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."
@@ -342,7 +342,7 @@ msgstr ""
"La mappa del canale predefinita specificata presenta un numero diverso di "
"canali rispetto a quello predefinito specificato."
-#: ../src/daemon/daemon-conf.c:714
+#: ../src/daemon/daemon-conf.c:716
#, c-format
msgid "### Read from configuration file: %s ###\n"
msgstr "### Lettura dal file di configurazione: %s ###\n"
@@ -504,25 +504,25 @@ msgstr ""
"approfondito."
#: ../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."
msgstr "In esecuzione in modalità sistema, ma --disallow-exit non impostato."
#: ../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."
msgstr ""
"In esecuzione in modalità sistema, ma --disallow-module-loading non "
"impostato."
#: ../src/daemon/main.c:718
-msgid "Running in system mode, forcibly disabling SHM mode!"
+msgid "Running in system mode, forcibly disabling SHM mode."
msgstr ""
-"In esecuzione in modalità sistema, disabilitata in modo forzoso la modalità "
+"In esecuzione in modalità sistema, disabilitata in modo forzato la modalità "
"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."
msgstr ""
-"In esecuzione in modalità sistema, disabilitato in modo forzoso il tempo di "
+"In esecuzione in modalità sistema, disabilitato in modo forzato il tempo di "
"uscita per inattività."
#: ../src/daemon/main.c:756
@@ -583,11 +583,11 @@ msgstr "pa_pid_file_create() non riuscita."
msgid "pa_core_new() failed."
msgstr "pa_core_new() non riuscita."
-#: ../src/daemon/main.c:1088
+#: ../src/daemon/main.c:1089
msgid "Failed to initialize daemon."
msgstr "Inizializzazione del demone non riuscita."
-#: ../src/daemon/main.c:1093
+#: ../src/daemon/main.c:1094
msgid "Daemon startup without any loaded modules, refusing to work."
msgstr "Avvio del demone senza alcun modulo caricato, rifiuta di lavorare."
@@ -599,260 +599,295 @@ msgstr "Sistema sonoro PulseAudio"
msgid "Start the PulseAudio Sound System"
msgstr "Avvia il sistema sonoro PulseAudio"
-#: ../src/modules/alsa/alsa-mixer.c:2291
+#: ../src/modules/alsa/alsa-mixer.c:2378
msgid "Input"
msgstr "Ingresso"
-#: ../src/modules/alsa/alsa-mixer.c:2292
+#: ../src/modules/alsa/alsa-mixer.c:2379
msgid "Docking Station Input"
msgstr "Ingresso docking station"
-#: ../src/modules/alsa/alsa-mixer.c:2293
+#: ../src/modules/alsa/alsa-mixer.c:2380
msgid "Docking Station Microphone"
msgstr "Microfono docking station"
-#: ../src/modules/alsa/alsa-mixer.c:2294
+#: ../src/modules/alsa/alsa-mixer.c:2381
msgid "Docking Station Line In"
msgstr "Linea in docking station"
-#: ../src/modules/alsa/alsa-mixer.c:2295 ../src/modules/alsa/alsa-mixer.c:2380
+#: ../src/modules/alsa/alsa-mixer.c:2382 ../src/modules/alsa/alsa-mixer.c:2467
msgid "Line In"
-msgstr "Line In"
+msgstr "Line-In"
-#: ../src/modules/alsa/alsa-mixer.c:2296 ../src/modules/alsa/alsa-mixer.c:2374
-#: ../src/modules/bluetooth/module-bluez4-device.c:2102
+#: ../src/modules/alsa/alsa-mixer.c:2383 ../src/modules/alsa/alsa-mixer.c:2461
+#: ../src/modules/bluetooth/module-bluez4-device.c:2099
#: ../src/modules/bluetooth/module-bluez5-device.c:1710
msgid "Microphone"
msgstr "Microfono"
-#: ../src/modules/alsa/alsa-mixer.c:2297 ../src/modules/alsa/alsa-mixer.c:2375
+#: ../src/modules/alsa/alsa-mixer.c:2384 ../src/modules/alsa/alsa-mixer.c:2462
msgid "Front Microphone"
msgstr "Microfono anteriore"
-#: ../src/modules/alsa/alsa-mixer.c:2298 ../src/modules/alsa/alsa-mixer.c:2376
+#: ../src/modules/alsa/alsa-mixer.c:2385 ../src/modules/alsa/alsa-mixer.c:2463
msgid "Rear Microphone"
msgstr "Microfono posteriore"
-#: ../src/modules/alsa/alsa-mixer.c:2299
+#: ../src/modules/alsa/alsa-mixer.c:2386
msgid "External Microphone"
msgstr "Microfono esterno"
-#: ../src/modules/alsa/alsa-mixer.c:2300 ../src/modules/alsa/alsa-mixer.c:2378
+#: ../src/modules/alsa/alsa-mixer.c:2387 ../src/modules/alsa/alsa-mixer.c:2465
msgid "Internal Microphone"
msgstr "Microfono interno"
-#: ../src/modules/alsa/alsa-mixer.c:2301 ../src/modules/alsa/alsa-mixer.c:2381
+#: ../src/modules/alsa/alsa-mixer.c:2388 ../src/modules/alsa/alsa-mixer.c:2468
msgid "Radio"
msgstr "Radio"
-#: ../src/modules/alsa/alsa-mixer.c:2302 ../src/modules/alsa/alsa-mixer.c:2382
+#: ../src/modules/alsa/alsa-mixer.c:2389 ../src/modules/alsa/alsa-mixer.c:2469
msgid "Video"
msgstr "Video"
-#: ../src/modules/alsa/alsa-mixer.c:2303
+#: ../src/modules/alsa/alsa-mixer.c:2390
msgid "Automatic Gain Control"
msgstr "Controllo automatico del guadagno"
-#: ../src/modules/alsa/alsa-mixer.c:2304
+#: ../src/modules/alsa/alsa-mixer.c:2391
msgid "No Automatic Gain Control"
msgstr "Nessun controllo automatico del guadagno"
-#: ../src/modules/alsa/alsa-mixer.c:2305
+#: ../src/modules/alsa/alsa-mixer.c:2392
msgid "Boost"
msgstr "Boost"
-#: ../src/modules/alsa/alsa-mixer.c:2306
+#: ../src/modules/alsa/alsa-mixer.c:2393
msgid "No Boost"
msgstr "Nessun boost"
-#: ../src/modules/alsa/alsa-mixer.c:2307
+#: ../src/modules/alsa/alsa-mixer.c:2394
msgid "Amplifier"
msgstr "Amplificatore"
-#: ../src/modules/alsa/alsa-mixer.c:2308
+#: ../src/modules/alsa/alsa-mixer.c:2395
msgid "No Amplifier"
msgstr "Nessun amplificatore"
-#: ../src/modules/alsa/alsa-mixer.c:2309
+#: ../src/modules/alsa/alsa-mixer.c:2396
msgid "Bass Boost"
msgstr "Incremento bassi"
-#: ../src/modules/alsa/alsa-mixer.c:2310
+#: ../src/modules/alsa/alsa-mixer.c:2397
msgid "No Bass Boost"
msgstr "Nessun incremento bassi"
-#: ../src/modules/alsa/alsa-mixer.c:2311
-#: ../src/modules/bluetooth/module-bluez4-device.c:2107
+#: ../src/modules/alsa/alsa-mixer.c:2398
+#: ../src/modules/bluetooth/module-bluez4-device.c:2104
#: ../src/modules/bluetooth/module-bluez5-device.c:1717
msgid "Speaker"
msgstr "Altoparlante"
-#: ../src/modules/alsa/alsa-mixer.c:2312 ../src/modules/alsa/alsa-mixer.c:2384
+#: ../src/modules/alsa/alsa-mixer.c:2399 ../src/modules/alsa/alsa-mixer.c:2471
msgid "Headphones"
msgstr "Cuffie analogiche"
-#: ../src/modules/alsa/alsa-mixer.c:2373
+#: ../src/modules/alsa/alsa-mixer.c:2460
msgid "Analog Input"
msgstr "Ingresso analogico"
-#: ../src/modules/alsa/alsa-mixer.c:2377
+#: ../src/modules/alsa/alsa-mixer.c:2464
msgid "Dock Microphone"
msgstr "Microfono docking station"
-#: ../src/modules/alsa/alsa-mixer.c:2379
+#: ../src/modules/alsa/alsa-mixer.c:2466
msgid "Headset Microphone"
msgstr "Microfono auricolare"
-#: ../src/modules/alsa/alsa-mixer.c:2383
+#: ../src/modules/alsa/alsa-mixer.c:2470
msgid "Analog Output"
msgstr "Uscita analogica"
-#: ../src/modules/alsa/alsa-mixer.c:2385
+#: ../src/modules/alsa/alsa-mixer.c:2472
msgid "LFE on Separate Mono Output"
-msgstr "Uscita analogica (LFE)"
+msgstr "LFE su uscita mono separata"
-#: ../src/modules/alsa/alsa-mixer.c:2386
+#: ../src/modules/alsa/alsa-mixer.c:2473
msgid "Line Out"
-msgstr "Linea out"
+msgstr "Line-Out"
-#: ../src/modules/alsa/alsa-mixer.c:2387
+#: ../src/modules/alsa/alsa-mixer.c:2474
msgid "Analog Mono Output"
msgstr "Uscita mono analogica"
-#: ../src/modules/alsa/alsa-mixer.c:2388
+#: ../src/modules/alsa/alsa-mixer.c:2475
msgid "Speakers"
msgstr "Altoparlanti"
-#: ../src/modules/alsa/alsa-mixer.c:2389
+#: ../src/modules/alsa/alsa-mixer.c:2476
msgid "HDMI / DisplayPort"
msgstr "HDMI / DisplayPort"
-#: ../src/modules/alsa/alsa-mixer.c:2390
+#: ../src/modules/alsa/alsa-mixer.c:2477
msgid "Digital Output (S/PDIF)"
-msgstr "Output digitale (S/PDIF)"
+msgstr "Uscita digitale (S/PDIF)"
-#: ../src/modules/alsa/alsa-mixer.c:2391
+#: ../src/modules/alsa/alsa-mixer.c:2478
msgid "Digital Input (S/PDIF)"
msgstr "Ingresso digitale (S/PDIF)"
-#: ../src/modules/alsa/alsa-mixer.c:2392
+#: ../src/modules/alsa/alsa-mixer.c:2479
msgid "Digital Passthrough (S/PDIF)"
msgstr "Passthrough digitale (S/PDIF)"
-#: ../src/modules/alsa/alsa-mixer.c:3898
+#: ../src/modules/alsa/alsa-mixer.c:2480
+msgid "Multichannel Input"
+msgstr "Ingresso multi canale"
+
+#: ../src/modules/alsa/alsa-mixer.c:2481
+msgid "Multichannel Output"
+msgstr "Uscita multi canale"
+
+#: ../src/modules/alsa/alsa-mixer.c:3990
msgid "Analog Mono"
msgstr "Mono analogico"
-#: ../src/modules/alsa/alsa-mixer.c:3899
+#. 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:3991 ../src/modules/alsa/alsa-mixer.c:3997
+#: ../src/modules/alsa/alsa-mixer.c:3998
msgid "Analog Stereo"
msgstr "Stereo analogico"
-#: ../src/modules/alsa/alsa-mixer.c:3900
+#: ../src/modules/alsa/alsa-mixer.c:3999 ../src/modules/alsa/alsa-mixer.c:4000
msgid "Multichannel"
msgstr "Multi canale"
-#: ../src/modules/alsa/alsa-mixer.c:3901
+#: ../src/modules/alsa/alsa-mixer.c:4001
msgid "Analog Surround 2.1"
msgstr "Surround analogico 2.1"
-#: ../src/modules/alsa/alsa-mixer.c:3902
+#: ../src/modules/alsa/alsa-mixer.c:4002
msgid "Analog Surround 3.0"
msgstr "Surround analogico 3.0"
-#: ../src/modules/alsa/alsa-mixer.c:3903
+#: ../src/modules/alsa/alsa-mixer.c:4003
msgid "Analog Surround 3.1"
msgstr "Surround analogico 3.1"
-#: ../src/modules/alsa/alsa-mixer.c:3904
+#: ../src/modules/alsa/alsa-mixer.c:4004
msgid "Analog Surround 4.0"
msgstr "Surround analogico 4.0"
-#: ../src/modules/alsa/alsa-mixer.c:3905
+#: ../src/modules/alsa/alsa-mixer.c:4005
msgid "Analog Surround 4.1"
msgstr "Surround analogico 4.1"
-#: ../src/modules/alsa/alsa-mixer.c:3906
+#: ../src/modules/alsa/alsa-mixer.c:4006
msgid "Analog Surround 5.0"
msgstr "Surround analogico 5.0"
-#: ../src/modules/alsa/alsa-mixer.c:3907
+#: ../src/modules/alsa/alsa-mixer.c:4007
msgid "Analog Surround 5.1"
msgstr "Surround analogico 5.1"
-#: ../src/modules/alsa/alsa-mixer.c:3908
+#: ../src/modules/alsa/alsa-mixer.c:4008
msgid "Analog Surround 6.0"
msgstr "Surround analogico 6.0"
-#: ../src/modules/alsa/alsa-mixer.c:3909
+#: ../src/modules/alsa/alsa-mixer.c:4009
msgid "Analog Surround 6.1"
msgstr "Surround analogico 6.1"
-#: ../src/modules/alsa/alsa-mixer.c:3910
+#: ../src/modules/alsa/alsa-mixer.c:4010
msgid "Analog Surround 7.0"
msgstr "Surround analogico 7.0"
-#: ../src/modules/alsa/alsa-mixer.c:3911
+#: ../src/modules/alsa/alsa-mixer.c:4011
msgid "Analog Surround 7.1"
msgstr "Surround analogico 7.1"
-#: ../src/modules/alsa/alsa-mixer.c:3912
+#: ../src/modules/alsa/alsa-mixer.c:4012
msgid "Digital Stereo (IEC958)"
msgstr "Stereo digitale (IEC958)"
-#: ../src/modules/alsa/alsa-mixer.c:3913
+#: ../src/modules/alsa/alsa-mixer.c:4013
msgid "Digital Passthrough (IEC958)"
msgstr "Passthrough digitale (IEC958)"
-#: ../src/modules/alsa/alsa-mixer.c:3914
+#: ../src/modules/alsa/alsa-mixer.c:4014
msgid "Digital Surround 4.0 (IEC958/AC3)"
msgstr "Surround digitale 4.0 (IEC958/AC3)"
-#: ../src/modules/alsa/alsa-mixer.c:3915
+#: ../src/modules/alsa/alsa-mixer.c:4015
msgid "Digital Surround 5.1 (IEC958/AC3)"
msgstr "Surround digitale 5.1 (IEC958/AC3)"
-#: ../src/modules/alsa/alsa-mixer.c:3916
+#: ../src/modules/alsa/alsa-mixer.c:4016
msgid "Digital Surround 5.1 (IEC958/DTS)"
msgstr "Surround digitale 5.1 (IEC958/DTS)"
-#: ../src/modules/alsa/alsa-mixer.c:3917
+#: ../src/modules/alsa/alsa-mixer.c:4017
msgid "Digital Stereo (HDMI)"
msgstr "Stereo digitale (HDMI)"
-#: ../src/modules/alsa/alsa-mixer.c:3918
+#: ../src/modules/alsa/alsa-mixer.c:4018
msgid "Digital Surround 5.1 (HDMI)"
msgstr "Surround digitale 5.1 (HDMI)"
-#: ../src/modules/alsa/alsa-mixer.c:4049
+#: ../src/modules/alsa/alsa-mixer.c:4151
msgid "Analog Mono Duplex"
msgstr "Duplex mono analogico"
-#: ../src/modules/alsa/alsa-mixer.c:4050
+#: ../src/modules/alsa/alsa-mixer.c:4152
msgid "Analog Stereo Duplex"
msgstr "Duplex stereo analogico"
-#: ../src/modules/alsa/alsa-mixer.c:4051
+#: ../src/modules/alsa/alsa-mixer.c:4153
msgid "Digital Stereo Duplex (IEC958)"
msgstr "Duplex stereo digitale (IEC958)"
-#: ../src/modules/alsa/alsa-mixer.c:4052
-#: ../src/modules/alsa/module-alsa-card.c:190
-#: ../src/modules/bluetooth/module-bluez4-device.c:2298
+#: ../src/modules/alsa/alsa-mixer.c:4154
+msgid "Multichannel Duplex"
+msgstr "Duplex multi canale"
+
+#: ../src/modules/alsa/alsa-mixer.c:4155
+#: ../src/modules/alsa/module-alsa-card.c:186
+#: ../src/modules/bluetooth/module-bluez4-device.c:2295
#: ../src/modules/bluetooth/module-bluez5-device.c:1941
msgid "Off"
msgstr "Spento"
-#: ../src/modules/alsa/alsa-mixer.c:4151
+#: ../src/modules/alsa/alsa-mixer.c:4254
#, c-format
msgid "%s Output"
-msgstr "%s output"
+msgstr "Uscita «%s»"
-#: ../src/modules/alsa/alsa-mixer.c:4159
+#: ../src/modules/alsa/alsa-mixer.c:4262
#, c-format
msgid "%s Input"
-msgstr "%s input"
+msgstr "Ingresso «%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."
+msgstr ""
+"Attivazione da parte di ALSA per scrivere nuovi dati sul dispositivo, ma non "
+"c'era nulla da scrivere.\n"
+"Molto probabilmente si tratta di un bug nei driver ALSA \"%s\". Segnalare "
+"questo problema agli sviluppatori di ALSA.\n"
+"Attivazione avvenuta con POLLOUT impostato -- tuttavia, una successiva "
+"snd_pcm_avail() ha ritornato 0 o un altro valore < 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 "
@@ -869,7 +904,24 @@ msgstr ""
"Attivazione avvenuta con POLLOUT impostato -- tuttavia, una successiva "
"snd_pcm_avail() ha ritornato 0 o un altro valore < 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."
+msgstr ""
+"Attivazione da parte di ALSA per leggere nuovi dati dal dispositivo, ma non "
+"c'era nulla da leggere.\n"
+"Molto probabilmente si tratta di un bug nei driver ALSA \"%s\". Segnalare "
+"questo problema agli sviluppatori di ALSA.\n"
+"Attivazione avvenuta con POLLIN impostato -- tuttavia, una successiva "
+"snd_pcm_avail() ha ritornato 0 o un altro valore < 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 "
@@ -886,7 +938,7 @@ msgstr ""
"Attivazione avvenuta con POLLIN impostato -- tuttavia, una successiva "
"snd_pcm_avail() ha ritornato 0 o un altro valore < min_avail."
-#: ../src/modules/alsa/alsa-util.c:1149 ../src/modules/alsa/alsa-util.c:1224
+#: ../src/modules/alsa/alsa-util.c:1166 ../src/modules/alsa/alsa-util.c:1241
#, c-format
msgid ""
"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
@@ -898,7 +950,7 @@ msgstr ""
"Molto probabilmente si tratta di un bug nel driver ALSA \"%s\". Segnalare "
"questo problema agli sviluppatori ALSA."
-#: ../src/modules/alsa/alsa-util.c:1199
+#: ../src/modules/alsa/alsa-util.c:1216
#, c-format
msgid ""
"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s"
@@ -910,7 +962,7 @@ msgstr ""
"Molto probabilmente si tratta di un bug nel driver ALSA \"%s\". Segnalare "
"questo problema agli sviluppatori ALSA."
-#: ../src/modules/alsa/alsa-util.c:1240
+#: ../src/modules/alsa/alsa-util.c:1257
#, c-format
msgid ""
"snd_pcm_avail_delay() returned strange values: delay %lu is less than avail "
@@ -923,7 +975,7 @@ msgstr ""
"Molto probabilmente si tratta di un bug nel driver ALSA \"%s\". Segnalare "
"questo problema agli sviluppatori ALSA."
-#: ../src/modules/alsa/alsa-util.c:1283
+#: ../src/modules/alsa/alsa-util.c:1300
#, c-format
msgid ""
"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
@@ -936,49 +988,49 @@ msgstr ""
"Molto probabilmente si tratta di un bug nel driver ALSA \"%s\". Segnalare "
"questo problema agli sviluppatori ALSA."
-#: ../src/modules/bluetooth/module-bluez4-device.c:2092
+#: ../src/modules/bluetooth/module-bluez4-device.c:2089
#: ../src/modules/bluetooth/module-bluez5-device.c:1700
msgid "Headset"
msgstr "Cuffie con microfono"
-#: ../src/modules/bluetooth/module-bluez4-device.c:2097
+#: ../src/modules/bluetooth/module-bluez4-device.c:2094
#: ../src/modules/bluetooth/module-bluez5-device.c:1705
msgid "Handsfree"
msgstr "Sistema mani-libere"
-#: ../src/modules/bluetooth/module-bluez4-device.c:2112
+#: ../src/modules/bluetooth/module-bluez4-device.c:2109
#: ../src/modules/bluetooth/module-bluez5-device.c:1723
msgid "Headphone"
msgstr "Cuffie"
-#: ../src/modules/bluetooth/module-bluez4-device.c:2117
+#: ../src/modules/bluetooth/module-bluez4-device.c:2114
#: ../src/modules/bluetooth/module-bluez5-device.c:1728
msgid "Portable"
msgstr "Portabile"
-#: ../src/modules/bluetooth/module-bluez4-device.c:2122
+#: ../src/modules/bluetooth/module-bluez4-device.c:2119
#: ../src/modules/bluetooth/module-bluez5-device.c:1733
msgid "Car"
msgstr "Automobile"
-#: ../src/modules/bluetooth/module-bluez4-device.c:2127
+#: ../src/modules/bluetooth/module-bluez4-device.c:2124
#: ../src/modules/bluetooth/module-bluez5-device.c:1738
msgid "HiFi"
msgstr "HiFi"
-#: ../src/modules/bluetooth/module-bluez4-device.c:2132
+#: ../src/modules/bluetooth/module-bluez4-device.c:2129
#: ../src/modules/bluetooth/module-bluez5-device.c:1743
msgid "Phone"
msgstr "Telefono"
-#: ../src/modules/bluetooth/module-bluez4-device.c:2140
+#: ../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 "Output Bluetooth"
+msgstr "Uscita Bluetooth"
-#: ../src/modules/bluetooth/module-bluez4-device.c:2143
+#: ../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
@@ -986,19 +1038,19 @@ msgstr "Output Bluetooth"
msgid "Bluetooth Input"
msgstr "Ingresso Bluetooth"
-#: ../src/modules/bluetooth/module-bluez4-device.c:2179
+#: ../src/modules/bluetooth/module-bluez4-device.c:2176
msgid "High Fidelity Playback (A2DP)"
msgstr "Riproduzione ad alta fedeltà (A2DP)"
-#: ../src/modules/bluetooth/module-bluez4-device.c:2190
+#: ../src/modules/bluetooth/module-bluez4-device.c:2187
msgid "High Fidelity Capture (A2DP)"
msgstr "Cattura ad alta fedeltà (A2DP)"
-#: ../src/modules/bluetooth/module-bluez4-device.c:2201
+#: ../src/modules/bluetooth/module-bluez4-device.c:2198
msgid "Telephony Duplex (HSP/HFP)"
msgstr "Doppino telefonico (HSP/HFP)"
-#: ../src/modules/bluetooth/module-bluez4-device.c:2213
+#: ../src/modules/bluetooth/module-bluez4-device.c:2210
msgid "Handsfree Gateway"
msgstr "Gateway handsfree"
@@ -1028,7 +1080,8 @@ msgid ""
"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> "
+"loaded automatically> use_volume_sharing=<yes or no> use_master_format=<yes "
+"or no> "
msgstr ""
"source_name=<nome della sorgente> source_properties=<proprietà della "
"sorgente> source_master=<nome della sorgente da filtrare> sink_name=<nome "
@@ -1039,10 +1092,10 @@ msgstr ""
"channel_map=<mappa canali ingresso> aec_method=<implementazione da usare> "
"aec_args=<parametri per il motore AEC> save_aec=<salva i dati AEC in /tmp> "
"autoloaded=<imposta se il modulo viene caricato automaticamente> "
-"use_volume_sharing=<yes o no> "
+"use_volume_sharing=<yes o no> use_master_format=<yes o no> "
#. add on profile
-#: ../src/modules/macosx/module-coreaudio-device.c:754
+#: ../src/modules/macosx/module-coreaudio-device.c:811
msgid "On"
msgstr "On"
@@ -1050,9 +1103,9 @@ msgstr "On"
msgid "Always keeps at least one sink loaded even if it's a null one"
msgstr "Mantiene sempre almeno un sink caricato anche se è nullo"
-#: ../src/modules/module-always-sink.c:80
+#: ../src/modules/module-always-sink.c:82
msgid "Dummy Output"
-msgstr "Output dummy"
+msgstr "Uscita dummy"
#: ../src/modules/module-equalizer-sink.c:70
msgid "General Purpose Equalizer"
@@ -1101,9 +1154,9 @@ msgstr ""
msgid "Clocked NULL sink"
msgstr "Sink NULL temporizzato"
-#: ../src/modules/module-null-sink.c:278
+#: ../src/modules/module-null-sink.c:280
msgid "Null Output"
-msgstr "Output nullo"
+msgstr "Uscita nulla"
#: ../src/modules/module-rygel-media-server.c:508
#: ../src/modules/module-rygel-media-server.c:546
@@ -1157,7 +1210,7 @@ msgstr ""
msgid "PulseAudio Sound Server"
msgstr "Server sonoro PulseAudio"
-#: ../src/pulse/channelmap.c:103 ../src/pulse/channelmap.c:758
+#: ../src/pulse/channelmap.c:103 ../src/pulse/channelmap.c:771
msgid "Mono"
msgstr "Mono"
@@ -1363,7 +1416,7 @@ msgstr "Superiore posteriore sinistro"
msgid "Top Rear Right"
msgstr "Superiore posteriore destro"
-#: ../src/pulse/channelmap.c:479 ../src/pulse/format.c:121
+#: ../src/pulse/channelmap.c:479 ../src/pulse/format.c:127
#: ../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
@@ -1371,27 +1424,27 @@ msgstr "Superiore posteriore destro"
msgid "(invalid)"
msgstr "(non valido)"
-#: ../src/pulse/channelmap.c:762
+#: ../src/pulse/channelmap.c:775
msgid "Stereo"
msgstr "Stereo"
-#: ../src/pulse/channelmap.c:767
+#: ../src/pulse/channelmap.c:780
msgid "Surround 4.0"
msgstr "Surround 4.0"
-#: ../src/pulse/channelmap.c:773
+#: ../src/pulse/channelmap.c:786
msgid "Surround 4.1"
msgstr "Surround 4.1"
-#: ../src/pulse/channelmap.c:779
+#: ../src/pulse/channelmap.c:792
msgid "Surround 5.0"
msgstr "Surround 5.0"
-#: ../src/pulse/channelmap.c:785
+#: ../src/pulse/channelmap.c:798
msgid "Surround 5.1"
msgstr "Surround 5.1"
-#: ../src/pulse/channelmap.c:792
+#: ../src/pulse/channelmap.c:805
msgid "Surround 7.1"
msgstr "Surround 7.1"
@@ -1407,17 +1460,17 @@ msgstr "xcb_connection_has_error() ha restituito VERO"
msgid "Failed to parse cookie data"
msgstr "Analisi dei dati cookie non riuscita"
-#: ../src/pulse/context.c:656
+#: ../src/pulse/context.c:666
#, c-format
msgid "fork(): %s"
msgstr "fork(): %s"
-#: ../src/pulse/context.c:711
+#: ../src/pulse/context.c:721
#, c-format
msgid "waitpid(): %s"
msgstr "waitpid(): %s"
-#: ../src/pulse/context.c:1417
+#: ../src/pulse/context.c:1427
#, c-format
msgid "Received message for unknown extension '%s'"
msgstr "Ricevuto messaggio per l'estensione sconosciuta \"%s\""
@@ -1428,7 +1481,7 @@ msgstr "ingresso"
#: ../src/pulse/direction.c:39
msgid "output"
-msgstr "output"
+msgstr "uscita"
#: ../src/pulse/direction.c:41
msgid "bidirectional"
@@ -1438,7 +1491,7 @@ msgstr "bidirezionale"
msgid "invalid"
msgstr "non valido"
-#: ../src/pulsecore/core-util.c:1821
+#: ../src/pulsecore/core-util.c:1836
#, c-format
msgid ""
"XDG_RUNTIME_DIR (%s) is not owned by us (uid %d), but by uid %d! (This could "
@@ -1449,11 +1502,11 @@ msgstr ""
"(ciò potrebbe verificarsi se si tenta la connessione come utente root verso "
"PulseAudio eseguito non da root, attraverso il protocollo nativo)."
-#: ../src/pulsecore/core-util.h:93
+#: ../src/pulsecore/core-util.h:97
msgid "yes"
msgstr "sì"
-#: ../src/pulsecore/core-util.h:93
+#: ../src/pulsecore/core-util.h:97
msgid "no"
msgstr "no"
@@ -1461,12 +1514,12 @@ msgstr "no"
msgid "Cannot access autospawn lock."
msgstr "Impossibile accedere al lock di autospawn."
-#: ../src/pulsecore/log.c:153
+#: ../src/pulsecore/log.c:165
#, c-format
msgid "Failed to open target file '%s'."
msgstr "Impossibile aprire il file di destinazione «%s»."
-#: ../src/pulsecore/log.c:176
+#: ../src/pulsecore/log.c:188
#, c-format
msgid ""
"Tried to open target file '%s', '%s.1', '%s.2' ... '%s.%d', but all failed."
@@ -1474,15 +1527,15 @@ msgstr ""
"Tentativo di aprire i file di destinazione «%s», «%s.1», «%s.2» ... «%s.%d» "
"non riuscito."
-#: ../src/pulsecore/log.c:631
+#: ../src/pulsecore/log.c:651
msgid "Invalid log target."
msgstr "Destinazione di registrazione non valida."
-#: ../src/pulsecore/sink.c:3427
+#: ../src/pulsecore/sink.c:3460
msgid "Built-in Audio"
msgstr "Audio interno"
-#: ../src/pulsecore/sink.c:3432
+#: ../src/pulsecore/sink.c:3465
msgid "Modem"
msgstr "Modem"
@@ -1619,74 +1672,6 @@ msgstr "%0.1f KiB"
msgid "%u B"
msgstr "%u B"
-#: ../src/tests/resampler-test.c:255
-#, 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"
-"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 [OPZIONI]\n"
-"\n"
-"-h, --help Visualizza questo aiuto\n"
-"-v, --verbose Stampa messaggi di debug\n"
-" --from-rate=FREQUENZACAMPIONAMENTO Frequenza di campionamento "
-"sorgente\n"
-" in Hz (predefinito 44100)\n"
-" --from-format=FORMATOCAMPIONE Tipo di campione sorgente\n"
-" (predefinito s16le)\n"
-" --from-channels=CANALI Numero di canali sorgente\n"
-" (predefinito 1)\n"
-" --to-rate=FREQUENZACAMPIONAMENTO Frequenza di campionamento di\n"
-" destinazione in Hz (predefinito "
-"44100)\n"
-" --to-format=FORMATOCAMPIONE Tipo di campione di destinazione\n"
-" (predefinito s16le)\n"
-" --to-channels=CANALI Numero di canali di destinazione\n"
-" (predefinito 1)\n"
-" --resample-method=METODO Metodo di ricampionamento\n"
-" (predefinito auto)\n"
-" --seconds=SECONDI Durata dello stream sorgente\n"
-" (predefinito 60)\n"
-"\n"
-"Se i formati non vengono specificati, il test prova tutte le combinazioni "
-"di\n"
-"formati, ricorsivamente\n"
-"\n"
-"Il tipo di campione deve essere scelto tra: s16le, s16be, u8, float32le,\n"
-"float32be, ulaw, alaw, s24le, s24be, s24-32le, s24-32be, s32le, s32be\n"
-"(predefinito s16ne).\n"
-"\n"
-"Consultare --dump-resample-methods per i valori ammessi per i metodi di\n"
-"ricampionamento.\n"
-
-#: ../src/tests/resampler-test.c:354
-#, c-format
-msgid "%s %s\n"
-msgstr "%s %s\n"
-
#: ../src/utils/pacat.c:117
#, c-format
msgid "Failed to drain stream: %s"
@@ -1804,7 +1789,7 @@ msgid "Cork request stack is empty: uncorking stream"
msgstr "Lo stack delle richieste di blocco è vuoto: viene sbloccato il flusso"
#: ../src/utils/pacat.c:441
-msgid "Warning: Received more uncork requests than cork requests!"
+msgid "Warning: Received more uncork requests than cork requests."
msgstr "Attenzione: ricevute più richieste di sblocco che di blocco."
#: ../src/utils/pacat.c:466
@@ -2044,7 +2029,7 @@ msgstr ""
"Compilato con libpulse %s\n"
"Link eseguito con libpulse %s\n"
-#: ../src/utils/pacat.c:847 ../src/utils/pactl.c:1642
+#: ../src/utils/pacat.c:847 ../src/utils/pactl.c:1648
#, c-format
msgid "Invalid client name '%s'"
msgstr "Nome del client \"%s\" non valido"
@@ -2118,7 +2103,7 @@ msgstr ""
"Attenzione: la specifica di campionamento indicata verrà soprascritta con "
"quella dal file."
-#: ../src/utils/pacat.c:1074 ../src/utils/pactl.c:1706
+#: ../src/utils/pacat.c:1074 ../src/utils/pactl.c:1712
msgid "Failed to determine sample specification from file."
msgstr "Determinazione della specifica di campionamento dal file non riuscita."
@@ -2155,7 +2140,7 @@ msgstr "riproduzione"
msgid "Failed to set media name."
msgstr "Impostazione nome del supporto non riuscita."
-#: ../src/utils/pacat.c:1152 ../src/utils/pactl.c:2056
+#: ../src/utils/pacat.c:1152 ../src/utils/pactl.c:2062
msgid "pa_mainloop_new() failed."
msgstr "pa_mainloop_new() non riuscita."
@@ -2163,11 +2148,11 @@ msgstr "pa_mainloop_new() non riuscita."
msgid "io_new() failed."
msgstr "io_new() non riuscita."
-#: ../src/utils/pacat.c:1182 ../src/utils/pactl.c:2068
+#: ../src/utils/pacat.c:1182 ../src/utils/pactl.c:2074
msgid "pa_context_new() failed."
msgstr "pa_context_new() non riuscita."
-#: ../src/utils/pacat.c:1190 ../src/utils/pactl.c:2074
+#: ../src/utils/pacat.c:1190 ../src/utils/pactl.c:2080
#, c-format
msgid "pa_context_connect() failed: %s"
msgstr "pa_context_connect() non riuscita: %s"
@@ -2176,20 +2161,20 @@ msgstr "pa_context_connect() non riuscita: %s"
msgid "pa_context_rttime_new() failed."
msgstr "pa_context_rttime_new() non riuscita."
-#: ../src/utils/pacat.c:1203 ../src/utils/pactl.c:2079
+#: ../src/utils/pacat.c:1203 ../src/utils/pactl.c:2085
msgid "pa_mainloop_run() failed."
msgstr "pa_mainloop_run() non riuscita."
-#: ../src/utils/pacmd.c:51 ../src/utils/pactl.c:1564
+#: ../src/utils/pacmd.c:51 ../src/utils/pactl.c:1570
msgid "NAME [ARGS ...]"
msgstr "NOME [ARG ...]"
-#: ../src/utils/pacmd.c:52 ../src/utils/pacmd.c:60 ../src/utils/pactl.c:1565
+#: ../src/utils/pacmd.c:52 ../src/utils/pacmd.c:60 ../src/utils/pactl.c:1571
msgid "NAME|#N"
msgstr "NOME|#N"
-#: ../src/utils/pacmd.c:53 ../src/utils/pacmd.c:63 ../src/utils/pactl.c:1563
-#: ../src/utils/pactl.c:1569
+#: ../src/utils/pacmd.c:53 ../src/utils/pacmd.c:63 ../src/utils/pactl.c:1569
+#: ../src/utils/pactl.c:1575
msgid "NAME"
msgstr "NOME"
@@ -2201,7 +2186,7 @@ msgstr "NOME|#N VOLUME"
msgid "#N VOLUME"
msgstr "#N VOLUME"
-#: ../src/utils/pacmd.c:56 ../src/utils/pacmd.c:70 ../src/utils/pactl.c:1567
+#: ../src/utils/pacmd.c:56 ../src/utils/pacmd.c:70 ../src/utils/pactl.c:1573
msgid "NAME|#N 1|0"
msgstr "NOME|#N 1|0"
@@ -2237,7 +2222,7 @@ msgstr "NOMEPERCORSO"
msgid "FILENAME SINK|#N"
msgstr "NOMEFILE SINK|#N"
-#: ../src/utils/pacmd.c:69 ../src/utils/pactl.c:1566
+#: ../src/utils/pacmd.c:69 ../src/utils/pactl.c:1572
msgid "#N SINK|SOURCE"
msgstr "#N SINK|SORGENTE"
@@ -2245,15 +2230,15 @@ msgstr "#N SINK|SORGENTE"
msgid "1|0"
msgstr "1|0"
-#: ../src/utils/pacmd.c:72 ../src/utils/pactl.c:1568
+#: ../src/utils/pacmd.c:72 ../src/utils/pactl.c:1574
msgid "CARD PROFILE"
msgstr "PROFILO SCHEDA"
-#: ../src/utils/pacmd.c:73 ../src/utils/pactl.c:1570
+#: ../src/utils/pacmd.c:73 ../src/utils/pactl.c:1576
msgid "NAME|#N PORT"
msgstr "NOME|#N PORTA"
-#: ../src/utils/pacmd.c:74 ../src/utils/pactl.c:1576
+#: ../src/utils/pacmd.c:74 ../src/utils/pactl.c:1582
msgid "CARD-NAME|CARD-#N PORT OFFSET"
msgstr "NOME-SCHEDA|SCHEDA-#N PORTA OFFSET"
@@ -2262,8 +2247,8 @@ msgid "TARGET"
msgstr "OBIETTIVO"
#: ../src/utils/pacmd.c:76
-msgid "NUMERIC LEVEL"
-msgstr "LIVELLO NUMERICO"
+msgid "NUMERIC-LEVEL"
+msgstr "LIVELLO-NUMERICO"
#: ../src/utils/pacmd.c:79
msgid "FRAMES"
@@ -2583,6 +2568,11 @@ msgstr ""
msgid "\tProfiles:\n"
msgstr "\tProfili:\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 (sink: %u, sorgenti: %u, priorità: %u, disponibile: %s)\n"
+
#: ../src/utils/pactl.c:586
#, c-format
msgid "\tActive Profile: %s\n"
@@ -2632,7 +2622,7 @@ msgid ""
"\tProperties:\n"
"\t\t%s\n"
msgstr ""
-"Ingresso sink #%u\n"
+"Sink d'ingresso #%u\n"
"\tDriver: %s\n"
"\tModulo di appartenenza: %s\n"
"\tClient: %s\n"
@@ -2681,7 +2671,7 @@ msgid ""
"\tProperties:\n"
"\t\t%s\n"
msgstr ""
-"Sorgente output #%u\n"
+"Sorgente d'uscita #%u\n"
"\tDriver: %s\n"
"\tModulo di appartenenza: %s\n"
"\tClient: %s\n"
@@ -2828,25 +2818,22 @@ msgstr "Evento \"%s\" su %s #%u\n"
msgid "Got SIGINT, exiting."
msgstr "Ricevuto SIGINT, uscita."
-#: ../src/utils/pactl.c:1479
+#: ../src/utils/pactl.c:1485
msgid "Invalid volume specification"
msgstr "Specifica di volume non valida"
-#: ../src/utils/pactl.c:1502
+#: ../src/utils/pactl.c:1508
msgid "Volume outside permissible range.\n"
msgstr "Volume oltre l'intervallo permesso.\n"
-#: ../src/utils/pactl.c:1515
+#: ../src/utils/pactl.c:1521
msgid "Invalid number of volume specifications.\n"
msgstr "Numero di specifiche volume non valido.\n"
-#: ../src/utils/pactl.c:1527
+#: ../src/utils/pactl.c:1533
msgid "Inconsistent volume specification.\n"
msgstr "Specifica di volume non consistente.\n"
-#: ../src/utils/pactl.c:1557 ../src/utils/pactl.c:1558
-#: ../src/utils/pactl.c:1559 ../src/utils/pactl.c:1560
-#: ../src/utils/pactl.c:1561 ../src/utils/pactl.c:1562
#: ../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
@@ -2854,43 +2841,46 @@ msgstr "Specifica di volume non consistente.\n"
#: ../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: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 "[opzioni]"
-#: ../src/utils/pactl.c:1559
+#: ../src/utils/pactl.c:1565
msgid "[TYPE]"
msgstr "[TIPO]"
-#: ../src/utils/pactl.c:1561
+#: ../src/utils/pactl.c:1567
msgid "FILENAME [NAME]"
msgstr "NOMEFILE [NOME]"
-#: ../src/utils/pactl.c:1562
+#: ../src/utils/pactl.c:1568
msgid "NAME [SINK]"
msgstr "NOME [SINK]"
-#: ../src/utils/pactl.c:1571
+#: ../src/utils/pactl.c:1577
msgid "NAME|#N VOLUME [VOLUME ...]"
msgstr "NOME|#N VOLUME"
-#: ../src/utils/pactl.c:1572
+#: ../src/utils/pactl.c:1578
msgid "#N VOLUME [VOLUME ...]"
msgstr "Volume"
-#: ../src/utils/pactl.c:1573
+#: ../src/utils/pactl.c:1579
msgid "NAME|#N 1|0|toggle"
msgstr "NAME|#N 1|0|toggle"
-#: ../src/utils/pactl.c:1574
+#: ../src/utils/pactl.c:1580
msgid "#N 1|0|toggle"
msgstr "#N 1|0|toggle"
-#: ../src/utils/pactl.c:1575
+#: ../src/utils/pactl.c:1581
msgid "#N FORMATS"
msgstr "#N FORMATI"
-#: ../src/utils/pactl.c:1578
+#: ../src/utils/pactl.c:1584
#, c-format
msgid ""
"\n"
@@ -2902,7 +2892,7 @@ msgstr ""
"possono essere usati per specificare il sink, l'origine e il monitor "
"predefiniti.\n"
-#: ../src/utils/pactl.c:1581
+#: ../src/utils/pactl.c:1587
#, c-format
msgid ""
"\n"
@@ -2923,7 +2913,7 @@ msgstr ""
" -n, --client-name=NOME Il nome da dare a questo client sul "
"server\n"
-#: ../src/utils/pactl.c:1622
+#: ../src/utils/pactl.c:1628
#, c-format
msgid ""
"pactl %s\n"
@@ -2934,62 +2924,62 @@ msgstr ""
"Compilato con libpulse %s\n"
"Link eseguito con libpulse %s\n"
-#: ../src/utils/pactl.c:1678
+#: ../src/utils/pactl.c:1684
#, c-format
msgid "Specify nothing, or one of: %s"
msgstr "Specificare nulla o uno di: %s"
-#: ../src/utils/pactl.c:1688
+#: ../src/utils/pactl.c:1694
msgid "Please specify a sample file to load"
msgstr "Specificare un file campione da caricare"
-#: ../src/utils/pactl.c:1701
+#: ../src/utils/pactl.c:1707
msgid "Failed to open sound file."
msgstr "Apertura del file audio non riuscita."
-#: ../src/utils/pactl.c:1713
+#: ../src/utils/pactl.c:1719
msgid "Warning: Failed to determine sample specification from file."
msgstr ""
"Attenzione: determinazione della specifica di campionamento dal file non "
"riuscita."
-#: ../src/utils/pactl.c:1723
+#: ../src/utils/pactl.c:1729
msgid "You have to specify a sample name to play"
msgstr "È necessario specificare un nome di campione da riprodurre"
-#: ../src/utils/pactl.c:1735
+#: ../src/utils/pactl.c:1741
msgid "You have to specify a sample name to remove"
msgstr "È necessario specificare un nome di campione da rimuovere"
-#: ../src/utils/pactl.c:1744
+#: ../src/utils/pactl.c:1750
msgid "You have to specify a sink input index and a sink"
msgstr "È necessario specificare un indice di ingresso per sink e un sink"
-#: ../src/utils/pactl.c:1754
+#: ../src/utils/pactl.c:1760
msgid "You have to specify a source output index and a source"
msgstr ""
"È necessario specificare una indice di uscita per sorgente e una sorgente"
-#: ../src/utils/pactl.c:1769
+#: ../src/utils/pactl.c:1775
msgid "You have to specify a module name and arguments."
msgstr "È necessario specificare un nome di modulo e gli argomenti."
-#: ../src/utils/pactl.c:1789
+#: ../src/utils/pactl.c:1795
msgid "You have to specify a module index or name"
msgstr "È necessario specificare l'indice di un modulo o un nome"
-#: ../src/utils/pactl.c:1802
+#: ../src/utils/pactl.c:1808
msgid ""
"You may not specify more than one sink. You have to specify a boolean value."
msgstr ""
"Non è possibile specificare più di un sink. È necessario specificare un "
"valore booleano."
-#: ../src/utils/pactl.c:1807 ../src/utils/pactl.c:1827
+#: ../src/utils/pactl.c:1813 ../src/utils/pactl.c:1833
msgid "Invalid suspend specification."
msgstr "Specifica di sospensione non valida."
-#: ../src/utils/pactl.c:1822
+#: ../src/utils/pactl.c:1828
msgid ""
"You may not specify more than one source. You have to specify a boolean "
"value."
@@ -2997,84 +2987,95 @@ msgstr ""
"Non è possibile specificare più di una sorgente. È necessario specificare un "
"valore booleano."
-#: ../src/utils/pactl.c:1839
+#: ../src/utils/pactl.c:1845
msgid "You have to specify a card name/index and a profile name"
msgstr ""
"È necessario specificare un nome/indice di scheda e un nome di profilo."
-#: ../src/utils/pactl.c:1850
+#: ../src/utils/pactl.c:1856
msgid "You have to specify a sink name/index and a port name"
msgstr "È necessario specificare un nome/indice di sink e un nome di porta"
-#: ../src/utils/pactl.c:1861
+#: ../src/utils/pactl.c:1867
msgid "You have to specify a sink name"
msgstr "È necessario specificare un nome di sink"
-#: ../src/utils/pactl.c:1871
+#: ../src/utils/pactl.c:1877
msgid "You have to specify a source name/index and a port name"
msgstr "È necessario specificare un nome/indice di sorgente e un nome di porta"
-#: ../src/utils/pactl.c:1882
+#: ../src/utils/pactl.c:1888
msgid "You have to specify a source name"
msgstr "È necessario specificare il nome di una sorgente"
-#: ../src/utils/pactl.c:1892
+#: ../src/utils/pactl.c:1898
msgid "You have to specify a sink name/index and a volume"
msgstr "È necessario specificare un nome/indice di sink e un nome di porta"
-#: ../src/utils/pactl.c:1905
+#: ../src/utils/pactl.c:1911
msgid "You have to specify a source name/index and a volume"
msgstr "È necessario specificare un nome/indice di sorgente e un nome di porta"
-#: ../src/utils/pactl.c:1918
+#: ../src/utils/pactl.c:1924
msgid "You have to specify a sink input index and a volume"
msgstr "È necessario specificare un indice di ingresso per sink e un sink"
-#: ../src/utils/pactl.c:1923
+#: ../src/utils/pactl.c:1929
msgid "Invalid sink input index"
msgstr "Indice dell'input del sink non valido"
-#: ../src/utils/pactl.c:1934
+#: ../src/utils/pactl.c:1940
msgid "You have to specify a source output index and a volume"
msgstr ""
"È necessario specificare un indice di uscita per la sorgente e il volume"
-#: ../src/utils/pactl.c:1939
+#: ../src/utils/pactl.c:1945
msgid "Invalid source output index"
msgstr "Indice di uscita per la sorgente non valido"
-#: ../src/utils/pactl.c:1950
-msgid "You have to specify a sink name/index and a mute boolean"
-msgstr "È necessario specificare un nome/indice di sink e un nome di porta"
+#: ../src/utils/pactl.c:1956
+msgid ""
+"You have to specify a sink name/index and a mute action (0, 1, or 'toggle')"
+msgstr ""
+"È necessario specificare un nome/indice di sink e un'azione per il muto (0, "
+"1 o \"toggle\")"
-#: ../src/utils/pactl.c:1955 ../src/utils/pactl.c:1970
-#: ../src/utils/pactl.c:1990 ../src/utils/pactl.c:2008
+#: ../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 "Specifica per il muto non valida"
-#: ../src/utils/pactl.c:1965
-msgid "You have to specify a source name/index and a mute boolean"
-msgstr "È necessario specificare un nome/indice di sorgente e un nome di porta"
+#: ../src/utils/pactl.c:1971
+msgid ""
+"You have to specify a source name/index and a mute action (0, 1, or 'toggle')"
+msgstr ""
+"È necessario specificare un nome/indice di sorgente e un'azione per il muto "
+"(0, 1 o \"toggle\")"
-#: ../src/utils/pactl.c:1980
-msgid "You have to specify a sink input index and a mute boolean"
-msgstr "È necessario specificare un indice di ingresso per sink e un sink"
+#: ../src/utils/pactl.c:1986
+msgid ""
+"You have to specify a sink input index and a mute action (0, 1, or 'toggle')"
+msgstr ""
+"È necessario specificare un indice d'ingresso per il sink e un'azione per il "
+"muto (0, 1 o \"toggle\")"
-#: ../src/utils/pactl.c:1985
+#: ../src/utils/pactl.c:1991
msgid "Invalid sink input index specification"
msgstr "Specifica dell'indice di input del sink non valida"
-#: ../src/utils/pactl.c:1998
-msgid "You have to specify a source output index and a mute boolean"
+#: ../src/utils/pactl.c:2004
+msgid ""
+"You have to specify a source output index and a mute action (0, 1, or "
+"'toggle')"
msgstr ""
-"È necessario specificare un indice di uscita per la sorgente e un booleano "
-"per il muto"
+"È necessario specificare un indice di uscita per il sink e un'azione per il "
+"muto (0, 1 o \"toggle\")"
-#: ../src/utils/pactl.c:2003
+#: ../src/utils/pactl.c:2009
msgid "Invalid source output index specification"
msgstr "Specifica di indice di uscita per la sorgente non valida"
-#: ../src/utils/pactl.c:2020
+#: ../src/utils/pactl.c:2026
msgid ""
"You have to specify a sink index and a semicolon-separated list of supported "
"formats"
@@ -3082,17 +3083,17 @@ msgstr ""
"È necessario specificare un indice di sink e un elenco separato da punti e "
"virgola di formati supportati"
-#: ../src/utils/pactl.c:2032
+#: ../src/utils/pactl.c:2038
msgid "You have to specify a card name/index, a port name and a latency offset"
msgstr ""
"È necessario specificare un nome o un indice per la scheda, un nome per la "
"porta e un offset di latenza"
-#: ../src/utils/pactl.c:2039
+#: ../src/utils/pactl.c:2045
msgid "Could not parse latency offset"
msgstr "Impossibile analizzare l'offset della latenza"
-#: ../src/utils/pactl.c:2051
+#: ../src/utils/pactl.c:2057
msgid "No valid command specified."
msgstr "Nessun comando valido specificato."
@@ -3252,3 +3253,72 @@ msgstr "Caricamento dei dati cookie non riuscito\n"
#, c-format
msgid "Not yet implemented.\n"
msgstr "Non ancora implementato.\n"
+
+#~ 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 [OPZIONI]\n"
+#~ "\n"
+#~ "-h, --help Visualizza questo aiuto\n"
+#~ "-v, --verbose Stampa messaggi di debug\n"
+#~ " --from-rate=FREQUENZACAMPIONAMENTO Frequenza di campionamento "
+#~ "sorgente\n"
+#~ " in Hz (predefinito 44100)\n"
+#~ " --from-format=FORMATOCAMPIONE Tipo di campione sorgente\n"
+#~ " (predefinito s16le)\n"
+#~ " --from-channels=CANALI Numero di canali sorgente\n"
+#~ " (predefinito 1)\n"
+#~ " --to-rate=FREQUENZACAMPIONAMENTO Frequenza di campionamento di\n"
+#~ " destinazione in Hz (predefinito "
+#~ "44100)\n"
+#~ " --to-format=FORMATOCAMPIONE Tipo di campione di "
+#~ "destinazione\n"
+#~ " (predefinito s16le)\n"
+#~ " --to-channels=CANALI Numero di canali di "
+#~ "destinazione\n"
+#~ " (predefinito 1)\n"
+#~ " --resample-method=METODO Metodo di ricampionamento\n"
+#~ " (predefinito auto)\n"
+#~ " --seconds=SECONDI Durata dello stream sorgente\n"
+#~ " (predefinito 60)\n"
+#~ "\n"
+#~ "Se i formati non vengono specificati, il test prova tutte le combinazioni "
+#~ "di\n"
+#~ "formati, ricorsivamente\n"
+#~ "\n"
+#~ "Il tipo di campione deve essere scelto tra: s16le, s16be, u8, float32le,\n"
+#~ "float32be, ulaw, alaw, s24le, s24be, s24-32le, s24-32be, s32le, s32be\n"
+#~ "(predefinito s16ne).\n"
+#~ "\n"
+#~ "Consultare --dump-resample-methods per i valori ammessi per i metodi di\n"
+#~ "ricampionamento.\n"
+
+#~ msgid "%s %s\n"
+#~ msgstr "%s %s\n"
diff --git a/po/tr.po b/po/tr.po
index 7d79452..da121d5 100644
--- a/po/tr.po
+++ b/po/tr.po
@@ -3,23 +3,23 @@
# This file is distributed under the same license as the PulseAudio package.
# Necdet Yücel <necdetyucel at gmail.com>, 2014.
# Kaan Özdinçer <kaanozdincer at gmail.com>, 2014.
-# Muhammet Kara <muhammetk at gmail.com>, 2015.
+# Muhammet Kara <muhammetk at gmail.com>, 2015, 2016.
#
msgid ""
msgstr ""
"Project-Id-Version: PulseAudio master\n"
"Report-Msgid-Bugs-To: https://bugs.freedesktop.org/enter_bug.cgi?"
"product=PulseAudio&keywords=I18N+L10N&component=misc\n"
-"POT-Creation-Date: 2015-02-21 23:55+0000\n"
-"PO-Revision-Date: 2015-02-22 13:13+0200\n"
+"POT-Creation-Date: 2016-03-11 02:23+0000\n"
+"PO-Revision-Date: 2016-04-17 01:04+0300\n"
"Last-Translator: Muhammet Kara <muhammetk at gmail.com>\n"
-"Language-Team: Turkish <gnome-turk at gnome.org>\n"
+"Language-Team: Türkçe <gnome-turk at gnome.org>\n"
"Language: tr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Gtranslator 2.91.6\n"
+"X-Generator: Gtranslator 2.91.7\n"
#: ../src/daemon/cmdline.c:111
#, c-format
@@ -247,72 +247,72 @@ msgstr "--no-cpu-limit boolean değişken bekler"
msgid "--disable-shm expects boolean argument"
msgstr "--disable-shm boolean değişken bekler"
-#: ../src/daemon/daemon-conf.c:258
+#: ../src/daemon/daemon-conf.c:259
#, c-format
msgid "[%s:%u] Invalid log target '%s'."
msgstr "[%s:%u] Geçersiz log hedefi '%s'."
-#: ../src/daemon/daemon-conf.c:273
+#: ../src/daemon/daemon-conf.c:274
#, c-format
msgid "[%s:%u] Invalid log level '%s'."
msgstr "[%s:%u] Geçersiz log seviyesi '%s'."
-#: ../src/daemon/daemon-conf.c:288
+#: ../src/daemon/daemon-conf.c:289
#, c-format
msgid "[%s:%u] Invalid resample method '%s'."
msgstr "[%s:%u] Geçersiz yeniden örneklendirme yöntemi '%s'."
-#: ../src/daemon/daemon-conf.c:310
+#: ../src/daemon/daemon-conf.c:311
#, c-format
msgid "[%s:%u] Invalid rlimit '%s'."
msgstr "[%s:%u] Geçersiz rlimit '%s'."
-#: ../src/daemon/daemon-conf.c:330
+#: ../src/daemon/daemon-conf.c:331
#, c-format
msgid "[%s:%u] Invalid sample format '%s'."
msgstr "[%s:%u] Geçersiz örnekleme biçimi '%s'."
-#: ../src/daemon/daemon-conf.c:347 ../src/daemon/daemon-conf.c:364
+#: ../src/daemon/daemon-conf.c:348 ../src/daemon/daemon-conf.c:365
#, c-format
msgid "[%s:%u] Invalid sample rate '%s'."
msgstr "[%s:%u] Geçersiz örnekleme oranı '%s'."
-#: ../src/daemon/daemon-conf.c:387
+#: ../src/daemon/daemon-conf.c:388
#, c-format
msgid "[%s:%u] Invalid sample channels '%s'."
msgstr "[%s:%u] Geçersiz örnekleme kanalları '%s'."
-#: ../src/daemon/daemon-conf.c:404
+#: ../src/daemon/daemon-conf.c:405
#, c-format
msgid "[%s:%u] Invalid channel map '%s'."
msgstr "[%s:%u] Geçersiz kanal adresleme '%s'."
-#: ../src/daemon/daemon-conf.c:421
+#: ../src/daemon/daemon-conf.c:422
#, c-format
msgid "[%s:%u] Invalid number of fragments '%s'."
msgstr "[%s:%u] Geçersiz bölümlenme sayısı '%s'."
-#: ../src/daemon/daemon-conf.c:438
+#: ../src/daemon/daemon-conf.c:439
#, c-format
msgid "[%s:%u] Invalid fragment size '%s'."
msgstr "[%s:%u] Geçersiz bölümlenme boyutu '%s'."
-#: ../src/daemon/daemon-conf.c:455
+#: ../src/daemon/daemon-conf.c:456
#, c-format
msgid "[%s:%u] Invalid nice level '%s'."
msgstr "[%s:%u] Geçersiz nice seviyesi '%s'."
-#: ../src/daemon/daemon-conf.c:498
+#: ../src/daemon/daemon-conf.c:499
#, c-format
msgid "[%s:%u] Invalid server type '%s'."
msgstr "[%s:%u] Geçersiz sunucu türü '%s'."
-#: ../src/daemon/daemon-conf.c:611
+#: ../src/daemon/daemon-conf.c:613
#, c-format
msgid "Failed to open configuration file: %s"
msgstr "Yapılandırma dosyası açılamadı: %s"
-#: ../src/daemon/daemon-conf.c:627
+#: ../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."
@@ -320,7 +320,7 @@ msgstr ""
"Belirtilen öntanımlı kanal adresleme belirtilmiş öntanımlı kanal sayısından "
"farklı sayıda kanala sahiptir."
-#: ../src/daemon/daemon-conf.c:714
+#: ../src/daemon/daemon-conf.c:716
#, c-format
msgid "### Read from configuration file: %s ###\n"
msgstr "### Yapılandırma dosyasından oku: %s ###\n"
@@ -480,23 +480,27 @@ msgstr ""
"%s. "
#: ../src/daemon/main.c:712
-msgid "Running in system mode, but --disallow-exit not set!"
-msgstr "Sistem kipinde çalıştırılıyor fakat --disallow-exit ayarlı değil!"
+#| msgid "Running in system mode, but --disallow-exit not set!"
+msgid "Running in system mode, but --disallow-exit not set."
+msgstr "Sistem kipinde çalıştırılıyor fakat --disallow-exit ayarlı değil."
#: ../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 ""
-"Sistem kipinde çalıştırılıyor fakat --disallow-module-loading ayarlı değil!"
+"Sistem kipinde çalıştırılıyor fakat --disallow-module-loading ayarlı değil."
#: ../src/daemon/main.c:718
-msgid "Running in system mode, forcibly disabling SHM mode!"
-msgstr "Sistem kipinde çalıştırılıyor, SHM kipi zorla devre dışı bırakılıyor!"
+#| msgid "Running in system mode, forcibly disabling SHM mode!"
+msgid "Running in system mode, forcibly disabling SHM mode."
+msgstr "Sistem kipinde çalıştırılıyor, SHM kipi zorla devre dışı bırakılıyor."
#: ../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 ""
"Sistem kipinde çalıştırılıyor, boşta kalma süresi çıkışı zorla devre dışı "
-"bırakılıyor!"
+"bırakılıyor."
#: ../src/daemon/main.c:756
msgid "Failed to acquire stdio."
@@ -531,13 +535,6 @@ msgid "Failed to get machine ID"
msgstr "Makine kimliği alınamadı"
#: ../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://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an "
-#| "explanation why system mode is usually a bad idea."
msgid ""
"OK, so you are running PA in system mode. Please note that you most likely "
"shouldn't be doing that.\n"
@@ -563,11 +560,11 @@ msgstr "pa_pid_file_create() başarısız oldu."
msgid "pa_core_new() failed."
msgstr "pa_core_new() başarısız oldu."
-#: ../src/daemon/main.c:1088
+#: ../src/daemon/main.c:1089
msgid "Failed to initialize daemon."
msgstr "Artalan işlem başlatılamadı."
-#: ../src/daemon/main.c:1093
+#: ../src/daemon/main.c:1094
msgid "Daemon startup without any loaded modules, refusing to work."
msgstr "Hiç yüklü modül olmadan artalan işlemlerin çalışması reddediliyor."
@@ -579,260 +576,305 @@ msgstr "PulseAudio Ses Sistemi"
msgid "Start the PulseAudio Sound System"
msgstr "PulseAudio Ses Sistemini Başlat"
-#: ../src/modules/alsa/alsa-mixer.c:2291
+#: ../src/modules/alsa/alsa-mixer.c:2378
msgid "Input"
msgstr "Giriş"
-#: ../src/modules/alsa/alsa-mixer.c:2292
+#: ../src/modules/alsa/alsa-mixer.c:2379
msgid "Docking Station Input"
msgstr "Yerleştirme İstasyonu Girişi"
-#: ../src/modules/alsa/alsa-mixer.c:2293
+#: ../src/modules/alsa/alsa-mixer.c:2380
msgid "Docking Station Microphone"
msgstr "Yerleştirme İstasyonu Mikrofonu"
-#: ../src/modules/alsa/alsa-mixer.c:2294
+#: ../src/modules/alsa/alsa-mixer.c:2381
msgid "Docking Station Line In"
msgstr "Yerleştirme İstasyonu Hat Girişi"
-#: ../src/modules/alsa/alsa-mixer.c:2295 ../src/modules/alsa/alsa-mixer.c:2380
+#: ../src/modules/alsa/alsa-mixer.c:2382 ../src/modules/alsa/alsa-mixer.c:2467
msgid "Line In"
msgstr "Hat girişi"
-#: ../src/modules/alsa/alsa-mixer.c:2296 ../src/modules/alsa/alsa-mixer.c:2374
-#: ../src/modules/bluetooth/module-bluez4-device.c:2102
+#: ../src/modules/alsa/alsa-mixer.c:2383 ../src/modules/alsa/alsa-mixer.c:2461
+#: ../src/modules/bluetooth/module-bluez4-device.c:2099
#: ../src/modules/bluetooth/module-bluez5-device.c:1710
msgid "Microphone"
msgstr "Mikrofon"
-#: ../src/modules/alsa/alsa-mixer.c:2297 ../src/modules/alsa/alsa-mixer.c:2375
+#: ../src/modules/alsa/alsa-mixer.c:2384 ../src/modules/alsa/alsa-mixer.c:2462
msgid "Front Microphone"
msgstr "Ön Mikrofon"
-#: ../src/modules/alsa/alsa-mixer.c:2298 ../src/modules/alsa/alsa-mixer.c:2376
+#: ../src/modules/alsa/alsa-mixer.c:2385 ../src/modules/alsa/alsa-mixer.c:2463
msgid "Rear Microphone"
msgstr "Arka Mikrofon"
-#: ../src/modules/alsa/alsa-mixer.c:2299
+#: ../src/modules/alsa/alsa-mixer.c:2386
msgid "External Microphone"
msgstr "Harici Mikrofon"
-#: ../src/modules/alsa/alsa-mixer.c:2300 ../src/modules/alsa/alsa-mixer.c:2378
+#: ../src/modules/alsa/alsa-mixer.c:2387 ../src/modules/alsa/alsa-mixer.c:2465
msgid "Internal Microphone"
msgstr "Dahili Mikrofon"
-#: ../src/modules/alsa/alsa-mixer.c:2301 ../src/modules/alsa/alsa-mixer.c:2381
+#: ../src/modules/alsa/alsa-mixer.c:2388 ../src/modules/alsa/alsa-mixer.c:2468
msgid "Radio"
msgstr "Radyo"
-#: ../src/modules/alsa/alsa-mixer.c:2302 ../src/modules/alsa/alsa-mixer.c:2382
+#: ../src/modules/alsa/alsa-mixer.c:2389 ../src/modules/alsa/alsa-mixer.c:2469
msgid "Video"
msgstr "Görüntü"
-#: ../src/modules/alsa/alsa-mixer.c:2303
+#: ../src/modules/alsa/alsa-mixer.c:2390
msgid "Automatic Gain Control"
msgstr "Otomatik Kazanç Kontrolü"
-#: ../src/modules/alsa/alsa-mixer.c:2304
+#: ../src/modules/alsa/alsa-mixer.c:2391
msgid "No Automatic Gain Control"
msgstr "Otomatik Kazanç Kontrolü Yok"
-#: ../src/modules/alsa/alsa-mixer.c:2305
+#: ../src/modules/alsa/alsa-mixer.c:2392
msgid "Boost"
msgstr "Artır"
-#: ../src/modules/alsa/alsa-mixer.c:2306
+#: ../src/modules/alsa/alsa-mixer.c:2393
msgid "No Boost"
msgstr "Artırma Yok"
-#: ../src/modules/alsa/alsa-mixer.c:2307
+#: ../src/modules/alsa/alsa-mixer.c:2394
msgid "Amplifier"
msgstr "Yükseltici"
-#: ../src/modules/alsa/alsa-mixer.c:2308
+#: ../src/modules/alsa/alsa-mixer.c:2395
msgid "No Amplifier"
msgstr "Anfi Yok"
-#: ../src/modules/alsa/alsa-mixer.c:2309
+#: ../src/modules/alsa/alsa-mixer.c:2396
msgid "Bass Boost"
msgstr "Bas Artır"
-#: ../src/modules/alsa/alsa-mixer.c:2310
+#: ../src/modules/alsa/alsa-mixer.c:2397
msgid "No Bass Boost"
msgstr "Bas Artırma"
-#: ../src/modules/alsa/alsa-mixer.c:2311
-#: ../src/modules/bluetooth/module-bluez4-device.c:2107
+#: ../src/modules/alsa/alsa-mixer.c:2398
+#: ../src/modules/bluetooth/module-bluez4-device.c:2104
#: ../src/modules/bluetooth/module-bluez5-device.c:1717
msgid "Speaker"
msgstr "Hoparlör"
-#: ../src/modules/alsa/alsa-mixer.c:2312 ../src/modules/alsa/alsa-mixer.c:2384
+#: ../src/modules/alsa/alsa-mixer.c:2399 ../src/modules/alsa/alsa-mixer.c:2471
msgid "Headphones"
msgstr "Kulaklıklar"
-#: ../src/modules/alsa/alsa-mixer.c:2373
+#: ../src/modules/alsa/alsa-mixer.c:2460
msgid "Analog Input"
msgstr "Analog Giriş"
-#: ../src/modules/alsa/alsa-mixer.c:2377
+#: ../src/modules/alsa/alsa-mixer.c:2464
msgid "Dock Microphone"
msgstr "Yapışık Mikrofon"
-#: ../src/modules/alsa/alsa-mixer.c:2379
+#: ../src/modules/alsa/alsa-mixer.c:2466
msgid "Headset Microphone"
msgstr "Mikrofonlu Kulaklık"
-#: ../src/modules/alsa/alsa-mixer.c:2383
+#: ../src/modules/alsa/alsa-mixer.c:2470
msgid "Analog Output"
msgstr "Analog Çıkış"
-#: ../src/modules/alsa/alsa-mixer.c:2385
+#: ../src/modules/alsa/alsa-mixer.c:2472
msgid "LFE on Separate Mono Output"
msgstr "Ayrı Tekli Çıktılar üzerinde LFE"
-#: ../src/modules/alsa/alsa-mixer.c:2386
+#: ../src/modules/alsa/alsa-mixer.c:2473
msgid "Line Out"
msgstr "Hat Çıkışı"
-#: ../src/modules/alsa/alsa-mixer.c:2387
+#: ../src/modules/alsa/alsa-mixer.c:2474
msgid "Analog Mono Output"
msgstr "Analog Tekli Çıkış"
-#: ../src/modules/alsa/alsa-mixer.c:2388
+#: ../src/modules/alsa/alsa-mixer.c:2475
msgid "Speakers"
msgstr "Hoparlörler"
-#: ../src/modules/alsa/alsa-mixer.c:2389
+#: ../src/modules/alsa/alsa-mixer.c:2476
msgid "HDMI / DisplayPort"
msgstr "HDMI / ÇıkışıNoktası"
-#: ../src/modules/alsa/alsa-mixer.c:2390
+#: ../src/modules/alsa/alsa-mixer.c:2477
msgid "Digital Output (S/PDIF)"
msgstr "Dijital Çıkış (S/PDIF)"
-#: ../src/modules/alsa/alsa-mixer.c:2391
+#: ../src/modules/alsa/alsa-mixer.c:2478
msgid "Digital Input (S/PDIF)"
msgstr "Dijital Giriş (S/PDIF)"
-#: ../src/modules/alsa/alsa-mixer.c:2392
+#: ../src/modules/alsa/alsa-mixer.c:2479
msgid "Digital Passthrough (S/PDIF)"
msgstr "Sayısal Düzgeçiş (S/PDIF)"
-#: ../src/modules/alsa/alsa-mixer.c:3898
+#: ../src/modules/alsa/alsa-mixer.c:2480
+#| msgid "Multichannel"
+msgid "Multichannel Input"
+msgstr "Çok Kanallı Girdi"
+
+#: ../src/modules/alsa/alsa-mixer.c:2481
+#| msgid "Multichannel"
+msgid "Multichannel Output"
+msgstr "Çok Kanallı Çıktı"
+
+#: ../src/modules/alsa/alsa-mixer.c:3990
msgid "Analog Mono"
msgstr "Analog Mono"
-#: ../src/modules/alsa/alsa-mixer.c:3899
+#. 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:3991 ../src/modules/alsa/alsa-mixer.c:3997
+#: ../src/modules/alsa/alsa-mixer.c:3998
msgid "Analog Stereo"
msgstr "Analog Stereo"
-#: ../src/modules/alsa/alsa-mixer.c:3900
+#: ../src/modules/alsa/alsa-mixer.c:3999 ../src/modules/alsa/alsa-mixer.c:4000
msgid "Multichannel"
msgstr "Çok kanallı"
-#: ../src/modules/alsa/alsa-mixer.c:3901
+#: ../src/modules/alsa/alsa-mixer.c:4001
msgid "Analog Surround 2.1"
msgstr "Analog Çevresel Ses 2.1"
-#: ../src/modules/alsa/alsa-mixer.c:3902
+#: ../src/modules/alsa/alsa-mixer.c:4002
msgid "Analog Surround 3.0"
msgstr "Analog Çevresel Ses 3.0"
-#: ../src/modules/alsa/alsa-mixer.c:3903
+#: ../src/modules/alsa/alsa-mixer.c:4003
msgid "Analog Surround 3.1"
msgstr "Analog Çevresel Ses 3.1"
-#: ../src/modules/alsa/alsa-mixer.c:3904
+#: ../src/modules/alsa/alsa-mixer.c:4004
msgid "Analog Surround 4.0"
msgstr "Analog Çevresel Ses 4.0"
-#: ../src/modules/alsa/alsa-mixer.c:3905
+#: ../src/modules/alsa/alsa-mixer.c:4005
msgid "Analog Surround 4.1"
msgstr "Analog Çevresel Ses 4.1"
-#: ../src/modules/alsa/alsa-mixer.c:3906
+#: ../src/modules/alsa/alsa-mixer.c:4006
msgid "Analog Surround 5.0"
msgstr "Analog Çevresel Ses 5.0"
-#: ../src/modules/alsa/alsa-mixer.c:3907
+#: ../src/modules/alsa/alsa-mixer.c:4007
msgid "Analog Surround 5.1"
msgstr "Analog Çevresel Ses 5.1"
-#: ../src/modules/alsa/alsa-mixer.c:3908
+#: ../src/modules/alsa/alsa-mixer.c:4008
msgid "Analog Surround 6.0"
msgstr "Analog Çevresel Ses 6.0"
-#: ../src/modules/alsa/alsa-mixer.c:3909
+#: ../src/modules/alsa/alsa-mixer.c:4009
msgid "Analog Surround 6.1"
msgstr "Analog Çevresel Ses 6.1"
-#: ../src/modules/alsa/alsa-mixer.c:3910
+#: ../src/modules/alsa/alsa-mixer.c:4010
msgid "Analog Surround 7.0"
msgstr "Analog Çevresel Ses 7.0"
-#: ../src/modules/alsa/alsa-mixer.c:3911
+#: ../src/modules/alsa/alsa-mixer.c:4011
msgid "Analog Surround 7.1"
msgstr "Analog Çevresel Ses 7.1"
-#: ../src/modules/alsa/alsa-mixer.c:3912
+#: ../src/modules/alsa/alsa-mixer.c:4012
msgid "Digital Stereo (IEC958)"
msgstr "Dijital İki Kanallı (IEC958)"
-#: ../src/modules/alsa/alsa-mixer.c:3913
+#: ../src/modules/alsa/alsa-mixer.c:4013
msgid "Digital Passthrough (IEC958)"
msgstr "Sayısal Düzgeçiş (IEC958)"
-#: ../src/modules/alsa/alsa-mixer.c:3914
+#: ../src/modules/alsa/alsa-mixer.c:4014
msgid "Digital Surround 4.0 (IEC958/AC3)"
msgstr "Dijital Çevresel Ses 4.0 (IEC958/AC3)"
-#: ../src/modules/alsa/alsa-mixer.c:3915
+#: ../src/modules/alsa/alsa-mixer.c:4015
msgid "Digital Surround 5.1 (IEC958/AC3)"
msgstr "Dijital Çevresel Ses 5.1 (IEC958/AC3)"
-#: ../src/modules/alsa/alsa-mixer.c:3916
+#: ../src/modules/alsa/alsa-mixer.c:4016
msgid "Digital Surround 5.1 (IEC958/DTS)"
msgstr "Dijital Çevresel Ses 5.1 (IEC958/DTS)"
-#: ../src/modules/alsa/alsa-mixer.c:3917
+#: ../src/modules/alsa/alsa-mixer.c:4017
msgid "Digital Stereo (HDMI)"
msgstr "Dijital İki Kanallı (HDMI)"
-#: ../src/modules/alsa/alsa-mixer.c:3918
+#: ../src/modules/alsa/alsa-mixer.c:4018
msgid "Digital Surround 5.1 (HDMI)"
msgstr "Dijital Çevresel Ses 5.1 (HDMI)"
-#: ../src/modules/alsa/alsa-mixer.c:4049
+#: ../src/modules/alsa/alsa-mixer.c:4151
msgid "Analog Mono Duplex"
msgstr "Analog Tekli İkili"
-#: ../src/modules/alsa/alsa-mixer.c:4050
+#: ../src/modules/alsa/alsa-mixer.c:4152
msgid "Analog Stereo Duplex"
msgstr "Analog İkili Stereo"
-#: ../src/modules/alsa/alsa-mixer.c:4051
+#: ../src/modules/alsa/alsa-mixer.c:4153
msgid "Digital Stereo Duplex (IEC958)"
msgstr "Sayısal İkili Stereo (IEC958)"
-#: ../src/modules/alsa/alsa-mixer.c:4052
-#: ../src/modules/alsa/module-alsa-card.c:190
-#: ../src/modules/bluetooth/module-bluez4-device.c:2298
+#: ../src/modules/alsa/alsa-mixer.c:4154
+#| msgid "Multichannel"
+msgid "Multichannel Duplex"
+msgstr "Çok Kanallı Duplex"
+
+#: ../src/modules/alsa/alsa-mixer.c:4155
+#: ../src/modules/alsa/module-alsa-card.c:186
+#: ../src/modules/bluetooth/module-bluez4-device.c:2295
#: ../src/modules/bluetooth/module-bluez5-device.c:1941
msgid "Off"
msgstr "Kapalı"
-#: ../src/modules/alsa/alsa-mixer.c:4151
+#: ../src/modules/alsa/alsa-mixer.c:4254
#, c-format
msgid "%s Output"
msgstr "%s Çıkışı"
-#: ../src/modules/alsa/alsa-mixer.c:4159
+#: ../src/modules/alsa/alsa-mixer.c:4262
#, c-format
msgid "%s Input"
msgstr "%s Girişi"
-#: ../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 aygıta yeni veri yazmamız için bizi uyardı fakat aslında yazılacak "
+"hiçbir şey yoktu.\n"
+"Büyük ihtimalle bu ALSA '%s' sürücüsünde bir hatadır. Lütfen bu sorunu ALSA "
+"geliştiricilerine bildirin.\n"
+"Biz POLLOUT ayarı ile uyandırıldık -- bununla birlikte sonraki "
+"snd_pcm_avail() 0 ya da min_avail değerinden küçük başka bir değer döndü."
+
+#: ../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 "
@@ -846,10 +888,34 @@ msgstr ""
"hiçbir şey yok!\n"
"Büyük ihtimalle bu ALSA '%s' sürücüsünde bir hatadır. Lütfen bu sorunu ALSA "
"geliştiricilerine bildirin.\n"
-"Biz POLLOUT ayarı ile anladık -- ayrıca sonraki snd_pcm_avail() 0 ya da "
+"Biz POLLOUT ayarı ile anladık -- ayrıca sonraki bir snd_pcm_avail() 0 ya da "
"min_avail değerinden küçük başka bir değer döndü."
-#: ../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 aygıttan yeni veri okumamız için bizi uyardı fakat aslında okunacak "
+"hiçbir şey yok.\n"
+"Büyük ihtimalle bu bir ALSA '%s' sürücüsü hatasıdır. Lütfen bu sorunu ALSA "
+"geliştiricilerine bildirin.\n"
+"Biz POLLIN ayarı ile uyandırıldık -- bununla birlikte sonraki bir "
+"snd_pcm_avail() 0 ya da min_avail değerinden küçük başka bir değer döndü."
+
+#: ../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 "
@@ -866,7 +932,7 @@ msgstr ""
"Biz POLLIN ayarı ile anladık -- ayrıca sonraki snd_pcm_avail() 0 ya da "
"min_avail değerinden küçük başka bir değer döndü."
-#: ../src/modules/alsa/alsa-util.c:1149 ../src/modules/alsa/alsa-util.c:1224
+#: ../src/modules/alsa/alsa-util.c:1166 ../src/modules/alsa/alsa-util.c:1241
#, c-format
msgid ""
"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
@@ -878,7 +944,7 @@ msgstr ""
"Büyük ihtimalle bu bir ALSA sürücüsü '%s' hatasıdır. Lütfen bu sorunu ALSA "
"geliştiricilerine bildirin."
-#: ../src/modules/alsa/alsa-util.c:1199
+#: ../src/modules/alsa/alsa-util.c:1216
#, c-format
msgid ""
"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s"
@@ -890,7 +956,7 @@ msgstr ""
"Büyük ihtimalle bu bir ALSA sürücüsü '%s' hatasıdır. Lütfen bu sorunu ALSA "
"geliştiricilerine bildirin."
-#: ../src/modules/alsa/alsa-util.c:1240
+#: ../src/modules/alsa/alsa-util.c:1257
#, c-format
msgid ""
"snd_pcm_avail_delay() returned strange values: delay %lu is less than avail "
@@ -903,7 +969,7 @@ msgstr ""
"Büyük ihtimalle bu bir ALSA sürücüsü '%s' hatasıdır. Lütfen bu sorunu ALSA "
"geliştiricilerine bildirin."
-#: ../src/modules/alsa/alsa-util.c:1283
+#: ../src/modules/alsa/alsa-util.c:1300
#, c-format
msgid ""
"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
@@ -915,49 +981,49 @@ msgstr ""
"Büyük ihtimalle bu bir ALSA sürücüsü '%s' hatasıdır. Lütfen bu sorunu ALSA "
"geliştiricilerine bildirin."
-#: ../src/modules/bluetooth/module-bluez4-device.c:2092
+#: ../src/modules/bluetooth/module-bluez4-device.c:2089
#: ../src/modules/bluetooth/module-bluez5-device.c:1700
msgid "Headset"
msgstr "Kulaklık"
-#: ../src/modules/bluetooth/module-bluez4-device.c:2097
+#: ../src/modules/bluetooth/module-bluez4-device.c:2094
#: ../src/modules/bluetooth/module-bluez5-device.c:1705
msgid "Handsfree"
msgstr "Ahizesiz"
-#: ../src/modules/bluetooth/module-bluez4-device.c:2112
+#: ../src/modules/bluetooth/module-bluez4-device.c:2109
#: ../src/modules/bluetooth/module-bluez5-device.c:1723
msgid "Headphone"
msgstr "Kulaklık"
-#: ../src/modules/bluetooth/module-bluez4-device.c:2117
+#: ../src/modules/bluetooth/module-bluez4-device.c:2114
#: ../src/modules/bluetooth/module-bluez5-device.c:1728
msgid "Portable"
msgstr "Taşınabilir"
-#: ../src/modules/bluetooth/module-bluez4-device.c:2122
+#: ../src/modules/bluetooth/module-bluez4-device.c:2119
#: ../src/modules/bluetooth/module-bluez5-device.c:1733
msgid "Car"
msgstr "Araba"
-#: ../src/modules/bluetooth/module-bluez4-device.c:2127
+#: ../src/modules/bluetooth/module-bluez4-device.c:2124
#: ../src/modules/bluetooth/module-bluez5-device.c:1738
msgid "HiFi"
msgstr "Yüksek duyarlılık"
-#: ../src/modules/bluetooth/module-bluez4-device.c:2132
+#: ../src/modules/bluetooth/module-bluez4-device.c:2129
#: ../src/modules/bluetooth/module-bluez5-device.c:1743
msgid "Phone"
msgstr "Telefon"
-#: ../src/modules/bluetooth/module-bluez4-device.c:2140
+#: ../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 "Bluetooth Çıkışı"
-#: ../src/modules/bluetooth/module-bluez4-device.c:2143
+#: ../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
@@ -965,19 +1031,19 @@ msgstr "Bluetooth Çıkışı"
msgid "Bluetooth Input"
msgstr "Bluetooth Girişi"
-#: ../src/modules/bluetooth/module-bluez4-device.c:2179
+#: ../src/modules/bluetooth/module-bluez4-device.c:2176
msgid "High Fidelity Playback (A2DP)"
msgstr "Yüksek Kaliteli Çalma (A2DP)"
-#: ../src/modules/bluetooth/module-bluez4-device.c:2190
+#: ../src/modules/bluetooth/module-bluez4-device.c:2187
msgid "High Fidelity Capture (A2DP)"
msgstr "Yüksek Kaliteli Yakalama (A2DP)"
-#: ../src/modules/bluetooth/module-bluez4-device.c:2201
+#: ../src/modules/bluetooth/module-bluez4-device.c:2198
msgid "Telephony Duplex (HSP/HFP)"
msgstr "Çift yönlü Telefon (HSP/HFP)"
-#: ../src/modules/bluetooth/module-bluez4-device.c:2213
+#: ../src/modules/bluetooth/module-bluez4-device.c:2210
msgid "Handsfree Gateway"
msgstr "Eller Serbest Geçidi"
@@ -998,6 +1064,17 @@ msgid "Headset Audio Gateway (HSP/HFP)"
msgstr "Kulanlık Ses Geçidi (HSP/HFP)"
#: ../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> "
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 "
@@ -1007,21 +1084,22 @@ msgid ""
"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 ""
-"kaynak_adı=<name for the source> kaynak_özellikleri=<properties for the "
-"source> ana_kaynak=<name of source to filter> alıcı_ad=<name for the sink> "
-"alıcı_özellikleri=<properties for the sink> ana_alıcı=<name of sink to "
-"filter> zamanı_ayarla=<how often to readjust rates in s> "
-"eşikdeğer_ayarla=<how much drift to readjust after in ms> biçim=<sample "
-"format> hız=<sample rate> kanallar=<number of channels> "
-"kanal_adresleme=<channel map> aec_yöntemi=<implementation to use> "
-"aec_değişkenleri=<parameters for the AEC engine> aec_kaydet=<save AEC data "
-"in /tmp> otomatikyüklenmiş=<set if this module is being loaded "
-"automatically>ses_paylaşım_kullan=<yes or no> "
+"loaded automatically> use_volume_sharing=<yes or no> use_master_format=<yes "
+"or no> "
+msgstr ""
+"source_name=<kaynak adı> source_properties=<kaynak özellikleri> "
+"source_master=<süzülecek kaynağın adı> sink_name=<alıcı adı> "
+"sink_properties=<alıcı özellikleri> sink_master=<süzülecek alıcının adı> "
+"adjust_time=<hızların kaç saniyede bir yeniden ayarlanacağı> "
+"adjust_threshold=<kaç ms sonra kaymanın yeniden ayarlanacağı> format=<örnek "
+"biçimi> rate=<örnek hızı> channels=<kaynak sayısı> channel_map=<kaynak "
+"eşlem> aec_method=<kullanılacak uygulanış> aec_args=<AEC motorunun "
+"parametreleri> save_aec=<AEC verilerini /tmp içine kaydet> autoloaded=<bu "
+"modülün otomatik olarak yüklenip yüklenmeyeceğini belirle> "
+"use_volume_sharing=<yes ya da no> use_master_format=<yes ya da no> "
#. add on profile
-#: ../src/modules/macosx/module-coreaudio-device.c:754
+#: ../src/modules/macosx/module-coreaudio-device.c:811
msgid "On"
msgstr "Açık"
@@ -1029,7 +1107,7 @@ msgstr "Açık"
msgid "Always keeps at least one sink loaded even if it's a null one"
msgstr "Yüklenen alıcı boş bile olsa her zaman en az bir tanesini korur"
-#: ../src/modules/module-always-sink.c:80
+#: ../src/modules/module-always-sink.c:82
msgid "Dummy Output"
msgstr "Sahte Çıkış"
@@ -1080,7 +1158,7 @@ msgstr ""
msgid "Clocked NULL sink"
msgstr "Zamanlanmış BOŞ alıcı"
-#: ../src/modules/module-null-sink.c:278
+#: ../src/modules/module-null-sink.c:280
msgid "Null Output"
msgstr "Boş Çıkış"
@@ -1136,7 +1214,7 @@ msgstr ""
msgid "PulseAudio Sound Server"
msgstr "PulseAudio Ses Sunucusu"
-#: ../src/pulse/channelmap.c:103 ../src/pulse/channelmap.c:758
+#: ../src/pulse/channelmap.c:103 ../src/pulse/channelmap.c:771
msgid "Mono"
msgstr "Tek Kanallı"
@@ -1340,7 +1418,7 @@ msgstr "Üst Arka Sol"
msgid "Top Rear Right"
msgstr "Üst Arka Sağ"
-#: ../src/pulse/channelmap.c:479 ../src/pulse/format.c:121
+#: ../src/pulse/channelmap.c:479 ../src/pulse/format.c:127
#: ../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
@@ -1348,27 +1426,27 @@ msgstr "Üst Arka Sağ"
msgid "(invalid)"
msgstr "(geçersiz)"
-#: ../src/pulse/channelmap.c:762
+#: ../src/pulse/channelmap.c:775
msgid "Stereo"
msgstr "Stereo"
-#: ../src/pulse/channelmap.c:767
+#: ../src/pulse/channelmap.c:780
msgid "Surround 4.0"
msgstr "Çevresel Ses 4.0"
-#: ../src/pulse/channelmap.c:773
+#: ../src/pulse/channelmap.c:786
msgid "Surround 4.1"
msgstr "Çevresel Ses 4.1"
-#: ../src/pulse/channelmap.c:779
+#: ../src/pulse/channelmap.c:792
msgid "Surround 5.0"
msgstr "Çevresel Ses 5.0"
-#: ../src/pulse/channelmap.c:785
+#: ../src/pulse/channelmap.c:798
msgid "Surround 5.1"
msgstr "Çevresel Ses 5.1"
-#: ../src/pulse/channelmap.c:792
+#: ../src/pulse/channelmap.c:805
msgid "Surround 7.1"
msgstr "Çevresel Ses 7.1"
@@ -1384,17 +1462,17 @@ msgstr "xcb_connection_has_error() doğru değer döndü"
msgid "Failed to parse cookie data"
msgstr "Çerez veri ayrıştırılamadı"
-#: ../src/pulse/context.c:656
+#: ../src/pulse/context.c:660
#, c-format
msgid "fork(): %s"
msgstr "fork(): %s"
-#: ../src/pulse/context.c:711
+#: ../src/pulse/context.c:715
#, c-format
msgid "waitpid(): %s"
msgstr "waitpid(): %s"
-#: ../src/pulse/context.c:1417
+#: ../src/pulse/context.c:1421
#, c-format
msgid "Received message for unknown extension '%s'"
msgstr "Bilinmeyen eklenti '%s' için ileti alındı"
@@ -1415,7 +1493,7 @@ msgstr "çift yönlü"
msgid "invalid"
msgstr "geçersiz"
-#: ../src/pulsecore/core-util.c:1820
+#: ../src/pulsecore/core-util.c:1836
#, c-format
msgid ""
"XDG_RUNTIME_DIR (%s) is not owned by us (uid %d), but by uid %d! (This could "
@@ -1426,11 +1504,11 @@ msgstr ""
"root kullanıcısı olarak root olmayan bir PulseAudio ya bağlanmaya "
"çalışırsanız, doğal protokol üstüne bu bir örnek olabilirdi. Bunu yapmayın.)"
-#: ../src/pulsecore/core-util.h:93
+#: ../src/pulsecore/core-util.h:97
msgid "yes"
msgstr "evet"
-#: ../src/pulsecore/core-util.h:93
+#: ../src/pulsecore/core-util.h:97
msgid "no"
msgstr "hayır"
@@ -1438,12 +1516,12 @@ msgstr "hayır"
msgid "Cannot access autospawn lock."
msgstr "Otomatik oluşturma kilidine erişim yok."
-#: ../src/pulsecore/log.c:153
+#: ../src/pulsecore/log.c:154
#, c-format
msgid "Failed to open target file '%s'."
msgstr "Hedef dosya '%s' açılamadı."
-#: ../src/pulsecore/log.c:176
+#: ../src/pulsecore/log.c:177
#, c-format
msgid ""
"Tried to open target file '%s', '%s.1', '%s.2' ... '%s.%d', but all failed."
@@ -1451,15 +1529,15 @@ msgstr ""
"Hedef dosyaları '%s', '%s.1', '%s.2' ... '%s.%d' açmayı denedi fakat hiçbiri "
"açılamadı."
-#: ../src/pulsecore/log.c:631
+#: ../src/pulsecore/log.c:640
msgid "Invalid log target."
msgstr "Geçersiz log hedefi."
-#: ../src/pulsecore/sink.c:3427
+#: ../src/pulsecore/sink.c:3460
msgid "Built-in Audio"
msgstr "Dahili Ses"
-#: ../src/pulsecore/sink.c:3432
+#: ../src/pulsecore/sink.c:3465
msgid "Modem"
msgstr "Modem"
@@ -1596,68 +1674,6 @@ msgstr "%0.1f KiB"
msgid "%u B"
msgstr "%u B"
-#: ../src/tests/resampler-test.c:255
-#, 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"
-"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 [seçenekler]\n"
-"\n"
-"-h, --help Yardımı gösterir\n"
-"-v, --verbose Hata ayıklama iletilerini yazdırır\n"
-" --from-rate=ÖRNEKLEMEHIZ Hz cinsinde örnekleme hızından "
-"(varsayılan - 44100)\n"
-" --from-format=ÖRNEKLEMEBİÇİMİ Örnekleme türünden (varsayılan - "
-"s16le)\n"
-" --from-channels=KANALLAR Kanal sayılarından (varsayılan - 1)\n"
-" --to-rate=ÖRNEKLEMEHIZI Hz cinsinde örnekleme hızına "
-"(varsayılan - 44100)\n"
-" --to-format=ÖRNEKLEMEBİÇİMİ Örnekleme türüne (varsayılan - "
-"s16le)\n"
-" --to-channels=KANALLAR Kanal sayılarına (varsayılan - 1)\n"
-" --resample-method=YÖNTEM Yöntemi yeniden örnekleme (varsayılan "
-"otomatik)\n"
-" --seconds=SANİYE Akış süresinden (varsayılan - 60)\n"
-"\n"
-"Eğer biçimler belirtilmezse, test bütün biçimlerin birleşiminde ileri geri\n"
-"gerçekleştirilir.\n"
-"\n"
-"Örnek tür şunlardan biri olmalıdır; s16le, s16be, u8, float32le, float32be, "
-"ulaw, alaw,\n"
-"s24le, s24be, s24-32le, s24-32be, s32le, s32be (defaults to s16ne)\n"
-"\n"
-"Yeniden örnekleme yöntemlerinin olası değerlerini --dump-resample-methods "
-"gösterir.\n"
-
-#: ../src/tests/resampler-test.c:354
-#, c-format
-msgid "%s %s\n"
-msgstr "%s %s\n"
-
#: ../src/utils/pacat.c:117
#, c-format
msgid "Failed to drain stream: %s"
@@ -1773,8 +1789,9 @@ msgid "Cork request stack is empty: uncorking stream"
msgstr "Durdurma isteği yığını boş: akış durdurma sonlandırılıyor"
#: ../src/utils/pacat.c:441
-msgid "Warning: Received more uncork requests than cork requests!"
-msgstr "Uyarı: Durdurma isteğinden daha fazla devam ettirme isteği alındı!"
+#| msgid "Warning: Received more uncork requests than cork requests!"
+msgid "Warning: Received more uncork requests than cork requests."
+msgstr "Uyarı: Durdurma isteğinden daha fazla devam ettirme isteği alındı."
#: ../src/utils/pacat.c:466
#, c-format
@@ -1836,70 +1853,6 @@ msgstr "pa_stream_update_timing_info() başarısız oldu: %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"
@@ -2067,7 +2020,7 @@ msgstr ""
"Libpulse %s ile derlendi\n"
"Libpulse %s ile bağlantılı\n"
-#: ../src/utils/pacat.c:847 ../src/utils/pactl.c:1642
+#: ../src/utils/pacat.c:847 ../src/utils/pactl.c:1648
#, c-format
msgid "Invalid client name '%s'"
msgstr "Geçersiz istemci adı '%s'"
@@ -2140,7 +2093,7 @@ msgstr ""
"Uyarı: belirtilmiş örnek tanımlama, dosyadan alınacak başka bir tanımlama "
"ile üzerine yazılacak."
-#: ../src/utils/pacat.c:1074 ../src/utils/pactl.c:1706
+#: ../src/utils/pacat.c:1074 ../src/utils/pactl.c:1712
msgid "Failed to determine sample specification from file."
msgstr "Dosyadan örnekleme tanımı belirlenemedi."
@@ -2175,7 +2128,7 @@ msgstr "çal"
msgid "Failed to set media name."
msgstr "Ortam adı ayarlanamadı."
-#: ../src/utils/pacat.c:1152 ../src/utils/pactl.c:2056
+#: ../src/utils/pacat.c:1152 ../src/utils/pactl.c:2062
msgid "pa_mainloop_new() failed."
msgstr "pa_mainloop_new() başarısız oldu."
@@ -2183,11 +2136,11 @@ msgstr "pa_mainloop_new() başarısız oldu."
msgid "io_new() failed."
msgstr "io_new() başarısız oldu."
-#: ../src/utils/pacat.c:1182 ../src/utils/pactl.c:2068
+#: ../src/utils/pacat.c:1182 ../src/utils/pactl.c:2074
msgid "pa_context_new() failed."
msgstr "pa_context_new() başarısız oldu."
-#: ../src/utils/pacat.c:1190 ../src/utils/pactl.c:2074
+#: ../src/utils/pacat.c:1190 ../src/utils/pactl.c:2080
#, c-format
msgid "pa_context_connect() failed: %s"
msgstr "pa_context_connect() başarısız oldu: %s"
@@ -2196,20 +2149,20 @@ msgstr "pa_context_connect() başarısız oldu: %s"
msgid "pa_context_rttime_new() failed."
msgstr "pa_context_rttime_new() başarısız oldu."
-#: ../src/utils/pacat.c:1203 ../src/utils/pactl.c:2079
+#: ../src/utils/pacat.c:1203 ../src/utils/pactl.c:2085
msgid "pa_mainloop_run() failed."
msgstr "pa_mainloop_run() başarısız oldu."
-#: ../src/utils/pacmd.c:51 ../src/utils/pactl.c:1564
+#: ../src/utils/pacmd.c:51 ../src/utils/pactl.c:1570
msgid "NAME [ARGS ...]"
msgstr "AD [DEĞİŞKENLER ...]"
-#: ../src/utils/pacmd.c:52 ../src/utils/pacmd.c:60 ../src/utils/pactl.c:1565
+#: ../src/utils/pacmd.c:52 ../src/utils/pacmd.c:60 ../src/utils/pactl.c:1571
msgid "NAME|#N"
msgstr "AD|#A"
-#: ../src/utils/pacmd.c:53 ../src/utils/pacmd.c:63 ../src/utils/pactl.c:1563
-#: ../src/utils/pactl.c:1569
+#: ../src/utils/pacmd.c:53 ../src/utils/pacmd.c:63 ../src/utils/pactl.c:1569
+#: ../src/utils/pactl.c:1575
msgid "NAME"
msgstr "AD"
@@ -2221,7 +2174,7 @@ msgstr "AD|#A SES"
msgid "#N VOLUME"
msgstr "#N SES"
-#: ../src/utils/pacmd.c:56 ../src/utils/pacmd.c:70 ../src/utils/pactl.c:1567
+#: ../src/utils/pacmd.c:56 ../src/utils/pacmd.c:70 ../src/utils/pactl.c:1573
msgid "NAME|#N 1|0"
msgstr "AD|#A 1|0"
@@ -2257,7 +2210,7 @@ msgstr "YOLADI"
msgid "FILENAME SINK|#N"
msgstr "DOSYAADI ALICI|#A"
-#: ../src/utils/pacmd.c:69 ../src/utils/pactl.c:1566
+#: ../src/utils/pacmd.c:69 ../src/utils/pactl.c:1572
msgid "#N SINK|SOURCE"
msgstr "#A ALICI|KAYNAK"
@@ -2265,15 +2218,15 @@ msgstr "#A ALICI|KAYNAK"
msgid "1|0"
msgstr "1|0"
-#: ../src/utils/pacmd.c:72 ../src/utils/pactl.c:1568
+#: ../src/utils/pacmd.c:72 ../src/utils/pactl.c:1574
msgid "CARD PROFILE"
msgstr "KART PROFİLİ"
-#: ../src/utils/pacmd.c:73 ../src/utils/pactl.c:1570
+#: ../src/utils/pacmd.c:73 ../src/utils/pactl.c:1576
msgid "NAME|#N PORT"
msgstr "AD|#A BAĞLANTI NOKTASI"
-#: ../src/utils/pacmd.c:74 ../src/utils/pactl.c:1576
+#: ../src/utils/pacmd.c:74 ../src/utils/pactl.c:1582
msgid "CARD-NAME|CARD-#N PORT OFFSET"
msgstr "KART-ADI|KART-#N PORT UZAKLIK"
@@ -2282,8 +2235,9 @@ msgid "TARGET"
msgstr "HEDEF"
#: ../src/utils/pacmd.c:76
-msgid "NUMERIC LEVEL"
-msgstr "SAYISAL SEVİYE"
+#| msgid "NUMERIC LEVEL"
+msgid "NUMERIC-LEVEL"
+msgstr "SAYISAL-SEVİYE"
#: ../src/utils/pacmd.c:79
msgid "FRAMES"
@@ -2597,6 +2551,12 @@ msgstr ""
msgid "\tProfiles:\n"
msgstr "\tProfiller:\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 (alıcılar: %u, kaynaklar: %u, öncelik: %u, kullanılabilir: %s)\n"
+
#: ../src/utils/pactl.c:586
#, c-format
msgid "\tActive Profile: %s\n"
@@ -2832,25 +2792,22 @@ msgstr "%2$s #%3$u üzerinde '%1$s' olayı\n"
msgid "Got SIGINT, exiting."
msgstr "SIGINT alındı, çıkılıyor."
-#: ../src/utils/pactl.c:1479
+#: ../src/utils/pactl.c:1485
msgid "Invalid volume specification"
msgstr "Geçersiz ses tanımı"
-#: ../src/utils/pactl.c:1502
+#: ../src/utils/pactl.c:1508
msgid "Volume outside permissible range.\n"
msgstr "İzin verilebilir aralık dışındaki ses.\n"
-#: ../src/utils/pactl.c:1515
+#: ../src/utils/pactl.c:1521
msgid "Invalid number of volume specifications.\n"
msgstr "Geçersiz ses tanımı numarası.\n"
-#: ../src/utils/pactl.c:1527
+#: ../src/utils/pactl.c:1533
msgid "Inconsistent volume specification.\n"
msgstr "Tutarsız ses tanımı.\n"
-#: ../src/utils/pactl.c:1557 ../src/utils/pactl.c:1558
-#: ../src/utils/pactl.c:1559 ../src/utils/pactl.c:1560
-#: ../src/utils/pactl.c:1561 ../src/utils/pactl.c:1562
#: ../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
@@ -2858,43 +2815,46 @@ msgstr "Tutarsız ses tanımı.\n"
#: ../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: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 "[seçenekler]"
-#: ../src/utils/pactl.c:1559
+#: ../src/utils/pactl.c:1565
msgid "[TYPE]"
msgstr "[TÜR]"
-#: ../src/utils/pactl.c:1561
+#: ../src/utils/pactl.c:1567
msgid "FILENAME [NAME]"
msgstr "DOSYAADI [AD]"
-#: ../src/utils/pactl.c:1562
+#: ../src/utils/pactl.c:1568
msgid "NAME [SINK]"
msgstr "AD [ALICI]"
-#: ../src/utils/pactl.c:1571
+#: ../src/utils/pactl.c:1577
msgid "NAME|#N VOLUME [VOLUME ...]"
msgstr "AD|#A SES [SES ...]"
-#: ../src/utils/pactl.c:1572
+#: ../src/utils/pactl.c:1578
msgid "#N VOLUME [VOLUME ...]"
msgstr "#A SES [SES ...]"
-#: ../src/utils/pactl.c:1573
+#: ../src/utils/pactl.c:1579
msgid "NAME|#N 1|0|toggle"
msgstr "İSİM|#N 1|0|geçiş"
-#: ../src/utils/pactl.c:1574
+#: ../src/utils/pactl.c:1580
msgid "#N 1|0|toggle"
msgstr "#N 1|0|geçiş"
-#: ../src/utils/pactl.c:1575
+#: ../src/utils/pactl.c:1581
msgid "#N FORMATS"
msgstr "#A BİÇİMLER"
-#: ../src/utils/pactl.c:1578
+#: ../src/utils/pactl.c:1584
#, c-format
msgid ""
"\n"
@@ -2905,7 +2865,7 @@ msgstr ""
"Özel isimler @DEFAULT_SINK@, @DEFAULT_SOURCE@ ve @DEFAULT_MONITOR@\n"
"varsayılan alıcıyı, kaynağı ve ekranı belirtmek için kullanılabilir.\n"
-#: ../src/utils/pactl.c:1581
+#: ../src/utils/pactl.c:1587
#, c-format
msgid ""
"\n"
@@ -2925,7 +2885,7 @@ msgstr ""
" -n, --client-name=AD Sunucu üzerinde bu istemci nasıl "
"çağrılacak\n"
-#: ../src/utils/pactl.c:1622
+#: ../src/utils/pactl.c:1628
#, c-format
msgid ""
"pactl %s\n"
@@ -2936,58 +2896,58 @@ msgstr ""
"Libpulse %s ile derlendi\n"
"Libpulse %s ile bağlantılı\n"
-#: ../src/utils/pactl.c:1678
+#: ../src/utils/pactl.c:1684
#, c-format
msgid "Specify nothing, or one of: %s"
msgstr "Şunlardan birini belirtin ya da hiçbir şey belirtmeyin: %s"
-#: ../src/utils/pactl.c:1688
+#: ../src/utils/pactl.c:1694
msgid "Please specify a sample file to load"
msgstr "Lütfen yüklemek için bir örnekleme dosyası belirtin"
-#: ../src/utils/pactl.c:1701
+#: ../src/utils/pactl.c:1707
msgid "Failed to open sound file."
msgstr "Ses dosyası açılamadı."
-#: ../src/utils/pactl.c:1713
+#: ../src/utils/pactl.c:1719
msgid "Warning: Failed to determine sample specification from file."
msgstr "Uyarı: Dosyadan örnekleme tanımı belirlenemedi."
-#: ../src/utils/pactl.c:1723
+#: ../src/utils/pactl.c:1729
msgid "You have to specify a sample name to play"
msgstr "Çalmak için örnek ad belirtmelisiniz"
-#: ../src/utils/pactl.c:1735
+#: ../src/utils/pactl.c:1741
msgid "You have to specify a sample name to remove"
msgstr "Kaldırmak için örnek ad belirtmelisiniz"
-#: ../src/utils/pactl.c:1744
+#: ../src/utils/pactl.c:1750
msgid "You have to specify a sink input index and a sink"
msgstr "Bir alıcı giriş göstergesi ve alıcı belirtmelisiniz"
-#: ../src/utils/pactl.c:1754
+#: ../src/utils/pactl.c:1760
msgid "You have to specify a source output index and a source"
msgstr "Bir kaynak çıkış indeksi ve kaynak belirtmelisiniz"
-#: ../src/utils/pactl.c:1769
+#: ../src/utils/pactl.c:1775
msgid "You have to specify a module name and arguments."
msgstr "Bir modül adı ve değişken belirtmelisiniz."
-#: ../src/utils/pactl.c:1789
+#: ../src/utils/pactl.c:1795
msgid "You have to specify a module index or name"
msgstr "Bir modül dizini ya da adı belirtmelisiniz"
-#: ../src/utils/pactl.c:1802
+#: ../src/utils/pactl.c:1808
msgid ""
"You may not specify more than one sink. You have to specify a boolean value."
msgstr ""
"Birden daha fazla alıcı belirtemezsiniz. Bir boolean değer belirtmelisiniz."
-#: ../src/utils/pactl.c:1807 ../src/utils/pactl.c:1827
+#: ../src/utils/pactl.c:1813 ../src/utils/pactl.c:1833
msgid "Invalid suspend specification."
msgstr "Geçersiz bekletme tanımlaması"
-#: ../src/utils/pactl.c:1822
+#: ../src/utils/pactl.c:1828
msgid ""
"You may not specify more than one source. You have to specify a boolean "
"value."
@@ -2995,84 +2955,97 @@ msgstr ""
"Bir kaynaktan daha fazlasını belirtemezsiniz. Bir boolean değer "
"belirtmelisiniz."
-#: ../src/utils/pactl.c:1839
+#: ../src/utils/pactl.c:1845
msgid "You have to specify a card name/index and a profile name"
msgstr "Bir kart adı/dizin ve bir profil adı belirtmelisiniz"
-#: ../src/utils/pactl.c:1850
+#: ../src/utils/pactl.c:1856
msgid "You have to specify a sink name/index and a port name"
msgstr "Bir alıcı adı/indeksi ve bağlantı noktası adı belirtmelisiniz"
-#: ../src/utils/pactl.c:1861
+#: ../src/utils/pactl.c:1867
msgid "You have to specify a sink name"
msgstr "Bir alıcı adı belirtmelisiniz"
-#: ../src/utils/pactl.c:1871
+#: ../src/utils/pactl.c:1877
msgid "You have to specify a source name/index and a port name"
msgstr "Bir kaynak adı/dizini ve bir bağlantı noktası adı belirtmelisiniz"
-#: ../src/utils/pactl.c:1882
+#: ../src/utils/pactl.c:1888
msgid "You have to specify a source name"
msgstr "Bir kaynak adı belirtmelisiniz"
-#: ../src/utils/pactl.c:1892
+#: ../src/utils/pactl.c:1898
msgid "You have to specify a sink name/index and a volume"
msgstr "Bir alıcı adı/indeksi ve ses belirtmelisiniz"
-#: ../src/utils/pactl.c:1905
+#: ../src/utils/pactl.c:1911
msgid "You have to specify a source name/index and a volume"
msgstr "Bir kaynak adı/dizini ve bir ses belirtmelisiniz"
-#: ../src/utils/pactl.c:1918
+#: ../src/utils/pactl.c:1924
msgid "You have to specify a sink input index and a volume"
msgstr "Bir alıcı girdisi indeksi ve bir ses belirtmek zorundasınız"
-#: ../src/utils/pactl.c:1923
+#: ../src/utils/pactl.c:1929
msgid "Invalid sink input index"
msgstr "Geçersiz alıcı giriş indeksi"
-#: ../src/utils/pactl.c:1934
+#: ../src/utils/pactl.c:1940
msgid "You have to specify a source output index and a volume"
msgstr "Bir kaynak çıktı dizini ve bir ses belirtmelisiniz"
-#: ../src/utils/pactl.c:1939
+#: ../src/utils/pactl.c:1945
msgid "Invalid source output index"
msgstr "Geçersiz kaynak çıktı dizini"
-#: ../src/utils/pactl.c:1950
-msgid "You have to specify a sink name/index and a mute boolean"
+#: ../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 action (0, 1, or 'toggle')"
msgstr ""
-"Bir alıcı adı/indeksi ve bir sessizlik boole değeri belirtmek zorundasınız"
+"Bir alıcı adı/indeksi ve bir sessizlik eylemi (0, 1 ya da 'toggle') "
+"belirtmek zorundasınız"
-#: ../src/utils/pactl.c:1955 ../src/utils/pactl.c:1970
-#: ../src/utils/pactl.c:1990 ../src/utils/pactl.c:2008
+#: ../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 "Geçersiz sessiz tanımı"
-#: ../src/utils/pactl.c:1965
-msgid "You have to specify a source name/index and a mute boolean"
-msgstr "Bir kaynak adı/dizini ve bir sessiz mantıksal değer belirtmelisiniz"
+#: ../src/utils/pactl.c:1971
+#| 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 ""
+"Bir kaynak adı/dizini ve bir sessizlik eylemi (0, 1 yada 'toggle') "
+"belirtmelisiniz"
-#: ../src/utils/pactl.c:1980
-msgid "You have to specify a sink input index and a mute boolean"
+#: ../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 action (0, 1, or 'toggle')"
msgstr ""
-"Bir alıcı girdi indeksi ve bir sessizlik boole değeri belirtmek zorundasınız"
+"Bir alıcı girdi dizini ve bir sessizlik eylemi (0, 1 ya da 'toggle') "
+"belirtmek zorundasınız"
-#: ../src/utils/pactl.c:1985
+#: ../src/utils/pactl.c:1991
msgid "Invalid sink input index specification"
msgstr "Geçersiz alıcı girişi indeks tanımı"
-#: ../src/utils/pactl.c:1998
-msgid "You have to specify a source output index and a mute boolean"
+#: ../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 action (0, 1, or "
+"'toggle')"
msgstr ""
-"Bir çıktı kaynağı indeksi ve bir sessizlik boole değeri belirtmek "
-"zorundasınız"
+"Bir kaynak çıktı dizini ve bir sessizlik eylemi (0, 1 ya da 'toggle') "
+"belirtmek zorundasınız"
-#: ../src/utils/pactl.c:2003
+#: ../src/utils/pactl.c:2009
msgid "Invalid source output index specification"
msgstr "Geçersiz kaynak çıktısı indeksi tanımlaması"
-#: ../src/utils/pactl.c:2020
+#: ../src/utils/pactl.c:2026
msgid ""
"You have to specify a sink index and a semicolon-separated list of supported "
"formats"
@@ -3080,17 +3053,17 @@ msgstr ""
"Bir alıcı indeksi ve desteklenen biçimlerin, noktalı virgülle ayrılmış "
"listesini belirtmek zorundasınız"
-#: ../src/utils/pactl.c:2032
+#: ../src/utils/pactl.c:2038
msgid "You have to specify a card name/index, a port name and a latency offset"
msgstr ""
"Bir kart adı/indeksi, bir bağlantı noktası adı ve bir gecikme uzaklığı "
"belirtmek zorundasınız"
-#: ../src/utils/pactl.c:2039
+#: ../src/utils/pactl.c:2045
msgid "Could not parse latency offset"
msgstr "Gecikme uzaklığı ayrıştırılamadı"
-#: ../src/utils/pactl.c:2051
+#: ../src/utils/pactl.c:2057
msgid "No valid command specified."
msgstr "Belirtilen geçerli komut yok."
@@ -3247,3 +3220,66 @@ msgstr "Çerez veriler yüklenemedi\n"
#, c-format
msgid "Not yet implemented.\n"
msgstr "Henüz uygulanmadı.\n"
+
+#~ 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 [seçenekler]\n"
+#~ "\n"
+#~ "-h, --help Yardımı gösterir\n"
+#~ "-v, --verbose Hata ayıklama iletilerini yazdırır\n"
+#~ " --from-rate=ÖRNEKLEMEHIZ Hz cinsinde örnekleme hızından "
+#~ "(varsayılan - 44100)\n"
+#~ " --from-format=ÖRNEKLEMEBİÇİMİ Örnekleme türünden (varsayılan - "
+#~ "s16le)\n"
+#~ " --from-channels=KANALLAR Kanal sayılarından (varsayılan - "
+#~ "1)\n"
+#~ " --to-rate=ÖRNEKLEMEHIZI Hz cinsinde örnekleme hızına "
+#~ "(varsayılan - 44100)\n"
+#~ " --to-format=ÖRNEKLEMEBİÇİMİ Örnekleme türüne (varsayılan - "
+#~ "s16le)\n"
+#~ " --to-channels=KANALLAR Kanal sayılarına (varsayılan - 1)\n"
+#~ " --resample-method=YÖNTEM Yöntemi yeniden örnekleme "
+#~ "(varsayılan otomatik)\n"
+#~ " --seconds=SANİYE Akış süresinden (varsayılan - 60)\n"
+#~ "\n"
+#~ "Eğer biçimler belirtilmezse, test bütün biçimlerin birleşiminde ileri "
+#~ "geri\n"
+#~ "gerçekleştirilir.\n"
+#~ "\n"
+#~ "Örnek tür şunlardan biri olmalıdır; s16le, s16be, u8, float32le, "
+#~ "float32be, ulaw, alaw,\n"
+#~ "s24le, s24be, s24-32le, s24-32be, s32le, s32be (defaults to s16ne)\n"
+#~ "\n"
+#~ "Yeniden örnekleme yöntemlerinin olası değerlerini --dump-resample-methods "
+#~ "gösterir.\n"
+
+#~ msgid "%s %s\n"
+#~ msgstr "%s %s\n"
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 2753c0b..19a7ae5 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -12,15 +12,16 @@ 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-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"
+"POT-Creation-Date: 2016-03-26 02:46+0000\n"
+"PO-Revision-Date: 2016-03-26 13:00+0800\n"
+"Last-Translator: Luo Lei <luolei at ubuntukylin.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: Poedit 1.8.6\n"
+"X-Launchpad-Export-Date: 2016-03-22 13:23+0000\n"
+"X-Generator: Poedit 1.7.6\n"
#: ../src/daemon/cmdline.c:111
#, c-format
@@ -149,39 +150,39 @@ msgstr ""
#: ../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:262
msgid ""
"--log-level expects log level argument (either numeric in range 0..4 or one "
"of debug, info, notice, warn, error)."
msgstr ""
-"--log-level 期待日志级别参数(可以是数字0~4或者debug,info,notice,warn,"
-"error中的一个)"
+"--log-level 日志级别参数(可以是数字 0~4 或者 debug、info、notice、warn 和 "
+"error 中的一个)"
#: ../src/daemon/cmdline.c:274
msgid "--high-priority expects boolean argument"
-msgstr "--high-priority 需要布尔值参数"
+msgstr "--high-priority 布尔参数"
#: ../src/daemon/cmdline.c:282
msgid "--realtime expects boolean argument"
-msgstr "--realtime 需要布尔值参数"
+msgstr "--realtime 布尔参数"
#: ../src/daemon/cmdline.c:290
msgid "--disallow-module-loading expects boolean argument"
-msgstr "--disallow-module-loading 需要布尔值参数"
+msgstr "--disallow-module-loading 布尔参数"
#: ../src/daemon/cmdline.c:298
msgid "--disallow-exit expects boolean argument"
-msgstr "--disallow-exit 需要布尔值参数"
+msgstr "--disallow-exit 布尔参数"
#: ../src/daemon/cmdline.c:306
msgid "--use-pid-file expects boolean argument"
-msgstr "--use-pid-file 需要布尔值参数"
+msgstr "--use-pid-file 布尔参数"
#: ../src/daemon/cmdline.c:325
msgid ""
@@ -201,63 +202,63 @@ msgstr ""
#: ../src/daemon/cmdline.c:335
msgid "--log-time expects boolean argument"
-msgstr "--log-time 需要布尔值参数"
+msgstr "--log-time 布尔参数"
#: ../src/daemon/cmdline.c:343
msgid "--log-meta expects boolean argument"
-msgstr "--log-meta 需要布尔值参数"
+msgstr "--log-meta 布尔参数"
#: ../src/daemon/cmdline.c:363
#, c-format
msgid "Invalid resample method '%s'."
-msgstr "无效的重采样方法'%s'。"
+msgstr "无效的重采样方法 %s。"
#: ../src/daemon/cmdline.c:370
msgid "--system expects boolean argument"
-msgstr "--system 需要布尔值参数"
+msgstr "--system 布尔参数"
#: ../src/daemon/cmdline.c:378
msgid "--no-cpu-limit expects boolean argument"
-msgstr "--no-cpu-limit 需要布尔值参数"
+msgstr "--no-cpu-limit 布尔参数"
#: ../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'。"
+msgstr "[%s:%u] 无效的日志目标 %s。"
#: ../src/daemon/daemon-conf.c:274
#, c-format
msgid "[%s:%u] Invalid log level '%s'."
-msgstr "[%s:%u] 无效的日志级别'%s'。"
+msgstr "[%s:%u] 无效的日志级别 '%s。"
#: ../src/daemon/daemon-conf.c:289
#, c-format
msgid "[%s:%u] Invalid resample method '%s'."
-msgstr "[%s:%u] 无效的重采样方法'%s'。"
+msgstr "[%s:%u] 无效的重采样方法 %s。"
#: ../src/daemon/daemon-conf.c:311
#, c-format
msgid "[%s:%u] Invalid rlimit '%s'."
-msgstr "[%s:%u] 无效的 rlimit '%s'。"
+msgstr "[%s:%u] 无效的运行限制 %s。"
#: ../src/daemon/daemon-conf.c:331
#, c-format
msgid "[%s:%u] Invalid sample format '%s'."
-msgstr "[%s:%u] 无效的采样格式'%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'。"
+msgstr "[%s:%u] 无效的采样率 %s。"
#: ../src/daemon/daemon-conf.c:388
#, c-format
msgid "[%s:%u] Invalid sample channels '%s'."
-msgstr "[%s:%u] 无效的采样声道 '%s'。"
+msgstr "[%s:%u] 无效的采样声道 %s。"
#: ../src/daemon/daemon-conf.c:405
#, c-format
@@ -267,17 +268,17 @@ msgstr "[%s:%u] 无效声道映射 '%s'。"
#: ../src/daemon/daemon-conf.c:422
#, c-format
msgid "[%s:%u] Invalid number of fragments '%s'."
-msgstr "[%s:%u] 无效的分段数'%s'。"
+msgstr "[%s:%u] 无效的分片数 %s。"
#: ../src/daemon/daemon-conf.c:439
#, c-format
msgid "[%s:%u] Invalid fragment size '%s'."
-msgstr "[%s:%u] 无效的分段大小'%s'。"
+msgstr "[%s:%u] 无效的分片大小 %s。"
#: ../src/daemon/daemon-conf.c:456
#, c-format
msgid "[%s:%u] Invalid nice level '%s'."
-msgstr "[%s:%u] 无效的静态优先级 '%s'。"
+msgstr "[%s:%u] 无效的优先级 %s。"
#: ../src/daemon/daemon-conf.c:499
#, c-format
@@ -313,7 +314,7 @@ msgstr "没有可用的模块信息\n"
#: ../src/daemon/dumpmodules.c:63
#, c-format
msgid "Version: %s\n"
-msgstr "版本号:%s\n"
+msgstr "版本:%s\n"
#: ../src/daemon/dumpmodules.c:65
#, c-format
@@ -338,7 +339,7 @@ msgstr "加载一次:%s\n"
#: ../src/daemon/dumpmodules.c:72
#, c-format
msgid "DEPRECATION WARNING: %s\n"
-msgstr "过时警告:%s\n"
+msgstr "旧接口警告:%s\n"
#: ../src/daemon/dumpmodules.c:76
#, c-format
@@ -356,7 +357,7 @@ msgstr "查找原始 lt_dlopen 加载器失败。"
#: ../src/daemon/ltdl-bind-now.c:131
msgid "Failed to allocate new dl loader."
-msgstr "分配新的 dl 加载器失败。"
+msgstr "分配新的动态加载器失败。"
#: ../src/daemon/ltdl-bind-now.c:144
msgid "Failed to add bind-now-loader."
@@ -365,27 +366,27 @@ msgstr "添加 bind-now-loader 失败。"
#: ../src/daemon/main.c:160
#, c-format
msgid "Failed to find user '%s'."
-msgstr "找不到用户 `%s' "
+msgstr "找不到用户 %s。"
#: ../src/daemon/main.c:165
#, c-format
msgid "Failed to find group '%s'."
-msgstr "找不到用户组 `%s'"
+msgstr "找不到组 %s。"
#: ../src/daemon/main.c:174
#, c-format
msgid "GID of user '%s' and of group '%s' don't match."
-msgstr "用户'%s'与组'%s'的GID不匹配."
+msgstr "用户 %s 与组 %s 的 GID 不匹配。"
#: ../src/daemon/main.c:179
#, c-format
msgid "Home directory of user '%s' is not '%s', ignoring."
-msgstr "用户'%s'的主文件夹不是'%s',忽略。"
+msgstr "用户 %s 的主文件夹不是 %s,忽略。"
#: ../src/daemon/main.c:182 ../src/daemon/main.c:187
#, c-format
msgid "Failed to create '%s': %s"
-msgstr "创建'%s'失败: %s"
+msgstr "创建 %s 失败:%s"
#: ../src/daemon/main.c:194
#, c-format
@@ -395,20 +396,20 @@ msgstr "更改组列表失败:%s"
#: ../src/daemon/main.c:210
#, c-format
msgid "Failed to change GID: %s"
-msgstr "更改GID失败:%s"
+msgstr "更改 GID 失败:%s"
#: ../src/daemon/main.c:226
#, c-format
msgid "Failed to change UID: %s"
-msgstr "更改UID失败:%s"
+msgstr "更改 UID 失败:%s"
#: ../src/daemon/main.c:255
msgid "System wide mode unsupported on this platform."
-msgstr "此平台不支持system-wide模式。"
+msgstr "此平台不支持系统全局模式。"
#: ../src/daemon/main.c:484
msgid "Failed to parse command line."
-msgstr "分析命令行失败。"
+msgstr "命令行解析失败"
#: ../src/daemon/main.c:523
msgid ""
@@ -419,13 +420,13 @@ msgstr "已拒绝非超级用户使用系统模式,仅启动 D-Bus 服务器
#: ../src/daemon/main.c:622
#, c-format
msgid "Failed to kill daemon: %s"
-msgstr "杀死后台程序失败:%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)。"
+msgstr "不应以 root 身份运行本程序(除非指定 --system 参数)。"
#: ../src/daemon/main.c:654
msgid "Root privileges required."
@@ -433,7 +434,7 @@ msgstr "需要 root 权限。"
#: ../src/daemon/main.c:661
msgid "--start not supported for system instances."
-msgstr "系统实例不支持 --start。"
+msgstr "系统实例不支持 --start 参数。"
#: ../src/daemon/main.c:701
#, c-format
@@ -464,7 +465,7 @@ msgstr "正在以系统模式运行,强制禁用退出空闲时间!"
#: ../src/daemon/main.c:756
msgid "Failed to acquire stdio."
-msgstr "获取stdio失败。"
+msgstr "获取 stdio 失败。"
#: ../src/daemon/main.c:762 ../src/daemon/main.c:833
#, c-format
@@ -483,7 +484,7 @@ msgstr "read() 失败:%s"
#: ../src/daemon/main.c:788
msgid "Daemon startup failed."
-msgstr "后台程序启动失败。"
+msgstr "守护程序启动失败。"
#: ../src/daemon/main.c:821
#, c-format
@@ -492,7 +493,7 @@ msgstr "setsid() 失败:%s"
#: ../src/daemon/main.c:948
msgid "Failed to get machine ID"
-msgstr "获取machine ID失败"
+msgstr "获取机器 ID 失败"
#: ../src/daemon/main.c:974
msgid ""
@@ -505,7 +506,7 @@ msgid ""
"mode is usually a bad idea."
msgstr ""
"好的,那么您现在是在系统模式中运行 PA。请注意:您很可能不应该这样做。\n"
-"如果您无论如何都这样做了,那么出现意外情况就是您的问题。\n"
+"如果您坚持这么做,请做好接受意外情况的准备。\n"
"请阅读 http://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/"
"User/WhatIsWrongWithSystemWide/ 以了解为什么系统模式通常不是个好主意。"
@@ -519,11 +520,11 @@ msgstr "pa_core_new() 失败。"
#: ../src/daemon/main.c:1089
msgid "Failed to initialize daemon."
-msgstr "后台程序初始化失败。"
+msgstr "初始化守护进程失败。"
#: ../src/daemon/main.c:1094
msgid "Daemon startup without any loaded modules, refusing to work."
-msgstr "后台程序启动未加载任何模块,拒绝工作。"
+msgstr "守护进程未加载任何负载模块,拒绝工作。"
#: ../src/daemon/pulseaudio.desktop.in.h:1
msgid "PulseAudio Sound System"
@@ -533,155 +534,155 @@ msgstr "PulseAudio 声音系统"
msgid "Start the PulseAudio Sound System"
msgstr "启动 PulseAudio 声音系统"
-#: ../src/modules/alsa/alsa-mixer.c:2402
+#: ../src/modules/alsa/alsa-mixer.c:2378
msgid "Input"
msgstr "输入"
-#: ../src/modules/alsa/alsa-mixer.c:2403
+#: ../src/modules/alsa/alsa-mixer.c:2379
msgid "Docking Station Input"
msgstr "扩展坞输入"
-#: ../src/modules/alsa/alsa-mixer.c:2404
+#: ../src/modules/alsa/alsa-mixer.c:2380
msgid "Docking Station Microphone"
-msgstr "扩展坞麦克风"
+msgstr "扩展坞话筒"
-#: ../src/modules/alsa/alsa-mixer.c:2405
+#: ../src/modules/alsa/alsa-mixer.c:2381
msgid "Docking Station Line In"
msgstr "扩展坞线输入"
-#: ../src/modules/alsa/alsa-mixer.c:2406 ../src/modules/alsa/alsa-mixer.c:2491
+#: ../src/modules/alsa/alsa-mixer.c:2382 ../src/modules/alsa/alsa-mixer.c:2467
msgid "Line In"
-msgstr "Line In"
+msgstr "输入插孔"
-#: ../src/modules/alsa/alsa-mixer.c:2407 ../src/modules/alsa/alsa-mixer.c:2485
+#: ../src/modules/alsa/alsa-mixer.c:2383 ../src/modules/alsa/alsa-mixer.c:2461
#: ../src/modules/bluetooth/module-bluez4-device.c:2099
#: ../src/modules/bluetooth/module-bluez5-device.c:1710
msgid "Microphone"
-msgstr "麦克风"
+msgstr "话筒"
-#: ../src/modules/alsa/alsa-mixer.c:2408 ../src/modules/alsa/alsa-mixer.c:2486
+#: ../src/modules/alsa/alsa-mixer.c:2384 ../src/modules/alsa/alsa-mixer.c:2462
msgid "Front Microphone"
msgstr "前麦克风"
-#: ../src/modules/alsa/alsa-mixer.c:2409 ../src/modules/alsa/alsa-mixer.c:2487
+#: ../src/modules/alsa/alsa-mixer.c:2385 ../src/modules/alsa/alsa-mixer.c:2463
msgid "Rear Microphone"
msgstr "后麦克风"
-#: ../src/modules/alsa/alsa-mixer.c:2410
+#: ../src/modules/alsa/alsa-mixer.c:2386
msgid "External Microphone"
-msgstr "外部麦克风"
+msgstr "外部话筒"
-#: ../src/modules/alsa/alsa-mixer.c:2411 ../src/modules/alsa/alsa-mixer.c:2489
+#: ../src/modules/alsa/alsa-mixer.c:2387 ../src/modules/alsa/alsa-mixer.c:2465
msgid "Internal Microphone"
-msgstr "内部麦克风"
+msgstr "内部话筒"
-#: ../src/modules/alsa/alsa-mixer.c:2412 ../src/modules/alsa/alsa-mixer.c:2492
+#: ../src/modules/alsa/alsa-mixer.c:2388 ../src/modules/alsa/alsa-mixer.c:2468
msgid "Radio"
msgstr "无线电"
-#: ../src/modules/alsa/alsa-mixer.c:2413 ../src/modules/alsa/alsa-mixer.c:2493
+#: ../src/modules/alsa/alsa-mixer.c:2389 ../src/modules/alsa/alsa-mixer.c:2469
msgid "Video"
msgstr "视频"
-#: ../src/modules/alsa/alsa-mixer.c:2414
+#: ../src/modules/alsa/alsa-mixer.c:2390
msgid "Automatic Gain Control"
msgstr "自动增益控制"
-#: ../src/modules/alsa/alsa-mixer.c:2415
+#: ../src/modules/alsa/alsa-mixer.c:2391
msgid "No Automatic Gain Control"
msgstr "无自动增益控制"
-#: ../src/modules/alsa/alsa-mixer.c:2416
+#: ../src/modules/alsa/alsa-mixer.c:2392
msgid "Boost"
-msgstr "加速器"
+msgstr "增强"
-#: ../src/modules/alsa/alsa-mixer.c:2417
+#: ../src/modules/alsa/alsa-mixer.c:2393
msgid "No Boost"
-msgstr "无加速器"
+msgstr "无增强"
-#: ../src/modules/alsa/alsa-mixer.c:2418
+#: ../src/modules/alsa/alsa-mixer.c:2394
msgid "Amplifier"
-msgstr "均衡器"
+msgstr "功放"
-#: ../src/modules/alsa/alsa-mixer.c:2419
+#: ../src/modules/alsa/alsa-mixer.c:2395
msgid "No Amplifier"
-msgstr "无均衡器"
+msgstr "无功放"
-#: ../src/modules/alsa/alsa-mixer.c:2420
+#: ../src/modules/alsa/alsa-mixer.c:2396
msgid "Bass Boost"
msgstr "重低音增强"
-#: ../src/modules/alsa/alsa-mixer.c:2421
+#: ../src/modules/alsa/alsa-mixer.c:2397
msgid "No Bass Boost"
msgstr "无重低音增强"
-#: ../src/modules/alsa/alsa-mixer.c:2422
+#: ../src/modules/alsa/alsa-mixer.c:2398
#: ../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
+#: ../src/modules/alsa/alsa-mixer.c:2399 ../src/modules/alsa/alsa-mixer.c:2471
msgid "Headphones"
msgstr "模拟耳机"
-#: ../src/modules/alsa/alsa-mixer.c:2484
+#: ../src/modules/alsa/alsa-mixer.c:2460
msgid "Analog Input"
msgstr "模拟输入"
-#: ../src/modules/alsa/alsa-mixer.c:2488
+#: ../src/modules/alsa/alsa-mixer.c:2464
msgid "Dock Microphone"
msgstr "扩展坞麦克风"
-#: ../src/modules/alsa/alsa-mixer.c:2490
+#: ../src/modules/alsa/alsa-mixer.c:2466
msgid "Headset Microphone"
msgstr "头挂麦克风"
-#: ../src/modules/alsa/alsa-mixer.c:2494
+#: ../src/modules/alsa/alsa-mixer.c:2470
msgid "Analog Output"
-msgstr "模拟输出 "
+msgstr "模拟输出"
-#: ../src/modules/alsa/alsa-mixer.c:2496
+#: ../src/modules/alsa/alsa-mixer.c:2472
msgid "LFE on Separate Mono Output"
msgstr "模拟输出(LFE)"
-#: ../src/modules/alsa/alsa-mixer.c:2497
+#: ../src/modules/alsa/alsa-mixer.c:2473
msgid "Line Out"
msgstr "线缆输出"
-#: ../src/modules/alsa/alsa-mixer.c:2498
+#: ../src/modules/alsa/alsa-mixer.c:2474
msgid "Analog Mono Output"
msgstr "模拟单声道输出"
-#: ../src/modules/alsa/alsa-mixer.c:2499
+#: ../src/modules/alsa/alsa-mixer.c:2475
msgid "Speakers"
msgstr "扬声器"
-#: ../src/modules/alsa/alsa-mixer.c:2500
+#: ../src/modules/alsa/alsa-mixer.c:2476
msgid "HDMI / DisplayPort"
msgstr "HDMI / DisplayPort"
-#: ../src/modules/alsa/alsa-mixer.c:2501
+#: ../src/modules/alsa/alsa-mixer.c:2477
msgid "Digital Output (S/PDIF)"
msgstr "数字输出 (S/PDIF)"
-#: ../src/modules/alsa/alsa-mixer.c:2502
+#: ../src/modules/alsa/alsa-mixer.c:2478
msgid "Digital Input (S/PDIF)"
msgstr "数字输入 (S/PDIF)"
-#: ../src/modules/alsa/alsa-mixer.c:2503
+#: ../src/modules/alsa/alsa-mixer.c:2479
msgid "Digital Passthrough (S/PDIF)"
msgstr "数字直通 (S/PDIF)"
-#: ../src/modules/alsa/alsa-mixer.c:2504
+#: ../src/modules/alsa/alsa-mixer.c:2480
msgid "Multichannel Input"
msgstr "多声道输入"
-#: ../src/modules/alsa/alsa-mixer.c:2505
+#: ../src/modules/alsa/alsa-mixer.c:2481
msgid "Multichannel Output"
msgstr "多声道输出"
-#: ../src/modules/alsa/alsa-mixer.c:4011
+#: ../src/modules/alsa/alsa-mixer.c:3990
msgid "Analog Mono"
msgstr "模拟单声道"
@@ -690,116 +691,116 @@ msgstr "模拟单声道"
#. * 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
+#: ../src/modules/alsa/alsa-mixer.c:3991 ../src/modules/alsa/alsa-mixer.c:3997
+#: ../src/modules/alsa/alsa-mixer.c:3998
msgid "Analog Stereo"
msgstr "模拟立体声"
-#: ../src/modules/alsa/alsa-mixer.c:4020 ../src/modules/alsa/alsa-mixer.c:4021
+#: ../src/modules/alsa/alsa-mixer.c:3999 ../src/modules/alsa/alsa-mixer.c:4000
msgid "Multichannel"
msgstr "多声道"
-#: ../src/modules/alsa/alsa-mixer.c:4022
+#: ../src/modules/alsa/alsa-mixer.c:4001
msgid "Analog Surround 2.1"
msgstr "模拟环绕 2.1"
-#: ../src/modules/alsa/alsa-mixer.c:4023
+#: ../src/modules/alsa/alsa-mixer.c:4002
msgid "Analog Surround 3.0"
msgstr "模拟环绕 3.0"
-#: ../src/modules/alsa/alsa-mixer.c:4024
+#: ../src/modules/alsa/alsa-mixer.c:4003
msgid "Analog Surround 3.1"
msgstr "模拟环绕 3.1"
-#: ../src/modules/alsa/alsa-mixer.c:4025
+#: ../src/modules/alsa/alsa-mixer.c:4004
msgid "Analog Surround 4.0"
msgstr "模拟环绕 4.0"
-#: ../src/modules/alsa/alsa-mixer.c:4026
+#: ../src/modules/alsa/alsa-mixer.c:4005
msgid "Analog Surround 4.1"
msgstr "模拟环绕 4.1"
-#: ../src/modules/alsa/alsa-mixer.c:4027
+#: ../src/modules/alsa/alsa-mixer.c:4006
msgid "Analog Surround 5.0"
msgstr "模拟环绕 5.0"
-#: ../src/modules/alsa/alsa-mixer.c:4028
+#: ../src/modules/alsa/alsa-mixer.c:4007
msgid "Analog Surround 5.1"
msgstr "模拟环绕 5.1"
-#: ../src/modules/alsa/alsa-mixer.c:4029
+#: ../src/modules/alsa/alsa-mixer.c:4008
msgid "Analog Surround 6.0"
msgstr "模拟环绕 6.0"
-#: ../src/modules/alsa/alsa-mixer.c:4030
+#: ../src/modules/alsa/alsa-mixer.c:4009
msgid "Analog Surround 6.1"
msgstr "模拟环绕 6.1"
-#: ../src/modules/alsa/alsa-mixer.c:4031
+#: ../src/modules/alsa/alsa-mixer.c:4010
msgid "Analog Surround 7.0"
msgstr "模拟环绕 7.0"
-#: ../src/modules/alsa/alsa-mixer.c:4032
+#: ../src/modules/alsa/alsa-mixer.c:4011
msgid "Analog Surround 7.1"
msgstr "模拟环绕 7.1"
-#: ../src/modules/alsa/alsa-mixer.c:4033
+#: ../src/modules/alsa/alsa-mixer.c:4012
msgid "Digital Stereo (IEC958)"
-msgstr "数字立体声(IEC958)"
+msgstr "数字立体声(IEC958)"
-#: ../src/modules/alsa/alsa-mixer.c:4034
+#: ../src/modules/alsa/alsa-mixer.c:4013
msgid "Digital Passthrough (IEC958)"
msgstr "数字直通(IEC958)"
-#: ../src/modules/alsa/alsa-mixer.c:4035
+#: ../src/modules/alsa/alsa-mixer.c:4014
msgid "Digital Surround 4.0 (IEC958/AC3)"
-msgstr "数字环绕 4.0(IEC958/AC3)"
+msgstr "数字环绕 4.0(IEC958/AC3)"
-#: ../src/modules/alsa/alsa-mixer.c:4036
+#: ../src/modules/alsa/alsa-mixer.c:4015
msgid "Digital Surround 5.1 (IEC958/AC3)"
-msgstr "数字环绕 5.1(IEC958/AC3)"
+msgstr "数字环绕 5.1(IEC958/AC3)"
-#: ../src/modules/alsa/alsa-mixer.c:4037
+#: ../src/modules/alsa/alsa-mixer.c:4016
msgid "Digital Surround 5.1 (IEC958/DTS)"
msgstr "数字环绕 5.1(IEC958/DTS)"
-#: ../src/modules/alsa/alsa-mixer.c:4038
+#: ../src/modules/alsa/alsa-mixer.c:4017
msgid "Digital Stereo (HDMI)"
-msgstr "数字立体声(HDMI)"
+msgstr "数字立体声(HDMI)"
-#: ../src/modules/alsa/alsa-mixer.c:4039
+#: ../src/modules/alsa/alsa-mixer.c:4018
msgid "Digital Surround 5.1 (HDMI)"
msgstr "数字环绕 5.1(HDMI)"
-#: ../src/modules/alsa/alsa-mixer.c:4170
+#: ../src/modules/alsa/alsa-mixer.c:4151
msgid "Analog Mono Duplex"
msgstr "模拟单声道双工"
-#: ../src/modules/alsa/alsa-mixer.c:4171
+#: ../src/modules/alsa/alsa-mixer.c:4152
msgid "Analog Stereo Duplex"
msgstr "模拟立体声双工"
-#: ../src/modules/alsa/alsa-mixer.c:4172
+#: ../src/modules/alsa/alsa-mixer.c:4153
msgid "Digital Stereo Duplex (IEC958)"
-msgstr "数字立体声双工(IEC958)"
+msgstr "数字立体声双工(IEC958)"
-#: ../src/modules/alsa/alsa-mixer.c:4173
+#: ../src/modules/alsa/alsa-mixer.c:4154
msgid "Multichannel Duplex"
msgstr "多声道双工"
-#: ../src/modules/alsa/alsa-mixer.c:4174
-#: ../src/modules/alsa/module-alsa-card.c:184
+#: ../src/modules/alsa/alsa-mixer.c:4155
+#: ../src/modules/alsa/module-alsa-card.c:186
#: ../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
+#: ../src/modules/alsa/alsa-mixer.c:4254
#, c-format
msgid "%s Output"
msgstr "%s 输出"
-#: ../src/modules/alsa/alsa-mixer.c:4281
+#: ../src/modules/alsa/alsa-mixer.c:4262
#, c-format
msgid "%s Input"
msgstr "%s 输入"
@@ -831,10 +832,9 @@ msgid ""
"returned 0 or another value < min_avail."
msgstr ""
"ALSA 提醒我们在该设备中写入新数据,但实际上没有什么可以写入的!\n"
-"这很可能是 ALSA 驱动程序 '%s' 中的一个 bug。请向 ALSA 开发人员报告这个问"
-"题。\n"
-"提醒我们设置 POLLOUT -- 但结果是 snd_pcm_avail() 返回 0 或者另一个小于最小可"
-"用值的数值。"
+"这很可能是 ALSA 驱动程序 %s 中的一个 bug。请向 ALSA 开发人员报告这个问题。\n"
+"提醒我们设置 POLLOUT - 但结果是 snd_pcm_avail() 返回 0 或者另一个小于最小可用"
+"值的数值。"
#: ../src/modules/alsa/alsa-source.c:529
#, c-format
@@ -863,12 +863,11 @@ msgid ""
"returned 0 or another value < min_avail."
msgstr ""
"ALSA 提醒我们从该设备中读取新数据,但实际上没有什么可以读取的!\n"
-"这很可能是 ALSA 驱动程序 '%s' 中的一个 bug。请向 ALSA 开发人员报告这个问"
-"题。\n"
-"提醒我们设置 POLLOUT -- 但结果是 snd_pcm_avail() 返回 0 或者另一个小于最小可"
-"用值的数值。"
+"这很可能是 ALSA 驱动程序 %s 中的一个 bug。请向 ALSA 开发人员报告这个问题。\n"
+"提醒我们设置 POLLIN - 但结果是 snd_pcm_avail() 返回 0 或者另一个小于最小可用"
+"值的数值。"
-#: ../src/modules/alsa/alsa-util.c:1149 ../src/modules/alsa/alsa-util.c:1224
+#: ../src/modules/alsa/alsa-util.c:1166 ../src/modules/alsa/alsa-util.c:1241
#, c-format
msgid ""
"snd_pcm_avail() returned a value that is exceptionally large: %lu bytes (%lu "
@@ -876,10 +875,10 @@ msgid ""
"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 开发者举报这个问题。"
+"snd_pcm_avail() 返回的值非常大:%lu 字节(%lu 毫秒)。\n"
+"这很可能是由 ALSA 驱动程序 %s 的缺陷导致的。请向 ALSA 开发者报告这个问题。"
-#: ../src/modules/alsa/alsa-util.c:1199
+#: ../src/modules/alsa/alsa-util.c:1216
#, c-format
msgid ""
"snd_pcm_delay() returned a value that is exceptionally large: %li bytes (%s"
@@ -887,10 +886,10 @@ msgid ""
"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 开发者举报这个问题。"
+"snd_pcm_delay() 返回的值非常大:%li 字节(%s%lu 毫秒)。\n"
+"这很可能是由 ALSA 驱动程序 %s 的缺陷导致的。请向 ALSA 开发者报告这个问题。"
-#: ../src/modules/alsa/alsa-util.c:1240
+#: ../src/modules/alsa/alsa-util.c:1257
#, c-format
msgid ""
"snd_pcm_avail_delay() returned strange values: delay %lu is less than avail "
@@ -901,7 +900,7 @@ msgstr ""
"snd_pcm_avail_delay() 返回的值非常很奇怪:延迟 %lu 小于可用 (avail) %lu。\n"
"很可能是 ALSA 驱动程序 '%s' 中的 bug。请向 ALSA 开发者举报这个问题。"
-#: ../src/modules/alsa/alsa-util.c:1283
+#: ../src/modules/alsa/alsa-util.c:1300
#, c-format
msgid ""
"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
@@ -909,8 +908,8 @@ msgid ""
"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 开发者举报这个问题。"
+"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
@@ -952,7 +951,7 @@ msgstr "电话"
#: ../src/modules/bluetooth/module-bluez5-device.c:1711
#: ../src/modules/bluetooth/module-bluez5-device.c:1749
msgid "Bluetooth Output"
-msgstr "蓝牙输出 "
+msgstr "蓝牙输出"
#: ../src/modules/bluetooth/module-bluez4-device.c:2140
#: ../src/modules/bluetooth/module-bluez5-device.c:1694
@@ -964,35 +963,35 @@ msgstr "蓝牙输入"
#: ../src/modules/bluetooth/module-bluez4-device.c:2176
msgid "High Fidelity Playback (A2DP)"
-msgstr "高保真回放(A2DP)"
+msgstr "高保真回放(A2DP)"
#: ../src/modules/bluetooth/module-bluez4-device.c:2187
msgid "High Fidelity Capture (A2DP)"
-msgstr "高保真采集(A2DP)"
+msgstr "高保真采集(A2DP)"
#: ../src/modules/bluetooth/module-bluez4-device.c:2198
msgid "Telephony Duplex (HSP/HFP)"
-msgstr "双工电话(HSP/HFP)"
+msgstr "双工电话(HSP/HFP)"
#: ../src/modules/bluetooth/module-bluez4-device.c:2210
msgid "Handsfree Gateway"
-msgstr "免持闸道"
+msgstr "蓝牙音频网关"
#: ../src/modules/bluetooth/module-bluez5-device.c:1786
msgid "High Fidelity Playback (A2DP Sink)"
-msgstr "高保真播放 (A2DP 接收器)"
+msgstr "高保真回放 (A2DP 信宿)"
#: ../src/modules/bluetooth/module-bluez5-device.c:1797
msgid "High Fidelity Capture (A2DP Source)"
-msgstr "高保真采集(A2DP 数据信源)"
+msgstr "高保真采集(A2DP 信源)"
#: ../src/modules/bluetooth/module-bluez5-device.c:1808
msgid "Headset Head Unit (HSP/HFP)"
-msgstr ""
+msgstr "头戴式耳机单元 (HSP/HFP)"
#: ../src/modules/bluetooth/module-bluez5-device.c:1820
msgid "Headset Audio Gateway (HSP/HFP)"
-msgstr ""
+msgstr "头戴式音频网关 (HSP/HFP)"
#: ../src/modules/echo-cancel/module-echo-cancel.c:61
msgid ""
@@ -1004,28 +1003,29 @@ msgid ""
"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> "
+"loaded automatically> use_volume_sharing=<yes or no> use_master_format=<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> "
+"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> use_master_format=<yes or no> "
#. add on profile
-#: ../src/modules/macosx/module-coreaudio-device.c:755
+#: ../src/modules/macosx/module-coreaudio-device.c:811
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 "总是保持至少载入一个采集器,即使它是空的"
+msgstr "总是保持至少载入一个信宿,即使它并不真实存在"
-#: ../src/modules/module-always-sink.c:83
+#: ../src/modules/module-always-sink.c:82
msgid "Dummy Output"
-msgstr "假输出"
+msgstr "伪输出"
#: ../src/modules/module-equalizer-sink.c:70
msgid "General Purpose Equalizer"
@@ -1038,17 +1038,17 @@ msgid ""
"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=<声道映射> "
+"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=<是否自动取消未使用过滤器的加载?>"
+msgstr "autoclean=<是否自动卸载未使用的滤波器?>"
#: ../src/modules/module-ladspa-sink.c:51
msgid "Virtual LADSPA sink"
-msgstr "虚拟 LDASPA 采集器"
+msgstr "虚拟 LDASPA 信宿"
#: ../src/modules/module-ladspa-sink.c:55
msgid ""
@@ -1060,16 +1060,15 @@ msgid ""
"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 连接端口名称"
-"列表> "
+"sink_name=<信宿名称> sink_properties=<信宿属性> master=<工作信宿名称> "
+"format=<样本格式> rate=<采样率> channels=<声道数> channel_map=<输入声道映射> "
+"plugin=<ladspa 插件名称> label=<ladspa 插件标签> control=<以半角逗号分隔的输"
+"入控制值列表> input_ladspaport_map=<以半角逗号分隔的输入 LADSPA 连接端口名称"
+"列表> output_ladspaport_map=<以半角逗号分隔的输出 LADSPA 连接端口名称列表> "
#: ../src/modules/module-null-sink.c:47
msgid "Clocked NULL sink"
-msgstr "定时的空采集器"
+msgstr "定时的空信宿"
#: ../src/modules/module-null-sink.c:280
msgid "Null Output"
@@ -1097,17 +1096,17 @@ msgstr "@HOSTNAME@ 中的音频"
#: ../src/modules/module-tunnel-source-new.c:305
#, c-format
msgid "Tunnel for %s@%s"
-msgstr ""
+msgstr "%s@%s 的通道"
#: ../src/modules/module-tunnel-sink-new.c:517
#: ../src/modules/module-tunnel-source-new.c:516
#, c-format
msgid "Tunnel to %s/%s"
-msgstr ""
+msgstr "到远程信宿 %s/%s 的通道"
#: ../src/modules/module-virtual-surround-sink.c:47
msgid "Virtual surround sink"
-msgstr "虚拟环绕声采集器"
+msgstr "虚拟环绕声信宿"
#: ../src/modules/module-virtual-surround-sink.c:51
msgid ""
@@ -1117,8 +1116,8 @@ msgid ""
"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=<声道映射> "
+"sink_name=<信宿名称> sink_properties=<信宿属性> master=<工作信宿名> format=<"
+"采样格式> rate=<采样率> channels=<声道数> channel_map=<声道映射> "
"use_volume_sharing=<yes 或 no> force_flat_volume=<yes 或 no> hrir=/path/to/"
"left_hrir.wav "
@@ -1132,7 +1131,7 @@ msgstr "单声道"
#: ../src/pulse/channelmap.c:105
msgid "Front Center"
-msgstr "中前"
+msgstr "正前"
#: ../src/pulse/channelmap.c:106
msgid "Front Left"
@@ -1144,7 +1143,7 @@ msgstr "右前"
#: ../src/pulse/channelmap.c:109
msgid "Rear Center"
-msgstr "中后"
+msgstr "正后"
#: ../src/pulse/channelmap.c:110
msgid "Rear Left"
@@ -1330,13 +1329,13 @@ msgstr "上左后"
msgid "Top Rear Right"
msgstr "上右后"
-#: ../src/pulse/channelmap.c:479 ../src/pulse/format.c:121
+#: ../src/pulse/channelmap.c:479 ../src/pulse/format.c:127
#: ../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 "(无效)"
+msgstr "(无效)"
#: ../src/pulse/channelmap.c:775
msgid "Stereo"
@@ -1344,7 +1343,7 @@ msgstr "立体声"
#: ../src/pulse/channelmap.c:780
msgid "Surround 4.0"
-msgstr "环绕 4.0 "
+msgstr "环绕 4.0"
#: ../src/pulse/channelmap.c:786
msgid "Surround 4.1"
@@ -1372,22 +1371,22 @@ msgstr "xcb_connection_has_error() 返回真"
#: ../src/pulse/client-conf-x11.c:94
msgid "Failed to parse cookie data"
-msgstr "cookie数据分析失败"
+msgstr "cookie 数据解析失败"
-#: ../src/pulse/context.c:656
+#: ../src/pulse/context.c:660
#, c-format
msgid "fork(): %s"
msgstr "fork():%s"
-#: ../src/pulse/context.c:711
+#: ../src/pulse/context.c:715
#, c-format
msgid "waitpid(): %s"
msgstr "waitpid():%s"
-#: ../src/pulse/context.c:1417
+#: ../src/pulse/context.c:1421
#, c-format
msgid "Received message for unknown extension '%s'"
-msgstr "收到未知扩展'%s'的信息"
+msgstr "收到未知扩展 %s 的信息"
#: ../src/pulse/direction.c:37
msgid "input"
@@ -1405,13 +1404,16 @@ msgstr "双向"
msgid "invalid"
msgstr "无效"
-#: ../src/pulsecore/core-util.c:1833
+#: ../src/pulsecore/core-util.c:1836
#, 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 ""
+"XDG_RUNTIME_DIR (%s) 不属于本进程 (uid %d),而属于 uid %d 号进程! (这可能是在"
+"原生协议下通过 root 用户连接一个非 root 用户的 PulseAudio 导致的,请不要这样"
+"做。)"
#: ../src/pulsecore/core-util.h:97
msgid "yes"
@@ -1423,26 +1425,26 @@ msgstr "否"
#: ../src/pulsecore/lock-autospawn.c:141 ../src/pulsecore/lock-autospawn.c:227
msgid "Cannot access autospawn lock."
-msgstr "不能访问 autospawn 锁。"
+msgstr "不能访问自动执行锁。"
-#: ../src/pulsecore/log.c:154
+#: ../src/pulsecore/log.c:165
#, c-format
msgid "Failed to open target file '%s'."
msgstr "打开目标文件 %s 失败。"
-#: ../src/pulsecore/log.c:177
+#: ../src/pulsecore/log.c:188
#, 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
+#: ../src/pulsecore/log.c:651
msgid "Invalid log target."
msgstr "无效的日志目标。"
#: ../src/pulsecore/sink.c:3460
msgid "Built-in Audio"
-msgstr "内部音频"
+msgstr "内置音频"
#: ../src/pulsecore/sink.c:3465
msgid "Modem"
@@ -1470,7 +1472,7 @@ msgstr "实体存在"
#: ../src/pulse/error.c:43
msgid "No such entity"
-msgstr "没有该实体"
+msgstr "无此实体"
#: ../src/pulse/error.c:44
msgid "Connection refused"
@@ -1498,7 +1500,7 @@ msgstr "连接终止"
#: ../src/pulse/error.c:50
msgid "Entity killed"
-msgstr "实体已杀死"
+msgstr "实体已被杀死"
#: ../src/pulse/error.c:51
msgid "Invalid server"
@@ -1510,11 +1512,11 @@ msgstr "模块初始化失败"
#: ../src/pulse/error.c:53
msgid "Bad state"
-msgstr "坏状态"
+msgstr "错误状态"
#: ../src/pulse/error.c:54
msgid "No data"
-msgstr "没有数据"
+msgstr "无数据"
#: ../src/pulse/error.c:55
msgid "Incompatible protocol version"
@@ -1538,11 +1540,11 @@ msgstr "没有该扩展"
#: ../src/pulse/error.c:60
msgid "Obsolete functionality"
-msgstr "废弃的功能性"
+msgstr "废弃的功能"
#: ../src/pulse/error.c:61
msgid "Missing implementation"
-msgstr "缺少部署"
+msgstr "缺少实现"
#: ../src/pulse/error.c:62
msgid "Client forked"
@@ -1581,60 +1583,6 @@ msgstr "%0.1f KiB"
msgid "%u B"
msgstr "%u B"
-#: ../src/tests/resampler-test.c:255
-#, 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"
-"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/tests/resampler-test.c:353
-#, c-format
-msgid "%s %s\n"
-msgstr "%s %s\n"
-
#: ../src/utils/pacat.c:117
#, c-format
msgid "Failed to drain stream: %s"
@@ -1656,41 +1604,41 @@ msgstr "pa_stream_drain(): %s"
#: ../src/utils/pacat.c:169
#, c-format
msgid "pa_stream_write() failed: %s"
-msgstr "pa_stream_write() 失败: %s"
+msgstr "pa_stream_write() 失败:%s"
#: ../src/utils/pacat.c:210
#, c-format
msgid "pa_stream_begin_write() failed: %s"
-msgstr "pa_stream_begin_write() 失败: %s"
+msgstr "pa_stream_begin_write() 失败:%s"
#: ../src/utils/pacat.c:260 ../src/utils/pacat.c:290
#, c-format
msgid "pa_stream_peek() failed: %s"
-msgstr "pa_stream_peek() 失败: %s"
+msgstr "pa_stream_peek() 失败:%s"
#: ../src/utils/pacat.c:340
msgid "Stream successfully created."
-msgstr "流创建成功。"
+msgstr "成功创建流。"
#: ../src/utils/pacat.c:343
#, c-format
msgid "pa_stream_get_buffer_attr() failed: %s"
-msgstr "pa_stream_get_buffer_attr() 失败: %s"
+msgstr "pa_stream_get_buffer_attr() 失败:%s"
#: ../src/utils/pacat.c:347
#, c-format
msgid "Buffer metrics: maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
-msgstr "缓冲矩阵:maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
+msgstr "缓冲量度:maxlength=%u, tlength=%u, prebuf=%u, minreq=%u"
#: ../src/utils/pacat.c:350
#, c-format
msgid "Buffer metrics: maxlength=%u, fragsize=%u"
-msgstr "缓冲矩阵:maxlength=%u, fragsize=%u"
+msgstr "缓冲量度:maxlength=%u, fragsize=%u"
#: ../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:358
#, c-format
@@ -1730,11 +1678,11 @@ msgstr "流已启动。%s"
#: ../src/utils/pacat.c:409
#, c-format
msgid "Stream moved to device %s (%u, %ssuspended).%s"
-msgstr "流移至设备 %s (%u,%s 挂起)。%s"
+msgstr "流移至设备 %s (%u,%s 挂起)。%s"
#: ../src/utils/pacat.c:409
msgid "not "
-msgstr "not "
+msgstr "非 "
#: ../src/utils/pacat.c:416
#, c-format
@@ -1756,17 +1704,17 @@ msgstr "警告:收到比抑制请求更多的反抑制请求!"
#: ../src/utils/pacat.c:466
#, c-format
msgid "Connection established.%s"
-msgstr "连接已建立。%s "
+msgstr "连接已建立。%s"
#: ../src/utils/pacat.c:469
#, c-format
msgid "pa_stream_new() failed: %s"
-msgstr "pa_stream_new() 失败: %s"
+msgstr "pa_stream_new() 失败:%s"
#: ../src/utils/pacat.c:507
#, c-format
msgid "pa_stream_connect_playback() failed: %s"
-msgstr "pa_stream_connect_playback() 失败: %s"
+msgstr "pa_stream_connect_playback() 失败:%s"
#: ../src/utils/pacat.c:513
#, c-format
@@ -1776,7 +1724,7 @@ msgstr "设置监视器流失败: %s"
#: ../src/utils/pacat.c:517
#, c-format
msgid "pa_stream_connect_record() failed: %s"
-msgstr "pa_stream_connect_record() 失败: %s"
+msgstr "pa_stream_connect_record() 失败:%s"
#: ../src/utils/pacat.c:530 ../src/utils/pactl.c:1446
#, c-format
@@ -1785,16 +1733,16 @@ msgstr "连接失败:%s"
#: ../src/utils/pacat.c:563
msgid "Got EOF."
-msgstr "获得 EOF。"
+msgstr "到达 EOF。"
#: ../src/utils/pacat.c:600
#, c-format
msgid "write() failed: %s"
-msgstr "写入()失败:%s"
+msgstr "write() 失败:%s"
#: ../src/utils/pacat.c:621
msgid "Got signal, exiting."
-msgstr "收到信号,正在退出。"
+msgstr "收到信号,退出。"
#: ../src/utils/pacat.c:635
#, c-format
@@ -1809,7 +1757,7 @@ msgstr "时间:%0.3f 秒;延迟:%0.0f 微秒。"
#: ../src/utils/pacat.c:661
#, c-format
msgid "pa_stream_update_timing_info() failed: %s"
-msgstr "pa_stream_update_timing_info() 失败: %s"
+msgstr "pa_stream_update_timing_info() 失败:%s"
#: ../src/utils/pacat.c:671
#, c-format
@@ -1889,7 +1837,7 @@ msgstr ""
" -v, --verbose 启用详述操作\n"
"\n"
" -s, --server=服务器 要连接的服务器名\n"
-" -d, --device=设备名 要连接的采集器/信源名称\n"
+" -d, --device=设备名 要连接的信宿/信源名称\n"
" -n, --client-name=名称 如何在服务器中调用此客户端\n"
" --stream-name=名称 如何在服务器中调用这个流\n"
" --volume=音量 指定初始(线性)音量,取值在0...65536之"
@@ -1901,9 +1849,9 @@ msgstr ""
"(默认为 s16ne)\n"
" --channels=CHANNELS 通道数,1为单声道,2为立体声(默认为2)\n"
" --channel-map=CHANNELMAP 取代默认值的通道映射表\n"
-" --fix-format 从流连接的采集器中提取采样格式。\n"
-" --fix-rate 从流连接的采集器中提取采样率。\n"
-" --fix-channels 从流连接的采集器中提取通道数和通道映射"
+" --fix-format 从流连接的信宿中提取采样格式。\n"
+" --fix-rate 从流连接的信宿中提取采样率。\n"
+" --fix-channels 从流连接的信宿中提取通道数和通道映射"
"表。\n"
" --no-remix 不要对通道进行 upmix 或者 downmix 操"
"作。\n"
@@ -1913,24 +1861,24 @@ msgstr ""
#: ../src/utils/pacat.c:788
msgid "Play back encoded audio files on a PulseAudio sound server."
-msgstr ""
+msgstr "在 PulseAudio 声音服务器回放音频编码文件。"
#: ../src/utils/pacat.c:792
msgid ""
"Capture audio data from a PulseAudio sound server and write it to a file."
-msgstr ""
+msgstr "从 PulseAudio 声音服务器获取音频数据并写入文件。"
#: ../src/utils/pacat.c:796
msgid ""
"Capture audio data from a PulseAudio sound server and write it to STDOUT or "
"the specified file."
-msgstr ""
+msgstr "从 PulseAudio 声音服务器获取音频数据并写入 STDOUT 或指定的文件。"
#: ../src/utils/pacat.c:800
msgid ""
"Play back audio data from STDIN or the specified file on a PulseAudio sound "
"server."
-msgstr ""
+msgstr "在 PulseAudio 声音服务器回放 STDIN 或指定文件中的音频数据。"
#: ../src/utils/pacat.c:814
#, c-format
@@ -1940,38 +1888,38 @@ msgid ""
"Linked with libpulse %s\n"
msgstr ""
"pacat %s\n"
-"编译到 libpulse %s\n"
-"链接到 libpulse %s\n"
+"使用 libpulse %s 编译\n"
+"与 libpulse %s 链接\n"
#: ../src/utils/pacat.c:847 ../src/utils/pactl.c:1648
#, c-format
msgid "Invalid client name '%s'"
-msgstr "无效客户端名称 '%s'"
+msgstr "无效的客户端名称 '%s'"
#: ../src/utils/pacat.c:862
#, c-format
msgid "Invalid stream name '%s'"
-msgstr "无效流名称 '%s'"
+msgstr "无效的流名称 '%s'"
#: ../src/utils/pacat.c:899
#, c-format
msgid "Invalid channel map '%s'"
-msgstr "无效通道映射 '%s'"
+msgstr "无效的通道映射 '%s'"
#: ../src/utils/pacat.c:928 ../src/utils/pacat.c:942
#, c-format
msgid "Invalid latency specification '%s'"
-msgstr "无效延迟说明 %s'"
+msgstr "无效的延迟规格 %s'"
#: ../src/utils/pacat.c:935 ../src/utils/pacat.c:949
#, c-format
msgid "Invalid process time specification '%s'"
-msgstr "无效处理时间说明 '%s'"
+msgstr "无效的处理时间规格 '%s'"
#: ../src/utils/pacat.c:961
#, c-format
msgid "Invalid property '%s'"
-msgstr "无效属性 '%s'"
+msgstr "无效的属性 %s"
#: ../src/utils/pacat.c:980
#, c-format
@@ -1984,17 +1932,17 @@ msgstr "--monitor-stream 的参数解析失败"
#: ../src/utils/pacat.c:1006
msgid "Invalid sample specification"
-msgstr "无效采样说明"
+msgstr "无效的采样规格"
#: ../src/utils/pacat.c:1016
#, c-format
msgid "open(): %s"
-msgstr "open(): %s"
+msgstr "open():%s"
#: ../src/utils/pacat.c:1021
#, c-format
msgid "dup2(): %s"
-msgstr "dup2(): %s"
+msgstr "dup2():%s"
#: ../src/utils/pacat.c:1028
msgid "Too many arguments."
@@ -2002,7 +1950,7 @@ msgstr "参数过多。"
#: ../src/utils/pacat.c:1039
msgid "Failed to generate sample specification for file."
-msgstr "为文件获取采样说明失败。"
+msgstr "为文件生成采样规格失败。"
#: ../src/utils/pacat.c:1065
msgid "Failed to open audio file."
@@ -2012,11 +1960,11 @@ msgstr "打开声音文件失败。"
msgid ""
"Warning: specified sample specification will be overwritten with "
"specification from file."
-msgstr "警告:指定的采样说明将覆盖文件中的说明。"
+msgstr "警告:指定的采样规格将覆盖文件中的说明。"
#: ../src/utils/pacat.c:1074 ../src/utils/pactl.c:1712
msgid "Failed to determine sample specification from file."
-msgstr "从文件中确定采样说明失败。"
+msgstr "从文件中确定采样规格失败。"
#: ../src/utils/pacat.c:1083
msgid "Warning: Failed to determine channel map from file."
@@ -2024,7 +1972,7 @@ msgstr "警告:从文件中确定通道映射失败。"
#: ../src/utils/pacat.c:1094
msgid "Channel map doesn't match sample specification"
-msgstr "通道映射与采样说明不匹配"
+msgstr "通道映射与采样规格不匹配"
#: ../src/utils/pacat.c:1105
msgid "Warning: failed to write channel map to file."
@@ -2034,7 +1982,7 @@ msgstr "警告:在文件中写入通道映射失败。"
#, c-format
msgid ""
"Opening a %s stream with sample specification '%s' and channel map '%s'."
-msgstr "使用采样说明 '%s' 和通道映射 '%s' 打开 %s 流。"
+msgstr "使用采样规格 %s 和通道映射 %s 打开 %s 流。"
#: ../src/utils/pacat.c:1121
msgid "recording"
@@ -2116,7 +2064,7 @@ msgstr "#N"
#: ../src/utils/pacmd.c:62
msgid "NAME SINK|#N"
-msgstr "名称 采集器|#N"
+msgstr "名称 信宿|#N"
#: ../src/utils/pacmd.c:64 ../src/utils/pacmd.c:65
msgid "NAME FILENAME"
@@ -2128,11 +2076,11 @@ msgstr "路径名"
#: ../src/utils/pacmd.c:67
msgid "FILENAME SINK|#N"
-msgstr "文件名 采集器|#N"
+msgstr "文件名 信宿|#N"
#: ../src/utils/pacmd.c:69 ../src/utils/pactl.c:1572
msgid "#N SINK|SOURCE"
-msgstr "#N 采集器|信号源"
+msgstr "#N 信宿|信号源"
#: ../src/utils/pacmd.c:71 ../src/utils/pacmd.c:77 ../src/utils/pacmd.c:78
msgid "1|0"
@@ -2156,11 +2104,11 @@ msgstr "目标"
#: ../src/utils/pacmd.c:76
msgid "NUMERIC-LEVEL"
-msgstr ""
+msgstr "级别 (数字)"
#: ../src/utils/pacmd.c:79
msgid "FRAMES"
-msgstr ""
+msgstr "FRAMES"
#: ../src/utils/pacmd.c:81
#, c-format
@@ -2183,8 +2131,8 @@ msgid ""
"Linked with libpulse %s\n"
msgstr ""
"pacmd %s\n"
-"编译到 libpulse %s\n"
-"链接到 libpulse %s\n"
+"使用 libpulse %s 编译\n"
+"与 libpulse %s 链接\n"
#: ../src/utils/pacmd.c:142
msgid "No PulseAudio daemon running, or not running as session daemon."
@@ -2202,11 +2150,11 @@ msgstr "connect():%s"
#: ../src/utils/pacmd.c:172
msgid "Failed to kill PulseAudio daemon."
-msgstr "杀死PulseAudio后台程序失败。"
+msgstr "杀死 PulseAudio 守护程序失败。"
#: ../src/utils/pacmd.c:180
msgid "Daemon not responding."
-msgstr "后台程序未响应。"
+msgstr "守护进程未响应"
#: ../src/utils/pacmd.c:212 ../src/utils/pacmd.c:321 ../src/utils/pacmd.c:339
#, c-format
@@ -2216,7 +2164,7 @@ msgstr "write():%s"
#: ../src/utils/pacmd.c:268
#, c-format
msgid "poll(): %s"
-msgstr "poll(): %s"
+msgstr "poll():%s"
#: ../src/utils/pacmd.c:279 ../src/utils/pacmd.c:299
#, c-format
@@ -2231,12 +2179,12 @@ msgstr "获取统计数据失败:%s"
#: ../src/utils/pactl.c:170
#, c-format
msgid "Currently in use: %u blocks containing %s bytes total.\n"
-msgstr "当前使用:%u块,总共%s字节。\n"
+msgstr "当前使用:%u 块,总共 %s 字节。\n"
#: ../src/utils/pactl.c:173
#, c-format
msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
-msgstr "整个生命周期所得分配:%u块,总共%s字节。\n"
+msgstr "整个生命周期所得分配:%u 块,总共 %s 字节。\n"
#: ../src/utils/pactl.c:176
#, c-format
@@ -2314,7 +2262,7 @@ msgid ""
"\tProperties:\n"
"\t\t%s\n"
msgstr ""
-"采集器 #%u\n"
+"信宿 #%u\n"
"\t状态:%s\n"
"\t名称:%s\n"
"\t描述:%s\n"
@@ -2328,19 +2276,19 @@ msgstr ""
"\t基础音量:%s\n"
"\t监视器信源:%s\n"
"\t延迟:%0.0f 微秒,设置为 %0.0f 微秒\n"
-"\t旗标:%s%s%s%s%s%s%s\n"
+"\t标记:%s%s%s%s%s%s%s\n"
"\t属性:\n"
"\t\t%s\n"
#: ../src/utils/pactl.c:325 ../src/utils/pactl.c:431 ../src/utils/pactl.c:592
#, c-format
msgid "\tPorts:\n"
-msgstr "\t连接端口:\n"
+msgstr "\t端口:\n"
#: ../src/utils/pactl.c:332 ../src/utils/pactl.c:438
#, c-format
msgid "\tActive Port: %s\n"
-msgstr "\t使用中连接端口:%s\n"
+msgstr "\t活动端口:%s\n"
#: ../src/utils/pactl.c:338 ../src/utils/pactl.c:444
#, c-format
@@ -2385,9 +2333,9 @@ msgstr ""
"\t音量:%s\n"
"\t 平衡 %0.2f\n"
"\t基础音量:%s\n"
-"\t采集器的监视器:%s\n"
+"\t信宿的监视器:%s\n"
"\t延迟:%0.0f 微秒,已设置 %0.0f 微秒\n"
-"\t旗标:%s%s%s%s%s%s\n"
+"\t标记:%s%s%s%s%s%s\n"
"\t属性:\n"
"\t\t%s\n"
@@ -2414,11 +2362,11 @@ msgid ""
"\tProperties:\n"
"\t\t%s\n"
msgstr ""
-"Module #%u\n"
+"模块 #%u\n"
"\t名称:%s\n"
"\t参数:%s\n"
-"\t用量计数器:%s\n"
-"\t属性:\n"
+"\t使用计数:%s\n"
+"\t属性\n"
"\t\t%s\n"
#: ../src/utils/pactl.c:497
@@ -2435,9 +2383,9 @@ msgid ""
"\tProperties:\n"
"\t\t%s\n"
msgstr ""
-"Client #%u\n"
-"\t驱动程序:%s\n"
-"\t用户模块:%s\n"
+"客户端 #%u\n"
+"\t驱动:%s\n"
+"\t拥有者模块:%s\n"
"\t属性:\n"
"\t\t%s\n"
@@ -2456,27 +2404,27 @@ msgid ""
"\tProperties:\n"
"\t\t%s\n"
msgstr ""
-"Card #%u\n"
+"卡 #%u\n"
"\t名称:%s\n"
-"\t驱动程序:%s\n"
-"\t用户模块:%s\n"
+"\t驱动:%s\n"
+"\t拥有者模块:%s\n"
"\t属性:\n"
"\t\t%s\n"
#: ../src/utils/pactl.c:579
#, c-format
msgid "\tProfiles:\n"
-msgstr "\t个人设置档:\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 ""
+msgstr "\t\t%s: %s (信宿:%u,信源:%u,优先级:%u,可用性:%s)\n"
#: ../src/utils/pactl.c:586
#, c-format
msgid "\tActive Profile: %s\n"
-msgstr "\t启用的个人设置档:%s\n"
+msgstr "\t活动配置:%s\n"
#: ../src/utils/pactl.c:600
#, c-format
@@ -2490,12 +2438,12 @@ msgstr ""
#: ../src/utils/pactl.c:605
#, c-format
msgid "\t\t\tPart of profile(s): %s"
-msgstr ""
+msgstr "\t\t\t属于配置文件:%s"
#: ../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"
+msgstr "获取音频信宿输入信息失败:%s"
#: ../src/utils/pactl.c:651
#, c-format
@@ -2518,28 +2466,28 @@ msgid ""
"\tProperties:\n"
"\t\t%s\n"
msgstr ""
-"信源输入 #%u\n"
+"信宿输入 #%u\n"
"\t驱动程序:%s\n"
"\t所有者模块:%s\n"
"\t客户端:%s\n"
-"\tSink:%u\n"
+"\t信宿:%u\n"
"\t采样规格:%s\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缓冲延迟:%0.0f 微秒\n"
+"\t信宿延迟:%0.0f 微秒\n"
+"\t重采样方法:%s\n"
"\t属性:\n"
"\t\t%s\n"
#: ../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"
+msgstr "获取音频信源输出信息失败:%s"
#: ../src/utils/pactl.c:721
#, c-format
@@ -2570,13 +2518,13 @@ msgstr ""
"\t采样规格:%s\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缓冲延迟:%0.0f 微秒\n"
+"\t信源延迟:%0.0f 微秒\n"
+"\t重采样方法:%s\n"
"\t属性:\n"
"\t\t%s\n"
@@ -2663,31 +2611,31 @@ msgstr "未知"
#: ../src/utils/pactl.c:1147
msgid "sink"
-msgstr "sink"
+msgstr "信宿"
#: ../src/utils/pactl.c:1150
msgid "source"
-msgstr "source"
+msgstr "信源"
#: ../src/utils/pactl.c:1153
msgid "sink-input"
-msgstr "sink-input"
+msgstr "信宿-输入"
#: ../src/utils/pactl.c:1156
msgid "source-output"
-msgstr "source-output"
+msgstr "信源-输出"
#: ../src/utils/pactl.c:1159
msgid "module"
-msgstr "module"
+msgstr "模块"
#: ../src/utils/pactl.c:1162
msgid "client"
-msgstr "client"
+msgstr "客户端"
#: ../src/utils/pactl.c:1165
msgid "sample-cache"
-msgstr "sample-cache"
+msgstr "采样-缓冲"
#: ../src/utils/pactl.c:1168
msgid "server"
@@ -2704,11 +2652,11 @@ msgstr "事件“%s”于 %s #%u\n"
#: ../src/utils/pactl.c:1452
msgid "Got SIGINT, exiting."
-msgstr "收到 SIGINT,正在退出。"
+msgstr "收到 SIGINT 信号,退出。"
#: ../src/utils/pactl.c:1485
msgid "Invalid volume specification"
-msgstr "无效采样说明"
+msgstr "无效采样规格"
#: ../src/utils/pactl.c:1508
msgid "Volume outside permissible range.\n"
@@ -2746,7 +2694,7 @@ msgstr "文件名 [名称]"
#: ../src/utils/pactl.c:1568
msgid "NAME [SINK]"
-msgstr "名称 [采集器]"
+msgstr "名称 [信宿]"
#: ../src/utils/pactl.c:1577
msgid "NAME|#N VOLUME [VOLUME ...]"
@@ -2777,7 +2725,7 @@ msgid ""
msgstr ""
"\n"
"指定名称 @DEFAULT_SINK@,@DEFAULT_SOURCE@ 和 @DEFAULT_MONITOR@\n"
-"可用于指定默认的采集器、信源和监视器。\n"
+"可用于指定默认的信宿、信源和监视器。\n"
#: ../src/utils/pactl.c:1587
#, c-format
@@ -2805,13 +2753,13 @@ msgid ""
"Linked with libpulse %s\n"
msgstr ""
"pactl %s\n"
-"编译到 libpulse %s\n"
-"链接到 libpulse %s\n"
+"使用 libpulse %s 编译\n"
+"与 libpules %s 链接\n"
#: ../src/utils/pactl.c:1684
#, c-format
msgid "Specify nothing, or one of: %s"
-msgstr "不需指定,或指定成下列之一:%s"
+msgstr "不指定,或指定成下列之一:%s"
#: ../src/utils/pactl.c:1694
msgid "Please specify a sample file to load"
@@ -2823,7 +2771,7 @@ msgstr "打开声音文件失败。"
#: ../src/utils/pactl.c:1719
msgid "Warning: Failed to determine sample specification from file."
-msgstr "警告:从文件中确定采样说明失败。"
+msgstr "警告:从文件中确定采样规格失败。"
#: ../src/utils/pactl.c:1729
msgid "You have to specify a sample name to play"
@@ -2835,7 +2783,7 @@ msgstr "您必须指定要删除的采样名"
#: ../src/utils/pactl.c:1750
msgid "You have to specify a sink input index and a sink"
-msgstr "您必须指定采集器输入索引和采集器"
+msgstr "您必须指定信宿输入索引和信宿"
#: ../src/utils/pactl.c:1760
msgid "You have to specify a source output index and a source"
@@ -2852,7 +2800,7 @@ msgstr "必须指定模块索引或名称"
#: ../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."
@@ -2870,7 +2818,7 @@ msgstr "您必须指定声卡名称/索引和侧写名称"
#: ../src/utils/pactl.c:1856
msgid "You have to specify a sink name/index and a port name"
-msgstr "您必须指定采集器名称/索引和端口名称"
+msgstr "您必须指定信宿名称/索引和端口名称"
#: ../src/utils/pactl.c:1867
msgid "You have to specify a sink name"
@@ -2886,19 +2834,19 @@ msgstr "必须指定信号源索引"
#: ../src/utils/pactl.c:1898
msgid "You have to specify a sink name/index and a volume"
-msgstr "您必须指定采集器名称/索引和音量"
+msgstr "您必须指定信宿名称/索引和音量"
#: ../src/utils/pactl.c:1911
msgid "You have to specify a source name/index and a volume"
-msgstr "您必须指定信源名称/索引和音量"
+msgstr "您必须指定源名称/索引和音量"
#: ../src/utils/pactl.c:1924
msgid "You have to specify a sink input index and a volume"
-msgstr "您必须指定采集器输入索引和音量"
+msgstr "您必须指定信宿输入索引和音量"
#: ../src/utils/pactl.c:1929
msgid "Invalid sink input index"
-msgstr "无效采集器输入索引"
+msgstr "无效信宿输入索引"
#: ../src/utils/pactl.c:1940
msgid "You have to specify a source output index and a volume"
@@ -2911,7 +2859,7 @@ 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' 切换)"
+msgstr "您必须指定信宿名称/索引和静音动作 (0, 1, 或 'toggle' 切换)"
#: ../src/utils/pactl.c:1961 ../src/utils/pactl.c:1976
#: ../src/utils/pactl.c:1996 ../src/utils/pactl.c:2014
@@ -2926,11 +2874,11 @@ msgstr "您必须指定信源名称/索引和静音动作 (0, 1, 或 'toggle'
#: ../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' 切换)"
+msgstr "您必须指定信宿输入索引和静音动作 (0, 1, 或 'toggle' 切换)"
#: ../src/utils/pactl.c:1991
msgid "Invalid sink input index specification"
-msgstr "无效采集器输入索引说明"
+msgstr "无效信宿输入索引规格"
#: ../src/utils/pactl.c:2004
msgid ""
@@ -2946,7 +2894,7 @@ msgstr "无效信源输出索引说明"
msgid ""
"You have to specify a sink index and a semicolon-separated list of supported "
"formats"
-msgstr "您必须指定采集器名称及以英文分号分隔的其所支持格式的列表"
+msgstr "您必须指定信宿名称及以英文分号分隔的其所支持格式的列表"
#: ../src/utils/pactl.c:2038
msgid "You have to specify a card name/index, a port name and a latency offset"
@@ -2993,7 +2941,7 @@ msgstr "连接失败:%s\n"
#: ../src/utils/pasuspender.c:201
#, c-format
msgid "Got SIGINT, exiting.\n"
-msgstr "收到SIGINT,正在退出。\n"
+msgstr "收到 SIGINT 信号,退出。\n"
#: ../src/utils/pasuspender.c:219
#, c-format
@@ -3015,7 +2963,7 @@ msgstr ""
"\n"
" -h, --help 显示此帮助\n"
" --version 显示版本\n"
-" -s, --server=服务器 要连接的服务器名\n"
+" -s, --server=SERVER 要连接的服务器名\n"
"\n"
#: ../src/utils/pasuspender.c:266
@@ -3026,8 +2974,8 @@ msgid ""
"Linked with libpulse %s\n"
msgstr ""
"pasuspender %s\n"
-"编译到 libpulse %s\n"
-"链接到 libpulse %s\n"
+"使用 libpulse %s 编译\n"
+"与 libpulse %s 链接\n"
#: ../src/utils/pasuspender.c:295
#, c-format
@@ -3055,17 +3003,17 @@ msgid ""
"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"
+"%s [-D 显示] [-S 服务器] [-O 信宿] [-I 信源] [-c 文件] [-d|-e|-i|-r]\n"
"\n"
-" -d 显示与 X11 显示器关联的当前 PulseAudio 数据(默认)\n"
+" -d 显示与 X11 显示关联的当前 PulseAudio 数据(默认)\n"
" -e 将本地 PulseAudio 数据导出至 X11 显示器\n"
" -i 将 PulseAudio 数据由 X11 显示器导入至本地环境变量和 cookie 文件。\n"
-" -r 从 X11 显示器清除 PulseAudio 数据\n"
+" -r 从 X11 显示中清除 PulseAudio 数据\n"
#: ../src/utils/pax11publish.c:91
#, c-format
msgid "Failed to parse command line.\n"
-msgstr "分析命令行失败。\n"
+msgstr "解析命令行失败。\n"
#: ../src/utils/pax11publish.c:110
#, c-format
@@ -3075,12 +3023,12 @@ msgstr "服务器:%s\n"
#: ../src/utils/pax11publish.c:112
#, c-format
msgid "Source: %s\n"
-msgstr "音频入口:%s\n"
+msgstr "信源:%s\n"
#: ../src/utils/pax11publish.c:114
#, c-format
msgid "Sink: %s\n"
-msgstr "音频出口:%s\n"
+msgstr "信宿:%s\n"
#: ../src/utils/pax11publish.c:116
#, c-format
@@ -3090,263 +3038,80 @@ msgstr "Cookie:%s\n"
#: ../src/utils/pax11publish.c:134
#, c-format
msgid "Failed to parse cookie data\n"
-msgstr "分析cookie数据失败\n"
+msgstr "解析 cookie 数据失败\n"
#: ../src/utils/pax11publish.c:139
#, c-format
msgid "Failed to save cookie data\n"
-msgstr "保存cookie数据失败\n"
+msgstr "保存 cookie 数据失败\n"
#: ../src/utils/pax11publish.c:168
#, c-format
msgid "Failed to get FQDN.\n"
-msgstr "获取FQDN失败。\n"
+msgstr "获取 FQDN 失败。\n"
#: ../src/utils/pax11publish.c:188
#, c-format
msgid "Failed to load cookie data\n"
-msgstr "加载cookie数据失败\n"
+msgstr "加载 cookie 数据失败\n"
#: ../src/utils/pax11publish.c:206
#, c-format
msgid "Not yet implemented.\n"
msgstr "尚未实现。\n"
-#~ msgid "Got signal %s."
-#~ msgstr "获得信号%s"
-
-#~ msgid "Exiting."
-#~ msgstr "退出"
-
-#~ msgid "Found user '%s' (UID %lu) and group '%s' (GID %lu)."
-#~ msgstr "发现用户'%s' (UID %lu)和组'%s' (GID %lu)."
-
-#~ msgid "Successfully dropped root privileges."
-#~ msgstr "成功放弃root权限。"
-
-#~ msgid "setrlimit(%s, (%u, %u)) failed: %s"
-#~ msgstr "setrlimit(%s, (%u, %u)) 失败:%s"
-
-#~ msgid "Daemon not running"
-#~ msgstr "后台程序没有运行"
-
-#~ msgid "Daemon running as PID %u"
-#~ msgstr "后台程序正在运行,PID %u"
-
-#~ msgid "Daemon startup successful."
-#~ msgstr "后台程序启动成功。"
-
-#~ msgid "This is PulseAudio %s"
-#~ msgstr "这是 PulseAudio %s"
-
-#~ msgid "Compilation host: %s"
-#~ msgstr "编译主机:%s"
-
-#~ msgid "Compilation CFLAGS: %s"
-#~ msgstr "编译CFLAGS:%s"
-
-#~ msgid "Running on host: %s"
-#~ msgstr "正在主机上运行:%s"
-
-#~ msgid "Found %u CPUs."
-#~ msgstr "找到 %u CPU。"
-
-#~ msgid "Page size is %lu bytes"
-#~ msgstr "页面大小为%lu字节"
-
-#~ msgid "Compiled with Valgrind support: yes"
-#~ msgstr "编译启用Valgrind支持:是"
-
-#~ msgid "Compiled with Valgrind support: no"
-#~ msgstr "编译启用Valgrind支持:否"
-
-#~ msgid "Running in valgrind mode: %s"
-#~ msgstr "正在以valgrind模式运行:%s"
-
-#, fuzzy
-#~ msgid "Running in VM: %s"
-#~ msgstr "正在主机上运行:%s"
-
-#~ msgid "Optimized build: yes"
-#~ msgstr "优化生成:是"
-
-#~ msgid "Optimized build: no"
-#~ msgstr "优化生成:否"
-
-#~ msgid "NDEBUG defined, all asserts disabled."
-#~ msgstr "拒绝 NDEBUG,禁用所有 assert"
-
-#~ msgid "FASTPATH defined, only fast path asserts disabled."
-#~ msgstr "拒绝 FASTPATH,只禁用快速路径 assert。"
-
-#~ msgid "All asserts enabled."
-#~ msgstr "启用所有 assert。"
-
-#~ msgid "Machine ID is %s."
-#~ msgstr "machine ID是%s。"
-
-#~ msgid "Session ID is %s."
-#~ msgstr "会话 ID %s。"
-
-#~ msgid "Using runtime directory %s."
-#~ msgstr "正在使用运行时文件夹%s。"
-
-#~ msgid "Using state directory %s."
-#~ msgstr "正在使用状态文件夹%s。"
-
-#~ msgid "Using modules directory %s."
-#~ msgstr "正在使用模块目录 %s。"
-
-#~ msgid "Running in system mode: %s"
-#~ msgstr "正在以系统模式运行:%s"
-
-#~ msgid "Fresh high-resolution timers available! Bon appetit!"
-#~ msgstr "新鲜的高分辨率计时器开锅了!吃个饱!"
+#~ msgid "wants to record audio."
+#~ msgstr "试图录制音频。"
#~ msgid ""
-#~ "Dude, your kernel stinks! The chef's recommendation today is Linux with "
-#~ "high-resolution timers enabled!"
-#~ msgstr "老兄,您的内核真臭!现在流行的是启用了高分辩率计分器的Linux!"
-
-#~ msgid "Daemon startup complete."
-#~ msgstr "后台程序启动完成。"
-
-#~ msgid "Daemon shutdown initiated."
-#~ msgstr "开始关闭后台程序。"
-
-#~ msgid "Daemon terminated."
-#~ msgstr "后台程序已终止。"
-
-#~ msgid "Cleaning up privileges."
-#~ msgstr "取消特权。"
-
-#, fuzzy
-#~ msgid "PulseAudio Sound System KDE Routing Policy"
-#~ msgstr "PulseAudio 声音系统"
-
-#, fuzzy
-#~ msgid "Start the PulseAudio Sound System with KDE Routing Policy"
-#~ msgstr "启动 PulseAudio 声音系统"
-
-#~ msgid "No cookie loaded. Attempting to connect without."
-#~ msgstr "没有加载cookie。尝试不加载cookie进行连接。"
-
-#~ msgid "Failed to load client configuration file.\n"
-#~ msgstr "加载客户端配置文件失败。\n"
-
-#~ msgid "Failed to read environment configuration data.\n"
-#~ msgstr "读取环境配置数据失败。\n"
-
-#~ 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)"
-
-#~ msgid "XOpenDisplay() failed"
-#~ msgstr "XOpenDisplay()失败"
-
-#~ 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 "低频脉冲"
-
-#~ msgid "Successfully changed user to \""
-#~ msgstr "成功变更用户为 \""
-
-#~ msgid "[%s:%u] rlimit not supported on this platform."
-#~ msgstr "[%s:%u] 此平台不支持rlimit。"
-
-#~ 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"
-#~ "\tBuffer Latency: %0.0f usec\n"
-#~ "\tSource Latency: %0.0f usec\n"
-#~ "\tResample method: %s\n"
-#~ "\tProperties:\n"
-#~ "\t\t%s\n"
-#~ msgstr ""
-#~ "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"
-#~ "\tBuffer Latency: %0.0f usec\n"
-#~ "\tSource Latency: %0.0f usec\n"
-#~ "\tResample method: %s\n"
-#~ "\tProperties:\n"
-#~ "\t\t%s\n"
-
-#, fuzzy
-#~ msgid ""
-#~ "%s [options] stat\n"
-#~ "%s [options] list\n"
-#~ "%s [options] exit\n"
-#~ "%s [options] upload-sample FILENAME [NAME]\n"
-#~ "%s [options] play-sample NAME [SINK]\n"
-#~ "%s [options] remove-sample NAME\n"
-#~ "%s [options] move-sink-input SINKINPUT SINK\n"
-#~ "%s [options] move-source-output SOURCEOUTPUT SOURCE\n"
-#~ "%s [options] load-module NAME [ARGS ...]\n"
-#~ "%s [options] unload-module MODULE\n"
-#~ "%s [options] suspend-sink SINK 1|0\n"
-#~ "%s [options] suspend-source SOURCE 1|0\n"
-#~ "%s [options] set-card-profile CARD PROFILE\n"
-#~ "%s [options] set-sink-port SINK PORT\n"
-#~ "%s [options] set-source-port SOURCE PORT\n"
-#~ "%s [options] set-sink-volume SINK VOLUME\n"
-#~ "%s [options] set-source-volume SOURCE VOLUME\n"
-#~ "%s [options] set-sink-input-volume SINKINPUT VOLUME\n"
-#~ "%s [options] set-sink-mute SINK 1|0\n"
-#~ "%s [options] set-source-mute SOURCE 1|0\n"
-#~ "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
-#~ "%s [options] subscribe\n"
+#~ "%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"
-#~ " -h, --help Show this help\n"
-#~ " --version Show version\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"
-#~ " -s, --server=SERVER The name of the server to connect "
-#~ "to\n"
-#~ " -n, --client-name=NAME How to call this client on the "
-#~ "server\n"
+#~ "See --dump-resample-methods for possible values of resample methods.\n"
#~ msgstr ""
-#~ "%s [options] stat\n"
-#~ "%s [options] list\n"
-#~ "%s [options] exit\n"
-#~ "%s [options] upload-sample FILENAME [NAME]\n"
-#~ "%s [options] play-sample NAME [SINK]\n"
-#~ "%s [options] remove-sample NAME\n"
-#~ "%s [options] move-sink-input SINKINPUT SINK\n"
-#~ "%s [options] move-source-output SOURCEOUTPUT SOURCE\n"
-#~ "%s [options] load-module NAME [ARGS ...]\n"
-#~ "%s [options] unload-module MODULE\n"
-#~ "%s [options] suspend-sink SINK 1|0\n"
-#~ "%s [options] suspend-source SOURCE 1|0\n"
-#~ "%s [options] set-card-profile CARD PROFILE\n"
-#~ "%s [options] set-sink-port SINK PORT\n"
-#~ "%s [options] set-source-port SOURCE PORT\n"
-#~ "%s [options] set-sink-volume SINK VOLUME\n"
-#~ "%s [options] set-source-volume SOURCE VOLUME\n"
-#~ "%s [options] set-sink-input-volume SINKINPUT VOLUME\n"
-#~ "%s [options] set-sink-mute SINK 1|0\n"
-#~ "%s [options] set-source-mute SOURCE 1|0\n"
-#~ "%s [options] set-sink-input-mute SINKINPUT 1|0\n"
+#~ "%s [选项]\n"
#~ "\n"
-#~ " -h, --help Show this help\n"
-#~ " --version Show version\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"
-#~ " -s, --server=SERVER The name of the server to connect "
-#~ "to\n"
-#~ " -n, --client-name=NAME How to call this client on the "
-#~ "server\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"
+
+#~ msgid "%s %s\n"
+#~ msgstr "%s %s\n"
diff --git a/shell-completion/bash/pulseaudio b/shell-completion/bash/pulseaudio
index cfcf7ff..e473b9c 100644
--- a/shell-completion/bash/pulseaudio
+++ b/shell-completion/bash/pulseaudio
@@ -500,13 +500,13 @@ _pulseaudio()
--realtime= --disallow-module-loading= --disallow-exit= --exit-idle-time=
--scache-idle-time= --log-level= -v --log-target= --log-meta= --log-time=
--log-backtrace= -p --dl-search-path= --resample-method= --use-pit-file=
- --no-cpu-limit= --disable-shm= -L --load= -F --file= -C -n'
+ --no-cpu-limit= --disable-shm= --enable-memfd= -L --load= -F --file= -C -n'
_init_completion -n = || return
case $cur in
--system=*|--daemonize=*|--fail=*|--high-priority=*|--realtime=*| \
--disallow-*=*|--log-meta=*|--log-time=*|--use-pid-file=*| \
- --no-cpu-limit=*|--disable-shm=*)
+ --no-cpu-limit=*|--disable-shm=*|--enable-memfd=*)
cur=${cur#*=}
COMPREPLY=($(compgen -W 'true false' -- "$cur"))
;;
diff --git a/shell-completion/zsh/_pulseaudio b/shell-completion/zsh/_pulseaudio
index c7d68f5..e065085 100644
--- a/shell-completion/zsh/_pulseaudio
+++ b/shell-completion/zsh/_pulseaudio
@@ -690,6 +690,7 @@ _pulseaudio_completion() {
'--use-pid-file=[create a PID file]:bool:(true false)' \
'--no-cpu-limit=[do not install CPU load limiter]:bool:(true false)' \
'--disable-shm=[disable shared memory support]:bool:(true false)' \
+ '--enable-memfd=[enable memfd shared memory support]:bool:(true false)' \
{-L,--load=}'[load the specified module]:modules:_all_modules' \
{-F,--file=}'[run the specified script]:file:_files' \
'-C[open a command line on the running tty]' \
diff --git a/src/Makefile.am b/src/Makefile.am
index b0ca2bc..b600dfb 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -48,9 +48,10 @@ AM_CPPFLAGS = \
-DPA_SRCDIR=\"$(abs_srcdir)\" \
-DPA_BUILDDIR=\"$(abs_builddir)\" \
-DPULSE_LOCALEDIR=\"$(localedir)\"
-AM_CFLAGS = \
+AM_CFLAGS = -std=gnu11 \
+ $(PTHREAD_CFLAGS)
+AM_CXXFLAGS = -std=c++11 \
$(PTHREAD_CFLAGS)
-AM_CXXFLAGS = $(AM_CFLAGS)
SERVER_CFLAGS = -D__INCLUDED_FROM_PULSE_AUDIO
AM_LIBADD = $(PTHREAD_LIBS) $(INTLLIBS)
@@ -313,12 +314,13 @@ endif
if HAVE_GLIB20
TESTS_default += \
mainloop-test-glib
-endif
if HAVE_GTK30
+# gtk-test depends on both glib and gtk
TESTS_norun += \
gtk-test
endif
+endif
if HAVE_ALSA
TESTS_norun += \
@@ -682,7 +684,7 @@ libpulsecommon_ at PA_MAJORMINOR@_la_SOURCES = \
pulsecore/memblock.c pulsecore/memblock.h \
pulsecore/memblockq.c pulsecore/memblockq.h \
pulsecore/memchunk.c pulsecore/memchunk.h \
- pulsecore/native-common.h \
+ pulsecore/native-common.c pulsecore/native-common.h \
pulsecore/once.c pulsecore/once.h \
pulsecore/packet.c pulsecore/packet.h \
pulsecore/parseaddr.c pulsecore/parseaddr.h \
@@ -699,6 +701,7 @@ libpulsecommon_ at PA_MAJORMINOR@_la_SOURCES = \
pulsecore/refcnt.h \
pulsecore/srbchannel.c pulsecore/srbchannel.h \
pulsecore/sample-util.c pulsecore/sample-util.h \
+ pulsecore/mem.h \
pulsecore/shm.c pulsecore/shm.h \
pulsecore/bitset.c pulsecore/bitset.h \
pulsecore/socket-client.c pulsecore/socket-client.h \
@@ -727,6 +730,11 @@ libpulsecommon_ at PA_MAJORMINOR@_la_CFLAGS = $(AM_CFLAGS) $(LIBJSON_CFLAGS) $(LIBS
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_MEMFD
+libpulsecommon_ at PA_MAJORMINOR@_la_SOURCES += \
+ pulsecore/memfd-wrappers.h
+endif
+
if HAVE_X11
libpulsecommon_ at PA_MAJORMINOR@_la_SOURCES += \
pulse/client-conf-x11.c pulse/client-conf-x11.h \
@@ -1939,7 +1947,8 @@ module_position_event_sounds_la_LIBADD = $(MODULE_LIBADD)
module_position_event_sounds_la_CFLAGS = $(AM_CFLAGS)
# Ducking effect based on stream roles
-module_role_ducking_la_SOURCES = modules/module-role-ducking.c
+module_role_ducking_la_SOURCES = modules/module-role-ducking.c \
+ modules/stream-interaction.c modules/stream-interaction.h
module_role_ducking_la_LDFLAGS = $(MODULE_LDFLAGS)
module_role_ducking_la_LIBADD = $(MODULE_LIBADD)
module_role_ducking_la_CFLAGS = $(AM_CFLAGS)
@@ -1952,7 +1961,8 @@ module_augment_properties_la_LIBADD = $(MODULE_LIBADD)
module_augment_properties_la_CFLAGS = $(AM_CFLAGS) -DDESKTOPFILEDIR=\"/usr/share/applications\"
# Cork certain streams while others are active (e.g. cork music when phone streams appear)
-module_role_cork_la_SOURCES = modules/module-role-cork.c
+module_role_cork_la_SOURCES = modules/module-role-cork.c \
+ modules/stream-interaction.c modules/stream-interaction.h
module_role_cork_la_LDFLAGS = $(MODULE_LDFLAGS)
module_role_cork_la_LIBADD = $(MODULE_LIBADD)
module_role_cork_la_CFLAGS = $(AM_CFLAGS)
diff --git a/src/Makefile.in b/src/Makefile.in
index 158cabb..25c8668 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -171,8 +171,10 @@ bin_PROGRAMS = pulseaudio$(EXEEXT) pacat$(EXEEXT) pactl$(EXEEXT) \
@HAVE_GLIB20_TRUE at am__append_21 = \
@HAVE_GLIB20_TRUE@ mainloop-test-glib
- at HAVE_GTK30_TRUE@am__append_22 = \
- at HAVE_GTK30_TRUE@ gtk-test
+
+# gtk-test depends on both glib and gtk
+ at HAVE_GLIB20_TRUE@@HAVE_GTK30_TRUE at am__append_22 = \
+ at HAVE_GLIB20_TRUE@@HAVE_GTK30_TRUE@ gtk-test
@HAVE_ALSA_TRUE at am__append_23 = \
@HAVE_ALSA_TRUE@ alsa-time-test
@@ -193,214 +195,217 @@ bin_PROGRAMS = pulseaudio$(EXEEXT) pacat$(EXEEXT) pactl$(EXEEXT) \
@OS_IS_WIN32_TRUE@ pulsecore/winerrno.h
@OS_IS_WIN32_FALSE at am__append_26 = pulsecore/poll-posix.c pulsecore/poll.h
- at HAVE_X11_TRUE@am__append_27 = \
+ at HAVE_MEMFD_TRUE@am__append_27 = \
+ at HAVE_MEMFD_TRUE@ pulsecore/memfd-wrappers.h
+
+ at HAVE_X11_TRUE@am__append_28 = \
@HAVE_X11_TRUE@ pulse/client-conf-x11.c pulse/client-conf-x11.h \
@HAVE_X11_TRUE@ pulsecore/x11prop.c pulsecore/x11prop.h
- at HAVE_X11_TRUE@am__append_28 = $(X11_CFLAGS)
- at HAVE_X11_TRUE@am__append_29 = $(X11_LIBS)
- at HAVE_SYSTEMD_DAEMON_TRUE@am__append_30 = $(SYSTEMD_FLAGS) $(SYSTEMDDAEMON_FLAGS)
- at HAVE_SYSTEMD_DAEMON_TRUE@am__append_31 = $(SYSTEMD_LIBS) $(SYSTEMDDAEMON_LIBS)
- at HAVE_SYSTEMD_JOURNAL_TRUE@am__append_32 = $(SYSTEMD_FLAGS) $(SYSTEMDJOURNAL_FLAGS)
- at HAVE_SYSTEMD_JOURNAL_TRUE@am__append_33 = $(SYSTEMD_LIBS) $(SYSTEMDJOURNAL_LIBS)
- at OS_IS_WIN32_TRUE@am__append_34 = \
+ at HAVE_X11_TRUE@am__append_29 = $(X11_CFLAGS)
+ at HAVE_X11_TRUE@am__append_30 = $(X11_LIBS)
+ at HAVE_SYSTEMD_DAEMON_TRUE@am__append_31 = $(SYSTEMD_FLAGS) $(SYSTEMDDAEMON_FLAGS)
+ at HAVE_SYSTEMD_DAEMON_TRUE@am__append_32 = $(SYSTEMD_LIBS) $(SYSTEMDDAEMON_LIBS)
+ at HAVE_SYSTEMD_JOURNAL_TRUE@am__append_33 = $(SYSTEMD_FLAGS) $(SYSTEMDJOURNAL_FLAGS)
+ at HAVE_SYSTEMD_JOURNAL_TRUE@am__append_34 = $(SYSTEMD_LIBS) $(SYSTEMDJOURNAL_LIBS)
+ at OS_IS_WIN32_TRUE@am__append_35 = \
@OS_IS_WIN32_TRUE@ pulsecore/mutex-win32.c pulsecore/mutex.h \
@OS_IS_WIN32_TRUE@ pulsecore/thread-win32.c pulsecore/thread.h \
@OS_IS_WIN32_TRUE@ pulsecore/semaphore-win32.c pulsecore/semaphore.h
- at OS_IS_DARWIN_TRUE@@OS_IS_WIN32_FALSE at am__append_35 = \
+ at OS_IS_DARWIN_TRUE@@OS_IS_WIN32_FALSE at am__append_36 = \
@OS_IS_DARWIN_TRUE@@OS_IS_WIN32_FALSE@ pulsecore/mutex-posix.c pulsecore/mutex.h \
@OS_IS_DARWIN_TRUE@@OS_IS_WIN32_FALSE@ pulsecore/thread-posix.c pulsecore/thread.h \
@OS_IS_DARWIN_TRUE@@OS_IS_WIN32_FALSE@ pulsecore/semaphore-osx.c pulsecore/semaphore.h
- at OS_IS_DARWIN_TRUE@@OS_IS_WIN32_FALSE at am__append_36 = "-I/Developer/Headers/FlatCarbon/"
+ at OS_IS_DARWIN_TRUE@@OS_IS_WIN32_FALSE at am__append_37 = "-I/Developer/Headers/FlatCarbon/"
#libpulsecommon_ at PA_MAJORMINOR@_la_LDFLAGS += "-framework CoreServices"
- at OS_IS_DARWIN_FALSE@@OS_IS_WIN32_FALSE at am__append_37 = \
+ at OS_IS_DARWIN_FALSE@@OS_IS_WIN32_FALSE at am__append_38 = \
@OS_IS_DARWIN_FALSE@@OS_IS_WIN32_FALSE@ pulsecore/mutex-posix.c pulsecore/mutex.h \
@OS_IS_DARWIN_FALSE@@OS_IS_WIN32_FALSE@ pulsecore/thread-posix.c pulsecore/thread.h \
@OS_IS_DARWIN_FALSE@@OS_IS_WIN32_FALSE@ pulsecore/semaphore-posix.c pulsecore/semaphore.h
- at HAVE_LIBASYNCNS_TRUE@am__append_38 = $(LIBASYNCNS_CFLAGS)
- at HAVE_LIBASYNCNS_TRUE@am__append_39 = $(LIBASYNCNS_LIBS)
- at OS_IS_WIN32_TRUE@am__append_40 = pulsecore/dllmain.c
- at HAVE_DBUS_TRUE@am__append_41 = \
+ at HAVE_LIBASYNCNS_TRUE@am__append_39 = $(LIBASYNCNS_CFLAGS)
+ at HAVE_LIBASYNCNS_TRUE@am__append_40 = $(LIBASYNCNS_LIBS)
+ at OS_IS_WIN32_TRUE@am__append_41 = pulsecore/dllmain.c
+ at HAVE_DBUS_TRUE@am__append_42 = \
@HAVE_DBUS_TRUE@ pulsecore/dbus-util.c pulsecore/dbus-util.h \
@HAVE_DBUS_TRUE@ pulsecore/rtkit.c pulsecore/rtkit.h
- at HAVE_DBUS_TRUE@am__append_42 = $(DBUS_CFLAGS)
- at HAVE_DBUS_TRUE@am__append_43 = $(DBUS_LIBS)
- at HAVE_GLIB20_TRUE@am__append_44 = \
+ at HAVE_DBUS_TRUE@am__append_43 = $(DBUS_CFLAGS)
+ at HAVE_DBUS_TRUE@am__append_44 = $(DBUS_LIBS)
+ at HAVE_GLIB20_TRUE@am__append_45 = \
@HAVE_GLIB20_TRUE@ pulse/glib-mainloop.h
- at HAVE_GLIB20_TRUE@am__append_45 = \
+ at HAVE_GLIB20_TRUE@am__append_46 = \
@HAVE_GLIB20_TRUE@ libpulse-mainloop-glib.la
- at HAVE_DBUS_TRUE@am__append_46 = $(DBUS_CFLAGS)
- at HAVE_DBUS_TRUE@am__append_47 = $(DBUS_LIBS)
- at HAVE_OSS_WRAPPER_TRUE@am__append_48 = padsp
+ at HAVE_DBUS_TRUE@am__append_47 = $(DBUS_CFLAGS)
+ at HAVE_DBUS_TRUE@am__append_48 = $(DBUS_LIBS)
@HAVE_OSS_WRAPPER_TRUE at am__append_49 = padsp
- at HAVE_NEON_TRUE@am__append_50 = libpulsecore_sconv_neon.la libpulsecore_mix_neon.la libpulsecore_remap_neon.la
+ at HAVE_OSS_WRAPPER_TRUE@am__append_50 = padsp
@HAVE_NEON_TRUE at am__append_51 = libpulsecore_sconv_neon.la libpulsecore_mix_neon.la libpulsecore_remap_neon.la
- at HAVE_ORC_TRUE@am__append_52 = pulsecore/svolume_orc.c
- at HAVE_ORC_TRUE@am__append_53 = $(ORC_CFLAGS)
- at HAVE_ORC_TRUE@am__append_54 = $(ORC_LIBS)
- at HAVE_X11_TRUE@am__append_55 = pulsecore/x11wrap.c pulsecore/x11wrap.h
- at HAVE_X11_TRUE@am__append_56 = $(X11_CFLAGS)
- at HAVE_X11_TRUE@am__append_57 = $(X11_LIBS)
- at HAVE_DBUS_TRUE@am__append_58 = \
+ at HAVE_NEON_TRUE@am__append_52 = libpulsecore_sconv_neon.la libpulsecore_mix_neon.la libpulsecore_remap_neon.la
+ at HAVE_ORC_TRUE@am__append_53 = pulsecore/svolume_orc.c
+ at HAVE_ORC_TRUE@am__append_54 = $(ORC_CFLAGS)
+ at HAVE_ORC_TRUE@am__append_55 = $(ORC_LIBS)
+ at HAVE_X11_TRUE@am__append_56 = pulsecore/x11wrap.c pulsecore/x11wrap.h
+ at HAVE_X11_TRUE@am__append_57 = $(X11_CFLAGS)
+ at HAVE_X11_TRUE@am__append_58 = $(X11_LIBS)
+ at HAVE_DBUS_TRUE@am__append_59 = \
@HAVE_DBUS_TRUE@ pulsecore/dbus-shared.c pulsecore/dbus-shared.h \
@HAVE_DBUS_TRUE@ pulsecore/protocol-dbus.c pulsecore/protocol-dbus.h
- at HAVE_DBUS_TRUE@am__append_59 = $(DBUS_CFLAGS)
- at HAVE_DBUS_TRUE@am__append_60 = $(DBUS_LIBS)
- at HAVE_GDBM_TRUE@am__append_61 = pulsecore/database-gdbm.c
- at HAVE_GDBM_TRUE@am__append_62 = $(GDBM_CFLAGS)
- at HAVE_GDBM_TRUE@am__append_63 = $(GDBM_LIBS)
- at HAVE_TDB_TRUE@am__append_64 = pulsecore/database-tdb.c
- at HAVE_TDB_TRUE@am__append_65 = $(TDB_CFLAGS)
- at HAVE_TDB_TRUE@am__append_66 = $(TDB_LIBS)
- at HAVE_SIMPLEDB_TRUE@am__append_67 = pulsecore/database-simple.c
- at HAVE_SPEEX_TRUE@am__append_68 = pulsecore/resampler/speex.c
- at HAVE_SPEEX_TRUE@am__append_69 = $(LIBSPEEX_CFLAGS)
- at HAVE_SPEEX_TRUE@am__append_70 = $(LIBSPEEX_LIBS)
- at HAVE_SOXR_TRUE@am__append_71 = pulsecore/resampler/soxr.c
- at HAVE_SOXR_TRUE@am__append_72 = $(LIBSOXR_CFLAGS)
- at HAVE_SOXR_TRUE@am__append_73 = $(LIBSOXR_LIBS)
- at HAVE_LIBSAMPLERATE_TRUE@am__append_74 = pulsecore/resampler/libsamplerate.c
- at HAVE_LIBSAMPLERATE_TRUE@am__append_75 = $(LIBSAMPLERATE_CFLAGS)
- at HAVE_LIBSAMPLERATE_TRUE@am__append_76 = $(LIBSAMPLERATE_LIBS)
- at HAVE_WEBRTC_TRUE@am__append_77 = libwebrtc-util.la
- at HAVE_ESOUND_TRUE@am__append_78 = \
+ at HAVE_DBUS_TRUE@am__append_60 = $(DBUS_CFLAGS)
+ at HAVE_DBUS_TRUE@am__append_61 = $(DBUS_LIBS)
+ at HAVE_GDBM_TRUE@am__append_62 = pulsecore/database-gdbm.c
+ at HAVE_GDBM_TRUE@am__append_63 = $(GDBM_CFLAGS)
+ at HAVE_GDBM_TRUE@am__append_64 = $(GDBM_LIBS)
+ at HAVE_TDB_TRUE@am__append_65 = pulsecore/database-tdb.c
+ at HAVE_TDB_TRUE@am__append_66 = $(TDB_CFLAGS)
+ at HAVE_TDB_TRUE@am__append_67 = $(TDB_LIBS)
+ at HAVE_SIMPLEDB_TRUE@am__append_68 = pulsecore/database-simple.c
+ at HAVE_SPEEX_TRUE@am__append_69 = pulsecore/resampler/speex.c
+ at HAVE_SPEEX_TRUE@am__append_70 = $(LIBSPEEX_CFLAGS)
+ at HAVE_SPEEX_TRUE@am__append_71 = $(LIBSPEEX_LIBS)
+ at HAVE_SOXR_TRUE@am__append_72 = pulsecore/resampler/soxr.c
+ at HAVE_SOXR_TRUE@am__append_73 = $(LIBSOXR_CFLAGS)
+ at HAVE_SOXR_TRUE@am__append_74 = $(LIBSOXR_LIBS)
+ at HAVE_LIBSAMPLERATE_TRUE@am__append_75 = pulsecore/resampler/libsamplerate.c
+ at HAVE_LIBSAMPLERATE_TRUE@am__append_76 = $(LIBSAMPLERATE_CFLAGS)
+ at HAVE_LIBSAMPLERATE_TRUE@am__append_77 = $(LIBSAMPLERATE_LIBS)
+ at HAVE_WEBRTC_TRUE@am__append_78 = libwebrtc-util.la
+ at HAVE_ESOUND_TRUE@am__append_79 = \
@HAVE_ESOUND_TRUE@ libprotocol-esound.la
# We need to emulate sendmsg/recvmsg to support this on Win32
- at OS_IS_WIN32_FALSE@am__append_79 = \
+ at OS_IS_WIN32_FALSE@am__append_80 = \
@OS_IS_WIN32_FALSE@ librtp.la
- at HAVE_AVAHI_TRUE@am__append_80 = \
+ at HAVE_AVAHI_TRUE@am__append_81 = \
@HAVE_AVAHI_TRUE@ libavahi-wrap.la
- at HAVE_DBUS_TRUE@am__append_81 = $(DBUS_CFLAGS)
- at HAVE_DBUS_TRUE@am__append_82 = $(DBUS_LIBS)
+ at HAVE_DBUS_TRUE@am__append_82 = $(DBUS_CFLAGS)
+ at HAVE_DBUS_TRUE@am__append_83 = $(DBUS_LIBS)
###################################
# Plug-in libraries #
###################################
# Serveral module (e.g. libalsa-util.la)
- at HAVE_DBUS_TRUE@am__append_83 = \
+ at HAVE_DBUS_TRUE@am__append_84 = \
@HAVE_DBUS_TRUE@ module-console-kit.la
- at HAVE_ESOUND_TRUE@am__append_84 = \
+ at HAVE_ESOUND_TRUE@am__append_85 = \
@HAVE_ESOUND_TRUE@ module-esound-protocol-tcp.la \
@HAVE_ESOUND_TRUE@ module-esound-sink.la
# See comment at librtp.la above
- at OS_IS_WIN32_FALSE@am__append_85 = \
+ at OS_IS_WIN32_FALSE@am__append_86 = \
@OS_IS_WIN32_FALSE@ module-rtp-send.la \
@OS_IS_WIN32_FALSE@ module-rtp-recv.la
- at HAVE_AF_UNIX_TRUE@am__append_86 = \
+ at HAVE_AF_UNIX_TRUE@am__append_87 = \
@HAVE_AF_UNIX_TRUE@ module-cli-protocol-unix.la \
@HAVE_AF_UNIX_TRUE@ module-simple-protocol-unix.la \
@HAVE_AF_UNIX_TRUE@ module-http-protocol-unix.la \
@HAVE_AF_UNIX_TRUE@ module-native-protocol-unix.la
- at HAVE_AF_UNIX_TRUE@@HAVE_ESOUND_TRUE at am__append_87 = \
+ at HAVE_AF_UNIX_TRUE@@HAVE_ESOUND_TRUE at am__append_88 = \
@HAVE_AF_UNIX_TRUE@@HAVE_ESOUND_TRUE@ module-esound-protocol-unix.la
- at HAVE_MKFIFO_TRUE@am__append_88 = \
+ at HAVE_MKFIFO_TRUE@am__append_89 = \
@HAVE_MKFIFO_TRUE@ module-pipe-sink.la \
@HAVE_MKFIFO_TRUE@ module-pipe-source.la
- at HAVE_ESOUND_TRUE@@OS_IS_WIN32_FALSE at am__append_89 = \
+ at HAVE_ESOUND_TRUE@@OS_IS_WIN32_FALSE at am__append_90 = \
@HAVE_ESOUND_TRUE@@OS_IS_WIN32_FALSE@ module-esound-compat-spawnfd.la \
@HAVE_ESOUND_TRUE@@OS_IS_WIN32_FALSE@ module-esound-compat-spawnpid.la
- at HAVE_REGEX_TRUE@am__append_90 = \
+ at HAVE_REGEX_TRUE@am__append_91 = \
@HAVE_REGEX_TRUE@ module-match.la
- at HAVE_X11_TRUE@am__append_91 = \
+ at HAVE_X11_TRUE@am__append_92 = \
@HAVE_X11_TRUE@ module-x11-bell.la \
@HAVE_X11_TRUE@ module-x11-publish.la \
@HAVE_X11_TRUE@ module-x11-xsmp.la \
@HAVE_X11_TRUE@ module-x11-cork-request.la
- at HAVE_OSS_OUTPUT_TRUE@am__append_92 = \
+ at HAVE_OSS_OUTPUT_TRUE@am__append_93 = \
@HAVE_OSS_OUTPUT_TRUE@ liboss-util.la \
@HAVE_OSS_OUTPUT_TRUE@ module-oss.la
- at HAVE_COREAUDIO_TRUE@am__append_93 = \
+ at HAVE_COREAUDIO_TRUE@am__append_94 = \
@HAVE_COREAUDIO_TRUE@ module-coreaudio-detect.la \
@HAVE_COREAUDIO_TRUE@ module-coreaudio-device.la
pulselibexec_PROGRAMS = $(am__EXEEXT_15)
- at HAVE_ALSA_TRUE@am__append_94 = \
+ at HAVE_ALSA_TRUE@am__append_95 = \
@HAVE_ALSA_TRUE@ libalsa-util.la \
@HAVE_ALSA_TRUE@ module-alsa-sink.la \
@HAVE_ALSA_TRUE@ module-alsa-source.la \
@HAVE_ALSA_TRUE@ module-alsa-card.la
- at HAVE_SOLARIS_TRUE@am__append_95 = \
+ at HAVE_SOLARIS_TRUE@am__append_96 = \
@HAVE_SOLARIS_TRUE@ module-solaris.la
- at HAVE_AVAHI_TRUE@am__append_96 = \
+ at HAVE_AVAHI_TRUE@am__append_97 = \
@HAVE_AVAHI_TRUE@ module-zeroconf-publish.la \
@HAVE_AVAHI_TRUE@ module-zeroconf-discover.la
- at HAVE_BONJOUR_TRUE@am__append_97 = \
+ at HAVE_BONJOUR_TRUE@am__append_98 = \
@HAVE_BONJOUR_TRUE@ module-bonjour-publish.la
- at HAVE_LIRC_TRUE@am__append_98 = \
+ at HAVE_LIRC_TRUE@am__append_99 = \
@HAVE_LIRC_TRUE@ module-lirc.la
- at HAVE_XEN_TRUE@am__append_99 = \
+ at HAVE_XEN_TRUE@am__append_100 = \
@HAVE_XEN_TRUE@ module-xenpv-sink.la
- at HAVE_EVDEV_TRUE@am__append_100 = \
+ at HAVE_EVDEV_TRUE@am__append_101 = \
@HAVE_EVDEV_TRUE@ module-mmkbd-evdev.la
- at HAVE_JACK_TRUE@am__append_101 = \
+ at HAVE_JACK_TRUE@am__append_102 = \
@HAVE_JACK_TRUE@ module-jack-sink.la \
@HAVE_JACK_TRUE@ module-jack-source.la
- at HAVE_DBUS_TRUE@@HAVE_JACK_TRUE at am__append_102 = \
+ at HAVE_DBUS_TRUE@@HAVE_JACK_TRUE at am__append_103 = \
@HAVE_DBUS_TRUE@@HAVE_JACK_TRUE@ module-jackdbus-detect.la
- at HAVE_GCONF_TRUE@am__append_103 = \
+ at HAVE_GCONF_TRUE@am__append_104 = \
@HAVE_GCONF_TRUE@ module-gconf.la
- at HAVE_GCONF_TRUE@am__append_104 = \
+ at HAVE_GCONF_TRUE@am__append_105 = \
@HAVE_GCONF_TRUE@ gconf-helper
- at HAVE_WAVEOUT_TRUE@am__append_105 = \
+ at HAVE_WAVEOUT_TRUE@am__append_106 = \
@HAVE_WAVEOUT_TRUE@ module-waveout.la
- at HAVE_HAL_COMPAT_TRUE@am__append_106 = \
+ at HAVE_HAL_COMPAT_TRUE@am__append_107 = \
@HAVE_HAL_COMPAT_TRUE@ module-hal-detect.la
- at HAVE_UDEV_TRUE@am__append_107 = \
+ at HAVE_UDEV_TRUE@am__append_108 = \
@HAVE_UDEV_TRUE@ module-udev-detect.la
- at HAVE_SYSTEMD_LOGIN_TRUE@am__append_108 = \
+ at HAVE_SYSTEMD_LOGIN_TRUE@am__append_109 = \
@HAVE_SYSTEMD_LOGIN_TRUE@ module-systemd-login.la
- at HAVE_DBUS_TRUE@am__append_109 = \
+ at HAVE_DBUS_TRUE@am__append_110 = \
@HAVE_DBUS_TRUE@ module-rygel-media-server.la \
@HAVE_DBUS_TRUE@ module-dbus-protocol.la
- at HAVE_BLUEZ_TRUE@am__append_110 = \
+ at HAVE_BLUEZ_TRUE@am__append_111 = \
@HAVE_BLUEZ_TRUE@ module-bluetooth-discover.la \
@HAVE_BLUEZ_TRUE@ module-bluetooth-policy.la
- at HAVE_BLUEZ_4_TRUE@am__append_111 = \
+ at HAVE_BLUEZ_4_TRUE@am__append_112 = \
@HAVE_BLUEZ_4_TRUE@ libbluez4-util.la \
@HAVE_BLUEZ_4_TRUE@ module-bluez4-discover.la \
@HAVE_BLUEZ_4_TRUE@ module-bluez4-device.la
- at HAVE_BLUEZ_5_TRUE@am__append_112 = \
+ at HAVE_BLUEZ_5_TRUE@am__append_113 = \
@HAVE_BLUEZ_5_TRUE@ libbluez5-util.la \
@HAVE_BLUEZ_5_TRUE@ module-bluez5-discover.la \
@HAVE_BLUEZ_5_TRUE@ module-bluez5-device.la
@@ -408,53 +413,53 @@ pulselibexec_PROGRAMS = $(am__EXEEXT_15)
# RAOP depends on RTP, and we don't support RTP on Windows, see comment at
# librtp.la above.
- at HAVE_OPENSSL_TRUE@@OS_IS_WIN32_FALSE at am__append_113 = \
+ at HAVE_OPENSSL_TRUE@@OS_IS_WIN32_FALSE at am__append_114 = \
@HAVE_OPENSSL_TRUE@@OS_IS_WIN32_FALSE@ libraop.la \
@HAVE_OPENSSL_TRUE@@OS_IS_WIN32_FALSE@ module-raop-sink.la
- at HAVE_AVAHI_TRUE@@HAVE_OPENSSL_TRUE@@OS_IS_WIN32_FALSE at am__append_114 = \
+ at HAVE_AVAHI_TRUE@@HAVE_OPENSSL_TRUE@@OS_IS_WIN32_FALSE at am__append_115 = \
@HAVE_AVAHI_TRUE@@HAVE_OPENSSL_TRUE@@OS_IS_WIN32_FALSE@ module-raop-discover.la
- at HAVE_DBUS_TRUE@@HAVE_FFTW_TRUE at am__append_115 = \
+ at HAVE_DBUS_TRUE@@HAVE_FFTW_TRUE at am__append_116 = \
@HAVE_DBUS_TRUE@@HAVE_FFTW_TRUE@ module-equalizer-sink.la
- at HAVE_DBUS_TRUE@@HAVE_FFTW_TRUE at am__append_116 = utils/qpaeq
- at HAVE_ESOUND_TRUE@am__append_117 = \
+ at HAVE_DBUS_TRUE@@HAVE_FFTW_TRUE at am__append_117 = utils/qpaeq
+ at HAVE_ESOUND_TRUE@am__append_118 = \
@HAVE_ESOUND_TRUE@ module-esound-protocol-tcp-symdef.h \
@HAVE_ESOUND_TRUE@ module-esound-protocol-unix-symdef.h \
@HAVE_ESOUND_TRUE@ module-esound-compat-spawnfd-symdef.h \
@HAVE_ESOUND_TRUE@ module-esound-compat-spawnpid-symdef.h \
@HAVE_ESOUND_TRUE@ module-esound-sink-symdef.h
- at HAVE_DBUS_TRUE@am__append_118 = $(DBUS_CFLAGS)
- at HAVE_DBUS_TRUE@am__append_119 = $(DBUS_LIBS)
- at HAVE_UDEV_TRUE@am__append_120 = modules/udev-util.h modules/udev-util.c
- at HAVE_UDEV_TRUE@am__append_121 = $(UDEV_LIBS)
- at HAVE_UDEV_TRUE@am__append_122 = $(UDEV_CFLAGS)
- at HAVE_DBUS_TRUE@am__append_123 = modules/reserve.h modules/reserve.c modules/reserve-monitor.h modules/reserve-monitor.c
- at HAVE_DBUS_TRUE@am__append_124 = $(DBUS_LIBS)
- at HAVE_DBUS_TRUE@am__append_125 = $(DBUS_CFLAGS)
- at HAVE_DBUS_TRUE@am__append_126 = $(DBUS_LIBS)
- at HAVE_DBUS_TRUE@am__append_127 = $(DBUS_CFLAGS)
- at HAVE_DBUS_TRUE@am__append_128 = $(DBUS_LIBS)
- at HAVE_DBUS_TRUE@am__append_129 = $(DBUS_CFLAGS)
- at HAVE_ADRIAN_EC_TRUE@am__append_130 = \
+ at HAVE_DBUS_TRUE@am__append_119 = $(DBUS_CFLAGS)
+ at HAVE_DBUS_TRUE@am__append_120 = $(DBUS_LIBS)
+ at HAVE_UDEV_TRUE@am__append_121 = modules/udev-util.h modules/udev-util.c
+ at HAVE_UDEV_TRUE@am__append_122 = $(UDEV_LIBS)
+ at HAVE_UDEV_TRUE@am__append_123 = $(UDEV_CFLAGS)
+ at HAVE_DBUS_TRUE@am__append_124 = modules/reserve.h modules/reserve.c modules/reserve-monitor.h modules/reserve-monitor.c
+ at HAVE_DBUS_TRUE@am__append_125 = $(DBUS_LIBS)
+ at HAVE_DBUS_TRUE@am__append_126 = $(DBUS_CFLAGS)
+ at HAVE_DBUS_TRUE@am__append_127 = $(DBUS_LIBS)
+ at HAVE_DBUS_TRUE@am__append_128 = $(DBUS_CFLAGS)
+ at HAVE_DBUS_TRUE@am__append_129 = $(DBUS_LIBS)
+ at HAVE_DBUS_TRUE@am__append_130 = $(DBUS_CFLAGS)
+ at HAVE_ADRIAN_EC_TRUE@am__append_131 = \
@HAVE_ADRIAN_EC_TRUE@ modules/echo-cancel/adrian-aec.c modules/echo-cancel/adrian-aec.h \
@HAVE_ADRIAN_EC_TRUE@ modules/echo-cancel/adrian.c modules/echo-cancel/adrian.h
- at HAVE_ADRIAN_EC_TRUE@am__append_131 = -DHAVE_ADRIAN_EC=1
- at HAVE_ADRIAN_EC_TRUE@am__append_132 = modules/echo-cancel/adrian-aec
- at HAVE_ADRIAN_EC_TRUE@@HAVE_ORC_TRUE at am__append_133 = $(ORC_LIBS)
- at HAVE_ADRIAN_EC_TRUE@@HAVE_ORC_TRUE at am__append_134 = $(ORC_CFLAGS) -I$(top_builddir)/src/modules/echo-cancel
- at HAVE_SPEEX_TRUE@am__append_135 = modules/echo-cancel/speex.c
- at HAVE_SPEEX_TRUE@am__append_136 = $(LIBSPEEX_CFLAGS)
- at HAVE_SPEEX_TRUE@am__append_137 = $(LIBSPEEX_LIBS)
- at HAVE_WEBRTC_TRUE@am__append_138 = -DHAVE_WEBRTC=1
- at HAVE_WEBRTC_TRUE@am__append_139 = libwebrtc-util.la
- at HAVE_BLUEZ_5_OFONO_HEADSET_TRUE@am__append_140 = \
+ at HAVE_ADRIAN_EC_TRUE@am__append_132 = -DHAVE_ADRIAN_EC=1
+ at HAVE_ADRIAN_EC_TRUE@am__append_133 = modules/echo-cancel/adrian-aec
+ at HAVE_ADRIAN_EC_TRUE@@HAVE_ORC_TRUE at am__append_134 = $(ORC_LIBS)
+ at HAVE_ADRIAN_EC_TRUE@@HAVE_ORC_TRUE at am__append_135 = $(ORC_CFLAGS) -I$(top_builddir)/src/modules/echo-cancel
+ at HAVE_SPEEX_TRUE@am__append_136 = modules/echo-cancel/speex.c
+ at HAVE_SPEEX_TRUE@am__append_137 = $(LIBSPEEX_CFLAGS)
+ at HAVE_SPEEX_TRUE@am__append_138 = $(LIBSPEEX_LIBS)
+ at HAVE_WEBRTC_TRUE@am__append_139 = -DHAVE_WEBRTC=1
+ at HAVE_WEBRTC_TRUE@am__append_140 = libwebrtc-util.la
+ at HAVE_BLUEZ_5_OFONO_HEADSET_TRUE@am__append_141 = \
@HAVE_BLUEZ_5_OFONO_HEADSET_TRUE@ modules/bluetooth/backend-ofono.c
- at HAVE_BLUEZ_5_NATIVE_HEADSET_TRUE@am__append_141 = \
+ at HAVE_BLUEZ_5_NATIVE_HEADSET_TRUE@am__append_142 = \
@HAVE_BLUEZ_5_NATIVE_HEADSET_TRUE@ modules/bluetooth/backend-native.c
subdir = src
@@ -462,6 +467,8 @@ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/acx_libwrap.m4 \
$(top_srcdir)/m4/ax_check_define.m4 \
$(top_srcdir)/m4/ax_check_flag.m4 \
+ $(top_srcdir)/m4/ax_cxx_compile_stdcxx.m4 \
+ $(top_srcdir)/m4/ax_cxx_compile_stdcxx_11.m4 \
$(top_srcdir)/m4/ax_define_dir.m4 \
$(top_srcdir)/m4/ax_pthread.m4 $(top_srcdir)/m4/ax_tls.m4 \
$(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/iconv.m4 \
@@ -762,25 +769,26 @@ am__libpulsecommon_ at PA_MAJORMINOR@_la_SOURCES_DIST = \
pulsecore/mcalign.c pulsecore/mcalign.h pulsecore/memblock.c \
pulsecore/memblock.h pulsecore/memblockq.c \
pulsecore/memblockq.h pulsecore/memchunk.c \
- pulsecore/memchunk.h pulsecore/native-common.h \
- pulsecore/once.c pulsecore/once.h pulsecore/packet.c \
- pulsecore/packet.h pulsecore/parseaddr.c pulsecore/parseaddr.h \
- pulsecore/pdispatch.c pulsecore/pdispatch.h pulsecore/pid.c \
- pulsecore/pid.h pulsecore/pipe.c pulsecore/pipe.h \
- pulsecore/memtrap.c pulsecore/memtrap.h pulsecore/aupdate.c \
- pulsecore/aupdate.h pulsecore/proplist-util.c \
- pulsecore/proplist-util.h pulsecore/pstream-util.c \
- pulsecore/pstream-util.h pulsecore/pstream.c \
- pulsecore/pstream.h pulsecore/queue.c pulsecore/queue.h \
- pulsecore/random.c pulsecore/random.h pulsecore/refcnt.h \
- pulsecore/srbchannel.c pulsecore/srbchannel.h \
- pulsecore/sample-util.c pulsecore/sample-util.h \
- pulsecore/shm.c pulsecore/shm.h pulsecore/bitset.c \
- pulsecore/bitset.h pulsecore/socket-client.c \
- pulsecore/socket-client.h pulsecore/socket-server.c \
- pulsecore/socket-server.h pulsecore/socket-util.c \
- pulsecore/socket-util.h pulsecore/strbuf.c pulsecore/strbuf.h \
- pulsecore/strlist.c pulsecore/strlist.h pulsecore/svolume_c.c \
+ pulsecore/memchunk.h pulsecore/native-common.c \
+ pulsecore/native-common.h pulsecore/once.c pulsecore/once.h \
+ pulsecore/packet.c pulsecore/packet.h pulsecore/parseaddr.c \
+ pulsecore/parseaddr.h pulsecore/pdispatch.c \
+ pulsecore/pdispatch.h pulsecore/pid.c pulsecore/pid.h \
+ pulsecore/pipe.c pulsecore/pipe.h pulsecore/memtrap.c \
+ pulsecore/memtrap.h pulsecore/aupdate.c pulsecore/aupdate.h \
+ pulsecore/proplist-util.c pulsecore/proplist-util.h \
+ pulsecore/pstream-util.c pulsecore/pstream-util.h \
+ pulsecore/pstream.c pulsecore/pstream.h pulsecore/queue.c \
+ pulsecore/queue.h pulsecore/random.c pulsecore/random.h \
+ pulsecore/refcnt.h pulsecore/srbchannel.c \
+ pulsecore/srbchannel.h pulsecore/sample-util.c \
+ pulsecore/sample-util.h pulsecore/mem.h pulsecore/shm.c \
+ pulsecore/shm.h pulsecore/bitset.c pulsecore/bitset.h \
+ pulsecore/socket-client.c pulsecore/socket-client.h \
+ pulsecore/socket-server.c pulsecore/socket-server.h \
+ pulsecore/socket-util.c pulsecore/socket-util.h \
+ pulsecore/strbuf.c pulsecore/strbuf.h pulsecore/strlist.c \
+ pulsecore/strlist.h pulsecore/svolume_c.c \
pulsecore/svolume_arm.c pulsecore/svolume_mmx.c \
pulsecore/svolume_sse.c pulsecore/tagstruct.c \
pulsecore/tagstruct.h pulsecore/time-smoother.c \
@@ -789,9 +797,10 @@ am__libpulsecommon_ at PA_MAJORMINOR@_la_SOURCES_DIST = \
pulsecore/usergroup.h pulsecore/sndfile-util.c \
pulsecore/sndfile-util.h pulsecore/socket.h \
pulsecore/poll-win32.c pulsecore/poll.h pulsecore/winerrno.h \
- pulsecore/poll-posix.c pulse/client-conf-x11.c \
- pulse/client-conf-x11.h pulsecore/x11prop.c \
- pulsecore/x11prop.h pulsecore/mutex-win32.c pulsecore/mutex.h \
+ pulsecore/poll-posix.c pulsecore/memfd-wrappers.h \
+ pulse/client-conf-x11.c pulse/client-conf-x11.h \
+ pulsecore/x11prop.c pulsecore/x11prop.h \
+ pulsecore/mutex-win32.c pulsecore/mutex.h \
pulsecore/thread-win32.c pulsecore/thread.h \
pulsecore/semaphore-win32.c pulsecore/semaphore.h \
pulsecore/mutex-posix.c pulsecore/thread-posix.c \
@@ -800,19 +809,20 @@ am__libpulsecommon_ at PA_MAJORMINOR@_la_SOURCES_DIST = \
pulsecore/dbus-util.h pulsecore/rtkit.c pulsecore/rtkit.h
@OS_IS_WIN32_TRUE at am__objects_5 = pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-poll-win32.lo
@OS_IS_WIN32_FALSE at am__objects_6 = pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-poll-posix.lo
- at HAVE_X11_TRUE@am__objects_7 = pulse/libpulsecommon_ at PA_MAJORMINOR@_la-client-conf-x11.lo \
+am__objects_7 =
+ at HAVE_X11_TRUE@am__objects_8 = pulse/libpulsecommon_ at PA_MAJORMINOR@_la-client-conf-x11.lo \
@HAVE_X11_TRUE@ pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-x11prop.lo
- at OS_IS_WIN32_TRUE@am__objects_8 = pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-mutex-win32.lo \
+ at OS_IS_WIN32_TRUE@am__objects_9 = pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-mutex-win32.lo \
@OS_IS_WIN32_TRUE@ pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-thread-win32.lo \
@OS_IS_WIN32_TRUE@ pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-semaphore-win32.lo
- at OS_IS_DARWIN_TRUE@@OS_IS_WIN32_FALSE at am__objects_9 = pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-mutex-posix.lo \
+ at OS_IS_DARWIN_TRUE@@OS_IS_WIN32_FALSE at am__objects_10 = pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-mutex-posix.lo \
@OS_IS_DARWIN_TRUE@@OS_IS_WIN32_FALSE@ pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-thread-posix.lo \
@OS_IS_DARWIN_TRUE@@OS_IS_WIN32_FALSE@ pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-semaphore-osx.lo
- at OS_IS_DARWIN_FALSE@@OS_IS_WIN32_FALSE at am__objects_10 = pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-mutex-posix.lo \
+ at OS_IS_DARWIN_FALSE@@OS_IS_WIN32_FALSE at am__objects_11 = pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-mutex-posix.lo \
@OS_IS_DARWIN_FALSE@@OS_IS_WIN32_FALSE@ pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-thread-posix.lo \
@OS_IS_DARWIN_FALSE@@OS_IS_WIN32_FALSE@ pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-semaphore-posix.lo
- at OS_IS_WIN32_TRUE@am__objects_11 = pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-dllmain.lo
- at HAVE_DBUS_TRUE@am__objects_12 = pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-dbus-util.lo \
+ at OS_IS_WIN32_TRUE@am__objects_12 = pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-dllmain.lo
+ at HAVE_DBUS_TRUE@am__objects_13 = pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-dbus-util.lo \
@HAVE_DBUS_TRUE@ pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-rtkit.lo
am_libpulsecommon_ at PA_MAJORMINOR@_la_OBJECTS = \
pulse/libpulsecommon_ at PA_MAJORMINOR@_la-client-conf.lo \
@@ -851,6 +861,7 @@ am_libpulsecommon_ at PA_MAJORMINOR@_la_OBJECTS = \
pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-memblock.lo \
pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-memblockq.lo \
pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-memchunk.lo \
+ pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-native-common.lo \
pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-once.lo \
pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-packet.lo \
pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-parseaddr.lo \
@@ -884,7 +895,7 @@ am_libpulsecommon_ at PA_MAJORMINOR@_la_OBJECTS = \
pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-sndfile-util.lo \
$(am__objects_5) $(am__objects_6) $(am__objects_7) \
$(am__objects_8) $(am__objects_9) $(am__objects_10) \
- $(am__objects_11) $(am__objects_12)
+ $(am__objects_11) $(am__objects_12) $(am__objects_13)
libpulsecommon_ at PA_MAJORMINOR@_la_OBJECTS = \
$(am_libpulsecommon_ at PA_MAJORMINOR@_la_OBJECTS)
libpulsecommon_ at PA_MAJORMINOR@_la_LINK = $(LIBTOOL) $(AM_V_lt) \
@@ -901,7 +912,7 @@ libpulsecore_ at PA_MAJORMINOR@_la_DEPENDENCIES = $(am__DEPENDENCIES_2) \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
libpulsecommon- at PA_MAJORMINOR@.la libpulse.la \
- libpulsecore-foreign.la $(am__append_51) $(am__DEPENDENCIES_7) \
+ libpulsecore-foreign.la $(am__append_52) $(am__DEPENDENCIES_7) \
$(am__DEPENDENCIES_5) $(am__DEPENDENCIES_8) \
$(am__DEPENDENCIES_9) $(am__DEPENDENCIES_10) \
$(am__DEPENDENCIES_11) $(am__DEPENDENCIES_12)
@@ -955,16 +966,16 @@ am__libpulsecore_ at PA_MAJORMINOR@_la_SOURCES_DIST = \
pulsecore/database-tdb.c pulsecore/database-simple.c \
pulsecore/resampler/speex.c pulsecore/resampler/soxr.c \
pulsecore/resampler/libsamplerate.c
- at HAVE_ORC_TRUE@am__objects_13 = pulsecore/libpulsecore_ at PA_MAJORMINOR@_la-svolume_orc.lo
- at HAVE_X11_TRUE@am__objects_14 = pulsecore/libpulsecore_ at PA_MAJORMINOR@_la-x11wrap.lo
- at HAVE_DBUS_TRUE@am__objects_15 = pulsecore/libpulsecore_ at PA_MAJORMINOR@_la-dbus-shared.lo \
+ at HAVE_ORC_TRUE@am__objects_14 = pulsecore/libpulsecore_ at PA_MAJORMINOR@_la-svolume_orc.lo
+ at HAVE_X11_TRUE@am__objects_15 = pulsecore/libpulsecore_ at PA_MAJORMINOR@_la-x11wrap.lo
+ at HAVE_DBUS_TRUE@am__objects_16 = pulsecore/libpulsecore_ at PA_MAJORMINOR@_la-dbus-shared.lo \
@HAVE_DBUS_TRUE@ pulsecore/libpulsecore_ at PA_MAJORMINOR@_la-protocol-dbus.lo
- at HAVE_GDBM_TRUE@am__objects_16 = pulsecore/libpulsecore_ at PA_MAJORMINOR@_la-database-gdbm.lo
- at HAVE_TDB_TRUE@am__objects_17 = pulsecore/libpulsecore_ at PA_MAJORMINOR@_la-database-tdb.lo
- at HAVE_SIMPLEDB_TRUE@am__objects_18 = pulsecore/libpulsecore_ at PA_MAJORMINOR@_la-database-simple.lo
- at HAVE_SPEEX_TRUE@am__objects_19 = pulsecore/resampler/libpulsecore_ at PA_MAJORMINOR@_la-speex.lo
- at HAVE_SOXR_TRUE@am__objects_20 = pulsecore/resampler/libpulsecore_ at PA_MAJORMINOR@_la-soxr.lo
- at HAVE_LIBSAMPLERATE_TRUE@am__objects_21 = pulsecore/resampler/libpulsecore_ at PA_MAJORMINOR@_la-libsamplerate.lo
+ at HAVE_GDBM_TRUE@am__objects_17 = pulsecore/libpulsecore_ at PA_MAJORMINOR@_la-database-gdbm.lo
+ at HAVE_TDB_TRUE@am__objects_18 = pulsecore/libpulsecore_ at PA_MAJORMINOR@_la-database-tdb.lo
+ at HAVE_SIMPLEDB_TRUE@am__objects_19 = pulsecore/libpulsecore_ at PA_MAJORMINOR@_la-database-simple.lo
+ at HAVE_SPEEX_TRUE@am__objects_20 = pulsecore/resampler/libpulsecore_ at PA_MAJORMINOR@_la-speex.lo
+ at HAVE_SOXR_TRUE@am__objects_21 = pulsecore/resampler/libpulsecore_ at PA_MAJORMINOR@_la-soxr.lo
+ at HAVE_LIBSAMPLERATE_TRUE@am__objects_22 = pulsecore/resampler/libpulsecore_ at PA_MAJORMINOR@_la-libsamplerate.lo
am_libpulsecore_ at PA_MAJORMINOR@_la_OBJECTS = pulsecore/filter/libpulsecore_ at PA_MAJORMINOR@_la-lfe-filter.lo \
pulsecore/filter/libpulsecore_ at PA_MAJORMINOR@_la-biquad.lo \
pulsecore/filter/libpulsecore_ at PA_MAJORMINOR@_la-crossover.lo \
@@ -1017,9 +1028,9 @@ am_libpulsecore_ at PA_MAJORMINOR@_la_OBJECTS = pulsecore/filter/libpulsecore_ at PA_M
pulsecore/libpulsecore_ at PA_MAJORMINOR@_la-source.lo \
pulsecore/libpulsecore_ at PA_MAJORMINOR@_la-start-child.lo \
pulsecore/libpulsecore_ at PA_MAJORMINOR@_la-thread-mq.lo \
- $(am__objects_13) $(am__objects_14) $(am__objects_15) \
- $(am__objects_16) $(am__objects_17) $(am__objects_18) \
- $(am__objects_19) $(am__objects_20) $(am__objects_21)
+ $(am__objects_14) $(am__objects_15) $(am__objects_16) \
+ $(am__objects_17) $(am__objects_18) $(am__objects_19) \
+ $(am__objects_20) $(am__objects_21) $(am__objects_22)
@HAVE_ORC_TRUE at nodist_libpulsecore_@PA_MAJORMINOR at _la_OBJECTS = pulsecore/libpulsecore_ at PA_MAJORMINOR@_la-svolume-orc-gen.lo
libpulsecore_ at PA_MAJORMINOR@_la_OBJECTS = \
$(am_libpulsecore_ at PA_MAJORMINOR@_la_OBJECTS) \
@@ -1377,19 +1388,19 @@ module_device_restore_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
@HAVE_ADRIAN_EC_TRUE@@HAVE_ORC_TRUE@ $(am__DEPENDENCIES_1)
module_echo_cancel_la_DEPENDENCIES = $(am__DEPENDENCIES_3) \
$(am__DEPENDENCIES_13) $(am__DEPENDENCIES_10) \
- $(am__append_139)
+ $(am__append_140)
am__module_echo_cancel_la_SOURCES_DIST = \
modules/echo-cancel/module-echo-cancel.c \
modules/echo-cancel/null.c modules/echo-cancel/echo-cancel.h \
modules/echo-cancel/adrian-aec.c \
modules/echo-cancel/adrian-aec.h modules/echo-cancel/adrian.c \
modules/echo-cancel/adrian.h modules/echo-cancel/speex.c
- at HAVE_ADRIAN_EC_TRUE@am__objects_22 = modules/echo-cancel/module_echo_cancel_la-adrian-aec.lo \
+ at HAVE_ADRIAN_EC_TRUE@am__objects_23 = modules/echo-cancel/module_echo_cancel_la-adrian-aec.lo \
@HAVE_ADRIAN_EC_TRUE@ modules/echo-cancel/module_echo_cancel_la-adrian.lo
- at HAVE_SPEEX_TRUE@am__objects_23 = modules/echo-cancel/module_echo_cancel_la-speex.lo
+ at HAVE_SPEEX_TRUE@am__objects_24 = modules/echo-cancel/module_echo_cancel_la-speex.lo
am_module_echo_cancel_la_OBJECTS = modules/echo-cancel/module_echo_cancel_la-module-echo-cancel.lo \
modules/echo-cancel/module_echo_cancel_la-null.lo \
- $(am__objects_22) $(am__objects_23)
+ $(am__objects_23) $(am__objects_24)
@HAVE_ADRIAN_EC_TRUE@@HAVE_ORC_TRUE at nodist_module_echo_cancel_la_OBJECTS = modules/echo-cancel/module_echo_cancel_la-adrian-aec-orc-gen.lo
module_echo_cancel_la_OBJECTS = $(am_module_echo_cancel_la_OBJECTS) \
$(nodist_module_echo_cancel_la_OBJECTS)
@@ -1742,7 +1753,8 @@ module_rescue_streams_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
$(module_rescue_streams_la_LDFLAGS) $(LDFLAGS) -o $@
module_role_cork_la_DEPENDENCIES = $(am__DEPENDENCIES_3)
am_module_role_cork_la_OBJECTS = \
- modules/module_role_cork_la-module-role-cork.lo
+ modules/module_role_cork_la-module-role-cork.lo \
+ modules/module_role_cork_la-stream-interaction.lo
module_role_cork_la_OBJECTS = $(am_module_role_cork_la_OBJECTS)
module_role_cork_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
@@ -1750,7 +1762,8 @@ module_role_cork_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
$(module_role_cork_la_LDFLAGS) $(LDFLAGS) -o $@
module_role_ducking_la_DEPENDENCIES = $(am__DEPENDENCIES_3)
am_module_role_ducking_la_OBJECTS = \
- modules/module_role_ducking_la-module-role-ducking.lo
+ modules/module_role_ducking_la-module-role-ducking.lo \
+ modules/module_role_ducking_la-stream-interaction.lo
module_role_ducking_la_OBJECTS = $(am_module_role_ducking_la_OBJECTS)
module_role_ducking_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
@@ -2073,7 +2086,7 @@ am__EXEEXT_9 = mainloop-test$(EXEEXT) strlist-test$(EXEEXT) \
$(am__EXEEXT_6) $(am__EXEEXT_7) $(am__EXEEXT_8)
@HAVE_SIGXCPU_TRUE at am__EXEEXT_10 = cpulimit-test$(EXEEXT) \
@HAVE_SIGXCPU_TRUE@ cpulimit-test2$(EXEEXT)
- at HAVE_GTK30_TRUE@am__EXEEXT_11 = gtk-test$(EXEEXT)
+ at HAVE_GLIB20_TRUE@@HAVE_GTK30_TRUE at am__EXEEXT_11 = gtk-test$(EXEEXT)
@HAVE_ALSA_TRUE at am__EXEEXT_12 = alsa-time-test$(EXEEXT)
am__EXEEXT_13 = ipacl-test$(EXEEXT) mcalign-test$(EXEEXT) \
pacat-simple$(EXEEXT) parec-simple$(EXEEXT) \
@@ -2211,19 +2224,19 @@ am__echo_cancel_test_SOURCES_DIST = \
modules/echo-cancel/adrian-aec.c \
modules/echo-cancel/adrian-aec.h modules/echo-cancel/adrian.c \
modules/echo-cancel/adrian.h modules/echo-cancel/speex.c
- at HAVE_ADRIAN_EC_TRUE@am__objects_24 = modules/echo-cancel/echo_cancel_test-adrian-aec.$(OBJEXT) \
+ at HAVE_ADRIAN_EC_TRUE@am__objects_25 = modules/echo-cancel/echo_cancel_test-adrian-aec.$(OBJEXT) \
@HAVE_ADRIAN_EC_TRUE@ modules/echo-cancel/echo_cancel_test-adrian.$(OBJEXT)
- at HAVE_SPEEX_TRUE@am__objects_25 = modules/echo-cancel/echo_cancel_test-speex.$(OBJEXT)
-am__objects_26 = modules/echo-cancel/echo_cancel_test-module-echo-cancel.$(OBJEXT) \
+ at HAVE_SPEEX_TRUE@am__objects_26 = modules/echo-cancel/echo_cancel_test-speex.$(OBJEXT)
+am__objects_27 = modules/echo-cancel/echo_cancel_test-module-echo-cancel.$(OBJEXT) \
modules/echo-cancel/echo_cancel_test-null.$(OBJEXT) \
- $(am__objects_24) $(am__objects_25)
-am_echo_cancel_test_OBJECTS = $(am__objects_26)
- at HAVE_ADRIAN_EC_TRUE@@HAVE_ORC_TRUE at am__objects_27 = modules/echo-cancel/echo_cancel_test-adrian-aec-orc-gen.$(OBJEXT)
-nodist_echo_cancel_test_OBJECTS = $(am__objects_27)
+ $(am__objects_25) $(am__objects_26)
+am_echo_cancel_test_OBJECTS = $(am__objects_27)
+ at HAVE_ADRIAN_EC_TRUE@@HAVE_ORC_TRUE at am__objects_28 = modules/echo-cancel/echo_cancel_test-adrian-aec-orc-gen.$(OBJEXT)
+nodist_echo_cancel_test_OBJECTS = $(am__objects_28)
echo_cancel_test_OBJECTS = $(am_echo_cancel_test_OBJECTS) \
$(nodist_echo_cancel_test_OBJECTS)
am__DEPENDENCIES_14 = $(am__DEPENDENCIES_3) $(am__DEPENDENCIES_13) \
- $(am__DEPENDENCIES_10) $(am__append_139)
+ $(am__DEPENDENCIES_10) $(am__append_140)
echo_cancel_test_DEPENDENCIES = $(am__DEPENDENCIES_14)
echo_cancel_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
@@ -2342,8 +2355,8 @@ mainloop_test_DEPENDENCIES = $(am__DEPENDENCIES_2) libpulse.la \
mainloop_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(mainloop_test_CFLAGS) \
$(CFLAGS) $(mainloop_test_LDFLAGS) $(LDFLAGS) -o $@
-am__objects_28 = tests/mainloop_test_glib-mainloop-test.$(OBJEXT)
-am_mainloop_test_glib_OBJECTS = $(am__objects_28)
+am__objects_29 = tests/mainloop_test_glib-mainloop-test.$(OBJEXT)
+am_mainloop_test_glib_OBJECTS = $(am__objects_29)
mainloop_test_glib_OBJECTS = $(am_mainloop_test_glib_OBJECTS)
am__DEPENDENCIES_15 = $(am__DEPENDENCIES_2) libpulse.la \
libpulsecommon- at PA_MAJORMINOR@.la
@@ -2469,7 +2482,7 @@ am__pulseaudio_SOURCES_DIST = daemon/caps.c daemon/caps.h \
daemon/dumpmodules.c daemon/dumpmodules.h \
daemon/ltdl-bind-now.c daemon/ltdl-bind-now.h daemon/main.c \
daemon/server-lookup.c daemon/server-lookup.h
- at HAVE_DBUS_TRUE@am__objects_29 = \
+ at HAVE_DBUS_TRUE@am__objects_30 = \
@HAVE_DBUS_TRUE@ daemon/pulseaudio-server-lookup.$(OBJEXT)
am_pulseaudio_OBJECTS = daemon/pulseaudio-caps.$(OBJEXT) \
daemon/pulseaudio-cmdline.$(OBJEXT) \
@@ -2477,7 +2490,7 @@ am_pulseaudio_OBJECTS = daemon/pulseaudio-caps.$(OBJEXT) \
daemon/pulseaudio-daemon-conf.$(OBJEXT) \
daemon/pulseaudio-dumpmodules.$(OBJEXT) \
daemon/pulseaudio-ltdl-bind-now.$(OBJEXT) \
- daemon/pulseaudio-main.$(OBJEXT) $(am__objects_29)
+ daemon/pulseaudio-main.$(OBJEXT) $(am__objects_30)
pulseaudio_OBJECTS = $(am_pulseaudio_OBJECTS)
pulseaudio_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(pulseaudio_CFLAGS) \
@@ -3282,8 +3295,10 @@ HAVE_BLUEZ_5 = @HAVE_BLUEZ_5@
HAVE_BLUEZ_5_NATIVE_HEADSET = @HAVE_BLUEZ_5_NATIVE_HEADSET@
HAVE_BLUEZ_5_OFONO_HEADSET = @HAVE_BLUEZ_5_OFONO_HEADSET@
HAVE_COREAUDIO = @HAVE_COREAUDIO@
+HAVE_CXX11 = @HAVE_CXX11@
HAVE_DBUS = @HAVE_DBUS@
HAVE_GLIB20 = @HAVE_GLIB20@
+HAVE_MEMFD = @HAVE_MEMFD@
HAVE_MKFIFO = @HAVE_MKFIFO@
HAVE_NEON = @HAVE_NEON@
HAVE_OSS_OUTPUT = @HAVE_OSS_OUTPUT@
@@ -3519,8 +3534,8 @@ AM_CPPFLAGS = \
-DPA_BUILDDIR=\"$(abs_builddir)\" \
-DPULSE_LOCALEDIR=\"$(localedir)\"
-AM_CFLAGS = $(PTHREAD_CFLAGS) $(am__append_1)
-AM_CXXFLAGS = $(AM_CFLAGS) $(am__append_2)
+AM_CFLAGS = -std=gnu11 $(PTHREAD_CFLAGS) $(am__append_1)
+AM_CXXFLAGS = -std=c++11 $(PTHREAD_CFLAGS) $(am__append_2)
SERVER_CFLAGS = -D__INCLUDED_FROM_PULSE_AUDIO
AM_LIBADD = $(PTHREAD_LIBS) $(INTLLIBS)
AM_LDADD = $(PTHREAD_LIBS) $(INTLLIBS)
@@ -3568,7 +3583,7 @@ BUILT_SOURCES = $(am__append_6) $(SYMDEF_FILES) builddirs
###################################
# Some minor stuff #
###################################
-CLEANFILES = $(am__append_7) $(am__append_49) \
+CLEANFILES = $(am__append_7) $(am__append_50) \
daemon/pulseaudio.desktop
@HAVE_ORC_TRUE at ORC_BUILT_SOURCE = $(addsuffix -orc-gen.c,$(ORC_SOURCE))
@HAVE_ORC_TRUE at ORC_BUILT_HEADER = $(addsuffix -orc-gen.h,$(ORC_SOURCE))
@@ -3578,7 +3593,7 @@ CLEANFILES = $(am__append_7) $(am__append_49) \
@HAVE_ORC_TRUE at cp_v_gen = $(cp_v_gen_$(V))
@HAVE_ORC_TRUE at cp_v_gen_ = $(cp_v_gen_$(AM_DEFAULT_VERBOSITY))
@HAVE_ORC_TRUE at cp_v_gen_0 = @echo " CP $@";
-ORC_SOURCE = pulsecore/svolume $(am__append_132)
+ORC_SOURCE = pulsecore/svolume $(am__append_133)
pulseaudio_SOURCES = daemon/caps.c daemon/caps.h daemon/cmdline.c \
daemon/cmdline.h daemon/cpulimit.c daemon/cpulimit.h \
daemon/daemon-conf.c daemon/daemon-conf.h daemon/dumpmodules.c \
@@ -3605,8 +3620,8 @@ pulseaudio_DEPENDENCIES = libpulsecore- at PA_MAJORMINOR@.la libpulsecommon- at PA_MAJ
###################################
# Utility programs #
###################################
-bin_SCRIPTS = esdcompat $(am__append_16) $(am__append_48) \
- $(am__append_116)
+bin_SCRIPTS = esdcompat $(am__append_16) $(am__append_49) \
+ $(am__append_117)
pacat_SOURCES = utils/pacat.c
pacat_LDADD = $(AM_LDADD) libpulse.la libpulsecommon- at PA_MAJORMINOR@.la $(LIBSNDFILE_LIBS)
pacat_CFLAGS = $(AM_CFLAGS) $(LIBSNDFILE_CFLAGS)
@@ -3637,7 +3652,7 @@ pax11publish_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS)
###################################
# We split the foreign code off to not be annoyed by warnings we don't care about
-noinst_LTLIBRARIES = liblo-test-util.la $(am__append_50) \
+noinst_LTLIBRARIES = liblo-test-util.la $(am__append_51) \
libpulsecore-foreign.la
TESTS_default = mainloop-test strlist-test close-test memblockq-test \
channelmap-test thread-mainloop-test utf8-test format-test \
@@ -3921,25 +3936,26 @@ libpulsecommon_ at PA_MAJORMINOR@_la_SOURCES = pulse/client-conf.c \
pulsecore/mcalign.c pulsecore/mcalign.h pulsecore/memblock.c \
pulsecore/memblock.h pulsecore/memblockq.c \
pulsecore/memblockq.h pulsecore/memchunk.c \
- pulsecore/memchunk.h pulsecore/native-common.h \
- pulsecore/once.c pulsecore/once.h pulsecore/packet.c \
- pulsecore/packet.h pulsecore/parseaddr.c pulsecore/parseaddr.h \
- pulsecore/pdispatch.c pulsecore/pdispatch.h pulsecore/pid.c \
- pulsecore/pid.h pulsecore/pipe.c pulsecore/pipe.h \
- pulsecore/memtrap.c pulsecore/memtrap.h pulsecore/aupdate.c \
- pulsecore/aupdate.h pulsecore/proplist-util.c \
- pulsecore/proplist-util.h pulsecore/pstream-util.c \
- pulsecore/pstream-util.h pulsecore/pstream.c \
- pulsecore/pstream.h pulsecore/queue.c pulsecore/queue.h \
- pulsecore/random.c pulsecore/random.h pulsecore/refcnt.h \
- pulsecore/srbchannel.c pulsecore/srbchannel.h \
- pulsecore/sample-util.c pulsecore/sample-util.h \
- pulsecore/shm.c pulsecore/shm.h pulsecore/bitset.c \
- pulsecore/bitset.h pulsecore/socket-client.c \
- pulsecore/socket-client.h pulsecore/socket-server.c \
- pulsecore/socket-server.h pulsecore/socket-util.c \
- pulsecore/socket-util.h pulsecore/strbuf.c pulsecore/strbuf.h \
- pulsecore/strlist.c pulsecore/strlist.h pulsecore/svolume_c.c \
+ pulsecore/memchunk.h pulsecore/native-common.c \
+ pulsecore/native-common.h pulsecore/once.c pulsecore/once.h \
+ pulsecore/packet.c pulsecore/packet.h pulsecore/parseaddr.c \
+ pulsecore/parseaddr.h pulsecore/pdispatch.c \
+ pulsecore/pdispatch.h pulsecore/pid.c pulsecore/pid.h \
+ pulsecore/pipe.c pulsecore/pipe.h pulsecore/memtrap.c \
+ pulsecore/memtrap.h pulsecore/aupdate.c pulsecore/aupdate.h \
+ pulsecore/proplist-util.c pulsecore/proplist-util.h \
+ pulsecore/pstream-util.c pulsecore/pstream-util.h \
+ pulsecore/pstream.c pulsecore/pstream.h pulsecore/queue.c \
+ pulsecore/queue.h pulsecore/random.c pulsecore/random.h \
+ pulsecore/refcnt.h pulsecore/srbchannel.c \
+ pulsecore/srbchannel.h pulsecore/sample-util.c \
+ pulsecore/sample-util.h pulsecore/mem.h pulsecore/shm.c \
+ pulsecore/shm.h pulsecore/bitset.c pulsecore/bitset.h \
+ pulsecore/socket-client.c pulsecore/socket-client.h \
+ pulsecore/socket-server.c pulsecore/socket-server.h \
+ pulsecore/socket-util.c pulsecore/socket-util.h \
+ pulsecore/strbuf.c pulsecore/strbuf.h pulsecore/strlist.c \
+ pulsecore/strlist.h pulsecore/svolume_c.c \
pulsecore/svolume_arm.c pulsecore/svolume_mmx.c \
pulsecore/svolume_sse.c pulsecore/tagstruct.c \
pulsecore/tagstruct.h pulsecore/time-smoother.c \
@@ -3947,22 +3963,22 @@ libpulsecommon_ at PA_MAJORMINOR@_la_SOURCES = pulse/client-conf.c \
pulsecore/tokenizer.h pulsecore/usergroup.c \
pulsecore/usergroup.h pulsecore/sndfile-util.c \
pulsecore/sndfile-util.h pulsecore/socket.h $(am__append_25) \
- $(am__append_26) $(am__append_27) $(am__append_34) \
- $(am__append_35) $(am__append_37) $(am__append_40) \
- $(am__append_41)
+ $(am__append_26) $(am__append_27) $(am__append_28) \
+ $(am__append_35) $(am__append_36) $(am__append_38) \
+ $(am__append_41) $(am__append_42)
# proplist-util.h uses these header files, but not the library itself!
libpulsecommon_ at PA_MAJORMINOR@_la_CFLAGS = $(AM_CFLAGS) \
- $(LIBJSON_CFLAGS) $(LIBSNDFILE_CFLAGS) $(am__append_28) \
- $(am__append_30) $(am__append_32) $(GLIB20_CFLAGS) \
- $(GTK30_CFLAGS) $(am__append_36) $(am__append_38) \
- $(am__append_42)
+ $(LIBJSON_CFLAGS) $(LIBSNDFILE_CFLAGS) $(am__append_29) \
+ $(am__append_31) $(am__append_33) $(GLIB20_CFLAGS) \
+ $(GTK30_CFLAGS) $(am__append_37) $(am__append_39) \
+ $(am__append_43)
libpulsecommon_ at PA_MAJORMINOR@_la_LDFLAGS = $(AM_LDFLAGS) \
- $(AM_LIBLDFLAGS) -avoid-version $(am__append_29) \
- $(am__append_31) $(am__append_33)
+ $(AM_LIBLDFLAGS) -avoid-version $(am__append_30) \
+ $(am__append_32) $(am__append_34)
libpulsecommon_ at PA_MAJORMINOR@_la_LIBADD = $(AM_LIBADD) \
$(LIBJSON_LIBS) $(LIBWRAP_LIBS) $(WINSOCK_LIBS) $(LTLIBICONV) \
- $(LIBSNDFILE_LIBS) $(am__append_39) $(am__append_43)
+ $(LIBSNDFILE_LIBS) $(am__append_40) $(am__append_44)
###################################
# Client library #
@@ -3977,8 +3993,8 @@ pulseinclude_HEADERS = pulse/cdecl.h pulse/channelmap.h \
pulse/sample.h pulse/scache.h pulse/simple.h pulse/stream.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)
-lib_LTLIBRARIES = libpulse.la libpulse-simple.la $(am__append_45)
+ pulse/xmalloc.h $(am__append_45)
+lib_LTLIBRARIES = libpulse.la libpulse-simple.la $(am__append_46)
# Public interface
libpulse_la_SOURCES = \
@@ -4013,10 +4029,10 @@ libpulse_la_SOURCES = \
pulse/volume.c pulse/volume.h \
pulse/xmalloc.c pulse/xmalloc.h
-libpulse_la_CFLAGS = $(AM_CFLAGS) $(LIBJSON_CFLAGS) $(am__append_46)
+libpulse_la_CFLAGS = $(AM_CFLAGS) $(LIBJSON_CFLAGS) $(am__append_47)
libpulse_la_LIBADD = $(AM_LIBADD) $(WINSOCK_LIBS) $(LTLIBICONV) \
$(LIBJSON_LIBS) libpulsecommon- at PA_MAJORMINOR@.la \
- $(am__append_47)
+ $(am__append_48)
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)
@@ -4088,23 +4104,23 @@ libpulsecore_ at PA_MAJORMINOR@_la_SOURCES = \
pulsecore/source-output.c pulsecore/source-output.h \
pulsecore/source.c pulsecore/source.h pulsecore/start-child.c \
pulsecore/start-child.h pulsecore/thread-mq.c \
- pulsecore/thread-mq.h pulsecore/database.h $(am__append_52) \
- $(am__append_55) $(am__append_58) $(am__append_61) \
- $(am__append_64) $(am__append_67) $(am__append_68) \
- $(am__append_71) $(am__append_74)
-libpulsecore_ at PA_MAJORMINOR@_la_CFLAGS = $(AM_CFLAGS) $(SERVER_CFLAGS) \
- $(LIBSNDFILE_CFLAGS) $(WINSOCK_CFLAGS) $(am__append_53) \
+ pulsecore/thread-mq.h pulsecore/database.h $(am__append_53) \
$(am__append_56) $(am__append_59) $(am__append_62) \
- $(am__append_65) $(am__append_69) $(am__append_72) \
- $(am__append_75)
+ $(am__append_65) $(am__append_68) $(am__append_69) \
+ $(am__append_72) $(am__append_75)
+libpulsecore_ at PA_MAJORMINOR@_la_CFLAGS = $(AM_CFLAGS) $(SERVER_CFLAGS) \
+ $(LIBSNDFILE_CFLAGS) $(WINSOCK_CFLAGS) $(am__append_54) \
+ $(am__append_57) $(am__append_60) $(am__append_63) \
+ $(am__append_66) $(am__append_70) $(am__append_73) \
+ $(am__append_76)
libpulsecore_ at PA_MAJORMINOR@_la_LDFLAGS = $(AM_LDFLAGS) \
- $(AM_LIBLDFLAGS) -avoid-version $(am__append_57)
+ $(AM_LIBLDFLAGS) -avoid-version $(am__append_58)
libpulsecore_ at PA_MAJORMINOR@_la_LIBADD = $(AM_LIBADD) $(LIBLTDL) \
$(LIBSNDFILE_LIBS) $(WINSOCK_LIBS) $(LTLIBICONV) \
libpulsecommon- at PA_MAJORMINOR@.la libpulse.la \
- libpulsecore-foreign.la $(am__append_51) $(am__append_54) \
- $(am__append_60) $(am__append_63) $(am__append_66) \
- $(am__append_70) $(am__append_73) $(am__append_76)
+ libpulsecore-foreign.la $(am__append_52) $(am__append_55) \
+ $(am__append_61) $(am__append_64) $(am__append_67) \
+ $(am__append_71) $(am__append_74) $(am__append_77)
@HAVE_NEON_TRUE at libpulsecore_sconv_neon_la_SOURCES = pulsecore/sconv_neon.c
@HAVE_NEON_TRUE at libpulsecore_sconv_neon_la_CFLAGS = $(AM_CFLAGS) $(NEON_CFLAGS)
@HAVE_NEON_TRUE at libpulsecore_mix_neon_la_SOURCES = pulsecore/mix_neon.c
@@ -4127,8 +4143,8 @@ libpulsecore_foreign_la_CFLAGS = $(AM_CFLAGS) $(FOREIGN_CFLAGS)
### the head, and not the other way!
modlibexec_LTLIBRARIES = libcli.la libprotocol-cli.la \
libprotocol-simple.la libprotocol-http.la \
- libprotocol-native.la $(am__append_77) $(am__append_78) \
- $(am__append_79) $(am__append_80) $(am__append_83) \
+ libprotocol-native.la $(am__append_78) $(am__append_79) \
+ $(am__append_80) $(am__append_81) $(am__append_84) \
module-cli.la module-cli-protocol-tcp.la \
module-simple-protocol-tcp.la module-null-sink.la \
module-null-source.la module-sine-source.la module-detect.la \
@@ -4149,17 +4165,17 @@ modlibexec_LTLIBRARIES = libcli.la libprotocol-cli.la \
module-virtual-source.la module-virtual-surround-sink.la \
module-switch-on-connect.la module-switch-on-port-available.la \
module-filter-apply.la module-filter-heuristics.la \
- module-role-ducking.la $(am__append_84) $(am__append_85) \
- $(am__append_86) $(am__append_87) $(am__append_88) \
- $(am__append_89) $(am__append_90) $(am__append_91) \
- $(am__append_92) $(am__append_93) $(am__append_94) \
- $(am__append_95) $(am__append_96) $(am__append_97) \
- $(am__append_98) $(am__append_99) $(am__append_100) \
- $(am__append_101) $(am__append_102) $(am__append_103) \
- $(am__append_105) $(am__append_106) $(am__append_107) \
- $(am__append_108) $(am__append_109) $(am__append_110) \
- $(am__append_111) $(am__append_112) $(am__append_113) \
- $(am__append_114) $(am__append_115)
+ module-role-ducking.la $(am__append_85) $(am__append_86) \
+ $(am__append_87) $(am__append_88) $(am__append_89) \
+ $(am__append_90) $(am__append_91) $(am__append_92) \
+ $(am__append_93) $(am__append_94) $(am__append_95) \
+ $(am__append_96) $(am__append_97) $(am__append_98) \
+ $(am__append_99) $(am__append_100) $(am__append_101) \
+ $(am__append_102) $(am__append_103) $(am__append_104) \
+ $(am__append_106) $(am__append_107) $(am__append_108) \
+ $(am__append_109) $(am__append_110) $(am__append_111) \
+ $(am__append_112) $(am__append_113) $(am__append_114) \
+ $(am__append_115) $(am__append_116)
libprotocol_simple_la_SOURCES = pulsecore/protocol-simple.c pulsecore/protocol-simple.h
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
@@ -4174,11 +4190,11 @@ 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)
+ $(am__append_82)
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)
+ libpulsecommon- at PA_MAJORMINOR@.la libpulse.la $(am__append_83)
@HAVE_ESOUND_TRUE at libprotocol_esound_la_SOURCES = pulsecore/protocol-esound.c pulsecore/protocol-esound.h pulsecore/esound.h
@HAVE_ESOUND_TRUE at 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
@@ -4313,7 +4329,7 @@ SYMDEF_FILES = module-cli-symdef.h module-cli-protocol-tcp-symdef.h \
module-switch-on-connect-symdef.h \
module-switch-on-port-available-symdef.h \
module-filter-apply-symdef.h module-filter-heuristics-symdef.h \
- $(am__append_117)
+ $(am__append_118)
# Simple protocol
module_simple_protocol_tcp_la_SOURCES = modules/module-protocol-stub.c
@@ -4448,10 +4464,10 @@ module_remap_source_la_LDFLAGS = $(MODULE_LDFLAGS)
module_remap_source_la_LIBADD = $(MODULE_LIBADD)
module_ladspa_sink_la_SOURCES = modules/module-ladspa-sink.c modules/ladspa.h
module_ladspa_sink_la_CFLAGS = -DLADSPA_PATH=\"$(libdir)/ladspa:/usr/local/lib/ladspa:/usr/lib/ladspa:/usr/local/lib64/ladspa:/usr/lib64/ladspa\" \
- $(AM_CFLAGS) $(SERVER_CFLAGS) $(am__append_118)
+ $(AM_CFLAGS) $(SERVER_CFLAGS) $(am__append_119)
module_ladspa_sink_la_LDFLAGS = $(MODULE_LDFLAGS)
module_ladspa_sink_la_LIBADD = $(MODULE_LIBADD) $(LIBLTDL) \
- $(am__append_119)
+ $(am__append_120)
module_equalizer_sink_la_SOURCES = modules/module-equalizer-sink.c
module_equalizer_sink_la_CFLAGS = $(AM_CFLAGS) $(SERVER_CFLAGS) $(DBUS_CFLAGS) $(FFTW_CFLAGS)
module_equalizer_sink_la_LDFLAGS = $(MODULE_LDFLAGS)
@@ -4535,12 +4551,12 @@ libalsa_util_la_SOURCES = modules/alsa/alsa-util.c \
modules/alsa/alsa-mixer.h modules/alsa/alsa-sink.c \
modules/alsa/alsa-sink.h modules/alsa/alsa-source.c \
modules/alsa/alsa-source.h modules/reserve-wrap.c \
- modules/reserve-wrap.h $(am__append_120) $(am__append_123)
+ modules/reserve-wrap.h $(am__append_121) $(am__append_124)
libalsa_util_la_LDFLAGS = -avoid-version
libalsa_util_la_LIBADD = $(MODULE_LIBADD) $(ASOUNDLIB_LIBS) \
- $(am__append_121) $(am__append_124)
+ $(am__append_122) $(am__append_125)
libalsa_util_la_CFLAGS = $(AM_CFLAGS) $(SERVER_CFLAGS) \
- $(ASOUNDLIB_CFLAGS) $(am__append_122) $(am__append_125)
+ $(ASOUNDLIB_CFLAGS) $(am__append_123) $(am__append_126)
module_alsa_sink_la_SOURCES = modules/alsa/module-alsa-sink.c
module_alsa_sink_la_LDFLAGS = $(MODULE_LDFLAGS)
module_alsa_sink_la_LIBADD = $(MODULE_LIBADD) $(ASOUNDLIB_LIBS) libalsa-util.la
@@ -4619,7 +4635,9 @@ module_position_event_sounds_la_LIBADD = $(MODULE_LIBADD)
module_position_event_sounds_la_CFLAGS = $(AM_CFLAGS)
# Ducking effect based on stream roles
-module_role_ducking_la_SOURCES = modules/module-role-ducking.c
+module_role_ducking_la_SOURCES = modules/module-role-ducking.c \
+ modules/stream-interaction.c modules/stream-interaction.h
+
module_role_ducking_la_LDFLAGS = $(MODULE_LDFLAGS)
module_role_ducking_la_LIBADD = $(MODULE_LIBADD)
module_role_ducking_la_CFLAGS = $(AM_CFLAGS)
@@ -4632,7 +4650,9 @@ module_augment_properties_la_LIBADD = $(MODULE_LIBADD)
module_augment_properties_la_CFLAGS = $(AM_CFLAGS) -DDESKTOPFILEDIR=\"/usr/share/applications\"
# Cork certain streams while others are active (e.g. cork music when phone streams appear)
-module_role_cork_la_SOURCES = modules/module-role-cork.c
+module_role_cork_la_SOURCES = modules/module-role-cork.c \
+ modules/stream-interaction.c modules/stream-interaction.h
+
module_role_cork_la_LDFLAGS = $(MODULE_LDFLAGS)
module_role_cork_la_LIBADD = $(MODULE_LIBADD)
module_role_cork_la_CFLAGS = $(AM_CFLAGS)
@@ -4647,15 +4667,15 @@ module_device_manager_la_CFLAGS = $(AM_CFLAGS)
module_device_restore_la_SOURCES = modules/module-device-restore.c
module_device_restore_la_LDFLAGS = $(MODULE_LDFLAGS)
module_device_restore_la_LIBADD = $(MODULE_LIBADD) \
- libprotocol-native.la $(am__append_126)
-module_device_restore_la_CFLAGS = $(AM_CFLAGS) $(am__append_127)
+ libprotocol-native.la $(am__append_127)
+module_device_restore_la_CFLAGS = $(AM_CFLAGS) $(am__append_128)
# Stream volume/muted/device restore module
module_stream_restore_la_SOURCES = modules/module-stream-restore.c
module_stream_restore_la_LDFLAGS = $(MODULE_LDFLAGS)
module_stream_restore_la_LIBADD = $(MODULE_LIBADD) \
- libprotocol-native.la $(am__append_128)
-module_stream_restore_la_CFLAGS = $(AM_CFLAGS) $(am__append_129)
+ libprotocol-native.la $(am__append_129)
+module_stream_restore_la_CFLAGS = $(AM_CFLAGS) $(am__append_130)
# Card profile restore module
module_card_restore_la_SOURCES = modules/module-card-restore.c
@@ -4697,13 +4717,13 @@ module_suspend_on_idle_la_CFLAGS = $(AM_CFLAGS)
module_echo_cancel_la_SOURCES = \
modules/echo-cancel/module-echo-cancel.c \
modules/echo-cancel/null.c modules/echo-cancel/echo-cancel.h \
- $(am__append_130) $(am__append_135)
+ $(am__append_131) $(am__append_136)
module_echo_cancel_la_LDFLAGS = $(MODULE_LDFLAGS)
-module_echo_cancel_la_LIBADD = $(MODULE_LIBADD) $(am__append_133) \
- $(am__append_137) $(am__append_139)
+module_echo_cancel_la_LIBADD = $(MODULE_LIBADD) $(am__append_134) \
+ $(am__append_138) $(am__append_140)
module_echo_cancel_la_CFLAGS = $(AM_CFLAGS) $(SERVER_CFLAGS) \
- $(am__append_131) $(am__append_134) $(am__append_136) \
- $(am__append_138)
+ $(am__append_132) $(am__append_135) $(am__append_137) \
+ $(am__append_139)
@HAVE_ADRIAN_EC_TRUE@@HAVE_ORC_TRUE at nodist_module_echo_cancel_la_SOURCES = \
@HAVE_ADRIAN_EC_TRUE@@HAVE_ORC_TRUE@ modules/echo-cancel/adrian-aec-orc-gen.c \
@HAVE_ADRIAN_EC_TRUE@@HAVE_ORC_TRUE@ modules/echo-cancel/adrian-aec-orc-gen.h
@@ -4799,8 +4819,8 @@ module_bluez4_device_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) $(SBC_CFLAGS)
# Bluetooth BlueZ 5 sink / source
libbluez5_util_la_SOURCES = modules/bluetooth/bluez5-util.c \
modules/bluetooth/bluez5-util.h \
- modules/bluetooth/a2dp-codecs.h $(am__append_140) \
- $(am__append_141)
+ modules/bluetooth/a2dp-codecs.h $(am__append_141) \
+ $(am__append_142)
libbluez5_util_la_LDFLAGS = -avoid-version
libbluez5_util_la_LIBADD = $(MODULE_LIBADD) $(DBUS_LIBS)
libbluez5_util_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS)
@@ -5348,6 +5368,8 @@ pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-memblockq.lo: \
pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp)
pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-memchunk.lo: \
pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp)
+pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-native-common.lo: \
+ pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp)
pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-once.lo: \
pulsecore/$(am__dirstamp) pulsecore/$(DEPDIR)/$(am__dirstamp)
pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-packet.lo: \
@@ -6074,11 +6096,15 @@ module-rescue-streams.la: $(module_rescue_streams_la_OBJECTS) $(module_rescue_st
$(AM_V_CCLD)$(module_rescue_streams_la_LINK) -rpath $(modlibexecdir) $(module_rescue_streams_la_OBJECTS) $(module_rescue_streams_la_LIBADD) $(LIBS)
modules/module_role_cork_la-module-role-cork.lo: \
modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp)
+modules/module_role_cork_la-stream-interaction.lo: \
+ modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp)
module-role-cork.la: $(module_role_cork_la_OBJECTS) $(module_role_cork_la_DEPENDENCIES) $(EXTRA_module_role_cork_la_DEPENDENCIES)
$(AM_V_CCLD)$(module_role_cork_la_LINK) -rpath $(modlibexecdir) $(module_role_cork_la_OBJECTS) $(module_role_cork_la_LIBADD) $(LIBS)
modules/module_role_ducking_la-module-role-ducking.lo: \
modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp)
+modules/module_role_ducking_la-stream-interaction.lo: \
+ modules/$(am__dirstamp) modules/$(DEPDIR)/$(am__dirstamp)
module-role-ducking.la: $(module_role_ducking_la_OBJECTS) $(module_role_ducking_la_DEPENDENCIES) $(EXTRA_module_role_ducking_la_DEPENDENCIES)
$(AM_V_CCLD)$(module_role_ducking_la_LINK) -rpath $(modlibexecdir) $(module_role_ducking_la_OBJECTS) $(module_role_ducking_la_LIBADD) $(LIBS)
@@ -6915,7 +6941,9 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote at modules/$(DEPDIR)/module_position_event_sounds_la-module-position-event-sounds.Plo at am__quote@
@AMDEP_TRUE@@am__include@ @am__quote at modules/$(DEPDIR)/module_rescue_streams_la-module-rescue-streams.Plo at am__quote@
@AMDEP_TRUE@@am__include@ @am__quote at modules/$(DEPDIR)/module_role_cork_la-module-role-cork.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at modules/$(DEPDIR)/module_role_cork_la-stream-interaction.Plo at am__quote@
@AMDEP_TRUE@@am__include@ @am__quote at modules/$(DEPDIR)/module_role_ducking_la-module-role-ducking.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at modules/$(DEPDIR)/module_role_ducking_la-stream-interaction.Plo at am__quote@
@AMDEP_TRUE@@am__include@ @am__quote at modules/$(DEPDIR)/module_rygel_media_server_la-module-rygel-media-server.Plo at am__quote@
@AMDEP_TRUE@@am__include@ @am__quote at modules/$(DEPDIR)/module_simple_protocol_tcp_la-module-protocol-stub.Plo at am__quote@
@AMDEP_TRUE@@am__include@ @am__quote at modules/$(DEPDIR)/module_simple_protocol_unix_la-module-protocol-stub.Plo at am__quote@
@@ -7072,6 +7100,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote at pulsecore/$(DEPDIR)/libpulsecommon_ at PA_MAJORMINOR@_la-memtrap.Plo at am__quote@
@AMDEP_TRUE@@am__include@ @am__quote at pulsecore/$(DEPDIR)/libpulsecommon_ at PA_MAJORMINOR@_la-mutex-posix.Plo at am__quote@
@AMDEP_TRUE@@am__include@ @am__quote at pulsecore/$(DEPDIR)/libpulsecommon_ at PA_MAJORMINOR@_la-mutex-win32.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at pulsecore/$(DEPDIR)/libpulsecommon_ at PA_MAJORMINOR@_la-native-common.Plo at am__quote@
@AMDEP_TRUE@@am__include@ @am__quote at pulsecore/$(DEPDIR)/libpulsecommon_ at PA_MAJORMINOR@_la-once.Plo at am__quote@
@AMDEP_TRUE@@am__include@ @am__quote at pulsecore/$(DEPDIR)/libpulsecommon_ at PA_MAJORMINOR@_la-packet.Plo at am__quote@
@AMDEP_TRUE@@am__include@ @am__quote at pulsecore/$(DEPDIR)/libpulsecommon_ at PA_MAJORMINOR@_la-parseaddr.Plo at am__quote@
@@ -7812,6 +7841,13 @@ pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-memchunk.lo: pulsecore/memchunk.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_ at PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-memchunk.lo `test -f 'pulsecore/memchunk.c' || echo '$(srcdir)/'`pulsecore/memchunk.c
+pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-native-common.lo: pulsecore/native-common.c
+ at am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_ at PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-native-common.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_ at PA_MAJORMINOR@_la-native-common.Tpo -c -o pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-native-common.lo `test -f 'pulsecore/native-common.c' [...]
+ at am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_ at PA_MAJORMINOR@_la-native-common.Tpo pulsecore/$(DEPDIR)/libpulsecommon_ at PA_MAJORMINOR@_la-native-common.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pulsecore/native-common.c' object='pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-native-common.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@ $(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_ at PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -c -o pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-native-common.lo `test -f 'pulsecore/native-common.c' || echo '$(srcdir)/'`pulsecore/native-common.c
+
pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-once.lo: pulsecore/once.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpulsecommon_ at PA_MAJORMINOR@_la_CFLAGS) $(CFLAGS) -MT pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-once.lo -MD -MP -MF pulsecore/$(DEPDIR)/libpulsecommon_ at PA_MAJORMINOR@_la-once.Tpo -c -o pulsecore/libpulsecommon_ at PA_MAJORMINOR@_la-once.lo `test -f 'pulsecore/once.c' || echo '$(srcdir)/'`pulsecore/once.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) pulsecore/$(DEPDIR)/libpulsecommon_ at PA_MAJORMINOR@_la-once.Tpo pulsecore/$(DEPDIR)/libpulsecommon_ at PA_MAJORMINOR@_la-once.Plo
@@ -9023,6 +9059,13 @@ modules/module_role_cork_la-module-role-cork.lo: modules/module-role-cork.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_role_cork_la_CFLAGS) $(CFLAGS) -c -o modules/module_role_cork_la-module-role-cork.lo `test -f 'modules/module-role-cork.c' || echo '$(srcdir)/'`modules/module-role-cork.c
+modules/module_role_cork_la-stream-interaction.lo: modules/stream-interaction.c
+ at am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_role_cork_la_CFLAGS) $(CFLAGS) -MT modules/module_role_cork_la-stream-interaction.lo -MD -MP -MF modules/$(DEPDIR)/module_role_cork_la-stream-interaction.Tpo -c -o modules/module_role_cork_la-stream-interaction.lo `test -f 'modules/stream-interaction.c' || echo '$(srcdir)/'`modules/stream-interaction.c
+ at am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_role_cork_la-stream-interaction.Tpo modules/$(DEPDIR)/module_role_cork_la-stream-interaction.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/stream-interaction.c' object='modules/module_role_cork_la-stream-interaction.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@ $(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_role_cork_la_CFLAGS) $(CFLAGS) -c -o modules/module_role_cork_la-stream-interaction.lo `test -f 'modules/stream-interaction.c' || echo '$(srcdir)/'`modules/stream-interaction.c
+
modules/module_role_ducking_la-module-role-ducking.lo: modules/module-role-ducking.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_role_ducking_la_CFLAGS) $(CFLAGS) -MT modules/module_role_ducking_la-module-role-ducking.lo -MD -MP -MF modules/$(DEPDIR)/module_role_ducking_la-module-role-ducking.Tpo -c -o modules/module_role_ducking_la-module-role-ducking.lo `test -f 'modules/module-role-ducking.c' || echo '$(srcdir)/'`modules [...]
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_role_ducking_la-module-role-ducking.Tpo modules/$(DEPDIR)/module_role_ducking_la-module-role-ducking.Plo
@@ -9030,6 +9073,13 @@ modules/module_role_ducking_la-module-role-ducking.lo: modules/module-role-ducki
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_role_ducking_la_CFLAGS) $(CFLAGS) -c -o modules/module_role_ducking_la-module-role-ducking.lo `test -f 'modules/module-role-ducking.c' || echo '$(srcdir)/'`modules/module-role-ducking.c
+modules/module_role_ducking_la-stream-interaction.lo: modules/stream-interaction.c
+ at am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_role_ducking_la_CFLAGS) $(CFLAGS) -MT modules/module_role_ducking_la-stream-interaction.lo -MD -MP -MF modules/$(DEPDIR)/module_role_ducking_la-stream-interaction.Tpo -c -o modules/module_role_ducking_la-stream-interaction.lo `test -f 'modules/stream-interaction.c' || echo '$(srcdir)/'`modules/str [...]
+ at am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/$(DEPDIR)/module_role_ducking_la-stream-interaction.Tpo modules/$(DEPDIR)/module_role_ducking_la-stream-interaction.Plo
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='modules/stream-interaction.c' object='modules/module_role_ducking_la-stream-interaction.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@ $(AM_V_CC at am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_role_ducking_la_CFLAGS) $(CFLAGS) -c -o modules/module_role_ducking_la-stream-interaction.lo `test -f 'modules/stream-interaction.c' || echo '$(srcdir)/'`modules/stream-interaction.c
+
modules/rtp/module_rtp_recv_la-module-rtp-recv.lo: modules/rtp/module-rtp-recv.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(module_rtp_recv_la_CFLAGS) $(CFLAGS) -MT modules/rtp/module_rtp_recv_la-module-rtp-recv.lo -MD -MP -MF modules/rtp/$(DEPDIR)/module_rtp_recv_la-module-rtp-recv.Tpo -c -o modules/rtp/module_rtp_recv_la-module-rtp-recv.lo `test -f 'modules/rtp/module-rtp-recv.c' || echo '$(srcdir)/'`modules/rtp/module-rtp-recv.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) modules/rtp/$(DEPDIR)/module_rtp_recv_la-module-rtp-recv.Tpo modules/rtp/$(DEPDIR)/module_rtp_recv_la-module-rtp-recv.Plo
diff --git a/src/daemon/cmdline.c b/src/daemon/cmdline.c
index 117147d..0454b6d 100644
--- a/src/daemon/cmdline.c
+++ b/src/daemon/cmdline.c
@@ -63,6 +63,7 @@ enum {
ARG_CHECK,
ARG_NO_CPU_LIMIT,
ARG_DISABLE_SHM,
+ ARG_ENABLE_MEMFD,
ARG_DUMP_RESAMPLE_METHODS,
ARG_SYSTEM,
ARG_CLEANUP_SHM,
@@ -100,6 +101,7 @@ static const struct option long_options[] = {
{"system", 2, 0, ARG_SYSTEM},
{"no-cpu-limit", 2, 0, ARG_NO_CPU_LIMIT},
{"disable-shm", 2, 0, ARG_DISABLE_SHM},
+ {"enable-memfd", 2, 0, ARG_ENABLE_MEMFD},
{"dump-resample-methods", 2, 0, ARG_DUMP_RESAMPLE_METHODS},
{"cleanup-shm", 2, 0, ARG_CLEANUP_SHM},
{NULL, 0, 0, 0}
@@ -152,7 +154,8 @@ void pa_cmdline_help(const char *argv0) {
" --use-pid-file[=BOOL] Create a PID file\n"
" --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n"
" platforms that support it.\n"
- " --disable-shm[=BOOL] Disable shared memory support.\n\n"
+ " --disable-shm[=BOOL] Disable shared memory support.\n"
+ " --enable-memfd[=BOOL] Enable memfd shared memory support.\n\n"
"STARTUP SCRIPT:\n"
" -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module with\n"
@@ -389,6 +392,14 @@ int pa_cmdline_parse(pa_daemon_conf *conf, int argc, char *const argv [], int *d
conf->disable_shm = !!b;
break;
+ case ARG_ENABLE_MEMFD:
+ if ((b = optarg ? pa_parse_boolean(optarg) : 1) < 0) {
+ pa_log(_("--enable-memfd expects boolean argument"));
+ goto fail;
+ }
+ conf->disable_memfd = !b;
+ break;
+
default:
goto fail;
}
diff --git a/src/daemon/daemon-conf.c b/src/daemon/daemon-conf.c
index 288aed2..965a5c8 100644
--- a/src/daemon/daemon-conf.c
+++ b/src/daemon/daemon-conf.c
@@ -92,6 +92,7 @@ static const pa_daemon_conf default_conf = {
#endif
.no_cpu_limit = true,
.disable_shm = false,
+ .disable_memfd = true,
.lock_memory = false,
.deferred_volume = true,
.default_n_fragments = 4,
@@ -526,6 +527,7 @@ int pa_daemon_conf_load(pa_daemon_conf *c, const char *filename) {
{ "cpu-limit", pa_config_parse_not_bool, &c->no_cpu_limit, NULL },
{ "disable-shm", pa_config_parse_bool, &c->disable_shm, NULL },
{ "enable-shm", pa_config_parse_not_bool, &c->disable_shm, NULL },
+ { "enable-memfd", pa_config_parse_not_bool, &c->disable_memfd, NULL },
{ "flat-volumes", pa_config_parse_bool, &c->flat_volumes, NULL },
{ "lock-memory", pa_config_parse_bool, &c->lock_memory, NULL },
{ "enable-deferred-volume", pa_config_parse_bool, &c->deferred_volume, NULL },
diff --git a/src/daemon/daemon-conf.h b/src/daemon/daemon-conf.h
index 458784c..82b619f 100644
--- a/src/daemon/daemon-conf.h
+++ b/src/daemon/daemon-conf.h
@@ -66,6 +66,7 @@ typedef struct pa_daemon_conf {
system_instance,
no_cpu_limit,
disable_shm,
+ disable_memfd,
disable_remixing,
disable_lfe_remixing,
load_default_script_file,
diff --git a/src/daemon/default.pa.in b/src/daemon/default.pa.in
index 783e326..7a68653 100755
--- a/src/daemon/default.pa.in
+++ b/src/daemon/default.pa.in
@@ -19,19 +19,6 @@
# (i.e. not in system mode)
changequote(`[', `]')dnl Set up m4 quoting
-.nofail
-
-### Load something into the sample cache
-ifelse(@OS_IS_WIN32@, 1, [dnl
-load-sample x11-bell %WINDIR%\Media\ding.wav
-load-sample-dir-lazy %WINDIR%\Media\*.wav
-], [dnl
-#load-sample-lazy x11-bell /usr/share/sounds/freedesktop/stereo/bell.oga
-#load-sample-lazy pulse-hotplug /usr/share/sounds/freedesktop/stereo/device-added.oga
-#load-sample-lazy pulse-coldplug /usr/share/sounds/freedesktop/stereo/device-added.oga
-#load-sample-lazy pulse-access /usr/share/sounds/freedesktop/stereo/message.oga
-])dnl
-
.fail
### Automatically restore the volume of streams and devices
@@ -174,24 +161,6 @@ load-module module-filter-heuristics
load-module module-filter-apply
])dnl
-ifelse(@HAVE_X11@, 1, [dnl
-# X11 modules should not be started from default.pa so that one daemon
-# can be shared by multiple sessions.
-
-### Load X11 bell module
-#load-module module-x11-bell sample=x11-bell
-
-### Register ourselves in the X11 session manager
-#load-module module-x11-xsmp
-
-### Publish connection data in the X11 root window
-#.ifexists module-x11-publish at PA_SOEXT@
-#.nofail
-#load-module module-x11-publish
-#.fail
-#.endif
-])dnl
-
### Make some devices default
#set-default-sink output
#set-default-source input
diff --git a/src/daemon/main.c b/src/daemon/main.c
index c2f47b6..ae1185d 100644
--- a/src/daemon/main.c
+++ b/src/daemon/main.c
@@ -1017,7 +1017,9 @@ int main(int argc, char *argv[]) {
pa_assert_se(mainloop = pa_mainloop_new());
- if (!(c = pa_core_new(pa_mainloop_get_api(mainloop), !conf->disable_shm, conf->shm_size))) {
+ if (!(c = pa_core_new(pa_mainloop_get_api(mainloop), !conf->disable_shm,
+ !conf->disable_shm && !conf->disable_memfd && pa_memfd_is_locally_supported(),
+ conf->shm_size))) {
pa_log(_("pa_core_new() failed."));
goto finish;
}
diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c
index 1fe2a02..8079147 100644
--- a/src/modules/alsa/alsa-mixer.c
+++ b/src/modules/alsa/alsa-mixer.c
@@ -1518,287 +1518,263 @@ static int check_required(pa_alsa_element *e, snd_mixer_elem_t *me) {
return 0;
}
-static int element_probe(pa_alsa_element *e, snd_mixer_t *m) {
- snd_mixer_selem_id_t *sid;
- snd_mixer_elem_t *me;
+static int element_ask_vol_dB(snd_mixer_elem_t *me, pa_alsa_direction_t dir, long value, long *dBvalue) {
+ if (dir == PA_ALSA_DIRECTION_OUTPUT)
+ return snd_mixer_selem_ask_playback_vol_dB(me, value, dBvalue);
+ else
+ return snd_mixer_selem_ask_capture_vol_dB(me, value, dBvalue);
+}
- pa_assert(m);
- pa_assert(e);
- pa_assert(e->path);
+static bool element_probe_volume(pa_alsa_element *e, snd_mixer_elem_t *me) {
- SELEM_INIT(sid, e->alsa_name);
+ long min_dB = 0, max_dB = 0;
+ int r;
+ bool is_mono;
+ pa_channel_position_t p;
- if (!(me = snd_mixer_find_selem(m, sid))) {
+ if (e->direction == PA_ALSA_DIRECTION_OUTPUT) {
+ if (!snd_mixer_selem_has_playback_volume(me)) {
+ if (e->direction_try_other && snd_mixer_selem_has_capture_volume(me))
+ e->direction = PA_ALSA_DIRECTION_INPUT;
+ else
+ return false;
+ }
+ } else {
+ if (!snd_mixer_selem_has_capture_volume(me)) {
+ if (e->direction_try_other && snd_mixer_selem_has_playback_volume(me))
+ e->direction = PA_ALSA_DIRECTION_OUTPUT;
+ else
+ return false;
+ }
+ }
- if (e->required != PA_ALSA_REQUIRED_IGNORE)
- return -1;
+ e->direction_try_other = false;
- e->switch_use = PA_ALSA_SWITCH_IGNORE;
- e->volume_use = PA_ALSA_VOLUME_IGNORE;
- e->enumeration_use = PA_ALSA_ENUMERATION_IGNORE;
+ if (e->direction == PA_ALSA_DIRECTION_OUTPUT)
+ r = snd_mixer_selem_get_playback_volume_range(me, &e->min_volume, &e->max_volume);
+ else
+ r = snd_mixer_selem_get_capture_volume_range(me, &e->min_volume, &e->max_volume);
- return 0;
+ if (r < 0) {
+ pa_log_warn("Failed to get volume range of %s: %s", e->alsa_name, pa_alsa_strerror(r));
+ return false;
}
- if (e->switch_use != PA_ALSA_SWITCH_IGNORE) {
- if (e->direction == PA_ALSA_DIRECTION_OUTPUT) {
-
- if (!snd_mixer_selem_has_playback_switch(me)) {
- if (e->direction_try_other && snd_mixer_selem_has_capture_switch(me))
- e->direction = PA_ALSA_DIRECTION_INPUT;
- else
- e->switch_use = PA_ALSA_SWITCH_IGNORE;
- }
+ if (e->min_volume >= e->max_volume) {
+ pa_log_warn("Your kernel driver is broken: it reports a volume range from %li to %li which makes no sense.",
+ e->min_volume, e->max_volume);
+ return false;
+ }
+ if (e->volume_use == PA_ALSA_VOLUME_CONSTANT && (e->min_volume > e->constant_volume || e->max_volume < e->constant_volume)) {
+ pa_log_warn("Constant volume %li configured for element %s, but the available range is from %li to %li.",
+ e->constant_volume, e->alsa_name, e->min_volume, e->max_volume);
+ return false;
+ }
- } else {
- if (!snd_mixer_selem_has_capture_switch(me)) {
- if (e->direction_try_other && snd_mixer_selem_has_playback_switch(me))
- e->direction = PA_ALSA_DIRECTION_OUTPUT;
- else
- e->switch_use = PA_ALSA_SWITCH_IGNORE;
- }
- }
+ if (e->db_fix && ((e->min_volume > e->db_fix->min_step) || (e->max_volume < e->db_fix->max_step))) {
+ pa_log_warn("The step range of the decibel fix for element %s (%li-%li) doesn't fit to the "
+ "real hardware range (%li-%li). Disabling the decibel fix.", e->alsa_name,
+ e->db_fix->min_step, e->db_fix->max_step, e->min_volume, e->max_volume);
- if (e->switch_use != PA_ALSA_SWITCH_IGNORE)
- e->direction_try_other = false;
+ decibel_fix_free(e->db_fix);
+ e->db_fix = NULL;
}
- if (e->volume_use != PA_ALSA_VOLUME_IGNORE) {
-
- if (e->direction == PA_ALSA_DIRECTION_OUTPUT) {
-
- if (!snd_mixer_selem_has_playback_volume(me)) {
- if (e->direction_try_other && snd_mixer_selem_has_capture_volume(me))
- e->direction = PA_ALSA_DIRECTION_INPUT;
- else
- e->volume_use = PA_ALSA_VOLUME_IGNORE;
- }
+ if (e->db_fix) {
+ e->has_dB = true;
+ e->min_volume = e->db_fix->min_step;
+ e->max_volume = e->db_fix->max_step;
+ min_dB = e->db_fix->db_values[0];
+ max_dB = e->db_fix->db_values[e->db_fix->max_step - e->db_fix->min_step];
+ } else if (e->direction == PA_ALSA_DIRECTION_OUTPUT)
+ e->has_dB = snd_mixer_selem_get_playback_dB_range(me, &min_dB, &max_dB) >= 0;
+ else
+ e->has_dB = snd_mixer_selem_get_capture_dB_range(me, &min_dB, &max_dB) >= 0;
- } else {
+ /* Check that the kernel driver returns consistent limits with
+ * both _get_*_dB_range() and _ask_*_vol_dB(). */
+ if (e->has_dB && !e->db_fix) {
+ long min_dB_checked = 0;
+ long max_dB_checked = 0;
- if (!snd_mixer_selem_has_capture_volume(me)) {
- if (e->direction_try_other && snd_mixer_selem_has_playback_volume(me))
- e->direction = PA_ALSA_DIRECTION_OUTPUT;
- else
- e->volume_use = PA_ALSA_VOLUME_IGNORE;
- }
+ if (element_ask_vol_dB(me, e->direction, e->min_volume, &min_dB_checked) < 0) {
+ pa_log_warn("Failed to query the dB value for %s at volume level %li", e->alsa_name, e->min_volume);
+ return false;
}
- if (e->volume_use != PA_ALSA_VOLUME_IGNORE) {
- long min_dB = 0, max_dB = 0;
- int r;
-
- e->direction_try_other = false;
+ if (element_ask_vol_dB(me, e->direction, e->max_volume, &max_dB_checked) < 0) {
+ pa_log_warn("Failed to query the dB value for %s at volume level %li", e->alsa_name, e->max_volume);
+ return false;
+ }
- if (e->direction == PA_ALSA_DIRECTION_OUTPUT)
- r = snd_mixer_selem_get_playback_volume_range(me, &e->min_volume, &e->max_volume);
- else
- r = snd_mixer_selem_get_capture_volume_range(me, &e->min_volume, &e->max_volume);
+ if (min_dB != min_dB_checked || max_dB != max_dB_checked) {
+ pa_log_warn("Your kernel driver is broken: the reported dB range for %s (from %0.2f dB to %0.2f dB) "
+ "doesn't match the dB values at minimum and maximum volume levels: %0.2f dB at level %li, "
+ "%0.2f dB at level %li.", e->alsa_name, min_dB / 100.0, max_dB / 100.0,
+ min_dB_checked / 100.0, e->min_volume, max_dB_checked / 100.0, e->max_volume);
+ return false;
+ }
+ }
- if (r < 0) {
- pa_log_warn("Failed to get volume range of %s: %s", e->alsa_name, pa_alsa_strerror(r));
- return -1;
- }
+ if (e->has_dB) {
+ e->min_dB = ((double) min_dB) / 100.0;
+ e->max_dB = ((double) max_dB) / 100.0;
- if (e->min_volume >= e->max_volume) {
- pa_log_warn("Your kernel driver is broken: it reports a volume range from %li to %li which makes no sense.", e->min_volume, e->max_volume);
- e->volume_use = PA_ALSA_VOLUME_IGNORE;
-
- } else if (e->volume_use == PA_ALSA_VOLUME_CONSTANT &&
- (e->min_volume > e->constant_volume || e->max_volume < e->constant_volume)) {
- pa_log_warn("Constant volume %li configured for element %s, but the available range is from %li to %li.",
- e->constant_volume, e->alsa_name, e->min_volume, e->max_volume);
- e->volume_use = PA_ALSA_VOLUME_IGNORE;
+ if (min_dB >= max_dB) {
+ pa_assert(!e->db_fix);
+ pa_log_warn("Your kernel driver is broken: it reports a volume range from %0.2f dB to %0.2f dB which makes no sense.",
+ e->min_dB, e->max_dB);
+ e->has_dB = false;
+ }
+ }
- } else {
- bool is_mono;
- pa_channel_position_t p;
-
- if (e->db_fix &&
- ((e->min_volume > e->db_fix->min_step) ||
- (e->max_volume < e->db_fix->max_step))) {
- pa_log_warn("The step range of the decibel fix for element %s (%li-%li) doesn't fit to the "
- "real hardware range (%li-%li). Disabling the decibel fix.", e->alsa_name,
- e->db_fix->min_step, e->db_fix->max_step,
- e->min_volume, e->max_volume);
-
- decibel_fix_free(e->db_fix);
- e->db_fix = NULL;
- }
+ if (e->volume_limit >= 0) {
+ if (e->volume_limit <= e->min_volume || e->volume_limit > e->max_volume)
+ pa_log_warn("Volume limit for element %s of path %s is invalid: %li isn't within the valid range "
+ "%li-%li. The volume limit is ignored.",
+ e->alsa_name, e->path->name, e->volume_limit, e->min_volume + 1, e->max_volume);
+ else {
+ e->max_volume = e->volume_limit;
+ if (e->has_dB) {
if (e->db_fix) {
- e->has_dB = true;
- e->min_volume = e->db_fix->min_step;
- e->max_volume = e->db_fix->max_step;
- min_dB = e->db_fix->db_values[0];
- max_dB = e->db_fix->db_values[e->db_fix->max_step - e->db_fix->min_step];
- } else if (e->direction == PA_ALSA_DIRECTION_OUTPUT)
- e->has_dB = snd_mixer_selem_get_playback_dB_range(me, &min_dB, &max_dB) >= 0;
- else
- e->has_dB = snd_mixer_selem_get_capture_dB_range(me, &min_dB, &max_dB) >= 0;
-
- /* Check that the kernel driver returns consistent limits with
- * both _get_*_dB_range() and _ask_*_vol_dB(). */
- if (e->has_dB && !e->db_fix) {
- long min_dB_checked = 0;
- long max_dB_checked = 0;
-
- if (e->direction == PA_ALSA_DIRECTION_OUTPUT)
- r = snd_mixer_selem_ask_playback_vol_dB(me, e->min_volume, &min_dB_checked);
- else
- r = snd_mixer_selem_ask_capture_vol_dB(me, e->min_volume, &min_dB_checked);
-
- if (r < 0) {
- pa_log_warn("Failed to query the dB value for %s at volume level %li", e->alsa_name, e->min_volume);
- return -1;
- }
-
- if (e->direction == PA_ALSA_DIRECTION_OUTPUT)
- r = snd_mixer_selem_ask_playback_vol_dB(me, e->max_volume, &max_dB_checked);
- else
- r = snd_mixer_selem_ask_capture_vol_dB(me, e->max_volume, &max_dB_checked);
-
- if (r < 0) {
- pa_log_warn("Failed to query the dB value for %s at volume level %li", e->alsa_name, e->max_volume);
- return -1;
- }
+ e->db_fix->max_step = e->max_volume;
+ e->max_dB = ((double) e->db_fix->db_values[e->db_fix->max_step - e->db_fix->min_step]) / 100.0;
+ } else if (element_ask_vol_dB(me, e->direction, e->max_volume, &max_dB) < 0) {
+ pa_log_warn("Failed to get dB value of %s: %s", e->alsa_name, pa_alsa_strerror(r));
+ e->has_dB = false;
+ } else
+ e->max_dB = ((double) max_dB) / 100.0;
+ }
+ }
+ }
- if (min_dB != min_dB_checked || max_dB != max_dB_checked) {
- pa_log_warn("Your kernel driver is broken: the reported dB range for %s (from %0.2f dB to %0.2f dB) "
- "doesn't match the dB values at minimum and maximum volume levels: %0.2f dB at level %li, "
- "%0.2f dB at level %li.",
- e->alsa_name,
- min_dB / 100.0, max_dB / 100.0,
- min_dB_checked / 100.0, e->min_volume, max_dB_checked / 100.0, e->max_volume);
- return -1;
- }
- }
+ if (e->direction == PA_ALSA_DIRECTION_OUTPUT)
+ is_mono = snd_mixer_selem_is_playback_mono(me) > 0;
+ else
+ is_mono = snd_mixer_selem_is_capture_mono(me) > 0;
- if (e->has_dB) {
- e->min_dB = ((double) min_dB) / 100.0;
- e->max_dB = ((double) max_dB) / 100.0;
+ if (is_mono) {
+ e->n_channels = 1;
- if (min_dB >= max_dB) {
- pa_assert(!e->db_fix);
- pa_log_warn("Your kernel driver is broken: it reports a volume range from %0.2f dB to %0.2f dB which makes no sense.", e->min_dB, e->max_dB);
- e->has_dB = false;
- }
- }
+ if (!e->override_map) {
+ for (p = PA_CHANNEL_POSITION_FRONT_LEFT; p < PA_CHANNEL_POSITION_MAX; p++) {
+ if (alsa_channel_ids[p] == SND_MIXER_SCHN_UNKNOWN)
+ continue;
+ e->masks[alsa_channel_ids[p]][e->n_channels-1] = 0;
+ }
+ e->masks[SND_MIXER_SCHN_MONO][e->n_channels-1] = PA_CHANNEL_POSITION_MASK_ALL;
+ }
+ e->merged_mask = e->masks[SND_MIXER_SCHN_MONO][e->n_channels-1];
+ return true;
+ }
- if (e->volume_limit >= 0) {
- if (e->volume_limit <= e->min_volume || e->volume_limit > e->max_volume)
- pa_log_warn("Volume limit for element %s of path %s is invalid: %li isn't within the valid range "
- "%li-%li. The volume limit is ignored.",
- e->alsa_name, e->path->name, e->volume_limit, e->min_volume + 1, e->max_volume);
+ e->n_channels = 0;
+ for (p = PA_CHANNEL_POSITION_FRONT_LEFT; p < PA_CHANNEL_POSITION_MAX; p++) {
+ if (alsa_channel_ids[p] == SND_MIXER_SCHN_UNKNOWN)
+ continue;
- else {
- e->max_volume = e->volume_limit;
+ if (e->direction == PA_ALSA_DIRECTION_OUTPUT)
+ e->n_channels += snd_mixer_selem_has_playback_channel(me, alsa_channel_ids[p]) > 0;
+ else
+ e->n_channels += snd_mixer_selem_has_capture_channel(me, alsa_channel_ids[p]) > 0;
+ }
- if (e->has_dB) {
- if (e->db_fix) {
- e->db_fix->max_step = e->max_volume;
- e->max_dB = ((double) e->db_fix->db_values[e->db_fix->max_step - e->db_fix->min_step]) / 100.0;
+ if (e->n_channels <= 0) {
+ pa_log_warn("Volume element %s with no channels?", e->alsa_name);
+ return false;
+ } else if (e->n_channels > 2) {
+ /* FIXME: In some places code like this is used:
+ *
+ * e->masks[alsa_channel_ids[p]][e->n_channels-1]
+ *
+ * The definition of e->masks is
+ *
+ * pa_channel_position_mask_t masks[SND_MIXER_SCHN_LAST + 1][2];
+ *
+ * Since the array size is fixed at 2, we obviously
+ * don't support elements with more than two
+ * channels... */
+ pa_log_warn("Volume element %s has %u channels. That's too much! I can't handle that!", e->alsa_name, e->n_channels);
+ return false;
+ }
- } else {
- if (e->direction == PA_ALSA_DIRECTION_OUTPUT)
- r = snd_mixer_selem_ask_playback_vol_dB(me, e->max_volume, &max_dB);
- else
- r = snd_mixer_selem_ask_capture_vol_dB(me, e->max_volume, &max_dB);
-
- if (r < 0) {
- pa_log_warn("Failed to get dB value of %s: %s", e->alsa_name, pa_alsa_strerror(r));
- e->has_dB = false;
- } else
- e->max_dB = ((double) max_dB) / 100.0;
- }
- }
- }
- }
+ if (!e->override_map) {
+ for (p = PA_CHANNEL_POSITION_FRONT_LEFT; p < PA_CHANNEL_POSITION_MAX; p++) {
+ bool has_channel;
- if (e->direction == PA_ALSA_DIRECTION_OUTPUT)
- is_mono = snd_mixer_selem_is_playback_mono(me) > 0;
- else
- is_mono = snd_mixer_selem_is_capture_mono(me) > 0;
+ if (alsa_channel_ids[p] == SND_MIXER_SCHN_UNKNOWN)
+ continue;
- if (is_mono) {
- e->n_channels = 1;
+ if (e->direction == PA_ALSA_DIRECTION_OUTPUT)
+ has_channel = snd_mixer_selem_has_playback_channel(me, alsa_channel_ids[p]) > 0;
+ else
+ has_channel = snd_mixer_selem_has_capture_channel(me, alsa_channel_ids[p]) > 0;
- if (!e->override_map) {
- for (p = PA_CHANNEL_POSITION_FRONT_LEFT; p < PA_CHANNEL_POSITION_MAX; p++) {
- if (alsa_channel_ids[p] == SND_MIXER_SCHN_UNKNOWN)
- continue;
+ e->masks[alsa_channel_ids[p]][e->n_channels-1] = has_channel ? PA_CHANNEL_POSITION_MASK(p) : 0;
+ }
+ }
- e->masks[alsa_channel_ids[p]][e->n_channels-1] = 0;
- }
+ e->merged_mask = 0;
+ for (p = PA_CHANNEL_POSITION_FRONT_LEFT; p < PA_CHANNEL_POSITION_MAX; p++) {
+ if (alsa_channel_ids[p] == SND_MIXER_SCHN_UNKNOWN)
+ continue;
- e->masks[SND_MIXER_SCHN_MONO][e->n_channels-1] = PA_CHANNEL_POSITION_MASK_ALL;
- }
+ e->merged_mask |= e->masks[alsa_channel_ids[p]][e->n_channels-1];
+ }
+ return true;
+}
- e->merged_mask = e->masks[SND_MIXER_SCHN_MONO][e->n_channels-1];
- } else {
- e->n_channels = 0;
- for (p = PA_CHANNEL_POSITION_FRONT_LEFT; p < PA_CHANNEL_POSITION_MAX; p++) {
+static int element_probe(pa_alsa_element *e, snd_mixer_t *m) {
+ snd_mixer_selem_id_t *sid;
+ snd_mixer_elem_t *me;
- if (alsa_channel_ids[p] == SND_MIXER_SCHN_UNKNOWN)
- continue;
+ pa_assert(m);
+ pa_assert(e);
+ pa_assert(e->path);
- if (e->direction == PA_ALSA_DIRECTION_OUTPUT)
- e->n_channels += snd_mixer_selem_has_playback_channel(me, alsa_channel_ids[p]) > 0;
- else
- e->n_channels += snd_mixer_selem_has_capture_channel(me, alsa_channel_ids[p]) > 0;
- }
+ SELEM_INIT(sid, e->alsa_name);
- if (e->n_channels <= 0) {
- pa_log_warn("Volume element %s with no channels?", e->alsa_name);
- e->volume_use = PA_ALSA_VOLUME_IGNORE;
- }
+ if (!(me = snd_mixer_find_selem(m, sid))) {
- else if (e->n_channels > 2) {
- /* FIXME: In some places code like this is used:
- *
- * e->masks[alsa_channel_ids[p]][e->n_channels-1]
- *
- * The definition of e->masks is
- *
- * pa_channel_position_mask_t masks[SND_MIXER_SCHN_LAST + 1][2];
- *
- * Since the array size is fixed at 2, we obviously
- * don't support elements with more than two
- * channels... */
- pa_log_warn("Volume element %s has %u channels. That's too much! I can't handle that!", e->alsa_name, e->n_channels);
- e->volume_use = PA_ALSA_VOLUME_IGNORE;
- }
+ if (e->required != PA_ALSA_REQUIRED_IGNORE)
+ return -1;
- if (!e->override_map) {
- for (p = PA_CHANNEL_POSITION_FRONT_LEFT; p < PA_CHANNEL_POSITION_MAX; p++) {
- bool has_channel;
+ e->switch_use = PA_ALSA_SWITCH_IGNORE;
+ e->volume_use = PA_ALSA_VOLUME_IGNORE;
+ e->enumeration_use = PA_ALSA_ENUMERATION_IGNORE;
- if (alsa_channel_ids[p] == SND_MIXER_SCHN_UNKNOWN)
- continue;
+ return 0;
+ }
- if (e->direction == PA_ALSA_DIRECTION_OUTPUT)
- has_channel = snd_mixer_selem_has_playback_channel(me, alsa_channel_ids[p]) > 0;
- else
- has_channel = snd_mixer_selem_has_capture_channel(me, alsa_channel_ids[p]) > 0;
+ if (e->switch_use != PA_ALSA_SWITCH_IGNORE) {
+ if (e->direction == PA_ALSA_DIRECTION_OUTPUT) {
- e->masks[alsa_channel_ids[p]][e->n_channels-1] = has_channel ? PA_CHANNEL_POSITION_MASK(p) : 0;
- }
- }
+ if (!snd_mixer_selem_has_playback_switch(me)) {
+ if (e->direction_try_other && snd_mixer_selem_has_capture_switch(me))
+ e->direction = PA_ALSA_DIRECTION_INPUT;
+ else
+ e->switch_use = PA_ALSA_SWITCH_IGNORE;
+ }
- e->merged_mask = 0;
- for (p = PA_CHANNEL_POSITION_FRONT_LEFT; p < PA_CHANNEL_POSITION_MAX; p++) {
- if (alsa_channel_ids[p] == SND_MIXER_SCHN_UNKNOWN)
- continue;
+ } else {
- e->merged_mask |= e->masks[alsa_channel_ids[p]][e->n_channels-1];
- }
- }
+ if (!snd_mixer_selem_has_capture_switch(me)) {
+ if (e->direction_try_other && snd_mixer_selem_has_playback_switch(me))
+ e->direction = PA_ALSA_DIRECTION_OUTPUT;
+ else
+ e->switch_use = PA_ALSA_SWITCH_IGNORE;
}
}
+ if (e->switch_use != PA_ALSA_SWITCH_IGNORE)
+ e->direction_try_other = false;
}
+ if (!element_probe_volume(e, me))
+ e->volume_use = PA_ALSA_VOLUME_IGNORE;
+
if (e->switch_use == PA_ALSA_SWITCH_SELECT) {
pa_alsa_option *o;
diff --git a/src/modules/alsa/mixer/paths/analog-input-linein.conf b/src/modules/alsa/mixer/paths/analog-input-linein.conf
index 2c94a0b..8163ffb 100644
--- a/src/modules/alsa/mixer/paths/analog-input-linein.conf
+++ b/src/modules/alsa/mixer/paths/analog-input-linein.conf
@@ -69,6 +69,10 @@ enumeration = select
name = analog-input-linein
required-any = any
+[Option PCM Capture Source:Line In]
+name = analog-input-linein
+required-any = any
+
[Element Mic]
switch = off
volume = off
diff --git a/src/modules/alsa/mixer/paths/analog-input-mic.conf b/src/modules/alsa/mixer/paths/analog-input-mic.conf
index 4d64f92..123439b 100644
--- a/src/modules/alsa/mixer/paths/analog-input-mic.conf
+++ b/src/modules/alsa/mixer/paths/analog-input-mic.conf
@@ -76,6 +76,10 @@ enumeration = select
name = analog-input-microphone
required-any = any
+[Option PCM Capture Source:Mic-In/Mic Array]
+name = analog-input-microphone
+required-any = any
+
;;; Some AC'97s have "Mic Select" and "Mic Boost (+20dB)"
[Element Mic Select]
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 e534def..d5922da 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
@@ -20,7 +20,8 @@
; 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.
+; And finally officially supported modes are stereo and 5.1 + stereo S/PDIF,
+; so only these modes included.
;
; See default.conf for an explanation on the directives used here.
@@ -42,20 +43,6 @@ paths-input = analog-input-mic analog-input-linein
channel-map = left,right
direction = input
-[Mapping analog-surround-41]
-device-strings = surround41:%f
-channel-map = front-left,front-right,rear-left,rear-right,lfe
-paths-output = analog-output
-priority = 7
-direction = output
-
-[Mapping analog-surround-50]
-device-strings = surround50:%f
-channel-map = front-left,front-right,rear-left,rear-right,front-center
-paths-output = analog-output
-priority = 8
-direction = output
-
[Mapping analog-surround-51]
device-strings = surround51:%f
channel-map = front-left,front-right,rear-left,rear-right,front-center,lfe
diff --git a/src/modules/alsa/module-alsa-card.c b/src/modules/alsa/module-alsa-card.c
index 286cfc9..e5cc4ae 100644
--- a/src/modules/alsa/module-alsa-card.c
+++ b/src/modules/alsa/module-alsa-card.c
@@ -369,6 +369,21 @@ static int report_jack_state(snd_mixer_elem_t *melem, unsigned int mask) {
pa_assert(u);
+ /* Changing the jack state may cause a port change, and a port change will
+ * make the sink or source change the mixer settings. If there are multiple
+ * users having pulseaudio running, the mixer changes done by inactive
+ * users may mess up the volume settings for the active users, because when
+ * the inactive users change the mixer settings, those changes are picked
+ * up by the active user's pulseaudio instance and the changes are
+ * interpreted as if the active user changed the settings manually e.g.
+ * with alsamixer. Even single-user systems suffer from this, because gdm
+ * runs its own pulseaudio instance.
+ *
+ * We rerun this function when being unsuspended to catch up on jack state
+ * changes */
+ if (u->card->suspend_cause & PA_SUSPEND_SESSION)
+ return 0;
+
if (mask == SND_CTL_EVENT_MASK_REMOVE)
return 0;
@@ -576,6 +591,20 @@ static void set_card_name(pa_card_new_data *data, pa_modargs *ma, const char *de
pa_xfree(t);
}
+static pa_hook_result_t card_suspend_changed(pa_core *c, pa_card *card, struct userdata *u) {
+ void *state;
+ pa_alsa_jack *jack;
+
+ if (card->suspend_cause == 0) {
+ /* We were unsuspended, update jack state in case it changed while we were suspended */
+ PA_HASHMAP_FOREACH(jack, u->jacks, state) {
+ report_jack_state(jack->melem, 0);
+ }
+ }
+
+ return PA_HOOK_OK;
+}
+
static pa_hook_result_t sink_input_put_hook_callback(pa_core *c, pa_sink_input *sink_input, struct userdata *u) {
const char *role;
pa_sink *sink = sink_input->sink;
@@ -782,6 +811,9 @@ int pa__init(pa_module *m) {
u->card->userdata = u;
u->card->set_profile = card_set_profile;
+ pa_module_hook_connect(m, &m->core->hooks[PA_CORE_HOOK_CARD_SUSPEND_CHANGED], PA_HOOK_NORMAL,
+ (pa_hook_cb_t) card_suspend_changed, u);
+
init_jacks(u);
init_profile(u);
init_eld_ctls(u);
diff --git a/src/modules/echo-cancel/adrian.c b/src/modules/echo-cancel/adrian.c
index 60a2b66..3c47fae 100644
--- a/src/modules/echo-cancel/adrian.c
+++ b/src/modules/echo-cancel/adrian.c
@@ -78,16 +78,16 @@ bool pa_adrian_ec_init(pa_core *c, pa_echo_canceller *ec,
rate = out_ss->rate;
*nframes = (rate * frame_size_ms) / 1000;
- ec->params.priv.adrian.blocksize = (*nframes) * pa_frame_size(out_ss);
+ ec->params.adrian.blocksize = (*nframes) * pa_frame_size(out_ss);
- pa_log_debug ("Using nframes %d, blocksize %u, channels %d, rate %d", *nframes, ec->params.priv.adrian.blocksize, out_ss->channels, out_ss->rate);
+ pa_log_debug ("Using nframes %d, blocksize %u, channels %d, rate %d", *nframes, ec->params.adrian.blocksize, out_ss->channels, out_ss->rate);
/* For now we only support SSE */
if (c->cpu_info.cpu_type == PA_CPU_X86 && (c->cpu_info.flags.x86 & PA_CPU_X86_SSE))
have_vector = 1;
- ec->params.priv.adrian.aec = AEC_init(rate, have_vector);
- if (!ec->params.priv.adrian.aec)
+ ec->params.adrian.aec = AEC_init(rate, have_vector);
+ if (!ec->params.adrian.aec)
goto fail;
pa_modargs_free(ma);
@@ -102,17 +102,17 @@ fail:
void pa_adrian_ec_run(pa_echo_canceller *ec, const uint8_t *rec, const uint8_t *play, uint8_t *out) {
unsigned int i;
- for (i = 0; i < ec->params.priv.adrian.blocksize; i += 2) {
+ for (i = 0; i < ec->params.adrian.blocksize; i += 2) {
/* We know it's S16NE mono data */
int r = *(int16_t *)(rec + i);
int p = *(int16_t *)(play + i);
- *(int16_t *)(out + i) = (int16_t) AEC_doAEC(ec->params.priv.adrian.aec, r, p);
+ *(int16_t *)(out + i) = (int16_t) AEC_doAEC(ec->params.adrian.aec, r, p);
}
}
void pa_adrian_ec_done(pa_echo_canceller *ec) {
- if (ec->params.priv.adrian.aec) {
- AEC_done(ec->params.priv.adrian.aec);
- ec->params.priv.adrian.aec = NULL;
+ if (ec->params.adrian.aec) {
+ AEC_done(ec->params.adrian.aec);
+ ec->params.adrian.aec = NULL;
}
}
diff --git a/src/modules/echo-cancel/echo-cancel.h b/src/modules/echo-cancel/echo-cancel.h
index 29d1574..ee67949 100644
--- a/src/modules/echo-cancel/echo-cancel.h
+++ b/src/modules/echo-cancel/echo-cancel.h
@@ -64,13 +64,17 @@ struct pa_echo_canceller_params {
/* This is a void* so that we don't have to convert this whole file
* to C++ linkage. apm is a pointer to an AudioProcessing object */
void *apm;
- uint32_t blocksize;
- pa_sample_spec sample_spec;
+ unsigned int blocksize; /* in frames */
+ pa_sample_spec rec_ss, play_ss, out_ss;
+ float *rec_buffer[PA_CHANNELS_MAX], *play_buffer[PA_CHANNELS_MAX]; /* for deinterleaved buffers */
+ void *trace_callback;
bool agc;
+ bool first;
+ unsigned int agc_start_volume;
} webrtc;
#endif
/* each canceller-specific structure goes here */
- } priv;
+ };
/* Set this if canceller can do drift compensation. Also see set_drift()
* below */
@@ -128,8 +132,8 @@ struct pa_echo_canceller {
};
/* Functions to be used by the canceller analog gain control routines */
-void pa_echo_canceller_get_capture_volume(pa_echo_canceller *ec, pa_cvolume *v);
-void pa_echo_canceller_set_capture_volume(pa_echo_canceller *ec, pa_cvolume *v);
+pa_volume_t pa_echo_canceller_get_capture_volume(pa_echo_canceller *ec);
+void pa_echo_canceller_set_capture_volume(pa_echo_canceller *ec, pa_volume_t volume);
/* Computes EC block size in frames (rounded down to nearest power-of-2) based
* on sample rate and milliseconds. */
diff --git a/src/modules/echo-cancel/module-echo-cancel.c b/src/modules/echo-cancel/module-echo-cancel.c
index 18fe5dc..c873648 100644
--- a/src/modules/echo-cancel/module-echo-cancel.c
+++ b/src/modules/echo-cancel/module-echo-cancel.c
@@ -75,6 +75,7 @@ PA_MODULE_USAGE(
"save_aec=<save AEC data in /tmp> "
"autoloaded=<set if this module is being loaded automatically> "
"use_volume_sharing=<yes or no> "
+ "use_master_format=<yes or no> "
));
/* NOTE: Make sure the enum and ec_table are maintained in the correct order */
@@ -140,6 +141,7 @@ static const pa_echo_canceller ec_table[] = {
#define DEFAULT_ADJUST_TOLERANCE (5*PA_USEC_PER_MSEC)
#define DEFAULT_SAVE_AEC false
#define DEFAULT_AUTOLOADED false
+#define DEFAULT_USE_MASTER_FORMAT false
#define MEMBLOCKQ_MAXLENGTH (16*1024*1024)
@@ -204,7 +206,6 @@ struct userdata {
pa_core *core;
pa_module *module;
- bool autoloaded;
bool dead;
bool save_aec;
@@ -275,6 +276,7 @@ static const char* const valid_modargs[] = {
"save_aec",
"autoloaded",
"use_volume_sharing",
+ "use_master_format",
NULL
};
@@ -1433,12 +1435,6 @@ static void source_output_moving_cb(pa_source_output *o, pa_source *dest) {
pa_assert_ctl_context();
pa_assert_se(u = o->userdata);
- if (u->autoloaded) {
- /* We were autoloaded, and don't support moving. Let's unload ourselves. */
- pa_log_debug("Can't move autoloaded streams, unloading");
- pa_module_unload_request(u->module, true);
- }
-
if (dest) {
pa_source_set_asyncmsgq(u->source, dest->asyncmsgq);
pa_source_update_flags(u->source, PA_SOURCE_LATENCY|PA_SOURCE_DYNAMIC_LATENCY, dest->flags);
@@ -1470,12 +1466,6 @@ static void sink_input_moving_cb(pa_sink_input *i, pa_sink *dest) {
pa_sink_input_assert_ref(i);
pa_assert_se(u = i->userdata);
- if (u->autoloaded) {
- /* We were autoloaded, and don't support moving. Let's unload ourselves. */
- pa_log_debug("Can't move autoloaded streams, unloading");
- pa_module_unload_request(u->module, true);
- }
-
if (dest) {
pa_sink_set_asyncmsgq(u->sink, dest->asyncmsgq);
pa_sink_update_flags(u->sink, PA_SINK_LATENCY|PA_SINK_DYNAMIC_LATENCY, dest->flags);
@@ -1532,12 +1522,16 @@ static int canceller_process_msg_cb(pa_msgobject *o, int code, void *userdata, i
switch (code) {
case ECHO_CANCELLER_MESSAGE_SET_VOLUME: {
- pa_cvolume *v = (pa_cvolume *) userdata;
-
- if (u->use_volume_sharing)
- pa_source_set_volume(u->source, v, true, false);
- else
- pa_source_output_set_volume(u->source_output, v, false, true);
+ pa_volume_t v = PA_PTR_TO_UINT(userdata);
+ pa_cvolume vol;
+
+ if (u->use_volume_sharing) {
+ pa_cvolume_set(&vol, u->source->sample_spec.channels, v);
+ pa_source_set_volume(u->source, &vol, true, false);
+ } else {
+ pa_cvolume_set(&vol, u->source_output->sample_spec.channels, v);
+ pa_source_output_set_volume(u->source_output, &vol, false, true);
+ }
break;
}
@@ -1551,22 +1545,20 @@ 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) {
+pa_volume_t pa_echo_canceller_get_capture_volume(pa_echo_canceller *ec) {
#ifndef ECHO_CANCEL_TEST
- *v = ec->msg->userdata->thread_info.current_volume;
+ return pa_cvolume_avg(&ec->msg->userdata->thread_info.current_volume);
#else
- pa_cvolume_set(v, 1, PA_VOLUME_NORM);
+ return 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) {
+void pa_echo_canceller_set_capture_volume(pa_echo_canceller *ec, pa_volume_t 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);
+ if (pa_cvolume_avg(&ec->msg->userdata->thread_info.current_volume) != v) {
+ pa_asyncmsgq_post(pa_thread_mq_get()->outq, PA_MSGOBJECT(ec->msg), ECHO_CANCELLER_MESSAGE_SET_VOLUME, PA_UINT_TO_PTR(v),
+ 0, NULL, NULL);
}
#endif
}
@@ -1652,6 +1644,7 @@ int pa__init(pa_module*m) {
pa_modargs *ma;
pa_source *source_master=NULL;
pa_sink *sink_master=NULL;
+ bool autoloaded;
pa_source_output_new_data source_output_data;
pa_sink_input_new_data sink_input_data;
pa_source_new_data source_data;
@@ -1659,6 +1652,7 @@ int pa__init(pa_module*m) {
pa_memchunk silence;
uint32_t temp;
uint32_t nframes = 0;
+ bool use_master_format;
pa_assert(m);
@@ -1684,13 +1678,30 @@ int pa__init(pa_module*m) {
goto fail;
}
- source_ss = source_master->sample_spec;
- source_ss.rate = DEFAULT_RATE;
- source_ss.channels = DEFAULT_CHANNELS;
- pa_channel_map_init_auto(&source_map, source_ss.channels, PA_CHANNEL_MAP_DEFAULT);
+ /* Set to true if we just want to inherit sample spec and channel map from the sink and source master */
+ use_master_format = DEFAULT_USE_MASTER_FORMAT;
+ if (pa_modargs_get_value_boolean(ma, "use_master_format", &use_master_format) < 0) {
+ pa_log("use_master_format= expects a boolean argument");
+ goto fail;
+ }
+ source_ss = source_master->sample_spec;
sink_ss = sink_master->sample_spec;
- sink_map = sink_master->channel_map;
+
+ if (use_master_format) {
+ source_map = source_master->channel_map;
+ sink_map = sink_master->channel_map;
+ } else {
+ source_ss = source_master->sample_spec;
+ source_ss.rate = DEFAULT_RATE;
+ source_ss.channels = DEFAULT_CHANNELS;
+ pa_channel_map_init_auto(&source_map, source_ss.channels, PA_CHANNEL_MAP_DEFAULT);
+
+ sink_ss = sink_master->sample_spec;
+ sink_ss.rate = DEFAULT_RATE;
+ sink_ss.channels = DEFAULT_CHANNELS;
+ pa_channel_map_init_auto(&sink_map, sink_ss.channels, PA_CHANNEL_MAP_DEFAULT);
+ }
u = pa_xnew0(struct userdata, 1);
if (!u) {
@@ -1736,8 +1747,8 @@ int pa__init(pa_module*m) {
goto fail;
}
- u->autoloaded = DEFAULT_AUTOLOADED;
- if (pa_modargs_get_value_boolean(ma, "autoloaded", &u->autoloaded) < 0) {
+ autoloaded = DEFAULT_AUTOLOADED;
+ if (pa_modargs_get_value_boolean(ma, "autoloaded", &autoloaded) < 0) {
pa_log("Failed to parse autoloaded value");
goto fail;
}
@@ -1782,7 +1793,7 @@ int pa__init(pa_module*m) {
pa_source_new_data_set_channel_map(&source_data, &source_map);
pa_proplist_sets(source_data.proplist, PA_PROP_DEVICE_MASTER_DEVICE, source_master->name);
pa_proplist_sets(source_data.proplist, PA_PROP_DEVICE_CLASS, "filter");
- if (!u->autoloaded)
+ if (!autoloaded)
pa_proplist_sets(source_data.proplist, PA_PROP_DEVICE_INTENDED_ROLES, "phone");
if (pa_modargs_get_proplist(ma, "source_properties", source_data.proplist, PA_UPDATE_REPLACE) < 0) {
@@ -1832,7 +1843,7 @@ int pa__init(pa_module*m) {
pa_sink_new_data_set_channel_map(&sink_data, &sink_map);
pa_proplist_sets(sink_data.proplist, PA_PROP_DEVICE_MASTER_DEVICE, sink_master->name);
pa_proplist_sets(sink_data.proplist, PA_PROP_DEVICE_CLASS, "filter");
- if (!u->autoloaded)
+ if (!autoloaded)
pa_proplist_sets(sink_data.proplist, PA_PROP_DEVICE_INTENDED_ROLES, "phone");
if (pa_modargs_get_proplist(ma, "sink_properties", sink_data.proplist, PA_UPDATE_REPLACE) < 0) {
@@ -1884,6 +1895,9 @@ int pa__init(pa_module*m) {
pa_source_output_new_data_set_sample_spec(&source_output_data, &source_output_ss);
pa_source_output_new_data_set_channel_map(&source_output_data, &source_output_map);
+ if (autoloaded)
+ source_output_data.flags |= PA_SOURCE_OUTPUT_DONT_MOVE;
+
pa_source_output_new(&u->source_output, m->core, &source_output_data);
pa_source_output_new_data_done(&source_output_data);
@@ -1919,6 +1933,9 @@ int pa__init(pa_module*m) {
pa_sink_input_new_data_set_channel_map(&sink_input_data, &sink_map);
sink_input_data.flags = PA_SINK_INPUT_VARIABLE_RATE;
+ if (autoloaded)
+ sink_input_data.flags |= PA_SINK_INPUT_DONT_MOVE;
+
pa_sink_input_new(&u->sink_input, m->core, &sink_input_data);
pa_sink_input_new_data_done(&sink_input_data);
@@ -2137,12 +2154,12 @@ int main(int argc, char* argv[]) {
goto fail;
}
- source_ss.format = PA_SAMPLE_S16LE;
+ source_ss.format = PA_SAMPLE_FLOAT32LE;
source_ss.rate = DEFAULT_RATE;
source_ss.channels = DEFAULT_CHANNELS;
pa_channel_map_init_auto(&source_map, source_ss.channels, PA_CHANNEL_MAP_DEFAULT);
- sink_ss.format = PA_SAMPLE_S16LE;
+ sink_ss.format = PA_SAMPLE_FLOAT32LE;
sink_ss.rate = DEFAULT_RATE;
sink_ss.channels = DEFAULT_CHANNELS;
pa_channel_map_init_auto(&sink_map, sink_ss.channels, PA_CHANNEL_MAP_DEFAULT);
diff --git a/src/modules/echo-cancel/null.c b/src/modules/echo-cancel/null.c
index 673b14f..c8ecf27 100644
--- a/src/modules/echo-cancel/null.c
+++ b/src/modules/echo-cancel/null.c
@@ -34,7 +34,7 @@ bool pa_null_ec_init(pa_core *c, pa_echo_canceller *ec,
char strss_sink[PA_SAMPLE_SPEC_SNPRINT_MAX];
*nframes = 256;
- ec->params.priv.null.out_ss = *out_ss;
+ ec->params.null.out_ss = *out_ss;
*rec_ss = *out_ss;
*rec_map = *out_map;
@@ -49,7 +49,7 @@ bool pa_null_ec_init(pa_core *c, pa_echo_canceller *ec,
void pa_null_ec_run(pa_echo_canceller *ec, const uint8_t *rec, const uint8_t *play, uint8_t *out) {
/* The null implementation simply copies the recorded buffer to the output
buffer and ignores the play buffer. */
- memcpy(out, rec, 256 * pa_frame_size(&ec->params.priv.null.out_ss));
+ memcpy(out, rec, 256 * pa_frame_size(&ec->params.null.out_ss));
}
void pa_null_ec_done(pa_echo_canceller *ec) {
diff --git a/src/modules/echo-cancel/speex.c b/src/modules/echo-cancel/speex.c
index 11e53b3..a3ae646 100644
--- a/src/modules/echo-cancel/speex.c
+++ b/src/modules/echo-cancel/speex.c
@@ -47,9 +47,9 @@ static const char* const valid_modargs[] = {
NULL
};
-static void pa_speex_ec_fixate_spec(pa_sample_spec *rec_ss, pa_channel_map *rec_map,
- pa_sample_spec *play_ss, pa_channel_map *play_map,
- pa_sample_spec *out_ss, pa_channel_map *out_map) {
+static void speex_ec_fixate_spec(pa_sample_spec *rec_ss, pa_channel_map *rec_map,
+ pa_sample_spec *play_ss, pa_channel_map *play_map,
+ pa_sample_spec *out_ss, pa_channel_map *out_map) {
out_ss->format = PA_SAMPLE_S16NE;
*play_ss = *out_ss;
@@ -111,26 +111,26 @@ static bool pa_speex_ec_preprocessor_init(pa_echo_canceller *ec, pa_sample_spec
goto fail;
}
- ec->params.priv.speex.pp_state = speex_preprocess_state_init(nframes, out_ss->rate);
+ ec->params.speex.pp_state = speex_preprocess_state_init(nframes, out_ss->rate);
tmp = agc;
- speex_preprocess_ctl(ec->params.priv.speex.pp_state, SPEEX_PREPROCESS_SET_AGC, &tmp);
+ speex_preprocess_ctl(ec->params.speex.pp_state, SPEEX_PREPROCESS_SET_AGC, &tmp);
tmp = denoise;
- speex_preprocess_ctl(ec->params.priv.speex.pp_state, SPEEX_PREPROCESS_SET_DENOISE, &tmp);
+ speex_preprocess_ctl(ec->params.speex.pp_state, SPEEX_PREPROCESS_SET_DENOISE, &tmp);
if (echo_suppress) {
if (echo_suppress_attenuation)
- speex_preprocess_ctl(ec->params.priv.speex.pp_state, SPEEX_PREPROCESS_SET_ECHO_SUPPRESS,
+ speex_preprocess_ctl(ec->params.speex.pp_state, SPEEX_PREPROCESS_SET_ECHO_SUPPRESS,
&echo_suppress_attenuation);
if (echo_suppress_attenuation_active) {
- speex_preprocess_ctl(ec->params.priv.speex.pp_state, SPEEX_PREPROCESS_SET_ECHO_SUPPRESS_ACTIVE,
+ speex_preprocess_ctl(ec->params.speex.pp_state, SPEEX_PREPROCESS_SET_ECHO_SUPPRESS_ACTIVE,
&echo_suppress_attenuation_active);
}
- speex_preprocess_ctl(ec->params.priv.speex.pp_state, SPEEX_PREPROCESS_SET_ECHO_STATE,
- ec->params.priv.speex.state);
+ speex_preprocess_ctl(ec->params.speex.pp_state, SPEEX_PREPROCESS_SET_ECHO_STATE,
+ ec->params.speex.state);
}
pa_log_info("Loaded speex preprocessor with params: agc=%s, denoise=%s, echo_suppress=%s", pa_yes_no(agc),
@@ -170,18 +170,18 @@ bool pa_speex_ec_init(pa_core *c, pa_echo_canceller *ec,
goto fail;
}
- pa_speex_ec_fixate_spec(rec_ss, rec_map, play_ss, play_map, out_ss, out_map);
+ speex_ec_fixate_spec(rec_ss, rec_map, play_ss, play_map, out_ss, out_map);
rate = out_ss->rate;
*nframes = pa_echo_canceller_blocksize_power2(rate, frame_size_ms);
pa_log_debug ("Using nframes %d, channels %d, rate %d", *nframes, out_ss->channels, out_ss->rate);
- ec->params.priv.speex.state = speex_echo_state_init_mc(*nframes, (rate * filter_size_ms) / 1000, out_ss->channels, out_ss->channels);
+ ec->params.speex.state = speex_echo_state_init_mc(*nframes, (rate * filter_size_ms) / 1000, out_ss->channels, out_ss->channels);
- if (!ec->params.priv.speex.state)
+ if (!ec->params.speex.state)
goto fail;
- speex_echo_ctl(ec->params.priv.speex.state, SPEEX_ECHO_SET_SAMPLING_RATE, &rate);
+ speex_echo_ctl(ec->params.speex.state, SPEEX_ECHO_SET_SAMPLING_RATE, &rate);
if (!pa_speex_ec_preprocessor_init(ec, out_ss, *nframes, ma))
goto fail;
@@ -192,34 +192,34 @@ bool pa_speex_ec_init(pa_core *c, pa_echo_canceller *ec,
fail:
if (ma)
pa_modargs_free(ma);
- if (ec->params.priv.speex.pp_state) {
- speex_preprocess_state_destroy(ec->params.priv.speex.pp_state);
- ec->params.priv.speex.pp_state = NULL;
+ if (ec->params.speex.pp_state) {
+ speex_preprocess_state_destroy(ec->params.speex.pp_state);
+ ec->params.speex.pp_state = NULL;
}
- if (ec->params.priv.speex.state) {
- speex_echo_state_destroy(ec->params.priv.speex.state);
- ec->params.priv.speex.state = NULL;
+ if (ec->params.speex.state) {
+ speex_echo_state_destroy(ec->params.speex.state);
+ ec->params.speex.state = NULL;
}
return false;
}
void pa_speex_ec_run(pa_echo_canceller *ec, const uint8_t *rec, const uint8_t *play, uint8_t *out) {
- speex_echo_cancellation(ec->params.priv.speex.state, (const spx_int16_t *) rec, (const spx_int16_t *) play,
+ speex_echo_cancellation(ec->params.speex.state, (const spx_int16_t *) rec, (const spx_int16_t *) play,
(spx_int16_t *) out);
/* preprecessor is run after AEC. This is not a mistake! */
- if (ec->params.priv.speex.pp_state)
- speex_preprocess_run(ec->params.priv.speex.pp_state, (spx_int16_t *) out);
+ if (ec->params.speex.pp_state)
+ speex_preprocess_run(ec->params.speex.pp_state, (spx_int16_t *) out);
}
void pa_speex_ec_done(pa_echo_canceller *ec) {
- if (ec->params.priv.speex.pp_state) {
- speex_preprocess_state_destroy(ec->params.priv.speex.pp_state);
- ec->params.priv.speex.pp_state = NULL;
+ if (ec->params.speex.pp_state) {
+ speex_preprocess_state_destroy(ec->params.speex.pp_state);
+ ec->params.speex.pp_state = NULL;
}
- if (ec->params.priv.speex.state) {
- speex_echo_state_destroy(ec->params.priv.speex.state);
- ec->params.priv.speex.state = NULL;
+ if (ec->params.speex.state) {
+ speex_echo_state_destroy(ec->params.speex.state);
+ ec->params.speex.state = NULL;
}
}
diff --git a/src/modules/echo-cancel/webrtc.cc b/src/modules/echo-cancel/webrtc.cc
index 511c7ee..db6873d 100644
--- a/src/modules/echo-cancel/webrtc.cc
+++ b/src/modules/echo-cancel/webrtc.cc
@@ -2,8 +2,9 @@
This file is part of PulseAudio.
Copyright 2011 Collabora Ltd.
+ 2015 Aldebaran SoftBank Group
- Contributor: Arun Raghavan <arun.raghavan at collabora.co.uk>
+ Contributor: Arun Raghavan <mail at arunraghavan.net>
PulseAudio is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published
@@ -33,8 +34,9 @@ PA_C_DECL_BEGIN
#include "echo-cancel.h"
PA_C_DECL_END
-#include <audio_processing.h>
-#include <module_common_types.h>
+#include <webrtc/modules/audio_processing/include/audio_processing.h>
+#include <webrtc/modules/interface/module_common_types.h>
+#include <webrtc/system_wrappers/include/trace.h>
#define BLOCK_SIZE_US 10000
@@ -46,6 +48,15 @@ PA_C_DECL_END
#define DEFAULT_ROUTING_MODE "speakerphone"
#define DEFAULT_COMFORT_NOISE true
#define DEFAULT_DRIFT_COMPENSATION false
+#define DEFAULT_VAD true
+#define DEFAULT_EXTENDED_FILTER false
+#define DEFAULT_INTELLIGIBILITY_ENHANCER false
+#define DEFAULT_EXPERIMENTAL_AGC false
+#define DEFAULT_AGC_START_VOLUME 85
+#define DEFAULT_BEAMFORMING false
+#define DEFAULT_TRACE false
+
+#define WEBRTC_AGC_MAX_VOLUME 255
static const char* const valid_modargs[] = {
"high_pass_filter",
@@ -56,6 +67,15 @@ static const char* const valid_modargs[] = {
"routing_mode",
"comfort_noise",
"drift_compensation",
+ "voice_detection",
+ "extended_filter",
+ "intelligibility_enhancer",
+ "experimental_agc",
+ "agc_start_volume",
+ "beamforming",
+ "mic_geometry", /* documented in parse_mic_geometry() */
+ "target_direction", /* documented in parse_mic_geometry() */
+ "trace",
NULL
};
@@ -74,15 +94,155 @@ static int routing_mode_from_string(const char *rmode) {
return -1;
}
+class PaWebrtcTraceCallback : public webrtc::TraceCallback {
+ void Print(webrtc::TraceLevel level, const char *message, int length)
+ {
+ if (level & webrtc::kTraceError || level & webrtc::kTraceCritical)
+ pa_log(message);
+ else if (level & webrtc::kTraceWarning)
+ pa_log_warn(message);
+ else if (level & webrtc::kTraceInfo)
+ pa_log_info(message);
+ else
+ pa_log_debug(message);
+ }
+};
+
+static int webrtc_volume_from_pa(pa_volume_t v)
+{
+ return (v * WEBRTC_AGC_MAX_VOLUME) / PA_VOLUME_NORM;
+}
+
+static pa_volume_t webrtc_volume_to_pa(int v)
+{
+ return (v * PA_VOLUME_NORM) / WEBRTC_AGC_MAX_VOLUME;
+}
+
+static void webrtc_ec_fixate_spec(pa_sample_spec *rec_ss, pa_channel_map *rec_map,
+ pa_sample_spec *play_ss, pa_channel_map *play_map,
+ pa_sample_spec *out_ss, pa_channel_map *out_map,
+ bool beamforming)
+{
+ rec_ss->format = PA_SAMPLE_FLOAT32NE;
+ play_ss->format = PA_SAMPLE_FLOAT32NE;
+
+ /* AudioProcessing expects one of the following rates */
+ if (rec_ss->rate >= 48000)
+ rec_ss->rate = 48000;
+ else if (rec_ss->rate >= 32000)
+ rec_ss->rate = 32000;
+ else if (rec_ss->rate >= 16000)
+ rec_ss->rate = 16000;
+ else
+ rec_ss->rate = 8000;
+
+ *out_ss = *rec_ss;
+ *out_map = *rec_map;
+
+ if (beamforming) {
+ /* The beamformer gives us a single channel */
+ out_ss->channels = 1;
+ pa_channel_map_init_mono(out_map);
+ }
+
+ /* Playback stream rate needs to be the same as capture */
+ play_ss->rate = rec_ss->rate;
+}
+
+static bool parse_point(const char **point, float (&f)[3]) {
+ int ret, length;
+
+ ret = sscanf(*point, "%g,%g,%g%n", &f[0], &f[1], &f[2], &length);
+ if (ret != 3)
+ return false;
+
+ /* Consume the bytes we've read so far */
+ *point += length;
+
+ return true;
+}
+
+static bool parse_mic_geometry(const char **mic_geometry, std::vector<webrtc::Point>& geometry) {
+ /* The microphone geometry is expressed as cartesian point form:
+ * x1,y1,z1,x2,y2,z2,...
+ *
+ * Where x1,y1,z1 is the position of the first microphone with regards to
+ * the array's "center", x2,y2,z2 the position of the second, and so on.
+ *
+ * 'x' is the horizontal coordinate, with positive values being to the
+ * right from the mic array's perspective.
+ *
+ * 'y' is the depth coordinate, with positive values being in front of the
+ * array.
+ *
+ * 'z' is the vertical coordinate, with positive values being above the
+ * array.
+ *
+ * All distances are in meters.
+ */
+
+ /* The target direction is expected to be in spherical point form:
+ * a,e,r
+ *
+ * Where 'a is the azimuth of the first mic channel, 'e' its elevation,
+ * and 'r' the radius.
+ *
+ * 0 radians azimuth is to the right of the array, and positive angles
+ * move in a counter-clockwise direction.
+ *
+ * 0 radians elevation is horizontal w.r.t. the array, and positive
+ * angles go upwards.
+ *
+ * radius is distance from the array center in meters.
+ */
+
+ int i;
+ float f[3];
+
+ for (i = 0; i < geometry.size(); i++) {
+ if (!parse_point(mic_geometry, f)) {
+ pa_log("Failed to parse channel %d in mic_geometry", i);
+ return false;
+ }
+
+ /* Except for the last point, we should have a trailing comma */
+ if (i != geometry.size() - 1) {
+ if (**mic_geometry != ',') {
+ pa_log("Failed to parse channel %d in mic_geometry", i);
+ return false;
+ }
+
+ (*mic_geometry)++;
+ }
+
+ pa_log_debug("Got mic #%d position: (%g, %g, %g)", i, f[0], f[1], f[2]);
+
+ geometry[i].c[0] = f[0];
+ geometry[i].c[1] = f[1];
+ geometry[i].c[2] = f[2];
+ }
+
+ if (**mic_geometry != '\0') {
+ pa_log("Failed to parse mic_geometry value: more parameters than expected");
+ return false;
+ }
+
+ return true;
+}
+
bool pa_webrtc_ec_init(pa_core *c, pa_echo_canceller *ec,
pa_sample_spec *rec_ss, pa_channel_map *rec_map,
pa_sample_spec *play_ss, pa_channel_map *play_map,
pa_sample_spec *out_ss, pa_channel_map *out_map,
uint32_t *nframes, const char *args) {
webrtc::AudioProcessing *apm = NULL;
- bool hpf, ns, agc, dgc, mobile, cn;
- int rm = -1;
+ webrtc::ProcessingConfig pconfig;
+ webrtc::Config config;
+ bool hpf, ns, agc, dgc, mobile, cn, vad, ext_filter, intelligibility, experimental_agc, beamforming;
+ int rm = -1, i;
+ uint32_t agc_start_volume;
pa_modargs *ma;
+ bool trace = false;
if (!(ma = pa_modargs_new(args, valid_modargs))) {
pa_log("Failed to parse submodule arguments.");
@@ -153,32 +313,134 @@ bool pa_webrtc_ec_init(pa_core *c, pa_echo_canceller *ec,
}
}
- apm = webrtc::AudioProcessing::Create(0);
+ vad = DEFAULT_VAD;
+ if (pa_modargs_get_value_boolean(ma, "voice_detection", &vad) < 0) {
+ pa_log("Failed to parse voice_detection value");
+ goto fail;
+ }
+
+ ext_filter = DEFAULT_EXTENDED_FILTER;
+ if (pa_modargs_get_value_boolean(ma, "extended_filter", &ext_filter) < 0) {
+ pa_log("Failed to parse extended_filter value");
+ goto fail;
+ }
+
+ intelligibility = DEFAULT_INTELLIGIBILITY_ENHANCER;
+ if (pa_modargs_get_value_boolean(ma, "intelligibility_enhancer", &intelligibility) < 0) {
+ pa_log("Failed to parse intelligibility_enhancer value");
+ goto fail;
+ }
+
+ experimental_agc = DEFAULT_EXPERIMENTAL_AGC;
+ if (pa_modargs_get_value_boolean(ma, "experimental_agc", &experimental_agc) < 0) {
+ pa_log("Failed to parse experimental_agc value");
+ goto fail;
+ }
+
+ agc_start_volume = DEFAULT_AGC_START_VOLUME;
+ if (pa_modargs_get_value_u32(ma, "agc_start_volume", &agc_start_volume) < 0) {
+ pa_log("Failed to parse agc_start_volume value");
+ goto fail;
+ }
+ if (agc_start_volume > WEBRTC_AGC_MAX_VOLUME) {
+ pa_log("AGC start volume must not exceed %u", WEBRTC_AGC_MAX_VOLUME);
+ goto fail;
+ }
+ ec->params.webrtc.agc_start_volume = agc_start_volume;
+
+ beamforming = DEFAULT_BEAMFORMING;
+ if (pa_modargs_get_value_boolean(ma, "beamforming", &beamforming) < 0) {
+ pa_log("Failed to parse beamforming value");
+ goto fail;
+ }
+
+ if (ext_filter)
+ config.Set<webrtc::ExtendedFilter>(new webrtc::ExtendedFilter(true));
+ if (intelligibility)
+ pa_log_warn("The intelligibility enhancer is not currently supported");
+ if (experimental_agc)
+ config.Set<webrtc::ExperimentalAgc>(new webrtc::ExperimentalAgc(true, ec->params.webrtc.agc_start_volume));
+
+ trace = DEFAULT_TRACE;
+ if (pa_modargs_get_value_boolean(ma, "trace", &trace) < 0) {
+ pa_log("Failed to parse trace value");
+ goto fail;
+ }
+
+ if (trace) {
+ webrtc::Trace::CreateTrace();
+ webrtc::Trace::set_level_filter(webrtc::kTraceAll);
+ ec->params.webrtc.trace_callback = new PaWebrtcTraceCallback();
+ webrtc::Trace::SetTraceCallback((PaWebrtcTraceCallback *) ec->params.webrtc.trace_callback);
+ }
+
+ webrtc_ec_fixate_spec(rec_ss, rec_map, play_ss, play_map, out_ss, out_map, beamforming);
+
+ /* We do this after fixate because we need the capture channel count */
+ if (beamforming) {
+ std::vector<webrtc::Point> geometry(rec_ss->channels);
+ webrtc::SphericalPointf direction(0.0f, 0.0f, 0.0f);
+ const char *mic_geometry, *target_direction;
+
+ if (!(mic_geometry = pa_modargs_get_value(ma, "mic_geometry", NULL))) {
+ pa_log("mic_geometry must be set if beamforming is enabled");
+ goto fail;
+ }
+
+ if (!parse_mic_geometry(&mic_geometry, geometry)) {
+ pa_log("Failed to parse mic_geometry value");
+ goto fail;
+ }
+
+ if ((target_direction = pa_modargs_get_value(ma, "target_direction", NULL))) {
+ float f[3];
+
+ if (!parse_point(&target_direction, f)) {
+ pa_log("Failed to parse target_direction value");
+ goto fail;
+ }
+
+ if (*target_direction != '\0') {
+ pa_log("Failed to parse target_direction value: more parameters than expected");
+ goto fail;
+ }
+
+#define IS_ZERO(f) ((f) < 0.000001 && (f) > -0.000001)
+
+ if (!IS_ZERO(f[1]) || !IS_ZERO(f[2])) {
+ pa_log("The beamformer currently only supports targeting along the azimuth");
+ goto fail;
+ }
+
+ direction.s[0] = f[0];
+ direction.s[1] = f[1];
+ direction.s[2] = f[2];
+ }
- out_ss->format = PA_SAMPLE_S16NE;
- *play_ss = *out_ss;
- /* FIXME: the implementation actually allows a different number of
- * source/sink channels. Do we want to support that? */
- *play_map = *out_map;
- *rec_ss = *out_ss;
- *rec_map = *out_map;
+ if (!target_direction)
+ config.Set<webrtc::Beamforming>(new webrtc::Beamforming(true, geometry));
+ else
+ config.Set<webrtc::Beamforming>(new webrtc::Beamforming(true, geometry, direction));
+ }
- apm->set_sample_rate_hz(out_ss->rate);
+ apm = webrtc::AudioProcessing::Create(config);
- apm->set_num_channels(out_ss->channels, out_ss->channels);
- apm->set_num_reverse_channels(play_ss->channels);
+ pconfig = {
+ webrtc::StreamConfig(rec_ss->rate, rec_ss->channels, false), /* input stream */
+ webrtc::StreamConfig(out_ss->rate, out_ss->channels, false), /* output stream */
+ webrtc::StreamConfig(play_ss->rate, play_ss->channels, false), /* reverse input stream */
+ webrtc::StreamConfig(play_ss->rate, play_ss->channels, false), /* reverse output stream */
+ };
+ if (apm->Initialize(pconfig) != webrtc::AudioProcessing::kNoError) {
+ pa_log("Error initialising audio processing module");
+ goto fail;
+ }
if (hpf)
apm->high_pass_filter()->Enable(true);
if (!mobile) {
- if (ec->params.drift_compensation) {
- apm->echo_cancellation()->set_device_sample_rate_hz(out_ss->rate);
- apm->echo_cancellation()->enable_drift_compensation(true);
- } else {
- apm->echo_cancellation()->enable_drift_compensation(false);
- }
-
+ apm->echo_cancellation()->enable_drift_compensation(ec->params.drift_compensation);
apm->echo_cancellation()->Enable(true);
} else {
apm->echo_control_mobile()->set_routing_mode(static_cast<webrtc::EchoControlMobile::RoutingMode>(rm));
@@ -195,28 +457,38 @@ bool pa_webrtc_ec_init(pa_core *c, pa_echo_canceller *ec,
if (mobile && rm <= webrtc::EchoControlMobile::kEarpiece) {
/* Maybe this should be a knob, but we've got a lot of knobs already */
apm->gain_control()->set_mode(webrtc::GainControl::kFixedDigital);
- ec->params.priv.webrtc.agc = false;
+ ec->params.webrtc.agc = false;
} else if (dgc) {
apm->gain_control()->set_mode(webrtc::GainControl::kAdaptiveDigital);
- ec->params.priv.webrtc.agc = false;
+ ec->params.webrtc.agc = false;
} else {
apm->gain_control()->set_mode(webrtc::GainControl::kAdaptiveAnalog);
- if (apm->gain_control()->set_analog_level_limits(0, PA_VOLUME_NORM-1) != apm->kNoError) {
+ if (apm->gain_control()->set_analog_level_limits(0, WEBRTC_AGC_MAX_VOLUME) !=
+ webrtc::AudioProcessing::kNoError) {
pa_log("Failed to initialise AGC");
goto fail;
}
- ec->params.priv.webrtc.agc = true;
+ ec->params.webrtc.agc = true;
}
apm->gain_control()->Enable(true);
}
- apm->voice_detection()->Enable(true);
+ if (vad)
+ apm->voice_detection()->Enable(true);
+
+ ec->params.webrtc.apm = apm;
+ ec->params.webrtc.rec_ss = *rec_ss;
+ ec->params.webrtc.play_ss = *play_ss;
+ ec->params.webrtc.out_ss = *out_ss;
+ ec->params.webrtc.blocksize = (uint64_t) out_ss->rate * BLOCK_SIZE_US / PA_USEC_PER_SEC;
+ *nframes = ec->params.webrtc.blocksize;
+ ec->params.webrtc.first = true;
- ec->params.priv.webrtc.apm = apm;
- ec->params.priv.webrtc.sample_spec = *out_ss;
- ec->params.priv.webrtc.blocksize = (uint64_t)pa_bytes_per_second(out_ss) * BLOCK_SIZE_US / PA_USEC_PER_SEC;
- *nframes = ec->params.priv.webrtc.blocksize / pa_frame_size(out_ss);
+ for (i = 0; i < rec_ss->channels; i++)
+ ec->params.webrtc.rec_buffer[i] = pa_xnew(float, *nframes);
+ for (i = 0; i < play_ss->channels; i++)
+ ec->params.webrtc.play_buffer[i] = pa_xnew(float, *nframes);
pa_modargs_free(ma);
return true;
@@ -224,58 +496,77 @@ bool pa_webrtc_ec_init(pa_core *c, pa_echo_canceller *ec,
fail:
if (ma)
pa_modargs_free(ma);
- if (apm)
- webrtc::AudioProcessing::Destroy(apm);
+ if (ec->params.webrtc.trace_callback) {
+ webrtc::Trace::ReturnTrace();
+ delete ((PaWebrtcTraceCallback *) ec->params.webrtc.trace_callback);
+ } if (apm)
+ delete apm;
return false;
}
void pa_webrtc_ec_play(pa_echo_canceller *ec, const uint8_t *play) {
- webrtc::AudioProcessing *apm = (webrtc::AudioProcessing*)ec->params.priv.webrtc.apm;
- webrtc::AudioFrame play_frame;
- const pa_sample_spec *ss = &ec->params.priv.webrtc.sample_spec;
+ webrtc::AudioProcessing *apm = (webrtc::AudioProcessing*)ec->params.webrtc.apm;
+ const pa_sample_spec *ss = &ec->params.webrtc.play_ss;
+ int n = ec->params.webrtc.blocksize;
+ float **buf = ec->params.webrtc.play_buffer;
+ webrtc::StreamConfig config(ss->rate, ss->channels, false);
+
+ pa_deinterleave(play, (void **) buf, ss->channels, pa_sample_size(ss), n);
- play_frame._audioChannel = ss->channels;
- play_frame._frequencyInHz = ss->rate;
- play_frame._payloadDataLengthInSamples = ec->params.priv.webrtc.blocksize / pa_frame_size(ss);
- memcpy(play_frame._payloadData, play, ec->params.priv.webrtc.blocksize);
+ pa_assert_se(apm->ProcessReverseStream(buf, config, config, buf) == webrtc::AudioProcessing::kNoError);
- apm->AnalyzeReverseStream(&play_frame);
+ /* FIXME: If ProcessReverseStream() makes any changes to the audio, such as
+ * applying intelligibility enhancement, those changes don't have any
+ * effect. This function is called at the source side, but the processing
+ * would have to be done in the sink to be able to feed the processed audio
+ * to speakers. */
}
void pa_webrtc_ec_record(pa_echo_canceller *ec, const uint8_t *rec, uint8_t *out) {
- webrtc::AudioProcessing *apm = (webrtc::AudioProcessing*)ec->params.priv.webrtc.apm;
- webrtc::AudioFrame out_frame;
- const pa_sample_spec *ss = &ec->params.priv.webrtc.sample_spec;
- pa_cvolume v;
-
- out_frame._audioChannel = ss->channels;
- out_frame._frequencyInHz = ss->rate;
- out_frame._payloadDataLengthInSamples = ec->params.priv.webrtc.blocksize / pa_frame_size(ss);
- memcpy(out_frame._payloadData, rec, ec->params.priv.webrtc.blocksize);
-
- if (ec->params.priv.webrtc.agc) {
- pa_cvolume_init(&v);
- pa_echo_canceller_get_capture_volume(ec, &v);
- apm->gain_control()->set_stream_analog_level(pa_cvolume_avg(&v));
+ webrtc::AudioProcessing *apm = (webrtc::AudioProcessing*)ec->params.webrtc.apm;
+ const pa_sample_spec *rec_ss = &ec->params.webrtc.rec_ss;
+ const pa_sample_spec *out_ss = &ec->params.webrtc.out_ss;
+ float **buf = ec->params.webrtc.rec_buffer;
+ int n = ec->params.webrtc.blocksize;
+ int old_volume, new_volume;
+ webrtc::StreamConfig rec_config(rec_ss->rate, rec_ss->channels, false);
+ webrtc::StreamConfig out_config(out_ss->rate, out_ss->channels, false);
+
+ pa_deinterleave(rec, (void **) buf, rec_ss->channels, pa_sample_size(rec_ss), n);
+
+ if (ec->params.webrtc.agc) {
+ pa_volume_t v = pa_echo_canceller_get_capture_volume(ec);
+ old_volume = webrtc_volume_from_pa(v);
+ apm->gain_control()->set_stream_analog_level(old_volume);
}
apm->set_stream_delay_ms(0);
- apm->ProcessStream(&out_frame);
+ pa_assert_se(apm->ProcessStream(buf, rec_config, out_config, buf) == webrtc::AudioProcessing::kNoError);
+
+ if (ec->params.webrtc.agc) {
+ if (PA_UNLIKELY(ec->params.webrtc.first)) {
+ /* We start at a sane default volume (taken from the Chromium
+ * condition on the experimental AGC in audio_processing.h). This is
+ * needed to make sure that there's enough energy in the capture
+ * signal for the AGC to work */
+ ec->params.webrtc.first = false;
+ new_volume = ec->params.webrtc.agc_start_volume;
+ } else {
+ new_volume = apm->gain_control()->stream_analog_level();
+ }
- if (ec->params.priv.webrtc.agc) {
- pa_cvolume_set(&v, ss->channels, apm->gain_control()->stream_analog_level());
- pa_echo_canceller_set_capture_volume(ec, &v);
+ if (old_volume != new_volume)
+ pa_echo_canceller_set_capture_volume(ec, webrtc_volume_to_pa(new_volume));
}
- memcpy(out, out_frame._payloadData, ec->params.priv.webrtc.blocksize);
+ pa_interleave((const void **) buf, out_ss->channels, out, pa_sample_size(out_ss), n);
}
void pa_webrtc_ec_set_drift(pa_echo_canceller *ec, float drift) {
- webrtc::AudioProcessing *apm = (webrtc::AudioProcessing*)ec->params.priv.webrtc.apm;
- const pa_sample_spec *ss = &ec->params.priv.webrtc.sample_spec;
+ webrtc::AudioProcessing *apm = (webrtc::AudioProcessing*)ec->params.webrtc.apm;
- apm->echo_cancellation()->set_stream_drift_samples(drift * ec->params.priv.webrtc.blocksize / pa_frame_size(ss));
+ apm->echo_cancellation()->set_stream_drift_samples(drift * ec->params.webrtc.blocksize);
}
void pa_webrtc_ec_run(pa_echo_canceller *ec, const uint8_t *rec, const uint8_t *play, uint8_t *out) {
@@ -284,8 +575,20 @@ void pa_webrtc_ec_run(pa_echo_canceller *ec, const uint8_t *rec, const uint8_t *
}
void pa_webrtc_ec_done(pa_echo_canceller *ec) {
- if (ec->params.priv.webrtc.apm) {
- webrtc::AudioProcessing::Destroy((webrtc::AudioProcessing*)ec->params.priv.webrtc.apm);
- ec->params.priv.webrtc.apm = NULL;
+ int i;
+
+ if (ec->params.webrtc.trace_callback) {
+ webrtc::Trace::ReturnTrace();
+ delete ((PaWebrtcTraceCallback *) ec->params.webrtc.trace_callback);
}
+
+ if (ec->params.webrtc.apm) {
+ delete (webrtc::AudioProcessing*)ec->params.webrtc.apm;
+ ec->params.webrtc.apm = NULL;
+ }
+
+ for (i = 0; i < ec->params.webrtc.rec_ss.channels; i++)
+ pa_xfree(ec->params.webrtc.rec_buffer[i]);
+ for (i = 0; i < ec->params.webrtc.play_ss.channels; i++)
+ pa_xfree(ec->params.webrtc.play_buffer[i]);
}
diff --git a/src/modules/macosx/module-coreaudio-device.c b/src/modules/macosx/module-coreaudio-device.c
index 0c92d42..6c9e55d 100644
--- a/src/modules/macosx/module-coreaudio-device.c
+++ b/src/modules/macosx/module-coreaudio-device.c
@@ -376,23 +376,25 @@ static int ca_sink_set_state(pa_sink *s, pa_sink_state_t state) {
}
/* Caveat: The caller is responsible to get rid of the CFString(Ref). */
-static bool CFString_to_cstr_n(CFStringRef cfstr, char *buf, long n) {
- bool ret;
-
- pa_assert (buf);
+static char * CFString_to_cstr(CFStringRef cfstr) {
+ char *ret = NULL;
ret = false;
if (cfstr != NULL) {
const char *tmp = CFStringGetCStringPtr(cfstr, kCFStringEncodingUTF8);
+ CFIndex n = CFStringGetLength(cfstr) + 1 /* for the terminating NULL */;
+
+ ret = pa_xmalloc(n);
if (tmp == NULL) {
- if (CFStringGetCString(cfstr, buf, n, kCFStringEncodingUTF8))
- ret = true;
+ if (!CFStringGetCString(cfstr, ret, n, kCFStringEncodingUTF8)) {
+ pa_xfree(ret);
+ ret = NULL;
+ }
} else {
- strncpy(buf, tmp, n);
- buf[n - 1] = 0;
- ret = true;
+ strncpy(ret, tmp, n - 1);
+ ret[n - 1] = '\0';
}
}
@@ -408,11 +410,16 @@ static int ca_device_create_sink(pa_module *m, AudioBuffer *buf, int channel_idx
coreaudio_sink *ca_sink;
pa_sink *sink;
unsigned int i;
- char tmp[255];
+ char *tmp;
pa_strbuf *strbuf;
AudioObjectPropertyAddress property_address;
CFStringRef tmp_cfstr = NULL;
+ if (buf->mNumberChannels > PA_CHANNELS_MAX) {
+ pa_log("Skipping device with more channels than we support (%u)", (unsigned int) buf->mNumberChannels);
+ return -1;
+ }
+
ca_sink = pa_xnew0(coreaudio_sink, 1);
ca_sink->map.channels = buf->mNumberChannels;
ca_sink->ss.channels = buf->mNumberChannels;
@@ -425,23 +432,24 @@ static int ca_device_create_sink(pa_module *m, AudioBuffer *buf, int channel_idx
property_address.mSelector = kAudioObjectPropertyElementName;
property_address.mScope = kAudioDevicePropertyScopeOutput;
property_address.mElement = channel_idx + i + 1;
- size = sizeof(tmp);
+ size = sizeof(tmp_cfstr);
err = AudioObjectGetPropertyData(u->object_id, &property_address, 0, NULL, &size, &tmp_cfstr);
if (err == 0) {
- err = !(CFString_to_cstr_n(tmp_cfstr, tmp, sizeof(tmp)));
+ tmp = CFString_to_cstr(tmp_cfstr);
- if (tmp_cfstr) {
+ if (tmp_cfstr)
CFRelease(tmp_cfstr);
- }
}
- if (err || !strlen(tmp))
- snprintf(tmp, sizeof(tmp), "Channel %d", (int) property_address.mElement);
-
if (i > 0)
pa_strbuf_puts(strbuf, ", ");
- pa_strbuf_puts(strbuf, tmp);
+ if (err || !tmp || !strlen(tmp))
+ pa_strbuf_printf(strbuf, "Channel %d", (int) property_address.mElement);
+ else
+ pa_strbuf_puts(strbuf, tmp);
+
+ pa_xfree(tmp);
}
ca_sink->name = pa_strbuf_to_string_free(strbuf);
@@ -535,11 +543,16 @@ static int ca_device_create_source(pa_module *m, AudioBuffer *buf, int channel_i
coreaudio_source *ca_source;
pa_source *source;
unsigned int i;
- char tmp[255];
+ char *tmp;
pa_strbuf *strbuf;
AudioObjectPropertyAddress property_address;
CFStringRef tmp_cfstr = NULL;
+ if (buf->mNumberChannels > PA_CHANNELS_MAX) {
+ pa_log("Skipping device with more channels than we support (%u)", (unsigned int) buf->mNumberChannels);
+ return -1;
+ }
+
ca_source = pa_xnew0(coreaudio_source, 1);
ca_source->map.channels = buf->mNumberChannels;
ca_source->ss.channels = buf->mNumberChannels;
@@ -552,23 +565,24 @@ static int ca_device_create_source(pa_module *m, AudioBuffer *buf, int channel_i
property_address.mSelector = kAudioObjectPropertyElementName;
property_address.mScope = kAudioDevicePropertyScopeInput;
property_address.mElement = channel_idx + i + 1;
- size = sizeof(tmp);
+ size = sizeof(tmp_cfstr);
err = AudioObjectGetPropertyData(u->object_id, &property_address, 0, NULL, &size, &tmp_cfstr);
if (err == 0) {
- err = !(CFString_to_cstr_n(tmp_cfstr, tmp, sizeof(tmp)));
+ tmp = CFString_to_cstr(tmp_cfstr);
- if (tmp_cfstr) {
+ if (tmp_cfstr)
CFRelease(tmp_cfstr);
- }
}
- if (err || !strlen(tmp))
- snprintf(tmp, sizeof(tmp), "Channel %d", (int) property_address.mElement);
-
if (i > 0)
pa_strbuf_puts(strbuf, ", ");
- pa_strbuf_puts(strbuf, tmp);
+ if (err || !tmp || !strlen(tmp))
+ pa_strbuf_printf(strbuf, "Channel %d", (int) property_address.mElement);
+ else
+ pa_strbuf_puts(strbuf, tmp);
+
+ pa_xfree(tmp);
}
ca_source->name = pa_strbuf_to_string_free(strbuf);
diff --git a/src/modules/module-card-restore.c b/src/modules/module-card-restore.c
index f906843..7545aa5 100644
--- a/src/modules/module-card-restore.c
+++ b/src/modules/module-card-restore.c
@@ -64,7 +64,7 @@ struct userdata {
pa_database *database;
};
-#define ENTRY_VERSION 3
+#define ENTRY_VERSION 4
struct port_info {
char *name;
@@ -75,6 +75,8 @@ struct port_info {
struct entry {
char *profile;
pa_hashmap *ports; /* Port name -> struct port_info */
+ char *preferred_input_port;
+ char *preferred_output_port;
};
static void save_time_callback(pa_mainloop_api*a, pa_time_event* e, const struct timeval *t, void *userdata) {
@@ -131,6 +133,8 @@ static struct port_info *port_info_new(pa_device_port *port) {
static void entry_free(struct entry* e) {
pa_assert(e);
+ pa_xfree(e->preferred_output_port);
+ pa_xfree(e->preferred_input_port);
pa_xfree(e->profile);
pa_hashmap_free(e->ports);
@@ -176,6 +180,12 @@ static bool entrys_equal(struct entry *a, struct entry *b) {
return false;
}
+ if (!pa_safe_streq(a->preferred_input_port, b->preferred_input_port))
+ return false;
+
+ if (!pa_safe_streq(a->preferred_output_port, b->preferred_output_port))
+ return false;
+
return true;
}
@@ -201,6 +211,9 @@ static bool entry_write(struct userdata *u, const char *name, const struct entry
pa_tagstruct_puts(t, p_info->profile);
}
+ pa_tagstruct_puts(t, e->preferred_input_port);
+ pa_tagstruct_puts(t, e->preferred_output_port);
+
key.data = (char *) name;
key.size = strlen(name);
@@ -314,6 +327,18 @@ static struct entry* entry_read(struct userdata *u, const char *name) {
}
}
+ if (version >= 4) {
+ const char *preferred_input_port;
+ const char *preferred_output_port;
+
+ if (pa_tagstruct_gets(t, &preferred_input_port) < 0
+ || pa_tagstruct_gets(t, &preferred_output_port) < 0)
+ goto fail;
+
+ e->preferred_input_port = pa_xstrdup(preferred_input_port);
+ e->preferred_output_port = pa_xstrdup(preferred_output_port);
+ }
+
if (!pa_tagstruct_eof(t))
goto fail;
@@ -547,6 +572,46 @@ static pa_hook_result_t card_new_hook_callback(pa_core *c, pa_card_new_data *new
if (!p->preferred_profile && p_info->profile)
pa_device_port_set_preferred_profile(p, p_info->profile);
}
+
+ if (e->preferred_input_port) {
+ p = pa_hashmap_get(new_data->ports, e->preferred_input_port);
+ if (p)
+ pa_card_new_data_set_preferred_port(new_data, PA_DIRECTION_INPUT, p);
+ }
+
+ if (e->preferred_output_port) {
+ p = pa_hashmap_get(new_data->ports, e->preferred_output_port);
+ if (p)
+ pa_card_new_data_set_preferred_port(new_data, PA_DIRECTION_OUTPUT, p);
+ }
+
+ entry_free(e);
+
+ return PA_HOOK_OK;
+}
+
+static pa_hook_result_t card_preferred_port_changed_callback(pa_core *core, pa_card_preferred_port_changed_hook_data *data,
+ struct userdata *u) {
+ struct entry *e;
+ pa_card *card;
+
+ card = data->card;
+
+ e = entry_read(u, card->name);
+ if (!e)
+ e = entry_from_card(card);
+
+ if (data->direction == PA_DIRECTION_INPUT) {
+ pa_xfree(e->preferred_input_port);
+ e->preferred_input_port = pa_xstrdup(card->preferred_input_port ? card->preferred_input_port->name : NULL);
+ } else {
+ pa_xfree(e->preferred_output_port);
+ e->preferred_output_port = pa_xstrdup(card->preferred_output_port ? card->preferred_output_port->name : NULL);
+ }
+
+ if (entry_write(u, card->name, e))
+ trigger_save(u);
+
entry_free(e);
return PA_HOOK_OK;
@@ -570,6 +635,7 @@ int pa__init(pa_module*m) {
pa_module_hook_connect(m, &m->core->hooks[PA_CORE_HOOK_CARD_NEW], PA_HOOK_EARLY, (pa_hook_cb_t) card_new_hook_callback, u);
pa_module_hook_connect(m, &m->core->hooks[PA_CORE_HOOK_CARD_PUT], PA_HOOK_NORMAL, (pa_hook_cb_t) card_put_hook_callback, u);
+ pa_module_hook_connect(m, &m->core->hooks[PA_CORE_HOOK_CARD_PREFERRED_PORT_CHANGED], PA_HOOK_NORMAL, (pa_hook_cb_t) card_preferred_port_changed_callback, u);
pa_module_hook_connect(m, &m->core->hooks[PA_CORE_HOOK_CARD_PROFILE_CHANGED], PA_HOOK_NORMAL, (pa_hook_cb_t) card_profile_changed_callback, u);
pa_module_hook_connect(m, &m->core->hooks[PA_CORE_HOOK_CARD_PROFILE_ADDED], PA_HOOK_NORMAL, (pa_hook_cb_t) card_profile_added_callback, u);
pa_module_hook_connect(m, &m->core->hooks[PA_CORE_HOOK_CARD_PROFILE_AVAILABLE_CHANGED],
@@ -608,8 +674,10 @@ void pa__done(pa_module*m) {
if (!(u = m->userdata))
return;
- if (u->save_time_event)
+ if (u->save_time_event) {
u->core->mainloop->time_free(u->save_time_event);
+ pa_database_sync(u->database);
+ }
if (u->database)
pa_database_close(u->database);
diff --git a/src/modules/module-detect.c b/src/modules/module-detect.c
index a9a2de0..d6c6b76 100644
--- a/src/modules/module-detect.c
+++ b/src/modules/module-detect.c
@@ -46,7 +46,10 @@ PA_MODULE_DESCRIPTION("Detect available audio hardware and load matching drivers
PA_MODULE_VERSION(PACKAGE_VERSION);
PA_MODULE_LOAD_ONCE(true);
PA_MODULE_USAGE("just-one=<boolean>");
+
+#ifdef __linux__
PA_MODULE_DEPRECATED("Please use module-udev-detect instead of module-detect!");
+#endif
static const char* const valid_modargs[] = {
"just-one",
diff --git a/src/modules/module-device-manager.c b/src/modules/module-device-manager.c
index f125bdd..2a0a67f 100644
--- a/src/modules/module-device-manager.c
+++ b/src/modules/module-device-manager.c
@@ -292,8 +292,10 @@ static struct entry* entry_read(struct userdata *u, const char *name) {
pa_zero(data);
- if (!pa_database_get(u->database, &key, &data))
- goto fail;
+ if (!pa_database_get(u->database, &key, &data)) {
+ pa_log_debug("Database contains no data for key: %s", name);
+ return NULL;
+ }
t = pa_tagstruct_new_fixed(data.data, data.size);
e = entry_new();
@@ -647,8 +649,10 @@ static void update_highest_priority_device_indexes(struct userdata *u, const cha
}
static void route_sink_input(struct userdata *u, pa_sink_input *si) {
+ const char *auto_filtered_prop;
const char *role;
uint32_t role_index, device_index;
+ bool auto_filtered = false;
pa_sink *sink;
pa_assert(u);
@@ -661,6 +665,10 @@ static void route_sink_input(struct userdata *u, pa_sink_input *si) {
if (!si->sink)
return;
+ auto_filtered_prop = pa_proplist_gets(si->proplist, "module-device-manager.auto_filtered");
+ if (auto_filtered_prop)
+ auto_filtered = (pa_parse_boolean(auto_filtered_prop) == 1);
+
/* It might happen that a stream and a sink are set up at the
same time, in which case we want to make sure we don't
interfere with that */
@@ -682,6 +690,13 @@ static void route_sink_input(struct userdata *u, pa_sink_input *si) {
if (!(sink = pa_idxset_get_by_index(u->core->sinks, device_index)))
return;
+ if (auto_filtered) {
+ /* For streams for which a filter has been loaded by another module, we
+ * do not try to execute moves within the same filter hierarchy */
+ if (pa_sink_get_master(si->sink) == pa_sink_get_master(sink))
+ return;
+ }
+
if (si->sink != sink)
pa_sink_input_move_to(si, sink, false);
}
@@ -705,8 +720,10 @@ static pa_hook_result_t route_sink_inputs(struct userdata *u, pa_sink *ignore_si
}
static void route_source_output(struct userdata *u, pa_source_output *so) {
+ const char *auto_filtered_prop;
const char *role;
uint32_t role_index, device_index;
+ bool auto_filtered = false;
pa_source *source;
pa_assert(u);
@@ -722,6 +739,10 @@ static void route_source_output(struct userdata *u, pa_source_output *so) {
if (!so->source)
return;
+ auto_filtered_prop = pa_proplist_gets(so->proplist, "module-device-manager.auto_filtered");
+ if (auto_filtered_prop)
+ auto_filtered = (pa_parse_boolean(auto_filtered_prop) == 1);
+
/* It might happen that a stream and a source are set up at the
same time, in which case we want to make sure we don't
interfere with that */
@@ -743,6 +764,13 @@ static void route_source_output(struct userdata *u, pa_source_output *so) {
if (!(source = pa_idxset_get_by_index(u->core->sources, device_index)))
return;
+ if (auto_filtered) {
+ /* For streams for which a filter has been loaded by another module, we
+ * do not try to execute moves within the same filter hierarchy */
+ if (pa_source_get_master(so->source) == pa_source_get_master(source))
+ return;
+ }
+
if (so->source != source)
pa_source_output_move_to(so, source, false);
}
diff --git a/src/modules/module-filter-apply.c b/src/modules/module-filter-apply.c
index c3f83ce..364d68b 100644
--- a/src/modules/module-filter-apply.c
+++ b/src/modules/module-filter-apply.c
@@ -38,6 +38,7 @@
#include "module-filter-apply-symdef.h"
#define PA_PROP_FILTER_APPLY_MOVING "filter.apply.moving"
+#define PA_PROP_MDM_AUTO_FILTERED "module-device-manager.auto_filtered"
PA_MODULE_AUTHOR("Colin Guthrie");
PA_MODULE_DESCRIPTION("Load filter sinks automatically when needed");
@@ -65,6 +66,10 @@ struct filter {
struct userdata {
pa_core *core;
pa_hashmap *filters;
+ /* Keep track of streams we're managing PA_PROP_MDM_AUTO_FILTERED on, we're
+ * only maintaining membership, so key and value are just the
+ * pa_sink_input/pa_source_output. */
+ pa_hashmap *mdm_ignored_inputs, *mdm_ignored_outputs;
bool autoclean;
pa_time_event *housekeeping_time_event;
};
@@ -124,7 +129,7 @@ static const char* should_filter(pa_object *o, bool is_sink_input) {
else
pl = PA_SOURCE_OUTPUT(o)->proplist;
- /* If the stream doesn't what any filter, then let it be. */
+ /* If the stream doesn't want any filter, then let it be. */
if ((apply = pa_proplist_gets(pl, PA_PROP_FILTER_APPLY)) && !pa_streq(apply, "")) {
const char* suppress = pa_proplist_gets(pl, PA_PROP_FILTER_SUPPRESS);
@@ -270,14 +275,20 @@ static void trigger_housekeeping(struct userdata *u) {
u->housekeeping_time_event = pa_core_rttime_new(u->core, pa_rtclock_now() + HOUSEKEEPING_INTERVAL, housekeeping_time_callback, u);
}
-static int do_move(pa_object *obj, pa_object *parent, bool restore, bool is_input) {
- if (is_input)
- return pa_sink_input_move_to(PA_SINK_INPUT(obj), PA_SINK(parent), restore);
- else
- return pa_source_output_move_to(PA_SOURCE_OUTPUT(obj), PA_SOURCE(parent), restore);
+static int do_move(struct userdata *u, pa_object *obj, pa_object *parent, bool is_input) {
+ /* Keep track of objects that we've marked for module-device-manager to ignore */
+ pa_hashmap_put(is_input ? u->mdm_ignored_inputs : u->mdm_ignored_outputs, obj, obj);
+
+ if (is_input) {
+ pa_sink_input_set_property(PA_SINK_INPUT(obj), PA_PROP_MDM_AUTO_FILTERED, "1");
+ return pa_sink_input_move_to(PA_SINK_INPUT(obj), PA_SINK(parent), false);
+ } else {
+ pa_source_output_set_property(PA_SOURCE_OUTPUT(obj), PA_PROP_MDM_AUTO_FILTERED, "1");
+ return pa_source_output_move_to(PA_SOURCE_OUTPUT(obj), PA_SOURCE(parent), false);
+ }
}
-static void move_object_for_filter(pa_object *o, struct filter* filter, bool restore, bool is_sink_input) {
+static void move_object_for_filter(struct userdata *u, pa_object *o, struct filter* filter, bool restore, bool is_sink_input) {
pa_object *parent;
pa_proplist *pl;
const char *name;
@@ -301,7 +312,7 @@ static void move_object_for_filter(pa_object *o, struct filter* filter, bool res
pa_proplist_sets(pl, PA_PROP_FILTER_APPLY_MOVING, "1");
- if (do_move(o, parent, false, is_sink_input) < 0)
+ if (do_move(u, o, parent, is_sink_input) < 0)
pa_log_info("Failed to move %s for \"%s\" to <%s>.", is_sink_input ? "sink-input" : "source-output",
pa_strnull(pa_proplist_gets(pl, PA_PROP_APPLICATION_NAME)), name);
else
@@ -315,7 +326,7 @@ static void move_objects_for_filter(struct userdata *u, pa_object *o, struct fil
bool is_sink_input) {
if (!should_group_filter(filter))
- move_object_for_filter(o, filter, restore, is_sink_input);
+ move_object_for_filter(u, o, filter, restore, is_sink_input);
else {
pa_source_output *so;
pa_sink_input *si;
@@ -328,7 +339,7 @@ static void move_objects_for_filter(struct userdata *u, pa_object *o, struct fil
g = get_group(PA_OBJECT(so), false);
if (pa_streq(g, group))
- move_object_for_filter(PA_OBJECT(so), filter, restore, false);
+ move_object_for_filter(u, PA_OBJECT(so), filter, restore, false);
pa_xfree(g);
}
@@ -337,7 +348,7 @@ static void move_objects_for_filter(struct userdata *u, pa_object *o, struct fil
g = get_group(PA_OBJECT(si), true);
if (pa_streq(g, group))
- move_object_for_filter(PA_OBJECT(si), filter, restore, true);
+ move_object_for_filter(u, PA_OBJECT(si), filter, restore, true);
pa_xfree(g);
}
@@ -405,6 +416,8 @@ static pa_hook_result_t process(struct userdata *u, pa_object *o, bool is_sink_i
pa_sink *sink = NULL;
pa_source *source = NULL;
pa_module *module = NULL;
+ char *module_name = NULL;
+ struct filter *fltr = NULL, *filter = NULL;
if (is_sink_input) {
sink = PA_SINK_INPUT(o)->sink;
@@ -420,31 +433,27 @@ static pa_hook_result_t process(struct userdata *u, pa_object *o, bool is_sink_i
/* If there is no sink/source yet, we can't do much */
if ((is_sink_input && !sink) || (!is_sink_input && !source))
- return PA_HOOK_OK;
+ goto done;
/* If the stream doesn't what any filter, then let it be. */
if ((want = should_filter(o, is_sink_input))) {
- char *module_name;
- struct filter *fltr, *filter;
-
/* We need to ensure the SI is playing on a sink of this type
* attached to the sink it's "officially" playing on */
if (!module)
- return PA_HOOK_OK;
+ goto done;
module_name = pa_sprintf_malloc("module-%s", want);
if (pa_streq(module->name, module_name)) {
pa_log_debug("Stream appears to be playing on an appropriate sink already. Ignoring.");
- pa_xfree(module_name);
- return PA_HOOK_OK;
+ goto done;
}
fltr = filter_new(want, sink, source);
if (should_group_filter(fltr) && !find_paired_master(u, fltr, o, is_sink_input)) {
pa_log_debug("Want group filtering but don't have enough streams.");
- return PA_HOOK_OK;
+ goto done;
}
if (!(filter = pa_hashmap_get(u->filters, fltr))) {
@@ -467,14 +476,10 @@ static pa_hook_result_t process(struct userdata *u, pa_object *o, bool is_sink_i
pa_xfree(args);
}
- pa_xfree(fltr);
-
if (!filter) {
pa_log("Unable to load %s", module_name);
- pa_xfree(module_name);
- return PA_HOOK_OK;
+ goto done;
}
- pa_xfree(module_name);
/* We can move the stream now as we know the destination. If this
* isn't true, we will do it later when the sink appears. */
@@ -484,7 +489,6 @@ static pa_hook_result_t process(struct userdata *u, pa_object *o, bool is_sink_i
}
} else {
void *state;
- struct filter *filter = NULL;
/* We do not want to filter... but are we already filtered?
* This can happen if an input's proplist changes */
@@ -500,6 +504,10 @@ static pa_hook_result_t process(struct userdata *u, pa_object *o, bool is_sink_i
if (done_something)
trigger_housekeeping(u);
+done:
+ pa_xfree(module_name);
+ pa_xfree(fltr);
+
return PA_HOOK_OK;
}
@@ -517,6 +525,9 @@ static pa_hook_result_t sink_input_move_finish_cb(pa_core *core, pa_sink_input *
if (pa_proplist_gets(i->proplist, PA_PROP_FILTER_APPLY_MOVING))
return PA_HOOK_OK;
+ /* If we're managing m-d-m.auto_filtered on this, remove and re-add if we're continuing to manage it */
+ pa_hashmap_remove(u->mdm_ignored_inputs, i);
+
return process(u, PA_OBJECT(i), true);
}
@@ -536,6 +547,8 @@ static pa_hook_result_t sink_input_unlink_cb(pa_core *core, pa_sink_input *i, st
if (pa_hashmap_size(u->filters) > 0)
trigger_housekeeping(u);
+ pa_hashmap_remove(u->mdm_ignored_inputs, i);
+
return PA_HOOK_OK;
}
@@ -589,6 +602,9 @@ static pa_hook_result_t source_output_move_finish_cb(pa_core *core, pa_source_ou
if (pa_proplist_gets(o->proplist, PA_PROP_FILTER_APPLY_MOVING))
return PA_HOOK_OK;
+ /* If we're managing m-d-m.auto_filtered on this, remove and re-add if we're continuing to manage it */
+ pa_hashmap_remove(u->mdm_ignored_outputs, o);
+
return process(u, PA_OBJECT(o), false);
}
@@ -608,6 +624,8 @@ static pa_hook_result_t source_output_unlink_cb(pa_core *core, pa_source_output
if (pa_hashmap_size(u->filters) > 0)
trigger_housekeeping(u);
+ pa_hashmap_remove(u->mdm_ignored_outputs, o);
+
return PA_HOOK_OK;
}
@@ -647,6 +665,16 @@ static pa_hook_result_t source_unlink_cb(pa_core *core, pa_source *source, struc
return PA_HOOK_OK;
}
+static void unset_mdm_ignore_input(pa_sink_input *i)
+{
+ pa_sink_input_set_property(i, PA_PROP_MDM_AUTO_FILTERED, NULL);
+}
+
+static void unset_mdm_ignore_output(pa_source_output *o)
+{
+ pa_source_output_set_property(o, PA_PROP_MDM_AUTO_FILTERED, NULL);
+}
+
int pa__init(pa_module *m) {
pa_modargs *ma = NULL;
struct userdata *u;
@@ -669,6 +697,8 @@ int pa__init(pa_module *m) {
}
u->filters = pa_hashmap_new(filter_hash, filter_compare);
+ u->mdm_ignored_inputs = pa_hashmap_new_full(NULL, NULL, (pa_free_cb_t) unset_mdm_ignore_input, NULL);
+ u->mdm_ignored_outputs = pa_hashmap_new_full(NULL, NULL, (pa_free_cb_t) unset_mdm_ignore_output, NULL);
pa_module_hook_connect(m, &m->core->hooks[PA_CORE_HOOK_SINK_INPUT_PUT], PA_HOOK_LATE, (pa_hook_cb_t) sink_input_put_cb, u);
pa_module_hook_connect(m, &m->core->hooks[PA_CORE_HOOK_SINK_INPUT_MOVE_FINISH], PA_HOOK_LATE, (pa_hook_cb_t) sink_input_move_finish_cb, u);
@@ -716,5 +746,11 @@ void pa__done(pa_module *m) {
pa_hashmap_free(u->filters);
}
+ if (u->mdm_ignored_inputs)
+ pa_hashmap_free(u->mdm_ignored_inputs);
+
+ if (u->mdm_ignored_outputs)
+ pa_hashmap_free(u->mdm_ignored_outputs);
+
pa_xfree(u);
}
diff --git a/src/modules/module-loopback.c b/src/modules/module-loopback.c
index 37bf7b1..f4d0761 100644
--- a/src/modules/module-loopback.c
+++ b/src/modules/module-loopback.c
@@ -398,9 +398,9 @@ static bool source_output_may_move_to_cb(pa_source_output *o, pa_source *dest) {
/* Called from main thread */
static void source_output_moving_cb(pa_source_output *o, pa_source *dest) {
- pa_proplist *p;
- const char *n;
struct userdata *u;
+ char *input_description;
+ const char *n;
if (!dest)
return;
@@ -409,14 +409,13 @@ static void source_output_moving_cb(pa_source_output *o, pa_source *dest) {
pa_assert_ctl_context();
pa_assert_se(u = o->userdata);
- p = pa_proplist_new();
- pa_proplist_setf(p, PA_PROP_MEDIA_NAME, "Loopback of %s", pa_strnull(pa_proplist_gets(dest->proplist, PA_PROP_DEVICE_DESCRIPTION)));
+ input_description = pa_sprintf_malloc("Loopback of %s",
+ pa_strnull(pa_proplist_gets(dest->proplist, PA_PROP_DEVICE_DESCRIPTION)));
+ pa_sink_input_set_property(u->sink_input, PA_PROP_MEDIA_NAME, input_description);
+ pa_xfree(input_description);
if ((n = pa_proplist_gets(dest->proplist, PA_PROP_DEVICE_ICON_NAME)))
- pa_proplist_sets(p, PA_PROP_MEDIA_ICON_NAME, n);
-
- pa_sink_input_update_proplist(u->sink_input, PA_UPDATE_REPLACE, p);
- pa_proplist_free(p);
+ pa_sink_input_set_property(u->sink_input, PA_PROP_DEVICE_ICON_NAME, n);
if (pa_source_get_state(dest) == PA_SOURCE_SUSPENDED)
pa_sink_input_cork(u->sink_input, true);
@@ -671,7 +670,7 @@ static void sink_input_state_change_cb(pa_sink_input *i, pa_sink_input_state_t s
/* Called from main thread */
static void sink_input_moving_cb(pa_sink_input *i, pa_sink *dest) {
struct userdata *u;
- pa_proplist *p;
+ char *output_description;
const char *n;
if (!dest)
@@ -681,14 +680,13 @@ static void sink_input_moving_cb(pa_sink_input *i, pa_sink *dest) {
pa_assert_ctl_context();
pa_assert_se(u = i->userdata);
- p = pa_proplist_new();
- pa_proplist_setf(p, PA_PROP_MEDIA_NAME, "Loopback to %s", pa_strnull(pa_proplist_gets(dest->proplist, PA_PROP_DEVICE_DESCRIPTION)));
+ output_description = pa_sprintf_malloc("Loopback to %s",
+ pa_strnull(pa_proplist_gets(dest->proplist, PA_PROP_DEVICE_DESCRIPTION)));
+ pa_source_output_set_property(u->source_output, PA_PROP_MEDIA_NAME, output_description);
+ pa_xfree(output_description);
if ((n = pa_proplist_gets(dest->proplist, PA_PROP_DEVICE_ICON_NAME)))
- pa_proplist_sets(p, PA_PROP_MEDIA_ICON_NAME, n);
-
- pa_source_output_update_proplist(u->source_output, PA_UPDATE_REPLACE, p);
- pa_proplist_free(p);
+ pa_source_output_set_property(u->source_output, PA_PROP_MEDIA_ICON_NAME, n);
if (pa_sink_get_state(dest) == PA_SINK_SUSPENDED)
pa_source_output_cork(u->source_output, true);
diff --git a/src/modules/module-rescue-streams.c b/src/modules/module-rescue-streams.c
index 901dabd..60ac1c4 100644
--- a/src/modules/module-rescue-streams.c
+++ b/src/modules/module-rescue-streams.c
@@ -309,7 +309,7 @@ static pa_hook_result_t source_output_move_fail_hook_callback(pa_core *c, pa_sou
return PA_HOOK_OK;
} else {
- pa_log_info("Successfully moved output input %u \"%s\" to %s.", i->index,
+ pa_log_info("Successfully moved source output %u \"%s\" to %s.", i->index,
pa_strnull(pa_proplist_gets(i->proplist, PA_PROP_APPLICATION_NAME)), target->name);
return PA_HOOK_STOP;
}
diff --git a/src/modules/module-role-cork.c b/src/modules/module-role-cork.c
index 7c0f59f..d71cc38 100644
--- a/src/modules/module-role-cork.c
+++ b/src/modules/module-role-cork.c
@@ -21,15 +21,9 @@
#include <config.h>
#endif
-#include <pulse/xmalloc.h>
-
#include <pulsecore/macro.h>
-#include <pulsecore/hashmap.h>
-#include <pulsecore/hook-list.h>
#include <pulsecore/core.h>
-#include <pulsecore/core-util.h>
-#include <pulsecore/sink-input.h>
-#include <pulsecore/modargs.h>
+#include <stream-interaction.h>
#include "module-role-cork-symdef.h"
@@ -49,260 +43,16 @@ static const char* const valid_modargs[] = {
NULL
};
-struct userdata {
- pa_core *core;
- pa_hashmap *cork_state;
- pa_idxset *trigger_roles;
- pa_idxset *cork_roles;
- bool global:1;
- pa_hook_slot
- *sink_input_put_slot,
- *sink_input_unlink_slot,
- *sink_input_move_start_slot,
- *sink_input_move_finish_slot;
-};
-
-static bool shall_cork(struct userdata *u, pa_sink *s, pa_sink_input *ignore) {
- pa_sink_input *j;
- uint32_t idx, role_idx;
- const char *trigger_role;
-
- pa_assert(u);
- pa_sink_assert_ref(s);
-
- for (j = PA_SINK_INPUT(pa_idxset_first(s->inputs, &idx)); j; j = PA_SINK_INPUT(pa_idxset_next(s->inputs, &idx))) {
- const char *role;
-
- if (j == ignore)
- continue;
-
- if (!(role = pa_proplist_gets(j->proplist, PA_PROP_MEDIA_ROLE)))
- continue;
-
- PA_IDXSET_FOREACH(trigger_role, u->trigger_roles, role_idx) {
- if (pa_streq(role, trigger_role)) {
- pa_log_debug("Found a '%s' stream that will trigger the auto-cork.", trigger_role);
- return true;
- }
- }
- }
-
- return false;
-}
-
-static inline void apply_cork_to_sink(struct userdata *u, pa_sink *s, pa_sink_input *ignore, bool cork) {
- pa_sink_input *j;
- uint32_t idx, role_idx;
- const char *cork_role;
- bool trigger = false;
-
- pa_assert(u);
- pa_sink_assert_ref(s);
-
- for (j = PA_SINK_INPUT(pa_idxset_first(s->inputs, &idx)); j; j = PA_SINK_INPUT(pa_idxset_next(s->inputs, &idx))) {
- bool corked, corked_here;
- const char *role;
-
- if (j == ignore)
- continue;
-
- if (!(role = pa_proplist_gets(j->proplist, PA_PROP_MEDIA_ROLE)))
- continue;
-
- PA_IDXSET_FOREACH(cork_role, u->cork_roles, role_idx) {
- if ((trigger = pa_streq(role, cork_role)))
- break;
- }
- if (!trigger)
- continue;
-
- corked = (pa_sink_input_get_state(j) == PA_SINK_INPUT_CORKED);
- corked_here = !!pa_hashmap_get(u->cork_state, j);
-
- if (cork && !corked && !j->muted) {
- pa_log_debug("Found a '%s' stream that should be corked/muted.", cork_role);
- if (!corked_here)
- pa_hashmap_put(u->cork_state, j, PA_INT_TO_PTR(1));
- pa_sink_input_set_mute(j, true, false);
- pa_sink_input_send_event(j, PA_STREAM_EVENT_REQUEST_CORK, NULL);
- } else if (!cork) {
- pa_hashmap_remove(u->cork_state, j);
-
- if (corked_here && (corked || j->muted)) {
- pa_log_debug("Found a '%s' stream that should be uncorked/unmuted.", cork_role);
- if (j->muted)
- pa_sink_input_set_mute(j, false, false);
- if (corked)
- pa_sink_input_send_event(j, PA_STREAM_EVENT_REQUEST_UNCORK, NULL);
- }
- }
- }
-}
-
-static void apply_cork(struct userdata *u, pa_sink *s, pa_sink_input *ignore, bool cork) {
- pa_assert(u);
-
- if (u->global) {
- uint32_t idx;
- PA_IDXSET_FOREACH(s, u->core->sinks, idx)
- apply_cork_to_sink(u, s, ignore, cork);
- } else
- apply_cork_to_sink(u, s, ignore, cork);
-}
-
-static pa_hook_result_t process(struct userdata *u, pa_sink_input *i, bool create) {
- bool cork = false;
- const char *role;
-
- pa_assert(u);
- pa_sink_input_assert_ref(i);
-
- if (!create)
- pa_hashmap_remove(u->cork_state, i);
-
- if (!(role = pa_proplist_gets(i->proplist, PA_PROP_MEDIA_ROLE)))
- return PA_HOOK_OK;
-
- if (!i->sink)
- return PA_HOOK_OK;
-
- cork = shall_cork(u, i->sink, create ? NULL : i);
- apply_cork(u, i->sink, create ? NULL : i, cork);
-
- return PA_HOOK_OK;
-}
-
-static pa_hook_result_t sink_input_put_cb(pa_core *core, pa_sink_input *i, struct userdata *u) {
- pa_core_assert_ref(core);
- pa_sink_input_assert_ref(i);
-
- return process(u, i, true);
-}
-
-static pa_hook_result_t sink_input_unlink_cb(pa_core *core, pa_sink_input *i, struct userdata *u) {
- pa_sink_input_assert_ref(i);
-
- return process(u, i, false);
-}
-
-static pa_hook_result_t sink_input_move_start_cb(pa_core *core, pa_sink_input *i, struct userdata *u) {
- pa_core_assert_ref(core);
- pa_sink_input_assert_ref(i);
-
- return process(u, i, false);
-}
-
-static pa_hook_result_t sink_input_move_finish_cb(pa_core *core, pa_sink_input *i, struct userdata *u) {
- pa_core_assert_ref(core);
- pa_sink_input_assert_ref(i);
-
- return process(u, i, true);
-}
-
int pa__init(pa_module *m) {
- pa_modargs *ma = NULL;
- struct userdata *u;
- const char *roles;
- bool global = false;
pa_assert(m);
- if (!(ma = pa_modargs_new(m->argument, valid_modargs))) {
- pa_log("Failed to parse module arguments");
- goto fail;
- }
-
- m->userdata = u = pa_xnew(struct userdata, 1);
-
- u->core = m->core;
- u->cork_state = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
-
- u->trigger_roles = pa_idxset_new(NULL, NULL);
- roles = pa_modargs_get_value(ma, "trigger_roles", NULL);
- if (roles) {
- const char *split_state = NULL;
- char *n = NULL;
- while ((n = pa_split(roles, ",", &split_state))) {
- if (n[0] != '\0')
- pa_idxset_put(u->trigger_roles, n, NULL);
- else
- pa_xfree(n);
- }
- }
- if (pa_idxset_isempty(u->trigger_roles)) {
- pa_log_debug("Using role 'phone' as trigger role.");
- pa_idxset_put(u->trigger_roles, pa_xstrdup("phone"), NULL);
- }
-
- u->cork_roles = pa_idxset_new(NULL, NULL);
- roles = pa_modargs_get_value(ma, "cork_roles", NULL);
- if (roles) {
- const char *split_state = NULL;
- char *n = NULL;
- while ((n = pa_split(roles, ",", &split_state))) {
- if (n[0] != '\0')
- pa_idxset_put(u->cork_roles, n, NULL);
- else
- pa_xfree(n);
- }
- }
- if (pa_idxset_isempty(u->cork_roles)) {
- pa_log_debug("Using roles 'music' and 'video' as cork roles.");
- pa_idxset_put(u->cork_roles, pa_xstrdup("music"), NULL);
- pa_idxset_put(u->cork_roles, pa_xstrdup("video"), NULL);
- }
-
- if (pa_modargs_get_value_boolean(ma, "global", &global) < 0) {
- pa_log("Invalid boolean parameter: global");
- goto fail;
- }
- u->global = global;
-
- u->sink_input_put_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_PUT], PA_HOOK_LATE, (pa_hook_cb_t) sink_input_put_cb, u);
- u->sink_input_unlink_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_UNLINK], PA_HOOK_LATE, (pa_hook_cb_t) sink_input_unlink_cb, u);
- u->sink_input_move_start_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_MOVE_START], PA_HOOK_LATE, (pa_hook_cb_t) sink_input_move_start_cb, u);
- u->sink_input_move_finish_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_MOVE_FINISH], PA_HOOK_LATE, (pa_hook_cb_t) sink_input_move_finish_cb, u);
-
- pa_modargs_free(ma);
-
- return 0;
-
-fail:
- pa__done(m);
-
- if (ma)
- pa_modargs_free(ma);
-
- return -1;
-
+ return pa_stream_interaction_init(m, valid_modargs);
}
void pa__done(pa_module *m) {
- struct userdata* u;
pa_assert(m);
- if (!(u = m->userdata))
- return;
-
- if (u->trigger_roles)
- pa_idxset_free(u->trigger_roles, pa_xfree);
-
- if (u->cork_roles)
- pa_idxset_free(u->cork_roles, pa_xfree);
-
- if (u->sink_input_put_slot)
- pa_hook_slot_free(u->sink_input_put_slot);
- if (u->sink_input_unlink_slot)
- pa_hook_slot_free(u->sink_input_unlink_slot);
- if (u->sink_input_move_start_slot)
- pa_hook_slot_free(u->sink_input_move_start_slot);
- if (u->sink_input_move_finish_slot)
- pa_hook_slot_free(u->sink_input_move_finish_slot);
-
- if (u->cork_state)
- pa_hashmap_free(u->cork_state);
-
- pa_xfree(u);
-
+ pa_stream_interaction_done(m);
}
diff --git a/src/modules/module-role-ducking.c b/src/modules/module-role-ducking.c
index 4f9be10..add2d36 100644
--- a/src/modules/module-role-ducking.c
+++ b/src/modules/module-role-ducking.c
@@ -21,16 +21,9 @@
#include <config.h>
#endif
-#include <pulse/volume.h>
-#include <pulse/xmalloc.h>
-
#include <pulsecore/macro.h>
-#include <pulsecore/hashmap.h>
-#include <pulsecore/hook-list.h>
#include <pulsecore/core.h>
-#include <pulsecore/core-util.h>
-#include <pulsecore/sink-input.h>
-#include <pulsecore/modargs.h>
+#include <stream-interaction.h>
#include "module-role-ducking-symdef.h"
@@ -39,10 +32,10 @@ PA_MODULE_DESCRIPTION("Apply a ducking effect based on streams roles");
PA_MODULE_VERSION(PACKAGE_VERSION);
PA_MODULE_LOAD_ONCE(true);
PA_MODULE_USAGE(
- "trigger_roles=<Comma separated list of roles which will trigger a ducking> "
- "ducking_roles=<Comma separated list of roles which will be ducked> "
+ "trigger_roles=<Comma(and slash) separated list of roles which will trigger a ducking. Slash can divide the roles into groups>"
+ "ducking_roles=<Comma(and slash) separated list of roles which will be ducked. Slash can divide the roles into groups>"
"global=<Should we operate globally or only inside the same device?>"
- "volume=<Volume for the attenuated streams. Default: -20dB"
+ "volume=<Volume for the attenuated streams. Default: -20dB. If trigger_roles and ducking_roles are separated by slash, use slash for dividing volume group>"
);
static const char* const valid_modargs[] = {
@@ -53,264 +46,16 @@ static const char* const valid_modargs[] = {
NULL
};
-struct userdata {
- pa_core *core;
- const char *name;
- pa_idxset *trigger_roles;
- pa_idxset *ducking_roles;
- pa_idxset *ducked_inputs;
- bool global;
- pa_volume_t volume;
- pa_hook_slot
- *sink_input_put_slot,
- *sink_input_unlink_slot,
- *sink_input_move_start_slot,
- *sink_input_move_finish_slot;
-};
-
-static bool sink_has_trigger_streams(struct userdata *u, pa_sink *s, pa_sink_input *ignore) {
- pa_sink_input *j;
- uint32_t idx, role_idx;
- const char *trigger_role;
-
- pa_assert(u);
- pa_sink_assert_ref(s);
-
- PA_IDXSET_FOREACH(j, s->inputs, idx) {
- const char *role;
-
- if (j == ignore)
- continue;
-
- if (!(role = pa_proplist_gets(j->proplist, PA_PROP_MEDIA_ROLE)))
- continue;
-
- PA_IDXSET_FOREACH(trigger_role, u->trigger_roles, role_idx) {
- if (pa_streq(role, trigger_role)) {
- pa_log_debug("Found a '%s' stream that will trigger the ducking.", trigger_role);
- return true;
- }
- }
- }
-
- return false;
-}
-
-static void apply_ducking_to_sink(struct userdata *u, pa_sink *s, pa_sink_input *ignore, bool duck) {
- pa_sink_input *j;
- uint32_t idx, role_idx;
- const char *ducking_role;
- bool trigger = false;
-
- pa_assert(u);
- pa_sink_assert_ref(s);
-
- PA_IDXSET_FOREACH(j, s->inputs, idx) {
- const char *role;
- pa_sink_input *i;
-
- if (j == ignore)
- continue;
-
- if (!(role = pa_proplist_gets(j->proplist, PA_PROP_MEDIA_ROLE)))
- continue;
-
- PA_IDXSET_FOREACH(ducking_role, u->ducking_roles, role_idx) {
- if ((trigger = pa_streq(role, ducking_role)))
- break;
- }
- if (!trigger)
- continue;
-
- i = pa_idxset_get_by_data(u->ducked_inputs, j, NULL);
- if (duck && !i) {
- pa_cvolume vol;
- vol.channels = 1;
- vol.values[0] = u->volume;
-
- pa_log_debug("Found a '%s' stream that should be ducked.", ducking_role);
- pa_sink_input_add_volume_factor(j, u->name, &vol);
- pa_idxset_put(u->ducked_inputs, j, NULL);
- } else if (!duck && i) { /* This stream should not longer be ducked */
- pa_log_debug("Found a '%s' stream that should be unducked", ducking_role);
- pa_idxset_remove_by_data(u->ducked_inputs, j, NULL);
- pa_sink_input_remove_volume_factor(j, u->name);
- }
- }
-}
-
-static void apply_ducking(struct userdata *u, pa_sink *s, pa_sink_input *ignore, bool duck) {
- pa_assert(u);
-
- if (u->global) {
- uint32_t idx;
- PA_IDXSET_FOREACH(s, u->core->sinks, idx)
- apply_ducking_to_sink(u, s, ignore, duck);
- } else
- apply_ducking_to_sink(u, s, ignore, duck);
-}
-
-static pa_hook_result_t process(struct userdata *u, pa_sink_input *i, bool duck) {
- bool should_duck = false;
- const char *role;
-
- pa_assert(u);
- pa_sink_input_assert_ref(i);
-
- if (!(role = pa_proplist_gets(i->proplist, PA_PROP_MEDIA_ROLE)))
- return PA_HOOK_OK;
-
- if (!i->sink)
- return PA_HOOK_OK;
-
- should_duck = sink_has_trigger_streams(u, i->sink, duck ? NULL : i);
- apply_ducking(u, i->sink, duck ? NULL : i, should_duck);
-
- return PA_HOOK_OK;
-}
-
-static pa_hook_result_t sink_input_put_cb(pa_core *core, pa_sink_input *i, struct userdata *u) {
- pa_core_assert_ref(core);
- pa_sink_input_assert_ref(i);
-
- return process(u, i, true);
-}
-
-static pa_hook_result_t sink_input_unlink_cb(pa_core *core, pa_sink_input *i, struct userdata *u) {
- pa_sink_input_assert_ref(i);
-
- pa_idxset_remove_by_data(u->ducked_inputs, i, NULL);
- return process(u, i, false);
-}
-
-static pa_hook_result_t sink_input_move_start_cb(pa_core *core, pa_sink_input *i, struct userdata *u) {
- pa_core_assert_ref(core);
- pa_sink_input_assert_ref(i);
-
- return process(u, i, false);
-}
-
-static pa_hook_result_t sink_input_move_finish_cb(pa_core *core, pa_sink_input *i, struct userdata *u) {
- pa_core_assert_ref(core);
- pa_sink_input_assert_ref(i);
-
- return process(u, i, true);
-}
-
int pa__init(pa_module *m) {
- pa_modargs *ma = NULL;
- struct userdata *u;
- const char *roles;
pa_assert(m);
- if (!(ma = pa_modargs_new(m->argument, valid_modargs))) {
- pa_log("Failed to parse module arguments");
- goto fail;
- }
-
- m->userdata = u = pa_xnew0(struct userdata, 1);
-
- u->core = m->core;
- u->name = m->name;
-
- u->ducked_inputs = pa_idxset_new(NULL, NULL);
-
- u->trigger_roles = pa_idxset_new(NULL, NULL);
- roles = pa_modargs_get_value(ma, "trigger_roles", NULL);
- if (roles) {
- const char *split_state = NULL;
- char *n = NULL;
- while ((n = pa_split(roles, ",", &split_state))) {
- if (n[0] != '\0')
- pa_idxset_put(u->trigger_roles, n, NULL);
- else
- pa_xfree(n);
- }
- }
- if (pa_idxset_isempty(u->trigger_roles)) {
- pa_log_debug("Using role 'phone' as trigger role.");
- pa_idxset_put(u->trigger_roles, pa_xstrdup("phone"), NULL);
- }
-
- u->ducking_roles = pa_idxset_new(NULL, NULL);
- roles = pa_modargs_get_value(ma, "ducking_roles", NULL);
- if (roles) {
- const char *split_state = NULL;
- char *n = NULL;
- while ((n = pa_split(roles, ",", &split_state))) {
- if (n[0] != '\0')
- pa_idxset_put(u->ducking_roles, n, NULL);
- else
- pa_xfree(n);
- }
- }
- if (pa_idxset_isempty(u->ducking_roles)) {
- pa_log_debug("Using roles 'music' and 'video' as ducking roles.");
- pa_idxset_put(u->ducking_roles, pa_xstrdup("music"), NULL);
- pa_idxset_put(u->ducking_roles, pa_xstrdup("video"), NULL);
- }
-
- u->global = false;
- if (pa_modargs_get_value_boolean(ma, "global", &u->global) < 0) {
- pa_log("Failed to parse a boolean parameter: global");
- goto fail;
- }
-
- u->volume = pa_sw_volume_from_dB(-20);
- if (pa_modargs_get_value_volume(ma, "volume", &u->volume) < 0) {
- pa_log("Failed to parse a volume parameter: volume");
- goto fail;
- }
-
- u->sink_input_put_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_PUT], PA_HOOK_LATE, (pa_hook_cb_t) sink_input_put_cb, u);
- u->sink_input_unlink_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_UNLINK], PA_HOOK_LATE, (pa_hook_cb_t) sink_input_unlink_cb, u);
- u->sink_input_move_start_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_MOVE_START], PA_HOOK_LATE, (pa_hook_cb_t) sink_input_move_start_cb, u);
- u->sink_input_move_finish_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_MOVE_FINISH], PA_HOOK_LATE, (pa_hook_cb_t) sink_input_move_finish_cb, u);
-
- pa_modargs_free(ma);
-
- return 0;
-
-fail:
- pa__done(m);
-
- if (ma)
- pa_modargs_free(ma);
-
- return -1;
+ return pa_stream_interaction_init(m, valid_modargs);
}
void pa__done(pa_module *m) {
- struct userdata* u;
- pa_sink_input *i;
pa_assert(m);
- if (!(u = m->userdata))
- return;
-
- if (u->trigger_roles)
- pa_idxset_free(u->trigger_roles, pa_xfree);
-
- if (u->ducking_roles)
- pa_idxset_free(u->ducking_roles, pa_xfree);
-
- if (u->ducked_inputs) {
- while ((i = pa_idxset_steal_first(u->ducked_inputs, NULL)))
- pa_sink_input_remove_volume_factor(i, u->name);
-
- pa_idxset_free(u->ducked_inputs, NULL);
- }
-
- if (u->sink_input_put_slot)
- pa_hook_slot_free(u->sink_input_put_slot);
- if (u->sink_input_unlink_slot)
- pa_hook_slot_free(u->sink_input_unlink_slot);
- if (u->sink_input_move_start_slot)
- pa_hook_slot_free(u->sink_input_move_start_slot);
- if (u->sink_input_move_finish_slot)
- pa_hook_slot_free(u->sink_input_move_finish_slot);
-
- pa_xfree(u);
+ pa_stream_interaction_done(m);
}
diff --git a/src/modules/module-solaris.c b/src/modules/module-solaris.c
index c79918a..2fa0bff 100644
--- a/src/modules/module-solaris.c
+++ b/src/modules/module-solaris.c
@@ -412,10 +412,12 @@ static int sink_process_msg(pa_msgobject *o, int code, void *data, int64_t offse
pa_smoother_resume(u->smoother, pa_rtclock_now(), true);
if (!u->source || u->source_suspended) {
+ bool mute;
if (unsuspend(u) < 0)
return -1;
u->sink->get_volume(u->sink);
- u->sink->get_mute(u->sink);
+ if (u->sink->get_mute(u->sink, &mute) >= 0)
+ pa_sink_set_mute(u->sink, mute, false);
}
u->sink_suspended = false;
}
@@ -1033,8 +1035,12 @@ int pa__init(pa_module *m) {
if (sink_new_data.muted_is_set)
u->sink->set_mute(u->sink);
- else
- u->sink->get_mute(u->sink);
+ else {
+ bool mute;
+
+ if (u->sink->get_mute(u->sink, &mute) >= 0)
+ pa_sink_set_mute(u->sink, mute, false);
+ }
pa_sink_put(u->sink);
}
diff --git a/src/modules/module-stream-restore.c b/src/modules/module-stream-restore.c
index ac51ff3..d1c2597 100644
--- a/src/modules/module-stream-restore.c
+++ b/src/modules/module-stream-restore.c
@@ -645,7 +645,7 @@ static void handle_add_entry(DBusConnection *conn, DBusMessage *msg, void *userd
e->channel_map = map;
e->volume_valid = !!map.channels;
- device_updated = (e->device_valid != !!device[0]) || !pa_streq(e->device, device);
+ device_updated = (e->device_valid != !!device[0]) || !pa_safe_streq(e->device, device);
pa_xfree(e->device);
e->device = pa_xstrdup(device);
e->device_valid = !!device[0];
@@ -757,7 +757,7 @@ static void handle_entry_set_device(DBusConnection *conn, DBusMessage *msg, DBus
pa_assert_se(e = entry_read(de->userdata, de->entry_name));
- updated = (e->device_valid != !!device[0]) || !pa_streq(e->device, device);
+ updated = (e->device_valid != !!device[0]) || !pa_safe_streq(e->device, device);
if (updated) {
pa_xfree(e->device);
@@ -2341,7 +2341,7 @@ static void clean_up_db(struct userdata *u) {
PA_LLIST_FOREACH_SAFE(item, next, to_be_converted) {
pa_log_debug("Upgrading a legacy entry to the current format: %s", item->entry_name);
- pa_assert_se(entry_write(u, item->entry_name, item->entry, true) >= 0);
+ pa_assert_se(entry_write(u, item->entry_name, item->entry, true));
trigger_save(u);
PA_LLIST_REMOVE(struct clean_up_item, to_be_converted, item);
diff --git a/src/modules/module-switch-on-port-available.c b/src/modules/module-switch-on-port-available.c
index 5dd9786..b9a0f3b 100644
--- a/src/modules/module-switch-on-port-available.c
+++ b/src/modules/module-switch-on-port-available.c
@@ -29,45 +29,97 @@
#include "module-switch-on-port-available-symdef.h"
-static bool profile_good_for_output(pa_card_profile *profile) {
+struct card_info {
+ struct userdata *userdata;
+ pa_card *card;
+
+ /* We need to cache the active profile, because we want to compare the old
+ * and new profiles in the PROFILE_CHANGED hook. Without this we'd only
+ * have access to the new profile. */
+ pa_card_profile *active_profile;
+};
+
+struct userdata {
+ pa_hashmap *card_infos; /* pa_card -> struct card_info */
+};
+
+static void card_info_new(struct userdata *u, pa_card *card) {
+ struct card_info *info;
+
+ info = pa_xnew0(struct card_info, 1);
+ info->userdata = u;
+ info->card = card;
+ info->active_profile = card->active_profile;
+
+ pa_hashmap_put(u->card_infos, card, info);
+}
+
+static void card_info_free(struct card_info *info) {
+ pa_hashmap_remove(info->userdata->card_infos, info->card);
+ pa_xfree(info);
+}
+
+static bool profile_good_for_output(pa_card_profile *profile, pa_device_port *port) {
+ pa_card *card;
pa_sink *sink;
uint32_t idx;
pa_assert(profile);
- if (!pa_safe_streq(profile->card->active_profile->input_name, profile->input_name))
+ card = profile->card;
+
+ if (!pa_safe_streq(card->active_profile->input_name, profile->input_name))
return false;
- if (profile->card->active_profile->n_sources != profile->n_sources)
+ if (card->active_profile->n_sources != profile->n_sources)
return false;
- if (profile->card->active_profile->max_source_channels != profile->max_source_channels)
+ if (card->active_profile->max_source_channels != profile->max_source_channels)
return false;
- /* Try not to switch to HDMI sinks from analog when HDMI is becoming available */
- PA_IDXSET_FOREACH(sink, profile->card->sinks, idx) {
+ if (port == card->preferred_output_port)
+ return true;
+
+ PA_IDXSET_FOREACH(sink, card->sinks, idx) {
if (!sink->active_port)
continue;
- if (sink->active_port->available != PA_AVAILABLE_NO)
+ if ((sink->active_port->available != PA_AVAILABLE_NO) && (sink->active_port->priority >= port->priority))
return false;
}
return true;
}
-static bool profile_good_for_input(pa_card_profile *profile) {
+static bool profile_good_for_input(pa_card_profile *profile, pa_device_port *port) {
+ pa_card *card;
+ pa_source *source;
+ uint32_t idx;
+
pa_assert(profile);
- if (!pa_safe_streq(profile->card->active_profile->output_name, profile->output_name))
+ card = profile->card;
+
+ if (!pa_safe_streq(card->active_profile->output_name, profile->output_name))
return false;
- if (profile->card->active_profile->n_sinks != profile->n_sinks)
+ if (card->active_profile->n_sinks != profile->n_sinks)
return false;
- if (profile->card->active_profile->max_sink_channels != profile->max_sink_channels)
+ if (card->active_profile->max_sink_channels != profile->max_sink_channels)
return false;
+ if (port == card->preferred_input_port)
+ return true;
+
+ PA_IDXSET_FOREACH(source, card->sources, idx) {
+ if (!source->active_port)
+ continue;
+
+ if ((source->active_port->available != PA_AVAILABLE_NO) && (source->active_port->priority >= port->priority))
+ return false;
+ }
+
return true;
}
@@ -88,12 +140,12 @@ static int try_to_switch_profile(pa_device_port *port) {
switch (port->direction) {
case PA_DIRECTION_OUTPUT:
name = profile->output_name;
- good = profile_good_for_output(profile);
+ good = profile_good_for_output(profile, port);
break;
case PA_DIRECTION_INPUT:
name = profile->input_name;
- good = profile_good_for_input(profile);
+ good = profile_good_for_input(profile, port);
break;
}
@@ -182,7 +234,7 @@ static bool switch_to_port(pa_device_port *port) {
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)
+ if (!pp.is_possible_profile_active)
return false;
}
else
@@ -307,9 +359,142 @@ static pa_hook_result_t source_new_hook_callback(pa_core *c, pa_source_new_data
return PA_HOOK_OK;
}
+static pa_hook_result_t card_put_hook_callback(pa_core *core, pa_card *card, struct userdata *u) {
+ card_info_new(u, card);
+
+ return PA_HOOK_OK;
+}
+
+static pa_hook_result_t card_unlink_hook_callback(pa_core *core, pa_card *card, struct userdata *u) {
+ card_info_free(pa_hashmap_get(u->card_infos, card));
+
+ return PA_HOOK_OK;
+}
+
+static void update_preferred_input_port(pa_card *card, pa_card_profile *old_profile, pa_card_profile *new_profile) {
+ pa_source *source;
+
+ /* If the profile change didn't affect input, it doesn't indicate change in
+ * the user's input port preference. */
+ if (pa_safe_streq(old_profile->input_name, new_profile->input_name))
+ return;
+
+ /* If there are more than one source, we don't know which of those the user
+ * prefers. If there are no sources, then the user doesn't seem to care
+ * about input at all. */
+ if (pa_idxset_size(card->sources) != 1) {
+ pa_card_set_preferred_port(card, PA_DIRECTION_INPUT, NULL);
+ return;
+ }
+
+ /* If the profile change modified the set of sinks, then it's unclear
+ * whether the user wanted to activate some specific input port, or was the
+ * input change only a side effect of activating some output. If the new
+ * profile contains no sinks, though, then we know the user only cares
+ * about input. */
+ if (pa_idxset_size(card->sinks) > 0 && !pa_safe_streq(old_profile->output_name, new_profile->output_name)) {
+ pa_card_set_preferred_port(card, PA_DIRECTION_INPUT, NULL);
+ return;
+ }
+
+ source = pa_idxset_first(card->sources, NULL);
+
+ /* We know the user wanted to activate this source. The user might not have
+ * wanted to activate the port that was selected by default, but if that's
+ * the case, the user will change the port manually, and we'll update the
+ * port preference at that time. If no port change occurs, we can assume
+ * that the user likes the port that is now active. */
+ pa_card_set_preferred_port(card, PA_DIRECTION_INPUT, source->active_port);
+}
+
+static void update_preferred_output_port(pa_card *card, pa_card_profile *old_profile, pa_card_profile *new_profile) {
+ pa_sink *sink;
+
+ /* If the profile change didn't affect output, it doesn't indicate change in
+ * the user's output port preference. */
+ if (pa_safe_streq(old_profile->output_name, new_profile->output_name))
+ return;
+
+ /* If there are more than one sink, we don't know which of those the user
+ * prefers. If there are no sinks, then the user doesn't seem to care about
+ * output at all. */
+ if (pa_idxset_size(card->sinks) != 1) {
+ pa_card_set_preferred_port(card, PA_DIRECTION_OUTPUT, NULL);
+ return;
+ }
+
+ /* If the profile change modified the set of sources, then it's unclear
+ * whether the user wanted to activate some specific output port, or was
+ * the output change only a side effect of activating some input. If the
+ * new profile contains no sources, though, then we know the user only
+ * cares about output. */
+ if (pa_idxset_size(card->sources) > 0 && !pa_safe_streq(old_profile->input_name, new_profile->input_name)) {
+ pa_card_set_preferred_port(card, PA_DIRECTION_OUTPUT, NULL);
+ return;
+ }
+
+ sink = pa_idxset_first(card->sinks, NULL);
+
+ /* We know the user wanted to activate this sink. The user might not have
+ * wanted to activate the port that was selected by default, but if that's
+ * the case, the user will change the port manually, and we'll update the
+ * port preference at that time. If no port change occurs, we can assume
+ * that the user likes the port that is now active. */
+ pa_card_set_preferred_port(card, PA_DIRECTION_OUTPUT, sink->active_port);
+}
+
+static pa_hook_result_t card_profile_changed_callback(pa_core *core, pa_card *card, struct userdata *u) {
+ struct card_info *info;
+ pa_card_profile *old_profile;
+ pa_card_profile *new_profile;
+
+ info = pa_hashmap_get(u->card_infos, card);
+ old_profile = info->active_profile;
+ new_profile = card->active_profile;
+ info->active_profile = new_profile;
+
+ /* This profile change wasn't initiated by the user, so it doesn't signal
+ * a change in the user's port preferences. */
+ if (!card->save_profile)
+ return PA_HOOK_OK;
+
+ update_preferred_input_port(card, old_profile, new_profile);
+ update_preferred_output_port(card, old_profile, new_profile);
+
+ return PA_HOOK_OK;
+}
+
+static pa_hook_result_t source_port_changed_callback(pa_core *core, pa_source *source, void *userdata) {
+ if (!source->save_port)
+ return PA_HOOK_OK;
+
+ pa_card_set_preferred_port(source->card, PA_DIRECTION_INPUT, source->active_port);
+
+ return PA_HOOK_OK;
+}
+
+static pa_hook_result_t sink_port_changed_callback(pa_core *core, pa_sink *sink, void *userdata) {
+ if (!sink->save_port)
+ return PA_HOOK_OK;
+
+ pa_card_set_preferred_port(sink->card, PA_DIRECTION_OUTPUT, sink->active_port);
+
+ return PA_HOOK_OK;
+}
+
int pa__init(pa_module*m) {
+ struct userdata *u;
+ pa_card *card;
+ uint32_t idx;
+
pa_assert(m);
+ u = m->userdata = pa_xnew0(struct userdata, 1);
+ u->card_infos = pa_hashmap_new(NULL, NULL);
+
+ PA_IDXSET_FOREACH(card, m->core->cards, idx)
+ card_info_new(u, card);
+
/* Make sure we are after module-device-restore, so we can overwrite that suggestion if necessary */
pa_module_hook_connect(m, &m->core->hooks[PA_CORE_HOOK_SINK_NEW],
PA_HOOK_NORMAL, (pa_hook_cb_t) sink_new_hook_callback, NULL);
@@ -317,8 +502,35 @@ int pa__init(pa_module*m) {
PA_HOOK_NORMAL, (pa_hook_cb_t) source_new_hook_callback, NULL);
pa_module_hook_connect(m, &m->core->hooks[PA_CORE_HOOK_PORT_AVAILABLE_CHANGED],
PA_HOOK_LATE, (pa_hook_cb_t) port_available_hook_callback, NULL);
+ pa_module_hook_connect(m, &m->core->hooks[PA_CORE_HOOK_CARD_PUT],
+ PA_HOOK_NORMAL, (pa_hook_cb_t) card_put_hook_callback, u);
+ pa_module_hook_connect(m, &m->core->hooks[PA_CORE_HOOK_CARD_UNLINK],
+ PA_HOOK_NORMAL, (pa_hook_cb_t) card_unlink_hook_callback, u);
+ pa_module_hook_connect(m, &m->core->hooks[PA_CORE_HOOK_CARD_PROFILE_CHANGED],
+ PA_HOOK_NORMAL, (pa_hook_cb_t) card_profile_changed_callback, u);
+ pa_module_hook_connect(m, &m->core->hooks[PA_CORE_HOOK_SOURCE_PORT_CHANGED],
+ PA_HOOK_NORMAL, (pa_hook_cb_t) source_port_changed_callback, NULL);
+ pa_module_hook_connect(m, &m->core->hooks[PA_CORE_HOOK_SINK_PORT_CHANGED],
+ PA_HOOK_NORMAL, (pa_hook_cb_t) sink_port_changed_callback, NULL);
handle_all_unavailable(m->core);
return 0;
}
+
+void pa__done(pa_module *module) {
+ struct userdata *u;
+ struct card_info *info;
+
+ pa_assert(module);
+
+ if (!(u = module->userdata))
+ return;
+
+ while ((info = pa_hashmap_last(u->card_infos)))
+ card_info_free(info);
+
+ pa_hashmap_free(u->card_infos);
+
+ pa_xfree(u);
+}
diff --git a/src/modules/module-tunnel.c b/src/modules/module-tunnel.c
index 53c4402..5c8b84a 100644
--- a/src/modules/module-tunnel.c
+++ b/src/modules/module-tunnel.c
@@ -1778,7 +1778,7 @@ static void pstream_die_callback(pa_pstream *p, void *userdata) {
}
/* Called from main context */
-static void pstream_packet_callback(pa_pstream *p, pa_packet *packet, const pa_cmsg_ancil_data *ancil_data, void *userdata) {
+static void pstream_packet_callback(pa_pstream *p, pa_packet *packet, pa_cmsg_ancil_data *ancil_data, void *userdata) {
struct userdata *u = userdata;
pa_assert(p);
diff --git a/src/modules/rtp/module-rtp-recv.c b/src/modules/rtp/module-rtp-recv.c
index dc42f7c..5977500 100644
--- a/src/modules/rtp/module-rtp-recv.c
+++ b/src/modules/rtp/module-rtp-recv.c
@@ -106,6 +106,7 @@ struct session {
pa_usec_t intended_latency;
pa_usec_t sink_latency;
+ unsigned int base_rate;
pa_usec_t last_rate_update;
pa_usec_t last_latency;
double estimated_rate;
@@ -284,7 +285,6 @@ static int rtpoll_work_cb(pa_rtpoll_item *i) {
if (s->last_rate_update + RATE_UPDATE_INTERVAL < pa_timeval_load(&now)) {
pa_usec_t wi, ri, render_delay, sink_delay = 0, latency;
- uint32_t base_rate = s->sink_input->sink->sample_spec.rate;
uint32_t current_rate = s->sink_input->sample_spec.rate;
uint32_t new_rate;
double estimated_rate, alpha = 0.02;
@@ -351,12 +351,12 @@ static int rtpoll_work_cb(pa_rtpoll_item *i) {
new_rate = (uint32_t) ((double) (RATE_UPDATE_INTERVAL + latency/4 - s->intended_latency/4) / (double) RATE_UPDATE_INTERVAL * s->avg_estimated_rate);
s->last_latency = latency;
- if (new_rate < (uint32_t) (base_rate*0.8) || new_rate > (uint32_t) (base_rate*1.25)) {
- pa_log_warn("Sample rates too different, not adjusting (%u vs. %u).", base_rate, new_rate);
- new_rate = base_rate;
+ if (new_rate < (uint32_t) (s->base_rate*0.8) || new_rate > (uint32_t) (s->base_rate*1.25)) {
+ pa_log_warn("Sample rates too different, not adjusting (%u vs. %u).", s->base_rate, new_rate);
+ new_rate = s->base_rate;
} else {
- if (base_rate < new_rate + 20 && new_rate < base_rate + 20)
- new_rate = base_rate;
+ if (s->base_rate < new_rate + 20 && new_rate < s->base_rate + 20)
+ new_rate = s->base_rate;
/* Do the adjustment in small steps; 2‰ can be considered inaudible */
if (new_rate < (uint32_t) (current_rate*0.998) || new_rate > (uint32_t) (current_rate*1.002)) {
pa_log_info("New rate of %u Hz not within 2‰ of %u Hz, forcing smaller adjustment", new_rate, current_rate);
@@ -521,8 +521,6 @@ static struct session *session_new(struct userdata *u, const pa_sdp_info *sdp_in
s->intended_latency = u->latency;
s->last_rate_update = pa_timeval_load(&now);
s->last_latency = u->latency;
- s->estimated_rate = (double) sink->sample_spec.rate;
- s->avg_estimated_rate = (double) sink->sample_spec.rate;
pa_atomic_store(&s->timestamp, (int) now.tv_sec);
if ((fd = mcast_socket((const struct sockaddr*) &sdp_info->sa, sdp_info->salen)) < 0)
@@ -554,6 +552,10 @@ static struct session *session_new(struct userdata *u, const pa_sdp_info *sdp_in
goto fail;
}
+ s->base_rate = (double) s->sink_input->sample_spec.rate;
+ s->estimated_rate = (double) s->sink_input->sample_spec.rate;
+ s->avg_estimated_rate = (double) s->sink_input->sample_spec.rate;
+
s->sink_input->userdata = s;
s->sink_input->parent.process_msg = sink_input_process_msg;
diff --git a/src/modules/stream-interaction.c b/src/modules/stream-interaction.c
new file mode 100644
index 0000000..7a476c3
--- /dev/null
+++ b/src/modules/stream-interaction.c
@@ -0,0 +1,550 @@
+/***
+ This file is part of PulseAudio.
+
+ Copyright 2009 Lennart Poettering
+
+ 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.1 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/>.
+***/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <pulse/xmalloc.h>
+#include <pulse/volume.h>
+
+#include <pulsecore/macro.h>
+#include <pulsecore/hashmap.h>
+#include <pulsecore/hook-list.h>
+#include <pulsecore/core.h>
+#include <pulsecore/core-util.h>
+#include <pulsecore/sink-input.h>
+#include <pulsecore/modargs.h>
+
+#include "stream-interaction.h"
+
+struct group {
+ char *name;
+ pa_idxset *trigger_roles;
+ pa_idxset *interaction_roles;
+ pa_hashmap *interaction_state;
+ pa_volume_t volume;
+};
+
+struct userdata {
+ pa_core *core;
+ uint32_t n_groups;
+ struct group **groups;
+ bool global:1;
+ bool duck:1;
+ pa_hook_slot
+ *sink_input_put_slot,
+ *sink_input_unlink_slot,
+ *sink_input_move_start_slot,
+ *sink_input_move_finish_slot,
+ *sink_input_state_changed_slot,
+ *sink_input_mute_changed_slot,
+ *sink_input_proplist_changed_slot;
+};
+
+static const char *get_trigger_role(struct userdata *u, pa_sink_input *i, struct group *g) {
+ const char *role, *trigger_role;
+ uint32_t role_idx;
+
+ if (!(role = pa_proplist_gets(i->proplist, PA_PROP_MEDIA_ROLE)))
+ role = "no_role";
+
+ if (g == NULL) {
+ /* get it from all groups */
+ uint32_t j;
+ for (j = 0; j < u->n_groups; j++) {
+ PA_IDXSET_FOREACH(trigger_role, u->groups[j]->trigger_roles, role_idx) {
+ if (pa_streq(role, trigger_role))
+ return trigger_role;
+ }
+ }
+ } else {
+ PA_IDXSET_FOREACH(trigger_role, g->trigger_roles, role_idx) {
+ if (pa_streq(role, trigger_role))
+ return trigger_role;
+ }
+ }
+
+ return NULL;
+}
+
+static const char *find_trigger_stream(struct userdata *u, pa_sink *s, pa_sink_input *ignore, struct group *g) {
+ pa_sink_input *j;
+ uint32_t idx;
+ const char *trigger_role;
+
+ pa_assert(u);
+ pa_sink_assert_ref(s);
+
+ for (j = PA_SINK_INPUT(pa_idxset_first(s->inputs, &idx)); j; j = PA_SINK_INPUT(pa_idxset_next(s->inputs, &idx))) {
+
+ if (j == ignore)
+ continue;
+
+ trigger_role = get_trigger_role(u, j, g);
+ if (trigger_role && !j->muted && pa_sink_input_get_state(j) != PA_SINK_INPUT_CORKED)
+ return trigger_role;
+ }
+
+ return NULL;
+}
+
+static const char *find_global_trigger_stream(struct userdata *u, pa_sink *s, pa_sink_input *ignore, struct group *g) {
+ const char *trigger_role = NULL;
+
+ pa_assert(u);
+
+ if (u->global) {
+ uint32_t idx;
+ PA_IDXSET_FOREACH(s, u->core->sinks, idx)
+ if ((trigger_role = find_trigger_stream(u, s, ignore, g)))
+ break;
+ } else
+ trigger_role = find_trigger_stream(u, s, ignore, g);
+
+ return trigger_role;
+}
+
+static void cork_or_duck(struct userdata *u, pa_sink_input *i, const char *interaction_role, const char *trigger_role, bool interaction_applied, struct group *g) {
+
+ if (u->duck && !interaction_applied) {
+ pa_cvolume vol;
+ vol.channels = 1;
+ vol.values[0] = g->volume;
+
+ pa_log_debug("Found a '%s' stream of '%s' that ducks a '%s' stream.", trigger_role, g->name, interaction_role);
+ pa_sink_input_add_volume_factor(i, g->name, &vol);
+
+ } else if (!u->duck) {
+ pa_log_debug("Found a '%s' stream that corks/mutes a '%s' stream.", trigger_role, interaction_role);
+ pa_sink_input_set_mute(i, true, false);
+ pa_sink_input_send_event(i, PA_STREAM_EVENT_REQUEST_CORK, NULL);
+ }
+}
+
+static void uncork_or_unduck(struct userdata *u, pa_sink_input *i, const char *interaction_role, bool corked, struct group *g) {
+
+ if (u->duck) {
+ pa_log_debug("In '%s', found a '%s' stream that should be unducked", g->name, interaction_role);
+ pa_sink_input_remove_volume_factor(i, g->name);
+ }
+ else if (corked || i->muted) {
+ pa_log_debug("Found a '%s' stream that should be uncorked/unmuted.", interaction_role);
+ if (i->muted)
+ pa_sink_input_set_mute(i, false, false);
+ if (corked)
+ pa_sink_input_send_event(i, PA_STREAM_EVENT_REQUEST_UNCORK, NULL);
+ }
+}
+
+static inline void apply_interaction_to_sink(struct userdata *u, pa_sink *s, const char *new_trigger, pa_sink_input *ignore, bool new_stream, struct group *g) {
+ pa_sink_input *j;
+ uint32_t idx, role_idx;
+ const char *interaction_role;
+ bool trigger = false;
+
+ pa_assert(u);
+ pa_sink_assert_ref(s);
+
+ for (j = PA_SINK_INPUT(pa_idxset_first(s->inputs, &idx)); j; j = PA_SINK_INPUT(pa_idxset_next(s->inputs, &idx))) {
+ bool corked, interaction_applied;
+ const char *role;
+
+ if (j == ignore)
+ continue;
+
+ if (!(role = pa_proplist_gets(j->proplist, PA_PROP_MEDIA_ROLE)))
+ role = "no_role";
+
+ PA_IDXSET_FOREACH(interaction_role, g->interaction_roles, role_idx) {
+ if ((trigger = pa_streq(role, interaction_role)))
+ break;
+ if ((trigger = (pa_streq(interaction_role, "any_role") && !get_trigger_role(u, j, g))))
+ break;
+ }
+ if (!trigger)
+ continue;
+
+ /* Some applications start their streams corked, so the stream is uncorked by */
+ /* the application only after sink_input_put() was called. If a new stream turns */
+ /* up, act as if it was not corked. In the case of module-role-cork this will */
+ /* only mute the stream because corking is reverted later by the application */
+ corked = (pa_sink_input_get_state(j) == PA_SINK_INPUT_CORKED);
+ if (new_stream && corked)
+ corked = false;
+ interaction_applied = !!pa_hashmap_get(g->interaction_state, j);
+
+ if (new_trigger && ((!corked && !j->muted) || u->duck)) {
+ if (!interaction_applied)
+ pa_hashmap_put(g->interaction_state, j, PA_INT_TO_PTR(1));
+
+ cork_or_duck(u, j, role, new_trigger, interaction_applied, g);
+
+ } else if (!new_trigger && interaction_applied) {
+ pa_hashmap_remove(g->interaction_state, j);
+
+ uncork_or_unduck(u, j, role, corked, g);
+ }
+ }
+}
+
+static void apply_interaction(struct userdata *u, pa_sink *s, const char *trigger_role, pa_sink_input *ignore, bool new_stream, struct group *g) {
+ pa_assert(u);
+
+ if (u->global) {
+ uint32_t idx;
+ PA_IDXSET_FOREACH(s, u->core->sinks, idx)
+ apply_interaction_to_sink(u, s, trigger_role, ignore, new_stream, g);
+ } else
+ apply_interaction_to_sink(u, s, trigger_role, ignore, new_stream, g);
+}
+
+static void remove_interactions(struct userdata *u, struct group *g) {
+ uint32_t idx, idx_input;
+ pa_sink *s;
+ pa_sink_input *j;
+ bool corked;
+ const char *role;
+
+ PA_IDXSET_FOREACH(s, u->core->sinks, idx) {
+
+ for (j = PA_SINK_INPUT(pa_idxset_first(s->inputs, &idx_input)); j; j = PA_SINK_INPUT(pa_idxset_next(s->inputs, &idx_input))) {
+
+ if(!!pa_hashmap_get(g->interaction_state, j)) {
+ corked = (pa_sink_input_get_state(j) == PA_SINK_INPUT_CORKED);
+ if (!(role = pa_proplist_gets(j->proplist, PA_PROP_MEDIA_ROLE)))
+ role = "no_role";
+ uncork_or_unduck(u, j, role, corked, g);
+ }
+ }
+ }
+}
+
+static pa_hook_result_t process(struct userdata *u, pa_sink_input *i, bool create, bool new_stream) {
+ const char *trigger_role;
+ uint32_t j;
+
+ pa_assert(u);
+ pa_sink_input_assert_ref(i);
+
+ if (!create)
+ for (j = 0; j < u->n_groups; j++)
+ pa_hashmap_remove(u->groups[j]->interaction_state, i);
+
+ if (!i->sink)
+ return PA_HOOK_OK;
+
+ for (j = 0; j < u->n_groups; j++) {
+ trigger_role = find_global_trigger_stream(u, i->sink, create ? NULL : i, u->groups[j]);
+ apply_interaction(u, i->sink, trigger_role, create ? NULL : i, new_stream, u->groups[j]);
+ }
+
+ return PA_HOOK_OK;
+}
+
+static pa_hook_result_t sink_input_put_cb(pa_core *core, pa_sink_input *i, struct userdata *u) {
+ pa_core_assert_ref(core);
+ pa_sink_input_assert_ref(i);
+
+ return process(u, i, true, true);
+}
+
+static pa_hook_result_t sink_input_unlink_cb(pa_core *core, pa_sink_input *i, struct userdata *u) {
+ pa_sink_input_assert_ref(i);
+
+ return process(u, i, false, false);
+}
+
+static pa_hook_result_t sink_input_move_start_cb(pa_core *core, pa_sink_input *i, struct userdata *u) {
+ pa_core_assert_ref(core);
+ pa_sink_input_assert_ref(i);
+
+ return process(u, i, false, false);
+}
+
+static pa_hook_result_t sink_input_move_finish_cb(pa_core *core, pa_sink_input *i, struct userdata *u) {
+ pa_core_assert_ref(core);
+ pa_sink_input_assert_ref(i);
+
+ return process(u, i, true, false);
+}
+
+static pa_hook_result_t sink_input_state_changed_cb(pa_core *core, pa_sink_input *i, struct userdata *u) {
+ pa_core_assert_ref(core);
+ pa_sink_input_assert_ref(i);
+
+ if (PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(i)) && get_trigger_role(u, i, NULL))
+ return process(u, i, true, false);
+
+ return PA_HOOK_OK;
+}
+
+static pa_hook_result_t sink_input_mute_changed_cb(pa_core *core, pa_sink_input *i, struct userdata *u) {
+ pa_core_assert_ref(core);
+ pa_sink_input_assert_ref(i);
+
+ if (PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(i)) && get_trigger_role(u, i, NULL))
+ return process(u, i, true, false);
+
+ return PA_HOOK_OK;
+}
+
+static pa_hook_result_t sink_input_proplist_changed_cb(pa_core *core, pa_sink_input *i, struct userdata *u) {
+ pa_core_assert_ref(core);
+ pa_sink_input_assert_ref(i);
+
+ if (PA_SINK_INPUT_IS_LINKED(pa_sink_input_get_state(i)))
+ return process(u, i, true, false);
+
+ return PA_HOOK_OK;
+}
+
+int pa_stream_interaction_init(pa_module *m, const char* const v_modargs[]) {
+ pa_modargs *ma = NULL;
+ struct userdata *u;
+ const char *roles;
+ bool global = false;
+ uint32_t i = 0;
+
+ pa_assert(m);
+
+ if (!(ma = pa_modargs_new(m->argument, v_modargs))) {
+ pa_log("Failed to parse module arguments");
+ goto fail;
+ }
+
+ m->userdata = u = pa_xnew0(struct userdata, 1);
+
+ u->core = m->core;
+
+ u->duck = false;
+ if (pa_streq(m->name, "module-role-ducking"))
+ u->duck = true;
+
+ u->n_groups = 1;
+
+ if (u->duck) {
+ const char *volumes;
+ uint32_t group_count_tr = 0;
+ uint32_t group_count_du = 0;
+ uint32_t group_count_vol = 0;
+
+ roles = pa_modargs_get_value(ma, "trigger_roles", NULL);
+ if (roles) {
+ const char *split_state = NULL;
+ char *n = NULL;
+ while ((n = pa_split(roles, "/", &split_state))) {
+ group_count_tr++;
+ pa_xfree(n);
+ }
+ }
+ roles = pa_modargs_get_value(ma, "ducking_roles", NULL);
+ if (roles) {
+ const char *split_state = NULL;
+ char *n = NULL;
+ while ((n = pa_split(roles, "/", &split_state))) {
+ group_count_du++;
+ pa_xfree(n);
+ }
+ }
+ volumes = pa_modargs_get_value(ma, "volume", NULL);
+ if (volumes) {
+ const char *split_state = NULL;
+ char *n = NULL;
+ while ((n = pa_split(volumes, "/", &split_state))) {
+ group_count_vol++;
+ pa_xfree(n);
+ }
+ }
+
+ if ((group_count_tr > 1 || group_count_du > 1 || group_count_vol > 1) &&
+ ((group_count_tr != group_count_du) || (group_count_tr != group_count_vol))) {
+ pa_log("Invalid number of groups");
+ goto fail;
+ }
+
+ if (group_count_tr > 0)
+ u->n_groups = group_count_tr;
+ }
+
+ u->groups = pa_xnew0(struct group*, u->n_groups);
+ for (i = 0; i < u->n_groups; i++) {
+ u->groups[i] = pa_xnew0(struct group, 1);
+ u->groups[i]->trigger_roles = pa_idxset_new(NULL, NULL);
+ u->groups[i]->interaction_roles = pa_idxset_new(NULL, NULL);
+ u->groups[i]->interaction_state = pa_hashmap_new(pa_idxset_trivial_hash_func, pa_idxset_trivial_compare_func);
+ if (u->duck)
+ u->groups[i]->name = pa_sprintf_malloc("ducking_group_%u", i);
+ }
+
+ roles = pa_modargs_get_value(ma, "trigger_roles", NULL);
+ if (roles) {
+ const char *group_split_state = NULL;
+ char *roles_in_group = NULL;
+ i = 0;
+ while ((roles_in_group = pa_split(roles, "/", &group_split_state))) {
+ if (roles_in_group[0] != '\0') {
+ const char *split_state = NULL;
+ char *n = NULL;
+ while ((n = pa_split(roles_in_group, ",", &split_state))) {
+ if (n[0] != '\0')
+ pa_idxset_put(u->groups[i]->trigger_roles, n, NULL);
+ else {
+ pa_log("empty trigger role");
+ pa_xfree(n);
+ goto fail;
+ }
+ }
+ i++;
+ } else {
+ pa_log("empty trigger roles");
+ pa_xfree(roles_in_group);
+ goto fail;
+ }
+ }
+ }
+ if (pa_idxset_isempty(u->groups[0]->trigger_roles)) {
+ pa_log_debug("Using role 'phone' as trigger role.");
+ pa_idxset_put(u->groups[0]->trigger_roles, pa_xstrdup("phone"), NULL);
+ }
+
+ roles = pa_modargs_get_value(ma, u->duck ? "ducking_roles" : "cork_roles", NULL);
+ if (roles) {
+ const char *group_split_state = NULL;
+ char *roles_in_group = NULL;
+ i = 0;
+ while ((roles_in_group = pa_split(roles, "/", &group_split_state))) {
+ if (roles_in_group[0] != '\0') {
+ const char *split_state = NULL;
+ char *n = NULL;
+ while ((n = pa_split(roles_in_group, ",", &split_state))) {
+ if (n[0] != '\0')
+ pa_idxset_put(u->groups[i]->interaction_roles, n, NULL);
+ else {
+ pa_log("empty ducking role");
+ pa_xfree(n);
+ goto fail;
+ }
+ }
+ i++;
+ } else {
+ pa_log("empty ducking roles");
+ pa_xfree(roles_in_group);
+ goto fail;
+ }
+ }
+ }
+ if (pa_idxset_isempty(u->groups[0]->interaction_roles)) {
+ pa_log_debug("Using roles 'music' and 'video' as %s roles.", u->duck ? "ducking" : "cork");
+ pa_idxset_put(u->groups[0]->interaction_roles, pa_xstrdup("music"), NULL);
+ pa_idxset_put(u->groups[0]->interaction_roles, pa_xstrdup("video"), NULL);
+ }
+
+ if (u->duck) {
+ const char *volumes;
+ u->groups[0]->volume = pa_sw_volume_from_dB(-20);
+ if ((volumes = pa_modargs_get_value(ma, "volume", NULL))) {
+ const char *group_split_state = NULL;
+ char *n = NULL;
+ i = 0;
+ while ((n = pa_split(volumes, "/", &group_split_state))) {
+ if (n[0] != '\0') {
+ if (pa_parse_volume(n, &(u->groups[i++]->volume)) < 0) {
+ pa_log("Failed to parse volume");
+ pa_xfree(n);
+ goto fail;
+ }
+ } else {
+ pa_log("empty volume");
+ pa_xfree(n);
+ goto fail;
+ }
+ pa_xfree(n);
+ }
+ }
+ }
+
+ if (pa_modargs_get_value_boolean(ma, "global", &global) < 0) {
+ pa_log("Invalid boolean parameter: global");
+ goto fail;
+ }
+ u->global = global;
+
+ u->sink_input_put_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_PUT], PA_HOOK_LATE, (pa_hook_cb_t) sink_input_put_cb, u);
+ u->sink_input_unlink_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_UNLINK], PA_HOOK_LATE, (pa_hook_cb_t) sink_input_unlink_cb, u);
+ u->sink_input_move_start_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_MOVE_START], PA_HOOK_LATE, (pa_hook_cb_t) sink_input_move_start_cb, u);
+ u->sink_input_move_finish_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_MOVE_FINISH], PA_HOOK_LATE, (pa_hook_cb_t) sink_input_move_finish_cb, u);
+ u->sink_input_state_changed_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_STATE_CHANGED], PA_HOOK_LATE, (pa_hook_cb_t) sink_input_state_changed_cb, u);
+ u->sink_input_mute_changed_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_MUTE_CHANGED], PA_HOOK_LATE, (pa_hook_cb_t) sink_input_mute_changed_cb, u);
+ u->sink_input_proplist_changed_slot = pa_hook_connect(&m->core->hooks[PA_CORE_HOOK_SINK_INPUT_PROPLIST_CHANGED], PA_HOOK_LATE, (pa_hook_cb_t) sink_input_proplist_changed_cb, u);
+
+ pa_modargs_free(ma);
+
+ return 0;
+
+fail:
+ pa_stream_interaction_done(m);
+
+ if (ma)
+ pa_modargs_free(ma);
+
+ return -1;
+
+}
+
+void pa_stream_interaction_done(pa_module *m) {
+ struct userdata* u;
+
+ pa_assert(m);
+
+ if (!(u = m->userdata))
+ return;
+
+ if (u->groups) {
+ uint32_t j;
+ for (j = 0; j < u->n_groups; j++) {
+ remove_interactions(u, u->groups[j]);
+ pa_idxset_free(u->groups[j]->trigger_roles, pa_xfree);
+ pa_idxset_free(u->groups[j]->interaction_roles, pa_xfree);
+ pa_hashmap_free(u->groups[j]->interaction_state);
+ if (u->duck)
+ pa_xfree(u->groups[j]->name);
+ pa_xfree(u->groups[j]);
+ }
+ pa_xfree(u->groups);
+ }
+
+ if (u->sink_input_put_slot)
+ pa_hook_slot_free(u->sink_input_put_slot);
+ if (u->sink_input_unlink_slot)
+ pa_hook_slot_free(u->sink_input_unlink_slot);
+ if (u->sink_input_move_start_slot)
+ pa_hook_slot_free(u->sink_input_move_start_slot);
+ if (u->sink_input_move_finish_slot)
+ pa_hook_slot_free(u->sink_input_move_finish_slot);
+ if (u->sink_input_state_changed_slot)
+ pa_hook_slot_free(u->sink_input_state_changed_slot);
+ if (u->sink_input_mute_changed_slot)
+ pa_hook_slot_free(u->sink_input_mute_changed_slot);
+ if (u->sink_input_proplist_changed_slot)
+ pa_hook_slot_free(u->sink_input_proplist_changed_slot);
+
+ pa_xfree(u);
+
+}
diff --git a/src/modules/stream-interaction.h b/src/modules/stream-interaction.h
new file mode 100644
index 0000000..d5bc626
--- /dev/null
+++ b/src/modules/stream-interaction.h
@@ -0,0 +1,21 @@
+/***
+ This file is part of PulseAudio.
+
+ Copyright 2015 Georg Chini
+
+ 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.1 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/>.
+***/
+
+int pa_stream_interaction_init(pa_module *m, const char* const v_modargs[]);
+void pa_stream_interaction_done(pa_module *m);
diff --git a/src/pulse/client-conf.c b/src/pulse/client-conf.c
index c23aa6b..a3c9486 100644
--- a/src/pulse/client-conf.c
+++ b/src/pulse/client-conf.c
@@ -141,6 +141,7 @@ void pa_client_conf_load(pa_client_conf *c, bool load_from_x11, bool load_from_e
{ "cookie-file", pa_config_parse_string, &c->cookie_file_from_client_conf, NULL },
{ "disable-shm", pa_config_parse_bool, &c->disable_shm, NULL },
{ "enable-shm", pa_config_parse_not_bool, &c->disable_shm, NULL },
+ { "enable-memfd", pa_config_parse_not_bool, &c->disable_memfd, NULL },
{ "shm-size-bytes", pa_config_parse_size, &c->shm_size, NULL },
{ "auto-connect-localhost", pa_config_parse_bool, &c->auto_connect_localhost, NULL },
{ "auto-connect-display", pa_config_parse_bool, &c->auto_connect_display, NULL },
diff --git a/src/pulse/client-conf.h b/src/pulse/client-conf.h
index eac705a..7691ec7 100644
--- a/src/pulse/client-conf.h
+++ b/src/pulse/client-conf.h
@@ -37,7 +37,7 @@ typedef struct pa_client_conf {
bool cookie_from_x11_valid;
char *cookie_file_from_application;
char *cookie_file_from_client_conf;
- bool autospawn, disable_shm, auto_connect_localhost, auto_connect_display;
+ bool autospawn, disable_shm, disable_memfd, auto_connect_localhost, auto_connect_display;
size_t shm_size;
} pa_client_conf;
diff --git a/src/pulse/context.c b/src/pulse/context.c
index 4f084e8..69be5f4 100644
--- a/src/pulse/context.c
+++ b/src/pulse/context.c
@@ -69,6 +69,7 @@
void pa_command_extension(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
static void pa_command_enable_srbchannel(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
static void pa_command_disable_srbchannel(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
+static void pa_command_register_memfd_shmid(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
static const pa_pdispatch_cb_t command_table[PA_COMMAND_MAX] = {
[PA_COMMAND_REQUEST] = pa_command_request,
@@ -90,6 +91,7 @@ static const pa_pdispatch_cb_t command_table[PA_COMMAND_MAX] = {
[PA_COMMAND_RECORD_BUFFER_ATTR_CHANGED] = pa_command_stream_buffer_attr,
[PA_COMMAND_ENABLE_SRBCHANNEL] = pa_command_enable_srbchannel,
[PA_COMMAND_DISABLE_SRBCHANNEL] = pa_command_disable_srbchannel,
+ [PA_COMMAND_REGISTER_MEMFD_SHMID] = pa_command_register_memfd_shmid,
};
static void context_free(pa_context *c);
@@ -125,6 +127,7 @@ static void reset_callbacks(pa_context *c) {
pa_context *pa_context_new_with_proplist(pa_mainloop_api *mainloop, const char *name, pa_proplist *p) {
pa_context *c;
+ pa_mem_type_t type;
pa_assert(mainloop);
@@ -170,10 +173,18 @@ pa_context *pa_context_new_with_proplist(pa_mainloop_api *mainloop, const char *
c->srb_template.readfd = -1;
c->srb_template.writefd = -1;
- if (!(c->mempool = pa_mempool_new(!c->conf->disable_shm, c->conf->shm_size))) {
+ c->memfd_on_local = (!c->conf->disable_memfd && pa_memfd_is_locally_supported());
- if (!c->conf->disable_shm)
- c->mempool = pa_mempool_new(false, c->conf->shm_size);
+ type = (c->conf->disable_shm) ? PA_MEM_TYPE_PRIVATE :
+ ((!c->memfd_on_local) ?
+ PA_MEM_TYPE_SHARED_POSIX : PA_MEM_TYPE_SHARED_MEMFD);
+
+ if (!(c->mempool = pa_mempool_new(type, c->conf->shm_size, true))) {
+
+ if (!c->conf->disable_shm) {
+ pa_log_warn("Failed to allocate shared memory pool. Falling back to a normal private one.");
+ c->mempool = pa_mempool_new(PA_MEM_TYPE_PRIVATE, c->conf->shm_size, true);
+ }
if (!c->mempool) {
context_free(c);
@@ -249,7 +260,7 @@ static void context_free(pa_context *c) {
pa_hashmap_free(c->playback_streams);
if (c->mempool)
- pa_mempool_free(c->mempool);
+ pa_mempool_unref(c->mempool);
if (c->conf)
pa_client_conf_free(c->conf);
@@ -326,7 +337,7 @@ static void pstream_die_callback(pa_pstream *p, void *userdata) {
pa_context_fail(c, PA_ERR_CONNECTIONTERMINATED);
}
-static void pstream_packet_callback(pa_pstream *p, pa_packet *packet, const pa_cmsg_ancil_data *ancil_data, void *userdata) {
+static void pstream_packet_callback(pa_pstream *p, pa_packet *packet, pa_cmsg_ancil_data *ancil_data, void *userdata) {
pa_context *c = userdata;
pa_assert(p);
@@ -476,6 +487,7 @@ static void setup_complete_callback(pa_pdispatch *pd, uint32_t command, uint32_t
case PA_CONTEXT_AUTHORIZING: {
pa_tagstruct *reply;
bool shm_on_remote = false;
+ bool memfd_on_remote = false;
if (pa_tagstruct_getu32(t, &c->version) < 0 ||
!pa_tagstruct_eof(t)) {
@@ -494,7 +506,15 @@ static void setup_complete_callback(pa_pdispatch *pd, uint32_t command, uint32_t
not. */
if (c->version >= 13) {
shm_on_remote = !!(c->version & 0x80000000U);
- c->version &= 0x7FFFFFFFU;
+
+ /* Starting with protocol version 31, the second MSB of the version
+ * tag reflects whether memfd is supported on the other PA end. */
+ if (c->version >= 31)
+ memfd_on_remote = !!(c->version & 0x40000000U);
+
+ /* Reserve the two most-significant _bytes_ of the version tag
+ * for flags. */
+ c->version &= 0x0000FFFFU;
}
pa_log_debug("Protocol version: remote %u, local %u", c->version, PA_PROTOCOL_VERSION);
@@ -520,6 +540,26 @@ static void setup_complete_callback(pa_pdispatch *pd, uint32_t command, uint32_t
pa_log_debug("Negotiated SHM: %s", pa_yes_no(c->do_shm));
pa_pstream_enable_shm(c->pstream, c->do_shm);
+ c->shm_type = PA_MEM_TYPE_PRIVATE;
+ if (c->do_shm) {
+ if (c->version >= 31 && memfd_on_remote && c->memfd_on_local) {
+ const char *reason;
+
+ pa_pstream_enable_memfd(c->pstream);
+ if (pa_mempool_is_memfd_backed(c->mempool))
+ if (pa_pstream_register_memfd_mempool(c->pstream, c->mempool, &reason))
+ pa_log("Failed to regester memfd mempool. Reason: %s", reason);
+
+ /* Even if memfd pool registration fails, the negotiated SHM type
+ * shall remain memfd as both endpoints claim to support it. */
+ c->shm_type = PA_MEM_TYPE_SHARED_MEMFD;
+ } else
+ c->shm_type = PA_MEM_TYPE_SHARED_POSIX;
+ }
+
+ pa_log_debug("Memfd possible: %s", pa_yes_no(c->memfd_on_local));
+ pa_log_debug("Negotiated SHM type: %s", pa_mem_type_to_string(c->shm_type));
+
reply = pa_tagstruct_command(c, PA_COMMAND_SET_CLIENT_NAME, &tag);
if (c->version >= 13) {
@@ -587,8 +627,10 @@ static void setup_context(pa_context *c, pa_iochannel *io) {
pa_log_debug("SHM possible: %s", pa_yes_no(c->do_shm));
/* Starting with protocol version 13 we use the MSB of the version
- * tag for informing the other side if we could do SHM or not */
- pa_tagstruct_putu32(t, PA_PROTOCOL_VERSION | (c->do_shm ? 0x80000000U : 0));
+ * tag for informing the other side if we could do SHM or not.
+ * Starting from version 31, second MSB is used to flag memfd support. */
+ pa_tagstruct_putu32(t, PA_PROTOCOL_VERSION | (c->do_shm ? 0x80000000U : 0) |
+ (c->memfd_on_local ? 0x40000000 : 0));
pa_tagstruct_put_arbitrary(t, cookie, sizeof(cookie));
#ifdef HAVE_CREDS
@@ -1428,8 +1470,7 @@ static void pa_command_enable_srbchannel(pa_pdispatch *pd, uint32_t command, uin
pa_context *c = userdata;
#ifdef HAVE_CREDS
- const int *fds;
- int nfd;
+ pa_cmsg_ancil_data *ancil = NULL;
pa_assert(pd);
pa_assert(command == PA_COMMAND_ENABLE_SRBCHANNEL);
@@ -1437,26 +1478,34 @@ static void pa_command_enable_srbchannel(pa_pdispatch *pd, uint32_t command, uin
pa_assert(c);
pa_assert(PA_REFCNT_VALUE(c) >= 1);
+ ancil = pa_pdispatch_take_ancil_data(pd);
+ if (!ancil)
+ goto fail;
+
/* Currently only one srb channel is supported, might change in future versions */
- if (c->srb_template.readfd != -1) {
- pa_context_fail(c, PA_ERR_PROTOCOL);
- return;
- }
+ if (c->srb_template.readfd != -1)
+ goto fail;
- fds = pa_pdispatch_fds(pd, &nfd);
- if (nfd != 2 || !fds || fds[0] == -1 || fds[1] == -1) {
- pa_context_fail(c, PA_ERR_PROTOCOL);
- return;
- }
+ if (ancil->nfd != 2 || ancil->fds[0] == -1 || ancil->fds[1] == -1)
+ goto fail;
pa_context_ref(c);
- c->srb_template.readfd = fds[0];
- c->srb_template.writefd = fds[1];
+ c->srb_template.readfd = ancil->fds[0];
+ c->srb_template.writefd = ancil->fds[1];
c->srb_setup_tag = tag;
pa_context_unref(c);
+ ancil->close_fds_on_cleanup = false;
+ return;
+
+fail:
+ if (ancil)
+ pa_cmsg_ancil_data_close_fds(ancil);
+
+ pa_context_fail(c, PA_ERR_PROTOCOL);
+ return;
#else
pa_assert(c);
pa_context_fail(c, PA_ERR_PROTOCOL);
@@ -1489,6 +1538,18 @@ static void pa_command_disable_srbchannel(pa_pdispatch *pd, uint32_t command, ui
pa_pstream_send_tagstruct(c->pstream, t2);
}
+static void pa_command_register_memfd_shmid(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata) {
+ pa_context *c = userdata;
+
+ pa_assert(pd);
+ pa_assert(command == PA_COMMAND_REGISTER_MEMFD_SHMID);
+ pa_assert(t);
+ pa_assert(c);
+ pa_assert(PA_REFCNT_VALUE(c) >= 1);
+
+ if (pa_common_command_register_memfd_shmid(c->pstream, pd, c->version, command, t))
+ pa_context_fail(c, PA_ERR_PROTOCOL);
+}
void pa_command_client_event(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata) {
pa_context *c = userdata;
diff --git a/src/pulse/glib-mainloop.c b/src/pulse/glib-mainloop.c
index 268894a..1ce3cd3 100644
--- a/src/pulse/glib-mainloop.c
+++ b/src/pulse/glib-mainloop.c
@@ -595,7 +595,7 @@ static const pa_mainloop_api vtable = {
.io_new = glib_io_new,
.io_enable = glib_io_enable,
.io_free = glib_io_free,
- .io_set_destroy= glib_io_set_destroy,
+ .io_set_destroy = glib_io_set_destroy,
.time_new = glib_time_new,
.time_restart = glib_time_restart,
diff --git a/src/pulse/internal.h b/src/pulse/internal.h
index eefd181..9bbb903 100644
--- a/src/pulse/internal.h
+++ b/src/pulse/internal.h
@@ -88,6 +88,7 @@ struct pa_context {
bool is_local:1;
bool do_shm:1;
+ bool memfd_on_local:1;
bool server_specified:1;
bool no_fail:1;
bool do_autospawn:1;
@@ -95,6 +96,8 @@ struct pa_context {
bool filter_added:1;
pa_spawn_api spawn_api;
+ pa_mem_type_t shm_type;
+
pa_strlist *server_list;
char *server;
diff --git a/src/pulse/sample.h b/src/pulse/sample.h
index 7cf50d6..4299eec 100644
--- a/src/pulse/sample.h
+++ b/src/pulse/sample.h
@@ -128,7 +128,7 @@ PA_C_DECL_BEGIN
#define PA_CHANNELS_MAX 32U
/** Maximum allowed sample rate */
-#define PA_RATE_MAX (48000U*4U)
+#define PA_RATE_MAX (48000U*8U)
/** Sample format */
typedef enum pa_sample_format {
diff --git a/src/pulse/stream.h b/src/pulse/stream.h
index ab233d5..5dfdee1 100644
--- a/src/pulse/stream.h
+++ b/src/pulse/stream.h
@@ -547,9 +547,9 @@ int pa_stream_cancel_write(
int pa_stream_write(
pa_stream *p /**< The stream to use */,
const void *data /**< The data to write */,
- size_t nbytes /**< The length of the data to write in bytes */,
+ size_t nbytes /**< The length of the data to write in bytes, must be in multiples of the stream's sample spec frame size */,
pa_free_cb_t free_cb /**< A cleanup routine for the data or NULL to request an internal copy */,
- int64_t offset, /**< Offset for seeking, must be 0 for upload streams */
+ int64_t offset /**< Offset for seeking, must be 0 for upload streams, must be in multiples of the stream's sample spec frame size */,
pa_seek_mode_t seek /**< Seek mode, must be PA_SEEK_RELATIVE for upload streams */);
/** Function does exactly the same as pa_stream_write() with the difference
diff --git a/src/pulse/version.h b/src/pulse/version.h
index c59c550..f717c5e 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() ("8.0.0")
+#define pa_get_headers_version() ("8.99.0")
/** Return the version of the library the current application is
* linked to. */
@@ -47,13 +47,13 @@ const char* pa_get_library_version(void);
/** The current protocol version. Version 8 relates to Polypaudio
* 0.8/PulseAudio 0.9. */
-#define PA_PROTOCOL_VERSION 30
+#define PA_PROTOCOL_VERSION 31
/** The major version of PA. \since 0.9.15 */
#define PA_MAJOR 8
/** The minor version of PA. \since 0.9.15 */
-#define PA_MINOR 0
+#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/pulsecore/card.c b/src/pulsecore/card.c
index b6cbbf7..410746b 100644
--- a/src/pulsecore/card.c
+++ b/src/pulsecore/card.c
@@ -103,6 +103,15 @@ void pa_card_new_data_set_profile(pa_card_new_data *data, const char *profile) {
data->active_profile = pa_xstrdup(profile);
}
+void pa_card_new_data_set_preferred_port(pa_card_new_data *data, pa_direction_t direction, pa_device_port *port) {
+ pa_assert(data);
+
+ if (direction == PA_DIRECTION_INPUT)
+ data->preferred_input_port = port;
+ else
+ data->preferred_output_port = port;
+}
+
void pa_card_new_data_done(pa_card_new_data *data) {
pa_assert(data);
@@ -169,6 +178,9 @@ pa_card *pa_card_new(pa_core *core, pa_card_new_data *data) {
PA_HASHMAP_FOREACH(port, c->ports, state)
port->card = c;
+ c->preferred_input_port = data->preferred_input_port;
+ c->preferred_output_port = data->preferred_output_port;
+
if (data->active_profile)
if ((c->active_profile = pa_hashmap_get(c->profiles, data->active_profile)))
c->save_profile = data->save_profile;
@@ -309,15 +321,63 @@ int pa_card_set_profile(pa_card *c, pa_card_profile *profile, bool save) {
return 0;
}
+void pa_card_set_preferred_port(pa_card *c, pa_direction_t direction, pa_device_port *port) {
+ pa_device_port *old_port;
+ const char *old_port_str;
+ const char *new_port_str;
+ pa_card_preferred_port_changed_hook_data data;
+
+ pa_assert(c);
+
+ if (direction == PA_DIRECTION_INPUT) {
+ old_port = c->preferred_input_port;
+ old_port_str = c->preferred_input_port ? c->preferred_input_port->name : "(unset)";
+ } else {
+ old_port = c->preferred_output_port;
+ old_port_str = c->preferred_output_port ? c->preferred_output_port->name : "(unset)";
+ }
+
+ if (port == old_port)
+ return;
+
+ new_port_str = port ? port->name : "(unset)";
+
+ if (direction == PA_DIRECTION_INPUT) {
+ c->preferred_input_port = port;
+ pa_log_debug("%s: preferred_input_port: %s -> %s", c->name, old_port_str, new_port_str);
+ } else {
+ c->preferred_output_port = port;
+ pa_log_debug("%s: preferred_output_port: %s -> %s", c->name, old_port_str, new_port_str);
+ }
+
+ data.card = c;
+ data.direction = direction;
+ pa_hook_fire(&c->core->hooks[PA_CORE_HOOK_CARD_PREFERRED_PORT_CHANGED], &data);
+}
+
int pa_card_suspend(pa_card *c, bool suspend, pa_suspend_cause_t cause) {
pa_sink *sink;
pa_source *source;
+ pa_suspend_cause_t suspend_cause;
uint32_t idx;
int ret = 0;
pa_assert(c);
pa_assert(cause != 0);
+ suspend_cause = c->suspend_cause;
+
+ if (suspend)
+ suspend_cause |= cause;
+ else
+ suspend_cause &= ~cause;
+
+ if (c->suspend_cause != suspend_cause) {
+ pa_log_debug("Card suspend causes/state changed");
+ c->suspend_cause = suspend_cause;
+ pa_hook_fire(&c->core->hooks[PA_CORE_HOOK_CARD_SUSPEND_CHANGED], c);
+ }
+
PA_IDXSET_FOREACH(sink, c->sinks, idx) {
int r;
diff --git a/src/pulsecore/card.h b/src/pulsecore/card.h
index 30bfc0e..d4970e3 100644
--- a/src/pulsecore/card.h
+++ b/src/pulsecore/card.h
@@ -79,9 +79,13 @@ struct pa_card {
pa_card_profile *active_profile;
pa_hashmap *ports;
+ pa_device_port *preferred_input_port;
+ pa_device_port *preferred_output_port;
bool save_profile:1;
+ pa_suspend_cause_t suspend_cause;
+
void *userdata;
int (*set_profile)(pa_card *c, pa_card_profile *profile);
@@ -98,12 +102,19 @@ typedef struct pa_card_new_data {
char *active_profile;
pa_hashmap *ports;
+ pa_device_port *preferred_input_port;
+ pa_device_port *preferred_output_port;
bool namereg_fail:1;
bool save_profile:1;
} pa_card_new_data;
+typedef struct {
+ pa_card *card;
+ pa_direction_t direction;
+} pa_card_preferred_port_changed_hook_data;
+
pa_card_profile *pa_card_profile_new(const char *name, const char *description, size_t extra);
void pa_card_profile_free(pa_card_profile *c);
@@ -113,6 +124,7 @@ void pa_card_profile_set_available(pa_card_profile *c, pa_available_t available)
pa_card_new_data *pa_card_new_data_init(pa_card_new_data *data);
void pa_card_new_data_set_name(pa_card_new_data *data, const char *name);
void pa_card_new_data_set_profile(pa_card_new_data *data, const char *profile);
+void pa_card_new_data_set_preferred_port(pa_card_new_data *data, pa_direction_t direction, pa_device_port *port);
void pa_card_new_data_done(pa_card_new_data *data);
pa_card *pa_card_new(pa_core *c, pa_card_new_data *data);
@@ -122,6 +134,8 @@ void pa_card_add_profile(pa_card *c, pa_card_profile *profile);
int pa_card_set_profile(pa_card *c, pa_card_profile *profile, bool save);
+void pa_card_set_preferred_port(pa_card *c, pa_direction_t direction, pa_device_port *port);
+
int pa_card_suspend(pa_card *c, bool suspend, pa_suspend_cause_t cause);
#endif
diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c
index 19c89a9..b6eb85a 100644
--- a/src/pulsecore/core-util.c
+++ b/src/pulsecore/core-util.c
@@ -2535,8 +2535,10 @@ char *pa_getcwd(void) {
if (getcwd(p, l))
return p;
- if (errno != ERANGE)
+ if (errno != ERANGE) {
+ pa_xfree(p);
return NULL;
+ }
pa_xfree(p);
l *= 2;
diff --git a/src/pulsecore/core.c b/src/pulsecore/core.c
index 43fd30e..6d102f5 100644
--- a/src/pulsecore/core.c
+++ b/src/pulsecore/core.c
@@ -61,22 +61,25 @@ static int core_process_msg(pa_msgobject *o, int code, void *userdata, int64_t o
static void core_free(pa_object *o);
-pa_core* pa_core_new(pa_mainloop_api *m, bool shared, size_t shm_size) {
+pa_core* pa_core_new(pa_mainloop_api *m, bool shared, bool enable_memfd, size_t shm_size) {
pa_core* c;
pa_mempool *pool;
+ pa_mem_type_t type;
int j;
pa_assert(m);
if (shared) {
- if (!(pool = pa_mempool_new(shared, shm_size))) {
- pa_log_warn("Failed to allocate shared memory pool. Falling back to a normal memory pool.");
+ type = (enable_memfd) ? PA_MEM_TYPE_SHARED_MEMFD : PA_MEM_TYPE_SHARED_POSIX;
+ if (!(pool = pa_mempool_new(type, shm_size, false))) {
+ pa_log_warn("Failed to allocate %s memory pool. Falling back to a normal memory pool.",
+ pa_mem_type_to_string(type));
shared = false;
}
}
if (!shared) {
- if (!(pool = pa_mempool_new(shared, shm_size))) {
+ if (!(pool = pa_mempool_new(PA_MEM_TYPE_PRIVATE, shm_size, false))) {
pa_log("pa_mempool_new() failed.");
return NULL;
}
@@ -123,13 +126,9 @@ pa_core* pa_core_new(pa_mainloop_api *m, bool shared, size_t shm_size) {
c->subscription_event_last = NULL;
c->mempool = pool;
+ c->shm_size = shm_size;
pa_silence_cache_init(&c->silence_cache);
- if (shared && !(c->rw_mempool = pa_mempool_new(shared, shm_size)))
- pa_log_warn("Failed to allocate shared writable memory pool.");
- if (c->rw_mempool)
- pa_mempool_set_is_remote_writable(c->rw_mempool, true);
-
c->exit_event = NULL;
c->scache_auto_unload_event = NULL;
@@ -216,9 +215,7 @@ static void core_free(pa_object *o) {
pa_assert(!c->default_sink);
pa_silence_cache_done(&c->silence_cache);
- if (c->rw_mempool)
- pa_mempool_free(c->rw_mempool);
- pa_mempool_free(c->mempool);
+ pa_mempool_unref(c->mempool);
for (j = 0; j < PA_CORE_HOOK_MAX; j++)
pa_hook_done(&c->hooks[j]);
@@ -283,9 +280,6 @@ void pa_core_maybe_vacuum(pa_core *c) {
}
pa_mempool_vacuum(c->mempool);
-
- if (c->rw_mempool)
- pa_mempool_vacuum(c->rw_mempool);
}
pa_time_event* pa_core_rttime_new(pa_core *c, pa_usec_t usec, pa_time_event_cb_t cb, void *userdata) {
diff --git a/src/pulsecore/core.h b/src/pulsecore/core.h
index aefc1eb..00d7f2f 100644
--- a/src/pulsecore/core.h
+++ b/src/pulsecore/core.h
@@ -120,9 +120,11 @@ typedef enum pa_core_hook {
PA_CORE_HOOK_CARD_NEW,
PA_CORE_HOOK_CARD_PUT,
PA_CORE_HOOK_CARD_UNLINK,
+ PA_CORE_HOOK_CARD_PREFERRED_PORT_CHANGED,
PA_CORE_HOOK_CARD_PROFILE_CHANGED,
PA_CORE_HOOK_CARD_PROFILE_ADDED,
PA_CORE_HOOK_CARD_PROFILE_AVAILABLE_CHANGED,
+ PA_CORE_HOOK_CARD_SUSPEND_CHANGED,
PA_CORE_HOOK_PORT_AVAILABLE_CHANGED,
PA_CORE_HOOK_PORT_LATENCY_OFFSET_CHANGED,
PA_CORE_HOOK_DEFAULT_SINK_CHANGED,
@@ -177,10 +179,13 @@ struct pa_core {
PA_LLIST_HEAD(pa_subscription_event, subscription_event_queue);
pa_subscription_event *subscription_event_last;
- /* The mempool is used for data we write to, it's readonly for the client.
- The rw_mempool is used for data writable by both server and client (and
- can be NULL in some cases). */
- pa_mempool *mempool, *rw_mempool;
+ /* The mempool is used for data we write to, it's readonly for the client. */
+ pa_mempool *mempool;
+
+ /* Shared memory size, as specified either by daemon configuration
+ * or PA daemon defaults (~ 64 MiB). */
+ size_t shm_size;
+
pa_silence_cache silence_cache;
pa_time_event *exit_event;
@@ -215,7 +220,7 @@ enum {
PA_CORE_MESSAGE_MAX
};
-pa_core* pa_core_new(pa_mainloop_api *m, bool shared, size_t shm_size);
+pa_core* pa_core_new(pa_mainloop_api *m, bool shared, bool enable_memfd, size_t shm_size);
/* Check whether no one is connected to this core */
void pa_core_check_idle(pa_core *c);
diff --git a/src/pulsecore/creds.h b/src/pulsecore/creds.h
index 64d8387..9fdbb4f 100644
--- a/src/pulsecore/creds.h
+++ b/src/pulsecore/creds.h
@@ -49,9 +49,14 @@ struct pa_cmsg_ancil_data {
pa_creds creds;
bool creds_valid;
int nfd;
+
+ /* Don't close these fds by your own. Check pa_cmsg_ancil_data_close_fds() */
int fds[MAX_ANCIL_DATA_FDS];
+ bool close_fds_on_cleanup;
};
+void pa_cmsg_ancil_data_close_fds(struct pa_cmsg_ancil_data *ancil);
+
#else
#undef HAVE_CREDS
#endif
diff --git a/src/pulsecore/filter/lfe-filter.c b/src/pulsecore/filter/lfe-filter.c
index 5f5ace2..c0b1eb0 100644
--- a/src/pulsecore/filter/lfe-filter.c
+++ b/src/pulsecore/filter/lfe-filter.c
@@ -110,6 +110,7 @@ static void process_block(pa_lfe_filter_t *f, pa_memchunk *buf, bool store_resul
}
pa_memchunk * pa_lfe_filter_process(pa_lfe_filter_t *f, pa_memchunk *buf) {
+ pa_mempool *pool;
struct saved_state *s, *s2;
void *data;
@@ -129,10 +130,12 @@ pa_memchunk * pa_lfe_filter_process(pa_lfe_filter_t *f, pa_memchunk *buf) {
/* TODO: This actually memcpys the entire chunk into a new allocation, because we need to retain the original
in case of rewinding. Investigate whether this can be avoided. */
data = pa_memblock_acquire_chunk(buf);
- s->chunk.memblock = pa_memblock_new_malloced(pa_memblock_get_pool(buf->memblock), pa_xmemdup(data, buf->length), buf->length);
+ pool = pa_memblock_get_pool(buf->memblock);
+ s->chunk.memblock = pa_memblock_new_malloced(pool, pa_xmemdup(data, buf->length), buf->length);
s->chunk.length = buf->length;
s->chunk.index = 0;
pa_memblock_release(buf->memblock);
+ pa_mempool_unref(pool), pool = NULL;
s->index = f->index;
memcpy(s->lr4, f->lr4, sizeof(struct lr4) * f->cm.channels);
diff --git a/src/pulsecore/iochannel.c b/src/pulsecore/iochannel.c
index d1bb109..e62750b 100644
--- a/src/pulsecore/iochannel.c
+++ b/src/pulsecore/iochannel.c
@@ -450,6 +450,7 @@ ssize_t pa_iochannel_read_with_ancil_data(pa_iochannel*io, void*data, size_t l,
}
memcpy(ancil_data->fds, CMSG_DATA(cmh), nfd * sizeof(int));
ancil_data->nfd = nfd;
+ ancil_data->close_fds_on_cleanup = true;
}
}
diff --git a/src/pulsecore/log.c b/src/pulsecore/log.c
index 3c876f6..b5db818 100644
--- a/src/pulsecore/log.c
+++ b/src/pulsecore/log.c
@@ -39,6 +39,17 @@
#endif
#ifdef HAVE_SYSTEMD_JOURNAL
+
+/* sd_journal_send() implicitly add fields for the source file,
+ * function name and code line from where it's invoked. As the
+ * correct code location fields CODE_FILE, CODE_LINE and
+ * CODE_FUNC are already handled by this module, we do not want
+ * the automatic values supplied by the systemd journal API.
+ *
+ * Without suppressing these, both the actual log event source
+ * and the call to sd_journal_send() will be logged. */
+#define SD_JOURNAL_SUPPRESS_LOCATION
+
#include <systemd/sd-journal.h>
#endif
diff --git a/src/pulsecore/macro.h b/src/pulsecore/macro.h
index 1716f81..1e15f4f 100644
--- a/src/pulsecore/macro.h
+++ b/src/pulsecore/macro.h
@@ -298,14 +298,16 @@ static inline size_t PA_PAGE_ALIGN(size_t l) {
#define PA_INT_TYPE_SIGNED(type) (!!((type) 0 > (type) -1))
+#define PA_INT_TYPE_HALF(type) ((type) 1 << (sizeof(type)*8 - 2))
+
#define PA_INT_TYPE_MAX(type) \
((type) (PA_INT_TYPE_SIGNED(type) \
- ? ~(~(type) 0 << (8*sizeof(type)-1)) \
+ ? (PA_INT_TYPE_HALF(type) - 1 + PA_INT_TYPE_HALF(type)) \
: (type) -1))
#define PA_INT_TYPE_MIN(type) \
((type) (PA_INT_TYPE_SIGNED(type) \
- ? (~(type) 0 << (8*sizeof(type)-1)) \
+ ? (-1 - PA_INT_TYPE_MAX(type)) \
: (type) 0))
/* We include this at the very last place */
diff --git a/src/pulsecore/mem.h b/src/pulsecore/mem.h
new file mode 100644
index 0000000..cba1410
--- /dev/null
+++ b/src/pulsecore/mem.h
@@ -0,0 +1,60 @@
+#ifndef foopulsememhfoo
+#define foopulsememhfoo
+
+/***
+ This file is part of PulseAudio.
+
+ Copyright 2016 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.1 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
+ Lesser 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/>.
+***/
+
+#include <stdbool.h>
+
+#include <pulsecore/creds.h>
+#include <pulsecore/macro.h>
+
+typedef enum pa_mem_type {
+ PA_MEM_TYPE_SHARED_POSIX, /* Data is shared and created using POSIX shm_open() */
+ PA_MEM_TYPE_SHARED_MEMFD, /* Data is shared and created using Linux memfd_create() */
+ PA_MEM_TYPE_PRIVATE, /* Data is private and created using classic memory allocation
+ (posix_memalign(), malloc() or anonymous mmap()) */
+} pa_mem_type_t;
+
+static inline const char *pa_mem_type_to_string(pa_mem_type_t type) {
+ switch (type) {
+ case PA_MEM_TYPE_SHARED_POSIX:
+ return "shared posix-shm";
+ case PA_MEM_TYPE_SHARED_MEMFD:
+ return "shared memfd";
+ case PA_MEM_TYPE_PRIVATE:
+ return "private";
+ }
+
+ pa_assert_not_reached();
+}
+
+static inline bool pa_mem_type_is_shared(pa_mem_type_t t) {
+ return (t == PA_MEM_TYPE_SHARED_POSIX) || (t == PA_MEM_TYPE_SHARED_MEMFD);
+}
+
+static inline bool pa_memfd_is_locally_supported() {
+#if defined(HAVE_CREDS) && defined(HAVE_MEMFD)
+ return true;
+#else
+ return false;
+#endif
+}
+
+#endif
diff --git a/src/pulsecore/memblock.c b/src/pulsecore/memblock.c
index 9b6810d..17520ed 100644
--- a/src/pulsecore/memblock.c
+++ b/src/pulsecore/memblock.c
@@ -100,6 +100,28 @@ struct pa_memimport_segment {
bool writable;
};
+/*
+ * If true, this segment's lifetime will not be limited by the
+ * number of active blocks (seg->n_blocks) using its shared memory.
+ * Rather, it will exist for the full lifetime of the memimport it
+ * is attached to.
+ *
+ * This is done to support memfd blocks transport.
+ *
+ * To transfer memfd-backed blocks without passing their fd every
+ * time, thus minimizing overhead and avoiding fd leaks, a command
+ * is sent with the memfd fd as ancil data very early on.
+ *
+ * This command has an ID that identifies the memfd region. Further
+ * block references are then exclusively done using this ID. On the
+ * receiving end, such logic is enabled by the memimport's segment
+ * hash and 'permanent' segments below.
+ */
+static bool segment_is_permanent(pa_memimport_segment *seg) {
+ pa_assert(seg);
+ return seg->memory.type == PA_MEM_TYPE_SHARED_MEMFD;
+}
+
/* A collection of multiple segments */
struct pa_memimport {
pa_mutex *mutex;
@@ -142,10 +164,30 @@ struct pa_memexport {
};
struct pa_mempool {
+ /* Reference count the mempool
+ *
+ * Any block allocation from the pool itself, or even just imported from
+ * another process through SHM and attached to it (PA_MEMBLOCK_IMPORTED),
+ * shall increase the refcount.
+ *
+ * This is done for per-client mempools: global references to blocks in
+ * the pool, or just to attached ones, can still be lingering around when
+ * the client connection dies and all per-client objects are to be freed.
+ * That is, current PulseAudio design does not guarantee that the client
+ * mempool blocks are referenced only by client-specific objects.
+ *
+ * For further details, please check:
+ * https://lists.freedesktop.org/archives/pulseaudio-discuss/2016-February/025587.html
+ */
+ PA_REFCNT_DECLARE;
+
pa_semaphore *semaphore;
pa_mutex *mutex;
pa_shm memory;
+
+ bool global;
+
size_t block_size;
unsigned n_blocks;
bool is_remote_writable;
@@ -237,6 +279,7 @@ static pa_memblock *memblock_new_appended(pa_mempool *p, size_t length) {
b = pa_xmalloc(PA_ALIGN(sizeof(pa_memblock)) + length);
PA_REFCNT_INIT(b);
b->pool = p;
+ pa_mempool_ref(b->pool);
b->type = PA_MEMBLOCK_APPENDED;
b->read_only = b->is_silence = false;
pa_atomic_ptr_store(&b->data, (uint8_t*) b + PA_ALIGN(sizeof(pa_memblock)));
@@ -367,6 +410,7 @@ pa_memblock *pa_memblock_new_pool(pa_mempool *p, size_t length) {
PA_REFCNT_INIT(b);
b->pool = p;
+ pa_mempool_ref(b->pool);
b->read_only = b->is_silence = false;
b->length = length;
pa_atomic_store(&b->n_acquired, 0);
@@ -390,6 +434,7 @@ pa_memblock *pa_memblock_new_fixed(pa_mempool *p, void *d, size_t length, bool r
PA_REFCNT_INIT(b);
b->pool = p;
+ pa_mempool_ref(b->pool);
b->type = PA_MEMBLOCK_FIXED;
b->read_only = read_only;
b->is_silence = false;
@@ -423,6 +468,7 @@ pa_memblock *pa_memblock_new_user(
PA_REFCNT_INIT(b);
b->pool = p;
+ pa_mempool_ref(b->pool);
b->type = PA_MEMBLOCK_USER;
b->read_only = read_only;
b->is_silence = false;
@@ -518,10 +564,13 @@ size_t pa_memblock_get_length(pa_memblock *b) {
return b->length;
}
+/* Note! Always unref the returned pool after use */
pa_mempool* pa_memblock_get_pool(pa_memblock *b) {
pa_assert(b);
pa_assert(PA_REFCNT_VALUE(b) > 0);
+ pa_assert(b->pool);
+ pa_mempool_ref(b->pool);
return b->pool;
}
@@ -535,10 +584,13 @@ pa_memblock* pa_memblock_ref(pa_memblock*b) {
}
static void memblock_free(pa_memblock *b) {
- pa_assert(b);
+ pa_mempool *pool;
+ pa_assert(b);
+ pa_assert(b->pool);
pa_assert(pa_atomic_load(&b->n_acquired) == 0);
+ pool = b->pool;
stat_remove(b);
switch (b->type) {
@@ -620,6 +672,8 @@ static void memblock_free(pa_memblock *b) {
default:
pa_assert_not_reached();
}
+
+ pa_mempool_unref(pool);
}
/* No lock necessary */
@@ -744,11 +798,39 @@ static void memblock_replace_import(pa_memblock *b) {
pa_mutex_unlock(import->mutex);
}
-pa_mempool* pa_mempool_new(bool shared, size_t size) {
+/*@per_client: This is a security measure. By default this should
+ * be set to true where the created mempool is never shared with more
+ * than one client in the system. Set this to false if a global
+ * mempool, shared with all existing and future clients, is required.
+ *
+ * NOTE-1: Do not create any further global mempools! They allow data
+ * leaks between clients and thus conflict with the xdg-app containers
+ * model. They also complicate the handling of memfd-based pools.
+ *
+ * NOTE-2: Almost all mempools are now created on a per client basis.
+ * The only exception is the pa_core's mempool which is still shared
+ * between all clients of the system.
+ *
+ * Beside security issues, special marking for global mempools is
+ * required for memfd communication. To avoid fd leaks, memfd pools
+ * are registered with the connection pstream to create an ID<->memfd
+ * mapping on both PA endpoints. Such memory regions are then always
+ * referenced by their IDs and never by their fds and thus their fds
+ * can be quickly closed later.
+ *
+ * Unfortunately this scheme cannot work with global pools since the
+ * ID registration mechanism needs to happen for each newly connected
+ * client, and thus the need for a more special handling. That is,
+ * for the pool's fd to be always open :-(
+ *
+ * TODO-1: Transform the global core mempool to a per-client one
+ * TODO-2: Remove global mempools support */
+pa_mempool *pa_mempool_new(pa_mem_type_t type, size_t size, bool per_client) {
pa_mempool *p;
char t1[PA_BYTES_SNPRINT_MAX], t2[PA_BYTES_SNPRINT_MAX];
p = pa_xnew0(pa_mempool, 1);
+ PA_REFCNT_INIT(p);
p->block_size = PA_PAGE_ALIGN(PA_MEMPOOL_SLOT_SIZE);
if (p->block_size < PA_PAGE_SIZE)
@@ -763,18 +845,20 @@ pa_mempool* pa_mempool_new(bool shared, size_t size) {
p->n_blocks = 2;
}
- if (pa_shm_create_rw(&p->memory, p->n_blocks * p->block_size, shared, 0700) < 0) {
+ if (pa_shm_create_rw(&p->memory, type, p->n_blocks * p->block_size, 0700) < 0) {
pa_xfree(p);
return NULL;
}
pa_log_debug("Using %s memory pool with %u slots of size %s each, total size is %s, maximum usable slot size is %lu",
- p->memory.shared ? "shared" : "private",
+ pa_mem_type_to_string(type),
p->n_blocks,
pa_bytes_snprint(t1, sizeof(t1), (unsigned) p->block_size),
pa_bytes_snprint(t2, sizeof(t2), (unsigned) (p->n_blocks * p->block_size)),
(unsigned long) pa_mempool_block_size_max(p));
+ p->global = !per_client;
+
pa_atomic_store(&p->n_init, 0);
PA_LLIST_HEAD_INIT(pa_memimport, p->imports);
@@ -788,7 +872,7 @@ pa_mempool* pa_mempool_new(bool shared, size_t size) {
return p;
}
-void pa_mempool_free(pa_mempool *p) {
+static void mempool_free(pa_mempool *p) {
pa_assert(p);
pa_mutex_lock(p->mutex);
@@ -893,10 +977,24 @@ void pa_mempool_vacuum(pa_mempool *p) {
}
/* No lock necessary */
+bool pa_mempool_is_shared(pa_mempool *p) {
+ pa_assert(p);
+
+ return pa_mem_type_is_shared(p->memory.type);
+}
+
+/* No lock necessary */
+bool pa_mempool_is_memfd_backed(const pa_mempool *p) {
+ pa_assert(p);
+
+ return (p->memory.type == PA_MEM_TYPE_SHARED_MEMFD);
+}
+
+/* No lock necessary */
int pa_mempool_get_shm_id(pa_mempool *p, uint32_t *id) {
pa_assert(p);
- if (!p->memory.shared)
+ if (!pa_mempool_is_shared(p))
return -1;
*id = p->memory.id;
@@ -904,11 +1002,84 @@ int pa_mempool_get_shm_id(pa_mempool *p, uint32_t *id) {
return 0;
}
-/* No lock necessary */
-bool pa_mempool_is_shared(pa_mempool *p) {
+pa_mempool* pa_mempool_ref(pa_mempool *p) {
+ pa_assert(p);
+ pa_assert(PA_REFCNT_VALUE(p) > 0);
+
+ PA_REFCNT_INC(p);
+ return p;
+}
+
+void pa_mempool_unref(pa_mempool *p) {
+ pa_assert(p);
+ pa_assert(PA_REFCNT_VALUE(p) > 0);
+
+ if (PA_REFCNT_DEC(p) <= 0)
+ mempool_free(p);
+}
+
+/* No lock necessary
+ * Check pa_mempool_new() for per-client vs. global mempools */
+bool pa_mempool_is_global(pa_mempool *p) {
+ pa_assert(p);
+
+ return p->global;
+}
+
+/* No lock necessary
+ * Check pa_mempool_new() for per-client vs. global mempools */
+bool pa_mempool_is_per_client(pa_mempool *p) {
+ return !pa_mempool_is_global(p);
+}
+
+/* Self-locked
+ *
+ * This is only for per-client mempools!
+ *
+ * After this method's return, the caller owns the file descriptor
+ * and is responsible for closing it in the appropriate time. This
+ * should only be called once during during a mempool's lifetime.
+ *
+ * Check pa_shm->fd and pa_mempool_new() for further context. */
+int pa_mempool_take_memfd_fd(pa_mempool *p) {
+ int memfd_fd;
+
pa_assert(p);
+ pa_assert(pa_mempool_is_shared(p));
+ pa_assert(pa_mempool_is_memfd_backed(p));
+ pa_assert(pa_mempool_is_per_client(p));
+
+ pa_mutex_lock(p->mutex);
+
+ memfd_fd = p->memory.fd;
+ p->memory.fd = -1;
- return p->memory.shared;
+ pa_mutex_unlock(p->mutex);
+
+ pa_assert(memfd_fd != -1);
+ return memfd_fd;
+}
+
+/* No lock necessary
+ *
+ * This is only for global mempools!
+ *
+ * Global mempools have their memfd descriptor always open. DO NOT
+ * close the returned descriptor by your own.
+ *
+ * Check pa_mempool_new() for further context. */
+int pa_mempool_get_memfd_fd(pa_mempool *p) {
+ int memfd_fd;
+
+ pa_assert(p);
+ pa_assert(pa_mempool_is_shared(p));
+ pa_assert(pa_mempool_is_memfd_backed(p));
+ pa_assert(pa_mempool_is_global(p));
+
+ memfd_fd = p->memory.fd;
+ pa_assert(memfd_fd != -1);
+
+ return memfd_fd;
}
/* For receiving blocks from other nodes */
@@ -921,6 +1092,7 @@ pa_memimport* pa_memimport_new(pa_mempool *p, pa_memimport_release_cb_t cb, void
i = pa_xnew(pa_memimport, 1);
i->mutex = pa_mutex_new(true, true);
i->pool = p;
+ pa_mempool_ref(i->pool);
i->segments = pa_hashmap_new(NULL, NULL);
i->blocks = pa_hashmap_new(NULL, NULL);
i->release_cb = cb;
@@ -935,16 +1107,19 @@ pa_memimport* pa_memimport_new(pa_mempool *p, pa_memimport_release_cb_t cb, void
static void memexport_revoke_blocks(pa_memexport *e, pa_memimport *i);
-/* Should be called locked */
-static pa_memimport_segment* segment_attach(pa_memimport *i, uint32_t shm_id, bool writable) {
+/* Should be called locked
+ * Caller owns passed @memfd_fd and must close it down when appropriate. */
+static pa_memimport_segment* segment_attach(pa_memimport *i, pa_mem_type_t type, uint32_t shm_id,
+ int memfd_fd, bool writable) {
pa_memimport_segment* seg;
+ pa_assert(pa_mem_type_is_shared(type));
if (pa_hashmap_size(i->segments) >= PA_MEMIMPORT_SEGMENTS_MAX)
return NULL;
seg = pa_xnew0(pa_memimport_segment, 1);
- if (pa_shm_attach(&seg->memory, shm_id, writable) < 0) {
+ if (pa_shm_attach(&seg->memory, type, shm_id, memfd_fd, writable) < 0) {
pa_xfree(seg);
return NULL;
}
@@ -960,6 +1135,7 @@ static pa_memimport_segment* segment_attach(pa_memimport *i, uint32_t shm_id, bo
/* Should be called locked */
static void segment_detach(pa_memimport_segment *seg) {
pa_assert(seg);
+ pa_assert(seg->n_blocks == (segment_is_permanent(seg) ? 1u : 0u));
pa_hashmap_remove(seg->import->segments, PA_UINT32_TO_PTR(seg->memory.id));
pa_shm_free(&seg->memory);
@@ -974,6 +1150,8 @@ static void segment_detach(pa_memimport_segment *seg) {
void pa_memimport_free(pa_memimport *i) {
pa_memexport *e;
pa_memblock *b;
+ pa_memimport_segment *seg;
+ void *state = NULL;
pa_assert(i);
@@ -982,6 +1160,15 @@ void pa_memimport_free(pa_memimport *i) {
while ((b = pa_hashmap_first(i->blocks)))
memblock_replace_import(b);
+ /* Permanent segments exist for the lifetime of the memimport. Now
+ * that we're freeing the memimport itself, clear them all up.
+ *
+ * Careful! segment_detach() internally removes itself from the
+ * memimport's hash; the same hash we're now using for iteration. */
+ PA_HASHMAP_FOREACH(seg, i->segments, state) {
+ if (segment_is_permanent(seg))
+ segment_detach(seg);
+ }
pa_assert(pa_hashmap_size(i->segments) == 0);
pa_mutex_unlock(i->mutex);
@@ -996,6 +1183,7 @@ void pa_memimport_free(pa_memimport *i) {
pa_mutex_unlock(i->pool->mutex);
+ pa_mempool_unref(i->pool);
pa_hashmap_free(i->blocks);
pa_hashmap_free(i->segments);
@@ -1004,13 +1192,47 @@ void pa_memimport_free(pa_memimport *i) {
pa_xfree(i);
}
+/* Create a new memimport's memfd segment entry, with passed SHM ID
+ * as key and the newly-created segment (with its mmap()-ed memfd
+ * memory region) as its value.
+ *
+ * Note! check comments at 'pa_shm->fd', 'segment_is_permanent()',
+ * and 'pa_pstream_register_memfd_mempool()' for further details.
+ *
+ * Caller owns passed @memfd_fd and must close it down when appropriate. */
+int pa_memimport_attach_memfd(pa_memimport *i, uint32_t shm_id, int memfd_fd, bool writable) {
+ pa_memimport_segment *seg;
+ int ret = -1;
+
+ pa_assert(i);
+ pa_assert(memfd_fd != -1);
+
+ pa_mutex_lock(i->mutex);
+
+ if (!(seg = segment_attach(i, PA_MEM_TYPE_SHARED_MEMFD, shm_id, memfd_fd, writable)))
+ goto finish;
+
+ /* n_blocks acts as a segment reference count. To avoid the segment
+ * being deleted when receiving silent memchunks, etc., mark our
+ * permanent presence by incrementing that refcount. */
+ seg->n_blocks++;
+
+ pa_assert(segment_is_permanent(seg));
+ ret = 0;
+
+finish:
+ pa_mutex_unlock(i->mutex);
+ return ret;
+}
+
/* Self-locked */
-pa_memblock* pa_memimport_get(pa_memimport *i, uint32_t block_id, uint32_t shm_id,
+pa_memblock* pa_memimport_get(pa_memimport *i, pa_mem_type_t type, uint32_t block_id, uint32_t shm_id,
size_t offset, size_t size, bool writable) {
pa_memblock *b = NULL;
pa_memimport_segment *seg;
pa_assert(i);
+ pa_assert(pa_mem_type_is_shared(type));
pa_mutex_lock(i->mutex);
@@ -1022,12 +1244,20 @@ pa_memblock* pa_memimport_get(pa_memimport *i, uint32_t block_id, uint32_t shm_i
if (pa_hashmap_size(i->blocks) >= PA_MEMIMPORT_SLOTS_MAX)
goto finish;
- if (!(seg = pa_hashmap_get(i->segments, PA_UINT32_TO_PTR(shm_id))))
- if (!(seg = segment_attach(i, shm_id, writable)))
+ if (!(seg = pa_hashmap_get(i->segments, PA_UINT32_TO_PTR(shm_id)))) {
+ if (type == PA_MEM_TYPE_SHARED_MEMFD) {
+ pa_log("Bailing out! No cached memimport segment for memfd ID %u", shm_id);
+ pa_log("Did the other PA endpoint forget registering its memfd pool?");
goto finish;
+ }
+
+ pa_assert(type == PA_MEM_TYPE_SHARED_POSIX);
+ if (!(seg = segment_attach(i, type, shm_id, -1, writable)))
+ goto finish;
+ }
- if (writable != seg->writable) {
- pa_log("Cannot open segment - writable status changed!");
+ if (writable && !seg->writable) {
+ pa_log("Cannot import cached segment in write mode - previously mapped as read-only");
goto finish;
}
@@ -1039,6 +1269,7 @@ pa_memblock* pa_memimport_get(pa_memimport *i, uint32_t block_id, uint32_t shm_i
PA_REFCNT_INIT(b);
b->pool = i->pool;
+ pa_mempool_ref(b->pool);
b->type = PA_MEMBLOCK_IMPORTED;
b->read_only = !writable;
b->is_silence = false;
@@ -1090,12 +1321,13 @@ pa_memexport* pa_memexport_new(pa_mempool *p, pa_memexport_revoke_cb_t cb, void
pa_assert(p);
pa_assert(cb);
- if (!p->memory.shared)
+ if (!pa_mempool_is_shared(p))
return NULL;
e = pa_xnew(pa_memexport, 1);
e->mutex = pa_mutex_new(true, true);
e->pool = p;
+ pa_mempool_ref(e->pool);
PA_LLIST_HEAD_INIT(struct memexport_slot, e->free_slots);
PA_LLIST_HEAD_INIT(struct memexport_slot, e->used_slots);
e->n_init = 0;
@@ -1123,6 +1355,7 @@ void pa_memexport_free(pa_memexport *e) {
PA_LLIST_REMOVE(pa_memexport, e->pool->exports, e);
pa_mutex_unlock(e->pool->mutex);
+ pa_mempool_unref(e->pool);
pa_mutex_free(e->mutex);
pa_xfree(e);
}
@@ -1217,13 +1450,15 @@ static pa_memblock *memblock_shared_copy(pa_mempool *p, pa_memblock *b) {
}
/* Self-locked */
-int pa_memexport_put(pa_memexport *e, pa_memblock *b, uint32_t *block_id, uint32_t *shm_id, size_t *offset, size_t * size) {
- pa_shm *memory;
+int pa_memexport_put(pa_memexport *e, pa_memblock *b, pa_mem_type_t *type, uint32_t *block_id,
+ uint32_t *shm_id, size_t *offset, size_t * size) {
+ pa_shm *memory;
struct memexport_slot *slot;
void *data;
pa_assert(e);
pa_assert(b);
+ pa_assert(type);
pa_assert(block_id);
pa_assert(shm_id);
pa_assert(offset);
@@ -1261,12 +1496,14 @@ int pa_memexport_put(pa_memexport *e, pa_memblock *b, uint32_t *block_id, uint32
} else {
pa_assert(b->type == PA_MEMBLOCK_POOL || b->type == PA_MEMBLOCK_POOL_EXTERNAL);
pa_assert(b->pool);
+ pa_assert(pa_mempool_is_shared(b->pool));
memory = &b->pool->memory;
}
pa_assert(data >= memory->ptr);
pa_assert((uint8_t*) data + b->length <= (uint8_t*) memory->ptr + memory->size);
+ *type = memory->type;
*shm_id = memory->id;
*offset = (size_t) ((uint8_t*) data - (uint8_t*) memory->ptr);
*size = b->length;
diff --git a/src/pulsecore/memblock.h b/src/pulsecore/memblock.h
index 4faef75..57ae4b2 100644
--- a/src/pulsecore/memblock.h
+++ b/src/pulsecore/memblock.h
@@ -30,6 +30,7 @@ typedef struct pa_memblock pa_memblock;
#include <pulse/xmalloc.h>
#include <pulsecore/atomic.h>
#include <pulsecore/memchunk.h>
+#include <pulsecore/mem.h>
/* A pa_memblock is a reference counted memory block. PulseAudio
* passes references to pa_memblocks around instead of copying
@@ -116,32 +117,43 @@ void *pa_memblock_acquire_chunk(const pa_memchunk *c);
void pa_memblock_release(pa_memblock *b);
size_t pa_memblock_get_length(pa_memblock *b);
+
+/* Note! Always unref the returned pool after use */
pa_mempool * pa_memblock_get_pool(pa_memblock *b);
pa_memblock *pa_memblock_will_need(pa_memblock *b);
/* The memory block manager */
-pa_mempool* pa_mempool_new(bool shared, size_t size);
-void pa_mempool_free(pa_mempool *p);
+pa_mempool *pa_mempool_new(pa_mem_type_t type, size_t size, bool per_client);
+void pa_mempool_unref(pa_mempool *p);
+pa_mempool* pa_mempool_ref(pa_mempool *p);
const pa_mempool_stat* pa_mempool_get_stat(pa_mempool *p);
void pa_mempool_vacuum(pa_mempool *p);
int pa_mempool_get_shm_id(pa_mempool *p, uint32_t *id);
bool pa_mempool_is_shared(pa_mempool *p);
+bool pa_mempool_is_memfd_backed(const pa_mempool *p);
+bool pa_mempool_is_global(pa_mempool *p);
+bool pa_mempool_is_per_client(pa_mempool *p);
bool pa_mempool_is_remote_writable(pa_mempool *p);
void pa_mempool_set_is_remote_writable(pa_mempool *p, bool writable);
size_t pa_mempool_block_size_max(pa_mempool *p);
+int pa_mempool_take_memfd_fd(pa_mempool *p);
+int pa_mempool_get_memfd_fd(pa_mempool *p);
+
/* For receiving blocks from other nodes */
pa_memimport* pa_memimport_new(pa_mempool *p, pa_memimport_release_cb_t cb, void *userdata);
void pa_memimport_free(pa_memimport *i);
-pa_memblock* pa_memimport_get(pa_memimport *i, uint32_t block_id, uint32_t shm_id,
- size_t offset, size_t size, bool writable);
+int pa_memimport_attach_memfd(pa_memimport *i, uint32_t shm_id, int memfd_fd, bool writable);
+pa_memblock* pa_memimport_get(pa_memimport *i, pa_mem_type_t type, uint32_t block_id,
+ uint32_t shm_id, size_t offset, size_t size, bool writable);
int pa_memimport_process_revoke(pa_memimport *i, uint32_t block_id);
/* For sending blocks to other nodes */
pa_memexport* pa_memexport_new(pa_mempool *p, pa_memexport_revoke_cb_t cb, void *userdata);
void pa_memexport_free(pa_memexport *e);
-int pa_memexport_put(pa_memexport *e, pa_memblock *b, uint32_t *block_id, uint32_t *shm_id, size_t *offset, size_t *size);
+int pa_memexport_put(pa_memexport *e, pa_memblock *b, pa_mem_type_t *type, uint32_t *block_id,
+ uint32_t *shm_id, size_t *offset, size_t * size);
int pa_memexport_process_release(pa_memexport *e, uint32_t id);
#endif
diff --git a/src/pulsecore/memblockq.c b/src/pulsecore/memblockq.c
index d314d4e..d283ed2 100644
--- a/src/pulsecore/memblockq.c
+++ b/src/pulsecore/memblockq.c
@@ -530,6 +530,7 @@ int pa_memblockq_peek(pa_memblockq* bq, pa_memchunk *chunk) {
}
int pa_memblockq_peek_fixed_size(pa_memblockq *bq, size_t block_size, pa_memchunk *chunk) {
+ pa_mempool *pool;
pa_memchunk tchunk, rchunk;
int64_t ri;
struct list_item *item;
@@ -548,9 +549,11 @@ int pa_memblockq_peek_fixed_size(pa_memblockq *bq, size_t block_size, pa_memchun
return 0;
}
- rchunk.memblock = pa_memblock_new(pa_memblock_get_pool(tchunk.memblock), block_size);
+ pool = pa_memblock_get_pool(tchunk.memblock);
+ rchunk.memblock = pa_memblock_new(pool, block_size);
rchunk.index = 0;
rchunk.length = tchunk.length;
+ pa_mempool_unref(pool), pool = NULL;
pa_memchunk_memcpy(&rchunk, &tchunk);
pa_memblock_unref(tchunk.memblock);
diff --git a/src/pulsecore/memchunk.c b/src/pulsecore/memchunk.c
index eb5917c..8822134 100644
--- a/src/pulsecore/memchunk.c
+++ b/src/pulsecore/memchunk.c
@@ -32,6 +32,7 @@
#include "memchunk.h"
pa_memchunk* pa_memchunk_make_writable(pa_memchunk *c, size_t min) {
+ pa_mempool *pool;
pa_memblock *n;
size_t l;
void *tdata, *sdata;
@@ -46,7 +47,9 @@ pa_memchunk* pa_memchunk_make_writable(pa_memchunk *c, size_t min) {
l = PA_MAX(c->length, min);
- n = pa_memblock_new(pa_memblock_get_pool(c->memblock), l);
+ pool = pa_memblock_get_pool(c->memblock);
+ n = pa_memblock_new(pool, l);
+ pa_mempool_unref(pool), pool = NULL;
sdata = pa_memblock_acquire(c->memblock);
tdata = pa_memblock_acquire(n);
diff --git a/src/pulsecore/memfd-wrappers.h b/src/pulsecore/memfd-wrappers.h
new file mode 100644
index 0000000..3bed9b2
--- /dev/null
+++ b/src/pulsecore/memfd-wrappers.h
@@ -0,0 +1,68 @@
+#ifndef foopulsememfdwrappershfoo
+#define foopulsememfdwrappershfoo
+
+/***
+ This file is part of PulseAudio.
+
+ Copyright 2016 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.1 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
+ Lesser 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/>.
+***/
+
+#ifdef HAVE_MEMFD
+
+#include <sys/syscall.h>
+#include <fcntl.h>
+
+/*
+ * No glibc wrappers exist for memfd_create(2), so provide our own.
+ *
+ * Also define memfd fcntl sealing macros. While they are already
+ * defined in the kernel header file <linux/fcntl.h>, that file as
+ * a whole conflicts with the original glibc header <fnctl.h>.
+ */
+
+static inline int memfd_create(const char *name, unsigned int flags) {
+ return syscall(SYS_memfd_create, name, flags);
+}
+
+/* memfd_create(2) flags */
+
+#ifndef MFD_CLOEXEC
+#define MFD_CLOEXEC 0x0001U
+#endif
+
+#ifndef MFD_ALLOW_SEALING
+#define MFD_ALLOW_SEALING 0x0002U
+#endif
+
+/* fcntl() seals-related flags */
+
+#ifndef F_LINUX_SPECIFIC_BASE
+#define F_LINUX_SPECIFIC_BASE 1024
+#endif
+
+#ifndef F_ADD_SEALS
+#define F_ADD_SEALS (F_LINUX_SPECIFIC_BASE + 9)
+#define F_GET_SEALS (F_LINUX_SPECIFIC_BASE + 10)
+
+#define F_SEAL_SEAL 0x0001 /* prevent further seals from being set */
+#define F_SEAL_SHRINK 0x0002 /* prevent file from shrinking */
+#define F_SEAL_GROW 0x0004 /* prevent file from growing */
+#define F_SEAL_WRITE 0x0008 /* prevent writes */
+#endif
+
+#endif /* HAVE_MEMFD */
+
+#endif
diff --git a/src/pulsecore/native-common.c b/src/pulsecore/native-common.c
new file mode 100644
index 0000000..282a4ed
--- /dev/null
+++ b/src/pulsecore/native-common.c
@@ -0,0 +1,78 @@
+/***
+ This file is part of PulseAudio.
+
+ Copyright 2016 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.1 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
+ Lesser 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/>.
+***/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <pulsecore/core-util.h>
+#include <pulsecore/creds.h>
+#include <pulsecore/macro.h>
+#include <pulsecore/pdispatch.h>
+#include <pulsecore/pstream.h>
+#include <pulsecore/tagstruct.h>
+
+#include "native-common.h"
+
+/*
+ * Command handlers shared between client and server
+ */
+
+/* Check pa_pstream_register_memfd_mempool() for further details */
+int pa_common_command_register_memfd_shmid(pa_pstream *p, pa_pdispatch *pd, uint32_t version,
+ uint32_t command, pa_tagstruct *t) {
+#if defined(HAVE_CREDS) && defined(HAVE_MEMFD)
+ pa_cmsg_ancil_data *ancil = NULL;
+ unsigned shm_id;
+ int ret = -1;
+
+ pa_assert(pd);
+ pa_assert(command == PA_COMMAND_REGISTER_MEMFD_SHMID);
+ pa_assert(t);
+
+ ancil = pa_pdispatch_take_ancil_data(pd);
+ if (!ancil)
+ goto finish;
+
+ /* Upon fd leaks and reaching our open fd limit, recvmsg(2)
+ * just strips all passed fds from the ancillary data */
+ if (ancil->nfd == 0) {
+ pa_log("Expected 1 memfd fd to be received over pipe; got 0");
+ pa_log("Did we reach our open file descriptors limit?");
+ goto finish;
+ }
+
+ if (ancil->nfd != 1 || ancil->fds[0] == -1)
+ goto finish;
+
+ if (version < 31 || pa_tagstruct_getu32(t, &shm_id) < 0 || !pa_tagstruct_eof(t))
+ goto finish;
+
+ pa_pstream_attach_memfd_shmid(p, shm_id, ancil->fds[0]);
+
+ ret = 0;
+finish:
+ if (ancil)
+ pa_cmsg_ancil_data_close_fds(ancil);
+
+ return ret;
+#else
+ return -1;
+#endif
+}
diff --git a/src/pulsecore/native-common.h b/src/pulsecore/native-common.h
index dc62895..70338b9 100644
--- a/src/pulsecore/native-common.h
+++ b/src/pulsecore/native-common.h
@@ -24,6 +24,10 @@
#include <pulse/cdecl.h>
#include <pulse/def.h>
+#include <pulsecore/pdispatch.h>
+#include <pulsecore/pstream.h>
+#include <pulsecore/tagstruct.h>
+
PA_C_DECL_BEGIN
enum {
@@ -179,6 +183,10 @@ enum {
PA_COMMAND_ENABLE_SRBCHANNEL,
PA_COMMAND_DISABLE_SRBCHANNEL,
+ /* Supported since protocol v31 (9.0)
+ * BOTH DIRECTIONS */
+ PA_COMMAND_REGISTER_MEMFD_SHMID,
+
PA_COMMAND_MAX
};
@@ -193,6 +201,9 @@ enum {
#define PA_NATIVE_DEFAULT_UNIX_SOCKET "native"
+int pa_common_command_register_memfd_shmid(pa_pstream *p, pa_pdispatch *pd, uint32_t version,
+ uint32_t command, pa_tagstruct *t);
+
PA_C_DECL_END
#endif
diff --git a/src/pulsecore/pdispatch.c b/src/pulsecore/pdispatch.c
index f136875..ab632a5 100644
--- a/src/pulsecore/pdispatch.c
+++ b/src/pulsecore/pdispatch.c
@@ -195,6 +195,10 @@ static const char *command_names[PA_COMMAND_MAX] = {
/* BOTH DIRECTIONS */
[PA_COMMAND_ENABLE_SRBCHANNEL] = "ENABLE_SRBCHANNEL",
[PA_COMMAND_DISABLE_SRBCHANNEL] = "DISABLE_SRBCHANNEL",
+
+ /* Supported since protocol v31 (9.0) */
+ /* BOTH DIRECTIONS */
+ [PA_COMMAND_REGISTER_MEMFD_SHMID] = "REGISTER_MEMFD_SHMID",
};
#endif
@@ -219,7 +223,7 @@ struct pa_pdispatch {
PA_LLIST_HEAD(struct reply_info, replies);
pa_pdispatch_drain_cb_t drain_callback;
void *drain_userdata;
- const pa_cmsg_ancil_data *ancil_data;
+ pa_cmsg_ancil_data *ancil_data;
bool use_rtclock;
};
@@ -289,7 +293,7 @@ static void run_action(pa_pdispatch *pd, struct reply_info *r, uint32_t command,
pa_pdispatch_unref(pd);
}
-int pa_pdispatch_run(pa_pdispatch *pd, pa_packet *packet, const pa_cmsg_ancil_data *ancil_data, void *userdata) {
+int pa_pdispatch_run(pa_pdispatch *pd, pa_packet *packet, pa_cmsg_ancil_data *ancil_data, void *userdata) {
uint32_t tag, command;
pa_tagstruct *ts = NULL;
int ret = -1;
@@ -448,18 +452,24 @@ const pa_creds * pa_pdispatch_creds(pa_pdispatch *pd) {
return NULL;
}
-const int * pa_pdispatch_fds(pa_pdispatch *pd, int *nfd) {
+/* Should be called only once during the dispatcher lifetime
+ *
+ * If the returned ancillary data contains any fds, caller maintains sole
+ * responsibility of closing them down using pa_cmsg_ancil_data_close_fds() */
+pa_cmsg_ancil_data *pa_pdispatch_take_ancil_data(pa_pdispatch *pd) {
+ pa_cmsg_ancil_data *ancil;
+
pa_assert(pd);
pa_assert(PA_REFCNT_VALUE(pd) >= 1);
- pa_assert(nfd);
- if (pd->ancil_data) {
- *nfd = pd->ancil_data->nfd;
- return pd->ancil_data->fds;
- }
+ ancil = pd->ancil_data;
- *nfd = 0;
- return NULL;
+ /* iochannel guarantees us that nfd will always be capped */
+ if (ancil)
+ pa_assert(ancil->nfd <= MAX_ANCIL_DATA_FDS);
+
+ pd->ancil_data = NULL;
+ return ancil;
}
#endif
diff --git a/src/pulsecore/pdispatch.h b/src/pulsecore/pdispatch.h
index 9cb3419..af76981 100644
--- a/src/pulsecore/pdispatch.h
+++ b/src/pulsecore/pdispatch.h
@@ -39,7 +39,7 @@ pa_pdispatch* pa_pdispatch_new(pa_mainloop_api *m, bool use_rtclock, const pa_pd
void pa_pdispatch_unref(pa_pdispatch *pd);
pa_pdispatch* pa_pdispatch_ref(pa_pdispatch *pd);
-int pa_pdispatch_run(pa_pdispatch *pd, pa_packet *p, const pa_cmsg_ancil_data *ancil_data, void *userdata);
+int pa_pdispatch_run(pa_pdispatch *pd, pa_packet *p, pa_cmsg_ancil_data *ancil_data, void *userdata);
void pa_pdispatch_register_reply(pa_pdispatch *pd, uint32_t tag, int timeout, pa_pdispatch_cb_t callback, void *userdata, pa_free_cb_t free_cb);
@@ -51,7 +51,6 @@ void pa_pdispatch_set_drain_callback(pa_pdispatch *pd, pa_pdispatch_drain_cb_t c
void pa_pdispatch_unregister_reply(pa_pdispatch *pd, void *userdata);
const pa_creds * pa_pdispatch_creds(pa_pdispatch *pd);
-
-const int * pa_pdispatch_fds(pa_pdispatch *pd, int *nfd);
+pa_cmsg_ancil_data *pa_pdispatch_take_ancil_data(pa_pdispatch *pd);
#endif
diff --git a/src/pulsecore/protocol-native.c b/src/pulsecore/protocol-native.c
index 145db04..5619b9c 100644
--- a/src/pulsecore/protocol-native.c
+++ b/src/pulsecore/protocol-native.c
@@ -48,6 +48,7 @@
#include <pulsecore/core-scache.h>
#include <pulsecore/core-subscribe.h>
#include <pulsecore/log.h>
+#include <pulsecore/mem.h>
#include <pulsecore/strlist.h>
#include <pulsecore/shared.h>
#include <pulsecore/sample-util.h>
@@ -55,6 +56,7 @@
#include <pulsecore/core-util.h>
#include <pulsecore/ipacl.h>
#include <pulsecore/thread-mq.h>
+#include <pulsecore/mem.h>
#include "protocol-native.h"
@@ -173,6 +175,12 @@ struct pa_native_connection {
bool is_local:1;
uint32_t version;
pa_client *client;
+ /* R/W mempool, one per client connection, for srbchannel transport.
+ * Both server and client can write to this shm area.
+ *
+ * Note: This will be NULL if our connection with the client does
+ * not support srbchannels */
+ pa_mempool *rw_mempool;
pa_pstream *pstream;
pa_pdispatch *pdispatch;
pa_idxset *record_streams, *output_streams;
@@ -294,6 +302,7 @@ static void command_set_card_profile(pa_pdispatch *pd, uint32_t command, uint32_
static void command_set_sink_or_source_port(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
static void command_set_port_latency_offset(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
static void command_enable_srbchannel(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
+static void command_register_memfd_shmid(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata);
static const pa_pdispatch_cb_t command_table[PA_COMMAND_MAX] = {
[PA_COMMAND_ERROR] = NULL,
@@ -399,6 +408,8 @@ static const pa_pdispatch_cb_t command_table[PA_COMMAND_MAX] = {
[PA_COMMAND_ENABLE_SRBCHANNEL] = command_enable_srbchannel,
+ [PA_COMMAND_REGISTER_MEMFD_SHMID] = command_register_memfd_shmid,
+
[PA_COMMAND_EXTENSION] = command_extension
};
@@ -1371,6 +1382,9 @@ static void native_connection_free(pa_object *o) {
pa_pdispatch_unref(c->pdispatch);
pa_pstream_unref(c->pstream);
+ if (c->rw_mempool)
+ pa_mempool_unref(c->rw_mempool);
+
pa_client_free(c->client);
pa_xfree(c);
@@ -2584,13 +2598,18 @@ static void command_exit(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_ta
pa_pstream_send_simple_ack(c->pstream, tag); /* nonsense */
}
-static void setup_srbchannel(pa_native_connection *c) {
+static void setup_srbchannel(pa_native_connection *c, pa_mem_type_t shm_type) {
pa_srbchannel_template srbt;
pa_srbchannel *srb;
pa_memchunk mc;
pa_tagstruct *t;
int fdlist[2];
+#ifndef HAVE_CREDS
+ pa_log_debug("Disabling srbchannel, reason: No fd passing support");
+ return;
+#endif
+
if (!c->options->srbchannel) {
pa_log_debug("Disabling srbchannel, reason: Must be enabled by module parameter");
return;
@@ -2606,15 +2625,31 @@ static void setup_srbchannel(pa_native_connection *c) {
return;
}
- if (!c->protocol->core->rw_mempool) {
- pa_log_debug("Disabling srbchannel, reason: No rw memory pool");
+ if (c->rw_mempool) {
+ pa_log_debug("Ignoring srbchannel setup, reason: received COMMAND_AUTH "
+ "more than once");
return;
}
- srb = pa_srbchannel_new(c->protocol->core->mainloop, c->protocol->core->rw_mempool);
+ if (!(c->rw_mempool = pa_mempool_new(shm_type, c->protocol->core->shm_size, true))) {
+ pa_log_warn("Disabling srbchannel, reason: Failed to allocate shared "
+ "writable memory pool.");
+ return;
+ }
+
+ if (shm_type == PA_MEM_TYPE_SHARED_MEMFD) {
+ const char *reason;
+ if (pa_pstream_register_memfd_mempool(c->pstream, c->rw_mempool, &reason)) {
+ pa_log_warn("Disabling srbchannel, reason: Failed to register memfd mempool: %s", reason);
+ goto fail;
+ }
+ }
+ pa_mempool_set_is_remote_writable(c->rw_mempool, true);
+
+ srb = pa_srbchannel_new(c->protocol->core->mainloop, c->rw_mempool);
if (!srb) {
pa_log_debug("Failed to create srbchannel");
- return;
+ goto fail;
}
pa_log_debug("Enabling srbchannel...");
pa_srbchannel_export(srb, &srbt);
@@ -2625,7 +2660,7 @@ static void setup_srbchannel(pa_native_connection *c) {
pa_tagstruct_putu32(t, (size_t) srb); /* tag */
fdlist[0] = srbt.readfd;
fdlist[1] = srbt.writefd;
- pa_pstream_send_tagstruct_with_fds(c->pstream, t, 2, fdlist);
+ pa_pstream_send_tagstruct_with_fds(c->pstream, t, 2, fdlist, false);
/* Send ringbuffer memblock to client */
mc.memblock = srbt.memblock;
@@ -2634,6 +2669,13 @@ static void setup_srbchannel(pa_native_connection *c) {
pa_pstream_send_memblock(c->pstream, 0, 0, 0, &mc);
c->srbpending = srb;
+ return;
+
+fail:
+ if (c->rw_mempool) {
+ pa_mempool_unref(c->rw_mempool);
+ c->rw_mempool = NULL;
+ }
}
static void command_enable_srbchannel(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata) {
@@ -2652,7 +2694,9 @@ static void command_enable_srbchannel(pa_pdispatch *pd, uint32_t command, uint32
static void command_auth(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata) {
pa_native_connection *c = PA_NATIVE_CONNECTION(userdata);
const void*cookie;
+ bool memfd_on_remote = false, do_memfd = false;
pa_tagstruct *reply;
+ pa_mem_type_t shm_type;
bool shm_on_remote = false, do_shm;
pa_native_connection_assert_ref(c);
@@ -2676,7 +2720,15 @@ static void command_auth(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_ta
not. */
if (c->version >= 13) {
shm_on_remote = !!(c->version & 0x80000000U);
- c->version &= 0x7FFFFFFFU;
+
+ /* Starting with protocol version 31, the second MSB of the version
+ * tag reflects whether memfd is supported on the other PA end. */
+ if (c->version >= 31)
+ memfd_on_remote = !!(c->version & 0x40000000U);
+
+ /* Reserve the two most-significant _bytes_ of the version tag
+ * for flags. */
+ c->version &= 0x0000FFFFU;
}
pa_log_debug("Protocol version: remote %u, local %u", c->version, PA_PROTOCOL_VERSION);
@@ -2737,7 +2789,7 @@ static void command_auth(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_ta
}
}
- /* Enable shared memory support if possible */
+ /* Enable shared memory and memfd support if possible */
do_shm =
pa_mempool_is_shared(c->protocol->core->mempool) &&
c->is_local;
@@ -2763,8 +2815,24 @@ static void command_auth(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_ta
pa_log_debug("Negotiated SHM: %s", pa_yes_no(do_shm));
pa_pstream_enable_shm(c->pstream, do_shm);
+ do_memfd =
+ do_shm && pa_mempool_is_memfd_backed(c->protocol->core->mempool);
+
+ shm_type = PA_MEM_TYPE_PRIVATE;
+ if (do_shm) {
+ if (c->version >= 31 && memfd_on_remote && do_memfd) {
+ pa_pstream_enable_memfd(c->pstream);
+ shm_type = PA_MEM_TYPE_SHARED_MEMFD;
+ } else
+ shm_type = PA_MEM_TYPE_SHARED_POSIX;
+
+ pa_log_debug("Memfd possible: %s", pa_yes_no(pa_memfd_is_locally_supported()));
+ pa_log_debug("Negotiated SHM type: %s", pa_mem_type_to_string(shm_type));
+ }
+
reply = reply_new(tag);
- pa_tagstruct_putu32(reply, PA_PROTOCOL_VERSION | (do_shm ? 0x80000000 : 0));
+ pa_tagstruct_putu32(reply, PA_PROTOCOL_VERSION | (do_shm ? 0x80000000 : 0) |
+ (do_memfd ? 0x40000000 : 0));
#ifdef HAVE_CREDS
{
@@ -2781,7 +2849,29 @@ static void command_auth(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_ta
pa_pstream_send_tagstruct(c->pstream, reply);
#endif
- setup_srbchannel(c);
+ /* The client enables memfd transport on its pstream only after
+ * inspecting our version flags to see if we support memfds too.
+ *
+ * Thus register any pools after sending the server's version
+ * flags and _never_ before it. */
+ if (shm_type == PA_MEM_TYPE_SHARED_MEMFD) {
+ const char *reason;
+
+ if (pa_pstream_register_memfd_mempool(c->pstream, c->protocol->core->mempool, &reason))
+ pa_log("Failed to register memfd mempool. Reason: %s", reason);
+ }
+
+ setup_srbchannel(c, shm_type);
+}
+
+static void command_register_memfd_shmid(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata) {
+ pa_native_connection *c = PA_NATIVE_CONNECTION(userdata);
+
+ pa_native_connection_assert_ref(c);
+ pa_assert(t);
+
+ if (pa_common_command_register_memfd_shmid(c->pstream, pd, c->version, command, t))
+ protocol_error(c);
}
static void command_set_client_name(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata) {
@@ -4447,7 +4537,7 @@ static void command_set_stream_name(pa_pdispatch *pd, uint32_t command, uint32_t
CHECK_VALIDITY(c->pstream, s, tag, PA_ERR_NOENTITY);
CHECK_VALIDITY(c->pstream, playback_stream_isinstance(s), tag, PA_ERR_NOENTITY);
- pa_sink_input_set_name(s->sink_input, name);
+ pa_sink_input_set_property(s->sink_input, PA_PROP_MEDIA_NAME, name);
} else {
record_stream *s;
@@ -4456,7 +4546,7 @@ static void command_set_stream_name(pa_pdispatch *pd, uint32_t command, uint32_t
s = pa_idxset_get_by_index(c->record_streams, idx);
CHECK_VALIDITY(c->pstream, s, tag, PA_ERR_NOENTITY);
- pa_source_output_set_name(s->source_output, name);
+ pa_source_output_set_property(s->source_output, PA_PROP_MEDIA_NAME, name);
}
pa_pstream_send_simple_ack(c->pstream, tag);
@@ -4889,7 +4979,7 @@ static void command_set_port_latency_offset(pa_pdispatch *pd, uint32_t command,
/*** pstream callbacks ***/
-static void pstream_packet_callback(pa_pstream *p, pa_packet *packet, const pa_cmsg_ancil_data *ancil_data, void *userdata) {
+static void pstream_packet_callback(pa_pstream *p, pa_packet *packet, pa_cmsg_ancil_data *ancil_data, void *userdata) {
pa_native_connection *c = PA_NATIVE_CONNECTION(userdata);
pa_assert(p);
@@ -5125,6 +5215,8 @@ void pa_native_protocol_connect(pa_native_protocol *p, pa_iochannel *io, pa_nati
c->client->send_event = client_send_event_cb;
c->client->userdata = c;
+ c->rw_mempool = NULL;
+
c->pstream = pa_pstream_new(p->core->mainloop, io, p->core->mempool);
pa_pstream_set_receive_packet_callback(c->pstream, pstream_packet_callback, c);
pa_pstream_set_receive_memblock_callback(c->pstream, pstream_memblock_callback, c);
diff --git a/src/pulsecore/pstream-util.c b/src/pulsecore/pstream-util.c
index e874503..d0d6c66 100644
--- a/src/pulsecore/pstream-util.c
+++ b/src/pulsecore/pstream-util.c
@@ -21,13 +21,16 @@
#include <config.h>
#endif
-#include <pulsecore/native-common.h>
+#include <pulsecore/core-util.h>
#include <pulsecore/macro.h>
+#include <pulsecore/native-common.h>
+#include <pulsecore/pstream.h>
+#include <pulsecore/refcnt.h>
#include <pulse/xmalloc.h>
#include "pstream-util.h"
-static void pa_pstream_send_tagstruct_with_ancil_data(pa_pstream *p, pa_tagstruct *t, const pa_cmsg_ancil_data *ancil_data) {
+static void pa_pstream_send_tagstruct_with_ancil_data(pa_pstream *p, pa_tagstruct *t, pa_cmsg_ancil_data *ancil_data) {
size_t length;
const uint8_t *data;
pa_packet *packet;
@@ -58,12 +61,21 @@ void pa_pstream_send_tagstruct_with_creds(pa_pstream *p, pa_tagstruct *t, const
pa_pstream_send_tagstruct_with_ancil_data(p, t, NULL);
}
-void pa_pstream_send_tagstruct_with_fds(pa_pstream *p, pa_tagstruct *t, int nfd, const int *fds) {
+/* @close_fds: If set then the pstreams code, after invoking a sendmsg(),
+ * will close all passed fds.
+ *
+ * Such fds cannot be closed here as this might lead to freeing them
+ * before they're actually passed to the other end. The internally-used
+ * pa_pstream_send_packet() does not do any actual writes and just
+ * defers write events over the pstream. */
+void pa_pstream_send_tagstruct_with_fds(pa_pstream *p, pa_tagstruct *t, int nfd, const int *fds,
+ bool close_fds) {
if (nfd > 0) {
pa_cmsg_ancil_data a;
a.nfd = nfd;
a.creds_valid = false;
+ a.close_fds_on_cleanup = close_fds;
pa_assert(nfd <= MAX_ANCIL_DATA_FDS);
memcpy(a.fds, fds, sizeof(int) * nfd);
pa_pstream_send_tagstruct_with_ancil_data(p, t, &a);
@@ -78,7 +90,8 @@ void pa_pstream_send_tagstruct_with_creds(pa_pstream *p, pa_tagstruct *t, const
pa_pstream_send_tagstruct_with_ancil_data(p, t, NULL);
}
-void pa_pstream_send_tagstruct_with_fds(pa_pstream *p, pa_tagstruct *t, int nfd, const int *fds) {
+void PA_GCC_NORETURN pa_pstream_send_tagstruct_with_fds(pa_pstream *p, pa_tagstruct *t, int nfd, const int *fds,
+ bool close_fds) {
pa_assert_not_reached();
}
@@ -102,3 +115,84 @@ void pa_pstream_send_simple_ack(pa_pstream *p, uint32_t tag) {
pa_tagstruct_putu32(t, tag);
pa_pstream_send_tagstruct(p, t);
}
+
+/* Before sending blocks from a memfd-backed pool over the pipe, we
+ * must call this method first.
+ *
+ * This is needed to transfer memfd blocks without passing their fd
+ * every time, thus minimizing overhead and avoiding fd leaks.
+ *
+ * On registration a packet is sent with the memfd fd as ancil data;
+ * such packet has an ID that uniquely identifies the pool's memfd
+ * region. Upon arrival the other end creates a permanent mapping
+ * between that ID and the passed memfd memory area.
+ *
+ * By doing so, we won't need to reference the pool's memfd fd any
+ * further - just its ID. Both endpoints can then close their fds. */
+int pa_pstream_register_memfd_mempool(pa_pstream *p, pa_mempool *pool, const char **fail_reason) {
+#if defined(HAVE_CREDS) && defined(HAVE_MEMFD)
+ unsigned shm_id;
+ int memfd_fd, ret = -1;
+ pa_tagstruct *t;
+ bool per_client_mempool;
+
+ pa_assert(p);
+ pa_assert(fail_reason);
+
+ *fail_reason = NULL;
+ per_client_mempool = pa_mempool_is_per_client(pool);
+
+ pa_pstream_ref(p);
+
+ if (!pa_mempool_is_shared(pool)) {
+ *fail_reason = "mempool is not shared";
+ goto finish;
+ }
+
+ if (!pa_mempool_is_memfd_backed(pool)) {
+ *fail_reason = "mempool is not memfd-backed";
+ goto finish;
+ }
+
+ if (pa_mempool_get_shm_id(pool, &shm_id)) {
+ *fail_reason = "could not extract pool SHM ID";
+ goto finish;
+ }
+
+ if (!pa_pstream_get_memfd(p)) {
+ *fail_reason = "pipe does not support memfd transport";
+ goto finish;
+ }
+
+ memfd_fd = (per_client_mempool) ? pa_mempool_take_memfd_fd(pool) :
+ pa_mempool_get_memfd_fd(pool);
+
+ /* Note! For per-client mempools we've taken ownership of the memfd
+ * fd, and we're thus the sole code path responsible for closing it.
+ * In case of any failure, it MUST be closed. */
+
+ if (pa_pstream_attach_memfd_shmid(p, shm_id, memfd_fd)) {
+ *fail_reason = "could not attach memfd SHM ID to pipe";
+
+ if (per_client_mempool)
+ pa_assert_se(pa_close(memfd_fd) == 0);
+ goto finish;
+ }
+
+ t = pa_tagstruct_new();
+ pa_tagstruct_putu32(t, PA_COMMAND_REGISTER_MEMFD_SHMID);
+ pa_tagstruct_putu32(t, (uint32_t) -1); /* tag */
+ pa_tagstruct_putu32(t, shm_id);
+ pa_pstream_send_tagstruct_with_fds(p, t, 1, &memfd_fd, per_client_mempool);
+
+ ret = 0;
+finish:
+ pa_pstream_unref(p);
+ return ret;
+
+#else
+ pa_assert(fail_reason);
+ *fail_reason = "memfd support not compiled in";
+ return -1;
+#endif
+}
diff --git a/src/pulsecore/pstream-util.h b/src/pulsecore/pstream-util.h
index 1366314..1191d48 100644
--- a/src/pulsecore/pstream-util.h
+++ b/src/pulsecore/pstream-util.h
@@ -27,11 +27,13 @@
/* The tagstruct is freed!*/
void pa_pstream_send_tagstruct_with_creds(pa_pstream *p, pa_tagstruct *t, const pa_creds *creds);
-void pa_pstream_send_tagstruct_with_fds(pa_pstream *p, pa_tagstruct *t, int nfd, const int *fds);
+void pa_pstream_send_tagstruct_with_fds(pa_pstream *p, pa_tagstruct *t, int nfd, const int *fds, bool close_fds);
#define pa_pstream_send_tagstruct(p, t) pa_pstream_send_tagstruct_with_creds((p), (t), NULL)
void pa_pstream_send_error(pa_pstream *p, uint32_t tag, uint32_t error);
void pa_pstream_send_simple_ack(pa_pstream *p, uint32_t tag);
+int pa_pstream_register_memfd_mempool(pa_pstream *p, pa_mempool *pool, const char **fail_reason);
+
#endif
diff --git a/src/pulsecore/pstream.c b/src/pulsecore/pstream.c
index 98a8382..1ea3c5b 100644
--- a/src/pulsecore/pstream.c
+++ b/src/pulsecore/pstream.c
@@ -32,6 +32,7 @@
#include <pulse/xmalloc.h>
+#include <pulsecore/idxset.h>
#include <pulsecore/socket.h>
#include <pulsecore/queue.h>
#include <pulsecore/log.h>
@@ -44,6 +45,7 @@
/* We piggyback information if audio data blocks are stored in SHM on the seek mode */
#define PA_FLAG_SHMDATA 0x80000000LU
+#define PA_FLAG_SHMDATA_MEMFD_BLOCK 0x20000000LU
#define PA_FLAG_SHMRELEASE 0x40000000LU
#define PA_FLAG_SHMREVOKE 0xC0000000LU
#define PA_FLAG_SHMMASK 0xFF000000LU
@@ -143,7 +145,17 @@ struct pa_pstream {
struct pstream_read readio, readsrb;
- bool use_shm;
+ /* @use_shm: beside copying the full audio data to the other
+ * PA end, this pipe supports just sending references of the
+ * same audio data blocks if they reside in a SHM pool.
+ *
+ * @use_memfd: pipe supports sending SHM memfd block references
+ *
+ * @registered_memfd_ids: registered memfd pools SHM IDs. Check
+ * pa_pstream_register_memfd_mempool() for more information. */
+ bool use_shm, use_memfd;
+ pa_idxset *registered_memfd_ids;
+
pa_memimport *import;
pa_memexport *export;
@@ -168,11 +180,33 @@ struct pa_pstream {
pa_mempool *mempool;
#ifdef HAVE_CREDS
- pa_cmsg_ancil_data read_ancil_data, write_ancil_data;
+ pa_cmsg_ancil_data read_ancil_data, *write_ancil_data;
bool send_ancil_data_now;
#endif
};
+#ifdef HAVE_CREDS
+/* Don't close the ancillary fds by your own! Always call this method;
+ * it guarantees necessary cleanups after fds close.. This method is
+ * also multiple-invocations safe. */
+void pa_cmsg_ancil_data_close_fds(struct pa_cmsg_ancil_data *ancil) {
+ if (ancil && ancil->close_fds_on_cleanup) {
+ int i;
+
+ pa_assert(ancil->nfd <= MAX_ANCIL_DATA_FDS);
+
+ for (i = 0; i < ancil->nfd; i++)
+ if (ancil->fds[i] != -1) {
+ pa_assert_se(pa_close(ancil->fds[i]) == 0);
+ ancil->fds[i] = -1;
+ }
+
+ ancil->nfd = 0;
+ ancil->close_fds_on_cleanup = false;
+ }
+}
+#endif
+
static int do_write(pa_pstream *p);
static int do_read(pa_pstream *p, struct pstream_read *re);
@@ -287,6 +321,35 @@ pa_pstream *pa_pstream_new(pa_mainloop_api *m, pa_iochannel *io, pa_mempool *poo
return p;
}
+/* Attach memfd<->SHM_ID mapping to given pstream and its memimport.
+ * Check pa_pstream_register_memfd_mempool() for further info.
+ *
+ * Caller owns the passed @memfd_fd and must close it down when appropriate. */
+int pa_pstream_attach_memfd_shmid(pa_pstream *p, unsigned shm_id, int memfd_fd) {
+ int err = -1;
+
+ pa_assert(memfd_fd != -1);
+
+ if (!p->use_memfd) {
+ pa_log_warn("Received memfd ID registration request over a pipe "
+ "that does not support memfds");
+ return err;
+ }
+
+ if (pa_idxset_get_by_data(p->registered_memfd_ids, PA_UINT32_TO_PTR(shm_id), NULL)) {
+ pa_log_warn("previously registered memfd SHM ID = %u", shm_id);
+ return err;
+ }
+
+ if (pa_memimport_attach_memfd(p->import, shm_id, memfd_fd, true)) {
+ pa_log("Failed to create permanent mapping for memfd region with ID = %u", shm_id);
+ return err;
+ }
+
+ pa_assert_se(pa_idxset_put(p->registered_memfd_ids, PA_UINT32_TO_PTR(shm_id), NULL) == 0);
+ return 0;
+}
+
static void item_free(void *item) {
struct item_info *i = item;
pa_assert(i);
@@ -299,6 +362,15 @@ static void item_free(void *item) {
pa_packet_unref(i->packet);
}
+#ifdef HAVE_CREDS
+ /* On error recovery paths, there might be lingering items
+ * on the pstream send queue and they are usually freed with
+ * a call to 'pa_queue_free(p->send_queue, item_free)'. Make
+ * sure we do not leak any fds in that case! */
+ if (i->with_ancil_data)
+ pa_cmsg_ancil_data_close_fds(&i->ancil_data);
+#endif
+
if (pa_flist_push(PA_STATIC_FLIST_GET(items), i) < 0)
pa_xfree(i);
}
@@ -328,18 +400,25 @@ static void pstream_free(pa_pstream *p) {
if (p->readio.packet)
pa_packet_unref(p->readio.packet);
+ if (p->registered_memfd_ids)
+ pa_idxset_free(p->registered_memfd_ids, NULL);
+
pa_xfree(p);
}
-void pa_pstream_send_packet(pa_pstream*p, pa_packet *packet, const pa_cmsg_ancil_data *ancil_data) {
+void pa_pstream_send_packet(pa_pstream*p, pa_packet *packet, pa_cmsg_ancil_data *ancil_data) {
struct item_info *i;
pa_assert(p);
pa_assert(PA_REFCNT_VALUE(p) > 0);
pa_assert(packet);
- if (p->dead)
+ if (p->dead) {
+#ifdef HAVE_CREDS
+ pa_cmsg_ancil_data_close_fds(ancil_data);
+#endif
return;
+ }
if (!(i = pa_flist_pop(PA_STATIC_FLIST_GET(items))))
i = pa_xnew(struct item_info, 1);
@@ -536,6 +615,7 @@ static void prepare_next_write_item(pa_pstream *p) {
flags = (uint32_t) (p->write.current->seek_mode & PA_FLAG_SEEKMASK);
if (p->use_shm) {
+ pa_mem_type_t type;
uint32_t block_id, shm_id;
size_t offset, length;
uint32_t *shm_info = (uint32_t *) &p->write.minibuf[PA_PSTREAM_DESCRIPTOR_SIZE];
@@ -550,29 +630,50 @@ static void prepare_next_write_item(pa_pstream *p) {
if (pa_memexport_put(current_export,
p->write.current->chunk.memblock,
+ &type,
&block_id,
&shm_id,
&offset,
&length) >= 0) {
- flags |= PA_FLAG_SHMDATA;
- if (pa_mempool_is_remote_writable(current_pool))
- flags |= PA_FLAG_SHMWRITABLE;
- send_payload = false;
+ if (type == PA_MEM_TYPE_SHARED_POSIX)
+ send_payload = false;
+
+ if (type == PA_MEM_TYPE_SHARED_MEMFD && p->use_memfd) {
+ if (pa_idxset_get_by_data(p->registered_memfd_ids, PA_UINT32_TO_PTR(shm_id), NULL)) {
+ flags |= PA_FLAG_SHMDATA_MEMFD_BLOCK;
+ send_payload = false;
+ } else {
+ if (pa_log_ratelimit(PA_LOG_ERROR)) {
+ pa_log("Cannot send block reference with non-registered memfd ID = %u", shm_id);
+ pa_log("Fallig back to copying full block data over socket");
+ }
+ }
+ }
+
+ if (send_payload) {
+ pa_assert_se(pa_memexport_process_release(current_export, block_id) == 0);
+ } else {
+ flags |= PA_FLAG_SHMDATA;
+ if (pa_mempool_is_remote_writable(current_pool))
+ flags |= PA_FLAG_SHMWRITABLE;
- shm_info[PA_PSTREAM_SHM_BLOCKID] = htonl(block_id);
- shm_info[PA_PSTREAM_SHM_SHMID] = htonl(shm_id);
- shm_info[PA_PSTREAM_SHM_INDEX] = htonl((uint32_t) (offset + p->write.current->chunk.index));
- shm_info[PA_PSTREAM_SHM_LENGTH] = htonl((uint32_t) p->write.current->chunk.length);
+ shm_info[PA_PSTREAM_SHM_BLOCKID] = htonl(block_id);
+ shm_info[PA_PSTREAM_SHM_SHMID] = htonl(shm_id);
+ shm_info[PA_PSTREAM_SHM_INDEX] = htonl((uint32_t) (offset + p->write.current->chunk.index));
+ shm_info[PA_PSTREAM_SHM_LENGTH] = htonl((uint32_t) p->write.current->chunk.length);
- p->write.descriptor[PA_PSTREAM_DESCRIPTOR_LENGTH] = htonl(shm_size);
- p->write.minibuf_validsize = PA_PSTREAM_DESCRIPTOR_SIZE + shm_size;
+ p->write.descriptor[PA_PSTREAM_DESCRIPTOR_LENGTH] = htonl(shm_size);
+ p->write.minibuf_validsize = PA_PSTREAM_DESCRIPTOR_SIZE + shm_size;
+ }
}
/* else */
+/* FIXME: Avoid memexport slot leaks. Call pa_memexport_process_release() */
/* pa_log_warn("Failed to export memory block."); */
if (current_export != p->export)
pa_memexport_free(current_export);
+ pa_mempool_unref(current_pool);
}
if (send_payload) {
@@ -586,7 +687,7 @@ static void prepare_next_write_item(pa_pstream *p) {
#ifdef HAVE_CREDS
if ((p->send_ancil_data_now = p->write.current->with_ancil_data))
- p->write_ancil_data = p->write.current->ancil_data;
+ p->write_ancil_data = &p->write.current->ancil_data;
#endif
}
@@ -646,14 +747,16 @@ static int do_write(pa_pstream *p) {
#ifdef HAVE_CREDS
if (p->send_ancil_data_now) {
- if (p->write_ancil_data.creds_valid) {
- pa_assert(p->write_ancil_data.nfd == 0);
- if ((r = pa_iochannel_write_with_creds(p->io, d, l, &p->write_ancil_data.creds)) < 0)
+ if (p->write_ancil_data->creds_valid) {
+ pa_assert(p->write_ancil_data->nfd == 0);
+ if ((r = pa_iochannel_write_with_creds(p->io, d, l, &p->write_ancil_data->creds)) < 0)
goto fail;
}
else
- if ((r = pa_iochannel_write_with_fds(p->io, d, l, p->write_ancil_data.nfd, p->write_ancil_data.fds)) < 0)
+ if ((r = pa_iochannel_write_with_fds(p->io, d, l, p->write_ancil_data->nfd, p->write_ancil_data->fds)) < 0)
goto fail;
+
+ pa_cmsg_ancil_data_close_fds(p->write_ancil_data);
p->send_ancil_data_now = false;
} else
#endif
@@ -684,6 +787,10 @@ static int do_write(pa_pstream *p) {
return (size_t) r == l ? 1 : 0;
fail:
+#ifdef HAVE_CREDS
+ if (p->send_ancil_data_now)
+ pa_cmsg_ancil_data_close_fds(p->write_ancil_data);
+#endif
if (release_memblock)
pa_memblock_release(release_memblock);
@@ -764,6 +871,7 @@ static int do_read(pa_pstream *p, struct pstream_read *re) {
pa_assert(b.nfd <= MAX_ANCIL_DATA_FDS);
p->read_ancil_data.nfd = b.nfd;
memcpy(p->read_ancil_data.fds, b.fds, sizeof(int) * b.nfd);
+ p->read_ancil_data.close_fds_on_cleanup = b.close_fds_on_cleanup;
}
}
#else
@@ -840,7 +948,7 @@ static int do_read(pa_pstream *p, struct pstream_read *re) {
return -1;
}
- if ((flags & PA_FLAG_SHMMASK) == PA_FLAG_SHMDATA) {
+ if (((flags & PA_FLAG_SHMMASK) & PA_FLAG_SHMDATA) != 0) {
if (length != sizeof(re->shm_info)) {
pa_log_warn("Received SHM memblock frame with invalid frame length.");
@@ -883,18 +991,28 @@ static int do_read(pa_pstream *p, struct pstream_read *re) {
pa_packet_unref(re->packet);
} else {
- pa_memblock *b;
+ pa_memblock *b = NULL;
uint32_t flags = ntohl(re->descriptor[PA_PSTREAM_DESCRIPTOR_FLAGS]);
- pa_assert((flags & PA_FLAG_SHMMASK) == PA_FLAG_SHMDATA);
+ uint32_t shm_id = ntohl(re->shm_info[PA_PSTREAM_SHM_SHMID]);
+ pa_mem_type_t type = (flags & PA_FLAG_SHMDATA_MEMFD_BLOCK) ?
+ PA_MEM_TYPE_SHARED_MEMFD : PA_MEM_TYPE_SHARED_POSIX;
+ pa_assert(((flags & PA_FLAG_SHMMASK) & PA_FLAG_SHMDATA) != 0);
pa_assert(p->import);
- if (!(b = pa_memimport_get(p->import,
- ntohl(re->shm_info[PA_PSTREAM_SHM_BLOCKID]),
- ntohl(re->shm_info[PA_PSTREAM_SHM_SHMID]),
- ntohl(re->shm_info[PA_PSTREAM_SHM_INDEX]),
- ntohl(re->shm_info[PA_PSTREAM_SHM_LENGTH]),
- !!(flags & PA_FLAG_SHMWRITABLE)))) {
+ if (type == PA_MEM_TYPE_SHARED_MEMFD && p->use_memfd &&
+ !pa_idxset_get_by_data(p->registered_memfd_ids, PA_UINT32_TO_PTR(shm_id), NULL)) {
+
+ if (pa_log_ratelimit(PA_LOG_ERROR))
+ pa_log("Ignoring received block reference with non-registered memfd ID = %u", shm_id);
+
+ } else if (!(b = pa_memimport_get(p->import,
+ type,
+ ntohl(re->shm_info[PA_PSTREAM_SHM_BLOCKID]),
+ shm_id,
+ ntohl(re->shm_info[PA_PSTREAM_SHM_INDEX]),
+ ntohl(re->shm_info[PA_PSTREAM_SHM_LENGTH]),
+ !!(flags & PA_FLAG_SHMWRITABLE)))) {
if (pa_log_ratelimit(PA_LOG_DEBUG))
pa_log_debug("Failed to import memory block.");
@@ -937,6 +1055,13 @@ frame_done:
re->data = NULL;
#ifdef HAVE_CREDS
+ /* FIXME: Close received ancillary data fds if the pstream's
+ * receive_packet_callback did not do so.
+ *
+ * Malicious clients can attach fds to unknown commands, or attach them
+ * to commands that does not expect fds. By doing so, server will reach
+ * its open fd limit and future clients' SHM transfers will always fail.
+ */
p->read_ancil_data.creds_valid = false;
p->read_ancil_data.nfd = 0;
#endif
@@ -1085,6 +1210,18 @@ void pa_pstream_enable_shm(pa_pstream *p, bool enable) {
}
}
+void pa_pstream_enable_memfd(pa_pstream *p) {
+ pa_assert(p);
+ pa_assert(PA_REFCNT_VALUE(p) > 0);
+ pa_assert(p->use_shm);
+
+ p->use_memfd = true;
+
+ if (!p->registered_memfd_ids) {
+ p->registered_memfd_ids = pa_idxset_new(NULL, NULL);
+ }
+}
+
bool pa_pstream_get_shm(pa_pstream *p) {
pa_assert(p);
pa_assert(PA_REFCNT_VALUE(p) > 0);
@@ -1092,6 +1229,13 @@ bool pa_pstream_get_shm(pa_pstream *p) {
return p->use_shm;
}
+bool pa_pstream_get_memfd(pa_pstream *p) {
+ pa_assert(p);
+ pa_assert(PA_REFCNT_VALUE(p) > 0);
+
+ return p->use_memfd;
+}
+
void pa_pstream_set_srbchannel(pa_pstream *p, pa_srbchannel *srb) {
pa_assert(p);
pa_assert(PA_REFCNT_VALUE(p) > 0 || srb == NULL);
diff --git a/src/pulsecore/pstream.h b/src/pulsecore/pstream.h
index f4e1462..2bff270 100644
--- a/src/pulsecore/pstream.h
+++ b/src/pulsecore/pstream.h
@@ -36,7 +36,7 @@
typedef struct pa_pstream pa_pstream;
-typedef void (*pa_pstream_packet_cb_t)(pa_pstream *p, pa_packet *packet, const pa_cmsg_ancil_data *ancil_data, void *userdata);
+typedef void (*pa_pstream_packet_cb_t)(pa_pstream *p, pa_packet *packet, pa_cmsg_ancil_data *ancil_data, void *userdata);
typedef void (*pa_pstream_memblock_cb_t)(pa_pstream *p, uint32_t channel, int64_t offset, pa_seek_mode_t seek, const pa_memchunk *chunk, void *userdata);
typedef void (*pa_pstream_notify_cb_t)(pa_pstream *p, void *userdata);
typedef void (*pa_pstream_block_id_cb_t)(pa_pstream *p, uint32_t block_id, void *userdata);
@@ -48,7 +48,9 @@ void pa_pstream_unref(pa_pstream*p);
void pa_pstream_unlink(pa_pstream *p);
-void pa_pstream_send_packet(pa_pstream*p, pa_packet *packet, const pa_cmsg_ancil_data *ancil_data);
+int pa_pstream_attach_memfd_shmid(pa_pstream *p, unsigned shm_id, int memfd_fd);
+
+void pa_pstream_send_packet(pa_pstream*p, pa_packet *packet, pa_cmsg_ancil_data *ancil_data);
void pa_pstream_send_memblock(pa_pstream*p, uint32_t channel, int64_t offset, pa_seek_mode_t seek, const pa_memchunk *chunk);
void pa_pstream_send_release(pa_pstream *p, uint32_t block_id);
void pa_pstream_send_revoke(pa_pstream *p, uint32_t block_id);
@@ -63,7 +65,9 @@ void pa_pstream_set_revoke_callback(pa_pstream *p, pa_pstream_block_id_cb_t cb,
bool pa_pstream_is_pending(pa_pstream *p);
void pa_pstream_enable_shm(pa_pstream *p, bool enable);
+void pa_pstream_enable_memfd(pa_pstream *p);
bool pa_pstream_get_shm(pa_pstream *p);
+bool pa_pstream_get_memfd(pa_pstream *p);
/* Enables shared ringbuffer channel. Note that the srbchannel is now owned by the pstream.
Setting srb to NULL will free any existing srbchannel. */
diff --git a/src/pulsecore/shm.c b/src/pulsecore/shm.c
index d613168..bcf7182 100644
--- a/src/pulsecore/shm.c
+++ b/src/pulsecore/shm.c
@@ -45,12 +45,14 @@
#include <pulse/xmalloc.h>
#include <pulse/gccmacro.h>
+#include <pulsecore/memfd-wrappers.h>
#include <pulsecore/core-error.h>
#include <pulsecore/log.h>
#include <pulsecore/random.h>
#include <pulsecore/core-util.h>
#include <pulsecore/macro.h>
#include <pulsecore/atomic.h>
+#include <pulsecore/mem.h>
#include "shm.h"
@@ -91,7 +93,12 @@ struct shm_marker {
uint64_t _reserved4;
} PA_GCC_PACKED;
-#define SHM_MARKER_SIZE PA_ALIGN(sizeof(struct shm_marker))
+static inline size_t shm_marker_size(pa_shm *m) {
+ if (m->type == PA_MEM_TYPE_SHARED_POSIX)
+ return PA_ALIGN(sizeof(struct shm_marker));
+
+ return 0;
+}
#ifdef HAVE_SHM_OPEN
static char *segment_name(char *fn, size_t l, unsigned id) {
@@ -100,106 +107,153 @@ static char *segment_name(char *fn, size_t l, unsigned id) {
}
#endif
-int pa_shm_create_rw(pa_shm *m, size_t size, bool shared, mode_t mode) {
-#ifdef HAVE_SHM_OPEN
- char fn[32];
- int fd = -1;
-#endif
-
+static int privatemem_create(pa_shm *m, size_t size) {
pa_assert(m);
pa_assert(size > 0);
- pa_assert(size <= MAX_SHM_SIZE);
- pa_assert(!(mode & ~0777));
- pa_assert(mode >= 0600);
-
- /* Each time we create a new SHM area, let's first drop all stale
- * ones */
- pa_shm_cleanup();
- /* Round up to make it page aligned */
- size = PA_PAGE_ALIGN(size);
-
- if (!shared) {
- m->id = 0;
- m->size = size;
+ m->type = PA_MEM_TYPE_PRIVATE;
+ m->id = 0;
+ m->size = size;
+ m->do_unlink = false;
+ m->fd = -1;
#ifdef MAP_ANONYMOUS
- if ((m->ptr = mmap(NULL, m->size, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, (off_t) 0)) == MAP_FAILED) {
- pa_log("mmap() failed: %s", pa_cstrerror(errno));
- goto fail;
- }
+ if ((m->ptr = mmap(NULL, m->size, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, (off_t) 0)) == MAP_FAILED) {
+ pa_log("mmap() failed: %s", pa_cstrerror(errno));
+ return -1;
+ }
#elif defined(HAVE_POSIX_MEMALIGN)
- {
- int r;
+ {
+ int r;
- if ((r = posix_memalign(&m->ptr, PA_PAGE_SIZE, size)) < 0) {
- pa_log("posix_memalign() failed: %s", pa_cstrerror(r));
- goto fail;
- }
+ if ((r = posix_memalign(&m->ptr, PA_PAGE_SIZE, size)) < 0) {
+ pa_log("posix_memalign() failed: %s", pa_cstrerror(r));
+ return r;
}
+ }
#else
- m->ptr = pa_xmalloc(m->size);
+ m->ptr = pa_xmalloc(m->size);
#endif
- m->do_unlink = false;
+ return 0;
+}
- } else {
-#ifdef HAVE_SHM_OPEN
- struct shm_marker *marker;
+static int sharedmem_create(pa_shm *m, pa_mem_type_t type, size_t size, mode_t mode) {
+#if defined(HAVE_SHM_OPEN) || defined(HAVE_MEMFD)
+ char fn[32];
+ int fd = -1;
+ struct shm_marker *marker;
+ bool do_unlink = false;
- pa_random(&m->id, sizeof(m->id));
+ /* Each time we create a new SHM area, let's first drop all stale
+ * ones */
+ pa_shm_cleanup();
+
+ pa_random(&m->id, sizeof(m->id));
+
+ switch (type) {
+#ifdef HAVE_SHM_OPEN
+ case PA_MEM_TYPE_SHARED_POSIX:
segment_name(fn, sizeof(fn), m->id);
+ fd = shm_open(fn, O_RDWR|O_CREAT|O_EXCL, mode);
+ do_unlink = true;
+ break;
+#endif
+#ifdef HAVE_MEMFD
+ case PA_MEM_TYPE_SHARED_MEMFD:
+ fd = memfd_create("pulseaudio", MFD_ALLOW_SEALING);
+ break;
+#endif
+ default:
+ goto fail;
+ }
- if ((fd = shm_open(fn, O_RDWR|O_CREAT|O_EXCL, mode)) < 0) {
- pa_log("shm_open() failed: %s", pa_cstrerror(errno));
- goto fail;
- }
+ if (fd < 0) {
+ pa_log("%s open() failed: %s", pa_mem_type_to_string(type), pa_cstrerror(errno));
+ goto fail;
+ }
- m->size = size + SHM_MARKER_SIZE;
+ m->type = type;
+ m->size = size + shm_marker_size(m);
+ m->do_unlink = do_unlink;
- if (ftruncate(fd, (off_t) m->size) < 0) {
- pa_log("ftruncate() failed: %s", pa_cstrerror(errno));
- goto fail;
- }
+ if (ftruncate(fd, (off_t) m->size) < 0) {
+ pa_log("ftruncate() failed: %s", pa_cstrerror(errno));
+ goto fail;
+ }
#ifndef MAP_NORESERVE
#define MAP_NORESERVE 0
#endif
- if ((m->ptr = mmap(NULL, PA_PAGE_ALIGN(m->size), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_NORESERVE, fd, (off_t) 0)) == MAP_FAILED) {
- pa_log("mmap() failed: %s", pa_cstrerror(errno));
- goto fail;
- }
+ if ((m->ptr = mmap(NULL, PA_PAGE_ALIGN(m->size), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_NORESERVE, fd, (off_t) 0)) == MAP_FAILED) {
+ pa_log("mmap() failed: %s", pa_cstrerror(errno));
+ goto fail;
+ }
+ if (type == PA_MEM_TYPE_SHARED_POSIX) {
/* We store our PID at the end of the shm block, so that we
* can check for dead shm segments later */
- marker = (struct shm_marker*) ((uint8_t*) m->ptr + m->size - SHM_MARKER_SIZE);
+ marker = (struct shm_marker*) ((uint8_t*) m->ptr + m->size - shm_marker_size(m));
pa_atomic_store(&marker->pid, (int) getpid());
pa_atomic_store(&marker->marker, SHM_MARKER);
+ }
+ /* For memfds, we keep the fd open until we pass it
+ * to the other PA endpoint over unix domain socket. */
+ if (type == PA_MEM_TYPE_SHARED_MEMFD)
+ m->fd = fd;
+ else {
pa_assert_se(pa_close(fd) == 0);
- m->do_unlink = true;
-#else
- goto fail;
-#endif
+ m->fd = -1;
}
- m->shared = shared;
-
return 0;
fail:
-
-#ifdef HAVE_SHM_OPEN
if (fd >= 0) {
- shm_unlink(fn);
+#ifdef HAVE_SHM_OPEN
+ if (type == PA_MEM_TYPE_SHARED_POSIX)
+ shm_unlink(fn);
+#endif
pa_close(fd);
}
-#endif
+#endif /* defined(HAVE_SHM_OPEN) || defined(HAVE_MEMFD) */
return -1;
}
+int pa_shm_create_rw(pa_shm *m, pa_mem_type_t type, size_t size, mode_t mode) {
+ pa_assert(m);
+ pa_assert(size > 0);
+ pa_assert(size <= MAX_SHM_SIZE);
+ pa_assert(!(mode & ~0777));
+ pa_assert(mode >= 0600);
+
+ /* Round up to make it page aligned */
+ size = PA_PAGE_ALIGN(size);
+
+ if (type == PA_MEM_TYPE_PRIVATE)
+ return privatemem_create(m, size);
+
+ return sharedmem_create(m, type, size, mode);
+}
+
+static void privatemem_free(pa_shm *m) {
+ pa_assert(m);
+ pa_assert(m->ptr);
+ pa_assert(m->size > 0);
+
+#ifdef MAP_ANONYMOUS
+ if (munmap(m->ptr, m->size) < 0)
+ pa_log("munmap() failed: %s", pa_cstrerror(errno));
+#elif defined(HAVE_POSIX_MEMALIGN)
+ free(m->ptr);
+#else
+ pa_xfree(m->ptr);
+#endif
+}
+
void pa_shm_free(pa_shm *m) {
pa_assert(m);
pa_assert(m->ptr);
@@ -209,34 +263,35 @@ void pa_shm_free(pa_shm *m) {
pa_assert(m->ptr != MAP_FAILED);
#endif
- if (!m->shared) {
-#ifdef MAP_ANONYMOUS
- if (munmap(m->ptr, m->size) < 0)
- pa_log("munmap() failed: %s", pa_cstrerror(errno));
-#elif defined(HAVE_POSIX_MEMALIGN)
- free(m->ptr);
-#else
- pa_xfree(m->ptr);
-#endif
- } else {
-#ifdef HAVE_SHM_OPEN
- if (munmap(m->ptr, PA_PAGE_ALIGN(m->size)) < 0)
- pa_log("munmap() failed: %s", pa_cstrerror(errno));
+ if (m->type == PA_MEM_TYPE_PRIVATE) {
+ privatemem_free(m);
+ goto finish;
+ }
- if (m->do_unlink) {
- char fn[32];
+#if defined(HAVE_SHM_OPEN) || defined(HAVE_MEMFD)
+ if (munmap(m->ptr, PA_PAGE_ALIGN(m->size)) < 0)
+ pa_log("munmap() failed: %s", pa_cstrerror(errno));
- segment_name(fn, sizeof(fn), m->id);
+#ifdef HAVE_SHM_OPEN
+ if (m->type == PA_MEM_TYPE_SHARED_POSIX && m->do_unlink) {
+ char fn[32];
+
+ segment_name(fn, sizeof(fn), m->id);
+ if (shm_unlink(fn) < 0)
+ pa_log(" shm_unlink(%s) failed: %s", fn, pa_cstrerror(errno));
+ }
+#endif
+#ifdef HAVE_MEMFD
+ if (m->type == PA_MEM_TYPE_SHARED_MEMFD && m->fd != -1)
+ pa_assert_se(pa_close(m->fd) == 0);
+#endif
- if (shm_unlink(fn) < 0)
- pa_log(" shm_unlink(%s) failed: %s", fn, pa_cstrerror(errno));
- }
#else
- /* We shouldn't be here without shm support */
- pa_assert_not_reached();
+ /* We shouldn't be here without shm or memfd support */
+ pa_assert_not_reached();
#endif
- }
+finish:
pa_zero(*m);
}
@@ -286,9 +341,8 @@ void pa_shm_punch(pa_shm *m, size_t offset, size_t size) {
#endif
}
-#ifdef HAVE_SHM_OPEN
-
-static int shm_attach(pa_shm *m, unsigned id, bool writable, bool for_cleanup) {
+static int shm_attach(pa_shm *m, pa_mem_type_t type, unsigned id, int memfd_fd, bool writable, bool for_cleanup) {
+#if defined(HAVE_SHM_OPEN) || defined(HAVE_MEMFD)
char fn[32];
int fd = -1;
int prot;
@@ -296,11 +350,25 @@ static int shm_attach(pa_shm *m, unsigned id, bool writable, bool for_cleanup) {
pa_assert(m);
- segment_name(fn, sizeof(fn), m->id = id);
-
- if ((fd = shm_open(fn, writable ? O_RDWR : O_RDONLY, 0)) < 0) {
- if ((errno != EACCES && errno != ENOENT) || !for_cleanup)
- pa_log("shm_open() failed: %s", pa_cstrerror(errno));
+ switch (type) {
+#ifdef HAVE_SHM_OPEN
+ case PA_MEM_TYPE_SHARED_POSIX:
+ pa_assert(memfd_fd == -1);
+ segment_name(fn, sizeof(fn), id);
+ if ((fd = shm_open(fn, writable ? O_RDWR : O_RDONLY, 0)) < 0) {
+ if ((errno != EACCES && errno != ENOENT) || !for_cleanup)
+ pa_log("shm_open() failed: %s", pa_cstrerror(errno));
+ goto fail;
+ }
+ break;
+#endif
+#ifdef HAVE_MEMFD
+ case PA_MEM_TYPE_SHARED_MEMFD:
+ pa_assert(memfd_fd != -1);
+ fd = memfd_fd;
+ break;
+#endif
+ default:
goto fail;
}
@@ -310,45 +378,48 @@ static int shm_attach(pa_shm *m, unsigned id, bool writable, bool for_cleanup) {
}
if (st.st_size <= 0 ||
- st.st_size > (off_t) (MAX_SHM_SIZE+SHM_MARKER_SIZE) ||
+ st.st_size > (off_t) MAX_SHM_SIZE + (off_t) shm_marker_size(m) ||
PA_ALIGN((size_t) st.st_size) != (size_t) st.st_size) {
pa_log("Invalid shared memory segment size");
goto fail;
}
- m->size = (size_t) st.st_size;
-
prot = writable ? PROT_READ | PROT_WRITE : PROT_READ;
- if ((m->ptr = mmap(NULL, PA_PAGE_ALIGN(m->size), prot, MAP_SHARED, fd, (off_t) 0)) == MAP_FAILED) {
+ if ((m->ptr = mmap(NULL, PA_PAGE_ALIGN(st.st_size), prot, MAP_SHARED, fd, (off_t) 0)) == MAP_FAILED) {
pa_log("mmap() failed: %s", pa_cstrerror(errno));
goto fail;
}
- m->do_unlink = false;
- m->shared = true;
+ /* In case of attaching to memfd areas, _the caller_ maintains
+ * ownership of the passed fd and has the sole responsibility
+ * of closing it down.. For other types, we're the code path
+ * which created the fd in the first place and we're thus the
+ * ones responsible for closing it down */
+ if (type != PA_MEM_TYPE_SHARED_MEMFD)
+ pa_assert_se(pa_close(fd) == 0);
- pa_assert_se(pa_close(fd) == 0);
+ m->type = type;
+ m->id = id;
+ m->size = (size_t) st.st_size;
+ m->do_unlink = false;
+ m->fd = -1;
return 0;
fail:
- if (fd >= 0)
+ /* In case of memfds, caller maintains fd ownership */
+ if (fd >= 0 && type != PA_MEM_TYPE_SHARED_MEMFD)
pa_close(fd);
- return -1;
-}
-
-int pa_shm_attach(pa_shm *m, unsigned id, bool writable) {
- return shm_attach(m, id, writable, false);
-}
+#endif /* defined(HAVE_SHM_OPEN) || defined(HAVE_MEMFD) */
-#else /* HAVE_SHM_OPEN */
-
-int pa_shm_attach(pa_shm *m, unsigned id, bool writable) {
return -1;
}
-#endif /* HAVE_SHM_OPEN */
+/* Caller owns passed @memfd_fd and must close it down when appropriate. */
+int pa_shm_attach(pa_shm *m, pa_mem_type_t type, unsigned id, int memfd_fd, bool writable) {
+ return shm_attach(m, type, id, memfd_fd, writable, false);
+}
int pa_shm_cleanup(void) {
@@ -379,15 +450,15 @@ int pa_shm_cleanup(void) {
if (pa_atou(de->d_name + SHM_ID_LEN, &id) < 0)
continue;
- if (shm_attach(&seg, id, false, true) < 0)
+ if (shm_attach(&seg, PA_MEM_TYPE_SHARED_POSIX, id, -1, false, true) < 0)
continue;
- if (seg.size < SHM_MARKER_SIZE) {
+ if (seg.size < shm_marker_size(&seg)) {
pa_shm_free(&seg);
continue;
}
- m = (struct shm_marker*) ((uint8_t*) seg.ptr + seg.size - SHM_MARKER_SIZE);
+ m = (struct shm_marker*) ((uint8_t*) seg.ptr + seg.size - shm_marker_size(&seg));
if (pa_atomic_load(&m->marker) != SHM_MARKER) {
pa_shm_free(&seg);
diff --git a/src/pulsecore/shm.h b/src/pulsecore/shm.h
index d438961..67a2114 100644
--- a/src/pulsecore/shm.h
+++ b/src/pulsecore/shm.h
@@ -23,17 +23,34 @@
#include <sys/types.h>
#include <pulsecore/macro.h>
+#include <pulsecore/mem.h>
typedef struct pa_shm {
+ pa_mem_type_t type;
unsigned id;
void *ptr;
size_t size;
+
+ /* Only for type = PA_MEM_TYPE_SHARED_POSIX */
bool do_unlink:1;
- bool shared:1;
+
+ /* Only for type = PA_MEM_TYPE_SHARED_MEMFD
+ *
+ * To avoid fd leaks, we keep this fd open only until we pass it
+ * to the other PA endpoint over unix domain socket.
+ *
+ * When we don't have ownership for the memfd fd in question (e.g.
+ * pa_shm_attach()), or the file descriptor has now been closed,
+ * this is set to -1.
+ *
+ * For the special case of a global mempool, we keep this fd
+ * always open. Check comments on top of pa_mempool_new() for
+ * rationale. */
+ int fd;
} pa_shm;
-int pa_shm_create_rw(pa_shm *m, size_t size, bool shared, mode_t mode);
-int pa_shm_attach(pa_shm *m, unsigned id, bool writable);
+int pa_shm_create_rw(pa_shm *m, pa_mem_type_t type, size_t size, mode_t mode);
+int pa_shm_attach(pa_shm *m, pa_mem_type_t type, unsigned id, int memfd_fd, bool writable);
void pa_shm_punch(pa_shm *m, size_t offset, size_t size);
diff --git a/src/pulsecore/sink-input.c b/src/pulsecore/sink-input.c
index 8ec63b5..361b445 100644
--- a/src/pulsecore/sink-input.c
+++ b/src/pulsecore/sink-input.c
@@ -1426,17 +1426,124 @@ void pa_sink_input_set_mute(pa_sink_input *i, bool mute, bool save) {
pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_MUTE_CHANGED], i);
}
+void pa_sink_input_set_property(pa_sink_input *i, const char *key, const char *value) {
+ char *old_value = NULL;
+ const char *new_value;
+
+ pa_assert(i);
+ pa_assert(key);
+
+ if (pa_proplist_contains(i->proplist, key)) {
+ old_value = pa_xstrdup(pa_proplist_gets(i->proplist, key));
+ if (old_value) {
+ if (pa_streq(value, old_value))
+ goto finish;
+ } else
+ old_value = pa_xstrdup("(data)");
+ } else {
+ if (!value)
+ goto finish;
+
+ old_value = pa_xstrdup("(unset)");
+ }
+
+ if (value) {
+ pa_proplist_sets(i->proplist, key, value);
+ new_value = value;
+ } else {
+ pa_proplist_unset(i->proplist, key);
+ new_value = "(unset)";
+ }
+
+ if (PA_SINK_INPUT_IS_LINKED(i->state)) {
+ pa_log_debug("Sink input %u: proplist[%s]: %s -> %s", i->index, key, old_value, new_value);
+ pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_PROPLIST_CHANGED], i);
+ pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT | PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
+ }
+
+finish:
+ pa_xfree(old_value);
+}
+
+void pa_sink_input_set_property_arbitrary(pa_sink_input *i, const char *key, const uint8_t *value, size_t nbytes) {
+ const uint8_t *old_value;
+ size_t old_nbytes;
+ const char *old_value_str;
+ const char *new_value_str;
+
+ pa_assert(i);
+ pa_assert(key);
+
+ if (pa_proplist_get(i->proplist, key, (const void **) &old_value, &old_nbytes) >= 0) {
+ if (value && nbytes == old_nbytes && !memcmp(value, old_value, nbytes))
+ return;
+
+ old_value_str = "(data)";
+
+ } else {
+ if (!value)
+ return;
+
+ old_value_str = "(unset)";
+ }
+
+ if (value) {
+ pa_proplist_set(i->proplist, key, value, nbytes);
+ new_value_str = "(data)";
+ } else {
+ pa_proplist_unset(i->proplist, key);
+ new_value_str = "(unset)";
+ }
+
+ if (PA_SINK_INPUT_IS_LINKED(i->state)) {
+ pa_log_debug("Sink input %u: proplist[%s]: %s -> %s", i->index, key, old_value_str, new_value_str);
+ pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_PROPLIST_CHANGED], i);
+ pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT | PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
+ }
+}
+
/* Called from main thread */
void pa_sink_input_update_proplist(pa_sink_input *i, pa_update_mode_t mode, pa_proplist *p) {
+ void *state;
+ const char *key;
+ const uint8_t *value;
+ size_t nbytes;
+
pa_sink_input_assert_ref(i);
+ pa_assert(p);
pa_assert_ctl_context();
- if (p)
- pa_proplist_update(i->proplist, mode, p);
+ switch (mode) {
+ case PA_UPDATE_SET: {
+ /* Delete everything that is not in p. */
+ for (state = NULL; (key = pa_proplist_iterate(i->proplist, &state));) {
+ if (!pa_proplist_contains(p, key))
+ pa_sink_input_set_property(i, key, NULL);
+ }
- if (PA_SINK_INPUT_IS_LINKED(i->state)) {
- pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_PROPLIST_CHANGED], i);
- pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
+ /* Fall through. */
+ }
+
+ case PA_UPDATE_REPLACE: {
+ for (state = NULL; (key = pa_proplist_iterate(p, &state));) {
+ pa_proplist_get(p, key, (const void **) &value, &nbytes);
+ pa_sink_input_set_property_arbitrary(i, key, value, nbytes);
+ }
+
+ break;
+ }
+
+ case PA_UPDATE_MERGE: {
+ for (state = NULL; (key = pa_proplist_iterate(p, &state));) {
+ if (pa_proplist_contains(i->proplist, key))
+ continue;
+
+ pa_proplist_get(p, key, (const void **) &value, &nbytes);
+ pa_sink_input_set_property_arbitrary(i, key, value, nbytes);
+ }
+
+ break;
+ }
}
}
@@ -1468,31 +1575,6 @@ int pa_sink_input_set_rate(pa_sink_input *i, uint32_t rate) {
}
/* Called from main context */
-void pa_sink_input_set_name(pa_sink_input *i, const char *name) {
- const char *old;
- pa_sink_input_assert_ref(i);
- pa_assert_ctl_context();
-
- if (!name && !pa_proplist_contains(i->proplist, PA_PROP_MEDIA_NAME))
- return;
-
- old = pa_proplist_gets(i->proplist, PA_PROP_MEDIA_NAME);
-
- if (old && name && pa_streq(old, name))
- return;
-
- if (name)
- pa_proplist_sets(i->proplist, PA_PROP_MEDIA_NAME, name);
- else
- pa_proplist_unset(i->proplist, PA_PROP_MEDIA_NAME);
-
- if (PA_SINK_INPUT_IS_LINKED(i->state)) {
- pa_hook_fire(&i->core->hooks[PA_CORE_HOOK_SINK_INPUT_PROPLIST_CHANGED], i);
- pa_subscription_post(i->core, PA_SUBSCRIPTION_EVENT_SINK_INPUT|PA_SUBSCRIPTION_EVENT_CHANGE, i->index);
- }
-}
-
-/* Called from main context */
pa_resample_method_t pa_sink_input_get_resample_method(pa_sink_input *i) {
pa_sink_input_assert_ref(i);
pa_assert_ctl_context();
@@ -1538,6 +1620,9 @@ bool pa_sink_input_may_move_to(pa_sink_input *i, pa_sink *dest) {
if (dest == i->sink)
return true;
+ if (dest->unlink_requested)
+ return false;
+
if (!pa_sink_input_may_move(i))
return false;
diff --git a/src/pulsecore/sink-input.h b/src/pulsecore/sink-input.h
index 86deab2..8bbee4e 100644
--- a/src/pulsecore/sink-input.h
+++ b/src/pulsecore/sink-input.h
@@ -335,8 +335,6 @@ int pa_sink_input_new(
void pa_sink_input_put(pa_sink_input *i);
void pa_sink_input_unlink(pa_sink_input* i);
-void pa_sink_input_set_name(pa_sink_input *i, const char *name);
-
pa_usec_t pa_sink_input_set_requested_latency(pa_sink_input *i, pa_usec_t usec);
/* Request that the specified number of bytes already written out to
@@ -373,6 +371,8 @@ pa_cvolume *pa_sink_input_get_volume(pa_sink_input *i, pa_cvolume *volume, bool
void pa_sink_input_set_mute(pa_sink_input *i, bool mute, bool save);
+void pa_sink_input_set_property(pa_sink_input *i, const char *key, const char *value);
+void pa_sink_input_set_property_arbitrary(pa_sink_input *i, const char *key, const uint8_t *value, size_t nbytes);
void pa_sink_input_update_proplist(pa_sink_input *i, pa_update_mode_t mode, pa_proplist *p);
pa_resample_method_t pa_sink_input_get_resample_method(pa_sink_input *i);
diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c
index 0b44fc7..3f1ef72 100644
--- a/src/pulsecore/sink.c
+++ b/src/pulsecore/sink.c
@@ -676,9 +676,10 @@ void pa_sink_unlink(pa_sink* s) {
* reversing pa_sink_put(). It also undoes the registrations
* already done in pa_sink_new()! */
- /* All operations here shall be idempotent, i.e. pa_sink_unlink()
- * may be called multiple times on the same sink without bad
- * effects. */
+ if (s->unlink_requested)
+ return;
+
+ s->unlink_requested = true;
linked = PA_SINK_IS_LINKED(s->state);
diff --git a/src/pulsecore/sink.h b/src/pulsecore/sink.h
index 5df109e..b64a666 100644
--- a/src/pulsecore/sink.h
+++ b/src/pulsecore/sink.h
@@ -63,6 +63,12 @@ struct pa_sink {
pa_core *core;
pa_sink_state_t state;
+
+ /* Set in the beginning of pa_sink_unlink() before setting the sink state
+ * to UNLINKED. The purpose is to prevent moving streams to a sink that is
+ * about to be removed. */
+ bool unlink_requested;
+
pa_sink_flags_t flags;
pa_suspend_cause_t suspend_cause;
diff --git a/src/pulsecore/source-output.c b/src/pulsecore/source-output.c
index c73c548..d74a60e 100644
--- a/src/pulsecore/source-output.c
+++ b/src/pulsecore/source-output.c
@@ -792,14 +792,14 @@ void pa_source_output_push(pa_source_output *o, const pa_memchunk *chunk) {
pa_volume_memchunk(&qchunk, &o->source->sample_spec, &o->thread_info.soft_volume);
}
- if (!o->thread_info.resampler) {
- if (nvfs) {
- pa_memchunk_make_writable(&qchunk, 0);
- pa_volume_memchunk(&qchunk, &o->thread_info.sample_spec, &o->volume_factor_source);
- }
+ if (nvfs) {
+ pa_memchunk_make_writable(&qchunk, 0);
+ pa_volume_memchunk(&qchunk, &o->source->sample_spec, &o->volume_factor_source);
+ }
+ if (!o->thread_info.resampler)
o->push(o, &qchunk);
- } else {
+ else {
pa_memchunk rchunk;
if (mbs == 0)
@@ -810,14 +810,8 @@ void pa_source_output_push(pa_source_output *o, const pa_memchunk *chunk) {
pa_resampler_run(o->thread_info.resampler, &qchunk, &rchunk);
- if (rchunk.length > 0) {
- if (nvfs) {
- pa_memchunk_make_writable(&rchunk, 0);
- pa_volume_memchunk(&rchunk, &o->thread_info.sample_spec, &o->volume_factor_source);
- }
-
+ if (rchunk.length > 0)
o->push(o, &rchunk);
- }
if (rchunk.memblock)
pa_memblock_unref(rchunk.memblock);
@@ -1084,17 +1078,124 @@ void pa_source_output_set_mute(pa_source_output *o, bool mute, bool save) {
pa_hook_fire(&o->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_MUTE_CHANGED], o);
}
+void pa_source_output_set_property(pa_source_output *o, const char *key, const char *value) {
+ char *old_value = NULL;
+ const char *new_value;
+
+ pa_assert(o);
+ pa_assert(key);
+
+ if (pa_proplist_contains(o->proplist, key)) {
+ old_value = pa_xstrdup(pa_proplist_gets(o->proplist, key));
+ if (old_value) {
+ if (pa_streq(value, old_value))
+ goto finish;
+ } else
+ old_value = pa_xstrdup("(data)");
+ } else {
+ if (!value)
+ goto finish;
+
+ old_value = pa_xstrdup("(unset)");
+ }
+
+ if (value) {
+ pa_proplist_sets(o->proplist, key, value);
+ new_value = value;
+ } else {
+ pa_proplist_unset(o->proplist, key);
+ new_value = "(unset)";
+ }
+
+ if (PA_SINK_INPUT_IS_LINKED(o->state)) {
+ pa_log_debug("Source output %u: proplist[%s]: %s -> %s", o->index, key, old_value, new_value);
+ pa_hook_fire(&o->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_PROPLIST_CHANGED], o);
+ pa_subscription_post(o->core, PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT | PA_SUBSCRIPTION_EVENT_CHANGE, o->index);
+ }
+
+finish:
+ pa_xfree(old_value);
+}
+
+void pa_source_output_set_property_arbitrary(pa_source_output *o, const char *key, const uint8_t *value, size_t nbytes) {
+ const uint8_t *old_value;
+ size_t old_nbytes;
+ const char *old_value_str;
+ const char *new_value_str;
+
+ pa_assert(o);
+ pa_assert(key);
+
+ if (pa_proplist_get(o->proplist, key, (const void **) &old_value, &old_nbytes) >= 0) {
+ if (value && nbytes == old_nbytes && !memcmp(value, old_value, nbytes))
+ return;
+
+ old_value_str = "(data)";
+
+ } else {
+ if (!value)
+ return;
+
+ old_value_str = "(unset)";
+ }
+
+ if (value) {
+ pa_proplist_set(o->proplist, key, value, nbytes);
+ new_value_str = "(data)";
+ } else {
+ pa_proplist_unset(o->proplist, key);
+ new_value_str = "(unset)";
+ }
+
+ if (PA_SOURCE_OUTPUT_IS_LINKED(o->state)) {
+ pa_log_debug("Source output %u: proplist[%s]: %s -> %s", o->index, key, old_value_str, new_value_str);
+ pa_hook_fire(&o->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_PROPLIST_CHANGED], o);
+ pa_subscription_post(o->core, PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT | PA_SUBSCRIPTION_EVENT_CHANGE, o->index);
+ }
+}
+
/* Called from main thread */
void pa_source_output_update_proplist(pa_source_output *o, pa_update_mode_t mode, pa_proplist *p) {
+ void *state;
+ const char *key;
+ const uint8_t *value;
+ size_t nbytes;
+
pa_source_output_assert_ref(o);
+ pa_assert(p);
pa_assert_ctl_context();
- if (p)
- pa_proplist_update(o->proplist, mode, p);
+ switch (mode) {
+ case PA_UPDATE_SET: {
+ /* Delete everything that is not in p. */
+ for (state = NULL; (key = pa_proplist_iterate(o->proplist, &state));) {
+ if (!pa_proplist_contains(p, key))
+ pa_source_output_set_property(o, key, NULL);
+ }
+
+ /* Fall through. */
+ }
- if (PA_SOURCE_OUTPUT_IS_LINKED(o->state)) {
- pa_hook_fire(&o->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_PROPLIST_CHANGED], o);
- pa_subscription_post(o->core, PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT|PA_SUBSCRIPTION_EVENT_CHANGE, o->index);
+ case PA_UPDATE_REPLACE: {
+ for (state = NULL; (key = pa_proplist_iterate(p, &state));) {
+ pa_proplist_get(p, key, (const void **) &value, &nbytes);
+ pa_source_output_set_property_arbitrary(o, key, value, nbytes);
+ }
+
+ break;
+ }
+
+ case PA_UPDATE_MERGE: {
+ for (state = NULL; (key = pa_proplist_iterate(p, &state));) {
+ if (pa_proplist_contains(o->proplist, key))
+ continue;
+
+ pa_proplist_get(p, key, (const void **) &value, &nbytes);
+ pa_source_output_set_property_arbitrary(o, key, value, nbytes);
+ }
+
+ break;
+ }
}
}
@@ -1126,31 +1227,6 @@ int pa_source_output_set_rate(pa_source_output *o, uint32_t rate) {
}
/* Called from main context */
-void pa_source_output_set_name(pa_source_output *o, const char *name) {
- const char *old;
- pa_assert_ctl_context();
- pa_source_output_assert_ref(o);
-
- if (!name && !pa_proplist_contains(o->proplist, PA_PROP_MEDIA_NAME))
- return;
-
- old = pa_proplist_gets(o->proplist, PA_PROP_MEDIA_NAME);
-
- if (old && name && pa_streq(old, name))
- return;
-
- if (name)
- pa_proplist_sets(o->proplist, PA_PROP_MEDIA_NAME, name);
- else
- pa_proplist_unset(o->proplist, PA_PROP_MEDIA_NAME);
-
- if (PA_SOURCE_OUTPUT_IS_LINKED(o->state)) {
- pa_hook_fire(&o->core->hooks[PA_CORE_HOOK_SOURCE_OUTPUT_PROPLIST_CHANGED], o);
- pa_subscription_post(o->core, PA_SUBSCRIPTION_EVENT_SOURCE_OUTPUT|PA_SUBSCRIPTION_EVENT_CHANGE, o->index);
- }
-}
-
-/* Called from main context */
pa_resample_method_t pa_source_output_get_resample_method(pa_source_output *o) {
pa_source_output_assert_ref(o);
pa_assert_ctl_context();
@@ -1193,6 +1269,9 @@ bool pa_source_output_may_move_to(pa_source_output *o, pa_source *dest) {
if (dest == o->source)
return true;
+ if (dest->unlink_requested)
+ return false;
+
if (!pa_source_output_may_move(o))
return false;
@@ -1250,6 +1329,9 @@ int pa_source_output_start_move(pa_source_output *o) {
pa_assert_se(pa_asyncmsgq_send(o->source->asyncmsgq, PA_MSGOBJECT(o->source), PA_SOURCE_MESSAGE_REMOVE_OUTPUT, o, 0, NULL) == 0);
pa_source_update_status(o->source);
+
+ pa_cvolume_remap(&o->volume_factor_source, &o->source->channel_map, &o->channel_map);
+
o->source = NULL;
pa_source_output_unref(o);
diff --git a/src/pulsecore/source-output.h b/src/pulsecore/source-output.h
index 26be484..7ac44bd 100644
--- a/src/pulsecore/source-output.h
+++ b/src/pulsecore/source-output.h
@@ -291,8 +291,6 @@ int pa_source_output_new(
void pa_source_output_put(pa_source_output *o);
void pa_source_output_unlink(pa_source_output*o);
-void pa_source_output_set_name(pa_source_output *o, const char *name);
-
pa_usec_t pa_source_output_set_requested_latency(pa_source_output *o, pa_usec_t usec);
void pa_source_output_cork(pa_source_output *o, bool b);
@@ -316,6 +314,8 @@ pa_cvolume *pa_source_output_get_volume(pa_source_output *o, pa_cvolume *volume,
void pa_source_output_set_mute(pa_source_output *o, bool mute, bool save);
+void pa_source_output_set_property(pa_source_output *o, const char *key, const char *value);
+void pa_source_output_set_property_arbitrary(pa_source_output *o, const char *key, const uint8_t *value, size_t nbytes);
void pa_source_output_update_proplist(pa_source_output *o, pa_update_mode_t mode, pa_proplist *p);
pa_resample_method_t pa_source_output_get_resample_method(pa_source_output *o);
diff --git a/src/pulsecore/source.c b/src/pulsecore/source.c
index f4b96ab..98374ae 100644
--- a/src/pulsecore/source.c
+++ b/src/pulsecore/source.c
@@ -618,6 +618,11 @@ void pa_source_unlink(pa_source *s) {
/* See pa_sink_unlink() for a couple of comments how this function
* works. */
+ if (s->unlink_requested)
+ return;
+
+ s->unlink_requested = true;
+
linked = PA_SOURCE_IS_LINKED(s->state);
if (linked)
diff --git a/src/pulsecore/source.h b/src/pulsecore/source.h
index 19fb41b..91e8674 100644
--- a/src/pulsecore/source.h
+++ b/src/pulsecore/source.h
@@ -64,6 +64,12 @@ struct pa_source {
pa_core *core;
pa_source_state_t state;
+
+ /* Set in the beginning of pa_source_unlink() before setting the source
+ * state to UNLINKED. The purpose is to prevent moving streams to a source
+ * that is about to be removed. */
+ bool unlink_requested;
+
pa_source_flags_t flags;
pa_suspend_cause_t suspend_cause;
diff --git a/src/tests/connect-stress.c b/src/tests/connect-stress.c
index 7c755e9..a243df9 100644
--- a/src/tests/connect-stress.c
+++ b/src/tests/connect-stress.c
@@ -63,7 +63,8 @@ static const pa_sample_spec sample_spec = {
static void context_state_callback(pa_context *c, void *userdata);
-static void connect(const char *name, int *try) {
+/* Note: don't conflict with connect(2) declaration */
+static void _connect(const char *name, int *try) {
int ret;
pa_mainloop_api *api;
@@ -80,14 +81,14 @@ static void connect(const char *name, int *try) {
/* Connect the context */
if (pa_context_connect(context, NULL, 0, NULL) < 0) {
fprintf(stderr, "pa_context_connect() failed.\n");
- fail();
+ ck_abort();
}
ret = pa_threaded_mainloop_start(mainloop);
fail_unless(ret == 0);
}
-static void disconnect(void) {
+static void _disconnect(void) {
int i;
fail_unless(mainloop != NULL);
@@ -144,7 +145,7 @@ static void stream_state_callback(pa_stream *s, void *userdata) {
default:
case PA_STREAM_FAILED:
fprintf(stderr, "Stream error: %s\n", pa_strerror(pa_context_errno(pa_stream_get_context(s))));
- fail();
+ ck_abort();
}
}
@@ -190,7 +191,7 @@ static void context_state_callback(pa_context *c, void *userdata) {
case PA_CONTEXT_FAILED:
default:
fprintf(stderr, "Context error: %s\n", pa_strerror(pa_context_errno(c)));
- fail();
+ ck_abort();
}
}
@@ -201,9 +202,9 @@ START_TEST (connect_stress_test) {
streams[i] = NULL;
for (i = 0; i < NTESTS; i++) {
- connect(bname, &i);
+ _connect(bname, &i);
usleep(rand() % 500000);
- disconnect();
+ _disconnect();
usleep(rand() % 500000);
}
diff --git a/src/tests/cpu-mix-test.c b/src/tests/cpu-mix-test.c
index f3bc0cc..a3189b7 100644
--- a/src/tests/cpu-mix-test.c
+++ b/src/tests/cpu-mix-test.c
@@ -76,7 +76,7 @@ static void run_mix_test(
samples_ref = out_ref + (8 - align);
nsamples = channels * (SAMPLES - (8 - align));
- fail_unless((pool = pa_mempool_new(false, 0)) != NULL, NULL);
+ fail_unless((pool = pa_mempool_new(PA_MEM_TYPE_PRIVATE, 0, true)) != NULL, NULL);
pa_random(samples0, nsamples * sizeof(int16_t));
c0.memblock = pa_memblock_new_fixed(pool, samples0, nsamples * sizeof(int16_t), false);
@@ -118,7 +118,7 @@ static void run_mix_test(
i,
samples[i], samples_ref[i],
samples0[i], samples1[i]);
- fail();
+ ck_abort();
}
}
}
@@ -142,7 +142,7 @@ static void run_mix_test(
pa_memblock_unref(c0.memblock);
pa_memblock_unref(c1.memblock);
- pa_mempool_free(pool);
+ pa_mempool_unref(pool);
}
START_TEST (mix_special_test) {
diff --git a/src/tests/cpu-remap-test.c b/src/tests/cpu-remap-test.c
index cfe8647..7af5e29 100644
--- a/src/tests/cpu-remap-test.c
+++ b/src/tests/cpu-remap-test.c
@@ -70,7 +70,7 @@ static void run_remap_test_float(
pa_log_debug("Correctness test failed: align=%d", align);
pa_log_debug("%d: %.24f != %.24f\n", i,
out[i], out_ref[i]);
- fail();
+ ck_abort();
}
}
}
@@ -123,7 +123,7 @@ static void run_remap_test_s16(
if (abs(out[i] - out_ref[i]) > 3) {
pa_log_debug("Correctness test failed: align=%d", align);
pa_log_debug("%d: %d != %d\n", i, out[i], out_ref[i]);
- fail();
+ ck_abort();
}
}
}
diff --git a/src/tests/cpu-sconv-test.c b/src/tests/cpu-sconv-test.c
index 2eb51de..3f189d1 100644
--- a/src/tests/cpu-sconv-test.c
+++ b/src/tests/cpu-sconv-test.c
@@ -65,7 +65,7 @@ static void run_conv_test_float_to_s16(
if (abs(samples[i] - samples_ref[i]) > 1) {
pa_log_debug("Correctness test failed: align=%d", align);
pa_log_debug("%d: %04hx != %04hx (%.24f)\n", i, samples[i], samples_ref[i], floats[i]);
- fail();
+ ck_abort();
}
}
}
@@ -115,7 +115,7 @@ static void run_conv_test_s16_to_float(
if (fabsf(floats[i] - floats_ref[i]) > 0.0001f) {
pa_log_debug("Correctness test failed: align=%d", align);
pa_log_debug("%d: %.24f != %.24f (%d)\n", i, floats[i], floats_ref[i], samples[i]);
- fail();
+ ck_abort();
}
}
}
diff --git a/src/tests/cpu-volume-test.c b/src/tests/cpu-volume-test.c
index 01ac2fc..15f0658 100644
--- a/src/tests/cpu-volume-test.c
+++ b/src/tests/cpu-volume-test.c
@@ -78,7 +78,7 @@ static void run_volume_test(
pa_log_debug("Correctness test failed: align=%d, channels=%d", align, channels);
pa_log_debug("%d: %04hx != %04hx (%04hx * %08x)\n", i, samples[i], samples_ref[i],
samples_orig[i], volumes[i % channels]);
- fail();
+ ck_abort();
}
}
}
diff --git a/src/tests/cpulimit-test.c b/src/tests/cpulimit-test.c
index 3a8124f..e01a5b8 100644
--- a/src/tests/cpulimit-test.c
+++ b/src/tests/cpulimit-test.c
@@ -48,7 +48,7 @@ static void func(pa_mainloop_api *m, pa_signal_event *e, int sig, void *userdata
if ((now - start) >= 30) {
m->quit(m, 1);
fprintf(stderr, "Test failed\n");
- fail();
+ ck_abort();
} else
raise(SIGUSR1);
}
@@ -78,7 +78,7 @@ START_TEST (cpulimit_test) {
if ((now - start) >= 30) {
fprintf(stderr, "Test failed\n");
- fail();
+ ck_abort();
break;
}
}
diff --git a/src/tests/extended-test.c b/src/tests/extended-test.c
index ee766b8..0d08fac 100644
--- a/src/tests/extended-test.c
+++ b/src/tests/extended-test.c
@@ -100,7 +100,7 @@ static void stream_state_callback(pa_stream *s, void *userdata) {
default:
case PA_STREAM_FAILED:
fprintf(stderr, "Stream error: %s\n", pa_strerror(pa_context_errno(pa_stream_get_context(s))));
- fail();
+ ck_abort();
}
}
@@ -151,7 +151,7 @@ static void context_state_callback(pa_context *c, void *userdata) {
case PA_CONTEXT_FAILED:
default:
fprintf(stderr, "Context error: %s\n", pa_strerror(pa_context_errno(c)));
- fail();
+ ck_abort();
}
}
diff --git a/src/tests/get-binary-name-test.c b/src/tests/get-binary-name-test.c
index 4c855bb..cd53bde 100644
--- a/src/tests/get-binary-name-test.c
+++ b/src/tests/get-binary-name-test.c
@@ -39,7 +39,7 @@ START_TEST (getbinaryname_test) {
if (!pa_get_binary_name(exename, allocated)) {
pa_log_error("failed to read binary name");
pa_xfree(exename);
- fail();
+ ck_abort();
}
if (strlen(exename) < allocated - 1) {
diff --git a/src/tests/interpol-test.c b/src/tests/interpol-test.c
index 7a7bffc..b4cf18c 100644
--- a/src/tests/interpol-test.c
+++ b/src/tests/interpol-test.c
@@ -144,7 +144,7 @@ static void context_state_callback(pa_context *c, void *userdata) {
case PA_CONTEXT_FAILED:
default:
pa_log_error("Context error: %s", pa_strerror(pa_context_errno(c)));
- fail();
+ ck_abort();
}
}
diff --git a/src/tests/lfe-filter-test.c b/src/tests/lfe-filter-test.c
index 389a2b9..ba63895 100644
--- a/src/tests/lfe-filter-test.c
+++ b/src/tests/lfe-filter-test.c
@@ -136,7 +136,7 @@ START_TEST (lfe_filter_test) {
a.format = PA_SAMPLE_S16NE;
lft.ss = &a;
- pa_assert_se(lft.pool = pa_mempool_new(false, 0));
+ pa_assert_se(lft.pool = pa_mempool_new(PA_MEM_TYPE_PRIVATE, 0, true));
/* We prepare pseudo-random input audio samples for lfe-filter rewind testing*/
ori_sample_ptr = pa_xmalloc(pa_frame_size(lft.ss) * TOTAL_SAMPLES);
@@ -163,7 +163,7 @@ START_TEST (lfe_filter_test) {
pa_lfe_filter_free(lft.lf);
- pa_mempool_free(lft.pool);
+ pa_mempool_unref(lft.pool);
if (!ret)
pa_log_debug("lfe-filter-test: tests for both rewind to block boundary and rewind to middle position of a block passed!");
diff --git a/src/tests/mcalign-test.c b/src/tests/mcalign-test.c
index 0d27dfd..3127ccf 100644
--- a/src/tests/mcalign-test.c
+++ b/src/tests/mcalign-test.c
@@ -36,7 +36,7 @@ int main(int argc, char *argv[]) {
pa_mcalign *a;
pa_memchunk c;
- p = pa_mempool_new(false, 0);
+ p = pa_mempool_new(PA_MEM_TYPE_PRIVATE, 0, true);
a = pa_mcalign_new(11);
@@ -100,7 +100,7 @@ int main(int argc, char *argv[]) {
if (c.memblock)
pa_memblock_unref(c.memblock);
- pa_mempool_free(p);
+ pa_mempool_unref(p);
return 0;
}
diff --git a/src/tests/memblock-test.c b/src/tests/memblock-test.c
index 2b51108..d48349f 100644
--- a/src/tests/memblock-test.c
+++ b/src/tests/memblock-test.c
@@ -74,17 +74,18 @@ START_TEST (memblock_test) {
pa_memblock *mb_a, *mb_b, *mb_c;
int r, i;
pa_memblock* blocks[5];
+ pa_mem_type_t mem_type;
uint32_t id, shm_id;
size_t offset, size;
char *x;
const char txt[] = "This is a test!";
- pool_a = pa_mempool_new(true, 0);
+ pool_a = pa_mempool_new(PA_MEM_TYPE_SHARED_POSIX, 0, true);
fail_unless(pool_a != NULL);
- pool_b = pa_mempool_new(true, 0);
+ pool_b = pa_mempool_new(PA_MEM_TYPE_SHARED_POSIX, 0, true);
fail_unless(pool_b != NULL);
- pool_c = pa_mempool_new(true, 0);
+ pool_c = pa_mempool_new(PA_MEM_TYPE_SHARED_POSIX, 0, true);
fail_unless(pool_c != NULL);
pa_mempool_get_shm_id(pool_a, &id_a);
@@ -122,22 +123,22 @@ START_TEST (memblock_test) {
import_c = pa_memimport_new(pool_c, release_cb, (void*) "C");
fail_unless(import_b != NULL);
- r = pa_memexport_put(export_a, mb_a, &id, &shm_id, &offset, &size);
+ r = pa_memexport_put(export_a, mb_a, &mem_type, &id, &shm_id, &offset, &size);
fail_unless(r >= 0);
fail_unless(shm_id == id_a);
pa_log("A: Memory block exported as %u", id);
- mb_b = pa_memimport_get(import_b, id, shm_id, offset, size, false);
+ mb_b = pa_memimport_get(import_b, PA_MEM_TYPE_SHARED_POSIX, id, shm_id, offset, size, false);
fail_unless(mb_b != NULL);
- r = pa_memexport_put(export_b, mb_b, &id, &shm_id, &offset, &size);
+ r = pa_memexport_put(export_b, mb_b, &mem_type, &id, &shm_id, &offset, &size);
fail_unless(r >= 0);
fail_unless(shm_id == id_a || shm_id == id_b);
pa_memblock_unref(mb_b);
pa_log("B: Memory block exported as %u", id);
- mb_c = pa_memimport_get(import_c, id, shm_id, offset, size, false);
+ mb_c = pa_memimport_get(import_c, PA_MEM_TYPE_SHARED_POSIX, id, shm_id, offset, size, false);
fail_unless(mb_c != NULL);
x = pa_memblock_acquire(mb_c);
pa_log_debug("1 data=%s", x);
@@ -169,9 +170,9 @@ START_TEST (memblock_test) {
pa_log("vacuuming done...");
- pa_mempool_free(pool_a);
- pa_mempool_free(pool_b);
- pa_mempool_free(pool_c);
+ pa_mempool_unref(pool_a);
+ pa_mempool_unref(pool_b);
+ pa_mempool_unref(pool_c);
}
END_TEST
diff --git a/src/tests/memblockq-test.c b/src/tests/memblockq-test.c
index eea6cfa..2404ee2 100644
--- a/src/tests/memblockq-test.c
+++ b/src/tests/memblockq-test.c
@@ -108,7 +108,7 @@ START_TEST (memblockq_test) {
pa_log_set_level(PA_LOG_DEBUG);
- p = pa_mempool_new(false, 0);
+ p = pa_mempool_new(PA_MEM_TYPE_PRIVATE, 0, true);
silence.memblock = pa_memblock_new_fixed(p, (char*) "__", 2, 1);
fail_unless(silence.memblock != NULL);
@@ -208,7 +208,7 @@ START_TEST (memblockq_test) {
pa_memblock_unref(chunk3.memblock);
pa_memblock_unref(chunk4.memblock);
- pa_mempool_free(p);
+ pa_mempool_unref(p);
}
END_TEST
diff --git a/src/tests/mix-test.c b/src/tests/mix-test.c
index c8af600..972f5d7 100644
--- a/src/tests/mix-test.c
+++ b/src/tests/mix-test.c
@@ -286,7 +286,7 @@ START_TEST (mix_test) {
if (!getenv("MAKE_CHECK"))
pa_log_set_level(PA_LOG_DEBUG);
- fail_unless((pool = pa_mempool_new(false, 0)) != NULL, NULL);
+ fail_unless((pool = pa_mempool_new(PA_MEM_TYPE_PRIVATE, 0, true)) != NULL, NULL);
a.channels = 1;
a.rate = 44100;
@@ -338,7 +338,7 @@ START_TEST (mix_test) {
pa_memblock_unref(k.memblock);
}
- pa_mempool_free(pool);
+ pa_mempool_unref(pool);
}
END_TEST
diff --git a/src/tests/mult-s16-test.c b/src/tests/mult-s16-test.c
index 7340d85..91740c2 100644
--- a/src/tests/mult-s16-test.c
+++ b/src/tests/mult-s16-test.c
@@ -65,7 +65,7 @@ START_TEST (mult_s16_test) {
if (a != b) {
pa_log_debug("%d: %d != %d", i, a, b);
- fail();
+ ck_abort();
}
}
diff --git a/src/tests/remix-test.c b/src/tests/remix-test.c
index 6feb8dc..e21c109 100644
--- a/src/tests/remix-test.c
+++ b/src/tests/remix-test.c
@@ -51,7 +51,7 @@ int main(int argc, char *argv[]) {
pa_log_set_level(PA_LOG_DEBUG);
- pa_assert_se(pool = pa_mempool_new(false, 0));
+ pa_assert_se(pool = pa_mempool_new(PA_MEM_TYPE_PRIVATE, 0, true));
for (i = 0; maps[i].channels > 0; i++)
for (j = 0; maps[j].channels > 0; j++) {
@@ -75,7 +75,7 @@ int main(int argc, char *argv[]) {
pa_resampler_free(r);
}
- pa_mempool_free(pool);
+ pa_mempool_unref(pool);
return 0;
}
diff --git a/src/tests/resampler-test.c b/src/tests/resampler-test.c
index 9832a31..40000d5 100644
--- a/src/tests/resampler-test.c
+++ b/src/tests/resampler-test.c
@@ -252,26 +252,26 @@ static pa_memblock* generate_block(pa_mempool *pool, const pa_sample_spec *ss) {
}
static void help(const char *argv0) {
- printf(_("%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"),
- argv0);
+ printf("%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",
+ argv0);
}
enum {
@@ -350,7 +350,7 @@ int main(int argc, char *argv[]) {
break;
case ARG_VERSION:
- printf(_("%s %s\n"), argv[0], PACKAGE_VERSION);
+ printf("%s %s\n", argv[0], PACKAGE_VERSION);
ret = 0;
goto quit;
@@ -404,7 +404,7 @@ int main(int argc, char *argv[]) {
}
ret = 0;
- pa_assert_se(pool = pa_mempool_new(false, 0));
+ pa_assert_se(pool = pa_mempool_new(PA_MEM_TYPE_PRIVATE, 0, true));
if (!all_formats) {
@@ -473,7 +473,7 @@ int main(int argc, char *argv[]) {
quit:
if (pool)
- pa_mempool_free(pool);
+ pa_mempool_unref(pool);
return ret;
}
diff --git a/src/tests/srbchannel-test.c b/src/tests/srbchannel-test.c
index cd4d397..0e7b0ce 100644
--- a/src/tests/srbchannel-test.c
+++ b/src/tests/srbchannel-test.c
@@ -34,7 +34,7 @@ static unsigned packets_received;
static unsigned packets_checksum;
static size_t packets_length;
-static void packet_received(pa_pstream *p, pa_packet *packet, const pa_cmsg_ancil_data *ancil_data, void *userdata) {
+static void packet_received(pa_pstream *p, pa_packet *packet, pa_cmsg_ancil_data *ancil_data, void *userdata) {
const uint8_t *pdata;
size_t plen;
unsigned i;
@@ -85,7 +85,7 @@ START_TEST (srbchannel_test) {
int pipefd[4];
pa_mainloop *ml = pa_mainloop_new();
- pa_mempool *mp = pa_mempool_new(true, 0);
+ pa_mempool *mp = pa_mempool_new(PA_MEM_TYPE_SHARED_POSIX, 0, true);
pa_iochannel *io1, *io2;
pa_pstream *p1, *p2;
pa_srbchannel *sr1, *sr2;
@@ -116,7 +116,7 @@ START_TEST (srbchannel_test) {
pa_pstream_unref(p1);
pa_pstream_unref(p2);
- pa_mempool_free(mp);
+ pa_mempool_unref(mp);
pa_mainloop_free(ml);
}
END_TEST
diff --git a/src/tests/sync-playback.c b/src/tests/sync-playback.c
index f06b459..9ef038c 100644
--- a/src/tests/sync-playback.c
+++ b/src/tests/sync-playback.c
@@ -106,7 +106,7 @@ static void stream_state_callback(pa_stream *s, void *userdata) {
default:
case PA_STREAM_FAILED:
fprintf(stderr, "Stream error: %s\n", pa_strerror(pa_context_errno(pa_stream_get_context(s))));
- fail();
+ ck_abort();
}
}
@@ -148,7 +148,7 @@ static void context_state_callback(pa_context *c, void *userdata) {
case PA_CONTEXT_FAILED:
default:
fprintf(stderr, "Context error: %s\n", pa_strerror(pa_context_errno(c)));
- fail();
+ ck_abort();
}
}
diff --git a/src/utils/padsp.c b/src/utils/padsp.c
index 5e336bb..943479b 100644
--- a/src/utils/padsp.c
+++ b/src/utils/padsp.c
@@ -2278,6 +2278,7 @@ static int dsp_ioctl(fd_info *i, unsigned long request, void*argp, int *_errno)
break;
}
+#if HAVE_DECL_SOUND_PCM_READ_RATE
case SOUND_PCM_READ_RATE:
debug(DEBUG_LEVEL_NORMAL, __FILE__": SOUND_PCM_READ_RATE\n");
@@ -2285,7 +2286,9 @@ static int dsp_ioctl(fd_info *i, unsigned long request, void*argp, int *_errno)
*(int*) argp = i->sample_spec.rate;
pa_threaded_mainloop_unlock(i->mainloop);
break;
+#endif
+#if HAVE_DECL_SOUND_PCM_READ_CHANNELS
case SOUND_PCM_READ_CHANNELS:
debug(DEBUG_LEVEL_NORMAL, __FILE__": SOUND_PCM_READ_CHANNELS\n");
@@ -2293,7 +2296,9 @@ static int dsp_ioctl(fd_info *i, unsigned long request, void*argp, int *_errno)
*(int*) argp = i->sample_spec.channels;
pa_threaded_mainloop_unlock(i->mainloop);
break;
+#endif
+#if HAVE_DECL_SOUND_PCM_READ_BITS
case SOUND_PCM_READ_BITS:
debug(DEBUG_LEVEL_NORMAL, __FILE__": SOUND_PCM_READ_BITS\n");
@@ -2301,6 +2306,7 @@ static int dsp_ioctl(fd_info *i, unsigned long request, void*argp, int *_errno)
*(int*) argp = pa_sample_size(&i->sample_spec)*8;
pa_threaded_mainloop_unlock(i->mainloop);
break;
+#endif
case SNDCTL_DSP_GETOPTR: {
count_info *info;
diff --git a/vala/libpulse.vapi b/vala/libpulse.vapi
index 345e284..207cedf 100644
--- a/vala/libpulse.vapi
+++ b/vala/libpulse.vapi
@@ -956,20 +956,35 @@ namespace PulseAudio {
TYPE_MASK
}
+ [CCode (cname = "pa_context_notify_cb_t")]
public delegate void NotifyCb(Context c);
+ [CCode (cname = "pa_context_success_cb_t")]
public delegate void SuccessCb(Context c, int success);
+ [CCode (cname = "pa_context_event_cb_t")]
public delegate void EventCb(Context c, string name, Proplist? proplist);
+ [CCode (cname = "pa_context_subscribe_cb_t")]
public delegate void SubscribeCb(Context c, SubscriptionEventType t, uint32 idx);
+ [CCode (cname = "pa_sink_info_cb_t")]
public delegate void SinkInfoCb(Context c, SinkInfo? i, int eol);
+ [CCode (cname = "pa_source_info_cb_t")]
public delegate void SourceInfoCb(Context c, SourceInfo? i, int eol);
+ [CCode (cname = "pa_card_info_cb_t")]
public delegate void CardInfoCb(Context c, CardInfo? i, int eol);
+ [CCode (cname = "pa_sink_input_info_cb_t")]
public delegate void SinkInputInfoCb(Context c, SinkInputInfo? i, int eol);
+ [CCode (cname = "pa_source_output_info_cb_t")]
public delegate void SourceOutputInfoCb(Context c, SourceOutputInfo? i, int eol);
+ [CCode (cname = "pa_server_info_cb_t")]
public delegate void ServerInfoCb(Context c, ServerInfo? i);
+ [CCode (cname = "pa_stat_info_cb_t")]
public delegate void StatInfoCb(Context c, ServerInfo? i);
+ [CCode (cname = "pa_module_info_cb_t")]
public delegate void ModuleInfoCb(Context c, ModuleInfo? i, int eol);
+ [CCode (cname = "pa_client_info_cb_t")]
public delegate void ClientInfoCb(Context c, ClientInfo? i, int eol);
+ [CCode (cname = "pa_sample_info_cb_t")]
public delegate void SampleInfoCb(Context c, SampleInfo? i, int eol);
+ [CCode (cname = "pa_context_index_cb_t")]
public delegate void IndexCb(Context c, uint32 idx);
[CCode (cname="pa_context_new_with_proplist")]
--
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