[pulseaudio-commits] [SCM] PulseAudio Sound Server branch, master-tx, updated. v0.9.15-test2-87-g6aa110a

Lennart Poettering gitmailer-noreply at 0pointer.de
Thu Feb 19 18:26:58 PST 2009


This is an automated email from the git hooks/post-receive script. It was
generated because of a push to the "PulseAudio Sound Server" repository.

The master-tx branch has been updated
      from  aae5b15ef7a7a910dd9b8ad77a66dad56a35c4ac (commit)

- Log -----------------------------------------------------------------
6aa110a... run make update-po
3da3ea2... Merge commit 'origin/master-tx'
7bc1847... Merge branch 'master' of ssh://rootserver/home/lennart/git/public/pulseaudio
26a270a... big alsa module rework to make things more robust to broken sound drivers and make it easier to debug them
adc9c2d... fix comment
fa2e07a... add test tool for debugging broken timing in sound drivers
9f813dd... Make sure we actually call _() for translating profile names
ef189d5... make it easier to debug timing related problems
fdca6ed... make profile names translatable
d69bd03... don't try to use weakref stuff on older compilers that don't really support it
2e250aa... Merge commit '38ded3bb31bc49664641965f856a35f432a8a956'
b0c0106... Merge commit 'elmarco/legacy-dir'
7c78c3f... alsa-util: check if mixer_poll_descriptors_count() < 0
800489e... pulsecore: don't leak p when make_random_dir_and_link()
f1dcbe0... pulsecore: don't leak d in case of error
4722fec... rtp: remove unused variable a
88fc458... protocol-native: don't leak a proplist
0684b23... stream-resotre: don't leak a name
c0cf22d... protocol-esound: don't accept a request of PROTOCOL_MAX
2c6abb8... daemon-conf: make sure c->log_level < LEVEL_MAX
4f1380b... pulsecore: use r returned from fgets()
204083c... pulsecore: unused variable e in hashmap_put()
60d53c6... tests/ipacl-test: check inet_pton()
bb52a67... padsp: don't use si if it's NULL
d1306e3... pulsecore: fix check for cb (m is already checked before)
67b0bae... pacat: remove unused variable
4512a2c... rtp-recv: remove unused variable assignment
927e501... pulsecore: remove unused variable from cli_command_load()
a252b61... main: remove unused lf variable
c3eb908... pactl: return in case of error reading file (avoid using freed d)
25bbea6... tests/thread-mainloop-test: check if threaded_mainloop_start() succeed
5ea7dac... tests/interpol-test: check if mainloop_start() succeed
a836927... tests/sync-playback: check if pa_context_connect succeed
93ed27d... pactl: check if pa_context_connect succeed
2aeab75... paplay: check if pa_context_connect() succeed
6c8d851... protocol-native: fix get_info() for cards
01f81d6... card-restore: it's not useful to check an array, let's check the length
ee0b5f7... log: don't leak bt
83cdcf2... alsa-util: make sure we check an initialized cn variable
7737b10... hal-detect: make sure r is initialized, so we don't take random path
7d16dcb... dbus-util: avoid double free
205b0ba... split out mixer setup into seperate functions to make things more readable
e1608d5... modernize pa_msleep() a bit
9cbdd3a... add pa_timespec_load
45218aa... make interpol-test useful for recording as well
5f5396b... additional validity check
928920c... additional validity check
7f8ccf9... handle both positive and negative errno's
6db3073... export card information for sinks/sources and number of sinks/sources a profile would create to clients
7b8bed3... introduce pa_realpath()
d85ef71... export pa_match()
be81a68... if we fail to import a memblock fill in silence to guarantee stability of timing
1737a19... allow importing of more memory blocks than exporting
07333f8... refer folks to the ALSA devs, not us
dc1ad08... minor optimizations
ff58fa8... simplify pa_alsa_init_proplist_pcm() a bit and include resolution bits in alsa device props
c9c63c2... allow pa to be run in a chroot() environment tht lacks /proc
c1892f2... bump required alsa version
05b7440... pulse/context: add --enable-legacy-runtime-dir
38ded3b... bluetooth: print SBC encoder implementation info
b4c391e... bluetooth: don't crash on pa_thread_mq_done() if pa_init() fail
b51e613... bluetooth: update SBC from upstream
0b8a6c6... bluetooth: fix message queue/rtpoll
a571565... don't open the alsa devices in hw:xxx mode
6790c03... unify ALSA mixer initialization
023998e... add doxygen comment for PA_GCC_WEAKREF
d447a8d... document all currently known properties
dc590c7... Optionally disable IPv6
9334d90... show whether gtk+ support is enabled after configure
fffe0ba... ignore gtk-test
e954a89... properly read icon/application name/display from gtk/glib/gdk
f863756... make PULSE_PROP env vars non-overriding but introduce PULSE_PROP_OVERRIDE for allowing overriding
689e6f8... add definition for GCC style weak references
44bca66... make PA_GCC_PACKED and PA_GCC_MALLOC actually work
c0fb91d... drop check for PA_PROP_APPLICATION_NAME since often enough we can deduce this better from g_get_application_name()
15e9b96... we reinit proplist since the server will copy from client proplist anyway
62818b8... fix aiff channel mapping for 6 channels
433751f... add a module that forwards cork/uncork requests to X11 as fake pause/resume key events
4fab9bf... add full set of argument description
6bb3dc8... don't try to recycle rtpoll objects
87e1342... don't claim that profile changes are always successful
52bfd47... use the same service fd shutdown logic when destructing module and changing profile
b18c875... minor service IO fixes
d9e3aba... the service fd is a stream socket, so handle things accordingly
-----------------------------------------------------------------------

Summary of changes:
 configure.ac                                    |   84 ++-
 po/ca.po                                        | 1163 ++++++++++++++---------
 po/cs.po                                        |  271 ++++--
 po/de.po                                        |  615 ++++++++-----
 po/el.po                                        |  271 ++++--
 po/es.po                                        |  271 ++++--
 po/fi.po                                        |  271 ++++--
 po/fr.po                                        |  271 ++++--
 po/pl.po                                        |  277 ++++--
 po/pt_BR.po                                     |  271 ++++--
 po/sv.po                                        |  271 ++++--
 po/zh_CN.po                                     |  271 ++++--
 src/.gitignore                                  |    1 +
 src/Makefile.am                                 |   36 +-
 src/daemon/daemon-conf.c                        |    2 +-
 src/daemon/main.c                               |   11 +-
 src/daemon/start-pulseaudio-x11.in              |    1 +
 src/modules/alsa/alsa-sink.c                    |  574 ++++++------
 src/modules/alsa/alsa-source.c                  |  532 ++++++-----
 src/modules/alsa/alsa-util.c                    |  185 +++-
 src/modules/alsa/alsa-util.h                    |    8 +-
 src/modules/alsa/module-alsa-card.c             |   10 +-
 src/modules/bluetooth/module-bluetooth-device.c |  169 ++--
 src/modules/bluetooth/sbc.c                     |   18 +-
 src/modules/bluetooth/sbc.h                     |    1 +
 src/modules/bluetooth/sbc_primitives.c          |    1 +
 src/modules/bluetooth/sbc_primitives.h          |    1 +
 src/modules/bluetooth/sbc_primitives_mmx.c      |    1 +
 src/modules/bluetooth/sbc_primitives_neon.c     |    1 +
 src/modules/dbus-util.c                         |    3 +-
 src/modules/module-card-restore.c               |    6 +-
 src/modules/module-detect.c                     |    2 +-
 src/modules/module-device-restore.c             |    4 +-
 src/modules/module-hal-detect.c                 |    1 +
 src/modules/module-protocol-stub.c              |   18 +
 src/modules/module-stream-restore.c             |    6 +-
 src/modules/module-x11-cork-request.c           |  189 ++++
 src/modules/module-x11-publish.c                |    6 +-
 src/modules/rtp/module-rtp-recv.c               |   20 +-
 src/modules/rtp/module-rtp-send.c               |   45 +-
 src/modules/rtp/sap.c                           |   17 +-
 src/modules/rtp/sdp.c                           |   13 +-
 src/pulse/channelmap.c                          |    4 +-
 src/pulse/context.c                             |   22 +-
 src/pulse/gccmacro.h                            |   11 +-
 src/pulse/introspect.c                          |   12 +-
 src/pulse/introspect.h                          |    4 +
 src/pulse/proplist.h                            |  171 +++--
 src/pulse/scache.c                              |    4 +-
 src/pulse/util.c                                |    6 +-
 src/pulsecore/asyncmsgq.c                       |   10 +-
 src/pulsecore/card.c                            |    2 +-
 src/pulsecore/cli-command.c                     |    3 +-
 src/pulsecore/core-error.c                      |    3 +
 src/pulsecore/core-util.c                       |   35 +-
 src/pulsecore/core-util.h                       |    4 +
 src/pulsecore/hashmap.c                         |    2 +-
 src/pulsecore/inet_ntop.c                       |    4 +
 src/pulsecore/inet_pton.c                       |    4 +
 src/pulsecore/ipacl.c                           |   12 +
 src/pulsecore/log.c                             |    1 +
 src/pulsecore/memblock.c                        |    2 +-
 src/pulsecore/proplist-util.c                   |  103 ++-
 src/pulsecore/protocol-esound.c                 |    2 +-
 src/pulsecore/protocol-native.c                 |   62 +-
 src/pulsecore/pstream.c                         |    9 +-
 src/pulsecore/rtclock.c                         |    8 +
 src/pulsecore/rtclock.h                         |    2 +
 src/pulsecore/rtpoll.c                          |   51 +-
 src/pulsecore/shm.c                             |    4 +-
 src/pulsecore/sink.c                            |    3 +
 src/pulsecore/socket-client.c                   |   18 +-
 src/pulsecore/socket-client.h                   |    2 +
 src/pulsecore/socket-server.c                   |   10 +
 src/pulsecore/socket-server.h                   |    8 +-
 src/pulsecore/socket-util.c                     |    8 +
 src/pulsecore/source.c                          |    3 +
 src/tests/alsa-time-test.c                      |  200 ++++
 src/tests/gtk-test.c                            |   62 ++
 src/tests/interpol-test.c                       |   38 +-
 src/tests/ipacl-test.c                          |    7 +-
 src/tests/sync-playback.c                       |    7 +-
 src/tests/thread-mainloop-test.c                |    2 +-
 src/utils/pacat.c                               |    3 +-
 src/utils/pactl.c                               |    6 +-
 src/utils/padsp.c                               |    4 +-
 src/utils/paplay.c                              |    5 +-
 87 files changed, 4618 insertions(+), 2514 deletions(-)
 create mode 100644 src/modules/module-x11-cork-request.c
 create mode 100644 src/tests/alsa-time-test.c
 create mode 100644 src/tests/gtk-test.c

-----------------------------------------------------------------------

commit d9e3abaf83ab2cf28ff6929495880cde0d9a933b
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Feb 12 21:45:17 2009 +0100

    the service fd is a stream socket, so handle things accordingly

diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c
index b04834d..294fc66 100644
--- a/src/modules/bluetooth/module-bluetooth-device.c
+++ b/src/modules/bluetooth/module-bluetooth-device.c
@@ -154,17 +154,19 @@ struct userdata {
 
     pa_bluetooth_device *device;
 
-    int write_type, read_type;
+    int stream_write_type, stream_read_type;
+    int service_write_type, service_read_type;
 };
 
 static int init_bt(struct userdata *u);
 static int init_profile(struct userdata *u);
 
-static int service_send(int fd, const bt_audio_msg_header_t *msg) {
+static int service_send(struct userdata *u, const bt_audio_msg_header_t *msg) {
     size_t length;
     ssize_t r;
 
-    pa_assert(fd >= 0);
+    pa_assert(u);
+    pa_assert(u->service_fd >= 0);
     pa_assert(msg);
 
     length = msg->length ? msg->length : BT_SUGGESTED_BUFFER_SIZE;
@@ -173,52 +175,59 @@ static int service_send(int fd, const bt_audio_msg_header_t *msg) {
                  pa_strnull(bt_audio_strtype(msg->type)),
                  pa_strnull(bt_audio_strname(msg->name)));
 
-    if ((r = send(fd, msg, length, 0)) == (ssize_t) length)
+    if ((r = pa_loop_write(u->service_fd, msg, length, &u->service_write_type)) == (ssize_t) length)
         return 0;
 
     if (r < 0)
         pa_log_error("Error sending data to audio service: %s", pa_cstrerror(errno));
     else
-        pa_log_error("Short send()");
+        pa_log_error("Short write()");
 
     return -1;
 }
 
-static int service_recv(int fd, bt_audio_msg_header_t *msg, size_t expected_length) {
-    size_t length;
+static int service_recv(struct userdata *u, bt_audio_msg_header_t *msg, size_t room) {
     ssize_t r;
 
-    pa_assert(fd >= 0);
+    pa_assert(u);
+    pa_assert(u->service_fd >= 0);
     pa_assert(msg);
 
-    length = expected_length ? expected_length : BT_SUGGESTED_BUFFER_SIZE;
-
-    if (length < sizeof(bt_audio_error_t))
-        length = sizeof(bt_audio_error_t);
+    if (room <= 0)
+        room = BT_SUGGESTED_BUFFER_SIZE;
 
     pa_log_debug("Trying to receive message from audio service...");
 
-    r = recv(fd, msg, length, 0);
+    /* First, read the header */
+    if ((r = pa_loop_read(u->service_fd, msg, sizeof(*msg), &u->service_read_type)) != sizeof(*msg))
+        goto read_fail;
 
-    if (r > 0 && (r == (ssize_t) length || expected_length <= 0)) {
+    if (msg->length < sizeof(*msg)) {
+        pa_log_error("Invalid message size.");
+        return -1;
+    }
 
-        if ((size_t) r < sizeof(*msg)) {
-            pa_log_error("Packet read too small.");
-            return -1;
-        }
+    /* Second, read the payload */
+    if (msg->length > sizeof(*msg)) {
 
-        if (r != msg->length) {
-            pa_log_error("Size read doesn't match header size.");
-            return -1;
-        }
+        size_t remains = msg->length - sizeof(*msg);
 
-        pa_log_debug("Received %s <- %s",
-                     pa_strnull(bt_audio_strtype(msg->type)),
-                     pa_strnull(bt_audio_strname(msg->name)));
+        if ((r = pa_loop_read(u->service_fd,
+                              (uint8_t*) msg + sizeof(*msg),
+                              remains,
+                              &u->service_read_type)) != (ssize_t) remains)
+            goto read_fail;
 
-        return 0;
     }
 
+    pa_log_debug("Received %s <- %s",
+                 pa_strnull(bt_audio_strtype(msg->type)),
+                 pa_strnull(bt_audio_strname(msg->name)));
+
+    return 0;
+
+read_fail:
+
     if (r < 0)
         pa_log_error("Error receiving data from audio service: %s", pa_cstrerror(errno));
     else
@@ -227,16 +236,19 @@ static int service_recv(int fd, bt_audio_msg_header_t *msg, size_t expected_leng
     return -1;
 }
 
-static ssize_t service_expect(int fd, bt_audio_msg_header_t *rsp, uint8_t expected_name, size_t expected_length) {
+static ssize_t service_expect(struct userdata*u, bt_audio_msg_header_t *rsp, size_t room, uint8_t expected_name, size_t expected_size) {
     int r;
 
-    pa_assert(fd >= 0);
+    pa_assert(u);
+    pa_assert(u->service_fd >= 0);
     pa_assert(rsp);
 
-    if ((r = service_recv(fd, rsp, expected_length)) < 0)
+    if ((r = service_recv(u, rsp, room)) < 0)
         return r;
 
-    if (rsp->type != BT_RESPONSE || rsp->name != expected_name) {
+    if ((rsp->type != BT_INDICATION && rsp->type != BT_RESPONSE) ||
+        rsp->name != expected_name ||
+        (expected_size > 0 && rsp->length != expected_size)) {
 
         if (rsp->type == BT_ERROR && rsp->length == sizeof(bt_audio_error_t))
             pa_log_error("Received error condition: %s", pa_cstrerror(((bt_audio_error_t*) rsp)->posix_errno));
@@ -328,10 +340,10 @@ static int get_caps(struct userdata *u) {
     }
     msg.getcaps_req.flags = BT_FLAG_AUTOCONNECT;
 
-    if (service_send(u->service_fd, &msg.getcaps_req.h) < 0)
+    if (service_send(u, &msg.getcaps_req.h) < 0)
         return -1;
 
-    if (service_expect(u->service_fd, &msg.getcaps_rsp.h, BT_GET_CAPABILITIES, 0) < 0)
+    if (service_expect(u, &msg.getcaps_rsp.h, sizeof(msg), BT_GET_CAPABILITIES, 0) < 0)
         return -1;
 
     return parse_caps(u, &msg.getcaps_rsp);
@@ -610,10 +622,10 @@ static int set_conf(struct userdata *u) {
         msg.setconf_req.h.length += msg.setconf_req.codec.length - sizeof(msg.setconf_req.codec);
     }
 
-    if (service_send(u->service_fd, &msg.setconf_req.h) < 0)
+    if (service_send(u, &msg.setconf_req.h) < 0)
         return -1;
 
-    if (service_expect(u->service_fd, &msg.setconf_rsp.h, BT_SET_CONFIGURATION, sizeof(msg.setconf_rsp)) < 0)
+    if (service_expect(u, &msg.setconf_rsp.h, sizeof(msg), BT_SET_CONFIGURATION, sizeof(msg.setconf_rsp)) < 0)
         return -1;
 
     if ((u->profile == PROFILE_A2DP && msg.setconf_rsp.transport != BT_CAPABILITIES_TRANSPORT_A2DP) ||
@@ -660,13 +672,13 @@ static int setup_stream_fd(struct userdata *u) {
     msg.start_req.h.name = BT_START_STREAM;
     msg.start_req.h.length = sizeof(msg.start_req);
 
-    if (service_send(u->service_fd, &msg.start_req.h) < 0)
+    if (service_send(u, &msg.start_req.h) < 0)
         return -1;
 
-    if (service_expect(u->service_fd, &msg.rsp, BT_START_STREAM, sizeof(msg.start_rsp)) < 0)
+    if (service_expect(u, &msg.rsp, sizeof(msg), BT_START_STREAM, sizeof(msg.start_rsp)) < 0)
         return -1;
 
-    if (service_expect(u->service_fd, &msg.rsp, BT_NEW_STREAM, sizeof(msg.streamfd_ind)) < 0)
+    if (service_expect(u, &msg.rsp, sizeof(msg), BT_NEW_STREAM, sizeof(msg.streamfd_ind)) < 0)
         return -1;
 
     if ((u->stream_fd = bt_audio_service_get_data_fd(u->service_fd)) < 0) {
@@ -776,7 +788,7 @@ static int hsp_process_render(struct userdata *u) {
         const void *p;
 
         p = (const uint8_t*) pa_memblock_acquire(memchunk.memblock) + memchunk.index;
-        l = pa_write(u->stream_fd, p, memchunk.length, &u->write_type);
+        l = pa_write(u->stream_fd, p, memchunk.length, &u->stream_write_type);
         pa_memblock_release(memchunk.memblock);
 
         pa_log_debug("Memblock written to socket: %lli bytes", (long long) l);
@@ -825,7 +837,7 @@ static int hsp_process_push(struct userdata *u) {
         void *p;
 
         p = pa_memblock_acquire(memchunk.memblock);
-        l = pa_read(u->stream_fd, p, pa_memblock_get_length(memchunk.memblock), &u->read_type);
+        l = pa_read(u->stream_fd, p, pa_memblock_get_length(memchunk.memblock), &u->stream_read_type);
         pa_memblock_release(memchunk.memblock);
 
         if (l <= 0) {
@@ -941,7 +953,7 @@ static int a2dp_process_render(struct userdata *u) {
     for (;;) {
         ssize_t l;
 
-        l = pa_write(u->stream_fd, p, left, &u->write_type);
+        l = pa_write(u->stream_fd, p, left, &u->stream_write_type);
 /*         pa_log_debug("write: requested %lu bytes; written %li bytes; mtu=%li", (unsigned long) left, (long) l, (unsigned long) u->link_mtu); */
 
         pa_assert(l != 0);
@@ -1417,7 +1429,8 @@ static int init_bt(struct userdata *u) {
         u->service_fd = -1;
     }
 
-    u->write_type = u->read_type = 0;
+    u->stream_write_type = u->stream_read_type = 0;
+    u->service_write_type = u->stream_write_type = 0;
 
     /* connect to the bluez audio service */
     if ((u->service_fd = bt_audio_service_open()) < 0) {

commit b18c8755d6de107486ebb305d0bb2909278bf29b
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Feb 12 22:06:15 2009 +0100

    minor service IO fixes

diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c
index 294fc66..9414eee 100644
--- a/src/modules/bluetooth/module-bluetooth-device.c
+++ b/src/modules/bluetooth/module-bluetooth-device.c
@@ -162,20 +162,18 @@ static int init_bt(struct userdata *u);
 static int init_profile(struct userdata *u);
 
 static int service_send(struct userdata *u, const bt_audio_msg_header_t *msg) {
-    size_t length;
     ssize_t r;
 
     pa_assert(u);
     pa_assert(u->service_fd >= 0);
     pa_assert(msg);
-
-    length = msg->length ? msg->length : BT_SUGGESTED_BUFFER_SIZE;
+    pa_assert(msg->length > 0);
 
     pa_log_debug("Sending %s -> %s",
                  pa_strnull(bt_audio_strtype(msg->type)),
                  pa_strnull(bt_audio_strname(msg->name)));
 
-    if ((r = pa_loop_write(u->service_fd, msg, length, &u->service_write_type)) == (ssize_t) length)
+    if ((r = pa_loop_write(u->service_fd, msg, msg->length, &u->service_write_type)) == (ssize_t) msg->length)
         return 0;
 
     if (r < 0)
@@ -207,7 +205,7 @@ static int service_recv(struct userdata *u, bt_audio_msg_header_t *msg, size_t r
         return -1;
     }
 
-    /* Second, read the payload */
+    /* Secondly, read the payload */
     if (msg->length > sizeof(*msg)) {
 
         size_t remains = msg->length - sizeof(*msg);
@@ -217,7 +215,6 @@ static int service_recv(struct userdata *u, bt_audio_msg_header_t *msg, size_t r
                               remains,
                               &u->service_read_type)) != (ssize_t) remains)
             goto read_fail;
-
     }
 
     pa_log_debug("Received %s <- %s",
@@ -231,7 +228,7 @@ read_fail:
     if (r < 0)
         pa_log_error("Error receiving data from audio service: %s", pa_cstrerror(errno));
     else
-        pa_log_error("Short recv()");
+        pa_log_error("Short read()");
 
     return -1;
 }

commit 52bfd47a493d927b4dac3c725454d2e7d4f8ca05
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Feb 12 22:09:00 2009 +0100

    use the same service fd shutdown logic when destructing module and changing profile

diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c
index 9414eee..3498088 100644
--- a/src/modules/bluetooth/module-bluetooth-device.c
+++ b/src/modules/bluetooth/module-bluetooth-device.c
@@ -1412,10 +1412,9 @@ static int add_source(struct userdata *u) {
     return 0;
 }
 
-static int init_bt(struct userdata *u) {
+static void shutdown_bt(struct userdata *u) {
     pa_assert(u);
 
-    /* shutdown bt */
     if (u->stream_fd >= 0) {
         pa_close(u->stream_fd);
         u->stream_fd = -1;
@@ -1425,15 +1424,21 @@ static int init_bt(struct userdata *u) {
         pa_close(u->service_fd);
         u->service_fd = -1;
     }
+}
+
+static int init_bt(struct userdata *u) {
+    pa_assert(u);
+
+    shutdown_bt(u);
 
     u->stream_write_type = u->stream_read_type = 0;
-    u->service_write_type = u->stream_write_type = 0;
+    u->service_write_type = u->service_write_type = 0;
 
-    /* connect to the bluez audio service */
     if ((u->service_fd = bt_audio_service_open()) < 0) {
         pa_log_error("Couldn't connect to bluetooth audio service");
         return -1;
     }
+
     pa_log_debug("Connected to the bluetooth audio service");
 
     return 0;
@@ -1576,7 +1581,7 @@ static int card_set_profile(pa_card *c, pa_card_profile *new_profile) {
     }
 
     stop_thread(u);
-    init_bt(u);
+    shutdown_bt(u);
 
     if (u->write_memchunk.memblock) {
         pa_memblock_unref(u->write_memchunk.memblock);
@@ -1586,6 +1591,7 @@ static int card_set_profile(pa_card *c, pa_card_profile *new_profile) {
     u->profile = *d;
     u->sample_spec = u->requested_sample_spec;
 
+    init_bt(u);
     init_profile(u);
 
     if (u->sink || u->source)
@@ -1923,11 +1929,7 @@ void pa__done(pa_module *m) {
     if (u->read_smoother)
         pa_smoother_free(u->read_smoother);
 
-    if (u->stream_fd >= 0)
-        pa_close(u->stream_fd);
-
-    if (u->service_fd >= 0)
-        pa_close(u->service_fd);
+    shutdown_bt(u);
 
     if (u->device)
         pa_bluetooth_device_free(u->device);

commit 87e134277dd54b55a62284844e3f35d9ffd5f49c
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Feb 12 22:09:17 2009 +0100

    don't claim that profile changes are always successful

diff --git a/src/pulsecore/card.c b/src/pulsecore/card.c
index 8e1ba53..515d1f9 100644
--- a/src/pulsecore/card.c
+++ b/src/pulsecore/card.c
@@ -229,7 +229,7 @@ int pa_card_set_profile(pa_card *c, const char *name) {
 
     pa_subscription_post(c->core, PA_SUBSCRIPTION_EVENT_CARD|PA_SUBSCRIPTION_EVENT_CHANGE, c->index);
 
-    pa_log_info("Successfully changed profile of card %u \"%s\" to %s", c->index, c->name, profile->name);
+    pa_log_info("Changed profile of card %u \"%s\" to %s", c->index, c->name, profile->name);
 
     c->active_profile = profile;
 

commit 6bb3dc82ba0aa53168c21c9b82cb86cc11563640
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Feb 12 22:52:02 2009 +0100

    don't try to recycle rtpoll objects

diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c
index 3498088..6daae83 100644
--- a/src/modules/bluetooth/module-bluetooth-device.c
+++ b/src/modules/bluetooth/module-bluetooth-device.c
@@ -1522,6 +1522,13 @@ static void stop_thread(struct userdata *u) {
         pa_source_unref(u->source);
         u->source = NULL;
     }
+
+    pa_thread_mq_done(&u->thread_mq);
+
+    if (u->rtpoll) {
+        pa_rtpoll_free(u->rtpoll);
+        u->rtpoll = NULL;
+    }
 }
 
 static int start_thread(struct userdata *u) {
@@ -1529,6 +1536,7 @@ static int start_thread(struct userdata *u) {
 
     pa_assert(u);
     pa_assert(!u->thread);
+    pa_assert(!u->rtpoll);
     pa_assert(!u->rtpoll_item);
 
     if (USE_SCO_OVER_PCM(u)) {
@@ -1537,6 +1545,9 @@ static int start_thread(struct userdata *u) {
         return 0;
     }
 
+    u->rtpoll = pa_rtpoll_new();
+    pa_thread_mq_init(&u->thread_mq, u->core->mainloop, u->rtpoll);
+
     u->rtpoll_item = pa_rtpoll_item_new(u->rtpoll, PA_RTPOLL_NEVER, 1);
     pollfd = pa_rtpoll_item_get_pollfd(u->rtpoll_item, NULL);
     pollfd->fd = u->stream_fd;
@@ -1764,8 +1775,6 @@ int pa__init(pa_module* m) {
     u->service_fd = -1;
     u->stream_fd = -1;
     u->read_smoother = pa_smoother_new(PA_USEC_PER_SEC, PA_USEC_PER_SEC*2, TRUE, 10);
-    u->rtpoll = pa_rtpoll_new();
-    pa_thread_mq_init(&u->thread_mq, u->core->mainloop, u->rtpoll);
     u->sample_spec = m->core->default_sample_spec;
     u->modargs = ma;
 
@@ -1921,11 +1930,6 @@ void pa__done(pa_module *m) {
     if (u->card)
         pa_card_free(u->card);
 
-    pa_thread_mq_done(&u->thread_mq);
-
-    if (u->rtpoll)
-        pa_rtpoll_free(u->rtpoll);
-
     if (u->read_smoother)
         pa_smoother_free(u->read_smoother);
 
diff --git a/src/pulsecore/rtpoll.c b/src/pulsecore/rtpoll.c
index 543262b..183d97c 100644
--- a/src/pulsecore/rtpoll.c
+++ b/src/pulsecore/rtpoll.c
@@ -156,7 +156,7 @@ void pa_rtpoll_install(pa_rtpoll *p) {
     pa_assert(p);
     pa_assert(!p->installed);
 
-    p->installed = 1;
+    p->installed = TRUE;
 
 #ifdef HAVE_PPOLL
 # ifdef __linux__

commit 4fab9bf23874eccb36e9af5c41ce1a5f2b9c2330
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Feb 12 23:14:24 2009 +0100

    add full set of argument description

diff --git a/src/modules/module-x11-publish.c b/src/modules/module-x11-publish.c
index c6c5bac..fb27eba 100644
--- a/src/modules/module-x11-publish.c
+++ b/src/modules/module-x11-publish.c
@@ -55,7 +55,11 @@ PA_MODULE_AUTHOR("Lennart Poettering");
 PA_MODULE_DESCRIPTION("X11 credential publisher");
 PA_MODULE_VERSION(PACKAGE_VERSION);
 PA_MODULE_LOAD_ONCE(FALSE);
-PA_MODULE_USAGE("display=<X11 display>");
+PA_MODULE_USAGE(
+        "display=<X11 display> "
+        "sink=<Sink to publish> "
+        "source=<Source to publish> "
+        "cookie=<Cookie file to publish> ");
 
 static const char* const valid_modargs[] = {
     "display",

commit 433751ff258b78f23a8e82b06f54522f820d3230
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Feb 13 02:39:07 2009 +0100

    add a module that forwards cork/uncork requests to X11 as fake pause/resume key events

diff --git a/configure.ac b/configure.ac
index 9189dd0..fbe134c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -485,7 +485,7 @@ AC_ARG_ENABLE([x11],
         [x11=auto])
 
 if test "x${x11}" != xno ; then
-    PKG_CHECK_MODULES(X11, [ x11 ice sm ],
+    PKG_CHECK_MODULES(X11, [ x11 ice sm xtst ],
         HAVE_X11=1,
         [
             HAVE_X11=0
diff --git a/src/Makefile.am b/src/Makefile.am
index fc47803..811b120 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -937,7 +937,8 @@ if HAVE_X11
 modlibexec_LTLIBRARIES += \
 		module-x11-bell.la \
 		module-x11-publish.la \
-		module-x11-xsmp.la
+		module-x11-xsmp.la \
+		module-x11-cork-request.la
 endif
 
 if HAVE_OSS
@@ -1059,6 +1060,7 @@ SYMDEF_FILES = \
 		modules/module-x11-bell-symdef.h \
 		modules/module-x11-publish-symdef.h \
 		modules/module-x11-xsmp-symdef.h \
+		modules/module-x11-cork-request-symdef.h \
 		modules/oss/module-oss-symdef.h \
 		modules/alsa/module-alsa-sink-symdef.h \
 		modules/alsa/module-alsa-source-symdef.h \
@@ -1247,6 +1249,11 @@ module_x11_xsmp_la_CFLAGS = $(AM_CFLAGS) $(X11_CFLAGS)
 module_x11_xsmp_la_LDFLAGS = $(MODULE_LDFLAGS)
 module_x11_xsmp_la_LIBADD = $(AM_LIBADD) $(X11_LIBS) libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la
 
+module_x11_cork_request_la_SOURCES = modules/module-x11-cork-request.c
+module_x11_cork_request_la_CFLAGS = $(AM_CFLAGS) $(X11_CFLAGS)
+module_x11_cork_request_la_LDFLAGS = $(MODULE_LDFLAGS)
+module_x11_cork_request_la_LIBADD = $(AM_LIBADD) $(X11_LIBS) libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecommon- at PA_MAJORMINORMICRO@.la libpulse.la
+
 # OSS
 
 liboss_util_la_SOURCES = modules/oss/oss-util.c modules/oss/oss-util.h
diff --git a/src/daemon/start-pulseaudio-x11.in b/src/daemon/start-pulseaudio-x11.in
index 3cccc4d..391a6d3 100755
--- a/src/daemon/start-pulseaudio-x11.in
+++ b/src/daemon/start-pulseaudio-x11.in
@@ -24,6 +24,7 @@ set -e
 if [ x"$DISPLAY" != x ] ; then
 
     @PACTL_BINARY@ load-module module-x11-publish "display=$DISPLAY" > /dev/null
+    @PACTL_BINARY@ load-module module-x11-cork-request "display=$DISPLAY" > /dev/null
 
     if [ x"$SESSION_MANAGER" != x ] ; then
 	@PACTL_BINARY@ load-module module-x11-xsmp "display=$DISPLAY session_manager=$SESSION_MANAGER" > /dev/null
diff --git a/src/modules/module-x11-cork-request.c b/src/modules/module-x11-cork-request.c
new file mode 100644
index 0000000..0c9aedf
--- /dev/null
+++ b/src/modules/module-x11-cork-request.c
@@ -0,0 +1,189 @@
+/***
+  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 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, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+  USA.
+***/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <X11/Xlib.h>
+#include <X11/extensions/XTest.h>
+#include <X11/XF86keysym.h>
+#include <X11/keysym.h>
+
+#include <pulse/util.h>
+#include <pulse/xmalloc.h>
+
+#include <pulsecore/module.h>
+#include <pulsecore/modargs.h>
+#include <pulsecore/log.h>
+#include <pulsecore/x11wrap.h>
+#include <pulsecore/core-util.h>
+
+#include "module-x11-cork-request-symdef.h"
+
+PA_MODULE_AUTHOR("Lennart Poettering");
+PA_MODULE_DESCRIPTION("Synthesize X11 media key events when cork/uncork is requested");
+PA_MODULE_VERSION(PACKAGE_VERSION);
+PA_MODULE_LOAD_ONCE(FALSE);
+PA_MODULE_USAGE("display=<X11 display>");
+
+static const char* const valid_modargs[] = {
+    "display",
+    NULL
+};
+
+struct userdata {
+    pa_module *module;
+
+    pa_x11_wrapper *x11_wrapper;
+    pa_x11_client *x11_client;
+
+    pa_hook_slot *hook_slot;
+};
+
+static void x11_kill_cb(pa_x11_wrapper *w, void *userdata) {
+    struct userdata *u = userdata;
+
+    pa_assert(w);
+    pa_assert(u);
+    pa_assert(u->x11_wrapper == w);
+
+    if (u->x11_client) {
+        pa_x11_client_free(u->x11_client);
+        u->x11_client = NULL;
+    }
+
+    if (u->x11_wrapper) {
+        pa_x11_wrapper_unref(u->x11_wrapper);
+        u->x11_wrapper = NULL;
+    }
+
+    pa_module_unload_request(u->module, TRUE);
+}
+
+static pa_hook_result_t sink_input_send_event_hook_cb(
+        pa_core *c,
+        pa_sink_input_send_event_hook_data *data,
+        struct userdata *u) {
+
+    KeySym sym;
+    KeyCode code;
+    Display *display;
+
+    pa_assert(c);
+    pa_assert(data);
+    pa_assert(u);
+
+    if (pa_streq(data->event, PA_STREAM_EVENT_REQUEST_CORK))
+        sym = XF86XK_AudioPause;
+    else if (pa_streq(data->event, PA_STREAM_EVENT_REQUEST_UNCORK))
+        sym = XF86XK_AudioPlay;
+    else
+        return PA_HOOK_OK;
+
+    pa_log_debug("Triggering X11 keysym: %s", XKeysymToString(sym));
+
+    display = pa_x11_wrapper_get_display(u->x11_wrapper);
+    code = XKeysymToKeycode(display, sym);
+
+    XTestFakeKeyEvent(display, code, True, CurrentTime);
+    XSync(display, False);
+
+    XTestFakeKeyEvent(display, code, False, CurrentTime);
+    XSync(display, False);
+
+    return PA_HOOK_OK;
+}
+
+int pa__init(pa_module *m) {
+    struct userdata *u;
+    pa_modargs *ma;
+    int xtest_event_base, xtest_error_base;
+    int major_version, minor_version;
+
+    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->module = m;
+
+    if (!(u->x11_wrapper = pa_x11_wrapper_get(m->core, pa_modargs_get_value(ma, "display", NULL))))
+        goto fail;
+
+    if (!XTestQueryExtension(
+                pa_x11_wrapper_get_display(u->x11_wrapper),
+                &xtest_event_base, &xtest_error_base,
+                &major_version, &minor_version)) {
+
+        pa_log("XTest extension not supported.");
+        goto fail;
+    }
+
+    pa_log_debug("XTest %i.%i supported.", major_version, minor_version);
+
+    u->x11_client = pa_x11_client_new(u->x11_wrapper, NULL, x11_kill_cb, u);
+
+    u->hook_slot = pa_hook_connect(
+            &m->core->hooks[PA_CORE_HOOK_SINK_INPUT_SEND_EVENT],
+            PA_HOOK_NORMAL,
+            (pa_hook_cb_t) sink_input_send_event_hook_cb, u);
+
+    pa_modargs_free(ma);
+
+    return 0;
+
+fail:
+    if (ma)
+        pa_modargs_free(ma);
+
+    pa__done(m);
+
+    return -1;
+}
+
+void pa__done(pa_module*m) {
+    struct userdata*u;
+
+    pa_assert(m);
+
+    if (!(u = m->userdata))
+        return;
+
+    if (u->x11_client)
+        pa_x11_client_free(u->x11_client);
+
+    if (u->x11_wrapper)
+        pa_x11_wrapper_unref(u->x11_wrapper);
+
+    if (u->hook_slot)
+        pa_hook_slot_free(u->hook_slot);
+
+    pa_xfree(u);
+}

commit 62818b8e57787f3b717443e72cb6dd28c4c0d4fd
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Feb 13 15:48:34 2009 +0100

    fix aiff channel mapping for 6 channels

diff --git a/src/pulse/channelmap.c b/src/pulse/channelmap.c
index 983b897..82e36c0 100644
--- a/src/pulse/channelmap.c
+++ b/src/pulse/channelmap.c
@@ -217,10 +217,10 @@ pa_channel_map* pa_channel_map_init_auto(pa_channel_map *m, unsigned channels, p
 
                 case 6:
                     m->map[0] = PA_CHANNEL_POSITION_FRONT_LEFT;
-                    m->map[1] = PA_CHANNEL_POSITION_SIDE_LEFT;
+                    m->map[1] = PA_CHANNEL_POSITION_REAR_LEFT;
                     m->map[2] = PA_CHANNEL_POSITION_FRONT_CENTER;
                     m->map[3] = PA_CHANNEL_POSITION_FRONT_RIGHT;
-                    m->map[4] = PA_CHANNEL_POSITION_SIDE_RIGHT;
+                    m->map[4] = PA_CHANNEL_POSITION_REAR_RIGHT;
                     m->map[5] = PA_CHANNEL_POSITION_LFE;
                     return m;
 

commit 15e9b968e1fe67eef272803c80bbecc8463c3c89
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Feb 13 17:59:53 2009 +0100

    we reinit proplist since the server will copy from client proplist anyway

diff --git a/src/pulse/scache.c b/src/pulse/scache.c
index c96c42a..a7e3cd8 100644
--- a/src/pulse/scache.c
+++ b/src/pulse/scache.c
@@ -66,10 +66,8 @@ int pa_stream_connect_upload(pa_stream *s, size_t length) {
     pa_tagstruct_put_channel_map(t, &s->channel_map);
     pa_tagstruct_putu32(t, (uint32_t) length);
 
-    if (s->context->version >= 13) {
-        pa_init_proplist(s->proplist);
+    if (s->context->version >= 13)
         pa_tagstruct_put_proplist(t, s->proplist);
-    }
 
     pa_pstream_send_tagstruct(s->context->pstream, t);
     pa_pdispatch_register_reply(s->context->pdispatch, tag, DEFAULT_TIMEOUT, pa_create_stream_callback, s, NULL);

commit c0fb91db545774ec45f208a6f771c22a0b153637
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Feb 13 18:01:00 2009 +0100

    drop check for PA_PROP_APPLICATION_NAME since often enough we can deduce this better from g_get_application_name()

diff --git a/src/pulse/context.c b/src/pulse/context.c
index 8105091..8686e0d 100644
--- a/src/pulse/context.c
+++ b/src/pulse/context.c
@@ -129,9 +129,6 @@ pa_context *pa_context_new_with_proplist(pa_mainloop_api *mainloop, const char *
 
     pa_init_i18n();
 
-    if (!name && !pa_proplist_contains(p, PA_PROP_APPLICATION_NAME))
-        return NULL;
-
     c = pa_xnew(pa_context, 1);
     PA_REFCNT_INIT(c);
 

commit 44bca66c5929e63bb39ed68420a74c97523b411f
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Feb 13 18:02:47 2009 +0100

    make PA_GCC_PACKED and PA_GCC_MALLOC actually work

diff --git a/src/modules/module-card-restore.c b/src/modules/module-card-restore.c
index 4dffd36..909c095 100644
--- a/src/modules/module-card-restore.c
+++ b/src/modules/module-card-restore.c
@@ -70,10 +70,10 @@ struct userdata {
 
 #define ENTRY_VERSION 1
 
-struct entry PA_GCC_PACKED {
+struct entry {
     uint8_t version;
     char profile[PA_NAME_MAX];
-};
+} PA_GCC_PACKED ;
 
 static void save_time_callback(pa_mainloop_api*a, pa_time_event* e, const struct timeval *tv, void *userdata) {
     struct userdata *u = userdata;
diff --git a/src/modules/module-device-restore.c b/src/modules/module-device-restore.c
index 7c56c24..e6a4881 100644
--- a/src/modules/module-device-restore.c
+++ b/src/modules/module-device-restore.c
@@ -81,12 +81,12 @@ struct userdata {
 
 #define ENTRY_VERSION 1
 
-struct entry PA_GCC_PACKED {
+struct entry {
     uint8_t version;
     pa_bool_t muted:1;
     pa_channel_map channel_map;
     pa_cvolume volume;
-};
+} PA_GCC_PACKED;
 
 static void save_time_callback(pa_mainloop_api*a, pa_time_event* e, const struct timeval *tv, void *userdata) {
     struct userdata *u = userdata;
diff --git a/src/modules/module-stream-restore.c b/src/modules/module-stream-restore.c
index 2dd2045..434dc7a 100644
--- a/src/modules/module-stream-restore.c
+++ b/src/modules/module-stream-restore.c
@@ -93,7 +93,7 @@ struct userdata {
 
 #define ENTRY_VERSION 1
 
-struct entry PA_GCC_PACKED {
+struct entry {
     uint8_t version;
     pa_bool_t muted_valid:1, relative_volume_valid:1, absolute_volume_valid:1, device_valid:1;
     pa_bool_t muted:1;
@@ -101,7 +101,7 @@ struct entry PA_GCC_PACKED {
     pa_cvolume relative_volume;
     pa_cvolume absolute_volume;
     char device[PA_NAME_MAX];
-};
+} PA_GCC_PACKED;
 
 enum {
     SUBCOMMAND_TEST,
diff --git a/src/pulse/gccmacro.h b/src/pulse/gccmacro.h
index 0b1a1a6..0f751c0 100644
--- a/src/pulse/gccmacro.h
+++ b/src/pulse/gccmacro.h
@@ -88,7 +88,7 @@
 #endif
 
 #ifndef PA_GCC_PACKED
-#ifdef __GNUCC__
+#ifdef __GNUC__
 #define PA_GCC_PACKED __attribute__ ((packed))
 #else
 /** Structure shall be packed in memory **/
@@ -109,7 +109,7 @@
 #endif
 
 #ifndef PA_GCC_MALLOC
-#ifdef __GNUCC__
+#ifdef __GNUC__
 #define PA_GCC_MALLOC __attribute__ ((malloc))
 #else
 /** Macro for usage of GCC's malloc attribute */
diff --git a/src/pulsecore/shm.c b/src/pulsecore/shm.c
index c59d247..b8c5f78 100644
--- a/src/pulsecore/shm.c
+++ b/src/pulsecore/shm.c
@@ -70,14 +70,14 @@
 
 /* We now put this SHM marker at the end of each segment. It's
  * optional, to not require a reboot when upgrading, though */
-struct shm_marker PA_GCC_PACKED {
+struct shm_marker {
     pa_atomic_t marker; /* 0xbeefcafe */
     pa_atomic_t pid;
     uint64_t _reserved1;
     uint64_t _reserved2;
     uint64_t _reserved3;
     uint64_t _reserved4;
-};
+} PA_GCC_PACKED;
 
 static char *segment_name(char *fn, size_t l, unsigned id) {
     pa_snprintf(fn, l, "/pulse-shm-%u", id);

commit 689e6f8a811e9fb00928bc57f2acbb859ac3923a
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Feb 13 18:03:21 2009 +0100

    add definition for GCC style weak references

diff --git a/src/pulse/gccmacro.h b/src/pulse/gccmacro.h
index 0f751c0..8d9d4f0 100644
--- a/src/pulse/gccmacro.h
+++ b/src/pulse/gccmacro.h
@@ -117,4 +117,10 @@
 #endif
 #endif
 
+#ifndef PA_GCC_WEAKREF
+#ifdef __GNUC__
+#define PA_GCC_WEAKREF(x) __attribute__((weakref(#x)));
+#endif
+#endif
+
 #endif

commit f863756b430bed8cd43c31535eda5d973abbc1b1
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Feb 13 18:06:30 2009 +0100

    make PULSE_PROP env vars non-overriding but introduce PULSE_PROP_OVERRIDE for allowing overriding

diff --git a/src/pulsecore/proplist-util.c b/src/pulsecore/proplist-util.c
index 8a447cf..ae8e080 100644
--- a/src/pulsecore/proplist-util.c
+++ b/src/pulsecore/proplist-util.c
@@ -58,18 +58,27 @@ void pa_init_proplist(pa_proplist *p) {
         for (e = environ; *e; e++) {
 
             if (pa_startswith(*e, "PULSE_PROP_")) {
-                size_t kl = strcspn(*e+11, "=");
+                size_t kl, skip;
                 char *k;
+                pa_bool_t override;
 
-                if ((*e)[11+kl] != '=')
-                    continue;
+                if (pa_startswith(*e, "PULSE_PROP_OVERRIDE_")) {
+                    skip = 20;
+                    override = TRUE;
+                } else {
+                    skip = 11;
+                    override = FALSE;
+                }
+
+                kl = strcspn(*e+skip, "=");
 
-                if (!pa_utf8_valid(*e+11+kl+1))
+                if ((*e)[skip+kl] != '=')
                     continue;
 
-                k = pa_xstrndup(*e+11, kl);
+                k = pa_xstrndup(*e+skip, kl);
 
-                pa_proplist_sets(p, k, *e+11+kl+1);
+                if (override || !pa_proplist_contains(p, k))
+                    pa_proplist_sets(p, k, *e+skip+kl+1);
                 pa_xfree(k);
             }
         }
@@ -79,6 +88,15 @@ void pa_init_proplist(pa_proplist *p) {
         pa_proplist *t;
 
         if ((t = pa_proplist_from_string(pp))) {
+            pa_proplist_update(p, PA_UPDATE_MERGE, t);
+            pa_proplist_free(t);
+        }
+    }
+
+    if ((pp = getenv("PULSE_PROP_OVERRIDE"))) {
+        pa_proplist *t;
+
+        if ((t = pa_proplist_from_string(pp))) {
             pa_proplist_update(p, PA_UPDATE_REPLACE, t);
             pa_proplist_free(t);
         }

commit e954a89d89a88774a7a8ebb32f08f9b0f377d4fe
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Feb 13 18:19:10 2009 +0100

    properly read icon/application name/display from gtk/glib/gdk

diff --git a/configure.ac b/configure.ac
index fbe134c..e809839 100644
--- a/configure.ac
+++ b/configure.ac
@@ -721,6 +721,45 @@ AC_SUBST(GLIB20_LIBS)
 AC_SUBST(HAVE_GLIB20)
 AM_CONDITIONAL([HAVE_GLIB20], [test "x$HAVE_GLIB20" = x1])
 
+if test "x$HAVE_GLIB20" = x1 ; then
+   AC_DEFINE([HAVE_GLIB], 1, [Have GLIB?])
+fi
+
+#### GTK2 support (optional) ####
+
+AC_ARG_ENABLE([gtk2],
+    AS_HELP_STRING([--disable-gtk2],[Disable optional Gtk+ 2 support]),
+        [
+            case "${enableval}" in
+                yes) gtk2=yes ;;
+                no) gtk2=no ;;
+                *) AC_MSG_ERROR(bad value ${enableval} for --disable-gtk2) ;;
+            esac
+        ],
+        [gtk2=auto])
+
+if test "x${gtk2}" != xno ; then
+    PKG_CHECK_MODULES(GTK20, [ gtk+-2.0 >= 2.4.0 ],
+        HAVE_GTK20=1,
+        [
+            HAVE_GTK20=0
+            if test "x$gtk2" = xyes ; then
+                AC_MSG_ERROR([*** Gtk+ 2 support not found])
+            fi
+        ])
+else
+    HAVE_GTK20=0
+fi
+
+AC_SUBST(GTK20_CFLAGS)
+AC_SUBST(GTK20_LIBS)
+AC_SUBST(HAVE_GTK20)
+AM_CONDITIONAL([HAVE_GTK20], [test "x$HAVE_GTK20" = x1])
+
+if test "x$HAVE_GTK20" = x1 ; then
+   AC_DEFINE([HAVE_GTK], 1, [Have GTK?])
+fi
+
 #### GConf support (optional) ####
 
 AC_ARG_ENABLE([gconf],
diff --git a/src/Makefile.am b/src/Makefile.am
index 811b120..f385c0a 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -308,6 +308,11 @@ TESTS_BINARIES += \
 		mainloop-test-glib
 endif
 
+if HAVE_GTK20
+TESTS_BINARIES += \
+		gtk-test
+endif
+
 if BUILD_TESTS_DEFAULT
 noinst_PROGRAMS = $(TESTS_BINARIES)
 else
@@ -504,6 +509,11 @@ prioq_test_LDADD = $(AM_LDADD) libpulsecore- at PA_MAJORMINORMICRO@.la libpulsecomm
 prioq_test_CFLAGS = $(AM_CFLAGS) $(LIBOIL_CFLAGS)
 prioq_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(LIBOIL_LIBS)
 
+gtk_test_SOURCES = tests/gtk-test.c
+gtk_test_LDADD = $(AM_LDADD) libpulse.la libpulse-mainloop-glib.la
+gtk_test_CFLAGS = $(AM_CFLAGS) $(GTK20_CFLAGS)
+gtk_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(GTK20_LIBS)
+
 ###################################
 #         Common library          #
 ###################################
@@ -571,6 +581,9 @@ libpulsecommon_ at PA_MAJORMINORMICRO@_la_CFLAGS = $(AM_CFLAGS)
 libpulsecommon_ at PA_MAJORMINORMICRO@_la_LDFLAGS = $(AM_LDFLAGS) -avoid-version
 libpulsecommon_ at PA_MAJORMINORMICRO@_la_LIBADD = $(AM_LIBADD) $(LIBWRAP_LIBS) $(WINSOCK_LIBS) $(LTLIBICONV)
 
+# proplist-util.h uses these header files, but not the library itself!
+libpulsecommon_ at PA_MAJORMINORMICRO@_la_CFLAGS += $(GLIB20_CFLAGS) $(GTK20_CFLAGS)
+
 ## Please note that libpulsecommon implicitly also depends on<
 ## libpulse! i.e. we have a cyclic dependancy here. Which is intended
 ## since libpulse only includes stable, official APIs, while
diff --git a/src/pulsecore/proplist-util.c b/src/pulsecore/proplist-util.c
index ae8e080..bdae0e6 100644
--- a/src/pulsecore/proplist-util.c
+++ b/src/pulsecore/proplist-util.c
@@ -34,6 +34,7 @@
 extern char **environ;
 #endif
 
+#include <pulse/gccmacro.h>
 #include <pulse/proplist.h>
 #include <pulse/utf8.h>
 #include <pulse/xmalloc.h>
@@ -41,8 +42,64 @@ extern char **environ;
 
 #include <pulsecore/core-util.h>
 
+#if defined(HAVE_GLIB) && defined(PA_GCC_WEAKREF)
+#include <glib.h>
+static G_CONST_RETURN gchar* _g_get_application_name(void) PA_GCC_WEAKREF(g_get_application_name);
+#endif
+
+#if defined(HAVE_GTK) && defined(PA_GCC_WEAKREF)
+#include <gtk/gtk.h>
+#include <gdk/gdkx.h>
+static G_CONST_RETURN gchar* _gtk_window_get_default_icon_name(void) PA_GCC_WEAKREF(gtk_window_get_default_icon_name);
+static Display *_gdk_display PA_GCC_WEAKREF(gdk_display);
+#endif
+
 #include "proplist-util.h"
 
+static void add_glib_properties(pa_proplist *p) {
+
+#if defined(HAVE_GLIB) && defined(PA_GCC_WEAKREF)
+
+    if (!pa_proplist_contains(p, PA_PROP_APPLICATION_NAME))
+        if (_g_get_application_name) {
+            const gchar *t;
+
+            /* We ignore the tiny race condition here. */
+
+            if ((t = _g_get_application_name()))
+                pa_proplist_sets(p, PA_PROP_APPLICATION_NAME, t);
+        }
+
+#endif
+}
+
+static void add_gtk_properties(pa_proplist *p) {
+
+#if defined(HAVE_GTK) && defined(PA_GCC_WEAKREF)
+
+    if (!pa_proplist_contains(p, PA_PROP_APPLICATION_ICON_NAME))
+        if (_gtk_window_get_default_icon_name) {
+            const gchar *t;
+
+            /* We ignore the tiny race condition here. */
+
+            if ((t = _gtk_window_get_default_icon_name()))
+                pa_proplist_sets(p, PA_PROP_APPLICATION_ICON_NAME, t);
+        }
+
+    if (!pa_proplist_contains(p, PA_PROP_WINDOW_X11_DISPLAY))
+        if (&_gdk_display && _gdk_display) {
+            const char *t;
+
+            /* We ignore the tiny race condition here. */
+
+            if ((t = DisplayString(_gdk_display)))
+                pa_proplist_sets(p, PA_PROP_WINDOW_X11_DISPLAY, t);
+        }
+
+#endif
+}
+
 void pa_init_proplist(pa_proplist *p) {
     char **e;
     const char *pp;
@@ -135,20 +192,8 @@ void pa_init_proplist(pa_proplist *p) {
         }
     }
 
-#ifdef RTLD_NOLOAD
-    if (!pa_proplist_contains(p, PA_PROP_APPLICATION_NAME)) {
-        void *dl;
-
-        if ((dl = dlopen("libglib-2.0", RTLD_NOLOAD))) {
-            const char *(*_g_get_application_name)(void);
-
-            if ((*(void**) &_g_get_application_name = dlsym(dl, "g_get_application_name")))
-                pa_proplist_sets(p, PA_PROP_APPLICATION_NAME, _g_get_application_name());
-
-            dlclose(dl);
-        }
-    }
-#endif
+    add_glib_properties(p);
+    add_gtk_properties(p);
 
     if (!pa_proplist_contains(p, PA_PROP_APPLICATION_NAME)) {
         const char *t;
diff --git a/src/tests/gtk-test.c b/src/tests/gtk-test.c
new file mode 100644
index 0000000..a2d3e69
--- /dev/null
+++ b/src/tests/gtk-test.c
@@ -0,0 +1,62 @@
+/***
+  This file is part of PulseAudio.
+
+  PulseAudio is free software; you can redistribute it and/or modify
+  it under the terms of the GNU Lesser General Public License as published
+  by the Free Software Foundation; either version 2 of the License,
+  or (at your option) any later version.
+
+  PulseAudio is distributed in the hope that it will be useful, but
+  WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+  General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public License
+  along with PulseAudio; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+  USA.
+***/
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+#include <glib.h>
+
+#include <pulse/context.h>
+#include <pulse/glib-mainloop.h>
+
+int main(int argc, char *argv[]) {
+
+    pa_context *c;
+    pa_glib_mainloop *m;
+    GtkWidget *window;
+    int r;
+
+    gtk_init(&argc, &argv);
+
+    g_set_application_name("This is a test");
+    gtk_window_set_default_icon_name("foobar");
+    g_setenv("PULSE_PROP_media.role", "phone", TRUE);
+
+    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+    gtk_window_set_title(GTK_WINDOW (window), g_get_application_name());
+    gtk_widget_show_all(window);
+
+    m = pa_glib_mainloop_new(NULL);
+    g_assert(m);
+
+    c = pa_context_new(pa_glib_mainloop_get_api(m), NULL);
+    g_assert(c);
+
+    r = pa_context_connect(c, NULL, 0, NULL);
+    g_assert(r == 0);
+
+    gtk_main();
+
+    pa_context_unref(c);
+    pa_glib_mainloop_free(m);
+
+    return 0;
+}

commit fffe0baf363367d9a7aea8a6b6def58323dc429a
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Feb 13 21:57:00 2009 +0100

    ignore gtk-test

diff --git a/src/.gitignore b/src/.gitignore
index 66738d0..4da445b 100644
--- a/src/.gitignore
+++ b/src/.gitignore
@@ -1,3 +1,4 @@
+gtk-test
 prioq-test
 lock-autospawn-test
 *.lo

commit 9334d900e5f04982f1b55180c15c9e74005d3ea2
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Feb 13 21:57:27 2009 +0100

    show whether gtk+ support is enabled after configure

diff --git a/configure.ac b/configure.ac
index e809839..0124112 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1268,6 +1268,11 @@ if test "x$HAVE_SOLARIS" = "x1" ; then
    ENABLE_SOLARIS=yes
 fi
 
+ENABLE_GTK20=no
+if test "x$HAVE_GTK20" = "x1" ; then
+   ENABLE_GTK20=yes
+fi
+
 ENABLE_GLIB20=no
 if test "x$HAVE_GLIB20" = "x1" ; then
    ENABLE_GLIB20=yes
@@ -1350,6 +1355,7 @@ echo "
     Enable Alsa:                   ${ENABLE_ALSA}
     Enable Solaris:                ${ENABLE_SOLARIS}
     Enable GLib 2.0:               ${ENABLE_GLIB20}
+    Enable Gtk+ 2.0:               ${ENABLE_GTK20}
     Enable GConf:                  ${ENABLE_GCONF}
     Enable Avahi:                  ${ENABLE_AVAHI}
     Enable Jack:                   ${ENABLE_JACK}

commit dc590c7d0aced673bb395f12f39749b4ac8407fd
Author: Iain Hibbert <plunky at rya-online.net>
Date:   Fri Feb 13 21:58:09 2009 +0100

    Optionally disable IPv6
    
    Closes #79

diff --git a/configure.ac b/configure.ac
index 0124112..c28a72c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1087,6 +1087,27 @@ AC_SUBST(POLKIT_LIBS)
 AC_SUBST(HAVE_POLKIT)
 AM_CONDITIONAL([HAVE_POLKIT], [test "x$HAVE_POLKIT" = x1])
 
+
+### IPv6 connection support (optional) ###
+
+AC_ARG_ENABLE([ipv6],
+    AS_HELP_STRING([--disable-ipv6],[Disable optional IPv6 support]),
+        [
+            case "${enableval}" in
+                yes) ipv6=yes ;;
+                no) ipv6=no ;;
+                *) AC_MSG_ERROR(bad value ${enableval} for --disable-ipv6) ;;
+            esac
+        ],
+        [ipv6=auto])
+
+if test "x${ipv6}" != xno ; then
+    AC_DEFINE([HAVE_IPV6], [1], [Define this to enable IPv6 connection support])
+    HAVE_IPV6=1
+else
+    HAVE_IPV6=0
+fi
+
 #### OpenSSL support (optional) ####
 
 AC_ARG_ENABLE([openssl],
@@ -1333,6 +1354,11 @@ if test "x${HAVE_OPENSSL}" = "x1" ; then
    ENABLE_OPENSSL=yes
 fi
 
+ENABLE_IPV6=no
+if test "x${HAVE_IPV6}" = "x1" ; then
+   ENABLE_IPV6=yes
+fi
+
 ENABLE_PER_USER_ESOUND_SOCKET=no
 if test "x$per_user_esound_socket" = "x1" ; then
    ENABLE_PER_USER_ESOUND_SOCKET=yes
@@ -1366,6 +1392,7 @@ echo "
     Enable TCP Wrappers:           ${ENABLE_TCPWRAP}
     Enable libsamplerate:          ${ENABLE_LIBSAMPLERATE}
     Enable PolicyKit:              ${ENABLE_POLKIT}
+    Enable IPv6:                   ${ENABLE_IPV6}
     Enable OpenSSL (for Airtunes): ${ENABLE_OPENSSL}
 
     System User:                   ${PA_SYSTEM_USER}
diff --git a/src/modules/module-protocol-stub.c b/src/modules/module-protocol-stub.c
index aefd402..ca9274d 100644
--- a/src/modules/module-protocol-stub.c
+++ b/src/modules/module-protocol-stub.c
@@ -211,7 +211,9 @@ struct userdata {
 
 #if defined(USE_TCP_SOCKETS)
     pa_socket_server *socket_server_ipv4;
+#  ifdef HAVE_IPV6
     pa_socket_server *socket_server_ipv6;
+#  endif
 #else
     pa_socket_server *socket_server_unix;
     char *socket_path;
@@ -299,20 +301,30 @@ int pa__init(pa_module*m) {
     listen_on = pa_modargs_get_value(ma, "listen", NULL);
 
     if (listen_on) {
+#  ifdef HAVE_IPV6
         u->socket_server_ipv6 = pa_socket_server_new_ipv6_string(m->core->mainloop, listen_on, (uint16_t) port, TCPWRAP_SERVICE);
+#  endif
         u->socket_server_ipv4 = pa_socket_server_new_ipv4_string(m->core->mainloop, listen_on, (uint16_t) port, TCPWRAP_SERVICE);
     } else {
+#  ifdef HAVE_IPV6
         u->socket_server_ipv6 = pa_socket_server_new_ipv6_any(m->core->mainloop, (uint16_t) port, TCPWRAP_SERVICE);
+#  endif
         u->socket_server_ipv4 = pa_socket_server_new_ipv4_any(m->core->mainloop, (uint16_t) port, TCPWRAP_SERVICE);
     }
 
+#  ifdef HAVE_IPV6
     if (!u->socket_server_ipv4 && !u->socket_server_ipv6)
+#  else
+    if (!u->socket_server_ipv4)
+#  endif
         goto fail;
 
     if (u->socket_server_ipv4)
         pa_socket_server_set_callback(u->socket_server_ipv4, socket_server_on_connection_cb, u);
+#  ifdef HAVE_IPV6
     if (u->socket_server_ipv6)
         pa_socket_server_set_callback(u->socket_server_ipv6, socket_server_on_connection_cb, u);
+#  endif
 
 #else
 
@@ -358,9 +370,11 @@ int pa__init(pa_module*m) {
         if (pa_socket_server_get_address(u->socket_server_ipv4, t, sizeof(t)))
             pa_native_protocol_add_server_string(u->native_protocol, t);
 
+#    ifdef HAVE_IPV6
     if (u->socket_server_ipv6)
         if (pa_socket_server_get_address(u->socket_server_ipv6, t, sizeof(t)))
             pa_native_protocol_add_server_string(u->native_protocol, t);
+#    endif
 #  else
     if (pa_socket_server_get_address(u->socket_server_unix, t, sizeof(t)))
         pa_native_protocol_add_server_string(u->native_protocol, t);
@@ -418,9 +432,11 @@ void pa__done(pa_module*m) {
             if (pa_socket_server_get_address(u->socket_server_ipv4, t, sizeof(t)))
                 pa_native_protocol_remove_server_string(u->native_protocol, t);
 
+#    ifdef HAVE_IPV6
         if (u->socket_server_ipv6)
             if (pa_socket_server_get_address(u->socket_server_ipv6, t, sizeof(t)))
                 pa_native_protocol_remove_server_string(u->native_protocol, t);
+#    endif
 #  else
         if (u->socket_server_unix)
             if (pa_socket_server_get_address(u->socket_server_unix, t, sizeof(t)))
@@ -444,8 +460,10 @@ void pa__done(pa_module*m) {
 #if defined(USE_TCP_SOCKETS)
     if (u->socket_server_ipv4)
         pa_socket_server_unref(u->socket_server_ipv4);
+#  ifdef HAVE_IPV6
     if (u->socket_server_ipv6)
         pa_socket_server_unref(u->socket_server_ipv6);
+#  endif
 #else
     if (u->socket_server_unix)
         pa_socket_server_unref(u->socket_server_unix);
diff --git a/src/modules/rtp/module-rtp-recv.c b/src/modules/rtp/module-rtp-recv.c
index c118b5c..063ba72 100644
--- a/src/modules/rtp/module-rtp-recv.c
+++ b/src/modules/rtp/module-rtp-recv.c
@@ -373,11 +373,13 @@ static int mcast_socket(const struct sockaddr* sa, socklen_t salen) {
         memset(&mr4, 0, sizeof(mr4));
         mr4.imr_multiaddr = ((const struct sockaddr_in*) sa)->sin_addr;
         r = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mr4, sizeof(mr4));
+#ifdef HAVE_IPV6
     } else {
         struct ipv6_mreq mr6;
         memset(&mr6, 0, sizeof(mr6));
         mr6.ipv6mr_multiaddr = ((const struct sockaddr_in6*) sa)->sin6_addr;
         r = setsockopt(fd, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mr6, sizeof(mr6));
+#endif
     }
 
     if (r < 0) {
@@ -608,7 +610,9 @@ int pa__init(pa_module*m) {
     struct userdata *u;
     pa_modargs *ma = NULL;
     struct sockaddr_in sa4;
+#ifdef HAVE_IPV6
     struct sockaddr_in6 sa6;
+#endif
     struct sockaddr *sa;
     socklen_t salen;
     const char *sap_address;
@@ -624,16 +628,18 @@ int pa__init(pa_module*m) {
 
     sap_address = pa_modargs_get_value(ma, "sap_address", DEFAULT_SAP_ADDRESS);
 
-    if (inet_pton(AF_INET6, sap_address, &sa6.sin6_addr) > 0) {
-        sa6.sin6_family = AF_INET6;
-        sa6.sin6_port = htons(SAP_PORT);
-        sa = (struct sockaddr*) &sa6;
-        salen = sizeof(sa6);
-    } else if (inet_pton(AF_INET, sap_address, &sa4.sin_addr) > 0) {
+    if (inet_pton(AF_INET, sap_address, &sa4.sin_addr) > 0) {
         sa4.sin_family = AF_INET;
         sa4.sin_port = htons(SAP_PORT);
         sa = (struct sockaddr*) &sa4;
         salen = sizeof(sa4);
+#ifdef HAVE_IPV6
+    } else if (inet_pton(AF_INET6, sap_address, &sa6.sin6_addr) > 0) {
+        sa6.sin6_family = AF_INET6;
+        sa6.sin6_port = htons(SAP_PORT);
+        sa = (struct sockaddr*) &sa6;
+        salen = sizeof(sa6);
+#endif
     } else {
         pa_log("Invalid SAP address '%s'", sap_address);
         goto fail;
diff --git a/src/modules/rtp/module-rtp-send.c b/src/modules/rtp/module-rtp-send.c
index 762cdc1..fef745a 100644
--- a/src/modules/rtp/module-rtp-send.c
+++ b/src/modules/rtp/module-rtp-send.c
@@ -177,7 +177,9 @@ int pa__init(pa_module*m) {
     pa_sample_spec ss;
     pa_channel_map cm;
     struct sockaddr_in sa4, sap_sa4;
+#ifdef HAVE_IPV6
     struct sockaddr_in6 sa6, sap_sa6;
+#endif
     struct sockaddr_storage sa_dst;
     pa_source_output *o = NULL;
     uint8_t payload;
@@ -247,16 +249,18 @@ int pa__init(pa_module*m) {
 
     dest = pa_modargs_get_value(ma, "destination", DEFAULT_DESTINATION);
 
-    if (inet_pton(AF_INET6, dest, &sa6.sin6_addr) > 0) {
-        sa6.sin6_family = af = AF_INET6;
-        sa6.sin6_port = htons((uint16_t) port);
-        sap_sa6 = sa6;
-        sap_sa6.sin6_port = htons(SAP_PORT);
-    } else if (inet_pton(AF_INET, dest, &sa4.sin_addr) > 0) {
+    if (inet_pton(AF_INET, dest, &sa4.sin_addr) > 0) {
         sa4.sin_family = af = AF_INET;
         sa4.sin_port = htons((uint16_t) port);
         sap_sa4 = sa4;
         sap_sa4.sin_port = htons(SAP_PORT);
+#ifdef HAVE_IPV6
+    } else if (inet_pton(AF_INET6, dest, &sa6.sin6_addr) > 0) {
+        sa6.sin6_family = af = AF_INET6;
+        sa6.sin6_port = htons((uint16_t) port);
+        sap_sa6 = sa6;
+        sap_sa6.sin6_port = htons(SAP_PORT);
+#endif
     } else {
         pa_log("Invalid destination '%s'", dest);
         goto fail;
@@ -267,9 +271,14 @@ int pa__init(pa_module*m) {
         goto fail;
     }
 
-    if (connect(fd, af == AF_INET ? (struct sockaddr*) &sa4 : (struct sockaddr*) &sa6, (socklen_t) (af == AF_INET ? sizeof(sa4) : sizeof(sa6))) < 0) {
+    if (af == AF_INET && connect(fd, (struct sockaddr*) &sa4, sizeof(sa4)) < 0) {
         pa_log("connect() failed: %s", pa_cstrerror(errno));
         goto fail;
+#ifdef HAVE_IPV6
+    } else if (af == AF_INET6 && connect(fd, (struct sockaddr*) &sa6, sizeof(sa6)) < 0) {
+        pa_log("connect() failed: %s", pa_cstrerror(errno));
+        goto fail;
+#endif
     }
 
     if ((sap_fd = socket(af, SOCK_DGRAM, 0)) < 0) {
@@ -277,9 +286,14 @@ int pa__init(pa_module*m) {
         goto fail;
     }
 
-    if (connect(sap_fd, af == AF_INET ? (struct sockaddr*) &sap_sa4 : (struct sockaddr*) &sap_sa6, (socklen_t) (af == AF_INET ? sizeof(sap_sa4) : sizeof(sap_sa6))) < 0) {
+    if (af == AF_INET && connect(sap_fd, (struct sockaddr*) &sap_sa4, sizeof(sap_sa4)) < 0) {
+        pa_log("connect() failed: %s", pa_cstrerror(errno));
+        goto fail;
+#ifdef HAVE_IPV6
+    } else if (af == AF_INET6 && connect(sap_fd, (struct sockaddr*) &sap_sa6, sizeof(sap_sa6)) < 0) {
         pa_log("connect() failed: %s", pa_cstrerror(errno));
         goto fail;
+#endif
     }
 
     j = !!loop;
@@ -357,10 +371,19 @@ int pa__init(pa_module*m) {
 
     n = pa_sprintf_malloc("PulseAudio RTP Stream on %s", pa_get_fqdn(hn, sizeof(hn)));
 
-    p = pa_sdp_build(af,
-                     af == AF_INET ? (void*) &((struct sockaddr_in*) &sa_dst)->sin_addr : (void*) &((struct sockaddr_in6*) &sa_dst)->sin6_addr,
-                     af == AF_INET ? (void*) &sa4.sin_addr : (void*) &sa6.sin6_addr,
+    if (af == AF_INET) {
+        p = pa_sdp_build(af,
+                     (void*) &((struct sockaddr_in*) &sa_dst)->sin_addr,
+                     (void*) &sa4.sin_addr,
+                     n, (uint16_t) port, payload, &ss);
+#ifdef HAVE_IPV6
+    } else {
+        p = pa_sdp_build(af,
+                     (void*) &((struct sockaddr_in6*) &sa_dst)->sin6_addr,
+                     (void*) &sa6.sin6_addr,
                      n, (uint16_t) port, payload, &ss);
+#endif
+    }
 
     pa_xfree(n);
 
diff --git a/src/modules/rtp/sap.c b/src/modules/rtp/sap.c
index 7764f7b..b5d9df6 100644
--- a/src/modules/rtp/sap.c
+++ b/src/modules/rtp/sap.c
@@ -87,18 +87,31 @@ int pa_sap_send(pa_sap_context *c, pa_bool_t goodbye) {
         return -1;
     }
 
+#ifdef HAVE_IPV6
     pa_assert(sa->sa_family == AF_INET || sa->sa_family == AF_INET6);
+#else
+    pa_assert(sa->sa_family == AF_INET);
+#endif
 
     header = htonl(((uint32_t) 1 << 29) |
+#ifdef HAVE_IPV6
                    (sa->sa_family == AF_INET6 ? (uint32_t) 1 << 28 : 0) |
+#endif
                    (goodbye ? (uint32_t) 1 << 26 : 0) |
                    (c->msg_id_hash));
 
     iov[0].iov_base = &header;
     iov[0].iov_len = sizeof(header);
 
-    iov[1].iov_base = sa->sa_family == AF_INET ? (void*) &((struct sockaddr_in*) sa)->sin_addr : (void*) &((struct sockaddr_in6*) sa)->sin6_addr;
-    iov[1].iov_len = sa->sa_family == AF_INET ? 4U : 16U;
+    if (sa->sa_family == AF_INET) {
+        iov[1].iov_base = (void*) &((struct sockaddr_in*) sa)->sin_addr;
+        iov[1].iov_len = 4U;
+#ifdef HAVE_IPV6
+    } else {
+        iov[1].iov_base = (void*) &((struct sockaddr_in6*) sa)->sin6_addr;
+        iov[1].iov_len = 16U;
+#endif
+    }
 
     iov[2].iov_base = (char*) MIME_TYPE;
     iov[2].iov_len = sizeof(MIME_TYPE);
diff --git a/src/modules/rtp/sdp.c b/src/modules/rtp/sdp.c
index 59989e1..643361f 100644
--- a/src/modules/rtp/sdp.c
+++ b/src/modules/rtp/sdp.c
@@ -48,7 +48,12 @@ char *pa_sdp_build(int af, const void *src, const void *dst, const char *name, u
 
     pa_assert(src);
     pa_assert(dst);
+
+#ifdef HAVE_IPV6
     pa_assert(af == AF_INET || af == AF_INET6);
+#else
+    pa_assert(af == AF_INET);
+#endif
 
     pa_assert_se(f = pa_rtp_format_to_string(ss->format));
 
@@ -162,6 +167,7 @@ pa_sdp_info *pa_sdp_parse(const char *t, pa_sdp_info *i, int is_goodbye) {
             ((struct sockaddr_in*) &i->sa)->sin_family = AF_INET;
             ((struct sockaddr_in*) &i->sa)->sin_port = 0;
             i->salen = sizeof(struct sockaddr_in);
+#ifdef HAVE_IPV6
         } else if (pa_startswith(t, "c=IN IP6 ")) {
             char a[64];
             size_t k;
@@ -179,6 +185,7 @@ pa_sdp_info *pa_sdp_parse(const char *t, pa_sdp_info *i, int is_goodbye) {
             ((struct sockaddr_in6*) &i->sa)->sin6_family = AF_INET6;
             ((struct sockaddr_in6*) &i->sa)->sin6_port = 0;
             i->salen = sizeof(struct sockaddr_in6);
+#endif
         } else if (pa_startswith(t, "m=audio ")) {
 
             if (i->payload > 127) {
diff --git a/src/pulsecore/inet_ntop.c b/src/pulsecore/inet_ntop.c
index 8755123..012a1a0 100644
--- a/src/pulsecore/inet_ntop.c
+++ b/src/pulsecore/inet_ntop.c
@@ -38,7 +38,9 @@
 
 const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt) {
     struct in_addr *in = (struct in_addr*)src;
+#ifdef HAVE_IPV6
     struct in6_addr *in6 = (struct in6_addr*)src;
+#endif
 
     assert(src && dst);
 
@@ -57,6 +59,7 @@ const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt) {
             (int)(in->s_addr >> 24) & 0xff);
 #endif
         break;
+#ifdef HAVE_IPV6
     case AF_INET6:
         pa_snprintf(dst, cnt, "%x:%x:%x:%x:%x:%x:%x:%x",
             in6->s6_addr[ 0] << 8 | in6->s6_addr[ 1],
@@ -68,6 +71,7 @@ const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt) {
             in6->s6_addr[12] << 8 | in6->s6_addr[13],
             in6->s6_addr[14] << 8 | in6->s6_addr[15]);
         break;
+#endif
     default:
         errno = EAFNOSUPPORT;
         return NULL;
diff --git a/src/pulsecore/inet_pton.c b/src/pulsecore/inet_pton.c
index d191e55..abdfa46 100644
--- a/src/pulsecore/inet_pton.c
+++ b/src/pulsecore/inet_pton.c
@@ -38,7 +38,9 @@
 
 int inet_pton(int af, const char *src, void *dst) {
     struct in_addr *in = (struct in_addr*)dst;
+#ifdef HAVE_IPV6
     struct in6_addr *in6 = (struct in6_addr*)dst;
+#endif
 
     assert(src && dst);
 
@@ -48,8 +50,10 @@ int inet_pton(int af, const char *src, void *dst) {
         if (in->s_addr == INADDR_NONE)
             return 0;
         break;
+#ifdef HAVE_IPV6
     case AF_INET6:
         /* FIXME */
+#endif
     default:
         errno = EAFNOSUPPORT;
         return -1;
diff --git a/src/pulsecore/ipacl.c b/src/pulsecore/ipacl.c
index 6d5080f..312e040 100644
--- a/src/pulsecore/ipacl.c
+++ b/src/pulsecore/ipacl.c
@@ -62,7 +62,9 @@ struct acl_entry {
     PA_LLIST_FIELDS(struct acl_entry);
     int family;
     struct in_addr address_ipv4;
+#ifdef HAVE_IPV6
     struct in6_addr address_ipv6;
+#endif
     int bits;
 };
 
@@ -109,6 +111,7 @@ pa_ip_acl* pa_ip_acl_new(const char *s) {
             if (e.bits < 32 && (uint32_t) (ntohl(e.address_ipv4.s_addr) << e.bits) != 0)
                 pa_log_warn("Host part of ACL entry '%s/%u' is not zero!", a, e.bits);
 
+#ifdef HAVE_IPV6
         } else if (inet_pton(AF_INET6, a, &e.address_ipv6) > 0) {
 
             e.bits = bits == (uint32_t) -1 ? 128 : (int) bits;
@@ -138,6 +141,7 @@ pa_ip_acl* pa_ip_acl_new(const char *s) {
                 if (t)
                     pa_log_warn("Host part of ACL entry '%s/%u' is not zero!", a, e.bits);
             }
+#endif
 
         } else {
             pa_log_warn("Failed to parse address: %s", a);
@@ -183,14 +187,20 @@ int pa_ip_acl_check(pa_ip_acl *acl, int fd) {
     if (getpeername(fd, (struct sockaddr*) &sa, &salen) < 0)
         return -1;
 
+#ifdef HAVE_IPV6
     if (sa.ss_family != AF_INET && sa.ss_family != AF_INET6)
+#else
+    if (sa.ss_family != AF_INET)
+#endif
         return -1;
 
     if (sa.ss_family == AF_INET && salen != sizeof(struct sockaddr_in))
         return -1;
 
+#ifdef HAVE_IPV6
     if (sa.ss_family == AF_INET6 && salen != sizeof(struct sockaddr_in6))
         return -1;
+#endif
 
     for (e = acl->entries; e; e = e->next) {
 
@@ -203,6 +213,7 @@ int pa_ip_acl_check(pa_ip_acl *acl, int fd) {
             if (e->bits == 0 || /* this needs special handling because >> takes the right-hand side modulo 32 */
                 (ntohl(sai->sin_addr.s_addr ^ e->address_ipv4.s_addr) >> (32 - e->bits)) == 0)
                 return 1;
+#ifdef HAVE_IPV6
         } else if (e->family == AF_INET6) {
             int i, bits ;
             struct sockaddr_in6 *sai = (struct sockaddr_in6*) &sa;
@@ -230,6 +241,7 @@ int pa_ip_acl_check(pa_ip_acl *acl, int fd) {
                 if (bits == 0)
                     return 1;
             }
+#endif
         }
     }
 
diff --git a/src/pulsecore/socket-client.c b/src/pulsecore/socket-client.c
index 6739eff..dc23bff 100644
--- a/src/pulsecore/socket-client.c
+++ b/src/pulsecore/socket-client.c
@@ -278,7 +278,11 @@ static int sockaddr_prepare(pa_socket_client *c, const struct sockaddr *sa, size
 
     pa_make_fd_cloexec(c->fd);
 
+#ifdef HAVE_IPV6
     if (sa->sa_family == AF_INET || sa->sa_family == AF_INET6)
+#else
+    if (sa->sa_family == AF_INET)
+#endif
         pa_make_tcp_socket_low_delay(c->fd);
     else
         pa_make_socket_low_delay(c->fd);
@@ -353,6 +357,7 @@ void pa_socket_client_set_callback(pa_socket_client *c, pa_socket_client_cb_t on
     c->userdata = userdata;
 }
 
+#ifdef HAVE_IPV6
 pa_socket_client* pa_socket_client_new_ipv6(pa_mainloop_api *m, uint8_t address[16], uint16_t port) {
     struct sockaddr_in6 sa;
 
@@ -367,6 +372,7 @@ pa_socket_client* pa_socket_client_new_ipv6(pa_mainloop_api *m, uint8_t address[
 
     return pa_socket_client_new_sockaddr(m, (struct sockaddr*) &sa, sizeof(sa));
 }
+#endif
 
 #ifdef HAVE_LIBASYNCNS
 
@@ -470,7 +476,15 @@ pa_socket_client* pa_socket_client_new_string(pa_mainloop_api *m, const char*nam
             pa_snprintf(port, sizeof(port), "%u", (unsigned) a.port);
 
             memset(&hints, 0, sizeof(hints));
-            hints.ai_family = a.type == PA_PARSED_ADDRESS_TCP4 ? PF_INET : (a.type == PA_PARSED_ADDRESS_TCP6 ? PF_INET6 : PF_UNSPEC);
+            if (a.type == PA_PARSED_ADDRESS_TCP4)
+                hints.ai_family = PF_INET;
+#ifdef HAVE_IPV6
+            else if (a.type == PA_PARSED_ADDRESS_TCP6)
+                hints.ai_family = PF_INET6;
+#endif
+            else
+                hints.ai_family = PF_UNSPEC;
+
             hints.ai_socktype = SOCK_STREAM;
 
 #if defined(HAVE_LIBASYNCNS)
@@ -509,11 +523,13 @@ pa_socket_client* pa_socket_client_new_string(pa_mainloop_api *m, const char*nam
                 struct hostent *host = NULL;
                 struct sockaddr_in s;
 
+#ifdef HAVE_IPV6
                 /* FIXME: PF_INET6 support */
                 if (hints.ai_family == PF_INET6) {
                     pa_log_error("IPv6 is not supported on Windows");
                     goto finish;
                 }
+#endif
 
                 host = gethostbyname(a.path_or_host);
                 if (!host) {
diff --git a/src/pulsecore/socket-client.h b/src/pulsecore/socket-client.h
index 9ceeadd..ed36400 100644
--- a/src/pulsecore/socket-client.h
+++ b/src/pulsecore/socket-client.h
@@ -35,7 +35,9 @@ typedef struct pa_socket_client pa_socket_client;
 typedef void (*pa_socket_client_cb_t)(pa_socket_client *c, pa_iochannel*io, void *userdata);
 
 pa_socket_client* pa_socket_client_new_ipv4(pa_mainloop_api *m, uint32_t address, uint16_t port);
+#ifdef HAVE_IPV6
 pa_socket_client* pa_socket_client_new_ipv6(pa_mainloop_api *m, uint8_t address[16], uint16_t port);
+#endif
 pa_socket_client* pa_socket_client_new_unix(pa_mainloop_api *m, const char *filename);
 pa_socket_client* pa_socket_client_new_sockaddr(pa_mainloop_api *m, const struct sockaddr *sa, size_t salen);
 pa_socket_client* pa_socket_client_new_string(pa_mainloop_api *m, const char *a, uint16_t default_port);
diff --git a/src/pulsecore/socket-server.c b/src/pulsecore/socket-server.c
index a600e0a..19c2fd0 100644
--- a/src/pulsecore/socket-server.c
+++ b/src/pulsecore/socket-server.c
@@ -289,6 +289,7 @@ fail:
     return NULL;
 }
 
+#ifdef HAVE_IPV6
 pa_socket_server* pa_socket_server_new_ipv6(pa_mainloop_api *m, const uint8_t address[16], uint16_t port, const char *tcpwrap_service) {
     pa_socket_server *ss;
     int fd = -1;
@@ -347,6 +348,7 @@ fail:
 
     return NULL;
 }
+#endif
 
 pa_socket_server* pa_socket_server_new_ipv4_loopback(pa_mainloop_api *m, uint16_t port, const char *tcpwrap_service) {
     pa_assert(m);
@@ -355,12 +357,14 @@ pa_socket_server* pa_socket_server_new_ipv4_loopback(pa_mainloop_api *m, uint16_
     return pa_socket_server_new_ipv4(m, INADDR_LOOPBACK, port, tcpwrap_service);
 }
 
+#ifdef HAVE_IPV6
 pa_socket_server* pa_socket_server_new_ipv6_loopback(pa_mainloop_api *m, uint16_t port, const char *tcpwrap_service) {
     pa_assert(m);
     pa_assert(port > 0);
 
     return pa_socket_server_new_ipv6(m, in6addr_loopback.s6_addr, port, tcpwrap_service);
 }
+#endif
 
 pa_socket_server* pa_socket_server_new_ipv4_any(pa_mainloop_api *m, uint16_t port, const char *tcpwrap_service) {
     pa_assert(m);
@@ -369,12 +373,14 @@ pa_socket_server* pa_socket_server_new_ipv4_any(pa_mainloop_api *m, uint16_t por
     return pa_socket_server_new_ipv4(m, INADDR_ANY, port, tcpwrap_service);
 }
 
+#ifdef HAVE_IPV6
 pa_socket_server* pa_socket_server_new_ipv6_any(pa_mainloop_api *m, uint16_t port, const char *tcpwrap_service) {
     pa_assert(m);
     pa_assert(port > 0);
 
     return pa_socket_server_new_ipv6(m, in6addr_any.s6_addr, port, tcpwrap_service);
 }
+#endif
 
 pa_socket_server* pa_socket_server_new_ipv4_string(pa_mainloop_api *m, const char *name, uint16_t port, const char *tcpwrap_service) {
     struct in_addr ipv4;
@@ -389,6 +395,7 @@ pa_socket_server* pa_socket_server_new_ipv4_string(pa_mainloop_api *m, const cha
     return NULL;
 }
 
+#ifdef HAVE_IPV6
 pa_socket_server* pa_socket_server_new_ipv6_string(pa_mainloop_api *m, const char *name, uint16_t port, const char *tcpwrap_service) {
     struct in6_addr ipv6;
 
@@ -401,6 +408,7 @@ pa_socket_server* pa_socket_server_new_ipv6_string(pa_mainloop_api *m, const cha
 
     return NULL;
 }
+#endif
 
 static void socket_server_free(pa_socket_server*s) {
     pa_assert(s);
@@ -441,6 +449,7 @@ char *pa_socket_server_get_address(pa_socket_server *s, char *c, size_t l) {
     pa_assert(l > 0);
 
     switch (s->type) {
+#ifdef HAVE_IPV6
         case SOCKET_SERVER_IPV6: {
             struct sockaddr_in6 sa;
             socklen_t sa_len = sizeof(sa);
@@ -476,6 +485,7 @@ char *pa_socket_server_get_address(pa_socket_server *s, char *c, size_t l) {
 
             return c;
         }
+#endif
 
         case SOCKET_SERVER_IPV4: {
             struct sockaddr_in sa;
diff --git a/src/pulsecore/socket-server.h b/src/pulsecore/socket-server.h
index 1edfb43..b9a2c40 100644
--- a/src/pulsecore/socket-server.h
+++ b/src/pulsecore/socket-server.h
@@ -34,13 +34,15 @@ typedef struct pa_socket_server pa_socket_server;
 pa_socket_server* pa_socket_server_new(pa_mainloop_api *m, int fd);
 pa_socket_server* pa_socket_server_new_unix(pa_mainloop_api *m, const char *filename);
 pa_socket_server* pa_socket_server_new_ipv4(pa_mainloop_api *m, uint32_t address, uint16_t port, const char *tcpwrap_service);
-pa_socket_server* pa_socket_server_new_ipv6(pa_mainloop_api *m, const uint8_t address[16], uint16_t port, const char *tcpwrap_service);
 pa_socket_server* pa_socket_server_new_ipv4_loopback(pa_mainloop_api *m, uint16_t port, const char *tcpwrap_service);
-pa_socket_server* pa_socket_server_new_ipv6_loopback(pa_mainloop_api *m, uint16_t port, const char *tcpwrap_service);
 pa_socket_server* pa_socket_server_new_ipv4_any(pa_mainloop_api *m, uint16_t port, const char *tcpwrap_service);
-pa_socket_server* pa_socket_server_new_ipv6_any(pa_mainloop_api *m, uint16_t port, const char *tcpwrap_service);
 pa_socket_server* pa_socket_server_new_ipv4_string(pa_mainloop_api *m, const char *name, uint16_t port, const char *tcpwrap_service);
+#ifdef HAVE_IPV6
+pa_socket_server* pa_socket_server_new_ipv6(pa_mainloop_api *m, const uint8_t address[16], uint16_t port, const char *tcpwrap_service);
+pa_socket_server* pa_socket_server_new_ipv6_loopback(pa_mainloop_api *m, uint16_t port, const char *tcpwrap_service);
+pa_socket_server* pa_socket_server_new_ipv6_any(pa_mainloop_api *m, uint16_t port, const char *tcpwrap_service);
 pa_socket_server* pa_socket_server_new_ipv6_string(pa_mainloop_api *m, const char *name, uint16_t port, const char *tcpwrap_service);
+#endif
 
 void pa_socket_server_unref(pa_socket_server*s);
 pa_socket_server* pa_socket_server_ref(pa_socket_server *s);
diff --git a/src/pulsecore/socket-util.c b/src/pulsecore/socket-util.c
index a092002..e44f646 100644
--- a/src/pulsecore/socket-util.c
+++ b/src/pulsecore/socket-util.c
@@ -93,7 +93,9 @@ void pa_socket_peer_to_string(int fd, char *c, size_t l) {
         union {
             struct sockaddr sa;
             struct sockaddr_in in;
+#ifdef HAVE_IPV6
             struct sockaddr_in6 in6;
+#endif
 #ifdef HAVE_SYS_UN_H
             struct sockaddr_un un;
 #endif
@@ -112,6 +114,7 @@ void pa_socket_peer_to_string(int fd, char *c, size_t l) {
                             ip & 0xFF,
                             ntohs(sa.in.sin_port));
                 return;
+#ifdef HAVE_IPV6
             } else if (sa.sa.sa_family == AF_INET6) {
                 char buf[INET6_ADDRSTRLEN];
                 const char *res;
@@ -121,6 +124,7 @@ void pa_socket_peer_to_string(int fd, char *c, size_t l) {
                     pa_snprintf(c, l, "TCP/IP client from [%s]:%u", buf, ntohs(sa.in6.sin6_port));
                     return;
                 }
+#endif
 #ifdef HAVE_SYS_UN_H
             } else if (sa.sa.sa_family == AF_UNIX) {
                 pa_snprintf(c, l, "UNIX socket client");
@@ -298,8 +302,10 @@ pa_bool_t pa_socket_address_is_local(const struct sockaddr *sa) {
         case AF_INET:
             return ((const struct sockaddr_in*) sa)->sin_addr.s_addr == INADDR_LOOPBACK;
 
+#ifdef HAVE_IPV6
         case AF_INET6:
             return memcmp(&((const struct sockaddr_in6*) sa)->sin6_addr, &in6addr_loopback, sizeof(struct in6_addr)) == 0;
+#endif
 
         default:
             return FALSE;
@@ -311,7 +317,9 @@ pa_bool_t pa_socket_is_local(int fd) {
     union {
         struct sockaddr sa;
         struct sockaddr_in in;
+#ifdef HAVE_IPV6
         struct sockaddr_in6 in6;
+#endif
 #ifdef HAVE_SYS_UN_H
         struct sockaddr_un un;
 #endif
diff --git a/src/tests/ipacl-test.c b/src/tests/ipacl-test.c
index bcdd469..7b7564a 100644
--- a/src/tests/ipacl-test.c
+++ b/src/tests/ipacl-test.c
@@ -30,7 +30,9 @@
 
 int main(int argc, char *argv[]) {
     struct sockaddr_in sa;
+#ifdef HAVE_IPV6
     struct sockaddr_in6 sa6;
+#endif
     int fd;
     int r;
     pa_ip_acl *acl;
@@ -87,6 +89,7 @@ int main(int argc, char *argv[]) {
 
     close(fd);
 
+#ifdef HAVE_IPV6
     fd = socket(PF_INET6, SOCK_STREAM, 0);
     assert(fd >= 0);
 
@@ -129,6 +132,7 @@ int main(int argc, char *argv[]) {
     pa_ip_acl_free(acl);
 
     close(fd);
+#endif
 
     return 0;
 }

commit d447a8dbbbc1aa4e5389ae1ea9880ddde6222590
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Feb 13 23:01:24 2009 +0100

    document all currently known properties

diff --git a/src/pulse/proplist.h b/src/pulse/proplist.h
index 57a23d9..c0c3459 100644
--- a/src/pulse/proplist.h
+++ b/src/pulse/proplist.h
@@ -30,110 +30,163 @@
 
 PA_C_DECL_BEGIN
 
-/* Defined properties:
- *
- *    media.name                    "Guns'N'Roses: Civil War"
- *    media.title                   "Civil War"
- *    media.artist                  "Guns'N'Roses"
- *    media.language                "de_DE"
- *    media.filename
- *    media.icon                    Binary blob containing PNG icon data
- *    media.icon_name               Name from XDG icon naming spec
- *    media.role                    video, music, game, event, phone, animation, production, filter, abstract, stream
- *    event.id                      Name from XDG sound naming spec
- *    event.description             "Button blabla clicked" for a11y
- *    event.mouse.x
- *    event.mouse.y
- *    event.mouse.hpos              Float formatted as string in range 0..1
- *    event.mouse.vpos              Float formatted as string in range 0..1
- *    event.mouse.button            Button number following X11 ordering
- *    window.name
- *    window.id                     "org.gnome.rhytmbox.MainWindow"
- *    window.icon                   Binary blob containing PNG icon data
- *    window.icon_name              Name from XDG icon naming spec
- *    window.x11.display
- *    window.x11.screen
- *    window.x11.monitor
- *    window.x11.xid
- *    application.name              "Rhythmbox Media Player"
- *    application.id                "org.gnome.rhythmbox"
- *    application.version
- *    application.icon              Binary blob containing PNG icon data
- *    application.icon_name         Name from XDG icon naming spec
- *    application.language
- *    application.process.id
- *    application.process.binary
- *    application.process.user
- *    application.process.host
- *    application.process.machine_id D-Bus machine ID
- *    device.string
- *    device.api                    oss, alsa, sunaudio
- *    device.description
- *    device.bus_path
- *    device.serial
- *    device.vendor_product_id
- *    device.class                  sound, modem, monitor, filter, abstract
- *    device.form_factor            laptop-speakers, external-speakers, telephone, tv-capture, webcam-capture, microphone-capture, headset, headphones, hands-free, car, hifi, computer, portable
- *    device.connector              isa, pci, usb, firewire, bluetooth
- *    device.access_mode            mmap, mmap_rewrite, serial
- *    device.master_device
- *    device.buffering.buffer_size
- *    device.buffering.fragment_size
- *    device.profile.name           analog-stereo, analog-surround-40, iec958-stereo, ...
- *    device.profile.description    "Analog Stereo", ...
- */
+/** For streams: localized media name, formatted as UTF-8. e.g. "Guns'N'Roses: Civil War".*/
 #define PA_PROP_MEDIA_NAME                     "media.name"
+
+/** For streams: localized media title if applicable, formatted as UTF-8. e.g. "Civil War" */
 #define PA_PROP_MEDIA_TITLE                    "media.title"
+
+/** For streams: localized media artist if applicable, formatted as UTF-8. e.g. "Guns'N'Roses" */
 #define PA_PROP_MEDIA_ARTIST                   "media.artist"
+
+/** For streams: media language if applicable, in standard POSIX format. e.g. "de_DE" */
 #define PA_PROP_MEDIA_LANGUAGE                 "media.language"
+
+/** For streams: source filename if applicable, in URI format or local path. e.g. "/home/lennart/music/foobar.ogg" */
 #define PA_PROP_MEDIA_FILENAME                 "media.filename"
+
+/** For streams: icon for the media. A binary blob containing PNG image data */
 #define PA_PROP_MEDIA_ICON                     "media.icon"
+
+/** For streams: an XDG icon name for the media. e.g. "audio-x-mp3" */
 #define PA_PROP_MEDIA_ICON_NAME                "media.icon_name"
+
+/** For streams: logic role of this media. One of the strings "video", "music", "game", "event", "phone", "animation", "production" */
 #define PA_PROP_MEDIA_ROLE                     "media.role"
+
+/** For event sound streams: XDG event sound name. e.g. "message-new-email" (Event sound streams are those with media.role set to "event") */
 #define PA_PROP_EVENT_ID                       "event.id"
+
+/** For event sound streams: localized human readable one-line description of the event, formatted as UTF-8. e.g. "Email from lennart at example.com received." */
 #define PA_PROP_EVENT_DESCRIPTION              "event.description"
+
+/** For event sound streams: absolute horizontal mouse position on the screen if the event sound was triggered by a mouse click, integer formatted as text string. e.g. "865" */
 #define PA_PROP_EVENT_MOUSE_X                  "event.mouse.x"
+
+/** For event sound streams: absolute vertical mouse position on the screen if the event sound was triggered by a mouse click, integer formatted as text string. e.g. "432" */
 #define PA_PROP_EVENT_MOUSE_Y                  "event.mouse.y"
+
+/** For event sound streams: relative horizontal mouse position on the screen if the event sound was triggered by a mouse click, float formatted as text string, ranging from 0.0 (left side of the screen) to 1.0 (right side of the screen). e.g. "0.65" */
 #define PA_PROP_EVENT_MOUSE_HPOS               "event.mouse.hpos"
+
+/** For event sound streams: relative vertical mouse position on the screen if the event sound was triggered by a mouse click, float formatted as text string, ranging from 0.0 (top of the screen) to 1.0 (bottom of the screen). e.g. "0.43" */
 #define PA_PROP_EVENT_MOUSE_VPOS               "event.mouse.vpos"
+
+/** For event sound streams: mouse button that triggered the event if applicable, integer formatted as string with 0=left, 1=middle, 2=right. e.g. "0" */
 #define PA_PROP_EVENT_MOUSE_BUTTON             "event.mouse.button"
+
+/** For streams that belong to a window on the screen: localized window title. e.g. "Totem Music Player" */
 #define PA_PROP_WINDOW_NAME                    "window.name"
+
+/** For streams that belong to a window on the screen: a textual id for identifying a window logically. e.g. "org.gnome.Totem.MainWindow" */
 #define PA_PROP_WINDOW_ID                      "window.id"
+
+/** For streams that belong to a window on the screen: window icon. A binary blob containing PNG image data */
 #define PA_PROP_WINDOW_ICON                    "window.icon"
+
+/** For streams that belong to a window on the screen: an XDG icon name for the window. e.g. "totem" */
 #define PA_PROP_WINDOW_ICON_NAME               "window.icon_name"
+
+/** For streams that belong to an X11 window on the screen: the X11 display string. e.g. ":0.0" */
 #define PA_PROP_WINDOW_X11_DISPLAY             "window.x11.display"
+
+/** For streams that belong to an X11 window on the screen: the X11 screen the window is on, an integer formatted as string. e.g. "0" */
 #define PA_PROP_WINDOW_X11_SCREEN              "window.x11.screen"
+
+/** For streams that belong to an X11 window on the screen: the X11 monitor the window is on, an integer formatted as string. e.g. "0" */
 #define PA_PROP_WINDOW_X11_MONITOR             "window.x11.monitor"
+
+/** For streams that belong to an X11 window on the screen: the window XID, an integer formatted as string. e.g. "25632" */
 #define PA_PROP_WINDOW_X11_XID                 "window.x11.xid"
+
+/** For clients/streams: localized human readable application name. e.g. "Totem Music Player" */
 #define PA_PROP_APPLICATION_NAME               "application.name"
+
+/** For clients/streams: a textual id for identifying an application logically. e.g. "org.gnome.Totem" */
 #define PA_PROP_APPLICATION_ID                 "application.id"
+
+/** For clients/streams: a version string e.g. "0.6.88" */
 #define PA_PROP_APPLICATION_VERSION            "application.version"
+
+/** For clients/streams: application icon. A binary blob containing PNG image data */
 #define PA_PROP_APPLICATION_ICON               "application.icon"
+
+/** For clients/streams: an XDG icon name for the application. e.g. "totem" */
 #define PA_PROP_APPLICATION_ICON_NAME          "application.icon_name"
+
+/** For clients/streams: application language if applicable, in standard POSIX format. e.g. "de_DE" */
 #define PA_PROP_APPLICATION_LANGUAGE           "application.language"
+
+/** For clients/streams on UNIX: application process PID, an integer formatted as string. e.g. "4711" */
 #define PA_PROP_APPLICATION_PROCESS_ID         "application.process.id"
+
+/** For clients/streams: application process name. e.g. "totem" */
 #define PA_PROP_APPLICATION_PROCESS_BINARY     "application.process.binary"
+
+/** For clients/streams: application user name. e.g. "lennart" */
 #define PA_PROP_APPLICATION_PROCESS_USER       "application.process.user"
+
+/** For clients/streams: host name the application runs on. e.g. "omega" */
 #define PA_PROP_APPLICATION_PROCESS_HOST       "application.process.host"
+
+/** For clients/streams: the D-Bus host id the application runs on. e.g. "543679e7b01393ed3e3e650047d78f6e" */
 #define PA_PROP_APPLICATION_PROCESS_MACHINE_ID "application.process.machine_id"
+
+/** For devices: device string in the underlying audio layer's format. e.g. "surround51:0" */
 #define PA_PROP_DEVICE_STRING                  "device.string"
+
+/** For devices: API this device is access with. e.g. "alsa" */
 #define PA_PROP_DEVICE_API                     "device.api"
+
+/** For devices: localized human readable device one-line description, e.g. "Foobar Industries USB Headset 2000+ Ultra" */
 #define PA_PROP_DEVICE_DESCRIPTION             "device.description"
+
+/** For devices: bus path to the device in the OS' format. e.g. "/sys/bus/pci/devices/0000:00:1f.2" */
 #define PA_PROP_DEVICE_BUS_PATH                "device.bus_path"
+
+/** For devices: serial number if applicable. e.g. "4711-0815-1234" */
 #define PA_PROP_DEVICE_SERIAL                  "device.serial"
+
+/** For devices: vendor/product ID if applicable. e.g. 1274:1371 */
 #define PA_PROP_DEVICE_VENDOR_PRODUCT_ID       "device.vendor_product_id"
+
+/** For devices: device class. One of "sound", "modem", "monitor", "filter" */
 #define PA_PROP_DEVICE_CLASS                   "device.class"
+
+/** For devices: form factor if applicable. One of "laptop-speakers", "external-speakers", "telephone", "tv-capture", "webcam-capture", "microphone-capture", "headset", "headphones", "hands-free", "car", "hifi", "computer", "portable" */
 #define PA_PROP_DEVICE_FORM_FACTOR             "device.form_factor"
+
+/** For devices: connector of the device if applicable. One of "isa", "pci", "usb", "firewire", "bluetooth" */
 #define PA_PROP_DEVICE_CONNECTOR               "device.connector"
+
+/** For devices: access mode of the device if applicable. One of "mmap", "mmap_rewrite", "serial" */
 #define PA_PROP_DEVICE_ACCESS_MODE             "device.access_mode"
+
+/** For filter devices: master device id if applicable. */
 #define PA_PROP_DEVICE_MASTER_DEVICE           "device.master_device"
+
+/** For devices: buffer size in bytes, integer formatted as string.. */
 #define PA_PROP_DEVICE_BUFFERING_BUFFER_SIZE   "device.buffering.buffer_size"
+
+/** For devices: fragment size in bytes, integer formatted as string. */
 #define PA_PROP_DEVICE_BUFFERING_FRAGMENT_SIZE "device.buffering.fragment_size"
+
+/** For devices: profile identifier for the profile this devices is in. e.g. "analog-stereo", "analog-surround-40", "iec958-stereo", ...*/
 #define PA_PROP_DEVICE_PROFILE_NAME            "device.profile.name"
+
+/** For devices: human readable one-line description of the profile this device is in. e.g. "Analog Stereo", ... */
 #define PA_PROP_DEVICE_PROFILE_DESCRIPTION     "device.profile.description"
+
+/** For modules: the author's name, formatted as UTF-8 string. e.g. "Lennart Poettering" */
 #define PA_PROP_MODULE_AUTHOR                  "module.author"
+
+/** For modules: a human readable one-line description of the module's purpose formatted as UTF-8. e.g. "Frobnicate sounds with a flux compensator" */
 #define PA_PROP_MODULE_DESCRIPTION             "module.description"
+
+/** For modules: a human readable usage description of the module's arguments formatted as UTF-8. */
 #define PA_PROP_MODULE_USAGE                   "module.usage"
+
+/** For modules: a version string for the module. e.g. "0.9.15" */
 #define PA_PROP_MODULE_VERSION                 "module.version"
 
 /** A property list object. Basically a dictionary with ASCII strings
@@ -179,17 +232,17 @@ int pa_proplist_get(pa_proplist *p, const char *key, const void **data, size_t *
 
 /** Update mode enum for pa_proplist_update(). \since 0.9.11 */
 typedef enum pa_update_mode {
-    PA_UPDATE_SET,
-    /*< Replace the entirey property list with the new one. Don't keep
-     *  any of the old data around */
+    PA_UPDATE_SET
+    /**< Replace the entirey property list with the new one. Don't keep
+     *  any of the old data around */,
 
-    PA_UPDATE_MERGE,
-    /*< Merge new property list into the existing one, not replacing
+    PA_UPDATE_MERGE
+    /**< Merge new property list into the existing one, not replacing
      *  any old entries if they share a common key with the new
-     *  property list. */
+     *  property list. */,
 
     PA_UPDATE_REPLACE
-    /*< Merge new property list into the existing one, replacing all
+    /**< Merge new property list into the existing one, replacing all
      *  old entries that share a common key with the new property
      *  list. */
 } pa_update_mode_t;

commit 023998e3c84c3158ab9f02e26949dbcd3e048886
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Feb 13 23:06:41 2009 +0100

    add doxygen comment for PA_GCC_WEAKREF

diff --git a/src/pulse/gccmacro.h b/src/pulse/gccmacro.h
index 8d9d4f0..f110a74 100644
--- a/src/pulse/gccmacro.h
+++ b/src/pulse/gccmacro.h
@@ -119,6 +119,7 @@
 
 #ifndef PA_GCC_WEAKREF
 #ifdef __GNUC__
+/** Macro for usgae of GCC's weakref attribute */
 #define PA_GCC_WEAKREF(x) __attribute__((weakref(#x)));
 #endif
 #endif

commit 6790c03f91708540da284c80d0cb72cacf41c83d
Author: Lennart Poettering <lennart at poettering.net>
Date:   Sat Feb 14 00:21:36 2009 +0100

    unify ALSA mixer initialization

diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c
index c56614c..1474cfe 100644
--- a/src/modules/alsa/alsa-sink.c
+++ b/src/modules/alsa/alsa-sink.c
@@ -1386,43 +1386,7 @@ pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_ca
     /* ALSA might tweak the sample spec, so recalculate the frame size */
     frame_size = pa_frame_size(&ss);
 
-    if ((err = snd_mixer_open(&u->mixer_handle, 0)) < 0)
-        pa_log_warn("Error opening mixer: %s", snd_strerror(err));
-    else {
-        pa_bool_t found = FALSE;
-
-        if (pa_alsa_prepare_mixer(u->mixer_handle, u->device_name) >= 0)
-            found = TRUE;
-        else {
-            snd_pcm_info_t *info;
-
-            snd_pcm_info_alloca(&info);
-
-            if (snd_pcm_info(u->pcm_handle, info) >= 0) {
-                char *md;
-                int card_idx;
-
-                if ((card_idx = snd_pcm_info_get_card(info)) >= 0) {
-
-                    md = pa_sprintf_malloc("hw:%i", card_idx);
-
-                    if (strcmp(u->device_name, md))
-                        if (pa_alsa_prepare_mixer(u->mixer_handle, md) >= 0)
-                            found = TRUE;
-                    pa_xfree(md);
-                }
-            }
-        }
-
-        if (found)
-            if (!(u->mixer_elem = pa_alsa_find_elem(u->mixer_handle, "Master", "PCM", TRUE)))
-                found = FALSE;
-
-        if (!found) {
-            snd_mixer_close(u->mixer_handle);
-            u->mixer_handle = NULL;
-        }
-    }
+    pa_alsa_find_mixer_and_elem(u->pcm_handle, &u->mixer_handle, &u->mixer_elem);
 
     pa_sink_new_data_init(&data);
     data.driver = driver;
diff --git a/src/modules/alsa/alsa-source.c b/src/modules/alsa/alsa-source.c
index 2b42d3f..192645d 100644
--- a/src/modules/alsa/alsa-source.c
+++ b/src/modules/alsa/alsa-source.c
@@ -1211,43 +1211,7 @@ pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, p
     /* ALSA might tweak the sample spec, so recalculate the frame size */
     frame_size = pa_frame_size(&ss);
 
-    if ((err = snd_mixer_open(&u->mixer_handle, 0)) < 0)
-        pa_log("Error opening mixer: %s", snd_strerror(err));
-    else {
-        pa_bool_t found = FALSE;
-
-        if (pa_alsa_prepare_mixer(u->mixer_handle, u->device_name) >= 0)
-            found = TRUE;
-        else {
-            snd_pcm_info_t* info;
-
-            snd_pcm_info_alloca(&info);
-
-            if (snd_pcm_info(u->pcm_handle, info) >= 0) {
-                char *md;
-                int card_idx;
-
-                if ((card_idx = snd_pcm_info_get_card(info)) >= 0) {
-
-                    md = pa_sprintf_malloc("hw:%i", card_idx);
-
-                    if (strcmp(u->device_name, md))
-                        if (pa_alsa_prepare_mixer(u->mixer_handle, md) >= 0)
-                            found = TRUE;
-                    pa_xfree(md);
-                }
-            }
-        }
-
-        if (found)
-            if (!(u->mixer_elem = pa_alsa_find_elem(u->mixer_handle, "Capture", "Mic", FALSE)))
-                found = FALSE;
-
-        if (!found) {
-            snd_mixer_close(u->mixer_handle);
-            u->mixer_handle = NULL;
-        }
-    }
+    pa_alsa_find_mixer_and_elem(u->pcm_handle, &u->mixer_handle, &u->mixer_elem);
 
     pa_source_new_data_init(&data);
     data.driver = driver;
diff --git a/src/modules/alsa/alsa-util.c b/src/modules/alsa/alsa-util.c
index 5236d02..d7caa0f 100644
--- a/src/modules/alsa/alsa-util.c
+++ b/src/modules/alsa/alsa-util.c
@@ -1057,6 +1057,86 @@ success:
     return elem;
 }
 
+
+int pa_alsa_find_mixer_and_elem(
+        snd_pcm_t *pcm,
+        snd_mixer_t **_m,
+        snd_mixer_elem_t **_e) {
+
+    int err;
+    snd_mixer_t *m;
+    snd_mixer_elem_t *e;
+    pa_bool_t found = FALSE;
+    const char *dev;
+
+    pa_assert(pcm);
+    pa_assert(_m);
+    pa_assert(_e);
+
+    if ((err = snd_mixer_open(&m, 0)) < 0) {
+        pa_log("Error opening mixer: %s", snd_strerror(err));
+        return -1;
+    }
+
+    /* First, try by name */
+    if ((dev = snd_pcm_name(pcm)))
+        if (pa_alsa_prepare_mixer(m, dev) >= 0)
+            found = TRUE;
+
+    /* Then, try by card index */
+    if (!found) {
+        snd_pcm_info_t* info;
+        snd_pcm_info_alloca(&info);
+
+        if (snd_pcm_info(pcm, info) >= 0) {
+            char *md;
+            int card_idx;
+
+            if ((card_idx = snd_pcm_info_get_card(info)) >= 0) {
+
+                md = pa_sprintf_malloc("hw:%i", card_idx);
+
+                if (!dev || !pa_streq(dev, md))
+                    if (pa_alsa_prepare_mixer(m, md) >= 0)
+                        found = TRUE;
+
+                pa_xfree(md);
+            }
+        }
+    }
+
+    if (!found) {
+        snd_mixer_close(m);
+        return -1;
+    }
+
+    switch (snd_pcm_stream(pcm)) {
+
+        case SND_PCM_STREAM_PLAYBACK:
+            e = pa_alsa_find_elem(m, "Master", "PCM", TRUE);
+            break;
+
+        case SND_PCM_STREAM_CAPTURE:
+            e = pa_alsa_find_elem(m, "Capture", "Mic", FALSE);
+            break;
+
+        default:
+            pa_assert_not_reached();
+    }
+
+    if (!e) {
+        snd_mixer_close(m);
+        return -1;
+    }
+
+    pa_assert(e && m);
+
+    *_m = m;
+    *_e = e;
+
+    return 0;
+}
+
 static const snd_mixer_selem_channel_id_t alsa_channel_ids[PA_CHANNEL_POSITION_MAX] = {
     [PA_CHANNEL_POSITION_MONO] = SND_MIXER_SCHN_MONO, /* The ALSA name is just an alias! */
 
diff --git a/src/modules/alsa/alsa-util.h b/src/modules/alsa/alsa-util.h
index 8a20934..8b08339 100644
--- a/src/modules/alsa/alsa-util.h
+++ b/src/modules/alsa/alsa-util.h
@@ -54,6 +54,7 @@ int pa_alsa_set_sw_params(snd_pcm_t *pcm, snd_pcm_uframes_t avail_min);
 
 int pa_alsa_prepare_mixer(snd_mixer_t *mixer, const char *dev);
 snd_mixer_elem_t *pa_alsa_find_elem(snd_mixer_t *mixer, const char *name, const char *fallback, pa_bool_t playback);
+int pa_alsa_find_mixer_and_elem(snd_pcm_t *pcm, snd_mixer_t **_m, snd_mixer_elem_t **_e);
 
 typedef struct pa_alsa_profile_info {
     pa_channel_map map;

commit a571565f86a34d4ce4f16669c021be92494e132d
Author: Lennart Poettering <lennart at poettering.net>
Date:   Sun Feb 15 20:34:38 2009 +0100

    don't open the alsa devices in hw:xxx mode

diff --git a/src/modules/module-detect.c b/src/modules/module-detect.c
index 9ed262d..773e1d8 100644
--- a/src/modules/module-detect.c
+++ b/src/modules/module-detect.c
@@ -100,7 +100,7 @@ static int detect_alsa(pa_core *c, int just_one) {
         if (subdevice != 0)
             continue;
 
-        pa_snprintf(args, sizeof(args), "device=hw:%u", device);
+        pa_snprintf(args, sizeof(args), "device_id=%u", device);
         if (!pa_module_load(c, is_sink ? "module-alsa-sink" : "module-alsa-source", args))
             continue;
 

commit 0b8a6c66dc0dec79110f40ffa6ee791b4c557ca8
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Feb 13 00:14:48 2009 +0200

    bluetooth: fix message queue/rtpoll

diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c
index 6daae83..35338dc 100644
--- a/src/modules/bluetooth/module-bluetooth-device.c
+++ b/src/modules/bluetooth/module-bluetooth-device.c
@@ -1349,9 +1349,6 @@ static int add_sink(struct userdata *u) {
 
         u->sink->userdata = u;
         u->sink->parent.process_msg = sink_process_msg;
-
-        pa_sink_set_asyncmsgq(u->sink, u->thread_mq.inq);
-        pa_sink_set_rtpoll(u->sink, u->rtpoll);
     }
 
 /*     u->sink->get_volume = sink_get_volume_cb; */
@@ -1396,9 +1393,6 @@ static int add_source(struct userdata *u) {
 
         u->source->userdata = u;
         u->source->parent.process_msg = source_process_msg;
-
-        pa_source_set_asyncmsgq(u->source, u->thread_mq.inq);
-        pa_source_set_rtpoll(u->source, u->rtpoll);
     }
 
 /*     u->source->get_volume = source_get_volume_cb; */
@@ -1559,11 +1553,17 @@ static int start_thread(struct userdata *u) {
         return -1;
     }
 
-    if (u->sink)
+    if (u->sink) {
+        pa_sink_set_asyncmsgq(u->sink, u->thread_mq.inq);
+        pa_sink_set_rtpoll(u->sink, u->rtpoll);
         pa_sink_put(u->sink);
+    }
 
-    if (u->source)
+    if (u->source) {
+        pa_source_set_asyncmsgq(u->source, u->thread_mq.inq);
+        pa_source_set_rtpoll(u->source, u->rtpoll);
         pa_source_put(u->source);
+    }
 
     return 0;
 }

commit b51e6135e87221b05acb1e8796d28bec1cf06dff
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Wed Feb 18 15:20:08 2009 +0200

    bluetooth: update SBC from upstream

diff --git a/src/modules/bluetooth/sbc.c b/src/modules/bluetooth/sbc.c
index 29258d0..a33ed57 100644
--- a/src/modules/bluetooth/sbc.c
+++ b/src/modules/bluetooth/sbc.c
@@ -985,7 +985,7 @@ int sbc_decode(sbc_t *sbc, void *input, int input_len, void *output,
 	char *ptr;
 	int i, ch, framelen, samples;
 
-	if (!sbc && !input)
+	if (!sbc || !input)
 		return -EIO;
 
 	priv = sbc->priv;
@@ -1053,7 +1053,7 @@ int sbc_encode(sbc_t *sbc, void *input, int input_len, void *output,
 			const uint8_t *pcm, int16_t X[2][SBC_X_BUFFER_SIZE],
 			int nsamples, int nchannels);
 
-	if (!sbc && !input)
+	if (!sbc || !input)
 		return -EIO;
 
 	priv = sbc->priv;
@@ -1221,6 +1221,20 @@ uint16_t sbc_get_codesize(sbc_t *sbc)
 	return subbands * blocks * channels * 2;
 }
 
+const char *sbc_get_implementation_info(sbc_t *sbc)
+{
+	struct sbc_priv *priv;
+
+	if (!sbc)
+		return NULL;
+
+	priv = sbc->priv;
+	if (!priv)
+		return NULL;
+
+	return priv->enc_state.implementation_info;
+}
+
 int sbc_reinit(sbc_t *sbc, unsigned long flags)
 {
 	struct sbc_priv *priv;
diff --git a/src/modules/bluetooth/sbc.h b/src/modules/bluetooth/sbc.h
index b0a1488..f9d506b 100644
--- a/src/modules/bluetooth/sbc.h
+++ b/src/modules/bluetooth/sbc.h
@@ -89,6 +89,7 @@ int sbc_encode(sbc_t *sbc, void *input, int input_len, void *output,
 int sbc_get_frame_length(sbc_t *sbc);
 int sbc_get_frame_duration(sbc_t *sbc);
 uint16_t sbc_get_codesize(sbc_t *sbc);
+const char *sbc_get_implementation_info(sbc_t *sbc);
 void sbc_finish(sbc_t *sbc);
 
 #ifdef __cplusplus
diff --git a/src/modules/bluetooth/sbc_primitives.c b/src/modules/bluetooth/sbc_primitives.c
index 303f3fe..6b0be3f 100644
--- a/src/modules/bluetooth/sbc_primitives.c
+++ b/src/modules/bluetooth/sbc_primitives.c
@@ -456,6 +456,7 @@ void sbc_init_primitives(struct sbc_encoder_state *state)
 
 	/* Default implementation for scale factors calculation */
 	state->sbc_calc_scalefactors = sbc_calc_scalefactors;
+	state->implementation_info = "Generic C";
 
 	/* X86/AMD64 optimizations */
 #ifdef SBC_BUILD_WITH_MMX_SUPPORT
diff --git a/src/modules/bluetooth/sbc_primitives.h b/src/modules/bluetooth/sbc_primitives.h
index 2708c82..3d01c11 100644
--- a/src/modules/bluetooth/sbc_primitives.h
+++ b/src/modules/bluetooth/sbc_primitives.h
@@ -62,6 +62,7 @@ struct sbc_encoder_state {
 	void (*sbc_calc_scalefactors)(int32_t sb_sample_f[16][2][8],
 			uint32_t scale_factor[2][8],
 			int blocks, int channels, int subbands);
+	const char *implementation_info;
 };
 
 /*
diff --git a/src/modules/bluetooth/sbc_primitives_mmx.c b/src/modules/bluetooth/sbc_primitives_mmx.c
index 1870a9b..08e9ca2 100644
--- a/src/modules/bluetooth/sbc_primitives_mmx.c
+++ b/src/modules/bluetooth/sbc_primitives_mmx.c
@@ -313,6 +313,7 @@ void sbc_init_primitives_mmx(struct sbc_encoder_state *state)
 	if (check_mmx_support()) {
 		state->sbc_analyze_4b_4s = sbc_analyze_4b_4s_mmx;
 		state->sbc_analyze_4b_8s = sbc_analyze_4b_8s_mmx;
+		state->implementation_info = "MMX";
 	}
 }
 
diff --git a/src/modules/bluetooth/sbc_primitives_neon.c b/src/modules/bluetooth/sbc_primitives_neon.c
index d9c12f9..f1bc7b4 100644
--- a/src/modules/bluetooth/sbc_primitives_neon.c
+++ b/src/modules/bluetooth/sbc_primitives_neon.c
@@ -240,6 +240,7 @@ void sbc_init_primitives_neon(struct sbc_encoder_state *state)
 {
 	state->sbc_analyze_4b_4s = sbc_analyze_4b_4s_neon;
 	state->sbc_analyze_4b_8s = sbc_analyze_4b_8s_neon;
+	state->implementation_info = "NEON";
 }
 
 #endif

commit b4c391ee5eaa61c31fa297b6b3f6e3a65d662948
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Fri Feb 13 12:18:14 2009 +0200

    bluetooth: don't crash on pa_thread_mq_done() if pa_init() fail

diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c
index 35338dc..748a2d4 100644
--- a/src/modules/bluetooth/module-bluetooth-device.c
+++ b/src/modules/bluetooth/module-bluetooth-device.c
@@ -1517,9 +1517,9 @@ static void stop_thread(struct userdata *u) {
         u->source = NULL;
     }
 
-    pa_thread_mq_done(&u->thread_mq);
-
     if (u->rtpoll) {
+        pa_thread_mq_done(&u->thread_mq);
+
         pa_rtpoll_free(u->rtpoll);
         u->rtpoll = NULL;
     }

commit 38ded3bb31bc49664641965f856a35f432a8a956
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Fri Feb 13 15:09:16 2009 +0200

    bluetooth: print SBC encoder implementation info
    
    The encoder initialization is done lazily, so we can only get the
    information once encoding start. This is abit annoying..

diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c
index 748a2d4..b8f6729 100644
--- a/src/modules/bluetooth/module-bluetooth-device.c
+++ b/src/modules/bluetooth/module-bluetooth-device.c
@@ -904,6 +904,11 @@ static int a2dp_process_render(struct userdata *u) {
                              (void*) p, u->write_memchunk.length,
                              d, left,
                              &written);
+
+        PA_ONCE_BEGIN {
+            pa_log_debug("Using SBC encoder implementation: %s", pa_strnull(sbc_get_implementation_info(&a2dp->sbc)));
+        } PA_ONCE_END;
+
         pa_memblock_release(u->write_memchunk.memblock);
 
         if (encoded <= 0) {

commit 05b74404813931744e1479c96f039ae2a79b0c7d
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Wed Feb 18 16:51:37 2009 +0200

    pulse/context: add --enable-legacy-runtime-dir

diff --git a/configure.ac b/configure.ac
index c28a72c..2ac40cc 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1220,6 +1220,12 @@ AC_SUBST(PA_SYSTEM_STATE_PATH)
 #            Output               #
 ###################################
 
+AC_ARG_ENABLE([legacy-runtime-dir],
+        AS_HELP_STRING([--disable-legacy-runtime-dir], [Try to connect on legacy (< 0.9.12) socket paths.]))
+if test "x$enable_legacy_runtime_dir" != "xno" ; then
+        AC_DEFINE(ENABLE_LEGACY_RUNTIME_DIR, [1], [Legacy runtime dir])
+fi
+
 AC_ARG_ENABLE(
         [static-bins],
         AS_HELP_STRING([--enable-static-bins],[Statically link executables.]),
diff --git a/src/pulse/context.c b/src/pulse/context.c
index 8686e0d..9cc1ea7 100644
--- a/src/pulse/context.c
+++ b/src/pulse/context.c
@@ -555,6 +555,7 @@ static void setup_context(pa_context *c, pa_iochannel *io) {
     pa_context_unref(c);
 }
 
+#if ENABLE_LEGACY_RUNTIME_DIR
 static char *get_old_legacy_runtime_dir(void) {
     char *p, u[128];
     struct stat st;
@@ -598,10 +599,12 @@ static char *get_very_old_legacy_runtime_dir(void) {
 
     return p;
 }
-
+#endif
 
 static pa_strlist *prepend_per_user(pa_strlist *l) {
     char *ufn;
+
+#if ENABLE_LEGACY_RUNTIME_DIR
     static char *legacy_dir;
 
     /* The very old per-user instance path (< 0.9.11). This is supported only to ease upgrades */
@@ -619,6 +622,7 @@ static pa_strlist *prepend_per_user(pa_strlist *l) {
         pa_xfree(p);
         pa_xfree(legacy_dir);
     }
+#endif
 
     /* The per-user instance */
     if ((ufn = pa_runtime_path(PA_NATIVE_DEFAULT_UNIX_SOCKET))) {

commit c1892f29de7962a95806f78719d0ff9af87b49a3
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Feb 18 21:44:30 2009 +0100

    bump required alsa version

diff --git a/configure.ac b/configure.ac
index c28a72c..ddf7a1c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -638,7 +638,7 @@ AC_ARG_ENABLE([alsa],
         [alsa=auto])
 
 if test "x${alsa}" != xno ; then
-    PKG_CHECK_MODULES(ASOUNDLIB, [ alsa >= 1.0.17 ],
+    PKG_CHECK_MODULES(ASOUNDLIB, [ alsa >= 1.0.19 ],
         [
             HAVE_ALSA=1
             AC_DEFINE([HAVE_ALSA], 1, [Have ALSA?])
@@ -646,7 +646,7 @@ if test "x${alsa}" != xno ; then
         [
             HAVE_ALSA=0
             if test "x$alsa" = xyes ; then
-                AC_MSG_ERROR([*** Needed alsa >= 1.0.17 support not found])
+                AC_MSG_ERROR([*** Needed alsa >= 1.0.19 support not found])
             fi
         ])
 else

commit c9c63c295f8f7bfa825a095d6e09b199c9eab859
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Feb 18 21:45:06 2009 +0100

    allow pa to be run in a chroot() environment tht lacks /proc

diff --git a/src/daemon/main.c b/src/daemon/main.c
index 936c214..d3e02fa 100644
--- a/src/daemon/main.c
+++ b/src/daemon/main.c
@@ -369,8 +369,11 @@ int main(int argc, char *argv[]) {
          * value of $LD_BIND_NOW on initialization. */
 
         pa_set_env("LD_BIND_NOW", "1");
-        pa_assert_se(rp = pa_readlink("/proc/self/exe"));
-        pa_assert_se(execv(rp, argv) == 0);
+
+        if ((rp = pa_readlink("/proc/self/exe")))
+            pa_assert_se(execv(rp, argv) == 0);
+        else
+            pa_log_warn("Couldn't read /proc/self/exe, cannot self execute. Running in a chroot()?");
     }
 #endif
 

commit ff58fa8870a62c88dba0fb26a77331e1f27c73a8
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Feb 18 21:49:31 2009 +0100

    simplify pa_alsa_init_proplist_pcm() a bit and include resolution bits in alsa device props

diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c
index 1474cfe..5fc3468 100644
--- a/src/modules/alsa/alsa-sink.c
+++ b/src/modules/alsa/alsa-sink.c
@@ -1236,14 +1236,11 @@ pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_ca
     uint32_t nfrags, hwbuf_size, frag_size, tsched_size, tsched_watermark;
     snd_pcm_uframes_t period_frames, tsched_frames;
     size_t frame_size;
-    snd_pcm_info_t *pcm_info = NULL;
     int err;
     pa_bool_t use_mmap = TRUE, b, use_tsched = TRUE, d, ignore_dB = FALSE;
     pa_usec_t usec;
     pa_sink_new_data data;
 
-    snd_pcm_info_alloca(&pcm_info);
-
     pa_assert(m);
     pa_assert(ma);
 
@@ -1378,11 +1375,6 @@ pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_ca
     if (u->use_tsched)
         pa_log_info("Successfully enabled timer-based scheduling mode.");
 
-    if ((err = snd_pcm_info(u->pcm_handle, pcm_info)) < 0) {
-        pa_log("Error fetching PCM info: %s", snd_strerror(err));
-        goto fail;
-    }
-
     /* ALSA might tweak the sample spec, so recalculate the frame size */
     frame_size = pa_frame_size(&ss);
 
@@ -1396,7 +1388,7 @@ pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_ca
     pa_sink_new_data_set_sample_spec(&data, &ss);
     pa_sink_new_data_set_channel_map(&data, &map);
 
-    pa_alsa_init_proplist_pcm(m->core, data.proplist, pcm_info);
+    pa_alsa_init_proplist_pcm(m->core, data.proplist, u->pcm_handle);
     pa_proplist_sets(data.proplist, PA_PROP_DEVICE_STRING, u->device_name);
     pa_proplist_setf(data.proplist, PA_PROP_DEVICE_BUFFERING_BUFFER_SIZE, "%lu", (unsigned long) (period_frames * frame_size * nfrags));
     pa_proplist_setf(data.proplist, PA_PROP_DEVICE_BUFFERING_FRAGMENT_SIZE, "%lu", (unsigned long) (period_frames * frame_size));
diff --git a/src/modules/alsa/alsa-source.c b/src/modules/alsa/alsa-source.c
index 192645d..1909cae 100644
--- a/src/modules/alsa/alsa-source.c
+++ b/src/modules/alsa/alsa-source.c
@@ -1071,13 +1071,10 @@ pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, p
     uint32_t nfrags, hwbuf_size, frag_size, tsched_size, tsched_watermark;
     snd_pcm_uframes_t period_frames, tsched_frames;
     size_t frame_size;
-    snd_pcm_info_t *pcm_info = NULL;
     int err;
     pa_bool_t use_mmap = TRUE, b, use_tsched = TRUE, d, ignore_dB = FALSE;
     pa_source_new_data data;
 
-    snd_pcm_info_alloca(&pcm_info);
-
     pa_assert(m);
 
     ss = m->core->default_sample_spec;
@@ -1203,11 +1200,6 @@ pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, p
     if (u->use_tsched)
         pa_log_info("Successfully enabled timer-based scheduling mode.");
 
-    if ((err = snd_pcm_info(u->pcm_handle, pcm_info)) < 0) {
-        pa_log("Error fetching PCM info: %s", snd_strerror(err));
-        goto fail;
-    }
-
     /* ALSA might tweak the sample spec, so recalculate the frame size */
     frame_size = pa_frame_size(&ss);
 
@@ -1221,7 +1213,7 @@ pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, p
     pa_source_new_data_set_sample_spec(&data, &ss);
     pa_source_new_data_set_channel_map(&data, &map);
 
-    pa_alsa_init_proplist_pcm(m->core, data.proplist, pcm_info);
+    pa_alsa_init_proplist_pcm(m->core, data.proplist, u->pcm_handle);
     pa_proplist_sets(data.proplist, PA_PROP_DEVICE_STRING, u->device_name);
     pa_proplist_setf(data.proplist, PA_PROP_DEVICE_BUFFERING_BUFFER_SIZE, "%lu", (unsigned long) (period_frames * frame_size * nfrags));
     pa_proplist_setf(data.proplist, PA_PROP_DEVICE_BUFFERING_FRAGMENT_SIZE, "%lu", (unsigned long) (period_frames * frame_size));
diff --git a/src/modules/alsa/alsa-util.c b/src/modules/alsa/alsa-util.c
index d7caa0f..7cecfd1 100644
--- a/src/modules/alsa/alsa-util.c
+++ b/src/modules/alsa/alsa-util.c
@@ -37,6 +37,7 @@
 #include <pulsecore/macro.h>
 #include <pulsecore/core-util.h>
 #include <pulsecore/atomic.h>
+#include <pulsecore/core-error.h>
 
 #include "alsa-util.h"
 
@@ -1361,7 +1362,7 @@ void pa_alsa_init_proplist_card(pa_core *c, pa_proplist *p, int card) {
 #endif
 }
 
-void pa_alsa_init_proplist_pcm(pa_core *c, pa_proplist *p, snd_pcm_info_t *pcm_info) {
+void pa_alsa_init_proplist_pcm_info(pa_core *c, pa_proplist *p, snd_pcm_info_t *pcm_info) {
 
     static const char * const alsa_class_table[SND_PCM_CLASS_LAST+1] = {
         [SND_PCM_CLASS_GENERIC] = "generic",
@@ -1427,6 +1428,28 @@ void pa_alsa_init_proplist_pcm(pa_core *c, pa_proplist *p, snd_pcm_info_t *pcm_i
         pa_proplist_sets(p, PA_PROP_DEVICE_DESCRIPTION, n);
 }
 
+void pa_alsa_init_proplist_pcm(pa_core *c, pa_proplist *p, snd_pcm_t *pcm) {
+    snd_pcm_hw_params_t *hwparams;
+    snd_pcm_info_t *info;
+    int bits, err;
+
+    snd_pcm_hw_params_alloca(&hwparams);
+    snd_pcm_info_alloca(&info);
+
+    if ((err = snd_pcm_hw_params_current(pcm, hwparams)) < 0)
+        pa_log_warn("Error fetching hardware parameter info: %s", snd_strerror(err));
+    else {
+
+        if ((bits = snd_pcm_hw_params_get_sbits(hwparams)) >= 0)
+            pa_proplist_setf(p, "alsa.resolution_bits", "%i", bits);
+    }
+
+    if ((err = snd_pcm_info(pcm, info)) < 0)
+        pa_log_warn("Error fetching PCM info: %s", snd_strerror(err));
+    else
+        pa_alsa_init_proplist_pcm_info(c, p, info);
+}
+
 int pa_alsa_recover_from_poll(snd_pcm_t *pcm, int revents) {
     snd_pcm_state_t state;
     int err;
diff --git a/src/modules/alsa/alsa-util.h b/src/modules/alsa/alsa-util.h
index 8b08339..9eab644 100644
--- a/src/modules/alsa/alsa-util.h
+++ b/src/modules/alsa/alsa-util.h
@@ -120,8 +120,9 @@ void pa_alsa_dump_status(snd_pcm_t *pcm);
 void pa_alsa_redirect_errors_inc(void);
 void pa_alsa_redirect_errors_dec(void);
 
-void pa_alsa_init_proplist_pcm(pa_core *c, pa_proplist *p, snd_pcm_info_t *pcm_info);
+void pa_alsa_init_proplist_pcm_info(pa_core *c, pa_proplist *p, snd_pcm_info_t *pcm_info);
 void pa_alsa_init_proplist_card(pa_core *c, pa_proplist *p, int card);
+void pa_alsa_init_proplist_pcm(pa_core *c, pa_proplist *p, snd_pcm_t *pcm);
 
 int pa_alsa_recover_from_poll(snd_pcm_t *pcm, int revents);
 

commit dc1ad08a65302c537d607f29be51a0c64cddec7c
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Feb 18 21:50:09 2009 +0100

    minor optimizations

diff --git a/src/modules/alsa/alsa-util.c b/src/modules/alsa/alsa-util.c
index 7cecfd1..50ba35a 100644
--- a/src/modules/alsa/alsa-util.c
+++ b/src/modules/alsa/alsa-util.c
@@ -343,7 +343,8 @@ int pa_alsa_set_hw_params(
         goto finish;
 
     if (_use_mmap) {
-        if ((ret = snd_pcm_hw_params_set_access(pcm_handle, hwparams, SND_PCM_ACCESS_MMAP_INTERLEAVED)) < 0) {
+
+        if (snd_pcm_hw_params_set_access(pcm_handle, hwparams, SND_PCM_ACCESS_MMAP_INTERLEAVED) < 0) {
 
             /* mmap() didn't work, fall back to interleaved */
 
@@ -806,8 +807,7 @@ snd_pcm_t *pa_alsa_open_by_device_string(
                                 SND_PCM_NO_AUTO_CHANNELS|
                                 (reformat ? 0 : SND_PCM_NO_AUTO_FORMAT))) < 0) {
             pa_log_info("Error opening PCM device %s: %s", d, snd_strerror(err));
-            pa_xfree(d);
-            return NULL;
+            goto fail;
         }
 
         if ((err = pa_alsa_set_hw_params(pcm_handle, ss, nfrags, period_size, tsched_size, use_mmap, use_tsched, require_exact_channel_number)) < 0) {
@@ -835,9 +835,9 @@ snd_pcm_t *pa_alsa_open_by_device_string(
             }
 
             pa_log_info("Failed to set hardware parameters on %s: %s", d, snd_strerror(err));
-            pa_xfree(d);
             snd_pcm_close(pcm_handle);
-            return NULL;
+
+            goto fail;
         }
 
         if (dev)
@@ -850,6 +850,11 @@ snd_pcm_t *pa_alsa_open_by_device_string(
 
         return pcm_handle;
     }
+
+fail:
+    pa_xfree(d);
+
+    return NULL;
 }
 
 int pa_alsa_probe_profiles(

commit 07333f8cae480a25af02ad32286ab38d4272698e
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Feb 18 21:50:27 2009 +0100

    refer folks to the ALSA devs, not us

diff --git a/src/modules/alsa/alsa-util.c b/src/modules/alsa/alsa-util.c
index 50ba35a..1bb7ddf 100644
--- a/src/modules/alsa/alsa-util.c
+++ b/src/modules/alsa/alsa-util.c
@@ -1553,8 +1553,8 @@ snd_pcm_sframes_t pa_alsa_safe_avail_update(snd_pcm_t *pcm, size_t hwbuf_size, c
 
     if (k >= hwbuf_size * 3 ||
         k >= pa_bytes_per_second(ss)*10)
-        pa_log("snd_pcm_avail_update() returned a value that is exceptionally large: %lu bytes (%lu ms) "
-               "Most likely this is an ALSA driver bug. Please report this issue to the PulseAudio developers.",
+        pa_log("snd_pcm_avail_update() returned a value that is exceptionally large: %lu bytes (%lu ms). "
+               "Most likely this is an ALSA driver bug. Please report this issue to the ALSA developers.",
                (unsigned long) k, (unsigned long) (pa_bytes_to_usec(k, ss) / PA_USEC_PER_MSEC));
 
     return n;
@@ -1585,8 +1585,8 @@ int pa_alsa_safe_mmap_begin(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas
         k >= hwbuf_size * 3 ||
         k >= pa_bytes_per_second(ss)*10)
 
-        pa_log("snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes (%lu ms) "
-               "Most likely this is an ALSA driver bug. Please report this issue to the PulseAudio developers.",
+        pa_log("snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes (%lu ms). "
+               "Most likely this is an ALSA driver bug. Please report this issue to the ALSA developers.",
                (unsigned long) k, (unsigned long) (pa_bytes_to_usec(k, ss) / PA_USEC_PER_MSEC));
 
     return r;

commit 1737a19c86d34d1a3721d019f649beaa9aea02b3
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Feb 18 21:52:21 2009 +0100

    allow importing of more memory blocks than exporting

diff --git a/src/pulsecore/memblock.c b/src/pulsecore/memblock.c
index 1d7f455..fbf0a47 100644
--- a/src/pulsecore/memblock.c
+++ b/src/pulsecore/memblock.c
@@ -57,7 +57,7 @@
 
 #define PA_MEMEXPORT_SLOTS_MAX 128
 
-#define PA_MEMIMPORT_SLOTS_MAX 128
+#define PA_MEMIMPORT_SLOTS_MAX 160
 #define PA_MEMIMPORT_SEGMENTS_MAX 16
 
 struct pa_memblock {

commit be81a681ac84ac56208c3bb315e04d04c2e53606
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Feb 18 21:55:55 2009 +0100

    if we fail to import a memblock fill in silence to guarantee stability of timing

diff --git a/src/pulse/context.c b/src/pulse/context.c
index 8686e0d..d8d0a51 100644
--- a/src/pulse/context.c
+++ b/src/pulse/context.c
@@ -335,8 +335,7 @@ static void pstream_memblock_callback(pa_pstream *p, uint32_t channel, int64_t o
 
     pa_assert(p);
     pa_assert(chunk);
-    pa_assert(chunk->memblock);
-    pa_assert(chunk->length);
+    pa_assert(chunk->length > 0);
     pa_assert(c);
     pa_assert(PA_REFCNT_VALUE(c) >= 1);
 
@@ -344,11 +343,11 @@ static void pstream_memblock_callback(pa_pstream *p, uint32_t channel, int64_t o
 
     if ((s = pa_dynarray_get(c->record_streams, channel))) {
 
-        pa_assert(seek == PA_SEEK_RELATIVE);
-        pa_assert(offset == 0);
-
-        pa_memblockq_seek(s->record_memblockq, offset, seek);
-        pa_memblockq_push_align(s->record_memblockq, chunk);
+        if (chunk->memblock) {
+            pa_memblockq_seek(s->record_memblockq, offset, seek);
+            pa_memblockq_push_align(s->record_memblockq, chunk);
+        } else
+            pa_memblockq_seek(s->record_memblockq, offset+chunk->length, seek);
 
         if (s->read_callback) {
             size_t l;
diff --git a/src/pulsecore/protocol-native.c b/src/pulsecore/protocol-native.c
index c303261..fd7d936 100644
--- a/src/pulsecore/protocol-native.c
+++ b/src/pulsecore/protocol-native.c
@@ -4144,17 +4144,20 @@ static void pstream_memblock_callback(pa_pstream *p, uint32_t channel, int64_t o
     if (playback_stream_isinstance(stream)) {
         playback_stream *ps = PLAYBACK_STREAM(stream);
 
-        if (seek != PA_SEEK_RELATIVE || offset != 0)
-            pa_asyncmsgq_post(ps->sink_input->sink->asyncmsgq, PA_MSGOBJECT(ps->sink_input), SINK_INPUT_MESSAGE_SEEK, PA_UINT_TO_PTR(seek), offset, NULL, NULL);
+        if (chunk->memblock) {
+            if (seek != PA_SEEK_RELATIVE || offset != 0)
+                pa_asyncmsgq_post(ps->sink_input->sink->asyncmsgq, PA_MSGOBJECT(ps->sink_input), SINK_INPUT_MESSAGE_SEEK, PA_UINT_TO_PTR(seek), offset, NULL, NULL);
 
-        pa_asyncmsgq_post(ps->sink_input->sink->asyncmsgq, PA_MSGOBJECT(ps->sink_input), SINK_INPUT_MESSAGE_POST_DATA, NULL, 0, chunk, NULL);
+            pa_asyncmsgq_post(ps->sink_input->sink->asyncmsgq, PA_MSGOBJECT(ps->sink_input), SINK_INPUT_MESSAGE_POST_DATA, NULL, 0, chunk, NULL);
+        } else
+            pa_asyncmsgq_post(ps->sink_input->sink->asyncmsgq, PA_MSGOBJECT(ps->sink_input), SINK_INPUT_MESSAGE_SEEK, PA_UINT_TO_PTR(seek), offset+chunk->length, NULL, NULL);
 
     } else {
         upload_stream *u = UPLOAD_STREAM(stream);
         size_t l;
 
         if (!u->memchunk.memblock) {
-            if (u->length == chunk->length) {
+            if (u->length == chunk->length && chunk->memblock) {
                 u->memchunk = *chunk;
                 pa_memblock_ref(u->memchunk.memblock);
                 u->length = 0;
@@ -4170,17 +4173,22 @@ static void pstream_memblock_callback(pa_pstream *p, uint32_t channel, int64_t o
         if (l > chunk->length)
             l = chunk->length;
 
-
         if (l > 0) {
-            void *src, *dst;
+            void *dst;
             dst = pa_memblock_acquire(u->memchunk.memblock);
-            src = pa_memblock_acquire(chunk->memblock);
 
-            memcpy((uint8_t*) dst + u->memchunk.index + u->memchunk.length,
-                   (uint8_t*) src+chunk->index, l);
+            if (chunk->memblock) {
+                void *src;
+                src = pa_memblock_acquire(chunk->memblock);
+
+                memcpy((uint8_t*) dst + u->memchunk.index + u->memchunk.length,
+                       (uint8_t*) src + chunk->index, l);
+
+                pa_memblock_release(chunk->memblock);
+            } else
+                pa_silence_memory((uint8_t*) dst + u->memchunk.index + u->memchunk.length, l, &u->sample_spec);
 
             pa_memblock_release(u->memchunk.memblock);
-            pa_memblock_release(chunk->memblock);
 
             u->memchunk.length += l;
             u->length -= l;
diff --git a/src/pulsecore/pstream.c b/src/pulsecore/pstream.c
index 7ff8edc..ef1105b 100644
--- a/src/pulsecore/pstream.c
+++ b/src/pulsecore/pstream.c
@@ -832,8 +832,8 @@ static int do_read(pa_pstream *p) {
                                           ntohl(p->read.shm_info[PA_PSTREAM_SHM_INDEX]),
                                           ntohl(p->read.shm_info[PA_PSTREAM_SHM_LENGTH])))) {
 
-                    pa_log_warn("Failed to import memory block.");
-                    return -1;
+                    if (pa_log_ratelimit())
+                        pa_log_debug("Failed to import memory block.");
                 }
 
                 if (p->recieve_memblock_callback) {
@@ -842,7 +842,7 @@ static int do_read(pa_pstream *p) {
 
                     chunk.memblock = b;
                     chunk.index = 0;
-                    chunk.length = pa_memblock_get_length(b);
+                    chunk.length = b ? pa_memblock_get_length(b) : ntohl(p->read.shm_info[PA_PSTREAM_SHM_LENGTH]);
 
                     offset = (int64_t) (
                             (((uint64_t) ntohl(p->read.descriptor[PA_PSTREAM_DESCRIPTOR_OFFSET_HI])) << 32) |
@@ -857,7 +857,8 @@ static int do_read(pa_pstream *p) {
                             p->recieve_memblock_callback_userdata);
                 }
 
-                pa_memblock_unref(b);
+                if (b)
+                    pa_memblock_unref(b);
             }
 
             goto frame_done;

commit d85ef716757f8c91ec1c97f87daf75e48bbe2de1
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Feb 18 21:57:16 2009 +0100

    export pa_match()

diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c
index ad6c6ca..d0ff751 100644
--- a/src/pulsecore/core-util.c
+++ b/src/pulsecore/core-util.c
@@ -704,7 +704,7 @@ void pa_reset_priority(void) {
 #endif
 }
 
-static int match(const char *expr, const char *v) {
+int pa_match(const char *expr, const char *v) {
     int k;
     regex_t re;
     int r;
@@ -744,12 +744,12 @@ int pa_parse_boolean(const char *v) {
     /* And then we check language dependant */
     if ((expr = nl_langinfo(YESEXPR)))
         if (expr[0])
-            if ((r = match(expr, v)) > 0)
+            if ((r = pa_match(expr, v)) > 0)
                 return 1;
 
     if ((expr = nl_langinfo(NOEXPR)))
         if (expr[0])
-            if ((r = match(expr, v)) > 0)
+            if ((r = pa_match(expr, v)) > 0)
                 return 0;
 
     errno = EINVAL;
diff --git a/src/pulsecore/core-util.h b/src/pulsecore/core-util.h
index 442815f..8fd521b 100644
--- a/src/pulsecore/core-util.h
+++ b/src/pulsecore/core-util.h
@@ -141,6 +141,8 @@ size_t pa_vsnprintf(char *str, size_t size, const char *format, va_list ap);
 
 char *pa_truncate_utf8(char *c, size_t l);
 
+int pa_match(const char *expr, const char *v);
+
 char *pa_getcwd(void);
 char *pa_make_path_absolute(const char *p);
 pa_bool_t pa_is_path_absolute(const char *p);

commit 7b8bed3e285f31537aa39f88600e59b749ac6508
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Feb 18 21:57:57 2009 +0100

    introduce pa_realpath()

diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c
index d0ff751..61f9a65 100644
--- a/src/pulsecore/core-util.c
+++ b/src/pulsecore/core-util.c
@@ -2604,3 +2604,28 @@ char *pa_unescape(char *p) {
 
     return p;
 }
+
+char *pa_realpath(const char *path) {
+    char *r, *t;
+    pa_assert(path);
+
+    /* We want only abolsute paths */
+    if (path[0] != '/') {
+        errno = EINVAL;
+        return NULL;
+    }
+
+#ifndef __GLIBC__
+#error "It's not clear whether this system supports realpath(..., NULL) like GNU libc does. If it doesn't we need a private version of realpath() here."
+#endif
+
+    if (!(r = realpath(path, NULL)))
+        return NULL;
+
+    /* We copy this here in case our pa_xmalloc() is not implemented
+     * on top of libc malloc() */
+    t = pa_xstrdup(r);
+    pa_xfree(r);
+
+    return t;
+}
diff --git a/src/pulsecore/core-util.h b/src/pulsecore/core-util.h
index 8fd521b..0ba33f3 100644
--- a/src/pulsecore/core-util.h
+++ b/src/pulsecore/core-util.h
@@ -221,4 +221,6 @@ char *pa_replace(const char*s, const char*a, const char *b);
 
 char *pa_unescape(char *p);
 
+char *pa_realpath(const char *path);
+
 #endif

commit 6db307360b7ef95211aff13548206464e8909882
Author: Lennart Poettering <lennart at poettering.net>
Date:   Wed Feb 18 22:11:50 2009 +0100

    export card information for sinks/sources and number of sinks/sources a profile would create to clients

diff --git a/src/pulse/introspect.c b/src/pulse/introspect.c
index 1d50939..04bcd4f 100644
--- a/src/pulse/introspect.c
+++ b/src/pulse/introspect.c
@@ -162,6 +162,7 @@ static void context_get_sink_info_callback(pa_pdispatch *pd, uint32_t command, u
             i.n_volume_steps = PA_VOLUME_NORM+1;
             mute = FALSE;
             state = PA_SINK_INVALID_STATE;
+            i.card = PA_INVALID_INDEX;
 
             if (pa_tagstruct_getu32(t, &i.index) < 0 ||
                 pa_tagstruct_gets(t, &i.name) < 0 ||
@@ -182,7 +183,8 @@ static void context_get_sink_info_callback(pa_pdispatch *pd, uint32_t command, u
                 (o->context->version >= 15 &&
                  (pa_tagstruct_get_volume(t, &i.base_volume) < 0 ||
                   pa_tagstruct_getu32(t, &state) < 0 ||
-                  pa_tagstruct_getu32(t, &i.n_volume_steps) < 0))) {
+                  pa_tagstruct_getu32(t, &i.n_volume_steps) < 0 ||
+                  pa_tagstruct_getu32(t, &i.card) < 0))) {
 
                 pa_context_fail(o->context, PA_ERR_PROTOCOL);
                 pa_proplist_free(i.proplist);
@@ -293,6 +295,7 @@ static void context_get_source_info_callback(pa_pdispatch *pd, uint32_t command,
             i.n_volume_steps = PA_VOLUME_NORM+1;
             mute = FALSE;
             state = PA_SOURCE_INVALID_STATE;
+            i.card = PA_INVALID_INDEX;
 
             if (pa_tagstruct_getu32(t, &i.index) < 0 ||
                 pa_tagstruct_gets(t, &i.name) < 0 ||
@@ -313,7 +316,8 @@ static void context_get_source_info_callback(pa_pdispatch *pd, uint32_t command,
                 (o->context->version >= 15 &&
                  (pa_tagstruct_get_volume(t, &i.base_volume) < 0 ||
                   pa_tagstruct_getu32(t, &state) < 0 ||
-                  pa_tagstruct_getu32(t, &i.n_volume_steps) < 0))) {
+                  pa_tagstruct_getu32(t, &i.n_volume_steps) < 0 ||
+                  pa_tagstruct_getu32(t, &i.card) < 0))) {
 
                 pa_context_fail(o->context, PA_ERR_PROTOCOL);
                 pa_proplist_free(i.proplist);
@@ -517,7 +521,9 @@ static void context_get_card_info_callback(pa_pdispatch *pd, uint32_t command, u
                 for (j = 0; j < i.n_profiles; j++) {
 
                     if (pa_tagstruct_gets(t, &i.profiles[j].name) < 0 ||
-                        pa_tagstruct_gets(t, &i.profiles[j].description) < 0) {
+                        pa_tagstruct_gets(t, &i.profiles[j].description) < 0 ||
+                        pa_tagstruct_getu32(t, &i.profiles[j].n_sinks) < 0 ||
+                        pa_tagstruct_getu32(t, &i.profiles[j].n_sources)< 0) {
 
                         pa_context_fail(o->context, PA_ERR_PROTOCOL);
                         pa_xfree(i.profiles);
diff --git a/src/pulse/introspect.h b/src/pulse/introspect.h
index badc787..b873a84 100644
--- a/src/pulse/introspect.h
+++ b/src/pulse/introspect.h
@@ -215,6 +215,7 @@ typedef struct pa_sink_info {
     pa_volume_t base_volume;           /**< Some kind of "base" volume that refers to unamplified/unattenuated volume in the context of the output device. \since 0.9.15 */
     pa_sink_state_t state;             /**< State \since 0.9.15 */
     uint32_t n_volume_steps;           /**< Number of volume steps for sinks which do not support arbitrary volumes. \since 0.9.15 */
+    uint32_t card;                     /**< Card index, or PA_INVALID_INDEX. \since 0.9.15 */
 } pa_sink_info;
 
 /** Callback prototype for pa_context_get_sink_info_by_name() and friends */
@@ -273,6 +274,7 @@ typedef struct pa_source_info {
     pa_volume_t base_volume;            /**< Some kind of "base" volume that refers to unamplified/unattenuated volume in the context of the input device. \since 0.9.15 */
     pa_source_state_t state;            /**< State \since 0.9.15 */
     uint32_t n_volume_steps;            /**< Number of volume steps for sources which do not support arbitrary volumes. \since 0.9.15 */
+    uint32_t card;                      /**< Card index, or PA_INVALID_INDEX. \since 0.9.15 */
 } pa_source_info;
 
 /** Callback prototype for pa_context_get_source_info_by_name() and friends */
@@ -396,6 +398,8 @@ pa_operation* pa_context_kill_client(pa_context *c, uint32_t idx, pa_context_suc
 typedef struct pa_card_profile_info {
     const char *name;                   /**< Name of this profile */
     const char *description;            /**< Description of this profile */
+    uint32_t n_sinks;                   /**< Number of sinks this profile would create */
+    uint32_t n_sources;                 /**< Number of sources this profile would create */
 } pa_card_profile_info;
 
 /** Stores information about cards. Please note that this structure
diff --git a/src/pulsecore/protocol-native.c b/src/pulsecore/protocol-native.c
index fd7d936..79b9b06 100644
--- a/src/pulsecore/protocol-native.c
+++ b/src/pulsecore/protocol-native.c
@@ -2749,6 +2749,7 @@ static void sink_fill_tagstruct(pa_native_connection *c, pa_tagstruct *t, pa_sin
             pa_log_error("Internal sink state is invalid.");
         pa_tagstruct_putu32(t, pa_sink_get_state(sink));
         pa_tagstruct_putu32(t, sink->n_volume_steps);
+        pa_tagstruct_putu32(t, sink->card ? sink->card->index : PA_INVALID_INDEX);
     }
 }
 
@@ -2788,6 +2789,7 @@ static void source_fill_tagstruct(pa_native_connection *c, pa_tagstruct *t, pa_s
             pa_log_error("Internal source state is invalid.");
         pa_tagstruct_putu32(t, pa_source_get_state(source));
         pa_tagstruct_putu32(t, source->n_volume_steps);
+        pa_tagstruct_putu32(t, source->card ? source->card->index : PA_INVALID_INDEX);
     }
 }
 
@@ -2822,6 +2824,8 @@ static void card_fill_tagstruct(pa_native_connection *c, pa_tagstruct *t, pa_car
         while ((p = pa_hashmap_iterate(card->profiles, &state, NULL))) {
             pa_tagstruct_puts(t, p->name);
             pa_tagstruct_puts(t, p->description);
+            pa_tagstruct_putu32(t, p->n_sinks);
+            pa_tagstruct_putu32(t, p->n_sources);
         }
     }
 

commit 7f8ccf9e7cf2d0e4042cd5fa85bc49a2982e6807
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Feb 19 03:56:31 2009 +0100

    handle both positive and negative errno's

diff --git a/src/pulsecore/core-error.c b/src/pulsecore/core-error.c
index 3d6c2c3..d9caa94 100644
--- a/src/pulsecore/core-error.c
+++ b/src/pulsecore/core-error.c
@@ -47,6 +47,9 @@ const char* pa_cstrerror(int errnum) {
     char *translated, *t;
     char errbuf[128];
 
+    if (errnum < 0)
+        errnum = -errnum;
+
     if ((t = PA_STATIC_TLS_GET(cstrerror)))
         pa_xfree(t);
 

commit 928920c8b81b20ff1a8257231904cd0f06804988
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Feb 19 03:58:52 2009 +0100

    additional validity check

diff --git a/src/pulsecore/sink.c b/src/pulsecore/sink.c
index 4f39d67..7441e97 100644
--- a/src/pulsecore/sink.c
+++ b/src/pulsecore/sink.c
@@ -1846,6 +1846,9 @@ void pa_sink_update_latency_range(pa_sink *s, pa_usec_t min_latency, pa_usec_t m
 
     pa_sink_assert_ref(s);
 
+    pa_assert(!min_latency || !max_latency ||
+              min_latency <= max_latency);
+
     s->thread_info.min_latency = min_latency;
     s->thread_info.max_latency = max_latency;
 

commit 5f5396bb15c6b939ac6a71efa36950817f9e18bf
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Feb 19 03:59:04 2009 +0100

    additional validity check

diff --git a/src/pulsecore/source.c b/src/pulsecore/source.c
index 0009d85..c0d6d9e 100644
--- a/src/pulsecore/source.c
+++ b/src/pulsecore/source.c
@@ -1120,6 +1120,9 @@ void pa_source_update_latency_range(pa_source *s, pa_usec_t min_latency, pa_usec
 
     pa_source_assert_ref(s);
 
+    pa_assert(!min_latency || !max_latency ||
+              min_latency <= max_latency);
+
     s->thread_info.min_latency = min_latency;
     s->thread_info.max_latency = max_latency;
 

commit 45218aa2268e9fc231d42d1479adf7685eb3b507
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Feb 19 03:59:56 2009 +0100

    make interpol-test useful for recording as well

diff --git a/src/tests/interpol-test.c b/src/tests/interpol-test.c
index 9d93077..20d2c23 100644
--- a/src/tests/interpol-test.c
+++ b/src/tests/interpol-test.c
@@ -39,10 +39,23 @@
 static pa_context *context = NULL;
 static pa_stream *stream = NULL;
 static pa_mainloop_api *mainloop_api = NULL;
+static pa_bool_t playback = TRUE;
 
 static void stream_write_cb(pa_stream *p, size_t nbytes, void *userdata) {
     /* Just some silence */
-    pa_stream_write(p, pa_xmalloc0(nbytes), nbytes, pa_xfree, 0, PA_SEEK_RELATIVE);
+    pa_assert_se(pa_stream_write(p, pa_xmalloc0(nbytes), nbytes, pa_xfree, 0, PA_SEEK_RELATIVE) == 0);
+}
+
+static void stream_read_cb(pa_stream *p, size_t nbytes, void *userdata) {
+    /* We don't care, just drop the data */
+
+    while (pa_stream_readable_size(p) > 0) {
+        const void *d;
+        size_t b;
+
+        pa_assert_se(pa_stream_peek(p, &d, &b) == 0);
+        pa_assert_se(pa_stream_drop(p) == 0);
+    }
 }
 
 /* This is called whenever the context status changes */
@@ -68,8 +81,13 @@ static void context_state_callback(pa_context *c, void *userdata) {
             stream = pa_stream_new(c, "interpol-test", &ss, NULL);
             assert(stream);
 
-            pa_stream_connect_playback(stream, NULL, NULL, PA_STREAM_INTERPOLATE_TIMING|PA_STREAM_AUTO_TIMING_UPDATE, NULL, NULL);
-            pa_stream_set_write_callback(stream, stream_write_cb, NULL);
+            if (playback) {
+                pa_assert_se(pa_stream_connect_playback(stream, NULL, NULL, PA_STREAM_INTERPOLATE_TIMING|PA_STREAM_AUTO_TIMING_UPDATE, NULL, NULL) == 0);
+                pa_stream_set_write_callback(stream, stream_write_cb, NULL);
+            } else {
+                pa_assert_se(pa_stream_connect_record(stream, NULL, NULL, PA_STREAM_INTERPOLATE_TIMING|PA_STREAM_AUTO_TIMING_UPDATE) == 0);
+                pa_stream_set_read_callback(stream, stream_read_cb, NULL);
+            }
 
             break;
         }
@@ -90,6 +108,8 @@ int main(int argc, char *argv[]) {
     struct timeval start, last_info = { 0, 0 };
     pa_usec_t old_t = 0, old_rtc = 0;
 
+    playback = argc <= 1 || !pa_streq(argv[1], "-r");
+
     /* Set up a new main loop */
     m = pa_threaded_mainloop_new();
     assert(m);
@@ -138,7 +158,14 @@ int main(int argc, char *argv[]) {
 
         if (success) {
             rtc = pa_timeval_diff(&now, &start);
-            printf("%i\t%llu\t%llu\t%llu\t%llu\t%u\t%u\n", k, (unsigned long long) rtc, (unsigned long long) t, (unsigned long long) (rtc-old_rtc), (unsigned long long) (t-old_t), changed, playing);
+            printf("%i\t%llu\t%llu\t%llu\t%llu\t%u\t%u\n", k,
+                   (unsigned long long) rtc,
+                   (unsigned long long) t,
+                   (unsigned long long) (rtc-old_rtc),
+                   (unsigned long long) (t-old_t),
+                   changed,
+                   playing);
+
             fflush(stdout);
             old_t = t;
             old_rtc = rtc;

commit 9cbdd3a968cc167ca7f0060089efc69c4c2c1f13
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Feb 19 04:00:29 2009 +0100

    add pa_timespec_load

diff --git a/src/pulsecore/rtclock.c b/src/pulsecore/rtclock.c
index 5fc6da2..dcbd118 100644
--- a/src/pulsecore/rtclock.c
+++ b/src/pulsecore/rtclock.c
@@ -141,3 +141,11 @@ struct timeval* pa_rtclock_from_wallclock(struct timeval *tv) {
 
     return tv;
 }
+
+pa_usec_t pa_timespec_load(const struct timespec *ts) {
+    pa_assert(ts);
+
+    return
+        (pa_usec_t) ts->tv_sec * PA_USEC_PER_SEC +
+        (pa_usec_t) ts->tv_nsec / PA_NSEC_PER_USEC;
+}
diff --git a/src/pulsecore/rtclock.h b/src/pulsecore/rtclock.h
index 281461d..03cc1c7 100644
--- a/src/pulsecore/rtclock.h
+++ b/src/pulsecore/rtclock.h
@@ -42,4 +42,6 @@ void pa_rtclock_hrtimer_enable(void);
 
 struct timeval* pa_rtclock_from_wallclock(struct timeval *tv);
 
+pa_usec_t pa_timespec_load(const struct timespec *ts);
+
 #endif

commit e1608d5db2c270965b8143f93e1b8b9a1c301e26
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Feb 19 04:01:12 2009 +0100

    modernize pa_msleep() a bit

diff --git a/src/pulse/util.c b/src/pulse/util.c
index b20ea46..54a188d 100644
--- a/src/pulse/util.c
+++ b/src/pulse/util.c
@@ -54,6 +54,8 @@
 #endif
 
 #include <pulse/xmalloc.h>
+#include <pulse/timeval.h>
+
 #include <pulsecore/winsock.h>
 #include <pulsecore/core-error.h>
 #include <pulsecore/log.h>
@@ -260,8 +262,8 @@ int pa_msleep(unsigned long t) {
 #elif defined(HAVE_NANOSLEEP)
     struct timespec ts;
 
-    ts.tv_sec = (time_t) (t/1000UL);
-    ts.tv_nsec = (long) ((t % 1000UL) * 1000000UL);
+    ts.tv_sec = (time_t) (t / PA_MSEC_PER_SEC);
+    ts.tv_nsec = (long) ((t % PA_MSEC_PER_SEC) * PA_NSEC_PER_MSEC);
 
     return nanosleep(&ts, NULL);
 #else

commit 205b0ba08e1f796481e0bba11c0813266af3947f
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Feb 19 04:04:42 2009 +0100

    split out mixer setup into seperate functions to make things more readable

diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c
index 5fc3468..eeac5e7 100644
--- a/src/modules/alsa/alsa-sink.c
+++ b/src/modules/alsa/alsa-sink.c
@@ -1227,6 +1227,91 @@ static void set_sink_name(pa_sink_new_data *data, pa_modargs *ma, const char *de
     pa_xfree(t);
 }
 
+static int setup_mixer(struct userdata *u, pa_bool_t ignore_dB) {
+    pa_assert(u);
+
+    if (!u->mixer_handle)
+        return 0;
+
+    pa_assert(u->mixer_elem);
+
+    if (snd_mixer_selem_has_playback_volume(u->mixer_elem)) {
+        pa_bool_t suitable = FALSE;
+
+        if (snd_mixer_selem_get_playback_volume_range(u->mixer_elem, &u->hw_volume_min, &u->hw_volume_max) < 0)
+            pa_log_info("Failed to get volume range. Falling back to software volume control.");
+        else if (u->hw_volume_min >= u->hw_volume_max)
+            pa_log_warn("Your kernel driver is broken: it reports a volume range from %li to %li which makes no sense.", u->hw_volume_min, u->hw_volume_max);
+        else {
+            pa_log_info("Volume ranges from %li to %li.", u->hw_volume_min, u->hw_volume_max);
+            suitable = TRUE;
+        }
+
+        if (suitable) {
+            if (ignore_dB || snd_mixer_selem_get_playback_dB_range(u->mixer_elem, &u->hw_dB_min, &u->hw_dB_max) < 0)
+                pa_log_info("Mixer doesn't support dB information or data is ignored.");
+            else {
+#ifdef HAVE_VALGRIND_MEMCHECK_H
+                VALGRIND_MAKE_MEM_DEFINED(&u->hw_dB_min, sizeof(u->hw_dB_min));
+                VALGRIND_MAKE_MEM_DEFINED(&u->hw_dB_max, sizeof(u->hw_dB_max));
+#endif
+
+                if (u->hw_dB_min >= u->hw_dB_max)
+                    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.", (double) u->hw_dB_min/100.0, (double) u->hw_dB_max/100.0);
+                else {
+                    pa_log_info("Volume ranges from %0.2f dB to %0.2f dB.", (double) u->hw_dB_min/100.0, (double) u->hw_dB_max/100.0);
+                    u->hw_dB_supported = TRUE;
+
+                    if (u->hw_dB_max > 0) {
+                        u->sink->base_volume = pa_sw_volume_from_dB(- (double) u->hw_dB_max/100.0);
+                        pa_log_info("Fixing base volume to %0.2f dB", pa_sw_volume_to_dB(u->sink->base_volume));
+                    } else
+                        pa_log_info("No particular base volume set, fixing to 0 dB");
+                }
+            }
+
+            if (!u->hw_dB_supported &&
+                u->hw_volume_max - u->hw_volume_min < 3) {
+
+                pa_log_info("Device doesn't do dB volume and has less than 4 volume levels. Falling back to software volume control.");
+                suitable = FALSE;
+            }
+        }
+
+        if (suitable) {
+            u->mixer_seperate_channels = pa_alsa_calc_mixer_map(u->mixer_elem, &u->sink->channel_map, u->mixer_map, TRUE) >= 0;
+
+            u->sink->get_volume = sink_get_volume_cb;
+            u->sink->set_volume = sink_set_volume_cb;
+            u->sink->flags |= PA_SINK_HW_VOLUME_CTRL | (u->hw_dB_supported ? PA_SINK_DECIBEL_VOLUME : 0);
+            pa_log_info("Using hardware volume control. Hardware dB scale %s.", u->hw_dB_supported ? "supported" : "not supported");
+
+            if (!u->hw_dB_supported)
+                u->sink->n_volume_steps = u->hw_volume_max - u->hw_volume_min + 1;
+        } else
+            pa_log_info("Using software volume control.");
+    }
+
+    if (snd_mixer_selem_has_playback_switch(u->mixer_elem)) {
+        u->sink->get_mute = sink_get_mute_cb;
+        u->sink->set_mute = sink_set_mute_cb;
+        u->sink->flags |= PA_SINK_HW_MUTE_CTRL;
+    } else
+        pa_log_info("Using software mute control.");
+
+    u->mixer_fdl = pa_alsa_fdlist_new();
+
+    if (pa_alsa_fdlist_set_mixer(u->mixer_fdl, u->mixer_handle, u->core->mainloop) < 0) {
+        pa_log("Failed to initialize file descriptor monitoring");
+        return -1;
+    }
+
+    snd_mixer_elem_set_callback(u->mixer_elem, mixer_callback);
+    snd_mixer_elem_set_callback_private(u->mixer_elem, u);
+
+    return 0;
+}
+
 pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_card *card, const pa_alsa_profile_info *profile) {
 
     struct userdata *u = NULL;
@@ -1236,7 +1321,6 @@ pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_ca
     uint32_t nfrags, hwbuf_size, frag_size, tsched_size, tsched_watermark;
     snd_pcm_uframes_t period_frames, tsched_frames;
     size_t frame_size;
-    int err;
     pa_bool_t use_mmap = TRUE, b, use_tsched = TRUE, d, ignore_dB = FALSE;
     pa_usec_t usec;
     pa_sink_new_data data;
@@ -1365,7 +1449,7 @@ pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_ca
     }
 
     if (use_tsched && (!b || !d)) {
-        pa_log_info("Cannot enabled timer-based scheduling, falling back to sound IRQ scheduling.");
+        pa_log_info("Cannot enable timer-based scheduling, falling back to sound IRQ scheduling.");
         u->use_tsched = use_tsched = FALSE;
     }
 
@@ -1448,86 +1532,8 @@ pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_ca
     if (update_sw_params(u) < 0)
         goto fail;
 
-    pa_memchunk_reset(&u->memchunk);
-
-    if (u->mixer_handle) {
-        pa_assert(u->mixer_elem);
-
-        if (snd_mixer_selem_has_playback_volume(u->mixer_elem)) {
-            pa_bool_t suitable = FALSE;
-
-            if (snd_mixer_selem_get_playback_volume_range(u->mixer_elem, &u->hw_volume_min, &u->hw_volume_max) < 0)
-                pa_log_info("Failed to get volume range. Falling back to software volume control.");
-            else if (u->hw_volume_min >= u->hw_volume_max)
-                pa_log_warn("Your kernel driver is broken: it reports a volume range from %li to %li which makes no sense.", u->hw_volume_min, u->hw_volume_max);
-            else {
-                pa_log_info("Volume ranges from %li to %li.", u->hw_volume_min, u->hw_volume_max);
-                suitable = TRUE;
-            }
-
-            if (suitable) {
-                if (ignore_dB || snd_mixer_selem_get_playback_dB_range(u->mixer_elem, &u->hw_dB_min, &u->hw_dB_max) < 0)
-                    pa_log_info("Mixer doesn't support dB information or data is ignored.");
-                else {
-#ifdef HAVE_VALGRIND_MEMCHECK_H
-                    VALGRIND_MAKE_MEM_DEFINED(&u->hw_dB_min, sizeof(u->hw_dB_min));
-                    VALGRIND_MAKE_MEM_DEFINED(&u->hw_dB_max, sizeof(u->hw_dB_max));
-#endif
-
-                    if (u->hw_dB_min >= u->hw_dB_max)
-                        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.", (double) u->hw_dB_min/100.0, (double) u->hw_dB_max/100.0);
-                    else {
-                        pa_log_info("Volume ranges from %0.2f dB to %0.2f dB.", (double) u->hw_dB_min/100.0, (double) u->hw_dB_max/100.0);
-                        u->hw_dB_supported = TRUE;
-
-                        if (u->hw_dB_max > 0) {
-                            u->sink->base_volume = pa_sw_volume_from_dB(- (double) u->hw_dB_max/100.0);
-                            pa_log_info("Fixing base volume to %0.2f dB", pa_sw_volume_to_dB(u->sink->base_volume));
-                        } else
-                            pa_log_info("No particular base volume set, fixing to 0 dB");
-                    }
-                }
-
-                if (!u->hw_dB_supported &&
-                    u->hw_volume_max - u->hw_volume_min < 3) {
-
-                    pa_log_info("Device doesn't do dB volume and has less than 4 volume levels. Falling back to software volume control.");
-                    suitable = FALSE;
-                }
-            }
-
-            if (suitable) {
-                u->mixer_seperate_channels = pa_alsa_calc_mixer_map(u->mixer_elem, &map, u->mixer_map, TRUE) >= 0;
-
-                u->sink->get_volume = sink_get_volume_cb;
-                u->sink->set_volume = sink_set_volume_cb;
-                u->sink->flags |= PA_SINK_HW_VOLUME_CTRL | (u->hw_dB_supported ? PA_SINK_DECIBEL_VOLUME : 0);
-                pa_log_info("Using hardware volume control. Hardware dB scale %s.", u->hw_dB_supported ? "supported" : "not supported");
-
-                if (!u->hw_dB_supported)
-                    u->sink->n_volume_steps = u->hw_volume_max - u->hw_volume_min + 1;
-            } else
-                pa_log_info("Using software volume control.");
-        }
-
-        if (snd_mixer_selem_has_playback_switch(u->mixer_elem)) {
-            u->sink->get_mute = sink_get_mute_cb;
-            u->sink->set_mute = sink_set_mute_cb;
-            u->sink->flags |= PA_SINK_HW_MUTE_CTRL;
-        } else
-            pa_log_info("Using software mute control.");
-
-        u->mixer_fdl = pa_alsa_fdlist_new();
-
-        if (pa_alsa_fdlist_set_mixer(u->mixer_fdl, u->mixer_handle, m->core->mainloop) < 0) {
-            pa_log("Failed to initialize file descriptor monitoring");
-            goto fail;
-        }
-
-        snd_mixer_elem_set_callback(u->mixer_elem, mixer_callback);
-        snd_mixer_elem_set_callback_private(u->mixer_elem, u);
-    } else
-        u->mixer_fdl = NULL;
+    if (setup_mixer(u, ignore_dB) < 0)
+        goto fail;
 
     pa_alsa_dump(u->pcm_handle);
 
diff --git a/src/modules/alsa/alsa-source.c b/src/modules/alsa/alsa-source.c
index 1909cae..81d7c0b 100644
--- a/src/modules/alsa/alsa-source.c
+++ b/src/modules/alsa/alsa-source.c
@@ -1062,6 +1062,91 @@ static void set_source_name(pa_source_new_data *data, pa_modargs *ma, const char
     pa_xfree(t);
 }
 
+static int setup_mixer(struct userdata *u, pa_bool_t ignore_dB) {
+    pa_assert(u);
+
+    if (!u->mixer_handle)
+        return 0;
+
+    pa_assert(u->mixer_elem);
+
+    if (snd_mixer_selem_has_capture_volume(u->mixer_elem)) {
+        pa_bool_t suitable = FALSE;
+
+        if (snd_mixer_selem_get_capture_volume_range(u->mixer_elem, &u->hw_volume_min, &u->hw_volume_max) < 0)
+            pa_log_info("Failed to get volume range. Falling back to software volume control.");
+        else if (u->hw_volume_min >= u->hw_volume_max)
+            pa_log_warn("Your kernel driver is broken: it reports a volume range from %li to %li which makes no sense.", u->hw_volume_min, u->hw_volume_max);
+        else {
+            pa_log_info("Volume ranges from %li to %li.", u->hw_volume_min, u->hw_volume_max);
+            suitable = TRUE;
+        }
+
+        if (suitable) {
+            if (ignore_dB || snd_mixer_selem_get_capture_dB_range(u->mixer_elem, &u->hw_dB_min, &u->hw_dB_max) < 0)
+                pa_log_info("Mixer doesn't support dB information or data is ignored.");
+            else {
+#ifdef HAVE_VALGRIND_MEMCHECK_H
+                VALGRIND_MAKE_MEM_DEFINED(&u->hw_dB_min, sizeof(u->hw_dB_min));
+                VALGRIND_MAKE_MEM_DEFINED(&u->hw_dB_max, sizeof(u->hw_dB_max));
+#endif
+
+                if (u->hw_dB_min >= u->hw_dB_max)
+                    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.", (double) u->hw_dB_min/100.0, (double) u->hw_dB_max/100.0);
+                else {
+                    pa_log_info("Volume ranges from %0.2f dB to %0.2f dB.", (double) u->hw_dB_min/100.0, (double) u->hw_dB_max/100.0);
+                    u->hw_dB_supported = TRUE;
+
+                    if (u->hw_dB_max > 0) {
+                        u->source->base_volume = pa_sw_volume_from_dB(- (double) u->hw_dB_max/100.0);
+                        pa_log_info("Fixing base volume to %0.2f dB", pa_sw_volume_to_dB(u->source->base_volume));
+                    } else
+                        pa_log_info("No particular base volume set, fixing to 0 dB");
+                }
+            }
+
+            if (!u->hw_dB_supported &&
+                u->hw_volume_max - u->hw_volume_min < 3) {
+
+                pa_log_info("Device has less than 4 volume levels. Falling back to software volume control.");
+                suitable = FALSE;
+            }
+        }
+
+        if (suitable) {
+            u->mixer_seperate_channels = pa_alsa_calc_mixer_map(u->mixer_elem, &u->source->channel_map, u->mixer_map, FALSE) >= 0;
+
+            u->source->get_volume = source_get_volume_cb;
+            u->source->set_volume = source_set_volume_cb;
+            u->source->flags |= PA_SOURCE_HW_VOLUME_CTRL | (u->hw_dB_supported ? PA_SOURCE_DECIBEL_VOLUME : 0);
+            pa_log_info("Using hardware volume control. Hardware dB scale %s.", u->hw_dB_supported ? "supported" : "not supported");
+
+            if (!u->hw_dB_supported)
+                u->source->n_volume_steps = u->hw_volume_max - u->hw_volume_min + 1;
+        } else
+            pa_log_info("Using software volume control.");
+    }
+
+    if (snd_mixer_selem_has_capture_switch(u->mixer_elem)) {
+        u->source->get_mute = source_get_mute_cb;
+        u->source->set_mute = source_set_mute_cb;
+        u->source->flags |= PA_SOURCE_HW_MUTE_CTRL;
+    } else
+        pa_log_info("Using software mute control.");
+
+    u->mixer_fdl = pa_alsa_fdlist_new();
+
+    if (pa_alsa_fdlist_set_mixer(u->mixer_fdl, u->mixer_handle, u->core->mainloop) < 0) {
+        pa_log("Failed to initialize file descriptor monitoring");
+        return -1;
+    }
+
+    snd_mixer_elem_set_callback(u->mixer_elem, mixer_callback);
+    snd_mixer_elem_set_callback_private(u->mixer_elem, u);
+
+    return 0;
+}
+
 pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, pa_card *card, const pa_alsa_profile_info *profile) {
 
     struct userdata *u = NULL;
@@ -1071,11 +1156,11 @@ pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, p
     uint32_t nfrags, hwbuf_size, frag_size, tsched_size, tsched_watermark;
     snd_pcm_uframes_t period_frames, tsched_frames;
     size_t frame_size;
-    int err;
     pa_bool_t use_mmap = TRUE, b, use_tsched = TRUE, d, ignore_dB = FALSE;
     pa_source_new_data data;
 
     pa_assert(m);
+    pa_assert(ma);
 
     ss = m->core->default_sample_spec;
     if (pa_modargs_get_sample_spec_and_channel_map(ma, &ss, &map, PA_CHANNEL_MAP_ALSA) < 0) {
@@ -1190,7 +1275,7 @@ pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, p
     }
 
     if (use_tsched && (!b || !d)) {
-        pa_log_info("Cannot enabled timer-based scheduling, falling back to sound IRQ scheduling.");
+        pa_log_info("Cannot enable timer-based scheduling, falling back to sound IRQ scheduling.");
         u->use_tsched = use_tsched = FALSE;
     }
 
@@ -1270,85 +1355,8 @@ pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, p
     if (update_sw_params(u) < 0)
         goto fail;
 
-    if (u->mixer_handle) {
-        pa_assert(u->mixer_elem);
-
-        if (snd_mixer_selem_has_capture_volume(u->mixer_elem)) {
-            pa_bool_t suitable = FALSE;
-
-            if (snd_mixer_selem_get_capture_volume_range(u->mixer_elem, &u->hw_volume_min, &u->hw_volume_max) < 0)
-                pa_log_info("Failed to get volume range. Falling back to software volume control.");
-            else if (u->hw_volume_min >= u->hw_volume_max)
-                pa_log_warn("Your kernel driver is broken: it reports a volume range from %li to %li which makes no sense.", u->hw_volume_min, u->hw_volume_max);
-            else {
-                pa_log_info("Volume ranges from %li to %li.", u->hw_volume_min, u->hw_volume_max);
-                suitable = TRUE;
-            }
-
-            if (suitable) {
-                if (ignore_dB || snd_mixer_selem_get_capture_dB_range(u->mixer_elem, &u->hw_dB_min, &u->hw_dB_max) < 0)
-                    pa_log_info("Mixer doesn't support dB information or data is ignored.");
-                else {
-#ifdef HAVE_VALGRIND_MEMCHECK_H
-                    VALGRIND_MAKE_MEM_DEFINED(&u->hw_dB_min, sizeof(u->hw_dB_min));
-                    VALGRIND_MAKE_MEM_DEFINED(&u->hw_dB_max, sizeof(u->hw_dB_max));
-#endif
-
-                    if (u->hw_dB_min >= u->hw_dB_max)
-                        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.", (double) u->hw_dB_min/100.0, (double) u->hw_dB_max/100.0);
-                    else {
-                        pa_log_info("Volume ranges from %0.2f dB to %0.2f dB.", (double) u->hw_dB_min/100.0, (double) u->hw_dB_max/100.0);
-                        u->hw_dB_supported = TRUE;
-
-                        if (u->hw_dB_max > 0) {
-                            u->source->base_volume = pa_sw_volume_from_dB(- (double) u->hw_dB_max/100.0);
-                            pa_log_info("Fixing base volume to %0.2f dB", pa_sw_volume_to_dB(u->source->base_volume));
-                        } else
-                            pa_log_info("No particular base volume set, fixing to 0 dB");
-
-                    }
-                }
-
-                if (!u->hw_dB_supported &&
-                    u->hw_volume_max - u->hw_volume_min < 3) {
-
-                    pa_log_info("Device has less than 4 volume levels. Falling back to software volume control.");
-                    suitable = FALSE;
-                }
-            }
-
-            if (suitable) {
-                u->mixer_seperate_channels = pa_alsa_calc_mixer_map(u->mixer_elem, &map, u->mixer_map, FALSE) >= 0;
-
-                u->source->get_volume = source_get_volume_cb;
-                u->source->set_volume = source_set_volume_cb;
-                u->source->flags |= PA_SOURCE_HW_VOLUME_CTRL | (u->hw_dB_supported ? PA_SOURCE_DECIBEL_VOLUME : 0);
-                pa_log_info("Using hardware volume control. Hardware dB scale %s.", u->hw_dB_supported ? "supported" : "not supported");
-
-                if (!u->hw_dB_supported)
-                    u->source->n_volume_steps = u->hw_volume_max - u->hw_volume_min + 1;
-            } else
-                pa_log_info("Using software volume control.");
-        }
-
-        if (snd_mixer_selem_has_capture_switch(u->mixer_elem)) {
-            u->source->get_mute = source_get_mute_cb;
-            u->source->set_mute = source_set_mute_cb;
-            u->source->flags |= PA_SOURCE_HW_MUTE_CTRL;
-        } else
-            pa_log_info("Using software mute control.");
-
-        u->mixer_fdl = pa_alsa_fdlist_new();
-
-        if (pa_alsa_fdlist_set_mixer(u->mixer_fdl, u->mixer_handle, m->core->mainloop) < 0) {
-            pa_log("Failed to initialize file descriptor monitoring");
-            goto fail;
-        }
-
-        snd_mixer_elem_set_callback(u->mixer_elem, mixer_callback);
-        snd_mixer_elem_set_callback_private(u->mixer_elem, u);
-    } else
-        u->mixer_fdl = NULL;
+    if (setup_mixer(u, ignore_dB) < 0)
+        goto fail;
 
     pa_alsa_dump(u->pcm_handle);
 

commit 7d16dcb6cc8dc931020186f5dab37f32ecc815d9
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Tue Feb 17 19:19:07 2009 +0200

    dbus-util: avoid double free

diff --git a/src/modules/dbus-util.c b/src/modules/dbus-util.c
index f6a986a..4218bca 100644
--- a/src/modules/dbus-util.c
+++ b/src/modules/dbus-util.c
@@ -403,8 +403,7 @@ void pa_dbus_pending_free(pa_dbus_pending *p) {
     pa_assert(p);
 
     if (p->pending) {
-        dbus_pending_call_cancel(p->pending);
-        dbus_pending_call_unref(p->pending);
+        dbus_pending_call_cancel(p->pending); /* p->pending is freed by cancel() */
     }
 
     if (p->message)

commit 7737b10ac6cd03d844c6de77c58f2d39b60a7ad3
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Tue Feb 17 19:26:21 2009 +0200

    hal-detect: make sure r is initialized, so we don't take random path

diff --git a/src/modules/module-hal-detect.c b/src/modules/module-hal-detect.c
index e603738..ce04f36 100644
--- a/src/modules/module-hal-detect.c
+++ b/src/modules/module-hal-detect.c
@@ -370,6 +370,7 @@ static struct device* hal_device_add(struct userdata *u, const char *udi) {
     d->originating_udi = NULL;
     d->module = PA_INVALID_INDEX;
     d->sink_name = d->source_name = d->card_name = NULL;
+    r = -1;
 
 #ifdef HAVE_ALSA
     if (pa_streq(u->capability, CAPABILITY_ALSA))

commit 83cdcf2f53f4a449cd4d6eb67c1e079a5db0257a
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Tue Feb 17 19:35:01 2009 +0200

    alsa-util: make sure we check an initialized cn variable

diff --git a/src/modules/alsa/alsa-util.c b/src/modules/alsa/alsa-util.c
index 1bb7ddf..c53fd10 100644
--- a/src/modules/alsa/alsa-util.c
+++ b/src/modules/alsa/alsa-util.c
@@ -1,7 +1,7 @@
 /***
   This file is part of PulseAudio.
 
-  Copyright 2004-2006 Lennart Poettering
+  Copyright 2004-2009 Lennart Poettering
   Copyright 2006 Pierre Ossman <ossman at cendio.se> for Cendio AB
 
   PulseAudio is free software; you can redistribute it and/or modify
@@ -1388,7 +1388,7 @@ void pa_alsa_init_proplist_pcm_info(pa_core *c, pa_proplist *p, snd_pcm_info_t *
 
     snd_pcm_class_t class;
     snd_pcm_subclass_t subclass;
-    const char *n, *id, *sdn, *cn;
+    const char *n, *id, *sdn, *cn = NULL;
     int card;
 
     pa_assert(p);

commit ee0b5f71861f3ebad0c24f8c27000210fd986e54
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Tue Feb 17 20:06:35 2009 +0200

    log: don't leak bt

diff --git a/src/pulsecore/log.c b/src/pulsecore/log.c
index 1ae4383..89b75da 100644
--- a/src/pulsecore/log.c
+++ b/src/pulsecore/log.c
@@ -351,6 +351,7 @@ void pa_log_levelv_meta(
     }
 
     errno = saved_errno;
+    pa_xfree(bt);
 }
 
 void pa_log_level_meta(

commit 01f81d697346d3cb052d11137913aaa59a854c0b
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Thu Feb 19 04:49:58 2009 +0100

    card-restore: it's not useful to check an array, let's check the length

diff --git a/src/modules/module-card-restore.c b/src/modules/module-card-restore.c
index 909c095..c769605 100644
--- a/src/modules/module-card-restore.c
+++ b/src/modules/module-card-restore.c
@@ -191,7 +191,7 @@ static pa_hook_result_t card_new_hook_callback(pa_core *c, pa_card_new_data *new
 
     pa_assert(new_data);
 
-    if ((e = read_entry(u, new_data->name)) && e->profile) {
+    if ((e = read_entry(u, new_data->name)) && e->profile[0]) {
 
         if (!new_data->active_profile) {
             pa_card_new_data_set_profile(new_data, e->profile);

commit 6c8d851643a8413678c7557abc9758cc1bee94c0
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Tue Feb 17 20:18:56 2009 +0200

    protocol-native: fix get_info() for cards

diff --git a/src/pulsecore/protocol-native.c b/src/pulsecore/protocol-native.c
index 79b9b06..39b8282 100644
--- a/src/pulsecore/protocol-native.c
+++ b/src/pulsecore/protocol-native.c
@@ -3011,7 +3011,7 @@ static void command_get_info(pa_pdispatch *pd, uint32_t command, uint32_t tag, p
         source_fill_tagstruct(c, reply, source);
     else if (client)
         client_fill_tagstruct(c, reply, client);
-    else if (client)
+    else if (card)
         card_fill_tagstruct(c, reply, card);
     else if (module)
         module_fill_tagstruct(c, reply, module);

commit 2aeab75c6893c882800975866178c79dfe85202a
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Tue Feb 17 20:27:45 2009 +0200

    paplay: check if pa_context_connect() succeed

diff --git a/src/utils/paplay.c b/src/utils/paplay.c
index df2edf6..dec80e5 100644
--- a/src/utils/paplay.c
+++ b/src/utils/paplay.c
@@ -400,7 +400,10 @@ int main(int argc, char *argv[]) {
     pa_context_set_state_callback(context, context_state_callback, NULL);
 
     /* Connect the context */
-    pa_context_connect(context, server, 0, NULL);
+    if (pa_context_connect(context, server, 0, NULL) < 0) {
+        fprintf(stderr, _("pa_context_connect() failed: %s"), pa_strerror(pa_context_errno(context)));
+        goto quit;
+    }
 
     /* Run the main loop */
     if (pa_mainloop_run(m, &ret) < 0) {

commit 93ed27d5617202441bd9be346ce916289fe7128d
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Tue Feb 17 20:31:06 2009 +0200

    pactl: check if pa_context_connect succeed

diff --git a/src/utils/pactl.c b/src/utils/pactl.c
index 154e7f9..e020f37 100644
--- a/src/utils/pactl.c
+++ b/src/utils/pactl.c
@@ -1029,7 +1029,10 @@ int main(int argc, char *argv[]) {
     }
 
     pa_context_set_state_callback(context, context_state_callback, NULL);
-    pa_context_connect(context, server, 0, NULL);
+    if (pa_context_connect(context, server, 0, NULL) < 0) {
+        fprintf(stderr, _("pa_context_connect() failed: %s"), pa_strerror(pa_context_errno(context)));
+        goto quit;
+    }
 
     if (pa_mainloop_run(m, &ret) < 0) {
         fprintf(stderr, _("pa_mainloop_run() failed.\n"));

commit a8369274952ad81ed2b05800d182e35efd26e41d
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Tue Feb 17 20:34:05 2009 +0200

    tests/sync-playback: check if pa_context_connect succeed

diff --git a/src/tests/sync-playback.c b/src/tests/sync-playback.c
index 42c479a..f2a1560 100644
--- a/src/tests/sync-playback.c
+++ b/src/tests/sync-playback.c
@@ -174,11 +174,16 @@ int main(int argc, char *argv[]) {
 
     pa_context_set_state_callback(context, context_state_callback, NULL);
 
-    pa_context_connect(context, NULL, 0, NULL);
+    /* Connect the context */
+    if (pa_context_connect(context, NULL, 0, NULL) < 0) {
+        fprintf(stderr, "pa_context_connect() failed.\n");
+        goto quit;
+    }
 
     if (pa_mainloop_run(m, &ret) < 0)
         fprintf(stderr, "pa_mainloop_run() failed.\n");
 
+quit:
     pa_context_unref(context);
 
     for (i = 0; i < NSTREAMS; i++)

commit 5ea7dac11c225aa26367974d7cf37e71a096ef27
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Tue Feb 17 20:36:38 2009 +0200

    tests/interpol-test: check if mainloop_start() succeed

diff --git a/src/tests/interpol-test.c b/src/tests/interpol-test.c
index 20d2c23..d7da660 100644
--- a/src/tests/interpol-test.c
+++ b/src/tests/interpol-test.c
@@ -126,7 +126,8 @@ int main(int argc, char *argv[]) {
 
     pa_gettimeofday(&start);
 
-    pa_threaded_mainloop_start(m);
+    r = pa_threaded_mainloop_start(m);
+    assert(r >= 0);
 
     for (k = 0; k < 5000; k++) {
         pa_bool_t success = FALSE, changed = FALSE;

commit 25bbea67492cb7c6e9b8e78beb6553864c290a1a
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Tue Feb 17 20:38:51 2009 +0200

    tests/thread-mainloop-test: check if threaded_mainloop_start() succeed

diff --git a/src/tests/thread-mainloop-test.c b/src/tests/thread-mainloop-test.c
index 263cd57..3bcf4f1 100644
--- a/src/tests/thread-mainloop-test.c
+++ b/src/tests/thread-mainloop-test.c
@@ -47,7 +47,7 @@ int main(int argc, char *argv[]) {
     pa_assert_se(m = pa_threaded_mainloop_new());
     pa_assert_se(a = pa_threaded_mainloop_get_api(m));
 
-    pa_threaded_mainloop_start(m);
+    pa_assert_se(pa_threaded_mainloop_start(m) >= 0);
 
     pa_threaded_mainloop_lock(m);
 

commit c3eb9086b819eb7abb0248e0a253c21e5853fe99
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Tue Feb 17 20:52:11 2009 +0200

    pactl: return in case of error reading file (avoid using freed d)

diff --git a/src/utils/pactl.c b/src/utils/pactl.c
index e020f37..d3da90e 100644
--- a/src/utils/pactl.c
+++ b/src/utils/pactl.c
@@ -649,6 +649,7 @@ static void stream_write_callback(pa_stream *s, size_t length, void *userdata) {
         pa_xfree(d);
         fprintf(stderr, _("Premature end of file\n"));
         quit(1);
+        return;
     }
 
     pa_stream_write(s, d, length, pa_xfree, 0, PA_SEEK_RELATIVE);

commit a252b61be1d81f833a3cca87a2294d7fe65532fd
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Tue Feb 17 21:59:45 2009 +0200

    main: remove unused lf variable

diff --git a/src/daemon/main.c b/src/daemon/main.c
index d3e02fa..5f94ec6 100644
--- a/src/daemon/main.c
+++ b/src/daemon/main.c
@@ -348,7 +348,6 @@ int main(int argc, char *argv[]) {
     pa_time_event *win32_timer;
     struct timeval win32_tv;
 #endif
-    char *lf = NULL;
     int autospawn_fd = -1;
     pa_bool_t autospawn_locked = FALSE;
 
@@ -1000,9 +999,6 @@ finish:
         pa_autospawn_lock_done(FALSE);
     }
 
-    if (lf)
-        pa_xfree(lf);
-
 #ifdef OS_IS_WIN32
     if (win32_timer)
         pa_mainloop_get_api(mainloop)->time_free(win32_timer);

commit 927e501920f629eca1f73627b0d7a5a03a9e8bdc
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Tue Feb 17 22:07:57 2009 +0200

    pulsecore: remove unused variable from cli_command_load()

diff --git a/src/pulsecore/cli-command.c b/src/pulsecore/cli-command.c
index 1df0bd6..5e45c1a 100644
--- a/src/pulsecore/cli-command.c
+++ b/src/pulsecore/cli-command.c
@@ -401,7 +401,6 @@ static int pa_cli_command_info(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, pa_b
 }
 
 static int pa_cli_command_load(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, pa_bool_t *fail) {
-    pa_module *m;
     const char *name;
 
     pa_core_assert_ref(c);
@@ -414,7 +413,7 @@ static int pa_cli_command_load(pa_core *c, pa_tokenizer *t, pa_strbuf *buf, pa_b
         return -1;
     }
 
-    if (!(m = pa_module_load(c, name,  pa_tokenizer_get(t, 2)))) {
+    if (!pa_module_load(c, name,  pa_tokenizer_get(t, 2))) {
         pa_strbuf_puts(buf, "Module load failed.\n");
         return -1;
     }

commit 4512a2ce9ce15bdcded9d5aa457016716edd459a
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Tue Feb 17 22:06:25 2009 +0200

    rtp-recv: remove unused variable assignment

diff --git a/src/modules/rtp/module-rtp-recv.c b/src/modules/rtp/module-rtp-recv.c
index 063ba72..0d86459 100644
--- a/src/modules/rtp/module-rtp-recv.c
+++ b/src/modules/rtp/module-rtp-recv.c
@@ -562,7 +562,7 @@ static void sap_event_cb(pa_mainloop_api *m, pa_io_event *e, int fd, pa_io_event
     } else {
 
         if (!(s = pa_hashmap_get(u->by_origin, info.origin))) {
-            if (!(s = session_new(u, &info)))
+            if (!session_new(u, &info))
                 pa_sdp_info_destroy(&info);
 
         } else {

commit 67b0baecc41745afcf8591949fbdffb8678fe83f
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Tue Feb 17 22:17:10 2009 +0200

    pacat: remove unused variable

diff --git a/src/utils/pacat.c b/src/utils/pacat.c
index 10015ce..2224da9 100644
--- a/src/utils/pacat.c
+++ b/src/utils/pacat.c
@@ -336,7 +336,6 @@ static void context_drain_complete(pa_context*c, void *userdata) {
 
 /* Stream draining complete */
 static void stream_drain_complete(pa_stream*s, int success, void *userdata) {
-    pa_operation *o;
 
     if (!success) {
         fprintf(stderr, _("Failed to drain stream: %s\n"), pa_strerror(pa_context_errno(context)));
@@ -350,7 +349,7 @@ static void stream_drain_complete(pa_stream*s, int success, void *userdata) {
     pa_stream_unref(stream);
     stream = NULL;
 
-    if (!(o = pa_context_drain(context, context_drain_complete, NULL)))
+    if (!pa_context_drain(context, context_drain_complete, NULL))
         pa_context_disconnect(context);
     else {
         if (verbose)

commit d1306e3020137251fc0aa57386dd79ee1ec5ebb0
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Tue Feb 17 22:32:40 2009 +0200

    pulsecore: fix check for cb (m is already checked before)

diff --git a/src/pulsecore/protocol-native.c b/src/pulsecore/protocol-native.c
index 39b8282..59fae98 100644
--- a/src/pulsecore/protocol-native.c
+++ b/src/pulsecore/protocol-native.c
@@ -4070,7 +4070,7 @@ static void command_extension(pa_pdispatch *pd, uint32_t command, uint32_t tag,
     CHECK_VALIDITY(c->pstream, m->load_once || idx != PA_INVALID_INDEX, tag, PA_ERR_INVALID);
 
     cb = (pa_native_protocol_ext_cb_t) (unsigned long) pa_hashmap_get(c->protocol->extensions, m);
-    CHECK_VALIDITY(c->pstream, m, tag, PA_ERR_NOEXTENSION);
+    CHECK_VALIDITY(c->pstream, cb, tag, PA_ERR_NOEXTENSION);
 
     if (cb(c->protocol, m, c, tag, t) < 0)
         protocol_error(c);

commit bb52a6753b907e18b0de31bffd424b8ed273c5a9
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Tue Feb 17 22:37:16 2009 +0200

    padsp: don't use si if it's NULL

diff --git a/src/utils/padsp.c b/src/utils/padsp.c
index 046bae4..76e86c8 100644
--- a/src/utils/padsp.c
+++ b/src/utils/padsp.c
@@ -1202,7 +1202,7 @@ fail:
 static void sink_info_cb(pa_context *context, const pa_sink_info *si, int eol, void *userdata) {
     fd_info *i = userdata;
 
-    if (!si && eol < 0) {
+    if (!si || eol < 0) {
         i->operation_success = 0;
         pa_threaded_mainloop_signal(i->mainloop, 0);
         return;
@@ -1224,7 +1224,7 @@ static void sink_info_cb(pa_context *context, const pa_sink_info *si, int eol, v
 static void source_info_cb(pa_context *context, const pa_source_info *si, int eol, void *userdata) {
     fd_info *i = userdata;
 
-    if (!si && eol < 0) {
+    if (!si || eol < 0) {
         i->operation_success = 0;
         pa_threaded_mainloop_signal(i->mainloop, 0);
         return;

commit 60d53c6523dfd59fbcc99ff443ba993e285ca366
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Tue Feb 17 22:58:59 2009 +0200

    tests/ipacl-test: check inet_pton()

diff --git a/src/tests/ipacl-test.c b/src/tests/ipacl-test.c
index 7b7564a..f89665c 100644
--- a/src/tests/ipacl-test.c
+++ b/src/tests/ipacl-test.c
@@ -25,6 +25,7 @@
 #endif
 
 #include "../pulsecore/winsock.h"
+#include "../pulsecore/macro.h"
 
 #include <pulsecore/ipacl.h>
 
@@ -96,7 +97,7 @@ int main(int argc, char *argv[]) {
     memset(&sa6, 0, sizeof(sa6));
     sa6.sin6_family = AF_INET6;
     sa6.sin6_port = htons(22);
-    inet_pton(AF_INET6, "::1", &sa6.sin6_addr);
+    pa_assert_se(inet_pton(AF_INET6, "::1", &sa6.sin6_addr) == 1);
 
     r = connect(fd, (struct sockaddr*) &sa6, sizeof(sa6));
     assert(r >= 0);

commit 204083cb325ba3db09ca75b70e9d3d6adfb67e0d
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Wed Feb 18 18:16:45 2009 +0200

    pulsecore: unused variable e in hashmap_put()

diff --git a/src/pulsecore/hashmap.c b/src/pulsecore/hashmap.c
index 3c6f41e..57607b6 100644
--- a/src/pulsecore/hashmap.c
+++ b/src/pulsecore/hashmap.c
@@ -138,7 +138,7 @@ int pa_hashmap_put(pa_hashmap *h, const void *key, void *value) {
 
     hash = h->hash_func(key) % NBUCKETS;
 
-    if ((e = hash_scan(h, hash, key)))
+    if (hash_scan(h, hash, key))
         return -1;
 
     if (!(e = pa_flist_pop(PA_STATIC_FLIST_GET(entries))))

commit 4f1380b7138d5862e8f12c9060ef46f0355c160b
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Wed Feb 18 18:21:25 2009 +0200

    pulsecore: use r returned from fgets()

diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c
index 61f9a65..432ee3b 100644
--- a/src/pulsecore/core-util.c
+++ b/src/pulsecore/core-util.c
@@ -2459,7 +2459,7 @@ char *pa_machine_id(void) {
 
         pa_strip_nl(ln);
 
-        if (ln[0])
+        if (r && ln[0])
             return pa_xstrdup(ln);
     }
 

commit 2c6abb87938d2172963a99979449c1ff0b63a9f3
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Wed Feb 18 19:15:43 2009 +0200

    daemon-conf: make sure c->log_level < LEVEL_MAX

diff --git a/src/daemon/daemon-conf.c b/src/daemon/daemon-conf.c
index 7d3b89f..7dfef27 100644
--- a/src/daemon/daemon-conf.c
+++ b/src/daemon/daemon-conf.c
@@ -639,7 +639,7 @@ char *pa_daemon_conf_dump(pa_daemon_conf *c) {
     if (c->config_file)
         pa_strbuf_printf(s, _("### Read from configuration file: %s ###\n"), c->config_file);
 
-    pa_assert(c->log_level <= PA_LOG_LEVEL_MAX);
+    pa_assert(c->log_level < PA_LOG_LEVEL_MAX);
 
     pa_strbuf_printf(s, "daemonize = %s\n", pa_yes_no(c->daemonize));
     pa_strbuf_printf(s, "fail = %s\n", pa_yes_no(c->fail));

commit c0cf22d0812d766fb7528449be1351ca2e030a8c
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Wed Feb 18 19:26:21 2009 +0200

    protocol-esound: don't accept a request of PROTOCOL_MAX

diff --git a/src/pulsecore/protocol-esound.c b/src/pulsecore/protocol-esound.c
index e1643cb..840f458 100644
--- a/src/pulsecore/protocol-esound.c
+++ b/src/pulsecore/protocol-esound.c
@@ -924,7 +924,7 @@ static int do_read(connection *c) {
 
             c->request = PA_MAYBE_INT32_SWAP(c->swap_byte_order, c->request);
 
-            if (c->request < ESD_PROTO_CONNECT || c->request > ESD_PROTO_MAX) {
+            if (c->request < ESD_PROTO_CONNECT || c->request >= ESD_PROTO_MAX) {
                 pa_log("recieved invalid request.");
                 return -1;
             }

commit 0684b236f0ad2fc367971bfa02cb466c2170aafd
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Wed Feb 18 19:44:55 2009 +0200

    stream-resotre: don't leak a name

diff --git a/src/modules/module-stream-restore.c b/src/modules/module-stream-restore.c
index 434dc7a..d935caf 100644
--- a/src/modules/module-stream-restore.c
+++ b/src/modules/module-stream-restore.c
@@ -532,6 +532,7 @@ static void apply_entry(struct userdata *u, const char *name, struct entry *e) {
             pa_xfree(n);
             continue;
         }
+	pa_xfree(n);
 
         if (u->restore_volume) {
             pa_cvolume v;
@@ -581,6 +582,7 @@ static void apply_entry(struct userdata *u, const char *name, struct entry *e) {
             pa_xfree(n);
             continue;
         }
+	pa_xfree(n);
 
         if (u->restore_device &&
             e->device_valid &&

commit 88fc458393e00834cec5abe6c26a3cf114398532
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Wed Feb 18 20:00:57 2009 +0200

    protocol-native: don't leak a proplist

diff --git a/src/pulsecore/protocol-native.c b/src/pulsecore/protocol-native.c
index 59fae98..a963f78 100644
--- a/src/pulsecore/protocol-native.c
+++ b/src/pulsecore/protocol-native.c
@@ -2560,7 +2560,10 @@ static void command_create_upload_stream(pa_pdispatch *pd, uint32_t command, uin
         if (!(name = pa_proplist_gets(p, PA_PROP_EVENT_ID)))
             name = pa_proplist_gets(p, PA_PROP_MEDIA_NAME);
 
-    CHECK_VALIDITY(c->pstream, name && pa_namereg_is_valid_name(name), tag, PA_ERR_INVALID);
+    if (!name || !pa_namereg_is_valid_name(name)) {
+        pa_proplist_free(p);
+        CHECK_VALIDITY(c->pstream, FALSE, tag, PA_ERR_INVALID);
+    }
 
     s = upload_stream_new(c, &ss, &map, name, length, p);
     pa_proplist_free(p);
@@ -3590,24 +3593,30 @@ static void command_update_proplist(pa_pdispatch *pd, uint32_t command, uint32_t
         }
     }
 
-    CHECK_VALIDITY(c->pstream, mode == PA_UPDATE_SET || mode == PA_UPDATE_MERGE || mode == PA_UPDATE_REPLACE, tag, PA_ERR_INVALID);
+    if (!(mode == PA_UPDATE_SET || mode == PA_UPDATE_MERGE || mode == PA_UPDATE_REPLACE)) {
+        pa_proplist_free(p);
+        CHECK_VALIDITY(c->pstream, FALSE, tag, PA_ERR_INVALID);
+    }
 
     if (command == PA_COMMAND_UPDATE_PLAYBACK_STREAM_PROPLIST) {
         playback_stream *s;
 
         s = pa_idxset_get_by_index(c->output_streams, idx);
-        CHECK_VALIDITY(c->pstream, s, tag, PA_ERR_NOENTITY);
-        CHECK_VALIDITY(c->pstream, playback_stream_isinstance(s), tag, PA_ERR_NOENTITY);
-
+        if (!s || !playback_stream_isinstance(s)) {
+            pa_proplist_free(p);
+            CHECK_VALIDITY(c->pstream, FALSE, tag, PA_ERR_NOENTITY);
+        }
         pa_sink_input_update_proplist(s->sink_input, mode, p);
 
     } else if (command == PA_COMMAND_UPDATE_RECORD_STREAM_PROPLIST) {
         record_stream *s;
 
-        s = pa_idxset_get_by_index(c->record_streams, idx);
-        CHECK_VALIDITY(c->pstream, s, tag, PA_ERR_NOENTITY);
-
+        if (!(s = pa_idxset_get_by_index(c->record_streams, idx))) {
+            pa_proplist_free(p);
+            CHECK_VALIDITY(c->pstream, FALSE, tag, PA_ERR_NOENTITY);
+        }
         pa_source_output_update_proplist(s->source_output, mode, p);
+
     } else {
         pa_assert(command == PA_COMMAND_UPDATE_CLIENT_PROPLIST);
 
@@ -3615,6 +3624,7 @@ static void command_update_proplist(pa_pdispatch *pd, uint32_t command, uint32_t
     }
 
     pa_pstream_send_simple_ack(c->pstream, tag);
+    pa_proplist_free(p);
 }
 
 static void command_remove_proplist(pa_pdispatch *pd, uint32_t command, uint32_t tag, pa_tagstruct *t, void *userdata) {

commit 4722fecb993440db4df6a87203aee5eb796c5763
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Wed Feb 18 20:31:54 2009 +0200

    rtp: remove unused variable a

diff --git a/src/modules/rtp/sdp.c b/src/modules/rtp/sdp.c
index 643361f..7c54743 100644
--- a/src/modules/rtp/sdp.c
+++ b/src/modules/rtp/sdp.c
@@ -44,7 +44,7 @@
 char *pa_sdp_build(int af, const void *src, const void *dst, const char *name, uint16_t port, uint8_t payload, const pa_sample_spec *ss) {
     uint32_t ntp;
     char buf_src[64], buf_dst[64], un[64];
-    const char *u, *f, *a;
+    const char *u, *f;
 
     pa_assert(src);
     pa_assert(dst);
@@ -62,8 +62,8 @@ char *pa_sdp_build(int af, const void *src, const void *dst, const char *name, u
 
     ntp = (uint32_t) time(NULL) + 2208988800U;
 
-    pa_assert_se(a = inet_ntop(af, src, buf_src, sizeof(buf_src)));
-    pa_assert_se(a = inet_ntop(af, dst, buf_dst, sizeof(buf_dst)));
+    pa_assert_se(inet_ntop(af, src, buf_src, sizeof(buf_src)));
+    pa_assert_se(inet_ntop(af, dst, buf_dst, sizeof(buf_dst)));
 
     return pa_sprintf_malloc(
             PA_SDP_HEADER

commit f1dcbe0f5d363f96d7ad44dcb5bd84d09b54ba3a
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Wed Feb 18 21:21:25 2009 +0200

    pulsecore: don't leak d in case of error

diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c
index 432ee3b..623a488 100644
--- a/src/pulsecore/core-util.c
+++ b/src/pulsecore/core-util.c
@@ -1443,6 +1443,7 @@ char *pa_get_runtime_dir(void) {
 
     if (pa_make_secure_dir(d, m, (uid_t) -1, (gid_t) -1) < 0)  {
         pa_log_error("Failed to create secure directory: %s", pa_cstrerror(errno));
+        pa_xfree(d);
         goto fail;
     }
 

commit 800489eea907815427d08659034ad69dbb56b5e6
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Wed Feb 18 21:23:41 2009 +0200

    pulsecore: don't leak p when make_random_dir_and_link()

diff --git a/src/pulsecore/core-util.c b/src/pulsecore/core-util.c
index 623a488..a184beb 100644
--- a/src/pulsecore/core-util.c
+++ b/src/pulsecore/core-util.c
@@ -1411,6 +1411,7 @@ static int make_random_dir_and_link(mode_t m, const char *k) {
         return -1;
     }
 
+    pa_xfree(p);
     return 0;
 }
 

commit 7c78c3f6589eeba9e2a4d7f7abbcaaeb6a89d833
Author: Marc-André Lureau <marc-andre.lureau at nokia.com>
Date:   Wed Feb 18 21:35:18 2009 +0200

    alsa-util: check if mixer_poll_descriptors_count() < 0

diff --git a/src/modules/alsa/alsa-util.c b/src/modules/alsa/alsa-util.c
index c53fd10..a0907c4 100644
--- a/src/modules/alsa/alsa-util.c
+++ b/src/modules/alsa/alsa-util.c
@@ -113,7 +113,7 @@ static void io_cb(pa_mainloop_api*a, pa_io_event* e, int fd, pa_io_event_flags_t
 static void defer_cb(pa_mainloop_api*a, pa_defer_event* e, void *userdata) {
     struct pa_alsa_fdlist *fdl = userdata;
     unsigned num_fds, i;
-    int err;
+    int err, n;
     struct pollfd *temp;
 
     pa_assert(a);
@@ -122,7 +122,11 @@ static void defer_cb(pa_mainloop_api*a, pa_defer_event* e, void *userdata) {
 
     a->defer_enable(fdl->defer, 0);
 
-    num_fds = (unsigned) snd_mixer_poll_descriptors_count(fdl->mixer);
+    if ((n = snd_mixer_poll_descriptors_count(fdl->mixer)) < 0) {
+        pa_log("snd_mixer_poll_descriptors_count() failed: %s", snd_strerror(n));
+        return;
+    }
+    num_fds = (unsigned) n;
 
     if (num_fds != fdl->num_fds) {
         if (fdl->fds)

commit b0c0106824b47e7b21f022cb0f8dbf5b54a7b269
Merge: 7c78c3f... 05b7440...
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Feb 19 05:02:52 2009 +0100

    Merge commit 'elmarco/legacy-dir'


commit 2e250aaebb7708b25b5342d8ced657364adedc95
Merge: b0c0106... 38ded3b...
Author: Lennart Poettering <lennart at poettering.net>
Date:   Thu Feb 19 05:17:08 2009 +0100

    Merge commit '38ded3bb31bc49664641965f856a35f432a8a956'


commit d69bd0339f77e487bc4db328a892872eb47e4083
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Feb 20 00:32:15 2009 +0100

    don't try to use weakref stuff on older compilers that don't really support it

diff --git a/src/pulse/gccmacro.h b/src/pulse/gccmacro.h
index f110a74..58188ee 100644
--- a/src/pulse/gccmacro.h
+++ b/src/pulse/gccmacro.h
@@ -118,7 +118,7 @@
 #endif
 
 #ifndef PA_GCC_WEAKREF
-#ifdef __GNUC__
+#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ > 1)) || (__GNUC__ > 4))
 /** Macro for usgae of GCC's weakref attribute */
 #define PA_GCC_WEAKREF(x) __attribute__((weakref(#x)));
 #endif

commit fdca6edf20906b151f725b2750dd4733f3eb9c8c
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Feb 20 01:18:37 2009 +0100

    make profile names translatable

diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c
index eeac5e7..5290268 100644
--- a/src/modules/alsa/alsa-sink.c
+++ b/src/modules/alsa/alsa-sink.c
@@ -35,6 +35,7 @@
 #include <pulse/xmalloc.h>
 #include <pulse/util.h>
 #include <pulse/timeval.h>
+#include <pulse/i18n.h>
 
 #include <pulsecore/core.h>
 #include <pulsecore/module.h>
@@ -254,9 +255,9 @@ static int mmap_write(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polle
         if (PA_UNLIKELY(n <= u->hwbuf_unused_frames)) {
 
             if (polled && pa_log_ratelimit())
-                pa_log("ALSA woke us up to write new data to the device, but there was actually nothing to write! "
-                       "Most likely this is an ALSA driver bug. Please report this issue to the ALSA developers. "
-                       "We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail_update() returned 0.");
+                pa_log(_("ALSA woke us up to write new data to the device, but there was actually nothing to write! "
+                         "Most likely this is an ALSA driver bug. Please report this issue to the ALSA developers. "
+                         "We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail_update() returned 0."));
 
             break;
         }
@@ -377,9 +378,9 @@ static int unix_write(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polle
         if (PA_UNLIKELY(n <= u->hwbuf_unused_frames)) {
 
             if (polled && pa_log_ratelimit())
-                pa_log("ALSA woke us up to write new data to the device, but there was actually nothing to write! "
-                       "Most likely this is an ALSA driver bug. Please report this issue to the ALSA developers. "
-                       "We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail_update() returned 0.");
+                pa_log(_("ALSA woke us up to write new data to the device, but there was actually nothing to write! "
+                         "Most likely this is an ALSA driver bug. Please report this issue to the ALSA developers. "
+                         "We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail_update() returned 0."));
 
             break;
         }
diff --git a/src/modules/alsa/alsa-source.c b/src/modules/alsa/alsa-source.c
index 81d7c0b..a5de388 100644
--- a/src/modules/alsa/alsa-source.c
+++ b/src/modules/alsa/alsa-source.c
@@ -35,6 +35,7 @@
 #include <pulse/xmalloc.h>
 #include <pulse/util.h>
 #include <pulse/timeval.h>
+#include <pulse/i18n.h>
 
 #include <pulsecore/core-error.h>
 #include <pulsecore/core.h>
@@ -240,9 +241,9 @@ static int mmap_read(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polled
         if (PA_UNLIKELY(n <= 0)) {
 
             if (polled && pa_log_ratelimit())
-                pa_log("ALSA woke us up to read new data from the device, but there was actually nothing to read! "
-                       "Most likely this is an ALSA driver bug. Please report this issue to the ALSA developers. "
-                       "We were woken up with POLLIN set -- however a subsequent snd_pcm_avail_update() returned 0.");
+                pa_log(_("ALSA woke us up to read new data from the device, but there was actually nothing to read! "
+                         "Most likely this is an ALSA driver bug. Please report this issue to the ALSA developers. "
+                         "We were woken up with POLLIN set -- however a subsequent snd_pcm_avail_update() returned 0."));
 
             break;
         }
@@ -348,9 +349,9 @@ static int unix_read(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polled
         if (PA_UNLIKELY(n <= 0)) {
 
             if (polled && pa_log_ratelimit())
-                pa_log("ALSA woke us up to read new data from the device, but there was actually nothing to read! "
-                       "Most likely this is an ALSA driver bug. Please report this issue to the ALSA developers. "
-                       "We were woken up with POLLIN set -- however a subsequent snd_pcm_avail_update() returned 0.");
+                pa_log(_("ALSA woke us up to read new data from the device, but there was actually nothing to read! "
+                         "Most likely this is an ALSA driver bug. Please report this issue to the ALSA developers. "
+                         "We were woken up with POLLIN set -- however a subsequent snd_pcm_avail_update() returned 0."));
 
             return work_done;
         }
diff --git a/src/modules/alsa/alsa-util.c b/src/modules/alsa/alsa-util.c
index 1bb7ddf..95e872b 100644
--- a/src/modules/alsa/alsa-util.c
+++ b/src/modules/alsa/alsa-util.c
@@ -32,6 +32,7 @@
 #include <pulse/xmalloc.h>
 #include <pulse/timeval.h>
 #include <pulse/util.h>
+#include <pulse/i18n.h>
 
 #include <pulsecore/log.h>
 #include <pulsecore/macro.h>
@@ -501,39 +502,39 @@ int pa_alsa_set_sw_params(snd_pcm_t *pcm, snd_pcm_uframes_t avail_min) {
 static const struct pa_alsa_profile_info device_table[] = {
     {{ 1, { PA_CHANNEL_POSITION_MONO }},
      "hw",
-     "Analog Mono",
+     N_("Analog Mono"),
      "analog-mono",
      1 },
 
     {{ 2, { PA_CHANNEL_POSITION_LEFT, PA_CHANNEL_POSITION_RIGHT }},
      "front",
-     "Analog Stereo",
+     N_("Analog Stereo"),
      "analog-stereo",
      10 },
 
     {{ 2, { PA_CHANNEL_POSITION_LEFT, PA_CHANNEL_POSITION_RIGHT }},
      "iec958",
-     "IEC958 Digital Stereo",
+     N_("Digital Stereo (IEC958)"),
      "iec958-stereo",
      5 },
 
     {{ 2, { PA_CHANNEL_POSITION_LEFT, PA_CHANNEL_POSITION_RIGHT }},
      "hdmi",
-     "HDMI Digital Stereo",
+     N_("Digital Stereo (HDMI)"),
      "hdmi-stereo",
      4 },
 
     {{ 4, { PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT,
             PA_CHANNEL_POSITION_REAR_LEFT, PA_CHANNEL_POSITION_REAR_RIGHT }},
      "surround40",
-     "Analog Surround 4.0",
+     N_("Analog Surround 4.0"),
      "analog-surround-40",
      7 },
 
     {{ 4, { PA_CHANNEL_POSITION_FRONT_LEFT, PA_CHANNEL_POSITION_FRONT_RIGHT,
             PA_CHANNEL_POSITION_REAR_LEFT, PA_CHANNEL_POSITION_REAR_RIGHT }},
      "a52",
-     "IEC958/AC3 Digital Surround 4.0",
+     N_("Digital Surround 4.0 (IEC958/AC3)"),
      "iec958-ac3-surround-40",
      2 },
 
@@ -541,7 +542,7 @@ static const struct pa_alsa_profile_info device_table[] = {
             PA_CHANNEL_POSITION_REAR_LEFT, PA_CHANNEL_POSITION_REAR_RIGHT,
             PA_CHANNEL_POSITION_LFE }},
      "surround41",
-     "Analog Surround 4.1",
+     N_("Analog Surround 4.1"),
      "analog-surround-41",
      7 },
 
@@ -549,7 +550,7 @@ static const struct pa_alsa_profile_info device_table[] = {
             PA_CHANNEL_POSITION_REAR_LEFT, PA_CHANNEL_POSITION_REAR_RIGHT,
             PA_CHANNEL_POSITION_CENTER }},
      "surround50",
-     "Analog Surround 5.0",
+     N_("Analog Surround 5.0"),
      "analog-surround-50",
      7 },
 
@@ -557,7 +558,7 @@ static const struct pa_alsa_profile_info device_table[] = {
             PA_CHANNEL_POSITION_REAR_LEFT, PA_CHANNEL_POSITION_REAR_RIGHT,
             PA_CHANNEL_POSITION_CENTER, PA_CHANNEL_POSITION_LFE }},
      "surround51",
-     "Analog Surround 5.1",
+     N_("Analog Surround 5.1"),
      "analog-surround-51",
      8 },
 
@@ -565,7 +566,7 @@ static const struct pa_alsa_profile_info device_table[] = {
             PA_CHANNEL_POSITION_FRONT_RIGHT, PA_CHANNEL_POSITION_REAR_LEFT,
             PA_CHANNEL_POSITION_REAR_RIGHT, PA_CHANNEL_POSITION_LFE}},
      "a52",
-     "IEC958/AC3 Digital Surround 5.1",
+     N_("Digital Surround 5.1 (IEC958/AC3)"),
      "iec958-ac3-surround-51",
      3 },
 
@@ -574,7 +575,7 @@ static const struct pa_alsa_profile_info device_table[] = {
             PA_CHANNEL_POSITION_CENTER, PA_CHANNEL_POSITION_LFE,
             PA_CHANNEL_POSITION_SIDE_LEFT, PA_CHANNEL_POSITION_SIDE_RIGHT }},
      "surround71",
-     "Analog Surround 7.1",
+     N_("Analog Surround 7.1"),
      "analog-surround-71",
      7 },
 
@@ -1553,8 +1554,8 @@ snd_pcm_sframes_t pa_alsa_safe_avail_update(snd_pcm_t *pcm, size_t hwbuf_size, c
 
     if (k >= hwbuf_size * 3 ||
         k >= pa_bytes_per_second(ss)*10)
-        pa_log("snd_pcm_avail_update() returned a value that is exceptionally large: %lu bytes (%lu ms). "
-               "Most likely this is an ALSA driver bug. Please report this issue to the ALSA developers.",
+        pa_log(_("snd_pcm_avail_update() returned a value that is exceptionally large: %lu bytes (%lu ms). "
+                 "Most likely this is an ALSA driver bug. Please report this issue to the ALSA developers."),
                (unsigned long) k, (unsigned long) (pa_bytes_to_usec(k, ss) / PA_USEC_PER_MSEC));
 
     return n;
@@ -1585,8 +1586,8 @@ int pa_alsa_safe_mmap_begin(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas
         k >= hwbuf_size * 3 ||
         k >= pa_bytes_per_second(ss)*10)
 
-        pa_log("snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes (%lu ms). "
-               "Most likely this is an ALSA driver bug. Please report this issue to the ALSA developers.",
+        pa_log(_("snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes (%lu ms). "
+                 "Most likely this is an ALSA driver bug. Please report this issue to the ALSA developers."),
                (unsigned long) k, (unsigned long) (pa_bytes_to_usec(k, ss) / PA_USEC_PER_MSEC));
 
     return r;
diff --git a/src/modules/alsa/alsa-util.h b/src/modules/alsa/alsa-util.h
index 9eab644..79d0999 100644
--- a/src/modules/alsa/alsa-util.h
+++ b/src/modules/alsa/alsa-util.h
@@ -59,7 +59,7 @@ int pa_alsa_find_mixer_and_elem(snd_pcm_t *pcm, snd_mixer_t **_m, snd_mixer_elem
 typedef struct pa_alsa_profile_info {
     pa_channel_map map;
     const char *alsa_name;
-    const char *description;
+    const char *description; /* internationalized */
     const char *name;
     unsigned priority;
 } pa_alsa_profile_info;
diff --git a/src/modules/bluetooth/module-bluetooth-device.c b/src/modules/bluetooth/module-bluetooth-device.c
index 6daae83..27f9e7c 100644
--- a/src/modules/bluetooth/module-bluetooth-device.c
+++ b/src/modules/bluetooth/module-bluetooth-device.c
@@ -33,6 +33,8 @@
 #include <pulse/xmalloc.h>
 #include <pulse/timeval.h>
 #include <pulse/sample.h>
+#include <pulse/i18n.h>
+
 #include <pulsecore/module.h>
 #include <pulsecore/modargs.h>
 #include <pulsecore/core-util.h>
@@ -1655,7 +1657,7 @@ static int add_card(struct userdata *u, const char * default_profile) {
     data.profiles = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
 
     if (u->device->audio_sink_info_valid > 0) {
-        p = pa_card_profile_new("a2dp", "A2DP Advanced Audio Distribution Profile", sizeof(enum profile));
+        p = pa_card_profile_new("a2dp", _("High Fidelity Playback (A2DP)"), sizeof(enum profile));
         p->priority = 10;
         p->n_sinks = 1;
         p->n_sources = 0;
@@ -1669,7 +1671,7 @@ static int add_card(struct userdata *u, const char * default_profile) {
     }
 
     if (u->device->headset_info_valid > 0) {
-        p = pa_card_profile_new("hsp", "HSP/HFP Headset/Hands-Free Profile", sizeof(enum profile));
+        p = pa_card_profile_new("hsp", _("Telephony Duplex (HSP/HFP)"), sizeof(enum profile));
         p->priority = 20;
         p->n_sinks = 1;
         p->n_sources = 1;
@@ -1684,7 +1686,7 @@ static int add_card(struct userdata *u, const char * default_profile) {
 
     pa_assert(!pa_hashmap_isempty(data.profiles));
 
-    p = pa_card_profile_new("off", "Off", sizeof(enum profile));
+    p = pa_card_profile_new("off", _("Off"), sizeof(enum profile));
     d = PA_CARD_PROFILE_DATA(p);
     *d = PROFILE_OFF;
     pa_hashmap_put(data.profiles, p->name, p);

commit ef189d50a7357a7f158c9d6f4e59a0f32fcaa92d
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Feb 20 03:16:54 2009 +0100

    make it easier to debug timing related problems

diff --git a/src/pulsecore/rtpoll.c b/src/pulsecore/rtpoll.c
index 183d97c..01dfd62 100644
--- a/src/pulsecore/rtpoll.c
+++ b/src/pulsecore/rtpoll.c
@@ -50,29 +50,39 @@
 #include <pulsecore/rtsig.h>
 #include <pulsecore/flist.h>
 #include <pulsecore/core-util.h>
-
 #include <pulsecore/winsock.h>
+#include <pulsecore/ratelimit.h>
 
 #include "rtpoll.h"
 
+/* #define DEBUG_TIMING */
+
 struct pa_rtpoll {
     struct pollfd *pollfd, *pollfd2;
     unsigned n_pollfd_alloc, n_pollfd_used;
 
-    pa_bool_t timer_enabled;
     struct timeval next_elapse;
+    pa_bool_t timer_enabled:1;
 
-    pa_bool_t scan_for_dead;
-    pa_bool_t running, installed, rebuild_needed, quit;
+    pa_bool_t scan_for_dead:1;
+    pa_bool_t running:1;
+    pa_bool_t installed:1;
+    pa_bool_t rebuild_needed:1;
+    pa_bool_t quit:1;
 
 #ifdef HAVE_PPOLL
+    pa_bool_t timer_armed:1;
+#ifdef __linux__
+    pa_bool_t dont_use_ppoll:1;
+#endif
     int rtsig;
     sigset_t sigset_unblocked;
     timer_t timer;
-    pa_bool_t timer_armed;
-#ifdef __linux__
-    pa_bool_t dont_use_ppoll;
 #endif
+
+#ifdef DEBUG_TIMING
+    pa_usec_t timestamp;
+    pa_usec_t slept, awake;
 #endif
 
     PA_LLIST_HEAD(pa_rtpoll_item, items);
@@ -149,6 +159,11 @@ pa_rtpoll *pa_rtpoll_new(void) {
 
     PA_LLIST_HEAD_INIT(pa_rtpoll_item, p->items);
 
+#ifdef DEBUG_TIMING
+    p->timestamp = pa_rtclock_usec();
+    p->slept = p->awake = 0;
+#endif
+
     return p;
 }
 
@@ -377,6 +392,14 @@ int pa_rtpoll_run(pa_rtpoll *p, pa_bool_t wait) {
             pa_timeval_add(&timeout, pa_timeval_diff(&p->next_elapse, &now));
     }
 
+#ifdef DEBUG_TIMING
+    {
+        pa_usec_t now = pa_rtclock_usec();
+        p->awake = now - p->timestamp;
+        p->timestamp = now;
+    }
+#endif
+
     /* OK, now let's sleep */
 #ifdef HAVE_PPOLL
 
@@ -396,6 +419,18 @@ int pa_rtpoll_run(pa_rtpoll *p, pa_bool_t wait) {
 #endif
         r = poll(p->pollfd, p->n_pollfd_used, (!wait || p->quit || p->timer_enabled) ? (int) ((timeout.tv_sec*1000) + (timeout.tv_usec / 1000)) : -1);
 
+#ifdef DEBUG_TIMING
+    {
+        pa_usec_t now = pa_rtclock_usec();
+        p->slept = now - p->timestamp;
+        p->timestamp = now;
+
+        pa_log("Process time %llu ms; sleep time %llu ms",
+               (unsigned long long) (p->awake / PA_USEC_PER_MSEC),
+               (unsigned long long) (p->slept / PA_USEC_PER_MSEC));
+    }
+#endif
+
     if (r < 0) {
         if (errno == EAGAIN || errno == EINTR)
             r = 0;

commit 9f813dd5b306e59b40c5c88c52406638a8062749
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Feb 20 03:17:53 2009 +0100

    Make sure we actually call _() for translating profile names

diff --git a/src/modules/alsa/module-alsa-card.c b/src/modules/alsa/module-alsa-card.c
index e63414e..e517ddc 100644
--- a/src/modules/alsa/module-alsa-card.c
+++ b/src/modules/alsa/module-alsa-card.c
@@ -24,6 +24,8 @@
 #endif
 
 #include <pulse/xmalloc.h>
+#include <pulse/i18n.h>
+
 #include <pulsecore/core-util.h>
 #include <pulsecore/modargs.h>
 #include <pulsecore/queue.h>
@@ -104,14 +106,14 @@ static void enumerate_cb(
 
     if (sink && source) {
         n = pa_sprintf_malloc("output-%s+input-%s", sink->name, source->name);
-        t = pa_sprintf_malloc("Output %s + Input %s", sink->description, source->description);
+        t = pa_sprintf_malloc(_("Output %s + Input %s"), sink->description, _(source->description));
     } else if (sink) {
         n = pa_sprintf_malloc("output-%s", sink->name);
-        t = pa_sprintf_malloc("Output %s", sink->description);
+        t = pa_sprintf_malloc(_("Output %s"), _(sink->description));
     } else {
         pa_assert(source);
         n = pa_sprintf_malloc("input-%s", source->name);
-        t = pa_sprintf_malloc("Input %s", source->description);
+        t = pa_sprintf_malloc(_("Input %s"), _(source->description));
     }
 
     pa_log_info("Found output profile '%s'", t);
@@ -142,7 +144,7 @@ static void add_disabled_profile(pa_hashmap *profiles) {
     pa_card_profile *p;
     struct profile_data *d;
 
-    p = pa_card_profile_new("off", "Off", sizeof(struct profile_data));
+    p = pa_card_profile_new("off", _("Off"), sizeof(struct profile_data));
 
     d = PA_CARD_PROFILE_DATA(p);
     d->sink_profile = d->source_profile = NULL;

commit fa2e07a0bd4d02280c397099b612ce4d56673c10
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Feb 20 03:19:33 2009 +0100

    add test tool for debugging broken timing in sound drivers

diff --git a/src/Makefile.am b/src/Makefile.am
index f385c0a..ceafdf7 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -313,6 +313,11 @@ TESTS_BINARIES += \
 		gtk-test
 endif
 
+if HAVE_ALSA
+TESTS_BINARIES += \
+		alsa-time-test
+endif
+
 if BUILD_TESTS_DEFAULT
 noinst_PROGRAMS = $(TESTS_BINARIES)
 else
@@ -514,6 +519,11 @@ gtk_test_LDADD = $(AM_LDADD) libpulse.la libpulse-mainloop-glib.la
 gtk_test_CFLAGS = $(AM_CFLAGS) $(GTK20_CFLAGS)
 gtk_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(GTK20_LIBS)
 
+alsa_time_test_SOURCES = tests/alsa-time-test.c
+alsa_time_test_LDADD = $(AM_LDADD)
+alsa_time_test_CFLAGS = $(AM_CFLAGS) $(ASOUNDLIB_CFLAGS)
+alsa_time_test_LDFLAGS = $(AM_LDFLAGS) $(BINLDFLAGS) $(ASOUNDLIB_LIBS)
+
 ###################################
 #         Common library          #
 ###################################
@@ -960,6 +970,8 @@ modlibexec_LTLIBRARIES += \
 		module-oss.la
 endif
 
+pulselibexec_PROGRAMS =
+
 if HAVE_ALSA
 modlibexec_LTLIBRARIES += \
 		libalsa-util.la \
@@ -995,8 +1007,6 @@ modlibexec_LTLIBRARIES += \
 		module-jack-source.la
 endif
 
-pulselibexec_PROGRAMS =
-
 if HAVE_GCONF
 modlibexec_LTLIBRARIES += \
 		module-gconf.la
diff --git a/src/tests/alsa-time-test.c b/src/tests/alsa-time-test.c
new file mode 100644
index 0000000..3858bf7
--- /dev/null
+++ b/src/tests/alsa-time-test.c
@@ -0,0 +1,200 @@
+#include <assert.h>
+#include <inttypes.h>
+#include <time.h>
+
+#include <alsa/asoundlib.h>
+
+static uint64_t timespec_us(const struct timespec *ts) {
+    return
+        ts->tv_sec * 1000000LLU +
+        ts->tv_nsec / 1000LLU;
+}
+
+int main(int argc, char *argv[]) {
+    const char *dev;
+    int r;
+    snd_pcm_hw_params_t *hwparams;
+    snd_pcm_sw_params_t *swparams;
+    snd_pcm_status_t *status;
+    snd_pcm_t *pcm;
+    unsigned rate = 44100;
+    unsigned periods = 0;
+    snd_pcm_uframes_t boundary, buffer_size = 44100/10; /* 100s */
+    int dir = 1;
+    struct timespec start, last_timestamp = { 0, 0 };
+    uint64_t start_us;
+    snd_pcm_sframes_t last_avail, last_delay;
+    struct pollfd *pollfds;
+    int n_pollfd;
+    int64_t sample_count = 0;
+
+    snd_pcm_hw_params_alloca(&hwparams);
+    snd_pcm_sw_params_alloca(&swparams);
+    snd_pcm_status_alloca(&status);
+
+    r = clock_gettime(CLOCK_MONOTONIC, &start);
+    assert(r == 0);
+
+    start_us = timespec_us(&start);
+
+    dev = argc > 1 ? argv[1] : "front:AudioPCI";
+
+    r = snd_pcm_open(&pcm, dev, SND_PCM_STREAM_PLAYBACK, 0);
+    assert(r == 0);
+
+    r = snd_pcm_hw_params_any(pcm, hwparams);
+    assert(r == 0);
+
+    r = snd_pcm_hw_params_set_rate_resample(pcm, hwparams, 0);
+    assert(r == 0);
+
+    r = snd_pcm_hw_params_set_access(pcm, hwparams, SND_PCM_ACCESS_RW_INTERLEAVED);
+    assert(r == 0);
+
+    r = snd_pcm_hw_params_set_format(pcm, hwparams, SND_PCM_FORMAT_S16_LE);
+    assert(r == 0);
+
+    r = snd_pcm_hw_params_set_rate_near(pcm, hwparams, &rate, NULL);
+    assert(r == 0);
+
+    r = snd_pcm_hw_params_set_channels(pcm, hwparams, 2);
+    assert(r == 0);
+
+    r = snd_pcm_hw_params_set_periods_integer(pcm, hwparams);
+    assert(r == 0);
+
+    r = snd_pcm_hw_params_set_periods_near(pcm, hwparams, &periods, &dir);
+    assert(r == 0);
+
+    r = snd_pcm_hw_params_set_buffer_size_near(pcm, hwparams, &buffer_size);
+    assert(r == 0);
+
+    r = snd_pcm_hw_params(pcm, hwparams);
+    assert(r == 0);
+
+    r = snd_pcm_hw_params_current(pcm, hwparams);
+    assert(r == 0);
+
+    r = snd_pcm_sw_params_set_avail_min(pcm, swparams, 1);
+    assert(r == 0);
+
+    r = snd_pcm_sw_params_set_period_event(pcm, swparams, 1);
+    assert(r == 0);
+
+    r = snd_pcm_hw_params_get_buffer_size(hwparams, &buffer_size);
+    assert(r == 0);
+    r = snd_pcm_sw_params_set_start_threshold(pcm, swparams, buffer_size);
+    assert(r == 0);
+
+    r = snd_pcm_sw_params_get_boundary(swparams, &boundary);
+    assert(r == 0);
+    r = snd_pcm_sw_params_set_stop_threshold(pcm, swparams, boundary);
+    assert(r == 0);
+
+    r = snd_pcm_sw_params_set_tstamp_mode(pcm, swparams, SND_PCM_TSTAMP_ENABLE);
+    assert(r == 0);
+
+    r = snd_pcm_sw_params(pcm, swparams);
+    assert(r == 0);
+
+    r = snd_pcm_prepare(pcm);
+    assert(r == 0);
+
+    r = snd_pcm_sw_params_current(pcm, swparams);
+    assert(r == 0);
+
+/*     assert(snd_pcm_hw_params_is_monotonic(hwparams) > 0); */
+
+    n_pollfd = snd_pcm_poll_descriptors_count(pcm);
+    assert(n_pollfd > 0);
+
+    pollfds = malloc(sizeof(struct pollfd) * n_pollfd);
+    assert(pollfds);
+
+    r = snd_pcm_poll_descriptors(pcm, pollfds, n_pollfd);
+    assert(r == n_pollfd);
+
+    for (;;) {
+        snd_pcm_sframes_t avail, delay;
+/*         snd_pcm_uframes_t avail2; */
+        struct timespec now, timestamp;
+        unsigned short revents;
+        int written = 0;
+        uint64_t now_us, timestamp_us;
+        snd_pcm_state_t state;
+
+        r = poll(pollfds, n_pollfd, 0);
+        assert(r >= 0);
+
+        r = snd_pcm_poll_descriptors_revents(pcm, pollfds, n_pollfd, &revents);
+        assert(r == 0);
+
+        assert((revents & ~POLLOUT) == 0);
+
+/*         state = snd_pcm_get_state(pcm); */
+
+        avail = snd_pcm_avail(pcm);
+        assert(avail >= 0);
+
+        r = snd_pcm_status(pcm, status);
+        assert(r == 0);
+
+        printf("%lu %lu\n", (unsigned long) avail, (unsigned long) snd_pcm_status_get_avail(status));
+
+        assert(avail == (snd_pcm_sframes_t) snd_pcm_status_get_avail(status));
+        snd_pcm_status_get_htstamp(status, &timestamp);
+        delay = snd_pcm_status_get_delay(status);
+        state = snd_pcm_status_get_state(status);
+
+/*         r = snd_pcm_avail_delay(pcm, &avail, &delay); */
+/*         assert(r == 0); */
+
+/*         r = snd_pcm_htimestamp(pcm, &avail2, &timestamp); */
+/*         assert(r == 0); */
+
+/*         assert(avail == (snd_pcm_sframes_t) avail2); */
+
+        r = clock_gettime(CLOCK_MONOTONIC, &now);
+        assert(r == 0);
+
+        assert(!revents || avail > 0);
+
+        if (avail) {
+            snd_pcm_sframes_t sframes;
+            static const uint16_t samples[2] = { 0, 0 };
+
+            sframes = snd_pcm_writei(pcm, samples, 1);
+            assert(sframes == 1);
+
+            written = 1;
+            sample_count++;
+        }
+
+        if (!written &&
+            memcmp(&timestamp, &last_timestamp, sizeof(timestamp)) == 0 &&
+            avail == last_avail &&
+            delay == last_delay) {
+            /* This is boring */
+            continue;
+        }
+
+        now_us = timespec_us(&now);
+        timestamp_us = timespec_us(&timestamp);
+
+        printf("%llu\t%llu\t%llu\t%li\t%li\t%i\t%i\t%i\n",
+               (unsigned long long) (now_us - start_us),
+               (unsigned long long) (timestamp_us ? timestamp_us - start_us : 0),
+               (unsigned long long) ((sample_count - 1 - delay) * 1000000LU / 44100),
+               (signed long) avail,
+               (signed long) delay,
+               revents,
+               written,
+               state);
+
+        last_avail = avail;
+        last_delay = delay;
+        last_timestamp = timestamp;
+    }
+
+    return 0;
+}

commit adc9c2db6b4820be4d44faae4b0e523468cd3c14
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Feb 20 03:20:36 2009 +0100

    fix comment

diff --git a/src/pulsecore/asyncmsgq.c b/src/pulsecore/asyncmsgq.c
index 5c7af2a..e191b05 100644
--- a/src/pulsecore/asyncmsgq.c
+++ b/src/pulsecore/asyncmsgq.c
@@ -159,7 +159,7 @@ int pa_asyncmsgq_send(pa_asyncmsgq *a, pa_msgobject *object, int code, const voi
 
     pa_assert_se(i.semaphore);
 
-    /* Thus mutex makes the queue multiple-writer safe. This lock is only used on the writing side */
+    /* This mutex makes the queue multiple-writer safe. This lock is only used on the writing side */
     pa_mutex_lock(a->mutex);
     pa_assert_se(pa_asyncq_push(a->asyncq, &i, TRUE) == 0);
     pa_mutex_unlock(a->mutex);
@@ -196,7 +196,13 @@ int pa_asyncmsgq_get(pa_asyncmsgq *a, pa_msgobject **object, int *code, void **u
     if (chunk)
         *chunk = a->current->memchunk;
 
-/*     pa_log_debug("Get q=%p object=%p (%s) code=%i data=%p chunk.length=%lu", (void*) a, (void*) a->current->object, a->current->object ? a->current->object->parent.type_name : NULL, a->current->code, (void*) a->current->userdata, (unsigned long) a->current->memchunk.length); */
+/*     pa_log_debug("Get q=%p object=%p (%s) code=%i data=%p chunk.length=%lu", */
+/*                  (void*) a, */
+/*                  (void*) a->current->object, */
+/*                  a->current->object ? a->current->object->parent.type_name : NULL, */
+/*                  a->current->code, */
+/*                  (void*) a->current->userdata, */
+/*                  (unsigned long) a->current->memchunk.length); */
 
     return 0;
 }

commit 26a270a934f0f174f7bd7eb89e85301963721deb
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Feb 20 03:21:17 2009 +0100

    big alsa module rework to make things more robust to broken sound drivers and make it easier to debug them

diff --git a/src/modules/alsa/alsa-sink.c b/src/modules/alsa/alsa-sink.c
index 5290268..239a9d7 100644
--- a/src/modules/alsa/alsa-sink.c
+++ b/src/modules/alsa/alsa-sink.c
@@ -56,11 +56,13 @@
 #include "alsa-util.h"
 #include "alsa-sink.h"
 
+/* #define DEBUG_TIMING */
+
 #define DEFAULT_DEVICE "default"
 #define DEFAULT_TSCHED_BUFFER_USEC (2*PA_USEC_PER_SEC)            /* 2s */
 #define DEFAULT_TSCHED_WATERMARK_USEC (20*PA_USEC_PER_MSEC)       /* 20ms */
-#define TSCHED_MIN_SLEEP_USEC (3*PA_USEC_PER_MSEC)                /* 3ms */
-#define TSCHED_MIN_WAKEUP_USEC (3*PA_USEC_PER_MSEC)               /* 3ms */
+#define TSCHED_MIN_SLEEP_USEC (10*PA_USEC_PER_MSEC)               /* 10ms */
+#define TSCHED_MIN_WAKEUP_USEC (4*PA_USEC_PER_MSEC)               /* 4ms */
 
 struct userdata {
     pa_core *core;
@@ -78,17 +80,17 @@ struct userdata {
     snd_mixer_elem_t *mixer_elem;
     long hw_volume_max, hw_volume_min;
     long hw_dB_max, hw_dB_min;
-    pa_bool_t hw_dB_supported;
-    pa_bool_t mixer_seperate_channels;
+    pa_bool_t hw_dB_supported:1;
+    pa_bool_t mixer_seperate_channels:1;
     pa_cvolume hardware_volume;
 
-    size_t frame_size, fragment_size, hwbuf_size, tsched_watermark;
+    size_t frame_size, fragment_size, hwbuf_size, tsched_watermark, hwbuf_unused, min_sleep, min_wakeup;
     unsigned nfragments;
     pa_memchunk memchunk;
 
     char *device_name;
 
-    pa_bool_t use_mmap, use_tsched;
+    pa_bool_t use_mmap:1, use_tsched:1;
 
     pa_bool_t first, after_rewind;
 
@@ -97,39 +99,70 @@ struct userdata {
     snd_mixer_selem_channel_id_t mixer_map[SND_MIXER_SCHN_LAST];
 
     pa_smoother *smoother;
-    int64_t frame_index;
+    uint64_t write_count;
     uint64_t since_start;
-
-    snd_pcm_sframes_t hwbuf_unused_frames;
 };
 
 static void userdata_free(struct userdata *u);
 
+static void fix_min_sleep_wakeup(struct userdata *u) {
+    size_t max_use, max_use_2;
+
+    pa_assert(u);
+
+    max_use = u->hwbuf_size - u->hwbuf_unused;
+    max_use_2 = pa_frame_align(max_use/2, &u->sink->sample_spec);
+
+    u->min_sleep = pa_usec_to_bytes(TSCHED_MIN_SLEEP_USEC, &u->sink->sample_spec);
+    u->min_sleep = PA_CLAMP(u->min_sleep, u->frame_size, max_use_2);
+
+    u->min_wakeup = pa_usec_to_bytes(TSCHED_MIN_WAKEUP_USEC, &u->sink->sample_spec);
+    u->min_wakeup = PA_CLAMP(u->min_wakeup, u->frame_size, max_use_2);
+}
+
 static void fix_tsched_watermark(struct userdata *u) {
     size_t max_use;
-    size_t min_sleep, min_wakeup;
     pa_assert(u);
 
-    max_use = u->hwbuf_size - (size_t) u->hwbuf_unused_frames * u->frame_size;
+    max_use = u->hwbuf_size - u->hwbuf_unused;
 
-    min_sleep = pa_usec_to_bytes(TSCHED_MIN_SLEEP_USEC, &u->sink->sample_spec);
-    min_wakeup = pa_usec_to_bytes(TSCHED_MIN_WAKEUP_USEC, &u->sink->sample_spec);
+    if (u->tsched_watermark > max_use - u->min_sleep)
+        u->tsched_watermark = max_use - u->min_sleep;
 
-    if (min_sleep > max_use/2)
-        min_sleep = pa_frame_align(max_use/2, &u->sink->sample_spec);
-    if (min_sleep < u->frame_size)
-        min_sleep = u->frame_size;
+    if (u->tsched_watermark < u->min_wakeup)
+        u->tsched_watermark = u->min_wakeup;
+}
+
+static void adjust_after_underrun(struct userdata *u) {
+    size_t old_watermark;
+    pa_usec_t old_min_latency, new_min_latency;
 
-    if (min_wakeup > max_use/2)
-        min_wakeup = pa_frame_align(max_use/2, &u->sink->sample_spec);
-    if (min_wakeup < u->frame_size)
-        min_wakeup = u->frame_size;
+    pa_assert(u);
 
-    if (u->tsched_watermark > max_use-min_sleep)
-        u->tsched_watermark = max_use-min_sleep;
+    /* First, just try to increase the watermark */
+    old_watermark = u->tsched_watermark;
+    u->tsched_watermark *= 2;
+    fix_tsched_watermark(u);
 
-    if (u->tsched_watermark < min_wakeup)
-        u->tsched_watermark = min_wakeup;
+    if (old_watermark != u->tsched_watermark) {
+        pa_log_notice("Increasing wakeup watermark to %0.2f ms",
+                      (double) pa_bytes_to_usec(u->tsched_watermark, &u->sink->sample_spec) / PA_USEC_PER_MSEC);
+        return;
+    }
+
+    /* Hmm, we cannot increase the watermark any further, hence let's raise the latency */
+    old_min_latency = u->sink->thread_info.min_latency;
+    new_min_latency = PA_MIN(old_min_latency * 2, u->sink->thread_info.max_latency);
+
+    if (old_min_latency != new_min_latency) {
+        pa_log_notice("Increasing minimal latency to %0.2f ms",
+                      (double) new_min_latency / PA_USEC_PER_MSEC);
+
+        pa_sink_update_latency_range(u->sink, new_min_latency, u->sink->thread_info.max_latency);
+        return;
+    }
+
+    /* When we reach this we're officialy fucked! */
 }
 
 static void hw_sleep_time(struct userdata *u, pa_usec_t *sleep_usec, pa_usec_t*process_usec) {
@@ -145,17 +178,20 @@ static void hw_sleep_time(struct userdata *u, pa_usec_t *sleep_usec, pa_usec_t*p
     if (usec == (pa_usec_t) -1)
         usec = pa_bytes_to_usec(u->hwbuf_size, &u->sink->sample_spec);
 
-/*     pa_log_debug("hw buffer time: %u ms", (unsigned) (usec / PA_USEC_PER_MSEC)); */
-
     wm = pa_bytes_to_usec(u->tsched_watermark, &u->sink->sample_spec);
 
-    if (usec >= wm) {
-        *sleep_usec = usec - wm;
-        *process_usec = wm;
-    } else
-        *process_usec = *sleep_usec = usec / 2;
+    if (wm > usec)
+        wm = usec/2;
+
+    *sleep_usec = usec - wm;
+    *process_usec = wm;
 
-/*     pa_log_debug("after watermark: %u ms", (unsigned) (*sleep_usec / PA_USEC_PER_MSEC)); */
+#ifdef DEBUG_TIMING
+    pa_log_debug("Buffer time: %lu ms; Sleep time: %lu ms; Process time: %lu ms",
+                 (unsigned long) (usec / PA_USEC_PER_MSEC),
+                 (unsigned long) (*sleep_usec / PA_USEC_PER_MSEC),
+                 (unsigned long) (*process_usec / PA_USEC_PER_MSEC));
+#endif
 }
 
 static int try_recover(struct userdata *u, const char *call, int err) {
@@ -170,40 +206,45 @@ static int try_recover(struct userdata *u, const char *call, int err) {
     if (err == -EPIPE)
         pa_log_debug("%s: Buffer underrun!", call);
 
-    if ((err = snd_pcm_recover(u->pcm_handle, err, 1)) == 0) {
-        u->first = TRUE;
-        u->since_start = 0;
-        return 0;
+    if ((err = snd_pcm_recover(u->pcm_handle, err, 1)) < 0) {
+        pa_log("%s: %s", call, snd_strerror(err));
+        return -1;
     }
 
-    pa_log("%s: %s", call, snd_strerror(err));
-    return -1;
+    u->first = TRUE;
+    u->since_start = 0;
+    return 0;
 }
 
-static size_t check_left_to_play(struct userdata *u, snd_pcm_sframes_t n) {
+static size_t check_left_to_play(struct userdata *u, size_t n_bytes) {
     size_t left_to_play;
 
-    if ((size_t) n*u->frame_size < u->hwbuf_size)
-        left_to_play = u->hwbuf_size - ((size_t) n*u->frame_size);
-    else
-        left_to_play = 0;
+    /* We use <= instead of < for this check here because an underrun
+     * only happens after the last sample was processed, not already when
+     * it is removed from the buffer. This is particularly important
+     * when block transfer is used. */
 
-    if (left_to_play > 0) {
-/*         pa_log_debug("%0.2f ms left to play", (double) pa_bytes_to_usec(left_to_play, &u->sink->sample_spec) / PA_USEC_PER_MSEC); */
-    } else if (!u->first && !u->after_rewind) {
+    if (n_bytes <= u->hwbuf_size) {
+        left_to_play = u->hwbuf_size - n_bytes;
 
-        if (pa_log_ratelimit())
-            pa_log_info("Underrun!");
+#ifdef DEBUG_TIMING
+        pa_log_debug("%0.2f ms left to play", (double) pa_bytes_to_usec(left_to_play, &u->sink->sample_spec) / PA_USEC_PER_MSEC);
+#endif
 
-        if (u->use_tsched) {
-            size_t old_watermark = u->tsched_watermark;
+    } else {
+        left_to_play = 0;
 
-            u->tsched_watermark *= 2;
-            fix_tsched_watermark(u);
+#ifdef DEBUG_TIMING
+        PA_DEBUG_TRAP;
+#endif
+
+        if (!u->first && !u->after_rewind) {
+
+            if (pa_log_ratelimit())
+                pa_log_info("Underrun!");
 
-            if (old_watermark != u->tsched_watermark)
-                pa_log_notice("Increasing wakeup watermark to %0.2f ms",
-                              (double) pa_bytes_to_usec(u->tsched_watermark, &u->sink->sample_spec) / PA_USEC_PER_MSEC);
+            if (u->use_tsched)
+                adjust_after_underrun(u);
         }
     }
 
@@ -211,7 +252,7 @@ static size_t check_left_to_play(struct userdata *u, snd_pcm_sframes_t n) {
 }
 
 static int mmap_write(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polled) {
-    int work_done = 0;
+    pa_bool_t work_done = TRUE;
     pa_usec_t max_sleep_usec = 0, process_usec = 0;
     size_t left_to_play;
 
@@ -223,22 +264,27 @@ static int mmap_write(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polle
 
     for (;;) {
         snd_pcm_sframes_t n;
+        size_t n_bytes;
         int r;
 
-        snd_pcm_hwsync(u->pcm_handle);
-
         /* First we determine how many samples are missing to fill the
          * buffer up to 100% */
 
-        if (PA_UNLIKELY((n = pa_alsa_safe_avail_update(u->pcm_handle, u->hwbuf_size, &u->sink->sample_spec)) < 0)) {
+        if (PA_UNLIKELY((n = pa_alsa_safe_avail(u->pcm_handle, u->hwbuf_size, &u->sink->sample_spec)) < 0)) {
 
-            if ((r = try_recover(u, "snd_pcm_avail_update", (int) n)) == 0)
+            if ((r = try_recover(u, "snd_pcm_avail", (int) n)) == 0)
                 continue;
 
             return r;
         }
 
-        left_to_play = check_left_to_play(u, n);
+        n_bytes = (size_t) n * u->frame_size;
+
+#ifdef DEBUG_TIMING
+        pa_log_debug("avail: %lu", (unsigned long) n_bytes);
+#endif
+
+        left_to_play = check_left_to_play(u, n_bytes);
 
         if (u->use_tsched)
 
@@ -249,33 +295,42 @@ static int mmap_write(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polle
             * a single hw buffer length. */
 
             if (!polled &&
-                pa_bytes_to_usec(left_to_play, &u->sink->sample_spec) > process_usec+max_sleep_usec/2)
+                pa_bytes_to_usec(left_to_play, &u->sink->sample_spec) > process_usec+max_sleep_usec/2) {
+#ifdef DEBUG_TIMING
+                pa_log_debug("Not filling up, because too early.");
+#endif
                 break;
+            }
 
-        if (PA_UNLIKELY(n <= u->hwbuf_unused_frames)) {
+        if (PA_UNLIKELY(n_bytes <= u->hwbuf_unused)) {
 
             if (polled && pa_log_ratelimit())
                 pa_log(_("ALSA woke us up to write new data to the device, but there was actually nothing to write! "
                          "Most likely this is an ALSA driver bug. Please report this issue to the ALSA developers. "
                          "We were woken up with POLLOUT set -- however a subsequent snd_pcm_avail_update() returned 0."));
 
+#ifdef DEBUG_TIMING
+            pa_log_debug("Not filling up, because not necessary.");
+#endif
             break;
         }
 
-        n -= u->hwbuf_unused_frames;
-
+        n_bytes -= u->hwbuf_unused;
         polled = FALSE;
 
-/*         pa_log_debug("Filling up"); */
+#ifdef DEBUG_TIMING
+        pa_log_debug("Filling up");
+#endif
 
         for (;;) {
             pa_memchunk chunk;
             void *p;
             int err;
             const snd_pcm_channel_area_t *areas;
-            snd_pcm_uframes_t offset, frames = (snd_pcm_uframes_t) n;
+            snd_pcm_uframes_t offset, frames;
             snd_pcm_sframes_t sframes;
 
+            frames = (snd_pcm_uframes_t) (n_bytes / u->frame_size);
 /*             pa_log_debug("%lu frames to write", (unsigned long) frames); */
 
             if (PA_UNLIKELY((err = pa_alsa_safe_mmap_begin(u->pcm_handle, &areas, &offset, &frames, u->hwbuf_size, &u->sink->sample_spec)) < 0)) {
@@ -305,9 +360,6 @@ static int mmap_write(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polle
             chunk.index = 0;
 
             pa_sink_render_into_full(u->sink, &chunk);
-
-            /* FIXME: Maybe we can do something to keep this memory block
-             * a little bit longer around? */
             pa_memblock_unref_fixed(chunk.memblock);
 
             if (PA_UNLIKELY((sframes = snd_pcm_mmap_commit(u->pcm_handle, offset, frames)) < 0)) {
@@ -318,26 +370,28 @@ static int mmap_write(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polle
                 return r;
             }
 
-            work_done = 1;
+            work_done = TRUE;
 
-            u->frame_index += (int64_t) frames;
+            u->write_count += frames * u->frame_size;
             u->since_start += frames * u->frame_size;
 
-/*             pa_log_debug("wrote %lu frames", (unsigned long) frames); */
+#ifdef DEBUG_TIMING
+            pa_log_debug("Wrote %lu bytes", (unsigned long) (frames * u->frame_size));
+#endif
 
-            if (frames >= (snd_pcm_uframes_t) n)
+            if ((size_t) frames * u->frame_size >= n_bytes)
                 break;
 
-            n -= (snd_pcm_sframes_t) frames;
+            n_bytes -= (size_t) frames * u->frame_size;
         }
     }
 
     *sleep_usec = pa_bytes_to_usec(left_to_play, &u->sink->sample_spec) - process_usec;
-    return work_done;
+    return work_done ? 1 : 0;
 }
 
 static int unix_write(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polled) {
-    int work_done = 0;
+    pa_bool_t work_done = FALSE;
     pa_usec_t max_sleep_usec = 0, process_usec = 0;
     size_t left_to_play;
 
@@ -349,19 +403,19 @@ static int unix_write(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polle
 
     for (;;) {
         snd_pcm_sframes_t n;
+        size_t n_bytes;
         int r;
 
-        snd_pcm_hwsync(u->pcm_handle);
+        if (PA_UNLIKELY((n = pa_alsa_safe_avail(u->pcm_handle, u->hwbuf_size, &u->sink->sample_spec)) < 0)) {
 
-        if (PA_UNLIKELY((n = pa_alsa_safe_avail_update(u->pcm_handle, u->hwbuf_size, &u->sink->sample_spec)) < 0)) {
-
-            if ((r = try_recover(u, "snd_pcm_avail_update", (int) n)) == 0)
+            if ((r = try_recover(u, "snd_pcm_avail", (int) n)) == 0)
                 continue;
 
             return r;
         }
 
-        left_to_play = check_left_to_play(u, n);
+        n_bytes = (size_t) n * u->frame_size;
+        left_to_play = check_left_to_play(u, n_bytes);
 
         if (u->use_tsched)
 
@@ -375,7 +429,7 @@ static int unix_write(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polle
                 pa_bytes_to_usec(left_to_play, &u->sink->sample_spec) > process_usec+max_sleep_usec/2)
                 break;
 
-        if (PA_UNLIKELY(n <= u->hwbuf_unused_frames)) {
+        if (PA_UNLIKELY(n_bytes <= u->hwbuf_unused)) {
 
             if (polled && pa_log_ratelimit())
                 pa_log(_("ALSA woke us up to write new data to the device, but there was actually nothing to write! "
@@ -385,8 +439,7 @@ static int unix_write(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polle
             break;
         }
 
-        n -= u->hwbuf_unused_frames;
-
+        n_bytes -= u->hwbuf_unused;
         polled = FALSE;
 
         for (;;) {
@@ -396,14 +449,14 @@ static int unix_write(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polle
 /*         pa_log_debug("%lu frames to write", (unsigned long) frames); */
 
             if (u->memchunk.length <= 0)
-                pa_sink_render(u->sink, (size_t) n * u->frame_size, &u->memchunk);
+                pa_sink_render(u->sink, n_bytes, &u->memchunk);
 
             pa_assert(u->memchunk.length > 0);
 
             frames = (snd_pcm_sframes_t) (u->memchunk.length / u->frame_size);
 
-            if (frames > n)
-                frames = n;
+            if (frames > (snd_pcm_sframes_t) (n_bytes/u->frame_size))
+                frames = (snd_pcm_sframes_t) (n_bytes/u->frame_size);
 
             p = pa_memblock_acquire(u->memchunk.memblock);
             frames = snd_pcm_writei(u->pcm_handle, (const uint8_t*) p + u->memchunk.index, (snd_pcm_uframes_t) frames);
@@ -427,30 +480,29 @@ static int unix_write(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polle
                 pa_memchunk_reset(&u->memchunk);
             }
 
-            work_done = 1;
+            work_done = TRUE;
 
-            u->frame_index += frames;
-            u->since_start += (size_t) frames * u->frame_size;
+            u->write_count += frames * u->frame_size;
+            u->since_start += frames * u->frame_size;
 
 /*         pa_log_debug("wrote %lu frames", (unsigned long) frames); */
 
-            if (frames >= n)
+            if ((size_t) frames * u->frame_size >= n_bytes)
                 break;
 
-            n -= frames;
+            n_bytes -= (size_t) frames * u->frame_size;
         }
     }
 
     *sleep_usec = pa_bytes_to_usec(left_to_play, &u->sink->sample_spec) - process_usec;
-    return work_done;
+    return work_done ? 1 : 0;
 }
 
 static void update_smoother(struct userdata *u) {
-    snd_pcm_sframes_t delay  = 0;
-    int64_t frames;
+    snd_pcm_sframes_t delay = 0;
+    int64_t position;
     int err;
-    pa_usec_t now1, now2;
-/*     struct timeval timestamp; */
+    pa_usec_t now1 = 0, now2;
     snd_pcm_status_t *status;
 
     snd_pcm_status_alloca(&status);
@@ -460,36 +512,35 @@ static void update_smoother(struct userdata *u) {
 
     /* Let's update the time smoother */
 
-    snd_pcm_hwsync(u->pcm_handle);
-    snd_pcm_avail_update(u->pcm_handle);
-
-/*     if (PA_UNLIKELY((err = snd_pcm_status(u->pcm_handle, status)) < 0)) { */
-/*         pa_log("Failed to query DSP status data: %s", snd_strerror(err)); */
-/*         return; */
-/*     } */
-
-/*     delay = snd_pcm_status_get_delay(status); */
-
     if (PA_UNLIKELY((err = snd_pcm_delay(u->pcm_handle, &delay)) < 0)) {
-        pa_log("Failed to query DSP status data: %s", snd_strerror(err));
+        pa_log_warn("Failed to query DSP status data: %s", snd_strerror(err));
         return;
     }
 
-    frames = u->frame_index - delay;
+    if (PA_UNLIKELY((err = snd_pcm_status(u->pcm_handle, status)) < 0))
+        pa_log_warn("Failed to get timestamp: %s", snd_strerror(err));
+    else {
+        snd_htimestamp_t htstamp = { 0, 0 };
+        snd_pcm_status_get_htstamp(status, &htstamp);
+        now1 = pa_timespec_load(&htstamp);
+    }
 
-/*     pa_log_debug("frame_index = %llu, delay = %llu, p = %llu", (unsigned long long) u->frame_index, (unsigned long long) delay, (unsigned long long) frames); */
+    position = (int64_t) u->write_count - ((int64_t) delay * (int64_t) u->frame_size);
 
-/*     snd_pcm_status_get_tstamp(status, &timestamp); */
-/*     pa_rtclock_from_wallclock(&timestamp); */
-/*     now1 = pa_timeval_load(&timestamp); */
+    if (PA_UNLIKELY(position < 0))
+        position = 0;
+
+    /* Hmm, if the timestamp is 0, then it wasn't set and we take the current time */
+    if (now1 <= 0)
+        now1 = pa_rtclock_usec();
+
+    now2 = pa_bytes_to_usec((uint64_t) position, &u->sink->sample_spec);
 
-    now1 = pa_rtclock_usec();
-    now2 = pa_bytes_to_usec((uint64_t) frames * u->frame_size, &u->sink->sample_spec);
     pa_smoother_put(u->smoother, now1, now2);
 }
 
 static pa_usec_t sink_get_latency(struct userdata *u) {
-    pa_usec_t r = 0;
+    pa_usec_t r;
     int64_t delay;
     pa_usec_t now1, now2;
 
@@ -498,10 +549,9 @@ static pa_usec_t sink_get_latency(struct userdata *u) {
     now1 = pa_rtclock_usec();
     now2 = pa_smoother_get(u->smoother, now1);
 
-    delay = (int64_t) pa_bytes_to_usec((uint64_t) u->frame_index * u->frame_size, &u->sink->sample_spec) - (int64_t) now2;
+    delay = (int64_t) pa_bytes_to_usec(u->write_count, &u->sink->sample_spec) - (int64_t) now2;
 
-    if (delay > 0)
-        r = (pa_usec_t) delay;
+    r = delay >= 0 ? (pa_usec_t) delay : 0;
 
     if (u->memchunk.memblock)
         r += pa_bytes_to_usec(u->memchunk.length, &u->sink->sample_spec);
@@ -550,7 +600,7 @@ static int update_sw_params(struct userdata *u) {
     pa_assert(u);
 
     /* Use the full buffer if noone asked us for anything specific */
-    u->hwbuf_unused_frames = 0;
+    u->hwbuf_unused = 0;
 
     if (u->use_tsched) {
         pa_usec_t latency;
@@ -558,7 +608,7 @@ static int update_sw_params(struct userdata *u) {
         if ((latency = pa_sink_get_requested_latency_within_thread(u->sink)) != (pa_usec_t) -1) {
             size_t b;
 
-            pa_log_debug("latency set to %0.2fms", (double) latency / PA_USEC_PER_MSEC);
+            pa_log_debug("Latency set to %0.2fms", (double) latency / PA_USEC_PER_MSEC);
 
             b = pa_usec_to_bytes(latency, &u->sink->sample_spec);
 
@@ -567,18 +617,17 @@ static int update_sw_params(struct userdata *u) {
             if (PA_UNLIKELY(b < u->frame_size))
                 b = u->frame_size;
 
-            u->hwbuf_unused_frames = (snd_pcm_sframes_t)
-                (PA_LIKELY(b < u->hwbuf_size) ?
-                 ((u->hwbuf_size - b) / u->frame_size) : 0);
+            u->hwbuf_unused = PA_LIKELY(b < u->hwbuf_size) ? (u->hwbuf_size - b) : 0;
         }
 
+        fix_min_sleep_wakeup(u);
         fix_tsched_watermark(u);
     }
 
-    pa_log_debug("hwbuf_unused_frames=%lu", (unsigned long) u->hwbuf_unused_frames);
+    pa_log_debug("hwbuf_unused=%lu", (unsigned long) u->hwbuf_unused);
 
     /* We need at last one frame in the used part of the buffer */
-    avail_min = (snd_pcm_uframes_t) u->hwbuf_unused_frames + 1;
+    avail_min = (snd_pcm_uframes_t) u->hwbuf_unused / u->frame_size + 1;
 
     if (u->use_tsched) {
         pa_usec_t sleep_usec, process_usec;
@@ -594,7 +643,7 @@ static int update_sw_params(struct userdata *u) {
         return err;
     }
 
-    pa_sink_set_max_request(u->sink, u->hwbuf_size - (size_t) u->hwbuf_unused_frames * u->frame_size);
+    pa_sink_set_max_request(u->sink, u->hwbuf_size - u->hwbuf_unused);
 
     return 0;
 }
@@ -655,8 +704,6 @@ static int unsuspend(struct userdata *u) {
     if (build_pollfd(u) < 0)
         goto fail;
 
-    /* FIXME: We need to reload the volume somehow */
-
     u->first = TRUE;
     u->since_start = 0;
 
@@ -981,13 +1028,13 @@ static void sink_set_mute_cb(pa_sink *s) {
 
 static void sink_update_requested_latency_cb(pa_sink *s) {
     struct userdata *u = s->userdata;
-    snd_pcm_sframes_t before;
+    size_t before;
     pa_assert(u);
 
     if (!u->pcm_handle)
         return;
 
-    before = u->hwbuf_unused_frames;
+    before = u->hwbuf_unused;
     update_sw_params(u);
 
     /* Let's check whether we now use only a smaller part of the
@@ -996,7 +1043,7 @@ static void sink_update_requested_latency_cb(pa_sink *s) {
     current fill level. Thus, let's do a full rewind once, to clear
     things up. */
 
-    if (u->hwbuf_unused_frames > before) {
+    if (u->hwbuf_unused > before) {
         pa_log_debug("Requesting rewind due to latency change.");
         pa_sink_request_rewind(s, (size_t) -1);
     }
@@ -1051,7 +1098,7 @@ static int process_rewind(struct userdata *u) {
         if (rewind_nbytes <= 0)
             pa_log_info("Tried rewind, but was apparently not possible.");
         else {
-            u->frame_index -= out_frames;
+            u->write_count -= out_frames * u->frame_size;
             pa_log_debug("Rewound %lu bytes.", (unsigned long) rewind_nbytes);
             pa_sink_process_rewind(u->sink, rewind_nbytes);
 
@@ -1086,7 +1133,9 @@ static void thread_func(void *userdata) {
     for (;;) {
         int ret;
 
-/*         pa_log_debug("loop"); */
+#ifdef DEBUG_TIMING
+        pa_log_debug("Loop");
+#endif
 
         /* Render some data and write it to the dsp */
         if (PA_SINK_IS_OPENED(u->sink->thread_info.state)) {
@@ -1132,7 +1181,7 @@ static void thread_func(void *userdata) {
                      * we have filled the buffer at least once
                      * completely.*/
 
-                    /*pa_log_debug("Cutting sleep time for the initial iterations by half.");*/
+                    pa_log_debug("Cutting sleep time for the initial iterations by half.");
                     sleep_usec /= 2;
                 }
 
@@ -1178,16 +1227,15 @@ static void thread_func(void *userdata) {
                 goto fail;
             }
 
-            if (revents & (POLLIN|POLLERR|POLLNVAL|POLLHUP|POLLPRI)) {
+            if (revents & ~POLLOUT) {
                 if (pa_alsa_recover_from_poll(u->pcm_handle, revents) < 0)
                     goto fail;
 
                 u->first = TRUE;
                 u->since_start = 0;
-            }
+            } else if (revents && u->use_tsched && pa_log_ratelimit())
+                pa_log_debug("Wakeup from ALSA!");
 
-            if (revents && u->use_tsched && pa_log_ratelimit())
-                pa_log_debug("Wakeup from ALSA!%s%s", (revents & POLLIN) ? " INPUT" : "", (revents & POLLOUT) ? " OUTPUT" : "");
         } else
             revents = 0;
     }
@@ -1382,11 +1430,8 @@ pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_ca
     u->use_mmap = use_mmap;
     u->use_tsched = use_tsched;
     u->first = TRUE;
-    u->since_start = 0;
-    u->after_rewind = FALSE;
     u->rtpoll = pa_rtpoll_new();
     pa_thread_mq_init(&u->thread_mq, m->core->mainloop, u->rtpoll);
-    u->alsa_rtpoll_item = NULL;
 
     u->smoother = pa_smoother_new(DEFAULT_TSCHED_BUFFER_USEC*2, DEFAULT_TSCHED_BUFFER_USEC*2, TRUE, 5);
     usec = pa_rtclock_usec();
@@ -1503,17 +1548,13 @@ pa_sink *pa_alsa_sink_new(pa_module *m, pa_modargs *ma, const char*driver, pa_ca
     u->fragment_size = frag_size = (uint32_t) (period_frames * frame_size);
     u->nfragments = nfrags;
     u->hwbuf_size = u->fragment_size * nfrags;
-    u->hwbuf_unused_frames = 0;
     u->tsched_watermark = tsched_watermark;
-    u->frame_index = 0;
-    u->hw_dB_supported = FALSE;
-    u->hw_dB_min = u->hw_dB_max = 0;
-    u->hw_volume_min = u->hw_volume_max = 0;
-    u->mixer_seperate_channels = FALSE;
     pa_cvolume_mute(&u->hardware_volume, u->sink->sample_spec.channels);
 
-    if (use_tsched)
+    if (use_tsched) {
+        fix_min_sleep_wakeup(u);
         fix_tsched_watermark(u);
+    }
 
     u->sink->thread_info.max_rewind = use_tsched ? u->hwbuf_size : 0;
     u->sink->thread_info.max_request = u->hwbuf_size;
diff --git a/src/modules/alsa/alsa-source.c b/src/modules/alsa/alsa-source.c
index a5de388..50cdb31 100644
--- a/src/modules/alsa/alsa-source.c
+++ b/src/modules/alsa/alsa-source.c
@@ -57,11 +57,13 @@
 #include "alsa-util.h"
 #include "alsa-source.h"
 
+/* #define DEBUG_TIMING */
+
 #define DEFAULT_DEVICE "default"
 #define DEFAULT_TSCHED_BUFFER_USEC (2*PA_USEC_PER_SEC)       /* 2s */
 #define DEFAULT_TSCHED_WATERMARK_USEC (20*PA_USEC_PER_MSEC)  /* 20ms */
-#define TSCHED_MIN_SLEEP_USEC (3*PA_USEC_PER_MSEC)           /* 3ms */
-#define TSCHED_MIN_WAKEUP_USEC (3*PA_USEC_PER_MSEC)          /* 3ms */
+#define TSCHED_MIN_SLEEP_USEC (10*PA_USEC_PER_MSEC)          /* 10ms */
+#define TSCHED_MIN_WAKEUP_USEC (4*PA_USEC_PER_MSEC)          /* 4ms */
 
 struct userdata {
     pa_core *core;
@@ -79,55 +81,85 @@ struct userdata {
     snd_mixer_elem_t *mixer_elem;
     long hw_volume_max, hw_volume_min;
     long hw_dB_max, hw_dB_min;
-    pa_bool_t hw_dB_supported;
-    pa_bool_t mixer_seperate_channels;
+    pa_bool_t hw_dB_supported:1;
+    pa_bool_t mixer_seperate_channels:1;
 
     pa_cvolume hardware_volume;
 
-    size_t frame_size, fragment_size, hwbuf_size, tsched_watermark;
+    size_t frame_size, fragment_size, hwbuf_size, tsched_watermark, hwbuf_unused, min_sleep, min_wakeup;
     unsigned nfragments;
 
     char *device_name;
 
-    pa_bool_t use_mmap, use_tsched;
+    pa_bool_t use_mmap:1, use_tsched:1;
 
     pa_rtpoll_item *alsa_rtpoll_item;
 
     snd_mixer_selem_channel_id_t mixer_map[SND_MIXER_SCHN_LAST];
 
     pa_smoother *smoother;
-    int64_t frame_index;
-
-    snd_pcm_sframes_t hwbuf_unused_frames;
+    uint64_t read_count;
 };
 
 static void userdata_free(struct userdata *u);
 
+static void fix_min_sleep_wakeup(struct userdata *u) {
+    size_t max_use, max_use_2;
+    pa_assert(u);
+
+    max_use = u->hwbuf_size - u->hwbuf_unused;
+    max_use_2 = pa_frame_align(max_use/2, &u->source->sample_spec);
+
+    u->min_sleep = pa_usec_to_bytes(TSCHED_MIN_SLEEP_USEC, &u->source->sample_spec);
+    u->min_sleep = PA_CLAMP(u->min_sleep, u->frame_size, max_use_2);
+
+    u->min_wakeup = pa_usec_to_bytes(TSCHED_MIN_WAKEUP_USEC, &u->source->sample_spec);
+    u->min_wakeup = PA_CLAMP(u->min_wakeup, u->frame_size, max_use_2);
+}
+
 static void fix_tsched_watermark(struct userdata *u) {
     size_t max_use;
-    size_t min_sleep, min_wakeup;
     pa_assert(u);
 
-    max_use = u->hwbuf_size - (size_t) u->hwbuf_unused_frames * u->frame_size;
+    max_use = u->hwbuf_size - u->hwbuf_unused;
+
+    if (u->tsched_watermark > max_use - u->min_sleep)
+        u->tsched_watermark = max_use - u->min_sleep;
 
-    min_sleep = pa_usec_to_bytes(TSCHED_MIN_SLEEP_USEC, &u->source->sample_spec);
-    min_wakeup = pa_usec_to_bytes(TSCHED_MIN_WAKEUP_USEC, &u->source->sample_spec);
+    if (u->tsched_watermark < u->min_wakeup)
+        u->tsched_watermark = u->min_wakeup;
+}
+
+static void adjust_after_overrun(struct userdata *u) {
+    size_t old_watermark;
+    pa_usec_t old_min_latency, new_min_latency;
+
+    pa_assert(u);
+
+    /* First, just try to increase the watermark */
+    old_watermark = u->tsched_watermark;
+    u->tsched_watermark *= 2;
+    fix_tsched_watermark(u);
+
+    if (old_watermark != u->tsched_watermark) {
+        pa_log_notice("Increasing wakeup watermark to %0.2f ms",
+                      (double) pa_bytes_to_usec(u->tsched_watermark, &u->source->sample_spec) / PA_USEC_PER_MSEC);
+        return;
+    }
 
-    if (min_sleep > max_use/2)
-        min_sleep = pa_frame_align(max_use/2, &u->source->sample_spec);
-    if (min_sleep < u->frame_size)
-        min_sleep = u->frame_size;
+    /* Hmm, we cannot increase the watermark any further, hence let's raise the latency */
+    old_min_latency = u->source->thread_info.min_latency;
+    new_min_latency = PA_MIN(old_min_latency * 2, u->source->thread_info.max_latency);
 
-    if (min_wakeup > max_use/2)
-        min_wakeup = pa_frame_align(max_use/2, &u->source->sample_spec);
-    if (min_wakeup < u->frame_size)
-        min_wakeup = u->frame_size;
+    if (old_min_latency != new_min_latency) {
+        pa_log_notice("Increasing minimal latency to %0.2f ms",
+                      (double) new_min_latency / PA_USEC_PER_MSEC);
 
-    if (u->tsched_watermark > max_use-min_sleep)
-        u->tsched_watermark = max_use-min_sleep;
+        pa_source_update_latency_range(u->source, new_min_latency, u->source->thread_info.max_latency);
+        return;
+    }
 
-    if (u->tsched_watermark < min_wakeup)
-        u->tsched_watermark = min_wakeup;
+    /* When we reach this we're officialy fucked! */
 }
 
 static pa_usec_t hw_sleep_time(struct userdata *u, pa_usec_t *sleep_usec, pa_usec_t*process_usec) {
@@ -140,17 +172,20 @@ static pa_usec_t hw_sleep_time(struct userdata *u, pa_usec_t *sleep_usec, pa_use
     if (usec == (pa_usec_t) -1)
         usec = pa_bytes_to_usec(u->hwbuf_size, &u->source->sample_spec);
 
-/*     pa_log_debug("hw buffer time: %u ms", (unsigned) (usec / PA_USEC_PER_MSEC)); */
-
     wm = pa_bytes_to_usec(u->tsched_watermark, &u->source->sample_spec);
 
-    if (usec >= wm) {
-        *sleep_usec = usec - wm;
-        *process_usec = wm;
-    } else
-        *process_usec = *sleep_usec = usec /= 2;
+    if (wm > usec)
+        wm = usec/2;
 
-/*     pa_log_debug("after watermark: %u ms", (unsigned) (*sleep_usec / PA_USEC_PER_MSEC)); */
+    *sleep_usec = usec - wm;
+    *process_usec = wm;
+
+#ifdef DEBUG_TIMING
+    pa_log_debug("Buffer time: %lu ms; Sleep time: %lu ms; Process time: %lu ms",
+                 (unsigned long) (usec / PA_USEC_PER_MSEC),
+                 (unsigned long) (*sleep_usec / PA_USEC_PER_MSEC),
+                 (unsigned long) (*process_usec / PA_USEC_PER_MSEC));
+#endif
 
     return usec;
 }
@@ -167,47 +202,50 @@ static int try_recover(struct userdata *u, const char *call, int err) {
     if (err == -EPIPE)
         pa_log_debug("%s: Buffer overrun!", call);
 
-    if ((err = snd_pcm_recover(u->pcm_handle, err, 1)) == 0) {
-        snd_pcm_start(u->pcm_handle);
-        return 0;
+    if ((err = snd_pcm_recover(u->pcm_handle, err, 1)) < 0) {
+        pa_log("%s: %s", call, snd_strerror(err));
+        return -1;
     }
 
-    pa_log("%s: %s", call, snd_strerror(err));
-    return -1;
+    snd_pcm_start(u->pcm_handle);
+    return 0;
 }
 
-static size_t check_left_to_record(struct userdata *u, snd_pcm_sframes_t n) {
+static size_t check_left_to_record(struct userdata *u, size_t n_bytes) {
     size_t left_to_record;
-    size_t rec_space = u->hwbuf_size - (size_t) u->hwbuf_unused_frames*u->frame_size;
+    size_t rec_space = u->hwbuf_size - u->hwbuf_unused;
 
-    if ((size_t) n*u->frame_size < rec_space)
-        left_to_record = rec_space - ((size_t) n*u->frame_size);
-    else
-        left_to_record = 0;
+    /* We use <= instead of < for this check here because an overrun
+     * only happens after the last sample was processed, not already when
+     * it is removed from the buffer. This is particularly important
+     * when block transfer is used. */
+
+    if (n_bytes <= rec_space) {
+        left_to_record = rec_space - n_bytes;
+
+#ifdef DEBUG_TIMING
+        pa_log_debug("%0.2f ms left to record", (double) pa_bytes_to_usec(left_to_record, &u->source->sample_spec) / PA_USEC_PER_MSEC);
+#endif
 
-    if (left_to_record > 0) {
-/*         pa_log_debug("%0.2f ms left to record", (double) pa_bytes_to_usec(left_to_record, &u->source->sample_spec) / PA_USEC_PER_MSEC); */
     } else {
-        if (pa_log_ratelimit())
-            pa_log_info("Overrun!");
+        left_to_record = 0;
 
-        if (u->use_tsched) {
-            size_t old_watermark = u->tsched_watermark;
+#ifdef DEBUG_TIMING
+        PA_DEBUG_TRAP;
+#endif
 
-            u->tsched_watermark *= 2;
-            fix_tsched_watermark(u);
+        if (pa_log_ratelimit())
+            pa_log_info("Overrun!");
 
-            if (old_watermark != u->tsched_watermark)
-                pa_log_notice("Increasing wakeup watermark to %0.2f ms",
-                              (double) pa_bytes_to_usec(u->tsched_watermark, &u->source->sample_spec) / PA_USEC_PER_MSEC);
-        }
+        if (u->use_tsched)
+            adjust_after_overrun(u);
     }
 
     return left_to_record;
 }
 
 static int mmap_read(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polled) {
-    int work_done = 0;
+    pa_bool_t work_done = FALSE;
     pa_usec_t max_sleep_usec = 0, process_usec = 0;
     size_t left_to_record;
 
@@ -219,45 +257,63 @@ static int mmap_read(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polled
 
     for (;;) {
         snd_pcm_sframes_t n;
+        size_t n_bytes;
         int r;
 
-        snd_pcm_hwsync(u->pcm_handle);
-
-        if (PA_UNLIKELY((n = pa_alsa_safe_avail_update(u->pcm_handle, u->hwbuf_size, &u->source->sample_spec)) < 0)) {
+        if (PA_UNLIKELY((n = pa_alsa_safe_avail(u->pcm_handle, u->hwbuf_size, &u->source->sample_spec)) < 0)) {
 
-            if ((r = try_recover(u, "snd_pcm_avail_update", (int) n)) == 0)
+            if ((r = try_recover(u, "snd_pcm_avail", (int) n)) == 0)
                 continue;
 
             return r;
         }
 
-        left_to_record = check_left_to_record(u, n);
+        n_bytes = (size_t) n * u->frame_size;
+
+#ifdef DEBUG_TIMING
+        pa_log_debug("avail: %lu", (unsigned long) n_bytes);
+#endif
+
+        left_to_record = check_left_to_record(u, n_bytes);
 
         if (u->use_tsched)
             if (!polled &&
-                pa_bytes_to_usec(left_to_record, &u->source->sample_spec) > process_usec+max_sleep_usec/2)
+                pa_bytes_to_usec(left_to_record, &u->source->sample_spec) > process_usec+max_sleep_usec/2) {
+#ifdef DEBUG_TIMING
+                pa_log_debug("Not reading, because too early.");
+#endif
                 break;
+            }
 
-        if (PA_UNLIKELY(n <= 0)) {
+        if (PA_UNLIKELY(n_bytes <= 0)) {
 
             if (polled && pa_log_ratelimit())
                 pa_log(_("ALSA woke us up to read new data from the device, but there was actually nothing to read! "
                          "Most likely this is an ALSA driver bug. Please report this issue to the ALSA developers. "
                          "We were woken up with POLLIN set -- however a subsequent snd_pcm_avail_update() returned 0."));
 
+#ifdef DEBUG_TIMING
+            pa_log_debug("Not reading, because not necessary.");
+#endif
             break;
         }
 
         polled = FALSE;
 
+#ifdef DEBUG_TIMING
+        pa_log_debug("Reading");
+#endif
+
         for (;;) {
             int err;
             const snd_pcm_channel_area_t *areas;
-            snd_pcm_uframes_t offset, frames = (snd_pcm_uframes_t) n;
+            snd_pcm_uframes_t offset, frames;
             pa_memchunk chunk;
             void *p;
             snd_pcm_sframes_t sframes;
 
+            frames = (snd_pcm_uframes_t) (n_bytes / u->frame_size);
+
 /*             pa_log_debug("%lu frames to read", (unsigned long) frames); */
 
             if (PA_UNLIKELY((err = pa_alsa_safe_mmap_begin(u->pcm_handle, &areas, &offset, &frames, u->hwbuf_size, &u->source->sample_spec)) < 0)) {
@@ -297,25 +353,27 @@ static int mmap_read(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polled
                 return r;
             }
 
-            work_done = 1;
+            work_done = TRUE;
 
-            u->frame_index += (int64_t) frames;
+            u->read_count += frames * u->frame_size;
 
-/*             pa_log_debug("read %lu frames", (unsigned long) frames); */
+#ifdef DEBUG_TIMING
+            pa_log_debug("Read %lu bytes", (unsigned long) (frames * u->frame_size));
+#endif
 
-            if (frames >= (snd_pcm_uframes_t) n)
+            if ((size_t) frames * u->frame_size >= n_bytes)
                 break;
 
-            n -= (snd_pcm_sframes_t) frames;
+            n_bytes -= (size_t) frames * u->frame_size;
         }
     }
 
     *sleep_usec = pa_bytes_to_usec(left_to_record, &u->source->sample_spec) - process_usec;
-    return work_done;
+    return work_done ? 1 : 0;
 }
 
 static int unix_read(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polled) {
-    int work_done = 0;
+    int work_done = FALSE;
     pa_usec_t max_sleep_usec = 0, process_usec = 0;
     size_t left_to_record;
 
@@ -327,33 +385,33 @@ static int unix_read(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polled
 
     for (;;) {
         snd_pcm_sframes_t n;
+        size_t n_bytes;
         int r;
 
-        snd_pcm_hwsync(u->pcm_handle);
-
-        if (PA_UNLIKELY((n = pa_alsa_safe_avail_update(u->pcm_handle, u->hwbuf_size, &u->source->sample_spec)) < 0)) {
+        if (PA_UNLIKELY((n = pa_alsa_safe_avail(u->pcm_handle, u->hwbuf_size, &u->source->sample_spec)) < 0)) {
 
-            if ((r = try_recover(u, "snd_pcm_avail_update", (int) n)) == 0)
+            if ((r = try_recover(u, "snd_pcm_avail", (int) n)) == 0)
                 continue;
 
             return r;
         }
 
-        left_to_record = check_left_to_record(u, n);
+        n_bytes = (size_t) n * u->frame_size;
+        left_to_record = check_left_to_record(u, n_bytes);
 
         if (u->use_tsched)
             if (!polled &&
                 pa_bytes_to_usec(left_to_record, &u->source->sample_spec) > process_usec+max_sleep_usec/2)
                 break;
 
-        if (PA_UNLIKELY(n <= 0)) {
+        if (PA_UNLIKELY(n_bytes <= 0)) {
 
             if (polled && pa_log_ratelimit())
                 pa_log(_("ALSA woke us up to read new data from the device, but there was actually nothing to read! "
                          "Most likely this is an ALSA driver bug. Please report this issue to the ALSA developers. "
                          "We were woken up with POLLIN set -- however a subsequent snd_pcm_avail_update() returned 0."));
 
-            return work_done;
+            break;
         }
 
         polled = FALSE;
@@ -367,8 +425,8 @@ static int unix_read(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polled
 
             frames = (snd_pcm_sframes_t) (pa_memblock_get_length(chunk.memblock) / u->frame_size);
 
-            if (frames > n)
-                frames = n;
+            if (frames > (snd_pcm_sframes_t) (n_bytes/u->frame_size))
+                frames = (snd_pcm_sframes_t) (n_bytes/u->frame_size);
 
 /*             pa_log_debug("%lu frames to read", (unsigned long) n); */
 
@@ -393,53 +451,63 @@ static int unix_read(struct userdata *u, pa_usec_t *sleep_usec, pa_bool_t polled
             pa_source_post(u->source, &chunk);
             pa_memblock_unref(chunk.memblock);
 
-            work_done = 1;
+            work_done = TRUE;
 
-            u->frame_index += frames;
+            u->read_count += frames * u->frame_size;
 
 /*             pa_log_debug("read %lu frames", (unsigned long) frames); */
 
-            if (frames >= n)
+            if ((size_t) frames * u->frame_size >= n_bytes)
                 break;
 
-            n -= frames;
+            n_bytes -= (size_t) frames * u->frame_size;
         }
     }
 
     *sleep_usec = pa_bytes_to_usec(left_to_record, &u->source->sample_spec) - process_usec;
-    return work_done;
+    return work_done ? 1 : 0;
 }
 
 static void update_smoother(struct userdata *u) {
     snd_pcm_sframes_t delay = 0;
-    int64_t frames;
+    uint64_t position;
     int err;
-    pa_usec_t now1, now2;
+    pa_usec_t now1 = 0, now2;
+    snd_pcm_status_t *status;
+
+    snd_pcm_status_alloca(&status);
 
     pa_assert(u);
     pa_assert(u->pcm_handle);
 
     /* Let's update the time smoother */
 
-    snd_pcm_hwsync(u->pcm_handle);
-    snd_pcm_avail_update(u->pcm_handle);
-
     if (PA_UNLIKELY((err = snd_pcm_delay(u->pcm_handle, &delay)) < 0)) {
         pa_log_warn("Failed to get delay: %s", snd_strerror(err));
         return;
     }
 
-    frames = u->frame_index + delay;
+    if (PA_UNLIKELY((err = snd_pcm_status(u->pcm_handle, status)) < 0))
+        pa_log_warn("Failed to get timestamp: %s", snd_strerror(err));
+    else {
+        snd_htimestamp_t htstamp = { 0, 0 };
+        snd_pcm_status_get_htstamp(status, &htstamp);
+        now1 = pa_timespec_load(&htstamp);
+    }
 
-    now1 = pa_rtclock_usec();
-    now2 = pa_bytes_to_usec((uint64_t) frames * u->frame_size, &u->source->sample_spec);
+    position = u->read_count + ((uint64_t) delay * (uint64_t) u->frame_size);
+
+    /* Hmm, if the timestamp is 0, then it wasn't set and we take the current time */
+    if (now1 <= 0)
+        now1 = pa_rtclock_usec();
+
+    now2 = pa_bytes_to_usec(position, &u->source->sample_spec);
 
     pa_smoother_put(u->smoother, now1, now2);
 }
 
 static pa_usec_t source_get_latency(struct userdata *u) {
-    pa_usec_t r = 0;
-    int64_t delay;
+   int64_t delay;
     pa_usec_t now1, now2;
 
     pa_assert(u);
@@ -447,12 +515,9 @@ static pa_usec_t source_get_latency(struct userdata *u) {
     now1 = pa_rtclock_usec();
     now2 = pa_smoother_get(u->smoother, now1);
 
-    delay = (int64_t) now2 - (int64_t) pa_bytes_to_usec((uint64_t) u->frame_index * u->frame_size, &u->source->sample_spec);
-
-    if (delay > 0)
-        r = (pa_usec_t) delay;
+    delay = (int64_t) now2 - (int64_t) pa_bytes_to_usec(u->read_count, &u->source->sample_spec);
 
-    return r;
+    return delay >= 0 ? (pa_usec_t) delay : 0;
 }
 
 static int build_pollfd(struct userdata *u) {
@@ -495,7 +560,7 @@ static int update_sw_params(struct userdata *u) {
     pa_assert(u);
 
     /* Use the full buffer if noone asked us for anything specific */
-    u->hwbuf_unused_frames = 0;
+    u->hwbuf_unused = 0;
 
     if (u->use_tsched) {
         pa_usec_t latency;
@@ -512,15 +577,14 @@ static int update_sw_params(struct userdata *u) {
             if (PA_UNLIKELY(b < u->frame_size))
                 b = u->frame_size;
 
-            u->hwbuf_unused_frames = (snd_pcm_sframes_t)
-                (PA_LIKELY(b < u->hwbuf_size) ?
-                 ((u->hwbuf_size - b) / u->frame_size) : 0);
+            u->hwbuf_unused = PA_LIKELY(b < u->hwbuf_size) ? (u->hwbuf_size - b) : 0;
         }
 
+        fix_min_sleep_wakeup(u);
         fix_tsched_watermark(u);
     }
 
-    pa_log_debug("hwbuf_unused_frames=%lu", (unsigned long) u->hwbuf_unused_frames);
+    pa_log_debug("hwbuf_unused=%lu", (unsigned long) u->hwbuf_unused);
 
     avail_min = 1;
 
@@ -952,11 +1016,13 @@ static void thread_func(void *userdata) {
     for (;;) {
         int ret;
 
-/*         pa_log_debug("loop"); */
+#ifdef DEBUG_TIMING
+        pa_log_debug("Loop");
+#endif
 
         /* Read some data and pass it to the sources */
         if (PA_SOURCE_IS_OPENED(u->source->thread_info.state)) {
-            int work_done = 0;
+            int work_done;
             pa_usec_t sleep_usec = 0;
 
             if (u->use_mmap)
@@ -1014,15 +1080,14 @@ static void thread_func(void *userdata) {
                 goto fail;
             }
 
-            if (revents & (POLLOUT|POLLERR|POLLNVAL|POLLHUP|POLLPRI)) {
+            if (revents & ~POLLIN) {
                 if (pa_alsa_recover_from_poll(u->pcm_handle, revents) < 0)
                     goto fail;
 
                 snd_pcm_start(u->pcm_handle);
-            }
+            } else if (revents && u->use_tsched && pa_log_ratelimit())
+                pa_log_debug("Wakeup from ALSA!");
 
-            if (revents && u->use_tsched && pa_log_ratelimit())
-                pa_log_debug("Wakeup from ALSA!%s%s", (revents & POLLIN) ? " INPUT" : "", (revents & POLLOUT) ? " OUTPUT" : "");
         } else
             revents = 0;
     }
@@ -1219,7 +1284,7 @@ pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, p
     pa_thread_mq_init(&u->thread_mq, m->core->mainloop, u->rtpoll);
     u->alsa_rtpoll_item = NULL;
 
-    u->smoother = pa_smoother_new(DEFAULT_TSCHED_WATERMARK_USEC, DEFAULT_TSCHED_WATERMARK_USEC, TRUE, 5);
+    u->smoother = pa_smoother_new(DEFAULT_TSCHED_WATERMARK_USEC*2, DEFAULT_TSCHED_WATERMARK_USEC*2, TRUE, 5);
     pa_smoother_set_time_offset(u->smoother, pa_rtclock_usec());
 
     b = use_mmap;
@@ -1329,17 +1394,13 @@ pa_source *pa_alsa_source_new(pa_module *m, pa_modargs *ma, const char*driver, p
     u->fragment_size = frag_size = (uint32_t) (period_frames * frame_size);
     u->nfragments = nfrags;
     u->hwbuf_size = u->fragment_size * nfrags;
-    u->hwbuf_unused_frames = 0;
     u->tsched_watermark = tsched_watermark;
-    u->frame_index = 0;
-    u->hw_dB_supported = FALSE;
-    u->hw_dB_min = u->hw_dB_max = 0;
-    u->hw_volume_min = u->hw_volume_max = 0;
-    u->mixer_seperate_channels = FALSE;
     pa_cvolume_mute(&u->hardware_volume, u->source->sample_spec.channels);
 
-    if (use_tsched)
+    if (use_tsched) {
+        fix_min_sleep_wakeup(u);
         fix_tsched_watermark(u);
+    }
 
     pa_source_set_latency_range(u->source,
                                 !use_tsched ? pa_bytes_to_usec(u->hwbuf_size, &ss) : (pa_usec_t) -1,
diff --git a/src/modules/alsa/alsa-util.c b/src/modules/alsa/alsa-util.c
index 95e872b..8607e46 100644
--- a/src/modules/alsa/alsa-util.c
+++ b/src/modules/alsa/alsa-util.c
@@ -465,6 +465,7 @@ finish:
 
 int pa_alsa_set_sw_params(snd_pcm_t *pcm, snd_pcm_uframes_t avail_min) {
     snd_pcm_sw_params_t *swparams;
+    snd_pcm_uframes_t boundary;
     int err;
 
     pa_assert(pcm);
@@ -476,7 +477,22 @@ int pa_alsa_set_sw_params(snd_pcm_t *pcm, snd_pcm_uframes_t avail_min) {
         return err;
     }
 
-    if ((err = snd_pcm_sw_params_set_stop_threshold(pcm, swparams, (snd_pcm_uframes_t) -1)) < 0) {
+    if ((err = snd_pcm_sw_params_set_period_event(pcm, swparams, 0)) < 0) {
+        pa_log_warn("Unable to disable period event: %s\n", snd_strerror(err));
+        return err;
+    }
+
+    if ((err = snd_pcm_sw_params_set_tstamp_mode(pcm, swparams, SND_PCM_TSTAMP_ENABLE)) < 0) {
+        pa_log_warn("Unable to enable time stamping: %s\n", snd_strerror(err));
+        return err;
+    }
+
+    if ((err = snd_pcm_sw_params_get_boundary(swparams, &boundary)) < 0) {
+        pa_log_warn("Unable to get boundary: %s\n", snd_strerror(err));
+        return err;
+    }
+
+    if ((err = snd_pcm_sw_params_set_stop_threshold(pcm, swparams, boundary)) < 0) {
         pa_log_warn("Unable to set stop threshold: %s\n", snd_strerror(err));
         return err;
     }
@@ -1534,7 +1550,7 @@ pa_rtpoll_item* pa_alsa_build_pollfd(snd_pcm_t *pcm, pa_rtpoll *rtpoll) {
     return item;
 }
 
-snd_pcm_sframes_t pa_alsa_safe_avail_update(snd_pcm_t *pcm, size_t hwbuf_size, const pa_sample_spec *ss) {
+snd_pcm_sframes_t pa_alsa_safe_avail(snd_pcm_t *pcm, size_t hwbuf_size, const pa_sample_spec *ss) {
     snd_pcm_sframes_t n;
     size_t k;
 
@@ -1545,7 +1561,7 @@ snd_pcm_sframes_t pa_alsa_safe_avail_update(snd_pcm_t *pcm, size_t hwbuf_size, c
     /* Some ALSA driver expose weird bugs, let's inform the user about
      * what is going on */
 
-    n = snd_pcm_avail_update(pcm);
+    n = snd_pcm_avail(pcm);
 
     if (n <= 0)
         return n;
diff --git a/src/modules/alsa/alsa-util.h b/src/modules/alsa/alsa-util.h
index 79d0999..2d0f407 100644
--- a/src/modules/alsa/alsa-util.h
+++ b/src/modules/alsa/alsa-util.h
@@ -128,7 +128,7 @@ int pa_alsa_recover_from_poll(snd_pcm_t *pcm, int revents);
 
 pa_rtpoll_item* pa_alsa_build_pollfd(snd_pcm_t *pcm, pa_rtpoll *rtpoll);
 
-snd_pcm_sframes_t pa_alsa_safe_avail_update(snd_pcm_t *pcm, size_t hwbuf_size, const pa_sample_spec *ss);
+snd_pcm_sframes_t pa_alsa_safe_avail(snd_pcm_t *pcm, size_t hwbuf_size, const pa_sample_spec *ss);
 int pa_alsa_safe_mmap_begin(snd_pcm_t *pcm, const snd_pcm_channel_area_t **areas, snd_pcm_uframes_t *offset, snd_pcm_uframes_t *frames, size_t hwbuf_size, const pa_sample_spec *ss);
 
 char *pa_alsa_get_driver_name(int card);

commit 7bc1847596bdedea6a06c8c0a019da773476a965
Merge: 26a270a... 2e250aa...
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Feb 20 03:21:46 2009 +0100

    Merge branch 'master' of ssh://rootserver/home/lennart/git/public/pulseaudio


commit 3da3ea2678d4107bd87d1a466464a0bf4682236f
Merge: 7bc1847... aae5b15...
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Feb 20 03:24:27 2009 +0100

    Merge commit 'origin/master-tx'


commit 6aa110ad4e55bdffebd2f187933ebfcfd5b23e50
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Feb 20 03:25:05 2009 +0100

    run make update-po

diff --git a/po/ca.po b/po/ca.po
index 7a61f96..6fe1d4a 100644
--- a/po/ca.po
+++ b/po/ca.po
@@ -19,7 +19,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-11-08 01:48+0000\n"
+"POT-Creation-Date: 2009-02-20 03:24+0100\n"
 "PO-Revision-Date: 2009-02-13 23:27+0100\n"
 "Last-Translator: Agusti Grau <fletxa at gmail.com>\n"
 "Language-Team: Catalan <fedora at softcatala.net>\n"
@@ -27,15 +27,80 @@ msgstr ""
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: ../src/daemon/ltdl-bind-now.c:177
-#: ../src/daemon/ltdl-bind-now.c:197
-msgid "Failed to add bind-now-loader."
-msgstr "S'ha produït un error en afegir bind-now-loader."
+#: ../src/modules/alsa/alsa-util.c:525
+msgid "Analog Mono"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:531
+msgid "Analog Stereo"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:537
+msgid "Digital Stereo (IEC958)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:543
+msgid "Digital Stereo (HDMI)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:550
+msgid "Analog Surround 4.0"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:557
+msgid "Digital Surround 4.0 (IEC958/AC3)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:565
+msgid "Analog Surround 4.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:573
+msgid "Analog Surround 5.0"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:581
+msgid "Analog Surround 5.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:589
+msgid "Digital Surround 5.1 (IEC958/AC3)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:598
+msgid "Analog Surround 7.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:1577
+#, c-format
+msgid ""
+"snd_pcm_avail_update() returned a value that is exceptionally large: %lu "
+"bytes (%lu ms). Most likely this is an ALSA driver bug. Please report this "
+"issue to the ALSA developers."
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:1609
+#, c-format
+msgid ""
+"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
+"(%lu ms). Most likely this is an ALSA driver bug. Please report this issue "
+"to the ALSA developers."
+msgstr ""
+
+#: ../src/daemon/ltdl-bind-now.c:124
+#, fuzzy
+msgid "Failed to find original lt_dlopen loader."
+msgstr "No s'ha trobat el carregador dlopen original."
 
-#: ../src/daemon/ltdl-bind-now.c:184
-msgid "Failed to find original dlopen loader."
+#: ../src/daemon/ltdl-bind-now.c:129
+#, fuzzy
+msgid "Failed to allocate new dl loader."
 msgstr "No s'ha trobat el carregador dlopen original."
 
+#: ../src/daemon/ltdl-bind-now.c:142
+msgid "Failed to add bind-now-loader."
+msgstr "S'ha produït un error en afegir bind-now-loader."
+
 #: ../src/daemon/polkit.c:55
 #, c-format
 msgid "Cannot connect to system bus: %s"
@@ -124,8 +189,7 @@ msgstr "El GID de l'usuari '%s' i del grup '%s' no coincideixen"
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "El directori arrel de l'usuari '%s' no és '%s', s'ignorarà."
 
-#: ../src/daemon/main.c:201
-#: ../src/daemon/main.c:206
+#: ../src/daemon/main.c:201 ../src/daemon/main.c:206
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "S'ha produït un error durant la creació '%s': %s"
@@ -158,258 +222,274 @@ msgstr "El mode de sistema ampli no està suportat en aquesta plataforma."
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "S'ha produït un error en setrlimit(%s, (%u, %u)): %s"
 
-#: ../src/daemon/main.c:425
+#: ../src/daemon/main.c:431
 msgid "Failed to parse command line."
 msgstr "S'ha produït un error en interpretar la línia de comandes."
 
-#: ../src/daemon/main.c:441
+#: ../src/daemon/main.c:453
 #, c-format
 msgid "We're in the group '%s', allowing high-priority scheduling."
-msgstr "Aquesta aplicació està en el grup '%s', s'està establint la prioritat alta."
+msgstr ""
+"Aquesta aplicació està en el grup '%s', s'està establint la prioritat alta."
 
-#: ../src/daemon/main.c:448
+#: ../src/daemon/main.c:460
 #, c-format
 msgid "We're in the group '%s', allowing real-time scheduling."
-msgstr "Aquesta aplicació està en el grup '%s', s'està establint la prioritat en temps real."
+msgstr ""
+"Aquesta aplicació està en el grup '%s', s'està establint la prioritat en "
+"temps real."
 
-#: ../src/daemon/main.c:456
+#: ../src/daemon/main.c:468
 msgid "PolicyKit grants us acquire-high-priority privilege."
 msgstr "PolicyKit ha permés el permís acquire-high-priority."
 
-#: ../src/daemon/main.c:459
+#: ../src/daemon/main.c:471
 msgid "PolicyKit refuses acquire-high-priority privilege."
 msgstr "PolicyKit ha rebutjat el permís acquire-high-priority."
 
-#: ../src/daemon/main.c:464
+#: ../src/daemon/main.c:476
 msgid "PolicyKit grants us acquire-real-time privilege."
 msgstr "PolicyKit h permés el permís acquire-real-time."
 
-#: ../src/daemon/main.c:467
+#: ../src/daemon/main.c:479
 msgid "PolicyKit refuses acquire-real-time privilege."
 msgstr "PolicyKit ha rebutjat el permís acquire-real-time."
 
-#: ../src/daemon/main.c:479
+#: ../src/daemon/main.c:508
+#, fuzzy
 msgid ""
-"Called SUID root and real-time/high-priority scheduling was requested in the configuration. However, we lack the necessary priviliges:\n"
+"Called SUID root and real-time and/or high-priority scheduling was requested "
+"in the configuration. However, we lack the necessary privileges:\n"
 "We are not in group '"
 msgstr ""
-"La crida de la SUID de root i la prioritat alta/temps real estàn especificades en la configuració, però no té els permissos necessaris:\n"
+"La crida de la SUID de root i la prioritat alta/temps real estàn "
+"especificades en la configuració, però no té els permissos necessaris:\n"
 "No es pertany al grup '"
 
-#: ../src/daemon/main.c:480
+#: ../src/daemon/main.c:532
 msgid ""
-"' and PolicyKit refuse to grant us priviliges. Dropping SUID again.\n"
-"For enabling real-time scheduling please acquire the appropriate PolicyKit priviliges, or become a member of '"
+"High-priority scheduling enabled in configuration but not allowed by policy."
 msgstr ""
-"' i PolicyKit ha denegat els permísos. S'està lliberant SUID. \n"
-"Per habilitar la prioritat en temps real, s'ha de adquirir els permissos de PolicyKit, o pertanyer a '"
-
-#: ../src/daemon/main.c:481
-msgid "', or increase the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this user."
-msgstr "', o incremetar els límits de recursos RLIMIT_NICE/RLIMIT_RTPRIO per aquest usuari."
+"La prioritat alta està habilitada en la configuració però no està permesa "
+"per la política."
 
-#: ../src/daemon/main.c:497
-msgid "High-priority scheduling enabled in configuration but not allowed by policy."
-msgstr "La prioritat alta està habilitada en la configuració però no està permesa per la política."
-
-#: ../src/daemon/main.c:522
+#: ../src/daemon/main.c:561
 msgid "Successfully increased RLIMIT_RTPRIO"
 msgstr "S'ha incrementat el valor de RLIMIT_RTPRIO amb éxit."
 
-#: ../src/daemon/main.c:525
+#: ../src/daemon/main.c:564
 #, c-format
 msgid "RLIMIT_RTPRIO failed: %s"
 msgstr "S'ha produït un error amb RLIMIT_RTPRIO: %s"
 
-#: ../src/daemon/main.c:532
+#: ../src/daemon/main.c:571
 msgid "Giving up CAP_NICE"
 msgstr "Es deixa CAP_NICE"
 
-#: ../src/daemon/main.c:539
-msgid "Real-time scheduling enabled in configuration but not allowed by policy."
-msgstr "La prioritat temps real està habilitada en la configuració però no està permesa per la política."
+#: ../src/daemon/main.c:578
+msgid ""
+"Real-time scheduling enabled in configuration but not allowed by policy."
+msgstr ""
+"La prioritat temps real està habilitada en la configuració però no està "
+"permesa per la política."
 
-#: ../src/daemon/main.c:597
+#: ../src/daemon/main.c:639
 msgid "Daemon not running"
 msgstr "El dimoni no s'està executant."
 
-#: ../src/daemon/main.c:599
+#: ../src/daemon/main.c:641
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "El dimoni s'està executant amb PID %u"
 
-#: ../src/daemon/main.c:609
+#: ../src/daemon/main.c:651
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "S'ha produït un error en matar el dimoni: %s"
 
-#: ../src/daemon/main.c:627
-msgid "This program is not intended to be run as root (unless --system is specified)."
-msgstr "No és necessari executar aquesta aplicació com a root (excepte si s'especifica --system)"
+#: ../src/daemon/main.c:669
+msgid ""
+"This program is not intended to be run as root (unless --system is "
+"specified)."
+msgstr ""
+"No és necessari executar aquesta aplicació com a root (excepte si "
+"s'especifica --system)"
 
-#: ../src/daemon/main.c:629
-msgid "Root priviliges required."
+#: ../src/daemon/main.c:671
+#, fuzzy
+msgid "Root privileges required."
 msgstr "Es requereixen permísos de root."
 
-#: ../src/daemon/main.c:634
+#: ../src/daemon/main.c:676
 msgid "--start not supported for system instances."
 msgstr "La opció --start no està suportada per a instàncies de sistema."
 
-#: ../src/daemon/main.c:639
+#: ../src/daemon/main.c:681
 msgid "Running in system mode, but --disallow-exit not set!"
-msgstr "S'està executant en mode sistema, però no s'ha especificat la opció --disallow-exit."
+msgstr ""
+"S'està executant en mode sistema, però no s'ha especificat la opció --"
+"disallow-exit."
 
-#: ../src/daemon/main.c:642
+#: ../src/daemon/main.c:684
 msgid "Running in system mode, but --disallow-module-loading not set!"
-msgstr "S'està executant en mode sistema, però no s'ha especificat la opció --disallow-module-loading."
+msgstr ""
+"S'està executant en mode sistema, però no s'ha especificat la opció --"
+"disallow-module-loading."
 
-#: ../src/daemon/main.c:645
+#: ../src/daemon/main.c:687
 msgid "Running in system mode, forcibly disabling SHM mode!"
-msgstr "S'està executant en mode sistema, es deshabilitarà el mode SHM forçosament."
+msgstr ""
+"S'està executant en mode sistema, es deshabilitarà el mode SHM forçosament."
 
-#: ../src/daemon/main.c:650
+#: ../src/daemon/main.c:692
 msgid "Running in system mode, forcibly disabling exit idle time!"
-msgstr "S'està executant en mode sistema, la sortida per temps d'inactivitat es deshabilita."
+msgstr ""
+"S'està executant en mode sistema, la sortida per temps d'inactivitat es "
+"deshabilita."
 
-#: ../src/daemon/main.c:677
+#: ../src/daemon/main.c:719
 msgid "Failed to acquire stdio."
 msgstr "S'ha produït un error en adquirir stdio."
 
-#: ../src/daemon/main.c:683
+#: ../src/daemon/main.c:725
 #, c-format
 msgid "pipe failed: %s"
 msgstr "Ha fallat la canonada: %s"
 
-#: ../src/daemon/main.c:688
+#: ../src/daemon/main.c:730
 #, c-format
 msgid "fork() failed: %s"
 msgstr "Ha fallat fork(): %s"
 
-#: ../src/daemon/main.c:702
+#: ../src/daemon/main.c:744
 #, c-format
 msgid "read() failed: %s"
 msgstr "Ha fallat read(): %s"
 
-#: ../src/daemon/main.c:708
+#: ../src/daemon/main.c:750
 msgid "Daemon startup failed."
 msgstr "S'ha produït un error en iniciar el dimoni."
 
-#: ../src/daemon/main.c:710
+#: ../src/daemon/main.c:752
 msgid "Daemon startup successful."
 msgstr "S'ha iniciat el dimoni."
 
-#: ../src/daemon/main.c:780
+#: ../src/daemon/main.c:822
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "Aquest és el PulseAudio %s"
 
-#: ../src/daemon/main.c:781
+#: ../src/daemon/main.c:823
 #, c-format
 msgid "Compilation host: %s"
 msgstr "Host de compilació: %s"
 
-#: ../src/daemon/main.c:782
+#: ../src/daemon/main.c:824
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "CFLAGS de compilació: %s"
 
-#: ../src/daemon/main.c:785
+#: ../src/daemon/main.c:827
 #, c-format
 msgid "Running on host: %s"
 msgstr "S'està executant en el host: %s"
 
-#: ../src/daemon/main.c:788
+#: ../src/daemon/main.c:830
+#, c-format
+msgid "Found %u CPUs."
+msgstr ""
+
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "La mida de pàgina és de %lu bytes."
 
-#: ../src/daemon/main.c:791
+#: ../src/daemon/main.c:835
 msgid "Compiled with Valgrind support: yes"
 msgstr "Compilat amb suport per a Valgrind: sí"
 
-#: ../src/daemon/main.c:793
+#: ../src/daemon/main.c:837
 msgid "Compiled with Valgrind support: no"
 msgstr "Compilat amb suport per a Valgrind: no"
 
-#: ../src/daemon/main.c:796
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "S'està executant amb el mode valgrind: %s"
 
-#: ../src/daemon/main.c:799
+#: ../src/daemon/main.c:843
 msgid "Optimized build: yes"
 msgstr "Construcció optimitzada: sí"
 
-#: ../src/daemon/main.c:801
+#: ../src/daemon/main.c:845
 msgid "Optimized build: no"
 msgstr "Construcció optmitzada: no"
 
-#: ../src/daemon/main.c:805
+#: ../src/daemon/main.c:849
 msgid "Failed to get machine ID"
 msgstr "S'ha produït un error en obtenir la ID de la màquina"
 
-#: ../src/daemon/main.c:808
+#: ../src/daemon/main.c:852
 #, c-format
 msgid "Machine ID is %s."
 msgstr "La ID de la màquina és %s."
 
-#: ../src/daemon/main.c:813
+#: ../src/daemon/main.c:857
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "S'esta utilitzant el directori d'execució %s."
 
-#: ../src/daemon/main.c:818
+#: ../src/daemon/main.c:862
 #, c-format
 msgid "Using state directory %s."
 msgstr "S'està utilitzant el directori d'estat %s."
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:865
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "S'està executant en mode sistema: %s"
 
-#: ../src/daemon/main.c:836
+#: ../src/daemon/main.c:880
 msgid "pa_pid_file_create() failed."
 msgstr "S'ha produït un error en pa_pid_file_create()."
 
-#: ../src/daemon/main.c:848
+#: ../src/daemon/main.c:892
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "Estàn disponibles els temporitzadors frescos de alta resolució."
 
-#: ../src/daemon/main.c:850
-msgid "Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"
-msgstr "Es recomana la utilització d'un kernel amb els temporitzadors d'alta resolució habilitats."
+#: ../src/daemon/main.c:894
+msgid ""
+"Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
+"resolution timers enabled!"
+msgstr ""
+"Es recomana la utilització d'un kernel amb els temporitzadors d'alta "
+"resolució habilitats."
 
-#: ../src/daemon/main.c:860
+#: ../src/daemon/main.c:906
 msgid "pa_core_new() failed."
 msgstr "S'ha produït un error en pa_core_new()."
 
-#: ../src/daemon/main.c:921
+#: ../src/daemon/main.c:967
 msgid "Failed to initialize daemon."
 msgstr "S'ha produït un error en inicialitzar el dimoni."
 
-#: ../src/daemon/main.c:926
+#: ../src/daemon/main.c:972
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr "Com el dimoni s'ha iniciat sense cap mòdul carregat, no funciona."
 
-#: ../src/daemon/main.c:931
-#, c-format
-msgid "Default sink name (%s) does not exist in name register."
-msgstr "El nom sink per omissió  (%s) no existeix en el registre de noms."
-
-#: ../src/daemon/main.c:944
+#: ../src/daemon/main.c:985
 msgid "Daemon startup complete."
 msgstr "S'ha completat la inicialització del dimoni."
 
-#: ../src/daemon/main.c:950
+#: ../src/daemon/main.c:991
 msgid "Daemon shutdown initiated."
 msgstr "S'ha iniciat l'aturada del dimoni."
 
-#: ../src/daemon/main.c:971
+#: ../src/daemon/main.c:1009
 msgid "Daemon terminated."
 msgstr "S'ha aturat el dimoni."
 
-#: ../src/daemon/cmdline.c:117
+#: ../src/daemon/cmdline.c:121
 #, fuzzy, c-format
 msgid ""
 "%s [options]\n"
@@ -420,34 +500,48 @@ msgid ""
 "      --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"
+"      --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\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"
+"                                        (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"
+"                                        (only available as root, when SUID "
+"or\n"
 "                                        with elevated RLIMIT_RTPRIO)\n"
-"      --disallow-module-loading[=BOOL]  Disallow module user requested module\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"
+"      --exit-idle-time=SECS             Terminate the daemon when idle and "
+"this\n"
 "                                        time passed\n"
-"      --module-idle-time=SECS           Unload autoloaded modules when idle and\n"
+"      --module-idle-time=SECS           Unload autoloaded modules when idle "
+"and\n"
 "                                        this time passed\n"
-"      --scache-idle-time=SECS           Unload autoloaded samples when idle and\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} Specify the log target\n"
-"  -p, --dl-search-path=PATH             Set the search path for dynamic shared\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"
@@ -458,10 +552,12 @@ msgid ""
 "      --disable-shm[=BOOL]              Disable shared memory support.\n"
 "\n"
 "STARTUP SCRIPT:\n"
-"  -L, --load=\"MODULE ARGUMENTS\"         Load the specified plugin module with\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"
+"  -C                                    Open a command line on the running "
+"TTY\n"
 "                                        after startup\n"
 "\n"
 "  -n                                    Don't load default script file\n"
@@ -471,37 +567,51 @@ msgstr ""
 "COMANDES:\n"
 "  -h, --help                            Mostra aquesta ajuda\n"
 "      --version                            Mostra la versió\n"
-"      --dump-conf                            Volca la configuració per omissió\n"
+"      --dump-conf                            Volca la configuració per "
+"omissió\n"
 "      --dump-modules                            Volca la llista de mòduls\n"
-"      --dump-resample-methods                            Volca els mètodes disponibles de remostratge\n"
-"      --cleanup-shm                            Neteja els segments de memòria compartia rancis\n"
-"      --start                            Inicia el dimoni si aquest no està corrent\n"
+"      --dump-resample-methods                            Volca els mètodes "
+"disponibles de remostratge\n"
+"      --cleanup-shm                            Neteja els segments de "
+"memòria compartia rancis\n"
+"      --start                            Inicia el dimoni si aquest no està "
+"corrent\n"
 "  -k  --kill                            Mata el dimoni en execució\n"
 "      --check                           Comprova l'execució del dimoni\n"
 "\n"
 "OPCIONS:\n"
-"      --system[=BOOL]                   Executa com una instància de sistema\n"
-"  -D, --daemonize[=BOOL]                Converteix en dimoni després de la inicialització\n"
+"      --system[=BOOL]                   Executa com una instància de "
+"sistema\n"
+"  -D, --daemonize[=BOOL]                Converteix en dimoni després de la "
+"inicialització\n"
 "      --fail[=BOOL]                     Surt quan falli la inicialització\n"
 "      --high-priority[=BOOL]            Prova de establir un nivell\n"
-"                                        nice alt(només disponivle com a root,\n"
-"                                        amb SUID o amb un elevat RLIMIT_NICE)\n"
+"                                        nice alt(només disponivle com a "
+"root,\n"
+"                                        amb SUID o amb un elevat "
+"RLIMIT_NICE)\n"
 "      --realtime[=BOOL]                 Try to enable realtime scheduling\n"
-"                                        (only available as root, when SUID or\n"
+"                                        (only available as root, when SUID "
+"or\n"
 "                                        with elevated RLIMIT_RTPRIO)\n"
-"      --disallow-module-loading[=BOOL]  Disallow module user requested module\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"
+"      --exit-idle-time=SECS             Terminate the daemon when idle and "
+"this\n"
 "                                        time passed\n"
-"      --module-idle-time=SECS           Unload autoloaded modules when idle and\n"
+"      --module-idle-time=SECS           Unload autoloaded modules when idle "
+"and\n"
 "                                        this time passed\n"
-"      --scache-idle-time=SECS           Unload autoloaded samples when idle and\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} Specify the log target\n"
-"  -p, --dl-search-path=PATH             Set the search path for dynamic shared\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"
@@ -512,64 +622,80 @@ msgstr ""
 "      --disable-shm[=BOOL]              Disable shared memory support.\n"
 "\n"
 "STARTUP SCRIPT:\n"
-"  -L, --load=\"MODULE ARGUMENTS\"         Load the specified plugin module with\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"
+"  -C                                    Open a command line on the running "
+"TTY\n"
 "                                        after startup\n"
 "\n"
 "  -n                                    Don't load default script file\n"
 
-#: ../src/daemon/cmdline.c:245
+#: ../src/daemon/cmdline.c:252
 msgid "--daemonize expects boolean argument"
 msgstr "--daemonize necessita un argument booleà"
 
-#: ../src/daemon/cmdline.c:252
+#: ../src/daemon/cmdline.c:259
 msgid "--fail expects boolean argument"
 msgstr "--fail necessita un argument booleà"
 
-#: ../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 necessita un argument de nivell de log (valor númeric 0..4 o debug, info, notice, warn, error)."
+#: ../src/daemon/cmdline.c:269
+msgid ""
+"--log-level expects log level argument (either numeric in range 0..4 or one "
+"of debug, info, notice, warn, error)."
+msgstr ""
+"--log-level necessita un argument de nivell de log (valor númeric 0..4 o "
+"debug, info, notice, warn, error)."
 
-#: ../src/daemon/cmdline.c:274
+#: ../src/daemon/cmdline.c:281
 msgid "--high-priority expects boolean argument"
 msgstr "--high-priority necessita un argument booleà"
 
-#: ../src/daemon/cmdline.c:281
+#: ../src/daemon/cmdline.c:288
 msgid "--realtime expects boolean argument"
 msgstr "--realtime necessita un argument booleà"
 
-#: ../src/daemon/cmdline.c:288
+#: ../src/daemon/cmdline.c:295
 msgid "--disallow-module-loading expects boolean argument"
 msgstr "--disallow-module-loading necessita un argument booleà"
 
-#: ../src/daemon/cmdline.c:295
+#: ../src/daemon/cmdline.c:302
 msgid "--disallow-exit boolean argument"
 msgstr "--disallow-exit necessita un argument booleà"
 
-#: ../src/daemon/cmdline.c:302
+#: ../src/daemon/cmdline.c:309
 msgid "--use-pid-file expects boolean argument"
 msgstr "--use-pid-file necessita un argument booleà"
 
-#: ../src/daemon/cmdline.c:319
+#: ../src/daemon/cmdline.c:326
 msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'."
 msgstr "Objectiu de log invàlid: utilitzeu 'syslog', 'stderr' o 'auto'."
 
-#: ../src/daemon/cmdline.c:338
+#: ../src/daemon/cmdline.c:333
+#, fuzzy
+msgid "--log-time boolean argument"
+msgstr "--disallow-exit necessita un argument booleà"
+
+#: ../src/daemon/cmdline.c:340
+#, fuzzy
+msgid "--log-meta boolean argument"
+msgstr "--disallow-exit necessita un argument booleà"
+
+#: ../src/daemon/cmdline.c:359
 #, c-format
 msgid "Invalid resample method '%s'."
 msgstr "Mètode de remostratge invàlid '%s'."
 
-#: ../src/daemon/cmdline.c:345
+#: ../src/daemon/cmdline.c:366
 msgid "--system expects boolean argument"
 msgstr "--system necessita un argument booleà"
 
-#: ../src/daemon/cmdline.c:352
+#: ../src/daemon/cmdline.c:373
 msgid "--no-cpu-limit expects boolean argument"
 msgstr "--no-cpu-limit necessita un argument booleà"
 
-#: ../src/daemon/cmdline.c:359
+#: ../src/daemon/cmdline.c:380
 msgid "--disable-shm expects boolean argument"
 msgstr "--disable-shm necessita un argument booleà"
 
@@ -613,290 +739,314 @@ msgstr "Càrrega: %s\n"
 msgid "Path: %s\n"
 msgstr "Ruta: %s\n"
 
-#: ../src/daemon/daemon-conf.c:205
+#: ../src/daemon/daemon-conf.c:212
 #, c-format
 msgid "[%s:%u] Invalid log target '%s'."
 msgstr "[%s:%u] Destí de registre incorrecte '%s'"
 
-#: ../src/daemon/daemon-conf.c:221
+#: ../src/daemon/daemon-conf.c:228
 #, c-format
 msgid "[%s:%u] Invalid log level '%s'."
 msgstr "[%s:%u] Nivell de registre incorrecte '%s'."
 
-#: ../src/daemon/daemon-conf.c:237
+#: ../src/daemon/daemon-conf.c:244
 #, c-format
 msgid "[%s:%u] Invalid resample method '%s'."
 msgstr "[%s:%u] Mètode de remostreig incorrecte '%s'."
 
-#: ../src/daemon/daemon-conf.c:260
+#: ../src/daemon/daemon-conf.c:267
 #, c-format
 msgid "[%s:%u] Invalid rlimit '%s'."
 msgstr "[%s:%u] rlimit incorrecte '%s'."
 
-#: ../src/daemon/daemon-conf.c:267
+#: ../src/daemon/daemon-conf.c:274
 #, c-format
 msgid "[%s:%u] rlimit not supported on this platform."
 msgstr "[%s:%u] rlimit no disponible en aquesta plataforma."
 
-#: ../src/daemon/daemon-conf.c:283
+#: ../src/daemon/daemon-conf.c:290
 #, c-format
 msgid "[%s:%u] Invalid sample format '%s'."
 msgstr "[%s:%u] Format de mostra incorrecte '%s'."
 
-#: ../src/daemon/daemon-conf.c:301
+#: ../src/daemon/daemon-conf.c:308
 #, c-format
 msgid "[%s:%u] Invalid sample rate '%s'."
 msgstr "[%s:%u] Velocitat de mostreig '%s'."
 
-#: ../src/daemon/daemon-conf.c:319
+#: ../src/daemon/daemon-conf.c:326
 #, c-format
 msgid "[%s:%u] Invalid sample channels '%s'."
 msgstr "[%s:%u] Canals de mostreig incorrectes '%s'."
 
-#: ../src/daemon/daemon-conf.c:337
+#: ../src/daemon/daemon-conf.c:344
 #, c-format
 msgid "[%s:%u] Invalid number of fragments '%s'."
 msgstr "[%s:%u] Nombre de fragments incorrecte '%s'."
 
-#: ../src/daemon/daemon-conf.c:355
+#: ../src/daemon/daemon-conf.c:362
 #, c-format
 msgid "[%s:%u] Invalid fragment size '%s'."
 msgstr "[%s:%u] Mida de fragment incorrecta '%s'."
 
-#: ../src/daemon/daemon-conf.c:373
+#: ../src/daemon/daemon-conf.c:380
 #, c-format
 msgid "[%s:%u] Invalid nice level '%s'."
 msgstr "[%s:%u] Nivell de prioritat incorrecte '%s'."
 
-#: ../src/daemon/daemon-conf.c:570
+#: ../src/daemon/daemon-conf.c:566
 #, c-format
 msgid "Failed to open configuration file: %s"
 msgstr "Error en obrir el fitxer de configuració: %s"
 
-#: ../src/daemon/daemon-conf.c:644
+#: ../src/daemon/daemon-conf.c:640
 #, c-format
 msgid "### Read from configuration file: %s ###\n"
 msgstr "### Lectura del fitxer de configuració: %s ###\n"
 
 #: ../src/daemon/caps.c:63
-msgid "Dropping root priviliges."
+#, fuzzy
+msgid "Dropping root privileges."
 msgstr "Alliberant privilegis de root."
 
 #: ../src/daemon/caps.c:103
 msgid "Limited capabilities successfully to CAP_SYS_NICE."
 msgstr "S'han limitat les capacitats a CAP_SYS_NICE correctament."
 
-#: ../src/pulse/channelmap.c:102
+#: ../src/pulse/channelmap.c:103 ../src/pulse/channelmap.c:804
 msgid "Mono"
 msgstr "Mono"
 
-#: ../src/pulse/channelmap.c:104
+#: ../src/pulse/channelmap.c:105
 msgid "Front Center"
 msgstr "Frontal central"
 
-#: ../src/pulse/channelmap.c:105
+#: ../src/pulse/channelmap.c:106
 msgid "Front Left"
 msgstr "Frontal esquerra"
 
-#: ../src/pulse/channelmap.c:106
+#: ../src/pulse/channelmap.c:107
 msgid "Front Right"
 msgstr "Frontal dreta"
 
-#: ../src/pulse/channelmap.c:108
+#: ../src/pulse/channelmap.c:109
 msgid "Rear Center"
 msgstr "Posterior central"
 
-#: ../src/pulse/channelmap.c:109
+#: ../src/pulse/channelmap.c:110
 msgid "Rear Left"
 msgstr "Posterior esquerra"
 
-#: ../src/pulse/channelmap.c:110
+#: ../src/pulse/channelmap.c:111
 msgid "Rear Right"
 msgstr "Posterior dreta"
 
-#: ../src/pulse/channelmap.c:112
+#: ../src/pulse/channelmap.c:113
 msgid "Low Frequency Emmiter"
 msgstr "Emisor de baixa freqüència"
 
-#: ../src/pulse/channelmap.c:114
+#: ../src/pulse/channelmap.c:115
 msgid "Front Left-of-center"
 msgstr "Frontal central part esquerra"
 
-#: ../src/pulse/channelmap.c:115
+#: ../src/pulse/channelmap.c:116
 msgid "Front Right-of-center"
 msgstr "Frontal central part dreta"
 
-#: ../src/pulse/channelmap.c:117
+#: ../src/pulse/channelmap.c:118
 msgid "Side Left"
 msgstr "Lateral esquerra"
 
-#: ../src/pulse/channelmap.c:118
+#: ../src/pulse/channelmap.c:119
 msgid "Side Right"
 msgstr "Lateral dreta"
 
-#: ../src/pulse/channelmap.c:120
+#: ../src/pulse/channelmap.c:121
 msgid "Auxiliary 0"
 msgstr "Auxiliar 0"
 
-#: ../src/pulse/channelmap.c:121
+#: ../src/pulse/channelmap.c:122
 msgid "Auxiliary 1"
 msgstr "Auxiliar 1"
 
-#: ../src/pulse/channelmap.c:122
+#: ../src/pulse/channelmap.c:123
 msgid "Auxiliary 2"
 msgstr "Auxiliar 2"
 
-#: ../src/pulse/channelmap.c:123
+#: ../src/pulse/channelmap.c:124
 msgid "Auxiliary 3"
 msgstr "Auxiliar 3"
 
-#: ../src/pulse/channelmap.c:124
+#: ../src/pulse/channelmap.c:125
 msgid "Auxiliary 4"
 msgstr "Auxiliar 4"
 
-#: ../src/pulse/channelmap.c:125
+#: ../src/pulse/channelmap.c:126
 msgid "Auxiliary 5"
 msgstr "Auxiliar 5"
 
-#: ../src/pulse/channelmap.c:126
+#: ../src/pulse/channelmap.c:127
 msgid "Auxiliary 6"
 msgstr "Auxiliar 6"
 
-#: ../src/pulse/channelmap.c:127
+#: ../src/pulse/channelmap.c:128
 msgid "Auxiliary 7"
 msgstr "Auxiliar 7"
 
-#: ../src/pulse/channelmap.c:128
+#: ../src/pulse/channelmap.c:129
 msgid "Auxiliary 8"
 msgstr "Auxiliar 8"
 
-#: ../src/pulse/channelmap.c:129
+#: ../src/pulse/channelmap.c:130
 msgid "Auxiliary 9"
 msgstr "Auxiliar 9"
 
-#: ../src/pulse/channelmap.c:130
+#: ../src/pulse/channelmap.c:131
 msgid "Auxiliary 10"
 msgstr "Auxiliar 10"
 
-#: ../src/pulse/channelmap.c:131
+#: ../src/pulse/channelmap.c:132
 msgid "Auxiliary 11"
 msgstr "Auxiliar 11"
 
-#: ../src/pulse/channelmap.c:132
+#: ../src/pulse/channelmap.c:133
 msgid "Auxiliary 12"
 msgstr "Auxiliar 12"
 
-#: ../src/pulse/channelmap.c:133
+#: ../src/pulse/channelmap.c:134
 msgid "Auxiliary 13"
 msgstr "Auxiliar 13"
 
-#: ../src/pulse/channelmap.c:134
+#: ../src/pulse/channelmap.c:135
 msgid "Auxiliary 14"
 msgstr "Auxiliar 14"
 
-#: ../src/pulse/channelmap.c:135
+#: ../src/pulse/channelmap.c:136
 msgid "Auxiliary 15"
 msgstr "Auxiliar 15"
 
-#: ../src/pulse/channelmap.c:136
+#: ../src/pulse/channelmap.c:137
 msgid "Auxiliary 16"
 msgstr "Auxiliar 16"
 
-#: ../src/pulse/channelmap.c:137
+#: ../src/pulse/channelmap.c:138
 msgid "Auxiliary 17"
 msgstr "Auxiliar 17"
 
-#: ../src/pulse/channelmap.c:138
+#: ../src/pulse/channelmap.c:139
 msgid "Auxiliary 18"
 msgstr "Auxiliar 18"
 
-#: ../src/pulse/channelmap.c:139
+#: ../src/pulse/channelmap.c:140
 msgid "Auxiliary 19"
 msgstr "Auxiliar 19"
 
-#: ../src/pulse/channelmap.c:140
+#: ../src/pulse/channelmap.c:141
 msgid "Auxiliary 20"
 msgstr "Auxiliar 20"
 
-#: ../src/pulse/channelmap.c:141
+#: ../src/pulse/channelmap.c:142
 msgid "Auxiliary 21"
 msgstr "Auxiliar 21"
 
-#: ../src/pulse/channelmap.c:142
+#: ../src/pulse/channelmap.c:143
 msgid "Auxiliary 22"
 msgstr "Auxiliar 22"
 
-#: ../src/pulse/channelmap.c:143
+#: ../src/pulse/channelmap.c:144
 msgid "Auxiliary 23"
 msgstr "Auxiliar 23"
 
-#: ../src/pulse/channelmap.c:144
+#: ../src/pulse/channelmap.c:145
 msgid "Auxiliary 24"
 msgstr "Auxiliar 24"
 
-#: ../src/pulse/channelmap.c:145
+#: ../src/pulse/channelmap.c:146
 msgid "Auxiliary 25"
 msgstr "Auxiliar 25"
 
-#: ../src/pulse/channelmap.c:146
+#: ../src/pulse/channelmap.c:147
 msgid "Auxiliary 26"
 msgstr "Auxiliar 26"
 
-#: ../src/pulse/channelmap.c:147
+#: ../src/pulse/channelmap.c:148
 msgid "Auxiliary 27"
 msgstr "Auxiliar 27"
 
-#: ../src/pulse/channelmap.c:148
+#: ../src/pulse/channelmap.c:149
 msgid "Auxiliary 28"
 msgstr "Auxiliar 28"
 
-#: ../src/pulse/channelmap.c:149
+#: ../src/pulse/channelmap.c:150
 msgid "Auxiliary 29"
 msgstr "Auxiliar 31"
 
-#: ../src/pulse/channelmap.c:150
+#: ../src/pulse/channelmap.c:151
 msgid "Auxiliary 30"
 msgstr "Auxiliar 30"
 
-#: ../src/pulse/channelmap.c:151
+#: ../src/pulse/channelmap.c:152
 msgid "Auxiliary 31"
 msgstr "Auxiliar 31"
 
-#: ../src/pulse/channelmap.c:153
+#: ../src/pulse/channelmap.c:154
 msgid "Top Center"
 msgstr "Superior central"
 
-#: ../src/pulse/channelmap.c:155
+#: ../src/pulse/channelmap.c:156
 msgid "Top Front Center"
 msgstr "Superior frontal central"
 
-#: ../src/pulse/channelmap.c:156
+#: ../src/pulse/channelmap.c:157
 msgid "Top Front Left"
 msgstr "Superior frontal central"
 
-#: ../src/pulse/channelmap.c:157
+#: ../src/pulse/channelmap.c:158
 msgid "Top Front Right"
 msgstr "Superior frontal dreta"
 
-#: ../src/pulse/channelmap.c:159
+#: ../src/pulse/channelmap.c:160
 msgid "Top Rear Center"
 msgstr "Superior posterior central"
 
-#: ../src/pulse/channelmap.c:160
+#: ../src/pulse/channelmap.c:161
 msgid "Top Rear Left"
 msgstr "Superior posterior esquerra"
 
-#: ../src/pulse/channelmap.c:161
+#: ../src/pulse/channelmap.c:162
 msgid "Top Rear Right"
 msgstr "Superior posterior dreta"
 
-#: ../src/pulse/channelmap.c:472
-#: ../src/pulse/sample.c:144
-#: ../src/pulse/volume.c:163
-#: ../src/pulse/volume.c:194
+#: ../src/pulse/channelmap.c:476 ../src/pulse/sample.c:167
+#: ../src/pulse/volume.c:170 ../src/pulse/volume.c:196
+#: ../src/pulse/volume.c:216 ../src/pulse/volume.c:246
 msgid "(invalid)"
 msgstr "(incorrecte)"
 
+#: ../src/pulse/channelmap.c:808
+msgid "Stereo"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:813
+msgid "Surround 4.0"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:819
+msgid "Surround 4.1"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:825
+msgid "Surround 5.0"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:831
+msgid "Surround 5.1"
+msgstr ""
+
+#: ../src/pulse/channelmap.c:838
+msgid "Surround 7.1"
+msgstr ""
+
 #: ../src/pulse/error.c:43
 msgid "OK"
 msgstr "D'acord"
@@ -985,8 +1135,40 @@ msgstr "Codi d'error desconegut"
 msgid "No such extension"
 msgstr "No existeix l'extensió"
 
-#: ../src/pulse/client-conf-x11.c:55
-#: ../src/utils/pax11publish.c:100
+#: ../src/pulse/error.c:65
+msgid "Obsolete functionality"
+msgstr ""
+
+#: ../src/pulse/error.c:66
+msgid "Missing implementation"
+msgstr ""
+
+#: ../src/pulse/sample.c:169
+#, c-format
+msgid "%s %uch %uHz"
+msgstr ""
+
+#: ../src/pulse/sample.c:181
+#, c-format
+msgid "%0.1f GiB"
+msgstr ""
+
+#: ../src/pulse/sample.c:183
+#, c-format
+msgid "%0.1f MiB"
+msgstr ""
+
+#: ../src/pulse/sample.c:185
+#, c-format
+msgid "%0.1f KiB"
+msgstr ""
+
+#: ../src/pulse/sample.c:187
+#, c-format
+msgid "%u B"
+msgstr ""
+
+#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100
 msgid "XOpenDisplay() failed"
 msgstr "Ha fallat XOpenDisplay()"
 
@@ -999,45 +1181,35 @@ msgstr "Ha fallat el parseig de les dades de la cookie"
 msgid "Failed to open configuration file '%s': %s"
 msgstr "S'ha produït un error en obrir el fitxer de configuració '%s': %s"
 
-#: ../src/pulse/context.c:516
+#: ../src/pulse/context.c:519
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "No s'ha carregat cap cookie. S'està intentant connectar sense aquesta."
 
-#: ../src/pulse/context.c:642
+#: ../src/pulse/context.c:649
 #, c-format
 msgid "fork(): %s"
 msgstr "fork(): %s"
 
-#: ../src/pulse/context.c:695
+#: ../src/pulse/context.c:702
 #, c-format
 msgid "waitpid(): %s"
 msgstr "waitpid(): %s"
 
-#: ../src/pulse/context.c:1256
+#: ../src/pulse/context.c:1279
 #, c-format
 msgid "Received message for unknown extension '%s'"
 msgstr "S'ha rebut un missatge per a l'extensió desconeguda '%s'"
 
-#: ../src/utils/pacat.c:93
+#: ../src/utils/pacat.c:94
 #, c-format
 msgid "pa_stream_write() failed: %s\n"
 msgstr "Ha fallat pa_stream_write(): %s\n"
 
-#: ../src/utils/pacat.c:132
+#: ../src/utils/pacat.c:133
 #, c-format
 msgid "pa_stream_peek() failed: %s\n"
 msgstr "Ha fallat pa_stream_peek(): %s\n"
 
-#: ../src/utils/pacat.c:141
-#, c-format
-msgid "Buffer overrun, dropping incoming data\n"
-msgstr "S'ha sobrepassat la memòria intermitja, s'estan descartant les dades entrants\n"
-
-#: ../src/utils/pacat.c:143
-#, c-format
-msgid "pa_stream_drop() failed: %s\n"
-msgstr "Ha fallat pa_stream_drop(): %s\n"
-
 #: ../src/utils/pacat.c:169
 #, c-format
 msgid "Stream successfully created.\n"
@@ -1061,7 +1233,9 @@ msgstr "Mètriques del buffer: maxlength=%u, fragsize=%u\n"
 #: ../src/utils/pacat.c:183
 #, c-format
 msgid "Using sample spec '%s', channel map '%s'.\n"
-msgstr "S'estan utilitzant les especificacions de mostreig '%s', mapeig del canal '%s'.\n"
+msgstr ""
+"S'estan utilitzant les especificacions de mostreig '%s', mapeig del canal '%"
+"s'.\n"
 
 #: ../src/utils/pacat.c:187
 #, c-format
@@ -1107,93 +1281,88 @@ msgstr "S'ha mogut l'stream al dispositiu %s (%u, %s suspés).%s\n"
 msgid "not "
 msgstr "no"
 
-#: ../src/utils/pacat.c:259
+#: ../src/utils/pacat.c:271
 #, c-format
 msgid "Connection established.%s \n"
 msgstr "S'ha establert la connexió.%s\n"
 
-#: ../src/utils/pacat.c:262
+#: ../src/utils/pacat.c:274
 #, c-format
 msgid "pa_stream_new() failed: %s\n"
 msgstr "Ha fallat pa_stream_new(): %s\n"
 
-#: ../src/utils/pacat.c:287
+#: ../src/utils/pacat.c:301
 #, c-format
 msgid "pa_stream_connect_playback() failed: %s\n"
 msgstr "Ha fallat pa_stream_connect_playback(): %s\n"
 
-#: ../src/utils/pacat.c:293
+#: ../src/utils/pacat.c:307
 #, c-format
 msgid "pa_stream_connect_record() failed: %s\n"
 msgstr "Ha fallat pa_stream_connect_record(): %s\n"
 
-#: ../src/utils/pacat.c:307
-#: ../src/utils/pasuspender.c:159
-#: ../src/utils/pactl.c:666
-#: ../src/utils/paplay.c:183
+#: ../src/utils/pacat.c:321 ../src/utils/pasuspender.c:159
+#: ../src/utils/pactl.c:759 ../src/utils/paplay.c:183
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "Ha fallat la connexió: %s\n"
 
-#: ../src/utils/pacat.c:328
-#: ../src/utils/paplay.c:75
+#: ../src/utils/pacat.c:341 ../src/utils/paplay.c:75
 #, c-format
 msgid "Failed to drain stream: %s\n"
 msgstr "S'ha produït un error en drenar l'stream: %s\n"
 
-#: ../src/utils/pacat.c:333
-#: ../src/utils/paplay.c:80
+#: ../src/utils/pacat.c:346 ../src/utils/paplay.c:80
 #, c-format
 msgid "Playback stream drained.\n"
 msgstr "Flux de reproducció drenat.\n"
 
-#: ../src/utils/pacat.c:343
-#: ../src/utils/paplay.c:92
+#: ../src/utils/pacat.c:356 ../src/utils/paplay.c:92
 #, c-format
 msgid "Draining connection to server.\n"
 msgstr "S'està drenant la connexió amb el servidor.\n"
 
-#: ../src/utils/pacat.c:369
+#: ../src/utils/pacat.c:382
 #, c-format
 msgid "Got EOF.\n"
 msgstr "S'ha llegit EOF.\n"
 
-#: ../src/utils/pacat.c:375
+#: ../src/utils/pacat.c:388
 #, c-format
 msgid "pa_stream_drain(): %s\n"
 msgstr "pa_stream_drain(): %s\n"
 
-#: ../src/utils/pacat.c:385
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "read() failed: %s\n"
 msgstr "Ha fallat read(): %s\n"
 
-#: ../src/utils/pacat.c:417
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "write() failed: %s\n"
 msgstr "Ha fallat write(): %s\n"
 
-#: ../src/utils/pacat.c:438
+#: ../src/utils/pacat.c:451
 #, c-format
 msgid "Got signal, exiting.\n"
 msgstr "S'ha rebut una signal, s'està sortint.\n"
 
-#: ../src/utils/pacat.c:452
+#: ../src/utils/pacat.c:465
 #, c-format
 msgid "Failed to get latency: %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:457
+#: ../src/utils/pacat.c:470
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec.  \r"
 msgstr ""
 
-#: ../src/utils/pacat.c:477
+#: ../src/utils/pacat.c:490
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:490
+#: ../src/utils/pacat.c:503
 #, c-format
 msgid ""
 "%s [options]\n"
@@ -1206,30 +1375,47 @@ msgid ""
 "\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 (defaults to s16ne)\n"
-"      --channels=CHANNELS               The number of channels, 1 for mono, 2 for stereo\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 "
+"(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 the stream is\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"
 "                                        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 "
+"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"
+"      --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"
+"      --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"
 msgstr ""
 
-#: ../src/utils/pacat.c:591
+#: ../src/utils/pacat.c:604
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1237,94 +1423,89 @@ msgid ""
 "Linked with libpulse %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:647
+#: ../src/utils/pacat.c:661
 #, c-format
 msgid "Invalid channel map '%s'\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:676
+#: ../src/utils/pacat.c:690
 #, c-format
 msgid "Invalid latency specification '%s'\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:683
+#: ../src/utils/pacat.c:697
 #, c-format
 msgid "Invalid process time specification '%s'\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:694
+#: ../src/utils/pacat.c:708
 #, c-format
 msgid "Invalid sample specification\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:699
+#: ../src/utils/pacat.c:713
 #, c-format
 msgid "Channel map doesn't match sample specification\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:706
+#: ../src/utils/pacat.c:720
 #, c-format
 msgid "Opening a %s stream with sample specification '%s'.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:706
+#: ../src/utils/pacat.c:720
 msgid "recording"
 msgstr ""
 
-#: ../src/utils/pacat.c:706
+#: ../src/utils/pacat.c:720
 msgid "playback"
 msgstr ""
 
-#: ../src/utils/pacat.c:714
+#: ../src/utils/pacat.c:728
 #, c-format
 msgid "open(): %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:719
+#: ../src/utils/pacat.c:733
 #, c-format
 msgid "dup2(): %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:729
+#: ../src/utils/pacat.c:743
 #, c-format
 msgid "Too many arguments.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:742
-#: ../src/utils/pasuspender.c:280
-#: ../src/utils/pactl.c:909
-#: ../src/utils/paplay.c:381
+#: ../src/utils/pacat.c:756 ../src/utils/pasuspender.c:280
+#: ../src/utils/pactl.c:1014 ../src/utils/paplay.c:381
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:763
+#: ../src/utils/pacat.c:777
 #, c-format
 msgid "io_new() failed.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:769
-#: ../src/utils/pasuspender.c:293
-#: ../src/utils/pactl.c:923
-#: ../src/utils/paplay.c:396
+#: ../src/utils/pacat.c:783 ../src/utils/pasuspender.c:293
+#: ../src/utils/pactl.c:1028 ../src/utils/paplay.c:396
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:777
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1034
+#: ../src/utils/paplay.c:404
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:788
+#: ../src/utils/pacat.c:802
 #, c-format
 msgid "time_new() failed.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:795
-#: ../src/utils/pasuspender.c:301
-#: ../src/utils/pactl.c:931
-#: ../src/utils/paplay.c:407
+#: ../src/utils/pacat.c:809 ../src/utils/pasuspender.c:301
+#: ../src/utils/pactl.c:1039 ../src/utils/paplay.c:410
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr ""
@@ -1354,8 +1535,7 @@ msgstr ""
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:176
-#: ../src/utils/pactl.c:672
+#: ../src/utils/pasuspender.c:176 ../src/utils/pactl.c:765
 #: ../src/utils/paplay.c:191
 #, c-format
 msgid "Got SIGINT, exiting.\n"
@@ -1373,7 +1553,8 @@ msgid ""
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
-"  -s, --server=SERVER                   The name of the server to connect to\n"
+"  -s, --server=SERVER                   The name of the server to connect "
+"to\n"
 "\n"
 msgstr ""
 
@@ -1385,32 +1566,32 @@ msgid ""
 "Linked with libpulse %s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:107
+#: ../src/utils/pactl.c:108
 #, c-format
 msgid "Failed to get statistics: %s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:113
+#: ../src/utils/pactl.c:114
 #, c-format
 msgid "Currently in use: %u blocks containing %s bytes total.\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:116
+#: ../src/utils/pactl.c:117
 #, c-format
 msgid "Allocated during whole lifetime: %u blocks containing %s bytes total.\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:119
+#: ../src/utils/pactl.c:120
 #, c-format
 msgid "Sample cache size: %s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:128
+#: ../src/utils/pactl.c:129
 #, c-format
 msgid "Failed to get server information: %s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:135
+#: ../src/utils/pactl.c:136
 #, c-format
 msgid ""
 "User name: %s\n"
@@ -1423,206 +1604,212 @@ msgid ""
 "Cookie: %08x\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:160
+#: ../src/utils/pactl.c:175
 #, c-format
 msgid "Failed to get sink information: %s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:176
+#: ../src/utils/pactl.c:191
 #, c-format
 msgid ""
-"*** Sink #%u ***\n"
-"Name: %s\n"
-"Driver: %s\n"
-"Sample Specification: %s\n"
-"Channel Map: %s\n"
-"Owner Module: %u\n"
-"Volume: %s\n"
-"Monitor Source: %s\n"
-"Latency: %0.0f usec, configured %0.0f usec\n"
-"Flags: %s%s%s%s%s%s\n"
-"Properties:\n"
-"%s"
-msgstr ""
-
-#: ../src/utils/pactl.c:193
-#: ../src/utils/pactl.c:371
-msgid "muted"
-msgstr ""
-
-#: ../src/utils/pactl.c:212
+"Sink #%u\n"
+"\tState: %s\n"
+"\tName: %s\n"
+"\tDescription: %s\n"
+"\tDriver: %s\n"
+"\tSample Specification: %s\n"
+"\tChannel Map: %s\n"
+"\tOwner Module: %u\n"
+"\tMute: %s\n"
+"\tVolume: %s%s%s\n"
+"\t        balance %0.2f\n"
+"\tBase Volume: %s%s%s\n"
+"\tMonitor Source: %s\n"
+"\tLatency: %0.0f usec, configured %0.0f usec\n"
+"\tFlags: %s%s%s%s%s%s\n"
+"\tProperties:\n"
+"\t\t%s\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:255
 #, c-format
 msgid "Failed to get source information: %s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:228
+#: ../src/utils/pactl.c:271
 #, c-format
 msgid ""
-"*** Source #%u ***\n"
-"Name: %s\n"
-"Driver: %s\n"
-"Sample Specification: %s\n"
-"Channel Map: %s\n"
-"Owner Module: %u\n"
-"Volume: %s\n"
-"Monitor of Sink: %s\n"
-"Latency: %0.0f usec, configured %0.0f usec\n"
-"Flags: %s%s%s%s%s%s\n"
-"Properties:\n"
-"%s"
-msgstr ""
-
-#: ../src/utils/pactl.c:246
-#: ../src/utils/pactl.c:289
-#: ../src/utils/pactl.c:322
-#: ../src/utils/pactl.c:366
-#: ../src/utils/pactl.c:367
-#: ../src/utils/pactl.c:374
-#: ../src/utils/pactl.c:418
-#: ../src/utils/pactl.c:419
-#: ../src/utils/pactl.c:425
-#: ../src/utils/pactl.c:468
-#: ../src/utils/pactl.c:469
-#: ../src/utils/pactl.c:473
+"Source #%u\n"
+"\tState: %s\n"
+"\tName: %s\n"
+"\tDescription: %s\n"
+"\tDriver: %s\n"
+"\tSample Specification: %s\n"
+"\tChannel Map: %s\n"
+"\tOwner Module: %u\n"
+"\tMute: %s\n"
+"\tVolume: %s%s%s\n"
+"\t        balance %0.2f\n"
+"\tBase Volume: %s%s%s\n"
+"\tMonitor of Sink: %s\n"
+"\tLatency: %0.0f usec, configured %0.0f usec\n"
+"\tFlags: %s%s%s%s%s%s\n"
+"\tProperties:\n"
+"\t\t%s\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:303 ../src/utils/pactl.c:347 ../src/utils/pactl.c:382
+#: ../src/utils/pactl.c:419 ../src/utils/pactl.c:478 ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:489 ../src/utils/pactl.c:533 ../src/utils/pactl.c:534
+#: ../src/utils/pactl.c:540 ../src/utils/pactl.c:583 ../src/utils/pactl.c:584
+#: ../src/utils/pactl.c:591
 msgid "n/a"
 msgstr ""
 
-#: ../src/utils/pactl.c:263
+#: ../src/utils/pactl.c:321
 #, c-format
 msgid "Failed to get module information: %s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:281
+#: ../src/utils/pactl.c:339
 #, c-format
 msgid ""
-"*** Module #%u ***\n"
-"Name: %s\n"
-"Argument: %s\n"
-"Usage counter: %s\n"
-"Auto unload: %s\n"
+"Module #%u\n"
+"\tName: %s\n"
+"\tArgument: %s\n"
+"\tUsage counter: %s\n"
+"\tProperties:\n"
+"\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:298
+#: ../src/utils/pactl.c:358
 #, c-format
 msgid "Failed to get client information: %s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:316
+#: ../src/utils/pactl.c:376
 #, c-format
 msgid ""
-"*** Client #%u ***\n"
-"Driver: %s\n"
-"Owner Module: %s\n"
-"Properties:\n"
-"%s"
+"Client #%u\n"
+"\tDriver: %s\n"
+"\tOwner Module: %s\n"
+"\tProperties:\n"
+"\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:333
+#: ../src/utils/pactl.c:393
+#, fuzzy, c-format
+msgid "Failed to get card information: %s\n"
+msgstr "Error en obrir el fitxer de configuració: %s"
+
+#: ../src/utils/pactl.c:411
 #, c-format
-msgid "Failed to get sink input information: %s\n"
+msgid ""
+"Card #%u\n"
+"\tName: %s\n"
+"\tDriver: %s\n"
+"\tOwner Module: %s\n"
+"\tProperties:\n"
+"\t\t%s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:352
+#: ../src/utils/pactl.c:425
 #, c-format
-msgid ""
-"*** Sink Input #%u ***\n"
-"Driver: %s\n"
-"Owner Module: %s\n"
-"Client: %s\n"
-"Sink: %u\n"
-"Sample Specification: %s\n"
-"Channel Map: %s\n"
-"Volume: %s\n"
-"Buffer Latency: %0.0f usec\n"
-"Sink Latency: %0.0f usec\n"
-"Resample method: %s\n"
-"Properties:\n"
-"%s"
-msgstr ""
-
-#: ../src/utils/pactl.c:385
+msgid "\tProfiles:\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:431
+#, fuzzy, c-format
+msgid "\tActive Profile: %s\n"
+msgstr "Ha fallat la canonada: %s"
+
+#: ../src/utils/pactl.c:442
 #, c-format
-msgid "Failed to get source output information: %s\n"
+msgid "Failed to get sink input information: %s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:405
+#: ../src/utils/pactl.c:461
 #, c-format
 msgid ""
-"*** Source Output #%u ***\n"
-"Driver: %s\n"
-"Owner Module: %s\n"
-"Client: %s\n"
-"Source: %u\n"
-"Sample Specification: %s\n"
-"Channel Map: %s\n"
-"Buffer Latency: %0.0f usec\n"
-"Source Latency: %0.0f usec\n"
-"Resample method: %s\n"
-"Properties:\n"
-"%s"
-msgstr ""
-
-#: ../src/utils/pactl.c:436
+"Sink Input #%u\n"
+"\tDriver: %s\n"
+"\tOwner Module: %s\n"
+"\tClient: %s\n"
+"\tSink: %u\n"
+"\tSample Specification: %s\n"
+"\tChannel Map: %s\n"
+"\tMute: %s\n"
+"\tVolume: %s\n"
+"\t        %s\n"
+"\t        balance %0.2f\n"
+"\tBuffer Latency: %0.0f usec\n"
+"\tSink Latency: %0.0f usec\n"
+"\tResample method: %s\n"
+"\tProperties:\n"
+"\t\t%s\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:500
 #, c-format
-msgid "Failed to get sample information: %s\n"
+msgid "Failed to get source output information: %s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:455
+#: ../src/utils/pactl.c:520
 #, c-format
 msgid ""
-"*** Sample #%u ***\n"
-"Name: %s\n"
-"Volume: %s\n"
-"Sample Specification: %s\n"
-"Channel Map: %s\n"
-"Duration: %0.1fs\n"
-"Size: %s\n"
-"Lazy: %s\n"
-"Filename: %s\n"
-"Properties:\n"
-"%s"
-msgstr ""
-
-#: ../src/utils/pactl.c:481
+"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 ""
+
+#: ../src/utils/pactl.c:551
 #, c-format
-msgid "Failed to get autoload information: %s\n"
+msgid "Failed to get sample information: %s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:497
+#: ../src/utils/pactl.c:569
 #, c-format
 msgid ""
-"*** Autoload Entry #%u ***\n"
-"Name: %s\n"
-"Type: %s\n"
-"Module: %s\n"
-"Argument: %s\n"
-msgstr ""
-
-#: ../src/utils/pactl.c:504
-msgid "sink"
-msgstr ""
-
-#: ../src/utils/pactl.c:504
-msgid "source"
-msgstr ""
-
-#: ../src/utils/pactl.c:511
-#: ../src/utils/pactl.c:521
+"Sample #%u\n"
+"\tName: %s\n"
+"\tSample Specification: %s\n"
+"\tChannel Map: %s\n"
+"\tVolume: %s\n"
+"\t        %s\n"
+"\t        balance %0.2f\n"
+"\tDuration: %0.1fs\n"
+"\tSize: %s\n"
+"\tLazy: %s\n"
+"\tFilename: %s\n"
+"\tProperties:\n"
+"\t\t%s\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:599 ../src/utils/pactl.c:609
 #, c-format
 msgid "Failure: %s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:545
+#: ../src/utils/pactl.c:633
 #, c-format
 msgid "Failed to upload sample: %s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:562
+#: ../src/utils/pactl.c:650
 #, c-format
 msgid "Premature end of file\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:678
+#: ../src/utils/pactl.c:771
 #, c-format
 msgid ""
 "%s [options] stat\n"
@@ -1637,15 +1824,18 @@ msgid ""
 "%s [options] unload-module ID\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"
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\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"
+"  -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"
 msgstr ""
 
-#: ../src/utils/pactl.c:729
+#: ../src/utils/pactl.c:823
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -1653,57 +1843,66 @@ msgid ""
 "Linked with libpulse %s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:768
+#: ../src/utils/pactl.c:862
 #, c-format
 msgid "Please specify a sample file to load\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:790
+#: ../src/utils/pactl.c:884
 #, c-format
 msgid "Failed to open sound file.\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:802
+#: ../src/utils/pactl.c:896
 #, c-format
 msgid "You have to specify a sample name to play\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:814
+#: ../src/utils/pactl.c:908
 #, c-format
 msgid "You have to specify a sample name to remove\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:822
+#: ../src/utils/pactl.c:916
 #, c-format
 msgid "You have to specify a sink input index and a sink\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:831
+#: ../src/utils/pactl.c:925
 #, c-format
 msgid "You have to specify a source output index and a source\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:845
+#: ../src/utils/pactl.c:939
 #, c-format
 msgid "You have to specify a module name and arguments.\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:865
+#: ../src/utils/pactl.c:959
 #, c-format
 msgid "You have to specify a module index\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:875
+#: ../src/utils/pactl.c:969
 #, c-format
-msgid "You may not specify more than one sink. You have to specify at least one boolean value.\n"
+msgid ""
+"You may not specify more than one sink. You have to specify a boolean "
+"value.\n"
+msgstr ""
+
+#: ../src/utils/pactl.c:982
+#, c-format
+msgid ""
+"You may not specify more than one source. You have to specify a boolean "
+"value.\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:888
+#: ../src/utils/pactl.c:994
 #, c-format
-msgid "You may not specify more than one source. You have to specify at least one boolean value.\n"
+msgid "You have to specify a card name/index and a profile name\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:904
+#: ../src/utils/pactl.c:1009
 #, c-format
 msgid "No valid command specified.\n"
 msgstr ""
@@ -1715,7 +1914,8 @@ msgid ""
 "\n"
 " -d    Show current PulseAudio data attached to X11 display (default)\n"
 " -e    Export local PulseAudio data to X11 display\n"
-" -i    Import PulseAudio data from X11 display to local environment variables and cookie file.\n"
+" -i    Import PulseAudio data from X11 display to local environment "
+"variables and cookie file.\n"
 " -r    Remove PulseAudio data from X11 display\n"
 msgstr ""
 
@@ -1797,19 +1997,17 @@ msgstr ""
 msgid "Daemon not responding."
 msgstr ""
 
-#: ../src/utils/pacmd.c:112
+#: ../src/utils/pacmd.c:144
 #, c-format
 msgid "select(): %s"
 msgstr "select(): %s"
 
-#: ../src/utils/pacmd.c:124
-#: ../src/utils/pacmd.c:140
+#: ../src/utils/pacmd.c:154 ../src/utils/pacmd.c:171
 #, c-format
 msgid "read(): %s"
 msgstr "read(): %s"
 
-#: ../src/utils/pacmd.c:153
-#: ../src/utils/pacmd.c:167
+#: ../src/utils/pacmd.c:187 ../src/utils/pacmd.c:201
 #, c-format
 msgid "write(): %s"
 msgstr "write(): %s"
@@ -1839,11 +2037,15 @@ msgid ""
 "\n"
 "  -v, --verbose                         Enable verbose operation\n"
 "\n"
-"  -s, --server=SERVER                   The name of the server to connect to\n"
+"  -s, --server=SERVER                   The name of the server to connect "
+"to\n"
 "  -d, --device=DEVICE                   The name of the sink 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"
+"  -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"
 "      --channel-map=CHANNELMAP          Set the channel map to the use\n"
 msgstr ""
 
@@ -1875,8 +2077,33 @@ msgstr ""
 msgid "Using sample spec '%s'\n"
 msgstr ""
 
-#: ../src/pulsecore/lock-autospawn.c:126
-#: ../src/pulsecore/lock-autospawn.c:207
+#: ../src/pulsecore/lock-autospawn.c:126 ../src/pulsecore/lock-autospawn.c:207
 msgid "Cannot access autospawn lock."
 msgstr ""
 
+#~ msgid ""
+#~ "' and PolicyKit refuse to grant us priviliges. Dropping SUID again.\n"
+#~ "For enabling real-time scheduling please acquire the appropriate "
+#~ "PolicyKit priviliges, or become a member of '"
+#~ msgstr ""
+#~ "' i PolicyKit ha denegat els permísos. S'està lliberant SUID. \n"
+#~ "Per habilitar la prioritat en temps real, s'ha de adquirir els permissos "
+#~ "de PolicyKit, o pertanyer a '"
+
+#~ msgid ""
+#~ "', or increase the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this "
+#~ "user."
+#~ msgstr ""
+#~ "', o incremetar els límits de recursos RLIMIT_NICE/RLIMIT_RTPRIO per "
+#~ "aquest usuari."
+
+#~ msgid "Default sink name (%s) does not exist in name register."
+#~ msgstr "El nom sink per omissió  (%s) no existeix en el registre de noms."
+
+#~ msgid "Buffer overrun, dropping incoming data\n"
+#~ msgstr ""
+#~ "S'ha sobrepassat la memòria intermitja, s'estan descartant les dades "
+#~ "entrants\n"
+
+#~ msgid "pa_stream_drop() failed: %s\n"
+#~ msgstr "Ha fallat pa_stream_drop(): %s\n"
diff --git a/po/cs.po b/po/cs.po
index e7f3951..926823c 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-02-12 16:57+0100\n"
+"POT-Creation-Date: 2009-02-20 03:24+0100\n"
 "PO-Revision-Date: 2008-10-19 22:31+0200\n"
 "Last-Translator: Petr Kovar <pknbe at volny.cz>\n"
 "Language-Team: Czech <translation-team-cs at lists.sourceforge.net>\n"
@@ -17,6 +17,66 @@ msgstr ""
 "X-Generator: KBabel 1.11.4\n"
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 
+#: ../src/modules/alsa/alsa-util.c:525
+msgid "Analog Mono"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:531
+msgid "Analog Stereo"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:537
+msgid "Digital Stereo (IEC958)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:543
+msgid "Digital Stereo (HDMI)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:550
+msgid "Analog Surround 4.0"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:557
+msgid "Digital Surround 4.0 (IEC958/AC3)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:565
+msgid "Analog Surround 4.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:573
+msgid "Analog Surround 5.0"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:581
+msgid "Analog Surround 5.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:589
+msgid "Digital Surround 5.1 (IEC958/AC3)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:598
+msgid "Analog Surround 7.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:1577
+#, c-format
+msgid ""
+"snd_pcm_avail_update() returned a value that is exceptionally large: %lu "
+"bytes (%lu ms). Most likely this is an ALSA driver bug. Please report this "
+"issue to the ALSA developers."
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:1609
+#, c-format
+msgid ""
+"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
+"(%lu ms). Most likely this is an ALSA driver bug. Please report this issue "
+"to the ALSA developers."
+msgstr ""
+
 #: ../src/daemon/ltdl-bind-now.c:124
 #, fuzzy
 msgid "Failed to find original lt_dlopen loader."
@@ -152,38 +212,38 @@ msgstr "Režim celého systému není na této platformě podporován."
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) selhalo: %s"
 
-#: ../src/daemon/main.c:429
+#: ../src/daemon/main.c:431
 msgid "Failed to parse command line."
 msgstr "Nezdařila se analýza příkazového řádku."
 
-#: ../src/daemon/main.c:451
+#: ../src/daemon/main.c:453
 #, c-format
 msgid "We're in the group '%s', allowing high-priority scheduling."
 msgstr ""
 "Nacházíme se ve skupině \"%s\", což umožňuje plánování o vysoké prioritě."
 
-#: ../src/daemon/main.c:458
+#: ../src/daemon/main.c:460
 #, c-format
 msgid "We're in the group '%s', allowing real-time scheduling."
 msgstr "Nacházíme se ve skupině \"%s\", což umožňuje plánování v reálném čase."
 
-#: ../src/daemon/main.c:466
+#: ../src/daemon/main.c:468
 msgid "PolicyKit grants us acquire-high-priority privilege."
 msgstr "PolicyKit nám udělil oprávnění acquire-high-priority."
 
-#: ../src/daemon/main.c:469
+#: ../src/daemon/main.c:471
 msgid "PolicyKit refuses acquire-high-priority privilege."
 msgstr "PolicyKit nám neudělil oprávnění acquire-high-priority."
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:476
 msgid "PolicyKit grants us acquire-real-time privilege."
 msgstr "PolicyKit nám udělil oprávnění acquire-real-time."
 
-#: ../src/daemon/main.c:477
+#: ../src/daemon/main.c:479
 msgid "PolicyKit refuses acquire-real-time privilege."
 msgstr "PolicyKit nám neudělil oprávnění acquire-real-time."
 
-#: ../src/daemon/main.c:506
+#: ../src/daemon/main.c:508
 #, fuzzy
 msgid ""
 "Called SUID root and real-time and/or high-priority scheduling was requested "
@@ -194,46 +254,46 @@ msgstr ""
 "zažádáno v konfiguraci. Nedisponujeme ovšem potřebnými oprávněními:\n"
 "Nejsme ve skupinÄ› \""
 
-#: ../src/daemon/main.c:530
+#: ../src/daemon/main.c:532
 msgid ""
 "High-priority scheduling enabled in configuration but not allowed by policy."
 msgstr ""
 "Plánování o vysoké prioritě v konfiguraci zapnuto, ale nepovoleno pravidly."
 
-#: ../src/daemon/main.c:559
+#: ../src/daemon/main.c:561
 msgid "Successfully increased RLIMIT_RTPRIO"
 msgstr "Úspěšně zvýšeno RLIMIT_RTPRIO"
 
-#: ../src/daemon/main.c:562
+#: ../src/daemon/main.c:564
 #, c-format
 msgid "RLIMIT_RTPRIO failed: %s"
 msgstr "RLIMIT_RTPRIO selhalo: %s"
 
-#: ../src/daemon/main.c:569
+#: ../src/daemon/main.c:571
 msgid "Giving up CAP_NICE"
 msgstr "Vzdávání se CAP_NICE"
 
-#: ../src/daemon/main.c:576
+#: ../src/daemon/main.c:578
 msgid ""
 "Real-time scheduling enabled in configuration but not allowed by policy."
 msgstr ""
 "Plánování v reálném čase v konfiguraci zapnuto, ale nepovoleno pravidly."
 
-#: ../src/daemon/main.c:637
+#: ../src/daemon/main.c:639
 msgid "Daemon not running"
 msgstr "Démon neběží"
 
-#: ../src/daemon/main.c:639
+#: ../src/daemon/main.c:641
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "Démon běží jako PID %u"
 
-#: ../src/daemon/main.c:649
+#: ../src/daemon/main.c:651
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "Zabití démona se nezdařilo: %s"
 
-#: ../src/daemon/main.c:667
+#: ../src/daemon/main.c:669
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
@@ -241,143 +301,143 @@ msgstr ""
 "Tento program není určen ke spuštění pod superuživatelem (není-li zadáno --"
 "system)."
 
-#: ../src/daemon/main.c:669
+#: ../src/daemon/main.c:671
 #, fuzzy
 msgid "Root privileges required."
 msgstr "Jsou vyžadována oprávnění superuživatele."
 
-#: ../src/daemon/main.c:674
+#: ../src/daemon/main.c:676
 msgid "--start not supported for system instances."
 msgstr "--start nepodporováno u systémových instancí."
 
-#: ../src/daemon/main.c:679
+#: ../src/daemon/main.c:681
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr "Běží v systémovém režimu, ale nenastaveno --disallow-exit!"
 
-#: ../src/daemon/main.c:682
+#: ../src/daemon/main.c:684
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr "Běží v systémovém režimu, ale nenastaveno --disallow-module-loading!"
 
-#: ../src/daemon/main.c:685
+#: ../src/daemon/main.c:687
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr "Běží v systémovém režimu, vynuceně se vypíná režim SHM!"
 
-#: ../src/daemon/main.c:690
+#: ../src/daemon/main.c:692
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr "Běží v systémovém režimu, vynuceně se vypíná čas nečinnosti ukončení!"
 
-#: ../src/daemon/main.c:717
+#: ../src/daemon/main.c:719
 msgid "Failed to acquire stdio."
 msgstr "Nezdařilo se získání stdio."
 
-#: ../src/daemon/main.c:723
+#: ../src/daemon/main.c:725
 #, c-format
 msgid "pipe failed: %s"
 msgstr "pipe selhalo: %s"
 
-#: ../src/daemon/main.c:728
+#: ../src/daemon/main.c:730
 #, c-format
 msgid "fork() failed: %s"
 msgstr "fork() selhalo: %s"
 
-#: ../src/daemon/main.c:742
+#: ../src/daemon/main.c:744
 #, c-format
 msgid "read() failed: %s"
 msgstr "read() selhalo: %s"
 
-#: ../src/daemon/main.c:748
+#: ../src/daemon/main.c:750
 msgid "Daemon startup failed."
 msgstr "Spuštění démona selhalo."
 
-#: ../src/daemon/main.c:750
+#: ../src/daemon/main.c:752
 msgid "Daemon startup successful."
 msgstr "Spuštění démona bylo úspěšné."
 
-#: ../src/daemon/main.c:820
+#: ../src/daemon/main.c:822
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "Toto je PulseAudio %s"
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:823
 #, c-format
 msgid "Compilation host: %s"
 msgstr "Překladový počítač: %s"
 
-#: ../src/daemon/main.c:822
+#: ../src/daemon/main.c:824
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "Překladové CFLAGS: %s"
 
-#: ../src/daemon/main.c:825
+#: ../src/daemon/main.c:827
 #, c-format
 msgid "Running on host: %s"
 msgstr "Běží na počítači: %s"
 
-#: ../src/daemon/main.c:828
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "Found %u CPUs."
 msgstr ""
 
-#: ../src/daemon/main.c:830
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "Velikost stránky je %lu bajtů"
 
-#: ../src/daemon/main.c:833
+#: ../src/daemon/main.c:835
 msgid "Compiled with Valgrind support: yes"
 msgstr "Přeloženo s podporou Valgrind: ano"
 
-#: ../src/daemon/main.c:835
+#: ../src/daemon/main.c:837
 msgid "Compiled with Valgrind support: no"
 msgstr "Přeloženo s podporou Valgrind: ne"
 
-#: ../src/daemon/main.c:838
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "Běží v režimu valgrind: %s"
 
-#: ../src/daemon/main.c:841
+#: ../src/daemon/main.c:843
 msgid "Optimized build: yes"
 msgstr "Optimalizované sestavení: ano"
 
-#: ../src/daemon/main.c:843
+#: ../src/daemon/main.c:845
 msgid "Optimized build: no"
 msgstr "Optimalizované sestavení: ne"
 
-#: ../src/daemon/main.c:847
+#: ../src/daemon/main.c:849
 msgid "Failed to get machine ID"
 msgstr "Nezdařilo se získání ID počítače"
 
-#: ../src/daemon/main.c:850
+#: ../src/daemon/main.c:852
 #, c-format
 msgid "Machine ID is %s."
 msgstr "ID počítače je %s."
 
-#: ../src/daemon/main.c:855
+#: ../src/daemon/main.c:857
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "Používán běhový adresář %s."
 
-#: ../src/daemon/main.c:860
+#: ../src/daemon/main.c:862
 #, c-format
 msgid "Using state directory %s."
 msgstr "Používán stavový adresář %s."
 
-#: ../src/daemon/main.c:863
+#: ../src/daemon/main.c:865
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "Běží v systémovém režimu: %s"
 
-#: ../src/daemon/main.c:878
+#: ../src/daemon/main.c:880
 msgid "pa_pid_file_create() failed."
 msgstr "pa_pid_file_create() selhalo."
 
-#: ../src/daemon/main.c:890
+#: ../src/daemon/main.c:892
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr ""
 "Jsou dostupné výtečné časovače o vysokém rozlišení. Tak s chutí do toho!"
 
-#: ../src/daemon/main.c:892
+#: ../src/daemon/main.c:894
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
@@ -385,27 +445,27 @@ msgstr ""
 "Sorry, vole, kernel error! Tip šéfkuchaře na dnešní den zní: Linux se "
 "zapnutými časovači o vysokém rozlišení."
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:906
 msgid "pa_core_new() failed."
 msgstr "pa_core_new() selhalo."
 
-#: ../src/daemon/main.c:965
+#: ../src/daemon/main.c:967
 msgid "Failed to initialize daemon."
 msgstr "Selhalo spuštění démona."
 
-#: ../src/daemon/main.c:970
+#: ../src/daemon/main.c:972
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr "Spuštění démona bez jakýchkoliv nahraných modulů, běh bude odmítnut."
 
-#: ../src/daemon/main.c:983
+#: ../src/daemon/main.c:985
 msgid "Daemon startup complete."
 msgstr "Spuštění démona dokončeno."
 
-#: ../src/daemon/main.c:989
+#: ../src/daemon/main.c:991
 msgid "Daemon shutdown initiated."
 msgstr "Vypínání démona spuštěno."
 
-#: ../src/daemon/main.c:1010
+#: ../src/daemon/main.c:1009
 msgid "Daemon terminated."
 msgstr "Démon ukončen."
 
@@ -1080,7 +1140,7 @@ msgstr "Selhala analýza dat cookie"
 msgid "Failed to open configuration file '%s': %s"
 msgstr "Selhalo otevření konfiguračního souboru \"%s\": %s"
 
-#: ../src/pulse/context.c:523
+#: ../src/pulse/context.c:519
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "Žádný soubor cookie nenahrán. Pokus o spojení bez tohoto kroku."
 
@@ -1200,67 +1260,67 @@ msgid "pa_stream_connect_record() failed: %s\n"
 msgstr "pa_stream_connect_record() selhalo: %s\n"
 
 #: ../src/utils/pacat.c:321 ../src/utils/pasuspender.c:159
-#: ../src/utils/pactl.c:758 ../src/utils/paplay.c:183
+#: ../src/utils/pactl.c:759 ../src/utils/paplay.c:183
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "Spojení selhalo: %s\n"
 
-#: ../src/utils/pacat.c:342 ../src/utils/paplay.c:75
+#: ../src/utils/pacat.c:341 ../src/utils/paplay.c:75
 #, c-format
 msgid "Failed to drain stream: %s\n"
 msgstr "Nezdařilo se vyprázdnit proud: %s\n"
 
-#: ../src/utils/pacat.c:347 ../src/utils/paplay.c:80
+#: ../src/utils/pacat.c:346 ../src/utils/paplay.c:80
 #, c-format
 msgid "Playback stream drained.\n"
 msgstr "Proud přehrávání vyprázdněn.\n"
 
-#: ../src/utils/pacat.c:357 ../src/utils/paplay.c:92
+#: ../src/utils/pacat.c:356 ../src/utils/paplay.c:92
 #, c-format
 msgid "Draining connection to server.\n"
 msgstr "Vyprazdňování spojení se serverem.\n"
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:382
 #, c-format
 msgid "Got EOF.\n"
 msgstr "Získáno EOF.\n"
 
-#: ../src/utils/pacat.c:389
+#: ../src/utils/pacat.c:388
 #, c-format
 msgid "pa_stream_drain(): %s\n"
 msgstr "pa_stream_drain(): %s\n"
 
-#: ../src/utils/pacat.c:399
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "read() failed: %s\n"
 msgstr "read() selhalo: %s\n"
 
-#: ../src/utils/pacat.c:431
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "write() failed: %s\n"
 msgstr "write() selhalo: %s\n"
 
-#: ../src/utils/pacat.c:452
+#: ../src/utils/pacat.c:451
 #, c-format
 msgid "Got signal, exiting.\n"
 msgstr "Získán signál, ukončování.\n"
 
-#: ../src/utils/pacat.c:466
+#: ../src/utils/pacat.c:465
 #, c-format
 msgid "Failed to get latency: %s\n"
 msgstr "Nezdařilo se získat latenci: %s\n"
 
-#: ../src/utils/pacat.c:471
+#: ../src/utils/pacat.c:470
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec.  \r"
 msgstr "Čas: %0.3f sekund; latence: %0.0f μs.  \r"
 
-#: ../src/utils/pacat.c:491
+#: ../src/utils/pacat.c:490
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s\n"
 msgstr "pa_stream_update_timing_info() selhalo: %s\n"
 
-#: ../src/utils/pacat.c:504
+#: ../src/utils/pacat.c:503
 #, fuzzy, c-format
 msgid ""
 "%s [options]\n"
@@ -1340,7 +1400,7 @@ msgstr ""
 " Požadavek in bajty\n"
 " čas Požadavek čas in bajty n"
 
-#: ../src/utils/pacat.c:605
+#: ../src/utils/pacat.c:604
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1351,88 +1411,89 @@ msgstr ""
 "Přeloženo s libpulse %s\n"
 "Propojeno s libpulse %s\n"
 
-#: ../src/utils/pacat.c:662
+#: ../src/utils/pacat.c:661
 #, c-format
 msgid "Invalid channel map '%s'\n"
 msgstr "Neplatná mapa kanálů \"%s\"\n"
 
-#: ../src/utils/pacat.c:691
+#: ../src/utils/pacat.c:690
 #, c-format
 msgid "Invalid latency specification '%s'\n"
 msgstr "Neplatné upřesnění latence \"%s\"\n"
 
-#: ../src/utils/pacat.c:698
+#: ../src/utils/pacat.c:697
 #, c-format
 msgid "Invalid process time specification '%s'\n"
 msgstr "Neplatné upřesnění času zpracování \"%s\"\n"
 
-#: ../src/utils/pacat.c:709
+#: ../src/utils/pacat.c:708
 #, c-format
 msgid "Invalid sample specification\n"
 msgstr "Neplatné upřesnění vzorkování\n"
 
-#: ../src/utils/pacat.c:714
+#: ../src/utils/pacat.c:713
 #, c-format
 msgid "Channel map doesn't match sample specification\n"
 msgstr "Mapa kanálů se neshoduje s upřesněním vzorkování\n"
 
-#: ../src/utils/pacat.c:721
+#: ../src/utils/pacat.c:720
 #, c-format
 msgid "Opening a %s stream with sample specification '%s'.\n"
 msgstr "Otevírání proudu %s s upřesněním vzorkování \"%s\".\n"
 
-#: ../src/utils/pacat.c:721
+#: ../src/utils/pacat.c:720
 msgid "recording"
 msgstr "nahrávání"
 
-#: ../src/utils/pacat.c:721
+#: ../src/utils/pacat.c:720
 msgid "playback"
 msgstr "přehrávání"
 
-#: ../src/utils/pacat.c:729
+#: ../src/utils/pacat.c:728
 #, c-format
 msgid "open(): %s\n"
 msgstr "open(): %s\n"
 
-#: ../src/utils/pacat.c:734
+#: ../src/utils/pacat.c:733
 #, c-format
 msgid "dup2(): %s\n"
 msgstr "dup2(): %s\n"
 
-#: ../src/utils/pacat.c:744
+#: ../src/utils/pacat.c:743
 #, c-format
 msgid "Too many arguments.\n"
 msgstr "Příliš mnoho argumentů.\n"
 
-#: ../src/utils/pacat.c:757 ../src/utils/pasuspender.c:280
-#: ../src/utils/pactl.c:1013 ../src/utils/paplay.c:381
+#: ../src/utils/pacat.c:756 ../src/utils/pasuspender.c:280
+#: ../src/utils/pactl.c:1014 ../src/utils/paplay.c:381
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new() selhalo.\n"
 
-#: ../src/utils/pacat.c:778
+#: ../src/utils/pacat.c:777
 #, c-format
 msgid "io_new() failed.\n"
 msgstr "io_new() selhalo.\n"
 
-#: ../src/utils/pacat.c:784 ../src/utils/pasuspender.c:293
-#: ../src/utils/pactl.c:1027 ../src/utils/paplay.c:396
+#: ../src/utils/pacat.c:783 ../src/utils/pasuspender.c:293
+#: ../src/utils/pactl.c:1028 ../src/utils/paplay.c:396
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new() selhalo.\n"
 
-#: ../src/utils/pacat.c:792
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1034
+#: ../src/utils/paplay.c:404
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_connect() selhalo: %s"
 
-#: ../src/utils/pacat.c:803
+#: ../src/utils/pacat.c:802
 #, c-format
 msgid "time_new() failed.\n"
 msgstr "time_new() selhalo.\n"
 
-#: ../src/utils/pacat.c:810 ../src/utils/pasuspender.c:301
-#: ../src/utils/pactl.c:1035 ../src/utils/paplay.c:407
+#: ../src/utils/pacat.c:809 ../src/utils/pasuspender.c:301
+#: ../src/utils/pactl.c:1039 ../src/utils/paplay.c:410
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() selhalo.\n"
@@ -1462,7 +1523,7 @@ msgstr "Nezdařilo se obnovení: %s\n"
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr "VAROVÁNÍ: Zvukový server není místní, nedojde k pozastavení.\n"
 
-#: ../src/utils/pasuspender.c:176 ../src/utils/pactl.c:764
+#: ../src/utils/pasuspender.c:176 ../src/utils/pactl.c:765
 #: ../src/utils/paplay.c:191
 #, c-format
 msgid "Got SIGINT, exiting.\n"
@@ -1790,7 +1851,7 @@ msgstr "Selhalo až s n"
 msgid "Premature end of file\n"
 msgstr "Předčasný konec souboru\n"
 
-#: ../src/utils/pactl.c:770
+#: ../src/utils/pactl.c:771
 #, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
@@ -1823,7 +1884,7 @@ msgstr ""
 " s SERVER název z až až\n"
 " n název NÁZEV Jak až zapnuto n"
 
-#: ../src/utils/pactl.c:822
+#: ../src/utils/pactl.c:823
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -1834,66 +1895,66 @@ msgstr ""
 "Přeloženo s libpulse %s\n"
 "Propojeno s libpulse %s\n"
 
-#: ../src/utils/pactl.c:861
+#: ../src/utils/pactl.c:862
 #, fuzzy, c-format
 msgid "Please specify a sample file to load\n"
 msgstr "Prosím a soubor až n"
 
-#: ../src/utils/pactl.c:883
+#: ../src/utils/pactl.c:884
 #, c-format
 msgid "Failed to open sound file.\n"
 msgstr "Selhalo otevření zvukového souboru.\n"
 
-#: ../src/utils/pactl.c:895
+#: ../src/utils/pactl.c:896
 #, fuzzy, c-format
 msgid "You have to specify a sample name to play\n"
 msgstr "Vy až a název až n"
 
-#: ../src/utils/pactl.c:907
+#: ../src/utils/pactl.c:908
 #, fuzzy, c-format
 msgid "You have to specify a sample name to remove\n"
 msgstr "Vy až a název až odstranit n"
 
-#: ../src/utils/pactl.c:915
+#: ../src/utils/pactl.c:916
 #, fuzzy, c-format
 msgid "You have to specify a sink input index and a sink\n"
 msgstr "Vy až a cíl rejstřík a a cíl n"
 
-#: ../src/utils/pactl.c:924
+#: ../src/utils/pactl.c:925
 #, fuzzy, c-format
 msgid "You have to specify a source output index and a source\n"
 msgstr "Vy až a zdroj rejstřík a a zdroj n"
 
-#: ../src/utils/pactl.c:938
+#: ../src/utils/pactl.c:939
 #, fuzzy, c-format
 msgid "You have to specify a module name and arguments.\n"
 msgstr "Vy až a modul název a n"
 
-#: ../src/utils/pactl.c:958
+#: ../src/utils/pactl.c:959
 #, fuzzy, c-format
 msgid "You have to specify a module index\n"
 msgstr "Vy až a modul rejstřík n"
 
-#: ../src/utils/pactl.c:968
+#: ../src/utils/pactl.c:969
 #, fuzzy, c-format
 msgid ""
 "You may not specify more than one sink. You have to specify a boolean "
 "value.\n"
 msgstr "Vy ne cíl Vy až při booleovská hodnota hodnota n"
 
-#: ../src/utils/pactl.c:981
+#: ../src/utils/pactl.c:982
 #, fuzzy, c-format
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value.\n"
 msgstr "Vy ne zdroj Vy až při booleovská hodnota hodnota n"
 
-#: ../src/utils/pactl.c:993
+#: ../src/utils/pactl.c:994
 #, fuzzy, c-format
 msgid "You have to specify a card name/index and a profile name\n"
 msgstr "Vy až a cíl rejstřík a a cíl n"
 
-#: ../src/utils/pactl.c:1008
+#: ../src/utils/pactl.c:1009
 #, c-format
 msgid "No valid command specified.\n"
 msgstr "Nezadán žádný platný příkaz.\n"
diff --git a/po/de.po b/po/de.po
index 43535c5..23e7190 100644
--- a/po/de.po
+++ b/po/de.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-02-17 08:45+0000\n"
+"POT-Creation-Date: 2009-02-20 03:24+0100\n"
 "PO-Revision-Date: 2009-02-19 12:04+0100\n"
 "Last-Translator: Fabian Affolter <fab at fedoraproject.org>\n"
 "Language-Team: German <fedora-trans-de at redhat.com>\n"
@@ -18,6 +18,72 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Poedit-Language: German\n"
 
+#: ../src/modules/alsa/alsa-util.c:525
+msgid "Analog Mono"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:531
+#, fuzzy
+msgid "Analog Stereo"
+msgstr "Stereo"
+
+#: ../src/modules/alsa/alsa-util.c:537
+msgid "Digital Stereo (IEC958)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:543
+msgid "Digital Stereo (HDMI)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:550
+#, fuzzy
+msgid "Analog Surround 4.0"
+msgstr "Surround 4.0"
+
+#: ../src/modules/alsa/alsa-util.c:557
+msgid "Digital Surround 4.0 (IEC958/AC3)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:565
+#, fuzzy
+msgid "Analog Surround 4.1"
+msgstr "Surround 4.1"
+
+#: ../src/modules/alsa/alsa-util.c:573
+#, fuzzy
+msgid "Analog Surround 5.0"
+msgstr "Surround 5.0"
+
+#: ../src/modules/alsa/alsa-util.c:581
+#, fuzzy
+msgid "Analog Surround 5.1"
+msgstr "Surround 5.1"
+
+#: ../src/modules/alsa/alsa-util.c:589
+msgid "Digital Surround 5.1 (IEC958/AC3)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:598
+#, fuzzy
+msgid "Analog Surround 7.1"
+msgstr "Surround 7.1"
+
+#: ../src/modules/alsa/alsa-util.c:1577
+#, c-format
+msgid ""
+"snd_pcm_avail_update() returned a value that is exceptionally large: %lu "
+"bytes (%lu ms). Most likely this is an ALSA driver bug. Please report this "
+"issue to the ALSA developers."
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:1609
+#, c-format
+msgid ""
+"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
+"(%lu ms). Most likely this is an ALSA driver bug. Please report this issue "
+"to the ALSA developers."
+msgstr ""
+
 #: ../src/daemon/ltdl-bind-now.c:124
 msgid "Failed to find original lt_dlopen loader."
 msgstr "Ursprünglicher dlopen-Loader konnte nicht gefunden werden."
@@ -118,8 +184,7 @@ msgstr "GID von Benutzer '%s' und Gruppe '%s' stimmen nicht überein."
 msgid "Home directory of user '%s' is not '%s', ignoring."
 msgstr "Benutzerverzeichnis von Benutzer '%s' ist nicht '%s', ignoriere."
 
-#: ../src/daemon/main.c:201
-#: ../src/daemon/main.c:206
+#: ../src/daemon/main.c:201 ../src/daemon/main.c:206
 #, c-format
 msgid "Failed to create '%s': %s"
 msgstr "Konnte '%s' nciht erzeugen: %s"
@@ -152,256 +217,256 @@ msgstr "System-Modus auf dieser Plattform nicht unterstützt."
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) fehlgeschlagen: %s"
 
-#: ../src/daemon/main.c:429
+#: ../src/daemon/main.c:431
 msgid "Failed to parse command line."
 msgstr "Parsen der Kommandzeile fehlgeschlagen."
 
-#: ../src/daemon/main.c:451
+#: ../src/daemon/main.c:453
 #, c-format
 msgid "We're in the group '%s', allowing high-priority scheduling."
-msgstr "Wir befinden uns in der Gruppe '%s', was Scheduling höchster Priorität ermöglicht."
+msgstr ""
+"Wir befinden uns in der Gruppe '%s', was Scheduling höchster Priorität "
+"ermöglicht."
 
-#: ../src/daemon/main.c:458
+#: ../src/daemon/main.c:460
 #, c-format
 msgid "We're in the group '%s', allowing real-time scheduling."
-msgstr "Wir befinden uns in der Gruppe '%s', was Echtzeit-Scheduling ermöglicht."
+msgstr ""
+"Wir befinden uns in der Gruppe '%s', was Echtzeit-Scheduling ermöglicht."
 
-#: ../src/daemon/main.c:466
+#: ../src/daemon/main.c:468
 msgid "PolicyKit grants us acquire-high-priority privilege."
 msgstr "Richtlinien gewähren das Recht aquire-high-priority."
 
-#: ../src/daemon/main.c:469
+#: ../src/daemon/main.c:471
 msgid "PolicyKit refuses acquire-high-priority privilege."
 msgstr "Richtlinien verweigern das Recht acquire-high-priority."
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:476
 msgid "PolicyKit grants us acquire-real-time privilege."
 msgstr "Richtlinien gewähren das Recht aquire-real-time."
 
-#: ../src/daemon/main.c:477
+#: ../src/daemon/main.c:479
 msgid "PolicyKit refuses acquire-real-time privilege."
 msgstr "Richtlinien verweigern das Recht acquire-real-time."
 
-#: ../src/daemon/main.c:506
+#: ../src/daemon/main.c:508
 #, fuzzy
 msgid ""
-"Called SUID root and real-time and/or high-priority scheduling was requested in the configuration. However, we lack the necessary privileges:\n"
+"Called SUID root and real-time and/or high-priority scheduling was requested "
+"in the configuration. However, we lack the necessary privileges:\n"
 "We are not in group '"
 msgstr ""
-"Konfiguration fordert Aufruf der SUID root und Echtzeit-Scheduling höchster Priorität. Allerdings fehlen die nötigen Rechte:\n"
+"Konfiguration fordert Aufruf der SUID root und Echtzeit-Scheduling höchster "
+"Priorität. Allerdings fehlen die nötigen Rechte:\n"
 "Wir befinden uns nicht in der Gruppe '"
 
-#: ../src/daemon/main.c:507
-#, fuzzy
+#: ../src/daemon/main.c:532
 msgid ""
-"', PolicyKit refuse to grant us the requested privileges and we have no increase RLIMIT_NICE/RLIMIT_RTPRIO resource limits.\n"
-"For enabling real-time/high-priority scheduling please acquire the appropriate PolicyKit privileges, or become a member of '"
-msgstr ""
-"' und PolicyKit verweigern diese Rechte. Verwerfe SUID wieder.\n"
-"Erlangen Sie die den Richtlinien entsprechenden Rechte, um Echtzeit-Scheduling zu aktivieren oder werden Sie Mitglied der Gruppe '"
-
-#: ../src/daemon/main.c:508
-msgid "', or increase the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this user."
-msgstr "' oder erhöhen sie die RLIMIT_NICE/RLIMIT_RTPRIO-Ressourcenbegrenzungen für diesen Nutzer."
-
-#: ../src/daemon/main.c:530
-msgid "High-priority scheduling enabled in configuration but not allowed by policy."
+"High-priority scheduling enabled in configuration but not allowed by policy."
 msgstr "Scheduling höchster Priorität konfiguriert, jedoch nicht erlaubt."
 
-#: ../src/daemon/main.c:559
+#: ../src/daemon/main.c:561
 msgid "Successfully increased RLIMIT_RTPRIO"
 msgstr "RLIMIT_RTPRIO erfolgreich erhöht"
 
-#: ../src/daemon/main.c:562
+#: ../src/daemon/main.c:564
 #, c-format
 msgid "RLIMIT_RTPRIO failed: %s"
 msgstr "RLIMIT_RTPRIO fehlgeschlagen: %s"
 
-#: ../src/daemon/main.c:569
+#: ../src/daemon/main.c:571
 msgid "Giving up CAP_NICE"
 msgstr "Verwerfe CAP_NICE"
 
-#: ../src/daemon/main.c:576
-msgid "Real-time scheduling enabled in configuration but not allowed by policy."
+#: ../src/daemon/main.c:578
+msgid ""
+"Real-time scheduling enabled in configuration but not allowed by policy."
 msgstr "Echtzeit-Scheduling konfiguriert, jedoch nicht erlaubt."
 
-#: ../src/daemon/main.c:637
+#: ../src/daemon/main.c:639
 msgid "Daemon not running"
 msgstr "Daemon läuft nicht"
 
-#: ../src/daemon/main.c:639
+#: ../src/daemon/main.c:641
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "Daemon läuft als PID %u"
 
-#: ../src/daemon/main.c:649
+#: ../src/daemon/main.c:651
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "Konnte Prozess nicht abbrechen: %s"
 
-#: ../src/daemon/main.c:667
-msgid "This program is not intended to be run as root (unless --system is specified)."
-msgstr "Dieses Programm sollte ohne die Option --system nicht als Administrator ausgeführt werden."
-
 #: ../src/daemon/main.c:669
+msgid ""
+"This program is not intended to be run as root (unless --system is "
+"specified)."
+msgstr ""
+"Dieses Programm sollte ohne die Option --system nicht als Administrator "
+"ausgeführt werden."
+
+#: ../src/daemon/main.c:671
 msgid "Root privileges required."
 msgstr "Root-Berechtigungen benötigt."
 
-#: ../src/daemon/main.c:674
+#: ../src/daemon/main.c:676
 msgid "--start not supported for system instances."
 msgstr "--start nicht unterstützt für System-Instanzen."
 
-#: ../src/daemon/main.c:679
+#: ../src/daemon/main.c:681
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr "System-Modus aktiv, jeodch --disallow-exit nicht gesetzt!"
 
-#: ../src/daemon/main.c:682
+#: ../src/daemon/main.c:684
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr "System-Modus aktiv, jedoch --disallow-module-loading nicht gesetzt!"
 
-#: ../src/daemon/main.c:685
+#: ../src/daemon/main.c:687
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr "System-Modus aktiv, SHM-Modus gezwungenermaßen deaktiviert!"
 
-#: ../src/daemon/main.c:690
+#: ../src/daemon/main.c:692
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr "System-Modus aktiv, Exit-Idle-Time gezwungenermaßen deaktiviert!"
 
-#: ../src/daemon/main.c:717
+#: ../src/daemon/main.c:719
 msgid "Failed to acquire stdio."
 msgstr "Reservieren von STDIO fehlgeschlagen."
 
-#: ../src/daemon/main.c:723
+#: ../src/daemon/main.c:725
 #, c-format
 msgid "pipe failed: %s"
 msgstr "pipe fehlgeschlagen: %s"
 
-#: ../src/daemon/main.c:728
+#: ../src/daemon/main.c:730
 #, c-format
 msgid "fork() failed: %s"
 msgstr "fork() fehlgeschlagen: %s"
 
-#: ../src/daemon/main.c:742
+#: ../src/daemon/main.c:744
 #, c-format
 msgid "read() failed: %s"
 msgstr "read() fehlgeschlagen: %s"
 
-#: ../src/daemon/main.c:748
+#: ../src/daemon/main.c:750
 msgid "Daemon startup failed."
 msgstr "Start des Daemons fehlgeschlagen."
 
-#: ../src/daemon/main.c:750
+#: ../src/daemon/main.c:752
 msgid "Daemon startup successful."
 msgstr "Start des Daemons erfolgreich."
 
-#: ../src/daemon/main.c:820
+#: ../src/daemon/main.c:822
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "Dies ist PulseAudio %s"
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:823
 #, c-format
 msgid "Compilation host: %s"
 msgstr "Kompilier-Host: %s"
 
-#: ../src/daemon/main.c:822
+#: ../src/daemon/main.c:824
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "Kompilier-CFLAGS: %s"
 
-#: ../src/daemon/main.c:825
+#: ../src/daemon/main.c:827
 #, c-format
 msgid "Running on host: %s"
 msgstr "Laufe auf Host: %s"
 
-#: ../src/daemon/main.c:828
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "Found %u CPUs."
 msgstr "%u CPUs gefunden."
 
-#: ../src/daemon/main.c:830
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "Seitengröße ist %lu Bytes."
 
-#: ../src/daemon/main.c:833
+#: ../src/daemon/main.c:835
 msgid "Compiled with Valgrind support: yes"
 msgstr "Kompiliere mit Valgrind-Unterstützung: ja"
 
-#: ../src/daemon/main.c:835
+#: ../src/daemon/main.c:837
 msgid "Compiled with Valgrind support: no"
 msgstr "Kompiliere mit Valgrind-Unterstützung: nein"
 
-#: ../src/daemon/main.c:838
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "Läuft im Valgrind-Modus: %s"
 
-#: ../src/daemon/main.c:841
+#: ../src/daemon/main.c:843
 msgid "Optimized build: yes"
 msgstr "Optimiertes Build: ja"
 
-#: ../src/daemon/main.c:843
+#: ../src/daemon/main.c:845
 msgid "Optimized build: no"
 msgstr "Optimiertes Build: nein"
 
-#: ../src/daemon/main.c:847
+#: ../src/daemon/main.c:849
 msgid "Failed to get machine ID"
 msgstr "Beziehen der Maschinen-ID fehlgeschlagen"
 
-#: ../src/daemon/main.c:850
+#: ../src/daemon/main.c:852
 #, c-format
 msgid "Machine ID is %s."
 msgstr "System- ID ist %s."
 
-#: ../src/daemon/main.c:855
+#: ../src/daemon/main.c:857
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "Nutze Laufzeit-Verzeichnis %s."
 
-#: ../src/daemon/main.c:860
+#: ../src/daemon/main.c:862
 #, c-format
 msgid "Using state directory %s."
 msgstr "Nutze Zustands-Verzeichnis %s."
 
-#: ../src/daemon/main.c:863
+#: ../src/daemon/main.c:865
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "Laufe im System-Modus: %s"
 
-#: ../src/daemon/main.c:878
+#: ../src/daemon/main.c:880
 msgid "pa_pid_file_create() failed."
 msgstr "pa_pid_file_create() fehlgeschlagen."
 
-#: ../src/daemon/main.c:890
+#: ../src/daemon/main.c:892
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "Neue hochauslösende Timer verfügbar! Guten Appetit!"
 
-#: ../src/daemon/main.c:892
-msgid "Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"
+#: ../src/daemon/main.c:894
+msgid ""
+"Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
+"resolution timers enabled!"
 msgstr "Der Chefkoch empfiehlt: Linux mit aktivierten hochauslösenden Timern!"
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:906
 msgid "pa_core_new() failed."
 msgstr "pa_core_new() fehlgeschlagen."
 
-#: ../src/daemon/main.c:965
+#: ../src/daemon/main.c:967
 msgid "Failed to initialize daemon."
 msgstr "Konnte Daemon nicht initialisieren."
 
-#: ../src/daemon/main.c:970
+#: ../src/daemon/main.c:972
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr "Daemon verweigert Ausführung, da keine Module geladen."
 
-#: ../src/daemon/main.c:983
+#: ../src/daemon/main.c:985
 msgid "Daemon startup complete."
 msgstr "Start des Daemons abgeschlossen."
 
-#: ../src/daemon/main.c:989
+#: ../src/daemon/main.c:991
 msgid "Daemon shutdown initiated."
 msgstr "Herunterfahren des Daemon gestartet."
 
-#: ../src/daemon/main.c:1010
+#: ../src/daemon/main.c:1009
 msgid "Daemon terminated."
 msgstr "Daemon beendet."
 
@@ -416,37 +481,48 @@ msgid ""
 "      --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"
+"      --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"
+"      --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"
+"                                        (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"
+"                                        (only available as root, when SUID "
+"or\n"
 "                                        with elevated RLIMIT_RTPRIO)\n"
-"      --disallow-module-loading[=BOOL]  Disallow module user requested module\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"
+"      --exit-idle-time=SECS             Terminate the daemon when idle and "
+"this\n"
 "                                        time passed\n"
-"      --module-idle-time=SECS           Unload autoloaded modules when idle and\n"
+"      --module-idle-time=SECS           Unload autoloaded modules when idle "
+"and\n"
 "                                        this time passed\n"
-"      --scache-idle-time=SECS           Unload autoloaded samples when idle and\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} Specify the log target\n"
-"      --log-meta[=BOOL]                 Include code location in log messages\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"
+"  -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"
@@ -457,10 +533,12 @@ msgid ""
 "      --disable-shm[=BOOL]              Disable shared memory support.\n"
 "\n"
 "STARTUP SCRIPT:\n"
-"  -L, --load=\"MODULE ARGUMENTS\"         Load the specified plugin module with\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"
+"  -C                                    Open a command line on the running "
+"TTY\n"
 "                                        after startup\n"
 "\n"
 "  -n                                    Don't load default script file\n"
@@ -473,41 +551,54 @@ msgstr ""
 "      --dump-conf                       Zeige Standardkonfiguration\n"
 "      --dump-modules                    Zeige Liste verfügbarer Module\n"
 "      --dump-resample-methods           Zeige verfügbare Resample-Methoden\n"
-"      --cleanup-shm                     Cleanup stale shared memory segments\n"
-"      --start                           Starte Daemon, falls noch nicht geschehen\n"
+"      --cleanup-shm                     Cleanup stale shared memory "
+"segments\n"
+"      --start                           Starte Daemon, falls noch nicht "
+"geschehen\n"
 "  -k  --kill                            Laufenden Daemon beenden\n"
-"      --check                           Prüfe laufende Daemone (gibt nur einen Exit-Code zurück)\n"
+"      --check                           Prüfe laufende Daemone (gibt nur "
+"einen Exit-Code zurück)\n"
 "\n"
 "OPTIONS:\n"
 "      --system[=BOOL]                   Als systemweite Instanz ausführen\n"
 "  -D, --daemonize[=BOOL]                Nach Start zum Daemon machen\n"
 "      --fail[=BOOL]                     Beenden, wenn Start fehlschlägt\n"
 "      --high-priority[=BOOL]            Nutze höchste Priorität\n"
-"                                        (Nur verfügbar als root, wenn SUID oder\n"
+"                                        (Nur verfügbar als root, wenn SUID "
+"oder\n"
 "                                        mit erhöhtem RLIMIT_NICE)\n"
-"      --realtime[=BOOL]                 Versuche, Echtzeit-Scheduling zu aktivieren\n"
-"                                        (Nur verfügbar als root, wenn SUID oder\n"
+"      --realtime[=BOOL]                 Versuche, Echtzeit-Scheduling zu "
+"aktivieren\n"
+"                                        (Nur verfügbar als root, wenn SUID "
+"oder\n"
 "                                        mit erhöhtem RLIMIT_RTPRIO)\n"
-"      --disallow-module-loading[=BOOL]  Verbiete (Ent-)laden durch Nutzer angeforderter\n"
+"      --disallow-module-loading[=BOOL]  Verbiete (Ent-)laden durch Nutzer "
+"angeforderter\n"
 "                                        Module nach dem Start\n"
-"      --disallow-exit[=BOOL]            Verbiete Beenden auf Anfrage des Nutzers\n"
+"      --disallow-exit[=BOOL]            Verbiete Beenden auf Anfrage des "
+"Nutzers\n"
 "      --exit-idle-time=SECS             Beende Daemon, wenn für diese Zeit \n"
 "                                        untätig\n"
-"      --module-idle-time=SECS           Entlade untätige Module nach dieser Zeit\n"
-"      --scache-idle-time=SECS           Entlade untätige automatisch geladene \n"
+"      --module-idle-time=SECS           Entlade untätige Module nach dieser "
+"Zeit\n"
+"      --scache-idle-time=SECS           Entlade untätige automatisch "
+"geladene \n"
 "                                        Samples nach dieser Zeit\n"
 "      --log-level[=STUFE]               Grad der Ausführlichkeit angeben\n"
 "  -v                                    Ausführliche Meldungen\n"
 "      --log-target={auto,syslog,stderr} Protokoll-Ziel angeben\n"
-"  -p, --dl-search-path=PFAD             Suchpfad für dynamisch freigegebene \n"
+"  -p, --dl-search-path=PFAD             Suchpfad für dynamisch "
+"freigegebene \n"
 "                                        Objekte (Plugins)\n"
 "      --resample-method=METHODE          Nutze diese Resampling-Methode\n"
 "                                        (Siehe --dump-resample-methods für\n"
 "                                        mögliche Werte)\n"
 "      --use-pid-file[=BOOL]             Eine PID-Datei erstellen\n"
-"      --no-cpu-limit[=BOOL]             CPU-Lastbegrenzung auf unterstützten\n"
+"      --no-cpu-limit[=BOOL]             CPU-Lastbegrenzung auf "
+"unterstützten\n"
 "                                        Systemen nicht installieren.\n"
-"      --disable-shm[=BOOL]              Keine Unterstützung für Shared Memory.\n"
+"      --disable-shm[=BOOL]              Keine Unterstützung für Shared "
+"Memory.\n"
 "\n"
 "STARTUP-SCRIPT:\n"
 "  -L, --load=\"MODUL-ARGUMENTE\"       Plugin-Modul mit diesen Parametern \n"
@@ -527,8 +618,12 @@ msgid "--fail expects boolean argument"
 msgstr "Option --fail erfordert bool'schen Wert"
 
 #: ../src/daemon/cmdline.c:269
-msgid "--log-level expects log level argument (either numeric in range 0..4 or one of debug, info, notice, warn, error)."
-msgstr "--log-level erfordert Wert für Grad der Protokollierung (entweder numerisch im Bereich 0..4 or einen dieser: debug, info, notice, warn, error)."
+msgid ""
+"--log-level expects log level argument (either numeric in range 0..4 or one "
+"of debug, info, notice, warn, error)."
+msgstr ""
+"--log-level erfordert Wert für Grad der Protokollierung (entweder numerisch "
+"im Bereich 0..4 or einen dieser: debug, info, notice, warn, error)."
 
 #: ../src/daemon/cmdline.c:281
 msgid "--high-priority expects boolean argument"
@@ -552,7 +647,8 @@ msgstr "Option --use-pid-file erfordert bool'schen Wert"
 
 #: ../src/daemon/cmdline.c:326
 msgid "Invalid log target: use either 'syslog', 'stderr' or 'auto'."
-msgstr "Ungültiges Log-Ziel: Benutzen Sie entweder 'syslog', 'stderr' oder 'auto'."
+msgstr ""
+"Ungültiges Log-Ziel: Benutzen Sie entweder 'syslog', 'stderr' oder 'auto'."
 
 #: ../src/daemon/cmdline.c:333
 msgid "--log-time boolean argument"
@@ -692,8 +788,7 @@ msgstr "Root-Privilegien aufgeben."
 msgid "Limited capabilities successfully to CAP_SYS_NICE."
 msgstr "Fähigkeiten erfolgreich auf CAP_SYS_NICE reduziert."
 
-#: ../src/pulse/channelmap.c:103
-#: ../src/pulse/channelmap.c:804
+#: ../src/pulse/channelmap.c:103 ../src/pulse/channelmap.c:804
 msgid "Mono"
 msgstr "Mono"
 
@@ -897,12 +992,9 @@ msgstr "Oben Hinten Links"
 msgid "Top Rear Right"
 msgstr "Oben Hinten Rechts"
 
-#: ../src/pulse/channelmap.c:476
-#: ../src/pulse/sample.c:167
-#: ../src/pulse/volume.c:170
-#: ../src/pulse/volume.c:196
-#: ../src/pulse/volume.c:216
-#: ../src/pulse/volume.c:246
+#: ../src/pulse/channelmap.c:476 ../src/pulse/sample.c:167
+#: ../src/pulse/volume.c:170 ../src/pulse/volume.c:196
+#: ../src/pulse/volume.c:216 ../src/pulse/volume.c:246
 msgid "(invalid)"
 msgstr "(ungültig)"
 
@@ -1051,8 +1143,7 @@ msgstr "%0.1f KB"
 msgid "%u B"
 msgstr "%u B"
 
-#: ../src/pulse/client-conf-x11.c:55
-#: ../src/utils/pax11publish.c:100
+#: ../src/pulse/client-conf-x11.c:55 ../src/utils/pax11publish.c:100
 msgid "XOpenDisplay() failed"
 msgstr "XOpenDisplay() fehlgeschlagen"
 
@@ -1065,7 +1156,7 @@ msgstr "Parsen der Cookie-Daten fehlgeschlagen"
 msgid "Failed to open configuration file '%s': %s"
 msgstr "Konfigurationsdatei '%s' konnte nicht geöffnet werden: %s"
 
-#: ../src/pulse/context.c:523
+#: ../src/pulse/context.c:519
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "Verbindungsversuch ohne Cookie, da keines geladen."
 
@@ -1183,73 +1274,68 @@ msgstr "pa_stream_connect_playback() fehlgeschlagen: %s\n"
 msgid "pa_stream_connect_record() failed: %s\n"
 msgstr "pa_stream_connect_record() fehlgeschlagen: %s\n"
 
-#: ../src/utils/pacat.c:321
-#: ../src/utils/pasuspender.c:159
-#: ../src/utils/pactl.c:758
-#: ../src/utils/paplay.c:183
+#: ../src/utils/pacat.c:321 ../src/utils/pasuspender.c:159
+#: ../src/utils/pactl.c:759 ../src/utils/paplay.c:183
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "Verbindungsfehler: %s\n"
 
-#: ../src/utils/pacat.c:342
-#: ../src/utils/paplay.c:75
+#: ../src/utils/pacat.c:341 ../src/utils/paplay.c:75
 #, c-format
 msgid "Failed to drain stream: %s\n"
 msgstr "Entleeren des Streams fehlgeschlagen: %s\n"
 
-#: ../src/utils/pacat.c:347
-#: ../src/utils/paplay.c:80
+#: ../src/utils/pacat.c:346 ../src/utils/paplay.c:80
 #, c-format
 msgid "Playback stream drained.\n"
 msgstr "Wiedergabe-Stream entleert.\n"
 
-#: ../src/utils/pacat.c:357
-#: ../src/utils/paplay.c:92
+#: ../src/utils/pacat.c:356 ../src/utils/paplay.c:92
 #, c-format
 msgid "Draining connection to server.\n"
 msgstr "Draining connection to server.\n"
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:382
 #, c-format
 msgid "Got EOF.\n"
 msgstr "EOF empfangen.\n"
 
-#: ../src/utils/pacat.c:389
+#: ../src/utils/pacat.c:388
 #, c-format
 msgid "pa_stream_drain(): %s\n"
 msgstr "pa_stream_drain(): %s\n"
 
-#: ../src/utils/pacat.c:399
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "read() failed: %s\n"
 msgstr "read() fehlgeschlagen: %s\n"
 
-#: ../src/utils/pacat.c:431
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "write() failed: %s\n"
 msgstr "write() fehlgeschlagen: %s\n"
 
-#: ../src/utils/pacat.c:452
+#: ../src/utils/pacat.c:451
 #, c-format
 msgid "Got signal, exiting.\n"
 msgstr "Signal empfangen, beende.\n"
 
-#: ../src/utils/pacat.c:466
+#: ../src/utils/pacat.c:465
 #, c-format
 msgid "Failed to get latency: %s\n"
 msgstr "Erhalten der Latenz fehlgeschlagen: %s\n"
 
-#: ../src/utils/pacat.c:471
+#: ../src/utils/pacat.c:470
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec.  \r"
 msgstr "Zeit: %0.3f sec; Latenz: %0.0f usec.  \r"
 
-#: ../src/utils/pacat.c:491
+#: ../src/utils/pacat.c:490
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s\n"
 msgstr "pa_stream_update_timing_info() fehlgeschlagen: %s\n"
 
-#: ../src/utils/pacat.c:504
+#: ../src/utils/pacat.c:503
 #, c-format
 msgid ""
 "%s [options]\n"
@@ -1262,27 +1348,44 @@ msgid ""
 "\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 (defaults to s16ne)\n"
-"      --channels=CHANNELS               The number of channels, 1 for mono, 2 for stereo\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 "
+"(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 the stream is\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"
 "                                        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 "
+"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"
+"      --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"
+"      --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"
 msgstr ""
 "%s [options]\n"
 "\n"
@@ -1298,13 +1401,18 @@ msgstr ""
 "  -d, --device=DEVICE                   Name zu verbindender Sink/Quelle\n"
 "  -n, --client-name=NAME                Rufname des Clients auf dem Server\n"
 "      --stream-name=NAME                Rufname des Streams auf dem Server\n"
-"      --volume=VOLUME                   Initiale (lineare) Lautstärke zwischen 0...65536 angeben\n"
+"      --volume=VOLUME                   Initiale (lineare) Lautstärke "
+"zwischen 0...65536 angeben\n"
 "      --rate=SAMPLERATE                 Sample-Rate in Hz (Standard 44100)\n"
-"      --format=SAMPLEFORMAT             Ein Sample-Format von s16le, s16be, u8, float32le,\n"
-"                                        float32be, ulaw, alaw, s32le, s32be (defaults to s16ne)\n"
-"      --channels=CHANNELS               Anzahl Kanäle, 1 für mono, 2 für stereo\n"
+"      --format=SAMPLEFORMAT             Ein Sample-Format von s16le, s16be, "
+"u8, float32le,\n"
+"                                        float32be, ulaw, alaw, s32le, s32be "
+"(defaults to s16ne)\n"
+"      --channels=CHANNELS               Anzahl Kanäle, 1 für mono, 2 für "
+"stereo\n"
 "                                        (Standard ist 2)\n"
-"      --channel-map=CHANNELMAP          Diese geänderte Kanalzuordnung nutzen\n"
+"      --channel-map=CHANNELMAP          Diese geänderte Kanalzuordnung "
+"nutzen\n"
 "      --fix-format                      Sample-Format des mit Sink\n"
 "                                        verbundenen Streams nutzen.\n"
 "      --fix-rate                        Sample-Rate des mit Sink\n"
@@ -1313,11 +1421,13 @@ msgstr ""
 "                                        des mit Sink verbundenen\n"
 "                                        Streams nutzen.\n"
 "      --no-remix                        Kanäle nicht up-/down-mischen.\n"
-"      --no-remap                        Kanäle nach Index statt Name zuordnen.\n"
+"      --no-remap                        Kanäle nach Index statt Name "
+"zuordnen.\n"
 "      --latency=BYTES                   Diese Latenz verwenden.\n"
-"      --process-time=BYTES              Diese Prozesszeit pro Anfrage verwenden.\n"
+"      --process-time=BYTES              Diese Prozesszeit pro Anfrage "
+"verwenden.\n"
 
-#: ../src/utils/pacat.c:605
+#: ../src/utils/pacat.c:604
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1328,94 +1438,89 @@ msgstr ""
 "Kompiliert mit libpulse %s\n"
 "Gelinkt mit libpulse %s\n"
 
-#: ../src/utils/pacat.c:662
+#: ../src/utils/pacat.c:661
 #, c-format
 msgid "Invalid channel map '%s'\n"
 msgstr "Ungültige Kanal-Zuweisung '%s'\n"
 
-#: ../src/utils/pacat.c:691
+#: ../src/utils/pacat.c:690
 #, c-format
 msgid "Invalid latency specification '%s'\n"
 msgstr "Ungültige Latenz-Angaben '%s'\n"
 
-#: ../src/utils/pacat.c:698
+#: ../src/utils/pacat.c:697
 #, c-format
 msgid "Invalid process time specification '%s'\n"
 msgstr "Ungültige Prozesszeit-Angaben '%s'\n"
 
-#: ../src/utils/pacat.c:709
+#: ../src/utils/pacat.c:708
 #, c-format
 msgid "Invalid sample specification\n"
 msgstr "Ungültige Sample-Angaben\n"
 
-#: ../src/utils/pacat.c:714
+#: ../src/utils/pacat.c:713
 #, c-format
 msgid "Channel map doesn't match sample specification\n"
 msgstr "Kanalzuordnung entspricht nicht Einstellungen des Samples\n"
 
-#: ../src/utils/pacat.c:721
+#: ../src/utils/pacat.c:720
 #, c-format
 msgid "Opening a %s stream with sample specification '%s'.\n"
 msgstr "Öffne eine %s-Stream mit Sample-Angabe '%s'.\n"
 
-#: ../src/utils/pacat.c:721
+#: ../src/utils/pacat.c:720
 msgid "recording"
 msgstr "aufnehmen"
 
-#: ../src/utils/pacat.c:721
+#: ../src/utils/pacat.c:720
 msgid "playback"
 msgstr "abspielen"
 
-#: ../src/utils/pacat.c:729
+#: ../src/utils/pacat.c:728
 #, c-format
 msgid "open(): %s\n"
 msgstr "open(): %s\n"
 
-#: ../src/utils/pacat.c:734
+#: ../src/utils/pacat.c:733
 #, c-format
 msgid "dup2(): %s\n"
 msgstr "dup2(): %s\n"
 
-#: ../src/utils/pacat.c:744
+#: ../src/utils/pacat.c:743
 #, c-format
 msgid "Too many arguments.\n"
 msgstr "Zu viele Argumente.\n"
 
-#: ../src/utils/pacat.c:757
-#: ../src/utils/pasuspender.c:280
-#: ../src/utils/pactl.c:1013
-#: ../src/utils/paplay.c:381
+#: ../src/utils/pacat.c:756 ../src/utils/pasuspender.c:280
+#: ../src/utils/pactl.c:1014 ../src/utils/paplay.c:381
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new() fehlgeschlagen.\n"
 
-#: ../src/utils/pacat.c:778
+#: ../src/utils/pacat.c:777
 #, c-format
 msgid "io_new() failed.\n"
 msgstr "io_new() fehlgeschlagen.\n"
 
-#: ../src/utils/pacat.c:784
-#: ../src/utils/pasuspender.c:293
-#: ../src/utils/pactl.c:1027
-#: ../src/utils/paplay.c:396
+#: ../src/utils/pacat.c:783 ../src/utils/pasuspender.c:293
+#: ../src/utils/pactl.c:1028 ../src/utils/paplay.c:396
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new() fehlgeschlagen.\n"
 
-#: ../src/utils/pacat.c:792
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1034
+#: ../src/utils/paplay.c:404
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_new() fehlgeschlagen: %s"
 
-#: ../src/utils/pacat.c:803
+#: ../src/utils/pacat.c:802
 #, c-format
 msgid "time_new() failed.\n"
 msgstr "time_new() fehlgeschlagen.\n"
 
-#: ../src/utils/pacat.c:810
-#: ../src/utils/pasuspender.c:301
-#: ../src/utils/pactl.c:1035
-#: ../src/utils/paplay.c:407
+#: ../src/utils/pacat.c:809 ../src/utils/pasuspender.c:301
+#: ../src/utils/pactl.c:1039 ../src/utils/paplay.c:410
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() fehlgeschlagen.\n"
@@ -1445,8 +1550,7 @@ msgstr "Resume fehlgeschlagen: %s\n"
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr "WARNUNG: Sound-Server läuft nicht lokal, nicht ausgesetzt.\n"
 
-#: ../src/utils/pasuspender.c:176
-#: ../src/utils/pactl.c:764
+#: ../src/utils/pasuspender.c:176 ../src/utils/pactl.c:765
 #: ../src/utils/paplay.c:191
 #, c-format
 msgid "Got SIGINT, exiting.\n"
@@ -1464,7 +1568,8 @@ msgid ""
 "\n"
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\n"
-"  -s, --server=SERVER                   The name of the server to connect to\n"
+"  -s, --server=SERVER                   The name of the server to connect "
+"to\n"
 "\n"
 msgstr ""
 "%s [options] ... \n"
@@ -1619,18 +1724,10 @@ msgstr ""
 "\tEigenschaften:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:303
-#: ../src/utils/pactl.c:347
-#: ../src/utils/pactl.c:382
-#: ../src/utils/pactl.c:419
-#: ../src/utils/pactl.c:478
-#: ../src/utils/pactl.c:479
-#: ../src/utils/pactl.c:489
-#: ../src/utils/pactl.c:533
-#: ../src/utils/pactl.c:534
-#: ../src/utils/pactl.c:540
-#: ../src/utils/pactl.c:583
-#: ../src/utils/pactl.c:584
+#: ../src/utils/pactl.c:303 ../src/utils/pactl.c:347 ../src/utils/pactl.c:382
+#: ../src/utils/pactl.c:419 ../src/utils/pactl.c:478 ../src/utils/pactl.c:479
+#: ../src/utils/pactl.c:489 ../src/utils/pactl.c:533 ../src/utils/pactl.c:534
+#: ../src/utils/pactl.c:540 ../src/utils/pactl.c:583 ../src/utils/pactl.c:584
 #: ../src/utils/pactl.c:591
 msgid "n/a"
 msgstr "k. A."
@@ -1821,8 +1918,7 @@ msgstr ""
 "\tEigenschaften:\n"
 "\t\t%s\n"
 
-#: ../src/utils/pactl.c:599
-#: ../src/utils/pactl.c:609
+#: ../src/utils/pactl.c:599 ../src/utils/pactl.c:609
 #, c-format
 msgid "Failure: %s\n"
 msgstr "Fehlgeschlagen: %s\n"
@@ -1837,7 +1933,7 @@ msgstr "Hochladen des Sample fehlgeschlagen: %s\n"
 msgid "Premature end of file\n"
 msgstr "Dateiende ist zu früh aufgetreten\n"
 
-#: ../src/utils/pactl.c:770
+#: ../src/utils/pactl.c:771
 #, c-format
 msgid ""
 "%s [options] stat\n"
@@ -1857,8 +1953,10 @@ msgid ""
 "  -h, --help                            Show this help\n"
 "      --version                         Show version\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"
+"  -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"
 msgstr ""
 "%s [options] stat\n"
 "%s [options] list\n"
@@ -1880,7 +1978,7 @@ msgstr ""
 "  -s, --server=SERVER                   Name des Zielservers\n"
 "  -n, --client-name=NAME                Rufname des Clients auf dem Server\n"
 
-#: ../src/utils/pactl.c:822
+#: ../src/utils/pactl.c:823
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -1891,62 +1989,71 @@ msgstr ""
 "Kompiliert mit libpulse %s\n"
 "Gelinkt mit libpulse %s\n"
 
-#: ../src/utils/pactl.c:861
+#: ../src/utils/pactl.c:862
 #, c-format
 msgid "Please specify a sample file to load\n"
 msgstr "Geben Sie eine zu öffnende Sample-Datei an\n"
 
-#: ../src/utils/pactl.c:883
+#: ../src/utils/pactl.c:884
 #, c-format
 msgid "Failed to open sound file.\n"
 msgstr "Öffnen der Audio-Datei fehlgeschlagen.\n"
 
-#: ../src/utils/pactl.c:895
+#: ../src/utils/pactl.c:896
 #, c-format
 msgid "You have to specify a sample name to play\n"
 msgstr "Sie müssen eine abzuspielende Sample-Datei angeben\n"
 
-#: ../src/utils/pactl.c:907
+#: ../src/utils/pactl.c:908
 #, c-format
 msgid "You have to specify a sample name to remove\n"
 msgstr "Sie müssen eine zu löschende Sample-Datei angeben\n"
 
-#: ../src/utils/pactl.c:915
+#: ../src/utils/pactl.c:916
 #, c-format
 msgid "You have to specify a sink input index and a sink\n"
 msgstr "Sie müssen einen Sink-Eingabe-Indexwert und einen Sink angeben\n"
 
-#: ../src/utils/pactl.c:924
+#: ../src/utils/pactl.c:925
 #, c-format
 msgid "You have to specify a source output index and a source\n"
-msgstr "Sie müssen eine Indexwert für die Quell-Ausgabe und eine Quelle angeben\n"
+msgstr ""
+"Sie müssen eine Indexwert für die Quell-Ausgabe und eine Quelle angeben\n"
 
-#: ../src/utils/pactl.c:938
+#: ../src/utils/pactl.c:939
 #, c-format
 msgid "You have to specify a module name and arguments.\n"
 msgstr "Sie müssen einen Modulnamen angeben und Argumente übergeben.\n"
 
-#: ../src/utils/pactl.c:958
+#: ../src/utils/pactl.c:959
 #, c-format
 msgid "You have to specify a module index\n"
 msgstr "Sie müssen einen Indexwert für ein Modul angeben\n"
 
-#: ../src/utils/pactl.c:968
+#: ../src/utils/pactl.c:969
 #, c-format
-msgid "You may not specify more than one sink. You have to specify a boolean value.\n"
-msgstr "Sie sollten nur eine Senke angeben. Sie müssen zumindest einen bool'schen Wert übergeben.\n"
+msgid ""
+"You may not specify more than one sink. You have to specify a boolean "
+"value.\n"
+msgstr ""
+"Sie sollten nur eine Senke angeben. Sie müssen zumindest einen bool'schen "
+"Wert übergeben.\n"
 
-#: ../src/utils/pactl.c:981
+#: ../src/utils/pactl.c:982
 #, c-format
-msgid "You may not specify more than one source. You have to specify a boolean value.\n"
-msgstr "Sie sollten nur eine Quelle angeben. Sie müssen zumindest einen bool'schen Wert übergeben.\n"
+msgid ""
+"You may not specify more than one source. You have to specify a boolean "
+"value.\n"
+msgstr ""
+"Sie sollten nur eine Quelle angeben. Sie müssen zumindest einen bool'schen "
+"Wert übergeben.\n"
 
-#: ../src/utils/pactl.c:993
+#: ../src/utils/pactl.c:994
 #, c-format
 msgid "You have to specify a card name/index and a profile name\n"
 msgstr "Sie müssen einen Karten-Name/Indexwert und einen Profilnamen angeben\n"
 
-#: ../src/utils/pactl.c:1008
+#: ../src/utils/pactl.c:1009
 #, c-format
 msgid "No valid command specified.\n"
 msgstr "Kein gültiger Befehl angegeben.\n"
@@ -1958,14 +2065,16 @@ msgid ""
 "\n"
 " -d    Show current PulseAudio data attached to X11 display (default)\n"
 " -e    Export local PulseAudio data to X11 display\n"
-" -i    Import PulseAudio data from X11 display to local environment variables and cookie file.\n"
+" -i    Import PulseAudio data from X11 display to local environment "
+"variables and cookie file.\n"
 " -r    Remove PulseAudio data from X11 display\n"
 msgstr ""
 "%s [-D display] [-S server] [-O sink] [-I source] [-c file]  [-d|-e|-i|-r]\n"
 "\n"
 " -d    Zeige aktuell mit X11-Anzeige verbundene PulseAudio-Daten (Standard)\n"
 " -e    Lokale PulseAudio-Daten an X11-Anzeige exportieren\n"
-" -i    PulseAudio-Daten von X11-Anzeige in lokale Umgebungsvariablen und Cookie importieren.\n"
+" -i    PulseAudio-Daten von X11-Anzeige in lokale Umgebungsvariablen und "
+"Cookie importieren.\n"
 " -r    PulseAudio-Daten von X11-Anzeige löschen\n"
 
 #: ../src/utils/pax11publish.c:94
@@ -2051,14 +2160,12 @@ msgstr "Daemon antwortet nicht."
 msgid "select(): %s"
 msgstr "select(): %s"
 
-#: ../src/utils/pacmd.c:154
-#: ../src/utils/pacmd.c:171
+#: ../src/utils/pacmd.c:154 ../src/utils/pacmd.c:171
 #, c-format
 msgid "read(): %s"
 msgstr "read(): %s"
 
-#: ../src/utils/pacmd.c:187
-#: ../src/utils/pacmd.c:201
+#: ../src/utils/pacmd.c:187 ../src/utils/pacmd.c:201
 #, c-format
 msgid "write(): %s"
 msgstr "write(): %s"
@@ -2088,11 +2195,15 @@ msgid ""
 "\n"
 "  -v, --verbose                         Enable verbose operation\n"
 "\n"
-"  -s, --server=SERVER                   The name of the server to connect to\n"
+"  -s, --server=SERVER                   The name of the server to connect "
+"to\n"
 "  -d, --device=DEVICE                   The name of the sink 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"
+"  -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"
 "      --channel-map=CHANNELMAP          Set the channel map to the use\n"
 msgstr ""
 "%s [options] [FILE]\n"
@@ -2106,7 +2217,8 @@ msgstr ""
 "  -d, --device=DEVICE                   Name des Ziel-Sink\n"
 "  -n, --client-name=NAME                Rufname des Clients auf dem Server\n"
 "      --stream-name=NAME                Rufname des Streams auf dem Server\n"
-"      --volume=VOLUME                   Initiale (lineare) Lautstärke zwischen 0...65536\n"
+"      --volume=VOLUME                   Initiale (lineare) Lautstärke "
+"zwischen 0...65536\n"
 "      --channel-map=CHANNELMAP          Diese Kanalzuordnung nutzen\n"
 
 #: ../src/utils/paplay.c:255
@@ -2140,19 +2252,40 @@ msgstr "Kanal-Zuweisung stimmt mit Datei nicht überein.\n"
 msgid "Using sample spec '%s'\n"
 msgstr "Sampling-Angabe '%s' wird benutzt\n"
 
-#: ../src/pulsecore/lock-autospawn.c:126
-#: ../src/pulsecore/lock-autospawn.c:207
+#: ../src/pulsecore/lock-autospawn.c:126 ../src/pulsecore/lock-autospawn.c:207
 msgid "Cannot access autospawn lock."
 msgstr "Fehler beim Zugriff auf Autostart -Sperre."
 
+#, fuzzy
+#~ msgid ""
+#~ "', PolicyKit refuse to grant us the requested privileges and we have no "
+#~ "increase RLIMIT_NICE/RLIMIT_RTPRIO resource limits.\n"
+#~ "For enabling real-time/high-priority scheduling please acquire the "
+#~ "appropriate PolicyKit privileges, or become a member of '"
+#~ msgstr ""
+#~ "' und PolicyKit verweigern diese Rechte. Verwerfe SUID wieder.\n"
+#~ "Erlangen Sie die den Richtlinien entsprechenden Rechte, um Echtzeit-"
+#~ "Scheduling zu aktivieren oder werden Sie Mitglied der Gruppe '"
+
+#~ msgid ""
+#~ "', or increase the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this "
+#~ "user."
+#~ msgstr ""
+#~ "' oder erhöhen sie die RLIMIT_NICE/RLIMIT_RTPRIO-Ressourcenbegrenzungen "
+#~ "für diesen Nutzer."
+
 #~ msgid "Default sink name (%s) does not exist in name register."
 #~ msgstr "Vorgabename für Sink (%s) existiert nicht im Namensregister."
+
 #~ msgid "Buffer overrun, dropping incoming data\n"
 #~ msgstr "Pufferüberlauf, verwerfe eingehende Daten\n"
+
 #~ msgid "pa_stream_drop() failed: %s\n"
 #~ msgstr "pa_stream_drop() fehlgeschlagen: %s\n"
+
 #~ msgid "muted"
 #~ msgstr "stumm"
+
 #~ msgid ""
 #~ "*** Autoload Entry #%u ***\n"
 #~ "Name: %s\n"
@@ -2165,10 +2298,12 @@ msgstr "Fehler beim Zugriff auf Autostart -Sperre."
 #~ "Typ: %s\n"
 #~ "Modul: %s\n"
 #~ "Argument: %s\n"
+
 #~ msgid "sink"
 #~ msgstr "Sink"
+
 #~ msgid "source"
 #~ msgstr "Quelle"
+
 #~ msgid "socketpair(): %s"
 #~ msgstr "socketpair(): %s"
-
diff --git a/po/el.po b/po/el.po
index 77d1397..262ecd5 100644
--- a/po/el.po
+++ b/po/el.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: el\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-02-12 16:57+0100\n"
+"POT-Creation-Date: 2009-02-20 03:24+0100\n"
 "PO-Revision-Date: 2008-08-22 19:40+0300\n"
 "Last-Translator: Dimitris Glezos <dimitris at glezos.com>\n"
 "Language-Team: Greek <fedora-trans-el at redhat.com>\n"
@@ -16,6 +16,66 @@ msgstr ""
 "X-Generator: KAider 0.1\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
+#: ../src/modules/alsa/alsa-util.c:525
+msgid "Analog Mono"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:531
+msgid "Analog Stereo"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:537
+msgid "Digital Stereo (IEC958)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:543
+msgid "Digital Stereo (HDMI)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:550
+msgid "Analog Surround 4.0"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:557
+msgid "Digital Surround 4.0 (IEC958/AC3)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:565
+msgid "Analog Surround 4.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:573
+msgid "Analog Surround 5.0"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:581
+msgid "Analog Surround 5.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:589
+msgid "Digital Surround 5.1 (IEC958/AC3)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:598
+msgid "Analog Surround 7.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:1577
+#, c-format
+msgid ""
+"snd_pcm_avail_update() returned a value that is exceptionally large: %lu "
+"bytes (%lu ms). Most likely this is an ALSA driver bug. Please report this "
+"issue to the ALSA developers."
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:1609
+#, c-format
+msgid ""
+"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
+"(%lu ms). Most likely this is an ALSA driver bug. Please report this issue "
+"to the ALSA developers."
+msgstr ""
+
 #: ../src/daemon/ltdl-bind-now.c:124
 msgid "Failed to find original lt_dlopen loader."
 msgstr ""
@@ -149,221 +209,221 @@ msgstr ""
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:429
+#: ../src/daemon/main.c:431
 msgid "Failed to parse command line."
 msgstr ""
 
-#: ../src/daemon/main.c:451
+#: ../src/daemon/main.c:453
 #, c-format
 msgid "We're in the group '%s', allowing high-priority scheduling."
 msgstr ""
 
-#: ../src/daemon/main.c:458
+#: ../src/daemon/main.c:460
 #, c-format
 msgid "We're in the group '%s', allowing real-time scheduling."
 msgstr ""
 
-#: ../src/daemon/main.c:466
+#: ../src/daemon/main.c:468
 msgid "PolicyKit grants us acquire-high-priority privilege."
 msgstr ""
 
-#: ../src/daemon/main.c:469
+#: ../src/daemon/main.c:471
 msgid "PolicyKit refuses acquire-high-priority privilege."
 msgstr ""
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:476
 msgid "PolicyKit grants us acquire-real-time privilege."
 msgstr ""
 
-#: ../src/daemon/main.c:477
+#: ../src/daemon/main.c:479
 msgid "PolicyKit refuses acquire-real-time privilege."
 msgstr ""
 
-#: ../src/daemon/main.c:506
+#: ../src/daemon/main.c:508
 msgid ""
 "Called SUID root and real-time and/or high-priority scheduling was requested "
 "in the configuration. However, we lack the necessary privileges:\n"
 "We are not in group '"
 msgstr ""
 
-#: ../src/daemon/main.c:530
+#: ../src/daemon/main.c:532
 msgid ""
 "High-priority scheduling enabled in configuration but not allowed by policy."
 msgstr ""
 
-#: ../src/daemon/main.c:559
+#: ../src/daemon/main.c:561
 msgid "Successfully increased RLIMIT_RTPRIO"
 msgstr ""
 
-#: ../src/daemon/main.c:562
+#: ../src/daemon/main.c:564
 #, c-format
 msgid "RLIMIT_RTPRIO failed: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:569
+#: ../src/daemon/main.c:571
 msgid "Giving up CAP_NICE"
 msgstr ""
 
-#: ../src/daemon/main.c:576
+#: ../src/daemon/main.c:578
 msgid ""
 "Real-time scheduling enabled in configuration but not allowed by policy."
 msgstr ""
 
-#: ../src/daemon/main.c:637
+#: ../src/daemon/main.c:639
 msgid "Daemon not running"
 msgstr ""
 
-#: ../src/daemon/main.c:639
+#: ../src/daemon/main.c:641
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr ""
 
-#: ../src/daemon/main.c:649
+#: ../src/daemon/main.c:651
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:667
+#: ../src/daemon/main.c:669
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
 msgstr ""
 
-#: ../src/daemon/main.c:669
+#: ../src/daemon/main.c:671
 msgid "Root privileges required."
 msgstr ""
 
-#: ../src/daemon/main.c:674
+#: ../src/daemon/main.c:676
 msgid "--start not supported for system instances."
 msgstr ""
 
-#: ../src/daemon/main.c:679
+#: ../src/daemon/main.c:681
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr ""
 
-#: ../src/daemon/main.c:682
+#: ../src/daemon/main.c:684
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr ""
 
-#: ../src/daemon/main.c:685
+#: ../src/daemon/main.c:687
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr ""
 
-#: ../src/daemon/main.c:690
+#: ../src/daemon/main.c:692
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr ""
 
-#: ../src/daemon/main.c:717
+#: ../src/daemon/main.c:719
 msgid "Failed to acquire stdio."
 msgstr ""
 
-#: ../src/daemon/main.c:723
+#: ../src/daemon/main.c:725
 #, c-format
 msgid "pipe failed: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:728
+#: ../src/daemon/main.c:730
 #, c-format
 msgid "fork() failed: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:742
+#: ../src/daemon/main.c:744
 #, c-format
 msgid "read() failed: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:748
+#: ../src/daemon/main.c:750
 msgid "Daemon startup failed."
 msgstr ""
 
-#: ../src/daemon/main.c:750
+#: ../src/daemon/main.c:752
 msgid "Daemon startup successful."
 msgstr ""
 
-#: ../src/daemon/main.c:820
+#: ../src/daemon/main.c:822
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "Αυτό είναι το PulseAudio %s"
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:823
 #, c-format
 msgid "Compilation host: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:822
+#: ../src/daemon/main.c:824
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:825
+#: ../src/daemon/main.c:827
 #, c-format
 msgid "Running on host: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:828
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "Found %u CPUs."
 msgstr ""
 
-#: ../src/daemon/main.c:830
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr ""
 
-#: ../src/daemon/main.c:833
+#: ../src/daemon/main.c:835
 msgid "Compiled with Valgrind support: yes"
 msgstr ""
 
-#: ../src/daemon/main.c:835
+#: ../src/daemon/main.c:837
 msgid "Compiled with Valgrind support: no"
 msgstr ""
 
-#: ../src/daemon/main.c:838
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:841
+#: ../src/daemon/main.c:843
 msgid "Optimized build: yes"
 msgstr ""
 
-#: ../src/daemon/main.c:843
+#: ../src/daemon/main.c:845
 msgid "Optimized build: no"
 msgstr ""
 
-#: ../src/daemon/main.c:847
+#: ../src/daemon/main.c:849
 msgid "Failed to get machine ID"
 msgstr ""
 
-#: ../src/daemon/main.c:850
+#: ../src/daemon/main.c:852
 #, c-format
 msgid "Machine ID is %s."
 msgstr ""
 
-#: ../src/daemon/main.c:855
+#: ../src/daemon/main.c:857
 #, c-format
 msgid "Using runtime directory %s."
 msgstr ""
 
-#: ../src/daemon/main.c:860
+#: ../src/daemon/main.c:862
 #, c-format
 msgid "Using state directory %s."
 msgstr ""
 
-#: ../src/daemon/main.c:863
+#: ../src/daemon/main.c:865
 #, c-format
 msgid "Running in system mode: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:878
+#: ../src/daemon/main.c:880
 msgid "pa_pid_file_create() failed."
 msgstr ""
 
-#: ../src/daemon/main.c:890
+#: ../src/daemon/main.c:892
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr ""
 
-#: ../src/daemon/main.c:892
+#: ../src/daemon/main.c:894
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
@@ -371,27 +431,27 @@ msgstr ""
 "Δικέ μου, ο πυρήνας σου είναι για τα μπάζα! Η πρόταση του σεφ σήμερα είναι "
 "Linux με ενεργοποιημένα τα high-resolution timers!"
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:906
 msgid "pa_core_new() failed."
 msgstr ""
 
-#: ../src/daemon/main.c:965
+#: ../src/daemon/main.c:967
 msgid "Failed to initialize daemon."
 msgstr ""
 
-#: ../src/daemon/main.c:970
+#: ../src/daemon/main.c:972
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr ""
 
-#: ../src/daemon/main.c:983
+#: ../src/daemon/main.c:985
 msgid "Daemon startup complete."
 msgstr ""
 
-#: ../src/daemon/main.c:989
+#: ../src/daemon/main.c:991
 msgid "Daemon shutdown initiated."
 msgstr ""
 
-#: ../src/daemon/main.c:1010
+#: ../src/daemon/main.c:1009
 msgid "Daemon terminated."
 msgstr ""
 
@@ -1013,7 +1073,7 @@ msgstr ""
 msgid "Failed to open configuration file '%s': %s"
 msgstr ""
 
-#: ../src/pulse/context.c:523
+#: ../src/pulse/context.c:519
 msgid "No cookie loaded. Attempting to connect without."
 msgstr ""
 
@@ -1132,67 +1192,67 @@ msgid "pa_stream_connect_record() failed: %s\n"
 msgstr ""
 
 #: ../src/utils/pacat.c:321 ../src/utils/pasuspender.c:159
-#: ../src/utils/pactl.c:758 ../src/utils/paplay.c:183
+#: ../src/utils/pactl.c:759 ../src/utils/paplay.c:183
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:342 ../src/utils/paplay.c:75
+#: ../src/utils/pacat.c:341 ../src/utils/paplay.c:75
 #, c-format
 msgid "Failed to drain stream: %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:347 ../src/utils/paplay.c:80
+#: ../src/utils/pacat.c:346 ../src/utils/paplay.c:80
 #, c-format
 msgid "Playback stream drained.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:357 ../src/utils/paplay.c:92
+#: ../src/utils/pacat.c:356 ../src/utils/paplay.c:92
 #, c-format
 msgid "Draining connection to server.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:382
 #, c-format
 msgid "Got EOF.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:389
+#: ../src/utils/pacat.c:388
 #, c-format
 msgid "pa_stream_drain(): %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:399
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "read() failed: %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:431
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "write() failed: %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:452
+#: ../src/utils/pacat.c:451
 #, c-format
 msgid "Got signal, exiting.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:466
+#: ../src/utils/pacat.c:465
 #, c-format
 msgid "Failed to get latency: %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:471
+#: ../src/utils/pacat.c:470
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec.  \r"
 msgstr ""
 
-#: ../src/utils/pacat.c:491
+#: ../src/utils/pacat.c:490
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:504
+#: ../src/utils/pacat.c:503
 #, c-format
 msgid ""
 "%s [options]\n"
@@ -1245,7 +1305,7 @@ msgid ""
 "per request in bytes.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:605
+#: ../src/utils/pacat.c:604
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1253,88 +1313,89 @@ msgid ""
 "Linked with libpulse %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:662
+#: ../src/utils/pacat.c:661
 #, c-format
 msgid "Invalid channel map '%s'\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:691
+#: ../src/utils/pacat.c:690
 #, c-format
 msgid "Invalid latency specification '%s'\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:698
+#: ../src/utils/pacat.c:697
 #, c-format
 msgid "Invalid process time specification '%s'\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:709
+#: ../src/utils/pacat.c:708
 #, c-format
 msgid "Invalid sample specification\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:714
+#: ../src/utils/pacat.c:713
 #, c-format
 msgid "Channel map doesn't match sample specification\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:721
+#: ../src/utils/pacat.c:720
 #, c-format
 msgid "Opening a %s stream with sample specification '%s'.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:721
+#: ../src/utils/pacat.c:720
 msgid "recording"
 msgstr ""
 
-#: ../src/utils/pacat.c:721
+#: ../src/utils/pacat.c:720
 msgid "playback"
 msgstr ""
 
-#: ../src/utils/pacat.c:729
+#: ../src/utils/pacat.c:728
 #, c-format
 msgid "open(): %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:734
+#: ../src/utils/pacat.c:733
 #, c-format
 msgid "dup2(): %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:744
+#: ../src/utils/pacat.c:743
 #, c-format
 msgid "Too many arguments.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:757 ../src/utils/pasuspender.c:280
-#: ../src/utils/pactl.c:1013 ../src/utils/paplay.c:381
+#: ../src/utils/pacat.c:756 ../src/utils/pasuspender.c:280
+#: ../src/utils/pactl.c:1014 ../src/utils/paplay.c:381
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:778
+#: ../src/utils/pacat.c:777
 #, c-format
 msgid "io_new() failed.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:784 ../src/utils/pasuspender.c:293
-#: ../src/utils/pactl.c:1027 ../src/utils/paplay.c:396
+#: ../src/utils/pacat.c:783 ../src/utils/pasuspender.c:293
+#: ../src/utils/pactl.c:1028 ../src/utils/paplay.c:396
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:792
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1034
+#: ../src/utils/paplay.c:404
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:803
+#: ../src/utils/pacat.c:802
 #, c-format
 msgid "time_new() failed.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:810 ../src/utils/pasuspender.c:301
-#: ../src/utils/pactl.c:1035 ../src/utils/paplay.c:407
+#: ../src/utils/pacat.c:809 ../src/utils/pasuspender.c:301
+#: ../src/utils/pactl.c:1039 ../src/utils/paplay.c:410
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr ""
@@ -1364,7 +1425,7 @@ msgstr ""
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:176 ../src/utils/pactl.c:764
+#: ../src/utils/pasuspender.c:176 ../src/utils/pactl.c:765
 #: ../src/utils/paplay.c:191
 #, c-format
 msgid "Got SIGINT, exiting.\n"
@@ -1638,7 +1699,7 @@ msgstr ""
 msgid "Premature end of file\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:770
+#: ../src/utils/pactl.c:771
 #, c-format
 msgid ""
 "%s [options] stat\n"
@@ -1664,7 +1725,7 @@ msgid ""
 "server\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:822
+#: ../src/utils/pactl.c:823
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -1672,66 +1733,66 @@ msgid ""
 "Linked with libpulse %s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:861
+#: ../src/utils/pactl.c:862
 #, c-format
 msgid "Please specify a sample file to load\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:883
+#: ../src/utils/pactl.c:884
 #, c-format
 msgid "Failed to open sound file.\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:895
+#: ../src/utils/pactl.c:896
 #, c-format
 msgid "You have to specify a sample name to play\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:907
+#: ../src/utils/pactl.c:908
 #, c-format
 msgid "You have to specify a sample name to remove\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:915
+#: ../src/utils/pactl.c:916
 #, c-format
 msgid "You have to specify a sink input index and a sink\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:924
+#: ../src/utils/pactl.c:925
 #, c-format
 msgid "You have to specify a source output index and a source\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:938
+#: ../src/utils/pactl.c:939
 #, c-format
 msgid "You have to specify a module name and arguments.\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:958
+#: ../src/utils/pactl.c:959
 #, c-format
 msgid "You have to specify a module index\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:968
+#: ../src/utils/pactl.c:969
 #, c-format
 msgid ""
 "You may not specify more than one sink. You have to specify a boolean "
 "value.\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:981
+#: ../src/utils/pactl.c:982
 #, c-format
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value.\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:993
+#: ../src/utils/pactl.c:994
 #, c-format
 msgid "You have to specify a card name/index and a profile name\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:1008
+#: ../src/utils/pactl.c:1009
 #, c-format
 msgid "No valid command specified.\n"
 msgstr ""
diff --git a/po/es.po b/po/es.po
index 042f167..baee21d 100644
--- a/po/es.po
+++ b/po/es.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PulseAudio\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-02-12 16:57+0100\n"
+"POT-Creation-Date: 2009-02-20 03:24+0100\n"
 "PO-Revision-Date: 2009-01-16 09:25-0300\n"
 "Last-Translator: daniel cabrera <h.daniel.cabrera at gmail.com>\n"
 "Language-Team: Spanish <fedora-trans-es at redhat.com>\n"
@@ -16,6 +16,66 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
+#: ../src/modules/alsa/alsa-util.c:525
+msgid "Analog Mono"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:531
+msgid "Analog Stereo"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:537
+msgid "Digital Stereo (IEC958)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:543
+msgid "Digital Stereo (HDMI)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:550
+msgid "Analog Surround 4.0"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:557
+msgid "Digital Surround 4.0 (IEC958/AC3)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:565
+msgid "Analog Surround 4.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:573
+msgid "Analog Surround 5.0"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:581
+msgid "Analog Surround 5.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:589
+msgid "Digital Surround 5.1 (IEC958/AC3)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:598
+msgid "Analog Surround 7.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:1577
+#, c-format
+msgid ""
+"snd_pcm_avail_update() returned a value that is exceptionally large: %lu "
+"bytes (%lu ms). Most likely this is an ALSA driver bug. Please report this "
+"issue to the ALSA developers."
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:1609
+#, c-format
+msgid ""
+"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
+"(%lu ms). Most likely this is an ALSA driver bug. Please report this issue "
+"to the ALSA developers."
+msgstr ""
+
 #: ../src/daemon/ltdl-bind-now.c:124
 #, fuzzy
 msgid "Failed to find original lt_dlopen loader."
@@ -151,37 +211,37 @@ msgstr "El modo a nivel de sistema no es soportado en esta plataforma."
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) falló: %s"
 
-#: ../src/daemon/main.c:429
+#: ../src/daemon/main.c:431
 msgid "Failed to parse command line."
 msgstr "Falló al analizar la línea de comando."
 
-#: ../src/daemon/main.c:451
+#: ../src/daemon/main.c:453
 #, c-format
 msgid "We're in the group '%s', allowing high-priority scheduling."
 msgstr "Estamos en el grupo '%s', permitiendo planificación de prioridad alta."
 
-#: ../src/daemon/main.c:458
+#: ../src/daemon/main.c:460
 #, c-format
 msgid "We're in the group '%s', allowing real-time scheduling."
 msgstr "Estamos en el grupo '%s', permitiendo planificación en tiempo real."
 
-#: ../src/daemon/main.c:466
+#: ../src/daemon/main.c:468
 msgid "PolicyKit grants us acquire-high-priority privilege."
 msgstr "PolicyKit garantiza que se obtenga el privilegio de alta prioridad."
 
-#: ../src/daemon/main.c:469
+#: ../src/daemon/main.c:471
 msgid "PolicyKit refuses acquire-high-priority privilege."
 msgstr "PolicyKit se niega a dar acceso al privilegio de alta prioridad."
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:476
 msgid "PolicyKit grants us acquire-real-time privilege."
 msgstr "PolicyKit garantiza el acceso al privilegio de tiempo real."
 
-#: ../src/daemon/main.c:477
+#: ../src/daemon/main.c:479
 msgid "PolicyKit refuses acquire-real-time privilege."
 msgstr "PolicyKit se niega a dar acceso al privilegio de tiempo real."
 
-#: ../src/daemon/main.c:506
+#: ../src/daemon/main.c:508
 #, fuzzy
 msgid ""
 "Called SUID root and real-time and/or high-priority scheduling was requested "
@@ -193,48 +253,48 @@ msgstr ""
 "necesarios:\n"
 "No estamos en el grupo '"
 
-#: ../src/daemon/main.c:530
+#: ../src/daemon/main.c:532
 msgid ""
 "High-priority scheduling enabled in configuration but not allowed by policy."
 msgstr ""
 "Está habilitadada la planificación de prioridad alta, pero no están "
 "permitidas por la política."
 
-#: ../src/daemon/main.c:559
+#: ../src/daemon/main.c:561
 msgid "Successfully increased RLIMIT_RTPRIO"
 msgstr "RLIMIT_RTPRIO incrementado en forma exitosa"
 
-#: ../src/daemon/main.c:562
+#: ../src/daemon/main.c:564
 #, c-format
 msgid "RLIMIT_RTPRIO failed: %s"
 msgstr "Fallo en RLIMIT_RTPRIO: %s"
 
-#: ../src/daemon/main.c:569
+#: ../src/daemon/main.c:571
 msgid "Giving up CAP_NICE"
 msgstr "Abandonando CAP_NICE"
 
-#: ../src/daemon/main.c:576
+#: ../src/daemon/main.c:578
 msgid ""
 "Real-time scheduling enabled in configuration but not allowed by policy."
 msgstr ""
 "Está habilitada la planificación en tiempo real, pero no está permitido por "
 "la política."
 
-#: ../src/daemon/main.c:637
+#: ../src/daemon/main.c:639
 msgid "Daemon not running"
 msgstr "El demonio no está funcionando"
 
-#: ../src/daemon/main.c:639
+#: ../src/daemon/main.c:641
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "El demonio está funcionando como PID %u"
 
-#: ../src/daemon/main.c:649
+#: ../src/daemon/main.c:651
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "No se ha podido detener el demonio: %s"
 
-#: ../src/daemon/main.c:667
+#: ../src/daemon/main.c:669
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
@@ -242,149 +302,149 @@ msgstr ""
 "Este programa no tiene por qué ser ejecutado como root (a menos que --system "
 "sea especificado)."
 
-#: ../src/daemon/main.c:669
+#: ../src/daemon/main.c:671
 #, fuzzy
 msgid "Root privileges required."
 msgstr "Se necesitan privilegios de usuario root."
 
-#: ../src/daemon/main.c:674
+#: ../src/daemon/main.c:676
 msgid "--start not supported for system instances."
 msgstr "--start no está soportado para las instancias del sistema."
 
-#: ../src/daemon/main.c:679
+#: ../src/daemon/main.c:681
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr ""
 "Ejecutándose en modo de sistema, ¡pero no se ha configurado --disallow-exit! "
 
-#: ../src/daemon/main.c:682
+#: ../src/daemon/main.c:684
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr ""
 "Ejecutándose en modo de sistema, ¡pero no se ha configurado --disallow-"
 "module-loading!"
 
-#: ../src/daemon/main.c:685
+#: ../src/daemon/main.c:687
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr ""
 "Ejecutándose en modo de sistema, ¡desactivando forzadamente el modo SHM!"
 
-#: ../src/daemon/main.c:690
+#: ../src/daemon/main.c:692
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr ""
 "Ejecutándose en modo de sistema, ¡desactivando forzadamente exit idle time!"
 
-#: ../src/daemon/main.c:717
+#: ../src/daemon/main.c:719
 msgid "Failed to acquire stdio."
 msgstr "Fallo al intentar adquirir stdio."
 
-#: ../src/daemon/main.c:723
+#: ../src/daemon/main.c:725
 #, c-format
 msgid "pipe failed: %s"
 msgstr "Falló el pipe: %s"
 
-#: ../src/daemon/main.c:728
+#: ../src/daemon/main.c:730
 #, c-format
 msgid "fork() failed: %s"
 msgstr "Falló el fork(): %s"
 
-#: ../src/daemon/main.c:742
+#: ../src/daemon/main.c:744
 #, c-format
 msgid "read() failed: %s"
 msgstr "Falló la operación read(): %s"
 
-#: ../src/daemon/main.c:748
+#: ../src/daemon/main.c:750
 msgid "Daemon startup failed."
 msgstr "Falló el inicio del demonio. "
 
-#: ../src/daemon/main.c:750
+#: ../src/daemon/main.c:752
 msgid "Daemon startup successful."
 msgstr "El demonio se inició exitosamente."
 
-#: ../src/daemon/main.c:820
+#: ../src/daemon/main.c:822
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "Esto es PulseAudio %s"
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:823
 #, c-format
 msgid "Compilation host: %s"
 msgstr "Host de compilación: %s"
 
-#: ../src/daemon/main.c:822
+#: ../src/daemon/main.c:824
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "Compilación CFLAGS: %s"
 
-#: ../src/daemon/main.c:825
+#: ../src/daemon/main.c:827
 #, c-format
 msgid "Running on host: %s"
 msgstr "Ejecutándose en el host: %s"
 
-#: ../src/daemon/main.c:828
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "Found %u CPUs."
 msgstr ""
 
-#: ../src/daemon/main.c:830
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "El tamaño de la página es de %lu bytes"
 
-#: ../src/daemon/main.c:833
+#: ../src/daemon/main.c:835
 msgid "Compiled with Valgrind support: yes"
 msgstr "Soporte para compilar con Valgrind: si"
 
-#: ../src/daemon/main.c:835
+#: ../src/daemon/main.c:837
 msgid "Compiled with Valgrind support: no"
 msgstr "Soporte para compilar con Valgrind: no"
 
-#: ../src/daemon/main.c:838
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "Ejecutándose en modo valgrind: %s"
 
-#: ../src/daemon/main.c:841
+#: ../src/daemon/main.c:843
 msgid "Optimized build: yes"
 msgstr "Build optimizado: si"
 
-#: ../src/daemon/main.c:843
+#: ../src/daemon/main.c:845
 msgid "Optimized build: no"
 msgstr "Build optimizado: no"
 
-#: ../src/daemon/main.c:847
+#: ../src/daemon/main.c:849
 msgid "Failed to get machine ID"
 msgstr "Fallo al intentar obtener el ID de la máquina"
 
-#: ../src/daemon/main.c:850
+#: ../src/daemon/main.c:852
 #, c-format
 msgid "Machine ID is %s."
 msgstr "El ID de la máquina es %s"
 
-#: ../src/daemon/main.c:855
+#: ../src/daemon/main.c:857
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "Utilizando directorio de tiempo de ejecución %s."
 
-#: ../src/daemon/main.c:860
+#: ../src/daemon/main.c:862
 #, c-format
 msgid "Using state directory %s."
 msgstr "Utilizando directorio de estado %s."
 
-#: ../src/daemon/main.c:863
+#: ../src/daemon/main.c:865
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "Ejecutándose en modo de sistema: %s"
 
-#: ../src/daemon/main.c:878
+#: ../src/daemon/main.c:880
 msgid "pa_pid_file_create() failed."
 msgstr "Ha fallado pa_pid_file_create()."
 
-#: ../src/daemon/main.c:890
+#: ../src/daemon/main.c:892
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr ""
 "¡Existen cronómetros de alta resolución fresquitos y disponibles! ¡Bon "
 "appetit!"
 
-#: ../src/daemon/main.c:892
+#: ../src/daemon/main.c:894
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
@@ -392,29 +452,29 @@ msgstr ""
 "¡Amigo, su kernel deja mucho que desear! ¡El plato que hoy recomienda el "
 "chef es Linux con cronómetros de alta resolución activados!  "
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:906
 msgid "pa_core_new() failed."
 msgstr "Falló pa_core_new()."
 
-#: ../src/daemon/main.c:965
+#: ../src/daemon/main.c:967
 msgid "Failed to initialize daemon."
 msgstr "Fallo al intentar iniciar el demonio."
 
-#: ../src/daemon/main.c:970
+#: ../src/daemon/main.c:972
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr ""
 "El demonio se ha iniciado sin ningún módulo cargado, y por ello se niega a "
 "funcionar."
 
-#: ../src/daemon/main.c:983
+#: ../src/daemon/main.c:985
 msgid "Daemon startup complete."
 msgstr "El demonio se inició completamente."
 
-#: ../src/daemon/main.c:989
+#: ../src/daemon/main.c:991
 msgid "Daemon shutdown initiated."
 msgstr "Comienza a apagarse el demonio."
 
-#: ../src/daemon/main.c:1010
+#: ../src/daemon/main.c:1009
 msgid "Daemon terminated."
 msgstr "El demonio se ha apagado."
 
@@ -1123,7 +1183,7 @@ msgstr "Fallo al analizar los datos de la cookie"
 msgid "Failed to open configuration file '%s': %s"
 msgstr "Fallo al abrir el archivo de configuración '%s': %s"
 
-#: ../src/pulse/context.c:523
+#: ../src/pulse/context.c:519
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "No se ha cargado ninguna cookie. Intentando conectar de todos modos."
 
@@ -1242,67 +1302,67 @@ msgid "pa_stream_connect_record() failed: %s\n"
 msgstr "pa_stream_connect_record() falló: %s\n"
 
 #: ../src/utils/pacat.c:321 ../src/utils/pasuspender.c:159
-#: ../src/utils/pactl.c:758 ../src/utils/paplay.c:183
+#: ../src/utils/pactl.c:759 ../src/utils/paplay.c:183
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "Error en la conexión: %s\n"
 
-#: ../src/utils/pacat.c:342 ../src/utils/paplay.c:75
+#: ../src/utils/pacat.c:341 ../src/utils/paplay.c:75
 #, c-format
 msgid "Failed to drain stream: %s\n"
 msgstr "Error al drenar el flujo: %s\n"
 
-#: ../src/utils/pacat.c:347 ../src/utils/paplay.c:80
+#: ../src/utils/pacat.c:346 ../src/utils/paplay.c:80
 #, c-format
 msgid "Playback stream drained.\n"
 msgstr "El flujo de platback se ha drenado.\n"
 
-#: ../src/utils/pacat.c:357 ../src/utils/paplay.c:92
+#: ../src/utils/pacat.c:356 ../src/utils/paplay.c:92
 #, c-format
 msgid "Draining connection to server.\n"
 msgstr "Drenando conexión con el servidor.\n"
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:382
 #, c-format
 msgid "Got EOF.\n"
 msgstr "Hay EOF.\n"
 
-#: ../src/utils/pacat.c:389
+#: ../src/utils/pacat.c:388
 #, c-format
 msgid "pa_stream_drain(): %s\n"
 msgstr "pa_stream_drain(): %s\n"
 
-#: ../src/utils/pacat.c:399
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "read() failed: %s\n"
 msgstr "read() falló: %s\n"
 
-#: ../src/utils/pacat.c:431
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "write() failed: %s\n"
 msgstr "write() falló: %s\n"
 
-#: ../src/utils/pacat.c:452
+#: ../src/utils/pacat.c:451
 #, c-format
 msgid "Got signal, exiting.\n"
 msgstr "Hay señal, saliendo (exiting).\n"
 
-#: ../src/utils/pacat.c:466
+#: ../src/utils/pacat.c:465
 #, c-format
 msgid "Failed to get latency: %s\n"
 msgstr "No se pudo obtener latencia: %s\n"
 
-#: ../src/utils/pacat.c:471
+#: ../src/utils/pacat.c:470
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec.  \r"
 msgstr "Tiempo: %0.3f sec; Latencia: %0.0f usec. \r"
 
-#: ../src/utils/pacat.c:491
+#: ../src/utils/pacat.c:490
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s\n"
 msgstr "pa_stream_update_timing_info() falló: %s\n"
 
-#: ../src/utils/pacat.c:504
+#: ../src/utils/pacat.c:503
 #, c-format
 msgid ""
 "%s [options]\n"
@@ -1404,7 +1464,7 @@ msgstr ""
 "      --process-time=BYTES              Solicitar los procesos de tiempo por "
 "pedido especificados en bytes.\n"
 
-#: ../src/utils/pacat.c:605
+#: ../src/utils/pacat.c:604
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1415,88 +1475,89 @@ msgstr ""
 "Compilado con libpulse %s\n"
 "Linkeado con libpulse %s\n"
 
-#: ../src/utils/pacat.c:662
+#: ../src/utils/pacat.c:661
 #, c-format
 msgid "Invalid channel map '%s'\n"
 msgstr "Mapa de canales inválido '%s'\n"
 
-#: ../src/utils/pacat.c:691
+#: ../src/utils/pacat.c:690
 #, c-format
 msgid "Invalid latency specification '%s'\n"
 msgstr "Especificación de latencia inválida '%s'\n"
 
-#: ../src/utils/pacat.c:698
+#: ../src/utils/pacat.c:697
 #, c-format
 msgid "Invalid process time specification '%s'\n"
 msgstr "Especificación de tiempo de proceso inválida '%s'\n"
 
-#: ../src/utils/pacat.c:709
+#: ../src/utils/pacat.c:708
 #, c-format
 msgid "Invalid sample specification\n"
 msgstr "Especificación de muestra inválida\n"
 
-#: ../src/utils/pacat.c:714
+#: ../src/utils/pacat.c:713
 #, c-format
 msgid "Channel map doesn't match sample specification\n"
 msgstr "El mapa del canal no se corresponde con la especificación de muestra\n"
 
-#: ../src/utils/pacat.c:721
+#: ../src/utils/pacat.c:720
 #, c-format
 msgid "Opening a %s stream with sample specification '%s'.\n"
 msgstr "Abriendo un %s flujo con las especificaciones de muestra '%s'.\n"
 
-#: ../src/utils/pacat.c:721
+#: ../src/utils/pacat.c:720
 msgid "recording"
 msgstr "grabando"
 
-#: ../src/utils/pacat.c:721
+#: ../src/utils/pacat.c:720
 msgid "playback"
 msgstr "playback"
 
-#: ../src/utils/pacat.c:729
+#: ../src/utils/pacat.c:728
 #, c-format
 msgid "open(): %s\n"
 msgstr "open() %s\n"
 
-#: ../src/utils/pacat.c:734
+#: ../src/utils/pacat.c:733
 #, c-format
 msgid "dup2(): %s\n"
 msgstr "dup2(): %s\n"
 
-#: ../src/utils/pacat.c:744
+#: ../src/utils/pacat.c:743
 #, c-format
 msgid "Too many arguments.\n"
 msgstr "Demasiados argumentos.\n"
 
-#: ../src/utils/pacat.c:757 ../src/utils/pasuspender.c:280
-#: ../src/utils/pactl.c:1013 ../src/utils/paplay.c:381
+#: ../src/utils/pacat.c:756 ../src/utils/pasuspender.c:280
+#: ../src/utils/pactl.c:1014 ../src/utils/paplay.c:381
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new() falló.\n"
 
-#: ../src/utils/pacat.c:778
+#: ../src/utils/pacat.c:777
 #, c-format
 msgid "io_new() failed.\n"
 msgstr "io_new() falló.\n"
 
-#: ../src/utils/pacat.c:784 ../src/utils/pasuspender.c:293
-#: ../src/utils/pactl.c:1027 ../src/utils/paplay.c:396
+#: ../src/utils/pacat.c:783 ../src/utils/pasuspender.c:293
+#: ../src/utils/pactl.c:1028 ../src/utils/paplay.c:396
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new() falló.\n"
 
-#: ../src/utils/pacat.c:792
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1034
+#: ../src/utils/paplay.c:404
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_connect() falló: %s"
 
-#: ../src/utils/pacat.c:803
+#: ../src/utils/pacat.c:802
 #, c-format
 msgid "time_new() failed.\n"
 msgstr "time_new() falló.\n"
 
-#: ../src/utils/pacat.c:810 ../src/utils/pasuspender.c:301
-#: ../src/utils/pactl.c:1035 ../src/utils/paplay.c:407
+#: ../src/utils/pacat.c:809 ../src/utils/pasuspender.c:301
+#: ../src/utils/pactl.c:1039 ../src/utils/paplay.c:410
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() falló.\n"
@@ -1526,7 +1587,7 @@ msgstr "Error al continuar: %s\n"
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr "AVISO: El servidor de sonido no es local, no se suspende.\n"
 
-#: ../src/utils/pasuspender.c:176 ../src/utils/pactl.c:764
+#: ../src/utils/pasuspender.c:176 ../src/utils/pactl.c:765
 #: ../src/utils/paplay.c:191
 #, c-format
 msgid "Got SIGINT, exiting.\n"
@@ -1896,7 +1957,7 @@ msgstr "Fallo al cargar muestra: %s\n"
 msgid "Premature end of file\n"
 msgstr "Fin prematuro del archivo\n"
 
-#: ../src/utils/pactl.c:770
+#: ../src/utils/pactl.c:771
 #, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
@@ -1942,7 +2003,7 @@ msgstr ""
 "  -n, --client-name=NAME                Cómo llamar a este cliente en el "
 "servidor\n"
 
-#: ../src/utils/pactl.c:822
+#: ../src/utils/pactl.c:823
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -1953,49 +2014,49 @@ msgstr ""
 "Compilado con libpulse %s\n"
 "Linked con libpulse %s\n"
 
-#: ../src/utils/pactl.c:861
+#: ../src/utils/pactl.c:862
 #, c-format
 msgid "Please specify a sample file to load\n"
 msgstr "Por favor, especifique un archivo de muestra a cargar\n"
 
-#: ../src/utils/pactl.c:883
+#: ../src/utils/pactl.c:884
 #, c-format
 msgid "Failed to open sound file.\n"
 msgstr "Error al intentar abrir el archivo de sonido.\n"
 
-#: ../src/utils/pactl.c:895
+#: ../src/utils/pactl.c:896
 #, c-format
 msgid "You have to specify a sample name to play\n"
 msgstr "Debe especificar un nombre de muestra para ser escuchado\n"
 
-#: ../src/utils/pactl.c:907
+#: ../src/utils/pactl.c:908
 #, c-format
 msgid "You have to specify a sample name to remove\n"
 msgstr "Debe especificar un nombre de muestra para ser eliminado\n"
 
-#: ../src/utils/pactl.c:915
+#: ../src/utils/pactl.c:916
 #, c-format
 msgid "You have to specify a sink input index and a sink\n"
 msgstr ""
 "Debe especificar un índice para las entradas del destino y un destino\n"
 
-#: ../src/utils/pactl.c:924
+#: ../src/utils/pactl.c:925
 #, c-format
 msgid "You have to specify a source output index and a source\n"
 msgstr ""
 "Debe especificar un índice para las salidas de la fuente, y una fuente\n"
 
-#: ../src/utils/pactl.c:938
+#: ../src/utils/pactl.c:939
 #, c-format
 msgid "You have to specify a module name and arguments.\n"
 msgstr "Debe especificar un nombre de módulo y los argumentos\n"
 
-#: ../src/utils/pactl.c:958
+#: ../src/utils/pactl.c:959
 #, c-format
 msgid "You have to specify a module index\n"
 msgstr "Debe especificar un índice de módulo\n"
 
-#: ../src/utils/pactl.c:968
+#: ../src/utils/pactl.c:969
 #, fuzzy, c-format
 msgid ""
 "You may not specify more than one sink. You have to specify a boolean "
@@ -2004,7 +2065,7 @@ msgstr ""
 "No puede especificar más de un destino. Tiene que especificar al menos un "
 "valor booleano.\n"
 
-#: ../src/utils/pactl.c:981
+#: ../src/utils/pactl.c:982
 #, fuzzy, c-format
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
@@ -2013,13 +2074,13 @@ msgstr ""
 "No puede especificar más de una fuente. Tiene que especificar al menos un "
 "valor booleano.\n"
 
-#: ../src/utils/pactl.c:993
+#: ../src/utils/pactl.c:994
 #, fuzzy, c-format
 msgid "You have to specify a card name/index and a profile name\n"
 msgstr ""
 "Debe especificar un índice para las entradas del destino y un destino\n"
 
-#: ../src/utils/pactl.c:1008
+#: ../src/utils/pactl.c:1009
 #, c-format
 msgid "No valid command specified.\n"
 msgstr "No se ha especificadfo ningún comando válido.\n"
diff --git a/po/fi.po b/po/fi.po
index a949856..4306364 100644
--- a/po/fi.po
+++ b/po/fi.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: git trunk\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-02-13 08:57+0200\n"
+"POT-Creation-Date: 2009-02-20 03:24+0100\n"
 "PO-Revision-Date: 2009-02-13 08:57+0200\n"
 "Last-Translator: Timo Jyrinki <timo.jyrinki at iki.fi>\n"
 "Language-Team: Finnish <laatu at lokalisointi.org>\n"
@@ -15,6 +15,66 @@ msgstr ""
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
+#: ../src/modules/alsa/alsa-util.c:525
+msgid "Analog Mono"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:531
+msgid "Analog Stereo"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:537
+msgid "Digital Stereo (IEC958)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:543
+msgid "Digital Stereo (HDMI)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:550
+msgid "Analog Surround 4.0"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:557
+msgid "Digital Surround 4.0 (IEC958/AC3)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:565
+msgid "Analog Surround 4.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:573
+msgid "Analog Surround 5.0"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:581
+msgid "Analog Surround 5.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:589
+msgid "Digital Surround 5.1 (IEC958/AC3)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:598
+msgid "Analog Surround 7.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:1577
+#, c-format
+msgid ""
+"snd_pcm_avail_update() returned a value that is exceptionally large: %lu "
+"bytes (%lu ms). Most likely this is an ALSA driver bug. Please report this "
+"issue to the ALSA developers."
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:1609
+#, c-format
+msgid ""
+"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
+"(%lu ms). Most likely this is an ALSA driver bug. Please report this issue "
+"to the ALSA developers."
+msgstr ""
+
 #: ../src/daemon/ltdl-bind-now.c:124
 msgid "Failed to find original lt_dlopen loader."
 msgstr "Alkuperäisen ld_dlopen-lataimen löytäminen epäonnistui."
@@ -148,83 +208,83 @@ msgstr ""
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:429
+#: ../src/daemon/main.c:431
 msgid "Failed to parse command line."
 msgstr ""
 
-#: ../src/daemon/main.c:451
+#: ../src/daemon/main.c:453
 #, c-format
 msgid "We're in the group '%s', allowing high-priority scheduling."
 msgstr ""
 
-#: ../src/daemon/main.c:458
+#: ../src/daemon/main.c:460
 #, c-format
 msgid "We're in the group '%s', allowing real-time scheduling."
 msgstr ""
 
-#: ../src/daemon/main.c:466
+#: ../src/daemon/main.c:468
 msgid "PolicyKit grants us acquire-high-priority privilege."
 msgstr ""
 
-#: ../src/daemon/main.c:469
+#: ../src/daemon/main.c:471
 msgid "PolicyKit refuses acquire-high-priority privilege."
 msgstr ""
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:476
 msgid "PolicyKit grants us acquire-real-time privilege."
 msgstr ""
 
-#: ../src/daemon/main.c:477
+#: ../src/daemon/main.c:479
 msgid "PolicyKit refuses acquire-real-time privilege."
 msgstr ""
 
-#: ../src/daemon/main.c:506
+#: ../src/daemon/main.c:508
 msgid ""
 "Called SUID root and real-time and/or high-priority scheduling was requested "
 "in the configuration. However, we lack the necessary privileges:\n"
 "We are not in group '"
 msgstr ""
 
-#: ../src/daemon/main.c:530
+#: ../src/daemon/main.c:532
 msgid ""
 "High-priority scheduling enabled in configuration but not allowed by policy."
 msgstr ""
 
-#: ../src/daemon/main.c:559
+#: ../src/daemon/main.c:561
 msgid "Successfully increased RLIMIT_RTPRIO"
 msgstr ""
 
-#: ../src/daemon/main.c:562
+#: ../src/daemon/main.c:564
 #, c-format
 msgid "RLIMIT_RTPRIO failed: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:569
+#: ../src/daemon/main.c:571
 msgid "Giving up CAP_NICE"
 msgstr ""
 
-#: ../src/daemon/main.c:576
+#: ../src/daemon/main.c:578
 msgid ""
 "Real-time scheduling enabled in configuration but not allowed by policy."
 msgstr ""
 "Tosiaikainen ajoitus otettu käyttöön asetuksissa, mutta käytännöt eivät "
 "salli sitä."
 
-#: ../src/daemon/main.c:637
+#: ../src/daemon/main.c:639
 msgid "Daemon not running"
 msgstr "Taustaprosessi ei ole käynnissä"
 
-#: ../src/daemon/main.c:639
+#: ../src/daemon/main.c:641
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "Taustaprosessi käynnissä prosessitunnisteella %u"
 
-#: ../src/daemon/main.c:649
+#: ../src/daemon/main.c:651
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "Taustaprosessin lopettaminen epäonnistui: %s"
 
-#: ../src/daemon/main.c:667
+#: ../src/daemon/main.c:669
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
@@ -232,144 +292,144 @@ msgstr ""
 "Tätä ohjelmaa ei ole tarkoitettu suoritettavaksi pääkäyttäjänä (ellei --"
 "system ole määritelty)."
 
-#: ../src/daemon/main.c:669
+#: ../src/daemon/main.c:671
 msgid "Root privileges required."
 msgstr "Pääkäyttäjän (root) oikeudet vaaditaan."
 
-#: ../src/daemon/main.c:674
+#: ../src/daemon/main.c:676
 msgid "--start not supported for system instances."
 msgstr ""
 
-#: ../src/daemon/main.c:679
+#: ../src/daemon/main.c:681
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr ""
 
-#: ../src/daemon/main.c:682
+#: ../src/daemon/main.c:684
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr ""
 
-#: ../src/daemon/main.c:685
+#: ../src/daemon/main.c:687
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr ""
 "Suoritetaan järjestelmätilassa, otetaan SHM-tila pakotetusti pois käytöstä."
 
-#: ../src/daemon/main.c:690
+#: ../src/daemon/main.c:692
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr ""
 "Suoritetaan järjestelmätilassa, otetaan poistumisen joutenoloaika "
 "pakotetusti pois käytöstä."
 
-#: ../src/daemon/main.c:717
+#: ../src/daemon/main.c:719
 msgid "Failed to acquire stdio."
 msgstr ""
 
-#: ../src/daemon/main.c:723
+#: ../src/daemon/main.c:725
 #, c-format
 msgid "pipe failed: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:728
+#: ../src/daemon/main.c:730
 #, c-format
 msgid "fork() failed: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:742
+#: ../src/daemon/main.c:744
 #, c-format
 msgid "read() failed: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:748
+#: ../src/daemon/main.c:750
 msgid "Daemon startup failed."
 msgstr "Taustaprosessin käynnistys epäonnistui."
 
-#: ../src/daemon/main.c:750
+#: ../src/daemon/main.c:752
 msgid "Daemon startup successful."
 msgstr "Taustaprosessin käynnistys onnistui."
 
-#: ../src/daemon/main.c:820
+#: ../src/daemon/main.c:822
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "Tämä on PulseAudio %s"
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:823
 #, c-format
 msgid "Compilation host: %s"
 msgstr "Käännöksen isäntäkone: %s"
 
-#: ../src/daemon/main.c:822
+#: ../src/daemon/main.c:824
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "Käännösaikaiset C-liput (CFLAGS): %s"
 
-#: ../src/daemon/main.c:825
+#: ../src/daemon/main.c:827
 #, c-format
 msgid "Running on host: %s"
 msgstr "Käynnissä isäntäkoneella: %s"
 
-#: ../src/daemon/main.c:828
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "Found %u CPUs."
 msgstr "Löydettiin %u CPU:ta."
 
-#: ../src/daemon/main.c:830
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "Sivun koko on %lu tavua"
 
-#: ../src/daemon/main.c:833
+#: ../src/daemon/main.c:835
 msgid "Compiled with Valgrind support: yes"
 msgstr "Käännetty Valgrind-tuella: kyllä"
 
-#: ../src/daemon/main.c:835
+#: ../src/daemon/main.c:837
 msgid "Compiled with Valgrind support: no"
 msgstr "Käännetty Valgrind-tuella: ei"
 
-#: ../src/daemon/main.c:838
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "Käynnissä valgrind-tilassa: %s"
 
-#: ../src/daemon/main.c:841
+#: ../src/daemon/main.c:843
 msgid "Optimized build: yes"
 msgstr "Optimoitu rakentaminen: kyllä"
 
-#: ../src/daemon/main.c:843
+#: ../src/daemon/main.c:845
 msgid "Optimized build: no"
 msgstr "Optimoitu rakentaminen: ei"
 
-#: ../src/daemon/main.c:847
+#: ../src/daemon/main.c:849
 msgid "Failed to get machine ID"
 msgstr "Konetunnisteen nouto epäonnistui"
 
-#: ../src/daemon/main.c:850
+#: ../src/daemon/main.c:852
 #, c-format
 msgid "Machine ID is %s."
 msgstr "Konetunniste on %s."
 
-#: ../src/daemon/main.c:855
+#: ../src/daemon/main.c:857
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "Käytetään ajonaikaista hakemistoa %s."
 
-#: ../src/daemon/main.c:860
+#: ../src/daemon/main.c:862
 #, c-format
 msgid "Using state directory %s."
 msgstr "Käytetään tilahakemistoa %s."
 
-#: ../src/daemon/main.c:863
+#: ../src/daemon/main.c:865
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "Suoritetaan järjestelmätilassa: %s"
 
-#: ../src/daemon/main.c:878
+#: ../src/daemon/main.c:880
 msgid "pa_pid_file_create() failed."
 msgstr ""
 
-#: ../src/daemon/main.c:890
+#: ../src/daemon/main.c:892
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "Korkean tarkkuuden ajastimet käytettävissä."
 
-#: ../src/daemon/main.c:892
+#: ../src/daemon/main.c:894
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
@@ -377,29 +437,29 @@ msgstr ""
 "Hei, ytimesi on kehno! Linux korkean tarkkuuden ajastimien tuella on hyvin "
 "suositeltava!"
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:906
 msgid "pa_core_new() failed."
 msgstr ""
 
-#: ../src/daemon/main.c:965
+#: ../src/daemon/main.c:967
 msgid "Failed to initialize daemon."
 msgstr "Taustaprosessin alustus epäonnistui."
 
-#: ../src/daemon/main.c:970
+#: ../src/daemon/main.c:972
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr ""
 "Taustaprosessin käynnistys ilman ladattavia moduuleita, kieltäydytään "
 "toiminnasta."
 
-#: ../src/daemon/main.c:983
+#: ../src/daemon/main.c:985
 msgid "Daemon startup complete."
 msgstr "Taustaprosessin käynnistys valmis."
 
-#: ../src/daemon/main.c:989
+#: ../src/daemon/main.c:991
 msgid "Daemon shutdown initiated."
 msgstr "Taustaprosessin sulkeminen käynnistetty."
 
-#: ../src/daemon/main.c:1010
+#: ../src/daemon/main.c:1009
 msgid "Daemon terminated."
 msgstr "Taustaprosessi lopetettu."
 
@@ -1021,7 +1081,7 @@ msgstr "Evästetietojen jäsennys epäonnistui"
 msgid "Failed to open configuration file '%s': %s"
 msgstr ""
 
-#: ../src/pulse/context.c:523
+#: ../src/pulse/context.c:519
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "Ei ladattua evästettä. Yritetään yhdistämistä ilman."
 
@@ -1140,67 +1200,67 @@ msgid "pa_stream_connect_record() failed: %s\n"
 msgstr ""
 
 #: ../src/utils/pacat.c:321 ../src/utils/pasuspender.c:159
-#: ../src/utils/pactl.c:758 ../src/utils/paplay.c:183
+#: ../src/utils/pactl.c:759 ../src/utils/paplay.c:183
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "Yhteysvirhe: %s\n"
 
-#: ../src/utils/pacat.c:342 ../src/utils/paplay.c:75
+#: ../src/utils/pacat.c:341 ../src/utils/paplay.c:75
 #, c-format
 msgid "Failed to drain stream: %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:347 ../src/utils/paplay.c:80
+#: ../src/utils/pacat.c:346 ../src/utils/paplay.c:80
 #, c-format
 msgid "Playback stream drained.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:357 ../src/utils/paplay.c:92
+#: ../src/utils/pacat.c:356 ../src/utils/paplay.c:92
 #, c-format
 msgid "Draining connection to server.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:382
 #, c-format
 msgid "Got EOF.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:389
+#: ../src/utils/pacat.c:388
 #, c-format
 msgid "pa_stream_drain(): %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:399
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "read() failed: %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:431
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "write() failed: %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:452
+#: ../src/utils/pacat.c:451
 #, c-format
 msgid "Got signal, exiting.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:466
+#: ../src/utils/pacat.c:465
 #, c-format
 msgid "Failed to get latency: %s\n"
 msgstr "Latenssin selvittäminen epäonnistui: %s\n"
 
-#: ../src/utils/pacat.c:471
+#: ../src/utils/pacat.c:470
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec.  \r"
 msgstr "Aika: %0.3f s; latenssi: %0.0f μs.  \r"
 
-#: ../src/utils/pacat.c:491
+#: ../src/utils/pacat.c:490
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:504
+#: ../src/utils/pacat.c:503
 #, c-format
 msgid ""
 "%s [options]\n"
@@ -1253,7 +1313,7 @@ msgid ""
 "per request in bytes.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:605
+#: ../src/utils/pacat.c:604
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1261,88 +1321,89 @@ msgid ""
 "Linked with libpulse %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:662
+#: ../src/utils/pacat.c:661
 #, c-format
 msgid "Invalid channel map '%s'\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:691
+#: ../src/utils/pacat.c:690
 #, c-format
 msgid "Invalid latency specification '%s'\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:698
+#: ../src/utils/pacat.c:697
 #, c-format
 msgid "Invalid process time specification '%s'\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:709
+#: ../src/utils/pacat.c:708
 #, c-format
 msgid "Invalid sample specification\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:714
+#: ../src/utils/pacat.c:713
 #, c-format
 msgid "Channel map doesn't match sample specification\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:721
+#: ../src/utils/pacat.c:720
 #, c-format
 msgid "Opening a %s stream with sample specification '%s'.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:721
+#: ../src/utils/pacat.c:720
 msgid "recording"
 msgstr "nauhoitus"
 
-#: ../src/utils/pacat.c:721
+#: ../src/utils/pacat.c:720
 msgid "playback"
 msgstr "toisto"
 
-#: ../src/utils/pacat.c:729
+#: ../src/utils/pacat.c:728
 #, c-format
 msgid "open(): %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:734
+#: ../src/utils/pacat.c:733
 #, c-format
 msgid "dup2(): %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:744
+#: ../src/utils/pacat.c:743
 #, c-format
 msgid "Too many arguments.\n"
 msgstr "Liian monta argumenttia.\n"
 
-#: ../src/utils/pacat.c:757 ../src/utils/pasuspender.c:280
-#: ../src/utils/pactl.c:1013 ../src/utils/paplay.c:381
+#: ../src/utils/pacat.c:756 ../src/utils/pasuspender.c:280
+#: ../src/utils/pactl.c:1014 ../src/utils/paplay.c:381
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:778
+#: ../src/utils/pacat.c:777
 #, c-format
 msgid "io_new() failed.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:784 ../src/utils/pasuspender.c:293
-#: ../src/utils/pactl.c:1027 ../src/utils/paplay.c:396
+#: ../src/utils/pacat.c:783 ../src/utils/pasuspender.c:293
+#: ../src/utils/pactl.c:1028 ../src/utils/paplay.c:396
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:792
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1034
+#: ../src/utils/paplay.c:404
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr ""
 
-#: ../src/utils/pacat.c:803
+#: ../src/utils/pacat.c:802
 #, c-format
 msgid "time_new() failed.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:810 ../src/utils/pasuspender.c:301
-#: ../src/utils/pactl.c:1035 ../src/utils/paplay.c:407
+#: ../src/utils/pacat.c:809 ../src/utils/pasuspender.c:301
+#: ../src/utils/pactl.c:1039 ../src/utils/paplay.c:410
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr ""
@@ -1372,7 +1433,7 @@ msgstr ""
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:176 ../src/utils/pactl.c:764
+#: ../src/utils/pasuspender.c:176 ../src/utils/pactl.c:765
 #: ../src/utils/paplay.c:191
 #, c-format
 msgid "Got SIGINT, exiting.\n"
@@ -1746,7 +1807,7 @@ msgstr ""
 msgid "Premature end of file\n"
 msgstr "Ennenaikainen tiedoston päättyminen\n"
 
-#: ../src/utils/pactl.c:770
+#: ../src/utils/pactl.c:771
 #, c-format
 msgid ""
 "%s [options] stat\n"
@@ -1772,7 +1833,7 @@ msgid ""
 "server\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:822
+#: ../src/utils/pactl.c:823
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -1780,66 +1841,66 @@ msgid ""
 "Linked with libpulse %s\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:861
+#: ../src/utils/pactl.c:862
 #, c-format
 msgid "Please specify a sample file to load\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:883
+#: ../src/utils/pactl.c:884
 #, c-format
 msgid "Failed to open sound file.\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:895
+#: ../src/utils/pactl.c:896
 #, c-format
 msgid "You have to specify a sample name to play\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:907
+#: ../src/utils/pactl.c:908
 #, c-format
 msgid "You have to specify a sample name to remove\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:915
+#: ../src/utils/pactl.c:916
 #, c-format
 msgid "You have to specify a sink input index and a sink\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:924
+#: ../src/utils/pactl.c:925
 #, c-format
 msgid "You have to specify a source output index and a source\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:938
+#: ../src/utils/pactl.c:939
 #, c-format
 msgid "You have to specify a module name and arguments.\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:958
+#: ../src/utils/pactl.c:959
 #, c-format
 msgid "You have to specify a module index\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:968
+#: ../src/utils/pactl.c:969
 #, c-format
 msgid ""
 "You may not specify more than one sink. You have to specify a boolean "
 "value.\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:981
+#: ../src/utils/pactl.c:982
 #, c-format
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value.\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:993
+#: ../src/utils/pactl.c:994
 #, c-format
 msgid "You have to specify a card name/index and a profile name\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:1008
+#: ../src/utils/pactl.c:1009
 #, c-format
 msgid "No valid command specified.\n"
 msgstr ""
diff --git a/po/fr.po b/po/fr.po
index 2bfafec..3706e6b 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -10,7 +10,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio trunk\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-02-12 16:57+0100\n"
+"POT-Creation-Date: 2009-02-20 03:24+0100\n"
 "PO-Revision-Date: 2008-10-18 20:34+0200\n"
 "Last-Translator: Pablo Martin-Gomez <pablo.martin-gomez at laposte.net>\n"
 "Language-Team: Français <fedora-trans-fr at redhat.com>\n"
@@ -19,6 +19,66 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=n>1;\n"
 
+#: ../src/modules/alsa/alsa-util.c:525
+msgid "Analog Mono"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:531
+msgid "Analog Stereo"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:537
+msgid "Digital Stereo (IEC958)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:543
+msgid "Digital Stereo (HDMI)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:550
+msgid "Analog Surround 4.0"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:557
+msgid "Digital Surround 4.0 (IEC958/AC3)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:565
+msgid "Analog Surround 4.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:573
+msgid "Analog Surround 5.0"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:581
+msgid "Analog Surround 5.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:589
+msgid "Digital Surround 5.1 (IEC958/AC3)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:598
+msgid "Analog Surround 7.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:1577
+#, c-format
+msgid ""
+"snd_pcm_avail_update() returned a value that is exceptionally large: %lu "
+"bytes (%lu ms). Most likely this is an ALSA driver bug. Please report this "
+"issue to the ALSA developers."
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:1609
+#, c-format
+msgid ""
+"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
+"(%lu ms). Most likely this is an ALSA driver bug. Please report this issue "
+"to the ALSA developers."
+msgstr ""
+
 #: ../src/daemon/ltdl-bind-now.c:124
 #, fuzzy
 msgid "Failed to find original lt_dlopen loader."
@@ -155,40 +215,40 @@ msgstr "Mode système étendu non pris en charge sur cette plateforme."
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) a échoué : %s"
 
-#: ../src/daemon/main.c:429
+#: ../src/daemon/main.c:431
 msgid "Failed to parse command line."
 msgstr "Échec lors de l'analyse de la ligne de commande"
 
-#: ../src/daemon/main.c:451
+#: ../src/daemon/main.c:453
 #, c-format
 msgid "We're in the group '%s', allowing high-priority scheduling."
 msgstr ""
 "Nous sommes dans le groupe « %s », permettant une planification à haute "
 "priorité."
 
-#: ../src/daemon/main.c:458
+#: ../src/daemon/main.c:460
 #, c-format
 msgid "We're in the group '%s', allowing real-time scheduling."
 msgstr ""
 "Nous sommes dans le groupe « %s », permettant une planification en temps réel."
 
-#: ../src/daemon/main.c:466
+#: ../src/daemon/main.c:468
 msgid "PolicyKit grants us acquire-high-priority privilege."
 msgstr "PolicyKit a accordé l'acquisition des permissions de haute priorité."
 
-#: ../src/daemon/main.c:469
+#: ../src/daemon/main.c:471
 msgid "PolicyKit refuses acquire-high-priority privilege."
 msgstr "PolicyKit a refusé l'acquisition des permissions de haute priorité."
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:476
 msgid "PolicyKit grants us acquire-real-time privilege."
 msgstr "PolicyKit a accordé l'acquisition des permissions de temps réel."
 
-#: ../src/daemon/main.c:477
+#: ../src/daemon/main.c:479
 msgid "PolicyKit refuses acquire-real-time privilege."
 msgstr "PolicyKit a refusé l'acquisition des permissions de temps réel."
 
-#: ../src/daemon/main.c:506
+#: ../src/daemon/main.c:508
 #, fuzzy
 msgid ""
 "Called SUID root and real-time and/or high-priority scheduling was requested "
@@ -200,48 +260,48 @@ msgstr ""
 "nécessaires :\n"
 "nous ne somme pas dans le groupe "
 
-#: ../src/daemon/main.c:530
+#: ../src/daemon/main.c:532
 msgid ""
 "High-priority scheduling enabled in configuration but not allowed by policy."
 msgstr ""
 "La planification à haute priorité est activée dans la configuration mais "
 "n'est pas permise par la politique."
 
-#: ../src/daemon/main.c:559
+#: ../src/daemon/main.c:561
 msgid "Successfully increased RLIMIT_RTPRIO"
 msgstr "Augmentation de RLIMIT_RTPRIO réussie"
 
-#: ../src/daemon/main.c:562
+#: ../src/daemon/main.c:564
 #, c-format
 msgid "RLIMIT_RTPRIO failed: %s"
 msgstr "RLIMIT_RTPRIO a échoué : %s"
 
-#: ../src/daemon/main.c:569
+#: ../src/daemon/main.c:571
 msgid "Giving up CAP_NICE"
 msgstr "Abandon de CAP_NICE"
 
-#: ../src/daemon/main.c:576
+#: ../src/daemon/main.c:578
 msgid ""
 "Real-time scheduling enabled in configuration but not allowed by policy."
 msgstr ""
 "La planification en temps réel est activée mais n'est pas permise par la "
 "politique."
 
-#: ../src/daemon/main.c:637
+#: ../src/daemon/main.c:639
 msgid "Daemon not running"
 msgstr "Lé démon n'est pas lancé"
 
-#: ../src/daemon/main.c:639
+#: ../src/daemon/main.c:641
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "Le démon est lancé avec le PID %u"
 
-#: ../src/daemon/main.c:649
+#: ../src/daemon/main.c:651
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "Impossible de tuer le démon : %s"
 
-#: ../src/daemon/main.c:667
+#: ../src/daemon/main.c:669
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
@@ -249,148 +309,148 @@ msgstr ""
 "Le programme n'est pas conçu pour être lancé en tant que root (sauf si --"
 "system est renseigné)."
 
-#: ../src/daemon/main.c:669
+#: ../src/daemon/main.c:671
 #, fuzzy
 msgid "Root privileges required."
 msgstr "Les permissions root sont nécessaires."
 
-#: ../src/daemon/main.c:674
+#: ../src/daemon/main.c:676
 msgid "--start not supported for system instances."
 msgstr "--start n'est pas pris en charge pour les instances système."
 
-#: ../src/daemon/main.c:679
+#: ../src/daemon/main.c:681
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr ""
 "Le démon s'exécute en mode système, mais --disallow-exit n'est pas défini."
 
-#: ../src/daemon/main.c:682
+#: ../src/daemon/main.c:684
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr ""
 "Le démon s'exécute en mode système, mais --disallow-module-loading n'est pas "
 "défini."
 
-#: ../src/daemon/main.c:685
+#: ../src/daemon/main.c:687
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr "Le démon s'exécute en mode système, désactivation forcée du mode SHM."
 
-#: ../src/daemon/main.c:690
+#: ../src/daemon/main.c:692
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr ""
 "Le démon s'exécute en mode système, désactivation forcée de la fermeture "
 "après délai d'inactivité."
 
-#: ../src/daemon/main.c:717
+#: ../src/daemon/main.c:719
 msgid "Failed to acquire stdio."
 msgstr "Échec lors de l'acquisition de stdio."
 
-#: ../src/daemon/main.c:723
+#: ../src/daemon/main.c:725
 #, c-format
 msgid "pipe failed: %s"
 msgstr "Échec du tube : %s"
 
-#: ../src/daemon/main.c:728
+#: ../src/daemon/main.c:730
 #, c-format
 msgid "fork() failed: %s"
 msgstr "Échec de fork() : %s"
 
-#: ../src/daemon/main.c:742
+#: ../src/daemon/main.c:744
 #, c-format
 msgid "read() failed: %s"
 msgstr "Échec de read() : %s"
 
-#: ../src/daemon/main.c:748
+#: ../src/daemon/main.c:750
 msgid "Daemon startup failed."
 msgstr "Échec lors du démarrage du démon."
 
-#: ../src/daemon/main.c:750
+#: ../src/daemon/main.c:752
 msgid "Daemon startup successful."
 msgstr "Démarrage du démon réussi."
 
-#: ../src/daemon/main.c:820
+#: ../src/daemon/main.c:822
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "Pulseaudio %s"
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:823
 #, c-format
 msgid "Compilation host: %s"
 msgstr "Hôte de compilation : %s"
 
-#: ../src/daemon/main.c:822
+#: ../src/daemon/main.c:824
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "CFLAGS de compilation : %s"
 
-#: ../src/daemon/main.c:825
+#: ../src/daemon/main.c:827
 #, c-format
 msgid "Running on host: %s"
 msgstr "Exécution sur l'hôte : %s"
 
-#: ../src/daemon/main.c:828
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "Found %u CPUs."
 msgstr ""
 
-#: ../src/daemon/main.c:830
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "La taille de la page est de %lu octets"
 
-#: ../src/daemon/main.c:833
+#: ../src/daemon/main.c:835
 msgid "Compiled with Valgrind support: yes"
 msgstr "Compilé avec la prise en charge Valgrind : oui"
 
-#: ../src/daemon/main.c:835
+#: ../src/daemon/main.c:837
 msgid "Compiled with Valgrind support: no"
 msgstr "Compilé avec la prise en charge Valgrind : non"
 
-#: ../src/daemon/main.c:838
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "Exécution en mode valgrind : %s"
 
-#: ../src/daemon/main.c:841
+#: ../src/daemon/main.c:843
 msgid "Optimized build: yes"
 msgstr "Construction optimisée : oui"
 
-#: ../src/daemon/main.c:843
+#: ../src/daemon/main.c:845
 msgid "Optimized build: no"
 msgstr "Construction optimisée : non"
 
-#: ../src/daemon/main.c:847
+#: ../src/daemon/main.c:849
 msgid "Failed to get machine ID"
 msgstr "Échec lors de l'obtention de l'ID de la machine"
 
-#: ../src/daemon/main.c:850
+#: ../src/daemon/main.c:852
 #, c-format
 msgid "Machine ID is %s."
 msgstr "L'ID de la machine est %s."
 
-#: ../src/daemon/main.c:855
+#: ../src/daemon/main.c:857
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "Utilisation du répertoire d'exécution %s."
 
-#: ../src/daemon/main.c:860
+#: ../src/daemon/main.c:862
 #, c-format
 msgid "Using state directory %s."
 msgstr "Utilisation du répertoire d'état %s."
 
-#: ../src/daemon/main.c:863
+#: ../src/daemon/main.c:865
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "Exécution en mode système : %s"
 
-#: ../src/daemon/main.c:878
+#: ../src/daemon/main.c:880
 msgid "pa_pid_file_create() failed."
 msgstr "Échec de pa_pid_file_create()."
 
-#: ../src/daemon/main.c:890
+#: ../src/daemon/main.c:892
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr ""
 "De nouvelles horloges à haute résolution sont disponibles ! Bon appétit !"
 
-#: ../src/daemon/main.c:892
+#: ../src/daemon/main.c:894
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
@@ -398,27 +458,27 @@ msgstr ""
 "Eh mec, ton noyau il pue ! La recommandation d'aujourd'hui du patron est "
 "d'activer les horloges à haute résolution sur ton Linux."
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:906
 msgid "pa_core_new() failed."
 msgstr "Échec de pa_core_new()."
 
-#: ../src/daemon/main.c:965
+#: ../src/daemon/main.c:967
 msgid "Failed to initialize daemon."
 msgstr "Échec lors de l'initialisation du démon"
 
-#: ../src/daemon/main.c:970
+#: ../src/daemon/main.c:972
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr "Démarrage du démon sans aucun module chargé : refus de fonctionner."
 
-#: ../src/daemon/main.c:983
+#: ../src/daemon/main.c:985
 msgid "Daemon startup complete."
 msgstr "Démarrage du démon effectué."
 
-#: ../src/daemon/main.c:989
+#: ../src/daemon/main.c:991
 msgid "Daemon shutdown initiated."
 msgstr "Fermeture du démon initiée."
 
-#: ../src/daemon/main.c:1010
+#: ../src/daemon/main.c:1009
 msgid "Daemon terminated."
 msgstr "Démon terminé."
 
@@ -1127,7 +1187,7 @@ msgstr "Échec lors de l'analyse des données du cookie"
 msgid "Failed to open configuration file '%s': %s"
 msgstr "Échec lors de l'ouverture du fichier de configuration « %s » :%s"
 
-#: ../src/pulse/context.c:523
+#: ../src/pulse/context.c:519
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "Aucun cookie chargé. Tentative de connexion sans celui-ci."
 
@@ -1249,62 +1309,62 @@ msgid "pa_stream_connect_record() failed: %s\n"
 msgstr "Échec de pa_stream_connect_record() : %s\n"
 
 #: ../src/utils/pacat.c:321 ../src/utils/pasuspender.c:159
-#: ../src/utils/pactl.c:758 ../src/utils/paplay.c:183
+#: ../src/utils/pactl.c:759 ../src/utils/paplay.c:183
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "Échec lors de la connexion : %s\n"
 
-#: ../src/utils/pacat.c:342 ../src/utils/paplay.c:75
+#: ../src/utils/pacat.c:341 ../src/utils/paplay.c:75
 #, c-format
 msgid "Failed to drain stream: %s\n"
 msgstr "Échec lors du vidage du flux : %s\n"
 
-#: ../src/utils/pacat.c:347 ../src/utils/paplay.c:80
+#: ../src/utils/pacat.c:346 ../src/utils/paplay.c:80
 #, c-format
 msgid "Playback stream drained.\n"
 msgstr "Flux de lecture vidé.\n"
 
-#: ../src/utils/pacat.c:357 ../src/utils/paplay.c:92
+#: ../src/utils/pacat.c:356 ../src/utils/paplay.c:92
 #, c-format
 msgid "Draining connection to server.\n"
 msgstr "Vidage de la connexion au serveur.\n"
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:382
 #, c-format
 msgid "Got EOF.\n"
 msgstr "EOF obtenu.\n"
 
-#: ../src/utils/pacat.c:389
+#: ../src/utils/pacat.c:388
 #, c-format
 msgid "pa_stream_drain(): %s\n"
 msgstr "pa_stream_drain() : %s\n"
 
-#: ../src/utils/pacat.c:399
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "read() failed: %s\n"
 msgstr "Échec de read() : %s\n"
 
-#: ../src/utils/pacat.c:431
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "write() failed: %s\n"
 msgstr "Échec de write() : %s\n"
 
-#: ../src/utils/pacat.c:452
+#: ../src/utils/pacat.c:451
 #, c-format
 msgid "Got signal, exiting.\n"
 msgstr "Signal obtenu, fermeture.\n"
 
-#: ../src/utils/pacat.c:466
+#: ../src/utils/pacat.c:465
 #, c-format
 msgid "Failed to get latency: %s\n"
 msgstr "Échec lors de l'obtention de la latence : %s\n"
 
-#: ../src/utils/pacat.c:471
+#: ../src/utils/pacat.c:470
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec.  \r"
 msgstr "Durée : %0.3f s ; Latency : %0.0f µs.  \r"
 
-#: ../src/utils/pacat.c:491
+#: ../src/utils/pacat.c:490
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s\n"
 msgstr "Échec de pa_stream_update_timing_info() : %s\n"
@@ -1312,7 +1372,7 @@ msgstr "Échec de pa_stream_update_timing_info() : %s\n"
 # downmix = par ex. convertir 5 canaux en 2 canaux
 # upmixer = par ex. convertir 2 canaux en 5 canaux
 # https://bugzilla.redhat.com/show_bug.cgi?id=460798
-#: ../src/utils/pacat.c:504
+#: ../src/utils/pacat.c:503
 #, c-format
 msgid ""
 "%s [options]\n"
@@ -1416,7 +1476,7 @@ msgstr ""
 "      --process-time=OCTETS             Demande le temps de traitement "
 "indiqué par requête en octets.\n"
 
-#: ../src/utils/pacat.c:605
+#: ../src/utils/pacat.c:604
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1427,89 +1487,90 @@ msgstr ""
 "Compilé avec libpulse %s\n"
 "Lié avec libpulse %s\n"
 
-#: ../src/utils/pacat.c:662
+#: ../src/utils/pacat.c:661
 #, c-format
 msgid "Invalid channel map '%s'\n"
 msgstr "Plan des canaux invalide « %s »\n"
 
-#: ../src/utils/pacat.c:691
+#: ../src/utils/pacat.c:690
 #, c-format
 msgid "Invalid latency specification '%s'\n"
 msgstr "Spécification de latence invalide « %s »\n"
 
-#: ../src/utils/pacat.c:698
+#: ../src/utils/pacat.c:697
 #, c-format
 msgid "Invalid process time specification '%s'\n"
 msgstr "Spécification de temps de traitement invalide « %s »\n"
 
-#: ../src/utils/pacat.c:709
+#: ../src/utils/pacat.c:708
 #, c-format
 msgid "Invalid sample specification\n"
 msgstr "Spécification d'échantillon invalide\n"
 
-#: ../src/utils/pacat.c:714
+#: ../src/utils/pacat.c:713
 #, c-format
 msgid "Channel map doesn't match sample specification\n"
 msgstr ""
 "Le plan des canaux ne correspond pas à la spécification d'échantillon\n"
 
-#: ../src/utils/pacat.c:721
+#: ../src/utils/pacat.c:720
 #, c-format
 msgid "Opening a %s stream with sample specification '%s'.\n"
 msgstr "Ouverture d'un flux %s avec une spécification d'échantillon « %s ».\n"
 
-#: ../src/utils/pacat.c:721
+#: ../src/utils/pacat.c:720
 msgid "recording"
 msgstr "enregistrement"
 
-#: ../src/utils/pacat.c:721
+#: ../src/utils/pacat.c:720
 msgid "playback"
 msgstr "lecture"
 
-#: ../src/utils/pacat.c:729
+#: ../src/utils/pacat.c:728
 #, c-format
 msgid "open(): %s\n"
 msgstr "open() : %s\n"
 
-#: ../src/utils/pacat.c:734
+#: ../src/utils/pacat.c:733
 #, c-format
 msgid "dup2(): %s\n"
 msgstr "dup2() : %s\n"
 
-#: ../src/utils/pacat.c:744
+#: ../src/utils/pacat.c:743
 #, c-format
 msgid "Too many arguments.\n"
 msgstr "Trop de paramètres.\n"
 
-#: ../src/utils/pacat.c:757 ../src/utils/pasuspender.c:280
-#: ../src/utils/pactl.c:1013 ../src/utils/paplay.c:381
+#: ../src/utils/pacat.c:756 ../src/utils/pasuspender.c:280
+#: ../src/utils/pactl.c:1014 ../src/utils/paplay.c:381
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "Échec de pa_mainloop_new().\n"
 
-#: ../src/utils/pacat.c:778
+#: ../src/utils/pacat.c:777
 #, c-format
 msgid "io_new() failed.\n"
 msgstr "Échec de io_new().\n"
 
-#: ../src/utils/pacat.c:784 ../src/utils/pasuspender.c:293
-#: ../src/utils/pactl.c:1027 ../src/utils/paplay.c:396
+#: ../src/utils/pacat.c:783 ../src/utils/pasuspender.c:293
+#: ../src/utils/pactl.c:1028 ../src/utils/paplay.c:396
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "Échec de pa_context_new().\n"
 
-#: ../src/utils/pacat.c:792
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1034
+#: ../src/utils/paplay.c:404
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "Échec de pa_context_connect() : %s"
 
-#: ../src/utils/pacat.c:803
+#: ../src/utils/pacat.c:802
 #, c-format
 msgid "time_new() failed.\n"
 msgstr "Échec de time_new().\n"
 
-#: ../src/utils/pacat.c:810 ../src/utils/pasuspender.c:301
-#: ../src/utils/pactl.c:1035 ../src/utils/paplay.c:407
+#: ../src/utils/pacat.c:809 ../src/utils/pasuspender.c:301
+#: ../src/utils/pactl.c:1039 ../src/utils/paplay.c:410
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "Échec de pa_mainloop_run().\n"
@@ -1540,7 +1601,7 @@ msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr ""
 "AVERTISSEMENT : le serveur de son n'est pas local, suspension annulée.\n"
 
-#: ../src/utils/pasuspender.c:176 ../src/utils/pactl.c:764
+#: ../src/utils/pasuspender.c:176 ../src/utils/pactl.c:765
 #: ../src/utils/paplay.c:191
 #, c-format
 msgid "Got SIGINT, exiting.\n"
@@ -1917,7 +1978,7 @@ msgstr "Échec lors de l'envoi de l'échantillon : %s\n"
 msgid "Premature end of file\n"
 msgstr "Fin prématurée du fichier\n"
 
-#: ../src/utils/pactl.c:770
+#: ../src/utils/pactl.c:771
 #, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
@@ -1963,7 +2024,7 @@ msgstr ""
 "  -n, --client-name=NOM                 Définit le nom de ce client sur le "
 "serveur\n"
 
-#: ../src/utils/pactl.c:822
+#: ../src/utils/pactl.c:823
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -1974,48 +2035,48 @@ msgstr ""
 "Compilé avec libpulse %s\n"
 "Lié avec libpulse %s\n"
 
-#: ../src/utils/pactl.c:861
+#: ../src/utils/pactl.c:862
 #, c-format
 msgid "Please specify a sample file to load\n"
 msgstr "Veuillez indiquer un fichier d'échantillon à charger\n"
 
-#: ../src/utils/pactl.c:883
+#: ../src/utils/pactl.c:884
 #, c-format
 msgid "Failed to open sound file.\n"
 msgstr "Échec lors de l'ouverture du fichier audio.\n"
 
-#: ../src/utils/pactl.c:895
+#: ../src/utils/pactl.c:896
 #, c-format
 msgid "You have to specify a sample name to play\n"
 msgstr "Vous devez indiquer un nom d'échantillon à lire\n"
 
-#: ../src/utils/pactl.c:907
+#: ../src/utils/pactl.c:908
 #, c-format
 msgid "You have to specify a sample name to remove\n"
 msgstr "Vous devez indiquer un nom d'échantillon à supprimer\n"
 
-#: ../src/utils/pactl.c:915
+#: ../src/utils/pactl.c:916
 #, c-format
 msgid "You have to specify a sink input index and a sink\n"
 msgstr ""
 "Vous devez indiquer un index de sortie de destination et une destination\n"
 
-#: ../src/utils/pactl.c:924
+#: ../src/utils/pactl.c:925
 #, c-format
 msgid "You have to specify a source output index and a source\n"
 msgstr "Vous devez indiquer un index de sortie de source et une source\n"
 
-#: ../src/utils/pactl.c:938
+#: ../src/utils/pactl.c:939
 #, c-format
 msgid "You have to specify a module name and arguments.\n"
 msgstr "Vous devez indiquer un nom de module et des paramètres.\n"
 
-#: ../src/utils/pactl.c:958
+#: ../src/utils/pactl.c:959
 #, c-format
 msgid "You have to specify a module index\n"
 msgstr "Vous devez indiquer un index de module\n"
 
-#: ../src/utils/pactl.c:968
+#: ../src/utils/pactl.c:969
 #, fuzzy, c-format
 msgid ""
 "You may not specify more than one sink. You have to specify a boolean "
@@ -2024,7 +2085,7 @@ msgstr ""
 "Vous ne pouvez pas indiquer plus d'une destination. Vous devez indiquer au "
 "moins une valeur booléenne.\n"
 
-#: ../src/utils/pactl.c:981
+#: ../src/utils/pactl.c:982
 #, fuzzy, c-format
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
@@ -2033,13 +2094,13 @@ msgstr ""
 "Vous ne pouvez pas indiquer plus d'une source. Vous devez indiquer au moins "
 "une valeur booléenne.\n"
 
-#: ../src/utils/pactl.c:993
+#: ../src/utils/pactl.c:994
 #, fuzzy, c-format
 msgid "You have to specify a card name/index and a profile name\n"
 msgstr ""
 "Vous devez indiquer un index de sortie de destination et une destination\n"
 
-#: ../src/utils/pactl.c:1008
+#: ../src/utils/pactl.c:1009
 #, c-format
 msgid "No valid command specified.\n"
 msgstr "Aucune commande valide indiquée.\n"
diff --git a/po/pl.po b/po/pl.po
index 6967aed..0741c9f 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -5,7 +5,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pl\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-02-12 16:57+0100\n"
+"POT-Creation-Date: 2009-02-20 03:24+0100\n"
 "PO-Revision-Date: 2009-02-05 22:09+0100\n"
 "Last-Translator: Piotr DrÄ…g <piotrdrag at gmail.com>\n"
 "Language-Team: Polish <pl at li.org>\n"
@@ -13,6 +13,72 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
+#: ../src/modules/alsa/alsa-util.c:525
+msgid "Analog Mono"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:531
+#, fuzzy
+msgid "Analog Stereo"
+msgstr "Stereo"
+
+#: ../src/modules/alsa/alsa-util.c:537
+msgid "Digital Stereo (IEC958)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:543
+msgid "Digital Stereo (HDMI)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:550
+#, fuzzy
+msgid "Analog Surround 4.0"
+msgstr "Surround 4.0"
+
+#: ../src/modules/alsa/alsa-util.c:557
+msgid "Digital Surround 4.0 (IEC958/AC3)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:565
+#, fuzzy
+msgid "Analog Surround 4.1"
+msgstr "Surround 4.1"
+
+#: ../src/modules/alsa/alsa-util.c:573
+#, fuzzy
+msgid "Analog Surround 5.0"
+msgstr "Surround 5.0"
+
+#: ../src/modules/alsa/alsa-util.c:581
+#, fuzzy
+msgid "Analog Surround 5.1"
+msgstr "Surround 5.1"
+
+#: ../src/modules/alsa/alsa-util.c:589
+msgid "Digital Surround 5.1 (IEC958/AC3)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:598
+#, fuzzy
+msgid "Analog Surround 7.1"
+msgstr "Surround 7.1"
+
+#: ../src/modules/alsa/alsa-util.c:1577
+#, c-format
+msgid ""
+"snd_pcm_avail_update() returned a value that is exceptionally large: %lu "
+"bytes (%lu ms). Most likely this is an ALSA driver bug. Please report this "
+"issue to the ALSA developers."
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:1609
+#, c-format
+msgid ""
+"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
+"(%lu ms). Most likely this is an ALSA driver bug. Please report this issue "
+"to the ALSA developers."
+msgstr ""
+
 #: ../src/daemon/ltdl-bind-now.c:124
 msgid "Failed to find original lt_dlopen loader."
 msgstr ""
@@ -147,39 +213,39 @@ msgstr "Tryb systemowy nie jest obsługiwany na tej platformie."
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) nie powiodło się: %s"
 
-#: ../src/daemon/main.c:429
+#: ../src/daemon/main.c:431
 msgid "Failed to parse command line."
 msgstr "Analiza wiersza poleceń nie powiodła się."
 
-#: ../src/daemon/main.c:451
+#: ../src/daemon/main.c:453
 #, c-format
 msgid "We're in the group '%s', allowing high-priority scheduling."
 msgstr ""
 "Jesteśmy w grupie \"%s\", co umożliwia szeregowanie o wysokim priorytecie."
 
-#: ../src/daemon/main.c:458
+#: ../src/daemon/main.c:460
 #, c-format
 msgid "We're in the group '%s', allowing real-time scheduling."
 msgstr ""
 "Jesteśmy w grupie \"%s\", co umożliwia szeregowanie w czasie rzeczywistym."
 
-#: ../src/daemon/main.c:466
+#: ../src/daemon/main.c:468
 msgid "PolicyKit grants us acquire-high-priority privilege."
 msgstr "PolicyKit nadał uprawnienie \"acquire-high-priority\"."
 
-#: ../src/daemon/main.c:469
+#: ../src/daemon/main.c:471
 msgid "PolicyKit refuses acquire-high-priority privilege."
 msgstr "PolicyKit odmówił nadania uprawnienia \"acquire-high-priority\"."
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:476
 msgid "PolicyKit grants us acquire-real-time privilege."
 msgstr "PolicyKit nadał uprawnienie \"acquire-real-time\"."
 
-#: ../src/daemon/main.c:477
+#: ../src/daemon/main.c:479
 msgid "PolicyKit refuses acquire-real-time privilege."
 msgstr "PolicyKit odmówił nadania uprawnienia \"acquire-real-time\"."
 
-#: ../src/daemon/main.c:506
+#: ../src/daemon/main.c:508
 msgid ""
 "Called SUID root and real-time and/or high-priority scheduling was requested "
 "in the configuration. However, we lack the necessary privileges:\n"
@@ -190,48 +256,48 @@ msgstr ""
 "uprawnień:\n"
 "Nie jesteśmy w grupie \""
 
-#: ../src/daemon/main.c:530
+#: ../src/daemon/main.c:532
 msgid ""
 "High-priority scheduling enabled in configuration but not allowed by policy."
 msgstr ""
 "Szeregowanie o wysokim priorytecie jest włączone w konfiguracji, ale nie "
 "jest zezwolone przez politykÄ™."
 
-#: ../src/daemon/main.c:559
+#: ../src/daemon/main.c:561
 msgid "Successfully increased RLIMIT_RTPRIO"
 msgstr "Pomyślnie zwiększono RLIMIT_RTPRIO"
 
-#: ../src/daemon/main.c:562
+#: ../src/daemon/main.c:564
 #, c-format
 msgid "RLIMIT_RTPRIO failed: %s"
 msgstr "RLIMIT_RTPRIO nie powiodło się: %s"
 
-#: ../src/daemon/main.c:569
+#: ../src/daemon/main.c:571
 msgid "Giving up CAP_NICE"
 msgstr "Oddawanie CAP_NICE"
 
-#: ../src/daemon/main.c:576
+#: ../src/daemon/main.c:578
 msgid ""
 "Real-time scheduling enabled in configuration but not allowed by policy."
 msgstr ""
 "Szeregowanie w czasie rzeczywistym jest włączone w konfiguracji, ale nie "
 "jest zezwolone przez politykÄ™."
 
-#: ../src/daemon/main.c:637
+#: ../src/daemon/main.c:639
 msgid "Daemon not running"
 msgstr "Demon nie jest uruchomiony"
 
-#: ../src/daemon/main.c:639
+#: ../src/daemon/main.c:641
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "Demon jest uruchomiony jako PID %u"
 
-#: ../src/daemon/main.c:649
+#: ../src/daemon/main.c:651
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "Zniszczenie demona nie powiodło się: %s"
 
-#: ../src/daemon/main.c:667
+#: ../src/daemon/main.c:669
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
@@ -239,146 +305,146 @@ msgstr ""
 "Ten program nie powinien być uruchomiany jako root (chyba, że podano --"
 "system)"
 
-#: ../src/daemon/main.c:669
+#: ../src/daemon/main.c:671
 msgid "Root privileges required."
 msgstr "Wymagane sÄ… uprawnienia roota."
 
-#: ../src/daemon/main.c:674
+#: ../src/daemon/main.c:676
 msgid "--start not supported for system instances."
 msgstr "--start nie jest obsługiwane przy uruchamianiu systemowym."
 
-#: ../src/daemon/main.c:679
+#: ../src/daemon/main.c:681
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr ""
 "Uruchamianie w trybie systemowym, ale --disallow-exit nie jest ustawione!"
 
-#: ../src/daemon/main.c:682
+#: ../src/daemon/main.c:684
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr ""
 "Uruchamianie w trybie systemowym, ale --disallow-module-loading nie jest "
 "ustawione!"
 
-#: ../src/daemon/main.c:685
+#: ../src/daemon/main.c:687
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr "Uruchamianie w trybie systemowym, wymuszanie wyłączenia trybu SHM!"
 
-#: ../src/daemon/main.c:690
+#: ../src/daemon/main.c:692
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr ""
 "Uruchamianie w trybie systemowym, wymuszanie wyłączenia czasu oczekiwania na "
 "zakończenie!"
 
-#: ../src/daemon/main.c:717
+#: ../src/daemon/main.c:719
 msgid "Failed to acquire stdio."
 msgstr "Uzyskanie standardowego wejścia/wyjścia nie powiodło się"
 
-#: ../src/daemon/main.c:723
+#: ../src/daemon/main.c:725
 #, c-format
 msgid "pipe failed: %s"
 msgstr "potok nie powiódł się: %s"
 
-#: ../src/daemon/main.c:728
+#: ../src/daemon/main.c:730
 #, c-format
 msgid "fork() failed: %s"
 msgstr "fork() nie powiodło się: %s"
 
-#: ../src/daemon/main.c:742
+#: ../src/daemon/main.c:744
 #, c-format
 msgid "read() failed: %s"
 msgstr "read() nie powiodło się: %s"
 
-#: ../src/daemon/main.c:748
+#: ../src/daemon/main.c:750
 msgid "Daemon startup failed."
 msgstr "Uruchomienie demona nie powiodło się."
 
-#: ../src/daemon/main.c:750
+#: ../src/daemon/main.c:752
 msgid "Daemon startup successful."
 msgstr "Pomyślnie uruchomiono demona."
 
-#: ../src/daemon/main.c:820
+#: ../src/daemon/main.c:822
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "To jest PulseAudio %s"
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:823
 #, c-format
 msgid "Compilation host: %s"
 msgstr "Komputer kompilacji: %s"
 
-#: ../src/daemon/main.c:822
+#: ../src/daemon/main.c:824
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "CFLAGS kompilacji: %s"
 
-#: ../src/daemon/main.c:825
+#: ../src/daemon/main.c:827
 #, c-format
 msgid "Running on host: %s"
 msgstr "Uruchamianie na komputerze: %s"
 
-#: ../src/daemon/main.c:828
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "Found %u CPUs."
 msgstr "Znaleziono %u procesorów."
 
-#: ../src/daemon/main.c:830
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "Rozmiar strony to %lu bajtów"
 
-#: ../src/daemon/main.c:833
+#: ../src/daemon/main.c:835
 msgid "Compiled with Valgrind support: yes"
 msgstr "Skompilowano z obsługą Valgrind: tak"
 
-#: ../src/daemon/main.c:835
+#: ../src/daemon/main.c:837
 msgid "Compiled with Valgrind support: no"
 msgstr "Skompilowano z obsługą Valgrind: nie"
 
-#: ../src/daemon/main.c:838
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "Uruchamianie w trybie Valgrind: %s"
 
-#: ../src/daemon/main.c:841
+#: ../src/daemon/main.c:843
 msgid "Optimized build: yes"
 msgstr "Budowanie optymalizowane: tak"
 
-#: ../src/daemon/main.c:843
+#: ../src/daemon/main.c:845
 msgid "Optimized build: no"
 msgstr "Budowanie optymalizowane: nie"
 
-#: ../src/daemon/main.c:847
+#: ../src/daemon/main.c:849
 msgid "Failed to get machine ID"
 msgstr "Uzyskanie identyfikatora komputera nie powiodło się"
 
-#: ../src/daemon/main.c:850
+#: ../src/daemon/main.c:852
 #, c-format
 msgid "Machine ID is %s."
 msgstr "Identyfikator komputera to %s."
 
-#: ../src/daemon/main.c:855
+#: ../src/daemon/main.c:857
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "Używanie folderu wykonywania %s."
 
-#: ../src/daemon/main.c:860
+#: ../src/daemon/main.c:862
 #, c-format
 msgid "Using state directory %s."
 msgstr "Używanie folderu stanu %s."
 
-#: ../src/daemon/main.c:863
+#: ../src/daemon/main.c:865
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "Uruchamianie w trybie systemowym: %s"
 
-#: ../src/daemon/main.c:878
+#: ../src/daemon/main.c:880
 msgid "pa_pid_file_create() failed."
 msgstr "pa_pid_file_create() nie powiodło się."
 
-#: ../src/daemon/main.c:890
+#: ../src/daemon/main.c:892
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "Świeże zegary o wysokiej rozdzielczości! Smacznego!"
 
-#: ../src/daemon/main.c:892
+#: ../src/daemon/main.c:894
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
@@ -386,27 +452,27 @@ msgstr ""
 "Koleś, twoje jądro śmierdzi! Szef kuchni poleca dzisiaj Linuksa w włączonymi "
 "zegarami o wysokiej rozdzielczości!"
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:906
 msgid "pa_core_new() failed."
 msgstr "pa_core_new() nie powiodło się."
 
-#: ../src/daemon/main.c:965
+#: ../src/daemon/main.c:967
 msgid "Failed to initialize daemon."
 msgstr "Zainicjowanie demona nie powiodło się."
 
-#: ../src/daemon/main.c:970
+#: ../src/daemon/main.c:972
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr "Uruchamianie demona bez żadnych wczytanych modułów, odmawianie pracy."
 
-#: ../src/daemon/main.c:983
+#: ../src/daemon/main.c:985
 msgid "Daemon startup complete."
 msgstr "Zakończono uruchamianie demona."
 
-#: ../src/daemon/main.c:989
+#: ../src/daemon/main.c:991
 msgid "Daemon shutdown initiated."
 msgstr "Zainicjowano wyłączenie demona."
 
-#: ../src/daemon/main.c:1010
+#: ../src/daemon/main.c:1009
 msgid "Daemon terminated."
 msgstr "Demon został zniszczony."
 
@@ -1108,7 +1174,7 @@ msgstr "Analiza danych ciasteczka nie powiodło się"
 msgid "Failed to open configuration file '%s': %s"
 msgstr "Otwarcie pliku konfiguracji \"%s\" nie powiodło się: %s"
 
-#: ../src/pulse/context.c:523
+#: ../src/pulse/context.c:519
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "Nie wczytano ciasteczka. Próbowanie połączenia się bez niego."
 
@@ -1227,67 +1293,67 @@ msgid "pa_stream_connect_record() failed: %s\n"
 msgstr "pa_stream_connect_record() nie powiodło się: %s\n"
 
 #: ../src/utils/pacat.c:321 ../src/utils/pasuspender.c:159
-#: ../src/utils/pactl.c:758 ../src/utils/paplay.c:183
+#: ../src/utils/pactl.c:759 ../src/utils/paplay.c:183
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "Połączenie nie powiodło się: %s\n"
 
-#: ../src/utils/pacat.c:342 ../src/utils/paplay.c:75
+#: ../src/utils/pacat.c:341 ../src/utils/paplay.c:75
 #, c-format
 msgid "Failed to drain stream: %s\n"
 msgstr "Opróżnienie strumienia nie powiodło się: %s\n"
 
-#: ../src/utils/pacat.c:347 ../src/utils/paplay.c:80
+#: ../src/utils/pacat.c:346 ../src/utils/paplay.c:80
 #, c-format
 msgid "Playback stream drained.\n"
 msgstr "Opróżniono strumień odtwarzania.\n"
 
-#: ../src/utils/pacat.c:357 ../src/utils/paplay.c:92
+#: ../src/utils/pacat.c:356 ../src/utils/paplay.c:92
 #, c-format
 msgid "Draining connection to server.\n"
 msgstr "Opróżnianie połączenia z serwerem.\n"
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:382
 #, c-format
 msgid "Got EOF.\n"
 msgstr "Otrzymano EOF.\n"
 
-#: ../src/utils/pacat.c:389
+#: ../src/utils/pacat.c:388
 #, c-format
 msgid "pa_stream_drain(): %s\n"
 msgstr "pa_stream_drain(): %s\n"
 
-#: ../src/utils/pacat.c:399
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "read() failed: %s\n"
 msgstr "read() nie powiodło się: %s\n"
 
-#: ../src/utils/pacat.c:431
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "write() failed: %s\n"
 msgstr "write() nie powiodło się: %s\n"
 
-#: ../src/utils/pacat.c:452
+#: ../src/utils/pacat.c:451
 #, c-format
 msgid "Got signal, exiting.\n"
 msgstr "Otrzymano sygnał, wyłączanie.\n"
 
-#: ../src/utils/pacat.c:466
+#: ../src/utils/pacat.c:465
 #, c-format
 msgid "Failed to get latency: %s\n"
 msgstr "Uzyskanie opóźnienia nie powiodło się: %s\n"
 
-#: ../src/utils/pacat.c:471
+#: ../src/utils/pacat.c:470
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec.  \r"
 msgstr "Czas: %0.3f sekundy; opóźnienie: %0.0f usekundy.  \r"
 
-#: ../src/utils/pacat.c:491
+#: ../src/utils/pacat.c:490
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s\n"
 msgstr "pa_stream_update_timing_info() nie powiodło się: %s\n"
 
-#: ../src/utils/pacat.c:504
+#: ../src/utils/pacat.c:503
 #, c-format
 msgid ""
 "%s [options]\n"
@@ -1387,7 +1453,7 @@ msgstr ""
 "      --process-time=BAJTY              Żąda określonego czasu procesu na "
 "żądanie w bajtach.\n"
 
-#: ../src/utils/pacat.c:605
+#: ../src/utils/pacat.c:604
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1398,88 +1464,89 @@ msgstr ""
 "Skompilowane za pomocÄ… libpulse %s\n"
 "Skonsolidowane za pomocÄ… libpulse %s\n"
 
-#: ../src/utils/pacat.c:662
+#: ../src/utils/pacat.c:661
 #, c-format
 msgid "Invalid channel map '%s'\n"
 msgstr "Nieprawidłowa mapa kanałów \"%s\"\n"
 
-#: ../src/utils/pacat.c:691
+#: ../src/utils/pacat.c:690
 #, c-format
 msgid "Invalid latency specification '%s'\n"
 msgstr "Nieprawidłowe określenie opóźnienia \"%s\"\n"
 
-#: ../src/utils/pacat.c:698
+#: ../src/utils/pacat.c:697
 #, c-format
 msgid "Invalid process time specification '%s'\n"
 msgstr "Nieprawidłowe określenie czasu procesu \"%s\"\n"
 
-#: ../src/utils/pacat.c:709
+#: ../src/utils/pacat.c:708
 #, c-format
 msgid "Invalid sample specification\n"
 msgstr "Nieprawidłowe określenie próbki\n"
 
-#: ../src/utils/pacat.c:714
+#: ../src/utils/pacat.c:713
 #, c-format
 msgid "Channel map doesn't match sample specification\n"
 msgstr "Mapa kanałów nie zgadza się z określeniem próbki\n"
 
-#: ../src/utils/pacat.c:721
+#: ../src/utils/pacat.c:720
 #, c-format
 msgid "Opening a %s stream with sample specification '%s'.\n"
 msgstr "Otwieranie strumienia %s za pomocą określenie próbki \"%s\".\n"
 
-#: ../src/utils/pacat.c:721
+#: ../src/utils/pacat.c:720
 msgid "recording"
 msgstr "nagrywanie"
 
-#: ../src/utils/pacat.c:721
+#: ../src/utils/pacat.c:720
 msgid "playback"
 msgstr "odtwarzanie"
 
-#: ../src/utils/pacat.c:729
+#: ../src/utils/pacat.c:728
 #, c-format
 msgid "open(): %s\n"
 msgstr "open(): %s\n"
 
-#: ../src/utils/pacat.c:734
+#: ../src/utils/pacat.c:733
 #, c-format
 msgid "dup2(): %s\n"
 msgstr "dup2(): %s\n"
 
-#: ../src/utils/pacat.c:744
+#: ../src/utils/pacat.c:743
 #, c-format
 msgid "Too many arguments.\n"
 msgstr "Za dużo parametrów.\n"
 
-#: ../src/utils/pacat.c:757 ../src/utils/pasuspender.c:280
-#: ../src/utils/pactl.c:1013 ../src/utils/paplay.c:381
+#: ../src/utils/pacat.c:756 ../src/utils/pasuspender.c:280
+#: ../src/utils/pactl.c:1014 ../src/utils/paplay.c:381
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new() nie powiodło się.\n"
 
-#: ../src/utils/pacat.c:778
+#: ../src/utils/pacat.c:777
 #, c-format
 msgid "io_new() failed.\n"
 msgstr "io_new() nie powiodło się.\n"
 
-#: ../src/utils/pacat.c:784 ../src/utils/pasuspender.c:293
-#: ../src/utils/pactl.c:1027 ../src/utils/paplay.c:396
+#: ../src/utils/pacat.c:783 ../src/utils/pasuspender.c:293
+#: ../src/utils/pactl.c:1028 ../src/utils/paplay.c:396
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new() nie powiodło się.\n"
 
-#: ../src/utils/pacat.c:792
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1034
+#: ../src/utils/paplay.c:404
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_connect() nie powiodło się: %s"
 
-#: ../src/utils/pacat.c:803
+#: ../src/utils/pacat.c:802
 #, c-format
 msgid "time_new() failed.\n"
 msgstr "time_new() nie powiodło się.\n"
 
-#: ../src/utils/pacat.c:810 ../src/utils/pasuspender.c:301
-#: ../src/utils/pactl.c:1035 ../src/utils/paplay.c:407
+#: ../src/utils/pacat.c:809 ../src/utils/pasuspender.c:301
+#: ../src/utils/pactl.c:1039 ../src/utils/paplay.c:410
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() nie powiodło się.\n"
@@ -1510,7 +1577,7 @@ msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr ""
 "OSTRZEŻENIE: serwer dźwięku nie jest lokalny, nie zostanie wstrzymany.\n"
 
-#: ../src/utils/pasuspender.c:176 ../src/utils/pactl.c:764
+#: ../src/utils/pasuspender.c:176 ../src/utils/pactl.c:765
 #: ../src/utils/paplay.c:191
 #, c-format
 msgid "Got SIGINT, exiting.\n"
@@ -1895,7 +1962,7 @@ msgstr "Usunięcie próbki nie powiodło się: %s\n"
 msgid "Premature end of file\n"
 msgstr "Przedwczesny koniec pliku\n"
 
-#: ../src/utils/pactl.c:770
+#: ../src/utils/pactl.c:771
 #, c-format
 msgid ""
 "%s [options] stat\n"
@@ -1940,7 +2007,7 @@ msgstr ""
 "  -s, --server=SERWER                   Nazwa serwera do połączenia się\n"
 "  -n, --client-name=NAZWA               Jak nazwać tego klienta na serwerze\n"
 
-#: ../src/utils/pactl.c:822
+#: ../src/utils/pactl.c:823
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -1951,47 +2018,47 @@ msgstr ""
 "Skompilowane za pomocÄ… libpulse %s\n"
 "Skonsolidowane za pomocÄ… libpulse %s\n"
 
-#: ../src/utils/pactl.c:861
+#: ../src/utils/pactl.c:862
 #, c-format
 msgid "Please specify a sample file to load\n"
 msgstr "Proszę podać plik próbki do wczytania\n"
 
-#: ../src/utils/pactl.c:883
+#: ../src/utils/pactl.c:884
 #, c-format
 msgid "Failed to open sound file.\n"
 msgstr "Otwarcie pliku dźwiękowego nie powiodło się.\n"
 
-#: ../src/utils/pactl.c:895
+#: ../src/utils/pactl.c:896
 #, c-format
 msgid "You have to specify a sample name to play\n"
 msgstr "Należy podać nazwę próbki do odtworzenia\n"
 
-#: ../src/utils/pactl.c:907
+#: ../src/utils/pactl.c:908
 #, c-format
 msgid "You have to specify a sample name to remove\n"
 msgstr "Należy podać nazwę próbki do usunięcia\n"
 
-#: ../src/utils/pactl.c:915
+#: ../src/utils/pactl.c:916
 #, c-format
 msgid "You have to specify a sink input index and a sink\n"
 msgstr "Należy podać indeks odpływu wejścia i odpływ\n"
 
-#: ../src/utils/pactl.c:924
+#: ../src/utils/pactl.c:925
 #, c-format
 msgid "You have to specify a source output index and a source\n"
 msgstr "Należy podać indeks źródła wyjścia i źródło\n"
 
-#: ../src/utils/pactl.c:938
+#: ../src/utils/pactl.c:939
 #, c-format
 msgid "You have to specify a module name and arguments.\n"
 msgstr "Należy podać nazwę modułu i parametry.\n"
 
-#: ../src/utils/pactl.c:958
+#: ../src/utils/pactl.c:959
 #, c-format
 msgid "You have to specify a module index\n"
 msgstr "Należy podać indeks modułu\n"
 
-#: ../src/utils/pactl.c:968
+#: ../src/utils/pactl.c:969
 #, c-format
 msgid ""
 "You may not specify more than one sink. You have to specify a boolean "
@@ -1999,7 +2066,7 @@ msgid ""
 msgstr ""
 "Nie można podać więcej niż jednego odpływu. Należy podać wartość logiczną.\n"
 
-#: ../src/utils/pactl.c:981
+#: ../src/utils/pactl.c:982
 #, c-format
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
@@ -2007,12 +2074,12 @@ msgid ""
 msgstr ""
 "Nie można podać więcej niż jednego źródła. Należy podać wartość logiczną.\n"
 
-#: ../src/utils/pactl.c:993
+#: ../src/utils/pactl.c:994
 #, c-format
 msgid "You have to specify a card name/index and a profile name\n"
 msgstr "Należy podać nazwę karty/indeks i nazwę profilu\n"
 
-#: ../src/utils/pactl.c:1008
+#: ../src/utils/pactl.c:1009
 #, c-format
 msgid "No valid command specified.\n"
 msgstr "Nie podano prawidłowego polecenia.\n"
diff --git a/po/pt_BR.po b/po/pt_BR.po
index 6a020fd..2e75cc4 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-02-12 16:57+0100\n"
+"POT-Creation-Date: 2009-02-20 03:24+0100\n"
 "PO-Revision-Date: 2008-11-21 01:21-0300\n"
 "Last-Translator: Henrique (LonelySpooky) Junior <lspooky at fedoraproject.org>\n"
 "Language-Team: Brazilian-Portuguese <fedora-trans-pt_br at redhat.com>\n"
@@ -18,6 +18,66 @@ msgstr ""
 "X-Poedit-Language: Brazilian Portuguese\n"
 "X-Poedit-Country: Brazil\n"
 
+#: ../src/modules/alsa/alsa-util.c:525
+msgid "Analog Mono"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:531
+msgid "Analog Stereo"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:537
+msgid "Digital Stereo (IEC958)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:543
+msgid "Digital Stereo (HDMI)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:550
+msgid "Analog Surround 4.0"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:557
+msgid "Digital Surround 4.0 (IEC958/AC3)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:565
+msgid "Analog Surround 4.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:573
+msgid "Analog Surround 5.0"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:581
+msgid "Analog Surround 5.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:589
+msgid "Digital Surround 5.1 (IEC958/AC3)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:598
+msgid "Analog Surround 7.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:1577
+#, c-format
+msgid ""
+"snd_pcm_avail_update() returned a value that is exceptionally large: %lu "
+"bytes (%lu ms). Most likely this is an ALSA driver bug. Please report this "
+"issue to the ALSA developers."
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:1609
+#, c-format
+msgid ""
+"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
+"(%lu ms). Most likely this is an ALSA driver bug. Please report this issue "
+"to the ALSA developers."
+msgstr ""
+
 #: ../src/daemon/ltdl-bind-now.c:124
 #, fuzzy
 msgid "Failed to find original lt_dlopen loader."
@@ -153,37 +213,37 @@ msgstr "O modo ampliado do sistema não tem suporte nessa plataforma."
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) falhou: %s"
 
-#: ../src/daemon/main.c:429
+#: ../src/daemon/main.c:431
 msgid "Failed to parse command line."
 msgstr "Falha em interpretar a linha de comando."
 
-#: ../src/daemon/main.c:451
+#: ../src/daemon/main.c:453
 #, c-format
 msgid "We're in the group '%s', allowing high-priority scheduling."
 msgstr "Estamos no grupo '%s', permitindo escalonamento de alta prioridade."
 
-#: ../src/daemon/main.c:458
+#: ../src/daemon/main.c:460
 #, c-format
 msgid "We're in the group '%s', allowing real-time scheduling."
 msgstr "Estamos no grupo '%s', permitindo escalonamento em tempo real."
 
-#: ../src/daemon/main.c:466
+#: ../src/daemon/main.c:468
 msgid "PolicyKit grants us acquire-high-priority privilege."
 msgstr "O PolicyKit assegura-nos a aquisição de privilégio de alta prioridade."
 
-#: ../src/daemon/main.c:469
+#: ../src/daemon/main.c:471
 msgid "PolicyKit refuses acquire-high-priority privilege."
 msgstr "O PolicyKit recusa a aquisição de privilégios de alta prioridade."
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:476
 msgid "PolicyKit grants us acquire-real-time privilege."
 msgstr "O PolicyKit assegura-nos a aquisição de privilégios de tempo-real."
 
-#: ../src/daemon/main.c:477
+#: ../src/daemon/main.c:479
 msgid "PolicyKit refuses acquire-real-time privilege."
 msgstr "O PolicyKit recusa a aquisição de privilégios de tempo real."
 
-#: ../src/daemon/main.c:506
+#: ../src/daemon/main.c:508
 #, fuzzy
 msgid ""
 "Called SUID root and real-time and/or high-priority scheduling was requested "
@@ -195,48 +255,48 @@ msgstr ""
 "necessários:\n"
 "Não estamos no grupo'"
 
-#: ../src/daemon/main.c:530
+#: ../src/daemon/main.c:532
 msgid ""
 "High-priority scheduling enabled in configuration but not allowed by policy."
 msgstr ""
 "O escalonamento de alta prioridade foi habilitado para esta configuração, "
 "mas não é permitida pela política."
 
-#: ../src/daemon/main.c:559
+#: ../src/daemon/main.c:561
 msgid "Successfully increased RLIMIT_RTPRIO"
 msgstr "RLIMIT_RTPRIO aumentado com sucesso"
 
-#: ../src/daemon/main.c:562
+#: ../src/daemon/main.c:564
 #, c-format
 msgid "RLIMIT_RTPRIO failed: %s"
 msgstr "RLIMIT_RTPRIO falhou: %s"
 
-#: ../src/daemon/main.c:569
+#: ../src/daemon/main.c:571
 msgid "Giving up CAP_NICE"
 msgstr "Abandonando CAP_NICE"
 
-#: ../src/daemon/main.c:576
+#: ../src/daemon/main.c:578
 msgid ""
 "Real-time scheduling enabled in configuration but not allowed by policy."
 msgstr ""
 "O escalonamento de tempo real foi habilitado pela configuração, mas não é "
 "permitido pela política."
 
-#: ../src/daemon/main.c:637
+#: ../src/daemon/main.c:639
 msgid "Daemon not running"
 msgstr "O daemon não está em execução"
 
-#: ../src/daemon/main.c:639
+#: ../src/daemon/main.c:641
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "Daemon executando como PID %u"
 
-#: ../src/daemon/main.c:649
+#: ../src/daemon/main.c:651
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "Falha em encerrar o daemon: %s"
 
-#: ../src/daemon/main.c:667
+#: ../src/daemon/main.c:669
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
@@ -244,144 +304,144 @@ msgstr ""
 "Este programa não é para ser executado como root (a não ser que --system "
 "seja especificado)."
 
-#: ../src/daemon/main.c:669
+#: ../src/daemon/main.c:671
 #, fuzzy
 msgid "Root privileges required."
 msgstr "Privilégios de rot são requeridos."
 
-#: ../src/daemon/main.c:674
+#: ../src/daemon/main.c:676
 msgid "--start not supported for system instances."
 msgstr "--start não tem suporte para instâncias de sistemas."
 
-#: ../src/daemon/main.c:679
+#: ../src/daemon/main.c:681
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr "Executando em no modo system, mas --disallow-exit não foi configurado!"
 
-#: ../src/daemon/main.c:682
+#: ../src/daemon/main.c:684
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr ""
 "Executando no modo system, mas --disallow-module-loading não foi configurado!"
 
-#: ../src/daemon/main.c:685
+#: ../src/daemon/main.c:687
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr "Executando no modo system, desabilitando forçadamente o modo SHM!"
 
-#: ../src/daemon/main.c:690
+#: ../src/daemon/main.c:692
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr ""
 "Executando no modo system, desabilitando forçadamente o exit idle time!"
 
-#: ../src/daemon/main.c:717
+#: ../src/daemon/main.c:719
 msgid "Failed to acquire stdio."
 msgstr "Falha em adquirir o stdio."
 
-#: ../src/daemon/main.c:723
+#: ../src/daemon/main.c:725
 #, c-format
 msgid "pipe failed: %s"
 msgstr "O pipe falhou: %s"
 
-#: ../src/daemon/main.c:728
+#: ../src/daemon/main.c:730
 #, c-format
 msgid "fork() failed: %s"
 msgstr "O fork() falhou: %s"
 
-#: ../src/daemon/main.c:742
+#: ../src/daemon/main.c:744
 #, c-format
 msgid "read() failed: %s"
 msgstr "A operação read() falhou: %s"
 
-#: ../src/daemon/main.c:748
+#: ../src/daemon/main.c:750
 msgid "Daemon startup failed."
 msgstr "Falha na partida do daemon."
 
-#: ../src/daemon/main.c:750
+#: ../src/daemon/main.c:752
 msgid "Daemon startup successful."
 msgstr "Os daemons foram iniciados com sucesso."
 
-#: ../src/daemon/main.c:820
+#: ../src/daemon/main.c:822
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "Este é o PulseAudio %s"
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:823
 #, c-format
 msgid "Compilation host: %s"
 msgstr "Host de compilação: %s"
 
-#: ../src/daemon/main.c:822
+#: ../src/daemon/main.c:824
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "Compilação CFLAGS: %s"
 
-#: ../src/daemon/main.c:825
+#: ../src/daemon/main.c:827
 #, c-format
 msgid "Running on host: %s"
 msgstr "Executando no host: %s"
 
-#: ../src/daemon/main.c:828
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "Found %u CPUs."
 msgstr ""
 
-#: ../src/daemon/main.c:830
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "O tamanho da página é %lu bytes"
 
-#: ../src/daemon/main.c:833
+#: ../src/daemon/main.c:835
 msgid "Compiled with Valgrind support: yes"
 msgstr "Compilado com suporte do Valgrind: sim"
 
-#: ../src/daemon/main.c:835
+#: ../src/daemon/main.c:837
 msgid "Compiled with Valgrind support: no"
 msgstr "Compilado com suporte do Valgrind: não"
 
-#: ../src/daemon/main.c:838
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "Executando em modo valgrind: %s"
 
-#: ../src/daemon/main.c:841
+#: ../src/daemon/main.c:843
 msgid "Optimized build: yes"
 msgstr "Build otimizado: sim"
 
-#: ../src/daemon/main.c:843
+#: ../src/daemon/main.c:845
 msgid "Optimized build: no"
 msgstr "Build otimizado: não"
 
-#: ../src/daemon/main.c:847
+#: ../src/daemon/main.c:849
 msgid "Failed to get machine ID"
 msgstr "Falha em obter o ID da máquina"
 
-#: ../src/daemon/main.c:850
+#: ../src/daemon/main.c:852
 #, c-format
 msgid "Machine ID is %s."
 msgstr "A ID da máquina é %s."
 
-#: ../src/daemon/main.c:855
+#: ../src/daemon/main.c:857
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "Usando o diretório de runtime %s."
 
-#: ../src/daemon/main.c:860
+#: ../src/daemon/main.c:862
 #, c-format
 msgid "Using state directory %s."
 msgstr "Usando o diretório de estado %s."
 
-#: ../src/daemon/main.c:863
+#: ../src/daemon/main.c:865
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "Executando em modo do sistema: %s"
 
-#: ../src/daemon/main.c:878
+#: ../src/daemon/main.c:880
 msgid "pa_pid_file_create() failed."
 msgstr "pa_pid_file_create() falhou."
 
-#: ../src/daemon/main.c:890
+#: ../src/daemon/main.c:892
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "Timers de alta resolução frequinhos disponíveis! Bon appetit!"
 
-#: ../src/daemon/main.c:892
+#: ../src/daemon/main.c:894
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
@@ -389,28 +449,28 @@ msgstr ""
 "Cara, teu kernel fede! A recomendação do chef hoje é Linux com timers de "
 "alta resolução habilitados!"
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:906
 msgid "pa_core_new() failed."
 msgstr "pa_core_new() falhou."
 
-#: ../src/daemon/main.c:965
+#: ../src/daemon/main.c:967
 msgid "Failed to initialize daemon."
 msgstr "Falha em iniciar o daemon."
 
-#: ../src/daemon/main.c:970
+#: ../src/daemon/main.c:972
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr ""
 "O Daemon iniciou sem qualquer módulo carregado, recusando-se a trabalhar."
 
-#: ../src/daemon/main.c:983
+#: ../src/daemon/main.c:985
 msgid "Daemon startup complete."
 msgstr "A partida dos Daemon está completa."
 
-#: ../src/daemon/main.c:989
+#: ../src/daemon/main.c:991
 msgid "Daemon shutdown initiated."
 msgstr "O encerramento do Daemon foi iniciado."
 
-#: ../src/daemon/main.c:1010
+#: ../src/daemon/main.c:1009
 msgid "Daemon terminated."
 msgstr "Daemon terminado."
 
@@ -1111,7 +1171,7 @@ msgstr "Falhou ao analisar os dados do cookie"
 msgid "Failed to open configuration file '%s': %s"
 msgstr "Falha em abrir o arquivo de configuração '%s': %s"
 
-#: ../src/pulse/context.c:523
+#: ../src/pulse/context.c:519
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "Nenhum cookie foi carregado. Tentativa de conexão sem eles."
 
@@ -1230,67 +1290,67 @@ msgid "pa_stream_connect_record() failed: %s\n"
 msgstr "pa_stream_connect_record() falhou: %s\n"
 
 #: ../src/utils/pacat.c:321 ../src/utils/pasuspender.c:159
-#: ../src/utils/pactl.c:758 ../src/utils/paplay.c:183
+#: ../src/utils/pactl.c:759 ../src/utils/paplay.c:183
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "Falha na conexão: %s\n"
 
-#: ../src/utils/pacat.c:342 ../src/utils/paplay.c:75
+#: ../src/utils/pacat.c:341 ../src/utils/paplay.c:75
 #, c-format
 msgid "Failed to drain stream: %s\n"
 msgstr "Falha em drenar o fluxo: %s\n"
 
-#: ../src/utils/pacat.c:347 ../src/utils/paplay.c:80
+#: ../src/utils/pacat.c:346 ../src/utils/paplay.c:80
 #, c-format
 msgid "Playback stream drained.\n"
 msgstr "Drenado o fluxo de playback.\n"
 
-#: ../src/utils/pacat.c:357 ../src/utils/paplay.c:92
+#: ../src/utils/pacat.c:356 ../src/utils/paplay.c:92
 #, c-format
 msgid "Draining connection to server.\n"
 msgstr "Drenando a conexão par ao servidor.\n"
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:382
 #, c-format
 msgid "Got EOF.\n"
 msgstr "Atingiu EOF.\n"
 
-#: ../src/utils/pacat.c:389
+#: ../src/utils/pacat.c:388
 #, c-format
 msgid "pa_stream_drain(): %s\n"
 msgstr "pa_stream_drain(): %s\n"
 
-#: ../src/utils/pacat.c:399
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "read() failed: %s\n"
 msgstr "read() falhou: %s\n"
 
-#: ../src/utils/pacat.c:431
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "write() failed: %s\n"
 msgstr "write() falhou: %s\n"
 
-#: ../src/utils/pacat.c:452
+#: ../src/utils/pacat.c:451
 #, c-format
 msgid "Got signal, exiting.\n"
 msgstr "Sinal recebido, saindo (exiting).\n"
 
-#: ../src/utils/pacat.c:466
+#: ../src/utils/pacat.c:465
 #, c-format
 msgid "Failed to get latency: %s\n"
 msgstr "Falhou em obter a latência: %s\n"
 
-#: ../src/utils/pacat.c:471
+#: ../src/utils/pacat.c:470
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec.  \r"
 msgstr "Tempo: %0.3f s; Latência: %0.0f us.  \r"
 
-#: ../src/utils/pacat.c:491
+#: ../src/utils/pacat.c:490
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s\n"
 msgstr "Falha em pa_stream_update_timing_info(): %s\n"
 
-#: ../src/utils/pacat.c:504
+#: ../src/utils/pacat.c:503
 #, c-format
 msgid ""
 "%s [options]\n"
@@ -1387,7 +1447,7 @@ msgstr ""
 "      --process-time=BYTES              Request the specified process time "
 "per request in bytes.\n"
 
-#: ../src/utils/pacat.c:605
+#: ../src/utils/pacat.c:604
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1398,88 +1458,89 @@ msgstr ""
 "Compilado com  libpulse %s\n"
 "Linkado com libpulse %s\n"
 
-#: ../src/utils/pacat.c:662
+#: ../src/utils/pacat.c:661
 #, c-format
 msgid "Invalid channel map '%s'\n"
 msgstr "Mapa de canal inválido '%s'\n"
 
-#: ../src/utils/pacat.c:691
+#: ../src/utils/pacat.c:690
 #, c-format
 msgid "Invalid latency specification '%s'\n"
 msgstr "Especificação de latência inválida '%s'\n"
 
-#: ../src/utils/pacat.c:698
+#: ../src/utils/pacat.c:697
 #, c-format
 msgid "Invalid process time specification '%s'\n"
 msgstr "Especificação do tempo do processo inválida '%s'\n"
 
-#: ../src/utils/pacat.c:709
+#: ../src/utils/pacat.c:708
 #, c-format
 msgid "Invalid sample specification\n"
 msgstr "Especificação de amostragem inválida\n"
 
-#: ../src/utils/pacat.c:714
+#: ../src/utils/pacat.c:713
 #, c-format
 msgid "Channel map doesn't match sample specification\n"
 msgstr "O mapeamento do canal não casa com a especificação da amostragem\n"
 
-#: ../src/utils/pacat.c:721
+#: ../src/utils/pacat.c:720
 #, c-format
 msgid "Opening a %s stream with sample specification '%s'.\n"
 msgstr "Abrindo um %s fluxo com a especificação de amostragem '%s'.\n"
 
-#: ../src/utils/pacat.c:721
+#: ../src/utils/pacat.c:720
 msgid "recording"
 msgstr "gravando"
 
-#: ../src/utils/pacat.c:721
+#: ../src/utils/pacat.c:720
 msgid "playback"
 msgstr "playback"
 
-#: ../src/utils/pacat.c:729
+#: ../src/utils/pacat.c:728
 #, c-format
 msgid "open(): %s\n"
 msgstr "open(): %s\n"
 
-#: ../src/utils/pacat.c:734
+#: ../src/utils/pacat.c:733
 #, c-format
 msgid "dup2(): %s\n"
 msgstr "dup2(): %s\n"
 
-#: ../src/utils/pacat.c:744
+#: ../src/utils/pacat.c:743
 #, c-format
 msgid "Too many arguments.\n"
 msgstr "Argumentos em excesso.\n"
 
-#: ../src/utils/pacat.c:757 ../src/utils/pasuspender.c:280
-#: ../src/utils/pactl.c:1013 ../src/utils/paplay.c:381
+#: ../src/utils/pacat.c:756 ../src/utils/pasuspender.c:280
+#: ../src/utils/pactl.c:1014 ../src/utils/paplay.c:381
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new() falhou.\n"
 
-#: ../src/utils/pacat.c:778
+#: ../src/utils/pacat.c:777
 #, c-format
 msgid "io_new() failed.\n"
 msgstr "io_new() falhou.\n"
 
-#: ../src/utils/pacat.c:784 ../src/utils/pasuspender.c:293
-#: ../src/utils/pactl.c:1027 ../src/utils/paplay.c:396
+#: ../src/utils/pacat.c:783 ../src/utils/pasuspender.c:293
+#: ../src/utils/pactl.c:1028 ../src/utils/paplay.c:396
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new() falhou.\n"
 
-#: ../src/utils/pacat.c:792
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1034
+#: ../src/utils/paplay.c:404
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_new() falhou: %s"
 
-#: ../src/utils/pacat.c:803
+#: ../src/utils/pacat.c:802
 #, c-format
 msgid "time_new() failed.\n"
 msgstr "time_new() falhou.\n"
 
-#: ../src/utils/pacat.c:810 ../src/utils/pasuspender.c:301
-#: ../src/utils/pactl.c:1035 ../src/utils/paplay.c:407
+#: ../src/utils/pacat.c:809 ../src/utils/pasuspender.c:301
+#: ../src/utils/pactl.c:1039 ../src/utils/paplay.c:410
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() falhou.\n"
@@ -1511,7 +1572,7 @@ msgstr ""
 "AVISO: O servidor de som não é local, Sound server is not local, não está em "
 "suspenso.\n"
 
-#: ../src/utils/pasuspender.c:176 ../src/utils/pactl.c:764
+#: ../src/utils/pasuspender.c:176 ../src/utils/pactl.c:765
 #: ../src/utils/paplay.c:191
 #, c-format
 msgid "Got SIGINT, exiting.\n"
@@ -1877,7 +1938,7 @@ msgstr "Falha em carregar a amostra: %s\n"
 msgid "Premature end of file\n"
 msgstr "Fim prematuro do arquivo\n"
 
-#: ../src/utils/pactl.c:770
+#: ../src/utils/pactl.c:771
 #, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
@@ -1922,7 +1983,7 @@ msgstr ""
 "  -n, --client-name=NAME                Como chamar este cliente no "
 "servidor \n"
 
-#: ../src/utils/pactl.c:822
+#: ../src/utils/pactl.c:823
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -1933,48 +1994,48 @@ msgstr ""
 "Compilado com libpulse %s\n"
 "Linkado com libpulse %s\n"
 
-#: ../src/utils/pactl.c:861
+#: ../src/utils/pactl.c:862
 #, c-format
 msgid "Please specify a sample file to load\n"
 msgstr "Por favor, especifique o arquivo de amostra a ser carregado\n"
 
-#: ../src/utils/pactl.c:883
+#: ../src/utils/pactl.c:884
 #, c-format
 msgid "Failed to open sound file.\n"
 msgstr "Falha em abrir o arquivo de som.\n"
 
-#: ../src/utils/pactl.c:895
+#: ../src/utils/pactl.c:896
 #, c-format
 msgid "You have to specify a sample name to play\n"
 msgstr "Você deve especificar um nome da amostra para ser executada\n"
 
-#: ../src/utils/pactl.c:907
+#: ../src/utils/pactl.c:908
 #, c-format
 msgid "You have to specify a sample name to remove\n"
 msgstr "Você deve especificar um nome da amostra para ser removida\n"
 
-#: ../src/utils/pactl.c:915
+#: ../src/utils/pactl.c:916
 #, c-format
 msgid "You have to specify a sink input index and a sink\n"
 msgstr ""
 "Você tem que especificar a entrada para o destino (sink) e um destino(sink)\n"
 
-#: ../src/utils/pactl.c:924
+#: ../src/utils/pactl.c:925
 #, c-format
 msgid "You have to specify a source output index and a source\n"
 msgstr "Você tem que especificar um índice de saída da fonte e uma fonte\n"
 
-#: ../src/utils/pactl.c:938
+#: ../src/utils/pactl.c:939
 #, c-format
 msgid "You have to specify a module name and arguments.\n"
 msgstr "Você deve especificar um nome do módulo e seus argumentos\n"
 
-#: ../src/utils/pactl.c:958
+#: ../src/utils/pactl.c:959
 #, c-format
 msgid "You have to specify a module index\n"
 msgstr "Você deve especificar um índice de um módulo\n"
 
-#: ../src/utils/pactl.c:968
+#: ../src/utils/pactl.c:969
 #, fuzzy, c-format
 msgid ""
 "You may not specify more than one sink. You have to specify a boolean "
@@ -1983,7 +2044,7 @@ msgstr ""
 "Você não pode especificar mais de um destino. Pelo menos um valor booleano "
 "deve ser especificado.\n"
 
-#: ../src/utils/pactl.c:981
+#: ../src/utils/pactl.c:982
 #, fuzzy, c-format
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
@@ -1992,13 +2053,13 @@ msgstr ""
 "Você não pode especificar mais de uma fonte. Pelo menos um valor booleano "
 "deve ser especificado.\n"
 
-#: ../src/utils/pactl.c:993
+#: ../src/utils/pactl.c:994
 #, fuzzy, c-format
 msgid "You have to specify a card name/index and a profile name\n"
 msgstr ""
 "Você tem que especificar a entrada para o destino (sink) e um destino(sink)\n"
 
-#: ../src/utils/pactl.c:1008
+#: ../src/utils/pactl.c:1009
 #, c-format
 msgid "No valid command specified.\n"
 msgstr "Nenhum comando válido especificado.\n"
diff --git a/po/sv.po b/po/sv.po
index 03604ed..ce3fd73 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: pulseaudio\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-02-12 16:57+0100\n"
+"POT-Creation-Date: 2009-02-20 03:24+0100\n"
 "PO-Revision-Date: 2008-09-05 18:24+0100\n"
 "Last-Translator: Daniel Nylander <po at danielnylander.se>\n"
 "Language-Team: Swedish <tp-sv at listor.tp-sv.se>\n"
@@ -15,6 +15,66 @@ msgstr ""
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
+#: ../src/modules/alsa/alsa-util.c:525
+msgid "Analog Mono"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:531
+msgid "Analog Stereo"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:537
+msgid "Digital Stereo (IEC958)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:543
+msgid "Digital Stereo (HDMI)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:550
+msgid "Analog Surround 4.0"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:557
+msgid "Digital Surround 4.0 (IEC958/AC3)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:565
+msgid "Analog Surround 4.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:573
+msgid "Analog Surround 5.0"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:581
+msgid "Analog Surround 5.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:589
+msgid "Digital Surround 5.1 (IEC958/AC3)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:598
+msgid "Analog Surround 7.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:1577
+#, c-format
+msgid ""
+"snd_pcm_avail_update() returned a value that is exceptionally large: %lu "
+"bytes (%lu ms). Most likely this is an ALSA driver bug. Please report this "
+"issue to the ALSA developers."
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:1609
+#, c-format
+msgid ""
+"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
+"(%lu ms). Most likely this is an ALSA driver bug. Please report this issue "
+"to the ALSA developers."
+msgstr ""
+
 #: ../src/daemon/ltdl-bind-now.c:124
 msgid "Failed to find original lt_dlopen loader."
 msgstr ""
@@ -149,81 +209,81 @@ msgstr ""
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) misslyckades: %s"
 
-#: ../src/daemon/main.c:429
+#: ../src/daemon/main.c:431
 msgid "Failed to parse command line."
 msgstr ""
 
-#: ../src/daemon/main.c:451
+#: ../src/daemon/main.c:453
 #, c-format
 msgid "We're in the group '%s', allowing high-priority scheduling."
 msgstr ""
 
-#: ../src/daemon/main.c:458
+#: ../src/daemon/main.c:460
 #, c-format
 msgid "We're in the group '%s', allowing real-time scheduling."
 msgstr ""
 
-#: ../src/daemon/main.c:466
+#: ../src/daemon/main.c:468
 msgid "PolicyKit grants us acquire-high-priority privilege."
 msgstr ""
 
-#: ../src/daemon/main.c:469
+#: ../src/daemon/main.c:471
 msgid "PolicyKit refuses acquire-high-priority privilege."
 msgstr ""
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:476
 msgid "PolicyKit grants us acquire-real-time privilege."
 msgstr ""
 
-#: ../src/daemon/main.c:477
+#: ../src/daemon/main.c:479
 msgid "PolicyKit refuses acquire-real-time privilege."
 msgstr ""
 
-#: ../src/daemon/main.c:506
+#: ../src/daemon/main.c:508
 msgid ""
 "Called SUID root and real-time and/or high-priority scheduling was requested "
 "in the configuration. However, we lack the necessary privileges:\n"
 "We are not in group '"
 msgstr ""
 
-#: ../src/daemon/main.c:530
+#: ../src/daemon/main.c:532
 msgid ""
 "High-priority scheduling enabled in configuration but not allowed by policy."
 msgstr ""
 
-#: ../src/daemon/main.c:559
+#: ../src/daemon/main.c:561
 msgid "Successfully increased RLIMIT_RTPRIO"
 msgstr ""
 
-#: ../src/daemon/main.c:562
+#: ../src/daemon/main.c:564
 #, c-format
 msgid "RLIMIT_RTPRIO failed: %s"
 msgstr "RLIMIT_RTPRIO misslyckades: %s"
 
-#: ../src/daemon/main.c:569
+#: ../src/daemon/main.c:571
 msgid "Giving up CAP_NICE"
 msgstr ""
 
-#: ../src/daemon/main.c:576
+#: ../src/daemon/main.c:578
 msgid ""
 "Real-time scheduling enabled in configuration but not allowed by policy."
 msgstr ""
 
-#: ../src/daemon/main.c:637
+#: ../src/daemon/main.c:639
 msgid "Daemon not running"
 msgstr ""
 
-#: ../src/daemon/main.c:639
+#: ../src/daemon/main.c:641
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr ""
 
-#: ../src/daemon/main.c:649
+#: ../src/daemon/main.c:651
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:667
+#: ../src/daemon/main.c:669
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
@@ -231,168 +291,168 @@ msgstr ""
 "Detta program är inte tänkt att köras som root (såvida inte --system har "
 "angivits)."
 
-#: ../src/daemon/main.c:669
+#: ../src/daemon/main.c:671
 #, fuzzy
 msgid "Root privileges required."
 msgstr "Root-behörighet krävs."
 
-#: ../src/daemon/main.c:674
+#: ../src/daemon/main.c:676
 msgid "--start not supported for system instances."
 msgstr "--start stöds inte för systeminstanser."
 
-#: ../src/daemon/main.c:679
+#: ../src/daemon/main.c:681
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr ""
 
-#: ../src/daemon/main.c:682
+#: ../src/daemon/main.c:684
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr ""
 
-#: ../src/daemon/main.c:685
+#: ../src/daemon/main.c:687
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr ""
 
-#: ../src/daemon/main.c:690
+#: ../src/daemon/main.c:692
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr ""
 
-#: ../src/daemon/main.c:717
+#: ../src/daemon/main.c:719
 msgid "Failed to acquire stdio."
 msgstr ""
 
-#: ../src/daemon/main.c:723
+#: ../src/daemon/main.c:725
 #, c-format
 msgid "pipe failed: %s"
 msgstr "pipe misslyckades: %s"
 
-#: ../src/daemon/main.c:728
+#: ../src/daemon/main.c:730
 #, c-format
 msgid "fork() failed: %s"
 msgstr "fork() misslyckades: %s"
 
-#: ../src/daemon/main.c:742
+#: ../src/daemon/main.c:744
 #, c-format
 msgid "read() failed: %s"
 msgstr "read() misslyckades: %s"
 
-#: ../src/daemon/main.c:748
+#: ../src/daemon/main.c:750
 msgid "Daemon startup failed."
 msgstr ""
 
-#: ../src/daemon/main.c:750
+#: ../src/daemon/main.c:752
 msgid "Daemon startup successful."
 msgstr ""
 
-#: ../src/daemon/main.c:820
+#: ../src/daemon/main.c:822
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "Detta är PulseAudio %s"
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:823
 #, c-format
 msgid "Compilation host: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:822
+#: ../src/daemon/main.c:824
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:825
+#: ../src/daemon/main.c:827
 #, c-format
 msgid "Running on host: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:828
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "Found %u CPUs."
 msgstr ""
 
-#: ../src/daemon/main.c:830
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr ""
 
-#: ../src/daemon/main.c:833
+#: ../src/daemon/main.c:835
 msgid "Compiled with Valgrind support: yes"
 msgstr ""
 
-#: ../src/daemon/main.c:835
+#: ../src/daemon/main.c:837
 msgid "Compiled with Valgrind support: no"
 msgstr ""
 
-#: ../src/daemon/main.c:838
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:841
+#: ../src/daemon/main.c:843
 msgid "Optimized build: yes"
 msgstr ""
 
-#: ../src/daemon/main.c:843
+#: ../src/daemon/main.c:845
 msgid "Optimized build: no"
 msgstr ""
 
-#: ../src/daemon/main.c:847
+#: ../src/daemon/main.c:849
 msgid "Failed to get machine ID"
 msgstr ""
 
-#: ../src/daemon/main.c:850
+#: ../src/daemon/main.c:852
 #, c-format
 msgid "Machine ID is %s."
 msgstr ""
 
-#: ../src/daemon/main.c:855
+#: ../src/daemon/main.c:857
 #, c-format
 msgid "Using runtime directory %s."
 msgstr ""
 
-#: ../src/daemon/main.c:860
+#: ../src/daemon/main.c:862
 #, c-format
 msgid "Using state directory %s."
 msgstr ""
 
-#: ../src/daemon/main.c:863
+#: ../src/daemon/main.c:865
 #, c-format
 msgid "Running in system mode: %s"
 msgstr ""
 
-#: ../src/daemon/main.c:878
+#: ../src/daemon/main.c:880
 msgid "pa_pid_file_create() failed."
 msgstr "pa_pid_file_create() misslyckades."
 
-#: ../src/daemon/main.c:890
+#: ../src/daemon/main.c:892
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr ""
 
-#: ../src/daemon/main.c:892
+#: ../src/daemon/main.c:894
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
 msgstr ""
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:906
 msgid "pa_core_new() failed."
 msgstr "pa_core_new() misslyckades."
 
-#: ../src/daemon/main.c:965
+#: ../src/daemon/main.c:967
 msgid "Failed to initialize daemon."
 msgstr ""
 
-#: ../src/daemon/main.c:970
+#: ../src/daemon/main.c:972
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr ""
 
-#: ../src/daemon/main.c:983
+#: ../src/daemon/main.c:985
 msgid "Daemon startup complete."
 msgstr ""
 
-#: ../src/daemon/main.c:989
+#: ../src/daemon/main.c:991
 msgid "Daemon shutdown initiated."
 msgstr ""
 
-#: ../src/daemon/main.c:1010
+#: ../src/daemon/main.c:1009
 msgid "Daemon terminated."
 msgstr ""
 
@@ -1018,7 +1078,7 @@ msgstr ""
 msgid "Failed to open configuration file '%s': %s"
 msgstr "Misslyckades med att öppna konfigurationsfilen \"%s\": %s"
 
-#: ../src/pulse/context.c:523
+#: ../src/pulse/context.c:519
 msgid "No cookie loaded. Attempting to connect without."
 msgstr ""
 
@@ -1137,67 +1197,67 @@ msgid "pa_stream_connect_record() failed: %s\n"
 msgstr "pa_stream_connect_record() misslyckades: %s\n"
 
 #: ../src/utils/pacat.c:321 ../src/utils/pasuspender.c:159
-#: ../src/utils/pactl.c:758 ../src/utils/paplay.c:183
+#: ../src/utils/pactl.c:759 ../src/utils/paplay.c:183
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "Anslutningsfel: %s\n"
 
-#: ../src/utils/pacat.c:342 ../src/utils/paplay.c:75
+#: ../src/utils/pacat.c:341 ../src/utils/paplay.c:75
 #, c-format
 msgid "Failed to drain stream: %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:347 ../src/utils/paplay.c:80
+#: ../src/utils/pacat.c:346 ../src/utils/paplay.c:80
 #, c-format
 msgid "Playback stream drained.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:357 ../src/utils/paplay.c:92
+#: ../src/utils/pacat.c:356 ../src/utils/paplay.c:92
 #, c-format
 msgid "Draining connection to server.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:382
 #, c-format
 msgid "Got EOF.\n"
 msgstr "Fick filslut.\n"
 
-#: ../src/utils/pacat.c:389
+#: ../src/utils/pacat.c:388
 #, c-format
 msgid "pa_stream_drain(): %s\n"
 msgstr "pa_stream_drain(): %s\n"
 
-#: ../src/utils/pacat.c:399
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "read() failed: %s\n"
 msgstr "read() misslyckades: %s\n"
 
-#: ../src/utils/pacat.c:431
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "write() failed: %s\n"
 msgstr "write() misslyckades: %s\n"
 
-#: ../src/utils/pacat.c:452
+#: ../src/utils/pacat.c:451
 #, c-format
 msgid "Got signal, exiting.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:466
+#: ../src/utils/pacat.c:465
 #, c-format
 msgid "Failed to get latency: %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:471
+#: ../src/utils/pacat.c:470
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec.  \r"
 msgstr "Tid: %0.3f sec; Latens: %0.0f ms  \r"
 
-#: ../src/utils/pacat.c:491
+#: ../src/utils/pacat.c:490
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s\n"
 msgstr "pa_stream_update_timing_info() misslyckades: %s\n"
 
-#: ../src/utils/pacat.c:504
+#: ../src/utils/pacat.c:503
 #, c-format
 msgid ""
 "%s [options]\n"
@@ -1250,7 +1310,7 @@ msgid ""
 "per request in bytes.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:605
+#: ../src/utils/pacat.c:604
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1258,88 +1318,89 @@ msgid ""
 "Linked with libpulse %s\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:662
+#: ../src/utils/pacat.c:661
 #, c-format
 msgid "Invalid channel map '%s'\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:691
+#: ../src/utils/pacat.c:690
 #, c-format
 msgid "Invalid latency specification '%s'\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:698
+#: ../src/utils/pacat.c:697
 #, c-format
 msgid "Invalid process time specification '%s'\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:709
+#: ../src/utils/pacat.c:708
 #, c-format
 msgid "Invalid sample specification\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:714
+#: ../src/utils/pacat.c:713
 #, c-format
 msgid "Channel map doesn't match sample specification\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:721
+#: ../src/utils/pacat.c:720
 #, c-format
 msgid "Opening a %s stream with sample specification '%s'.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:721
+#: ../src/utils/pacat.c:720
 msgid "recording"
 msgstr ""
 
-#: ../src/utils/pacat.c:721
+#: ../src/utils/pacat.c:720
 msgid "playback"
 msgstr ""
 
-#: ../src/utils/pacat.c:729
+#: ../src/utils/pacat.c:728
 #, c-format
 msgid "open(): %s\n"
 msgstr "open(): %s\n"
 
-#: ../src/utils/pacat.c:734
+#: ../src/utils/pacat.c:733
 #, c-format
 msgid "dup2(): %s\n"
 msgstr "dup2(): %s\n"
 
-#: ../src/utils/pacat.c:744
+#: ../src/utils/pacat.c:743
 #, c-format
 msgid "Too many arguments.\n"
 msgstr "För många argument.\n"
 
-#: ../src/utils/pacat.c:757 ../src/utils/pasuspender.c:280
-#: ../src/utils/pactl.c:1013 ../src/utils/paplay.c:381
+#: ../src/utils/pacat.c:756 ../src/utils/pasuspender.c:280
+#: ../src/utils/pactl.c:1014 ../src/utils/paplay.c:381
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new() misslyckades.\n"
 
-#: ../src/utils/pacat.c:778
+#: ../src/utils/pacat.c:777
 #, c-format
 msgid "io_new() failed.\n"
 msgstr "io_new() misslyckades.\n"
 
-#: ../src/utils/pacat.c:784 ../src/utils/pasuspender.c:293
-#: ../src/utils/pactl.c:1027 ../src/utils/paplay.c:396
+#: ../src/utils/pacat.c:783 ../src/utils/pasuspender.c:293
+#: ../src/utils/pactl.c:1028 ../src/utils/paplay.c:396
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new() misslyckades.\n"
 
-#: ../src/utils/pacat.c:792
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1034
+#: ../src/utils/paplay.c:404
 #, fuzzy, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_new() misslyckades.\n"
 
-#: ../src/utils/pacat.c:803
+#: ../src/utils/pacat.c:802
 #, c-format
 msgid "time_new() failed.\n"
 msgstr "time_new() misslyckades.\n"
 
-#: ../src/utils/pacat.c:810 ../src/utils/pasuspender.c:301
-#: ../src/utils/pactl.c:1035 ../src/utils/paplay.c:407
+#: ../src/utils/pacat.c:809 ../src/utils/pasuspender.c:301
+#: ../src/utils/pactl.c:1039 ../src/utils/paplay.c:410
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run() misslyckades.\n"
@@ -1369,7 +1430,7 @@ msgstr ""
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr ""
 
-#: ../src/utils/pasuspender.c:176 ../src/utils/pactl.c:764
+#: ../src/utils/pasuspender.c:176 ../src/utils/pactl.c:765
 #: ../src/utils/paplay.c:191
 #, c-format
 msgid "Got SIGINT, exiting.\n"
@@ -1646,7 +1707,7 @@ msgstr ""
 msgid "Premature end of file\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:770
+#: ../src/utils/pactl.c:771
 #, c-format
 msgid ""
 "%s [options] stat\n"
@@ -1672,7 +1733,7 @@ msgid ""
 "server\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:822
+#: ../src/utils/pactl.c:823
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -1683,66 +1744,66 @@ msgstr ""
 "Kompilerad med libpulse %s\n"
 "Länkad med libpulse %s\n"
 
-#: ../src/utils/pactl.c:861
+#: ../src/utils/pactl.c:862
 #, c-format
 msgid "Please specify a sample file to load\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:883
+#: ../src/utils/pactl.c:884
 #, c-format
 msgid "Failed to open sound file.\n"
 msgstr "Misslyckades med att öppna ljudfil.\n"
 
-#: ../src/utils/pactl.c:895
+#: ../src/utils/pactl.c:896
 #, c-format
 msgid "You have to specify a sample name to play\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:907
+#: ../src/utils/pactl.c:908
 #, c-format
 msgid "You have to specify a sample name to remove\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:915
+#: ../src/utils/pactl.c:916
 #, c-format
 msgid "You have to specify a sink input index and a sink\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:924
+#: ../src/utils/pactl.c:925
 #, c-format
 msgid "You have to specify a source output index and a source\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:938
+#: ../src/utils/pactl.c:939
 #, c-format
 msgid "You have to specify a module name and arguments.\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:958
+#: ../src/utils/pactl.c:959
 #, c-format
 msgid "You have to specify a module index\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:968
+#: ../src/utils/pactl.c:969
 #, c-format
 msgid ""
 "You may not specify more than one sink. You have to specify a boolean "
 "value.\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:981
+#: ../src/utils/pactl.c:982
 #, c-format
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value.\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:993
+#: ../src/utils/pactl.c:994
 #, c-format
 msgid "You have to specify a card name/index and a profile name\n"
 msgstr ""
 
-#: ../src/utils/pactl.c:1008
+#: ../src/utils/pactl.c:1009
 #, c-format
 msgid "No valid command specified.\n"
 msgstr ""
diff --git a/po/zh_CN.po b/po/zh_CN.po
index b5f02fa..eb0fca2 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PulseAudio\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-02-12 16:57+0100\n"
+"POT-Creation-Date: 2009-02-20 03:24+0100\n"
 "PO-Revision-Date: 2009-01-24 12:47+0800\n"
 "Last-Translator: 王泽国 <zak.zeguo.wang at gmail.com>\n"
 "Language-Team: Chinese/Simplified\n"
@@ -17,6 +17,66 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
+#: ../src/modules/alsa/alsa-util.c:525
+msgid "Analog Mono"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:531
+msgid "Analog Stereo"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:537
+msgid "Digital Stereo (IEC958)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:543
+msgid "Digital Stereo (HDMI)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:550
+msgid "Analog Surround 4.0"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:557
+msgid "Digital Surround 4.0 (IEC958/AC3)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:565
+msgid "Analog Surround 4.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:573
+msgid "Analog Surround 5.0"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:581
+msgid "Analog Surround 5.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:589
+msgid "Digital Surround 5.1 (IEC958/AC3)"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:598
+msgid "Analog Surround 7.1"
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:1577
+#, c-format
+msgid ""
+"snd_pcm_avail_update() returned a value that is exceptionally large: %lu "
+"bytes (%lu ms). Most likely this is an ALSA driver bug. Please report this "
+"issue to the ALSA developers."
+msgstr ""
+
+#: ../src/modules/alsa/alsa-util.c:1609
+#, c-format
+msgid ""
+"snd_pcm_mmap_begin() returned a value that is exceptionally large: %lu bytes "
+"(%lu ms). Most likely this is an ALSA driver bug. Please report this issue "
+"to the ALSA developers."
+msgstr ""
+
 #: ../src/daemon/ltdl-bind-now.c:124
 #, fuzzy
 msgid "Failed to find original lt_dlopen loader."
@@ -152,37 +212,37 @@ msgstr "此平台不支持system-wide模式。"
 msgid "setrlimit(%s, (%u, %u)) failed: %s"
 msgstr "setrlimit(%s, (%u, %u)) 失败:%s"
 
-#: ../src/daemon/main.c:429
+#: ../src/daemon/main.c:431
 msgid "Failed to parse command line."
 msgstr "分析命令行失败。"
 
-#: ../src/daemon/main.c:451
+#: ../src/daemon/main.c:453
 #, c-format
 msgid "We're in the group '%s', allowing high-priority scheduling."
 msgstr "我们在'%s'组中,允许高优先级调度。"
 
-#: ../src/daemon/main.c:458
+#: ../src/daemon/main.c:460
 #, c-format
 msgid "We're in the group '%s', allowing real-time scheduling."
 msgstr "我们在'%s'组中,允许实时调度。"
 
-#: ../src/daemon/main.c:466
+#: ../src/daemon/main.c:468
 msgid "PolicyKit grants us acquire-high-priority privilege."
 msgstr "PolicyKit授予我们“获取高优先级”权限。"
 
-#: ../src/daemon/main.c:469
+#: ../src/daemon/main.c:471
 msgid "PolicyKit refuses acquire-high-priority privilege."
 msgstr "PolicyKit拒绝“获取高优先级”权限。"
 
-#: ../src/daemon/main.c:474
+#: ../src/daemon/main.c:476
 msgid "PolicyKit grants us acquire-real-time privilege."
 msgstr "PolicyKit授予我们“获取实时”权限。"
 
-#: ../src/daemon/main.c:477
+#: ../src/daemon/main.c:479
 msgid "PolicyKit refuses acquire-real-time privilege."
 msgstr "PolicyKit拒绝我们“获取实时”权限。"
 
-#: ../src/daemon/main.c:506
+#: ../src/daemon/main.c:508
 #, fuzzy
 msgid ""
 "Called SUID root and real-time and/or high-priority scheduling was requested "
@@ -192,211 +252,211 @@ msgstr ""
 "此配置需要调用SUID root和实时/高优先级调度。但是我们没有所需的权限:\n"
 "我们不属该组"
 
-#: ../src/daemon/main.c:530
+#: ../src/daemon/main.c:532
 msgid ""
 "High-priority scheduling enabled in configuration but not allowed by policy."
 msgstr "配置中已启用高优先级调度,但策略未允许。"
 
-#: ../src/daemon/main.c:559
+#: ../src/daemon/main.c:561
 msgid "Successfully increased RLIMIT_RTPRIO"
 msgstr "提高RLIMIT_RTPRIO成功。"
 
-#: ../src/daemon/main.c:562
+#: ../src/daemon/main.c:564
 #, c-format
 msgid "RLIMIT_RTPRIO failed: %s"
 msgstr "RLIMIT_RTPRIO失败:%s"
 
-#: ../src/daemon/main.c:569
+#: ../src/daemon/main.c:571
 msgid "Giving up CAP_NICE"
 msgstr "正在放弃CAP_NICE"
 
-#: ../src/daemon/main.c:576
+#: ../src/daemon/main.c:578
 msgid ""
 "Real-time scheduling enabled in configuration but not allowed by policy."
 msgstr "配置中已启用实时调度,但策略未允许。"
 
-#: ../src/daemon/main.c:637
+#: ../src/daemon/main.c:639
 msgid "Daemon not running"
 msgstr "后台程序没有运行"
 
-#: ../src/daemon/main.c:639
+#: ../src/daemon/main.c:641
 #, c-format
 msgid "Daemon running as PID %u"
 msgstr "后台程序正在运行,PID %u"
 
-#: ../src/daemon/main.c:649
+#: ../src/daemon/main.c:651
 #, c-format
 msgid "Failed to kill daemon: %s"
 msgstr "杀死后台程序失败:%s"
 
-#: ../src/daemon/main.c:667
+#: ../src/daemon/main.c:669
 msgid ""
 "This program is not intended to be run as root (unless --system is "
 "specified)."
 msgstr "不应以root身份运行本程序(除非指定 --system)。"
 
-#: ../src/daemon/main.c:669
+#: ../src/daemon/main.c:671
 #, fuzzy
 msgid "Root privileges required."
 msgstr "需要root权限。"
 
-#: ../src/daemon/main.c:674
+#: ../src/daemon/main.c:676
 msgid "--start not supported for system instances."
 msgstr "系统实例不支持 --start。"
 
-#: ../src/daemon/main.c:679
+#: ../src/daemon/main.c:681
 msgid "Running in system mode, but --disallow-exit not set!"
 msgstr "正在以系统模式运行,但是 --disallow-exit 未设定!"
 
-#: ../src/daemon/main.c:682
+#: ../src/daemon/main.c:684
 msgid "Running in system mode, but --disallow-module-loading not set!"
 msgstr "正在以系统模式运行,但是 --disallow-module-loading 未设定!"
 
-#: ../src/daemon/main.c:685
+#: ../src/daemon/main.c:687
 msgid "Running in system mode, forcibly disabling SHM mode!"
 msgstr "正在以系统模式运行,强制禁用SHM模式!"
 
-#: ../src/daemon/main.c:690
+#: ../src/daemon/main.c:692
 msgid "Running in system mode, forcibly disabling exit idle time!"
 msgstr "正在以系统模式运行,强制禁用退出空闲时间!"
 
-#: ../src/daemon/main.c:717
+#: ../src/daemon/main.c:719
 msgid "Failed to acquire stdio."
 msgstr "获取stdio失败。"
 
-#: ../src/daemon/main.c:723
+#: ../src/daemon/main.c:725
 #, c-format
 msgid "pipe failed: %s"
 msgstr "管道失败:%s"
 
-#: ../src/daemon/main.c:728
+#: ../src/daemon/main.c:730
 #, c-format
 msgid "fork() failed: %s"
 msgstr "fork()失败:%s"
 
-#: ../src/daemon/main.c:742
+#: ../src/daemon/main.c:744
 #, c-format
 msgid "read() failed: %s"
 msgstr "read()失败:%s"
 
-#: ../src/daemon/main.c:748
+#: ../src/daemon/main.c:750
 msgid "Daemon startup failed."
 msgstr "后台程序启动失败。"
 
-#: ../src/daemon/main.c:750
+#: ../src/daemon/main.c:752
 msgid "Daemon startup successful."
 msgstr "后台程序启动成功。"
 
-#: ../src/daemon/main.c:820
+#: ../src/daemon/main.c:822
 #, c-format
 msgid "This is PulseAudio %s"
 msgstr "这是 PulseAudio %s"
 
-#: ../src/daemon/main.c:821
+#: ../src/daemon/main.c:823
 #, c-format
 msgid "Compilation host: %s"
 msgstr "编译主机:%s"
 
-#: ../src/daemon/main.c:822
+#: ../src/daemon/main.c:824
 #, c-format
 msgid "Compilation CFLAGS: %s"
 msgstr "编译CFLAGS:%s"
 
-#: ../src/daemon/main.c:825
+#: ../src/daemon/main.c:827
 #, c-format
 msgid "Running on host: %s"
 msgstr "正在主机上运行:%s"
 
-#: ../src/daemon/main.c:828
+#: ../src/daemon/main.c:830
 #, c-format
 msgid "Found %u CPUs."
 msgstr ""
 
-#: ../src/daemon/main.c:830
+#: ../src/daemon/main.c:832
 #, c-format
 msgid "Page size is %lu bytes"
 msgstr "页面大小为%lu字节"
 
-#: ../src/daemon/main.c:833
+#: ../src/daemon/main.c:835
 msgid "Compiled with Valgrind support: yes"
 msgstr "编译启用Valgrind支持:是"
 
-#: ../src/daemon/main.c:835
+#: ../src/daemon/main.c:837
 msgid "Compiled with Valgrind support: no"
 msgstr "编译启用Valgrind支持:否"
 
-#: ../src/daemon/main.c:838
+#: ../src/daemon/main.c:840
 #, c-format
 msgid "Running in valgrind mode: %s"
 msgstr "正在以valgrind模式运行:%s"
 
-#: ../src/daemon/main.c:841
+#: ../src/daemon/main.c:843
 msgid "Optimized build: yes"
 msgstr "优化生成:是"
 
-#: ../src/daemon/main.c:843
+#: ../src/daemon/main.c:845
 msgid "Optimized build: no"
 msgstr "优化生成:否"
 
-#: ../src/daemon/main.c:847
+#: ../src/daemon/main.c:849
 msgid "Failed to get machine ID"
 msgstr "获取machine ID失败"
 
-#: ../src/daemon/main.c:850
+#: ../src/daemon/main.c:852
 #, c-format
 msgid "Machine ID is %s."
 msgstr "machine ID是%s。"
 
-#: ../src/daemon/main.c:855
+#: ../src/daemon/main.c:857
 #, c-format
 msgid "Using runtime directory %s."
 msgstr "正在使用运行时文件夹%s。"
 
-#: ../src/daemon/main.c:860
+#: ../src/daemon/main.c:862
 #, c-format
 msgid "Using state directory %s."
 msgstr "正在使用状态文件夹%s。"
 
-#: ../src/daemon/main.c:863
+#: ../src/daemon/main.c:865
 #, c-format
 msgid "Running in system mode: %s"
 msgstr "正在以系统模式运行:%s"
 
-#: ../src/daemon/main.c:878
+#: ../src/daemon/main.c:880
 msgid "pa_pid_file_create() failed."
 msgstr "pa_pid_file_create()失败。"
 
-#: ../src/daemon/main.c:890
+#: ../src/daemon/main.c:892
 msgid "Fresh high-resolution timers available! Bon appetit!"
 msgstr "新鲜的高分辨率计时器开锅了!吃个饱!"
 
-#: ../src/daemon/main.c:892
+#: ../src/daemon/main.c:894
 msgid ""
 "Dude, your kernel stinks! The chef's recommendation today is Linux with high-"
 "resolution timers enabled!"
 msgstr "老兄,你的内核真臭!现在流行的是启用了高分辩率计分器的Linux!"
 
-#: ../src/daemon/main.c:904
+#: ../src/daemon/main.c:906
 msgid "pa_core_new() failed."
 msgstr "pa_core_new()失败。"
 
-#: ../src/daemon/main.c:965
+#: ../src/daemon/main.c:967
 msgid "Failed to initialize daemon."
 msgstr "后台程序初始化失败。"
 
-#: ../src/daemon/main.c:970
+#: ../src/daemon/main.c:972
 msgid "Daemon startup without any loaded modules, refusing to work."
 msgstr "后台程序启动未加载任何模块,拒绝工作。"
 
-#: ../src/daemon/main.c:983
+#: ../src/daemon/main.c:985
 msgid "Daemon startup complete."
 msgstr "后台程序启动完成。"
 
-#: ../src/daemon/main.c:989
+#: ../src/daemon/main.c:991
 msgid "Daemon shutdown initiated."
 msgstr "开始关闭后台程序。"
 
-#: ../src/daemon/main.c:1010
+#: ../src/daemon/main.c:1009
 msgid "Daemon terminated."
 msgstr "后台程序已终止。"
 
@@ -1075,7 +1135,7 @@ msgstr "cookie数据分析失败"
 msgid "Failed to open configuration file '%s': %s"
 msgstr "打开配置文件'%s'失败:%s"
 
-#: ../src/pulse/context.c:523
+#: ../src/pulse/context.c:519
 msgid "No cookie loaded. Attempting to connect without."
 msgstr "没有加载cookie。尝试不加载cookie进行连接。"
 
@@ -1194,67 +1254,67 @@ msgid "pa_stream_connect_record() failed: %s\n"
 msgstr "pa_stream_connect_playback()失败:%s\n"
 
 #: ../src/utils/pacat.c:321 ../src/utils/pasuspender.c:159
-#: ../src/utils/pactl.c:758 ../src/utils/paplay.c:183
+#: ../src/utils/pactl.c:759 ../src/utils/paplay.c:183
 #, c-format
 msgid "Connection failure: %s\n"
 msgstr "连接失败:%s\n"
 
-#: ../src/utils/pacat.c:342 ../src/utils/paplay.c:75
+#: ../src/utils/pacat.c:341 ../src/utils/paplay.c:75
 #, c-format
 msgid "Failed to drain stream: %s\n"
 msgstr "排出流失败:%s\n"
 
-#: ../src/utils/pacat.c:347 ../src/utils/paplay.c:80
+#: ../src/utils/pacat.c:346 ../src/utils/paplay.c:80
 #, c-format
 msgid "Playback stream drained.\n"
 msgstr "流播放完毕。\n"
 
-#: ../src/utils/pacat.c:357 ../src/utils/paplay.c:92
+#: ../src/utils/pacat.c:356 ../src/utils/paplay.c:92
 #, c-format
 msgid "Draining connection to server.\n"
 msgstr ""
 
-#: ../src/utils/pacat.c:383
+#: ../src/utils/pacat.c:382
 #, c-format
 msgid "Got EOF.\n"
 msgstr "收到EOF。\n"
 
-#: ../src/utils/pacat.c:389
+#: ../src/utils/pacat.c:388
 #, c-format
 msgid "pa_stream_drain(): %s\n"
 msgstr "pa_stream_drain():%s\n"
 
-#: ../src/utils/pacat.c:399
+#: ../src/utils/pacat.c:398
 #, c-format
 msgid "read() failed: %s\n"
 msgstr "read()失败:%s\n"
 
-#: ../src/utils/pacat.c:431
+#: ../src/utils/pacat.c:430
 #, c-format
 msgid "write() failed: %s\n"
 msgstr "write()失败:%s\n"
 
-#: ../src/utils/pacat.c:452
+#: ../src/utils/pacat.c:451
 #, c-format
 msgid "Got signal, exiting.\n"
 msgstr "收到信号,正在退出。\n"
 
-#: ../src/utils/pacat.c:466
+#: ../src/utils/pacat.c:465
 #, c-format
 msgid "Failed to get latency: %s\n"
 msgstr "获取传输延迟失败:%s\n"
 
-#: ../src/utils/pacat.c:471
+#: ../src/utils/pacat.c:470
 #, c-format
 msgid "Time: %0.3f sec; Latency: %0.0f usec.  \r"
 msgstr "时间:%0.3f秒;延迟:%0.0f 微秒。  \r"
 
-#: ../src/utils/pacat.c:491
+#: ../src/utils/pacat.c:490
 #, c-format
 msgid "pa_stream_update_timing_info() failed: %s\n"
 msgstr "pa_stream_update_timing_info()失败:%s\n"
 
-#: ../src/utils/pacat.c:504
+#: ../src/utils/pacat.c:503
 #, c-format
 msgid ""
 "%s [options]\n"
@@ -1339,7 +1399,7 @@ msgstr ""
 "      --latency=BYTES                   请求指定字节数的延迟。\n"
 "      --process-time=BYTES              每次请求指定字节数的处理时间。\n"
 
-#: ../src/utils/pacat.c:605
+#: ../src/utils/pacat.c:604
 #, c-format
 msgid ""
 "pacat %s\n"
@@ -1350,88 +1410,89 @@ msgstr ""
 "Compiled with libpulse %s\n"
 "Linked with libpulse %s\n"
 
-#: ../src/utils/pacat.c:662
+#: ../src/utils/pacat.c:661
 #, c-format
 msgid "Invalid channel map '%s'\n"
 msgstr "无效的通道映射描述'%s'\n"
 
-#: ../src/utils/pacat.c:691
+#: ../src/utils/pacat.c:690
 #, c-format
 msgid "Invalid latency specification '%s'\n"
 msgstr "无效的延迟规格描述 %s'\n"
 
-#: ../src/utils/pacat.c:698
+#: ../src/utils/pacat.c:697
 #, c-format
 msgid "Invalid process time specification '%s'\n"
 msgstr "无效的处理时间描述 '%s'\n"
 
-#: ../src/utils/pacat.c:709
+#: ../src/utils/pacat.c:708
 #, c-format
 msgid "Invalid sample specification\n"
 msgstr "无效的采样描述\n"
 
-#: ../src/utils/pacat.c:714
+#: ../src/utils/pacat.c:713
 #, c-format
 msgid "Channel map doesn't match sample specification\n"
 msgstr "通道映射与采样描述不匹配\n"
 
-#: ../src/utils/pacat.c:721
+#: ../src/utils/pacat.c:720
 #, c-format
 msgid "Opening a %s stream with sample specification '%s'.\n"
 msgstr "以采样规格'%s'打开%s流。\n"
 
-#: ../src/utils/pacat.c:721
+#: ../src/utils/pacat.c:720
 msgid "recording"
 msgstr "正在录制"
 
-#: ../src/utils/pacat.c:721
+#: ../src/utils/pacat.c:720
 msgid "playback"
 msgstr "回放"
 
-#: ../src/utils/pacat.c:729
+#: ../src/utils/pacat.c:728
 #, c-format
 msgid "open(): %s\n"
 msgstr "open():%s\n"
 
-#: ../src/utils/pacat.c:734
+#: ../src/utils/pacat.c:733
 #, c-format
 msgid "dup2(): %s\n"
 msgstr "dup2():%s\n"
 
-#: ../src/utils/pacat.c:744
+#: ../src/utils/pacat.c:743
 #, c-format
 msgid "Too many arguments.\n"
 msgstr "参数过多。\n"
 
-#: ../src/utils/pacat.c:757 ../src/utils/pasuspender.c:280
-#: ../src/utils/pactl.c:1013 ../src/utils/paplay.c:381
+#: ../src/utils/pacat.c:756 ../src/utils/pasuspender.c:280
+#: ../src/utils/pactl.c:1014 ../src/utils/paplay.c:381
 #, c-format
 msgid "pa_mainloop_new() failed.\n"
 msgstr "pa_mainloop_new()失败。\n"
 
-#: ../src/utils/pacat.c:778
+#: ../src/utils/pacat.c:777
 #, c-format
 msgid "io_new() failed.\n"
 msgstr "io_new()失败。\n"
 
-#: ../src/utils/pacat.c:784 ../src/utils/pasuspender.c:293
-#: ../src/utils/pactl.c:1027 ../src/utils/paplay.c:396
+#: ../src/utils/pacat.c:783 ../src/utils/pasuspender.c:293
+#: ../src/utils/pactl.c:1028 ../src/utils/paplay.c:396
 #, c-format
 msgid "pa_context_new() failed.\n"
 msgstr "pa_context_new()失败。\n"
 
-#: ../src/utils/pacat.c:792
+#: ../src/utils/pacat.c:791 ../src/utils/pactl.c:1034
+#: ../src/utils/paplay.c:404
 #, c-format
 msgid "pa_context_connect() failed: %s"
 msgstr "pa_context_connect()失败:%s"
 
-#: ../src/utils/pacat.c:803
+#: ../src/utils/pacat.c:802
 #, c-format
 msgid "time_new() failed.\n"
 msgstr "time_new()失败。\n"
 
-#: ../src/utils/pacat.c:810 ../src/utils/pasuspender.c:301
-#: ../src/utils/pactl.c:1035 ../src/utils/paplay.c:407
+#: ../src/utils/pacat.c:809 ../src/utils/pasuspender.c:301
+#: ../src/utils/pactl.c:1039 ../src/utils/paplay.c:410
 #, c-format
 msgid "pa_mainloop_run() failed.\n"
 msgstr "pa_mainloop_run()失败。\n"
@@ -1461,7 +1522,7 @@ msgstr "恢复失败:%s\n"
 msgid "WARNING: Sound server is not local, not suspending.\n"
 msgstr "警告:非本地声音服务器,不会挂起。\n"
 
-#: ../src/utils/pasuspender.c:176 ../src/utils/pactl.c:764
+#: ../src/utils/pasuspender.c:176 ../src/utils/pactl.c:765
 #: ../src/utils/paplay.c:191
 #, c-format
 msgid "Got SIGINT, exiting.\n"
@@ -1827,7 +1888,7 @@ msgstr "上传采样失败:%s\n"
 msgid "Premature end of file\n"
 msgstr "文件过早结束\n"
 
-#: ../src/utils/pactl.c:770
+#: ../src/utils/pactl.c:771
 #, fuzzy, c-format
 msgid ""
 "%s [options] stat\n"
@@ -1871,7 +1932,7 @@ msgstr ""
 "  -s, --server=SERVER                   要连接的服务器名\n"
 "  -n, --client-name=NAME                此客户端在服务器上的名称\n"
 
-#: ../src/utils/pactl.c:822
+#: ../src/utils/pactl.c:823
 #, c-format
 msgid ""
 "pactl %s\n"
@@ -1882,66 +1943,66 @@ msgstr ""
 "Compiled with libpulse %s\n"
 "Linked with libpulse %s\n"
 
-#: ../src/utils/pactl.c:861
+#: ../src/utils/pactl.c:862
 #, c-format
 msgid "Please specify a sample file to load\n"
 msgstr "请指定要加载的采样文件\n"
 
-#: ../src/utils/pactl.c:883
+#: ../src/utils/pactl.c:884
 #, c-format
 msgid "Failed to open sound file.\n"
 msgstr "打开声音文件失败。\n"
 
-#: ../src/utils/pactl.c:895
+#: ../src/utils/pactl.c:896
 #, c-format
 msgid "You have to specify a sample name to play\n"
 msgstr "你必须指定要播放的采样名\n"
 
-#: ../src/utils/pactl.c:907
+#: ../src/utils/pactl.c:908
 #, c-format
 msgid "You have to specify a sample name to remove\n"
 msgstr "你必须指定要删除的采样名\n"
 
-#: ../src/utils/pactl.c:915
+#: ../src/utils/pactl.c:916
 #, c-format
 msgid "You have to specify a sink input index and a sink\n"
 msgstr "你必须指定音频出口索引和音频出口\n"
 
-#: ../src/utils/pactl.c:924
+#: ../src/utils/pactl.c:925
 #, c-format
 msgid "You have to specify a source output index and a source\n"
 msgstr "你必须指定音频入口输出索引和音频入口\n"
 
-#: ../src/utils/pactl.c:938
+#: ../src/utils/pactl.c:939
 #, c-format
 msgid "You have to specify a module name and arguments.\n"
 msgstr "必须指定模块名和参数。\n"
 
-#: ../src/utils/pactl.c:958
+#: ../src/utils/pactl.c:959
 #, c-format
 msgid "You have to specify a module index\n"
 msgstr "必须指定模块索引\n"
 
-#: ../src/utils/pactl.c:968
+#: ../src/utils/pactl.c:969
 #, fuzzy, c-format
 msgid ""
 "You may not specify more than one sink. You have to specify a boolean "
 "value.\n"
 msgstr "不可指定多个音频出口。必须指定至少一个布尔值。\n"
 
-#: ../src/utils/pactl.c:981
+#: ../src/utils/pactl.c:982
 #, fuzzy, c-format
 msgid ""
 "You may not specify more than one source. You have to specify a boolean "
 "value.\n"
 msgstr "不可指定多个音频入口。必须指定至少一个布尔值。\n"
 
-#: ../src/utils/pactl.c:993
+#: ../src/utils/pactl.c:994
 #, fuzzy, c-format
 msgid "You have to specify a card name/index and a profile name\n"
 msgstr "你必须指定音频出口索引和音频出口\n"
 
-#: ../src/utils/pactl.c:1008
+#: ../src/utils/pactl.c:1009
 #, c-format
 msgid "No valid command specified.\n"
 msgstr "未指定有效的命令。\n"

-- 
hooks/post-receive
PulseAudio Sound Server



More information about the pulseaudio-commits mailing list